了解了ActionForm一些知识点以后,接下来是有关ActionForm中另外一个方法validate的学习。这个方法是用来检验相关的属性的,是在数据填充好后进行的。这个方法一般是对成员变量的数据进行校验,比如用户名不能为空、密码长度必需大于6位等等。需要注意的是,这都是在服务器端校验,和客户端校验是不同的。虽然一般都提供客户端的校验,但是服务器端的校验是不能少的,因为客户端校验是很容易就被绕过的,比如正常情况下有些用户将浏览器脚本程序给禁用了,这时候客户端校验就失效了,还有非正常的情况的是可以再客户端模拟发送请求到服务器,这样会给服务器端导致严重的安全问题。因此,服务器端校验是必不可少的。
阅读struts的api文档,里面对validate方法的描述如下:该方法能够被用来校验已经为HTPP请求设置好的属性值,它返回一个包装了被找到的校验错误的ActionErrors对象。如果没有错误被发现,将返回null值或者返回一个没有错误信息的ActionErrors对象。在前面的例子中已经发现,默认情况下struts会调用校验方法,但是父类中的校验方法返回是null,即什么也不做。所以如果不需要校验就可以在配置文件中在相应的<action>元素配置validate属性为false,这样就不会调用校验方法了。同时,如果需要校验,就要在Action中重写校验方法进行相应的校验。
学习struts原理到现在,就会发现配置文件的作用是使ActionServlet、ActionMapping、Action、ActionForm这几个不同层次的之间相互协调工作。这些配置文件是在应用程序启动的时候,读入导入内存中供控制器使用的。前面已经讲解配置文件中的大部分的元素及其属性,其中<action>元素还有两个属性需要提及一下。一个是attribute属性,一般情况下是不会用到它的,这里只是了解一下。它是控制器在存储ActionForm的时候,需要用到的属性。控制器会以该属性的名字作为key在request或者session范围内存储相应的ActionForm对象。另外一个属性就是input,该属性的作用是,如果碰到校验错误,控制器将跳转到input属性所代表的相对路径的目标模块。所以该属性起作用,需要两个条件,一个是<action>元素配置了name属性,第二个就是ActionForm中的校验方法返回包含错误信息的对象。
这是对<action>元素的分析,在struts的配置文件中,还有两个常用的元素就是<message-resources>和<global-forwards>元素。其中<message-resources>元素用于配置消息资源文件,以在应用客户端界面中输出本地化的消息文本。它有两个属性,一个是key属性,用来指定资源文件存放在ServletContext对象中时使用的属性key,也就是资源束的名称。第二个属性是parameter,用来指定消息资源的存放路径,需要注意的该路径名称不是用斜杠分隔的,而是和普通Java类一样,用的是类似包名,所以用的是点分隔符。从<global-forwards>的名字可以看出,这项配置是用来表示全局跳转的。事实也正是如此,它里面的子元素就是<forward>。在哪种情况下需要全局跳转呢?这个很容易想明白,当两个或以上的Action元素里面都包含同一个跳转的时候,就可以将这个公共forward元素提取出来,配置在全局跳转标签中。下面的代码就是综合了以上元素的例子:
代码一:
<global-forwards>
<forward name="error" path="/error.jsp"></forward>
</global-forwards>
<action path="/addStu" type="com.yxb.struts.AddStudentAction"
name="addStuForm" scope="request" attribute="addStuForm"
input="/input_error.jsp" validate="true">
<forward name="addSuccess" path="/add_success.jsp"></forward>
<forward name="addFailure" path="/add_failure.jsp"></forward>
</action>
<message-resources parameter="ApplicationResources.properties"></message-resources>
代码二:
@Override
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
System.out.println("in validate method!");
ActionErrors errors = new ActionErrors();
ActionMessage error = new ActionMessage("error");
errors.add("error", error);
return errors;
}
如上所示,其中input和validate属性的配置是能跳转到input代表的页面的必要条件,还一个就是就在校验方法中返回一个ActionErrors对象,这样就能演示input属性的作用了。代码一的前后演示了全局转发和资源文件配置,当struts中某个ActionForward的名字是error,则将直接跳转到error.jsp页面。到此为止,struts框架原理性的东西就学习得差不多了。赖老师为了加强学员对struts的理解,在接下来的视频中分析自己写struts框架的思路并演示了一些代码。