`
ctojxzsycztao
  • 浏览: 78695 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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插件,我这里下载的是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.... 略......
}

 

实现 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;
	}

}

 

接下来我们需要配置 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>

 

现在你可以将应用发布到你的容器当中输入 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();
	}
}

 

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;
	}
}

 

接下来将要写一个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>

 现在将工程重复部署到WEB容器,启动:在浏览器中输入 http://localhost:8080/struts2ToJson/jsonList.jsp 点 show list按钮,看看结果

是否正确,如果不正确请参考本例程,看看有没漏掉部分没有配置进去,在以上代码中我们都有看到 @JSON 的注解,该注解可以改变JSON返回结果的属性名,好了文章就写到这里,需要下载示例的朋友可在附件中下载,里面包含有该文章的源代码和相应的 JAR

分享到:
评论
14 楼 zcqshine 2012-10-12  
zzd 写道
用你的方法以后,一直报找不到action, ,这是为什么

这个要看你自己的配置了...这个只是个工具类嘛
13 楼 cwj158 2012-07-09  
假如实体类Users的属性是Float的话。没办法格式化为json哦。这样那数字类型的都输出不了,有何好方法
zzd 写道
用你的方法以后,一直报找不到action, ,这是为什么

请看下src/struts2.xml是否编译过去了
12 楼 zzd 2012-07-04  
用你的方法以后,一直报找不到action, ,这是为什么
11 楼 zcqshine 2012-06-07  
lghjbxc 写道
假如实体类Users的属性是Float的话。没办法格式化为json哦。这样那数字类型的都输出不了,有何好方法

String value = objectToJson(props[i].getReadMethod().invoke(bean));

改成
String value = objectToJson(String.valueOf(props[i].getReadMethod().invoke(bean) == null ? "" : props[i].getReadMethod().invoke(bean)));

将数字类型转换为String类型就行了.
10 楼 lghjbxc 2012-05-28  
假如实体类Users的属性是Float的话。没办法格式化为json哦。这样那数字类型的都输出不了,有何好方法
9 楼 胖胖兔儿 2012-04-17  
为什么总是var goodslist = eval('(' +xmlHttp.responseText+ ')');这句出错
8 楼 sangi2008 2012-02-17  
午夜的太阳 写道
<struts> 
    <!-- 注意这里扩展不再是 struts-default,而是 json-default --> 
    <package name="jsonManager" extends="json-default"> 
        <!-- 返回结果类型为 json --> 
        <action name="userJson" class="com.jsontostruts2.action.UserAction"> 
            <result type="json"/> 
        </action>

注释部分,如果我要在己经应用struts2的配置文件中,即扩展是 struts-default的情况下如果扩展json呢???


<include file="json_struts.xml"></include>
7 楼 lx890203 2012-02-17  
lx890203 写道
我想说可能给的那个JsonUtil.java有错误  生成的是不完整的json
亲手实验的  我是在别的网页找的代码    http://download.csdn.net/download/yangtyty0011/2902715   希望不会给使用带来麻烦  同时楼主这篇文章给了我很大帮助 非常感谢 

是list型的有问题
6 楼 lx890203 2012-02-17  
我想说可能给的那个JsonUtil.java有错误  生成的是不完整的json
亲手实验的  我是在别的网页找的代码    http://download.csdn.net/download/yangtyty0011/2902715   希望不会给使用带来麻烦  同时楼主这篇文章给了我很大帮助 非常感谢 
5 楼 午夜的太阳 2011-07-26  
<struts> 
    <!-- 注意这里扩展不再是 struts-default,而是 json-default --> 
    <package name="jsonManager" extends="json-default"> 
        <!-- 返回结果类型为 json --> 
        <action name="userJson" class="com.jsontostruts2.action.UserAction"> 
            <result type="json"/> 
        </action>

注释部分,如果我要在己经应用struts2的配置文件中,即扩展是 struts-default的情况下如果扩展json呢???
4 楼 zzxiaoben 2010-12-21  
楼主,怎么我后台的jsonResult 没有数据呢,打印都打不出来.....什么原因呢
3 楼 duronshi 2010-03-03  
你好,使用你的userjson.jsp总是提示语法错误,就是eval('('...这一行上,
jsonplugin-0.31.jar/0.34.jar都试用了,依旧是语法错误,是什么原因呢?
2 楼 younglibin 2010-03-01  
mhhtj 写道
当返回类型是一个简单对象时,json插件能够很方便的将一个简单对象转换成json格式的字符串
而当返回类型是一个列表对象时,必须自己写工具类将列表对象转换成json格式?
为什么json插件不直接做好呢?

给你留下发展的空间吗!
1 楼 mhhtj 2009-05-26  
当返回类型是一个简单对象时,json插件能够很方便的将一个简单对象转换成json格式的字符串
而当返回类型是一个列表对象时,必须自己写工具类将列表对象转换成json格式?
为什么json插件不直接做好呢?

相关推荐

    struts2+json

    总的来说,"struts2+json"资源涉及到了Struts2框架中的Action设计、拦截器机制、结果类型的配置,以及AJAX和JSON在Web应用中的使用。理解这些知识点对于开发动态、交互性强的Java Web应用至关重要。

    struts2+json+ajax整合例子(导入即可运行,附带详细教程)

    Struts2、JSON和AJAX是Web开发中的关键技术,它们的整合可以实现高效的数据交互和动态页面更新。本文将深入探讨这些技术以及如何在实际项目中整合它们。 **Struts2** 是一个基于MVC(Model-View-Controller)设计...

    Struts2+JSON_实现AJAX_返回对象和列表

    本文将详细解释如何使用Struts2和JSON来实现AJAX返回对象和列表。 首先,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,同时也易于机器解析和生成。在Struts2中,JSON插件...

    Struts2 + jQuery+JSON 实现ajax

    这种配置使得当用户发起Ajax请求时,Struts2会自动将Java对象转换为JSON格式的数据返回给前端。 3. **前端页面编写** 前端页面使用了jQuery库来发起Ajax请求。首先引入jQuery库(这里使用的是1.2.6版本),然后...

    struts2+json+jquery实现ajax数据的存取

    在Struts2中,我们可以使用JSON插件来方便地序列化和反序列化Java对象为JSON格式,从而实现在Ajax请求中发送和接收数据。 **3. jQuery库** jQuery是一个高效、简洁的JavaScript库,它简化了HTML文档遍历、事件处理...

    struts2+json+ajax+jquery

    总结来说,Struts2提供了后台处理和视图控制,JSON负责数据传输,Ajax实现了无刷新交互,而jQuery简化了这一过程。这种组合在Web开发中极其常见,是构建动态、高效Web应用的重要工具。理解并熟练掌握这四者之间的...

    struts2+jQuery+json实现AJAX.zip

    struts2+jQuery+json实现AJAX.zip

    struts2+json+jquery实现ajax登录和注册功能.pdf

    .struts2+json+jquery实现ajax登录和注册功能.pdf

    struts2+json+jquery实现ajax登录和注册功能.docx

    .struts2+json+jquery实现ajax登录和注册功能.docx

    struts2+json/ajax

    通过这种整合,开发者可以利用Struts2的强大功能处理后端业务逻辑,同时利用Ajax和JSON实现快速、无刷新的前端交互,提高用户体验。在实际开发中,还应注意安全问题,如防止XSS和CSRF攻击,以及正确处理JSONP跨域...

    struts2+jquery+json+ajax例子

    Struts2、jQuery、JSON和Ajax是Web开发中常见的技术栈,它们共同为构建动态、交互式的用户界面提供了强大的支持。下面将详细解释这些技术及其在登录示例中的应用。 Struts2是一个基于MVC(Model-View-Controller)...

    ZTree+Struts2+ajax+json实现checkbox权限树

    【标题】"ZTree+Struts2+ajax+json实现checkbox权限树"涉及的技术栈主要集中在前端的ZTree,后端的Struts2框架,以及数据交互中的Ajax和JSON。这个项目的核心目标是构建一个可复选的权限树形结构,用户通过勾选节点...

    struts2+json+ajax

    Struts2、JSON和Ajax是Web开发中的三个关键技术,它们共同构建了动态、交互式的用户界面,提高了用户体验。本文将详细解析这三个技术及其在实际应用中的整合。 **Struts2** 是一个开源的MVC(Model-View-Controller...

    Struts2+JSON+JQuery实现简单的验证

    6. **实现JSON返回**:在Struts2 Action中,使用`ValueStack`或`ActionContext`将验证结果转化为JSON对象,然后设置结果类型为JSON,让Struts2自动处理JSON响应。 7. **测试**:启动Tomcat服务器,访问JSP页面,...

    ExtJs + Struts2 + JSON 程序总结

    在前端,EXTJS使用Ajax请求调用Struts2 Action,接收返回的JSON数据,然后动态渲染UI,展示所有订单及其对应的客户信息。 总结来说,ExtJs + Struts2 + JSON 的组合提供了一种高效、灵活的方法来构建富客户端Web...

Global site tag (gtag.js) - Google Analytics