En una aplicación JSF, tenemos la jerarquía de directorios:

webapp
  xhtml
    login.xhtml
    main.xhtml
    search.xhtml
  css
    main.css
    extra.css
  js
    jquery.js

Etc. El mapeo de servlets es:

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

Esto funciona bien, pero las URL de nuestra aplicación web se ven así:

http://localhost/myapp/xhtml/login.xhtml
http://localhost/myapp/xhtml/search.xhtml

Nos gustaría tener URL más simples eliminando la parte /xhtml, es decir http: //localhost/myapp/login.xhtml

No pude encontrar ninguna forma de lograr esto. ¿Hay alguna forma de hacer esto en <servlet-mapping>? ¿Necesito algún marco adicional?

0
sleske 21 dic. 2011 a las 15:26

1 respuesta

La mejor respuesta

podrías hacerlo con un Filter. Ya sea de cosecha propia o de terceros, como URLRewriteFilter. Simplemente mapee en *.xhtml y luego reenvíe a /xhtml/*.

Algo así como:

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;

String ctx = request.getContextPath();
String uri = request.getRequestURI();
String viewId = uri.substring(ctx.length(), uri.length());

if (viewId.startsWith("/xhtml")) {
    // Redirect to URL without /xhtml (changes URL in browser address bar).
    response.setStatus(301);
    response.setHeader("Location", ctx + viewId.substring("/xhtml".length());
    // Don't use response.sendRedirect() as it does a temporary redirect (302).
} else {
    // Forward to the real location (doesn't change URL in browser address bar).
    request.getRequestDispatcher("/xhtml" + viewId).forward(request, response);
}

Pero más simple sería simplemente cambiar la jerarquía de directorios para deshacerse de la subcarpeta /xhtml. Esos archivos CSS / JS (e imágenes) deben colocarse preferiblemente en una subcarpeta /resources para que pueda utilizar los poderes de <h:outputStylesheet>, <h:outputScript> y <h:graphicImage> de manera adecuada. .

Véase también:

1
Community 20 jun. 2020 a las 12:12
Gracias por la respuesta detallada. Es bueno saber que puedo usar un filtro, pero si la forma recomendada es poner los XHTML directamente en webapp/, creo que eso es lo que haremos. No es necesario complicar demasiado las cosas ...
 – 
sleske
22 dic. 2011 a las 11:58