Struts学习之自定义结果集
转自:http://blog.csdn.net/hanxuemin12345/article/details/38763057
项目中我们经常遇到这样的需求——页面部分刷新,例如:添加用户,转到添加用户页面时,页面自动加载了所有部门。
完整流程:选择所属部门,填写用户名和密码,点击“注册”,填写用户名后,需要立即检查数据库是否存在此用户名,如何在不刷新页面的情况下实现此效果?
但看上面提出的问题并不难,情况很常见,都知道使用ajax实现,但是如何在struts中自定义结果集来实现ajax——这是这篇博客的重点。
(注:转发、重定向、action2action都会使页面刷新,满足不了页面无刷新的需求,因此,可以自己定义一个结果集来解决(通过此结果集把服务器端(action)的数据回调到客户端)。
一,步骤:
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;"><?xmlversionxmlversion="1.0" encoding="UTF-8"?>
<web-appversionweb-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
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;
}
----AjaxResult.java:自定义结果集(注:通过此结果集把服务器端(action)的数据回调到客户端)
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);//将得到的栈顶元素返回到客户端
}
}
----struts.xml:Struts配置文件
<?xmlversionxmlversion="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"/>
<constantnameconstantname="struts.ui.theme" value="simple"/> <includefileincludefile="struts/struts-user.xml"></include> <!-- 配置自定义结果集-->
<packagenamepackagename="ajax-default" extends="struts-default">
<result-types>
<result-typenameresult-typename="ajax"class="cn.itcast.oa0909.result.AjaxResult"></result-type>
</result-types>
</package>
</struts>
----struts-user.xml
<?xmlversionxmlversion="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">
<actionnameactionname="userAction_*" method="{1}"class="cn.itcast.oa0909.struts2.action.UserAction">
<resultnameresultname="addUI">WEB-INF/jsp/user/add.jsp</result>
</action>
</package> <!-- 继承自定义结果集——ajax-default(在struts.xml文件中已配置) -->
<package name="userjson"namespace="/" extends="ajax-default">
<actionnameactionname="userJSONAction_*" method="{1}"class="cn.itcast.oa0909.struts2.action.UserAction">
<resulttyperesulttype="ajax"></result>
</action>
</package> </struts>
---add.jsp:添加用户页面
<%@ pagelanguage="java" import="java.util.*"pageEncoding="UTF-8"%>
<scriptlanguagescriptlanguage="javascript"src="${pageContext.request.contextPath}/js/jquery-1.4.2.js"></script>
<scriptlanguagescriptlanguage="javascript"src="${pageContext.request.contextPath}/js/user_add.js"></script>
<html>
<head>
<title>用户信息</title>
<metahttp-equivmetahttp-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>
<body>
<form action="userAction_add.action">
<table>
<tr><tdwidthtdwidth="100">所属部门</td>
<td><selectnameselectname="departmentId" class="SelectStyle">
<optionvalueoptionvalue="0" selected="selected">请选择部门</option>
<optionvalueoptionvalue="7">总经理室</option>
<optionvalueoptionvalue="1">市场部</option>
<optionvalueoptionvalue="2">咨询部</option>
<optionvalueoptionvalue="3">招生部</option>
<optionvalueoptionvalue="4">教学部</option>
<optionvalueoptionvalue="5">后勤部</option>
</select>
</td>
</tr>
<tr>
<td>用户名:</td>
<td><input type="text"name="username"/><labelidlabelid="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>
(注:假设这里的所属部门中的数据是页面加载时从数据库中读取的,而不是如上所示写死的)
页面效果:
所属部门下拉框展开,如下所示:
-----user_add.js:添加用户页面所需js
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();//页面加载时,调用初始化事件
二,运行
输入地址: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()依次返回,也就是会说此AjaxResult与UserAction要一一对应,必须写死在程序里,不灵活,不能做到客户端需要什么数据就传什么数据;
另外还有一个问题,如果其他业务,比如“部门管理”模块的一个功能也需要从服务器端返回数据到客户端,那是不是还要再写一个自定义结果集,AjaxResult如何做到复用,能不能做到复用,这是个问题。
Struts学习之自定义结果集的更多相关文章
- Struts学习之自定义拦截器
* 所有的拦截器都需要实现Interceptor接口或者继承Interceptor接口的扩展实现类 * 要重写init().intercept().destroy()方法 * in ...
- 大量Javascript/JQuery学习教程电子书合集
[推荐分享]大量Javascript/JQuery学习教程电子书合集,送给有需要的人 不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小 15天学会jQuery(完整版).pd ...
- WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)
WebAPI调用笔记 前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
- 大数据学习路线:Zookeeper集群管理与选举
大数据技术的学习,逐渐成为很多程序员的必修课,因为趋势也是因为自己的职业生涯.在各个技术社区分享交流成为很多人学习的方式,今天很荣幸给我们分享一些大数据基础知识,大家可以一起学习! 1.集群机器监控 ...
- UnityEditor研究学习之自定义Editor
UnityEditor研究学习之自定义Editor 今天我们来研究下Unity3d中自定义Editor,这个会让物体的脚本在Inspector视窗中,产生不同的视觉效果. 什么意思,举个例子,比如游戏 ...
- struts学习笔记(四)
一. 文件的上传: 1). 表单需要注意的 3 点 2). Struts2 的文件上传实际上使用的是 Commons FileUpload 组件, 所以需要导入 commons-fileupload- ...
- iOS学习笔记-自定义过渡动画
代码地址如下:http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swif ...
- 日常学习随笔-自定义了一个MyArrayListDefin集合(数组扩容+迭代器+JDK1.8新方法+详细说明)
一.自定义了一个ArrayList的模拟集合(源码+详细说明) 前段时间分析了下ArrayList集合的源码,总觉得如果不自己定义一个的话,好像缺了点什么,所以有了如下的代码. 代码可以说是逐行注释了 ...
随机推荐
- NYOJ 7-街区最短路径问题(曼哈顿距离)
街区最短路径问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 一个街区有很多住户,街区的街道只能为东西.南北两种方向. 住户只可以沿着街道行走. 各个街道之间的间 ...
- Flash,EEPROM差别
flash是用来存储代码的,在执行过程中不能改:EEPROM是用来保存用户数据,执行过程中能够改变,比方一个时钟的闹铃时间初始化设定为12:00,后来在执行中改为6:00,这是保存在EEPROM里,不 ...
- 推荐两个不错的CAD二次开发(.Net)手册
推荐两个不错的CAD二次开发(.Net)手册 http://www.mjtd.com/helpcenter/netguide/index.html http://www.ceesky.com/book ...
- SQL2008缩小日志脚本
以下为SQL2008 缩小日志文件的脚本,在SQL Server Management Studio中打开数据库,将脚本里的数据库名称替换成需要缩小日志的库名称,然后 运行以下脚本. USE WSS_ ...
- 一年三篇IF大于7的牛人告诉你怎么写SCI
一年三篇IF大于7的牛人告诉你怎么写SCI 1 研究生必备四本 俗话说好记性不如烂笔头,所以一定要首先养成做笔记的好习惯!作为研究生下面这几个本子是必不可少的: 1.实验记录本(包括试验准备本),这当 ...
- apache-tomcat-7 设置最大上传.war文件大小[zhuan]
在利用tomcat自带的主机管理页面进行WAR包部署的时候,提示文件太大,无法上传. 解决方案: 找到 /usr/local/apache-tomcat7/webapps/manager/WEB- ...
- Java随机数生成原理--转稿
1.Math库里的static(静态)方法random() 该方法的作用是产生0到1之间(包括0,但不包括1)的一个double值. double rand = Math.random(); 2.通过 ...
- JAVA编译中拒绝访问的问题及解决方案
在java编译时出现,可以将C盘内的文件转移到其他盘,此问题可能是权限不足不能够读取C盘文件造成的. 文件名与类名要一致,包括大小写,也是要一致!
- NetWare
本地网络连接属性中就有Netware客户端服务项 概括的说,Netware是NOVELL公司推出的网络操作系统,Netware最重要的特征是基于基本模块设计思想的开放式系统结构. Netware是一个 ...
- bootstrap你让前端小狮子们又喜又恨
看了一个用bootstrap框架建的页面,简直方便至极!各种添加类就可以实现各种功能,各种添加data-toggle让你不需要懂javascript就可以做出很炫的效果! 最重要的它做出来的页面还是响 ...