1. 手动验证的实现

只需要在继承ActionSupport类的情况下,直接重写validate()方法即可。使用validate()方法可以对用户请求的多个Action方法进行验证,但其验证的逻辑是相同的。如果在一个Action类中编写了多个请求处理方法,而此Action重写了validate()方法,那么,默认情况下,在执行每个请求方法的过程中,都会经过validate()方法的验证处理。

2. 验证文件的命名规则

使用Struts2验证框架,验证文件的名称需要遵循一定的命名规则,其验证文件的名称必须为ActionName-validation.xml或ActionName-AliasName-validation.xml的形式。其中ActionName是Action对象的名称,AliasName为Action配置中的名称,也就是struts.xml配置文件中Action元素对应name属性的名称。

  • 以ActionName-validation.xml方式命名

  在这种命名的方式中,数据的验证会作用于整个Action对象中,并验证Action对象的请求业务处理方法。如果Action对象中只存在单一的处理方法,或在多个请求处理的方法中,验证处理的规则都相同,可以应用此种命名方式。

  • 以ActionName-AliasName-validation.xml方式命名

  与上一种命名方式相比较,以ActionName-AliasName-validation.xml方式命名更加灵活。如果一个Action对象中包含多个请求处理方法,而又没有必要对每一个方法进行验证处理,值需要对Action对象中的特定方法进行处理,就可以使用此种命名方式。

3. 验证文件的编写风格

在Struts2框架中使用数据验证框架,其验证文件的编写有两种风格,也就是两种编写方法,分别为字段验证器编写风格与非字段验证器编写风格,它们各有优点。

4. Struts2高级技术典型应用

4.1 Struts2标签下的用户注册

例4.1 通过Struts2框架提供的表单标签编写用户注册表单,将用户的注册信息输出到JSP页面中。

(1)创建动态的Java Web项目,将Struts2的相关类包添加到项目的classpath,并在web.xml文件中注册Struts2提供的StrutsPrepareAndExecuteFilter过滤器,从而搭建Struts2的开发环境,具体代码如下:

<?xml version="1.0" encoding="GBK"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>java_struts2</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- Struts2过滤器 -->
<filter>
<!-- 过滤器名称 -->
<filter-name>struts2</filter-name>
<!-- 过滤器类 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- Struts2过滤器映射 -->
<filter-mapping>
<!-- 过滤器名称 -->
<filter-name>struts2</filter-name>
<!-- 过滤器映射 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

(2)创建程序中的主页index.jsp,在主页面中通过Struts2框架提供的表单标签编写用户注册的表单。关键代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>用户注册</h2>
<s:form action="userAction" method="post">
<s:textfield name="name" label="用户名" required="true" requiredposition="left"></s:textfield>
<s:password name="password" label="密码" required="true" requiredposition="left"></s:password>
<s:radio name="sex" list="#{1:'男',0:'女'}" label="性别" required="true" requiredposition="left"></s:radio>
<s:select list="{'请选择省份','吉林','广东','山东','河南'}" name="province" label="省份"></s:select>
<s:checkboxlist list="{'足球','羽毛球','乒乓球','篮球'}" name="hobby" label="爱好"></s:checkboxlist>
<s:textarea name="description" cols="30" rows="5" label="描述"></s:textarea>
<s:submit value="注册"></s:submit>
<s:reset value="重置"></s:reset>
</s:form>
</body>
</html>

在应用表单时,如果使用Struts2标签生成表单元素,可以用标签中的label属性,来定义表单元素前面的标签文字;如果表单中的元素属于一个必填的元素,那么可以使用required属性进行标记,其标记的效果会在元素的边缘显示一个字符“*”,同时这个字符“*”的位置也可以控制,通过requiredposition设置即可。

(3)创建用户注册后的返回页面success.jsp,在该页面中,通过Struts2的数据标签将用户注册信息输出到页面中。关键代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
<h2>用户注册信息</h2>
<ul>
<li>用户名:<s:property value="name"/></li>
<li>密&nbsp;&nbsp;码:<s:property value="passward"/></li>
<li>性&nbsp;&nbsp;别:<s:if test="sex==0">女</s:if><s:else>男</s:else></li>
<li>省&nbsp;&nbsp;份:<s:property value="province"/></li>
<li>爱&nbsp;&nbsp;好:<s:property value="hobby"/></li>
<li>描&nbsp;&nbsp;述:<s:property value="description"/></li>
</ul>
</div>
</body>
</html>

(4)创建名称为UserAction的类,该类继承于ActionSupport类,是一个Action对象,它的作用是对用户注册请求以及用户信息编辑请求进行处理。关键代码如下:

