struts1的验证(valicate.xml方式)

本文详细介绍Struts1.3中四种不同验证形式的配置与使用方法,包括静态FormBean与动态FormBean的配置差异及验证流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

struts1.3中测试通过。

 

1.采用静态formbean,写一个formbean类,但不写其中的validate方法。

 

========================================

 

 

struts.xml

 

<struts-config>

 

<form-beans>

<form-bean name="loginForm" type="com.netshop.formBeans.LoginForm">

<form-property name="username" type="java.lang.String"/>

</form-bean>

</form-beans>

 

<action-mappings>

<action path="/login" type="org.springframework.web.struts.DelegatingActionProxy"

name="loginForm" input="/index.jsp" validate="true">

<forward name="success"  path="/views/welcome.jsp"/>

<forward name="failure"  path="/index.jsp"/>

</action>

</action-mappings>

 

<message-resources parameter="com.netshop.action.ApplicationResources" />

 

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">

<set-property property="pathnames" 

value="/org/apache/struts/validator/validator-rules.xml,

/WEB-INF/validation.xml"/>

</plug-in>

 

</struts-config>

======================================================
valicate.xml
<formset>
<form name="loginForm">
<field property="username" depends="required">
<msg name="required" key="errors.required"/>
<arg key="userName.error"/>
</field>
</form>
</formset>
===================================================
action类
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
LoginForm loginForm = (LoginForm)form;
String username = loginForm.getUsername();
System.out.println(username);
return mapping.findForward("failure");
}

 

 

 

2.采用动态formbean, 不写formbean类。

 

===================================================

 

struts.xml

 

<struts-config>

 

<form-beans>

 

<form-bean name="loginForm" type="org.apache.struts.validator.DynaValidatorForm">

<form-property name="username" type="java.lang.String"/>

</form-bean>

 

</form-beans>

 

<action-mappings>

<action path="/login" type="org.springframework.web.struts.DelegatingActionProxy"

name="loginForm" input="/index.jsp" validate="true">

<forward name="success"  path="/views/welcome.jsp"/>

<forward name="failure"  path="/index.jsp"/>

</action>

</action-mappings>

<message-resources parameter="com.netshop.action.ApplicationResources" />

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">

<set-property property="pathnames" 

value="/org/apache/struts/validator/validator-rules.xml,

/WEB-INF/validation.xml"/>

</plug-in>

 

</struts-config>

 

 

此处的动态frombean还可以是DynaValidatorActionForm,它们的区别是一个面向frombean,一个面向action.

用简单的话说,这2者写法上的区别在于这3个地方:
1)struts-config.xml:ActionForm type应分别为org.apache.struts.validator.DynaValidatorForm和org.apache.struts.validator.DynaValidatorActionForm
2)Action里的分别使用为:DynaActionForm addLoginMemberForm = (DynaActionForm) form;和DynaValidatorActionForm addOrdersForm = (DynaValidatorActionForm) form;
3)validation.xml里:DynaValidatorForm引用form的方法是如addLoginMemberForm,用名称,而DynaValidatorActionForm是使用spring里注册的action路径:/addOrders
很多时候将一个ActionForm公用到多个Action上(两者通过name属性来关联),这时麻烦出来了.由于不同业务处理对数据的有效性验证的要求略有不同,这对处理数据验证的validator框架提供了一个要求----如何根据不同的业务请求,对同一个ActionForm进行不同的数据验证了?

使用DynaValidatorActionForm,校验是根据action元素的path属性值来区分FormBean,而action元素的path属性值正是不同action区分的唯一标记,这样根据不同的action我们对同一个ActionForm给出不同的验证规则了

 

======================================================
valicate.xml
<formset>
<form name="loginForm">
<field property="username" depends="required">
<msg name="required" key="errors.required"/>
<arg key="userName.error"/>
</field>
</form>
</formset>
===================================================
action类
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
DynaValidatorForm loginForm = (DynaValidatorForm)form;
String username = (String)loginForm.get("username");
System.out.println(username);
return mapping.findForward("failure");
}
因为采用了动态form,所以在action类中要把参数中的form转换成动态form类,再使用get方法获取form中的属性。
=========================================================
=========================================================
下面是转帖
Struts1.2中创建验证框架的步骤:

