0

私は間違いを見ることができないので、これに2番目の目が必要です.挿入が機能しておらず、理由がわかりません. これは宿題用です。該当するコードは、CustomerDAO クラス内にあります。これは、Stripes フレームワークを使用して Java で構築された Web アプリケーション用です。問題のあるコードは次のとおりです。

public void create(Customer customer) {
    String sql = "insert into customer (`firstname`, `lastname`, `email`, " +
            "`username`, `password`) values (?, ?, ?, ?, ?)";   
    try {
        PreparedStatement sth = this.dbh.getCon().prepareStatement(sql);
        sth.setString(1, customer.getFirstName());
        sth.setString(2, customer.getLastName());
        sth.setString(3, customer.getEmailAddress());
        sth.setString(4, customer.getUserName());
        sth.setString(5, customer.getPassword());
        sth.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();;
    } catch (NullPointerException ex) {
        ex.printStackTrace();
    } finally {
        this.dbh.closeConnection();
    }

}

私が言ったように、このメソッドは私のDAOにあります。このメソッドは、登録フォームのアクション Bean から呼び出されます。ここに私がテストしたものがあります:

顧客オブジェクトが null ではありません。顧客フィールドはフォームから値を取得しており、正しいです。DAO が null ではありません。データベースが接続されました。

アクション Bean で条件をテストし、条件が true の場合は null を返し、それ以外の場合は RedirectResolution を返すことで、上記の項目を確認しました。

変数を SQL にバインドする 5 行をコメント アウトし、SQL 内の変数を挿入したい実際のデータに置き換えたところ、レコードが挿入されました。そのため、問題は次の 5 行のどこかにあると私は考えています。

sth.setString(1, customer.getFirstName());
sth.setString(2, customer.getLastName());
sth.setString(3, customer.getEmailAddress());
sth.setString(4, customer.getUserName());
sth.setString(5, customer.getPassword());

アクション Bean でこの if ステートメントを使用すると、完全に空のページにリダイレクトされました。これにより、値がモデルのフィールドにバインドされていることがわかります。

if (this.customer.getFirstName().equals("Tony")) {
    return null;
}

アクション Bean からの送信メソッドは次のとおりです。

public Resolution submit() {
    this.customer = this.getCustomer();
    this.customerDao = this.getCustomerDao();
    this.customerDao.create(customer);
    return new  RedirectResolution(RegisterFormActionBean.class);
}

フィールド値のテストは の下に挿入されthis.customer = this.getCustomer();ました。そのテストをすべてのフォーム フィールドで個別に実行したところ、常に空白のページに転送されました。これを実行すると、登録ページにリダイレクトされますが、レコードは挿入されません。ドキュメントをチェックして、setString()メソッドが正しく、そのように見えることを確認しました。

私が見落としているのはおそらくばかげたことだと思いますが、ここで車輪を回転させているだけです。

実際の質問: 値を SQL にハードコーディングすると挿入が機能するのに、値をステートメントにバインドすると機能しないのはなぜですか。

4

2 に答える 2

0

私はそれを考え出した。直感で、id フィールドを除いて NULL を受け入れるようにデータベース テーブルを変更しました。もう一度実行すると、レコードが挿入され、'password'フィールドが NULL であることがわかりました。register.jsp ページに 2 つのパスワード入力があり、どちらも という名前'password'です。どうやら、同じフォームに重複した名前がある場合、Stripes はどうすればよいかわかりません。テキスト ボックスの 1 つの名前を""に変更し、データベース テーブルを許可しないに戻しNULL、レコードを挿入しました。

于 2013-06-28T01:53:08.917 に答える