根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种。服务器端验证目前有两种方式:
第一种
Struts2中提供了一个com.opensymphony.xwork2.Validateable接口,此接口只有一个方法:validate()。如果有某个类实现了Validatable接口,Struts2就可以直接调用该类中的validate()方法。ActonSupport类实现Validateable接口。本文讨论此验证格式。
本文演示了一个模拟简单登录的场景:用户打开一个JSP页面,输入信息,提交登录。如果用户提交的信息格式有错误,则返回登录页面提示用户。数据格式正确则验证用户名与密码是否正确,登录成功则转向列表页面,显示当前用户的一些信息;如果登录错误则转向错误页面。
- 将表单参数封装进一个JavaBean(属性驱动);
- 如果用户输入信息有错误,直接返回提示用户再次输入;
- 如果用户名,密码错误,转向错误页面;
- 如果用户名、密码正确,则转向到另一个action类(并且传进一个id参数,用途自定),由此类处理进一步的业务逻辑,然后转向到显示列表的JSP页面。
第二种
参考:struts2:数据校验,通过XWork校验框架实现(validation.xml)
1. 修改Web.xml
略
2. 创建struts.xml
略
3. 在struts.xml中注册action和result
<action name="login" class="com.clzhang.ssh.member.action.LoginAction">
<result name="input">/ssh/demo2/login.jsp</result>
<result name="error">/ssh/demo2/wrong.jsp</result>
<result name="list" type="redirectAction">
<param name="idInList">${id}</param>
<param name="actionName">listBook</param>
</result>
</action>
<action name="listBook" class="com.clzhang.ssh.member.action.ListAction">
<result name="showList">/ssh/demo2/bookList.jsp</result>
</action>
- 第一个action的name为login,对应处理类为LoginAction;
- result为input的JSP页面指明,如果验证用户输入失败,则转向到此页面(如用户名为空等);
- result为error的JSP页面指明,如果登录失败(密码错误等等),则转向到此页面;
- result为list的配置指明,登录成功后,做一个redirect操作,由另一个action业务类去处理相关业务逻辑,并且在其中配置了参数传递(id字段);
- 第二个action的name为listBook,对应处理类为ListAction。
4. 创建登录JSP页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<s:form action="login" method="post">
<s:textfield name="loginInfoRef.username" label="账号"></s:textfield>
<br />
<s:textfield name="loginInfoRef.password" label="密码"></s:textfield>
<br />
<s:submit value="提交"></s:submit>
</s:form>
<br />
</body>
</html>
其中用到了struts标签,在以后章节中予以解读。
注意:因为将表单封装进了JavaBean所以,表单中元素的名称有所改变,如:loginInfoRef.username,此名称必须与相关action类中的变量名称一致。
5. 创建登录表单对应的实体类
package com.clzhang.ssh.member.action; public class LoginInfo { private String username; private String password; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} }
6. 创建登录业务处理action类
package com.clzhang.ssh.member.action; import com.opensymphony.xwork2.ActionSupport; /**
* 模拟登录
* 1.如果输入为空,提示错误,返回到登录页面;
* 2.登录错误,转向错误页面;
* 3.登录成功,转向列表页面。
*/
public class LoginAction extends ActionSupport {
public static final long serialVersionUID = 1; // a.这个参数是转到列表页面需要的
private int id;
// b.将JSP提交的表单封装为一个JavaBean
private LoginInfo loginInfoRef; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public LoginInfo getLoginInfoRef() {
return loginInfoRef;
} public void setLoginInfoRef(LoginInfo loginInfoRef) {
this.loginInfoRef = loginInfoRef;
} @Override
// 重载ActionSupport类的方法(Validateable接口)
public void validate() {
super.validate(); // 验证方式一:
if ("".equals(loginInfoRef.getUsername())) {
this.addFieldError("loginInfoRef.username", "对不起,用户名不可以为空!");
}
if ("".equals(loginInfoRef.getPassword())) {
this.addFieldError("loginInfoRef.password", "对不起,密码不可以为空!");
} // 如果执行了addFieldError()/addActionError()等方法,则会转到input对应的页面
} @Override
// 重载ActionSuppoer类的方法(Action接口)
public String execute() {
if (loginInfoRef.getUsername().equals("test")
&& loginInfoRef.getPassword().equals("123")) {
System.out.println(loginInfoRef.getUsername() + "成功登录...");
this.setId(100); return "list";
} else {
System.out.println(loginInfoRef.getUsername() + "成功失败!"); // 这些属于属于Action接口
return ERROR;
}
}
}
- 如果用户名、密码为空,则在validate()方法调用时出错,然后转向到reuslt配置为input的JSP页面;
- 用户名、密码不为空,执行execute()方法,验证通过转向result配置为list的action; 验证不通过则转向到result配置为error的JSP页面。
- 如果Action中存在多个逻辑处理方法,每个逻辑处理方法都需要自己的校验规则时,请参考阅读:struts2:数据校验,通过Action中的validate()方法实现校验(续:多业务方法时的不同验证处理)
7. 创建显示登录错误JSP页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
wrong! :(
</body>
</html>
8. 创建生成列表的action类
package com.clzhang.ssh.member.action; import java.util.ArrayList;
import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; /**
* 登录成功后显示的列表处理
* @author acer
*
*/
public class ListAction extends ActionSupport {
public static final long serialVersionUID = 1; private ArrayList<String> bookList = new ArrayList<String>(); private int idInList; public ArrayList<String> getBookList() {
return bookList;
} public void setBookList(ArrayList<String> bookList) {
this.bookList = bookList;
} public int getIdInList() {
return idInList;
} public void setIdInList(int idInList) {
this.idInList = idInList;
} public String execute() { bookList.add("book1");
bookList.add("book2");
bookList.add("book3");
bookList.add("book4");
bookList.add("idInList=" + idInList); ServletActionContext.getRequest().setAttribute("usernameRequest",
"你现在怎样");
ServletActionContext.getRequest().getSession().setAttribute(
"usernameSession", "我现在不怎样");
ServletActionContext.getServletContext().setAttribute(
"usernameApplication", "你怎样"); return "showList";
} }
- 其中,idInList参数是由struts.xml为配置的;
- 处理完成后,转向result配置为idInList的JSP页面,那就是bookList.jsp。
9. 创建显示列表的JSP页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page isELIgnored="false"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
<c:forEach var="bookName" items="${bookList}">
<c:out value="${bookName}"></c:out>
<br />
</c:forEach> <br />
request:
<s:property value="#request.usernameRequest" />
<br />
<br />
session:
<s:property value="#session.usernameSession" />
<br />
<br />
application:
<s:property value="#application.usernameApplication" />
<br />
<br />
</body>
</html>
同样,此JSP用到了struts的标签,以后章节予以介绍。
10. 测试
10.1 打开IE
输入地址:http://127.0.0.1:8080/st/ssh/demo2/login.action,显示如下界面:
10.2 直接提交,显示错误:
10.3 输入用户名:test,密码:456,提交:
10.4 返回登录页面,输入用户名:test,密码:123,提交:
图解
struts2:数据校验,通过Action中的validate()方法实现校验,图解的更多相关文章
-
struts2:数据校验,通过Action中的validate()方法实现校验(续:多业务方法时的不同验证处理)
前文:struts2:数据校验,通过Action中的validate()方法实现校验,图解 如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑可能需要不同的校验规则,在这种情况下,就需要通 ...
-
第5章—构建Spring Web应用程序—关于spring中的validate注解后台校验的解析
关于spring中的validate注解后台校验的解析 在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判 ...
-
struts2的占位符*在action中的配置方法
转自:https://blog.csdn.net/u012546338/article/details/68946633 在配置<action> 时,可以在 name,class,meth ...
-
struts2学习笔记之八:Action中方法的动态调用
方法一:action名称+!+方法名称+后缀 Action类中增加addUser()和delUser()方法, package com.djoker.struts2; import org.apach ...
-
理解Struts2的Action中的setter方法是怎么工作的
接触过webwork和Struts2的同行都应该知道, 提交表单的时候,只要Action中的属性有setter 方法,这些表单数据就可以正确赋值到Action中属性里:另外对于Spring配置文件中声 ...
-
Struts2(四):在Action中如何访问Web资源
1.什么WEB资源? HttpServletRequest,HttpServletRespone,HttpApplication,ServletContext,HttpSession等原生Servle ...
-
Struts2中使用execAndWait后,在 Action中调用getXXX()方法报告java.lang.NullPointerException异常的原因和解决方法
使用 Struts2 编写页面,遇到一个要长时间运行的接口,因此增加了一个execAndWait ,结果在 Action 中调用 getContext()的时候报告异常 ActionContext c ...
-
struts2数据校验与国际化
数据校验: Action里的validate()方法能校验action类所有的方法,如果有错,如:addFieldError,会自动返回到workflow校验拦截器不向下继续进行,不用return i ...
-
struts2对action中的方法进行输入校验(2)
struts2输入校验流程: 1.类型转换器对请求參数运行类型转换,并把转换后的值赋给aciton中的属性 2.假设在运行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext, ...
随机推荐
-
android内存分析:heap Snapshot的使用
网上有很多讲解关于android studio中memory工具的使用,接下来我来说一段在项目中发生的实例:大家可以根据我的这个方法来分析自己项目中的问题 首先我们要通过手动先触发GC操作,点击mem ...
-
JavaScript的运动框架学习总结
一.目录 1. 入门案例——实现匀速运动 2. 入门案例——实现缓冲运动 3. 实现任意值的运动框架v.1 4. 改进任意值的运动框架v.2 5. 改进任意值的运动框架v.3 6. 实现链式运动框架 ...
-
bootstrap学习总结-css样式设计(二)
首先,很感谢各位园友对我的支持,关于bootstrap的学习总结,我会持续更新,如果有写的不对的地方,麻烦各位给我指正出来哈.关于上篇文章,固定布局和流式布局很关键,如果还不太清楚的可以再看看我写的h ...
-
矩阵奇异值分解(SVD)及其应用
机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用(好文) [简化数据]奇异值分解(SVD) <数学之美> 第15章 矩阵运算和文本处理中的两个分类问题
-
RaidoGroup+RadioButton模拟android下拉框弹出List
引用 <上面的Hello world!是居左的,但是下面的文字却怎么都不能靠边.试了各种方法都不行.最后,无意中给RadioButton添加一个backgroud属性即可:<RadioBu ...
-
第十三篇、Swift_Nav自定义返回按钮后或者隐藏导航栏,Pop返回手势失效的解决方法 Pop全局返回添加的方法
边缘的pop返回手势: override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = UIColor.purple ...
-
hdu3038(并查集)
题目链接 题意:有n次询问,给出a到b区间的总和,问这n次给出的总和中有几次是和前面已近给出的是矛盾的 分析:sum数组维护着到根节点的距离(即区间和),每次合并x,y,s(a,b分别为x,y的根节点 ...
-
部署:持续集成(CI)与持续交付(CD)——《微服务设计》读书笔记
系列文章目录: <微服务设计>读书笔记大纲 一.CI(Continuous Integration)简介 CI规则1:尽量频繁地把代码签入到分支中以进行集成 CI规则2: ...
-
爬虫_微信小程序社区教程(crawlspider)
照着敲了一遍,,, 需要使用"LinkExtrator"和"Rule",这两个东西决定爬虫的走向. 1.allow设置规则的方法:要能够限制在我们想要的url上 ...
-
Tag文件的创建与应用
Tag文件,几乎和JSP文件一模一样,可以被JSP页面动态加载调用.Tag文件有什么优势呢(既然和JSP几乎一模一样,那就得想想这个必然有不一样的地方,不然要它存在干嘛) 在设计Web应用时,可以通过 ...