Struts2+JSON 实现AJAX 返回对象和列表

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 代码如下:

Java代码 收藏代码
  1. packagecom.jsontostruts2.vo;
  2. /**
  3. *<p>
  4. *创建人:ChenTao
  5. *<p>
  6. *创建日期:2009-5-18下午05:24:48
  7. *<p>
  8. */
  9. publicclassUsers{
  10. privateIntegeruserId;
  11. privateStringuserName;
  12. privateStringsex;
  13. publicUsers(){
  14. }
  15. //get...set....略......
  16. }

实现 UserAction.java 源码如下:

Java代码 收藏代码
  1. packagecom.jsontostruts2.action;
  2. importcom.googlecode.jsonplugin.annotations.JSON;
  3. importcom.jsontostruts2.vo.Users;
  4. importcom.opensymphony.xwork2.ActionSupport;
  5. /**
  6. *<p>
  7. *创建人:ChenTao
  8. *<p>
  9. *创建日期:2009-5-18下午05:22:50
  10. *<p>
  11. */
  12. @SuppressWarnings("serial")
  13. publicclassUserActionextendsActionSupport{
  14. privateUsersusers;
  15. @JSON(name="USER")
  16. publicUsersgetUsers(){
  17. returnusers;
  18. }
  19. publicvoidsetUsers(Usersusers){
  20. this.users=users;
  21. }
  22. @Override
  23. publicStringexecute()throwsException{
  24. users=newUsers();
  25. users.setUserId(1);
  26. users.setUserName("ctojxzsycztao");
  27. users.setSex("男人");
  28. returnSUCCESS;
  29. }
  30. }

接下来我们需要配置 struts.xml 文件,为了在现下面不再重复写该文件,这里我将结果对象和列表的请求控制一并贴上来,文件内容:

Xml代码 收藏代码
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEstrutsPUBLIC
  3. "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <!--注意这里扩展不再是struts-default,而是json-default-->
  7. <packagename="jsonManager"extends="json-default">
  8. <!--返回结果类型为json-->
  9. <actionname="userJson"class="com.jsontostruts2.action.UserAction">
  10. <resulttype="json"/>
  11. </action>
  12. <!--该action在返回列表时添加进来的-->
  13. <actionname="jsonlist"class="com.jsontostruts2.action.UserListAction">
  14. <resulttype="json"/>
  15. </action>
  16. </package>
  17. </struts>

能后创建web.xml 和 userjson.jsp:

Xml代码 收藏代码
  1. web.xml:
  2. <?xmlversion="1.0"encoding="UTF-8"?>
  3. <web-appversion="2.5"xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  7. <filter>
  8. <filter-name>Struts2</filter-name>
  9. <filter-class>
  10. org.apache.struts2.dispatcher.FilterDispatcher
  11. </filter-class>
  12. </filter>
  13. <filter-mapping>
  14. <filter-name>Struts2</filter-name>
  15. <url-pattern>*.action</url-pattern>
  16. </filter-mapping>
  17. <filter-mapping>
  18. <filter-name>Struts2</filter-name>
  19. <url-pattern>*.jsp</url-pattern>
  20. </filter-mapping>
  21. <welcome-file-list>
  22. <welcome-file>index.jsp</welcome-file>
  23. </welcome-file-list>
  24. </web-app>

userjson.jsp :

