如何访问 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脚本文件中,是否可以获取模型内容?如果可能,我该怎么做?

谢谢!

【问题讨论】:

&lt;script type="text/javascript"&gt;var myVar = "$model.paramOne";&lt;/script&gt; 【参考方案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 变量。只需按名称访问即可。 第一段让我大开眼界,让事情变得更加清晰。谢谢。 我收到错误,暗示它将这个示例解释为正则表达式。一旦我做了&lt;script&gt;var JsParam = "$JavaParam"&lt;/script&gt;(注意引号),它就起作用了。【参考方案6】:

我最近也遇到了同样的需求。所以我尝试了 Aurand 的方式,但似乎代码缺少 $。所以 SomeJsp.jsp &lt;head&gt;&lt;/head&gt;里面的代码是:

<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#

使用 JavaScript 访问 WKWebView 中的本地文件

如何在文件 .aspx.cs 文件后面的 C# 代码中从 .js 文件访问 javascript 对象