struts2输入校验(一)基于代码的输入校验
struts2的输入校验针对输入进行业务规则的校验,譬如是否必填、字符长度、是否是邮箱格式、是否是电话格式、手机格式等等。
struts2的校验分为两种,第一种是基于代码的,就是在action中编写validate方法进行校验;第二种就是基于xml的,就是编写配置文件让struts2框架进行调用校验。
?
?????????????????????????????????????? (一)基于代码的输入校验
再熟悉以下类型转换与输入校验的流程:
1、首先struts2对客户端传来的数据进行类型转换。struts2不能进行类型转换的时候,struts2框架会自动生成一条错误信息并将该错误信息放到addFieldError里面。
2、类型转换完毕后,不论类型转换成功与否都要执行action的validate方法。由validate方法进行业务规则的输入校验。
3、如果类型转换和输入校验都没有错误发生,那么进入execute方法(业务逻辑)。
?
所以对action进行输入校验,只需要重写action的validate方法即可。既可以调用addFieldError,也可以调用addActionError进行业务规则校验。
?
——————————————————————————————————————————————————,
在struts2中默认情况下一个action只拥有一个业务逻辑方法execute。因此在struts.xml文件中,经常可以看到这样的配置项:
<action name="login" method="newReport">
????? <result name="success" type="freemarker">/modifyReport.ftl</result>
?</action>
??<action name="modifyReport" method="modifyReport">
????? <<result name="success" type="freemarker">/modifyReport.ftl</result>
?</action>
//省略
现在有多个业务逻辑方法,应该针对每个业务逻辑进行校验。但现在只有一个validate方法,不可能把所有业务逻辑的验证都放在validate方法里。怎么办呢?struts2为我们解决了这个难题,就是针对每个业务逻辑方法增加一个validate方法,方法的命名规则如下validate+方法名(方法的第一个字母大写),譬如validateNewReport();这样在validateNewReport方法添加的校验就针对newReport方法了。但是这里要特别注意的是,如果action中重写了validate方法,那么validate方法都会被调用。
以newReport为例,action方法的调用顺序如下:validateNewReport()->newReport()->validate()
因此在这种情况下,不要重写validate方法。但是这有牵涉到一个问题,如果不写validate方法,那execute方法如何校验呢?按照上面的规则,只要编写一个validateExecute方法进行校验就可以了。
?
在输入校验的过程中,调用addFieldError()和addActionError()方法,把错误保存起来。至于采用哪个方法根据项目和自己的需要进行选择。
要显示这些错误,可以在输入页面中增加如下代码:
<s:fielderror/>显示field级别的错误消息
<s:actionerror/>?显示action级别的错误消息
?????
?