关于struts2对ajax的支持一点点用法,供君指点
最近温故知新ssh框架,发现struts2原来有对ajax有很好很规范的支持.以前使用ajax的时候都是自己在action就直接用response的write方法直接输出json格式的数据串.这样的做法实现功能完全没有问题,但是这样的用法没有规范,不便于之后系统的维护.而且一般来说需要自己写一个处理方法将类转换成json格式的数据传递.struts2对ajax支持则是完全是在struts已有的规范下再做了扩展.再次证明struts2是一个很完善的MVC框架.
struts2对ajax的实现有几种方式.下面介绍我自己常用的一些方式.
一 使用stream类型的result实现ajax.
struts2支持一种stream类型的result(主要是用于实现文件下载).可以直接向客户端浏览器生成二进制文本响应.
实现这种方法的关键是两处.
1.实现一个带有inputstream参数的普通action类(记得对action中的参数生成get/set方法)
public class StreamAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private InputStream inputStream;
private String param;
public String execute() throws Exception {
inputStream = new ByteArrayInputStream(param.getBytes("UTF-8"));
return Action.SUCCESS;
}
public InputStream getInputStream() {
return inputStream;
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public String getParam() {
return param;
}
public void setParam(String param) {
this.param = param;
}
}
就像上面的action一样就是一普通的action,只是有一个inputstream类型的参数罢了.然后把想要返回的内容传递给inputstream,这里可以传递字符串,也可以返回javascript支持的json串.
2.配置文件的时候设置返回类型为stream(即type=stream),由于是直接想浏览器客户端返回二进制数据所以不用定义返回的视图资源
struts.xml配置如下
<package name="stream" extends="struts-default">
<action name="stream" class="com.cst.StreamAction">
<result name="success" type="stream">
<param name="contentType">text/html</param>
</result>
</action>
</package>
以上就是第一种返回方式,这样的方式也很灵活,想要返回的类容在action中就可以自己定义,但是,如果你如果想返回一个json串,而这个json串内容是根据java对象生成的,就必须要自己想办法解决java对象到json的转换了,目前这样的转换第三方工具有很多,以前有用的很方便例如gson,一个很方便的转换工具由google提供的.但其实不用去费心思,struts2自己就有这样的插件.
下面是第二种struts2对ajax的支持
这样的方法能很容易的实现返回action中的变量转换成json后返回客户端.
1.你需要引入struts的插件.
struts-json-plugin.jar插件.引入插件的时候注意,对于不同版本的xwork-core.jar引入struts-json-plugin.jar的时候需要注意,笔者建议尽量使用高版本,另外由于版本差异有可能造成需要更换其他的工具包,笔者就不详细说明了.
2.编写一个普通的action类.
注意变量的get/set方法要有.
3.在action中对不需要格式化成json串的变量的相应的get方法添加注解(@JSON(serialize=false)).@JSON的注解如果有时间我将会在之后的文章中再具体说明(建议读者去struts的官网溜达........包括马上要讲到的一些struts配置的详细)
@JSON(serialize=false)
public StoreSer getStoreSer() {
return storeSer;
}
4.关键的配置文件
配置返回的package一定要继承json-default
返回类型一定要是json
<package name="store" namespace="/store" extends="json-default" >
<action name="store*" class="com.cst.StoreListAction" method="{1}">
<result name="{1}" type="json">
<!-- 是否需要缓存 -->
<param name="noCache">true</param>
<param name="encoding">UTF-8</param>
<param name="ignoreHierarchy" >false</param>
<param name="contentType">application/json</param>
<!--此处由为重要,如果你使用的hibernate orm持久层框架请添加.这是不转换hibernate的延迟加载项成json的配置-->
<param name="excludeProperties">.*hibernateLazyInitializer</param>
<param name="includeProperties">storeList.*,store.*,pageNo,pageContSize</param>
</result>
</action>
</package>
在result中一些参数的说明:
excludeProperties,不转换的对象的属性
includeProperties:需要转换的对象属性
此处也有两种方式,可以在相对应的java对象的属性中的get方法前加上@JSON注解
@JSON(serialize=false)
具体的参数我将会在之后的文章中介绍,读者可以去struts2官网查看文档