JSON 是一個插件,它允許我們在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 代碼如下:
- package com.jsontostruts2.vo;
- /**
- * <p>
- * 創 建 人:ChenTao
- * <p>
- * 創建日期:2009-5-18 下午05:24:48
- * <p>
- */
- public class Users {
- private Integer userId;
- private String userName;
- private String sex;
- public Users() {
- }
- // get... set.... 略......
- }
package com.jsontostruts2.vo;
/**
* <p>
* 創 建 人:ChenTao
* <p>
* 創建日期:2009-5-18 下午05:24:48
* <p>
*/
public class Users {
private Integer userId;
private String userName;
private String sex;
public Users() {
}
// get... set.... 略......
}
實現 UserAction.java 源碼如下:
- package com.jsontostruts2.action;
- import com.googlecode.jsonplugin.annotations.JSON;
- import com.jsontostruts2.vo.Users;
- import com.opensymphony.xwork2.ActionSupport;
- /**
- * <p>
- * 創 建 人:ChenTao
- * <p>
- * 創建日期:2009-5-18 下午05:22:50
- * <p>
- */
- @SuppressWarnings("serial")
- public class UserAction extends ActionSupport {
- private Users users;
- @JSON(name="USER")
- public Users getUsers() {
- return users;
- }
- public void setUsers(Users users) {
- this.users = users;
- }
- @Override
- public String execute() throws Exception {
- users = new Users();
- users.setUserId(1);
- users.setUserName("ctojxzsycztao");
- users.setSex("男人");
- return SUCCESS;
- }
- }
package com.jsontostruts2.action;
import com.googlecode.jsonplugin.annotations.JSON;
import com.jsontostruts2.vo.Users;
import com.opensymphony.xwork2.ActionSupport;
/**
* <p>
* 創 建 人:ChenTao
* <p>
* 創建日期:2009-5-18 下午05:22:50
* <p>
*/
@SuppressWarnings("serial")
public class UserAction extends ActionSupport {
private Users users;
@JSON(name="USER")
public Users getUsers() {
return users;
}
public void setUsers(Users users) {
this.users = users;
}
@Override
public String execute() throws Exception {
users = new Users();
users.setUserId(1);
users.setUserName("ctojxzsycztao");
users.setSex("男人");
return SUCCESS;
}
}
接下來我們需要配置 struts.xml 文件,爲了在現下面不再重複寫該文件,這裏我將結果對象和列表的請求控制一併貼上來,文件內容:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <!-- 注意這裏擴展不再是 struts-default,而是 json-default -->
- <package name="jsonManager" extends="json-default">
- <!-- 返回結果類型爲 json -->
- <action name="userJson" class="com.jsontostruts2.action.UserAction">
- <result type="json"/>
- </action>
- <!-- 該action在返回列表時添加進來的 -->
- <action name="jsonlist" class="com.jsontostruts2.action.UserListAction">
- <result type="json"/>
- </action>
- </package>
- </struts>
能後創建web.xml 和 userjson.jsp:
- web.xml :
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="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 :
- <%@ page language="java" contentType="text/html;charset=UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <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;
- }
- }
- }
- if(!xmlHttp){
- alert("create xmlHttpRequest fail");
- }
- function jsonResult(){
- xmlHttp.onreadystatechange = function(){
- 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.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>
- <div id="jsonDiv"></div>
- <input type="button" value="show" onclick="jsonResult();">
- </body>
- </html>
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<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;
}
}
}
if(!xmlHttp){
alert("create xmlHttpRequest fail");
}
function jsonResult(){
xmlHttp.onreadystatechange = function(){
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.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>
<div id="jsonDiv"></div>
<input type="button" value="show" onclick="jsonResult();">
</body>
</html>
現在你可以將應用發佈到你的容器當中輸入 http://localhost:8080/struts2ToJson/userjson.jsp 點show,這個時候你可以看到你想要的結
果,接來實現下返回列表的做法,當然與返回對象會有所不同,我們需要將一個List對象轉換爲一個JSON規範的字符串,能後發送給客戶端的JS,
首先建立一個將List 轉換爲指定字符串的工具類,該工具是在一個無意間從網上看到就拿來用了,經過少許修改,爲了減少代碼行數我將只貼
出適用於本示例的代碼:
JsonUtil.java :
- package com.jsontostruts2.util;
- import java.beans.IntrospectionException;
- import java.beans.Introspector;
- import java.beans.PropertyDescriptor;
- import java.util.List;
- /**
- * <p>
- * @author ChenTao
- * <p>
- * @Date 2009-5-18 下午05:47:27
- * <p>
- */
- public class JsonUtil {
- /**
- * @param object
- * 任意對象
- * @return java.lang.String
- */
- public static String objectToJson(Object object) {
- StringBuilder json = new StringBuilder();
- if (object == null) {
- json.append("/"/"");
- } else if (object instanceof String || object instanceof Integer) {
- json.append("/"").append((String)object).append("/"");
- } else {
- json.append(beanToJson(object));
- }
- return json.toString();
- }
- /**
- * 功能描述:傳入任意一個 javabean 對象生成一個指定規格的字符串
- *
- * @param bean
- * bean對象
- * @return String
- */
- public static String beanToJson(Object bean) {
- StringBuilder json = new StringBuilder();
- json.append("{");
- PropertyDescriptor[] props = null;
- try {
- props = Introspector.getBeanInfo(bean.getClass(), Object.class)
- .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().invoke(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
- * 列表對象
- * @return java.lang.String
- */
- 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 {
- json.append("]");
- }
- return json.toString();
- }
- }
package com.jsontostruts2.util;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.List;
/**
* <p>
* @author ChenTao
* <p>
* @Date 2009-5-18 下午05:47:27
* <p>
*/
public class JsonUtil {
/**
* @param object
* 任意對象
* @return java.lang.String
*/
public static String objectToJson(Object object) {
StringBuilder json = new StringBuilder();
if (object == null) {
json.append("/"/"");
} else if (object instanceof String || object instanceof Integer) {
json.append("/"").append((String)object).append("/"");
} else {
json.append(beanToJson(object));
}
return json.toString();
}
/**
* 功能描述:傳入任意一個 javabean 對象生成一個指定規格的字符串
*
* @param bean
* bean對象
* @return String
*/
public static String beanToJson(Object bean) {
StringBuilder json = new StringBuilder();
json.append("{");
PropertyDescriptor[] props = null;
try {
props = Introspector.getBeanInfo(bean.getClass(), Object.class)
.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().invoke(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
* 列表對象
* @return java.lang.String
*/
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 {
json.append("]");
}
return json.toString();
}
}
UserListAction.java:
- package com.jsontostruts2.action;
- import java.util.ArrayList;
- import java.util.List;
- import com.googlecode.jsonplugin.annotations.JSON;
- import com.jsontostruts2.util.JsonUtil;
- import com.jsontostruts2.vo.Users;
- import com.opensymphony.xwork2.ActionSupport;
- /**
- * <p>
- * 創 建 人:ChenTao
- * <p>
- * 創建日期:2009-5-18 下午05:45:42
- * <p>
- */
- @SuppressWarnings("serial")
- public class UserListAction extends ActionSupport {
- /* 用於存放JSON生成後的字符串結果 */
- private String jsonResult;
- @JSON(name="JSONRESULT")
- public String getJsonResult() {
- return jsonResult;
- }
- public void setJsonResult(String jsonResult) {
- this.jsonResult = jsonResult;
- }
- @Override
- public String execute() throws Exception {
- List<Users> userList = new ArrayList<Users>();
- 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;
- }
- }
package com.jsontostruts2.action;
import java.util.ArrayList;
import java.util.List;
import com.googlecode.jsonplugin.annotations.JSON;
import com.jsontostruts2.util.JsonUtil;
import com.jsontostruts2.vo.Users;
import com.opensymphony.xwork2.ActionSupport;
/**
* <p>
* 創 建 人:ChenTao
* <p>
* 創建日期:2009-5-18 下午05:45:42
* <p>
*/
@SuppressWarnings("serial")
public class UserListAction extends ActionSupport {
/* 用於存放JSON生成後的字符串結果 */
private String jsonResult;
@JSON(name="JSONRESULT")
public String getJsonResult() {
return jsonResult;
}
public void setJsonResult(String jsonResult) {
this.jsonResult = jsonResult;
}
@Override
public String execute() throws Exception {
List<Users> userList = new ArrayList<Users>();
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頁面來將結果承現給用戶
- <%@ page language="java" contentType="text/html;charset=UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <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;
- }
- }
- }
- 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</td></tr>";
- 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>
- </html>
<%@ page language="java" contentType="text/html;charset=UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<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;
}
}
}
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</td></tr>";
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>
</html>
現在將工程重複部署到WEB容器,啓動:在瀏覽器中輸入 http://localhost:8080/struts2ToJson/jsonList.jsp 點 show list按鈕,看看結果
是否正確,如果不正確請參考本例程,看看有沒漏掉部分沒有配置進去,在以上代碼中我們都有看到 @JSON 的註解,該註解可以改變JSON返回結果的屬性名,好了文章就寫到這裏,需要下載示例的朋友可在附件中下載,裏面包含有該文章的源代碼和相應的 JAR
struts2ToJson.zip (3.2 MB)