一、Struts2提供了基于验证框架的输入校验,在这种校验方式下,所有的输入校验只需要编写简单的配置文件,Struts2的验证框架将会负责进行服务器校验和客户端校验。

校验失败后将Struts2将自动返回名为“input”的Result,如需制定错误显示页面,则通过struts.xml来配置“input”的Result。在Result视图中使用<s:fielderror/>标签即可输入校验失败的提示信息。

User.java

package models;

import java.util.Date;

import com.opensymphony.xwork2.validator.annotations.RegexFieldValidator;
import com.opensymphony.xwork2.validator.annotations.RequiredStringValidator; public class User {
private String username;
private String password;
private Date birth; public String getUsername() {
return username;
} // 基于注解的输入校验
@RequiredStringValidator(key = "username.requried", message = "")
@RegexFieldValidator(regex = "\\w{4,25}", key = "username.regex", message = "")
public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public Date getBirth() {
return birth;
} public void setBirth(Date birth) {
this.birth = birth;
} @Override
public int hashCode() {
// TODO Auto-generated method stub
return getUsername().hashCode();
} @Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
} else if (obj != null && obj.getClass() == User.class) {
User objUser = (User) obj;
if (objUser.getUsername().equals(this.getUsername())) {
return true;
}
}
return false;
}
}

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!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><s:text name="login page"></s:text></title>
</head>
<body>
<s:form action="login.action" validate="true">
<s:textfield name="user.username" key="username" />
<s:password name="user.password" key="password" />
<s:textfield name="user.birth" key="birth" /> <s:submit value="login" />
</s:form>
</body>
</html>

LoginAction.java

package actions;

import models.User;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport {

    private User user;

    public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} @Override
public String execute() throws Exception {
if (getUser().getUsername().equals("yangys")
&& getUser().getPassword().equals("666666")) {
return SUCCESS;
}
return ERROR;
} }

Struts2的校验文件规则为:每个Action都有一个校验文件,该文件的文件名应该遵守的规则<ActionClassName>-validation.xml,如果Action中有多个处理逻辑,即在struts.xml中某个Action指定了多个method属性,对应的每个method都有一个校验规则文件,命名规则为<ActionClassName>-<ActionName>-validation.xml.

LoginAction-validation.xml

<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
<validators>
<field name="user.username">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="user.username.requried"/>
</field-validator>
</field>
<field name="user.password">
<field-validator type="requiredstring">
<param name="trim">true</param>
<message key="user.password.requried"/>
</field-validator>
<field-validator type="regex">
<param name="regex"><![CDATA[(\w{4,25})]]></param>
<message key="user.password.regex"/>
</field-validator>
</field>
<field name="user.birth">
<field-validator type="date">
<param name="min">1900-01-01</param>
<param name="max">2016-02-14</param>
<message key="user.birth.range"/>
<!-- <message>生日必须在1900-01-01到2016-02-14之间</message> -->
</field-validator>
</field>
</validators>

其中message标签内为校验失败后的提示信息,可以直接写在<message></message>标签内,也可以通过<message key=""/>从国际化资源文件中提取显示。

LoginAction_zh_CN.properties(native2ascii处理过)

user.username.requried=\u5FC5\u987B\u8F93\u5165\u7528\u6237\u540D
user.password.requried=\u5FC5\u987B\u8F93\u5165\u5BC6\u7801
user.password.regex=\u5BC6\u7801\u5FC5\u987B\u662F\u5B57\u6BCD\u6216\u6570\u5B57\uFF0C\u957F\u5EA6\u57284\u523025\u4E4B\u95F4
user.birth.range=\u751F\u65E5\u5FC5\u987B\u5728${min}\u548C${max}\u4E4B\u95F4

二、将输入页面的表单元素改为使用Struts2标签,并将<s:form.../>元素增加validate="true"即可实现客户端校验。

