Jef*_*Jak 7 resources jsf external facelets jsf-2
我能够成功地使用我的应用程序中的模板:
<ui:decorate template="/WEB-INF/templates/mytemplate.xhtml">
Run Code Online (Sandbox Code Playgroud)
我还可以移动模板/META-INF/templates/mytemplate.xhtml一的JAR和得到这个工作:
<ui:decorate template="/templates/mytemplate.xhtml">
Run Code Online (Sandbox Code Playgroud)
我实际上想把这个文件放到文件系统(或数据库)上.我怎样才能做到这一点?我发现很多相关的东西com.sun.facelets.impl.DefaultResourceResolver,但我认为这实际上与覆盖模板的服务有关.它不是尝试解析URL,它只是试图以某种方式在类路径上获取文件.
Bal*_*usC 12
如果您已经使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
注册faces-config.xml如下:
<application>
<resource-handler>com.example.FaceletsResourceHandler</resource-handler>
</application>
Run Code Online (Sandbox Code Playgroud)
或者,如果您还没有使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
注册web.xml如下:
<context-param>
<param-name>javax.faces.FACELETS_RESOURCE_RESOLVER</param-name>
<param-value>com.example.FaceletsResourceResolver</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
无论如何,为了从数据库提供资源,您可以将它们保存/缓存在(临时)磁盘文件系统上,这样您就可以提供URL直接通过File,或发明自定义协议,例如db://并提供自定义URLStreamHandlerFactory和URLStreamHandler实现从DB执行流式传输的实际工作.您可以在此处找到启动示例注册和使用自定义java.net.URL协议.
| 归档时间: |
|
| 查看次数: |
3004 次 |
| 最近记录: |