映画のエンドロール観る派?観ない派?

ホームページのフォームに名前と番号の二つの列があってname[1],bango[1]...のようになっています。
それを番号があるものだけをMySQLに登録したいのですがうまくいきません。
以下に試しに作ったservletを書きます。
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class program2 extends HttpServlet{

private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS";
//private static final String CONTENT_TYPE = "text/html; charset=EUC_JP";
//private static final String CONTENT_TYPE = "text/html; charset=UTF-8";
private String server;
private String db;
private String user;
private String pass;
private String url;
private Connection con = null;

//グローバル変数の初期化
public void init() throws ServletException{
/*変数の初期化*/
server = "localhost"; //MySQLサーバ名またはIPアドレス
db = "database"; //データベース名
user = "root"; //MySQLユーザ名
pass = "data"; //MySQLパスワード

/* 必要であればオプションの指定 */
url = "jdbc:mysql://" + server + ":3306/" + db
+ "?useUnicode=true&characterEncoding=Shift_JIS"; //JDBC URL Shift_JIS

/*DB初期処理*/
try{
/* JDBCドライバのロード */
Class.forName("com.mysql.jdbc.Driver").newInstance();

/* MySQLサーバ接続 */
con = DriverManager.getConnection(url, user, pass);

} catch (SQLException e){
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
}
}

/*HTTP Get リクエストの処理*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException{
//エンコード
request.setCharacterEncoding("Shift_JIS");

//FORMからの第一次受け渡し
String name = "naoki";
String jikoku = "1200";

//for文の始まり
for(int i = 1; name != null; i++){

//if文の始まり
if(jikoku != null){

//FORMからの第一次受け渡し
name = request.getParameter("name["+ i +"]");
jikoku = request.getParameter("jikoku["+ i +"]");

response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
Statement stmt = null;
ResultSet rs = null;

try{
/* 検索するSQL文を作成 */
String sql = "INSERT INTO table1 (eki,jikoku) VALUES ('"+name+"','"+jikoku+"') ";

/* Statementオブジェクトの生成とクエリの実行 */
stmt = con.createStatement();
stmt.executeUpdate(sql);

/* 切断 */
stmt.close();

} catch (SQLException e){
out.println("<h3>登録に失敗しました</h3>");
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
} finally{
/* finallyを使って資源の解放 */
try{
if (stmt != null){
stmt.close();
stmt = null;
}
} catch (Exception e){
e.printStackTrace();
}
}

}//if文の終了

}//for文終了
}

/*サーブレットインスタンスが破棄されるときに、サーブレットコンテナに最後に1度呼び出される*/
public void destroy(){
/* 切断 */
try{
if (con != null){
con.close();
con = null;
}
} catch (Exception e){
e.printStackTrace();
}
}
}

A 回答 (6件)

DBの型(多分数値型?)にNULLを入れようとしてエラーになっているように見えます。



おそらくパラメータがちゃんと取れてないんじゃありませんか?

今のソースだとINSERTの前にnameとjikokuの値をが入っているかチェックされずにINSERT処理にいってしまうので、事前にチェックしたほうがいいかと。

doGetメソッドの中身ですが、do whileかwhileに書き直したほうがよいのでは?(do whileあんまり好きじゃないのでwhileで書いてみます)

/*HTTP Get リクエストの処理*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException{
//エンコード
request.setCharacterEncoding("Shift_JIS");

//FORMからの第一次受け渡し
int i = 1;
String name = request.getParameter("name["+ i +"]");
String jikoku = request.getParameter("jikoku["+ i +"]");

//for文の始まり
while ( name != null && !name.equals("") ){
if ( jikoku != null && !jikoku.equals("") ) {
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
Statement stmt = null;
ResultSet rs = null;

try{
/* 検索するSQL文を作成 */
String sql = "INSERT INTO table1 (eki,jikoku) VALUES ('"+name+"','"+jikoku+"') ";

/* Statementオブジェクトの生成とクエリの実行 */
stmt = con.createStatement();
stmt.executeUpdate(sql);

