java-如何映射“根” Servlet,以便其他脚本仍可运行?
我正在尝试构建一个调用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中使用以下映射:
MainServlet
/*
我遇到的问题是,它匹配所有内容,因此,当调度程序转发到“ /WEB-INF/main.jsp”时,它将匹配url模式,因此Servlet将再次运行。 这将导致循环运行,直到死于java.lang.StackOverflowError。
在不阻止其他脚本可运行的情况下,如何匹配根目录?
8个解决方案
46 votes
使用空模式,例如
MainServlet
Servlet 3.0规范对此做了澄清:
空字符串(“”)是一种特殊的网址格式,它精确地映射到 应用程序的上下文根
因此它至少应该在3.0容器上工作,并且我已经验证了它可以在Jetty 8上工作
nilskp answered 2020-01-12T06:46:21Z
29 votes
在应用程序引擎上,使用web.xml的welcome-file元素对我有用。 这是我的:
RootServlet
com.foo.RootServlet
RootServlet
/foo
foo
Jeb answered 2020-01-12T06:46:41Z
7 votes
最初的问题没有提及他们正在尝试在App Engine上映射根servlet-在Tomcat(据我所知,以及其他servlet容器)上很容易,但是App Engine不是普通的servlet容器。
我用servlet构建Web应用程序的通常方法是扩展HttpServlet,添加带有标题,内容,错误,消息等的“页面”对象,并将其输出转发到JSP模板。 在App Engine中工作绝对是一场噩梦。
JSP文件开头不能带有“ /”来“命名”。
JSP文件不能位于子目录中
Servlet不能使用“ /” url-pattern映射到应用程序的根目录
这是我的web.xml(为简便起见进行编辑),终于可以使用了。
Home
my.domain.HomeSv
template
/template.jsp
Home
/home
home
关于验证所有这些,我还没有特别科学-但现在看来这对我有用,对此我感到非常高兴。
Sam Lowry answered 2020-01-12T06:47:28Z
4 votes
您可以使用JSTL或其他方式,使用以下代码在根目录中创建一个名为index.jsp的欢迎文件。
因此,在web.xml文件中,您将具有以下内容:
index.jsp
因此,任何请求根目录的人都将被重定向到/ main。 现在您的servlet可以映射到main了。
MainServlet
/main
Vincent Ramdhanie answered 2020-01-12T06:47:57Z
1 votes
尝试仅从模式中删除'*',即
/
Gennady Shumakher answered 2020-01-12T06:48:19Z
1 votes
使用URLrewrite-> [http://tuckey.org/urlrewrite/]在另一个线程URL模式中提到了用于web.xml中servlet映射的解决方案。
Tomasz answered 2020-01-12T06:48:39Z
0 votes
您是否尝试过以下方法? (请注意,缺少的/是通配符,是您的配置捕获所有内容的原因。)
MainServlet
/index.jsp
(根据仅/的评论进行编辑。)
Stu Thompson answered 2020-01-12T06:49:04Z
0 votes
您不能重定向到WEB-INF。 Servlet容器将永远不会为该文件夹中的文档请求提供服务。
如果您希望在根上下文(“ [http://www.domainname.com/”的“ /”)下可以使用您的应用程序(不仅仅是servlet,而是整个应用程序),则需要进行设置 它的上下文条目-不是servlet映射。
使用Tomcat,您可以添加一个新的映射(在大约3个可能的位置之一)。
matt b answered 2020-01-12T06:49:33Z