Action類的工作機(jī)制
所有的Action類是org.apache.struts.action.Action的子類。Action子類應(yīng)該覆蓋父類的execute方法。當(dāng)ActionForm Bean被創(chuàng)建,并且表單驗(yàn)證順利通過(guò)后,Struts框架就會(huì)調(diào)用Action類的execute()方法。execute()方法如下定義:
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)throws IOException,ServletException
execute()方法包含以下參數(shù):
ActionMapping:包含了這個(gè)Action的配置信息,和struts-config.xml文件中的<action>元素對(duì)應(yīng)。
ActionForm:包含了用戶的表單數(shù)據(jù),當(dāng)Struts框架調(diào)用execute()方法時(shí),ActionForm中的數(shù)據(jù)已經(jīng)通過(guò)了表單驗(yàn)證。
HttpServletRequest:當(dāng)前的HTTP請(qǐng)求對(duì)象。
HttpServletResponse:當(dāng)前的HTTP響應(yīng)對(duì)象。
訪問(wèn)封裝在MessageResources中的本地化文本
Action類的execute()方法首先獲得MessageResources對(duì)象:
MessageResources messages=getResources(request);
在Action類中定義了getResources(HttpServletRequest request)方法,該方法返回當(dāng)前默認(rèn)的MessageResources對(duì)象,它封裝了Resource Bundle中的文本內(nèi)容。接下來(lái)Action類就可以通過(guò)MessageResources對(duì)象來(lái)訪問(wèn)文本內(nèi)容。例如,如果要讀取消息KEY為“hello.jsp.title”對(duì)應(yīng)的文本內(nèi)容,可以調(diào)用MessageResources類的getMessage(String key)方法:
String title=messages.getMessage("hello.jsp.title");
業(yè)務(wù)邏輯驗(yàn)證
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”,將創(chuàng)建包含錯(cuò)誤信息的ActionMessage對(duì)象,ActionMessage對(duì)象被保存島ActionMessages對(duì)象中。接下來(lái)調(diào)用在Action基類中定義的saveErrors()方法,它負(fù)責(zé)把ActionMessages對(duì)象保存島request范圍內(nèi)。最后返回ActionForward對(duì)象,Struts框架會(huì)根據(jù)ActionForward對(duì)象包含的轉(zhuǎn)發(fā)信息把請(qǐng)求轉(zhuǎn)發(fā)島恰當(dāng)?shù)囊晥D組件,視圖組件通過(guò)<html:errors>標(biāo)簽把request范圍內(nèi)的ActionMessage對(duì)象中包含的錯(cuò)誤消息顯示出來(lái),提示用戶修改錯(cuò)誤。