2010-06-01 85 views
4

我讀過幾個文檔,但我不明白:我知道我做錯了什麼,但我不明白是什麼。我有一個完全動態生成的網站:幾乎沒有任何靜態內容。Java JSP/Servlet:控制器servlet拋出着名的堆棧溢出

因此,試圖瞭解JSP/Servlet的,我寫我自己的「前端控制器」攔截每一個查詢,它看起來像這樣:

<servlet-mapping> 
     <servlet-name>defaultservlet</servlet-name> 
     <url-pattern>/*</url-pattern> 
</servlet-mapping> 

基本上我想要的任何用戶的要求,如:

  • example.org
  • example.org/bar
  • example.org/foo.html

都會經過我寫的默認servlet。

然後servlet檢查URI,找到哪個.JSP請求必須出動,然後呢,已經正確設置所有屬性後,一:

RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jsp/index.jsp"); 
dispatcher.forward(req, resp); 

當我使用一個url模式(在web.xml)喜歡,比如*.html,一切工作正常。但是,當我將其更改爲/*(以真正攔截所有內容)時,我輸入了一個無限循環,並以一個... StackOverflow :)

當請求調度時,URI是「.../WEB-INF/jsp/index.jsp「本身由web.xml匹配filter/*我設置了嗎?

EDIT顯然,沒有,因爲這是一個精確映射到的index.jsp,因此它繞過了web.xml URL模式。所以我仍然沒有得到如何進入無盡的循環。

我應該怎麼做,如果我想攔截所有使用/ *網址模式,但能夠派遣/轉發/?

我不是在詢問關於規格/ Javadocs的信息:我對整體情況非常困惑,我需要一些解釋,以瞭解可能發生的事情。

我不應該截取所有的東西嗎?

如果我可以截取所有東西,我應該知道關於轉發/分派的內​​容?

+0

相關:http://stackoverflow.com/questions/1069442/requestdispatcher-forward-loop – leonbloy 2010-06-01 02:58:59

+0

@leonbloy:哦黨謝謝...我明白了。從BalusC的'答案顯然它是不是一個好主意,使用「/ *」的servlet映射:( – NoozNooz42 2010-06-01 04:58:46

+0

請轉儲完整的堆棧跟蹤/類代碼 – techzen 2010-06-01 05:19:06

回答

4

不幸的是,Serlvet規範不允許創建一個servlet映射來匹配傳入請求,而不是轉發。但是,這可以爲過濾器映射完成(並且默認過濾器映射只匹配傳入的請求)。

因此,對於一個單獨的servlet攔截一切典型的解決方案是使用UrlRewriteFilter

<filter> 
    <filter-name>urlRewrite</filter-name> 
    <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>urlRewrite</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<servlet> 
    <servlet-name>application</servlet-name> 
    <servlet-class>...</servlet-class> 
</servlet> 

<servlet-mapping> 
    <servlet-name>application</servlet-name> 
    <url-pattern>/app/*</url-pattern> 
</servlet-mapping> 

/WEB-INF/urlrewrite.xml

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE urlrewrite 
    PUBLIC "-//tuckey.org//DTD UrlRewrite 3.0//EN" 
    "http://tuckey.org/res/dtds/urlrewrite3.0.dtd"> 

<urlrewrite default-match-type="wildcard"> 
    <rule> 
     <from>/**</from> 
     <to>/app/$1</to> 
    </rule> 
    <outbound-rule> 
     <from>/app/**</from> 
     <to>/$1</to> 
    </outbound-rule>  
</urlrewrite> 

這樣還允許您爲指定從/*映射例外靜態文件。

0

嘗試使用內置前控制器模式的struts。在那裏你將有一個動作類,你可以在struts-config文件中定義forwards,使用它你可以輕鬆管理轉發。

請仔細閱讀教程http://www.roseindia.net/struts/struts2/index.shtml。希望這可以幫助你。

+2

我並不是在一個框架之後,我試圖按照我的問題來學習JSP/Servlet,另外,我的印象是Struts有點像上個世紀的技術,人們應該從頭開始投資於Spring MVC等框架。:) – NoozNooz42 2010-06-01 04:58:12

+0

嘗試使用*。 *(無空格)在你的網址模式。 – 2010-06-01 05:14:03

+1

此外,roseindia.net是一個[恐怖]源(http://balusc.blogspot.com/2008/06/what-is-it-with-roseindia.html)。它只教壞習慣。不要將該網站用作學習來源。 – BalusC 2010-06-01 11:32:59