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

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

ただいまの
回答率

89.97%

Java サーブレット&JSP なかなか難しい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,109

kuzurotto

score 403

DBへの登録画面をサンプルで作っています。
既にDBへ入力したIDがある場合は、DB登録できないように条件を付けています。
DBに登録できたらログイン画面にフォワードするようにしています。

DB登録できた時でも出来なかった時でもMsgという変数にメッセージを入れています。

DB登録できたらログイン画面でMsgを表示させて
DB登録できなかったら画面遷移することなくそのままのユーザー登録画面のままでIDフォームの横にMsgを表示させようとしていました。

イメージ説明

が、うまくいきません。

DBへの登録はちゃんと確認できます。

DBに登録できても、できなかっても
画像の通り、Msgの中身が一緒なのです。
画像の場合だと、表示されるべきメッセージは、
既に登録されているIDです。
になるはずです。

どこがおかしいのでしょうか?

UserEntry.jsp(ビュー)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="model.UserEntryValidation"%>
<%
UserEntryValidation uev = (UserEntryValidation) session.getAttribute("uevResult");
%>
<!DOCTYPE html">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ユーザー登録画面</title>
</head>
<body>
<h1>ユーザー登録画面</h1>
<form action="/Jwg_Sample001/Login?action=userEntryInput" method="post">
    <table>
        <tbody>
            <tr>
                <td>ID:</td><td><input type="text" name="id"></td><td><%= uev.getMsg() %></td>
            </tr>
            <tr>
                <td>PW:</td><td><input type="password" name="pass"></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="ユーザー登録"></td>
            </tr>
        </tbody>
    </table>
</form>

</body>
</html>

Login.Java(コントローラー)

package servlet;

import java.io.*;

import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;

import model.*;

@WebServlet("/Login")
public class Login extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String userEntryForm = request.getParameter("action");

        if(userEntryForm.equals("userEntryForm")) {
            //ユーザー登録画面にフォワード
            RequestDispatcher dispatcher = 
                    request.getRequestDispatcher("/WEB-INF/UserEntry.jsp");
            dispatcher.forward(request, response);
        }



    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        String userEntryInput = request.getParameter("action");
        String login = request.getParameter("action");

        if(userEntryInput.equals("userEntryInput")) {

            //リクエストパラメータの取得
            String id = request.getParameter("id");
            String pass = request.getParameter("pass");

            //Userインスタンスの生成
            User user = new User(id,pass);

            //UserEntryValidationインスタンスを生成
            //そのインスタンスにパラメータ情報を渡してモデル内で登録処理させる
            UserEntryValidation uev = new UserEntryValidation();
            boolean result = uev.Validation(user);

            //ログイン成功時の処理
            if(result){
                //ユーザー情報をセッションスコープの保存
                HttpSession session = request.getSession();
                session.setAttribute("uevResult", uev);
            }







            //ログイン録画面にフォワード(但し、ユーザー登録後のログイン画面であることをユーザーに知らせる)        
            RequestDispatcher dispatcher = 
                    request.getRequestDispatcher("/Login.jsp");//WEB-INF必要かも
            dispatcher.forward(request, response);

        } else if(login.equals("login")){

            //リクエストパラメータの取得
            String id = request.getParameter("id");
            String pass = request.getParameter("pass");

            //Userインスタンスの生成
            User user = new User(id,pass);

            //ログイン処理
            LoginCheck loginCheck = new LoginCheck();
            boolean result = loginCheck.execute(user);

            //ログイン成功時の処理
            if(result){
                //ユーザー情報をセッションスコープの保存
                HttpSession session = request.getSession();
                session.setAttribute("loginUser", user);
            }

            //ログイン結果画面にフォワード
            RequestDispatcher dispatcher = 
                    request.getRequestDispatcher("/WEB-INF/CSVWriting.jsp");
            dispatcher.forward(request, response);
        }
    }
}

UserEntryValidation.java(モデル)

package model;

import java.io.Serializable;
import java.sql.*;

public class UserEntryValidation implements Serializable {

    private String msg;

    public boolean Validation(User user){

        String sql = null;

        Connection dns = null;
        ResultSet rs = null;

        try {
            // プロジェクトにビルドされている.jraファイルから読み込んでいる
            Class.forName("com.mysql.jdbc.Driver").newInstance();

            // MySQLに接続
            dns = DriverManager.getConnection("jdbc:mysql://localhost/example", "root", "root");

            //入力値(id)でレコード検出
            sql = "SELECT count(*) AS cnt FROM Users WHERE name = ? ";
            PreparedStatement pstmt = dns.prepareStatement(sql);
            pstmt.setString(1,user.getId());

            rs = pstmt.executeQuery();

            if(rs.next()){
                //入力したIDに該当するレコードがなければDB登録処理
                if(rs.getInt("cnt")==0) {

                    sql = "INSERT INTO Users(name,pass) VALUES (?,?)";
                    PreparedStatement stmt = dns.prepareStatement(sql);

                    stmt.setString(1,user.getId());
                    stmt.setString(2,user.getPass());

                    stmt.executeUpdate();

                    System.out.println("DB登録できました。");

                    this.msg = "DB登録できました";

                    return true;

                } else {
                    System.out.println("既に登録されているIDの為、登録できません。");
                    this.msg = "既に登録されているIDです。";

                    return false;

                }

            }

            System.out.println("MySQLに接続できました。");

        } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {

            System.out.println("JDBCドライバのロードに失敗しました。");
            System.out.println(e);

        } catch (SQLException e) {

            System.out.println("MySQLに接続できませんでした。");
            System.out.println(e);

        } finally {

            if (dns != null) {
                try {
                    dns.close();
                } catch (SQLException e) {
                    System.out.println("MySQLのクローズに失敗しました。");
                    System.out.println(e);
                }
            }
        }
        return false;
    }

    public String getMsg(){
        return msg;
    }
}

足りないロジックがありそうでないような、、、

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

セッションにuevResultを格納している個所についてですが、
登録成功時のセッションが残っていて、登録失敗時にも同じメッセージが出力されるのでは?

// 以下ifは必要?
            //ログイン成功時の処理
            if(result){
                //ユーザー情報をセッションスコープの保存
                HttpSession session = request.getSession();
                session.setAttribute("uevResult", uev);
            }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/14 15:57

    同じくそう思います。
    また、invalidでもsessionにAttributeしないとinvalidのメッセージ表示されません

    キャンセル

  • 2016/09/14 19:15

    正確には omochi さまの回答がより正解に近いかと思いました。

    キャンセル

  • 2016/09/22 19:55

    ありがとうございます!

    キャンセル

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

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる