前面的笔记写了下传统模式下异步传输的实现方式,可以看出还是相当麻烦的。struts2框架下,提供了json插件的方式,来方便我们进行数据的异步传输。
在lib目录下引入struts2-json-plugin-2.3.4.jar
编写JsonAction类如下所示
package cn.sict.action;
import com.opensymphony.xwork2.ActionSupport;
public class JsonAction extends ActionSupport{
private static final long serialVersionUID = 1L;
private String username;
private int age;
private String address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
this.age=19;
this.address="北京";
return SUCCESS;
}
}
可以在成员方法上进行属性的注解
配置struts.xml文件
注意将extends继承的包改为json-defalut。否则会出现unable to load configuration异常处理
<struts>
<package name="struts" extends="json-default">
<action name="jsonAction" class="cn.sict.action.JsonAction">
<result name="success" type="json"></result>
</action>
</package>
</struts>
可以通过exculdeproperties对相应的属性进行过滤,选择需要哪些属性值或不需要。比如我不需要name这个属性,可以这样配置,如果要过滤多个属性,用逗号隔开。
过滤前后
编写Jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery-1.11.1.js"></script>
<script type="text/javascript">
function getInfo()
{
$.post("jsonAction.action",{
username:$("#username").val()
},function(returnedData,status)
{
var person=returnedData;
var username=person.username;
var age=person.age;
var address=person.address;
var html="<table width='60%' border='1' align='center'> <tr><th>username</th><th>age</th><th>address</th></tr><tr><td>"+username+"</td><td>"+age+"</td><td>"+address+"</tr></table>";
$("#theBody table:eq(0)").remove();
$("#theBody").append(html);
});
}
</script>
</head>
<body id="theBody">
<select id="username">
<option>zhangsan</option>
<option>lisi</option>
</select>
<input type="button" value="choose" οnclick="getInfo()">
</body>
</html>
结果
返回的Json格式的数据
分析
我们来看一下json-default包的配置详情
<struts>
<package name="json-default" extends="struts-default">
<result-types>
<result-type name="json" class="org.apache.struts2.json.JSONResult"/>
</result-types>
<interceptors>
<interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/>
<interceptor name="jsonValidation" class="org.apache.struts2.json.JSONValidationInterceptor"/>
<!-- Sample JSON validation stack -->
<interceptor-stack name="jsonValidationWorkflowStack">
<interceptor-ref name="basicStack"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel</param>
</interceptor-ref>
<interceptor-ref name="jsonValidation"/>
<interceptor-ref name="workflow"/>
</interceptor-stack>
</interceptors>
</package>
我们可以看到json-default包继承自struts-default包,在struts-default包的基础上,添加了json的结果类型和相关的拦截器。它的处理过程是:图片来源于网络