2014-05-08 23 views
2

我有一個Web應用程序,我想要將JSP與地址http://host:port/status聯繫起來,將一個servlet連接到地址如http://host:port/status/...。這可能嗎?根據this文章,至少對於某些容器,「Servlet規範」包含類似的示例(儘管沒有通配符,在2013年4月的第12-123頁上)應該是可能的(「容器優先匹配通配符路徑匹配上的精確路徑」版本),但是如果我嘗試web.xml中的以下內容,就好像JSP從未被調用過,並且所有請求(也是http://host:port/status)都被路由到servlet。我的JSP和servlet託管在Google App Engine上。在web.xml中映射兩個servlet,其中一個URL模式是另一個的子串

<servlet> 
    <servlet-name>Status</servlet-name> 
    <jsp-file>/Status.jsp</jsp-file> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Status</servlet-name> 
    <url-pattern>/status</url-pattern> 
</servlet-mapping> 
<servlet> 
    <servlet-name>StatusUpload</servlet-name> 
    <servlet-class>com.example.StatusUploadServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>StatusUpload</servlet-name> 
    <url-pattern>/status/*</url-pattern> 
</servlet-mapping> 
+0

甚至會這樣做的重點? – developerwjk

+0

@developerwjk E.g.這是:通過POST請求收集到的數據是'status/postfix'。用戶可以通過'status'昆蟲收集數據。保持URL名稱空間乾淨恕我直言。 – Drux

回答

1

而是在web.xml中映射相同的URL,以兩種不同的JSP/Servlet的,你可以使用像Tuckey UrlRewriteFilter一個URL重寫過濾器,使用它也將被放置在WEB-INF配置文件urlrewrite.xml。它在規則中使用正則表達式。

這兩個規則應該做你想要什麼:

 <rule> 
     <from>^/status$</from> 
     <to>/Status.jsp</to> 
     </rule> 
     <rule> 
     <from>^/status/(.*)$</from> 
     <to>/StatusUpload/?param=$1</to> 
     </rule> 

然後在WEB-INF你就不會在JSP了地圖,將地圖的Servlet來StatusUpload。當用戶轉到/status/postfix時,URL重寫篩選器將轉發到後端的servlet(後綴部分作爲參數傳遞),而用戶在地址欄中看到的地址不會更改。

+0

+1有趣但太複雜,我的目的(太多的輪子)。我仍然希望這可以單獨在'web.xml' /'url-pattern'上完成。 – Drux

+0

它確實需要一個174kb的jar文件。但是,由於重寫規則使用正則表達式,它的功能更加強大,您不必將自己的後綴部分解析爲參數,您將使用web.xml方法。之前我猶豫建議這樣做的原因是,從問題中不清楚你將使用url的路徑部分作爲參數,但我認爲你會這樣做。 – developerwjk

相關問題