- 締切済み
【初心者】フォーム内容のファイル保存
はじめて投稿いたします。 現在、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(); } } } }
- みんなの回答 (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) {} } } } }
>PrintWriter File = new PrintWriter(newFileOutputStream("c:/a.txt")); ループ内で、毎回ファイル出力用のインスタンスを作っていますが、 FileOutputStreamのデフォルトって追記モードではないのでは? ↓のコンストラクタでappendをtrueにしておけば追記モードになったと思います。 FileOutputStream(File file, boolean append) そもそも、ループ内で毎回インスタンス化するのは効率が悪いので ループの外でPrintWriterを作って ループを抜けたら、fluse()してclose()すべきです。
お礼
書き込みありがとうございます。 理解度が低いため(すいません。。)質問させていただきたいのですが、 >PrintWriter File = new PrintWriter(newFileOutputStream("c:/a.txt")); をループの外に作って、FileOutputStream(File file, boolean append)を ループ内で作成すればよいということでしょうか?? File fileがエクリプスでエラーが出るのですが、何か記載を変えるのですか? お付き合いいただけると幸いです。