マンガでよめる痔のこと・薬のこと

ショッピングサイトの注文確認画面で商品の個数を変更し、合計金額をページの更新なしに変更して表示するようなページを作りたいのですが、
下記のソースの用にして作るとidが被ってしまい二個目の商品以降が計算できず困っています。
formやinputタグもfor文で回して作っているのでid名も同様になってしまうことが問題だと思うのですが、うまい方法が思いつかず困っています。
どなたかアドバイス頂ければと思います。
javascriptの質問板で書いたほうが良いのかとも思ったのですが、jspファイルなのでjava板で質問させて頂きました。

ソースは下記です。
---------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
import="java.io.IOException,java.io.PrintWriter,java.sql.Connection,java.sql.DriverManager,java.sql.ResultSet,java.sql.SQLException,java.sql.Statement,java.util.ArrayList,javax.servlet.RequestDispatcher,javax.servlet.ServletException,javax.servlet.annotation.WebServlet,javax.servlet.http.HttpServlet,javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse,javax.servlet.http.HttpSession,record.KounyuMeisai"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ショッピングカート</title>
</head>
<body>

<%
//セッションからArrayListを取ってくる
ArrayList<KounyuMeisai> KounyuList = (ArrayList<KounyuMeisai>) session
.getAttribute("KounyuList");
%>
<table border=2 width=800 align=center>
<caption>【買い物かご】</caption>
<tr>
<th></th>
<th>商品名</th>
<th>商品種別</th>
<th>商品単価(円)</th>
<th>注文数</th>
<th>合計(円)</th>
<th></th>
</tr>

<%
//繰り返しでArrayListの中身を取ってくる 
int i = 0;
int kou = 1;
int soukei = 0;
for (KounyuMeisai k : KounyuList) {
if (k.getNum() != 0) {
%>
<script>
function goukei() {
document.getElementById("kekka").value=document.getElementById("tanka").value *document.getElementById("kosuu").value;
}
</script>
<tr>
<th><%=kou%></th>
<th><%=k.getSname()%></th>
<th><%=k.getSkind()%></th>
<th><input type="text" value =<%=k.getSprice()%> id="tanka" readonly></input>
</th>
<th><form action="KounyuHenshuServlet" method="post">
<p>
<select name="afterNum" onchange=goukei() id=kosuu>
<option value=<%=k.getNum()%> selected><%=k.getNum()%></option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
</select>
</p>
</th>
<th><input type ="text" value=<%=k.getSprice()*k.getNum() %> id="kekka" readonly></input></th>
<th><input type=hidden name=AlistNum value=<%=i%> >
<input type="submit" name="button" value="変更">
<input type="submit" name="button" value="削除">
</form></th>
</tr>
<%
soukei += k.getNum() * k.getSprice();
kou++;
}
i++;
}
//セッションにアレイリストを入れる。
session.setAttribute("KounyuList", KounyuList);
%>
<tr>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th>総計</th>
<th><%=soukei%></th>
</tr>
</table>
<a href="kounyuInput.jsp">買い物を続ける</a>
<br>
</body>
</html>

このQ&Aに関連する最新のQ&A

A 回答 (1件)

方法はいくらでもあると思いますが


この1個だけ見たときに最も単純で修正の労が少ないであろう方法を提案しますね
まず、ループ中のid指定はやめた方がいいです
idはHTMLドキュメント中で一意であるべきです
なのでidでは無くnameにしましょう使いましょう(afterNumはそのままで)

次に、html中の呼び出し箇所では実引数をthisとします
<select name="afterNum" onchange="goukei(this)">の様にします
次に、jsのgoukeiメソッドを変更します
まず仮引数を設定してgoukei(obj)の様にします
そして内部の実装は、渡された引数から自身の属するformを特定し
計算用の各項目をformからの相対で取得して計算するようにします
テスト用コードですがこんな風になります
function goukei(obj) {
var goukei = 0;
var form = obj.form;
if (form)
{
var tanka = form.tanka;
var afterNum = form.afterNum;
if (tanka && afterNum)
{
goukei += eval(tanka.value) * eval(afterNum.value);
alert(goukei);
}
}
}
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qフォーム上で押されたボタンによってサーブレットの処理を変えたい

Urizakaです。
さて、さっそく質問です。
JSPの同一フォーム上に「登録」「修正」「削除」のボタンを置き、その押された
ボタンによってサーブレット内での処理が切り替わる(具体的には、違う
SQL文を実行し、違うJSPページをgetRequestDispatcherメソッドで生成
する)ようにしたいのですが、どのようにすればよいのでしょうか?
もちろんそれぞれの処理に対して別々のサーブレットを作り、javaScript
でそれぞれのサーブレットへ飛ぶように制御するという処理も考えたことは
考えたのですが、できれば一つのサーブレットで済ませたいと考えたもので
…宜しくお願いします。

