如何访问 JavaScript 文件中的 Spring MVC 模型对象?
Posted
技术标签:
【中文标题】如何访问 JavaScript 文件中的 Spring MVC 模型对象?【英文标题】:How to access Spring MVC model object in javascript file? 【发布时间】:2014-04-25 20:52:30 【问题描述】:我正在使用 spring 3 MVC,并且我有以下课程。
外部系统会使用以下 URL 调用我的应用程序:
http://somehost/root/param1/param2/param3
我有一个spring MVC控制器方法如下:
public ModelAndView showPage(@PathVariable("param1") String paramOne, @PathVariable("param2") String paramTwo, @PathVariable("param3") String paramThree, HttpServletResponse response)
SomeModel model = new SomeModel(paramOne, paramTwo, paramThree);
return new ModelAndView("SomeJsp", "model", model);
SomeModel.java
public class SomeModel
private String paramOne;
private String paramTwo;
private String paramThree;
//constructor
//setters and getters
SomeJsp.jsp
//In this Jsp i have a div with few elements. Div is not visible by default.
//This jsp has externaljavascript included.
//I enable div and set the data into div elements using jquery.
<script src="<c:url value="/resources/js/extjs.js" />" type="text/javascript"></script>
externalJs.js
$(document).ready(function()
//Here i need the model returned using ModelAndView
//I can get data from model and set into div elements.
);
在外部java脚本文件中,是否可以获取模型内容?如果可能,我该怎么做?
谢谢!
【问题讨论】:
<script type="text/javascript">var myVar = "$model.paramOne";</script>
【参考方案1】:
@RequestMapping("/op")
public ModelAndView method(Map<String, Object> model)
model.put("att", "helloooo");
return new ModelAndView("dom/op");
在你的 .js 中
<script>
var valVar = [[$att]];
</script>
【讨论】:
【参考方案2】:在控制器中:
JSONObject jsonobject=new JSONObject();
jsonobject.put("error","Invalid username");
response.getWriter().write(jsonobject.toString());
在javascript中:
f(data!=success)
var errorMessage=jQuery.parseJson(data);
alert(errorMessage.error);
【讨论】:
【参考方案3】:这种方式可行,并且使用这种结构,您可以创建自己的框架并使用更少的样板来完成。
抱歉,如果出现错误,我正在用手机写这篇文章
Maven 依赖:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>1.7.1</version>
</dependency>
Java:
Person.java (Person 对象类)
Class Person
private String name;
public String getName()
return this.name;
public void setName(String name)
this.name = name;
PersonController.java (人员控制器)
@RestController
public class PersonController implements Controller
@RequestMapping("/person")
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception
Person person = new Person();
person.setName("Person's name");
Gson gson = new Gson();
ModelAndView modelAndView = new ModelAndView("person");
modelAndView.addObject("person", gson.toJson(person));
return modelAndView;
查看:
person.jsp
<html>
<head>
<title>Person Example</title>
<script src="jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="personScript.js"></script>
</head>
<body>
<h1>Person/h1>
<input type="hidden" id="person" value="$person">
</body>
</html>
Javascript:
personScript.js
function parseJSON(data)
return window.JSON && window.JSON.parse ? window.JSON.parse( data ) : (new Function("return " + data))();
$(document).ready(function()
var personJson = $('#person');
person = parseJSON(personJson.val());
alert(person.name);
);
【讨论】:
能否请您对特别是在 JS 部分发生的魔法添加一些解释? 我遵循这个..当我打印 personJson.val() -> 警报显示“”时,我得到了 json 解析异常“未捕获的 SyntaxError:JSON 输入的意外结束”【参考方案4】:另一种解决方案可以在 JSP 中使用:
<input type="hidden" id="jsonBom" value='$jsonBom'/>
并使用 jQuery 在 Javascript 中获取值:
var jsonBom = $('#jsonBom').val();
【讨论】:
【参考方案5】:JavaScript 在客户端运行。您的模型在客户端不存在,它仅在您呈现 .jsp 时存在于服务器端。
如果您希望模型中的数据可用于客户端代码(即 javascript),则需要将其存储在呈现页面的某个位置。例如,您可以使用您的 Jsp 编写 JavaScript,将您的模型分配给 JavaScript 变量。
更新:
一个简单的例子
<%-- SomeJsp.jsp --%>
<script>var paramOne =<c:out value="$paramOne"/></script>
【讨论】:
Aurand,您能否提供一些代码 sn-p 来回答您的问题?谢谢! Aurand,现在我可以在同一个 jsp 中包含的外部 js 中访问 paramOne 了吗? paramOne 是一个 JavaScript 变量。只需按名称访问即可。 第一段让我大开眼界,让事情变得更加清晰。谢谢。 我收到错误,暗示它将这个示例解释为正则表达式。一旦我做了<script>var JsParam = "$JavaParam"</script>
(注意引号),它就起作用了。【参考方案6】:
我最近也遇到了同样的需求。所以我尝试了 Aurand 的方式,但似乎代码缺少 $。所以 SomeJsp.jsp <head></head>
里面的代码是:
<script>
var model=[];
model.paramOne="$model.paramOne";
model.paramTwo="$model.paramTwo";
model.paramThree="$model.paramThree";
</script>
请注意,您不能使用 var model = $model
进行分配,因为它会分配 java 对象引用。所以要在外部 JS 中访问它:
$(document).ready(function()
alert(model.paramOne);
);
【讨论】:
【参考方案7】:这是我如何使列表对象可用于 javascript 的示例:
var listForJavascript = [];
<c:forEach items="$MyListFromJava" var="listItem">
var arr = [];
arr.push("<c:out value="$listItem.param1" />");
arr.push("<c:out value="$listItem.param2" />");
listForJavascript.push(arr);
</c:forEach>
【讨论】:
【参考方案8】:您不能从 JavaScript 访问 java 对象,因为客户端没有对象。它只接收纯 HTML 页面(隐藏字段可以提供帮助,但它不是很好的方法)。
我建议你使用ajax和@ResponseBody
。
【讨论】:
Max,这里我不能进行ajax调用,因为控制器是从外部应用程序调用的,并且直接映射到控制器方法。以上是关于如何访问 JavaScript 文件中的 Spring MVC 模型对象?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用手写笔访问 vue 文件中的 javascript 变量?
如何访问 JavaScript 文件中的 Spring MVC 模型对象?
如何在 ruby on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby?
如何从我的视图的 javascript 访问我的代码隐藏文件中的 JsonResult 变量?剃刀页面。 C#