Java Servlet エラー ~フォワードできません

フォワードできません

以下のようなエラーが出ました。

java.lang.IllegalStateException: レスポンスをコミットした後でフォワードできません

未入力の場合、リクエストスコープにエラーメッセージをリクエストスコープに保存して画面をフォワードしたときに上記のエラーが出ました。

具体的なコードは以下のようなものです。

/** POSTリクエスト */
/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request
        , HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    String text = request.getParameter("text");

    // 入力チェック
    if (text == null || "".equals(text)) {
        System.out.println("*** in Error ***");
        // エラーメッセージをリクエストスコープに設定
        request.setAttribute("errorMsg", "つぶやきが入力されていません");
        // フォワード
        forwardMain(request, response);
    }
    ServletContext application = this.getServletContext();
    // アプリケーションスコープ
    List<Mutter> mutterList =
            (List<Mutter>)application.getAttribute("mutterList");
    // セッションスコープ
    HttpSession sess = request.getSession();
    // ユーザークラス
    User user = (User) sess.getAttribute("loginUser");
    // つぶやきリストに追加
    Mutter mutter = new Mutter(user.getName(), text);
    new PostMutterLogic().execute(mutter, mutterList);
    // アプリケーションスコープに保存
    application.setAttribute("mutterList", mutterList);
    // フォワード
    forwardMain(request, response);
}

private void forwardMain(HttpServletRequest request
        , HttpServletResponse response) throws ServletException, IOException{
    // フォワード
    RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/main.jsp");
    dispatcher.forward(request, response);
}

エラーの原因を探る

元々エラー処理、パラメータの入力チェックを行っていなかったところにエラー処理if (text == null || "".equals(text)) {を入れ、フォワードするように実装しました。
原因部分はここになるのですが、調べてみると。下の処理を2回行っているところがありました。

    // フォワード
    RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/main.jsp");
    dispatcher.forward(request, response);

まとめ

2回フォワードしているのでエラーになったということでした。。。

でわでわ。。。

投稿者:

takunoji

音響、イベント会場設営業界からIT業界へ転身。現在はJava屋としてサラリーマンをやっている。自称ガテン系プログラマー(笑) Javaプログラミングを布教したい、ラスパイとJavaの相性が良いことに気が付く。 Spring framework, Struts, Seaser, Hibernate, Playframework, JavaEE6, JavaEE7などの現場経験あり。 SQL, VBA, PL/SQL, コマンドプロント, Shellなどもやります。

コメントを残す