Aベストアンサー

お恥ずかしい限りです。
前述の例、動くわけがありませんね(汗)

2つめの例、書きなおします。

---------------------------------------------------

■JSPのフォーム

<form name=MyForm action="<<サーブレットのURL>>" method=post>
<input type=button name=MyClick value=登録 onClick="func('Toroku');">
<input type=button name=MyClick value=修正 onClick="func('Shusei');">
<input type=button name=MyClick value=削除 onClick="func('Sakujo');">
<input type=hidden name=MySubmit>
</form>

<script language="JavaScript">
function func(MyCommand){
document.MyForm.MySubmit.value=MyCommand;
document.MyForm.submit();
}
</script>

■Servletでの処理
// リクエストの取得
String MyAction = req.getParameter("MySubmit");

// 処理の実行
if (MyAction.equals("Toroku")){...}
if (MyAction.equals("Shusei")){...}
if (MyAction.equals("Sakujo")){...}



---------------------------------------------------

こんな感じでどうでしょうか。
ちなみにこうやって書いておくと、フォームのボタンからじゃなくても
アンカーをクリックすることで同じ効果が出せそうな……

<a href="JavaScript:func('Toroku')">登録</a>

あ、でもまたボロが出そうなのでこの辺で(^_^;)

お恥ずかしい限りです。
前述の例、動くわけがありませんね(汗)

2つめの例、書きなおします。

---------------------------------------------------

■JSPのフォーム

<form name=MyForm action="<<サーブレットのURL>>" method=post>
<input type=button name=MyClick value=登録 onClick="func('Toroku');">
<input type=button name=MyClick value=修正 onClick="func('Shusei');">
<input type=button name=MyClick value=削除 onClick="func('Sakujo');">
<input type=hidden name=M...続きを読む

QJSPでの計算結果表示

HTMLのフォームから入力された数値データの合計をJSPで表示させたいのですが、null値が返ってきてしまい、うまくいきません。
取得するデータの型はfloat型です。
どのようにすればよいか教えていただけますでしょうか。

Aベストアンサー

とりあえず、合計するんだから、それぞれのパラメータの値をとって、加算しないとねぇー

<%
float gokei = 0;
for(int i=1; i<=5; i++) {
 String s = request.getParameter("P_W_time0" + i);
 gokei += Float.valueOf(s);
}
%>
<td colspan="10">
合計<%=gokei%>
</td>

こんな感じでできるはず(なんて、やさしいんだろ、俺)

ただし、HTML見るかぎり、パラメータに値が入ってこないことがあるんで
その時のNULL処理は、上記には入ってません。
この辺は、自分で考えて下さい。

Q「httpステータス404」というエラーが出ます。

「httpステータス404」というエラーが出ます。

java初心者です、宜しくお願い致します。
EclipseでServletを書いてやりましたが、以下のようなエラーが出ます、
原因はなんでしょうか、宜しくお願い致します。
「httpステータス404-/Servlet%E7%B7%B4%E7%BF%92/ ServOutput」

Aベストアンサー

Not Found
という意味です。
そのファイルが無い。あるいはリンクが間違っています。
詳しくは参考URLをみてください。

参考URL:http://ja.wikipedia.org/wiki/HTTP_404

QJava-jspの画面入力値保持について

画面にテキスト、ラジオボタン、リストボックス とボタンがあります。
ボタンを押すと、JAVAで処理を行い、jspのviewで表示します。

1.テキスト、ラジオボタン、リストボックスなどに値が入力、設定されている状態で
ボタンを押して処理後にテキスト、ラジオボタン、リストボックスの値が
変わらないようにしたいのですが、
その場合、たとえば、入力、設定値をセッションになどに格納しておき
jspの所で、セッションから値を設定すると言うような方法になるのでしょうか?

2.ボタン押して処理後、ラジオボタン、リストボックスの選択値も
  変えないようにしたいのですが、
  これはどのように実現するのが、適切なのでしょうか?


以上、よろしくお願いします。

Aベストアンサー

ボタンというのはフォームのサブミットボタンのことですよ?
つまり、画面遷移が起きることを前提とすると(元の同じ画面に戻るのも含みます)

テキスト、ラジオボタン、リストボックスの状態を「要求パラメータ」として
送信し、それを次画面に反映するというのが最も一般的な方法です。

フレームワーク struts のアクションフォーム&JSPカスタムタグを使うと比較的楽に
そういう画面が作れますが、多くのフレームワークでも大差ありません。
簡単な画面なら素のサーブレート+JSPでも十分作れます。

セッションでもできますが、 セッションはログイン情報などの保持など、
限定された範囲で使うのが普通です。また、結局セッションに最新の
テキスト、ラジオボタン、リストボックスの状態を送るには、「要求パラメータ」
を送信する必要があります。

