QA@IT

Java:入力用jspページにて入力された値を、サーブレットでログファイルに出力したいです。

4127 PV

初の質問をさせていただきます、よろしくお願いします。

ただいまjspとサーブレットの自主学習をしているのですが、その際タイトルの点で引っかかってしまいました。
より具体的に箇条書きいたしますと、

  • 前段階として、入力jsp(入力内容は名前や性別など)、その値の取得やセットのサーブレット、出力とエラーの各jspを製作し、それらは問題なく動作した。
  • そこで、入力jspに入力された名前をログファイル出力する課題を開始。
  • そのため、インターネットで調べてサーブレットに以下のコードを追記したところ、「サーブレットクラスを初期化中にエラーが発生しました」となり、実行が不可能になる。 といった状況です。

恥ずかしながら半分よくわからないまま追記(コピペ)したので、基礎的な部分からご説明いただけるとありがたいです。
よろしくお願いいたします。

//ロガー
        //ログプロパティのセッティング
        String logsetting
        = "handlers=java.util.logging.ConsoleHandler\n"
        + ".level=INFO\n"
        + "java.util.logging.ConsoleHandler.level=INFO\n"
        + "java.util.logging.ConsoleHandler.formatter"
        + "=java.util.logging.SimpleFormatter";
        //上記設定を適用
        static {
                final Logger l = Logger.getLogger("exam");
                InputStream in = null;
                try {
                     LogManager.getLogManager().readConfiguration(in);
                     l.info("ログプロパティをセッティング");
                } catch (SecurityException | IOException e) {
                    l.info("ログプロパティセットで不具合");
                }
        }
        //思い通りになったロガーを使う
        public void log (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            final Logger l0 = Logger.getLogger("exam");
            String hn0 = request.getParameter("jspname");
            l0.info(hn0);


jspnameは、入力jsp画面で入力された値です。

  • 「サーブレットクラスを初期化中にエラーが発生しました」とともにクラス名の羅列の様なものも表示されていませんか?出ていればそれも掲載してください。
    ちなみに参考にしたのは http://www.atmarkit.co.jp/ait/articles/0801/08/news128_3.html ですか?
    -
  • すみません、今回は解決しました。ですが、いただいたように詳細なエラー文の掲載は次回以降に役立ちますので、参考にさせていただきます。参考URLは提示してくださったもので間違いないです。ありがとうございます。 -

回答

こちらページSampleLogging3.java では、

LOGGING_PROPERTIES_DATAにpropertiesファイルの内容を直接記載して、InputStream を介して Loggerに設定情報を読み込ませています。

    static {
        final Logger logger = Logger.getLogger("SampleLogging");
        InputStream inStream = null;
        try {
            inStream = new ByteArrayInputStream(              // この2行
                LOGGING_PROPERTIES_DATA.getBytes("UTF-8"));
            try {
                LogManager.getLogManager().readConfiguration(
                    inStream);

提示のソースでは InputStreamが生成されないまま 渡されています。

        //ロガー
        //ログプロパティのセッティング
        String logsetting
        = "handlers=java.util.logging.ConsoleHandler\n"
        /*省略*/

        static {
                final Logger l = Logger.getLogger("exam");
                InputStream in = null;                                 
                try {
                     // ここで何もしてない
                     LogManager.getLogManager().readConfiguration(in); 
                     l.info("ログプロパティをセッティング");

そのためエラーが発生しています。
tryがネストしてるので見間違えたんでしょうね。自分でタイプしたからでしょうか。

おそらくエラーは NullPointerExceptionだと思います。
エラーメッセージとともに追加情報(StackTrace)があれば、
NullPointerException at java.util.logging.LogManager.readConfiguration の様な行があるかもしれません。


本題からはずれて個人的に思っている事ですが、サンプルから真似して付け足したあとで(具体的には理解できないまでも)なんとなくコードが何をしてるか眺めてみるといいと思いますよ(「あぁ、ここでnewしてるな」とか「ここでさっきnewしたの渡してるな」とか)。
私の経験だと、ただ真似してタイプしているだけだと結局記憶にも残らなかったりします(打ち込んだ達成感で終わってしまったり)。いろいろとみているうちにパターンが見えてきて、見るべき部分がわかってきたりすることも。
個人差があると思いますのであくまで私の場合の話ですが。

今回で言えば、「nullのまま使っているな」と気付ければしめたものです。

編集 履歴 (0)
  • 返信が遅れすみません。
    ご指摘の点を理解しながら作り直したところ、解決いたしました。
    ありがとうございます。

    アドバイスの件ですが、その通りだと感じます。
    意味が一つもわからないのに動くから、で押し進めるのは今後を考えたうえでも危険な行為ですね。
    次回以降は、質問するにも熟考してから掲載しようと思います。
    将来を見据えた助言までいただき、ありがとうございました。
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。