実現したいこと
ログイン画面でIDとパスワードを入力した時、それに誤りがあった場合は、ログインボタンを押した後に「IDかパスワードが間違っています」とアラートで表示させたいです。(誤りがある場合は画面は遷移しません。=ログイン画面のまま) IDとパスワードはデータベースで照合する形です。 サーブレット、JSPを使ってこれを実現させたいです。
発生している問題・分からないこと
「ログイン画面でIDとパスワードを入力し、ログインボタンを押すと、IDとパスワードがデータベースと照合され、誤りがある場合は画面遷移しない。」という設定はできています。また、アラートを表示させること自体はできたのですが、それが入力誤りがあるない関わらず、画面遷移の度に表示してしまいます。また、JavaScriptに書いた通りの「<%=error%>」を出力してしまう状況です。
該当のソースコード
LoginServlet
12package servlet; 3 4import java.io.IOException; 5 6import javax.servlet.RequestDispatcher; 7import javax.servlet.ServletException; 8import javax.servlet.annotation.WebServlet; 9import javax.servlet.http.HttpServlet; 10import javax.servlet.http.HttpServletRequest; 11import javax.servlet.http.HttpServletResponse; 12import javax.servlet.http.HttpSession; 13 14import model.Login; 15import model.LoginLogic; 16 17@WebServlet("/LoginServlet") 18public class LoginServlet extends HttpServlet { 19 private static final long serialVersionUID = 1L; 20 21 protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ 22 //フォワード 23 RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/login.jsp"); 24 dispatcher.forward(request, response); 25 } 26 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 27 //リクエストパラメータの取得 28 request.setCharacterEncoding("UTF-8"); 29 String id = request.getParameter("id"); 30 String password = request.getParameter("password"); 31 32 //ログイン処理の実行 33 Login login = new Login(id,password); 34 LoginLogic bo = new LoginLogic(); 35 boolean result = bo.execute(login); 36 37 //ログイン処理の成功、失敗によって処理を分岐 38 if(result) {//ログイン成功 39 //セッションスコープにIDを保存 40 HttpSession session = request.getSession();//セッションスコープの取得 41 session.setAttribute("id", id); 42 43 //フォワード 44 RequestDispatcher dispatcher = request.getRequestDispatcher("WEB-INF/list.jsp"); 45 dispatcher.forward(request, response); 46 }else{//ログイン失敗 47 //リクエストスコープにインスタンスを保存 48 request.setAttribute("error", "IDかパスワードが間違っています"); 49 50 //リダイレクトでログイン画面(トップ)まで戻る 51 response.sendRedirect("LoginServlet"); 52 53 } 54 } 55} 56
login.jsp
1<%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3<!DOCTYPE html> 4<html> 5<head> 6 <title>ログイン画面</title> 7 <meta charset="UTF-8"> 8 9</head> 10<body> 11 <form action="LoginServlet" method="post" onsubmit = "return checkForm();" > 12 <!--タイトル--> 13 <p class="title">ログイン</p> 14 <!--入力欄--> 15 <table class="ma1"> 16 <tr> 17 <th class="moji1">ID:</th> 18 <th><input type="text" name="id" id="id" oninput="inputNumber(this);" maxlength="6" class="pw2"></th><!--tdだとグレーになるためth--> 19 </tr> 20 <tr> 21 <th class="pw">パスワード:</th> 22 <th><input type="password" name="password" id="pw" oninput="inputPass(this);" maxlength="10" class="pw2"></th> 23 </tr> 24 </table> 25 <!--ログインボタン--> 26 <p class="login"><input type="submit" value="ログイン"></p> 27<% 28//リクエストスコープからインスタンスを取得 29if(request.getAttribute("error")!=null){ 30 Error error = (Error)request.getAttribute("error"); 31%> 32<% } %> 33 <script src="login.js"></script> 34 </form> 35</body> 36</html> 37
login.js
1//ID文字限定 2関係ないため省略 3 4//ID&パスワードが入力されていない場合 5関係ないため省略 6 7//パスワード文字限定 8関係ないため省略 9 10//ログイン失敗時のアラート 11function checkForm2(){ 12 var msg="<%=error%>"; 13 alert(msg); 14} 15
試したこと・調べたこと
上記の詳細・結果
最初は、サーブレットの「//ログイン処理の成功、失敗によって処理を分岐」のところで、
}else{
HttpSession session =request.getSession();
session.setAttribute("error","IDかパスワードが間違っています");
と書いており、JSPの「ログインボタン」の所で、
<span>${error}<p class="login"><input type="submit" value="ログイン"></p></span>
と書いておりました。この書き方の時は、IDかパスワードが間違っている際、ログインボタンを押すと、エラーメッセージをパスワード入力欄の下に表示させることができました。しかし、アラートが出せませんでした。
次にログイン失敗時のメッセージは1度切りで良いため、リクエストスコープですると良いというアドバイスをもらったので、上記のようなコードを書くと、アラートは出るようになったのですが、入力誤りがあるないに関わらず、画面遷移の度に出てきてしまうようになってしまいました。
補足
これをサーブレット、JSP、そして外部JavaScriptファイルを使って実現させたいです。
何卒よろしくお願いいたします。
0 コメント