Action类的工作机制
所有的Action类是org.apache.struts.action.Action的子类。Action子类应该覆盖父类的execute方法。当ActionForm Bean被创建,并且表单验证顺利通过后,Struts框架就会调用Action类的execute()方法。execute()方法如下定义:
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)throws IOException,ServletException
execute()方法包含以下参数:
ActionMapping:包含了这个Action的配置信息,和struts-config.xml文件中的<action>元素对应。
ActionForm:包含了用户的表单数据,当Struts框架调用execute()方法时,ActionForm中的数据已经通过了表单验证。
HttpServletRequest:当前的HTTP请求对象。
HttpServletResponse:当前的HTTP响应对象。
访问封装在MessageResources中的本地化文本
Action类的execute()方法首先获得MessageResources对象:
MessageResources messages=getResources(request);
在Action类中定义了getResources(HttpServletRequest request)方法,该方法返回当前默认的MessageResources对象,它封装了Resource Bundle中的文本内容。接下来Action类就可以通过MessageResources对象来访问文本内容。例如,如果要读取消息KEY为“hello.jsp.title”对应的文本内容,可以调用MessageResources类的getMessage(String key)方法:
String title=messages.getMessage("hello.jsp.title");
业务逻辑验证
ActionMessages errors=new ActionMessages();
String userName=(String)((HelloForm)form).getUserName();
String badUserName="Monster";
if(userName.equalsIgnoreCase(badUserName))
{
errors.add("username",new ActionMessage("hello.dont.talk.to.monster",badUserName));
saveErrors(request,errors);
return(new ActionForward(mapping.getInput()));
}
如果用户输入的姓名“Monster”,将创建包含错误信息的ActionMessage对象,ActionMessage对象被保存岛ActionMessages对象中。接下来调用在Action基类中定义的saveErrors()方法,它负责把ActionMessages对象保存岛request范围内。最后返回ActionForward对象,Struts框架会根据ActionForward对象包含的转发信息把请求转发岛恰当的视图组件,视图组件通过<html:errors>标签把request范围内的ActionMessage对象中包含的错误消息显示出来,提示用户修改错误。