根据条件显示 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 对象具有相同的属性 alias
和 text
但他们没有公共 class 他们延伸的地方)。
所以在我的 jsf 页面中我想做这样的事情:
value="#{bean.acceuil == 1 ? bean.salles : bean.appareils}"
我该怎么做?
一个干净的解决方案是提供一个由 Sale
和 Appareil
类 实现的接口。这样您就可以将它们限制在合同中:
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 在其他答案中建议的解决方案。您应该将演示文稿中的逻辑减少到最低限度。但是,如果您不允许或无法在此处编写正确的代码,那么这些小事情可能没问题。
我有一个 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 对象具有相同的属性 alias
和 text
但他们没有公共 class 他们延伸的地方)。
所以在我的 jsf 页面中我想做这样的事情:
value="#{bean.acceuil == 1 ? bean.salles : bean.appareils}"
我该怎么做?
一个干净的解决方案是提供一个由 Sale
和 Appareil
类 实现的接口。这样您就可以将它们限制在合同中:
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 在其他答案中建议的解决方案。您应该将演示文稿中的逻辑减少到最低限度。但是,如果您不允许或无法在此处编写正确的代码,那么这些小事情可能没问题。