Sealyu

          --- 博客已遷移至: http://www.sealyu.com/blog

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks
          • DispatchAction:一個Action 完成多個動作
          • MappingDispatchAction(主要用他):一個Action 完成多個動作,優點:思路清晰
          • LookupDispatchAction:用于一個表單多個提交按鈕。
          注意:在使用繼承Struts預定義的Action類,一定不要覆蓋execute方法,否則會導致無法調用自定義Action相應方法。

          DispatchAction類(org.apache.struts.actions.DispatchAction)

          DispatchAction類是Action類的子類,他提供了有實現的execute方法。

          我們寫的自定義Action類,可以繼承DispatchAction類,但不要覆蓋execute方法,可以在自定義類中寫反回值和參數表都與execute方法相同的方法,可以通過在struts-congfig.xml中為這個action的配置中添加一個參數,來判斷調哪一個方法,實際上DispatchAction類就是通過反射機制,通過form中參數調用了自定義Action中的方法,當然這些方法的定義要符合規范,使用繼承DispatchAction類的自定義的Action類,也就會共享同一的Action路徑。

          注意:使用繼承DispatchAction類的自定義的Action,只會匹配一個action路徑,只能共享一個ActionForm,如果加上校驗,會產生form表單的參數不一致的情況,會導致校驗無法通過。


          例:
          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中隱藏域的名字相對應的-->
              <forward name="sucess" path="/sucess.jsp"/>
          </action>

          <from action="add.do" method="post">
             <input type="hidden" name="methodName" value="add"/>
             <!--
                使用隱藏域為struts傳遞要調用自定義Action中方法的方法名,是通過與struts-config.xml
                中action標簽中的parameter和name屬性相對應來獲取隱藏域的value。
             -->
             <input type="submit" value="submit"/>
          </from>

          MappingDispatchAction類(org.apache.struts.actions.MappingDispatchAction)

          MappingDispatchAction類是DispatchAction的子類,他和DispatchAction不同點就是可以去匹配多個action路徑,這樣也就是結決了共用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屬性是指定調用方法的名字-->
             <forward name="add" path="/add.jsp"/>
          </action>       
          <action path="/del"  type="MyAction" parameter="del">
             <forward name="del" path="/del.jsp"/>
          </action>

          在JSP頁面中也不用在使用隱藏域傳遞參數,直接在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類的子類,他所實現的功能是解決一個表單多種提交問題的
          ,他是通過使用資源文件,用submit按鈕的value來作為資源文件中的key所對應的值,通過這個值來找到對用的key,在使用這個key來獲得指定Map中所對應的值,這個值就是要調用的方法名。

          submit的value---->MessageResource.properties中的key----->Map中key對相應的值---->action

          例:
          <%@taglib uri="http://struts.apache.org/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標簽中的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類的一些規則
          1,盡量不要在Action類中使用(靜態)成員變量,如果使用要加上同步。
          2,盡量使各模塊間的耦合性降低,最大限度的針對接口編程。
          3,可以將共代碼方在覆蓋父類的方法中,最后可以用super.xxx(xxx)來調用父類的方法,使用父類的實現,并加上了自定義的功能。
          posted on 2008-04-19 21:01 seal 閱讀(319) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 城步| 吐鲁番市| 巴里| 澄迈县| 新建县| 惠来县| 景谷| 栾城县| 大城县| 都兰县| 清原| 中宁县| 滦南县| 区。| 莎车县| 玉溪市| 延津县| 奈曼旗| 保定市| 叙永县| 永康市| 鄯善县| 永安市| 扎囊县| 抚松县| 临澧县| 磴口县| 祁门县| 马关县| 海原县| 铁力市| 龙口市| 揭阳市| 尼木县| 抚宁县| 金昌市| 城步| 盐源县| 普兰县| 宜宾市| 永顺县|