spring-json view了解
spring-jsonview了解
以前从action返回json对象都是直接向response中写入string,无外乎两种方式:
方式一:
HashMap<String,Object>hm=newHashMap<String,Object>();
hm.put("success",Boolean.TRUE);
if(users!=null&&!users.isEmpty()){
hm.put("users",users);
}else{
hm.put("users",newArrayList<User>());
}
hm.put("paging",query);
JSONObjectjo=JSONObject.fromObject(hm);
PrintWriterout=null;
out=response.getWriter();
out.write(jo.toString());
out.flush();
out.close();
方式二:
response.getOutputStream().write(html.getBytes());
由于我们是使用的springmvc的controller,今天同事提到了一个更优雅的方式,我也了解了下相关资料。
首页
http://spring-json.sourceforge.net/
参考文档
http://spring-json.sourceforge.net/quickstart.html
同时也参考了公司同事在项目中的配置。步骤如下:
*-servlet.xml文件增加一个xml的Resolver
<beanname="xmlViewResolver"class="org.springframework.web.servlet.view.XmlViewResolver">
<propertyname="location"value="/WEB-INF/views.xml"></property>
<propertyname="order"value="1"></property>
</bean>
<beanid="jspViewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"></property>
<propertyname="prefix"value="/"></property>
<propertyname="suffix"value=".jsp"></property>
<propertyname="order"value="2"></property>
</bean>
其中XmlViewResolver和InternalResourceViewResolver都是实现了
org.springframework.core.Ordered接口的,所以可以对其进行一个设定顺序,先解析XmlView再处理
InternalResouceView。其中XmlViewResolver的源码中,依赖于诸如的views.xml配置文件(默认是这个)。同时源码中
protectedViewloadView(StringviewName,Localelocale)throwsBeansException
是根据viewName去将对应的view装载起来的。所以到时候先在ModelAndView中设置jsonView,它就会去找对应的
views.xml中的jsonView这个bean,我是这么理解的,所以这样XmlViewResolver还可以支持更多的自定义view。
在项目中的views.xml中是这样定义的:
<beanname="jsonView"class="org.springframework.web.servlet.view.json.JsonView">
<propertyname="jsonWriter">
<refbean="jsonWriter"/>
</property>
</bean>
<beanname="jsonWriter"class="org.springframework.web.servlet.view.json.writer.sojo.SojoJsonStringWriter">
<propertyname="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=newHashMap<String,Object>();
map.put("success",Boolean.TRUE);
if(users!=null&&!users.isEmpty()){
map.put("users",users);
}else{
map.put("users",newArrayList<User>());
}
map.put("paging",query);
returnnewModelAndView("jsonView",map);
恩。这个很有建设性,知道了这个方法以后,可以扩展更多的自定义view。