根据是否指定属性在标记文件中进行条件渲染
Conditional render in tagfile depending on whether the attribute is specified or not
我有一个 Facelet 标记文件,需要根据是否指定属性来呈现不同的组件。我试过如下,
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:pe="http://primefaces.org/ui/extensions"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:panelGrid columns="1">
<p:outputLabel value="test1" rendered="#{empty myParam}" />
<p:outputLabel value="test2" rendered="#{not empty myParam}" />
</h:panelGrid>
</ui:composition>
使用如下,
<mt:myTag myParam="#{myManagedBean.someProperty}" />
然而,它没有用。它采用 #{myManagedBean.someProperty}
的评估值。如果它是空的,那么它仍然显示 test1
。我如何检查 myParam
属性是否真的被设置了?
使用标记处理程序 class 创建另一个自定义标记,它检查当前 Facelet 上下文的变量映射器中某个属性的存在,并在 Facelet 范围内设置一个布尔值,指示所需属性的存在.最后在你的标签文件中使用它。
例如
<my:checkAttributePresent name="myParam" var="myParamPresent" />
<h:panelGrid columns="1">
<p:outputLabel value="test1" rendered="#{not myParamPresent}" />
<p:outputLabel value="test2" rendered="#{myParamPresent}" />
</h:panelGrid>
使用此标签处理程序:
public class CheckAttributePresentHandler extends TagHandler {
private String name;
private String var;
public CheckAttributePresentHandler(TagConfig config) {
super(config);
name = getRequiredAttribute("name").getValue();
var = getRequiredAttribute("var").getValue();
}
@Override
public void apply(FaceletContext context, UIComponent parent) throws IOException {
context.setAttribute(var, context.getVariableMapper().resolveVariable(name) != null);
}
}
在您的 .taglib.xml
中注册如下:
<tag>
<tag-name>checkAttributePresent</tag-name>
<handler-class>com.example.CheckAttributePresentHandler</handler-class>
<attribute>
<name>name</name>
<required>true</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<type>java.lang.String</type>
</attribute>
</tag>
我有一个 Facelet 标记文件,需要根据是否指定属性来呈现不同的组件。我试过如下,
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:pe="http://primefaces.org/ui/extensions"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<h:panelGrid columns="1">
<p:outputLabel value="test1" rendered="#{empty myParam}" />
<p:outputLabel value="test2" rendered="#{not empty myParam}" />
</h:panelGrid>
</ui:composition>
使用如下,
<mt:myTag myParam="#{myManagedBean.someProperty}" />
然而,它没有用。它采用 #{myManagedBean.someProperty}
的评估值。如果它是空的,那么它仍然显示 test1
。我如何检查 myParam
属性是否真的被设置了?
使用标记处理程序 class 创建另一个自定义标记,它检查当前 Facelet 上下文的变量映射器中某个属性的存在,并在 Facelet 范围内设置一个布尔值,指示所需属性的存在.最后在你的标签文件中使用它。
例如
<my:checkAttributePresent name="myParam" var="myParamPresent" />
<h:panelGrid columns="1">
<p:outputLabel value="test1" rendered="#{not myParamPresent}" />
<p:outputLabel value="test2" rendered="#{myParamPresent}" />
</h:panelGrid>
使用此标签处理程序:
public class CheckAttributePresentHandler extends TagHandler {
private String name;
private String var;
public CheckAttributePresentHandler(TagConfig config) {
super(config);
name = getRequiredAttribute("name").getValue();
var = getRequiredAttribute("var").getValue();
}
@Override
public void apply(FaceletContext context, UIComponent parent) throws IOException {
context.setAttribute(var, context.getVariableMapper().resolveVariable(name) != null);
}
}
在您的 .taglib.xml
中注册如下:
<tag>
<tag-name>checkAttributePresent</tag-name>
<handler-class>com.example.CheckAttributePresentHandler</handler-class>
<attribute>
<name>name</name>
<required>true</required>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<type>java.lang.String</type>
</attribute>
</tag>