struts2框架返回json数据到网页前台,虽然没有springmvc框架那么方便,但是有时候公司必须要求我们使用struts2框架来向前台返回json数据,甚至会要求我们用struts2框架开发接口来为手机客户端提供json数据,这个时候我们就应该了解一下这个功能该如何做了。
struts返回json数据给手机客户端或前台有两种方式。
第一种获取json的方式:
这个是struts2框架的action类里面的处理方法
//这个是接收json字符串的
private String json;
//这个是返回列表的方法
public void listUI(){
try {
//queryAll()方法里面我已经用gson对象将list列表转化成了json格式
json = this.studentService.queryAll();
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/json;charset=utf-8");
PrintWriter out = response.getWriter();
out.println(json);
} catch (IOException e) {
e.printStackTrace();
}
}我们以响应头的方式将获取到的数据以json的形式返回到前台,利用PrintWriter对象的println方法输出json数据,但是这样是不够的,因为我们前台是用ajax请求来获取数据的,前台代码如下:
<body> <center><button onclick="getList();">获取学生列表</button></center></br> <table border="1px" width="600px" align="center"> <tr> <th>ID</th> <th>姓名</th> <th>性别</th> <th>生日</th> <th>课程</th> <th>地址</th> </tr> <tbody id="tbody"> </tbody> </table> </body>
ajax请求代码如下
<script type="text/javascript">
function getList(){
$.ajax({
type:"get",
url:"student_listUI.action",
dataType:"json",
async:"true",
success:function(data){
var objList = eval(data);
var tbody = $("#tbody");
$(objList).each(function(index){
var obj = objList[index];
var tr = $("<tr></tr>");
/*tr.append('<td>'+obj.id+'</td>'+'<td>'+obj.name+'</td>'+'<td>'+obj.sex+'</td>');
tr.append('<td>'+obj.birth+'</td>'+'<td>'+obj.department+'</td>'+'<td>'+obj.address+'</td>');*/
tr.append("<td>"+obj.id+"</td><td>"+obj.name+"</td><td>"+obj.sex+"</td>");
tr.append("<td>"+obj.birth+"</td><td>"+obj.department+"</td><td>"+obj.address+"</td>");
tbody.append(tr);
});
},
error:function(){
alert("获取失败");
}
});
}
</script>这里用到了url:"student_listUI.action",的请求方式,根据ssh的框架原理,我们是需要视图映射器的,struts视图映射器代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="studentAction" namespace="/" extends="json-default">
<action name="student_*" class="com.taotao.action.StudentAction" method="{1}">
</action>
</package>
</struts>“extends=”这个地方在第一种方式下没什么影响,不管是json-default还是struts-default都是可以的。我们需要这个视图映射器才能进入到前面的listUI方法获取我们需要的json数据,然后json数据才会被我们前台的ajax方法获取到。
第二种方式,比第一种方式稍微复杂一点,下面我们来看看:
action类的方法稍微有一点不一样,这里一定要注意。
//注意,这里的json属性必须要有getter与setter方法,不然前台是无法获取到的
private String json;
public String getJson() {
return json;
}
public void setJson(String json) {
this.json = json;
}
public String listUI(){
json = this.studentService.queryAll();
return SUCCESS;
}前台页面是一样的,这里就不在贴出来了,请翻到上面熟悉一下前台代码。
这里的ajax我们依然调用了url:"student_listUI.action",这个action的方法,所以我们仍然需要在struts.xml映射文件中配置相关的映射代码,这个时候一定要注意,已经和第一种方法不一样了。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="studentAction" namespace="/" extends="json-default">
<action name="student_*" class="com.taotao.action.StudentAction" method="{1}">
<result name="fail">/WEB-INF/jsp/error.jsp</result>
<result name="success" type="json">
<param name="root">json</param>
</result>
</action>
</package>
</struts>我们看到了吗?前面我为什么要json属性的getter与setter方法?就是因为我们要在这里用上它。
<result name="success" type="json"> <param name="root">json</param> </result>
当然了,param里面的json和type=”json“没有任何联系,请别弄混了,param里面的json是随便起的名字,但是必须要和action里面的json属性名一样,还有一点要注意的是,extends=”“这里面必须只能用json-default,而且我们需要导入一个jar包,jar包名称如下:
struts2-json-plugin-2.2.3.jar
这两种方法在前台展示的json数据是一样的,效果如下:


如果我贴的代码有哪些有问题的,欢迎你在下方的回复栏中提出来。