2012-12-21 44 views
0

嗨我有一個關於動態顯示HtmlSelectOneMenu值的問題。下面是一個描述我的問題的小應用程序。根據SelectItem信息更改HtmlSelectOneMenu顯示值

我在我的支持bean中有一個汽車列表List<Car> carList = new ArrayList<Car>()

汽車是抽象類和ToyotaFord延伸Car

現在我需要根據類的類型在selectonemenu中顯示不同的消息。如果是豐田,那麼我會展示別的東西。也許它更清楚的代碼來講述故事。

輔助Bean:

@ManagedBean(name="myBean") 
@SessionScoped 
public class MyCarBackingBean implements PhaseListener { 

    private List<Car> carList = new ArrayList<Car>(); 
    private HtmlSelectOneMenu hsom; 
    Car myCar; 

    @PostConstruct 
    public void init() { 
     carList.add(new Ford()); 
     carList.add(new Toyota()); 
    } 


    @Override 
    public void beforePhase(PhaseEvent event) { 
    //hsom becomes null here. Im pretty sure the setHsom was called before and the variable was set. 
    if(hsom != null) { 
     switch((Integer)hsom.getValue()){ 
      case 1: hsom.setValue("This is a Ford car"); break; 
      case 2: hsom.setValue("This is a Toyota car"); 
     } 
    } 


    //The rest of the world... 
} 

而且我綁定在我的網頁的selectOneMenu用於給組件:

<h:form> 
    <h:selectOneMenu binding="#{myBean.hsom}"> 
     <f:selectItems value="#{myBean.carList}" var="car" itemValue="#{car.id}" itemLabel="#{car.id}" /> 
     </h:selectOneMenu> 
    <h:commandButton value="Submit" action="#{myBean.mySubmit()}"/> 
</h:form> 

最後的模型類:

public abstract class Car { 

    protected int id; 
    //Getters and Setters 

} 

public class Toyota extends Car { 

    public Toyota(){ 
     this.id = 2; //in case of ford car, id is 1. 
    } 

} 

而且我思考使用階段偵聽器來改變顯示,因爲我讀了一些帖子,說改變gette是不好的rs和setter並將商業邏輯放在其中。我也不想將這些汽車包裹在其他物體中,並使用itemLabelitemValue

但是當我調試它時,我發現hsomnull當執行到達beforePhase但它在代碼的其餘部分不爲空。

所以我的問題是:這是一個很好的方式來使用階段偵聽器嗎?爲什麼在beforePhase中的組件對象爲空?

+0

OK的結果是,phaselistener和managedbean是不同的東西......如果我要在渲染之前更改組件的值,我應該使用''標籤。 –

回答

2

給你的班級添加一個不同的屬性(比如description)。如你所願地實現它,並在selectItems標記中引用它。 V.G。

<f:selectItems value="#{myBean.carList}" var="car" itemValue="#{car.id}" itemLabel="#{car.description}" /> 

或者,用返回List<SelectItem>的方法代替myBean.carList,並創建selectItems如你所願。

作爲一個經驗法則,儘量保持.xhtml儘可能「無邏輯」。

+0

嗨,謝謝你的回答。問題在於,在我的真實應用程序中,這些類被授予了我,我無法改變它們。我也想過把它們轉換成其他的對象,像你所描述的那樣友好,但在我的真實情況下,轉換的重量很大,而且在未來這個列表可能會變得非常大。 –

+0

保持配置文件邏輯免費聽起來不錯。非常感謝'經驗法則'xD –

+0

而不是轉換(或複製)到另一個對象中,那麼構建一個包裝器呢?包裝器不會複製值,而是引用原始對象,並可以自己添加一些屬性。 – SJuan76