根据条件显示 JSF 值

Display a JSF value depending on a condition

我有一个 accordionPanel 如下:

<p:accordionPanel value="#{bean.list}" var="entry" 
    dynamic="true" cache="true">
    <p:tab title="#{entry.alias}">
        <h:panelGrid columns="2" cellpadding="10">
            <h:outputText value="#{entry.text}" />
        </h:panelGrid>
    </p:tab>
</p:accordionPanel>

并且在我的托管 Bean 中我初始化了两个列表:

public void init(){
    acceuil = 1;
    salles = salleService.listSalles();
    appareils = appareilService.list();
}

我正在使用 acceuil 变量,所以当我将它设置为 1 时,我将在另一方面使用 accordionPanel 中的 salles 列表,如果我将它设置为 2 我将在我的 accordionPanel 中使用 appareils 列表(注意 appareil 和 salle 对象具有相同的属性 aliastext 但他们没有公共 class 他们延伸的地方)。

所以在我的 jsf 页面中我想做这样的事情:

value="#{bean.acceuil == 1 ? bean.salles : bean.appareils}"

我该怎么做?

一个干净的解决方案是提供一个由 SaleAppareil 类 实现的接口。这样您就可以将它们限制在合同中:

public interface AliasAndText{
    public String getAlias();
    public String getText();
}

然后在您的托管 bean 中,使用单个列表,同时提供适当的操作方法来更改 acceuil 字段的值。与您给定的代码相比,该方法每次调用一个服务方法,将性能影响降到最低:

private List<AliasAndText> list;

private int acceuil = 0;

public void init(){
    //Initialize with the default acceuil value
    loadList();
}

private void loadList(){
    if (acceuil == 0){
        list = appareilService.list();
    }
    else{
        list = salleService.listSalles();
    }
}

public void actionSwitch(){
    acceuil = acceuil == 0 ? 1 : 0;
    loadList();
}

public List<AliasAndText> getList(){
    return list;
}

So in my jsf page I want to do something like this :

value="#{bean.acceuil == 1 ? bean.salles : bean.appareils}"

How can I do this ?

一种方式就是您提到的方式。这种方法没有错。如果这对您不起作用,那么这里一定有其他问题。您甚至可以“在运行时”在两个列表之间切换。请参阅以下示例:

JSF 表单:

<h:form>
    <h:outputText value="foobar is: #{myBean.foobar}" />
    <p:accordionPanel value="#{myBean.foobar == 1 ? myBean.fooList : myBean.barList}" 
                      var="entry" dynamic="true" cache="true">
        <p:tab title="#{entry.foo}">
            <h:panelGrid columns="2" cellpadding="10">
                <h:outputText value="#{entry.bar}" />
            </h:panelGrid>
        </p:tab>
    </p:accordionPanel>
    <p:commandButton actionListener="#{myBean.toggle()}" update="@form"/>
</h:form>

支持 Bean:

@Named
@ViewScoped
public class MyBean implements Serializable {

    @Getter private List<Foo> fooList = new ArrayList<>();
    @Getter private List<Bar> barList = new ArrayList<>();
    @Getter private int foobar;

    @PostConstruct
    private void init() {
        foobar = 1;
        fooList.add(new Foo());
        fooList.add(new Foo());
        fooList.add(new Foo());
        barList.add(new Bar());
        barList.add(new Bar());
    }

    public void toggle() {
        if(foobar == 1) {
            foobar = 2;
        } else {
            foobar =1;
        }
    }
}

POJO:

@Data
public class Foo {
    String foo = "Foo: Foo";
    String bar = "Foo: Bar";
}

@Data
public class Bar {
    String foo = "Bar: Bar";
    String bar = "Bar: FOO";
}

结果:

点击按钮后:

但是,我更喜欢@XtremeBiker 在其他答案中建议的解决方案。您应该将演示文稿中的逻辑减少到最低限度。但是,如果您不允许或无法在此处编写正确的代码,那么这些小事情可能没问题。