Struts2中有两种方式处理Ajax请求:
(注:我使用的是最新的Struts 2.3.20)
1. 使用Stream result的方式以流的形式写出到客户端。(这种方式我没有亲自做实验,下面的例子参考的是Struts2的官方文档)
我们可以这样书写我们的Action:
代码语言:javascript复制package actions;
import java.io.InputStream;
import java.io.StringBufferInputStream;
import com.opensymphony.xwork2.ActionSupport;
public class TextResult extends ActionSupport {
private InputStream inputStream;
public InputStream getInputStream() {
return inputStream;
}
public String execute() throws Exception {
inputStream = new ByteArrayInputStream("Hello World! This is a text string response from a Struts 2 Action.".getBytes("UTF-8"));
return SUCCESS;
}
}
这样配置我们的struts.xml:
代码语言:javascript复制<action name="text-result" class="actions.TextResult">
<result type="stream">
<param name="contentType">text/html</param>
<param name="inputName">inputStream</param>
</result>
</action>
2. 使用Struts2的插件机制:(下面我以返回JSON格式的数据为例进行说明,需要struts2-json-plugin-2.3.20包,这个包在Struts2的官方下载中已经包含,不需要额外下载)
首先是前台发送Ajax请求:(我这里使用JQuery)
代码语言:javascript复制$("#btnClick").click(function() {
$.post("hello", {name: "tanzhenyu"},
function(data) {
alert(data.greeting ", " data.name "!");
}, "json");
});
我们的Action这样写:
代码语言:javascript复制public HelloAction extends ActionSupport {
private String name;//这里的nam用来接收Ajax的请求数据
private Map<String, String> resultMap;//这里的Map用来返回结果JSON数据
public getName() {
return name;
}
public setName(String name) {
this.name = name;
}
public getResultMap() {
return resultMap;
}
public setResultMap(Map<String, String> resultMap) {
this.resultMap = resultMap;
}
public String execute() {
resultMap = new Map<>();
resultMap.put("greeting", "Hello");
resultMap.put("name", name);
return Action.SUCCESS;
}
}
这里注意的是:我们的Map对象不需要手动转成JSON对象,Struts2的JSON插件会帮我们转。
我们的配置文件可以这样写:
代码语言:javascript复制<package name="default" namespace="/" extends="json-default">
<action name="hello" class="cn.tzy..hello.action.HelloAction">
<result type="json">
<param name="root">resultMap</param>
</result>
</action>
</package>
这里注意的是:extends必须是“json-default”,name为root的param是说明返回时被序列化的对象,值为一个OGNL表达式。
OK,成功搞定,如果有疑问可以参考Struts2官方文档中关于Ajax的部分。