自定义ui:包括渲染以添加前缀/后缀



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

示例,假设一个空白的file.xhtml:

输入

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

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

此刻我正在使用JSF2.2与MyFaces,任何关于我怎么能做到这一点的想法?

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

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

我建议定义以下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:在代码中包含:

<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>

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

但是要小心:这个解决方案只有在<ui:include>里面没有<ui:param>的情况下才有效。

以下四项todo是必要的:

  1. taglib.xml
  2. 中定义一个wrapper标签

<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>
  • 为包装器创建xhtmlincludeWithComment.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>
    
  • web.xml中定义你的TagDecorator,如下所示:
    <context-param>
        <param-name>javax.faces.FACELETS_DECORATORS</param-name>
        <param-value>my.package.CommentTagDecorator</param-value>
    </context-param>
    
    创建你的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 -->
    

    相关内容

    • 没有找到相关文章

    最新更新