struts2输入校验(1)基于代码的输入校验
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" class="com.test.action.LoginAction">
<result name="success">/success.jsp</result>
<result name="input">/input.jsp</result>
</action>
struts2遇到这样的配置项,就会自动去执行action里的execute方法。
但有些情况下,往往一个action里拥有多个业务逻辑方法,譬如申请表模块,就有新建、编辑、保存、删除、导出等业务逻辑。在这种情况下,就可以在action里增加多个方法来处理业务逻辑。代码如下:
public class ReprotAction extends ActionSupport
{
//忽略属性
public String newReport() throws Exception
{//}
public String modifyReport() throws Exception
{//}
public String saveReport() throws Exception
{//}
public String deleteReport() throws Exception
{//}
}
在配置struts.xml文件的时候,在action元素中指定method属性,代码如下:
<action name="newReport" class="com.test.action.ReportAction" method="newReport">
<result name="success" type="freemarker">/modifyReport.ftl</result>
</action>
<action name="modifyReport" class="com.test.action.ReportAction" 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级别的错误消息