我有一个使用组合的应用程序(用于页面模板)。但是我们认为在创建一个 web 应用程序( war )来托管所有应用程序共享的所有应用程序的所有模板。
如何包含来自其他上下文的模板?此时我使用从 http 请求导入。但这听起来很糟糕。<ui:composition template="http://localhost:8080/templates/layout/foo.xhtml">
我正在使用 JBoss Seam 2.x 和 JSF 1。
最佳答案
请注意,这在 JSF 2.x Facelets 中的处理方式不同,参见 this answer详情。
这可以通过自定义 Facelets 资源解析器实现。我不仅不会通过 HTTP 解析它们,而只会从类路径中解析它们。只需将共享模板打包在例如 /META-INF/resources
中JAR 文件的文件夹,并将解析器类放在同一个 JAR 中。最后在所有 webapp 中分发这个 JAR。
package com.example;
import java.net.URL;
import com.sun.facelets.impl.DefaultResourceResolver;
public class FaceletsResourceResolver extends DefaultResourceResolver {
private String basePath;
public FaceletsResourceResolver() {
this.basePath = "/META-INF/resources"; // TODO: Make configureable?
}
public URL resolveUrl(String path) {
URL url = super.resolveUrl(path); // Resolves from WAR.
if (url == null) {
url = getClass().getResource(basePath + path); // Resolves from JAR.
}
return url;
}
}
在
web.xml
注册如下:<context-param>
<param-name>facelets.RESOURCE_RESOLVER</param-name>
<param-value>com.example.FaceletsResourceResolver</param-value>
</context-param>
关于jsf - 如何对来自另一个上下文的文件使用 Facelets 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587808/