我为我的 JSF 2.2 应用程序创建了以下自定义标签:
<et:gridRowLabelPasswordMessage
label_name="Password"
password_id="password"
password_value="#{myAuthenticator.password}"
password_required="true"
password_match=""
password_binding="#{pw}" />
以下是自定义标签文件的关键部分:
<p:password
id="#{password_id}"
value="#{password_value}"
placeholder="#{label_name}"
binding="#{password_binding}"
required="#{password_required}"
requiredMessage="#{label_name} is required."
match="#{password_match}" />
由于 PrimeFaces p:password 的问题,我无法设置 match="" 所以我需要测试 password_match 并且只有在 password_match 不为空时才包含 match。首先,我尝试使用 ui:fragment ,如下所示:
<ui:fragment rendered="#{empty password_match}">
<p:password
id="#{password_id}"
value="#{password_value}"
placeholder="#{label_name}"
binding="#{password_binding}"
required="#{password_required}"
requiredMessage="#{label_name} is requred." />
</ui:fragment>
<ui:fragment rendered="#{not empty password_match}">
<p:password
id="#{password_id}"
value="#{password_value}"
placeholder="#{label_name}"
binding="#{password_binding}"
required="#{password_required}"
requiredMessage="#{label_name} is requred."
match="#{password_match}" />
</ui:fragment>
结果是当我设置 password_match = "" 时 p:password 根本没有呈现。换句话说,两个测试都没有返回 true。我唯一的理论是 ui:fragment 在自定义标记文件中不起作用。
然后我将我的代码更改为以下代码,它按预期工作。
<c:choose>
<c:when test="#{empty password_match}">
<p:password
id="#{password_id}"
value="#{password_value}"
placeholder="#{label_name}"
binding="#{password_binding}"
required="#{password_required}"
requiredMessage="#{label_name} is required." />
</c:when>
<c:otherwise>
<p:password
id="#{password_id}"
value="#{password_value}"
placeholder="#{label_name}"
binding="#{password_binding}"
required="#{password_required}"
requiredMessage="#{label_name} is required."
match="#{password_match}" />
</c:otherwise>
</c:choose>