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
目前还没有答案

相关推荐

    ActionContext介绍(在Struts2中)

    在Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话 (Session)的一些信息, 甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应...

    struts2中的ActionContext与ognl

    NULL 博文链接:https://lijiejava.iteye.com/blog/628636

    基于struts2注册登录ActionContext.zip

    struts2大量使用拦截器来处理请求,从而允许与业务逻辑控制器 与 servlet-api分离,避免了侵入性(所谓侵入性就是指的这个架构设计出来的部件对系统的影响范围,标签库几乎可以完全替代JSTL的标签库,并且 struts2.x...

    Struts2 in action中文版

    10.1.2 Struts 2工作流中的验证框架 219 10.2 将动作关联到验证框架 222 10.2.1 使用ActionClass-validations.xml声明验证元数据 223 10.2.2 研究内建的验证器 226 10.3 编写自定义验证器 227 10.3.1 检查密码强度的...

    struts2OGNL表达式ActionContext及valuesStack.pdf

    struts2OGNL表达式ActionContext及valuesStack.pdf

    struts2流程与流程图

    一个请求在Struts 2框架中的处理大概分为以下几个步骤。  客户端提交一个(HttpServletRequest)请求,如上文在浏览器中输入 http://localhost: 8080/bookcode/ch2/Reg.action就是提交一个(HttpServletRequest)...

    struts2_OGNL表达式ActionContext及valuesStack

    struts2 OGNL,struts2 表达式语言,Struts2 中OGNL表达式的用法,Struts2 #,表达式语言的好处,Struts2 $,struts2 井号,星号,百分号

    Struts2中Servlet的配置

    2、使用struts2提供的ActionContext类直接获取Servlet API。 在同一个项目中,如果既用到servlet又用了struts框架,运行项目时可能无法正常使用servlet,解决办法如下: 该类是定义了一个过滤器,当既用到struts2...

    Struts2通过使用ActionContext类获取request和response对象

    NULL 博文链接:https://zhouhaitao.iteye.com/blog/1126042

    Struts2 学习笔记

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 八、 Action通配符(wildcard)的配置 9 ...

    西安领航核心项目Struts2重点、难点总结

    对Struts2框架中的相关知识还有困惑的同学有福了,此次上传的是西安领航何足道老师的核心项目Struts2部分的重点难点的归纳总结,他对Struts2理解非常深刻,讲的非常的详细易懂,堪称经典。主要包括的知识有Action的...

    Struts2整合SiteMesh技巧

    注意ActionContextCleanUp过滤器必须在FilterDispatcher之前配置,ActionContextCleanUp的主要功能是通知FilterDispatcher执行完毕不要清除ActionContext,以便sitemesh装饰器可以访问Struts值堆栈。 配置装饰器 ...

    struts2-junit-plugin-2.1.8.jar

    可解决java.lang.NoSuchMethodError: com.opensymphony.xwork2.ActionContext.get(Ljava/lang/Object;)Ljava/lang/Object; java.lang.ClassNotFoundException: com.opensymphony.xwork2.util.TextUtils struts2.1.8...

    Struts2帮助```````

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 八、 Action通配符(wildcard)的配置 9 ...

    struts2验证码完整实例

    通过ActionContext.getContext().getSession().put("random", randomNum.getRandomCode())将数字存放到session当中 2、当你登录时候,提交的输入框中的验证码和session中存放的验证码比较,如果一样,则通过,不一样,则...

    Struts2_TypeConvertion

    这种方式主要是利用了com.opensymphony.xwork2.ActionContext类以及org.apache.struts2.ServletActionContext类,具体的方法如下所示。 获得request对象: A . HttpServletRequest request = ServletActionContext....

    struts学习笔记(3)

    当客户端向action发送请求并且最后跳转到另外一个页面的时候,在跳转的同时,struts2框架会帮我们自动把需要传到页面的值放这两个对象当中去,然后我们在页面就可以使用固定的方式把值从这个两个对象里面取出来了。...

    ActionContext在struts2.0中的详细应用

    ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放放的是Action在执行时需要用到的对象

    精讲Struts2

    精简全面讲解Struts 2.0Struts2产生背景 工作原理 实现步骤 标签 命名空间 转换器 国际化 输出 令牌机制 拦截器 表单校验(jQuery.validate验证框架) 上传 下载 OGNL(ActionContext StackContext ValueStack区别)

    Struts2 ActionContext 中的数据详解

    主要介绍了Struts2 ActionContext 中的数据详解,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics