大B:“由於在JUnit中,參雜了其它的模式在裡面,使得命令模式的特點(diǎn)不太明顯。我給你講講以命令模式在Web開發(fā)中最常見的應(yīng)用——Struts中Action的使用作爲(wèi)例子?!?
小A:“嗯。好的?!?
大B:“在Struts中Action控制類是整個(gè)框架的核心,它連接著頁面請(qǐng)求和後臺(tái)業(yè)務(wù)邏輯處理。按照框架設(shè)計(jì),每一個(gè)繼承自Action的子類,都實(shí)現(xiàn)execute方法——調(diào)用後臺(tái)真正處理業(yè)務(wù)的對(duì)象來完成任務(wù)。”
大B:“需要注意的是:繼承自DispatchAction的子類,則可以一個(gè)類裡面處理多個(gè)類似的操作?!?
下面我們將Struts中的各個(gè)類與命令模式中的角色對(duì)號(hào)入座。
先來看下命令角色——Action控制類
publicclassAction{
……
/*
*可以看出,Action中提供了兩個(gè)版本的執(zhí)行接口,而且實(shí)現(xiàn)了默認(rèn)的空實(shí)現(xiàn)。
*/
publicActionForwardexecute(ActionMappingmapping,
ActionFormform,
ServletRequestrequest,
ServletResponseresponse)
throwsException{
try{
returnexecute(mapping,form,(HttpServletRequest)request,
(HttpServletResponse)response);
}catch(ClassCastExceptione){
returnnull;
}
}
publicActionForwardexecute(ActionMappingmapping,
ActionFormform,
HttpServletRequestrequest,
HttpServletResponseresponse)
throwsException{
returnnull;
}
}
下面的就是請(qǐng)求者角色,它僅僅負(fù)責(zé)調(diào)用命令角色執(zhí)行操作。
publicclassRequestProcessor{
……
protectedActionForwardprocessActionPerform(HttpServletRequestrequest,
HttpServletResponseresponse,
Actionaction,
ActionFormform,
ActionMappingmapping)
throwsIOException,ServletException{
try{
return(action.execute(mapping,form,request,response));
}catch(Exceptione){
return(processException(request,response,e,form,mapping));
}
}
}
大B:“Struts框架爲(wèi)我們提供了以上兩個(gè)角色,要使用struts框架完成自己的業(yè)務(wù)邏輯,剩下的三個(gè)角色就要由我們自己來實(shí)現(xiàn)了?!?
小A:“那要怎麼去實(shí)現(xiàn)啊?”
大B:“實(shí)現(xiàn)的步驟如下:1、很明顯我們要先實(shí)現(xiàn)一個(gè)Action的子類,並重寫execute方法。在此方法中調(diào)用業(yè)務(wù)模塊的相應(yīng)對(duì)象來完成任務(wù)。2、實(shí)現(xiàn)處理業(yè)務(wù)的業(yè)務(wù)類。3、配置struts-config.xml配置文件,將自己的Action和Form以及相應(yīng)頁面結(jié)合起來。4、編寫jsp,在頁面中顯式的制定對(duì)應(yīng)的處理Action?!?