2012-04-15 97 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>