質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

1回答

14495閲覧

レスポンスをコミットした後でフォワードできませんと出てきます

wtp

総合スコア2

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

0クリップ

投稿2020/11/17 13:29

前提・実現したいこと

最近javaの学習を始めた者です。
javaでログイン画面を作っているのですが、ユーザー情報の登録画面で間違った形式で入力された時に
ログイン画面にエラー通知を表示させたいのですが上手くいきません。
エラー通知なしで登録だけで試すと上手くいくのですが、エラー通知のコードを書くとエラーになってしまいます。
エラーの内容からフォワードの使い方に難があるのだと思いますが、
原因がわからないのでご教授いただけませんでしょうか。

発生している問題・エラーメッセージ

タイプ 例外報告 メッセージ レスポンスをコミットした後でフォワードできません 説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。 例外 java.lang.IllegalStateException: レスポンスをコミットした後でフォワードできません database.InsertCustomer.doPost(InsertCustomer.java:68) javax.servlet.http.HttpServlet.service(HttpServlet.java:652) javax.servlet.http.HttpServlet.service(HttpServlet.java:733) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) 注意 原因のすべてのスタックトレースは、サーバのログに記録されています

該当のソースコード

java

1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 4<!DOCTYPE html> 5<html> 6<head> 7<meta charset="UTF-8"> 8<title>Insert title here</title> 9<link rel="stylesheet" href="WEB-INF/style.css"> 10</head> 11<body> 12 13<form action="database/InsertCustomer" method = "POST"> 14${param['errors']} 15<table> 16<tr> 17<th align="right">名前:</th> 18<td><input type="text" name="name" size=35 maxlength="20"></td> 19</tr> 20<tr> 21<th align="right">emailアドレス:</th> 22<td><input type="text" name="email" size=35 maxlength="50"></td> 23</tr> 24<tr> 25<th align="right">パスワード:</th> 26<td><input type="password" name="password" size=35 minlength="8" maxlength="15"></td> 27</tr> 28<tr> 29<th align="right">パスワード(確認用):</th> 30<td><input type="password" name="validation" size=35 minlength="8" maxlength="15"></td> 31</tr> 32<tr> 33<th align="right">住所:</th> 34<td><input type="text" name="address" size=35 maxlength="20"></td> 35</tr> 36<tr> 37<th align="right">電話番号:</th> 38<td><input type="text" name="tel" size=35 maxlength="15"></td> 39</tr> 40<tr> 41<td colspan="2"><input type="submit" value="登録"></td> 42</table> 43</form> 44</body> 45</html>

java

1package database; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.SQLException; 6 7import javax.servlet.annotation.WebServlet; 8import javax.servlet.http.HttpServlet; 9 10/** 11 * Servlet implementation class BaseServlet 12 */ 13@WebServlet("/database/BaseServlet") 14public class BaseServlet extends HttpServlet { 15 16 public Connection getConnection() { 17 Connection con = null; 18 String url = "jdbc:mariadb://localhost:3306/customer"; 19 String user = "root"; 20 String pass = "root"; 21 try { 22 con = DriverManager.getConnection(url, user, pass); 23 } catch(SQLException e) { 24 e.printStackTrace(); 25 } catch(Exception e) { 26 e.printStackTrace(); 27 } 28 return con; 29 } 30 31}

java

