LoginSignup
2
1

More than 3 years have passed since last update.

Java・ツイッタークローン・タスク管理システム②ログイン機能をつける

Last updated at Posted at 2020-10-11

はじめに

Javaを使って初めてアプリケーションを作成する人にむけて記事を書いてみようと思います。
ポートフォリオや、会社の研修課題作成の参考にしていただければ幸いです。
今回は、タスクマネージャーを作成します。
これを応用することで、ツイッタークローンの作成にも活かすことができます。

アプリケーションの機能ごとに記事を投稿していきます。
1.データベース作成
2.ログイン機能
3.タスクの登録機能
4.一覧表示
  -ソート機能
  -検索機能
5.編集機能
6.削除機能
7.排他制御について

*詳しい説明はコード内に書いてありますので、コピペする人は消して使ってください

実行環境

eclipse4.16.0
Tomcat9
Java11

目次

1.viewの作成
2.DAOの作成
3.サーブレットの作成
4.次回予告

viewの作成

*今回だけスタイリングにBootStrapを使用しています。

login.jsp
<body>
<!-- 入力エラーがあった場合には再度このページが開かれるのでその際になぜエラーになったのかをお知らせします。リクエストスコープデータ名errorの値を受け取る-->
<%
List<String> error = (List<String>)request.getAttribute("error");
%>
    <div class="container mt-5">
        <div class="row justify-content-center">
            <h3>ログイン画面</h3>
        </div>
<!-- errorを赤色で表示させる。-->
        <%for(String er : error){ %>
        <div class="row justify-content-center">
            <p style="color:red"><%=er %></p>
        </div>
        <%} %>
        <div class="row justify-content-center">
<!-- login-servletを指定して、入力データ(user_id, password)を送る-->
            <form action="login-servlet" method="post">
                <div class="form-group">
                    <label>ユーザID</label>
                    <input type="text" name="user_id" class="form-control" placeholder="User-ID">
                </div>
                <div class="form-group">
                    <label>パスワード</label>
                    <input type="password" name="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
                    <small class="form-text text-muted">We'll never share your Password with anyone else.</small>
                </div>
                <button type="submit" class="btn btn-outline-info">ログイン</button>
            </form>
        </div>
    </div>

DAOの作成

サーブレットをすっきりさせたり、あとで変更をしやすくするためにDAOにてメソッドを定義してきます。

model.dao.UserDAO.java
    /**
         *このメソッドでは入力されたユーザIDからユーザの情報全部を取得するときなどに使います。
     * ユーザIDを引数にユーザ情報を取得するメソッド
     * @param user_id
     * @return ユーザ情報
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public UserBean getUser(String user_id) throws SQLException, ClassNotFoundException {
        UserBean user = new UserBean();
//SQL文user_idを指定して、レコードを取得
        String sql = "select * from m_user where user_id = ?";
//データベースへ接続
        try(Connection con = ConnectionManager.getConnection();
                PreparedStatement pstmt = con.prepareStatement(sql)){
//受け取ったuser_idをSQL文へ代入
            pstmt.setString(1, user_id);
//SQL文を実行して実行結果を取得
            ResultSet res = pstmt.executeQuery();
            while(res.next()) {
//実行結果よりそれぞれのカラムの値を取得
                String password = res.getString("password");
                String user_name = res.getString("user_name");
//userオブジェクトへセット
                user.setPassword(password);
                user.setUser_id(user_id);
                user.setUser_name(user_name);
            }
            return user;
        }
    }

    /**
     * ユーザIDを引数にユーザ名を取得するメソッド
     * @param user_id
     * @return ユーザ名
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public String getUserName(String user_id) throws SQLException, ClassNotFoundException {
//SQL文User_idよりuser_nameを取得
        String sql = "select user_name from m_user where user_id = ?";
//usre_nameの初期値をセット
        String user_name ="不明";
//データベースへ接続
        try(Connection con = ConnectionManager.getConnection();
                PreparedStatement pstmt = con.prepareStatement(sql)){
//受け取ったuser_idをSQL文へ代入
            pstmt.setString(1, user_id);
//SQL文を実行して実行結果を取得
            ResultSet res = pstmt.executeQuery();

            while(res.next()) {
//実行結果よりそれぞれのカラムの値を取得
                user_name = res.getNString("user_name");
            }
        }
        return user_name;
    }


        /**
         * ログイン認証用メソッド
         * @param user_id
         * @param password
         * @return boolean型でtrueならログイン可能 falseならログイン不可能
         * @throws SQLException
         * @throws ClassNotFoundException
         */
    public boolean logincheck(String user_id, String password) throws SQLException, ClassNotFoundException {
//そもそも入力欄が空欄だった場合を除外する
        if (user_id == null || user_id.length() == 0 || password == null || password.length() == 0){
          return false;
        }
//SQL文 入力されたuser_id, passwordを指定してレコードを取得
        String sql = "select * from m_user where user_id = ? && password = ?";
//データベースへ接続
        try (Connection con = ConnectionManager.getConnection();
                PreparedStatement pstmt = con.prepareStatement(sql)){
            pstmt.setString(1, user_id);
            pstmt.setString(2, password);
            ResultSet res = pstmt.executeQuery();
//SQL文の実行結果があれば、ユーザが存在するのでtrue。結果が無いということはそのユーザは登録されていないのでfalse
            if(res.next()) {
                return true;
            } else {
                return false;
            }
        }
    }

サーブレットの作成

DAOで作成したメソッドを利用して、サーブレットを作成していきます。

Servlet.Login.java
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        //リクエストパラメータの受け取り
        request.setCharacterEncoding("UTF-8");
        String user_id = request.getParameter("user_id");
        String password = request.getParameter("password");


        //DAOオブジェクト生成
        UserDAO userdao = new UserDAO();

        //sessionスコープ生成・
        HttpSession session = request.getSession();

        try {
            boolean logincheck = userdao.logincheck(user_id, password);

            if(logincheck) {
                //-----------入力が正しかった時の処理---------------------------------------------------

                //sessionスコープへログイン状況をセット
                session.setAttribute("login", true);

                //ログインユーザ名と情報を取得してsessionスコープへセット
                String current_user_name = userdao.getUserName(user_id);
                UserBean current_user = userdao.getUser(user_id);
                session.setAttribute("current_user_name", current_user_name);
                session.setAttribute("current_user", current_user);
                session.setAttribute("current_user_id", user_id);

                //メニューセッションへ転送
                RequestDispatcher rd = request.getRequestDispatcher("menu-servlet");
                rd.forward(request, response);

            } else {
                //--------入力が違った時の処理-----------------------------------------------------------
                //空欄をチェック
                List<String> error = new ArrayList<String>();
                if(password.equals("")) {
                    error.add("パスワードが空欄です");
                }
                if(user_id.equals("")) {
                    error.add("ユーザIDが空欄です");
                }
                error.add("ユーザIDかパスワードに誤りがあります");
                request.setAttribute("error", error);

                //sessionスコープへログイン状況をセット(認証不可)
                session.setAttribute("login", false);

                //ログイン画面へ転送
                RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
                rd.forward(request, response);
            }
            //---------その他SQLなどのエラー--------------------------------------------------------------
        }catch(SQLException | ClassNotFoundException e) {
            e.printStackTrace();
            RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
            rd.forward(request, response);
        }
    }

次回予告

今回は、ログイン機能の実装をしてみました。
次回は、タスクの登録機能の実装をしていきます。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1