一、ActionForm的数据校验
ActionForm的代码校验是最基本的校验方式,这种校验方式是重写ActionForm的validate方法,在该方法内对所有的字段进行基本校验。如果出现不符合要求的输入则将出错提示封装在ActionError对象里,最后将多个ActionError组合成ActionErrors对象该对象里封装了全部的出错信息。
public class LoginForm extends ActionForm implements Serializable{
private String username = null;
public String getUsername(){
return username;
}
public void setUsername(String username){
this.username = username;
}
public ActionErrors validate(ActionMapping mapping,HttpServletRequest request){
ActionErrors errors = new ActionErrors();
if (username == null){
errors.add("username",new ActionError("error.username","用户名"));
}
}
}
以上方法重写了validate方法,在validate中对每个需要校验的域完成校验,如果没有通过校验,则包装成ActionError。但是ActionErrors和ActionError都是Struts不再推荐使用过的类。因此一般不用这种方法。
注意:使用ActionForm的输入校验时,应为对应的action元素添加input元素,该属性指定当校验失败后返回的页面。
二、Action的代码校验
在Action里通过代码完成输入校验,是最基本,也是最容易使用的方法,与最初的MVC相似,在调用该业务逻辑之前,先对数据进行基本校验,这是最原始的方法。
在Action里完成校验,实际就是在execute方法的前面增加数据校验代码。
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response)throws Exception {
LoginForm loginForm = (LoginForm)form;
String username = loginForm.getUsername();
if (username == null || username.equals("")){
return mapping.findForward("input");
}
return mapping.findForward("success");
}
}
这种方法非常容易理解,所有代码都需要程序员自己控制,相当灵活,但是:
1.需要写大量代码,程序变得烦琐。2、数据校验应该在填充ActionForm里完成,最好能在客户端里校验,不应该推迟到Action里才完成校验。
三、Validator验证框架
Struts的validator校验功能非常强大,几乎不需要写任何代码,不仅可以服务器完成校验,同时也可以完成客户端校验(javaScript提示)
优点:这种方式带来的好处,不用写相关的类以及代码,想改验证规则改改配置文件就行了以前验证的规则需要写到某个类中,这样验证规则和具体的逻辑分离了,
缺点:配置文件写错了,很难发现,编译不了,在运行期才知道
使用Struts的validator验证框架需要配置
1. 加入国际化资源文件并且把国际化配置放在struts-config.xml文件中。
#下面定义了页面的国际化标题
button.submit=提交
prompt.username=用户名称
prompt.password=登录密码
#下面定义了标准错误提示
errors.required={0},是必须的.
2. 引入validator插件在struts-config.xml中,并且把validation.xml和validator_rules.xml文件配置好。经过validation.xml定义的规则,Struts就知道了每个表单域都应该满足那些规则,如果满足规则就不会提交给Action处理
<form-validation>
<formset><!--所有需要校验的form都防止formset元素中-->
<!--需要校验的表单,必须和Struts配置文件中ActionForm相同-->
<form name="loginForm">
<!--每个field定义一个表单域的(填写用户名表单域):1.必填,2匹配正则表达式-->
<field property="username" depends="required">
<!--定义出错字符串的第一个参数的值-->
<arg key="prompt.username"/>
</field>
<field property="password" depends="required,mask">
<arg key="prompt.password"/>
<!---->
<var>
<var-name>mask</var-name>
<var-value>^[0-9a-zA-Z]*$</var-value>
</var>
</field>
</form>
</formset>
</form-validation>
3. 加载的校验规则文件有两个:validator-rules.xml和validation.xml
Validation-rules.xml是由Struts提供,validation.xml文件是由程序员书写,定义了表单域必须满足的规则。
注意:如果不满足规则是,系统将返回到那个页面,可以通过struts-config.xml指定,配置action时,有个input属性,该属性就是不满足时跳到的页面,另外还得给action元素添加validate=“true”属性。如下:
<action-mappings>
<action path="/login1"
type="com.bjpowernode.struts.LoginAction"
name="loginForm"
scope="request"
validate="true"
input="/login1.jsp"
>
<forward name="success" path="/login_success.jsp"/>
</action>
4. 继承ValidationForm的校验
public class LoginForm extends ValidatorForm{
private String username;
//下面是属性的getter和setter方法
}
5. 弹出客户端JavaScript提示,这种是客户端校验的规则,如果不用JavaScript提示就是服务器端的校验。
需要弹出客户端JavaScript校验非常简单,无须修改其他配置文件,只需修改登录使用过的JSP页面的两个地方。
(1).为form元素增加οnsubmit=”return validateXXXForm(this);”属性,其中XxxForm就是需要校验的form名,与struts-config.xml中配置form-bean的那么属性一致,也与validation.xml中校验的form的name一致。
(2).增加<html:javascript formName=”xxxForm”>,xxxForm就是需要校验的form名
<html:javascript formName="loginForm"/>
<html:form action="login2.do" οnsubmit="return validateLoginForm(this)">
username : <html:text property="username"/><br/>
password : <html:password property="password"/><br>
<html:submit/>
</html:form>