`
zxmzxy
  • 浏览: 19916 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

[原创]Struts2 + JQuery + JSON实现AJAX

阅读更多

      网上关于这方面的资料也不少,但多半是struts1的,在Struts2中使用JSON可以更容易实现数据的异步传输。

      先做好准备工作:

      1.Struts2相关lib, 注意将struts2 lib下面的以json开头的包也加入到工程。

      2.JSON Plugin,它可以将Struts2 Action中的结果直接返回为JSON。下载地址:http://jsonplugin.googlecode.com/files/jsonplugin-0.34.jar (支持struts2.1.6及以上版本)。

      3.JQuery,JS的一个lib. 下载地址:http://www.jquery.com (最新版本为1.3.2)。

 

      准备工作都做好之后,我们可以开始了。建一个WEB工程,把相关的包加入到工程。我们需要做的就是三件事:

      一、准备一个JSP页面用于提交ajax请求,这里我使用了JQuery的$.getJSON(url,params,function callback(data))函数提交ajax请求到指定url,并且携带参数params,最后用一个回调函数callback处理请求返回结果data;

      二、一个处理请求的Action类,并在struts.xml文件中做相应配置:写一个action类处理ajax请求数据,并将返回结果封装成一个JSONObject对象返回给请求页面。同时在struts.xml中配置对应action,指明其返回类型为json并使其package的extends为json-default,并将要返回请求页面的数据放在名为root的param中,如<param name="root">result</param>。

      三、接受请求返回结果:使用JS的eval方法将返回结果data转换成JSON对象,并处理返回结果。

    

    具体参见以下代码:

    // login.jsp 使用getJSON方法提交ajax请求,并处理请求返回结果。注意请求的url为login.html这是因为我将struts2.preperties中的struts.action.extension改成了htm,默认为action。l

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><s:text name="page.title.login" /></title>
<script type="text/javascript" src="jquery-1.3.2.js"></script>
<script type="text/javascript" language="javascript">
$(document).ready(function(){
	$("#login").click(function(){
		login();
		});
});

function login(){
	var url = "login.html";
	var params = {"user.logName":$("#name").attr("value"),"user.password":$("#password").attr("value")};
	
	$.getJSON(url,params,function callback(data){
		// convert to json object
		var user = eval("("+data+")");//
		
		
		$("#result").each(function(){
			$(this).html('welcome ,' + user.name);
			});
		});
	}
</script>
</head>
<body>
<s:actionmessage/>
<form  method="post" id="form"><s:text
	name="user.label.name" />:<input type="textbox" name="user.logName" id="name"
	value='${param["user.logName"]}' /><br>
<s:text name="user.label.password" />:<input type="password" id="password"
	name="user.password" /><br>
<input type="button" id="login" value='<s:text name="button.label.login" />' /></form>
<div id="result">
	
</div>
</body>
</html>

 

    // struts.xml  注意package的extends属性与result的type属性。result为userAction的一个属性,这里将结果返回给ajax的请求页面。

  

<package name="login" namespace="/" extends="json-default" >
    	<action name="login" class="userAction" method="login" >
    		<result type="json">
    			<param name="root">result</param>
    		</result>
    	</action>
</package>

 

     // UserAction.java    只需要看login()方法,另外读者需要自己增加一个User的实体类用来获取请求数据。这里我只将user的logName与password封装到了一个map以JSONObject的方式返回(因为还有其它空属性没必要返回)。也可以直接调用JSONObject.fromObject(user)将整个user对象返回给JSON。注意最后返回的并不是一个JSONObject对象,而是一String类型的result。这里的result须与action中的<param name="root">中配置的一致。这里代码写的比较简单,没有增加对用户名密码的验证。

   

package com.word.action;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.word.vo.User;

import net.sf.json.JSONObject;

import org.apache.poi.hssf.record.formula.eval.AddEval;
import org.apache.struts2.components.ActionError;
import org.apache.struts2.components.ActionMessage;
import org.apache.struts2.interceptor.validation.JSONValidationInterceptor;

import com.opensymphony.xwork2.ActionSupport;
import com.word.service.IUserService;

public class UserAction extends ActionSupport {
	private User user;
	private String result;
	
	public String getResult(){
		return result;
	}
	
	public void setResult(String result){
		this.result = result;
	}

	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	private IUserService userService;

	public void setUserService(IUserService userService) {
		this.userService = userService;
	}

	public String login() throws Exception {
		
		Map map = new HashMap();
		map.put("name", user.getLogName());
		map.put("password",user.getPassword());
		JSONObject obj = JSONObject.fromObject(map);
		
		
		result = obj.toString();
		
		return SUCCESS;
	}

	/**
	 * get User list
	 */
	public List<User> findAll() throws Exception {
		return userService.findAll();
	}

	/**
	 * get User by id
	 * 
	 * @param id
	 * @throw Exception
	 */
	public User getUserById(Long id) throws Exception {
		return userService.getUserById(id);
	}

	/**
	 * create User
	 * 
	 * @param user
	 * @throw Exception
	 */
	public String createUser() {
		clearErrorsAndMessages();
		
		if(user.getLogName().trim().equals("") ){
			this.addActionMessage(getText("error.user.name"));
			return INPUT;
		}
		if(user.getPassword().trim().equals("") ){
			this.addActionMessage(getText("error.user.password"));
			return INPUT;
		}
		try{
			userService.createUser(user);
			this.addActionMessage(getText("user.message.create"));
			return INPUT;
		}catch(Exception e){
			this.addActionMessage("注册用户失败");
			return INPUT;
		}
	}

	/**
	 * update User
	 * 
	 * @param user
	 * @throw Exception
	 */
	public void updateUser() throws Exception {
		userService.updateUser(user);
	}

	/**
	 * delete User by id
	 * 
	 * @param id
	 * @throw Exception
	 */
	public void deleteUser(Long id) throws Exception {
		userService.deleteUser(id);
	}

}

 

分享到:
评论
20 楼 chensui110 2010-12-03  
tigerhen 写道
result设置成json之后,容器会把action的属性自动封装到一个json对象中(应该是使用拦截器转换的具体代码没有研究),然后调用js的rollback方法,所以action中的JSONObject.fromObject转换没有必要,而且jquery使用的是$.getJSON意思是获得json结果,返回的data赋给变量user之后可以直接user.name


同意,所以楼主做了不少无用功,
19 楼 luojihaidao 2010-07-09  
不错~ 学习下。
18 楼 spp_1987 2010-07-09  
LZ 我就想要 Struts1.x + JQuery + JSON实现AJAX
但是确实找了一段时间 并没有找到啊 ... 请LZ 帮忙 赫赫 先谢谢
17 楼 13798597897 2010-06-05  
                      
16 楼 nothink 2010-03-20  
ring09h 写道
zhajie 写道

struts2.18不是自带struts2-json-plugin-2.1.8.1的吗?

另外问下楼主,你的ajax提交后的转换错误和验证错误如何处理?


同问,应该怎么处理?能否详细点说下呢?


通常是因为你们直接转换hiberante中的model类。如果model类中有一对多或多对一,并且是双向的。那通常都会转换错误。
建议新建一个view类去转换或使用反射把一对多,多对一关系的内容设为null,当然也能手动设如果你喜欢的话。
15 楼 ring09h 2010-03-20  
zhajie 写道

struts2.18不是自带struts2-json-plugin-2.1.8.1的吗?

另外问下楼主,你的ajax提交后的转换错误和验证错误如何处理?


同问,应该怎么处理?能否详细点说下呢?
14 楼 steel.sun 2010-02-23  
好东西,我收下了,谢谢楼主
13 楼 tuzipp 2010-02-21  
恩,这个样确实很方便。我也这样用了很久了,但是里面存在以下问题始终没解决.
比如ACTION中怎么做输入规则严重,还有和spring、Hibernate结合之后,一些存在的BUG。
12 楼 haplone 2010-02-05  
主意不错,下次试试jsonplugin
11 楼 tigerhen 2010-02-05  
result设置成json之后,容器会把action的属性自动封装到一个json对象中(应该是使用拦截器转换的具体代码没有研究),然后调用js的rollback方法,所以action中的JSONObject.fromObject转换没有必要,而且jquery使用的是$.getJSON意思是获得json结果,返回的data赋给变量user之后可以直接user.name
10 楼 zxmzxy 2010-01-30  
nathanlee 写道
zxmzxy 写道
zhajie 写道

struts2.18不是自带struts2-json-plugin-2.1.8.1的吗?

另外问下楼主,你的ajax提交后的转换错误和验证错误如何处理?

我用的是2.1.6的,里面没看到plugin,所以我下了0.34的插件
至于转换错误,我想你可以在你的Action层自己写一些业务代码进行处理,这篇文章主要讲的是几个开源插件的整合问题。你可以参考create方法中的简单错误处理。


http://cwiki.apache.org/S2PLUGINS/json-plugin.html
The JSON plugin is bundled with Struts since 2.1.7+. The plugin at Google Code has been deprecated.

谢谢兄弟提醒,这样就可以直接用Struts2自带的plugin了,呵呵
9 楼 nathanlee 2010-01-28  
zxmzxy 写道
zhajie 写道

struts2.18不是自带struts2-json-plugin-2.1.8.1的吗?

另外问下楼主,你的ajax提交后的转换错误和验证错误如何处理?

我用的是2.1.6的,里面没看到plugin,所以我下了0.34的插件
至于转换错误,我想你可以在你的Action层自己写一些业务代码进行处理,这篇文章主要讲的是几个开源插件的整合问题。你可以参考create方法中的简单错误处理。


http://cwiki.apache.org/S2PLUGINS/json-plugin.html
The JSON plugin is bundled with Struts since 2.1.7+. The plugin at Google Code has been deprecated.
8 楼 zxmzxy 2010-01-28  
teclogid 写道
太明显的错误了。真是服了,还struts2,json,jquery呢。
既然用了json-plugin,前端是jquery,result还转成字符串,然后再jquery中用eval?
拜托你用一个东西前,先弄明白这东西是干嘛用的好不好?

btw,struts2.16的json-plugin有个明显的错误,在处理includeProperties,解析里面的正则表达式有误。


我也不是什么高人,只是亲生历验了以上代码是正确的,至少在我使用过程中没发现你所说的错误,我在此发表文章,一为分享自己的经验所得,二也是想得到大家的指正。如果有不妥的寺方欢迎指正并改善。
7 楼 hua0424 2010-01-26  
敢问楼上高人LZ做法有何不妥?要显示自己牛B,可提出改进方案供大家讨论
6 楼 teclogid 2010-01-23  
太明显的错误了。真是服了,还struts2,json,jquery呢。
既然用了json-plugin,前端是jquery,result还转成字符串,然后再jquery中用eval?
拜托你用一个东西前,先弄明白这东西是干嘛用的好不好?

btw,struts2.16的json-plugin有个明显的错误,在处理includeProperties,解析里面的正则表达式有误。

5 楼 zxmzxy 2010-01-04  
将xml配置文件中的userAction改成UserAction(包含完整包名),这里的userAction是我在做SSH集成的时候配的bean的id
4 楼 zxmzxy 2010-01-04  
alosin 写道
0.34版本的jsonplugin 与 struts2.1.8不兼容,2.1.8舍去了jsonplugin要用到的一个类TextUtil

2.1.8的我没试过,2楼的提到了2.1.8里自带了JSON的插件,你可以试下自带的插件,如果还有问题欢迎一起讨论。我的email:zxmzxy@126.com
3 楼 zxmzxy 2010-01-04  
zhajie 写道

struts2.18不是自带struts2-json-plugin-2.1.8.1的吗?

另外问下楼主,你的ajax提交后的转换错误和验证错误如何处理?

我用的是2.1.6的,里面没看到plugin,所以我下了0.34的插件
至于转换错误,我想你可以在你的Action层自己写一些业务代码进行处理,这篇文章主要讲的是几个开源插件的整合问题。你可以参考create方法中的简单错误处理。
2 楼 zhajie 2010-01-03  

struts2.18不是自带struts2-json-plugin-2.1.8.1的吗?

另外问下楼主,你的ajax提交后的转换错误和验证错误如何处理?
1 楼 alosin 2010-01-02  
0.34版本的jsonplugin 与 struts2.1.8不兼容,2.1.8舍去了jsonplugin要用到的一个类TextUtil

相关推荐

    Struts2+jQuery(不用JSON)实现局部刷新

    - **Struts2的JSON插件**:虽然题目要求不使用JSON,但通常情况下,Struts2通过JSON插件返回数据给jQuery是最方便的方式。不过,我们可以通过设置Content-Type为"text/plain"或"text/html",让Struts2返回非JSON...

    Struts2 + jQuery+JSON 实现ajax

    ### Struts2 + jQuery + JSON 实现Ajax 在现代Web开发中,Ajax技术因其能够实现网页的局部刷新而被广泛采用。本篇文章介绍如何利用Struts2框架结合jQuery与JSON来构建一个简单的Ajax功能。 #### 一、环境搭建 1. ...

    struts2+jQuery+json实现AJAX.zip

    struts2+jQuery+json实现AJAX.zip

    Struts2+Jquery+Ajax

    6. Struts2与Ajax的集成,使用JQuery的$.ajax()或$.getJSON()方法 7. 请求与响应的处理,包括参数传递和数据封装 8. 实例演示:使用Struts2+Jquery+Ajax实现动态加载数据或表单验证 "struts2 jar"文件包含了Struts2...

    struts2+jquery+json+ajax例子

    总结起来,"struts2+jquery+json+ajax"的例子展示了如何利用这些技术协同工作,实现一个无刷新的登录界面,提供流畅的用户体验。通过Struts2处理业务逻辑和数据验证,jQuery和Ajax负责前后端的通信,JSON作为数据...

    struts2+ajax+jquery

    在这个"struts2+ajax+jquery"的主题中,我们将深入探讨如何利用Struts2、jQuery和Ajax技术实现Web页面的异步交互。 首先,Struts2作为MVC框架,它的核心是Action,它负责处理用户的请求,并通过配置的Result返回...

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

    "Struts2+JSON+jQuery实现Ajax数据的存取"就是一个典型的示例,它结合了强大的MVC框架Struts2、轻量级的数据交换格式JSON以及高效的前端库jQuery,以实现网页上的无刷新数据交互。下面将详细介绍这三个技术及其在...

    SSH+jQuery+json 实现的Ajax操作,绝对精华,代码简练清晰,绝对能看明白

    这个压缩包中的资源,"SSH+jQuery+json 实现的Ajax操作,绝对精华,代码简练清晰,绝对能看明白",显然提供了一个使用这些技术实现Ajax级联操作的实例。下面将详细介绍这些技术及其在Ajax操作中的应用。 **SSH ...

    Struts2+Jquery+ajax+Json代码案例

    在“Struts2 Jquery ajax Json实现的一个完整案例”中,这些技术结合使用,以提高用户体验并优化服务器通信。 **Struts2** 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它简化了开发过程,提供...

    Struts+Jquery+Ajax+Json应用实例

    在"Struts+Jquery+Ajax+Json应用实例"中,前端使用jQuery库来监听用户事件,比如点击按钮。当事件触发时,jQuery通过Ajax发送一个HTTP请求到后端的Struts Action。在Struts框架中,这个Action会处理请求,执行必要的...

    struts2+spring+hibernate+jquery+json

    Struts2、Spring、Hibernate、jQuery 和 JSON 是五个在IT行业中极为重要的技术组件,它们各自在Web应用开发中扮演着不同的角色。这篇文章将详细介绍这些技术的整合使用以及它们的功能。 首先,Struts2 是一个基于 ...

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

    Struts2、JSON和JQuery是Web开发中的三个关键技术,它们常常被结合使用来构建高效、动态的用户界面。在本教程中,我们将探讨如何利用这些技术实现一个简单的验证功能。 首先,Struts2是一个基于MVC(Model-View-...

    struts2+json+ajax+jquery

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

    struts2+json

    这个资源"struts2+json"显然涉及到在Struts2框架下实现JSON(JavaScript Object Notation)数据交换,这是一种轻量级的数据交换格式,广泛用于前后端交互,特别是AJAX(Asynchronous JavaScript and XML)请求。...

    struts2+jquery+json

    例如,当用户在前端进行某些操作(如点击按钮),jQuery会发送Ajax请求到Struts2的Action,Struts2处理请求并以JSON格式返回响应,jQuery接收到数据后动态更新页面元素,如表格、列表或其他UI组件。 在实际应用中,...

    一个简单的struts2+json+jquery 交互的例子

    当用户界面触发某个事件(比如点击按钮),jQuery会发起Ajax请求,Struts2 Action执行相关逻辑并生成JSON响应,最后jQuery将数据插入到网页中,完成一次完整的交互。 总结来说,这个例子展示了如何利用Struts2处理...

    json2+jsonplugin struts2整合ajax时,使用json时需要的jar包

    在Struts2框架中整合Ajax以实现异步数据交互,JSON(JavaScript Object Notation)扮演了关键角色。JSON是一种轻量级的数据交换格式,它允许Web应用与服务器之间高效地传输数据,而无需进行繁琐的HTTP请求。在这个...

    struts2+jquery+json+ajax

    Struts2、jQuery、JSON和Ajax是Web开发中常见的技术栈,它们在构建动态、交互式的Web应用程序中扮演着重要角色。这篇博文可能是介绍如何将这些技术整合到一起,以提高用户界面的响应性和用户体验。 Struts2是一个...

Global site tag (gtag.js) - Google Analytics