在Action 中訪問web資源

來源:互聯網
上載者:User

標籤:strong   儲存   date()   擴充   需要   還需   方便   map對象   使用   

1、什麼是web資源:

  HttpServletRequest,HttpSession,ServletContext等原生的Servlet API.

2、為什麼要訪問web資源?

  B/S應用的Controller 中必然需要訪問web資源:如域對象中讀寫屬性,讀取Cookie,擷取realPath...

3、如何訪問?

  1、和Servlet API 解耦的方式:只能訪問有限的Servlet API 對象,且只能訪問有限的方法(讀取請求的參數,讀寫域對象的屬性,使Session對象失效等等)

    -->使用ActionContext:為了避免與Servlet API 耦合在一起,方便Action 做單元測試,Struts2對HttpServletRequest,HttpSession和ServletContext進行了封裝,構造了三個Map對象來替代者三個對象,在Action中可以直接使用HttpServletRequest,HttpServletSession,ServletContext對應的Map對象來儲存和讀取資料。

      ActionContext是Action執行的內容物件,在ActionConetxt中儲存了Action執行所需要的所有對象,包括        parameters,request,session,application等等

      擷取HttpSession對應的Map對象:--public Map getSession()

      擷取ServletContext對應的Map對象:--public Map getApplication()

      擷取請求參數對應的Map對象:--public Map getParameters()

     擷取HttpServletRequest對應的Map對象:--publiic Object get(Object  Key):ActionContext類中沒有提供類似getRequest()這樣的方法來擷取HttpServletRequest對應的Map對象。要得到HttpServletRequest對應的Map對象,可以通過get()方法 傳遞參數request的方法來實現。鍵:請求參數的名稱,值:請求參數的值對應的字串數組

     值得注意的是   1、getParameters 的傳回值為在Map<String,Object>,而不是Map<String,String[]>

            2、parameters 這個Map只能讀,而不能寫入。如果寫入,不會出錯,但是也不起任何作用

    -->實現XxxAware介面:通過依賴注入的方式,實現對應的API的訪問。實現AppcationAware介面,然後實現介面的方法後,就可以在Action中使用Appcation對應的Map對象了。其他的Aware介面還有ParametersAware、RequestAware、SessionAware等等介面

    --> 選用建議:如果在Action類中有多個Action方法使用了域對象的Map或Parameter,則推薦使用通過實現XxxAware介面的方式

    --> Session對應的Map 實際上是SessionMap類型的。強轉後若調用其invalidate(),可以使其失效

  2、和Servlet API 耦合的方式:可以訪問更多的Servlet API 對象,且可以調用其原生的方法。直接存取Serlvet API 將使Action和Servlet環境耦合在一起,測試時需要有Serlvet容器。不便於對於Action的單元測試

    -->使用ServletActionContext:

        1、直接擷取HttpServletRequest對象:--ServletActionContext.getRquest()

        2、直接擷取ServletSession對象: -- servletActionContext.getRequest().getSeesion()

        3、直接擷取ServletContext對象:--servletActionContext.getServletContext()  

    -->實現ServletXxxAware介面:通過實現ServletRequestAware,ServletContextAware等介面的方式

  3、既然可以有非耦合的方式可以訪問 Servlet API 了,為什麼還需要耦合的方式來訪問Serlvet API 呢?--因為,非耦合的方式只能訪問Map,有時候需要訪問原生的API,比如getRealPath(),這個方法只能通過訪問原生的Servlet API 才能使用這個方法。

4、關於Struts2請求的副檔名問題

  1、org.apache.struts2包下得default.properties中配置了Struts2應用中的一些常量;

  2、sturts.action.extension 定義了當前struts2應用可以接受請求的副檔名。

  3、可以在strust.xml 檔案中以常量配置的方式修改 default.properties 所配置的常量。如:

  <constant name="struts.action.extension" value="action,do,"></constant>  這樣的配置,可以將當前strust2應用的副檔名修改為可以接受以 .action,.do和沒有尾碼的所有請求。

5、在手工完成欄位的驗證,顯示錯誤資訊,國際化等情況下,推薦繼承 ActionSupport

  

在Action 中訪問web資源

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.