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

##はじめに
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);
		}
	}
```

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