天天看點

springMvc源碼學習之:利用springMVC随時随地擷取HttpServletRequest等對象

一、準備工作:

在web.xml中添加  

<listener>      

        <listener-class>      

            org.springframework.web.context.request.RequestContextListener  

        </listener-class>      

</listener>  

二、使用方法:

1、方法一:通過代碼實作

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();  

2、方法二:通過注解實作:

@Autowired  

private  HttpServletRequest request;  

三、關于RequestContextListener的背景知識:

Request作用域 

<bean id="loginAction" class="com.foo.LoginAction" scope="request"/> 

對每次HTTP請求,Spring容器會根據loginAction bean定義建立一個全新的LoginAction

bean執行個體,且該loginAction bean執行個體僅在目前HTTP

request内有效,是以可以根據需要放心的更改所建執行個體的内部狀态,而其他請求中根據loginAction

bean定義建立的執行個體,将不會看到這些特定于某個請求的狀态變化。當處理請求結束,request作用域的bean執行個體将被銷毀。 

對某個HTTP Session,Spring容器會根據userPreferences bean定義建立一個全新的userPreferences

bean執行個體,且該userPreferences bean僅在目前HTTP

Session内有效。與request作用域一樣,你可以根據需要放心的更改所建立執行個體的内部狀态,而别的HTTP

Session中根據userPreferences建立的執行個體,将不會看到這些特定于某個HTTP Session的狀态變化。當HTTP

Session最終被廢棄的時候,在該HTTP Session作用域内的bean也會被廢棄掉。 

<bean id="userPreferences" class="com.foo.UserPreferences" scope="globalSession"/> 

請注意,假如你在編寫一個标準的基于Servlet的web應用,并且定義了一個或多個具有global session作用域的bean,系統會使用标準的HTTP Session作用域,并且不會引起任何錯誤 

二、為什麼需要額外的配置RequestContextFilter 

許會有一個疑問,已經通過ContextLoaderListener(或ContextLoaderServlet)将Web容器與Spring容器整

合,為什麼這裡還要用額外的RequestContextListener以支援Bean的另外3個作用域,原因是

ContextLoaderListener實作ServletContextListener監聽器接口,而

ServletContextListener隻負責監聽Web容器的啟動和關閉的事件。RequestContextFilter實作

ServletRequestListener監聽器接口,該監聽器監聽HTTP請求事件,Web伺服器接收的每次請求都會通知該監聽器。通過配置

RequestContextFilter,Spring容器與Web容器結合的更加密切。 

三、作用域依賴問題 

如果将Web相關作用域的Bean注入到singleton或prototype的Bean中,這種情況下,需要Spring AOP

"car" class="com.demo.Car" scope="request">  

    <aop:scoped-proxy/>  

</bean>  

"boss" class="com.demo.Boss" >  

"car" ref="car" />