Html代码 收藏代码
  1. <%@pagelanguage="java"contentType="text/html;charset=UTF-8"%>
  2. <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
  3. <html>
  4. <head>
  5. <title>json返回对象处理</title>
  6. <scriptlanguage="javascript">
  7. varxmlHttp=false;
  8. try{
  9. xmlHttp=newActiveXObject("msxml2.XMLHTTP");
  10. }catch(e1){
  11. try{
  12. xmlHttp=newActiveXObject("microsoft.XMLHTTP");
  13. }catch(e2){
  14. try{
  15. xmlHttp=newXMLHttpRequest();
  16. }catch(e3){
  17. xmlHttp=false;
  18. }
  19. }
  20. }
  21. if(!xmlHttp){
  22. alert("createxmlHttpRequestfail");
  23. }
  24. functionjsonResult(){
  25. xmlHttp.onreadystatechange=function(){
  26. if(xmlHttp.readyState==4){
  27. //将JSON对象转换为JSON字符串,需要注意调用eval函数时必须使用"("和")"将JSON字符串括起来,否
  28. 则会出错
  29. varuserObj=eval('('+xmlHttp.responseText+')');
  30. varuserStr="<tableborder=0>";
  31. userStr+='<tr><td><b>userId</b></td><td>'+userObj.USER.userId+'</td></tr>';
  32. userStr+=('<tr><td><b>userName</b></td><td>'+userObj.USER.userName+'</td></tr>');
  33. userStr+=('<tr><td><b>sex</b></td><td>'+userObj.USER.sex+'</td></tr>');
  34. userStr+="</table>";
  35. document.getElementById('jsonDiv').innerHTML=userStr;
  36. }
  37. }
  38. xmlHttp.open("POST","userJson.action",true);
  39. xmlHttp.send(null);
  40. }
  41. </script>
  42. </head>
  43. <body>
  44. <divid="jsonDiv"></div>
  45. <inputtype="button"value="show"onclick="jsonResult();">
  46. </body>
  47. </html>

现在你可以将应用发布到你的容器当中输入 http://localhost:8080/struts2ToJson/userjson.jsp 点show,这个时候你可以看到你想要的结

果,接来实现下返回列表的做法,当然与返回对象会有所不同,我们需要将一个List对象转换为一个JSON规范的字符串,能后发送给客户端的JS,

首先建立一个将List 转换为指定字符串的工具类,该工具是在一个无意间从网上看到就拿来用了,经过少许修改,为了减少代码行数我将只贴

出适用于本示例的代码:
JsonUtil.java :

Java代码 收藏代码
  1. packagecom.jsontostruts2.util;
  2. importjava.beans.IntrospectionException;
  3. importjava.beans.Introspector;
  4. importjava.beans.PropertyDescriptor;
  5. importjava.util.List;
  6. /**
  7. *<p>
  8. *@authorChenTao
  9. *<p>
  10. *@Date2009-5-18下午05:47:27
  11. *<p>
  12. */
  13. publicclassJsonUtil{
  14. /**
  15. *@paramobject
  16. *任意对象
  17. *@returnjava.lang.String
  18. */
  19. publicstaticStringobjectToJson(Objectobject){
  20. StringBuilderjson=newStringBuilder();
  21. if(object==null){
  22. json.append("\"\"");
  23. }elseif(objectinstanceofString||objectinstanceofInteger){
  24. json.append("\"").append((String)object).append("\"");
  25. }else{
  26. json.append(beanToJson(object));
  27. }
  28. returnjson.toString();
  29. }
  30. /**
  31. *功能描述:传入任意一个javabean对象生成一个指定规格的字符串
  32. *
  33. *@parambean
  34. *bean对象
  35. *@returnString
  36. */
  37. publicstaticStringbeanToJson(Objectbean){
  38. StringBuilderjson=newStringBuilder();
  39. json.append("{");
  40. PropertyDescriptor[]props=null;
  41. try{
  42. props=Introspector.getBeanInfo(bean.getClass(),Object.class)
  43. .getPropertyDescriptors();
  44. }catch(IntrospectionExceptione){
  45. }
  46. if(props!=null){
  47. for(inti=0;i<props.length;i++){
  48. try{
  49. Stringname=objectToJson(props[i].getName());
  50. Stringvalue=objectToJson(props[i].getReadMethod().invoke(bean));
  51. json.append(name);
  52. json.append(":");
  53. json.append(value);
  54. json.append(",");
  55. }catch(Exceptione){
  56. }
  57. }
  58. json.setCharAt(json.length()-1,'}');
  59. }else{
  60. json.append("}");
  61. }
  62. returnjson.toString();
  63. }
  64. /**
  65. *功能描述:通过传入一个列表对象,调用指定方法将列表中的数据生成一个JSON规格指定字符串
  66. *
  67. *@paramlist
  68. *列表对象
  69. *@returnjava.lang.String
  70. */
  71. publicstaticStringlistToJson(List<?>list){
  72. StringBuilderjson=newStringBuilder();
  73. json.append("[");
  74. if(list!=null&&list.size()>0){
  75. for(Objectobj:list){
  76. json.append(objectToJson(obj));
  77. json.append(",");
  78. }
  79. json.setCharAt(json.length()-1,']');
  80. }else{
  81. json.append("]");
  82. }
  83. returnjson.toString();
  84. }
  85. }

