Customize FacesServlet to get rid of .xhtml extension

前端 未结 2 1878
萌比男神i
萌比男神i 2020-12-03 04:03

I have Login.xhtml and Home.xhtml. I configured the url pattern in web.xml as follows


   

        
相关标签:
2条回答
  • 2020-12-03 04:34

    Take a look at prettyfaces: Pretty URLs for JavaServer Faces ,

    Look at the 2. Create pretty-config.xml example in the main page

    And take a look at the Chapter 2. Get Started

    0 讨论(0)
  • 2020-12-03 04:36

    If your sole reason is to get rid of the .xhtml extension, then there are various ways depending on the JSF version you're using.

    JSF 2.3+

    JSF 2.3 offers a new API to collect all views: the ViewHandler#getViews(). Combine this with ServletRegistration#addMapping() in a ServletContextListener as below.

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

    Effectively, this is an oneliner. Source: Arjan Tijms' Blog and The Definitive Guide to JSF.

    If you're using MyFaces as JSF 2.3 implementation, then this can be transparently activated by solely the following web.xml context parameter:

    <context-param>
        <param-name>org.apache.myfaces.AUTOMATIC_EXTENSIONLESS_MAPPING</param-name>
        <param-value>true</param-value>
    </context-param>
    

    Mojarra does not have an equivalent yet.

    JSF 2.2-

    Use OmniFaces FacesViews. It offers a zero-configuration way to achieve that by placing the view files in /WEB-INF/faces-views/ folder. Otherwise, if you intend to not modify your project structure and want to keep your view files at the usual place and still benefit of extensionless URLs, then it's a matter of adding the following context parameter:

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

    In case you don't want to use OmniFaces, but rather want to homegrow your own, just look at source code of OmniFaces. It's open source under Apache 2.0 License. It's only not an oneliner.

    0 讨论(0)
提交回复
热议问题