AJAXを使うという方法もあります。この場合、ボタンは AJAX 処理だけを行い
画面遷移を起こさないので、サーバ側で画面のテキスト、ラジオボタン、
リストボックスの状態をもつ必要はありません。

QJSPの処理の途中で、JavaScriptの処理をしたい

プログラムをJSPで記述している(<% %>タグ)のですが、
JavaScriptのalertやconfirmなどのポップアップするダイアログを
表示したいのです。それは可能なのでしょうか?

Aベストアンサー

No.2の回答に対する回答(変な日本語ですが)です。

JSPとJavaScriptの処理の行われる順番について考えていないと
エラーになることがありますよ。
大まかな流れは、
 JSPのソースをサーバ側で解釈、実行する(HTMLのソースを吐き出す)
  ↓
 クライアントに生成したソースを送信する
  ↓
 クライアント側のブラウザがソースを解釈する
  ↓
 ソースの中のJavaScriptを、ソースの上のほうから順次実行する
  ↓
 同時に、通常の表示(HTMLの解釈)も実行される

 と、こういう流れですので、例えば、JavaScriptで値を入力し、
JSPでその値を使おうとすると、エラーとなります。

 具体的にやりたいこと(やろうとしていること)を書いていただいたほうが
適切に回答できますが、上記が今考えられるエラーの原因です。

QFORMで送信ボタンと戻るボタンを2つつけてそれぞれ遷移先を変えたい

  
以下のような画面を作りたいのですが↓

--------------------------------------------------------------------------------
● a.php (ユーザ情報入力画面) ※フォームに入力する画面
 
 <FORM method="POST" action="b.php">
  <INPUT type="text" name="mail">
  <INPUT type="submit" name="submit" value="確認">
 </FORM>

● b.php (ユーザ情報入力確認画面)※フォームに入力された値を表示する画面

 <FORM method="POST" action="c.php">
  <!-- ここには、フォームに入力された値を表示する -->
  <INPUT type="submit" name="submit" value="登録"> // c.php に遷移する
  <INPUT type="submit" name="submit" value="戻る"> // a.php に戻る
 </FORM>

● c.php (完了画面)
--------------------------------------------------------------------------------
b.php について質問なのですが、
b.phpにおいて、登録ボタンと戻るボタンを2つつけて、
それぞれ遷移先を変えたいのですが、どうすればいいんでしょうか・・・?
<FORM method="POST" action="c.php">と書いてしまうと、
戻るボタンを押しても戻らずに、c.phpに遷移してしまいますよね??
こういう場合ってJavaScriptとかで遷移先を指定するんですか・・?
もしそうでしたら、JavaScriptがよくわからないので
できればサンプルコード示していただけると助かります・・・。
  

  
以下のような画面を作りたいのですが↓

--------------------------------------------------------------------------------
● a.php (ユーザ情報入力画面) ※フォームに入力する画面
 
 <FORM method="POST" action="b.php">
  <INPUT type="text" name="mail">
  <INPUT type="submit" name="submit" value="確認">
 </FORM>

● b.php (ユーザ情報入力確認画面)※フォームに入力された値を表示する画面

 <FORM method="POST" action="c.php">
  <!-- ここには、フォームに入...続きを読む

Aベストアンサー

はじめまして。

<INPUT type="submit" name="submit" value="登録" onClick="form.action='c.php';return true">
<INPUT type="submit" name="submit" value="戻る" onClick="form.action='a.php';return true">

でいいと思います。(実際、このコードで使っています)
値を渡すには、FORM内にhiddenで、値を設定しておいて、methodをPOSTに設定しておけば、渡せます。

Qデータベースから日付型を取得したいんですが

初心的なことですいません
データベースから生年月日項目の日付型(1999/11/01)をとってきてたいんですが、getDate型でとってくればいいんでしょうか?その生年月日を使って計算をしたいでカレンダークラスに入れたいんですが、どうやったらいいのかわかりません、参考にしたらいいサイトとかあったら教えてください。

Aベストアンサー

ResultSet変数をrsとして
String strData = rs.getString(String 行番号);

String strYear = strData.subString(strData,0,4);
String strMonth = strData.subString(strData,5,7);
String strDay = strData.subString(8);

int intYear = Integer.parseInt(strYear);
int intMonth = Integer.parseInt(strMonth);
int intDay = Integer.parseInt(strDay);

Calendar cal = new Calendar();
cal.set(intYear, intMonth, intDay);

で、OKだとおもいます。私もこの手のプログラムは久しぶりですが、多分動くとおもいます。

なお、あなたくらいのレベルならば秀和システムのJava逆引き大全という本が役に立つと思います。

参考URL:http://www.shuwasystem.co.jp/cgi-bin/detail.cgi?isbn=4-7980-0815-X

