java - ¿Cómo puedo mapear un Servlet "raíz" para que otros scripts sigan siendo ejecutables?
google-app-engine servlets (8)
Intento crear un Servlet que llame a una página JSP similar a la siguiente:
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException {
req.getRequestDispatcher("/WEB-INF/main.jsp").forward(req, resp);
}
Necesito este Servlet para responder a la raíz del dominio (por ejemplo: http://example.com/ ) entonces estoy usando la siguiente asignación en el web.xml:
<servlet-mapping>
<servlet-name>MainServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
El problema que tengo es que esto concuerda con TODO, así que cuando el despachador lo reenvía a "/WEB-INF/main.jsp" esto coincide con el patrón url para que el Servlet vuelva a funcionar. Esto da como resultado un bucle que se ejecuta hasta que muera con java.lang.StackOverflowError .
¿Cómo puedo hacer coincidir la raíz sin evitar que otras secuencias de comandos sean ejecutables?
¿Has probado el de abajo? (Tenga en cuenta que falta *
, que es un comodín y es la razón por la que su configuración capta todo).
<servlet-mapping>
<servlet-name>MainServlet</servlet-name>
<url-pattern>/index.jsp</url-pattern>
</servlet-mapping>
(Editado según los comentarios de solo /
.)
Intente simplemente eliminar ''*'' del patrón, es decir,
<url-pattern>/</url-pattern>
La pregunta original no menciona que están tratando de asignar un servlet raíz en App Engine; es fácil en Tomcat (y en otros contenedores de servlets, hasta donde yo sé), pero App Engine no es un contenedor de servlets normal.
Mi forma normal de compilar una aplicación web con servlets es extender HttpServlet, agregar un objeto "página" con título, contenido, errores, mensajes, etc. y enviarlos a una plantilla JSP. Esta ha sido una absoluta pesadilla al trabajar en App Engine.
- Los archivos JSP no pueden "nombrarse" sin un "/" al principio.
- Los archivos JSP no pueden estar en un subdirectorio
- Los servlets no se pueden asignar a la raíz de su aplicación con un "/" url-pattern
Aquí está mi web.xml (editado por brevedad) que finalmente funcionó.
<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>
No he sido especialmente científico sobre la validación de todo esto, pero parece funcionar para mí ahora y estoy muy contento con eso.
Puede crear un archivo de bienvenida llamado index.jsp en la raíz con el siguiente código usando JSTL o de otro modo.
<c:redirect url="/main"/>
Entonces en el archivo web.xml tendrás esto:
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
Entonces, cualquier persona que solicite la raíz será redireccionada a / main. Ahora su servlet puede ser mapeado a main.
<servlet-mapping>
<servlet-name>MainServlet</servlet-name>
<url-pattern>/main</url-pattern>
</servlet-mapping>
Se menciona una solución en otro patrón de URL de subproceso para la asignación de servlets en web.xml mediante URLrewrite -> http://tuckey.org/urlrewrite/
Usando el elemento welcome-file de web.xml funcionó para mí, en el motor de la aplicación . Aquí está el mío:
<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>
Use un patrón vacío, por ejemplo
<servlet-mapping>
<servlet-name>MainServlet</servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
La especificación de servlet 3.0 ha aclarado esto:
La cadena vacía ("") es un patrón de URL especial que se asigna exactamente a la raíz de contexto de la aplicación
Por lo tanto, al menos debería funcionar en un contenedor 3.0, y he verificado que funciona en Jetty 8
No puede redirigir a WEB-INF. Un contenedor de servlet nunca atenderá solicitudes de documentos en esa carpeta.
Si desea que su aplicación (no solo un servlet, sino toda la aplicación) esté disponible en el contexto raíz ("/" de " http://www.domainname.com/ "), entonces necesita configurar un contexto. entrada para él, no una asignación de servlet.
Con Tomcat, agrega una nueva asignación de <Context>
(en uno de los 3 posibles lugares diferentes).