1package database; 2 3import java.sql.Connection; 4import java.sql.PreparedStatement; 5import java.sql.ResultSet; 6import java.sql.SQLException; 7import java.util.ArrayList; 8 9public class ErrorCheck extends BaseServlet { 10 private ArrayList<String> errors = null; 11 12 public ErrorCheck(){ 13 this.errors = new ArrayList<String>(); 14 } 15 16 public void requiredCheck(String value, String name) { 17 if(value == null || value.trim().isEmpty()) { 18 this.errors.add(name + "は入力必須です"); 19 } 20 } 21 22 public void regExpCheck(String value, String pattern, String name) { 23 if(!value.matches(pattern)) { 24 this.errors.add(name + "を正しい形式で入力して下さい"); 25 } 26 } 27 28 public void passwordCheck(String value1, String value2) { 29 if(!value1.matches("[\w-\./]{8,15}")){ 30 this.errors.add("パスワードは半角英数字と記号(-./_)の組み合わせで入力して下さい"); 31 } else if(value1 != value2) { 32 this.errors.add("パスワードが一致しません"); 33 } 34 } 35 36 public void duplicateCheck(String value, String name) { 37 Connection con = null; 38 PreparedStatement stmt = null; 39 ResultSet rs = null; 40 try { 41 con = super.getConnection(); 42 stmt = con.prepareStatement("SELECT * FROM customer WHERE email = ?"); 43 stmt.setString(1, value); 44 rs = stmt.executeQuery(); 45 if(rs.next()) { this.errors.add(name + "が重複しています");} 46 } catch(SQLException e) { 47 e.printStackTrace(); 48 } catch(Exception e) { 49 e.printStackTrace(); 50 } finally { 51 try { 52 if(rs != null) { rs.close(); } 53 if(stmt != null) { stmt.close(); } 54 if(con != null) { con.close(); } 55 } catch(SQLException e) { 56 e.printStackTrace(); 57 } catch(Exception e) { 58 e.printStackTrace(); 59 } 60 } 61 } 62 63 public boolean hasErrors() { 64 return !this.errors.isEmpty(); 65 } 66 67 public String getErrorList() { 68 StringBuffer buff = new StringBuffer(); 69 buff.append("<ul style='color:red;'>"); 70 for(String err : errors) { 71 buff.append("<li>" + err + "</li>"); 72 } 73 buff.append("</ul>"); 74 return buff.toString(); 75 } 76 77} 78

java

