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

时间:2015-05-21 08:47:23

标签: jsf jsf-2 customization facelets uiinclude

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

示例,假设空白file.xhtml

输入

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

输出

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

目前我正在使用JSF2.2与MyFaces,我对如何做到这一点有任何想法?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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>

答案 2 :(得分:0)

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

但要小心:如果<ui:param>内没有<ui:include>,解决方案才有效。

以下四个TODO是必要的:

  1. taglib.xml
  2. 中定义包装标记

    <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. 为包装器创建xhtml includeWithComment.xhtml
    2. <?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,如下所示:
      2. <context-param>
            <param-name>javax.faces.FACELETS_DECORATORS</param-name>
            <param-value>my.package.CommentTagDecorator</param-value>
        </context-param>
        
        1. 创建TagDecorator并填充生命。 (摘自this blogpost
        2. 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 -->