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

はじめて投稿いたします。
現在、SERVLETでアンケートフォーム(HTML)の内容を
ブラウザに表示させ、その内容をテキストファイルに保存する。
ということをやっております。

以下のプログラムを書いたのですが、
アンケート内容がブラウザに表示、テキストファイルを指定した場所(C\直下)へ書き出すことも出来たのですが、その中身のアンケート内容が1項目しか書き出されません。

項目は全部で10個ほどあり、テキストボックスや、チェックボックスなどが混ざったものです。
初心者の質問で大変恐縮ですが、ここ4日ほど進んでません。。。
お分かりになる方、お願いいたします。
ECLIPSE3、Tomcat4を使用しています。

package Test;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class MaxTEST extends HttpServlet {

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

request.setCharacterEncoding("UTF-8");
response.setContentType("text/plain; charset=UTF-8");

//出力設定
PrintWriter out = response.getWriter();

//繰り返しパラメを返す設定 Enumerationで名前の一覧を取得
Enumeration names = request.getParameterNames();
while(names.hasMoreElements()) {
String name = (String) names.nextElement();
String[] values = (String[]) request.getParameterValues(name);
for (int i = 0; i < values.length; i++) {
//ファイルへの書き出し
PrintWriter File = new PrintWriter(newFileOutputStream("c:/a.txt"));
File.println(name + "=" + values[i]);
//ブラウザへの書き出し
out.println(name + "=" + values[i]);
//ファイル書き出し終わり
File.close();
}
}
}
}

A 回答 (2件)

作り的には、動くコードを載せておきますので参考に。


多少コメント追加していますので、これでわかるとは思いますが、不明点あれば補足を。
あと、クラス名→先頭大文字、変数名→先頭小文字のルールはJavaの一般的な規約ですので守った方が良いです。

package test;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class MaxTest extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

// リクエスト発行画面はUTF-8
request.setCharacterEncoding("UTF-8");

// レスポンスキャラクタセットはUTF-8
response.setContentType("text/plain; charset=UTF-8");

// 出力設定
PrintWriter out = null;

// ファイルへの出力設定
PrintWriter writer = null;

try {

// 出力ストリームを取得
out = response.getWriter();
writer = new PrintWriter(new FileOutputStream("c:/a.txt"));

// 繰り返しパラメを返す設定 Enumerationで名前の一覧を取得
Enumeration names = request.getParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
String[] values = (String[]) request.getParameterValues(name);
for (int i = 0; i < values.length; i++) {

// ファイルへの書き出し
writer.println(name + "=" + values[i]);
// ブラウザへの書き出し
out.println(name + "=" + values[i]);
}
}

} finally {
// 終了処理として、必ず出力ストリームのフラッシュ→クローズを行う
if (out != null) {
try { out.flush(); } catch (Exception e) {}
try { out.close(); } catch (Exception e) {}
}
if (writer != null) {
try { writer.flush(); } catch (Exception e) {}
try { writer.close(); } catch (Exception e) {}
}
}
}
}
    • good
    • 0

>PrintWriter File = new PrintWriter(newFileOutputStream("c:/a.txt"));



ループ内で、毎回ファイル出力用のインスタンスを作っていますが、
FileOutputStreamのデフォルトって追記モードではないのでは?
↓のコンストラクタでappendをtrueにしておけば追記モードになったと思います。
FileOutputStream(File file, boolean append)

そもそも、ループ内で毎回インスタンス化するのは効率が悪いので
ループの外でPrintWriterを作って
ループを抜けたら、fluse()してclose()すべきです。
    • good
    • 0
この回答へのお礼

書き込みありがとうございます。
理解度が低いため(すいません。。)質問させていただきたいのですが、
>PrintWriter File = new PrintWriter(newFileOutputStream("c:/a.txt"));
をループの外に作って、FileOutputStream(File file, boolean append)を
ループ内で作成すればよいということでしょうか??
File fileがエクリプスでエラーが出るのですが、何か記載を変えるのですか?
お付き合いいただけると幸いです。

お礼日時:2007/05/22 10:49

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