DispatchAction類(org.apache.struts.actions.DispatchAction) DispatchAction類是Action類的子類,他提供了有實現(xiàn)的execute方法。 我們寫的自定義Action類,可以繼承DispatchAction類,但不要覆蓋execute方法,可以在自定義類中寫反回值和參數(shù)表都與execute方法相同的方法,可以通過在struts-congfig.xml中為這個action的配置中添加一個參數(shù),來判斷調(diào)哪一個方法,實際上DispatchAction類就是通過反射機(jī)制,通過form中參數(shù)調(diào)用了自定義Action中的方法,當(dāng)然這些方法的定義要符合規(guī)范,使用繼承DispatchAction類的自定義的Action類,也就會共享同一的Action路徑。 注意:使用繼承DispatchAction類的自定義的Action,只會匹配一個action路徑,只能共享一個ActionForm,如果加上校驗,會產(chǎn)生form表單的參數(shù)不一致的情況,會導(dǎo)致校驗無法通過。 例: public class MyAction extends DispatchAction{ ActionForward add(ActionForm form,HttpServletRequest request,HttpServletResponse response ActionMapping mapping) throws Exception { return mapping.findForward("sucess") } } <action path="/add" type="MyAction" parameter="methodName"> <!--parameter屬性是和form中隱藏域的名字相對應(yīng)的--> <forward name="sucess" path="/sucess.jsp"/> </action> <from action="add.do" method="post"> <input type="hidden" name="methodName" value="add"/> <!-- 使用隱藏域為struts傳遞要調(diào)用自定義Action中方法的方法名,是通過與struts-config.xml 中action標(biāo)簽中的parameter和name屬性相對應(yīng)來獲取隱藏域的value。 --> <input type="submit" value="submit"/> </from> MappingDispatchAction類(org.apache.struts.actions.MappingDispatchAction) MappingDispatchAction類是DispatchAction的子類,他和DispatchAction不同點(diǎn)就是可以去匹配多個action路徑,這樣也就是結(jié)決了共用ActoinForm的校驗問題了,多個Action的路徑使用同一的自定義Action類,這樣就不用共享同一個ActionForm,也就不會有校驗問題了。 例: public class MyAction extends MappingDispatchAction{ ActionForward add(ActionForm form,HttpServletRequest request,HttpServletResponse response ActionMapping mapping) throws Exception { return mapping.findForward("add") } ActionForward del(ActionForm form,HttpServletRequest request,HttpServletResponse response ActionMapping mapping) throws Exception { return mapping.findForward("del") } } <action path="/add" type="MyAction" parameter="add"> <!--parameter屬性是指定調(diào)用方法的名字--> <forward name="add" path="/add.jsp"/> </action> <action path="/del" type="MyAction" parameter="del"> <forward name="del" path="/del.jsp"/> </action> 在JSP頁面中也不用在使用隱藏域傳遞參數(shù),直接在form中的action中就可以直接使用xxx.do匹配了。 <form action="add.do" method="post"> <input type="submit" value="submit"/> </form> <form action="del.do" method="post"> <input type="submit" value="submit"/> </form> LookupDispatchAction(org.apache.struts.actions.LookupDispatchAction) LookupDispatchAction類也是DispatchAction類的子類,他所實現(xiàn)的功能是解決一個表單多種提交問題的 ,他是通過使用資源文件,用submit按鈕的value來作為資源文件中的key所對應(yīng)的值,通過這個值來找到對用的key,在使用這個key來獲得指定Map中所對應(yīng)的值,這個值就是要調(diào)用的方法名。 submit的value---->MessageResource.properties中的key----->Map中key對相應(yīng)的值---->action 例: <%@taglib uri="http://struts./tags-bean" prefix="bean" %> <form method="post" action="${pageContext.request.contextPath}/lookup/adddel.do"> <input type="submit" value="<bean:message key="button.add" />" name="methodName"> <!--注意name="methodName"是和strut-config.xml中action標(biāo)簽中的parameter屬性--> <input type="submit" value="<bean:message key="button.delete" />" name="methodName"> </form> MessageResource.properties button.add=add new user button.delete=delete user 注意:在繼承LookupDispatchAction時,要覆蓋getKeyMethodMap()方法,并定義Map,向Map中放入指定的鍵值對。 public class AddDelLookupDispatchAction extends LookupDispatchAction { public Map getKeyMethodMap(){ Map keyMethodMap= new HashMap(); keyMethodMap.put("button.add", "add"); keyMethodMap.put("button.delete", "delete"); return keyMethodMap; } public ActionForward add(ActionMapping mapping,ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception { return mapping.findForward("add"); } public ActionForward delete(ActionMapping mapping,ActionForm form, HttpServletRequest request,HttpServletResponse response) throws Exception { return mapping.findForward("delete"); } } <action path="/lookup/adddel" type="alan.struts.actions.AddDelLookupDispatchAction" parameter="methodName"> <forward name="add" path="/add.jsp"/> <forward name="delete" path="/delete.jsp" /> </action> <message-resources parameter="alan.struts.message.MessageResource" /> 自定義的Action類的一些規(guī)則 1,盡量不要在Action類中使用(靜態(tài))成員變量,如果使用要加上同步。 2,盡量使各模塊間的耦合性降低,最大限度的針對接口編程。 3,可以將共代碼方在覆蓋父類的方法中,最后可以用super.xxx(xxx)來調(diào)用父類的方法,使用父類的實現(xiàn),并加上了自定義的功能。 |
|