隨筆 - 81  文章 - 1033  trackbacks - 0
          <2014年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          在浮躁的年代里,我們進取心太切,患得患失;虛榮心太強,戰戰兢兢。一心爭強好勝,惟恐榜上無名。
          I think I can fly , and flying like a bird !
          程序員一名,已售出,缺貨中!

          我的郵件聯系方式

          用且僅用于MSN

          博客點擊率
          free web counter
          free web counter

          常用鏈接

          留言簿(36)

          隨筆檔案

          搜索

          •  

          積分與排名

          • 積分 - 187312
          • 排名 - 309

          最新評論

          閱讀排行榜

          評論排行榜

          ??? 在Spring2.0中除了以前的Singleton和Prototype外又加入了三個新的web作用域,分別為request、session和global session,它們的含義和用法請大家參考Spring官方手冊的相關章節。如果你想讓你的容器里的某個bean擁有其中某種新的web作用域,除了在bean級上配置相應的scope屬性,還必須在容器級做一個額外的初始化配置。即在web應用的XML聲明文件web.xml中增加下述ContextListener

          1?<web-app>
          2???
          3???<listener>
          4?????<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
          5???</listener>
          6???
          7?</web-app>

          ??? 如果你用的是早期版本的web容器(Servlet 2.4以前),那么你要使用一個javax.servlet.Filter的實現。


          ?1?<web-app>
          ?2???..
          ?3???<filter>?
          ?4?????<filter-name>requestContextFilter</filter-name>?
          ?5?????<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
          ?6???</filter>?
          ?7???<filter-mapping>?
          ?8?????<filter-name>requestContextFilter</filter-name>?
          ?9?????<url-pattern>/*</url-pattern>
          10???</filter-mapping>
          11???
          12?</web-app>

          ??? 兩種方式完成完全一樣的功能:基于LocalThread將HTTP request對象綁定到為該請求提供服務的線程上。這使得具有request和session作用域的bean能夠在后面的調用鏈中被訪問到。

          ??? 我一直使用的是Filter的配置方式,雖然使用的web容器Resin3.0.19是支持servlet2.4的但也懶得改為更為簡潔的Listener了。使用一切正常,昨日無聊翻閱Spring的手冊無意中又看到這一節,想想自己也太懶了,幾句話就改了為什么不更簡單呢?于是就把配置改成了Listener的方式,啟動一切正常,但當請求第一個鏈接時居然報錯了!

          ?1?java.lang.NullPointerException
          ?2?????at?org.springframework.web.context.request.RequestContextListener.requestDestroyed(RequestContextListener.java:67)
          ?3?????at?com.caucho.server.webapp.DispatchFilterChain.doFilter(DispatchFilterChain.java:120)
          ?4?????at?com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)
          ?5?????at?com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:277)
          ?6?????at?com.caucho.server.webapp.RequestDispatcherImpl.forward(RequestDispatcherImpl.java:106)
          ?7?????at?org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
          ?8?????at?org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
          ?9?????at?org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
          10?????at?org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
          11?????at?org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
          12?????at?javax.servlet.http.HttpServlet.service(HttpServlet.java:115)
          13?????at?javax.servlet.http.HttpServlet.service(HttpServlet.java:92)
          14?????at?com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:106)
          15?????at?org.extremecomponents.table.filter.AbstractExportFilter.doFilter(AbstractExportFilter.java:49)
          16?????at?com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
          17?????at?org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:173)
          18?????at?org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
          19?????at?com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
          20?????at?org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:78)
          21?????at?org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
          22?????at?com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
          23?????at?org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:264)
          24?????at?org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107)
          25?????at?org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72)
          26?????at?org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
          27?????at?org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:110)
          28?????at?org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
          29?????at?org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
          30?????at?org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
          31?????at?org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
          32?????at?org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
          33?????at?org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81)
          34?????at?org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
          35?????at?org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:217)
          36?????at?org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
          37?????at?org.acegisecurity.ui.logout.LogoutFilter.doFilter(LogoutFilter.java:106)
          38?????at?org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
          39?????at?org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:229)
          40?????at?org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:274)
          41?????at?org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:148)
          42?????at?org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
          43?????at?com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:70)
          44?????at?com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:178)
          45?????at?com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)
          46?????at?com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:268)
          47?????at?com.caucho.server.port.TcpConnection.run(TcpConnection.java:389)
          48?????at?com.caucho.util.ThreadPool.runTasks(ThreadPool.java:507)
          49?????at?com.caucho.util.ThreadPool.run(ThreadPool.java:433)
          50?????at?java.lang.Thread.run(Thread.java:595)
          51?[10:01:26.109]?java.lang.NullPointerException
          52?[10:01:26.109]?????at?org.springframework.web.context.request.RequestContextListener.requestDestroyed(RequestContextListener.java:67)
          53?[10:01:26.109]?????at?com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:188)
          54?[10:01:26.109]?????at?com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)
          55?[10:01:26.109]?????at?com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:268)
          56?[10:01:26.109]?????at?com.caucho.server.port.TcpConnection.run(TcpConnection.java:389)
          57?[10:01:26.109]?????at?com.caucho.util.ThreadPool.runTasks(ThreadPool.java:507)
          58?[10:01:26.109]?????at?com.caucho.util.ThreadPool.run(ThreadPool.java:433)
          59?[10:01:26.109]?????at?java.lang.Thread.run(Thread.java:595)

          ??? 順便說一下,用Listenter方式配置初始化ApplicationContext的ContextLoaderListener是正常的,它也是需要servlet2.4支持的,所以應該不是因為容器支持的servlet版本問題。 ?

          ??? 換回Filter后一切正常,看了一下Spring源碼也沒看除個所以然,在網上找了很久也沒找到答案,很是郁悶!希望路過的高人們能夠不吝賜教,感激涕零!

          posted on 2007-02-08 10:10 cresposhi 閱讀(5529) 評論(20)  編輯  收藏

          FeedBack:
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-08 11:26 GoKu
          都說Resin速度比Tomcat快,為什么用Resin的人比較少...  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-08 11:29 施偉
          教科書上講的都是tomcat,大家都是從那個階段過來的,然后中國的教育從小到大都是這樣,都不怎么喜歡嘗試新的東西,喜歡照書做。不過話說回來,tomcat誰做的,apache啊,牛啊,讓人放心!  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-08 12:04 梅穎
          插不上嘴了。。。唉  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-08 13:11 BeanSoft
          哈,因為自己blog寫的牢騷貼說了幾句框架的壞話, 就有人留言說:
          ALin
          Posted @ 2007-02-08 09:56
          從此以后不再讀這個Blog里面的任何文章……
          見: Java 這么多框架, 前途在何方?
          http://www.aygfsteel.com/beansoft/archive/2007/02/03/97774.html

          Resin(有Open Source版本和商業版, 像 Mysql 那樣) 啟動的確比 Tomcat 快, 速度也快, 不過部分地方是不太符合 Tomcat 的慣例(不知道算不算 JSP 規范), 所以有些應用會報錯. 最新的Resin 3.0.22 修正了很多不兼容的 bug.

          at org.springframework.web.context.request.RequestContextListener.requestDestroyed(RequestContextListener.java:67)

          看看這個 Spring 中類的源碼是不是取不到 context 什么的.

            回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-08 13:27 BeanSoft
          public class RequestContextListener implements ServletRequestListener {

          /** Logger available to subclasses */
          protected final Log logger = LogFactory.getLog(getClass());


          public void requestInitialized(ServletRequestEvent requestEvent) {
          //....
          }

          public void requestDestroyed(ServletRequestEvent requestEvent) {
          ServletRequestAttributes requestAttributes =
          (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
          requestAttributes.requestCompleted();
          RequestContextHolder.setRequestAttributes(null);
          LocaleContextHolder.setLocale(null);
          if (logger.isDebugEnabled()) {
          logger.debug("Cleared thread-bound request context: " + requestEvent.getServletRequest());
          }
          }

          }

          seems requestAttributes 取到的結果是 null, 把這里加個判斷修正一下重新編譯打包不知道會不會好. 我看的是 2.0.2 的 src.  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-08 13:39 施偉
          這個代碼我跟過了。。。 如果就這樣判斷然后就跳過去我總覺得不過,因為在tomcat里應該是沒有問題的 所以這里的對象應該是存在的,如果不找到根本原因 恐怕會有內存泄漏等問題。。。  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-08 13:47 施偉
          @BeanSoft
          在你的那篇文章里留了一句話,也在這里發一遍,緊記于心:框架是告訴人們不該去做什么,而不是告訴人們該去做什么;容器是告訴人們該去做什么,而不是告訴人們不該去做什么!
          有點繞口,不過味深!  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-08 13:54 BeanSoft
          看到了. 呵呵, 有時候是挺頭痛. 不過我想要是把你的問題放到 springside, 應該有人能指點一下吧. Google 一下看看有人遇到過沒有.  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-08 13:58 施偉
          昨天晚上google了半天都沒找到。。。等會到springside和spring中文站去逛逛,看有沒結果,現在只能將就著Filter用著了。。。框架啊框架 呵呵  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-08 13:59 BeanSoft
          開源的沒技術支持, API 不穩定, 的確是個大問題. 今天吃飯同事們還聊到 Struts 2.0 簡直就跟 1.0 沒共同點了快.  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-08 14:02 施偉
          Struts2就是webwork2。。。說是從Struts1過渡過來確實是瞎掰
          老項目還不如就用Struts1算了
          新的項目再說吧,不過webwork確實比Struts要爽的多,夠簡單。。。我喜歡。。。  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-08 14:21 梅穎
          你這熱鬧了,不要我了。。。  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-10 21:58 施偉
          要啊要啊,誰說不要啊,呵呵!  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-12 12:26 梅穎
          呵呵,我們老大都來了的,但是她冒留言,呵呵  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-02-13 09:08 施偉
          怎么不留言列?你們老大搞這么深沉搞么事灑,呵呵  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-03-20 15:32 ssmax
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問[未登錄] 2007-07-06 09:26 sun
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問 2007-08-14 01:04 farush
          我也是遇到同樣的問題。
          我用的是jetty5.1.12
          servlet2.4 (web.xml 頭也同樣正常聲明了使用servlet2.4)
          spring2.0.6

          我也是使用監聽器的方式。

          不過我的情況更壞,當使用
          org.springframework.web.context.ContextLoaderListener時:
          bean的scope為singleton或prototype時,正常,但scope為request或session時,容器在啟動就拋出異常。提示建議我使用:
          org.springframework.web.context.request.RequestContextListener
          于是,我將監聽器ContextLoaderListener換成了RequestContextListener,這里容器啟動拋新異常,提示WebApplicationContext沒初始化,建議我使用ContextLoaderListener,
          無奈,兩個監聽器都加上,
          這下兩個異常一起拋。。。。。

          更奇怪的是,即使bean是singleton,
          單單使用
          org.springframework.web.context.request.RequestContextListener
          這種方式還是啟動不了,提示WebApplicationContext沒得到初始化。。。

          PS:
          eclipse3.3
          jdk5.0
          maven2

          很是郁悶,郁悶了幾天了,只能暫時不用request和session bean了。。。  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問[未登錄] 2008-12-03 16:04 Dragon
          @BeanSoft
          兩者不同了,Struts2 是webwork升級版  回復  更多評論
            
          # re: Rensin3.0.19中不能使用Listener方式配置RequestContextListener支持Spring2中的web作用域的疑問[未登錄] 2014-08-09 20:14 CC
          雖然這么久遠了,但我還是回一個,讓碰到這個問題的兄弟們別走彎路

          程序用spring4.0.5,struts2.3.16.3,listener配置,測試環境tomcat7.0.54上程序正常,生產環境tomcat7.0.52,碰到了樓主一樣的問題,最后升級成tomcat7.0.55就沒問題了,所以在各種框架滿天飛的天下,webserver也要和第三方jar包同步更新,才能抵御隨時可能出現的各種不兼容問題  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 大化| 商南县| 浦城县| 鸡泽县| 达尔| 精河县| 镇雄县| 苏尼特左旗| 济阳县| 延庆县| 吴江市| 中方县| 麟游县| 盐池县| 杨浦区| 章丘市| 习水县| 那曲县| 大英县| 屯昌县| 简阳市| 柳江县| 衡山县| 富裕县| 和田市| 沅江市| 武邑县| 双柏县| 蒙城县| 裕民县| 垫江县| 宁城县| 苍梧县| 大港区| 临湘市| 玛纳斯县| 集贤县| 永川市| 兴安盟| 济宁市| 壤塘县|