6

我的表单上有 if-else 条件,我在其中显示标题和按钮文本以进行添加和更新。

下面的代码是我在 struts2 项目中使用的代码,以及想要在 xhtml 页面的 JSF2 项目中使用的相同代码。

Struts2 页面

 <s:if test="person==null || person.id==null || person.id==''">
                <s:set var="buttonText" value="getText('person.button.add')"/>
                <s:text name="person.h1.add.text"/>
                <i><s:text name="person.smallfont.add.text"/></i>
            </s:if>
            <s:else>
                <s:set var="buttonText" value="getText('person.button.edit')"/>
                <s:text name="person.h1.edit.text"/>
                <s:text name="person.smallfont.edit.text"/>
            </s:else>

我可以在 xhtml 页面中使用 JSTL 并按原样使用上面的代码,但我看到了不同的方法,比如下面使用 EL。我不确定,但不喜​​欢下面的方法

<h:outputLabel value="Add Information" rendered="#{!empty personBean.person.id}" />
<h:outputLabel value="Use the form below to add your information." rendered="#{!empty personBean.person.id}" />

<h:outputLabel value="Update Information" rendered="#{empty personBean.person.id}" />
<h:outputLabel value="Use the form below to edit your information." rendered="#{empty personBean.person.id}" />

我的问题:

请有人指导我如何在 JSF 项目中的 IF-ELSE 条件下使用上述代码。使用 EL/JSTL 还是其他?

4

2 回答 2

15

确实只是使用该rendered属性。如有必要,您可以将其包装在另一个根本不发出任何 HTML 的组件中,例如<h:panelGroup>or <ui:fragment>,这样您就不需要rendered在所有后续组件上重复相同的条件。

<h:panelGroup rendered="#{not empty personBean.person.id}">
    Add Information
    <i>Use the form below to add your information.</i>
</h:panelGroup>
<h:panelGroup rendered="#{empty personBean.person.id}">
    Update Information
    <i>Use the form below to edit your information.</i>
</h:panelGroup>

请注意,<h:outputLabel>生成的 HTML元素在语义上与您最初拥有<label>的含义完全不同。<s:text>您可能想<h:outputText>改用或完全省略它。JSF2/Facelets 只支持纯文本甚至模板文本中的 EL,而不需要<h:outputText>.

也可以看看:

于 2012-11-28T00:03:29.867 回答
2

如果您想避免在“else”块中编写容易出错的条件否定,您可以利用JSF2 的复合组件特性自行创建 if-then-else 组件:

定义:
创建包含以下内容的文件webapp/resources/my/if.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:cc="http://java.sun.com/jsf/composite">
<cc:interface>
    <cc:attribute name="condition" required="true"/>
    <cc:facet name="then"/>
    <cc:facet name="else" />
</cc:interface>

<cc:implementation>
    <ui:fragment rendered="#{cc.attrs.condition}" >
        <cc:renderFacet name="then" />
    </ui:fragment>
    <ui:fragment rendered="#{not cc.attrs.condition}" >
        <cc:renderFacet name="else" />
    </ui:fragment>
</cc:implementation>
</html>

用法:
然后您可以在应用程序的任何位置使用该组件。标签名称 - if- 绑定到包含组件定义的文件名,标签 xml 命名空间的最后部分 - my- 由包含组件定义的目录名称确定:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:my="http://java.sun.com/jsf/composite/my">

<f:view>
    <my:if condition="#{bean.property != null}">
        <f:facet name="then">
            <h:outputText value="#{bean.property}"/>
        </f:facet>
        <f:facet name="else">
            <h:outputText value="[null]"/>
        </f:facet>
    </my:if>
</f:view>
</html>

资源:

于 2015-03-06T19:05:16.190 回答