package com.cn.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction1 extends ActionSupport {
private static final long serialVersionUID = 1L;
private String name; //用户名
private String password; //密码
private String description; //描述
private int sex=1; //性别
private String province; //省份
private String[] hobby; //爱好
public String execute() throws Exception { //用户注册
return SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
} }

(5)创建Struts2框架的配置文件struts.xml,在该文件中配置UserAction对象。关键代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 声明常量(开发模式) -->
<constant name="struts.devMode" value="true"></constant>
<!-- 声明常量(在Struts的配置文件修改后,自动加载) -->
<constant name="struts.configuration.xml.reload" value="true"></constant>
<!-- 声明包 -->
<package name="myPackage" extends="struts-default" namespace="/">
<!-- 定义action -->
<action name="userAction" class="com.cn.action.UserAction">
<!-- 注册成功的返回页面 -->
<result>success.jsp</result>
</action>
</package>
</struts>

示例运行后,用户注册界面如下所示:

若注册后的页面出现中文乱码,把所有网页的编码方式设为"UTF-8"即可。

4.2  使用验证框架对数据校验

例4.2 应用Struts2验证框架对用户登录页面进行输入验证。

(1)创建动态的Java Web项目,将Struts2的相关类包添加到项目的classpath,并在web.xml文件中注册Struts2提供的StrutsPrepareAndExecuteFilter过滤器,从而搭建Struts2的开发环境,具体代码如下:

<?xml version="1.0" encoding="GBK"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>java_struts2</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- Struts2过滤器 -->
<filter>
<!-- 过滤器名称 -->
<filter-name>struts2</filter-name>
<!-- 过滤器类 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!-- Struts2过滤器映射 -->
<filter-mapping>
<!-- 过滤器名称 -->
<filter-name>struts2</filter-name>
<!-- 过滤器映射 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>

(2)创建用户登录的Action对象UserAction,并将UserAction配置到struts.xml配置文件中,具体代码如下:

UserAction.java

package com.cn.action;

import com.opensymphony.xwork2.ActionSupport;

public class UserAction2 extends ActionSupport {
private static final long serialVersionUID = 1L;
private String username; //用户名
private String password; //密码
//用户登录
@Override
public String execute() throws Exception {
return SUCCESS;
}
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;
} }

在struts.xml中的配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 声明常量(开发模式) -->
<constant name="struts.devMode" value="true"></constant>
<!-- 声明常量(在Struts的配置文件修改后,自动加载) -->
<constant name="struts.configuration.xml.reload" value="true"></constant>
<!-- 声明包 -->
<package name="myPackage" extends="struts-default" namespace="/">
<!-- 定义action -->
<action name="userAction" class="com.cn.action.UserAction">
<!-- 用户登录页面 -->
<result name="input">login.jsp</result>
<!-- 登录成功的返回页面 -->
<result>success.jsp</result>
</action>
</package>
</struts>

在struts.xml中配置文件中,请求处理成功的映射结果是success.jsp页面,验证失败返回用户登录页面login.jsp。

注意:默认情况下,Struts2的验证框架验证失败后会返回input对应的页面,所以需要指定input值对应的页面。

(3)创建用户登录页面login.jsp,在该页面中通过Struts2的表单标签创建用户登录表单。关键代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<s:form action="userAction" method="post">
<s:textfield name="username" label="用户名" required="true"></s:textfield>
<s:password name="password" label="密码" required="true"></s:password>
<s:submit key="submit" value="登录"></s:submit>
</s:form>
</body>
</html>

(4)创建名称为success.jsp的JSP页面,该页面是用户成功登录的返回页面。关键代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>
<s:property value="username"/>,登录成功!
</h2>
</body>
</html>

(5)编写用户登录的验证文件,该文件的名称为UserAction-validation.xml。关键代码如下:

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC "-//Apache Struts//XWork Validator 1.0.2//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd"> <validators>
<field name="username">
<field-validator type="requiredstring">
<message>用户名不能为空</message>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message>密码不能为空</message>
</field-validator>
<field-validator type="stringlength">
<param name="maxLength">10</param>
<param name="minLength">5</param>
<message>密码长度应该在${minLength}--${maxLength}位之间</message>
</field-validator>
</field>
</validators>

注意:验证文件UserAction-validation.xml必须放置在UserAction所在的包中。

运行程序后,进入到用户登录页面login.jsp,如下所示:

如果没有输入用户名、密码的情况下,单击”登录“按钮,页面会停留在login.jsp页面中,如下所示:

如果密码输入的长度不对,页面显示如下内容:

Struts2数据验证机制的更多相关文章

  1. Struts2数据验证与使用Java代码进行数据验证

    Struts2数据验证 使用Java代码进行数据验证 重写ActionSupport的validate()方法 对Action类的中所有请求处理方法都会进行验证! 对Action类的数据属性进行检查, ...

  2. 【ASP.NET基础】客户端、服务器端的数据验证 + CKEditer

    1, 客户端 用Javascript进行验证,直接提示用户输入的数据是否符合规范,是否合法. 这样体验行比较好,客户端立即就可以得到反馈,而且减少了服务器端的数据交互. 这样前端数据验证并不是很安全, ...

  3. ASP.NET MVC- 数据验证机制

    ASP.NET MVC的数据验证机制,比起ASP.NET WEBFORM那种高效很多.下面记录以下两个示例,以便日后方便查阅. 方式一:在Controller里通过AddModelError方法返回错 ...

  4. Silverlight实例教程 - Validation服务器端异步数据验证(转载)

    摘要:本 篇实例,我们仍旧使用SilverlightValidationDemo项目,为了不和过去的验证方法冲突,这里我们创建一个新的数据成员类 Staff,该类实现INotifyDataErrorI ...

  5. Silverlight实例教程 - Validation客户端同步数据验证(转载)

    摘要:在Silverlight 4中,Silverlight Validation有相对的改进,本篇将介绍Silverlight 4中新加入的验证机制功能,IDataErrorInfo客户端同步验证机 ...

  6. struts2 的验证框架validation如何返回json数据 以方便ajax交互

    struts2 的验证框架validation简单,好用,但是input只能输出到jsp页面通过struts2的标签<s:fielderror  />才能取出,(EL应该也可以). 如果使 ...

  7. 定制Asp.NET 5 MVC内建身份验证机制 - 基于自建SQL Server用户/角色数据表的表单身份验证

    背景 在需要进行表单认证的Asp.NET 5 MVC项目被创建后,往往需要根据项目的实际需求做一系列的工作对MVC 5内建的身份验证机制(Asp.NET Identity)进行扩展和定制: Asp.N ...

  8. Struts2(二)之封装请求正文、数据类型转换、数据验证

    一.封装请求正文到对象中(重点) 1.1.静态参数封装 在struts.xml文件中,给动作类注入值,使用的是setter方法 1.2.动态参数封装 通过用户表单封装请求正文参数 1.2.1.动作类作 ...

  9. struts2(三)---struts2中的服务端数据验证框架validate

    struts2为我们提供了一个很好的数据验证框架–validate,该框架可以很方便的实现服务端的数据验证. ActionSupport类提供了一个validate()方法,当我们需要在某一个acti ...

随机推荐

  1. 在LoadRunner中从数组类型的参数随机取值的方法

    在LoadRunner中从数组类型的参数随机取值的方法 使用web_reg_save_param做关联后,有时候会有多个匹配值. 为了模仿用户行为随机取一个值为后续transcation所用,可以使用 ...

  2. docker 解决network has active endpoints

    解决方式 使用 docker network disconnect -f {network} {endpoint-name},其中的 {endpoint-name} 可以使用命令 docker net ...

  3. 【转】windows下安装Python虚拟环境virtualenvwrapper-win

    由于Python的版本众多,还有Python2和Python3的争论,因此有些软件包或第三方库就容易出现版本不兼容的问题. 通过 virtualenv 这个工具,就可以构建一系列虚拟的Python环境 ...

  4. 【Leetcode】583. Delete Operation for Two Strings

    583. Delete Operation for Two Strings Given two words word1 and word2, find the minimum number of st ...

  5. C和指针之学习笔记(3)

    第8章 数组 1.数组与指针 数组名是一个个元素的地址. int  a[10];  int  b[10];  int  *c; (1) c = & a[0]; &a[0]表示一个指向数 ...

  6. 「WC2018即时战略」

    「WC2018即时战略」 题目描述 小 M 在玩一个即时战略 (Real Time Strategy) 游戏.不同于大多数同类游戏,这个游戏的地图是树形的.也就是说,地图可以用一个由 \(n\) 个结 ...

  7. Codeforces 839E Mother of Dragons(极大团)

    [题目链接] http://codeforces.com/contest/839/problem/E [题目大意] 现在有一些点,现在你有k的液体,随意分配给这些点, 当两个点有边相连的时候,他们能产 ...

  8. 【manacher】模板

    考试竟然写错了manacher!太耻辱了!所以赶快又敲了一遍模板!!一定不能错了aaaa #include<iostream> #include<cstdio> #includ ...

  9. 编写Shell脚本(未完待续)

    Shell脚本命令的工作方式有两种:交互式批处理 交互式:用户每输入一条命令就立即执行 批处理:由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多命令

  10. python开发_常用的python模块及安装方法

    adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctype ...