2009-06-23 26 views
52

我試圖建立一個調用類似如下的JSP頁面一個Servlet:如何映射「根」Servlet以使其他腳本仍可運行?

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws IOException, ServletException { 
    req.getRequestDispatcher("/WEB-INF/main.jsp").forward(req, resp); 
} 

我需要這個Servlet來域的根迴應(如:http://example.com/),所以我用下面的映射在web.xml:

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

我遇到的問題是,這一切相匹配,所以當調度轉發到「/WEB-INF/main.jsp」這個URL模式,因此相匹配的Servlet再次運行。這導致一個循環運行,直到它與java.lang.StackOverflowError一起死亡。

如何在不阻止其他腳本運行的情況下匹配根目錄?

+0

您無法做到這一點,您必須使用黑客我試過sa我在appengine看到這裏http://stackoverflow.com/questions/870150/how-to-access-static-resources-when-using-default-servlet但不工作 – 2009-06-23 09:01:09

+3

也許時間爲一個接受的答案? – Jeb 2014-11-24 17:11:34

回答

4

您可以使用JSTL或其他方式在根中使用以下代碼創建一個名爲index.jsp的歡迎文件。

<c:redirect url="/main"/> 

所以在web.xml文件中,你都會有這樣的:

<welcome-file-list> 
    <welcome-file>index.jsp</welcome-file>   
</welcome-file-list> 

因此,任何請求根將被重定向到/主。現在你的servlet可以映射到main。

<servlet-mapping> 
    <servlet-name>MainServlet</servlet-name> 
    <url-pattern>/main</url-pattern> 
</servlet-mapping> 
+2

好的,我知道這會起作用,但它像這樣的黑客攻擊。真的不可能讓servlet自己處理根? – 2009-06-23 02:25:46

+0

抱歉投票下來,但有一個更好的解決方案 - http://stackoverflow.com/questions/1030302/how-can-i-map-a-root-servlet-so-that-other-scripts-are-still- runnable/4443581#4443581 – 2011-01-30 12:27:03

+0

此解決方案的優點是,它不會在每個目錄中創建映射,這是welcome-files的工作方式。所以我使用它(儘管使用普通的<%scriptlet,而不是標籤),我正在對它進行投票。 – 2011-07-15 14:31:09

0

您不能重定向到WEB-INF。一個servlet容器永遠不會爲該文件夾中的文檔提供請求。

如果你希望你的應用程序(不只是一個servlet,但整個應用程序)是根上下文(「/」的「http://www.domainname.com/」)獲得,那麼你需要建立一個上下文條目它 - 不是一個servlet映射。

隨着Tomcat,你添加一個新的(在大約3個不同的地方之一)。

+1

我沒有做重定向,我正在做前進。這是內在的,所以不管它們是否公開可見都沒關係,對吧?無論哪種方式,將它們移出WEB-INF都無濟於事。 我沒有使用Tomcat,但我會着眼於上下文映射,謝謝。 – 2009-06-23 02:24:37

+0

當請求被轉發時,容器將在WEB-INF下爲其提供資源。這是一個有效的,有用的網站結構範例。 – 2009-06-24 05:38:58

+0

@fiXedd你是對的,我誤解了 – 2009-06-24 13:36:55

0

您是否嘗試過以下方法? (注意失蹤*,這是一個外卡,是你的配置捕捉一切的原因。)

<servlet-mapping> 
     <servlet-name>MainServlet</servlet-name> 
     <url-pattern>/index.jsp</url-pattern> 
</servlet-mapping> 

(市價修改意見從剛剛/。)

+0

我做了...它有完全相同的結果。我應該提到我在App Engine上這樣做。我開始認爲他們正在繪製的圖像是,呃,太過分了。 – 2009-06-23 05:10:26

1

儘量只刪除「*」從,即

<url-pattern>/</url-pattern> 
7

最初的問題沒有提到他們試圖在App Engine上映射一個根servlet - 在Tomcat(和其他servlet容器,據我所知)很容易,但App Engine不是普通的servlet容器。

我用servlet構建Web應用程序的常用方式是擴展HttpServlet,添加一個包含標題,內容,錯誤,消息等的「頁面」對象,並將其輸出到JSP模板中。這已經是在App Engine中工作的絕對噩夢。

  • JSP文件不能在開始時沒有「/」而被命名。
  • JSP文件不能在子目錄
  • 的Servlet不能被映射到應用程序的根目錄以「/」的url-pattern

,這裏是我的web.xml(編輯爲簡潔)終於工作。

<web-app> 
    <servlet> 
    <!-- this servlet needs to redirect to a NamedDispatcher 
     called "template" --> 
    <servlet-name>Home</servlet-name> 
    <servlet-class>my.domain.HomeSv</servlet-class> 
    </servlet> 
    <servlet> 
    <!-- jsp file must apparently be in root directory and have "/" at 
     start of path --> 
    <servlet-name>template</servlet-name> 
    <jsp-file>/template.jsp</jsp-file> 
    </servlet> 
    <servlet-mapping> 
    <!-- map your home servlet to somewhere other than "/" --> 
    <servlet-name>Home</servlet-name> 
    <url-pattern>/home</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
    <!-- make your Home servlet the welcome file --> 
    <welcome-file>home</welcome-file> 
    </welcome-file-list> 
</web-app> 

我還沒有特別科學的有關驗證這一切 - 但它似乎對我現在的工作,我很高興。

29

使用web.xml的welcome-file元素爲我工作,在應用程序引擎上。這裏是我的:

<web-app> 
    <servlet> 
     <servlet-name>RootServlet</servlet-name> 
     <servlet-class>com.foo.RootServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>RootServlet</servlet-name> 
     <url-pattern>/foo</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
     <welcome-file>foo</welcome-file> 
    </welcome-file-list> 
</web-app> 
41

使用一個空的模式,例如,

<servlet-mapping> 
    <servlet-name>MainServlet</servlet-name> 
    <url-pattern></url-pattern> 
</servlet-mapping> 

該Servlet 3.0規範澄清了這一點:

空字符串( 「」)是恰好映射到 應用程序上下文

所以這一個特殊的URL模式至少應該在3.0容器上工作,而且我已經驗證它可以在Jetty 8上工作