最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入解析Java的Struts框架中的控制器DispatchAction

 更新時(shí)間:2015年12月11日 17:57:42   作者:永遠(yuǎn)的晴天  
這篇文章主要介紹了深入解析Java的Struts框架中的控制器DispatchAction,Struts是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下

Struts中的表單處理器為ActionForm,而struts中的控制器主要是Action,以及DispatchAction控制器等。
Action
在struts中,所有的用戶都會(huì)經(jīng)過(guò)ActionServlet的處理,而實(shí)際的工作是交給Action對(duì)象來(lái)處理的,ActionServlet可以從配置文件中創(chuàng)建ActionMapping對(duì)象,從ActionMapping對(duì)象中找到對(duì)應(yīng)使用的Action,然后將用戶請(qǐng)求轉(zhuǎn)交給Action。
對(duì)Struts一個(gè)ActionMapping只能生成一個(gè)Action對(duì)象,當(dāng)用戶發(fā)起請(qǐng)求的時(shí)候會(huì)檢查所需要的Action對(duì)象是否存在,如果不存在就會(huì)生成一個(gè)Action對(duì)象,在以后的處理過(guò)程中使用這個(gè)對(duì)象。
當(dāng)我們使用Action的時(shí)候需要繼承arg.apache.struts.action.Action這個(gè)類,在子類中加入所需要的業(yè)務(wù)邏輯處理,這些子類會(huì)返回ActionForward對(duì)象,ActionServlet接受這個(gè)對(duì)象,把頁(yè)面轉(zhuǎn)發(fā)到指定頁(yè)面,從而把用戶請(qǐng)求的結(jié)果發(fā)送到對(duì)應(yīng)的頁(yè)面。我們?cè)趕truts-config.xml中進(jìn)行配置。配置的主要屬性如下:
(1)  path屬性:訪問(wèn)Action的URL地址,當(dāng)用戶請(qǐng)求路徑和URL匹配時(shí),ActionServlet會(huì)把這個(gè)用戶請(qǐng)求發(fā)送給Action處理。
(2)  type屬性:指定處理請(qǐng)求的Action對(duì)應(yīng)的類,需要寫類文件的包路徑。
(3)  name屬性:指定我們的Action用到的ActionForm名字,這個(gè)ActionForm必須是在<form-beans>中定義過(guò)的。
(4)  scope屬性:指定ActionForm的使用范圍,缺省值為session范圍。
(5)  input屬性:指定表單驗(yàn)證出錯(cuò)的時(shí)候轉(zhuǎn)向頁(yè)面。
(6)  validate屬性:指明是否自動(dòng)調(diào)用ActionForm中的validate方法對(duì)表單進(jìn)行驗(yàn)證。
配置示例如下代碼。

<struts-config> 
   <form-beans> 
      <form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm" /> 
   </form-beans> 
   
   <action-mappings> 
      <action path="/login" 
             type="com.bjpowernode.struts.LoginAction" 
             name="loginForm" 
             scope="request" 
             > 
             <forward name="success" path="/login_success.jsp"/> 
             <forward name="error" path="/login_error.jsp"/> 
      </action> 
   </action-mappings> 
   
</struts-config> 


問(wèn)題
當(dāng)我們完成用戶增刪改查操作時(shí)采用struts框架,我們需要為增刪改查建立四個(gè)不同的Action,如果有更多的增刪改查操作,比如對(duì)物料增刪改查也需要建立四個(gè)Action,這樣造成了大量的Action。
問(wèn)題的解決
在struts中的Action類中,只提供了一個(gè)execute()方法,一個(gè)用戶請(qǐng)求URL只能對(duì)應(yīng)一個(gè)servlet,在struts中提供了另一個(gè)控制器類org.apache.struts.actions.DispatchAction,這個(gè)類可以經(jīng)完成相關(guān)業(yè)務(wù)邏輯所需方法幾種在一個(gè)DispatchAction類中,我們繼承DispatchAction類后不重寫execute()方法,而是編寫自己的方法,在不同的方法中處理不同的動(dòng)作。刪除用戶增刪改查對(duì)應(yīng)的Action,建立UserAction。

20151211175605933.jpg (244×123)

界面中調(diào)用代碼如下所示。

<body> 
<a href="user/user_maint.do?command=list"title="請(qǐng)點(diǎn)擊訪問(wèn)用戶管理系統(tǒng)">用戶管理系統(tǒng)</a> 
</body> 


其中l(wèi)ist對(duì)應(yīng)著UserAction中的list方法,傳遞的字符串與UserAction中的方法名相同。
UserAction中的代碼如下所示:

packagecom.bjpowernode.drp.web.actions; 
  
importjava.util.Date; 
importjava.util.List; 
  
importjavax.servlet.http.HttpServletRequest; 
importjavax.servlet.http.HttpServletResponse; 
  
importorg.apache.commons.beanutils.BeanUtils; 
importorg.apache.struts.action.ActionForm; 
importorg.apache.struts.action.ActionForward; 
importorg.apache.struts.action.ActionMapping; 
importorg.apache.struts.actions.DispatchAction; 
  
