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


一、准備工作:

在web.xml中添加  

[html] view plain copy
  1. <listener>      
  2.         <listener-class>      
  3.             org.springframework.web.context.request.RequestContextListener  
  4.         </listener-class>      
  5. </listener>  


 


二、使用方法:
1、方法一:通過代碼實現

[java] view plain copy
  1. HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();  




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

[java] view plain copy
  1. @Autowired  
  2. 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" />  

</bean>  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM