■作成するプログラムの概要
・画面にユーザIDとパスワードを入力する。
・登録されているユーザであれば、ログイン完了画面に遷移し、ユーザIDとユーザ名を表示する。
・登録されていないユーザであれば、ログイン画面に遷移する。
なお、ログイン失敗メッセージを表示する。
■フローチャート
▼全体概要
▼ログイン確認サーブレットクラス
・Get処理
・Post処理
▼ユーザ検索処理
■プログラム仕様
▼ログイン確認サーブレットクラス(LoginUserServlet.java)
(1)GET処理
インプット | 処理内容 | アウトプット |
---|---|---|
– | ログイン画面へ遷移する。 | 【URL*1】 ログイン画面 |
*1:URL(/WEB-INF/jsp/userlogin.jsp)
(2)POST処理
インプット | 処理内容 | アウトプット |
---|---|---|
【フォーム情報】 ユーザID パスワード | 【フォーム情報】を取得する。 | – |
– | 【try】 | – |
– | Beanクラスをインスタンスする。 | – |
– | Beanクラスに入力したユーザIDとパスワードをセットする。 | – |
– | ユーザ検索処理を実行する。 | – |
– | ▼条件分岐:検索結果 |【ユーザ件数0件もしくは複数件の場合】 |ログインNGフラグを立てる。 |ログイン画面へ遷移する。・・・① ------ |【else】 |ログインユーザ用にBeanクラスをインスタンスする。 |検索結果のユーザIDとユーザ名をBeanクラスにセットする。 |セッション情報にBeanクラスをセットする。 |ログインOK画面へ遷移する。・・・② ▲ | ① 【URL*1】 ログイン画面 ② 【URL*2】 ログインOK画面 |
– | 【catch】 | – |
– | 何らかの理由で失敗した場合、 エラーページにエラー文を渡して表示する。 | 【メッセージ】 エラーメッセージ 【URL】 エラー画面*3 |
*1:URL(/WEB-INF/jsp/userlogin.jsp)
*2:URL(/WEB-INF/jsp/userloginOK.jsp)
*3:URL(/WEB-INF/jsp/error.jsp)
▼ユーザ検索処理(LoginUserDAO.java)
(1)インスタンス処理
引数:なし
戻り値:new ユーザ検索処理クラス
インプット | 処理内容 | アウトプット |
---|---|---|
– | コードの簡略化を行うため、 インスタンスオブジェクトの生成時、 新規オブジェクトを返却する。 | 【オブジェクト】 new ユーザ検索処理クラス |
(2)ユーザ検索処理
引数:Beanクラス
戻り値:配列(Beanクラス)
インプット | 処理内容 | アウトプット |
---|---|---|
【Beanクラス】 ユーザID パスワード | 初期値をセットする。 ・DB接続=null ・ユーザID=BeanクラスのユーザID ・パスワード=Beanクラスのパスワード | – |
– | 戻り値用のBeanクラス格納配列をセットする。 | – |
– | 【try】 | – |
– | jdbcドライバを読み込む。(OracleDB)(*1) | – |
【DB情報】 ユーザ名 パスワード PDB情報 | DBへ接続する。(*2) | – |
– | 実行するSQL文をセットする。 | – |
– | SQLを実行する。 | – |
– | 検索結果ユーザ情報格納用のBeanクラスをインスタンス。 | – |
– | ■ループ処理:検索結果件数分 |ユーザIDとユーザ名をBeanクラスへセットする。 |配列にBeanごと格納する。 |検索結果ユーザ情報格納用のBeanクラスを初期化する。 ■ | – |
– | 【catch】sql実行失敗 | – |
– | エラーメッセージをコンソールに出力する。 | 【メッセージ】 エラーメッセージ |
– | 【catch】JDBCドライバ関連エラー | – |
– | エラーメッセージをコンソールに出力する。 | 【メッセージ】 エラーメッセージ |
– | 【finally】 | – |
– | ▼条件分岐 |【DB接続中の場合】 |DBとの接続を切る。 ▲ | – |
– | 戻り値として、Beanクラス格納配列を返す。 | – |
(*1)jdbcドライバを読み込む。
以下のようにドライバ(ojdbc10.jar)を配置する。
なお、ドライバ(ojdbc10.jar)は、Oracle19cのものを使用する。(Oracle社からダウンロードしたもの)
(*2)DBへ接続する
DBへの接続は、以下の2通りのうち、Thin接続にて行う。
・Thin接続
jdbc:oracle:thin:<ユーザ名>/<パスワード>@//<ホスト名:ポート番号>/<PDB名>
・OCI接続(クライアント側にオラクルクライアントをインストールする必要あり)
jdbc:oracle:oci:<ユーザ名>/<パスワード>@<サービス名またはPDB名>
■テーブル定義(login_user)
ユーザ情報テーブルの定義情報を以下に示す。
カラム名(物理) | カラム名(論理) | Null判定 | キー | 型 |
---|---|---|---|---|
ID | ユーザID | NOT NULL | 主キー | CHAR(5) |
NAME | ユーザ名 | NOT NULL | – | VARCHAR2(12 CHAR) |
PW | パスワード | NOT NULL | – | VARCHAR2(50 CHAR) |
■ユーザ情報テーブルのデータ情報
ユーザ情報テーブルのデータについて、あらかじめ、以下の情報を登録しておく。
ID | NAME | PW |
---|---|---|
12345 | 本山太郎 | abcdef123 |
12346 | 中村次郎 | abcdef456 |
12347 | 山田花子 | abcdef789 |
■画面仕様
▼ログイン画面
・「ユーザID」と「パスワード」を入力できるフォームを作成し、「ログイン」ボタン押下時、ユーザ検索処理を実行する。
・ユーザ情報がある場合は、ログイン完了画面に遷移する。
・ユーザ情報がない場合は、ログイン画面に戻る。
ユーザID:5桁以下で入力必須
パスワード:入力必須
▼ログイン完了画面
・ログイン完了時、ユーザIDとユーザ名を表示する。
■サンプルコード
▼ログインサーブレットクラス(LoginUserServlet.java)
package servlet;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import bean.LoginUserBean;
import dao.LoginUserDAO;
/**
* Servlet implementation class LoginUserServlet
*/
@WebServlet("/LoginUserServlet")
public class LoginUserServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// ログイン画面へ遷移
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/userlogin.jsp");
rd.forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Jspのフォーム画面からログイン対象ユーザIDとパスワードを取得
request.setCharacterEncoding("UTF-8");
String input_userID = request.getParameter("userid");
String input_userPW = request.getParameter("userpw");
try{
// Beanクラスのインスタンス
LoginUserBean input_user = new LoginUserBean();
// Beanクラスに入力したユーザIDとパスワードをセットする
input_user.setLogin_user_id(input_userID);
input_user.setLogin_user_pw(input_userPW);
// リスト<Beanクラス>に検索結果を格納する
ArrayList<LoginUserBean> user_list = LoginUserDAO.getInstance().SelectLoginUser(input_user);
// ユーザ情報なしもしくは複数件の場合はログイン画面に戻る
if (user_list == null || user_list.size() != 1){
// ログインフラグを立てる(0:OK、1:NG)
LoginUserBean result = new LoginUserBean();
result.setLogin_user_flg(1);
// ログイン画面に返す
request.setAttribute("result", result);
request.getRequestDispatcher("/WEB-INF/jsp/userlogin.jsp").forward(request, response);
} else {
// ログインユーザ用にBeanクラスをインスタンス
LoginUserBean result_user = new LoginUserBean();
// ユーザIDとユーザ名のみ新たにBeanクラスに格納する
result_user.setLogin_user_id(user_list.get(0).getLogin_user_id());
result_user.setLogin_user_name(user_list.get(0).getLogin_user_name());
// ログインOK画面に返す
HttpSession session = request.getSession();
session.setAttribute("result_user", result_user);
request.getRequestDispatcher("/WEB-INF/jsp/userloginOK.jsp").forward(request, response);
}
}catch(Exception e){
//何らかの理由で失敗したらエラーページにエラー文を渡して表示。
request.setAttribute("error", e.getMessage());
request.getRequestDispatcher("/WEB-INF/jsp/error.jsp").forward(request, response);
}
}
}
▼Beanクラス(LoginUserBean.java)
package bean;
import java.io.Serializable;
public class LoginUserBean implements Serializable{
// フィールド宣言
private String login_user_id;
private String login_user_pw;
private String login_user_name;
private int login_user_flg;
// ゲッターとセッターの作成(ユーザID)
public String getLogin_user_id() {
return login_user_id;
}
public void setLogin_user_id(String userid) {
this.login_user_id = userid;
}
// ゲッターとセッターの作成(パスワード)
public String getLogin_user_pw() {
return login_user_pw;
}
public void setLogin_user_pw(String userpw) {
this.login_user_pw = userpw;
}
// ゲッターとセッターの作成(ユーザ名)
public String getLogin_user_name() {
return login_user_name;
}
public void setLogin_user_name(String username) {
this.login_user_name = username;
}
// ゲッターとセッターの作成(ユーザフラグ)
public int getLogin_user_flg() {
return login_user_flg;
}
public void setLogin_user_flg(int userflg) {
this.login_user_flg = userflg;
}
}
▼ユーザ検索処理(LoginUserDAO.java)
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import bean.LoginUserBean;
public class LoginUserDAO {
// インスタンスオブジェクトの生成->返却(コードの簡略化)
public static LoginUserDAO getInstance() {
return new LoginUserDAO();
}
// 検索処理
// 引数 :Beanクラス
// 戻り値 :ArrayList<Beanクラス>
public ArrayList<LoginUserBean> SelectLoginUser(LoginUserBean input_user) throws SQLException {
// 初期値をセット
Connection db_con = null;
String id = input_user.getLogin_user_id();
String pw = input_user.getLogin_user_pw();
// 複数のユーザ情報を格納するため、Beanを格納する配列を作成
ArrayList<LoginUserBean> array_userinfo = new ArrayList<LoginUserBean>();
try {
// jdbcドライバの読み込み(OracleDB)
Class.forName("oracle.jdbc.driver.OracleDriver");
// DB接続
db_con = DriverManager.getConnection(
"jdbc:oracle:thin:<ユーザ名>/<パスワード>@//<ホスト名:ポート番号>/<PDB名>");
// 実行するSQL文をセット
String sql = "select * from login_user where id = ? and pw = ?";
// DBで実行するSQL文を「prepareStatement」インスタンスに格納する
PreparedStatement ps = db_con.prepareStatement(sql);
ps.setString(1, id);
ps.setString(2, pw);
// SQL文の実行結果を格納
ResultSet rs = ps.executeQuery();
// 検索結果格納のため、Beanクラスをインスタンス
LoginUserBean resultUserInfo = new LoginUserBean();
// SQL文の実行結果件数分ループ処理
while(rs.next()) {
// ユーザIDと名前をBeanクラスへセット
resultUserInfo.setLogin_user_id(rs.getString("id"));
resultUserInfo.setLogin_user_name(rs.getString("name"));
// リストにBeanクラスごと格納
array_userinfo.add(resultUserInfo);
//Beanクラスを初期化
resultUserInfo = new LoginUserBean();
}
} catch(SQLException sql_e) {
// エラーハンドリング
System.out.println("sql実行失敗");
sql_e.printStackTrace();
} catch(ClassNotFoundException e) {
// エラーハンドリング
System.out.println("JDBCドライバ関連エラー");
e.printStackTrace();
} finally {
// DB接続を解除
if (db_con != null) {
db_con.close();
}
}
// リストを返す
return array_userinfo;
}
}
▼ログイン画面(userlogin.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="bean.LoginUserBean" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログイン画面</title>
</head>
<body>
<form action="./LoginUserServlet" method="post">
<p>
ユーザID:<input type="text" name="userid" required>
パスワード:<input type="password" name="userpw" required>
</p>
<input type="submit" value="ログイン">
</form>
<!-- ログイン失敗時の処理 -->
<%
LoginUserBean userinfo = (LoginUserBean)request.getAttribute("result");
if(userinfo != null) {
if(userinfo.getLogin_user_flg() == 1){
%>
IDまたはパスワードに不備があります
<%
}
}
%>
</body>
</html>
▼ログインOK画面(userloginOK.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.ArrayList"%>
<%@ page import="bean.LoginUserBean" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ログインOK画面</title>
</head>
<body>
<%
LoginUserBean login_user = (LoginUserBean)session.getAttribute("result_user");
if (login_user == null){
%>
<br>
<P>ログイン情報なし</P>
<br>
<% } else { %>
<P>ユーザID:<%= login_user.getLogin_user_id() %></P>
<P>ユーザ名:<%= login_user.getLogin_user_name() %></P>
<% } %>
</body>
</html>
■実行結果
▼正常系(ログイン成功)
・ユーザ情報テーブルに登録されているユーザIDとパスワードを入力し、「ログイン」ボタンを押下する。
・ログイン完了画面へ遷移し、ユーザIDとユーザ名が表示される。
▼異常系(ログイン失敗)
・ユーザ情報テーブルに登録されていないユーザ名とパスワードを使用してログインを試みる。
・ログイン画面に戻り、エラーメッセージが出力される。
コメント
I enjoy what you guys tend to be up too. Such clever work and exposure!
Keep up the terrific works guys I’ve included you guys to blogroll.