当前位置: 首页 > >

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

发布时间:

JSON 是一个插件,它允许我们在 JavaScript 中异步调用 Action,它提供了一个 json 的返回 结果类型(ResultType),只要为 Action 指定类型为 json 返回结果类型,那么这个响应结果不需要返回给任何视图层,JSON 会将 Action 里的状态 信息序列化为 JSON 指定格式的数据,并将该数据返回 给 JAVASCRIPT,这样可以完成 AJAX 的应用交互. 要应用 JSON 插件,首先需要到 http://code.google.com/p/jsonplugin/downloads/list 下载最新 JSON 插件,我这里下载的是 jsonplugin0.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. package com.jsontostruts2.vo; 2. 3. /** 4. 5. 6. 7. 8. 9. 11. 12. 13. 14. 15. 16. 17. private String sex; private String userName; private Integer userId; * <p> * 创 建 人:ChenTao * <p> * 创建日期:2009-5-18 下午 05:24:48 * <p> */

10. public class Users {

18. 19. 20. 21. 22. }

public Users() { } // get... set.... 略......

实现 UserAction.java 源码如下:
Java 代码 1. package com.jsontostruts2.action; 2. 3. import com.googlecode.jsonplugin.annotations.JSON; 4. import com.jsontostruts2.vo.Users; 5. import com.opensymphony.xwork2.ActionSupport; 6. 7. /** 8. 9. * <p> * 创 建 人:ChenTao

10. * <p> 11. * 创建日期:2009-5-18 下午 05:22:50 12. * <p> 13. */ 14. @SuppressWarnings("serial") 15. public class UserAction extends ActionSupport { 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. } @Override public String execute() throws Exception { users = new Users(); users.setUserId(1); users.setUserName("ctojxzsycztao"); users.setSex("男人"); return SUCCESS; } public void setUsers(Users users) { this.users = users; } @JSON(name="USER") public Users getUsers() { return users; private Users users;

36. 37. }

接下来我们需要配置 struts.xml 文件,为了在现下面不再重复写该文件,这里我将结果对象 和列表的请求控制一并贴上来,文件内容:
Xml 代码 1. <?xml version="1.0" encoding="UTF-8"?> 2. <!DOCTYPE struts PUBLIC 3. 4. 5. 6. <struts> 7. 8. 9. 10. "> 11. 12. 13. 14. on"> 15. 16. 17. 18. </package> 19. </struts> <result type="json"/> </action> <result type="json"/> </action> <!-- 该 action 在返回列表时添加进来的 --> <action name="jsonlist" class="com.jsontostruts2.action.UserListActi <!-- 注意这里扩展不再是 struts-default,而是 json-default --> <package name="jsonManager" extends="json-default"> <!-- 返回结果类型为 json --> <action name="userJson" class="com.jsontostruts2.action.UserAction "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

能后创建 web.xml 和 userjson.jsp:
Xml 代码 1. web.xml : 2. <?xml version="1.0" encoding="UTF-8"?> 3. <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 4. 5. 6. 7. 8. 9. 10. 11. <filter> <filter-name>Struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher 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">

12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.

</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>

26. </web-app>