/* 切断 */
stmt.close();

} catch (SQLException e){
out.println("<h3>登録に失敗しました</h3>");
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
} finally{
/* finallyを使って資源の解放 */
try{
if (stmt != null){
stmt.close();
stmt = null;
}
} catch (Exception e){
e.printStackTrace();
}
}

}//if文の終了
else{
// jikokuが空っぽだよー
}
//FORMからの第一次受け渡し
i++;
name = request.getParameter("name["+ i +"]");
jikoku = request.getParameter("jikoku["+ i +"]");
}//for文終了
}

javaのコンパイル環境ないので間違っているかもしれませんが、適宜修正してください。

この回答への補足

わざわざソースプログラムを書いていただき、ありがとうございます。
実行しMySQLからデータを確認したところ、
Emptyと表示されるので登録が失敗しているようです。
念のため、以下にHTMLを書きます。
<form action=http://localhost:8080/MyApp/servlet/program2 method=get>
名前<input name="name[1]" value="田中"> 時刻<input name="jikou[1]"><br>
名前<input name="name[2]" value="品川"> 時刻<input name="jikou[2]"><br>
名前<input name="name[3]" value="村上"> 時刻<input name="jikou[3]"><br>
<br>
<input type="submit" value="送信">

記述していただいたプログラムのコンパイルですが、問題なくできました。

補足日時:2008/09/01 16:52
    • good
    • 0

><form action=​

http://localhost:8080/MyApp/servlet/program2​ method=get>
>名前<input name="name[1]" value="田中"> 時刻<input name="jikou[1]"><br>
>名前<input name="name[2]" value="品川"> 時刻<input name="jikou[2]"><br>
>名前<input name="name[3]" value="村上"> 時刻<input name="jikou[3]"><br>
<br>
><input type="submit" value="送信">

getParameterで取得するときのパラメータ名とhtmlのパラメータ名が不一致です。これでは取得できるはずがありません。(HTMLではjikou、サーブレット側はjikoku)

次に、時刻のvalueの設定がないのでパラメータを取得できたとしても""かnullのどちらかが取得されるはずです。

上記部分をもう一度見直してみてください。

この回答への補足

凡ミスをしていました。ご迷惑をおかけしてすみませんでした。
本線と脱線するような気もするのですがご相談させていただきます。
登録はうまくいくのですが、MySQLで確認すると文字化けしてしまいます。
ソースコードに書いていますが文字化け対策として
request.setCharacterEncoding("Shift_JIS");
をしていますが登録されているときには文字化けしています。
他のjavaサーブレットの文字を表示するプログラムは正しく表示されます。
javaの質問をするところで恐悦至極に思いますがご意見お願いいたします。

参考にしましたサイト
http://www.atmarkit.co.jp/fjava/rensai3/mojibake …

補足日時:2008/09/01 19:04
    • good
    • 0
この回答へのお礼

文字化けはHTMLの設定をしていなかったせいでした。申し訳ありませんでした。

今日一日ほとんど朝から親身になってご教授していただき
非常に心強く粘り強く教えていただいたこととても感謝しております。

ProKaseifu様本当にありがとうございました。

お礼日時:2008/09/01 19:38

NO3.訂正


String[] name=new String[100];
String[] jikoku=new String[100];

name[i] = request.getParameterValues("name["+ i +"]");
jikoku[i] = request.getParameterValues("jikoku["+ i +"]");
かも
    • good
    • 0

ぱっと見ですが


String nameとString jikokuは
配列ですのでString[] name=new name[100];
String[] jikoku=new jikoku[100]だと思います。
    • good
    • 0

DBにインサートする部分でエラーが発生しているのでしょうか?



エラーの内容を教えてください。

この回答への補足

エラー文があまりにも長くなってしまうので、はじめだけ書かせていただきます。
java.sql.SQLException: incorrect integer value: 'null' for column 'jikoku' at row1........

この後は非常に長くて書けませんでした。

補足日時:2008/09/01 14:00
    • good
    • 0

どのへんが「うまくいきません」か?



フォームのパラメータを受け取れない?
DBにインサートできていない?
等。

質問はできるだけピンポイントで。

この回答への補足

上記のプログラムだとtomcatにエラーが排出されます。
以前今の状態と少し違いますがプログラムを作ったところ、
フォームからのパラメータ取得は出来ているようですが、
DBには登録できませんでした。

プログラムの概要ですが
「nameが無くなるまでループを行い、jikokuがある場合だけ登録する」という具合です。

補足日時:2008/09/01 10:25
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!