ResultSet変数をrsとして
String strData = rs.getString(String 行番号);

String strYear = strData.subString(strData,0,4);
String strMonth = strData.subString(strData,5,7);
String strDay = strData.subString(8);

int intYear = Integer.parseInt(strYear);
int intMonth = Integer.parseInt(strMonth);
int intDay = Integer.parseInt(strDay);

Calendar cal = new Calendar();
cal.set(intYear, intMonth, intDay);

で、OKだとおもいます。私もこの手のプログラムは久しぶりですが、...続きを読む

Qショッピングカートの合計金額を求めたい…。

お世話になります。

ショッピングカートを作っているのですが、購入商品を一覧表示させて
その商品数と、合計金額を表示させたいのですが色々試しましたが
いい方法が思い浮かびません…。

初心者なのですが、どなたか宜しくご教授お願いします。
ちなみに、ArrayListに購入商品を格納し、それをセッションに
セットしてます。
購入商品の各項目には、商品番号・商品名・価格・購入個数があります。
説明不足であればスグに捕捉致します。

Aベストアンサー

やったことはありませんが。
問題なのは購入商品が複数ある場合は配列を
使用したいですがSessionでは配列が使えないと思います。

SessionではなくServletRequestオブジェクトならば
String[] getParameterValues(String name)[i]を
使用してHTMLformで入力されたデータを
取り出せるのではないでしょうか。

Qequalsの逆

javaで、文字列の場合は比較演算子の「==」は用いずに

if ((str1.getText()).equals(str2)){
(※…str1,2は文字列)

と書きますよね?
この逆で、文字列str1とstr2は等しくないとき、にはif以下の条件文をどのように書けばよいでしょうか?

Aベストアンサー

>if !((str1.getText()).equals(str2)){

あくまで
if(){
}


!(str1.getText()).equals(str2)
が入っているので
if !((str1.getText()).equals(str2)){
じゃなくて
if (!(str1.getText()).equals(str2)){
こう。

QjspでのArrayListの値の表示

jsp上でBeanで以下のように設定されている

ArrayList<ArrayList<Integer>> a;
a.add(new ArrayList<Integer>);
a.add(new ArrayList<Integer>);
a.add(new ArrayList<Integer>);
a.get(0).add(0);
a.get(0).add(1);
a.get(1).add(2);
a.get(1).add(3);
a.get(1).add(4);
a.get(1).add(5);
a.get(2).add(6);
a.get(2).add(7);
a.get(2).add(8);

aのような行と列が不定のArrayListの全ての値をjspの画面上に

 値 値 値
 0  2  6
 1  3  7
   4  8
   5

といったようにテーブルで表示したいのですがjspにどのような既述をすればよいでしょうか?
クリックしたときの処理などの導入や項目を増やすなど拡張する場合があるので
以下のような形とレイアウトが同じようになると望ましいです

<td>
<table>
<tr>値</tr>
<tr>0</tr>
<tr>1</tr>
<tr>2</tr>
</table>
</td>
<td>
<table>
<tr>値</tr>
<tr>3</tr>
<tr>4</tr>
<tr>5</tr>
</table>
</td>
<td>
<table>
<tr>値</tr>
<tr>6</tr>
<tr>7</tr>
<tr>8</tr>
</table>
</td>

jsp上でBeanで以下のように設定されている

ArrayList<ArrayList<Integer>> a;
a.add(new ArrayList<Integer>);
a.add(new ArrayList<Integer>);
a.add(new ArrayList<Integer>);
a.get(0).add(0);
a.get(0).add(1);
a.get(1).add(2);
a.get(1).add(3);
a.get(1).add(4);
a.get(1).add(5);
a.get(2).add(6);
a.get(2).add(7);
a.get(2).add(8);

aのような行と列が不定のArrayListの全ての値をjspの画面上に

 値 値 値
 0  2  6
 1  3  7
   4  8
   5

といったようにテーブルで表示したいので...続きを読む

Aベストアンサー

こんにちは。

>以下のような形とレイアウトが同じようになると望ましいです

タグが構成的におかしいので勝手に直しました。
*インデントに全角スペース使ってます
動きは追って貰えばわかると思いますので説明を割愛します。

 <table border="1">
  <tr>
<%
 // 列分の処理
 for ( int i = 0; i < a.size(); i ++ ) {
%>
   <td valign="top">
    <table>
     <tr>
      <th>値</th>
     </tr>
<%
  // 行分の処理(指定列の行数分)
  for ( int j = 0; j < a.get(i).size(); j ++ ) {
%>
     <tr>
      <td>
       <%=a.get(i).get(j) %>
      </td>
     </tr>
<%
  }
%>
    </table>
   </td>
<%
 }
%>
  </tr>
 </table>


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング