竹形誠司 ブログ
ご質問    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
Java+MySQL+Tomcatで作る掲示板とブログ P336
by パブリック[yasuhara]
竹形さま

お世話になっております。
当本の最終セクションである、mailetによるメール受信からのDB更新のテストについてご教示お願いします。
当方、携帯電話からの添付ファイル付きメールの受信は成功しております。

しかし、DBの"blog"テーブルへのデータ更新が行われない現象になっております。
("subject"カラムと"body"カラムがNullの状態)

MailToBlog.javaをデバッグモードに設定し、コンパイルして検証をしておりますが、
下記のようにコンソールでメール受信時の出力を確かめようとしました。
...省略...
    public void service(Mail mail) throws MessagingException {
...省略...

        try{    //【7】
            Connection conn = this.getConnection();
//Dbg
            System.out.println("データベースに接続しました...");
            Statement stmt = conn.createStatement();
            strSql="UPDATE blog SET"
                  +" subject='"
                  +TextConv.beforeSql(this.strSubject)+"',"
                  +" body='"+TextConv.beforeSql(this.sbBody.toString())+"'"
                  +" WHERE id = " + this.intId;
//Dbg
            System.out.println("Sql文 :"+ strSql);
            int intUdCnt; //更新カウント
            intUdCnt = stmt.executeUpdate(strSql);
//Dbg
            System.out.println("更新カウント :"+ intUdCnt);

        }catch(Exception e){
            System.out.println("e4:"+e.getMessage() + "\n" + strSql);
        }
    }
...省略...
受信テストでコンソールを見ていると、
上記の出力文字の"データベースに接続しました..."は出力されますが、
それ以下の"Sql文 :..."や"更新カウント :..."は出力されませんでした。

これは、stmt.executeUpdate(strSql);が実行されてないと言うことになりませんか?
投稿:パブリック[yasuhara]/2010年 10月 17日 13時 47分 /更新:2010年 10月 17日 13時 47分
RE:Java+MySQL+Tomcatで作る掲示板とブログ P336
by 竹形 誠司[takegata]
竹形です。こんにちは。

tryのブロックで例外が発生すると、その後のcatchブロックに処理が移ります。
catchブロックでエラーメッセージが表示されているような形跡はありませんか?
投稿:竹形 誠司[takegata]/2010年 10月 17日 15時 36分 /更新:2010年 10月 17日 15時 36分
RE:Java+MySQL+Tomcatで作る掲示板とブログ P336
by パブリック[yasuhara]
竹形さま
お返事ありがとうございます。

catch{ の例外処理部の
        }catch(Exception e){
            System.out.println("e4:"+e.getMessage() + "\n" + strSql);
        }
    }
のデバックメッセージは、コンソール上では出力されません。

上記で書いたコードの
            System.out.println("データベースに接続しました...");
の出力の以降は何も出力されませんでした。
投稿:パブリック[yasuhara]/2010年 10月 17日 20時 37分 /更新:2010年 10月 17日 20時 37分
RE:Java+MySQL+Tomcatで作る掲示板とブログ P336
by 竹形 誠司[takegata]
竹形です。
なかなか返事ができずにすみません。
環境を作ってテストをしますので、今しばらくお待ちください。
投稿:竹形 誠司[takegata]/2010年 10月 20日 06時 07分 /更新:2010年 10月 20日 06時 07分
RE:Java+MySQL+Tomcatで作る掲示板とブログ P336
by 竹形 誠司[takegata]
竹形です。上記の件、回答が遅くなってすみません。
TextConvの呼び出しで引っかかっているような感じです。
原因は追い切れなかったのですが、問題はやはり次の部分です。
try{                        //【7】
    Connection conn = this.getConnection();
    Statement stmt = conn.createStatement();
    strSql="UPDATE blog SET"
        +" subject='"    +TextConv.beforeSql(this.strSubject)+"',"
        +" body='"+TextConv.beforeSql(this.sbBody.toString())+"'"
        +" WHERE id = " + this.intId;
    stmt.executeUpdate(strSql);
}catch(Exception e){
    System.out.println("e4:"+e.getMessage() + "\n" + strSql);
}

本書のコードでは、SQLインジェクション対策のためにTextConvというクラスを使っていますが、その後のMySQLのバージョンでPreparedStatementが使えるようになりました。MySQLとJDBCドライバのバージョンを最近のものにアップデートして、上記部分のコードを以下のように変更してみてください。

