不幸的是,这是"by design" . #{} 表达式的评估被推迟到访问时间的确切时刻 . 它们与JSP中的"standard" EL ${} 不同,它们在标记处理程序和"cached"解析的确切时刻进行评估,以便在同一请求/视图期间进行访问 . 在渲染 的那一刻,因此 UIInput#isRequired() 引用的 #{cc.attrs.required} 需要被评估,在EL上下文中没有任何 #{cc} 的方法 . 所以它的任何属性都不会评估任何东西 . 只有当你坐在 内时, #{cc} 才能在EL上下文中使用,因此它的所有属性都会成功评估 .
从技术上讲,这是 设计中一个不幸的角落案件疏忽 . 标准JSF和EL表现为指定的行为 . 基本上,标签's asterisk depending on the input' s required 属性的呈现应该以相反的方式进行评估:此时复合内部的 将被呈现,或者甚至已经在需要时,但是输入组件应该以某种方式通知标签它所需的组件 . 这反过来又变得艰难而且笨拙(因而效率低下) .
如果将标签移动到复合材料内部不是一个选项,那么最好的办法是在输入组件周围创建一个标签文件而不是复合组件 . 它只需要一些额外的XML样板 .
/WEB-INF/tags/input.xhtml :
xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
>
/WEB-INF/my.taglib.xml :
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"
version="2.0"
>
http://example.com/my
input
tags/input.xhtml
/WEB-INF/web.xml :
javax.faces.FACELETS_LIBRARIES
/WEB-INF/my.taglib.xml
用法:
...
我只是做了一个快速测试,它对我来说很好 .
另见:
When to useui:include, tag files, composite components and/or custom components?