【问题标题】:JSF property action listener targetJSF 属性动作监听器目标
【发布时间】:2014-10-09 08:51:41
【问题描述】:

我开始使用 JSF,并尝试使用用户在表单中输入的详细信息将记录添加到数据库中。我的 XHTML 页面包含此表单。

    <h:form>
<table id ="addRecordTable">
<tr>
<td><h:outputText value="Enter Name: " /></td>
<td><h:inputText value="#{animal.name}" id="name" label="name" required="true" requiredMessage="Name is required.">
<f:validateLength minimum="2" maximum="15"></f:validateLength>
</h:inputText>
</td>
</tr>
<tr>
<td><h:outputText value="Enter Age: "/></td>
<td><h:inputText value="#{animal.age}" id="age" label="age" required="true" requiredMessage="Age is required."></h:inputText></td>
</tr>
<tr>
<td><h:outputText value="Enter Breed : " /></td>
<td><h:inputText value="#{animal.breed}" id="breed" label="breed" required="true" requiredMessage="Breed is required.">
<f:validateLength minimum="2" maximum="15"></f:validateLength>
</h:inputText>
</td>
</tr>

<tr>
<td></td>
<td><h:commandButton value="Add"  action="#{animalBean.add}"> 
 <f:setPropertyActionListener target="#{animalBean.animal.age}" value="#{animal.age}" />
  <f:setPropertyActionListener target="#{animalBean.animal.name}" value="#{animal.name}" />
   <f:setPropertyActionListener target="#{animalBean.animal.breed}" value="#{animal.breed}" />
</h:commandButton></td>
</tr>
</table>
</h:form>

我也有这些 java Managed Bean 类:

import javax.faces.bean.ManagedBean;

@ManagedBean 
public class Animal {

    private int id;
    private String breed;
    private int age;
    private String name;

    public Animal(int id, int age, String breed, String name) {
        this.breed = breed;
        this.age = age;
        this.id = id;
        this.name = name;
    }

    public Animal()
    {
        this.breed= "";
        this.age = 0;
        this.id = 0;
        this.name= "";
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setBreed(String breed) {
        this.breed = breed;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getBreed() {
        return breed;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() 
    {
        return "Animal [id=" + id + ", breed=" + breed + ", age=" + age
                + ", name=" + name + "]";
    }
}

和....

import javax.faces.bean.ManagedBean;

@ManagedBean
public class AnimalBean 
{   

    protected Animal animal = new Animal();


    public List <Animal> getAnimals() {

        List <Animal> animals = new ArrayList <Animal> ();
        ResultSet rs = null;
        PreparedStatement pst = null;

        Connection con = null;

        String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\\Users\\lwilson\\Animals.accdb";
        try {
            con = DriverManager.getConnection(url);
            System.out.println("Connection completed (Select All).");
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }

        String stm = "SELECT Breed,Age,Name, ID FROM Animals";

        try {
            pst = con.prepareStatement(stm);
            pst.executeQuery();
            rs = pst.getResultSet();

            while (rs.next()) {
                int age = rs.getInt("Age");
                String breed = rs.getString("Breed");
                String name= rs.getString("Name");
                int id = rs.getInt("ID");
                Animal a1 = new Animal(id,age, breed, name);
                animals.add(a1);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return animals;

    }

    public void add() {

        File db = new File("C:\\Users\\lwilson\\Animals.accdb");
        if (!db.exists()) {
            System.out.println("file not found");
        }
        PreparedStatement ps = null;
        Connection con = null;
        String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\\Users\\lwilson\\Animals.accdb";
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            con = DriverManager.getConnection(url, "", "");
            String sql = "INSERT INTO Animals(Age, Breed, Name) VALUES(?,?,?)";
            ps = con.prepareStatement(sql);
            ps.setInt(1, animal.getAge());
            ps.setString(2, animal.getBreed());
            ps.setString(3, animal.getName());

            ps.executeUpdate();
            System.out.println("Data Added Successfully Into Database");
        } catch (Exception e) {
            System.out.println(e);
            System.out.println("exception here");

        }
    }

我的问题是在 setPropertyActionListener 中,目标没有将 Animal 对象字段设置为表单中的值。我收到一条错误消息,指出目标无法访问创建的动物对象的字段。然后将这些字段依次传递给 add() 方法。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • Animal bean 中是否有 animal 对象的设置器?
  • 不,我不知道,你能举个例子吗?谢谢。

标签: jsf


【解决方案1】:

您可以使用@ManagedProperty 注释将Animal 类对象注入AnimalBean

@ManagedBean
public class AnimalBean {   

    @ManagedProperty
    protected Animal animal;

    // getter and setter

    // Here your other methods

}

这种情况下不需要使用

<f:setPropertyActionListener target="#{animalBean.animal.age}" value="#{animal.age}" />
<f:setPropertyActionListener target="#{animalBean.animal.name}" value="#{animal.name}" />
<f:setPropertyActionListener target="#{animalBean.animal.breed}" value="#{animal.breed}" />

您将使用Animalgettersetter 获得您的财产价值。

【讨论】:

  • 进行建议的更改.. 我得到这个异常:javax.servlet.ServletException: Unable to set property animal for managed bean animalBean javax.faces.webapp.FacesServlet.service(FacesServlet.java:321)
  • 尝试提供一些默认值作为@ManagedProperty(value = "#{animal}")。希望这对你有用!
  • 太棒了,它排序了!谢谢卡迪尔!
【解决方案2】:

应该是这样的:

1) 托管 bean 类中动物对象的 getter 和 setter

2) #{animalBean.animal.value}

在表单中引用动物对象

3) 当您发布表单时,动物对象将自动更新。不需要属性操作侦听器。

【讨论】:

  • Number 3) 只是另一种更新值的方法。 :)
  • 是的,但是在这种情况下值不会更新两次吗?一个在表单提交之后,第二个由听众提交。
  • 对不起,我的错。它们是多余的,是的。
猜你喜欢
  • 2011-01-17
  • 2012-08-26
  • 2013-09-21
  • 2013-04-28
  • 1970-01-01
  • 2015-11-30
  • 2021-07-02
  • 2011-06-29
  • 1970-01-01
相关资源
最近更新 更多