通常我们的表单在提交时都需要进行数据验证,而这在以前通常是用客户端的javascript进行过滤后再由服务器端的脚本进行验证,这样的缺点是移植性很差,每次都需要重新编写源程序,而struts框架则提供了一个很好的验证机制,它不需要再编写脚本,而是通过验证器进行验证.
struts验证又分为2种,一种是在ActionForm bean表单属性JavaBean的validate()方法中定义,在服务器断验证;另外一种则是通过验证器分别在客户端和服务器端进行双层验证.
1.在ActionForm Bean中验证:
首先需要介绍Struts的工作原理:
(1).用户从表单提交数据,JSF表现为:<html:form action="/login">,普通JSP表现为:<form action="/login.do">
(2),程序将通过Struts配置文件struts-config.xml的<action>节点下的path属性的值与form的action属性值进行匹配,如果配上了,程序将通过本action的name属性所对应的值与<form-bean>节点的name进行匹配,如果成功,则通过<form-bean>的type属性值找到ActionForm bean的类文件.
(3)如果action中的validate属性设置为true或yes的话,程序将调用ActionForm bean的public ActionErrors validate(ActionMapping mapp,HttpServletRequest req)方法进行验证,结果返回一个ActionErrors类型以便我们将其catch住.
(4)程序将ActionForm的各个属性做为参数传回给Action,Action再调用具体业务处理的JavaBean进行商业活动,再将程序转向View层的显示页面
具体方法:
1.创建表单login.jsp 由JSF实现
<%@taglig uri="http://jakarta.apache/struts-bean" prefix="bean"%>
<%@taglib uri=http://jakarta.apache/struts-html prefix="html" %>
<html:html>
<body>
<!--捕获验证信息-->
<html:errors name="loginName"/>
<html:form action="/login">
userName:<html:text property="userName"/>
passWord:<html:password property="passWord" redisplay="false"/>
<html:submit/><html:reset/>
</html:form>
<body>
</html:html>
2.建立ActionForm类 loginForm.java
public class loginForm extends ActionForm{
//定义属性,和表单里一致
private String userName,passWord;
public ActionForm(){
super();
}
//数据验证方法
public ActionErrors validate(ActionMapping mapp,HttpServletRequest req){
ActionErrors errors=new ActionErrors();
if(this.userName==null || this.passWord==null)
errors.add("loginName",new ActionError("errors.required","userName and passWord field));
return errors;
}
//定义相关属性的 getter和setter
public void setUserName(String userName){
this.userName=userName;
}
public void setPassWord(String passWord){
this.passWord=passWord;
}
public String getUserName(){
return this.userName;
}
public String getPassWord(){
return this.passWord;
}
}
3.定义Action类 loginAction.java
public class loginAction extends Action{
public ActionForward execute(ActionMapping mapp,ActionForm form,HttpServletRequest req,HttpServletResponse res)throws Exception{
LoginForm Form=(LoginForm)form;
req.setAttribute("form",Form);//将form对象实例写入当前请求中
return mapp.findForward("sucess");//转向输出页面
}
}
4.编写输出文件out.jsp
<%@taglib uri="/WEB-INF/struts-beans.tld" prefix="bean"%>
<%@taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@page import="com.liuhao.struts.loginForm" %>
<% loginForm form=(loginForm)request.getAttribute("form");
out.println("your name is "+form.getUserName());
out.println("your password is "+form.getPassWord());
%>
5.配置文件:struts-config.xml
在<form-beans>中定义formbean
<form-bean name="loginForm" type="com.liuhao.struts.loginForm">
<form-property name="userName" type="java.lang.String"/>
<form-property name="passWord" type="java.lang.String"/>
</form-bean>
在<action-mapping>中定义action
<action name="loginForm" path="/login" type="com.liuhao.struts.loginAction"
input="/index.jsp" validate="true">
<forward name="sucess" path="/out.jsp"/>
</action>
6.在application resource中定义:error.requires={0} is not allowed null
7.即可测试程序:"如果没有输入任何信息,login.jsp会输出:username and passWord field is not allowed null
注解: 这样的方式优点是:彻底了消除了脚本的存在,是程序得到了很好的分层,但是却也存在着移植性差的问题,因为每修改一次程序,都需要到loginForm中去修改validate方法.
********************
2.在验证器中验证
第一步,添加验证规则
(1)ActionForm继承 org.apache.struts.validator.ValidatorForm;
(2)ActionForm中无 validate() 方法;
(3)表单JSP页中加:
<html:form .... οnsubmit="return validateRegForm(this);">颜色字体一致,首字母大写
<html:javascript formName="regForm"/>
(4)在validation.xml中配置验证规则;
要想使用验证框架,要选择带验证的动态Form,所以在Struts-config.xml中添加内容:
<form-bean name="mldnForm"
type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="password" type="java.lang.String" /> //在表单文件中就需要先设置这两个输入框
<form-property name="name" type="java.lang.String" />
</form-bean>
现在就在配置文件validation.xml中添加验证规则:
<form-validation>
<formset>
<form name="mldnForm">
<field property="name" depends="required">
<arg key="err.name" resource="true"/>
</field>
<field property="password" depends="required">
<arg key="err.password" resource="true"/>
</field>
</form>
</formset>
</form-validation>
第二步,在资源文件中配置相应错误信息:
因此属性文件根据配置文件validation.xml中内容就需要添加如下内容:
err.name = /u59d3/u540d //姓名
err.password = /u5bc6/u7801 //密码
errors.required= <li> {0} /u4e0d/u80fd/u4e3a/u7a7a/uff01/uff01/uff01 //不能为空
第三步,配置struts-config.xml文件:
需要在相应action中添加一个validate属性,表示这个Form可以被动态验证,这时action如下:
<action
attribute="mldnForm"
input="/form/demo.jsp"
name="mldnForm"
path="/demo"
scope="request"
type="com.strutsAdv2.action.DemoAction"
parameter="status"
validate="true"/>
这时就配好了吗??还没有。因为该验证框架是一个组件,所以需要配置此组件:增加一个插件。那该如何写该插件呢??
1.新建,找到 Struts1.2中的Struts1.2 Plugin,然后next,
2.Plugin class选择:org.apache.struts.validator.ValidatorPlugIn
3.然后在该页面点击add添加属性:
property=pathnames,value=/WEB-INF/validator-rules.xml,/WEB-INF/validator-rules.xml
然后点完成,
这时在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>
该插件表示通过配置的路径就能找到验证规则文件位置。
说明:
1.validator-rules.xml
这个文件包含了一组验证规则,对所有struts应用都适用。一般情况不用修改这个文件,除非要修改或扩展默认规则。
2.validation.xml文件
这个文件是针对于具体struts应用的,他可以为应用中的ActionForm配置验证规则,而不用编码实现验证。