Struts2+JSON 实现AJAX 返回对象和列表
2012-07-15 12:56
330 查看
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 代码如下:
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 源码如下:
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代码
<?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:
Xml代码
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 :
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 :
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:
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页面来将结果承现给用户
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
相关文章推荐
- Struts2+JSON 实现AJAX 返回对象和列表
- Struts2+JSON 实现AJAX 返回对象和列表
- Ajax调用后台action返回JSONArray(JSONObject)类型实现jsp中下拉列表的动态显示
- ssh和springside 实现ajax返回对象列表
- 本文使用springMVC和ajax,实现将JSON对象返回到页面
- Struts2+json实现ajax,返回输出结果不正确,含有反斜杠和双引号(\")
- struts返回对象json格式数据
- Ajax调用返回json数组,对象 (JSONArray.fromObject)
- 利用JQuery jsonp实现Ajax跨域请求 .Net 的*.handler 和 WebService,返回json数据
- AJAX-----07XMLHttpRequest对象的处理返回的JSON类型数据
- ASP.NET使用Ajax返回Json对象
- 使用springMVC注解@ResponseBody与jackson工具类在ajax请求中实现对象与json之间的相互转化
- ThinkPHP通过AJAX返回JSON的两种实现方法
- jsp发送ajax请求,servlet返回json对象实例
- Struts2+Jquery实现ajax并返回json类型数据
- ThinkPHP通过AJAX返回JSON的两种实现方法
- 利用JQuery jsonp实现Ajax跨域请求 .Net 的*.handler 和 WebService,返回json数据
- js+ajax处理java后台返回的json对象循环创建到表格的方法
- 将List对象列表转换成JSON格式的类实现方法
- ASP.NET(AJAX+JSON)实现对象调用