How can I map a "root" Servlet so that other scripts are still runnable?
google-app-engine, java, servlets, web.xml
Solution
Use an empty pattern, e.g.
<servlet-mapping>
<servlet-name>MainServlet</servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
The servlet 3.0 spec has clarified this:
The empty string ("") is a special URL pattern that exactly maps to the application's context root
So it should at least work on a 3.0 container, and I've verified that it works on Jetty 8
Problem
I'm trying to build a Servlet that calls a JSP page similar to the following: ``` public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { req.getRequestDispatcher("/WEB-INF/main.jsp").forward(req, resp); } ``` I need this Servlet to respond to the domain's root (eg: http://example.com/) so I'm using the following mapping in the web.xml: ``` <servlet-mapping> <servlet-name>MainServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> ``` The problem I'm having is that this matches EVERYTHING, so when the dispatcher forwards to "/WEB-INF/main.jsp" this matches the url-pattern so the Servlet gets run again. This results in a loop that runs until it dies with a java.lang.StackOverflowError. How can I match the root without preventing other scripts from being runnable?