Struts是一個基于MVC架構的框架(框架實現了某些領域通用完備功能的底層服務),它主要用于開發Web應用程序,幫助我們減少了用MVC開發Web應用的時間,簡化了開發過程,使開發更具模塊化、靈活性和重用性。可以說Struts把MVC的設計思想發揮到了極致,尤其在Controller層。
在用Struts開發項目直接接觸的有這么幾個類:ActionMapping、ActionServlet、ActionForm、Action和ActionForward,這五個類各司其職,使上有老下有小的Controller層接近完美。因Struts是面向對象設計,掌握了這幾個類,也就基本掌握了Struts的用法,下面按照這幾個類的執行流程舉例說明他們在Struts中的具體用法。下圖為Struts的一個大致流程圖:

這里不考慮各個對象的創建細節,單從工作的流程分析各個類的作用。
ActionServlet

客戶端向服務器(Tomcat)發起請求,通過在web.xml中的配置,請求直接進入ActionServlet,從命名就可以看出這是一個Servlet,此類是不需要我們顯式去創建的,Struts框架已對它做了實現。請求繼續調用ActionServlet的doGet/doPost方法,實際上這個兩個方法共同調用了RequestProcess類的process方法,process方法才是真正的核心,在process方法中,通過調用processPtah方法截取Request中傳遞過來的URL,然后調用processMapping方法根據截取的URL取得相應的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啟動時,就已經創建好了,只要是以do結尾的請求都會被ActionServlet攔截下來,然后它將不同的請求轉發給對應的Action對象,讓Action進一步處理客戶端的請求。因此ActionServlet肩負著中央控制器角色,是Struts的核心。下面介紹的各個類中,依舊會看到ActionServlet的影子。
ActionMapping

ActionServlet調用processMapping方法,此方法首先會調用moduleConfig.findActionConfig(path),獲取對應的ActionMapping對象。Struts框架將核心配置文件struts-config.xml解析并放入了ActionMapping對象里。
等返回ActionMapping對象后,processMapping方法把ActionMapping設置到Request或Session中方便后面其他地方的使用,體現了面向對象封裝的好處。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>
配置信息里看出,其中中包含有與請求對應的ActionForm、Action、ActionForward、錯誤處理以及國際化等配置信息,這些都可以通過ActionMapping取出來。
下一篇繼續。。。
轉正請標明出處