• ベストアンサー

Servletでテキストボックスに入力された内容を追記したい。

Servletでテキストボックスとボタンを置きsubmitすると下にいくつも追記できるようにしたいです。そのときに ブラウザを複数起動しても独立して稼動できるようにしたいです。 自分の考えとしては、submitしたデータをArrayListに取り込んでhtmlに返そうと思って下記のブログラムを 書いてみましたがうまく作動しませんでした。 何か良い方法がありましたら教えてください。 import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletTest extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException, ServletException { ArrayList al = new ArrayList(); // ヘッダに出力形式をセット res.setContentType("text/html; charset = Shift_JIS"); // 出力ストリームを作成 PrintWriter pw = res.getWriter(); // テキストボックスからデータを受け取る String input = req.getParameter("param"); al.add(input); // テキストボックスが空の場合 if(input == null) { input = ""; } // HTML文を出力 pw.println("<html><head>"); pw.println("<title>SrvletTest</title>"); pw.println("</head>"); pw.println("<body>"); pw.println("<form>"); pw.println("<input type = 'text' name = 'param' maxlength = 20>"); pw.println("<input type = 'submit'><br>"); for(int i = 0; i < al.size(); i++) { pw.println(al.get(i)); } pw.println("</form>"); pw.println("</body></html>"); pw.close(); } }

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

  • ベストアンサー
  • TAKATON
  • ベストアンサー率62% (17/27)
回答No.5

こんな感じです。 ちなみに、動作確認はしていませんので。 import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletTest extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse res) throws IOException, ServletException { // ヘッダに出力形式をセット res.setContentType("text/html; charset = Shift_JIS"); // 出力ストリームを作成 PrintWriter pw = res.getWriter(); // セッションからすでに表示されたデータを取得 HttpSession session = req.getSession(); ArrayList al = (ArrayList)session.getAttribute("oldData"); if( al == null ) { al = new ArrayList(); session.setAttribute("oldData", al); } // テキストボックスからデータを受け取る String input = req.getParameter("param"); // テキストボックスが空の場合 if(input == null) { input = ""; } al.add(input); // HTML文を出力 pw.println("<html><head>"); pw.println("<title>SrvletTest</title>"); pw.println("</head>"); pw.println("<body>"); pw.println( "<form method=\"POST\" action=\"ServletTest\">" ); pw.println("<input type = 'text' name = 'param' maxlength = 20>"); pw.println("<input type = 'submit'><br>"); for(int i = 0; i < al.size(); i++) { pw.println(al.get(i)); } pw.println("</form>"); pw.println("</body></html>"); pw.close(); } }

noname#262515
質問者

お礼

ありがとうございます。 出来ました! >ArrayList al = (ArrayList)session.getAttribute("oldData"); インスタンス化するときに引数にArrayListを取ってHttpSessionのgetAttributeメソッドに String型のoldDataを返すという考えでよいでしょうか? >if( al == null ) { al = new ArrayList(); session.setAttribute("oldData", al); } もしalがnullだった場合alをインスタンス化してHttpSessionのsetAttributeメソッドに String型のoldDataと一緒にalに返すという考えで よいでしょうか? あと、実行した結果テキストボックスに文字を入力しsubmitすると必ずnullと 入力した文字が出てきます。 これはalにnullが入っているからでしょうか? すいませんが回答お願いします。

その他の回答 (5)

  • TAKATON
  • ベストアンサー率62% (17/27)
回答No.6

>インスタンス化するときに引数にArrayListを取って>HttpSessionのgetAttributeメソッドに >String型のoldDataを返すという考えでよいでしょうか? セッションオブジェクトに"oldData"という名前で、 表示済みデータを格納したArrayListを登録してあるので、 それを取り出していると理解してください。 >もしalがnullだった場合alをインスタンス化して>HttpSessionのsetAttributeメソッドに >String型のoldDataと一緒にalに返すという考えで >よいでしょうか? "返す"ではなく、"設定する"と理解してください。 >あと、実行した結果テキストボックスに文字を入力し>submitすると必ずnullと >入力した文字が出てきます。 >これはalにnullが入っているからでしょうか? そうです。 下記の処理をサボると、画面に表示されるデータ に"null"が表示されてしまいます。 // テキストボックスが空の場合 if(input == null) { input = ""; } PS:ANo.5で提示したソースの一部間違いがありました。 失礼しました。 FORMタグの出力個所 誤 method=\"POST\" 正 method=\"GET\"

noname#262515
質問者

お礼

テキストボックスが空の時に空白が入力されてしまうので 「空です。」というアラートボックスが出るようにJavaScriptを使って可能にしてみました。 String jscript = "<script type = 'text/javascript'>"; jscript += "function checkNull(obj)"; jscript += "{"; jscript += " if(obj.value == '')"; jscript += " {"; jscript += " alert('空です。');"; jscript += " obj.focus();"; jscript += " return false;"; jscript += " }"; jscript += " return true;"; jscript += "}"; jscript += "function check(form)"; jscript += "{"; jscript += " if(!checkNull(form.param))"; jscript += " return false;"; jscript += " return true;"; jscript += "}"; jscript += "</script>"; ありがとうございました。

  • TAKATON
  • ベストアンサー率62% (17/27)
回答No.4

>もしよければ、新たなデータと一緒に既に画面に >表示されているデータも一緒にServletに送る方法(ヒン >ト)を教えてください。 >お願いします。 hiddenパラメータを使用すればできます。 または、新たなデータと一緒に既に画面に表示されている データも一緒にServletに送る方法ではなく、 ArrayListをセッションに格納して、画面から 新たに追加されたデータが送信された場合に、 セッション格納しておいたArrayListに追加してから、 以下の出力処理を呼ぶのもでもOKです。 >for(int i = 0; i < al.size(); i++) >{ >pw.println(al.get(i)); >}

noname#262515
質問者

補足

hiddenパラメータを使用した方は#3の方が書かれた通り 出来ました。が、もう一つの方法も試してみたいと 思いますのでお付き合い願いますでしょうか?

  • tubumame
  • ベストアンサー率63% (7/11)
回答No.3

こんにちは。 これでどうですか? import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletTest extends HttpServlet{ public void doPost( HttpServletRequest req, HttpServletResponse res ) throws IOException , ServletException{ //ヘッダに出力形式をセット res.setContentType( "text/html; charset = Shift_JIS" ); // 出力ストリームを作成 PrintWriter pw = res.getWriter(); //テキストボックスからデータを受け取る String input = req.getParameter( "param" ); //今までの入力分を取得 String oldData = req.getParameter( "oldData" ); if( null == oldData ) oldData = ""; // HTML文を出力 pw.println( "<html><head>" ); pw.println( "<title>SrvletTest</title>" ); pw.println( "</head>" ); pw.println( "<body>" ); pw.println( "<form method=\"POST\" action=\"ServletTest\">" ); pw.println( "<input type=\"text\" name=\"param\" maxlength=\"20\">" ); pw.println( "<input type=\"submit\"><br>" ); //今までの入力データと今現在入力した //データを出力 pw.println( oldData + input ); //今までの入力データと今現在入力した //データをhiddenで保持 pw.println( "<input type=\"hidden\" name=\"oldData\" value=\"" + input + oldData + "\">" ); pw.println( "</form>" ); pw.println( "</body></html>" ); pw.close(); } }

  • TAKATON
  • ベストアンサー率62% (17/27)
回答No.2

送信パラメタ(param)には、テキストボックス内に 新たに入力されたデータしか積んでいない訳ですよね。 したがって、以下の処理でArrayListであるalに 追加されるのは新たに入力されたデータのみですよね。 >// テキストボックスからデータを受け取る >String input = req.getParameter("param"); > >al.add(input); なので、いくら以下の処理でArrayListの内容を for分で回して出力しても、常に新たに入力されたデータ しか表示されないのではないでしょうか。 >for(int i = 0; i < al.size(); i++) >{ >pw.println(al.get(i)); >} Submitボタンが押下された場合に、テキストボックスに 新たに入力されたデータといっしょに、既に画面に 表示されているデータもいっしょにServletへ送信する 必要があると思います。

noname#262515
質問者

補足

やはりそうでしたかぁ~。。。 コンパイルは通るし実行できるからちょっと不思議 だったんですよねぇ~。 もしよければ、新たなデータと一緒に既に画面に 表示されているデータも一緒にServletに送る方法(ヒント)を教えてください。 お願いします。

  • TAKATON
  • ベストアンサー率62% (17/27)
回答No.1

どううまく動作しないのか分かりませんが、 おそらく、下記のformタグにaction属性が定義されて いないため、ボタンを押下してもテキストボックスに 入力したデータがサーブレット(ServletTest)に 送信されないからではないでしょうか。 >pw.println("<form>");

noname#262515
質問者

補足

説明不足でスイマセン。。 >どううまく動作しないのか分かりません コンパイルしServletで実行できるのですが テキストボックスに文字を入力しsubmitしても 追記されません。 >おそらく、下記のformタグにaction属性が定義 formタグに method = 'get' action = 'http://localhost:8080/study/servlet/ServletTest' を追加してみましたがダメでした。

関連するQ&A

専門家に質問してみよう