プロが教える店舗&オフィスのセキュリティ対策術

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();
}
}

A 回答 (6件)

こんな感じです。


ちなみに、動作確認はしていませんので。

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();
}
}
    • good
    • 0
この回答へのお礼

ありがとうございます。

出来ました!

>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が入っているからでしょうか?

すいませんが回答お願いします。

お礼日時:2005/02/25 10:34

>インスタンス化するときに引数に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\"
    • good
    • 0
この回答へのお礼

テキストボックスが空の時に空白が入力されてしまうので
「空です。」というアラートボックスが出るように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>";

ありがとうございました。

お礼日時:2005/02/28 16:43

>もしよければ、新たなデータと一緒に既に画面に


>表示されているデータも一緒にServletに送る方法(ヒン
>ト)を教えてください。
>お願いします。

hiddenパラメータを使用すればできます。

または、新たなデータと一緒に既に画面に表示されている
データも一緒にServletに送る方法ではなく、
ArrayListをセッションに格納して、画面から
新たに追加されたデータが送信された場合に、
セッション格納しておいたArrayListに追加してから、
以下の出力処理を呼ぶのもでもOKです。

>for(int i = 0; i < al.size(); i++)
>{
>pw.println(al.get(i));
>}

この回答への補足

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

補足日時:2005/02/24 18:28
    • good
    • 0

こんにちは。



これでどうですか?


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();

}

}
    • good
    • 0

送信パラメタ(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に送る方法(ヒント)を教えてください。
お願いします。

補足日時:2005/02/24 17:10
    • good
    • 0

どううまく動作しないのか分かりませんが、


おそらく、下記のformタグにaction属性が定義されて
いないため、ボタンを押下してもテキストボックスに
入力したデータがサーブレット(ServletTest)に
送信されないからではないでしょうか。

>pw.println("<form>");

この回答への補足

説明不足でスイマセン。。

>どううまく動作しないのか分かりません
コンパイルしServletで実行できるのですが
テキストボックスに文字を入力しsubmitしても
追記されません。

>おそらく、下記のformタグにaction属性が定義
formタグに
method = 'get'
action = 'http://localhost:8080/study/servlet/ServletTest'
を追加してみましたがダメでした。

補足日時:2005/02/24 16:27
    • good
    • 0

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