3

我需要自定义 ui:include 渲染器,使其在生成 HTML 输出时还会添加注释,说明包含文件的开始和结束。

例如,假设一个空白file.xhtml

输入

<ui:include src="file.xhtml" />

输出

<!-- START file.xhtml -->
<!-- END file.xhtml -->

目前我正在将 JSF2.2 与 MyFaces 一起使用,知道如何做到这一点吗?

4

3 回答 3

2

ui:include 不是UiComponent, 也没有渲染器。它是一个 Facelet TagHandler,因此在构建(或恢复)视图时执行。您必须对其进行修改以将具有所需注释的TagHandler其他实例包含到组件树中。ELInstruction

我认为 JSF 没有提供任何好的扩展点来覆盖现有标记库的标记处理程序。您可以在自己的标签库中定义新标签。您可以尝试替换现有的标记库定义,但我不确定这对于内置库是否可行。或者,您可以通过为该类提供您自己的定义(您可以通过复制和修改原始源代码获得)来隐藏类路径中原始标记处理程序的类定义。所有这些方法都需要复制框架代码,因此维护起来很脆弱。

于 2015-05-21T09:08:29.250 回答
1

我建议定义以下 facelet 标记:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:c="http://java.sun.com/jsp/jstl/core"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"
            >
<ui:composition>   
  <h:outputText value="&lt;START FILE!--#{source}--&gt;"/>
  <ui:include src="#{source}">
    <ui:insert name="includeParams"/>
  </ui:include>
  <h:outputText value="&lt;!--END FILE!--#{source}--&gt;"/>
</ui:composition>
</html>

并在代码中使用此标签代替 ui:include :

<my:include source="file.xhtml">
  <ui:define name="includeParams">
    <ui:param name="param1" value="value1"/>      
    <ui:param name="param2" value="value2"/>      
  </ui:define>
</my:include>
于 2015-05-25T07:26:45.470 回答
0

也可以通过TagDecorator元素进行自定义,但要实现您的目标需要付出一些努力。

但请注意:该解决方案仅适用<ui:param><ui:include>.

以下四个 TODO 是必要的:

  1. 在taglib.xml中定义一个 wrapper-tag

<namespace>http://my-namespace.com/tags/my-tags</namespace>

<tag>
    <tag-name>includeWithComment</tag-name>
    <source>my/package/includeWithComment.xhtml</source>

    <attribute>
        <name>src</name>
    </attribute>
</tag>
  1. 为您的包装器includeWithComment.xhtml创建 xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets">
<ui:composition>

    <!-- START ${src} -->
    <ui:include src="${src}" />
    <!-- END ${src} -->

</ui:composition>
</html>
  1. 在web.xml中定义您的 TagDecorator,如下所示:
<context-param>
    <param-name>javax.faces.FACELETS_DECORATORS</param-name>
    <param-value>my.package.CommentTagDecorator</param-value>
</context-param>
  1. 创建你的 TagDecorator 并让它充满活力。(取自这篇博文
package my.package;

public class CommentTagDecorator implements TagDecorator {

    @Override
    public Tag decorate(Tag tag) {
        if (!tag.getNamespace().equals("http://xmlns.jcp.org/jsf/facelets")
            || !tag.getLocalName().equals("include")
        ) {
            return null;
        }

        return new Tag(tag.getLocation(), "http://my-namespace.com/tags/my-tags",
            "includeWithComment", "t:includeWithComment", tag.getAttributes());
    }
}

最后你的输出看起来像

<!-- START /include/popup.xhtml -->
[...]
<!-- END /include/popup.xhtml -->
于 2017-01-09T17:27:34.647 回答