1. 程式人生 > >Struts功能詳解 ——ActionServlet

Struts功能詳解 ——ActionServlet

ActionServlet類是Struts框架的內建核心控制器元件,它繼承了javax.servlet.http.HttpServlet類。Struts的啟動通常從

載入ActionServlet開始。Web容器會在首次啟動或Struts應用的第一個請求到達時載入ActionServlet。一般情況下都

配置web容器比如tomcat啟動的時候載入ActionServlet類,使用<load-on-startup>1</load-on-startup>標籤配置啟動

載入。

ActionServlet有如下這幾個功能

1:讀取配置檔案Struts-config.xml

ActionServlet

載入的時候讀取Struts-config.xml檔案,將檔案對應的配置資訊讀取到記憶體中,ActionServlet 根據不同的模組來初始化 ModuleConfig 類,並在其中以XXXconfig 集合的方式儲存該模組的各種配置資訊,比如 ActionConfig,FormBeanConfig 等。

 比如配置檔案中的 Action對映定義都儲存在 ActionConfig 集合中。相應地有 ControlConfig 集合、FormBeanConfig 集合、ForwardConfig集合和 MessageResourcesConfig 集合等。

這裡的模組是為了用於不同使用者在同時使用struts-config.xml

檔案時衝突,每個使用者可以定義自己的配置檔案,由容器自動去整合配置,每個配置檔案相當於一個模組。

2:擷取客戶端http請求,分發到相應的Action

初始化工作完成之後,ActionServlet準備接收客戶請求。針對每個請求,方法 process(HttpServletRequest request, HttpServletResponseresponse) 將被呼叫。該方法指定具體的模組,然後呼叫該模組的 RequestProcessor 的 process 方法。

其實根據Servlet的原理,應該呼叫ActionServlet的doPost()或doGet()方法來處理使用者請求,而它們實際上都是呼叫process()方法具體處理請求的,如下列程式碼:

public void doGet(HttpServletRequest request,HttpServletResponse response)
        throws IOException, ServletException {

        process(request, response);

    }

public void doPost(HttpServletRequest request,HttpServletResponse response)
        throws IOException, ServletException {

        process(request, response);

    }

protected void process(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
		 //根據請求選擇適當的應用模組
        ModuleUtils.getInstance().selectModule(request, getServletContext());
        ModuleConfig config = getModuleConfig(request);
		//獲取模組相關的RequestProcesser例項
        RequestProcessor processor = getProcessorForModule(config);
        if (processor == null) {
           processor = getRequestProcessor(config);
        }
                    //呼叫processor例項的process()方法處理請求
        processor.process(request, response);

    }

在上面我們看到ActionServletprocess()方法中實際處理使用者請求的是RequestProcessor類的process()方法。Struts框架只允許應用程式中存在一個ActionServlet,但每個應用程式模組都有各自的RequestProcessor類例項。在ActionServletprocess()方法中,一旦選擇了正確的應用程式模組,就會呼叫相應模組RequestProcessor例項的process()方法來處理請求。RequestProcessor類的process方法如下:

