JSF-为什么id保持为零?

问题描述 投票:0回答:1

我正在做一个学校项目,我需要使用JSF制作CRUD应用。我正在使用MySQL数据库,并设法列出所有对象,删除按钮,并且在编辑按钮时遇到了麻烦。

[单击编辑后,将我重定向到edit.xhtml页面,获取ID并根据该ID填写所有字段。当我单击编辑页面上的更新按钮时,它将始终更改id = 0的客户。

我有一个带有getter,setter和方法的java文档有两个视图index.xhtml和edit.xhtml和一页包含与数据库连接的方法。

除更新外,所有其他方法都可以正常工作。

Customer.java

    @ManagedBean
    @RequestScoped
    public class Customer {

private int id;
private String username;
private String adress;
private int quantity;
private double price;


private Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();

public String edit() {
    FacesContext fc = FacesContext.getCurrentInstance();
    Map<String, String> params = fc.getExternalContext().getRequestParameterMap();
    String primarId = params.get("action");
    System.out.println(primarId);
    try {
        DatabaseConnection dbc = new DatabaseConnection();
        Connection connection = dbc.getConnection();
        Statement st = connection.createStatement();
        ResultSet rs = st.executeQuery("select * from customer where customer_id=" + primarId);
        Customer customer = new Customer();
        rs.next();
        customer.setUsername(rs.getString("username"));
        customer.setAdress(rs.getString("adress"));
        customer.setQuantity(rs.getInt("quantity"));
        customer.setPrice(rs.getDouble("price"));
        sessionMap.put("editcustomer", customer);
    } catch (SQLException ex) {
        System.out.println(ex);
    }
    return "/edit.xhtml?faces-redirect=true";
}

public String updateCustomer() {
    FacesContext fc = FacesContext.getCurrentInstance();
    Map<String, String> params = fc.getExternalContext().getRequestParameterMap();
    String fieldId = params.get("action");
    System.out.println(fieldId);
    try {
        DatabaseConnection dbc = new DatabaseConnection();
        Connection connection = dbc.getConnection();
        PreparedStatement ps = connection.prepareStatement("update customer set username=?,adress=?,quantity=?,price=? where customer_id=?");
        ps.setString(1, username);
        ps.setString(2, adress);
        ps.setInt(3, quantity);
        ps.setDouble(4, price);
        ps.setInt(5, id);
        System.out.println(id);
        ps.executeUpdate();
    } catch (SQLException ex) {
        System.out.println(ex);
    }
    return "/index.xhtml?faces-redirect=true";
}

edit.xhtml

      <?xml version='1.0' encoding='UTF-8' ?>
       <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
       <html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
<center>
        <h:form>
            Username: <h:inputText value="#{editcustomer.username}"></h:inputText> <br/>

            Adress: <h:inputText value="#{editcustomer.adress}"></h:inputText> <br/>

            Quantity: <h:inputText value="#{editcustomer.quantity}"></h:inputText> <br/>

            Price: <h:inputText value="#{editcustomer.price}"></h:inputText> <br/><br/>

            <h:commandButton value="Update" action="#{editcustomer.updateCustomer()}">
                <f:param name="action" value="#{editcustomer.id}" />
            </h:commandButton>
        </h:form>
        </center>   
    </h:body>
</html>

当我运行此代码时,ID保持为0

jsf
1个回答
0
投票

我认为问题是bean中的@RequestScoped批注。使用此注释数据,仅“存在”在当前页面中。当您重定向到另一个URL(虽然它是相同的)时,您所做的更改会丢失(更多考虑到您将客户置于会话映射中。请尝试使用@SessionScoped

希望它起作用。

© www.soinside.com 2019 - 2024. All rights reserved.