1package database; 2 3import java.io.IOException; 4import java.sql.Connection; 5import java.sql.PreparedStatement; 6import java.sql.SQLException; 7 8import javax.servlet.RequestDispatcher; 9import javax.servlet.ServletException; 10import javax.servlet.annotation.WebServlet; 11import javax.servlet.http.HttpServlet; 12import javax.servlet.http.HttpServletRequest; 13import javax.servlet.http.HttpServletResponse; 14 15/** 16 * Servlet implementation class InsertCustomer 17 */ 18@WebServlet("/database/InsertCustomer") 19public class InsertCustomer extends BaseServlet { 20 /** 21 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 22 */ 23 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 24 // TODO Auto-generated method stub 25 request.setCharacterEncoding("UTF-8"); 26 String name = request.getParameter("name"); 27 String email = request.getParameter("email"); 28 String password = request.getParameter("password"); 29 String validation = request.getParameter("validation"); 30 String address = request.getParameter("address"); 31 String tel = request.getParameter("tel"); 32 String mailFormat = "[\w\.\-!#$\"\'%&()=^~¥|\[\]{}*+<>,?/]+@(?:[\w\-]+\.)+[\w\-]+"; 33 String telFormat = "[0-9]{10,11}"; 34 ErrorCheck errorCheck = new ErrorCheck(); 35 errorCheck.requiredCheck(name, "名前"); 36 errorCheck.regExpCheck(email, mailFormat, "メールアドレス"); 37 errorCheck.passwordCheck(password, validation); 38 errorCheck.regExpCheck(tel, telFormat, name); 39 if(errorCheck.hasErrors()) { 40 request.setAttribute("errors", errorCheck.getErrorList()); 41 RequestDispatcher dispatch = request.getRequestDispatcher("http://localhost:8080/shopinfo/"); 42 dispatch.forward(request, response); 43 } 44 PreparedStatement statement = null; 45 Connection con = null; 46 String sql = "INSERT INTO customer (name, email, password, address, tel) VALUES(?,?,?,?,?)"; 47 try { 48 con = super.getConnection(); 49 statement = con.prepareStatement(sql); 50 statement.setString(1, name); 51 statement.setString(2, email); 52 statement.setString(3, password); 53 statement.setString(4, address); 54 statement.setString(5, tel); 55 statement.executeUpdate(); 56 } catch(SQLException e) { 57 e.printStackTrace(); 58 } catch(Exception e) { 59 e.printStackTrace(); 60 } finally { 61 try { 62 if(statement != null) {con.close();} 63 if(con != null) {con.close();} 64 } catch(Exception e) { 65 e.printStackTrace(); 66 } finally { 67 RequestDispatcher dispatch = request.getRequestDispatcher("http://localhost:8080/shopinfo/"); 68 dispatch.forward(request, response); 69 } 70 } 71 } 72 73} 74 75

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0"> 3 <display-name>shopinf</display-name> 4 <welcome-file-list> 5 <welcome-file>entryCustomer.jsp</welcome-file> 6 <welcome-file>index.html</welcome-file> 7 <welcome-file>index.htm</welcome-file> 8 <welcome-file>index.jsp</welcome-file> 9 <welcome-file>default.html</welcome-file> 10 <welcome-file>default.htm</welcome-file> 11 </welcome-file-list> 12 13 <servlet> 14 <servlet-name>BaseServlet</servlet-name> 15 <servlet-class>database.BaseServlet</servlet-class> 16 </servlet> 17 <servlet-mapping> 18 <servlet-name>BaseServlet</servlet-name> 19 <url-pattern>/BaseServlet</url-pattern> 20 </servlet-mapping> 21 22 <servlet> 23 <servlet-name>InsertCustomer</servlet-name> 24 <servlet-class>database.InsertCustomer</servlet-class> 25 </servlet> 26 <servlet-mapping> 27 <servlet-name>InsertCustomer</servlet-name> 28 <url-pattern>/InsertCustomer</url-pattern> 29 </servlet-mapping> 30 31</web-app>

試したこと

フォワードをリダイレクトに変えて試してみたり、フォワードを書く位置を変えてみたりしました。

補足情報(FW/ツールのバージョンなど)

tomcat9.0でjava15、eclipse使用でPCはmacです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

リクエストディスパッチャ(RequestDispatcher)でforwardやredirectを指定した後に、また処理が記述されている場合は、処理が継続します。適切なタイミングでreturn; をしてください。

java

1if(errorCheck.hasErrors()) { 2 request.setAttribute("errors", errorCheck.getErrorList()); 3 RequestDispatcher dispatch = request.getRequestDispatcher("遷移先のJSP"); 4 dispatch.forward(request, response); 5 return; 6} 7 8// この後に処理が続いている場合、実行される。 9

投稿2020/11/17 15:57

編集2020/11/19 04:56
A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wtp

2020/11/17 23:58

ありがとうございます、直したところ今度は違うエラーが出てしまいまして、getRequestDispatcherのurlをhttpから始まるもので記述していたのが原因みたいだったのでurlの所を/entryCustomer.jspに直しました。すると、 、、、 タイプ ステータスレポート メッセージ JSP ファイル [/database/entryCustomer.jsp] が見つかりません 説明 オリジンサーバーは、ターゲットリソースの現在の表現を見つけられなかったか、またはそれが存在することを開示するつもりはありません 、、、 とのエラーが出てしまいます。databaseとはパッケージ名前のはずなんですが、、、スラッシュを消したり/databaseと付けてみたりしたのですがどうにもなりません。これはどうすればいいか分かりますでしょうか。
A-pZ

2020/11/19 04:58

指定するのはパッケージ名は含みません。あくまでJSPファイル名や、Webアプリケーションのリソースを搭載しているディレクトリ構造になります。 動的Webプロジェクトであれば、WebContent 以下のディレクトリ構造です。WebContent/display.jsp であれば、/display.jspを指定します。
wtp

2020/11/19 06:07

ありがとうございます、お陰で解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問