有关于如何在JSF中覆盖现有呈现程序的许多 其他 主题。所有这些都会导致faces-config中的相同条目。您“只”需要一个component-family、renderer-type、render-kit-id及其在renderer-class中的实现。
我理解并能够复制所有这些示例,但在我的具体情况下,我想重写<ui:include>和<ui:insert>的行为。遗憾的是,我无法找出我必须将哪些值放在上面提到的属性中,因为文件ui:taglib.xml不像其他标记库那样冗长。
你知不知道,怎么才能推翻他们?
编辑: BalusC提到了另一个话题,它使用自定义标记,比如<my:include>或<my:insert>,但是我不想使用这些标记。如果我这样做了,我必须重构我现有的所有代码,如果不使用我的自定义标签库,我的未来代码将无法工作。
我想在<ui:include>和<ui:insert>的呈现之前挂起钩子,这样我就可以重用即将开发的插件,而不需要更改任何现有的代码。
发布于 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类来实现它的方法:
includeFacelet(UIComponent, String),如下所示:
parent.getChildren().add(createComment("START INCLUDE“+ relativePath));facelet.include(this,父级,relativePath);parent.getChildren().add(createComment("END INCLUDE”+ relativePath));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>模板如下所示:
<h:head>
<title><ui:insert name="title">#{view.viewId}</ui:insert></title>
</h:head>因此,注释也在<title>元素中结束。不幸的是,HTML中的注释是无效语法(只有PCDATA允许),它们被逐字解释,从而出现在文档标题中。您可能想要创建一个基于定义的name或parent的黑名单。
https://stackoverflow.com/questions/33263233
复制相似问题