0 0

Struts2 验证框架的一点思考以及ActionContext 线程安全问题10

大家都知道Struts2里可以使用xml或annotation定义验证规则,在进入action前会使用interceptor拦截并验证。有一部份验证器如String Length等还支持客户端自动生成JavaScript验证。但是在使用过程中,需要维护相当多的xml(简单的可以在action中使用annotation,但mode driven的不支持)。

我的原则希望:焦点集中在业务逻辑层,因为Service才是我们关心的业务

1)验证规则在Service层定义

如:

validation.addValidator("name",Validation.required(),Validation.length(5)).addValidator("password",Validation.required(),Validation.length(6))....


Validation.required()等,这些是返回自定义的验证类,有相应的validate方法。提供默认的错误提示消息,如:“必须填值!”,如果要支持i18n,可以Validation.required(i18nkey)

大多数情况下,name这些输入都是和database中的字段相关,数据库定义时都有如varchar(32)这样的,已经定义好了长度,如是数字的也有如number(5,2)这种定义好了精度,可以用一个生成工具,生成默认的和数据库相关的验证类,如user表,有name,password字段,可以生成

public class Vlidatiors{

public static class User{

public static Validator nameRequired(){...}
public static Validator nameLength(){...}

public static Validator passwordRequired(){...}
public static Validator passwordLength(){...}

... other rule
}
... other table
}

则Service中可以

validation.addValidator("name",Vlidatiors.User.nameRequired(),Vlidatiors.User.nameLength()).addValidator("password",Vlidatiors.User.nameRequired(),Vlidatiors.User.nameLength())....


2)服务器端验证在Service业务方法里执行
  如:


@Transactional
public void create() {

  if(getCreateValidation().validate()){//验证失败
    throw new BusinessError(getCreateValidation());
  }

   //验证通过,执行具体的业务逻辑
   ....

}

validation.validate()方法会循环执行验证规则,有不通过的,记录错误提示,在页面显示错误提示,见3)


3)JSP不需要写JavaScript,自定义标签,把验证规则翻译成JavaScript,支持onblur,表单onsubmit时校验。同时显示2)中的错误提示

如:<aaa:validation onsubmit="true" onlur="true" ...>


至于验证类,可以有很多,如Struts2里已经有有required,email等,“不要重复造车”,当然我不会傻到自己去重写,可以借用。还可以自己增加一些特殊的验证器(在开发中常用到,如比较验证器用来比较两个input text值==,<,>...,有一些输入有or的关系,如可以输入数字也可以输入字母等,有一些有数组输入,如可编辑表格的text的name会的 user[0].name 等)。

但关键的地方是:验证器里如何获取输入的值?ActionContext!使用ActionContext的ognl语法,可以从当前的value stack中findValue("user.name")...等

但是:

Struts2 线程安全, ActionContext 这个类可以在任何地方直接调用,从里面获取request parameters等变量,而不会造成多用户的线程安全,数据混乱的情况?

Threadlocal的使用,是否说明ActionContext 可以在我的validator中任意使用????
2010年1月13日 16:48
目前还没有答案

