如果您已經使用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
代替。
<context-param>
<param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
<param-value>com.example.FaceletsResourceResolver</param-value>
</context-param>
不管方式,以提供從數據庫中的資源,你要麼保存/緩存他們(:
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
如下
temp)磁盤文件系統,因此您可以僅通過File
提供URL
,或者創建自定義協議(例如db://
),並提供自定義URLStreamHandlerFactory
和URLStreamHandler
實現來執行流的實際作業來自DB。你可以在這裏找到一個開球的例子Registering and using a custom java.net.URL protocol。
嗨BalusC..This幫助讓我開始。我似乎與得到實際的.xhtml頁面正常工作。但它似乎沒有使用模板。我編輯問題以顯示我現在正在獲取的當前錯誤。 – JeffJak
該文件顯然不存在。當啓動示例不使用時,擴展啓動示例以使用'File#exists()'測試並返回'null'。 – BalusC
我想出了問題......您的解決方案確實有效。但這取決於我如何定義模板。例如,如果我使用template =「myfile.xhtml」,它將失敗。但是,如果我做template =「/ myfile.xhtml」它將進入ResourceResolver。 – JeffJak