前提・実現したいこと
最近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です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/17 23:58
2020/11/19 04:58
2020/11/19 06:07