相关推荐

    struts2 API帮助文档

    Struts2是一个强大的Java web应用程序框架,用于构建MVC(模型-视图-控制器)架构的应用。这个API帮助文档是开发者在使用Struts2框架时的重要参考资料,它详细阐述了框架的各种组件、类库和方法,有助于理解并有效...

    Struts2 学习 2

    Struts2是一个强大的Java web应用程序框架,用于构建和维护可扩展、易于维护的MVC(Model-View-Controller)架构的Web应用。本教程“Struts2 学习 2”将深入探讨Struts2的核心概念和技术,通过一系列文档帮助你掌握...

    Struts2初步使用总结

    - **ActionContextCleanUp**:这是一个可选过滤器,主要用于清理线程上下文中的`ActionContext`对象,对于Struts2与其他框架的集成非常有帮助。 - **StrutsPrepareAndExecuteFilter**:这是Struts2的主要过滤器,...

    struts2之xwork

    5. **ActionContext**:ActionContext是Struts2中的一个核心类,它封装了当前线程的上下文信息,如请求、响应、session等,为Action提供了访问请求数据和设置响应数据的途径。 在`xwork-2.0.5`这个压缩包中,包含了...

    Struts2超详细学习笔记分享(献给自学新人)

    2. **ActionContext清理**:每个请求都会经过ActionContext清理,确保线程安全,将请求与值栈关联。 3. **过滤器链**:其他过滤器执行,如数据校验,权限验证等。 4. **FilterDispatcher**:作为Struts2的前端控制器...

    Struts2中xwork源码

    通过深入学习XWork的源码,开发者能够理解Struts2框架的工作原理,优化性能,解决实际开发中的问题,同时也能为自定义插件和扩展提供基础。理解XWork的设计模式和核心机制,将有助于提升开发效率和代码质量,使项目...

    Struts2和Struts1的不同

    相反,Struts2通过一系列的拦截器和ActionContext来封装这些细节,这意味着Action可以不知道自己运行在一个Web环境中,从而提高了代码的可移植性和可测试性。 #### 四、单元测试的支持 **Struts1:** 在Struts1中...

    struts2源代码

    10. **生命周期管理**:理解Action、Interceptor等对象的生命周期,以及如何进行线程安全的处理。 通过研究Struts2的源代码,开发者不仅可以解决实际问题,还能提升对Java Web开发的理解,为自己的职业生涯积累宝贵...

    Struts2_0700_ActionAtrrParamInput

    ActionContext是线程安全的,每个请求都有自己的ActionContext实例。 - ValueStack是Struts2中另一个重要概念,它是Action对象的容器。当Action被创建并执行时,会被压入ValueStack。通过ValueStack,Struts2可以...

    struts-2.3.1.2源码

    通过结合这两个源码包,开发者可以更好地理解Struts 2的工作原理,调试问题,以及定制自己的功能模块。 总的来说,分析Struts 2.3.1.2源码对于深入理解MVC框架、Java Web开发和企业级应用设计具有重要意义。这不仅...

    Struts2中的xwork源代码

    2. **ActionContext**:在Struts2中,ActionContext是线程局部存储容器,用于保存请求相关的上下文信息,如值栈、参数、session和全局的属性等。它使得在不同组件间共享数据成为可能。 3. **ValueStack**:这是一个...

    struts2国际化+简单的标签+用户注册和登录

    Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展、模块化且易于管理的企业级应用程序。在"struts2国际化+简单的标签+用户注册和登录"这个项目中,我们将探讨以下几个关键知识点: 1. **Struts2国际化**...

    struts2的工作原理

    - **Struts2**:采用了多实例模型,每个HTTP请求都会创建一个新的Action实例,这种方式减少了线程安全问题,提高了可维护性。 **1.3 视图技术** - **Struts1**:使用JSP作为默认视图技术,但缺乏对模板引擎的良好...

    struts-2.3.1.2-docs.zip

    5. **ActionContext**:它封装了请求、响应以及线程相关的上下文信息,提供了一种在Action之间共享数据的方式。 【struts2-plugins】包含了Struts2的扩展插件,这些插件可以增强框架的功能,例如: 1. **Struts2-...

    struts2 接收参数

    在每次请求处理时,Struts2都会创建一个新的ActionContext实例,并将其设置为线程局部变量,确保每个请求都有自己的独立上下文。 ValueStack是Struts2的一个重要概念,它是一个对象栈,用于在视图和模型之间传递...

    struts-2.1.8.1源码

    **XWork 2.1.6**:XWork是Struts 2的核心库,提供了一些基础服务,如对象容器、转换器、验证框架等。XWork的许多组件被Struts 2直接使用,如ActionContext、ValueStack和Interceptor等。 - **ActionContext**:...

    struts2核心类库

    3. **ActionContext**:在Struts2中,ActionContext存储了当前线程的请求和响应相关的上下文信息,包括请求参数、session、应用上下文等。它提供了方便的方法来获取和设置这些信息。 4. **ActionInvocation**:...

Global site tag (gtag.js) - Google Analytics