//摘自RequestProcessor
      public void process(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException
       {
          //用一個特殊的包裝物件把Muiltipart請求包裝起來
          request = processMultipart(request);
          //驗證我們用來選擇對映的路徑元件
          String path = processPath(request, response);
          
          if (path != null) 
           {
             if (log.isDebugEnabled())
             log.debug("Processing a '" + request.getMethod() + "' for path '" + path + "'");
            //有請求時, 為當前使用者選擇一個Locale物件
             processLocale(request, response);
             //有請求時,設定內容型別和no-caching字頭
             processContent(request, response);
             processNoCache(request, response);
             if (processPreprocess(request, response))
              {
                 processCachedMessages(request, response);
                 //驗證這個請求的對映
                 ActionMapping mapping = processMapping(request, response, path);
                 if (mapping != null && processRoles(request, response, mapping)) 
                  {
                     //處理和這個請求相關的任何ActionForm bean
                     ActionForm form = processActionForm(request, response, mapping);
                     processPopulate(request, response, form, mapping);
                     if (processValidate(request, response, form, mapping)&& processForward(request, response, mapping)&& processInclude(request, response, mapping)) 
                      {
                         //建立或獲取Action例項來處理這項請求
                         Action action = processActionCreate(request, response, mapping);
                         if (action != null)
                          {
                             //呼叫Action例項本身
                             ActionForward forward = processActionPerform(request, response,action, form, mapping);
                             //處理所返回的ActionForward例項
                             processForwardConfig(request, response, forward);
                         }
                     }
                 }
             }
          }
      }

ActionServlet ActionConfig 中找出對應於該請求的 Action 子類,如果沒有對應的 Action,控制器直接將請求轉發給 JSP或者靜態頁面。否則控制器將請求分發至具體 Action 類進行處理。

3:從請求中獲取資料填充 FormBean(如果需要)

在控制器呼叫具體 Action 的 execute方法之前,ActionForm 物件將利用 HTTP 請求中的引數來填充自己(可選步驟,需要在配置檔案中指定)。具體的 ActionForm 物件應該是ActionForm 的子類物件,它其實就是一個 JavaBean。

需要特別說明的是,Struts的配置檔案struts-config.xml作為ActionServlet的一個初始化引數值在web.xml檔案中宣告。另外,ActionServlet的URL形式是*.do,這樣當在瀏覽器地址輸入任何字尾為*.do的URL時,系統都會對映到ActionServlet。


相關推薦

Struts功能 ——ActionServlet

ActionServlet類是Struts框架的內建核心控制器元件,它繼承了javax.servlet.http.HttpServlet類。Struts的啟動通常從載入ActionServlet開始。Web容器會在首次啟動或Struts應用的第一個請求到達時載入ActionS

Struts功能——ActionMapping物件

在一個web應用中,每個資源都必須通過URI來進行引用。 資源包括HTML頁面,JSP頁面,和定製動作。為了給定製動作一個 URI或者說路徑,Struts框架提供了一個 ActionMapping物件。

Struts功能——Action

Action是struts中的一個抽象類,它其實是Struts的心臟部分,前面提到的ActionServlet和ActionForm進過處理獲取的請求和資料,都會到達Action中得到分發。一:Acti

Spring基本功能

tex factor oid out 負責 sch bsp 初始化 pub 一、SpringIOC   Spring的控制反轉:把對象的創建,初始化,銷毀的過程交給SpringIOC容器來做,由Spring容器控制對象的生命周期。   1.1 啟動Spring容器的方式:

ServletContext作用功能

tle 記錄 人員 target 列表 頁面 catalog 程序 iyu 本文轉自http://blog.csdn.net/lvzhiyuan/article/details/4664624 感謝作者 ServletContext,是一個全局的儲存信息的空間,服務器開始

mysql慢查詢功能

mysql 慢查詢 優化有人的地方就有江湖,數據庫也是,sql優化這個問題,任重道遠,我們總是禁不住有爛sql。怎麽辦呢,還好各大數據庫都有相關爛sql的收集功能,而mysql的慢查詢收集也是異曲同工,配合分析sql的執行計劃,這個優化就有了搞頭了。開啟mysql慢查詢日誌1.查看當前慢查詢設置情況#查看慢查

ThinkSNS積分商城系統功能

信息 查看 修改 公開 送禮物 介紹 體驗 邏輯與 詳細 積分商城含PC端、Android APP、iOS APP;在ThinkSNS PC端首頁導航欄點擊“拓展功能”,然後選擇“積分商城”進行體驗;APP端則是在“發現”內,點擊“積分商城”進入應用,體驗。 PC積分商城功

UI Recorder 功能

斷言 完成 需要 加載完成 eight nal doc 字符 一段 前言: UI Recorder安裝教程見:UI Recorder 安裝教程(一)、UI Recorder 安裝教程(二) 本次著重介紹UI Recorder錄制過程中的功能按鈕:添加懸停,添加斷言,使用變量

struts ValueStack

color p s net lin 一個棧 直接 session 請求 map接口 一、ValueStack 1.ValueStack是一個接口,在struts2中使用OGNL(Object-Graph Navigation Language)表達式實際上是使用

MySQL Flashback 閃回功能

轉換 下載 libstdc -s bin 二進制日誌 pos 發生 插入 閱讀目錄 1. 簡介 2. 閃回原理 3. flashback安裝 4. 使用簡介 5. Flashback工具使用註意點 回到頂部 1. 簡介 mysqlbinlog flashback(閃

PHP error_reporting() 錯誤控制函數功能

互操作 log 成了 bug art 恢復 tin 有意 cover 定義和用法: error_reporting() 設置 PHP 的報錯級別並返回當前級別。 函數語法: error_reporting(report_level) 如果參數 level 未指定,當前報

應用層協議及其功能

應用層應用層協議及其功能詳解 DNS: 域名服務,用於將名稱解析為IP地址,反之亦然 DNS是一個倒置的樹形結構。最頂部是根域,用英文句點(.)表示。全球有13個根域服務器,一臺主服務器在美國,9臺輔助服務器在美國,2臺在歐州,一臺在日本。 根域服務器以下是一級域(頂級域)、二級域、三級域……最多127級

NAT功能及案例分析—華為NAT server的實現

NATNAT #network address translation - 網絡地址轉換。 NAT的分類 #靜態NAT、動態NAT,動態NAT包含了我們常用的PNAT(PAT)。 端口nat (端口地址轉換 華為&思科NAT對比 靜態NAT #靜態轉換是指將內部網絡的私有IP地址轉換為公有IP地址

Bayboy功能

情況 style prope bubuko 文本 info ren enter 詳解 Bayboy功能詳解 一、Badboy中的檢查點 1.1以sogou.com搜索為例,搜索測試 步驟:打開Badboy工具,在地址欄中輸入搜狗網址;輸入 測試 進行搜索;點擊紅色按鈕停止錄

opensns功能

技術分享 正在 其他 style tdi 圖書 空間 標簽 css opensns功能詳解 #wmd-preview h1 { color: #0077bb } opensns功能詳解 軟件工程 輪播功能 此項可以用來發布廣告、新聞等。對於實驗室網站而言,可

Laravel 5使用Laravel Excel實現Excel/CSV文件導入導出的功能

使用 pat 不存在 data utf-8 標題 sts lda http https://mp.weixin.qq.com/s/Gel1eMHz6_eDWgDMaBQ5BQ 這篇文章主要給大家介紹了關於在Laravel 5中如何使用Laravel Excel實現Exc

關於syslog日誌功能 事件日誌分析、EventLog Analyzer

linux 活動 數據 linu type 監控 roc oracle windows系統 關於syslog日誌功能詳解 事件日誌分析、EventLog Analyzer 一、日誌管理保障網絡安全Windows系統日誌分析Syslog日誌分析應用程序日誌分析Windows

USB虛擬邏輯分析儀,虛擬邏輯分析儀高級觸發功能及圖示

ces jpg 高級 應用 shadow bcf ext ado 很多 LA2132 、32\64通道 G系列USB虛擬邏輯分析儀有很多高級觸發功能,但許多用戶用不好這些觸發功能,下面介紹這些功能的使用。 時序測量: 采集的數據作為時序顯示。 LVDS簡介 :LVDS即低壓

V-Ray 3.6 for SketchUp 新功能(全)

作者 | 活力網Caigle 當大家Vray3.4都沒有捂熱的時候 Chaos Group 官方 默默釋出了最新版渲染器Vray3.6 for SketchUp 與 Trimble 釋出 SketchUp Pro 2018 時間只相差不到一天 看來 Chaos Group 早

SAP系統中信用控制功能

1、引言 現金銷售和預收款銷售一般指發生在壟斷性行業,多數企業不得不面對產品賒銷的兩難選擇,賒銷是把雙刃劍,如果不賒銷,不能迅速擴大銷量,從而影響企業的成長速度;如果賒銷,則生意雖然做大,特別國內信用制度還未完善情況下,大筆壞帳也跑出來了,嚴重降低資金週轉率和