Struts2之—自定义结果集实现ajax

      项目中我们经常遇到这样的需求——页面部分刷新,例如:添加用户,转到添加用户页面时,页面自动加载了所有部门。

完整流程:选择所属部门,填写用户名和密码,点击“注册”

填写用户名后,需要立即检查数据库是否存在此用户名,如何在不刷新页面的情况下实现此效果?


但看上面提出的问题并不难,情况很常见,都知道使用ajax实现,但是如何在struts中自定义结果集来实现ajax——这是这篇博客的重点。

servlet要么转发要么重定向,struts2可以自定义结果集

 

   转发、重定向、action2action都会使页面刷新,满足不了页面无刷新的需求,因此,可以自己定义一个结果集来解决(通过此结果集把服务器端(action)的数据回调到客户端)

 

工具:MyEclipse8.5tomcat6.0.39

一,步骤:

1,创建一个名称为Struts+AjaxResultWeb项目

2,导入Struts相关包


3,配置web.xml文件

4,创建PoJo类——User.java

5,创建Action基类和子Action类——BaseActionUserAction.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="true"/>
   <constantname="struts.ui.theme" value="simple"/>
  
   <includefile="struts/struts-user.xml"></include>
 
<!-- 配置自定义结果集-->
<packagename="ajax-default" extends="struts-default">
<result-types>
<result-typename="ajax"class="cn.itcast.oa0909.result.AjaxResult"></result-type>
</result-types>
</package>
</struts>        
</span>


----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="${pageContext.request.contextPath}/js/jquery-1.4.2.js"></script>
<scriptlanguage="javascript"src="${pageContext.request.contextPath}/js/user_add.js"></script>
<html>
<head>
<title>用户信息</title>
    <metahttp-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>
<body>
<form action="userAction_add.action">
<table>
   <tr><tdwidth="100">所属部门</td>
       <td><selectname="departmentId" class="SelectStyle">
            <optionvalue="0" selected="selected">请选择部门</option>
            <optionvalue="7">总经理室</option>
            <optionvalue="1">市场部</option>
            <optionvalue="2">咨询部</option>
            <optionvalue="3">招生部</option>
            <optionvalue="4">教学部</option>
            <optionvalue="5">后勤部</option>
           </select>
       </td>
   </tr>
<tr>
  <td>用户名:</td>
   <td><input type="text"name="username"/><labelid="message"></label></td>
</tr>
<tr>
 <td>密码:</td>
  <td><input type="password"name="password"/></td>
</tr>
<tr>
 <td colspan="2"><input type="submit"value="注册"/></td> 
</tr>
 
</table>
</form>
</body>
 
</html></span>

(注:假设这里的所属部门中的数据是页面加载时从数据库中读取的,而不是如上所示写死的)

页面效果:


 

所属部门下拉框展开,如下所示:


-----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=="该用户名可以使用"){
$("#message").css("color","blue");//设置提示文字的颜色
}else{
$("#message").css("color","red");//设置提示文字的颜色
}
});        
 
}
};
//页面加载时运行
$().ready(function(){
user.inintEvent();//页面加载时,调用初始化事件
</span>

二,运行

输入地址:http://localhost:8080/Struts2+AjaxResult/userAction_addUI.action,显示如下页面


 



用户名输入“学敏”,数据库中已经存在了此用户名,则当鼠标离开用户名文本框(即,用户名文本框失去焦点)(注:此处为ajax请求,它的处理过程,和应用的技术点为本博客讲解的重点),就会提示“该用户已经存在”;用户名输入“张三那”,数据库中不存在,则提示“该用户名可以使用”


三,总结

自定义结果集的缺点:

这样自定义的结果集,写死了,不能做到客户端需要什么数据就传什么数据;

如,UserAction中的代码:

ActionContext.getContext().getValueStack().push("该用户名已经存在");//把数据压入栈顶

——把客户端需要的数据都要压入栈顶

 

AjaxResult中的代码:

      String message =ActionContext.getContext().getValueStack().peek().toString();//得到栈顶元素

      response.getWriter().print(message);//将得到的栈顶元素返回到客户端

——获取栈顶的元素,再通过 response.getWriter().print()语句将的到的栈顶元素返回到客户端;

那么问题来了,如果我需要的数据增加了,怎么办?毋庸置疑,在UserAction 中将增加的数据压入栈顶,还要在AjaxResult中依次获取数据,再通过 response.getWriter().print()依次返回,也就是会说此AjaxResultUserAction要一一对应,必须写死在程序里,不灵活,不能做到客户端需要什么数据就传什么数据;

另外还有一个问题,如果其他业务,比如“部门管理”模块的一个功能也需要从服务器端返回数据到客户端,那是不是还要再写一个自定义结果集,AjaxResult如何做到复用,能不能做到复用,这是个问题。

 

基于以上问题,下篇博客介绍——json类型的结果集——JSON插件是Struts2Ajax插件,通过利用JSON插件,允许开发者以非常灵活的方式开发AJAX应用。




  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值