2011-03-27 107 views
25

我正在使用struts/tiles使用多個內部servlet/jsp轉發到適合顯示的jsp的郵輪預訂應用。但是,一旦您到達用於呈現頁面的最終jsp,則該jsp中的${pageContext.request.requestURL}調用返回此 jsp的路徑如何在多個servlet轉發後從servlet/jsp獲取原始請求url

例如

  1. 原始請求:/預訂/ getCruiseDetails
  2. 被轉發到:/booking/validateCruiseDeteails.jsp
  3. 被轉發到:/booking/validateUser.jsp
  4. 最終被轉發到:/booking/showCruiseDetails.jsp

所以,在/booking/showCruiseDetails.jsp當我打電話${pageContext.request.requestURL}我 得到/booking/showCruiseDetails.jsp

如何從已通過達成一個jsp獲取原始(客戶端製造)請求的URL 多個轉發。我確實在stackoverflow上找到了提示herehere的帖子,但是他們沒有解決在多次轉發發生後如何查找原始請求url的問題。

+0

JSP內部的多個轉發是非常糟糕的設計。 – BalusC 2011-03-27 21:46:11

+0

同意......但我正在處理遺留代碼;-( – 2011-03-28 00:09:06

回答

10

您可以使用過濾器來將源地址請求的屬性,然後從JSP閱讀

過濾器映射到/預訂/ *執行:

request.setAttribute("origin", request.getRequestURL()); 

jsp中:

${pageContext.request.attribute["origin"]} 

這適用,因爲過濾器默認設置了REQUEST分派器。這意味着過濾僅適用於不轉發直接客戶端請求執行/包括

+0

我會試試這個,如果它的工作我'我接受它作爲答案。同時,我給它一個投票:-) – 2011-03-27 20:40:25

+0

如果這個解決方案能幫助你 – smas 2011-03-27 20:55:01

+0

順便說一句,你能說出你的意思嗎,當你說「這是有效的,因爲過濾器默認設置了REQUEST dispatcher」? thnx(並沒有得到驗證你的建議只是) – 2011-03-28 00:11:27

1

請考慮使用servlet過濾器來驗證信息。這意味着您可以避免驗證轉發,只保留在單個JSP文件中。

+0

這是偉大的建議,但我正在處理遺留的應用程序,所以受到它的架構約束 – 2011-03-27 23:04:49

48

我發現這個職位一個更好的答案[How do you detect the URL in a Java Servlet when forwarding to JSP?]

在目標JSP使用:

request.getAttribute("javax.servlet.forward.request_uri")

要找到了解原始網址是什麼。

它不需要你承擔轉發servlet的任何額外的步驟

+1

這實際上比接受的答案要好。小服務程序規範保證這種性質可以存在多個轉發: 「請注意,即使在調用多個轉發和後續包含的情況下,這些屬性也必須始終反映原始請求中的信息。」 (Servlet規範,9.4.2:轉發的請求參數) – LordOfThePigs 2015-10-16 07:47:36

3
${requestScope["javax.servlet.forward.request_uri"]} 

${requestScope['javax.servlet.forward.request_uri']} 
0

您可以顯示它不使用以下配置的bean引用:

<h:outputText value="#{requestScope['javax.servlet.forward.request_uri']}" /> 

當然,您需要在web.xml文件中映射404頁面。

<error-page> 
    <error-code>404</error-code> 
    <location>/xhtml/pg/error/404.xhtml</location> 
</error-page>