try{                        //【7】
    Connection conn = this.getConnection();
    strSql="UPDATE blog SET subject=?, body=? WHERE id = ?";
    PreparedStatement pstmt = conn.prepareStatement(strSql);
    pstmt.setString(1,this.strSubject);
    pstmt.setString(2,this.sbBody.toString());
    pstmt.setInt(3,this.intId);
    pstmt.executeUpdate();
}catch(Exception e){
    System.out.println("e4:"+e.getMessage() + "\n" + strSql);
}
PreparedStatementの使い方については、以下のエントリに書きましたので参考にしてください。

http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=497

投稿:竹形 誠司[takegata]/2010年 10月 25日 02時 20分 /更新:2010年 10月 25日 02時 26分
RE:Java+MySQL+Tomcatで作る掲示板とブログ P336
by パブリック[yasuhara]
竹形さま
お返事ありがとうございます。

仰るとおり prepareStatement() を使用した下記のコードで再コンパイル・受信テストしてみました。
try{    //【7】
    Connection conn = this.getConnection();
//Dbg
    System.out.println("データベースにコネクトしました...");
    strSql="UPDATE blog SET subject=?, body=? where id = ?";
//Dbg
    System.out.println("Sql文 :"+ strSql);
    System.out.println("strSubject :"+ this.strSubject );
    System.out.println("sbBody    :"+ this.sbBody.toString() );

    PreparedStatement pstmt = conn.prepareStatement( strSql );
    pstmt.setString( 1, this.strSubject);
    pstmt.setString( 2, this.sbBody.toString() );
    pstmt.setInt( 3, this.intId );
//Dbg
    int intUdCnt; //更新カウントi
    intUdCnt = pstmt.executeUpdate(strSql);
//Dbg
    System.out.println("更新カウント :"+ intUdCnt);

}catch(Exception e){
テスト結果は以前のままですが、新たに気付いたことは、
デバック出力の為、"データベースにコネクトしました..." と文言を変化させたものの、以前の文言 "データベースに接続しました..." が出力されたことです。

なお、再コンパイル後に、クラスファイル"WEB-INF/classes/jamyto2/mailet/MailToBlog.class" の最終保存日時が再コンパイルした時間に更新されたことを確認してから、受信テストを行っております。
しかし、デバック文言が変化しなかったということは、更新された"MailToBlog.class"が『実は更新されていない?』『使われていない?』と疑ってしまいます。
(Tomcat Managerからアプリケーションのリロードも一応試してはみましたが。。。)

再コンパイル後の .classを使用するには、特別何か操作が必要でしょうか?

因みに、コンパイルは以下の方法で行いました。
$ cd /home/user/jamyto2/jsp/WEB-INF/classes
$ javac -d . -classpath .:/usr/local/apache-tomcat-5.5.29/common/lib/mail.jar:/usr/local/src/james-2.3.2/apps/james/SAR-INF/lib/*  MailToBlog.java
申し遅れていましたが、当方の環境は
OS: Debian lenny
Tomcat: 5.5.29
MySQL-Connector: 5.1.13
James: 2.3.2
です。
投稿:パブリック[yasuhara]/2010年 10月 28日 02時 15分 /更新:2010年 10月 28日 02時 16分
RE:Java+MySQL+Tomcatで作る掲示板とブログ P336
by 竹形 誠司[takegata]
コンパイルの後、jarファイルを作ってJamesを再起動してみてもらえますか?
ちなみに、MailetはJames内で動作するので、Tomcat側の操作は必要ありません。
投稿:竹形 誠司[takegata]/2010年 10月 30日 11時 33分 /更新:2010年 10月 30日 11時 33分
RE:Java+MySQL+Tomcatで作る掲示板とブログ P336
by パブリック[yasuhara]
竹形さま

上記の .jarファイルの生成の後、ケータイからのメール受信・DB更新のテストに成功しました。
本をしっかり読まず、恥かしい質問をしてしまいました。
ありがとうございます。

環境を 1から作り、読者の質問に誠実にお答えになる。貴方のようなライターさんを、私は他に存じ上げません。

今後も本を出されることを期待しております。
投稿:パブリック[yasuhara]/2010年 10月 30日 23時 15分 /更新:2010年 10月 30日 23時 16分
RE:Java+MySQL+Tomcatで作る掲示板とブログ P336
by 竹形 誠司[takegata]
ありがとうございます。
本書もだいぶ内容が古くなっているので、改訂版を出さなければと思いつつ、なかなかまとまった時間が取れずにいます。掲示板で質問していただくことはとても励みになりますので、今後ともよろしくお願いします。
投稿:竹形 誠司[takegata]/2010年 10月 30日 23時 47分 /更新:2010年 10月 30日 23時 48分