校验浅谈

来源:互联网 发布:netbeans php教程 编辑:程序博客网 时间:2024/04/30 03:44
 

在Web应用程序中,为了防止客户端传过来的数据引发程序的异常,我们需要对用户输入的数据进行校验。对用户输入数据进行校验分为两个部分:一是校验输入数据的有效性;二是在用户输入了无效的数据后向用户提示错误消息。
Struts2输入校验是建立在类型转换的基础之上,即先进行类型转换,再进行输入校验。它同时支持服务器端校验与客户端校验。客户端校验一方面可以为服务器端过滤数据,另一方面可以减少网络流量,降低服务器端程序的运行负载。服务器端校验除了要重复客户端的校验,还可以包括数据逻辑的校验,例如注册用户名是否重复、验证码是否匹配等。

Struts2输入校验的实现方式:
Ⅰ、编写Java代码进行手动输入校验
Ⅱ、配置XML文件使用校验框架
Ⅲ、使用校验注解

 

第一种方式:编写Java代码进行手动输入校验。

当使用Struts2框架提供的校验机制时,自定义的Action需要继承com.opensymphony.xwork2.ActionSupport。

1、在Action的execute()方法中进行校验
.........//省略了部分代码
this.addFieldError(String fieldName, String errorMessage)
.........//省略了部分代码
if(this.hasFieldErrors()){
 return INPUT;
}
.........//省略了部分代码


2、重写Action的validate()方法进行校验。
.........//省略了部分代码
this.addFieldError(String fieldName, String errorMessage)
.........//省略了部分代码

对校验提示消息国际化:
getText(资源文件中的key);
getText(资源文件中的key, 资源文件中value需要传递的参数值);

执行convertFromString方法。。。。。。。。
执行validate方法。。。。。。。。
执行execute方法。。。。。。。。

当执行完validate()方法后,如果校验通过就会调用execute()方法。此外用户可以自定义业务逻辑方法代替execute()方法。


3、使用自定义业务逻辑方法时,可以编写validateXxx()方法进行校验。

自定义业务逻辑方法时需要在struts.xml中配置action的method属性。例如action中自定义了myTest()方法,在struts.xml中配置如下:

<action name="register" class="com.struts2.action.RegisterAction" method="myTest">

当客户端向register.action发出请求之后,系统就会自动调用RegisterAction类的myTest()方法进行相应的业务逻辑处理。因此在一个action中可以处理多个业务逻辑。

当action中封装了不同的业务逻辑方法时,对不同的业务逻辑方法可以提供不同的校验规则,Struts2支持这种机制的实现。校验方法的命名规则:

校验方法以validate开头,加上对应业务逻辑方法的方法名,方法名的第一个字母大写。

例如:action中有一个业务逻辑方法是myTest(),则可以对应的提供一个validateMyTest()方法对其进行校验。

validateXxx()方法是由DefaultWorkFlowInterceptor拦截器(已包含在defaultStack拦截器栈中)调用的。


4、类型转换与输入校验的流程
执行convertValue()方法........类型转换
执行validateMyTest()方法......相应业务逻辑方法的校验
执行validate()方法............父类中的校验
执行myTest()方法..............执行业务逻辑方法

(1)、类型转换器负责对字符串的请求参数执行类型转换(type conversion),并将这些值设置成action的属性值;

(2)、在转换过程中若出现类型转换错误,则将错误消息保存到ActionContext中,conversionError拦截器将消息封装到fielderror中;
 
(3)、类型转换完成后再进行输入校验,输入校验时通过反射调用validateXxx()方法;

(4)、然后调用validate()方法;

(5)、如果校验未出现错误,则转入用户请求的处理方法(比如execute()方法、myTest()方法);如果出现错误,则转入input视图所指定的页面(所以,对于校验的方法必须要在配置文件中为其指定input result)。

【注意的几点】
a:如果类型转换错误,同样会进行输入校验。

b:遇到类型转换错误的时候(也就是说不能成功进行类型转换),Struts2框架会自动生成一条错误消息,并且将该错误消息放到fielderror中。

c:当把错误消息存放在fielderror中,如果使用的是HTML form,则需要在input视图所指定的页面中添加<s:fielderror/>标签;如果使用的是Struts2 form标签,并且form中的theme属性为xhtml(默认值),则无需添加<s:fielderror/>标签。当把错误消息存放在actionerror中时,不管使用的是何种form表单,都需要在input视图所指定的页面中添加<s:actionerror/>标签。

d:当action中提供了validate()方法时,不管有没有其它的校验方法,validate()方法都将会执行。

e:如果不需要每次都执行validate()方法,而又要保证execute()方法也有对应的校验方法,可以在action中删除validate()方法,提供validateExecute()方法。


5、actionerror、actionmessage和fielderror标签
actionerror:输出action级别的错误消息 <s:actionerror>
actionmessage:输出action级别的一般性消息 <s:actionmessage>
fielderror:输出action中全部字段或者指定字段的错误消息 <s:fielderror>
<s:fielderror fieldName="fieldName"/>
<s:fielderror><s:param value="'fieldName'"/></s:fielderror>


6、关于Struts2中form标签的theme(主题)属性:

(1)、form标签的theme属性用于设置Struts2中form的主题,默认为xhtml,还包括simple和ajax。

theme=xhtml时:默认会额外生成table、tr、td。

theme=simple时:会生成标签所对应的html标签形式。

在默认情况下,表单元素是分布在不同行的。如下代码:

<s:form action="login">
    <s:textfield name="username" label="用户名"/>
    <s:password name="password" label="密码"/>
    <s:submit label="提交"/>
</s:form>

以上的代码跟HTML代码差不多,但是因为Struts2表单默认将表单内的每一个元素都分在单独的一行,label属性就如同我们HTML中在<input type="text"/>前面的文字标签一样。如果我们不想让它自动换行,那就应该写成如下格式:

<s:form action="login" theme="simple">
    <s:textfield name="username" label="用户名"/>
    <s:password name="password" label="密码"/>
    <s:submit label="提交"/>
</s:form>

但在设置theme="simple"后,表单元素的label属性将失效,这时我们就需要在表单元素前面加入要显示的文字。如下代码:

<s:form action="login" theme="simple">
      用户名:<s:textfield name="username" label="用户名"/><br/>
      密码:<s:password name="password" label="密码"/><br/>
    <s:submit label="提交" value="提交"/>
</s:form>

此时不会显示label属性的值,而是显示表单元素前面的文字。提交按钮如果没有指定value属性则显示它原来的默认值:Submit。

(2)、修改form标签theme属性值的两种方法:

在html页面中使用Struts2的UI(User Interface,用户界面)tag时一般可把theme设置为simple。如果在每个tag都如此设置比较麻烦,此时可以采用以下两种方法修改theme属性的默认值:

①:在struts.xml文件中修改struts.ui.theme的默认值:<constant name="struts.ui.theme" value="simple"/>

②:在类路径下面新建struts.properties,并添加如下内容:struts.ui.theme=simple

或者将struts-core*.jar文件中的template解压出来,然后把它放到项目的WEB-INF下,在struts.properties添加以下内容:
struts.ui.theme=simple
struts.ui.templateDir=WEB-INF/template
修改simple下的fielderror.ftl文件,将该文件中的<li>和</li>删除。


7、类型转换错误提示消息与表单输入校验提示消息同时出现的问题:

将Struts2中form标签的theme属性值设为simple,从actionerror中获取提示消息。