初めて投稿いたします。
発生している問題の概要
現在JavaとMySQLを用いた簡素なWebアプリケーションを作成しています。
【Webアプリの要件】
クライアントがJSPページの入力フォームから新規登録情報を入力し、サーブレットに送信します。
サーブレットでは受け取った値がDBに登録可能かエラーチェックを行い、OKだったら登録をしてNGだったらエラーメッセージをJSPに返します。
このサーブレットからJSPに値を受け渡す際の処理が、参考書やサンプルコードで異なっていて悩んでいます。
私が確認したのは下記のソースコード3点です。
該当のソースコード
該当箇所以外の処理は省略。
なお、変数requestはすべて(HttpServletRequest request)とします。
sample1
Java
1// sample1.java 2ServletContext con = this.getServletContext(); 3con.setAttribute("error_msg", error_msg); 4RequestDispatcher dis = con.getRequestDispatcher("/sample1.jsp"); 5dis.forward(request, response); 6 7// sample1.jsp 8ServletContext con = this.getServletContext(); 9String error_msg = (String) con.getAttribute("error_msg");
sample2
Java
1// sample2.java 2ServletContext con = this.getServletContext(); 3request.setAttribute("error_msg", error_msg); 4RequestDispatcher dis = con.getRequestDispatcher("/sample2.jsp"); 5dis.forward(request, response); 6 7// sample2.jsp 8String error_msg = (String) request.getAttribute("error_msg");
sample3
Java
1// sample3.java 2request.setAttribute("error_msg", error_msg); 3RequestDispatcher dis = request.getRequestDispatcher("/sample3.jsp"); 4dis.forward(request, response); 5 6// sample3.jsp 7String error_msg = (String) request.getAttribute("error_msg");
確認したこと
・setAttributeで値を保存する際に、
sample1は「ServletContext」のインスタンスを使用し、
sample2とsample3は「request」を使用しています。
・RequestDispatcherを生成する際に、
sample1とsample2は「ServletContext」を使用し、
sample3はrequestが継承している「ServlerRequest」を使用しています。
・ネットに落ちているサンプルコードだとsample2が多かったです。
上記を踏まえての疑問
・ServletContextはWebアプリ全体で共有されているので、今回の「エラーをクライアントごとに返す」という要件にsample1は不適ということはなんとなくわかります(ページをリロードしてもインスタンスが残っているためエラーメッセージも残ってしまう)。
しかし、sample2でRequestDispatcherをrequestからではなくわざわざServletContextから生成しているのがよくわかりません。
シングルインスタンスによる処理効率化?が関係しているのか、そもそもServlerRequestの使い方として間違っているのか。。
どれを、なぜ、使うべきかご教授よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
JDK8u202
eclipse4.4Luna
DBは省略
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。