Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 自定义ui:包括渲染以添加前缀/后缀_Jsf_Jsf 2_Customization_Facelets_Uiinclude - Fatal编程技术网

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

Jsf 自定义ui:包括渲染以添加前缀/后缀,jsf,jsf-2,customization,facelets,uiinclude,Jsf,Jsf 2,Customization,Facelets,Uiinclude,我需要定制ui:include渲染器,使其在生成HTML输出时还添加一条注释,说明包含文件的开始和结束 例如,假设一个空白的文件.xhtml: 输入 <ui:include src="file.xhtml" /> <!-- START file.xhtml --> <!-- END file.xhtml --> 输出 <ui:include src="file.xhtml" /> <!-- START file.xhtml --&g

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

例如,假设一个空白的
文件.xhtml

输入

<ui:include src="file.xhtml" />
<!-- START file.xhtml -->
<!-- END 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: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>

也可以通过元素进行定制,但要实现您的目标还需要一些努力

但要小心:只有在
中没有
时,解决方案才有效

以下四个TODO是必需的:

  • 在taglib.xml中定义包装器标记
  • 最后,您的输出将如下所示

    
    [...]
    
    我已经尝试过了,但似乎无法将其用于内部ui:param,参数被忽略。相关/duplicate: