客户端校验的主要作用是防止正常浏览者的误输入,仅能对输入进行初步过滤;对于恶意用户的恶意行为,客户端校验将无能为力。因此,客户端校验绝不可代替服务器端校验。当然,客户端校验也绝不可少,因为web应用大部分浏览者都是正常浏览者,它们的输入可能包含了大量的误输入,客户端校验把这些误输入阻止在客户端,从而降低了服务器的负载。
类型转换和数据校验的大致关系如下:类型转换是数据校验的前提。但是在很多时候,类型转换和数据校验是同时完成的。如果要求数据可以正常转换成有效的数据类型,则输入数据必须是合法数据,这就要求用户输入必须是合法数据。可以理解:类型转换的要求是输入校验的子集。
在struts中需要继承ActionSupport类,并重写validate()方法,一旦发现校验失败,就把校验失败提示通过addFieldError方法添加进系统的fieldError中,这与类型转换失败后的处理是一样的。在input视图对应的jsp页面中输出错误信息,应该在页面中增加如下代码:
<s:fielderror/>
前提是已加入标签库<%@ taglib prefix="s" uri="/struts-tags"%>
注意:即使类型转换失败,系统并不是直接返回input逻辑视图,依然会调用Action的validate()方法来进行输入校验。这一点,与前面介绍的类型转换失败处理后的处理是一致的。如果我们重写了Action的validate()方法,则该方法会校验所有的处理逻辑。为了实现校验指定处理逻辑的功能,Struts2的Action允许提供一个validateRXxx()方法,其中xxx即是Action对应的处理逻辑方法。同时需要在struts.xml中指定该方法。比如validateRegist()
<action name="regist" class="..." method="regist">
<result name="input">/regist.jsp</result>
<result name="success">/show.jsp</result>
</action>
不管用户向Action的哪个方法发送请求,Action内的validate()方法都会被调用。如果该Action内还有该方法对应的validateXxx()方法,则该方法会在validate()方法之前被调用。
Struts2的输入校验流程:
① 类型转换器负责对字符串的请求参数执行类型转换,并将这些值设置成Action的属性值。
② 在执行类型转换过程中可能出现异常,如果出现异常,将异常信息保存到ActionContext中,conversionError拦截器负责将其封装到fieldError里,然后执行第3步;如果转换过程中没有异常信息,则直接进入第3步。
③ 通过反射调用validateXxx(),其中Xxx是即将处理用户请求的处理逻辑所对应的方法名。
④ 调用Action类里面的validate()。
⑤ 如果经过上面4步都没有出现fieldError,将调用Action里处理用户请求的处理方法;如果出现了fieldError,系统将转入input逻辑视图所指定的视图资源。