Wenn Sie bereits JSF 2.2 verwenden, können Sie dies tun, indem Sie eine benutzerdefinierte ResourceHandler
angeben, in der Sie die gewünschte Ansichtsressource in createViewResource()
zurückgeben.
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;
}
}
Welche wie unten in faces-config.xml
registriert ist:
<application>
<resource-handler>com.example.FaceletsResourceHandler</resource-handler>
</application>
Oder wenn Sie nicht auf JSF sind 2.2 noch, dann ResourceResolver
stattdessen verwenden.
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;
}
}
Welche wie unten in web.xml
registriert ist:
<context-param>
<param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
<param-value>com.example.FaceletsResourceResolver</param-value>
</context-param>
Unabhängig von der Art und Weise, um die Ressource aus der Datenbank zur Verfügung zu stellen, würden Sie entweder speichern/cache sie auf (Temp) Disk-Dateisystem, so können Sie die URL
nur über File
bereitstellen, oder erfinden Sie ein benutzerdefiniertes Protokoll wie db://
und bieten eine benutzerdefinierte URLStreamHandlerFactory
und URLStreamHandler
Implementierung, um den eigentlichen Job von Stream durchzuführen aus der DB. Sie können hier ein Kickoff-Beispiel finden Registering and using a custom java.net.URL protocol.
Hallo BalusC..Dies ist mir geholfen, mich zu starten. Es scheint mir gut zu sein, tatsächliche .xhtml-Seiten zu bekommen. Aber es scheint nicht mit der Verwendung der Vorlage zu arbeiten. Ich bearbeite die Frage, um den aktuellen Fehler zu zeigen, den ich jetzt bekomme. – JeffJak
Die Datei existiert anscheinend nicht. Erweitern Sie das Kickoff-Beispiel, um den Test 'File # exists()' zu verwenden, und geben Sie 'null' zurück, wenn dies nicht der Fall ist. – BalusC
Ich habe das Problem herausgefunden ... Ihre Lösung funktioniert. Aber es hängt davon ab, wie ich die Vorlage definiere. Wenn ich beispielsweise template = "myfile.xhtml" verwende, wird es fehlschlagen. Aber wenn ich template = "/ myfile.xhtml" mache, wird es in den ResourceResolver gelangen. – JeffJak