如何在Javascript中访问模型属性

时间:2012-02-20 13:31:44

标签: java javascript spring attributes

我想在Javascript中访问模型属性。我使用以下代码:

model.addAttribute("data", responseDTO);

我的DTO课程:

public class ResponseDTO {

    private List<ObjectError> errors;

    private Boolean actionPassed;

    private String dataRequestName;

    // and setter getter for all fields
}   

我尝试使用以下方式访问DTO:

var data = "${data}";

但是它给了我一个responseDTO的字符串表示,即com.req.dto.ResponseDTO@115f4ea。我可以使用以下方法成功访问DTO内的字段:

 var data = "${data.actionPassed}";  

但这不适用于DTO内的errors属性,因为它是List ObjectError。如何在Javascript中获得完整的responseDTO对象?

谢谢!


编辑:

最初我使用jquery.post

$.post('ajax/test.html', function(data) {
  // Here I was able to retrieve every attribute even list of ObjectError.
});

现在我想删除Ajax并希望将其转换为非ajax方法(因为一些不可避免的原因)。所以我正在进行正常的表单提交,并希望再次加载相同的表单并尝试在Javascript中加载data模型属性,以便我可以保留其余的代码。
我想知道它是否可以在Javascript中实现,因为它可以使用Jquery帖子?


编辑2:

我试过(谢谢@Grant的建议)

JSONObject jsonObject =JSONObject.fromObject(responseDTO);
String jsonString = jsonObject.toString();
model.addAttribute("data",jsonString);    

并在Javascript中

var data = eval('('+ ${dataJson} +')');   // Getting error on this line  
alert(data.actionPassed);   

但是显示错误并且没有警报 错误:
enter image description here

3 个答案:

答案 0 :(得分:17)

首先,没有办法将Java对象直接转换为Javascript对象,因为它们彼此无关。一种是服务器端语言,另一种是客户端语言。

所以要实现这个目标,你必须做一些转换。我认为你有两个选择:

  1. 将ResponseDTO对象转换为JSON字符串并将其传递给jsp,您可以直接获取javascript对象。
  2. 将ResponseDTO对象传递给JSP,并按照您现在尝试的方式填充javascript对象。
  3. 对于选项#1,您应该使用库来通过Java对象生成JSON字符串。您可以使用此JSON-lib。 e.g:

    JSONObject jsonObject = JSONObject.fromObject( responseDTO );  
    /*  
      jsonStr is something like below, "errors" represents the List<ObjectError>
      I don't know what's in ObjectError, errorName is just an example property.
      {
        "dataRequestName":"request1",
        "actionPassed":true,
        "errors":[{"errorName":"error"},{"errorName":"unknown error"}]
      } 
    */
    String jsonStr = jsonObject.toString();
    model.addAttribute("dataJson", jsonStr);  
    
    /*In JSP, get the corresponding javascript object
     by eval the json string directly.*/
    <script>
    var data = eval('('+'${dataJson}'+')'); 
    </script>
    

    对于选项#2,

    //Pass java object as you do now
    model.addAttribute("data",responseDTO);
    
    //In JSP, include jstl taglib to help accessing List.
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    <script>
    var errorArr = [], errorObj;
    <c:forEach var="error" items="${data.errors}">
        errorObj = { errorName: '${error.errorName}' };
        errorArr.push(errorObj);                                  
    </c:forEach>
    
    //Populate the corresponding javascript object.
    var data = {
      dataRequestName: '${data.dataRequestName}',
      actionPassed: ${data.actionPassed},
      errors: errorArr
    };
    </script>
    

    正如您所看到的,选项#2很复杂,只有在Java对象很简单而选项#1更容易和可维护的情况下才有用。

答案 1 :(得分:2)

所以我刚刚使用对象列表为Grant的第一个选项实现了类似的解决方案,但是使用Gson库将对象转换为JSON字符串,然后使用JSON.parse()把它变成一个javascript对象:

在服务器上:

List<CustomObject> foo = database.getCustomObjects();
model.addAttribute("foo", new Gson().toJson(foo));

在页面javascript:

var customObjectList = JSON.parse('${foo}');
console.log(customObjectList);

请注意,当我引用模型对象foo时,我将其作为字符串&#39; $ {foo}&#39;。我相信您收到错误是因为您在字符串之外引用它。所以正确的代码是:

var data = eval('('+ '${dataJson}' +')');

答案 2 :(得分:0)

非常简单

in your spring controller 

model.addAttribute("attributeName", "attributeValue");

in the script

<script type="text/javascript">      
     $(window).on('load', function () {             
            var springAttribute= '${attributeName}';
            alert(springAttribute);     
    </script>