客户端校验只支持如下几种校验器:

  • required(必填校验器)
  • requiredstring(必填字符串校验器)
  • stringlength(字符串长度校验器)
  • regex(表达式校验器)
  • email(邮件校验器)
  • url(网址校验器)
  • int(整数校验器)
  • double(双精度数校验器)

使用客户端校验时应注意:

  1. <s:form.../>元素有一个theme属性,不能将该属性指定为simple。
  2. 浏览着不能直接访问启用客户端校验的表单,否则会引发异常。
  3. 如果客户端校验希望输出国际化提示信息,那就需要使用全局国际化资源文件,不能使用Action范围的国际化资源文件。
  4. 启用客户端校验的表单页面的action和namespace要分开写。

三、无论服务器端校验还是客户端校验,校验配置文件都有两种风格的写法。

1.字段风格

<validators>
<field name="字段名">
<field-validator type="校验类型">
<param name="参数名">参数值</param>
<message>校验失败提示信息</message>
</field-validator>
</field>
</validators>

2.非字段风格

<validators>
<validator type="校验类型">
<param name="fieldName">需校验的字段名</param>
<param name="参数名">参数值</param>
<message>校验失败提示信息</message>
</validator>
</validators>

两种风格写法效果一样,但是一般推荐字段风格写法,逻辑清晰,易读。

三、短路校验器的概念

配置文件中对同一字段的多种校验如触发后默认全部显示校验失败提示信息,如果在某个校验标签<validator.../>或<field-validator.../>中增加short-vircuit="true"即可实现短路校验,即该校验条件失败后,此字段位于该校验器后面的校验将不再校验。那么就不得不将Struts2的校验文件搜索规则即校验规则做一下介绍。

如果Action之间存在继承关系,则搜索规则如下:

  1. SuperActionClassName-validation.xml
  2. SuperActionClassName-SuperActionName-validation.xml
  3. ActionClassName-validation.xml
  4. ActionClassName-ActionName-validation.xml

注意:这种搜索与Struts2其它配置文件搜索不同,即使找到第一个校验规则,系统还是会继续搜索,不管有没有或者是否找到,都会按顺序继续搜索,并且校验规则是这四份规则文件里的总和,如果有冲突,则后面的文件有效。在同一个文件中,非字段风格校验器优于字段风格校验器,同类型按顺序执行

短路原则如下:

  • 所有非字段校验器是最优先执行,如果某个非字段校验器校验失败了,则该字段上所有字段校验器都不会获得校验的机会。
  • 非字段校验器的校验失败,不会阻止其它非字段校验的执行。
  • 如果一个字段校验器失败后,则该字段校验器下且排在该校验失败的校验器之后的其它字段校验器不会获得校验机会。
  • 字段校验器永远不会阻止非字段校验器的执行。

四、手工校验

重写Action的validate方法即可,当然,与前面类似,对于同一个Action中不同处理逻辑的校验,Struts2允许提供validateXxx()方法对特定逻辑进行校验。其中addFieldError方法就是添加校验失败提示信息,第一个参数是fieldName,第二个参数是message。

@Override
public void validate() {
if (!getUser().getUsername().contains("yang")) {
addFieldError("user.username", "没有包含yang");
}
}