1、在struts-config.xml文件中添加下列内容:
< plug - in className = " org.apache.struts.validator.ValidatorPlugIn " > 
          < set - property property = " pathnames "  value = "  /WEB-INF/validator-rules.xml,
                                                                  /WEB-INF/validation.xml "   /> 

</ plug - in >

注意:这些内容必须放在<message-resources>元素之后。该规则是由
http://struts.apache.org/dtds/struts-config_1_2.dtd  "文件制定的。

2、创建相关的组件:

为了实验的目的,我依次创建4个ActionForm类,一个JSP,一个Action类,以下是他们在struts-config.xml中的配置信息:
 1 <form-beans > 
 2     <form-bean name="DVForm" type="org.apache.struts.validator.DynaValidatorForm"> 
 3       <form-property name="name" type="java.lang.String" /> 
 4     </form-bean> 
 5     <form-bean name="DVAForm" type="org.apache.struts.validator.DynaValidatorActionForm"> 
 6       <form-property name="name" type="java.lang.String" /> 
 7     </form-bean> 
 8     <form-bean name="VForm" type="com.kook.struts.form.HahaForm" /> 
 9     <form-bean name="VAForm" type="com.kook.struts.form.HohoForm" /> 
10   </form-beans> 
11  
12   <global-exceptions /> 
13   <global-forwards /> 
14   <action-mappings > 
15     <  action
16       attribute="DVForm"
 

17       input="/form/index.jsp" 
18       name="DVForm" 
19       path="/index" 
20       scope="request" 
21       type="com.kook.struts.action.IndexAction" /> 
22   </action-mappings>

其中
<form-bean name="VForm" type="com.kook.struts.form.HahaForm" />是ValidatorForm类的子类
<form-bean name="VAForm" type="com.kook.struts.form.HohoForm" />是ValidatorActionForm类的子类

下面是JSP页面代码:
1 <html:form action="/index" onsubmit="return validateDVForm(this)"> 
2             name : <html:text property="name"/><html:errors property="name"/><br/> 
3             <html:submit/> 
4  </html:form> 
5  <html:javascript formName="DVForm"/>

因为只是做表单验证,action类可以不用涉及,因此不列出action类的代码啦!

3、删除name="VForm" 和name="VAForm"的ActionForm中的validate方法。

因为这两个类不是动态的验证类,在使用向导生成代码的时候会自动覆盖父类的validate方法。如果不删除的话,根据类的多态性原理,会调用他们生成的validate方法,而不调用他们父类的该方法。但是,实际上,是他们父类的validate方法调用了validator框架的验证方法,因此我们没有必要再去重写他的这个方法。同时也要记得删除,因为向导生成的是空实现,不删除的话,起不到验证作用。切记切记!!!曾经在这吃啊担子滴!! 

观察以上代码不难发现,表单中只有一个文本框,因此实验也是对这个文本框进行验证。

4、创建自定义的验证文件validation.xml,主要内容如下所示:
 1 <form-validation>      
 2     <formset>
 

 3         <form name="DVForm"> 
 4             <field property="name" depends="required"> 
 5                  
 6                 <arg0 name="required" key="lable.name"/> 
 7             </field> 
 8         </form> 
 9     </formset> 
10 </form-validation>

其中key="lable.name  "在资源文件中对应的内容为:lable.name=name,因此,当文本框中没有输入任何信息而提交的时候,将会反馈一条name is required.的信息。

下面开始实验,
实验的目的是:依次使用4种验证Form来实现表单的验证功能,
他们分别是:DynaValidatorForm,DynaValidatorActionForm,ValidatorForm,ValidatorActionForm。这也是前面为什么要创建4个ActionForm的目的,详细配置信息见前面struts-config.xml
而JSP页面只有一个,就是配置文件中的input="/form/index.jsp
 
"

实验一:由DynaValidatorForm的子类DVForm来验证



