日期:2014-05-16  浏览次数:20358 次

spring-json view了解
spring-json view了解

以前从action返回json对象都是直接向response中写入string,无外乎两种方式:
方式一:
HashMap<String, Object> hm = new HashMap<String, Object>();
hm.put("success", Boolean.TRUE);
if (users != null && !users.isEmpty()) {
hm.put("users", users);
} else {
hm.put("users", new ArrayList<User>());
}
hm.put("paging", query);
JSONObject jo = JSONObject.fromObject(hm);
PrintWriter out = null;
out = response.getWriter();
out.write(jo.toString());
out.flush();
out.close();

方式二:
response.getOutputStream().write(html.getBytes());

由于我们是使用的spring mvc 的controller,今天同事提到了一个更优雅的方式,我也了解了下相关资料。
首页
http://spring-json.sourceforge.net/

参考文档
http://spring-json.sourceforge.net/quickstart.html

同时也参考了公司同事在项目中的配置。步骤如下:
*-servlet.xml文件增加一个xml的Resolver
<bean name="xmlViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="location" value="/WEB-INF/views.xml"></property>
      <property name="order" value="1"></property>
</bean>
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"> </property>
<property name="prefix" value="/"></property>
      <property name="suffix" value=".jsp"></property>
<property name="order" value="2"></property>
</bean>
其中XmlViewResolver和InternalResourceViewResolver都是实现了
org.springframework.core.Ordered接口的,所以可以对其进行一个设定顺序,先解析XmlView再处理
InternalResouceView。其中XmlViewResolver的源码中,依赖于诸如的views.xml配置文件(默认是这个)。同时源码中
protected View loadView(String viewName, Locale locale) throws BeansException
是根据viewName去将对应的view装载起来的。所以到时候先在ModelAndView中设置jsonView,它就会去找对应的
views.xml中的jsonView这个bean,我是这么理解的,所以这样XmlViewResolver还可以支持更多的自定义view。
在项目中的views.xml中是这样定义的:
<bean name="jsonView" class="org.springframework.web.servlet.view.json.JsonView">
<property name="jsonWriter">
   <ref bean="jsonWriter" />
</property>
</bean>
<bean name="jsonWriter" class="org.springframework.web.servlet.view.json.writer.sojo.SojoJsonStringWriter">
<property name="convertAllMapValues">
   <value>true</value>
</property>
</bean>
查看JsonView源码,实际上还支持另外三个jsonWriter的。
org.springframework.web.servlet.view.json.writer.sojo.SojoJsonStringWriter
org.springframework.web.servlet.view.json.writer.jsonlib.JsonlibJsonStringWriter
org.springframework.web.servlet.view.json.writer.xstream.XStreamJsonStringWriter
这三个都是实现了
org.springframework.web.servlet.view.json.JsonStringWriter
接口,我们可以选择的使用这三个writer。同时也可以扩展实现我上次比较过的
gson或者jackson的实现。

在我们的Controller中,就可以采用如下方式了:
方式三:
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("success", Boolean.TRUE);
if (users != null && !users.isEmpty()) {
map.put("users", users);
} else {
map.put("users", new ArrayList<User>());
}
map.put("paging", query);
return new ModelAndView("jsonView", map);

恩。这个很有建设性,知道了这个方法以后,可以扩展更多的自定义view。
1 楼 fukui2111539 2012-08-04  
写的确实不错,正需要,收藏,谢谢!