Posted on 2006-09-25 20:50 
kook 阅读(4933) 
评论(2)  编辑  收藏  所属分类: 
Struts 
			 
			
		 
		
		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.