gpt4 book ai didi

jsf - 自定义标记属性正在泄漏到子项中

转载 作者:行者123 更新时间:2023-12-04 02:19:47 24 4
gpt4 key购买 nike

我们的应用程序使用的是 Mojarra 2.1.29-03,我们的自定义标签中的属性也有问题,因为它们也被复制到嵌套标签中。

例如,给定以下标记定义:

cc.taglib.xml

<?xml version="1.0" encoding="UTF-8" ?>
<facelet-taglib version="2.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd">
<namespace>http://temp.com/jsf/customcomponents</namespace>
<tag>
<tag-name>wrapper</tag-name>
<source>wrapper.xhtml</source>
<attribute>
<description>The style class for the component</description>
<name>styleClass</name>
</attribute>
</tag>
</facelet-taglib>

包装器.xhtml

<?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">
<ui:component xmlns:ui="http://java.sun.com/jsf/facelets">
<div style="border: 1px solid black; margin: 5px;">
<p>styleClass: #{styleClass}</p>
<ui:insert />
</div>
</ui:component>
</html>

和一个客户页面:

<?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:h="http://java.sun.com/jsf/html" xmlns:cc="http://temp.com/jsf/customcomponents">
<h:body>
<cc:wrapper styleClass="cc-style">
<cc:wrapper />
</cc:wrapper>
</h:body>
</html>

结果如下:

styleClass: cc-style

styleClass: cc-style

...所以 styleClass 属性也被应用到内部标签,即使客户端页面没有设置它也是如此。

我们注意到,如果未明确设置,我们可以通过处理所有客户端页面来设置 styleClass=""来解决此问题,但这是我们希望避免的方法(这是一个非常丑陋的解决方案,不能强制执行)转发)。

这是一个错误吗?除了上面提到的方法之外,还有什么方法可以解决这个问题 - 最好是在标记而不是客户端页面中使用解决方法?

谢谢艾弗

最佳答案

这不是严格意义上的错误,但这确实是不直观和不受欢迎的行为,应该在 JSF/Facelets 规范中解决。

解决方案的工作并不简单,需要一个自定义标签处理程序来清除 Facelet 范围。 JSF 实用程序库 OmniFaces从 2.1 版开始就有这样一个: <o:tagAttribute> (source code here)。

用法(请注意,prolog、doctype 和 html 标签是不必要的,这是完整的文件):

<ui:composition 
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:o="http://omnifaces.org/ui"
>
<o:tagAttribute name="styleClass" />

<div style="border: 1px solid black; margin: 5px;">
<p>styleClass: #{styleClass}</p>
<ui:insert />
</div>
</ui:composition>

与具体问题无关,这不是自定义组件,而是标记文件。而且,在 JSF 2.x 中,术语“cc”通常与复合组件相关联,这是一个完全不同的主题。要获得正确的知识和术语(这样您在阅读自己或他人的代码时不会混淆自己或他人),请前往 When to use <ui:include>, tag files, composite components and/or custom components?

关于jsf - 自定义标记属性正在泄漏到子项中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31382903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com