SON 是一个插件,它允许我们在JavaScript中异步调用Action,它提供了一个json的返回结果类型(ResultType),只要为Action指定类型为
json返回结果类型,那么这个响应结果不需要返回给任何视图层,JSON会将Action里的状态信息序列化为JSON指定格式的数据,并将该数据返回
给JAVASCRIPT,这样可以完成AJAX的应用交互.
要应用 JSON 插件,首先需要到
http://code.google.com/p/jsonplugin/downloads/list
下载最新JSON插件,我这里下载的是jsonplugin-
0.33.jar ,将该文件拷到WEB工程的LIB目录,当然还需要下载Struts2 类库,可以到 http://struts.apache.org/download.cgi#struts2014
这里去下载,下载完后解压缩,将JAR拷到WEB工程的LIB目录,不能少于以下几个JAR文件(struts2-api-2.0.5.jar、struts2-core-2.0.5.jar、
ognl-2.6.9.jar、xwork-2.0.0.jar、commons-logging-1.1.jar、freemarker-2.3.8.jar,具体文件名视版本而定),接下来我们可以写个应用
来试验,本例程分为二步来写,第一步实现返回一个结果对象,第二步实现返回一个结果列表,首先来看下返回结果对象的实现.
我们需要先建立一个JavaBean 为值对象,用来将用户的基本数据封装进去,该实体在结果对象和结果列表中都会使用到
Users.java 代码如下:
- packagecom.jsontostruts2.vo;
- publicclassUsers{
- privateIntegeruserId;
- privateStringuserName;
- privateStringsex;
- publicUsers(){
- }
- }
实现 UserAction.java 源码如下:
- packagecom.jsontostruts2.action;
- importcom.googlecode.jsonplugin.annotations.JSON;
- importcom.jsontostruts2.vo.Users;
- importcom.opensymphony.xwork2.ActionSupport;
- @SuppressWarnings("serial")
- publicclassUserActionextendsActionSupport{
- privateUsersusers;
- @JSON(name="USER")
- publicUsersgetUsers(){
- returnusers;
- }
- publicvoidsetUsers(Usersusers){
- this.users=users;
- }
- @Override
- publicStringexecute()throwsException{
- users=newUsers();
- users.setUserId(1);
- users.setUserName("ctojxzsycztao");
- users.setSex("男人");
- returnSUCCESS;
- }
- }
接下来我们需要配置 struts.xml 文件,为了在现下面不再重复写该文件,这里我将结果对象和列表的请求控制一并贴上来,文件内容:
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPEstrutsPUBLIC
- "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <packagename="jsonManager"extends="json-default">
- <actionname="userJson"class="com.jsontostruts2.action.UserAction">
- <resulttype="json"/>
- </action>
- <actionname="jsonlist"class="com.jsontostruts2.action.UserListAction">
- <resulttype="json"/>
- </action>
- </package>
- </struts>
能后创建web.xml 和 userjson.jsp:
- web.xml:
- <?xmlversion="1.0"encoding="UTF-8"?>
- <web-appversion="2.5"xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <filter>
- <filter-name>Struts2</filter-name>
- <filter-class>
- org.apache.struts2.dispatcher.FilterDispatcher
- </filter-class>
- </filter>
- <filter-mapping>
- <filter-name>Struts2</filter-name>
- <url-pattern>*.action</url-pattern>
- </filter-mapping>
- <filter-mapping>
- <filter-name>Struts2</filter-name>
- <url-pattern>*.jsp</url-pattern>
- </filter-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
userjson.jsp :
- <%@pagelanguage="java"contentType="text/html;charset=UTF-8"%>
- <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
- <html>
- <head>
- <title>json返回对象处理</title>
- <scriptlanguage="javascript">
- varxmlHttp=false;
- try{
- xmlHttp=newActiveXObject("msxml2.XMLHTTP");
- }catch(e1){
- try{
- xmlHttp=newActiveXObject("microsoft.XMLHTTP");
- }catch(e2){
- try{
- xmlHttp=newXMLHttpRequest();
- }catch(e3){
- xmlHttp=false;
- }
- }
- }
- if(!xmlHttp){
- alert("createxmlHttpRequestfail");
- }
- functionjsonResult(){
- xmlHttp.onreadystatechange=function(){
- if(xmlHttp.readyState==4){
- //将JSON对象转换为JSON字符串,需要注意调用eval函数时必须使用"("和")"将JSON字符串括起来,否
- 则会出错
- varuserObj=eval('('+xmlHttp.responseText+')');
- varuserStr="<tableborder=0>";
- userStr+='<tr><td><b>userId</b></td><td>'+userObj.USER.userId+'</td></tr>';
- userStr+=('<tr><td><b>userName</b></td><td>'+userObj.USER.userName+'</td></tr>');
- userStr+=('<tr><td><b>sex</b></td><td>'+userObj.USER.sex+'</td></tr>');
- userStr+="</table>";
- document.getElementById('jsonDiv').innerHTML=userStr;
- }
- }
- xmlHttp.open("POST","userJson.action",true);
- xmlHttp.send(null);
- }
- </script>
- </head>
- <body>
- <divid="jsonDiv"></div>
- <inputtype="button"value="show"onclick="jsonResult();">
- </body>
- </html>
现在你可以将应用发布到你的容器当中输入 http://localhost:8080/struts2ToJson/userjson.jsp 点show,这个时候你可以看到你想要的结
果,接来实现下返回列表的做法,当然与返回对象会有所不同,我们需要将一个List对象转换为一个JSON规范的字符串,能后发送给客户端的JS,
首先建立一个将List 转换为指定字符串的工具类,该工具是在一个无意间从网上看到就拿来用了,经过少许修改,为了减少代码行数我将只贴
出适用于本示例的代码:
JsonUtil.java :
- packagecom.jsontostruts2.util;
- importjava.beans.IntrospectionException;
- importjava.beans.Introspector;
- importjava.beans.PropertyDescriptor;
- importjava.util.List;
- publicclassJsonUtil{
- publicstaticStringobjectToJson(Objectobject){
- StringBuilderjson=newStringBuilder();
- if(object==null){
- json.append("\"\"");
- }elseif(objectinstanceofString||objectinstanceofInteger){
- json.append("\"").append((String)object).append("\"");
- }else{
- json.append(beanToJson(object));
- }
- returnjson.toString();
- }
- publicstaticStringbeanToJson(Objectbean){
- StringBuilderjson=newStringBuilder();
- json.append("{");
- PropertyDescriptor[]props=null;
- try{
- props=Introspector.getBeanInfo(bean.getClass(),Object.class)
- .getPropertyDescriptors();
- }catch(IntrospectionExceptione){
- }
- if(props!=null){
- for(inti=0;i<props.length;i++){
- try{
- Stringname=objectToJson(props[i].getName());
- Stringvalue=objectToJson(props[i].getReadMethod().invoke(bean));
- json.append(name);
- json.append(":");
- json.append(value);
- json.append(",");
- }catch(Exceptione){
- }
- }
- json.setCharAt(json.length()-1,'}');
- }else{
- json.append("}");
- }
- returnjson.toString();
- }
- publicstaticStringlistToJson(List<?>list){
- StringBuilderjson=newStringBuilder();
- json.append("[");
- if(list!=null&&list.size()>0){
- for(Objectobj:list){
- json.append(objectToJson(obj));
- json.append(",");
- }
- json.setCharAt(json.length()-1,']');
- }else{
- json.append("]");
- }
- returnjson.toString();
- }
- }
UserListAction.java:
- packagecom.jsontostruts2.action;
- importjava.util.ArrayList;
- importjava.util.List;
- importcom.googlecode.jsonplugin.annotations.JSON;
- importcom.jsontostruts2.util.JsonUtil;
- importcom.jsontostruts2.vo.Users;
- importcom.opensymphony.xwork2.ActionSupport;
- @SuppressWarnings("serial")
- publicclassUserListActionextendsActionSupport{
- privateStringjsonResult;
- @JSON(name="JSONRESULT")
- publicStringgetJsonResult(){
- returnjsonResult;
- }
- publicvoidsetJsonResult(StringjsonResult){
- this.jsonResult=jsonResult;
- }
- @Override
- publicStringexecute()throwsException{
- List<Users>userList=newArrayList<Users>();
- Usersusers=newUsers();
- users.setUserId(1);
- users.setUserName("ctojxzsycztao");
- users.setSex("男人");
- userList.add(users);
- users=null;
- users=newUsers();
- users.setUserId(2);
- users.setUserName("rain");
- users.setSex("女人");
- userList.add(users);
- users=null;
- users=newUsers();
- users.setUserId(3);
- users.setUserName("mimi");
- users.setSex("女人");
- userList.add(users);
- jsonResult=JsonUtil.listToJson(userList);
- System.out.println(jsonResult);
- returnSUCCESS;
- }
- }
接下来将要写一个jsonList.JSP页面来将结果承现给用户
- <%@pagelanguage="java"contentType="text/html;charset=UTF-8"%>
- <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
- <html>
- <head>
- <title>json返回列表处理</title>
- <scriptlanguage="javascript">
- varxmlHttp=false;
- try{
- xmlHttp=newActiveXObject("msxml2.XMLHTTP");
- }catch(e1){
- try{
- xmlHttp=newActiveXObject("microsoft.XMLHTTP");
- }catch(e2){
- try{
- xmlHttp=newXMLHttpRequest();
- }catch(e3){
- xmlHttp=false;
- }
- }
- }
- if(!xmlHttp){
- alert("createxmlHttpRequestfail");
- }
- functionjsonListResult(){
- xmlHttp.onreadystatechange=function(){
- if(xmlHttp.readyState==4){
- varuserList=eval('('+xmlHttp.responseText+')');
- varuser=eval(userList.JSONRESULT);
- varresult="<tableborder=0>";
- result+="<tr><td>userId</td><td>userName</td><td>sex</td></tr>";
- for(vari=0;i<user.length;i++){
- result+="<tr>";
- result+="<td>"+user[i].userId+"</td>";
- result+="<td>"+user[i].userName+"</td>";
- result+="<td>"+user[i].sex+"</td>";
- result+="</tr>";
- }
- result+="</table>";
- document.getElementById('jsonDiv').innerHTML=result;
- }
- }
- xmlHttp.open("POST","jsonlist.action",true);
- xmlHttp.send(null);
- }
- </script>
- </head>
- <body>
- <divid="jsonDiv"></div>
- <inputtype="button"value="showlist"onclick="jsonListResult();">
- </body>
- </html>