Struts1源码查看之validate

struts1中除了jsp提交表单的时候,会创建formBean,还会在jsp页面中使用html:form标签的时候会自动创建一个在form中关联的action所对应的formBean


在struts1中如果我们要利用validate框架去校验我们的formbean数据,在我们对于同一个formbean类使用不同的校验规则,那么我们可以使用访问的路径来配置他的校验规则,而不是去使用两个不同的formbean去配置两种不同的校验规则.而使用这个路径去校验的时候,我们的formbean继承的类就需要发生一点小小的变化,就是要继承validatorActionForm,而不再是传统的validatorForm.


还有我们可以不用去具体的编写formbean,而是使用动态formbean.在struts-config配置文件里,我们可以使用org.apache.struts.validator.DynaValidatorForm配置成formbean的type(类).然后设置好属性的类型,最后我们可以在action里使用这个formbean.

在validation.xml文件中,我们对于校验的formbean必须配置的时候必须要跟action中attribute属性指定的名称一样,如果在action中没有配置attribute属性,默认和formbean的名称一样.

因为在源代码中,是取到的存储在session中的attribute属性的值的.


validator框架支持javascript校验,生成javascript代码。

使用html:javascript标签

对于form标签,请使用html:form标签.


<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
 <set-property property="pathnames"
  value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
 <set-property property="stopOnFirstError" value="true"/>
 </plug-in>

在插件的配置中.对于stopOnFirstError的值,true表示在检查到第一个错误之后,就停止校验后面的.也就是要把第一个校验通过了才会执行第二个校验,也才会有第二个错误提示.

如果设置成了false,那么所有的规则都会被校验.如果我们使用alidator框架支持的javascript代码来校验我们可以发现,如果配置为false,就会弹出多个警告框,如果是true,就只会弹出一个框.


(自己的理解)

对于alidate.xml文件的解析:

form并不是我们理解的formbean,而是一组校验规则的名称.然后我们通过源代码可以知道,validator框架在拿到校验的时候是拿到路径path,然后找到与之对应的校验规则,如果action中关联的formbean是继承自validatorForm,那么就表示是按照formbean去找到校验规则,如果是继承了alidatorActionForm,那么就是按照请求的路径path去找校验规则.所以在validation.xml文件中的form不仅仅可以配置成formbean同名,还可以配置相关的路径.但是一定要注意把formbean继承的类搞对.


调用validator框架的大致过程是:

1. 加载配置文件.资源文件.

2. 创建一个validator校验类

3. 将需要校验的实例传入.

4. 调用validate()方法,校验

5. 得到结果.


在alidator框架的源代码中,随着张孝祥老师的视频,真的有一个bug,在validator类中的352行代码,在甚至参数的时候,应该是把form设置进去,而不是this.


在取参考参数的时候,根据源代码来看.

boolean org.apache.struts.validator.FieldChecks.validateMaxLength(Object bean, ValidatorAction va, Field field, ActionMessages errors, Validator validator, HttpServletRequest request)    //第802行代码

int max = Integer.parseInt(field.getVarValue("maxlength"));

这个跟var-name有关系.取到的是var-name所对应的值.

跟arg中的maxlength不是一个意思.这里的maxlength是指的var-name


<field property="password"
                   depends="required, minlength,maxlength">
               <arg   key="prompt.password" position="0"/>
               <arg   key="${var:minlength}" name="minlength"
                  resource="false"  position="1"/>
               <arg   key="${var:maxlength}" name="maxlength"
                  resource="false"  position="1"/>
               <var>
                   <var-name>maxlength</var-name>
                   <var-value>6</var-value>
               </var>
               <var>
                   <var-name>minlength</var-name>
                   <var-value>3</var-value>
               </var>
           </field>




在编写利用properties文件来配置文件上传路径的时候,想要做成可以在项目中配置文件存放的目录.这样做的好处就是可以防止用户提交一个危险的可执行文件,从而直接访问这个文件,对服务器造成影响.如果我们配置了另外的目录去存放,那么用户就不知道他上传的文件放在了哪个目录,也就不能直接访问了.(如果是没有配置存放目录的话,存放的文件会存放在项目的根目录下,很容易让用户访问.)

所以我们在写的时候,就去加载properties文件.但是这个目录的配置我们每次都要去读,那么如果我们每次都去加载类文件,对于项目,服务器的压力就会造成影响,那么我们自然而然的就想到了单例模式,这样我们就可以保证值加载一次properties文件,但这个是不能解决问题的.跟单例是没有关系的.

如果我们把配置文件放在了path的路径下.也就是class文件存放的地方.也就是我们编写Java源代码的目录下,我们就可以使用static静态代码块来加载这个类文件.从而能找到我们需要的配置文件信息.

但是我们如果把配置文件放在了web-inf目录下.这个就需要跟servlet容器交互才能加载到我们所需要的properties文件.然后利用servletListner来在容器启动的时候来加载properties文件.然后把properties文件的信息放到一个类的实例中,利用类的构造方法来加载properties,然后将这个类的实例利用setAttribute()放入servletContext中(setAttribute()),我们如果需要的时候,我们可以通过servletContext去getAttribute(),就能得到存放properties文件信息的实例,调用实例中的get方法就能得到我们所需要的properties文件的配置信息.

注意: 如果是要利用listener那么一定要注意最后要配置listener,在web.xml中注册.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值