Struts2的输入校验的更多相关文章

  1. Struts2的输入校验(2)——客户端校验

    Struts2的输入校验(2) --客户端校验 Struts2客户端校验的使用: (1)使用Struts2的标签生成输入页面的表单: (2)为该<s:form>元素添加validate=& ...

  2. Struts2的输入校验(1)——校验规则文件的编写

    Struts2的输入校验(1) --校验规则文件的编写 Struts2提供了基于验证框架的输入校验,所有的输入校验只要编写配置文件,Struts2的验证框架将会负责进行服务器校验和客户端校验. 注: ...

  3. Struts2框架(8)---Struts2的输入校验

    Struts2的输入校验 在我们项目实际开发中在数据校验时,分为两种,一种是前端校验,一种是服务器校验: 客户端校验:主要是通过jsp写js脚本,它的优点很明显,就是输入错误的话提醒比较及时,能够减轻 ...

  4. JavaWeb框架_Struts2_(六)----->Struts2的输入校验

    1. 输入校验章节目录 输入校验概述 客户端校验 服务器端校验 手动编程校验 重写validate方法 重写validateXxx()方法 输入校验流程 校验框架校验 Struts2 内置的校验器 常 ...

  5. (十三)struts2的输入校验

    输入校验是web应用必须处理的问题,要防止用户的误输入和恶意非法输入.struts2给我们提供了非常强大的输入校验体系. 输入校验分为客户端校验和服务器端校验.一般开发中两者都用,但是服务端校验必须使 ...

  6. Struts2 自定义输入校验 第五弹

    Struts2的校验框架有两种:一种是validate方法,另一种是有效的xml文件. Action中自定义方法的输入校验,对于通过action的method属性所指定的自定义方法myExecute, ...

  7. 笔记:Struts2 输入校验

    Struts2的输入校验包含了客户端校验和服务器端校验,通过编写校验规则文件来实现输入校验,需要增加 Convention 插件,将 struts2-convention-plugin-2.3.31. ...

  8. Struts2输入校验

    1.编写校验规则文件 (<ActionName>-validation.xml),文件放在Action类文件相同的路径下校验失败返回input的result.       <vali ...

  9. struts2对action中的方法进行输入校验(2)

    struts2输入校验流程: 1.类型转换器对请求參数运行类型转换,并把转换后的值赋给aciton中的属性 2.假设在运行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext, ...

随机推荐

  1. 转(NLP必读)

    如果你刚接触自然语言处理并对她感兴趣,最好读几本这方面的书籍,除了能让你知道自然语言处理各个领域是干什么的外,还能培养一下NLP的感觉.以下四本书是我读研期间阅读和接触过的,如果您还有好书推荐,欢迎补 ...

  2. csipsimple 下载地址

    项目下载地址: http://git.oschina.net/zencodex/CSipSimple https://github.com/zencodex/csip

  3. WIN10环境下搭建与连接VPN服务器

    搭建VPN服务器 0.前言 1.WIN+E打开此电脑 2.勾选始终显示菜单,并应用,确定 3.新建传入连接,可以添加用户,也可以直接选取已有用户 连接VPN服务器 1.打开vpn设置 2.添加vpn连 ...

  4. 读取xml格式文件

    $v = [xml]get-content d:\vmconfig.xml $v.Domain.Computer.Name =========================== $v.GetElem ...

  5. 前缀、中缀、后缀表达式及其相互转化的Java实现

    一.中缀表达式转换为前缀.后缀表达式 给个中缀表达式:a+b*c-(d+e)    首先根据运算符的优先级给所有运算单位加括号:((a+(b*c))-(d+e))    将运算符号移动到对应括号的前面 ...

  6. 浅谈android4.0开发之GridLayout布局

    作者:李响 本文重点讲述了自android4.0版本号后新增的GridLayout网格布局的一些基本内容,并在此基础上实现了一个简单的计算器布局框架.通过本文,您可以了解到一些android UI开发 ...

  7. Codeforces 439D Devu and his Brother 三分

    题目链接:点击打开链接 = - =曾经的三分姿势不对竟然没有被卡掉,,,太逗.. #include<iostream> #include<string> #include< ...

  8. C++ ORM ODB 入门介绍(一)

    C++的语言特性决定了在C++中的ORM框架不可能像Java,C#那没有那么灵活. C++的ORM框架一般都是基于模板,编译时,因此其效率比起Java中的ORM框架更高. ODB是一个比较独立,成熟的 ...

  9. 从源码角度深入分析log4j配置文件使用

    log4j在日常开发中经常使用,但有时候对 配置文件应该放到什么位置有疑惑.现在我们通过从代码的角度来看待这个问题, 看完后你也许会恍然大悟哦. 开始吧. Log4j的组成及架构: Log4j由三个重 ...

  10. Java基础知识强化之IO流笔记42:IO流总结(图解)

    1. IO流总结(图解)