我需要使用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>
哪种方法更好?
答案 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 {
:
}
告诉杰克逊忽略这两个成员。