- PR -

JSP→Servlet→Beanでの配列の受渡し

1
投稿者投稿内容
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 2004-09-24 11:07
jspのチェックボックスで複数選択したデータをjavascriptの配列に格納して、サーブレットに渡して、サーブレットからbeanに渡して、配列の要素数だけ削除を実行しようとしています。

作成する配列は削除のキー項目となる2つで、それぞれ以下のように作成しています。

コード:

::::JSP::::
function setDelData(rcnt){
// 削除行データ取得
i = 0;
PprojectId_h = document.form1.projectId.value;

// 削除対象データ数取得
for(k=0; k<rcnt; k++){
if(document.form2.delBox[k].Checked == true){
i++;
}
}
// プロジェクトIDと予算bフ配列作成
delprjId = new Array(i);
delyosanNo = new Array(i);

// 削除対象データキー項目取得
cnt = 0;
for(k=0; k<rcnt; k++){
if(document.form2.delBox[k].checked == true){
delprjId[cnt] = document.form2.hiprjId[k].value;
delyosanNo[cnt] = document.form2.hiyosanNo[k].value;
cnt++;
}
}
for(b=0; b<cnt; b++){
alert(delprjId[b]);
alert(delyosanNo[b]);
}
document.form1.action="YosanDel?mode=DEL" + "&projectId=" + delprjId + "&yosanNo=" + delyosanNo + "&projectId_h=" + PprojectId_h;
document.form1.submit();
}

::::Servlet::::
if (mode.equals("DEL")){
// 削除
session.removeAttribute("ydelbean");

YosanDelBean Ydelbean = new YosanDelBean();

Ydelbean.setprojectid(request.getParameterValues("projectId"));

Ydelbean.setyosanno(request.getParameterValues("yosanNo"));

Ydelbean.execute();

}

::::bean:::: (コンストラクタ等省略)
public class YosanDelBean implements Serializable{

private String[] projectid;
private String[] yosanno;


public void execute(){
try{
Class.forName("oracle.jdbc.driver.OracleDriver");

Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@******:1521:*****","*****","*****n");

Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

// DBからデータ削除

for(int i=0; i<projectid.length; i++){
strSql = "";
strSql += "DELETE FROM PRM_M_YOSANKOUMOKU ";
strSql += " WHERE PRJ_ID = " + projectid[i];
strSql += " AND YOSAN_NO = " + yosanno[i];

stmt.execute(strSql);
}

conn.close();

}catch(Exception e){
e.printStackTrace();
}
}
// 配列1
public void setprojectid(String[] prjarr){
this.projectid = prjarr;
}

// 配列2
public void setyosanno(String[] yosanarr){
this.yosanno = yosanarr;
}


JSPでチェックボックスを1つのみチェックして実行すると、選択したレコードが削除されるのですが、
2つ以上チェックした場合には何も1レコードも削除されません。
どうも、サーブレットで受け取った時点で配列になってないような気がするのですが、javascript配列をサーブレットで配列として受け取ることは出来ないのでしょうか?
それとも、他に問題があるのでしょうか?
よろしくお願いします。

[ メッセージ編集済み 編集者: カウンター 編集日時 2004-09-24 11:23 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-09-24 11:32
引用:

カウンターさんの書き込み (2004-09-24 11:07) より:
どうも、サーブレットで受け取った時点で配列になってないような気がするのですが、javascript配列をサーブレットで配列として受け取ることは出来ないのでしょうか?


HTTPリクエストで、一つのパラメータに対して複数の値を渡すのであれば、URLの
「パラメータ=値」を複数書いてやればいいわけです。要するに、

YosanDel?mode=DEL&projectId=1&projectId=2&projectId=2…

なんて風になってればいいわけです。ただ一つ問題があって、この形で受け取った場合、
配列の順序は保障されない、ということです。今回の場合、projectIdとyosanNoという二つの
パラメータはおそらく関連があるので、順番が保障されていなければ問題が出るでしょう。

そこでもう一つの方法としては、カンマ区切りの形でサーブレットに渡し、サーブレット側で
値を分解して使う、という方法です。JavaScriptの配列をカンマ区切り文字列にするのはjoin
というメソッドでできるようですね。なので、

document.form1.action="YosanDel?mode=DEL" + "&projectId=" + delprjId.join(",") + "&yosanNo=" + delyosanNo.join(",") + "&projectId_h=" + PprojectId_h;

とやればカンマ区切りの形でサーブレットに渡るでしょう。その後はStringTokenizerなり
splitメソッドなり使って分解してやればいいでしょう。
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 2004-09-24 11:47
ukさん、ありがとうございます。

配列の受渡しを行う際に、任意の文字で区切る方法はまだ試していませんでした。
これから試してみます。

ちなみに、配列をjavascriptではなくServlet上でjavaで作成して
最初の投稿と同じ方法でBeanに渡してみたら上手くいきました。

やはり、javascriptを使用する場合はセパレータを使用しなければならないのでしょうか?

:::参照:::
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=10062&forum=12
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=2168&forum=12

[ メッセージ編集済み 編集者: カウンター 編集日時 2004-09-24 11:57 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-09-24 12:34
引用:

カウンターさんの書き込み (2004-09-24 11:47) より:
ちなみに、配列をjavascriptではなくServlet上でjavaで作成して
最初の投稿と同じ方法でBeanに渡してみたら上手くいきました。

やはり、javascriptを使用する場合はセパレータを使用しなければならないのでしょうか?


まず、JavaとJavascriptはまったくの別物であることと、HTTPの基本的な仕組みを理解されて
いるでしょうか。理解されていないのであれば、まずそこから勉強してください。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-09-24 13:07
引用:

やはり、javascriptを使用する場合はセパレータを使用しなければならないのでしょうか?



JavaScriptから直接ノードを追加してやれば、あまり深く考えなくてもうまくいく気がします。
#でも、ukさんの仰るように、基本は勉強しましょう
カウンター
大ベテラン
会議室デビュー日: 2004/02/19
投稿数: 123
投稿日時: 2004-09-24 14:45
ukさん、永井和彦さん。ありがとうございます。
引用:

そこでもう一つの方法としては、カンマ区切りの形でサーブレットに渡し、サーブレット側で値を分解して使う、という方法です。



ukさんのアドバイスどおりにカンマ区切りの文字列に変換してServletに渡して
Servletで配列に組みなおしてBeanに渡したら上手くいきました

ちなみに、Servretでの配列作成は下記のようにしました。

コード:
Pattern ptn = Pattern.compile("[,]+");
String[] PrjAry = ptn.split(request.getParameter("projectId"));
String[] YosanAry =ptn.split(request.getParameter("yosanNo"));



引用:

JavaScriptから直接ノードを追加してやれば、あまり深く考えなくてもうまくいく気がします。



引用:

まず、JavaとJavascriptはまったくの別物であることと、HTTPの基本的な仕組みを理解されて
いるでしょうか。理解されていないのであれば、まずそこから勉強してください。



JavaとJavascriptが別物であることはさすがに理解していますが、
HTTPの基本的な仕組みは理解していませんでした。
また、なんとかJavascriptの配列をそのまま使うことに、無駄に執着してしまっていたようです。
まだ、javaをはじめて3週間ほどですが、いろいろ学んでいきます。

1

スキルアップ/キャリアアップ(JOB@IT)