使用Struts2实现数据校验
使用Struts2实现数据校验
为什么需要数据校验呢?答案很简单,假如当你登录想要京东,这时就需要数据校验了如果不输入用户名的话,那么就不会登陆成功,并且会提示出"请输入用户名"的字样
那么,在Struts2中实现数据校验的方法有哪些呢?接下来我们探讨一下。
实现数据校验有四种方法:
1.用execute()方法实现数据校验
编写一个Action,继承ActionSupport类,重写execute()
步骤1:在Web项目的cn.happy.action下创建一个ExecuteAction(UserInfo为用户实体,其中有username和password属性,并且封装)
public class ExecuteAction extends ActionSupport {
private UserInfo info;
// 确认密码
private String okpwd;
@Override
public String execute() throws Exception {
if (info.getUsername().length() == 0) {
addFieldError("username", "用户名不能为空");
}
if (info.getPassword().length() == 0) {
addFieldError("pwd", "密码不能为空");
}
if (!info.getPassword().equals(okpwd)) {
addFieldError("pwd", "两次密码必须一致");
}
//判定FieldError对象中是否有错误信息
//若有错误信息 则返回input
if(this.hasErrors()){
return INPUT;
}
return SUCCESS;
}
步骤2:创建struts.xml文件,引用ExecuteAction类
<struts>
<!-- 修改文件 tomact不用重启 -->
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<!-- 测试execute方法 -->
<action name="execute" class="cn.happy.action.ExecuteAction">
<result name="success">success.jsp</result>
<result name="input">regist.jsp</result>
</action>
</struts>
步骤3.准备前段注册页面regist.jsp和成功页面success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>注册页面</title>
</head>
<body>
<h2>用户注册</h2>
<!-- 取出所有错误信息 -->
<s:fielderror></s:fielderror>
<s:form action="ValidateXxx" method="post">
<s:textfield name="info.username" label="用户名"></s:textfield>
<br/>
<s:textfield name="info.password" label="密码"></s:textfield>
<br/>
<s:textfield name="okpwd" label="确认密码"></s:textfield>
<br/>
<s:submit value="注册"></s:submit>
</s:form>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>成功页面</title>
</head>
<body>
欢迎您!${info.username }
</body>
</html>

我们来看一下假如用户名和密码都不输入时的效果

我们来看一下假如用户名和密码都输入时的效果

我们来看一下假如用户名和密码还有确认密码都输入时的效果,并且密码和确认密码都相同时

那么,它会进入到success.jsp页面
2.使用validate()实现数据校验
继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Action类中重写validate()方法,如果校验表单输入域出现错误,则将错误添加到ActionSupport类的fieldErrors域中,然后通过OGNL表达式负责输出
步骤1:创建ValidateAction类(UserInfo同样为UserInfo实体类)
public class ValidateAction extends ActionSupport{
private UserInfo info;
//确认密码
private String okpwd;
@Override
public String execute() throws Exception{
return SUCCESS;
}
//实现数据校验
@Override
public void validate() {
if(info.getUsername().length()==0){
addFieldError("username", "用户名不能为空");
}
if(info.getPassword().length()==0){
addFieldError("pwd", "密码不能为空");
}
if(!info.getPassword().equals(okpwd)){
addFieldError("pwd", "两次密码必须一致");
}
}
public UserInfo getInfo() {
return info;
}
public void setInfo(UserInfo info) {
this.info = info;
}
public String getOkpwd() {
return okpwd;
}
public void setOkpwd(String okpwd) {
this.okpwd = okpwd;
}
}
步骤2:在struts.xml文件中再配置一个action
<!-- 测试validate方法 -->
<action name="Validate" class="cn.happy.action.ValidateAction">
<result name="success">success.jsp</result>
<result name="input">regist.jsp</result>
</action>
步骤三和上面第一种方法一样,同样是两个jsp页面,只是把<s:form action="execute" method="post">的execute改为validate就可以了。
我们来看一下假如用户名和密码都不输入时的效果

我们来看一下假如用户名和密码都输入时的效果

我们来看一下假如用户名和密码还有确认密码都输入时的效果,并且密码和确认密码都相同时

那么,它会进入到success.jsp页面
3.使用ValidateXxx方法实现数据校验
在validate()方法中对数据验证是可以工作的,如果在字段非常多的情况下,而且每个字段又有很复杂的验证,那么我们的validate方法中的代码会越来越多。 针对特定的方法输入的数据的验证我们把他放到validateXxx方法中,Xxx是方法名的首字母大写形式
步骤1:在Web项目的cn.happy.action下创建一个ValidateXxxAction(UserInfo为用户实体,其中有username和password属性,并且封装)
标注黄颜色背景处的代码需要注意一下
public class ValidateXxxAction extends ActionSupport{
private UserInfo info;
//确认密码
private String okpwd;
public void validateRegist(){
if(info.getUsername().length()<6){
addFieldError("username", "用户名长度不能小于6位");
}
}
public String regist(){
return SUCCESS;
}
@Override
public String execute() throws Exception{
return SUCCESS;
}
//实现数据校验
@Override
public void validate() {
if(info.getUsername().length()==0){
addFieldError("username", "用户名不能为空");
}
if(info.getPassword().length()==0){
addFieldError("pwd", "密码不能为空");
}
if(!info.getPassword().equals(okpwd)){
addFieldError("pwd", "两次密码必须一致");
}
}
public UserInfo getInfo() {
return info;
}
public void setInfo(UserInfo info) {
this.info = info;
}
public String getOkpwd() {
return okpwd;
}
public void setOkpwd(String okpwd) {
this.okpwd = okpwd;
}
}
步骤2:创建struts.xml文件,引用ValidateXxxAction类(这里加多了一个method属性,用来指定实现的方法)
<struts>
<!-- 修改文件 tomact不用重启 -->
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<!-- 测试ValidateXxx方法 -->
<action name="ValidateXxx" class="cn.happy.action.ValidateXxxAction" method="regist">
<result name="success">success.jsp</result>
<result name="input">regist.jsp</result>
</action>
</struts>
步骤3.准备前段注册页面regist.jsp和成功页面success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>注册页面</title>
</head>
<body>
<h2>用户注册</h2>
<!-- 取出所有错误信息 -->
<s:fielderror></s:fielderror>
<s:form action="ValidateXxx" method="post">
<s:textfield name="info.username" label="用户名"></s:textfield>
<br/>
<s:textfield name="info.password" label="密码"></s:textfield>
<br/>
<s:textfield name="okpwd" label="确认密码"></s:textfield>
<br/>
<s:submit value="注册"></s:submit>
</s:form>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>成功页面</title>
</head>
<body>
欢迎您!${info.username }
</body>
</html>
我们来看一下假如用户名和密码都不输入时的效果

我们来看一下假如用户名输入小于6位的效果

我们来看一下假如用户名和密码都输入时的效果

我们来看一下假如用户名和密码还有确认密码都输入时的效果,并且密码和确认密码都相同时

那么,它会进入到success.jsp页面
4、用struts2的验证框架实现数据校验(这里将不再Action中进行数据校验,而是在cn.happy.action下创建一个ActionName-validation.xml的文件,在这个文件中进行数据校验)
① 为什么要用验证框架:
当验证规则比较复杂时,Action类的代码将变得很繁琐,假如我们要对电话号码的格式进行验证,是非常麻烦的
②验证框架的优点:
Struts2中内置了一个验证框架,将常用的验证规则进行了编码实现,使用验证框架时,用户无需再进行编码,只要在外部配置文件中指定某个字段需要进行的验证类型,并提供出错误信息即可,从而大大减轻了开发者的负担,提高开发效率
③命名规范:
1、文件的命名规则:
ActionName-validation.xml,ActionName为需要校验的Action类名,如:UserAction-validation.xml
2、文件存放路径:
该文件与Action类的class文件位于同一个路径下
3、文件格式:包括如下3个配置元素
<field>: 为每一个需要校验的字段添加一个验证元素<field>,name属性表示要校验的字段名。
<field-validator>: 使用该元素来指定校验规则,type属性为校验规则名
<message>: 使用该元素来指定校验出错时要显示的标签,key属性指向资源文件中的标签名
步骤1:在Web项目的cn.happy.action下创建一个ValidateXxxAction(UserInfo为用户实体,其中有username和password属性,并且封装)
public class UserAction extends ActionSupport{
private UserInfo info;
private String okpwd;
@Override
public String execute() throws Exception {
return SUCCESS;
}
public UserInfo getInfo() {
return info;
}
public void setInfo(UserInfo info) {
this.info = info;
}
public String getOkpwd() {
return okpwd;
}
public void setOkpwd(String okpwd) {
this.okpwd = okpwd;
}
}
步骤2.在cn.happy.action下创建UserAction-validation.xml进行数据校验
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<!-- 用户名:不能为空 长度在6-10之间 -->
<field name="info.username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message>用户名不能为空</message>
</field-validator>
<field-validator type="stringlength">
<param name="maxLength">10</param>
<param name="minLength">6</param>
<message>用户名长度必须在${minLength}和${maxLength}之间</message>
</field-validator>
</field>
<!-- 验证密码-->
<field name="info.password">
<field-validator type="requiredstring">
<message>密码不能为空</message>
</field-validator>
</field>
<!-- 确认密码 -->
<field name="okpwd">
<field-validator type="fieldexpression">
<param name="expression">info.password==okpwd</param>
<message>密码和确认密码必须一致</message>
</field-validator>
</field>
<!-- 验证电话号码 -->
<field name="info.phone">
<field-validator type="requiredstring">
<message>电话号码不能为空</message>
</field-validator>
</field>
<field name="info.phone">
<field-validator type="regex">
<param name="regex">^(\d{3,4}-){0,1}(\d{7,8})$</param>
<message>电话号码格式不正确</message>
</field-validator>
</field>
</validators>
步骤3.创建struts.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 修改文件 tomact不用重启 -->
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="regist" class="cn.happy.action.UserAction">
<result name="success">success.jsp</result>
<result name="input">regist.jsp</result>
</action>
</package>
</struts>
步骤4.准备前段注册页面regist.jsp和成功页面success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>注册页面</title>
</head>
<body>
<h2>用户注册</h2>
<s:form action="regist" method="post">
<s:textfield name="info.username" label="用户名"></s:textfield>
<br/>
<s:textfield name="info.phone" label="电话号码"></s:textfield>
<br/>
<s:textfield name="info.password" label="密码"></s:textfield>
<br/>
<s:textfield name="okpwd" label="确认密码"></s:textfield>
<br/>
<s:submit value="注册"></s:submit>
</s:form>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>成功页面</title>
</head>
<body>
欢迎您!${info.username }
</body>
</html>
我们来看一下假如用户名和密码都不输入时的效果

我们来看一下假如用户名输入小于6位的效果

我们来看一下假如用户名和密码都输入时的效果

我们来看一下假如用户名和密码还有确认密码都输入时的效果,并且密码和确认密码都相同时

那么,它会进入到success.jsp页面
Struts2的几种数据校验方式就演示到这里了,希望对前来阅读的读者有帮助!
使用Struts2实现数据校验的更多相关文章
- (转)struts2:数据校验,通过XWork校验框架实现(validation.xml)
转载自:http://www.cnblogs.com/nayitian/p/3475661.html struts2:数据校验,通过XWork校验框架实现(validation.xml) 根据输入 ...
- struts2:数据校验,通过XWork校验框架实现(validation.xml)
根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种.服务器端验证目前有两种方式: 第一种: 参考:struts2:数据校验,通过Action中的validate()方法实现校 ...
- struts2:数据校验,通过Action中的validate()方法实现校验,图解
根据输入校验的处理场所的不同,可以将输入校验分为客户端校验和服务器端校验两种.服务器端验证目前有两种方式: 第一种 Struts2中提供了一个com.opensymphony.xwork2.Valid ...
- struts2:数据校验,通过Action中的validate()方法实现校验(续:多业务方法时的不同验证处理)
前文:struts2:数据校验,通过Action中的validate()方法实现校验,图解 如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑可能需要不同的校验规则,在这种情况下,就需要通 ...
- Struts2(五)数据校验
一.概述 在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验. 下面通过两种方式来阐述Stru ...
- struts2之数据校验
概述 在提交表单数据时,如果数据需要保存到数据库,空输入等可能会引发一些异常,为了避免引起用户的输入引起底层异常,通常在进行业务逻辑操作之前,先执行基本的数据校验. 下面通过四种方式来阐述Struts ...
- Struts2学习笔记(九)——数据校验
Struts2的数据校验属于服务器端校验,Struts2 支持校验方式 : 手动校验(代码校验) :在服务器端通过编写java代码,完成数据校验 自动校验(配置校验) :XML配置校验(主流) 和 注 ...
- Struts2中validate数据校验的两种常用方法
本文主要介绍Struts2中validate数据校验的两种方法及Struts2常用校验器. 1.Action中的validate()方法 Struts2提供了一个Validateable接口,这个接 ...
- Struts2学习第三天——保存登陆信息及数据校验
在JSP中服务器端保存数据的作用域通常有request.session.application,它们对应的Servlet API分别是HttpServletRquerst.HttpSession.Se ...
随机推荐
- Lind.DDD.Events领域事件介绍
回到目录 闲话多说 领域事件大叔感觉是最不好讲的一篇文章,所以拖欠了很久,但最终还是在2015年年前(阴历)把这个知识点讲一下,事件这个东西早在C#1.0时代就有了,那时学起来也是一个费劲,什么是委托 ...
- 理解CSV文件以及ABAP中的相关操作
在很多ABAP开发中,我们使用CSV文件,有时候,关于CSV文件本身的一些问题使人迷惑.它仅仅是一种被逗号分割的文本文档吗? 让我们先来看看接下来可能要处理的几个相关组件的词汇的语义. Separat ...
- 自己写一个 jQuery 插件
我知道这一天终将会到来,现在,它来了. 需求 开发 SharePoint 的 CSOM 应用时,经常需要在网页上输出一些信息. 这种需求和 alert 的弹窗.F12 的断点查看信息的场景是不一样的: ...
- Sharepoint学习笔记—习题系列--70-576习题解析 -(Q112-Q115)
Question 112 You are designing a public-facing SharePoint 2010 Web site for an elementary school th ...
- iOS UIRefreshControl-刷新tableView
override func viewDidLoad() { super.viewDidLoad() refreshControl = UIRefreshControl.in ...
- HTML5-01 简介
标记语言 概述 标记语言(也称置标语言),是一种将文本及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的计算机编码.与文本相关的其他信息(包括例如文本的结构和表示信息等)与原来的文本结合 ...
- Android屏幕适配总结
一.首先需要明白的几个概念 1.屏幕尺寸:也就是我们平常所说的某某手机几寸屏.比如苹果的4.7寸, 荣耀6的5.5寸.这里说的寸是英寸(1 英寸 = 2.54 厘米). 计算方法:屏幕尺寸=对角先尺寸 ...
- Linux sendmail发送邮件失败诊断案例(一)
在新服务器上测试sendmail发送邮件时,发现邮件发送不成功,检查日志文件发现如下错误(Notice:由于涉及公司服务器,邮箱等,故下面hostname.邮箱地址等信息使用xxx代替) tail - ...
- Linux SendMail发送邮件失败诊断案例(二)
Linux上Sendmail经常由于一些配置问题,导致邮件发送失败,下面整理.收集了一些邮件发送失败.异常的案例. 案例1:在新服务器上测试sendmail发送邮件时,发现邮件发送不成功,检查/var ...
- Linux 克隆虚拟机引起的“Device eth0 does not seem to be present, delaying initialization”
虚拟机Vmware上克隆了一个Red Hat Enterprise Linx启动时发现找不到网卡,如下所示,如果你在命令窗口启动网络服务就会遇到"Device eth0 does not s ...