正题 1.工程目录结构图:
2.以下依次帖代码:
a). web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.FilterDispatcher
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>ValidatorDate.jsp</welcome-file>
</welcome-file-list>
</web-app>
b). struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-validation.xml" />
</struts>
c). struts.properties
struts.ui.theme=simple
d). struts-validation.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="validationExamples" extends="struts-default"
namespace="/validation">
<action name="ValidatorField"
class="com.tangjun.validator.ValidatorAction">
<!-- 这里input表示验证失败后指定跳转到什么地方去 -->
<result name="input" type="dispatcher">/ValidatorDate.jsp</result>
<result>/success.jsp</result>
</action>
</package>
</struts>
e). ValidatorAction-validation.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="regexYearField">
<field-validator type="mydate">
<param name="maxYear">2008</param>
<param name="minYear">1900</param>
<message>
<![CDATA[ 不是一个有效的年份! ]]>
</message>
</field-validator>
</field>
<field name="regexMonthField">
<field-validator type="mydate">
<message>
<![CDATA[ 不是一个有效的月份! ]]>
</message>
</field-validator>
</field>
<field name="regexDayField">
<field-validator type="mydate">
<!-- 是否使用正则表达式验证日期 -->
<param name="isRegex">false</param>
<!-- 使用自定义正则表达式验证日期 -->
<!--
<param name="expression"></param>
-->
<message>
<![CDATA[ 当前月份的天数不对! ]]>
</message>
</field-validator>
</field>
</validators>
说明:验证文件需要和Action在同一目录下, 验证文件命名规则:验证文件xxxx-validation.xml,这个xxxx就是你前面action的类名字,xxx-xxx-validation.xml第二个xxx表示是别名.
f). validators.xml
<validators>
<validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
<validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
<validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
<validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
<validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
<validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
<validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
<validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
<validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
<validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
<validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
<validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
<validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
<validator name="mydate" class="com.tangjun.validator.DateEx"/>
</validators>
说明:在源码com.opensymphony.xwork2.validator.ValidatorFactory中,在325行至330那一段代码 可以看出,如果不能在根目录下找到validators.xml文件,验证框架将调用默认的验证设置,即 com.opensymphony.xwork2.
validator.validators目录下default.xml里面的配置信息.最后一个<validator name="mydate" class="com.tangjun.validator.DateEx"/>就是我添加的默认验证器类型.
g). ValidatorAction
package com.tangjun.validator;
import com.opensymphony.xwork2.ActionSupport;
/**
* 验证日期
*
* @author lzl
*
*/
public class ValidatorAction extends ActionSupport {
private static final long serialVersionUID = -4829381083003175423L;
private Integer regexYearField;
private Integer regexMonthField;
private Integer regexDayField;
public ValidatorAction()
{
regexYearField = null;
regexMonthField = null;
regexDayField = null;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
public Integer getRegexDayField() {
return regexDayField;
}
public void setRegexDayField(Integer regexDayField) {
this.regexDayField = regexDayField;
}
public Integer getRegexMonthField() {
return regexMonthField;
}
public void setRegexMonthField(Integer regexMonthField) {
this.regexMonthField = regexMonthField;
}
public Integer getRegexYearField() {
return regexYearField;
}
public void setRegexYearField(Integer regexYearField) {
this.regexYearField = regexYearField;
}
}
h). BeanUtils
package com.tangjun.validator;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class BeanUtils {
/* 默认验证日期正则表达式 */
private static final String DateExpression = "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)";
/**
* 验证日期合法性(通过抛出错误方式来验证)
* @param date
* @return
*/
public static boolean validatorDate(String date) {
// 注意这个地方"yyyy-MM-dd"如果设置成了yyyy-mm-dd的话验证将失灵
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 这个的功能是不让系统自动转换 不把1996-13-3 转换为1997-3-1
sdf.setLenient(false);
try {
sdf.parse(date);
return true;
} catch (ParseException e) {
return false;
}
}
/**
* 使用正则表达式判定日期
*
* @param str
* @param expression
* @return
*/
public static boolean regexValidatorDate(String str, String expression) {
// 使用正则表达式进行判定
if (expression == null || expression.trim().length() == 0)
expression = BeanUtils.DateExpression;
Pattern pattern;
// System.out.println(expression);
pattern = Pattern.compile(expression, 2);
Matcher matcher = pattern.matcher(str.trim());
if (!matcher.matches()) {
return false;
}
return true;
}
}
说明:验证日期的正则表达式就是在网上找的,可以替换成自己的.
i). DateEx
package com.tangjun.validator;
import java.util.HashMap;
import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
public class DateEx extends FieldValidatorSupport {
private static HashMap<String, Integer> map = new HashMap<String, Integer>();
/* 默认最大年限 */
private static final Integer MAX_YEAR = 2008;
/* 默认最小年限 */
private static final Integer MIN_YEAR = 1900;
/* 最大年限 */
private Integer maxYear;
/* 最小年限 */
private Integer minYear;
/* 验证日期的正则表达式 */
private String expression;
/* 是否使用正则表达式验证 */
private Boolean isRegex;
public DateEx() {
maxYear = null;
minYear = null;
expression = null;
isRegex = false;
}
public void validate(Object object) throws ValidationException {
// 获得字段的名字
String fieldName = getFieldName();
// 获得输入界面输入的值
String value = getFieldValue(fieldName, object).toString();
if (value == null || value.length() <= 0)
return;
if (fieldName.equals("regexYearField"))
validateYear(value, object);
else if (fieldName.equals("regexMonthField"))
validateMonth(value, object);
else if (fieldName.equals("regexDayField"))
validateDay(value, object);
}
/**
* 验证年份
*
* @param object
* @throws ValidationException
*/
private void validateYear(String value, Object object)
throws ValidationException {
/* 设置默认值 */
if (maxYear == null) {
maxYear = MAX_YEAR;
}
if (minYear == null) {
minYear = MIN_YEAR;
}
Integer temp = null;
try {
temp = Integer.valueOf(value);
} catch (NumberFormatException ex) {
addFieldErrorEx(getFieldName(), object);
return;
}
if (temp != null) {
if (temp >= minYear && temp <= maxYear)
map.put("year", temp);
else
addFieldErrorEx(getFieldName(), object);
}
}
/**
* 验证月份
*
* @param object
* @throws ValidationException
*/
private void validateMonth(String value, Object object)
throws ValidationException {
try {
Integer temp = Integer.valueOf(value);
if (temp != null) {
if (temp >= 1
分享到:
相关推荐
Struts2 提供了一个强大的验证框架,允许用户创建自定义验证器来满足各种需求。 #### 二、自定义验证程序的实现 ##### 1. 实现 Validator 接口 为了实现自定义的验证器,首先需要继承或实现 Struts2 的 Validator...
自定义验证器通常是一个实现了`org.apache.struts2.validator.Validator`接口的Java类。你需要覆盖`validate`方法,该方法接受一个`ActionContext`对象和`FieldErrors`对象,用于存放验证错误。在这个方法内,编写...
在Struts2中,自定义拦截器是实现业务逻辑控制、数据验证、权限管理等功能的重要手段。下面将详细探讨如何在Struts2中实现自定义拦截器来完成权限拦截。 首先,我们需要了解Struts2拦截器的工作原理。拦截器是在...
自定义验证器需要实现`org.apache.struts2.validator.FieldValidator`接口,重写`validate()`方法。然后在`validation.xml`中指定自定义验证器类型。 例如,创建一个检查邮箱格式的自定义验证器: ```java public ...
Struts2自定义分页标签是Java Web开发中一种高效且灵活的页面数据展示方法,尤其在处理大数据量时非常实用。Struts2框架提供了一种内置的分页支持,但有时开发人员需要根据项目需求定制更符合业务逻辑的分页功能。本...
自定义校验器是Struts2验证机制的核心部分。要创建一个自定义校验器,需要继承`org.apache.struts2.validator.FieldValidatorSupport`类或者实现`org.apache.struts2.validator.Validator`接口。然后在自定义校验器...
Struts2自定义拦截器的配置是Struts2框架中一个非常重要的功能,它允许开发者在Action执行前后插入自定义的逻辑,以实现如权限验证、日志记录、性能监控等多种需求。以下是对标题和描述中涉及的知识点的详细说明: ...
在深入探讨自定义拦截器之前,我们先理解一下Struts2拦截器的基本概念。 拦截器(Interceptor)是基于Java的动态代理机制实现的,它可以拦截用户的请求,对请求进行预处理,并且在Action执行后进行后处理。通过在...
在Struts2中,拦截器(Interceptor)扮演着至关重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如日志记录、权限验证等。在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合...
本实例展示了如何在Struts2环境中实现几个关键功能:自定义过滤器、文件上传下载以及用户登录功能。这些功能是任何Web应用程序的基础组成部分,理解和掌握它们对于提升Web开发技能至关重要。 首先,我们来探讨...
文件名`struts2-6-test-2`可能包含了相关的测试代码或配置,用于验证自定义类型转换器的效果。 自定义类型转换器允许我们更灵活地处理数据绑定过程中的类型转换问题,提高代码的可维护性和可扩展性。通过以上步骤,...
在Struts2中,拦截器(Interceptor)扮演着关键角色,它们允许开发者在Action执行前后插入自定义逻辑,比如日志记录、权限验证、数据校验等。本文将深入探讨Struts2的内建自定义拦截器及其配置。 首先,让我们理解...
自定义拦截器是Struts2框架中扩展功能的重要手段,让我们深入探讨如何在Struts2中实现自定义拦截器。 首先,创建一个Web项目是基础步骤,这可以通过IDE如Eclipse或IntelliJ IDEA来完成。确保你的项目包含了Struts2...
本示例将聚焦于如何在Struts2中实现一个自定义拦截器。 首先,我们需要了解拦截器在Struts2中的作用。拦截器是AOP(面向切面编程)的一个核心概念,它允许开发者在动作执行前后插入额外的逻辑,如日志记录、权限...
总结,这个“struts2的自定义校验器例子”展示了如何在Struts2中为特定需求创建自定义验证逻辑,确保服务器端数据的有效性和安全性。通过实现自定义校验器,开发者可以灵活地控制输入数据的验证规则,提高应用程序的...
总结来说,防止重复提交的自定义拦截器在Struts2中起到了关键作用,通过生成和验证令牌,能够在不依赖Struts2标签的情况下,有效地避免了用户意外或恶意的重复提交,保证了应用的稳定性和数据的一致性。
本项目“Struts2_自定义拦截器_用户权限验证”将深入探讨如何在Eclipse开发环境中,利用Struts2框架自定义拦截器进行用户权限的验证,并处理各个Action之间的跳转。 首先,我们来看自定义拦截器的创建。在Struts2中...
4. **实现拦截器**:拦截器是Struts 2的特色功能,允许在Action执行前后插入自定义逻辑,如权限检查、日志记录等。通过自定义拦截器,可以扩展框架功能。 5. **定制标签库**:如果需要,可以创建自定义的JSP标签来...
为了实现自定义验证,你需要创建一个继承自Struts1提供的`ActionForm`类的子类,并在这个子类中定义你所需的字段。 2. **添加验证方法**:在ActionForm子类中,你需要为每个需要验证的字段添加一个对应的`validate`...