Struts2 + JQuery + JSON实现AJAX(2)
程序员文章站
2022-03-11 21:20:59
...
Struts2 + JQuery + JSON实现AJAX2010-04-22 13:45 网上关于这方面的资料也不少,但多半是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);
}
}
先做好准备工作:
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);
}
}
上一篇: SG函数
推荐阅读
-
Jquery+Ajax+Json+存储过程实现高效分页
-
struts2中action实现ModelDriven后无法返回json的解决方法
-
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
-
jquery教程ajax请求json数据示例
-
ThinkPHP通过AJAX返回JSON的两种实现方法
-
基于jQuery实现Ajax验证用户名是否可用实例
-
js与jQuery实现的兼容多浏览器Ajax请求实例
-
利用 Linq+Jquery+Ajax 实现异步分页功能可简化带宽压力
-
jQuery中使用Ajax获取JSON格式数据示例代码
-
js与jQuery实现获取table中的数据并拼成json字符串操作示例