首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >覆盖ui:insert和ui:include

覆盖ui:insert和ui:include
EN

Stack Overflow用户
提问于 2015-10-21 15:24:03
回答 1查看 1.2K关注 0票数 4

有关于如何在JSF中覆盖现有呈现程序的许多 其他 主题。所有这些都会导致faces-config中的相同条目。您“只”需要一个component-familyrenderer-typerender-kit-id及其在renderer-class中的实现。

我理解并能够复制所有这些示例,但在我的具体情况下,我想重写<ui:include><ui:insert>的行为。遗憾的是,我无法找出我必须将哪些值放在上面提到的属性中,因为文件ui:taglib.xml不像其他标记库那样冗长。

你知不知道,怎么才能推翻他们?

编辑: BalusC提到了另一个话题,它使用自定义标记,比如<my:include><my:insert>,但是我不想使用这些标记。如果我这样做了,我必须重构我现有的所有代码,如果不使用我的自定义标签库,我的未来代码将无法工作。

我想在<ui:include><ui:insert>的呈现之前挂起钩子,这样我就可以重用即将开发的插件,而不需要更改任何现有的代码。

EN

回答 1

Stack Overflow用户

发布于 2015-10-28 20:38:39

..。而不更改任何现有代码。

至少,如果不与特定的实现(Mojarra或MyFaces)紧密耦合,则是不行的。另一种选择是咬紧牙关,将所有<ui:include><ui:define>替换为<my:include><my:define>。Facelets尚未完全抽象/标准化到JSF规范中。这里只有一个Facelet缓存工厂,但没有Facelet工厂,否则就会很容易。通常,不要以抽象的方式自定义<ui:xxx>标记。你需要破解这个实现。

考虑到您使用的是mojarra2.1.19,您需要在web应用程序项目中铜种姓它的com.sun.faces.facelets.impl.DefaultFaceletContext类,并维护它的com.sun.faces.facelets.impl包。WAR中的类比WAR的/WEB-INF/lib和服务器的/lib中的类具有更高的类加载优先级。所以你的战争中会用这个代替。

考虑到您希望按照自定义ui:包括呈现以添加前缀/后缀 on <ui:include><ui:define>中的要求实现相同的目标

例如,假设一个空白的file.xhtml: 输入 输出

下面是通过编辑复制的DefaultFaceletContext类来实现它的方法:

  1. 向创建注释组件的类中添加一个助手方法(它只是一个纯文本输出组件)。 私有静态UIComponent createComment(字符串注释){ UIOutput text =新UIOutput();text.setValue("\n\n");返回文本;}
  2. 在第199行扩展oneliner方法includeFacelet(UIComponent, String),如下所示: parent.getChildren().add(createComment("START INCLUDE“+ relativePath));facelet.include(this,父级,relativePath);parent.getChildren().add(createComment("END INCLUDE”+ relativePath));
  3. 使用includeDefinition(UIComponent, String)在第366行前后扩展client.apply(this, parent, name),如下所示: int start = parent.getChildCount();found = client.apply(this,父级,名称);if (found) { parent.getChildren().add(start,createComment("START DEFINE“+ name));parent.getChildren().add(createComment("END DEFINE”+ name));}

然而,在测试期间,我发现了一个警告。我的HTML <title>模板如下所示:

代码语言:javascript
复制
<h:head>
    <title><ui:insert name="title">#{view.viewId}</ui:insert></title>
</h:head>

因此,注释也在<title>元素中结束。不幸的是,HTML中的注释是无效语法(只有PCDATA允许),它们被逐字解释,从而出现在文档标题中。您可能想要创建一个基于定义的nameparent的黑名单。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33263233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档