在外部固定磁盘文件系统路径而不是 WAR 中查找 Facelets 文件

Lookup Facelets files in external fixed disk file system path instead of in WAR

我正在尝试将 JSF (2.2.10) 集成到非 JSF 现有项目中。 为了符合现有项目结构,我想自定义 Mojarra 搜索页面的路径而不修改 url(或使用外部 url-rewrite)

访问JSF页面的路径

http://my.web.app/context/faces/page1.xhtml

基本上查找方案将从

webapp\
       templates\
       WEB-INF\
              lib
       page1.xhtml
       page2.xhtml
       etc...

mydir_outside_webapp\
                    templates\
                    page1.xhtml
                    page2.xhtml
                    etc...
...
webapp\
       templates\
       WEB-INF\
               lib

我找不到自定义 JSF 以实现所需行为的方法。 啊,应用程序没有捆绑在 war 中,而是部署在目录结构中

感谢您的支持!

您可以使用自定义 ResourceHandler for this wherein you override createViewResource() 方法先签入外部文件夹。

public class ExternalResourceHandler extends ResourceHandlerWrapper {

    private ResourceHandler wrapped;
    private File externalResourceFolder;

    public ExternalResourceHandler(ResourceHandler wrapped) {
        this.wrapped = wrapped;
        externalResourceFolder = new File("/path/to/external/resources");
    }

    @Override
    public ViewResource createViewResource(FacesContext context, String path) {
        ViewResource resource = super.createViewResource(context, path); // First try local.

        if (resource == null) { // None found? Try external.
            final File externalResource = new File(externalResourceFolder, path);
            if (externalResource.exists()) {
                resource = new ViewResource() {
                    @Override
                    public URL getURL() {
                        try {
                            return externalResource.toURI().toURL();
                        } catch (MalformedURLException e) {
                            throw new FacesException(e);
                        }
                    }
                };
            }
        }

        return resource;
    }

    @Override
    public ResourceHandler getWrapped() {
        return wrapped;
    }

}

要达到运行,在faces-config.xml中按如下方式注册:

<application>
    <resource-handler>com.example.ExternalResourceHandler</resource-handler>
</application>