如何访问 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 模型对象?的主要内容,如果未能解决你的问题,请参考以下文章