首页 > 代码库 > Struts2之—自定义结果集实现ajax
Struts2之—自定义结果集实现ajax
项目中我们经常遇到这样的需求——页面部分刷新,例如:添加用户,转到添加用户页面时,页面自动加载了所有部门。
完整流程:选择所属部门,填写用户名和密码,点击“注册”
填写用户名后,需要立即检查数据库是否存在此用户名,如何在不刷新页面的情况下实现此效果?
但看上面提出的问题并不难,情况很常见,都知道使用ajax实现,但是如何在struts中自定义结果集来实现ajax——这是这篇博客的重点。
(注:servlet要么转发要么重定向,struts2可以自定义结果集)
转发、重定向、action2action都会使页面刷新,满足不了页面无刷新的需求,因此,可以自己定义一个结果集来解决(通过此结果集把服务器端(action)的数据回调到客户端)。
工具:MyEclipse8.5、tomcat6.0.39
一,步骤:
1,创建一个名称为Struts+AjaxResult的Web项目
2,导入Struts相关包
3,配置web.xml文件
4,创建PoJo类——User.java
5,创建Action基类和子Action类——BaseAction、UserAction.java
6,创建自定义结果集——AjaxResult.java
7,配置Struts.xml文件
8,创建页面——add.jsp
9,创建js文件——user_add.js
(注:还需引入jquery.js文件)
----web.xml:配置文件(注:配置Struts2的核芯过滤器)
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xmlversion="1.0" encoding="UTF-8"?> <web-appversion="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"> <!-- 配置Struts2的核心的过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app></span>
----User.java:用户实体类
<span style="font-family:KaiTi_GB2312;font-size:18px;">importjava.io.Serializable; public class Userimplements Serializable{ private Long uid;//用户id private String username;//用户名 private String password;//密码 //*********get/set方法********************************************* publicLong getUid() { returnuid; } publicvoid setUid(Long uid) { this.uid= uid; } publicString getUsername() { returnusername; } publicvoid setUsername(String username) { this.username= username; } publicString getPassword() { returnpassword; } publicvoid setPassword(String password) { this.password= password; } }</span>
----BaseAction.java:抽象Action类,封装公共内容
<span style="font-family:KaiTi_GB2312;font-size:18px;">importjava.lang.reflect.ParameterizedType; importcom.opensymphony.xwork2.ActionSupport; importcom.opensymphony.xwork2.ModelDriven; /** * 这里封装一些共用的内容 * @author Administrator * */ public classBaseAction<T> extends ActionSupport implements ModelDriven<T>{ privateClass classt; privateT t; publicstatic final String ADDUI = "addUI"; publicString addUI = ADDUI; publicBaseAction(){ try{ ParameterizedTypetype = (ParameterizedType)this.getClass().getGenericSuperclass(); this.classt= (Class)type.getActualTypeArguments()[0]; this.t= (T)this.classt.newInstance(); }catch(Exceptione){ e.printStackTrace(); } } publicT getModel() { //TODO Auto-generated method stub returnthis.t; } }</span>
----UserAction.java:用户模块处理 Action
<span style="font-family:KaiTi_GB2312;font-size:18px;"><span style="color:#333333;">importcn.itcast.oa0909.domain.User; importcn.itcast.oa0909.struts2.action.base.BaseAction; importcom.opensymphony.xwork2.ActionContext; publicclass UserAction extendsBaseAction<User>{ /** * 跳转到添加用户页面 * @return */ publicString addUI(){ returnaddUI; } /** * 校验用户名是否存在 * @return */ publicString checkUserName(){ if("学敏".equals(this.getModel().getUsername())){//如果输入的用户名为"学敏" ActionContext.getContext().getValueStack().push("该用户名已经存在");//把数据压入栈顶 }else{//如果输入的用户名就不是“学敏” ActionContext.getContext().getValueStack().push("该用户名可以使用");//把数据压入栈顶 } returnSUCCESS; } }</span></span>
----AjaxResult.java:自定义结果集(注:通过此结果集把服务器端(action)的数据回调到客户端)
<span style="font-family:KaiTi_GB2312;font-size:18px;">importjavax.servlet.http.HttpServletResponse; importorg.apache.struts2.ServletActionContext; importcom.opensymphony.xwork2.ActionContext; importcom.opensymphony.xwork2.ActionInvocation; importcom.opensymphony.xwork2.Result; public classAjaxResult implements Result{ publicvoid execute(ActionInvocation invocation) throws Exception { HttpServletResponseresponse = ServletActionContext.getResponse(); response.setCharacterEncoding("utf-8");//处理中文乱码问题 String message =ActionContext.getContext().getValueStack().peek().toString();//得到栈顶元素 response.getWriter().print(message);//将得到的栈顶元素返回到客户端 } }</span>
----struts.xml:Struts配置文件
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xmlversion="1.0" encoding="UTF-8"?> <!DOCTYPE strutsPUBLIC "-//ApacheSoftware Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- 配置文件改了以后不用重新启动 --> <constant name="struts.devMode"value=http://www.mamicode.com/"true"/>>
----struts-user.xml
<span style="font-family:KaiTi_GB2312;font-size:18px;"><?xmlversion="1.0" encoding="UTF-8"?> <!DOCTYPE strutsPUBLIC "-//ApacheSoftware Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!--继承Struts-default结果集 --> <package name="user"namespace="/" extends="struts-default"> <actionname="userAction_*" method="{1}"class="cn.itcast.oa0909.struts2.action.UserAction"> <resultname="addUI">WEB-INF/jsp/user/add.jsp</result> </action> </package> <!-- 继承自定义结果集——ajax-default(在struts.xml文件中已配置) --> <package name="userjson"namespace="/" extends="ajax-default"> <actionname="userJSONAction_*" method="{1}"class="cn.itcast.oa0909.struts2.action.UserAction"> <resulttype="ajax"></result> </action> </package> </struts> </span>----add.jsp:添加用户页面
<span style="font-family:KaiTi_GB2312;font-size:18px;"><%@ pagelanguage="java" import="java.util.*"pageEncoding="UTF-8"%> <scriptlanguage="javascript"src=http://www.mamicode.com/"${pageContext.request.contextPath}/js/jquery-1.4.2.js"></script>>(注:假设这里的所属部门中的数据是页面加载时从数据库中读取的,而不是如上所示写死的)
页面效果:
所属部门下拉框展开,如下所示:
-----user_add.js:添加用户页面所需js
<span style="font-family:KaiTi_GB2312;font-size:18px;">var user = { //初始化事件 inintEvent: function(){ $("input[name='username']").unbind("blur"); $("input[name='username']").bind("blur",function(){//name值为"username"的文本框失去焦点触发的函数 user.checkUser($(this).val());//调用检查用户函数(校验用户名是否存在) }); }, /** * 校验用户名是否存在 */ checkUser:function(username){ var a ="a"; var parameter = {//参数:用户名 username:username }; /** *userJSONAction_checkUserName.action:请求地址 * parameter:参数 *function(data){}:回调函数 */ $.post("userJSONAction_checkUserName.action",parameter,function(data){ $("#message").text(data);//将服务器返回的值赋给id="message"的label提示框,并显示 if(data=http://www.mamicode.com/="该用户名可以使用"){>二,运行
输入地址:http://localhost:8080/Struts2+AjaxResult/userAction_addUI.action,显示如下页面
用户名输入“学敏”,数据库中已经存在了此用户名,则当鼠标离开用户名文本框(即,用户名文本框失去焦点)时(注:此处为ajax请求,它的处理过程,和应用的技术点为本博客讲解的重点),就会提示“该用户已经存在”;用户名输入“张三那”,数据库中不存在,则提示“该用户名可以使用”
三,总结
自定义结果集的缺点:
。。。。待续。。。
Struts2之—自定义结果集实现ajax