Javascript Spring:在服务器和客户端之间传递数据(Java对象到JS对象)

Javascript Spring:在服务器和客户端之间传递数据(Java对象到JS对象),javascript,spring,extjs,Javascript,Spring,Extjs,我想实现服务器(使用Spring)和客户端(在ExtJS中)之间的透明数据传递 在服务器端,我使用Spring控制器返回ModelAndView对象(使用JSP)。我通常不创建模型对象,我只是将项目放入模型映射中 我想要简单透明的Java到Javascript对象转换。在服务器端,我将一个Java日期对象放入映射中,然后在客户机上获得一个Javascript日期对象。 即,我在服务器上编写以下代码: public ModelAndView getModelAndView(User user) {

我想实现服务器(使用Spring)和客户端(在ExtJS中)之间的透明数据传递

在服务器端,我使用Spring控制器返回ModelAndView对象(使用JSP)。我通常不创建模型对象,我只是将项目放入模型映射中

我想要简单透明的Java到Javascript对象转换。在服务器端,我将一个Java日期对象放入映射中,然后在客户机上获得一个Javascript日期对象。 即,我在服务器上编写以下代码:

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);
}
我在Spring文档中看到的大部分内容涉及使用@NumberFormat(style=style.PERCENT)之类的注释在服务器上指定对象格式,然后使用form:input标记在客户机上获取它们。这不是我想要的,因为我想在客户机上格式化日期,而不担心它们以什么格式传输到客户机

实现这一目标的最佳方式是什么?有现成的解决方案吗?还是我需要自己写点东西?我知道我可以使用像Gson这样的库将我的模型转换为JSON,但这会将Java日期作为字符串返回,我希望立即获得Javascript日期对象,而不必担心格式问题

谢谢你的建议

皮奥特

然后在yr控制器中注册(您也可以设置一个全局控制器,但我不记得如何设置):


值得一提的是,我使用了一个全局日期格式化程序,并在用户界面上使用了一个全局jquery ui datepicker类——实际上不需要太多编码。在初始设置之后,一切都是开箱即用的。我从不喜欢iso标准日期(这可能是因为我是英国人):-()

你不会避免将日期序列化为某种格式。Javascript不理解java对象,因此必须有一些序列化步骤(无论是json、xml还是其他)


最好的方法是将日期作为
ISO
字符串发送,并使用
Date.parse(isostring)
在它们上。然后你不需要指定格式字符串,所以你必须少键入,至少你使用大多数客户端都能理解的格式。

我知道我必须以某种方式序列化/反序列化对象。我只希望透明/自动地完成。在你提出的解决方案中,我需要date在Javascript中添加“date.parse”。我希望服务器为我添加这些“date.parse”调用。因此,在呈现JSP时,服务器不会将JSON粘贴到HTML中,而是将Javascript和JSON结合在一起,最终创建常规JS对象(如我问题中的示例所示)。可能有一些库或Spring机制可以做到这一点吗?@machine在Spring范围之外,但流行的js库有一些扩展,可以自动将日期字符串转换为javascript日期(,没有测试)。但这会被呈现为类似这样的内容,对吗?var myJSvar=“2012年3月12日”;请看我对soulcheck答案的评论。谢谢:)这正是它要做的。听起来你想让服务器为你创建客户机代码——这听起来是个坏主意。您正在将控制器与视图(MVC中的V和C)混合使用。GWT和Vaadin不再需要编写javascript.Hmm。。我并不反对写一些Javascript,但是谢谢你的提示。我认为在我的案例中,视图和控制器的混合是合理的。这将允许我删除一些样板代码。
var model = <someMagicTagOrSomething />
var model = {
     date: Date.parse('2012-01-01 12:12:12', 'Y-m-d H:m:s'), //JS Date object
     intarray: [1,2,3]
}
<c:set var="myModelObject" value="${myObjectFromServer}"/>

 <script>
   var myJSvar = "${myModelObject}";
 </script>
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());
}