forwardの前に出力すると例外が発生しないのはなぜ?

このQ&Aのポイント
  • forwardの前に出力すると例外が発生しないのはなぜでしょうか?
  • forwardの前に出力すると例外が発生しない理由を教えてください。
  • forwardの前に出力しても例外が発生しない理由を教えてください。
回答を見る
  • ベストアンサー

forwardの前に

http://www.techscore.com/tech/J2EE/Servlet/5-3.html のサイトに 「forwardの前に出力すると例外が発生する」 とあるんですが、試しにやってみたんですが、 例外は発生しませんでした。 なぜでしょうか? resp.setContentType("text/html; charset=EUC-JP"); PrintWriter pw = resp.getWriter(); pw.println("<form method=\"'get'\">"); pw.println("<input type=\"submit\" value=\"ボタン\">"); pw.println("</form>"); RequestDispatcher rd = req.getRequestDispatcher("/other/"); rd.forward(req,resp); こんなソースなんですけど。。

  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

J2EE(1.4)のAPIリファレンスを見ると、 forward should be called before the response has been committed to the client (before response body output has been flushed). If the response already has been committed, this method throws an IllegalStateException. Uncommitted output in the response buffer is automatically cleared before the forward. と書いてあります。 質問者さんの例では、forwardした時点ではそれまでの出力(pw.printlnしたもの)がバッファにたまっている状態なので例外が発生してないだけです。 もっと多く出力して(バッファ内のデータがクライアントに送出されて)からforwardすると例外が発生するはずです。

ratsbane
質問者

お礼

ありがとうございます。 なるほどって感じです。 サイトの内容だと例外は出ないわけですね。 調べがたりませんでした。

