Можно ли в JSF подавить часть иерархии каталогов файла XHTML в URL-адресе? - PullRequest
0 голосов
/ 21 декабря 2011

В приложении JSF у нас есть иерархия каталогов:

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

и т. Д.Отображение сервлета:

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

Это прекрасно работает, но URL-адреса нашего веб-приложения выглядят так:

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

Мы хотели бы иметь более простые URL-адреса, отбрасывая /xhtml part, то есть http://localhost/myapp/login.xhtml

Я не мог найти способ сделать это.Есть ли способ сделать это в <servlet-mapping>?Нужна ли какая-то дополнительная структура?

1 Ответ

1 голос
/ 21 декабря 2011

Вы могли бы сделать это с Filter.Либо доморощенный, либо сторонний, например URLRewriteFilter .Просто сопоставьте его с *.xhtml и затем перейдите к /xhtml/*.

Что-то вроде:

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);
}

Но проще было бы просто изменить иерархию каталогов, чтобы избавиться от /xhtmlвложенная папка.Эти файлы CSS / JS (и изображения) предпочтительно следует помещать в подпапку /resources, чтобы вы могли надлежащим образом использовать возможности <h:outputStylesheet>, <h:outputScript> и <h:graphicImage>.

См.также:

...