importcom.bjpowernode.drp.manager.UserManager; 
importcom.bjpowernode.drp.model.User; 
importcom.bjpowernode.drp.web.forms.UserActionForm; 
  
public classUserAction extends DispatchAction { 
  
   
  
  
   protected ActionForward list(ActionMapping mapping, ActionForm form, 
          HttpServletRequestrequest, HttpServletResponse response) 
          throwsException { 
      //調(diào)用業(yè)務(wù)邏輯操作 
      List userList = UserManager.getInstance().findAllUserList(); 
      request.setAttribute("userlist",userList); 
       
      returnmapping.findForward("list_success"); 
   } 
  
   
   /** 
   * 用戶刪除 
   * @param mapping 
   * @param form 
   * @param request 
   * @param response 
   * @return 
   * @throws Exception 
   */ 
   public ActionForward del(ActionMapping mapping, ActionForm form, 
          HttpServletRequestrequest, HttpServletResponse response) 
          throws Exception { 
      //獲取從頁(yè)面表單中提交過(guò)來(lái)的值 
      UserActionForm uaf = (UserActionForm)form; 
       
      //取得需要?jiǎng)h除的userId的集合 
      String[] userIdList = uaf.getSelectFlag(); 
  
      //調(diào)用業(yè)務(wù)邏輯操作 
      UserManager.getInstance().deleteUsers(userIdList); 
      return mapping.findForward("del_success"); 
   } 
   
   /** 
   * 用戶添加 
   * @param mapping 
   * @param form 
   * @param request 
   * @param response 
   * @return 
   * @throws Exception 
   */ 
   public ActionForward add(ActionMapping mapping, ActionForm form, 
          HttpServletRequest request, HttpServletResponse response) 
          throwsException { 
       
      //獲取從頁(yè)面表單中提交過(guò)來(lái)的值 
      UserActionForm uaf = (UserActionForm)form; 
      Useruser = new User(); 
      BeanUtils.copyProperties(user,uaf); 
      user.setCreateDate(newDate()); 
       
      //調(diào)用業(yè)務(wù)邏輯操作 
      UserManager.getInstance().addUser(user); 
      returnmapping.findForward("add_success");  } 
  
   /** 
   * 修改用戶 
   * @param mapping 
   * @param form 
   * @param request 
   * @param response 
   * @return 
   * @throws Exception 
   */ 
   public ActionForward modify(ActionMapping mapping, ActionForm form, 
          HttpServletRequestrequest, HttpServletResponse response) 
          throwsException { 
      //獲取從頁(yè)面表單中提交過(guò)來(lái)的值 
      UserActionForm uaf = (UserActionForm)form; 
      User user = new User(); 
      BeanUtils.copyProperties(user,uaf); 
       
      //調(diào)用業(yè)務(wù)邏輯操作 
      UserManager.getInstance().modifyUser(user); 
      returnmapping.findForward("modify_success"); 
   } 
   
   /** 
   * 根據(jù)ID查詢用戶 
   * 
   * @param mapping 
   * @param form 
   * @param request 
   * @param response 
   * @return 
   * @throws Exception 
   */ 
   public ActionForward find(ActionMapping mapping, ActionForm form, 
          HttpServletRequestrequest, HttpServletResponse response) 
          throwsException { 
      //獲取從頁(yè)面表單中提交過(guò)來(lái)的值 
      UserActionForm uaf = (UserActionForm)form; 
       
      String userId = uaf.getUserId(); 
       
      //調(diào)用業(yè)務(wù)邏輯操作 
      User user = UserManager.getInstance().findUserById(userId); 
       
      //將user對(duì)象從Action傳遞到JSP頁(yè)面 
      request.setAttribute("user",user); 
       
      returnmapping.findForward("find_success"); 
   } 
   
} 

  


Struts-config.xml配置文件代碼如下所示。

<struts-config> 
   
  <form-beans> 
      <form-bean name="userForm"type="com.bjpowernode.drp.web.forms.UserActionForm"/> 
  </form-beans> 
   
  <action-mappings> 
    <action path="/user/user_maint" 
           type="com.bjpowernode.drp.web.actions.UserAction" 
           name="userForm" 
           scope="request" 
           parameter="command" 
    > 
        
        <forward name="list_success" path="/user/user_list.jsp"/> 
        <forward name="del_success" path="/user/user_maint.do?command=list"redirect="true"/> 
        <forward name="add_success" path="/user/user_maint.do?command=list"redirect="true"/> 
        <forward name="modify_success" path="/user/user_maint.do?command=list"redirect="true"/> 
        <forward name="find_success" path="/user/user_modify.jsp"/> 
 </action-mappings>  
</struts-config> 


