Struts是一個(gè)基于MVC架構(gòu)的框架(框架實(shí)現(xiàn)了某些領(lǐng)域通用完備功能的底層服務(wù)),它主要用于開(kāi)發(fā)Web應(yīng)用程序,幫助我們減少了用MVC開(kāi)發(fā)Web應(yīng)用的時(shí)間,簡(jiǎn)化了開(kāi)發(fā)過(guò)程,使開(kāi)發(fā)更具模塊化、靈活性和重用性。可以說(shuō)Struts把MVC的設(shè)計(jì)思想發(fā)揮到了極致,尤其在Controller層。

在用Struts開(kāi)發(fā)項(xiàng)目直接接觸的有這么幾個(gè)類(lèi):ActionMapping、ActionServlet、ActionForm、Action和ActionForward,這五個(gè)類(lèi)各司其職,使上有老下有小的Controller層接近完美。因Struts是面向?qū)ο笤O(shè)計(jì),掌握了這幾個(gè)類(lèi),也就基本掌握了Struts的用法,下面按照這幾個(gè)類(lèi)的執(zhí)行流程舉例說(shuō)明他們?cè)赟truts中的具體用法。下圖為Struts的一個(gè)大致流程圖:


這里不考慮各個(gè)對(duì)象的創(chuàng)建細(xì)節(jié),單從工作的流程分析各個(gè)類(lèi)的作用。

ActionServlet


客戶端向服務(wù)器(Tomcat)發(fā)起請(qǐng)求,通過(guò)在web.xml中的配置,請(qǐng)求直接進(jìn)入ActionServlet,從命名就可以看出這是一個(gè)Servlet,此類(lèi)是不需要我們顯式去創(chuàng)建的,Struts框架已對(duì)它做了實(shí)現(xiàn)。請(qǐng)求繼續(xù)調(diào)用ActionServlet的doGet/doPost方法,實(shí)際上這個(gè)兩個(gè)方法共同調(diào)用了RequestProcess類(lèi)的process方法,process方法才是真正的核心,在process方法中,通過(guò)調(diào)用processPtah方法截取Request中傳遞過(guò)來(lái)的URL,然后調(diào)用processMapping方法根據(jù)截取的URL取得相應(yīng)的ActionMapping。

在web.xml中的配置代碼如下:

  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>2</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

從上面配置不難看出,ActionServlet在Tomcat啟動(dòng)時(shí),就已經(jīng)創(chuàng)建好了,只要是以do結(jié)尾的請(qǐng)求都會(huì)被ActionServlet攔截下來(lái),然后它將不同的請(qǐng)求轉(zhuǎn)發(fā)給對(duì)應(yīng)的Action對(duì)象,讓Action進(jìn)一步處理客戶端的請(qǐng)求。因此ActionServlet肩負(fù)著中央控制器角色,是Struts的核心。下面介紹的各個(gè)類(lèi)中,依舊會(huì)看到ActionServlet的影子。

ActionMapping


ActionServlet調(diào)用processMapping方法,此方法首先會(huì)調(diào)用moduleConfig.findActionConfig(path),獲取對(duì)應(yīng)的ActionMapping對(duì)象。Struts框架將核心配置文件struts-config.xml解析并放入了ActionMapping對(duì)象里。

等返回ActionMapping對(duì)象后,processMapping方法把ActionMapping設(shè)置到Request或Session中方便后面其他地方的使用,體現(xiàn)了面向?qū)ο蠓庋b的好處。struts-config.xml配置信息如下:

  <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
      <param-name>config</param-name>
      <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <init-param>
      <param-name>debug</param-name>
      <param-value>2</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>2</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

配置信息里看出,其中中包含有與請(qǐng)求對(duì)應(yīng)的ActionForm、Action、ActionForward、錯(cuò)誤處理以及國(guó)際化等配置信息,這些都可以通過(guò)ActionMapping取出來(lái)。

  下一篇繼續(xù)。。。

轉(zhuǎn)正請(qǐng)標(biāo)明出處