UserListAction.java:

Java代码 收藏代码
  1. packagecom.jsontostruts2.action;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importcom.googlecode.jsonplugin.annotations.JSON;
  5. importcom.jsontostruts2.util.JsonUtil;
  6. importcom.jsontostruts2.vo.Users;
  7. importcom.opensymphony.xwork2.ActionSupport;
  8. /**
  9. *<p>
  10. *创建人:ChenTao
  11. *<p>
  12. *创建日期:2009-5-18下午05:45:42
  13. *<p>
  14. */
  15. @SuppressWarnings("serial")
  16. publicclassUserListActionextendsActionSupport{
  17. /*用于存放JSON生成后的字符串结果*/
  18. privateStringjsonResult;
  19. @JSON(name="JSONRESULT")
  20. publicStringgetJsonResult(){
  21. returnjsonResult;
  22. }
  23. publicvoidsetJsonResult(StringjsonResult){
  24. this.jsonResult=jsonResult;
  25. }
  26. @Override
  27. publicStringexecute()throwsException{
  28. List<Users>userList=newArrayList<Users>();
  29. Usersusers=newUsers();
  30. users.setUserId(1);
  31. users.setUserName("ctojxzsycztao");
  32. users.setSex("男人");
  33. userList.add(users);
  34. users=null;
  35. users=newUsers();
  36. users.setUserId(2);
  37. users.setUserName("rain");
  38. users.setSex("女人");
  39. userList.add(users);
  40. users=null;
  41. users=newUsers();
  42. users.setUserId(3);
  43. users.setUserName("mimi");
  44. users.setSex("女人");
  45. userList.add(users);
  46. jsonResult=JsonUtil.listToJson(userList);
  47. System.out.println(jsonResult);
  48. returnSUCCESS;
  49. }
  50. }

接下来将要写一个jsonList.JSP页面来将结果承现给用户

Html代码 收藏代码
  1. <%@pagelanguage="java"contentType="text/html;charset=UTF-8"%>
  2. <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
  3. <html>
  4. <head>
  5. <title>json返回列表处理</title>
  6. <scriptlanguage="javascript">
  7. varxmlHttp=false;
  8. try{
  9. xmlHttp=newActiveXObject("msxml2.XMLHTTP");
  10. }catch(e1){
  11. try{
  12. xmlHttp=newActiveXObject("microsoft.XMLHTTP");
  13. }catch(e2){
  14. try{
  15. xmlHttp=newXMLHttpRequest();
  16. }catch(e3){
  17. xmlHttp=false;
  18. }
  19. }
  20. }
  21. if(!xmlHttp){
  22. alert("createxmlHttpRequestfail");
  23. }
  24. functionjsonListResult(){
  25. xmlHttp.onreadystatechange=function(){
  26. if(xmlHttp.readyState==4){
  27. varuserList=eval('('+xmlHttp.responseText+')');
  28. varuser=eval(userList.JSONRESULT);
  29. varresult="<tableborder=0>";
  30. result+="<tr><td>userId</td><td>userName</td><td>sex</td></tr>";
  31. for(vari=0;i<user.length;i++){
  32. result+="<tr>";
  33. result+="<td>"+user[i].userId+"</td>";
  34. result+="<td>"+user[i].userName+"</td>";
  35. result+="<td>"+user[i].sex+"</td>";
  36. result+="</tr>";
  37. }
  38. result+="</table>";
  39. document.getElementById('jsonDiv').innerHTML=result;
  40. }
  41. }
  42. xmlHttp.open("POST","jsonlist.action",true);
  43. xmlHttp.send(null);
  44. }
  45. </script>
  46. </head>
  47. <body>
  48. <divid="jsonDiv"></div>
  49. <inputtype="button"value="showlist"onclick="jsonListResult();">
  50. </body>
  51. </html>

你可能感兴趣的:(struts2)