2012-04-15 95 views
2

我想在由jsf打印的bean中使用繼承。 例如,我有一個父類(動物)與兩個孩子(貓和狗)具有不同的屬性(catAttr和dogAttr)和一個鑑別器(類型)。我想打印一份具有所有屬性的動物列表。 代碼示例(它返回我的屬性未發現異常),JSF頁面:在jsf中繼承

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
<h:head> 
    <title>Facelet Title</title> 
</h:head> 
<h:body> 
    <ui:repeat value="#{animalsBean.animals}" var="a"> 
     <!-- General attributes --> 
     <label>Name: </label> #{a.name}<br/> 

     <!-- Specific attributes --> 
     <h:panelGroup rendered="#{a.type eq 'cat'}"> 
      <label>Cat attributes:</label> 
      <h:inputTextarea value="#{a.catAttr}"/><br/> 
     </h:panelGroup> 
     <h:panelGroup rendered="#{a.type eq 'dog'}"> 
      <label>Dog attributes:</label> 
      <h:inputTextarea value="#{a.dogAttr}"/><br/> 
     </h:panelGroup> 
    </ui:repeat> 
</h:body> 

AnimalsBean:

@ManagedBean 
@SessionScoped 
public class AnimalsBean { 
    private List<Animal> animals; 

    public List<Animal> getAnimals() { 
     return animals; 
    } 

    public void setAnimals(List<Animal> animals) { 
     this.animals = animals; 
    } 
} 

有人能幫助我嗎? 謝謝!

回答

3

JSF標籤組件無法識別模型類(貓,狗等)的內部類型。如果你使用的是父類,那麼你只能使用它的公共屬性(對於所有的子類都是通用的)。

public class Animal { 
    protected String name; 
    //getter and setter... 
} 

public class Cat extends Animal { 
    private String specie; 
    //getter and setter... 
} 

public class Dog extends Animal { 
    public String race; 
    //getter and setter... 
} 

@SessionScoped 
@ManagedBean(name="animalBean") 
public class AnimalsBean { 
    private Cat cat; 
    private Dog dog; 
    private Animal animal; 

    public AnimalsBean() { 
     cat = new Cat(); 
     dog = new Dog(); 
     animal = new Cat(); 
    } 

    //getters and setters... 
} 

這樣做的XHTML代碼:

<h:form> 
    <h:inputText value="#{animalBean.cat.specie}" /> 
    <h:inputText value="#{animalBean.dog.race}" /> 
    <h:inputText value="#{animalBean.animal.name}" /> 
    <!-- this line won't work --> 
    <h:inputText value="#{animalBean.animal.specie}" /> 
</h:form>