如何将Facelets组合与来自其他上下文的文件一起使用

Otá*_*cia 4 jsf facelets composition

我有一个使用组合的应用程序(用于页面模板).但我们认为创建一个Web应用程序(战争)来托管所有应用程序在同一主机中共享的所有模板.

如何从其他上下文中包含模板?这时我使用从http请求导入.但这听起来很糟糕.

<ui:composition template="http://localhost:8080/templates/layout/foo.xhtml">

我正在使用JBoss Seam 2.x和JSF 1.

Bal*_*usC 10

请注意,在JSF 2.x Facelets中要做的不同,请参阅此答案以获取详细信息.

使用自定义Facelets资源解析器可以实现这一点.我不会通过HTTP解决它们,而只是从类路径解决它们.只需将共享模板打包在例如/META-INF/resourcesJAR文件的文件夹中,然后将解析器类放在同一个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;
    }

}
Run Code Online (Sandbox Code Playgroud)

注册web.xml如下:

<context-param>
    <param-name>facelets.RESOURCE_RESOLVER</param-name>
    <param-value>com.example.FaceletsResourceResolver</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)