2010-09-07 29 views
0

這應該相對簡單,但我還沒有找到如何執行它的說明。將請求解釋爲JSP而不是通過servlet

我的設置是一個簡單的web應用程序,通過一個servlet處理每個請求(我將這個問題稱爲MyEverythingServlet)。這裏是我的web.xml的稍作修改的版本:

<servlet> 
    <servlet-name>MyEverythingServlet</servlet-name> 
    <servlet-class>blah.blah.blah.MyEverythingServlet</servlet-class> 
</servlet> 

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

眼下,該servlet是非常簡單的,要麼做了一些工作(當work.do是路徑的一部分),如果沒有指定一個.txt文件在道路上,我們會做一些驗證,然後加載該文件併發送文本作爲響應:

response.getOutputStream().print(content); 

我希望做的是兩種:

  • 在Servlet中,如果請求是一個.jsp文件的URL,我想成爲能夠在將字符串寫入響應之前讓容器解釋JSP scriptlet部分/ taglib的內容。
  • 更改我的web.xml以使其處理MyEverythingServlet外部的.jsp文件。

回答

4
  • 在Servlet中,如果請求的URL一個.jsp文件,我希望能有容器解釋JSP腳本部分/標籤庫的東西之前,我寫的字符串到響應。

沒有直接的API可用於以類似的方式以編程方式處理JSP文件。從理論上講,您希望JSP在公共webcontent中,並且轉發對JSP的請求。你可以用RequestDispatcher#forward()來做到這一點。

if (request.getServletPath().endsWith(".jsp")) { 
    request.getRequestDispatcher(request.getServletPath()).forward(request, response); 
} else { 
    // Write "plain" to response as you did. 
} 

您可能只想對路徑的正確性進行一些檢查,但這至少應該爲您提供一般的想法。然而,有一個小問題:servlet將被遞歸調用,因爲它被映射到/*。您寧願將MyEverythingServlet替換爲Filter,它只將作業的剩餘部分委託給應用服務器的內置默認servlet。有一個Servlet聽上/*已經是一個設計的氣味跡象表明,它應該是從一開始就Filter;)

  • 更改我的web.xml中有它處理的.jsp MyEverythingServlet之外的文件。

你不能有一個 「負」 url-patternweb.xml。最好的辦法是讓servlet監聽更具體的url-pattern,如*.txt/static/*,並將JSP文件保存在外面。

+0

你是否建議我在我的web.xml文件中使用過濾器和過濾器映射代替servlet映射?然後,我會讓過濾器查找* .jsp,並對這些請求(chain.doFilter())不做任何處理? Filter如何將非JSP請求發送到MyEverythingServlet? – 2010-09-07 21:28:18

+0

你也可以這樣做(只有當這些非JSP文件在公共webcontent之外,並且你不得不使用'FileInputStream'來讀取它們)。然後,您應該將servlet映射到更具體的url模式,並使用匹配此模式的URL來分發請求(我會反過來質疑Filter ..的值)。但是如果這些文件在公共webcontent中,那麼繼續過濾鏈就足夠了。 servletcontainer的內置默認servlet將爲您提供非JSP文件。 – BalusC 2010-09-07 21:30:59

+0

好吧,我認爲唯一缺少的就是Filter如何將請求轉發給MyEverythingServlet。 – 2010-09-07 21:41:00