関連するQ&A

  • ファイルダウンロード後のフォワードについて

    サーブレット内で、ファイルのダウンロードをした後に処理をJSPへフォワードしたいのですが、現在、ダウンロードしたあとフォワードしてもJSPが機能しなくて困りました。 コードとしては以下の通りです(一部抜粋ですみません) /* ファイルダウンロードの設定 */ response.setContentType("application/octet-stream; charset=Shift-JIS"); response.setHeader("Content-disposition","attachement; filename= "+sgy_y+sgy_m+"_"+simekbn+".csv"); PrintWriter pw = response.getWriter(); /* CSVファイル出力 */ pw.println("あああ,いいい,ううう,えええ,おおお"); pw.println("かかか,ききき,くくく,けけけ,こここ"); pw.println("さささ,ししし,すすす,せせせ,そそそ"); pw.close(); /* JSPへフォワード */ getServletConfig().getServletContext().getRequestDispatcher("/xxx.jsp").forward(request,response); 何か良いアドバイスがありましたら、宜しくお願いします。

    • ベストアンサー
    • Java
  • ServletからJSP

    はじめまして。 お世話になります。 以下のようにサーブレットから条件によってJSPファイルを 使い分けようと思っているのですが、うまく出来ません。   protected void processRequest(HttpServletRequest request, HttpServletResponse response)   throws ServletException, java.io.IOException   {     PrintWriter out = response.getWriter();     out.println("<html>");     out.println("<head>");     out.println("<title>タイトル</title>");     out.println("</head>");     out.println("<body>");     RequestDispatcher rd = null;     if(/* 条件1 */)     {       rd = request.getRequestDispatcher("hoge1.jsp");     }     else if(/* 条件2 */)     {       rd = request.getRequestDispatcher("hoge2.jsp");     }     else     {       rd = request.getRequestDispatcher("hoge3.jsp");     }     out.println("</body>");     out.println("</html>");     if(rd != null)     {       rd.include(request,response);     }   } このようにすると <html> ・ ・ サーブレットから出力した部分 ・ </html> <****> JSPで出力した部分 </****> とサーブレットの部分だけ先に出力されてしまいます。 JSPファイルの前後に出力させるにはどのようにすればよいのでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • Java
  • getRequestDispatcher

    includeメソッドで処理を転送するプログラムを学習しようと思い、 exDispatcherServlet.javaとexDispatcherServlet2.javaの2つのファイルを作りました。 web-inf\classes配下に2つのクラスファイルを入れました。web.xmlファイルのservlet-classはexDispatcherServletを指定しました。 exDispatcherServlet.javaでは、 req.setAttribute("name", "java"); ServletContext sc = getServletContext( ); RequestDispatcher rd = sc.getRequestDispatcher("/exDispatcherServlet2"); rd.include(req, res); のようにexDispatcherServlet2.classファイルに送り、 exDispatcherServlet2.javaで PrintWriter out = res.getWriter( ); out.println("name : "); のようにしたのですが、exDispatcherServlet2の方のプログラムが反応なしです。 getRequestDispatcher WEB-INF¥classesで指定するURLはコンテキストルートからの絶対パスとのことだったので、WEB-INFと同じ場所にexDispatcherServlet2.classをおいてみたのですが、だめでした。 どのようにすればうまくいくでしょうか? 参考URLはこちらです。 http://www.javaroad.jp/servletjsp/sj_servlet7.htm よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Servletでテキストボックスに入力された内容を追記したい。

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

    • ベストアンサー
    • Java
  • servlet

    servletで request.getParameter("id"); で、パラメータを取得できますが、 反対にset.Parameter("id","123")のようなメソッドもあるんですか? RequestDispatcher rDispatcher = req.getRequestDispatcher("showQ"); rDispatcher.forward(req, res); を実行して、showQ の中でgetParameterしたいんです。 どうしたらいいんですか?

  • RequestDispatcherオブジェクトについて。

    データベース表示を行うサーブレットを呼び出す処理を行うには、RequestDispatcherオブジェクトを取得して、そのforwardメソッドを呼び出すだけと聞きましたが、うまくいきません。どなたかどこが悪いか教えてください。 // データベース表示するために、RequestDispatcherを取得 ServletContext cx = getServletContext(); RequestDispatcher rd = cx.getRequestDispatcher( "/netjv/servlet/shuwa.ext_db5_2_1"); // サーブレットを呼び出す rd.forward(request, response); } catch (Exception e) { e.printStackTrace(); } } 後、URL部分にはどこからのパスを書けばよいのでしょうか?あってるか不安です。

    • ベストアンサー
    • Java
  • index.htmlの代わりにサーブレットを実行

    localhost:8080でindex.htmlを表示する代わりにServlet.classを実行したいのですがtomcat5の設定を教えてください。ちなみにlocalhost:8080/servletで実行するところまでは、本に載ってたので分かってます。 public class Servlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println("<HTML>"); out.println("<BODY>"); out.println(new java.util.Date()); out.println("</BODY>"); out.println("</HTML>"); } }

    • ベストアンサー
    • Java
  • 例外が発生した時にブラウザにメッセージを表示

    Servletで、db検索しその結果をブラウザに表示しています。 SQLExceptionや、NULLPointerExceptionが発生した時に、 今は、 catch(Exception e){ e.printStackTrace(); } としているのでログにエラーを書き出しているだけで、画面にはなにも表示されません。 エラーの時も、PrintWriter pw = response.getWriter();で pw.println("<HTML><HEAD></HEAD>"); pw.println("<body><h1>"); pw.println("エラー発生!"); pw.println("</h1></body></html>"); というふうにブラウザに出力したいのです。 catchブロックの中にはどのように、記述したらいいのでしょうか? ひとつのクラス内で以上の事がしたいのですが、そもそもそれも 無理なのでしょうか?

  • 画面遷移時のデータ遷移について

    文字数制限があったので短くして投稿させていただきます。 入力画面で入力した値を次の確認画面で表示したいと思っているんですがどのようにしたらよいでしょうか? web.xmlでは定義してあります。 入力前のJSPは作成しました。 入力後のJSPをどのようにしたらいいでしょうか? また入力画面のJSPは変更する必要があるでしょうか? --------------------------------------------- package monndai; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Monsyo_NewFileDate extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { RequestDispatcher reqDis = null; try { System.out.println(); //表示JSP決定 reqDis = req.getRequestDispatcher("/jsp/Monsyo_newFileDate.jsp"); //forward reqDis.forward(req,res); } catch (Exception e) { System.out.println("err"); e.printStackTrace(); req.setAttribute("exception", e); reqDis = req.getRequestDispatcher("/jsp/error.jsp"); reqDis.forward(req, res); } } } --------------------------------------------- package monndai; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class Monsyo_NewFileInputData extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { RequestDispatcher reqDis = null; try { System.out.println(); //表示JSP決定 reqDis = req.getRequestDispatcher("/jsp/Monsyo_newFileInputData.jsp"); //forward reqDis.forward(req,res); } catch (Exception e) { System.out.println("err"); e.printStackTrace(); req.setAttribute("exception", e); reqDis = req.getRequestDispatcher("/jsp/error.jsp"); reqDis.forward(req, res); } } } --------------------------------------------- <%@page language="java" %> <%@page contentType="text/html;charset=EUC-JP"%> <% String returnPath0 = null; String returnPath1 = null; %> <html> <head> <script language="JavaScript"> <!--//  function checkLength(obj, maxlen) {   if(obj.value.length > maxlen) {    obj.disabled = true;    obj.value = obj.value.substring(0,maxlen);   }   obj.disabled = false;   obj.focus(); // BackSpace防止  } function sendRequest(path) { document.fr.action = path; document.fr.submit(); } --> </script> </head> <title>新問処発行</title> <body> <form name="fr" onSubmit="true" method="POST" > <div align="left"> <h3> 新問処発行</h3> <br> <日付> (XXXX/XX/XX)<br> <input type="text" align="left" maxlength="10" name=" " size="15" > <br> <タイトル>(100文字以内)<br> <textarea rows="5" cols="60" name="title" onkeyup="checkLength(this, 100);" style="ime-mode:active"></TEXTAREA> <br> <% returnPath0 = "sendRequest('/mondai/Monsyo_NewFileInputDataServlet')"; returnPath1 = "sendRequest('/mondai/Monsyo_ToppageServlet')"; %> <br> <input type="button" value="入力" onClick="<%= returnPath0 %>"/> <input type="button" value="戻る" onClick="<%= returnPath1 %>"/> </div> </form> </body> </html> ---------------------------------------------

  • RequestDispatcher.forwardメソッドで遷移する際のURL

    お世話になります。 JSP/サーブレットを使用してwebアプリケーションを作成しています。 タイトルの通りRequestDispatcher.forwardメソッドで遷移する際のURL についてうまくいかず、原因がわからない為質問させて頂きます。 ご教授宜しくお願い致します。 Aproject/jsp/login.jsp Aproject/jsp/top.jsp Aproject/WEB-INF/src/servlet/Login.java という3つのファイルを使用しています。 login.jspにて<form action="../Login" method="post">で Login.javaサーブレットにIDとパスワードを渡し、 サーブレットで認証を行ったあと RequestDispatcher.forwardメソッドにて以下のように 遷移するようになっています。 RequestDispatcher rd = request.getRequestDispatcher("./jsp/top.jsp"); rd.forward(request, response); 遷移はうまくいくのですが、top.jspが表示される時のURLが http://localhost:8080/Aproject/jsp/top.jspとなるはずが、 http://localhost:8080/Aproject/Login となってしまいます。 web.xmlの記述は <servlet> <servlet-name>Login</servlet-name> <servlet-class>servlet.Login</servlet-class> </servlet> <servlet-mapping> <servlet-name>Login</servlet-name> <url-pattern>/Login</url-pattern> </servlet-mapping> としています。 forwardメソッドではなく、sendRedirectメソッドを使用した場合 http://localhost:8080/Aproject/jsp/top.jsp とうまくいきます。 どのような原因が考えられますでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • Java

専門家に質問してみよう