竹形さま
お世話になっております。
当本の最終セクションである、mailetによるメール受信からのDB更新のテストについてご教示お願いします。
当方、携帯電話からの添付ファイル付きメールの受信は成功しております。
しかし、DBの"blog"テーブルへのデータ更新が行われない現象になっております。
("subject"カラムと"body"カラムがNullの状態)
MailToBlog.javaをデバッグモードに設定し、コンパイルして検証をしておりますが、
下記のようにコンソールでメール受信時の出力を確かめようとしました。
上記の出力文字の"データベースに接続しました..."は出力されますが、
それ以下の"Sql文 :..."や"更新カウント :..."は出力されませんでした。
これは、stmt.executeUpdate(strSql);が実行されてないと言うことになりませんか?
お世話になっております。
当本の最終セクションである、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);
}
}
...省略...
受信テストでコンソールを見ていると、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ブロックでエラーメッセージが表示されているような形跡はありませんか?
tryのブロックで例外が発生すると、その後のcatchブロックに処理が移ります。
catchブロックでエラーメッセージが表示されているような形跡はありませんか?
投稿:竹形 誠司[takegata]/2010年 10月 17日 15時 36分
/更新:2010年 10月 17日 15時 36分
竹形さま
お返事ありがとうございます。
catch{ の例外処理部の
上記で書いたコードの
お返事ありがとうございます。
catch{ の例外処理部の
}catch(Exception e){
System.out.println("e4:"+e.getMessage() + "\n" + strSql);
}
}
のデバックメッセージは、コンソール上では出力されません。System.out.println("e4:"+e.getMessage() + "\n" + strSql);
}
}
上記で書いたコードの
System.out.println("データベースに接続しました...");
の出力の以降は何も出力されませんでした。
投稿:パブリック[yasuhara]/2010年 10月 17日 20時 37分
/更新:2010年 10月 17日 20時 37分
竹形です。
なかなか返事ができずにすみません。
環境を作ってテストをしますので、今しばらくお待ちください。
なかなか返事ができずにすみません。
環境を作ってテストをしますので、今しばらくお待ちください。
投稿:竹形 誠司[takegata]/2010年 10月 20日 06時 07分
/更新:2010年 10月 20日 06時 07分
竹形です。上記の件、回答が遅くなってすみません。
TextConvの呼び出しで引っかかっているような感じです。
原因は追い切れなかったのですが、問題はやはり次の部分です。
http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=497
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ドライバのバージョンを最近のものにアップデートして、上記部分のコードを以下のように変更してみてください。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);
}
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の使い方については、以下のエントリに書きましたので参考にしてください。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);
}
http://www.orquesta.org/takegata/Article/ArticleView.jsp?article_id=497
投稿:竹形 誠司[takegata]/2010年 10月 25日 02時 20分
/更新:2010年 10月 25日 02時 26分
竹形さま
お返事ありがとうございます。
仰るとおり prepareStatement() を使用した下記のコードで再コンパイル・受信テストしてみました。
デバック出力の為、"データベースにコネクトしました..." と文言を変化させたものの、以前の文言 "データベースに接続しました..." が出力されたことです。
なお、再コンパイル後に、クラスファイル"WEB-INF/classes/jamyto2/mailet/MailToBlog.class" の最終保存日時が再コンパイルした時間に更新されたことを確認してから、受信テストを行っております。
しかし、デバック文言が変化しなかったということは、更新された"MailToBlog.class"が『実は更新されていない?』『使われていない?』と疑ってしまいます。
(Tomcat Managerからアプリケーションのリロードも一応試してはみましたが。。。)
再コンパイル後の .classを使用するには、特別何か操作が必要でしょうか?
因みに、コンパイルは以下の方法で行いました。
OS: Debian lenny
Tomcat: 5.5.29
MySQL-Connector: 5.1.13
James: 2.3.2
です。
お返事ありがとうございます。
仰るとおり 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){
テスト結果は以前のままですが、新たに気付いたことは、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
申し遅れていましたが、当方の環境は$ 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分
コンパイルの後、jarファイルを作ってJamesを再起動してみてもらえますか?
ちなみに、MailetはJames内で動作するので、Tomcat側の操作は必要ありません。
ちなみに、MailetはJames内で動作するので、Tomcat側の操作は必要ありません。
投稿:竹形 誠司[takegata]/2010年 10月 30日 11時 33分
/更新:2010年 10月 30日 11時 33分
竹形さま
上記の .jarファイルの生成の後、ケータイからのメール受信・DB更新のテストに成功しました。
本をしっかり読まず、恥かしい質問をしてしまいました。
ありがとうございます。
環境を 1から作り、読者の質問に誠実にお答えになる。貴方のようなライターさんを、私は他に存じ上げません。
今後も本を出されることを期待しております。
上記の .jarファイルの生成の後、ケータイからのメール受信・DB更新のテストに成功しました。
本をしっかり読まず、恥かしい質問をしてしまいました。
ありがとうございます。
環境を 1から作り、読者の質問に誠実にお答えになる。貴方のようなライターさんを、私は他に存じ上げません。
今後も本を出されることを期待しております。
投稿:パブリック[yasuhara]/2010年 10月 30日 23時 15分
/更新:2010年 10月 30日 23時 16分
ありがとうございます。
本書もだいぶ内容が古くなっているので、改訂版を出さなければと思いつつ、なかなかまとまった時間が取れずにいます。掲示板で質問していただくことはとても励みになりますので、今後ともよろしくお願いします。
本書もだいぶ内容が古くなっているので、改訂版を出さなければと思いつつ、なかなかまとまった時間が取れずにいます。掲示板で質問していただくことはとても励みになりますので、今後ともよろしくお願いします。
投稿:竹形 誠司[takegata]/2010年 10月 30日 23時 47分
/更新:2010年 10月 30日 23時 48分