在使用Spring MVC 隨時獲取request對象


今天在整理代碼的時候發現一段獲取購物車的代碼

如下標記部分可以獲取當前線程中的HttpServletRequest對象

 1 public Cart getCurrent() {
 2         RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();  3         if (requestAttributes != null) {  4             HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();  5             Principal principal = (Principal) request.getSession().getAttribute(Member.PRINCIPAL_ATTRIBUTE_NAME);
 6             Member member = principal != null ? memberDao.find(principal.getId()) : null;
 7             if (member != null) {
 8                 Cart cart = member.getCart();
 9                 if (cart != null) {
10                     if (!cart.hasExpired()) {
11                         if (!DateUtils.isSameDay(cart.getModifyDate(), new Date())) {
12                             cart.setModifyDate(new Date());
13                             cartDao.merge(cart);
14                         }
15                         return cart;
16                     } else {
17                         cartDao.remove(cart);
18                     }
19                 }
20             } else {
21                 String id = WebUtils.getCookie(request, Cart.ID_COOKIE_NAME);
22                 String key = WebUtils.getCookie(request, Cart.KEY_COOKIE_NAME);
23                 if (StringUtils.isNotEmpty(id) && StringUtils.isNumeric(id) && StringUtils.isNotEmpty(key)) {
24                     Cart cart = cartDao.find(Long.valueOf(id));
25                     if (cart != null && cart.getMember() == null && StringUtils.equals(cart.getKey(), key)) {
26                         if (!cart.hasExpired()) {
27                             if (!DateUtils.isSameDay(cart.getModifyDate(), new Date())) {
28                                 cart.setModifyDate(new Date());
29                                 cartDao.merge(cart);
30                             }
31                             return cart;
32                         } else {
33                             cartDao.remove(cart);
34                         }
35                     }
36                 }
37             }
38         }
39         return null;
40     }

下面是摘錄他人的文章,

原文地址:http://itindex.net/detail/50450-java-web-利用

一、准備工作:

在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的背景知識:
基於LocalThread將HTTP request對象綁定到為該請求提供服務的線程上。這使得具有request和session作用域的bean能夠在后面的調用鏈中被訪問到。  

Request作用域  
<bean id="loginAction" class="com.foo.LoginAction" scope="request"/>  


針對每次HTTP請求,Spring容器會根據loginAction bean定義創建一個全新的LoginAction bean實例,且該loginAction bean實例僅在當前HTTP request內有效,因此可以根據需要放心的更改所建實例的內部狀態,而其他請求中根據loginAction bean定義創建的實例,將不會看到這些特定於某個請求的狀態變化。當處理請求結束,request作用域的bean實例將被銷毀。  

Session作用域  
<bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>  
針對某個HTTP Session,Spring容器會根據userPreferences bean定義創建一個全新的userPreferences bean實例,且該userPreferences bean僅在當前HTTP Session內有效。與request作用域一樣,你可以根據需要放心的更改所創建實例的內部狀態,而別的HTTP Session中根據userPreferences創建的實例,將不會看到這些特定於某個HTTP Session的狀態變化。當HTTP Session最終被廢棄的時候,在該HTTP Session作用域內的bean也會被廢棄掉。  

global session作用域  

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

global session作用域類似於標准的HTTP Session作用域,不過它僅僅在基於portlet的web應用中才有意義。Portlet規范定義了全局Session的概念,它被所有構成某個portlet web應用的各種不同的portlet所共享。在global session作用域中定義的bean被限定於全局portlet Session的生命周期范圍內。  

請注意,假如你在編寫一個標准的基於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

<bean name="car" class="com.demo.Car" scope="request">  

    <aop:scoped-proxy/>  

</bean>  

<bean id="boss" class="com.demo.Boss" >  

   <properrty name="car" ref="car" />  

</bean>  


免責聲明!

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



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