控制器組件-- ActionServlet類

          Posted on 2006-06-30 10:14 多力宇揚 閱讀(963) 評論(0)  編輯  收藏 所屬分類: STRUTS

          ??????????????????????????????????????????????? 控制器組件 -- ActionServlet

          我們知道 Struts 的入口是 ActionServlet. org.apache.struts.ActionServlet 類在 Struts 應用程序中負責攔截工作。所有來自客戶層的請求,在交給應用程序處理之前,都會先經過 ActionServlet ActionServlet 的一個實例接受到一個 HttpRequest 對象時,無論這是通過 doGet() 方法還是 doPost() 方法受到的 , 都會調用 process() 方法來處理該請求。 ActionServlet process() 方法如下所示 :

          Protected void process(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletExcepion

          {

          RequestUtils.selectModule(request,getServletContext());

          getRequestProcessor(getModuleConfig(request)).process(request,response);

          }

          盡管 process() 方法看起來并不復雜,但是它調用的方法卻很復雜。首先,它會調用 org.apache.struts.util.RequestUtils 類的靜態方法 selectModule(), 并把當前的請求和這個 Web 應用程序的 ServletContext 都傳入該方法。 selectModule() 方法的工作是將 request.getServletContext() 返回的路徑與每個配置應用模塊的前綴相匹配,從而選出處理當前請求的應用模塊。

          : 如果你只用到了一個 Struts 配置文件 , 那么你就只會有一個應用程序,也就是默認的應用程序。為了讓默認的應用程序和應用模塊能夠簡單而一致的處理請求,默認應用程序可視為一個應用模塊。因此 , 任何請求只要不含應用程序的后綴 (suffix), 都會被傳送給默認的應用程序 , 由其處理。

          擴展 ActionServlet

          盡管 Struts 框架仍然允許你擴展 ActionServlet 類,但是這么做的好處已大不入前,因為它的大部分功能都已經放到新的 RequestProcessor 類里了。如果你仍然想擴展自己的 ActionSerlvet 類,那么只要創建一個擴展了 ActionServlet 的類并配置 Struts 框架讓它使用你的類就可以了。看以下一個覆蓋了 init() 方法的類。

          ?

          Package dory.doo.framework;

          import javax.servlet.ServeltException;

          import javax.sertlvet.UnaviableException;

          import org.apache.struts.action.ActionServlet;

          import dory.doo.strutus.service.IStorefrontService;

          import dory.doo.strutus.service.StorefrontServiceImpl;

          import dory.doo.strutus.framework.util.IConstants;

          import dory.doo.strutus.framework.exceptions.DatastoreException;

          /**

          * 擴展了 Struts ActionServlet, 以此來完成你自己特殊的初始化工作

          */

          public class ExtendedActionServlet extends ActionServlet

          ?{

          ?? public void init() throws ServletException

          {

          ? // 確定你先調用了超類

          ? super.init();

          ? // 初始化持久存儲服務

          ? try

          ?? {

          ???? // 創建服務接口的一個實例

          ???? IStorefrontService serviceImpl=new StorefrontServiceImpl();

          ???? // 把服務對象存儲到應用作用域類

          ???? getServletContext().setAttribute(IConstants.SERVICE_INTERPACE_KEY,serviceImpl);

          ?? }

          ? catch(DatastoreException ex)

          ?? {

          ???? // 如果服務對象的初始化工作出了問題,就關閉 web 應用程序

          ???? ex.printStackTrace();

          ???? throw new UnavailableException(ex.getMessage());

          ?? }

          ??? }

          ?}

          覆蓋 init() 方法只是一個例子 , 你可以覆蓋任何你想覆蓋的方法 , 如果真的需要覆蓋 init() 方法 , 請確定你先調用了 super.init() 方法 , 這樣才會完成默認的初始化工作。

          要使用自己的 ActionServlet 子類,那么必須將 web.xml 修改如下 :

          ?<servlet>

          ?? <servlet-name>MyActionServlet</servlt-name>

          ?? <servlet-class>dory.doo.framework. ExtendedActionServlet</servlet-class>

          ?</servlet>

          Struts 初始化過程

          web.xml 文件中配置的初始化參數而定, servlet 容器首次啟動時 , 或者第一個對比 servlet 的請求來到時 ,servlet 容器就會加載 Stuts ActionServlet. 無論是哪種情況 ( 也不管是什么樣的 Java Servlet) ,都一定要保證 inint() 得到調用,而且必須在 servlet 處理任何請求之前完成。 Struts 框架在 init() 被調用時 , 會做好所有的初始化工作。看看如下就知道了它到底干了些什么 :

          1.?????? Struts 框架內部的消息資源包進行初始化。這些消息資源包是用來向日志文件傳輸信息性,警示和錯誤消息的 . org.apache.struts.action.ActionResources 資源包 ( /org/acache/struts/action/ActionResources.properties 文件 ) 則用來取得這些內部消息。

          2.?????? web.xml 文件加載控制 ActionServlet 類各項行為的初始化參數。這些參數包括 config,debug,detail 以及 convertNull

          3.?????? web.xml 文件加載 servlet 名和 servlet 映射信息,并進行初始化。這些值可供整個 Struts 框架使用 ( 幾乎都是給 JSP 標記庫使用 ), 以便在 HTML 表單提交時,輸出正確的 URL 目標。在此初始化期間, Struts 框架給所有使用 DTD 也會得到注冊。 DTD 接下來可以用于嚴正配置文件。

          4.?????? 加載默認應用程序的 Struts 配置數據,并進行初始化,這些配置數據由 config 初始化參數來指定。默認的 Struts 配置文件得到解析后,會創建一個 ApplicationConfig 對象,并存儲在 ServletContext 對象中。默認應用程序的 ApplicationConfig 對象會以 org.apache.struts.action.APPLICATION 這個鍵值存儲在 ServeltContext 對象中。

          5.?????? Struts 配置文件中為默認應用程序指定的每個消息資源都會被加載,初始化,并存儲在 ServletContext 對象中適當位置 ( 依每個 message-resources 元素中指定的 key 屬性而定 ) 。如果沒有指定 key 屬性,那么相應的消息資源會鍵值 org.apache.struts.action.MESSAGE 來存儲。只有一個消息資源可作為默認消息資源存儲,因為每個鍵都必須是唯一的。

          6.?????? Struts 配置文件中所聲明的每個數據源都被會被加載并初始化。如果沒有指定任何 data-sources 元素,則會跳過這個步驟。

          7.?????? Struts 配置文件中所指定的每個 plug-in( 插件 ) 元素都會被加載和初始化。對于每個 plug-in 元素所指定的類,其 itit() 方法都將被調用。

          8.?????? 一旦默認應用程序正確地完成了初始化之后, servlet init() 方法會確定是否指定了任何其他的應用模塊,如果有的話,對于每個應用模塊都要重復步驟 4-7

          : 為了達到更好的性能,你可能會嘗試為一個應用程序建立多個 Struts 控制器 servlet 。這么做幾乎得不到更好的性能或擴展性, Struts 設計者也不認為這是一個好注意。 Servlet 是多線程的,因此可以讓多個客戶同時執行。一個 servlet 就能同時為多個客戶提供服務。

          ?


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


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 塔河县| 金昌市| 平果县| 河曲县| 德江县| 潞城市| 湘乡市| 张家界市| 洱源县| 西平县| 思茅市| 开封市| 阿鲁科尔沁旗| 札达县| 诸暨市| 隆德县| 喀喇| 湘阴县| 大港区| 衡南县| 钦州市| 梅河口市| 大理市| 芜湖市| 铅山县| 南雄市| 城固县| 扎赉特旗| 长沙县| 墨竹工卡县| 诏安县| 神农架林区| 龙门县| 黄大仙区| 平乡县| 新营市| 屏山县| 淮南市| 景宁| 广水市| 林甸县|