从外部文件系统或数据库获取Facelets模板/文件

我能够成功地得到这个与我的应用程序中的模板一起工作:

<ui:decorate template="/WEB-INF/templates/mytemplate.xhtml"> 

我也可以将模板移动到JAR的 /META-INF/templates/mytemplate.xhtml并使其工作:

 <ui:decorate template="/templates/mytemplate.xhtml"> 

我实际上想把这个文件放在文件系统(或者数据库)上。 我怎样才能做到这一点? 我发现很多与com.sun.facelets.impl.DefaultResourceResolver有关的东西,但我不认为这实际上是覆盖模板的服务。 它不是试图parsing一个URL,它只是试图在类path上获取文件。

如果您已经使用JSF 2.2,则可以通过提供一个自定义的ResourceHandler来完成此操作,其中您将在createViewResource()返回所需的视图资源。

 public class FaceletsResourceHandler extends ResourceHandlerWrapper { private ResourceHandler wrapped; public FaceletsResourceHandler(ResourceHandler wrapped) { this.wrapped = wrapped; } @Override public ViewResource createViewResource(FacesContext context, final String name) { ViewResource resource = super.createViewResource(context, name); if (resource == null) { resource = new ViewResource() { @Override public URL getURL() { try { return new File("/some/base/path", name).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.FaceletsResourceHandler</resource-handler> </application> 

或者,如果您还没有使用JSF 2.2,那么请改用ResourceResolver

 public class FaceletsResourceResolver extends ResourceResolver { private ResourceResolver parent; public FaceletsResourceResolver(ResourceResolver parent) { this.parent = parent; } @Override public URL resolveUrl(String path) { URL url = parent.resolveUrl(path); // Resolves from WAR. if (url == null) { try { url = new File("/some/base/path", path).toURI().toURL(); } catch (MalformedURLException e) { throw new FacesException(e); } } return url; } } 

web.xml注册如下:

 <context-param> <param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name> <param-value>com.example.FaceletsResourceResolver</param-value> </context-param> 

无论如何,为了从数据库提供资源,你要么将它们保存在(临时)磁盘文件系统上,以便你可以通过File提供URL ,或者创build一个自定义的协议,如db://并提供一个自定义的URLStreamHandlerFactoryURLStreamHandler实现来执行从数据库stream式传输的实际工作。 你可以在这里find一个开始的例子注册和使用一个自定义的java.net.URL协议 。