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数据是一样的,效果如下:
如果我贴的代码有哪些有问题的,欢迎你在下方的回复栏中提出来。