- ベストアンサー
JAVAサーブレットのdoPostについて
HTMLコード上にPOST送信を行うボタンや入力ボックスなどのユーザコントロールが複数表示されている状態で、特定の一行入力テキストボックスでエンターが押された場合のみ行われる処理をJAVAサーブレットのdoPost内に組み込もうとして行き詰っています。 ボタンの場合は、 if(req.getParameter([ボタン名]) != null) という条件式で拾えているのですが、テキストボックスの送信を拾うことは何らかの方法で可能なのでしょうか? よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
テキストボックスでエンターが押されることによってフォームがサブミットされる場合、どのテキストボックスでエンターが押されたかについての情報は、POSTのパラメータに含まれていません。 ですので、サーブレット側だけの対応では、区別することができません。 HTML側(クライアント側)で、JavaScript等で何らかの処理を行う必要があります。 単純なサンプル、HTML <html> <head> <script type="text/javascript"> <!-- function setTarget(e){ if (!e) { e = window.event; } if(e.keyCode == 13) { document.form1.target.value = e.target.name; document.form1.submit(); return false; } return true; } // --> </script> </head> <body> <form name="form1" action="aaa/bbb" method="post"> <input type="text" name="text1" onKeyPress="return setTarget(event);"><br> <input type="text" name="text2" onKeyPress="return setTarget(event);"><br> <input type="submit" name="button1" value="送信" /> <input type="hidden" name="target" value="" /> </form> </body> </html> このサンプルでは、テキストボックスでエンターが押された場合は、targetにエンターが押されたテキストボックスのnameが設定されて、サブミットされます。 サーブレット側では、 if (req.getParameter("button1") != null) { // button1がクリックされたときの処理 } else if ("text1".equals(req.getParameter("target"))) { // text1でエンターが押されたときの処理 } else if ("text2".equals(req.getParameter("target"))) { // text2でエンターが押されたときの処理 } で区別して処理できます。 ボタンをクリックしたときにもtargetに何か含まれている可能性もありますので(ブラウザの"戻る"ボタンで戻ったあとの場合など)、ボタンではないことを確認してから、テキストボックスの処理を行った方がいいと思います。 上のサンプルは、十分に検証したものではありませんので、ブラウザの種類やバージョンによっては上手くいかないかもしれません。また、当然ですが、クライアント側でJavaScriptが有効になっていない場合も上手くいきません。 参考:Enterを押すとsubmitされる場合についての解説 http://www.programming-magic.com/20080119212425/
その他の回答 (1)
- Ogre7077
- ベストアンサー率65% (170/258)
HTML内のスクリプトによる補助がないと不可能かと思います。 たとえば フォーム内に隠しデータ要素 focusin を加える <input type=hidden name=focusin> JavaScript で、特定要素の focus/blur イベント時に focusin を更新 <script> 特定要素.onfocus = function(e){ focusin.value = 特定要素の名前 } 特定要素.onblur = function(e){ focusin.value = '' } </script> 送信先の doPost にて、パラメタ focusin が特定要素の名前の場合、処理を分岐させる
お礼
ご回答ありがとうございます。 お蔭様で作りたかったものが作ることが出来ました。 ”戻る”で戻ったときの対応などは自分では気付けなかったと思うので、とても助かりました。