精华帖 (0) :: 良好帖 (0) :: 新手帖 (13) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-31
网上关于这方面的资料也不少,但多半是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); } }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-02
0.34版本的jsonplugin 与 struts2.1.8不兼容,2.1.8舍去了jsonplugin要用到的一个类TextUtil
|
|
返回顶楼 | |
发表时间:2010-01-03
struts2.18不是自带struts2-json-plugin-2.1.8.1的吗? 另外问下楼主,你的ajax提交后的转换错误和验证错误如何处理? |
|
返回顶楼 | |
发表时间:2010-01-04
zhajie 写道 struts2.18不是自带struts2-json-plugin-2.1.8.1的吗? 另外问下楼主,你的ajax提交后的转换错误和验证错误如何处理? 我用的是2.1.6的,里面没看到plugin,所以我下了0.34的插件 至于转换错误,我想你可以在你的Action层自己写一些业务代码进行处理,这篇文章主要讲的是几个开源插件的整合问题。你可以参考create方法中的简单错误处理。 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2010-01-04
将xml配置文件中的userAction改成UserAction(包含完整包名),这里的userAction是我在做SSH集成的时候配的bean的id
|
|
返回顶楼 | |
发表时间:2010-01-23
最后修改:2010-01-23
太明显的错误了。真是服了,还struts2,json,jquery呢。
既然用了json-plugin,前端是jquery,result还转成字符串,然后再jquery中用eval? 拜托你用一个东西前,先弄明白这东西是干嘛用的好不好? btw,struts2.16的json-plugin有个明显的错误,在处理includeProperties,解析里面的正则表达式有误。 |
|
返回顶楼 | |
发表时间:2010-01-26
敢问楼上高人LZ做法有何不妥?要显示自己牛B,可提出改进方案供大家讨论
|
|
返回顶楼 | |
发表时间:2010-01-28
teclogid 写道 太明显的错误了。真是服了,还struts2,json,jquery呢。
既然用了json-plugin,前端是jquery,result还转成字符串,然后再jquery中用eval? 拜托你用一个东西前,先弄明白这东西是干嘛用的好不好? btw,struts2.16的json-plugin有个明显的错误,在处理includeProperties,解析里面的正则表达式有误。 我也不是什么高人,只是亲生历验了以上代码是正确的,至少在我使用过程中没发现你所说的错误,我在此发表文章,一为分享自己的经验所得,二也是想得到大家的指正。如果有不妥的寺方欢迎指正并改善。 |
|
返回顶楼 | |
发表时间: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. |
|
返回顶楼 | |