其中配置Action的時(shí)候,配置了parameter屬性,并且指定了parameter屬性值為command,當(dāng)用戶單擊添加或刪除用戶操作時(shí),會(huì)以http://localhost:8080/struts_dispatchaction_usermgr/user/user_maint.do?command=list,這個(gè)請(qǐng)求會(huì)被映射到UserAction控制器中,Struts根據(jù)method參數(shù)的值把這個(gè)請(qǐng)求發(fā)送到控制器UserAction的list方法。這樣取得參數(shù)完成頁(yè)面的調(diào)用。
從上述可以看出,DispatchAction可以通過(guò)command這個(gè)參數(shù)的值來(lái)決定調(diào)用DispatchAction的哪個(gè)方法,DispatchAction是從用戶請(qǐng)求的URL中提取parameter定義參數(shù)的值,從而決定調(diào)用哪個(gè)方法處理用戶請(qǐng)求。所以DispatchAction不能通過(guò)ActionForm向服務(wù)器提交請(qǐng)求,因?yàn)樘峤槐韱蔚臅r(shí)候不能向服務(wù)器傳遞參數(shù)。
根據(jù)上述示例我們可以總結(jié)出DispatchAction與Action區(qū)別:Action是從表單中取得數(shù)據(jù),并且自動(dòng)轉(zhuǎn)換為對(duì)應(yīng)的類型。而DispatchAction取得配置文件中parameter,截取parameter定義的參數(shù)值。但是DispatchAction可以處理多個(gè)動(dòng)作而不需要建立多個(gè)Action。
DispatchAction可以在同一個(gè)控制器中處理多個(gè)動(dòng)作,但只能通過(guò)URL來(lái)調(diào)用控制器,根據(jù)用戶提交的參數(shù)來(lái)決定調(diào)用哪個(gè)方法來(lái)處理用戶請(qǐng)求。不能通過(guò)表單提交用戶請(qǐng)求信息,在struts中如果要在同一個(gè)表單中處理不同的動(dòng)作,可以使用LookupDispatchAction。在這里就不詳細(xì)講述了,有興許的童鞋可以查找些資料來(lái)實(shí)現(xiàn)。

相關(guān)文章

  • Java中位運(yùn)算(移位、位與、或、異或、非) 的簡(jiǎn)單實(shí)例

    Java中位運(yùn)算(移位、位與、或、異或、非) 的簡(jiǎn)單實(shí)例

    Java中位運(yùn)算(移位、位與、或、異或、非) 的簡(jiǎn)單實(shí)例,需要的朋友可以參考一下
    2013-02-02
  • 詳解java==運(yùn)算符和equals()方法的區(qū)別

    詳解java==運(yùn)算符和equals()方法的區(qū)別

    這篇文章主要介紹了java==運(yùn)算符和equals()方法的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java中輸出字符的ASCII值實(shí)例

    Java中輸出字符的ASCII值實(shí)例

    這篇文章主要介紹了Java中輸出字符的ASCII值實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Java Web最近面試題匯總

    Java Web最近面試題匯總

    在本篇文章里小編給大家整理的是一篇關(guān)于Java Web最近面試題匯總內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-02-02
  • Spring之WEB模塊配置詳解

    Spring之WEB模塊配置詳解

    這篇文章主要介紹了Spring之WEB模塊配置詳解,簡(jiǎn)單介紹了其繼承方式,代理方式,以及相關(guān)詳細(xì)配置代碼,具有一定借鑒價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • 一文教你搞懂SpringBoot自定義攔截器的思路

    一文教你搞懂SpringBoot自定義攔截器的思路

    在開發(fā)中,都離不開攔截器的使用,比如說(shuō)在開發(fā)登錄功能時(shí),實(shí)現(xiàn)權(quán)限管理功能時(shí)等,這篇文章主要帶大家使用SpringBoot梳理自定義攔截器的思路,需要的可以參考一下
    2023-08-08
  • Java之TreeSet和TreeMap的兩種排序方式解讀

    Java之TreeSet和TreeMap的兩種排序方式解讀

    這篇文章主要介紹了Java之TreeSet和TreeMap的兩種排序方式解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • spring Boot與Mybatis整合優(yōu)化詳解

    spring Boot與Mybatis整合優(yōu)化詳解

    關(guān)于spring-boot與mybatis整合優(yōu)化方面的介紹,就是Mybatis-Spring-boot-starter的介紹,具體內(nèi)容詳情大家參考下本文
    2017-07-07
  • 詳解Java如何實(shí)現(xiàn)一個(gè)BlockingQueue

    詳解Java如何實(shí)現(xiàn)一個(gè)BlockingQueue

    這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)一個(gè)BlockingQueue阻塞隊(duì)列,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-06-06
  • java獲取優(yōu)酷視頻地址示例

    java獲取優(yōu)酷視頻地址示例

    使用JAVA解析優(yōu)酷視頻頁(yè),得到視頻真實(shí)地址, 還可以下載,需要的朋友可以參考下
    2014-03-03

最新評(píng)論

苗栗市| 鄂州市| 文成县| 手游| 大埔县| 彭山县| 二连浩特市| 增城市| 原平市| 宜都市| 堆龙德庆县| 昌宁县| 永春县| 田林县| 霍城县| 磐石市| 山东省| 广灵县| 宁化县| 新田县| 潼南县| 宜君县| 桑日县| 商都县| 沛县| 凤阳县| 沂南县| 赤水市| 明星| 甘南县| 阜宁县| 吴江市| 永和县| 虹口区| 达拉特旗| 铜陵市| 利辛县| 常州市| 黎城县| 陇南市| 哈密市|