Spring提供的JS对象的Javascript文件

时间:2013-12-29 17:05:53

标签: spring-mvc

我需要使用Spring加载生成服务器端的javascript文件。 目前,我这样做:

在html页面中:

<script src="<spring:url value="/dyn/user.js"/>" type="text/javascript"></script>

在控制器中:

@RequestMapping(value="/user.js", produces="application/javascript")
public String userJsp(Model model) {
   User user = getUser();
   model.addAttribute("name", user.getFirstName());
   model.addAttribute("id", user.getId());
   return "js/user.jsp";
}

这是user.jsp文件:

window.User = {
    "id": ${id},
    "name": "${name}"
};

无论如何,我需要来自User对象的更多数据。我希望Spring为我做这项工作。最后,我希望有类似的东西:

window.User = <json object generated by Spring like when you use @ResponseBody in the controller>

哪种方法更好?

2 个答案:

答案 0 :(得分:1)

如果只需要添加几个数据对象,那么我将继续添加新的模型属性。但如果有更多(超过5个),那么您可以尝试使用Map

Map<String, Object> jsMap = new HashMap<String, Object>(); 
// populate Map here
model.addAttribute("jsMap", jsMap);

然后在你的jsp:

window.User = {
    <c:forEach items="${jsMap}" var="entry" varStatus="status">
        "${entry.key}": "${entry.value}"${not status.last ? ',' : ''}
    </c:forEach>
};

您可能想要添加额外的类型检查,因此数字值不会包含在引号等中(这就是为什么我最初会建议您的原始方法)。

答案 1 :(得分:0)

JS对象的创建也可以在JSP页面中使用Jackson自动完成:

<%@page import="org.codehaus.jackson.map.ObjectMapper"%>
<%@page import="com.bla.woof.User "%>

<%
ObjectMapper mapper = new ObjectMapper();
User user = (User)request.getAttribute("user");
%>

window.User = <%= mapper.writeValueAsString(user) %>;

结果如下:

{id: 2, username: "anto", firstName: "Antonio", lastName: "Tancredi", profile: Object}

正如您所看到的,'profile'成员也被转换为JS对象(这就是我想要的),因此您需要确保仅转换您真正需要的内容。杰克逊图书馆有一些注释可以帮助完成这项任务。

尝试转换惰性Hibernate对象时请注意。 Jackson将尝试自动检测对象属性,并且还会找到Hibernate惰性代理的成员。 你可以在这里找到一些细节:

Strange Jackson exception being thrown when serializing Hibernate object

例如,我的Profile类在User对象中是惰性的。我需要添加这个注释:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Profile implements Serializable {
:
}

告诉杰克逊忽略这两个成员。