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

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

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

      项目中我们常常遇到这种需求——页面部分刷新。比如:加入用户,转到加入用户页面时,页面自己主动载入了全部部门。

完整流程:选择所属部门,填写username和password,点击“注冊”

填写username后,须要马上检查数据库是否存在此username,怎样在不刷新页面的情况下实现此效果?

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

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

servlet要么转发要么重定向。struts2能够自己定义结果集

 

   转发、重定向、action2action都会使页面刷新,满足不了页面无刷新的需求,因此,能够自定义一个结果集来解决(通过此结果集把server端(action)的数据回调到client)

 

工具:MyEclipse8.5tomcat6.0.39

一。步骤:

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

2,导入Struts相关包

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

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/javaeehttp://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;//用户idprivate 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 stubreturnthis.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;
}
/**
 * 校验username是否存在
 * @return
 */
publicString checkUserName(){
 
if("学敏".equals(this.getModel().getUsername())){//假设输入的username为"学敏"
ActionContext.getContext().getValueStack().push("该username已经存在");//把数据压入栈顶
}else{//假设输入的username就不是“学敏”
ActionContext.getContext().getValueStack().push("该username能够使用");//把数据压入栈顶
}
 
returnSUCCESS;
}
 
}</span></span>

 

—-AjaxResult.java:自己定义结果集(注:通过此结果集把server端(action)的数据回调到client)

<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);//将得到的栈顶元素返回到client}}</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>


(注:如果这里的所属部门中的数据是页面载入时从数据库中读取的,而不是如上所看到的写死的)

页面效果:

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

 

所属部门下拉框展开。例如以下所看到的:

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

—–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);//将server返回的值赋给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,显演示样例如以下页面

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

 

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

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

三,总结

自己定义结果集的缺点:

这样自己定义的结果集,写死了,不能做到client须要什么数据就传什么数据。

如,UserAction中的代码:

ActionContext.getContext().getValueStack().push(“该username已经存在“);//把数据压入栈顶

——把client须要的数据都要压入栈顶

 

AjaxResult中的代码:

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

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

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

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

另外另一个问题,假设其它业务。比方“部门管理”模块的一个功能也须要从server端返回数据到client,那是不是还要再写一个自己定义结果集,AjaxResult怎样做到复用。能不能做到复用,这是个问题。

 

基于以上问题。下篇博客介绍——json类型的结果集——JSON插件是Struts2Ajax插件,通过利用JSON插件,同意开发人员以很灵活的方式开发AJAX应用。



版权声明:本文博主原创文章。博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117113.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Supesite 参数说明

    Supesite 参数说明supesite有人看到的是强大的功能,我看到的是坑爷的一些用法,第一次看到block,我晕了。对于参数一头雾水,下面收集了一些,备用吧。supesite标签调用参数详解参数:blocktype模块

  • [总结]视音频编解码技术零基础学习方法

    [总结]视音频编解码技术零基础学习方法一直想把视音频编解码技术做一个简单的总结,可是苦于时间不充裕,一直没能完成。今天有着很大的空闲,终于可以总结一个有关视音频技术的入门教程,可以方便更多的人学习从零开始学习视音频技术。需要注意的是,本文所说的视音频技术,指的是理论层面的视音频技术,并不涉及到编程相关的东西。

  • 【全套完结】数字信号处理—-全套Matlab实验报告【建议保存】「建议收藏」

    目录实验一、熟悉MATLAB环境和基本信号的产生与运算实验一、熟悉MATLAB环境和基本信号的产生与运算实验一、熟悉MATLAB环境和基本信号的产生与运算

  • HTTP Header里的Range和Content-Range参数[通俗易懂]

    HTTP Header里的Range和Content-Range参数[通俗易懂]HTTPHeader里的Range和Content-Range参数转自:http://hongjiang.info/http-header-range-and-content-range/这个话题是从实现一个http资源的静态访问引发的。http协议从1.1开始支持获取文件的部分内容,这为并行下载以及断点续传提供了技术支持。它通过在Header里两个参数实现的,客户端发请求时对应的是Ra…

  • Fiddler抓取视频数据「建议收藏」

    准备工作:(1)、手机(安卓、ios都可以)/安卓模拟器,今天主要以安卓模拟器为主,操作过程一致。(2)、抓包工具:Fiddel下载地址:(https://www.telerik.com/download/fiddler)(3)、编程工具:pycharm(4)、安卓模拟器上安装抖音(逍遥安装模拟器)一、fiddler配置在tools中的options中,按照图中勾选后点击Actio…

  • fedora详细安装教程_oracle查看数据库磁盘

    fedora详细安装教程_oracle查看数据库磁盘via:http://www.helpsworld.org/blog/?p=391Fedora12发布有几天了,增加的的新功能还有一系列的改进非常的有吸引力。由于最近没有充分的时间折腾,所以还没有进行安装。不过今天还是在虚拟机上安装了这个新系统。其实也是为了先熟悉一下,为过几天真正安装做些准备。1.安装条件:1.1 VirtualBox虚拟机,8G虚拟磁盘已安装Fed

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号