我想实现在我的服务器(使用Spring)和客户端(在ExtJS中)之间传递透明数据。
在服务器端,我有Spring Controllers返回ModelAndView对象(使用JSP)。我通常不创建模型对象,我只是将项目放入模型Map中。
我想要简单透明的Java到Javascript对象转换。在服务器端,我将Java Date对象放入地图中,并在客户端上获得Javascript Date对象。 即在服务器上我写了这样的代码:
public ModelAndView getModelAndView(User user) {
Map<String, Object> modelMap = new HashMap<String, Object>();
modelMap.put("date", new Date());
modelMap.put("intarray", new int[] {1,2,3});
return new ModelAndView("mainpage", modelMap);
}
在我用JSP编写的客户端上:
var model = <someMagicTagOrSomething />
在呈现的HTML中我得到:
var model = {
date: Date.parse('2012-01-01 12:12:12', 'Y-m-d H:m:s'), //JS Date object
intarray: [1,2,3]
}
我在Spring文档中看到的大部分内容都涉及使用@NumberFormat(style = Style.PERCENT)等注释在服务器上指定对象格式,然后使用form:input标签在客户端上获取它们。这不是我想要的,因为我想在客户端上格式化日期,而不用担心它们以什么格式传输到客户端。
实现这一目标的最佳方法是什么?有开箱即用的解决方案还是我需要自己写一些东西?我知道我可以使用像Gson这样的库将我的模型转换为JSON,但是这会将Java Dates作为字符串返回,我想立即获取Javascript日期对象,而不必担心格式化。
感谢您的任何建议,
·彼得
答案 0 :(得分:1)
您不会避免将日期序列化为某种格式。 Javascript不了解java对象所以必须有一些序列化步骤(无论是json,xml还是其他)。
您最好的选择是将日期作为ISO
字符串发送,并使用Date.parse(isostring)
。您不需要指定格式字符串,因此您必须输入较少的内容,并且至少您使用大多数客户理解的格式。
答案 1 :(得分:0)
<c:set var="myModelObject" value="${myObjectFromServer}"/>
<script>
var myJSvar = "${myModelObject}";
</script>
是的,你必须序列化/反序列化日期......我扩展了PropertyEditor:
public class LocalDateEditor extends PropertyEditorSupport{
@Override
public void setAsText(String text) throws IllegalArgumentException{
setValue(DateTimeFormat.forPattern("dd MMM yyyy").print(text));
}
然后在你的控制器中注册(你也可以设置一个全局的,但我不记得怎么样):
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(LocalDate.class, new LocalDateEditor());
}
为什么值得我使用全局日期格式化程序,并在用户界面上使用全局jquery ui datepicker类 - 根本不需要太多编码。一切都是开箱即用 - 在初始设置之后。我从不喜欢iso标准日期(可能是因为我是英国人:-()