1

データベースからデータを取得する際に問題が発生しています。私には機能があります

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;  
import java.sql.SQLException;
import java.sql.Statement;

public class DataAccess {
private Connection conn;
private User user = new User();

public DataAccess(){
    connect();
}

public boolean connect() {
    boolean success = true;

    String driverName ="com.mysql.jdbc.Driver";
    String conURL = "jdbc:mysql://localhost:3306/final_project";
    String user = "root";
    String pass = "1009";

    try {
        Class.forName(driverName).newInstance();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        System.err.println(e.getMessage() + "------Cannot Load Driver");
        success = false;
    }

    try {
        conn = DriverManager.getConnection(conURL, user, pass);
    } catch (SQLException e) {
        System.err.println(e.getMessage() + "--SQL States: " + e.getSQLState() + "---- ErrorCode: " + e.getErrorCode());
        success = false;
    }
    return success;
}

public void insertBooks (Books books)
{
    try {           
        PreparedStatement stmt = conn.prepareStatement("insert into Books (Title, Author, ISBN, Total) VALUES (?, ?, ?, ?);");
        stmt.setString(1, books.getTitle());
        stmt.setString(2, books.getAuthor());
        stmt.setInt(3, books.getISBN());
        stmt.setDouble(4, books.getPrice());

        stmt.executeUpdate();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public void selectBooks () {
    try {
        Statement stm = conn.createStatement();
        ResultSet rs = stm.executeQuery("SELECT * FROM books");
        while (rs.next()) {
            Books books = new Books();

            books.setTitle(rs.getString(1));
            books.setAuthor(rs.getString(2));
            books.setISBN(rs.getInt(3));
            books.setPrice(rs.getDouble(4));

            user.add(books);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

}

これは、books テーブルから選択し、すべてのフィールドをタイトル、著者、ISBN、および価格として取得および設定し、ユーザー クラスの bookList オブジェクトに追加します。機能を使うと

public ArrayList<Books> getBookList() {
    return bookList;
}

何も返されません。

ユーザークラス:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import java.util.ArrayList;

@ManagedBean(name = "user")
@SessionScoped
public class User {
private String firstName;
private String lastName;
private ArrayList<Books> bookList = new ArrayList<Books>();
private ArrayList<Books> shopBookList = new ArrayList<Books>();
private double total;

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public ArrayList<Books> getBookList() {
    return bookList;
}

public void setBookList(ArrayList<Books> bookList) {
    this.bookList = bookList;
}

public double getTotal() {
    for (Books bk : bookList) {
        total += bk.getPrice();
    }
    return total;
}

public void setTotal(double total) {
    this.total = total;
}

public ArrayList<Books> getShopBookList() {
    return shopBookList;
}

public void setShopBookList(ArrayList<Books> shopBookList) {
    this.shopBookList = shopBookList;
}

public String add(Books books) {
    bookList.add(books);
    DataAccess da = new DataAccess();
    da.insertBooks(books);
    return "Added";
}

public String searchBooks() {
    DataAccess da = new DataAccess();
    da.selectBooks();
    return "books";
}

public String shop(Books books) {
    shopBookList.add(books);
    return null;
}

public String start() {
    bookList = new ArrayList<Books>();
    firstName = "";
    lastName = "";
    total = 0;
    FacesContext.getCurrentInstance().getExternalContext().invalidateSession();
    return "index";
}

}

書籍クラス:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean(name = "books")
@SessionScoped

public class Books {
private String title;
private String author;
private int ISBN;
private double price;

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}

public int getISBN() {
    return ISBN;
}

public void setISBN(int iSBN) {
    ISBN = iSBN;
}

public double getPrice() {
    return price;
}

public void setPrice(double total) {
    this.price = total;
}

}

user.booklist からデータを取得することになっているページ:

<!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:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">

<h:body>
<h:form>
    <h1>Books Page</h1>
    <hr />
    <label>The following books are available:</label><br />
    <h:dataTable value="#{user.bookList}" var="bk" border="1">
        <h:column>
            <f:facet name="header">ISBN</f:facet>
            <h:outputText value="#{bk.ISBN}" />
        </h:column>
        <h:column>
            <f:facet name="header">Title</f:facet>
            <h:outputText value="#{bk.title}" />
        </h:column>
        <h:column>
            <f:facet name="header">Author</f:facet>
            <h:outputText value="#{bk.author}" />
        </h:column>
        <h:column>
            <f:facet name="header">Price</f:facet>
            <h:outputText value="#{bk.price}" />
        </h:column>
        <h:column>
            <f:facet name="header">Add</f:facet>
            <h:commandLink value="Add" action="#{user.shop(bk)}" />
        </h:column>
    </h:dataTable>
    <h:commandButton value="Home" action="index" />
    <h:commandButton value="Checkout" action="checkout" />
</h:form>
</h:body>
</html>
4

3 に答える 3

1

問題が何であるかがわかりました。私は jsf テクノロジーを使用し、セッションを使用してオブジェクトと値を保存していたことを忘れていました。selectbooks メソッドを試すたびに、現在のセッション ユーザーを使用する代わりに新しいユーザーが作成されます。したがって、常に新しいユーザーが生成され、現在のセッション ユーザーに null 値が与えられます。

于 2013-04-11T22:49:52.843 に答える
0

Abi が述べたように、間違ったリストに追加します。より一般的には、永続性を管理するのにより便利な OpenJPA を使用する必要があります。

于 2013-04-11T08:58:06.807 に答える