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

问题描述 投票:4回答:1

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

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

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

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

jsf facelets composition
1个回答
10
投票

请注意,在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>
© www.soinside.com 2019 - 2024. All rights reserved.