2

我想在 jsf 打印的 bean 中使用继承。例如,我有一个父类(动物),有两个孩子(猫和狗),具有不同的属性(catAttr 和 dogAttr)和鉴别器(类型)。我想打印一个包含所有属性的动物列表。代码示例(它返回我一个未找到的属性异常),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>

动物豆:

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

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

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

有人能帮我吗?谢谢!

4

1 回答 1

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>
于 2012-04-15T22:29:04.983 回答