我有一个使用组合的应用程序(用于页面模板)。但我们认为创建一个Web应用程序(战争)来托管所有应用程序在同一主机中共享的所有模板。
如何从其他上下文中包含模板?这时我使用从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解决它们,而只是从类路径解决它们。只需将共享模板打包在例如JAR文件的/META-INF/resources
文件夹中,然后将解析程序类放在同一个JAR中。最后在所有webapps中分发这个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>