zoukankan      html  css  js  c++  java
  • Struts学习之自定义结果集

    转自:http://blog.csdn.net/hanxuemin12345/article/details/38763057

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

    完整流程:选择所属部门,填写用户名和密码,点击“注册”,填写用户名后,需要立即检查数据库是否存在此用户名,如何在不刷新页面的情况下实现此效果?


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

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

    一,步骤:

    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的核芯过滤器)

     1 <span style="font-family:KaiTi_GB2312;font-size:18px;"><?xmlversionxmlversion="1.0" encoding="UTF-8"?>  
     2 <web-appversionweb-appversion="2.5"  
     3 xmlns="http://java.sun.com/xml/ns/javaee"  
     4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
     5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
     6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
     7    
     8 <!-- 配置Struts2的核心的过滤器 -->  
     9 <filter>  
    10 <filter-name>struts2</filter-name>  
    11 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
    12 </filter>  
    13 <filter-mapping>  
    14 <filter-name>struts2</filter-name>  
    15 <url-pattern>/*</url-pattern>  
    16 </filter-mapping>  
    17    
    18    
    19   <welcome-file-list>  
    20    <welcome-file>index.jsp</welcome-file>  
    21   </welcome-file-list>  
    22 </web-app></span>
    View Code

    ---User.java:用户实体类

     1 <span style="font-family:KaiTi_GB2312;font-size:18px;">importjava.io.Serializable;  
     2 public class Userimplements Serializable{  
     3 private Long uid;//用户id  
     4 private String username;//用户名  
     5 private String password;//密码  
     6    
     7 //*********get/set方法*********************************************  
     8 publicLong getUid() {  
     9 returnuid;  
    10 }  
    11    
    12 publicvoid setUid(Long uid) {  
    13 this.uid= uid;  
    14 }  
    15    
    16 publicString getUsername() {  
    17 returnusername;  
    18 }  
    19    
    20 publicvoid setUsername(String username) {  
    21 this.username= username;  
    22 }  
    23    
    24 publicString getPassword() {  
    25 returnpassword;  
    26 }  
    27    
    28 publicvoid setPassword(String password) {  
    29 this.password= password;  
    30 }  
    31    
    32 }</span> 
    View Code

    ----BaseAction.java:抽象Action类,封装公共内容

     1     <span style="font-family:KaiTi_GB2312;font-size:18px;">importjava.lang.reflect.ParameterizedType;  
     2        
     3     importcom.opensymphony.xwork2.ActionSupport;  
     4     importcom.opensymphony.xwork2.ModelDriven;  
     5        
     6     /** 
     7      * 这里封装一些共用的内容 
     8      * @author Administrator 
     9      * 
    10      */  
    11     public classBaseAction<T> extends ActionSupport implements ModelDriven<T>{  
    12     privateClass classt;  
    13     privateT t;  
    14        
    15     publicstatic final String ADDUI = "addUI";  
    16     publicString addUI = ADDUI;  
    17        
    18     publicBaseAction(){  
    19     try{  
    20     ParameterizedTypetype = (ParameterizedType)this.getClass().getGenericSuperclass();  
    21     this.classt= (Class)type.getActualTypeArguments()[0];  
    22     this.t= (T)this.classt.newInstance();  
    23     }catch(Exceptione){  
    24     e.printStackTrace();  
    25     }  
    26     }  
    27        
    28     publicT getModel() {  
    29     //TODO Auto-generated method stub  
    30     returnthis.t;  
    31     }  
    32     }</span>  
    View Code

    ----UserAction.java:用户模块处理 Action

     1 importcn.itcast.oa0909.domain.User;  
     2 importcn.itcast.oa0909.struts2.action.base.BaseAction;  
     3 importcom.opensymphony.xwork2.ActionContext;  
     4    
     5 publicclass UserAction  extendsBaseAction<User>{  
     6    
     7 /** 
     8  * 跳转到添加用户页面 
     9  * @return 
    10  */  
    11 publicString addUI(){  
    12 returnaddUI;  
    13 }  
    14 /** 
    15  * 校验用户名是否存在 
    16  * @return 
    17  */  
    18 publicString checkUserName(){  
    19    
    20 if("学敏".equals(this.getModel().getUsername())){//如果输入的用户名为"学敏"  
    21 ActionContext.getContext().getValueStack().push("该用户名已经存在");//把数据压入栈顶  
    22 }else{//如果输入的用户名就不是“学敏”  
    23 ActionContext.getContext().getValueStack().push("该用户名可以使用");//把数据压入栈顶  
    24 }  
    25    
    26 returnSUCCESS;  
    27 }  
    View Code

    ----AjaxResult.java:自定义结果集(注:通过此结果集把服务器端(action)的数据回调到客户端)

     1 importjavax.servlet.http.HttpServletResponse;  
     2    
     3 importorg.apache.struts2.ServletActionContext;  
     4    
     5 importcom.opensymphony.xwork2.ActionContext;  
     6 importcom.opensymphony.xwork2.ActionInvocation;  
     7 importcom.opensymphony.xwork2.Result;  
     8    
     9 public classAjaxResult implements Result{  
    10 publicvoid execute(ActionInvocation invocation) throws Exception {  
    11 HttpServletResponseresponse = ServletActionContext.getResponse();  
    12 response.setCharacterEncoding("utf-8");//处理中文乱码问题  
    13 String message =ActionContext.getContext().getValueStack().peek().toString();//得到栈顶元素  
    14 response.getWriter().print(message);//将得到的栈顶元素返回到客户端  
    15 }  
    16 }
    View Code

    ----struts.xml:Struts配置文件

     1 <?xmlversionxmlversion="1.0" encoding="UTF-8"?>  
     2 <!DOCTYPE strutsPUBLIC  
     3 "-//ApacheSoftware Foundation//DTD Struts Configuration 2.1.7//EN"  
     4 "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
     5 <struts>  
     6    <!-- 配置文件改了以后不用重新启动 -->  
     7    <constant name="struts.devMode"value="true"/>  
     8    <constantnameconstantname="struts.ui.theme" value="simple"/>  
     9     
    10    <includefileincludefile="struts/struts-user.xml"></include>  
    11    
    12 <!-- 配置自定义结果集-->  
    13 <packagenamepackagename="ajax-default" extends="struts-default">  
    14 <result-types>  
    15 <result-typenameresult-typename="ajax"class="cn.itcast.oa0909.result.AjaxResult"></result-type>  
    16 </result-types>  
    17 </package>  
    18 </struts>  
    View Code

    ----struts-user.xml

     1 <?xmlversionxmlversion="1.0" encoding="UTF-8"?>  
     2 <!DOCTYPE strutsPUBLIC  
     3 "-//ApacheSoftware Foundation//DTD Struts Configuration 2.1.7//EN"  
     4 "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
     5 <struts>  
     6    
     7  <!--继承Struts-default结果集 -->  
     8  <package name="user"namespace="/" extends="struts-default">  
     9          <actionnameactionname="userAction_*" method="{1}"class="cn.itcast.oa0909.struts2.action.UserAction">                  
    10                  <resultnameresultname="addUI">WEB-INF/jsp/user/add.jsp</result>  
    11          </action>  
    12   </package>  
    13    
    14  <!-- 继承自定义结果集——ajax-default(在struts.xml文件中已配置) -->  
    15  <package name="userjson"namespace="/" extends="ajax-default">  
    16          <actionnameactionname="userJSONAction_*" method="{1}"class="cn.itcast.oa0909.struts2.action.UserAction">  
    17                  <resulttyperesulttype="ajax"></result>  
    18          </action>  
    19   </package>  
    20    
    21 </struts>
    View Code

    ---add.jsp:添加用户页面

     1 <%@ pagelanguage="java" import="java.util.*"pageEncoding="UTF-8"%>  
     2 <scriptlanguagescriptlanguage="javascript"src="${pageContext.request.contextPath}/js/jquery-1.4.2.js"></script>  
     3 <scriptlanguagescriptlanguage="javascript"src="${pageContext.request.contextPath}/js/user_add.js"></script>  
     4 <html>  
     5 <head>  
     6 <title>用户信息</title>  
     7     <metahttp-equivmetahttp-equiv="Content-Type" content="text/html;charset=utf-8" />  
     8 </head>  
     9 <body>  
    10 <form action="userAction_add.action">  
    11 <table>  
    12    <tr><tdwidthtdwidth="100">所属部门</td>  
    13        <td><selectnameselectname="departmentId" class="SelectStyle">  
    14             <optionvalueoptionvalue="0" selected="selected">请选择部门</option>  
    15             <optionvalueoptionvalue="7">总经理室</option>  
    16             <optionvalueoptionvalue="1">市场部</option>  
    17             <optionvalueoptionvalue="2">咨询部</option>  
    18             <optionvalueoptionvalue="3">招生部</option>  
    19             <optionvalueoptionvalue="4">教学部</option>  
    20             <optionvalueoptionvalue="5">后勤部</option>  
    21            </select>  
    22        </td>  
    23    </tr>  
    24 <tr>  
    25   <td>用户名:</td>  
    26    <td><input type="text"name="username"/><labelidlabelid="message"></label></td>  
    27 </tr>  
    28 <tr>  
    29  <td>密码:</td>  
    30   <td><input type="password"name="password"/></td>  
    31 </tr>  
    32 <tr>  
    33  <td colspan="2"><input type="submit"value="注册"/></td>   
    34 </tr>  
    35    
    36 </table>  
    37 </form>  
    38 </body>  
    39    
    40 </html>
    View Code

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

    页面效果:


     

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

    -----user_add.js:添加用户页面所需js

     1 var user = {  
     2     //初始化事件  
     3     inintEvent: function(){  
     4        $("input[name='username']").unbind("blur");  
     5        $("input[name='username']").bind("blur",function(){//name值为"username"的文本框失去焦点触发的函数  
     6                   user.checkUser($(this).val());//调用检查用户函数(校验用户名是否存在)  
     7         });  
     8     },  
     9     /** 
    10      * 校验用户名是否存在 
    11      */  
    12 checkUser:function(username){  
    13            var a ="a";  
    14 var parameter = {//参数:用户名  
    15 username:username  
    16 };  
    17    
    18 /** 
    19  *userJSONAction_checkUserName.action:请求地址 
    20  * parameter:参数 
    21  *function(data){}:回调函数 
    22  */  
    23 $.post("userJSONAction_checkUserName.action",parameter,function(data){  
    24    $("#message").text(data);//将服务器返回的值赋给id="message"的label提示框,并显示  
    25 if(data=="该用户名可以使用"){  
    26 $("#message").css("color","blue");//设置提示文字的颜色  
    27 }else{  
    28 $("#message").css("color","red");//设置提示文字的颜色  
    29 }  
    30 });          
    31    
    32 }  
    33 };  
    34 //页面加载时运行  
    35 $().ready(function(){  
    36 user.inintEvent();//页面加载时,调用初始化事件  
    View Code

    二,运行

     

    输入地址: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如何做到复用,能不能做到复用,这是个问题。

  • 相关阅读:
    关于document.body.scrollTop用法
    set回顾
    用户登录与注册
    编写通讯录2
    利用字典的特性编写一个通讯录
    shelve模块
    shutil模块
    列表的拓展
    随机生成验证码2
    递归与欧几里得算法结合求最大公约数
  • 原文地址:https://www.cnblogs.com/sunfie/p/4752284.html
Copyright © 2011-2022 走看看