gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:30:13 26 4
gpt4 key购买 nike

我能够成功地使其与我的应用程序中的模板一起使用:

<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 相关的内容,但我认为这实际上与覆盖模板的服务无关。它并不尝试解析 URL,它只是尝试以某种方式在类路径上获取文件。

最佳答案

如果您已经使用 JSF 2.2,则可以通过提供自定义 ResourceHandler 来实现此目的其中您在 createViewResource() 中返回所需的 View 资源.

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>
<小时/>

无论如何,为了从数据库提供资源,您可以将它们保存/缓存在(临时)磁盘文件系统上,这样您就可以通过提供URL >文件,或者发明一个自定义协议(protocol),例如db://并提供自定义URLStreamHandlerFactoryURLStreamHandler执行从数据库流式传输的实际工作。您可以在此处找到启动示例 Registering and using a custom java.net.URL protocol .

关于jsf - 从外部文件系统或数据库获取 Facelets 模板/文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13292272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com