userjson.jsp :
Html 代码 1. <%@ page language="java" contentType="text/html;charset=UTF-8"%> 2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 3. <html> 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. } function jsonResult(){ xmlHttp.onreadystatechange = function(){ } if(!xmlHttp){ alert("create xmlHttpRequest fail"); } } <head> <title>json 返回对象处理</title> <script language="javascript"> var xmlHttp = false; try{ xmlHttp = new ActiveXObject("msxml2.XMLHTTP"); }catch(e1){ try{ xmlHttp = new ActiveXObject("microsoft.XMLHTTP"); }catch(e2){ try{ xmlHttp = new XMLHttpRequest(); }catch(e3){ xmlHttp = false;

26. 27. 28. 29. 则会出错 30. 31. 32. 33. 34. 35. 36. r; 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. } </script> </head> <body> }

if(xmlHttp.readyState == 4) { // 将 JSON 对象转换为 JSON 字符串,需要注意调用 eval 函数时必须使用" ("和")"将 JSON 字符串括起来,否

var userObj = eval('(' + xmlHttp.responseText + ')'); var userStr = "<table border=0>"; userStr += '<tr><td><b>userId</b></td><td>' + userObj.US ER.userId + '</td></tr>'; userStr += ('<tr><td><b>userName</b></td><td>' + userOb j.USER.userName + '</td></tr>'); userStr += ('<tr><td><b>sex</b></td><td>' + userObj.USE R.sex + '</td></tr>'); userStr += "</table>"; document.getElementById('jsonDiv').innerHTML = userSt } xmlHttp.open("POST","userJson.action",true); xmlHttp.send(null);

<div id="jsonDiv"></div> <input type="button" value="show" onclick="jsonResult();"> </body>

48. </html>

现在你可以将应用发布到你的容器当中输 入 http://localhost:8080/struts2ToJson/userjson.jsp 点 show,这个时候你可以看到你想要的 结 果,接来实现下返回列表的做法,当然与返回对象会有所不同,我们需要将一个 List 对象转换 为一个 JSON 规范的字符串,能后发送给客户端的 JS, 首先建立一个将 List 转换为指定字符串的工具类,该工具是在一个无意间从网上看到就拿来 用了,经过少许修改,为了减少代码行数我将只贴 出适用于本示例的代码: JsonUtil.java :
Java 代码 1. package com.jsontostruts2.util;

2. 3. import java.beans.IntrospectionException; 4. import java.beans.Introspector; 5. import java.beans.PropertyDescriptor; 6. import java.util.List; 7. 8. /** 9. * <p> 10. * @author ChenTao 11. * <p> 12. * @Date 2009-5-18 下午 05:47:27 13. * <p> 14. */ 15. public class JsonUtil { 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. r) { 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. /** * 功能描述:传入任意一个 javabean 对象生成一个指定规格的字符串 * * @param bean * */ public static String beanToJson(Object bean) { StringBuilder json = new StringBuilder(); json.append("{"); PropertyDescriptor[] props = null; bean 对象 * @return String } } return json.toString(); json.append("\"").append((String)object).append("\""); } else { json.append(beanToJson(object)); /** * @param object * */ public static String objectToJson(Object object) { StringBuilder json = new StringBuilder(); if (object == null) { json.append("\"\""); } else if (object instanceof String || object instanceof Intege 任意对象 * @return java.lang.String

45. 46. s) 47. 48. 49. 50. 51. 52. 53. 54.

try { props = Introspector.getBeanInfo(bean.getClass(), Object.clas .getPropertyDescriptors(); } catch (IntrospectionException e) { } if (props != null) { for (int i = 0; i < props.length; i++) { try { String name = objectToJson(props[i].getName()); String value = objectToJson(props[i].getReadMethod().inv oke(bean)); json.append(name); json.append(":"); json.append(value); json.append(","); } catch (Exception e) { } } json.setCharAt(json.length() - 1, '}'); } else { json.append("}"); } return json.toString(); } /** * 功能描述:通过传入一个列表对象,调用指定方法将列表中的数据生成一个 JSON 规格指 定字符串 * * @param list * */ public static String listToJson(List<?> list) { StringBuilder json = new StringBuilder(); json.append("["); if (list != null && list.size() > 0) { for (Object obj : list) { json.append(objectToJson(obj)); json.append(","); } json.setCharAt(json.length() - 1, ']'); } else { 列表对象 * @return java.lang.String

55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85.

86. 87. 88. 89. 90. } } }

json.append("]"); return json.toString();

UserListAction.java:
Java 代码 1. package com.jsontostruts2.action; 2. 3. import java.util.ArrayList; 4. import java.util.List; 5. 6. import com.googlecode.jsonplugin.annotations.JSON; 7. import com.jsontostruts2.util.JsonUtil; 8. import com.jsontostruts2.vo.Users; 9. import com.opensymphony.xwork2.ActionSupport; 10. 11. /** 12. * <p> 13. * 创 建 人:ChenTao 14. * <p> 15. * 创建日期:2009-5-18 下午 05:45:42 16. * <p> 17. */ 18. @SuppressWarnings("serial") 19. public class UserListAction extends ActionSupport { 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. @Override public String execute() throws Exception { List<Users> userList = new ArrayList<Users>(); } public void setJsonResult(String jsonResult) { this.jsonResult = jsonResult; } @JSON(name="JSONRESULT") public String getJsonResult() { return jsonResult; /* 用于存放 JSON 生成后的字符串结果 */ private String jsonResult;

36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. } }

Users users = new Users(); users.setUserId(1); users.setUserName("ctojxzsycztao"); users.setSex("男人"); userList.add(users); users = null; users = new Users(); users.setUserId(2); users.setUserName("rain"); users.setSex("女人"); userList.add(users); users = null; users = new Users(); users.setUserId(3); users.setUserName("mimi"); users.setSex("女人"); userList.add(users); jsonResult = JsonUtil.listToJson(userList); System.out.println(jsonResult); return SUCCESS;

接下来将要写一个 jsonList.JSP 页面来将结果承现给用户
Html 代码 1. <%@ page language="java" contentType="text/html;charset=UTF-8"%> 2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 3. <html> 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. } <head> <title>json 返回列表处理</title> <script language="javascript"> var xmlHttp = false; try{ xmlHttp = new ActiveXObject("msxml2.XMLHTTP"); }catch(e1){ try{ xmlHttp = new ActiveXObject("microsoft.XMLHTTP"); }catch(e2){ try{ xmlHttp = new XMLHttpRequest(); }catch(e3){ xmlHttp = false;

19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. td></tr>"; 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. } } }

} if(!xmlHttp){ alert("create xmlHttpRequest fail"); function jsonListResult(){ xmlHttp.onreadystatechange = function(){ if(xmlHttp.readyState == 4) { var userList = eval('(' + xmlHttp.responseText + ')'); var user = eval(userList.JSONRESULT); var result = "<table border=0>"; result += "<tr><td>userId</td><td>userName</td><td>sex</ for(var i=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> <div id="jsonDiv"></div> <input type="button" value="show list" onclick="jsonListResult();"> </body>

51. </html>

现在将工程重复部署到 WEB 容器,启动:在浏览器中输 入 http://localhost:8080/struts2ToJson/jsonList.jsp 点 show list 按钮,看看结果 是否正确,如果不正确请参考本例程,看看有没漏掉部分没有配置进去,在以上代码中我们都 有看到 @JSON 的注解,该注解可以改变 JSON 返回结果的属性名,好了文章就写到这里,需 要下载示例的朋友可在附件中下载,里面包含有该文章的源代码和相应的 JAR
?
struts2ToJson.zip (3.2 MB)




友情链接: