`
SavageGarden
  • 浏览: 223244 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

appfuse学习笔记(四)struts2的表单校验

阅读更多
(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方法
0
2
分享到:
评论
1 楼 arfee522 2009-11-04  
本来顶的,点错了...sorry

相关推荐

    appfuse学习笔记(一)安装部署

    **AppFuse 学习笔记(一):安装与部署** AppFuse 是一个开源项目,它提供了一种快速构建企业级 Web 应用程序的方式。它使用了多种流行的技术栈,如 Spring Boot、Hibernate、Thymeleaf 和 Maven,使得开发者可以更...

    appfuse/display/strutsMenu

    在提供的文档中,"Appfuse+2.doc"可能详细介绍了AppFuse的升级和改进,特别是版本2引入的新特性。"display.doc"可能涵盖DisplayTag的使用指南,包括如何在JSP页面上集成DisplayTag标签,以及如何配置和定制其行为。...

    appfuse 学习笔记

    在硬盘上创建一个项目根目录,例如 `E:\appfuse2-ly`。 **2. 使用 Maven 创建 Appfuse 项目** 在命令行中切换到项目根目录,然后输入以下命令: ```bash mvn archetype:create -DarchetypeGroupId=org....

    appfuse学习笔记(二)新建模块

    在本篇“appfuse学习笔记(二)新建模块”中,我们将深入探讨AppFuse框架的模块创建过程。AppFuse是一个开源项目,它提供了一个快速开发Web应用的基础结构,旨在简化开发流程并提高代码质量。通过AppFuse,开发者...

    appfuse-tutorial-struts-1.6.zip_appfuse

    这个"appfuse-tutorial-struts-1.6.zip"文件是一个基于Struts 1.6的AppFuse教程,用于指导开发者如何构建一个企业级的人员管理系统。Struts是Apache软件基金会下的一个开源框架,专门用于构建基于MVC(Model-View-...

    AppFuse学习笔记(J2EE入门级框架)

    【AppFuse 框架详解】 AppFuse 是一个由 Matt Raible 创建的开源项目,它为初学者提供了一个基础的 J2EE 框架,用于演示如何集成多个流行的技术,如 ...AppFuse 不仅是一个框架,更是一个学习 J2EE 技术的良好起点。

    appfuse学习笔记(三)解决乱码和菜单设置

    在本篇“appfuse学习笔记(三)解决乱码和菜单设置”中,我们将深入探讨在使用AppFuse框架时遇到的编码问题以及如何定制应用程序的菜单。AppFuse是一款开源项目,它提供了一个快速开发Web应用的基础,特别是对于Java...

    Struts2、Spring和Hibernate应用实例.

    Struts作为MVC 2的Web框架,自推出以来不断受到开发者的追捧,得到广泛的应用。作为最成功的Web框架,Struts自然拥有众多的优点:MVC 2模型的使用、功能齐全的标志库(Tag Library)、开放源代码。而Spring的出现,...

    AppFuse学习笔记

    AppFuse 是一个开源项目,专为加速 J2EE 应用程序开发而设计。...通过本文的学习,读者将能够熟练运用 AppFuse,体验其带来的高效和便捷。同时,结合 Ant 脚本,开发者可以灵活地管理和构建项目,进一步提高开发效率。

    Using Struts 2 - AppFuse 2 - Confluence(1).pdf

    ### 使用Struts 2与AppFuse 2:深入解析与实战指南 #### 一、Struts 2简介 Struts 2(前身为WebWork)是一款以简洁为设计理念的Web框架,它基于XWork构建,XWork是一个通用的命令模式框架。尽管XWork拥有自己的...

    appfuse2.0.2 Struts2 hibernate Spring 构建的基于SQLServer2005 的ssh2项目的过程全记录

    appfuse2.0.2 Struts2 hibernate Spring 构建的基于SQLServer2005 的ssh2项目的过程全记录 网上很多帖子介绍appfuse2构建过程的,但是基于SQLServer2005的没有,顶多一笔带过,另外对于期间出现的各种问题也没有个说明,...

    appfuse2学习日记

    ### AppFuse2 学习知识点总结 #### 一、AppFuse 概述 - **定义与价值**:AppFuse 是一款开源项目,旨在利用一系列开源工具帮助开发者高效地搭建 Web 应用程序的基础架构。通过使用 AppFuse,开发人员可以在构建新...

    建立项目原型骨架的步骤(最新版本appfuse)appfuse2.1.0-M2

    AppFuse 是一个开源项目,它提供了快速开发Java Web应用程序的基础框架。这个框架集成了Spring、Hibernate和Struts等主流技术,使得开发者能够...对于初学者,AppFuse 提供的快速启动指南和详尽文档是极好的学习资源。

    Appfuse2搭建文档

    Appfuse2是一款开源的Web应用程序框架,它集成了多种流行的技术,如Struts、Hibernate、Spring和JPA,旨在简化Java应用的开发过程。本文档将详细介绍如何利用Appfuse2来构建一个基于Oracle数据库的项目。 首先,让...

    appfuse

    通过理解和学习AppFuse的这些组件及其相互作用,你可以更好地掌握Java Web开发的基础,并且能够利用AppFuse快速创建自己的项目。对于初学者来说,这是一个很好的起点,而对于经验丰富的开发者,它则可以作为一个高效...

    Appfuse 2.doc

    2. **创建项目文件夹**:在磁盘上创建一个文件夹,用于存放Appfuse项目,例如`D:\appfuse2-hzy`。 3. **执行Maven命令**:在命令行中输入以下命令: ``` mvn archetype:create -DarchetypeGroupId=org.appfuse -...

    APPFUSE工具研究.doc

    AppFuse分为1.x和2.0两个主要版本,其中2.0版是重构建的,采用了Maven 2作为构建工具,而1.x版本则使用Ant。 Maven 2的引入带来了许多优势,包括自动下载依赖项、简化维护(因为所有组件可以一次编译)以及方便最终...

    SSH学习及开发框架-appfuse

    有struts2+hibernate+spring的整合 springmvc+hibernate+spring的整合 多模块,但模块都有 学习开发参考使用非常方便 可以到官方下载最新版的,我只是把自己下载的打包整理一下 注意哈,都是基于maven的项目哈

Global site tag (gtag.js) - Google Analytics