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();
}
}
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();
}
}
ありがとうございます。
出来ました!
>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が入っているからでしょうか?
すいませんが回答お願いします。
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\"
テキストボックスが空の時に空白が入力されてしまうので
「空です。」というアラートボックスが出るように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>";
ありがとうございました。
No.4
- 回答日時:
>もしよければ、新たなデータと一緒に既に画面に
>表示されているデータも一緒にServletに送る方法(ヒン
>ト)を教えてください。
>お願いします。
hiddenパラメータを使用すればできます。
または、新たなデータと一緒に既に画面に表示されている
データも一緒にServletに送る方法ではなく、
ArrayListをセッションに格納して、画面から
新たに追加されたデータが送信された場合に、
セッション格納しておいたArrayListに追加してから、
以下の出力処理を呼ぶのもでもOKです。
>for(int i = 0; i < al.size(); i++)
>{
>pw.println(al.get(i));
>}
この回答への補足
hiddenパラメータを使用した方は#3の方が書かれた通り
出来ました。が、もう一つの方法も試してみたいと
思いますのでお付き合い願いますでしょうか?
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();
}
}
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へ送信する
必要があると思います。
この回答への補足
やはりそうでしたかぁ~。。。
コンパイルは通るし実行できるからちょっと不思議
だったんですよねぇ~。
もしよければ、新たなデータと一緒に既に画面に
表示されているデータも一緒にServletに送る方法(ヒント)を教えてください。
お願いします。
No.1
- 回答日時:
どううまく動作しないのか分かりませんが、
おそらく、下記のformタグにaction属性が定義されて
いないため、ボタンを押下してもテキストボックスに
入力したデータがサーブレット(ServletTest)に
送信されないからではないでしょうか。
>pw.println("<form>");
この回答への補足
説明不足でスイマセン。。
>どううまく動作しないのか分かりません
コンパイルしServletで実行できるのですが
テキストボックスに文字を入力しsubmitしても
追記されません。
>おそらく、下記のformタグにaction属性が定義
formタグに
method = 'get'
action = 'http://localhost:8080/study/servlet/ServletTest'
を追加してみましたがダメでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- PHP php ログイン 1 2022/11/01 00:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
csv出力について
-
yyyymmddからyyyy/mm/d...
-
javaのfor文が機能してないみた...
-
JavaでString型をChar型に変換...
-
InputStream.read()でタイムア...
-
javaのファイル読み込み時の文...
-
九九を横に表示する。
-
Javaの質問です。テキストファ...
-
テキストファイルから空白行をよむ
-
equalsの逆
-
テキストファイルの読み書き
-
[JAVA]エラーが解決できません。
-
Javaの質問です。テキストファ...
-
Java int sum = 0は必要ですか?
-
java シンボルが見つかりません
-
テキストファイルの任意の文字...
-
Class.forNameでエラーになる
-
System.out.printlnの意味がよ...
-
C言語のポインターに関する警告
-
ループ処理の際、最後だけ","を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
csv出力について
-
equalsの逆
-
InputStream.read()でタイムア...
-
java連結
-
Javaでデータに登録する度にID...
-
ソケットを使ったサーバとクラ...
-
テキストファイルから空白行をよむ
-
JAVAでエラーがでる。
-
[JAVA]エラーが解決できません。
-
Java int sum = 0は必要ですか?
-
javaのfor文が機能してないみた...
-
Class.forNameでエラーになる
-
九九を横に表示する。
-
Inputstreamについて
-
Javaの質問です。テキストファ...
-
テキストファイルにおいて任意...
-
BufferedReaderでのエラー
-
Java FileDialog に関して
-
以下のJAVAプログラムでご質問...
おすすめ情報