validation.xml的内容为:
 1 <form-validation>      
 2     <formset>
 

 3         <form name="DVForm"> 
 4             <field property="name" depends="required"> 
 5                  
 6                 <arg0 name="required" key="lable.name"/> 
 7             </field> 
 8         </form> 
 9     </formset> 
10 </form-validation>

struts-config.xml的内容为:
15     <  action
16       attribute="DVForm"
 

17       input="/form/index.jsp" 
18       name="DVForm" 
19       path="/index" 
20       scope="request" 
21       type="com.kook.struts.action.IndexAction" /> 
22   </action-mappings>

/form/index.jsp的主要内容为:
1         <html:javascript formName="DVForm"/> 
2         <html:form action="/index" onsubmit="return validateDVForm(this)">

< html:javascript formName = " DVForm " />的formName属性对应的是进行验证的ActionForm的name属性。onsubmit="return validateDVForm(this)"为固定写法,格式为:onsubmit="return validateXXX(this)",XXX为Form的name属性,其中首字母大写就可以了。

实验二:  由ValidatorForm的子类VForm来验证

他的配置信息只需要将实验一中底色为黄色高亮部分的DVForm换成VForm就可以了,他们的区别只在于一个是动态的,一个是非动态的。


实验三:由DynaValidatorActionForm的子类DVAForm来验证

该实验的配置信息只需要将实验一struts-config.xml中底色为黄色高亮部分的DVForm换成DVAForm就可以了,其次是修改validation.xml的内容,具体如下:

1  < form - validation >     
2       < formset >
3           <form name="/index">
4               < field property = " name "  depends = " required " >
5                   < arg0 name = " required "  key = " lable.name " />
6               </ field >
7           </ form >
8       </ formset >
9  </ form - validation >

区别是<form name="/index">中的name属性不再对应的是验证Form的name属性,而是其相对的action类的path属性

实验四:由ValidatorActionForm的子类VAForm来验证

与实验三一样,换掉struts-config.xml中底色为黄色高亮部分的DVAForm换成VAForm就可以了,validation.xml文件中的内容与实验三保持一致,<form name="/index">中的name属性不再对应的是验证Form的name属性,而是其相对的action类的path属性。

不过用DynaValidatorActionForm和ValidatorActionForm的时候好象不能使用客户端验证,只能使用服务器端验证。还得有高手指点,因此前台JSP页面得改成:

1           < html:form action = " /index " >
2              name :  < html:text property = " name " />< html:errors property = " name " />< br />
3               < html:submit />
4           </ html:form >

下面来介绍一下validation.xml文件中的一些元素信息:

1、<global>中定义的<constant>和<formset>中定义的<constant>
前者表示在全局范围内定义常量,可以在validation.xml文件中的其他<formset>中访问。访问格式为${constantName}
后者表示局部的常量定义,只能在声明他的<formset>中使用。

2、<field>元素中的几个子元素:
<!ELEMENT field (msg|arg|arg0|arg1|arg2|arg3|var)*>
也就是说他的所有子元素都可以是0-n个,这一点和孙卫琴的书有出入,以此为准。

msg元素
<msg name="" key="" bundle="" resource=""/>

name:表示验证规则的逻辑名;
key:对应资源文件中的key;
bundle:指定从哪个资源文件获取key值,缺省时为默认的资源文件;
resource:为true是表示从资源文件中获取key属性对应的信息,为false时表示直接显示key属性的内容,和资源文件无关。缺省为true。

Strust框架中指定了一些常用规则的对应文本,验证框架默认是从这些对应的文本中读取信息。但是我们可以通过指定msg元素来从自定义的资源文件或者是key中来获取消息。

arg.....元素用来指定复合文本中的参数,依次对应。他们的属性和msg的属性很相似,用法也是一样的。

var元素
 1       < formset >
 2           < form name = " /index " >
 3               < field property = " name "  depends = " required " >
 4                   < arg0 name = " required "  key = " ${var:required} "  resource = " false " />
 5                   < var >
 6                       < var - name > required </ var - name >
 7                       < var - value > xx </ var - value >
 8                   </ var >
 9               </ field >
10           </ form >
11       </ formset >


如果执行了该验证的话,输出的结果为:xx is required.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值