Настройка FacesServlet, чтобы избавиться от.расширение xhtml

я Login.xhtml и Home.xhtml. Я настроил шаблон url в web.xml следующим образом

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

<welcome-file-list>
  <welcome-file>Login.xhtml</welcome-file>
</welcome-file-list>

когда я запускаю весь проект, страница входа URL вот так http://localhost:8080/fran/Login.xhtml здесь fran это имя моего проекта..

однако, я хотел бы, чтобы это было http://localhost:8080/fran/Login/ вместо http://localhost:8080/fran/Login.xhtml.

как я могу этого достичь? Можно ли настроить <url-pattern> для каждой страницы, чтобы избавиться от .xhtml продление?


решить

как BalusC упоминалось ниже в комментарии... OmniFaces FacesViews является удивительным. Вот шаги, которые я сделал:

  • место omnifaces-1.5.jar на .
  • добавить ниже код web.xml:

    <context-param>
        <param-name>org.omnifaces.FACES_VIEWS_SCAN_PATHS</param-name>
        <param-value>/*.xhtml</param-value>
    </context-param>
    

это все в конфигурации. Он отлично работает.

2 ответов


если ваша единственная причина, чтобы избавиться от .xhtml расширение, то есть различные способы в зависимости от используемой версии JSF.

JSF 2.3+

JSF 2.3 предлагает новый API для сбора всех представлений:ViewHandler#getViews(). Объедините это с ServletRegistration#addMapping() на ServletContextListener как ниже.

@FacesConfig
@WebListener
public class ApplicationConfig implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        addExtensionLessMappings(event.getServletContext(), FacesContext.getCurrentInstance());
    }

    private void addExtensionLessMappings(ServletContext servletContext, FacesContext facesContext) {
        servletContext
            .getServletRegistrations().values().stream()
            .filter(servlet -> servlet.getClassName().equals(FacesServlet.class.getName()))
            .findAny()
            .ifPresent(facesServlet -> facesContext
                .getApplication()
                .getViewHandler()
                .getViews(facesContext, "/", ViewVisitOption.RETURN_AS_MINIMAL_IMPLICIT_OUTCOME)
                .forEach(view -> facesServlet.addMapping(view))
        );
    }
}

эффективно, это oneliner. Источник:окончательное руководство по JSF.

JSF 2.2 -

использовать OmniFaces FacesViews. Он предлагает способ нулевой конфигурации для достижения этого путем размещения файлов представления в . В противном случае, если вы не собираетесь изменять структуру проекта и хотите сохранить файлы представления в обычном месте и по-прежнему использовать URL-адреса без расширения, то необходимо добавить следующий параметр контекста:

<context-param>
    <param-name>org.omnifaces.FACES_VIEWS_SCAN_PATHS</param-name>
    <param-value>/*.xhtml</param-value>
</context-param>

если вы не хотите использовать OmniFaces, а хотите создать свой собственный, просто посмотрите на источник код в OmniFaces. Это с открытым исходным кодом под лицензией Apache 2.0. Это только не проявляющаяся.


посмотри prettyfaces: довольно URL-адреса для Javaserver Faces ,

посмотреть 2. Создайте pretty-config.пример xml на главной странице

и взгляните на Глава 2. Начало Работы