Obtención de plantillas / archivos de Facelets desde un sistema de archivos o base de datos externo

Puedo hacer que funcione con éxito con la plantilla en mi aplicación:

 

También puedo mover la plantilla a /META-INF/templates/mytemplate.xhtml de un JAR y hacer que funcione:

  

De hecho, me gustaría poner este archivo en el sistema de archivos (o en la base de datos). ¿Cómo puedo conseguir esto? Encontré muchas cosas relacionadas con com.sun.facelets.impl.DefaultResourceResolver , pero no creo que estén relacionadas para anular la publicación de la plantilla. No es tratar de resolver una URL, simplemente está tratando de obtener el archivo de alguna manera en la ruta de clases.

Si ya está en JSF 2.2, puede hacer esto al proporcionar un ResourceHandler personalizado en el que devuelve el recurso de vista deseado en 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; } } 

Que se registra en faces-config.xml siguiente manera:

  com.example.FaceletsResourceHandler  

O si aún no está en JSF 2.2, use ResourceResolver lugar.

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

Que está registrado en web.xml siguiente manera:

  javax.faces.FACELETS_RESOURCE_RESOLVER com.example.FaceletsResourceResolver  

Independientemente de la forma, para proporcionar el recurso de la base de datos, puede guardarlos / almacenarlos en caché en un sistema de archivos de disco (temp) para que pueda proporcionar la URL solo a través de File , o inventar un protocolo personalizado como db:// y proporcionar una URLStreamHandlerFactory personalizada URLStreamHandlerFactory y URLStreamHandler para realizar el trabajo real de la transmisión desde la base de datos. Aquí puede encontrar un ejemplo de kickoff Registro y uso de un protocolo personalizado java.net.URL .

    Intereting Posts