(1) 添加校验项
修改文件
src/main/resources/com/mycompany/app/model/Person-validation.xml
<!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="person.firstname">
<field-validator type="requiredstring">
<message key="errors.required"/>
</field-validator>
</field>
<field name="person.lastname">
<field-validator type="requiredstring">
<message key="errors.required"/>
</field-validator>
</field>
</validators>
重新编译,重新访问添加人员的页面,姓、名设置为空直接保存,报错
校验起了作用
(2) struts.xml文件的配置说明
......
<!-- Constants -->
<!-- 常量设置 -->
<!--
是否处于开发模式下
设置为true则表示处在开发模式下,应用出现异常和错误时将给开发人员提供更有益于调试的错误信息
设置为false则表示不处在开发模式下,一般应用在应用发布之后
-->
<constant name="struts.devMode" value="false"/>
<!-- 指定应用的默认编码 -->
<constant name="struts.i18n.encoding" value="UTF-8"/>
<!-- 指定符合哪种后缀格式的请求由struts来处理 -->
<constant name="struts.action.extension" value="html"/>
<!-- 指定默认的ObjectFactory,设置值为spring后将由spring管理bean -->
<constant name="struts.objectFactory" value="spring"/>
<!-- 指定应用国际化需要的资源文件,多种时以逗号分隔 -->
<constant name="struts.custom.i18n.resources" value="ApplicationResources,errors"/>
<!-- 指定struts2的上传组件请求内容的最大字节数 -->
<constant name="struts.multipart.maxSize" value="2097152"/>
<!-- 指定模板主题,其它的还有simple,xhtml -->
<constant name="struts.ui.theme" value="css_xhtml"/>
<!-- 指定应用jsp文件的根路径 -->
<constant name="struts.codebehind.pathPrefix" value="/WEB-INF/pages/"/>
<!-- 是否允许在Action名中使用斜线 -->
<constant name="struts.enable.SlashesInActionNames" value="true"/>
。。。。。。
(3) 校验流程分析
struts.xml中定义默认包时
<!-- 定义default包,继承自struts-default包,将自动拥有struts-default包的所有配置 -->
<package name="default" extends="struts-default">
而在struts-default.xml中,配置了如下的拦截器
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
<interceptor-stack name="paramsPrepareParamsStack">
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel</param>
</interceptor-ref>
</interceptor-stack>
当执行添加操作时会被validation拦截器拦截
AnnotationValidationInterceptor中的doIntercept方法
protected String doIntercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
if (action != null) {
Method method = getActionMethod(action.getClass(), invocation.getProxy().getMethod());
SkipValidation skip = (SkipValidation) method.getAnnotation(SkipValidation.class);
if (skip != null) {
return invocation.invoke();
}
}
return super.doIntercept(invocation);
}
再看父类的doIntercept方法
protected String doIntercept(ActionInvocation invocation) throws Exception {
doBeforeInvocation(invocation);
return invocation.invoke();
}
再看触发前要执行的方法doBeforeInvocation(invocation)
protected void doBeforeInvocation(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
String context = invocation.getProxy().getActionName();
String method = invocation.getProxy().getMethod();
if (log.isDebugEnabled()) {
log.debug("Validating "
+ invocation.getProxy().getNamespace() + "/" + invocation.getProxy().getActionName() + " with method "+ method +".");
}
if (validateAnnotatedMethodOnly) {
ActionValidatorManagerFactory.getInstance().validate(action, context, method);
} else {
ActionValidatorManagerFactory.getInstance().validate(action, context);
}
}
再看ActionValidatorManagerFactory.getInstance()
public class ActionValidatorManagerFactory {
private static final Log LOG = LogFactory.getLog(ActionValidatorManagerFactory.class);
private static ActionValidatorManager instance = new DefaultActionValidatorManager();
static {
try {
Class c = ClassLoaderUtil.loadClass("com.opensymphony.xwork2.validator.AnnotationActionValidatorManager", ActionValidatorManagerFactory.class);
LOG.info("Detected AnnotationActionValidatorManager, initializing it...");
instance = (ActionValidatorManager) c.newInstance();
} catch (ClassNotFoundException e) {
// this is fine, just fall back to the default object type determiner
} catch (Exception e) {
throw new XWorkException(e);
}
}
public static void setInstance(ActionValidatorManager instance) {
ActionValidatorManagerFactory.instance = instance;
}
public static ActionValidatorManager getInstance() {
return instance;
}
}
再看com.opensymphony.xwork2.validator.AnnotationActionValidatorManager中的validate(Object object, String context, ValidatorContext validatorContext, String method)方法
public void validate(Object object, String context, ValidatorContext validatorContext, String method) throws ValidationException {
List<Validator> validators = getValidators(object.getClass(), context, method);
Set<String> shortcircuitedFields = null;
for (final Validator validator: validators) {
try {
validator.setValidatorContext(validatorContext);
if (LOG.isDebugEnabled()) {
LOG.debug("Running validator: " + validator + " for object " + object + " and method " + method);
}
FieldValidator fValidator = null;
String fullFieldName = null;
if (validator instanceof FieldValidator) {
fValidator = (FieldValidator) validator;
fullFieldName = fValidator.getValidatorContext().getFullFieldName(fValidator.getFieldName());
if ((shortcircuitedFields != null) && shortcircuitedFields.contains(fullFieldName)) {
if (LOG.isDebugEnabled()) {
LOG.debug("Short-circuited, skipping");
}
continue;
}
}
if (validator instanceof ShortCircuitableValidator && ((ShortCircuitableValidator) validator).isShortCircuit())
{
// get number of existing errors
List<String> errs = null;
if (fValidator != null) {
if (validatorContext.hasFieldErrors()) {
Collection<String> fieldErrors = (Collection<String>) validatorContext.getFieldErrors().get(fullFieldName);
if (fieldErrors != null) {
errs = new ArrayList<String>(fieldErrors);
}
}
} else if (validatorContext.hasActionErrors()) {
Collection<String> actionErrors = validatorContext.getActionErrors();
if (actionErrors != null) {
errs = new ArrayList<String>(actionErrors);
}
}
validator.validate(object);
if (fValidator != null) {
if (validatorContext.hasFieldErrors()) {
Collection<String> errCol = (Collection<String>) validatorContext.getFieldErrors().get(fullFieldName);
if ((errCol != null) && !errCol.equals(errs)) {
if (LOG.isDebugEnabled()) {
LOG.debug("Short-circuiting on field validation");
}
if (shortcircuitedFields == null) {
shortcircuitedFields = new TreeSet<String>();
}
shortcircuitedFields.add(fullFieldName);
}
}
} else if (validatorContext.hasActionErrors()) {
Collection<String> errCol = validatorContext.getActionErrors();
if ((errCol != null) && !errCol.equals(errs)) {
if (LOG.isDebugEnabled()) {
LOG.debug("Short-circuiting");
}
break;
}
}
continue;
}
validator.validate(object);
} finally {
validator.setValidatorContext( null );
}
}
}
最后看一下校验必填项的实现
<validator name="requiredstring" class ="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
public class RequiredFieldValidator extends FieldValidatorSupport {
public void validate(Object object) throws ValidationException {
String fieldName = getFieldName();
Object value = this.getFieldValue(fieldName, object);
if (value == null) {
addFieldError(fieldName, object);
}
}
}
到这里,校验表单,出错后将执行addFieldError方法
分享到:
相关推荐
**AppFuse 学习笔记(一):安装与部署** AppFuse 是一个开源项目,它提供了一种快速构建企业级 Web 应用程序的方式。它使用了多种流行的技术栈,如 Spring Boot、Hibernate、Thymeleaf 和 Maven,使得开发者可以更...
在提供的文档中,"Appfuse+2.doc"可能详细介绍了AppFuse的升级和改进,特别是版本2引入的新特性。"display.doc"可能涵盖DisplayTag的使用指南,包括如何在JSP页面上集成DisplayTag标签,以及如何配置和定制其行为。...
在硬盘上创建一个项目根目录,例如 `E:\appfuse2-ly`。 **2. 使用 Maven 创建 Appfuse 项目** 在命令行中切换到项目根目录,然后输入以下命令: ```bash mvn archetype:create -DarchetypeGroupId=org....
在本篇“appfuse学习笔记(二)新建模块”中,我们将深入探讨AppFuse框架的模块创建过程。AppFuse是一个开源项目,它提供了一个快速开发Web应用的基础结构,旨在简化开发流程并提高代码质量。通过AppFuse,开发者...
这个"appfuse-tutorial-struts-1.6.zip"文件是一个基于Struts 1.6的AppFuse教程,用于指导开发者如何构建一个企业级的人员管理系统。Struts是Apache软件基金会下的一个开源框架,专门用于构建基于MVC(Model-View-...
【AppFuse 框架详解】 AppFuse 是一个由 Matt Raible 创建的开源项目,它为初学者提供了一个基础的 J2EE 框架,用于演示如何集成多个流行的技术,如 ...AppFuse 不仅是一个框架,更是一个学习 J2EE 技术的良好起点。
在本篇“appfuse学习笔记(三)解决乱码和菜单设置”中,我们将深入探讨在使用AppFuse框架时遇到的编码问题以及如何定制应用程序的菜单。AppFuse是一款开源项目,它提供了一个快速开发Web应用的基础,特别是对于Java...
Struts作为MVC 2的Web框架,自推出以来不断受到开发者的追捧,得到广泛的应用。作为最成功的Web框架,Struts自然拥有众多的优点:MVC 2模型的使用、功能齐全的标志库(Tag Library)、开放源代码。而Spring的出现,...
AppFuse 是一个开源项目,专为加速 J2EE 应用程序开发而设计。...通过本文的学习,读者将能够熟练运用 AppFuse,体验其带来的高效和便捷。同时,结合 Ant 脚本,开发者可以灵活地管理和构建项目,进一步提高开发效率。
### 使用Struts 2与AppFuse 2:深入解析与实战指南 #### 一、Struts 2简介 Struts 2(前身为WebWork)是一款以简洁为设计理念的Web框架,它基于XWork构建,XWork是一个通用的命令模式框架。尽管XWork拥有自己的...
appfuse2.0.2 Struts2 hibernate Spring 构建的基于SQLServer2005 的ssh2项目的过程全记录 网上很多帖子介绍appfuse2构建过程的,但是基于SQLServer2005的没有,顶多一笔带过,另外对于期间出现的各种问题也没有个说明,...
### AppFuse2 学习知识点总结 #### 一、AppFuse 概述 - **定义与价值**:AppFuse 是一款开源项目,旨在利用一系列开源工具帮助开发者高效地搭建 Web 应用程序的基础架构。通过使用 AppFuse,开发人员可以在构建新...
AppFuse 是一个开源项目,它提供了快速开发Java Web应用程序的基础框架。这个框架集成了Spring、Hibernate和Struts等主流技术,使得开发者能够...对于初学者,AppFuse 提供的快速启动指南和详尽文档是极好的学习资源。
Appfuse2是一款开源的Web应用程序框架,它集成了多种流行的技术,如Struts、Hibernate、Spring和JPA,旨在简化Java应用的开发过程。本文档将详细介绍如何利用Appfuse2来构建一个基于Oracle数据库的项目。 首先,让...
通过理解和学习AppFuse的这些组件及其相互作用,你可以更好地掌握Java Web开发的基础,并且能够利用AppFuse快速创建自己的项目。对于初学者来说,这是一个很好的起点,而对于经验丰富的开发者,它则可以作为一个高效...
2. **创建项目文件夹**:在磁盘上创建一个文件夹,用于存放Appfuse项目,例如`D:\appfuse2-hzy`。 3. **执行Maven命令**:在命令行中输入以下命令: ``` mvn archetype:create -DarchetypeGroupId=org.appfuse -...
AppFuse分为1.x和2.0两个主要版本,其中2.0版是重构建的,采用了Maven 2作为构建工具,而1.x版本则使用Ant。 Maven 2的引入带来了许多优势,包括自动下载依赖项、简化维护(因为所有组件可以一次编译)以及方便最终...
有struts2+hibernate+spring的整合 springmvc+hibernate+spring的整合 多模块,但模块都有 学习开发参考使用非常方便 可以到官方下载最新版的,我只是把自己下载的打包整理一下 注意哈,都是基于maven的项目哈