如何映射“根”Servlet,以便其他脚本仍可运行?

我正在尝试构build一个调用类似于以下内容的JSP页面的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死亡。

如何在不阻止其他脚本运行的情况下匹配根目录?

使用一个空的模式,例如

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

servlet 3.0规范澄清了这一点:

空string(“”)是一个特殊的URL模式,准确地映射到应用程序的上下文根

所以它至less应该在一个3.0容器上工作,而且我已经validation它可以在Jetty 8上运行

在app引擎上使用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> 

原来的问题并没有提到他们试图在App Engine上映射一个根servlet – 在Tomcat(和其他servlet容器,据我所知)很容易,但App Engine不是一个正常的servlet容器。

使用servlet构buildWeb应用程序的常用方法是扩展HttpServlet,添加一个包含标题,内容,错误,消息等的“页面”对象,并将其输出到JSP模板。 这是在App Engine中工作的绝对噩梦。

  • JSP文件不能在开头没有“/”的情况下“命名”。
  • JSP文件不能在子目录中
  • 无法使用“/”url模式将Servlet映射到应用程序的根目录

这是我的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> 

我没有特别的科学certificate所有这一切 – 但现在似乎为我工作,我很高兴。

您可以使用JSTL或其他方式在根中使用以下代码创build一个名为index.jsp的欢迎文件。

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

所以在web.xml文件中你会有这样的:

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

所以任何请求root的人都会被redirect到/ main。 现在你的servlet可以映射到main。

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

尝试只是从模式中删除'*',即

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

你有没有尝试下面? (请注意缺less的* ,这是一个通配符,是您的configuration捕获所有内容的原因。)

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

(按照来自/评论进行编辑)

您不能redirect到WEB-INF。 一个servlet容器永远不会为该文件夹中的文档提供请求。

如果您希望您的应用程序(不仅仅是一个servlet,而是整个应用程序)在根环境(“ http://www.domainname.com/ ”的“/”)下可用,那么您需要设置环境条目 – 不是一个servlet映射。

使用Tomcat,您可以添加一个新的<Context>映射 (在三个不同的可能位置之一中)。

在另一个线程URL模式中提到了一个解决scheme,使用URLrewrite – > http://tuckey.org/urlrewrite/ 在web.xml中进行servlet映射