如何映射“根”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映射