• ベストアンサー

サーブレットで複数値の受取り

html(JSP)-formからSelectBox(multiple)を利用して 複数件のデータを取得したいと考えています。 servletで配列を利用して String abc[ ] = req.getParameterValues("list"); for (int i=0;i<abc.length;i++) { 処理1 } とすれば問題なく動くと思っていたのですが、 一件も選択されなかった場合にfor文でエラーとなっています。 abc.lengthで数えることができないのでしょうか? この場合、どのように対応すれば良いですか?

  • ssm3u
  • お礼率70% (42/60)
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

ServletRequest#getParameterValues() は、パラメータが無い場合には null を返します。 だから、 String abc[] = req.getParameterValues("list"); if (abc != null) {  for (int i=0;i<abc.length;i++) {   処理1  } } としなければ、駄目ですね。

ssm3u
質問者

お礼

いつもありがとうございます。 質問するたびに即答で感謝いっぱいです。 (単に私のレベルが低いのですね^^;) 上記でうまく動きました。 配列がnull値かどうか検査するために abc[] != null とかやってたんです・・・ []はいらないのですね。 ありがとうございました。勉強になります。

関連するQ&A

  • getParameterについて

    今フォームの内容(文字列)をreq.getParameterValues(~)で持ってきているのですが、数字などを持って来たい場合は何を使えばいいんでしょうか? int suji = req.getParameterValues(int型); というようにすると、 javax.servlet.ServletRequest の getParameterValues(java.lang.String) は (int) に適用できません。 というエラーが出てしまうのです。

  • JSPから値を送ったときのServletでの受け取り方について

    JSPから<form>で値を送って、それをServletでgetParameterで受け取る処理を しているのですが、 JSPから送る値がいくつあるかわからない場合、Servlet側ではどのように 受け取る方法があるでしょうか? 例えば、 <form action="<%= response.encodeURL("/mimi/abc") %>" method="post"> <% for(int i=0;i<attr.size();i++) { //attr.size()にはいくつ入ってるか不明として String strNameAtr = (String)attr.elementAt(i) ; %> 値 <input type="text" value="<%= strNameAtr %>" name="xmlValueAttr_"+"<%= i %>"><br> <% } %> <input type="submit" value="変更" name="getText"> </form> これを、Servletで受け取る場合、どのように受け取れるでしょうか? xmlValueAttr_iの"i"の部分はいくつまで入っているかわからないので、 普通の処理だと、対応できません。 いい方法があったら、教えてください、お願いします。

    • ベストアンサー
    • Java
  • struts関連 web.xmlに複数の<servlet-mappin

    struts関連 web.xmlに複数の<servlet-mapping>を記述する方法について 初歩的なことなのかもしれませんが質問させてください。 Struts1.3.5での質問なのですが、web.xmlにURLパターンを複数記述している場合に servlet-mapping の記載位置が後の方のURLパターンが、 JSPのFormタグで生成されるパスに設定されてしまい、原因が分からず困っています。 現象としては、 例えば、web.xmlの<servlet-mapping>にそれぞれ異なる URLパターンを[/abc/*]→[/xyz/*]の順で記述している場合、 web.xml(抜粋)---------------------------------------------- <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/abc/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/xyz/*</url-pattern> </servlet-mapping> ---------------------------------------------------------- URLパターンが[/abc/*]となる以下のURLをブラウザで表示した所、 [https:/localhost/{コンテキストルート}/abc/LoginAction] 表示されたJSP内で指定しているformタグのアクションパスが web.xmlで記載したURLパターンのパスではなく、 web.xmlで後の方に記載した別のURLパターンのパス(/xyz/)が設定されてしまいます。 ・表示されるJSP内で指定しているアクションパス <html:form action="/LoginAction"> 上記で生成されるHTML <form name="LoginForm" method="post" action="/コンテキスト名/xyz/LoginAction">       web.xmlでURLパターンを[/xyz/*]→[/abc/*]の順で記述した場合は、 正しくURLパターンで記述したパスが設定されます。 <form name="LoginForm" method="post" action="/コンテキスト名/abc/LoginAction"> ただし、この場合はURLパターンが[/xyz/*]のURLを表示した場合に <form ~ action="/{コンテキストルート}/abc/LoginAction">となってしまいます。 どなたかこうした現象について回避策をご存知の方はいらっしゃらないでしょうか?

    • ベストアンサー
    • Java
  • javaサーブレットのweb.xmlについておしえてください

    サーブレット作成中です。初心者です。 まずやりたいことは a.jspを作成しa.jspではformタグのactionにSampleを指定しています。 そして/test/Best.classを実行し、 b.jspに値を表示させます。つぎにb.jspからSample2参照させ /test/Best2.classを実行させたいと思いますが、 以下のようにweb.xmlに書いているのですが うまくいきません。 何がいけないのでしょうか?他に何か設定等いるのでしょうか? また他に手段があるのでしょうか? おしえてください。 ※ちなみにSampleだけの場合はうまくいっています。 SampleとSample2というように二つ設定させると うまくいきません。 ------ web.xmlの中身の一部------- <servlet> <servlet-name>Sample</servlet-name> <servlet-class>test.Best</servlet-class> <servlet-name>Sample2</servlet-name> <servlet-class>test.Best2</servlet-class> </servlet> <servlet-mapping> <servlet-name>Sample</servlet-name> <url-pattern>/Sample</url-pattern> <servlet-name>Sample2</servlet-name> <url-pattern>/Sample2</url-pattern> </servlet-mapping> --------------------------

    • ベストアンサー
    • Java
  • javaサーブレットでのlocalアクセス

    いつもお世話になっています。 javaサーブレット実行時における、処理について質問します。 現在、javaサーブレットを使って、複数のidで処理しようとしています。 その際、同期化を行うため、ラップオブジェクト同期化を使用していています。 その際、複数画面からアクセスされた場合、 アクセスされた順番に処理は行えるのですが、 このときどのユーザーが行ったかを判別したいと考えています。 これは、可能なのでしょうか? ソースは以下の方法で作成しています。 jsp側 <body> <form name="groupForm" action="./Group_Run_Servlet" method="POST"> <input type="text" name="userId" value="nanami_45"> <input type="text" name="password" value="moon_Light"><br> ◆更新・削除のどちらかをチェックしてください。<br>Test <table border="2"> <tr> <td style="background-color:white;"></td> <td style="background-color:white;"></td> <td>No.</td> <td>グループ名称</td> </tr> <tr> <td> <input type="checkbox" name="update" value="0">更新 </td> <td> <input type="checkbox" name="delete" value="0">削除 </td> <td><input type="hidden" name="groupNumber" value="24"> 24 </td> <td> <input type="text" name="groupName" value="at"> </td> </tr> </table> </body> ※文字の加減で、一個にしています。 サーブレット側 public class Group_Run_Servlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { /** ラップオブジェクト同期化 **/ private static final List<String> list = Collections.synchronizedList(new ArrayList<String>() ); protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); //このとき、実行adminユーザーを判定する必要がある。 //方法として、渡されてきた順に一度listかに格納する必要がある System.out.println("userId="+AdminUser_Session.getUserID()); System.out.println("password="+AdminUser_Session.getPassword()); String userId = String.valueOf(request.getParameter("userId")); String password = String.valueOf(request.getParameter("password")); System.out.println("userid:"+userId + "/password:"+ password); synchronized(list) { //checkboxの値を取得する String[] update = request.getParameterValues("update"); String[] delete = request.getParameterValues("delete"); String[] groupNumbers = request.getParameterValues("groupNumber"); String[] groupNames = request.getParameterValues("groupName"); //更新 if(update != null ) { System.out.println("update.length:"+ update.length ); for(int u=0;u<update.length;u++ ) { System.out.println("update[" + u + "]:" + update[u]); testWait(c); } } //削除 if(delete != null ) { System.out.println("delete.length:"+ delete.length); for(int d=0;d<delete.length;d++ ) { System.out.println("delete["+ d + "]: " + delete[d]); testWait(c); } } } private void testWait( int userCnt) { for(int s=0;s<30;s++) { try { Thread.sleep(300); System.out.println("--- " + s ); } catch (InterruptedException e) { e.printStackTrace(); } } } } ※doPost以外省いています. 宜しくお願いします。

  • JavaScriptで配列を取得したい

    お世話になります。 データベースから取得したリスト(可変)をフォームに設定したところ、 JavaScriptで配列を参照したところ、リストが1件の場合はエラー、 3件の場合は正常という現象がおき、困っております。 リストが1件の場合でも、配列に認識させたいのですが、 他の箇所も記述が多いためシンプルな手法を探しています。 よろしくお願い致します。 3件のレコードの場合、正常に処理される。 ---- HTML内 -------------- <input type="checkbox" name="chk_sel"> <input type="checkbox" name="chk_sel"> <input type="checkbox" name="chk_sel"> ---- JavaScript内 -------------- function test(){ var obj = document.form1.chk_sel; if (obj != null) { for(i=0;i<obj.length;i++){ if(obj[i].checked == true){ check_num++; } } } } ----------------------------- ■1件のレコードの場合、エラーになる (配列に認識されないらしく、obj.lengthが取得できない) ---- HTML内 -------------- <input type="checkbox" name="chk_sel"> ---- JavaScript内 -------------- function test(){ var obj = document.form1.chk_sel; if (obj != null) { for(i=0;i<obj.length;i++){ if(obj[i].checked == true){ check_num++; } } } } -----------------------------

  • 複数のラジオボタンの選択チェック

    Q1とQ2の2問があり、ラジオボタンで回答を選択するようにしていますが、 ラジオボタンを選択しなかった場合、選択を促すようメッセージを表示させるようJavaScriptで以下のように作成してみましたがうまくいきません。 Q1とQ2の両方を選択しなかった場合、「Q1が選択されていません」とメッセージが表示されますが、Q1だけを選択してQ2を選択しなかった場合はメッセージが表示されません。 いろいろ調べてみたのですが、function checkの使い方に問題があるのでしょうか? function check(){ var flag = 0; if(document.form1.Q1.length) { flag = 1; var i; for(i = 0; i < document.form1.Q1.length; i ++){ if(document.form1.Q1[i].checked){ flag = 0; break; } } } if(flag){ window.alert('Q1が選択されていません'); return false; } else{ return true; } var flag = 0; if(document.form1.Q2.length) { flag = 1; var i; for(i = 0; i < document.form1.Q2.length; i ++){ if(document.form1.Q2[i].checked){ flag = 0; break; } } } if(flag){ window.alert('Q2が選択されていません'); return false; } else{ return true; } }

  • JAVAのチェックボックスの扱いについて

    HTMLから選択された情報をJSPで表示するプログラムを作っているのですがチェックボックスが選択されてるかどうかのプログラムの書き方がわかりません。 とりあえず出来ているところまでのソースを見せます。 ・HTML <input type="checkbox" name="aa" value="aa"> <input type="checkbox" name="aa" value="bb"> <input type="checkbox" name="aa" value="cc"> <input type="checkbox" name="aa" value="dd"> <select name="abc"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> </select> ・JSP //情報をもらう String abc = request.getParameter("abc"); String[] aa = request.getParameterValues("aa"); for(int i=0;i<aa.length;i++){ aa[i]; } 上のようにチェックボックスは情報を取り出しているんですが 選択されていないときはエラーになってしまいます。 for文の前に値が入っているかどうかのチェックをしなくてはいけないのですがどのように書いていいかわかりません。 誰か教えてください。

    • ベストアンサー
    • Java
  • 画面遷移時のデータ遷移について

    Javaにも記載してしまったのですがこちらに記載すべきかと思い投稿させていただきました。 2重投稿になってしまうため削除しようとしたのですが24時間経たないと削除できませんでした。 24時間後に1つにしようと思います。 皆様のお力をお貸しください。 よろしくお願いします。 入力画面で入力した値を次の確認画面で表示したいと思っているんですがどのようにしたらよいでしょうか? web.xmlでは定義してあります。 入力前のJSPは作成しました。 入力後のJSPをどのようにしたらいいでしょうか? また入力画面のJSPは変更する必要があるでしょうか? --------------------------------------------- package monndai; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Monsyo_NewFileDate extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { RequestDispatcher reqDis = null; try { System.out.println(); //表示JSP決定 reqDis = req.getRequestDispatcher("/jsp/Monsyo_newFileDate.jsp"); //forward reqDis.forward(req,res); } catch (Exception e) { System.out.println("err"); e.printStackTrace(); req.setAttribute("exception", e); reqDis = req.getRequestDispatcher("/jsp/error.jsp"); reqDis.forward(req, res); } } } --------------------------------------------- package monndai; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Monsyo_NewFileInputData extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { RequestDispatcher reqDis = null; try { System.out.println(); //表示JSP決定 reqDis = req.getRequestDispatcher("/jsp/Monsyo_newFileInputData.jsp"); //forward reqDis.forward(req,res); } catch (Exception e) { System.out.println("err"); e.printStackTrace(); req.setAttribute("exception", e); reqDis = req.getRequestDispatcher("/jsp/error.jsp"); reqDis.forward(req, res); } } } --------------------------------------------- <%@page language="java" %> <%@page contentType="text/html;charset=EUC-JP"%> <% String returnPath0 = null; String returnPath1 = null; %> <html> <head> <script language="JavaScript"> <!--//  function checkLength(obj, maxlen) {   if(obj.value.length > maxlen) {    obj.disabled = true;    obj.value = obj.value.substring(0,maxlen);   }   obj.disabled = false;   obj.focus(); // BackSpace防止  } function sendRequest(path) { document.fr.action = path; document.fr.submit(); } --> </script> </head> <title>新問処発行</title> <body> <form name="fr" onSubmit="true" method="POST" > <div align="left"> <h3> 新問処発行</h3> <br> <日付> (XXXX/XX/XX)<br> <input type="text" align="left" maxlength="10" name=" " size="15" > <br> <タイトル>(100文字以内)<br> <textarea rows="5" cols="60" name="title" onkeyup="checkLength(this, 100);" style="ime-mode:active"></TEXTAREA> <br> <% returnPath0 = "sendRequest('/mondai/Monsyo_NewFileInputDataServlet')"; returnPath1 = "sendRequest('/mondai/Monsyo_ToppageServlet')"; %> <br> <input type="button" value="入力" onClick="<%= returnPath0 %>"/> <input type="button" value="戻る" onClick="<%= returnPath1 %>"/> </div> </form> </body> </html> ---------------------------------------------

  • 画面遷移時のデータ遷移について

    文字数制限があったので短くして投稿させていただきます。 入力画面で入力した値を次の確認画面で表示したいと思っているんですがどのようにしたらよいでしょうか? web.xmlでは定義してあります。 入力前のJSPは作成しました。 入力後のJSPをどのようにしたらいいでしょうか? また入力画面のJSPは変更する必要があるでしょうか? --------------------------------------------- package monndai; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Monsyo_NewFileDate extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { RequestDispatcher reqDis = null; try { System.out.println(); //表示JSP決定 reqDis = req.getRequestDispatcher("/jsp/Monsyo_newFileDate.jsp"); //forward reqDis.forward(req,res); } catch (Exception e) { System.out.println("err"); e.printStackTrace(); req.setAttribute("exception", e); reqDis = req.getRequestDispatcher("/jsp/error.jsp"); reqDis.forward(req, res); } } } --------------------------------------------- package monndai; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Monsyo_NewFileInputData extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { RequestDispatcher reqDis = null; try { System.out.println(); //表示JSP決定 reqDis = req.getRequestDispatcher("/jsp/Monsyo_newFileInputData.jsp"); //forward reqDis.forward(req,res); } catch (Exception e) { System.out.println("err"); e.printStackTrace(); req.setAttribute("exception", e); reqDis = req.getRequestDispatcher("/jsp/error.jsp"); reqDis.forward(req, res); } } } --------------------------------------------- <%@page language="java" %> <%@page contentType="text/html;charset=EUC-JP"%> <% String returnPath0 = null; String returnPath1 = null; %> <html> <head> <script language="JavaScript"> <!--//  function checkLength(obj, maxlen) {   if(obj.value.length > maxlen) {    obj.disabled = true;    obj.value = obj.value.substring(0,maxlen);   }   obj.disabled = false;   obj.focus(); // BackSpace防止  } function sendRequest(path) { document.fr.action = path; document.fr.submit(); } --> </script> </head> <title>新問処発行</title> <body> <form name="fr" onSubmit="true" method="POST" > <div align="left"> <h3> 新問処発行</h3> <br> <日付> (XXXX/XX/XX)<br> <input type="text" align="left" maxlength="10" name=" " size="15" > <br> <タイトル>(100文字以内)<br> <textarea rows="5" cols="60" name="title" onkeyup="checkLength(this, 100);" style="ime-mode:active"></TEXTAREA> <br> <% returnPath0 = "sendRequest('/mondai/Monsyo_NewFileInputDataServlet')"; returnPath1 = "sendRequest('/mondai/Monsyo_ToppageServlet')"; %> <br> <input type="button" value="入力" onClick="<%= returnPath0 %>"/> <input type="button" value="戻る" onClick="<%= returnPath1 %>"/> </div> </form> </body> </html> ---------------------------------------------

専門家に質問してみよう