【Java】【SQL】ユーザ検索:入力したIDの検索結果を画面に表示する

■作成するプログラムの概要

・ユーザIDを入力し、検索結果(ユーザIDとユーザ名)を画面に表示する。
・ユーザIDが入力されなかった場合は、ユーザ情報全件を表示する。

■フローチャート

・全体の概要


・ユーザ検索サーブレットクラスの処理(Get)


・ユーザ検索サーブレットクラスの処理(Post)


・検索処理

■プログラム仕様

▼サーブレットクラス(SelectUserServlet.java)

(1)GET処理

インプット処理内容アウトプット
【URL】
*1
JSPファイルへ画面遷移する。

*1:URL(/WEB-INF/jsp/usersearch.jsp)


(2)POST処理

インプット処理内容アウトプット
【フォーム情報】
ユーザID
【フォーム情報】を取得する。
【try】
Beanクラスをインスタンスする。
Beanクラスに入力したユーザIDをセットする。
リスト<Beanクラス>に「検索処理」の結果を格納する。
検索結果をJSP画面に返す。
【URL】
*1
JSPファイルへ画面遷移する。
【catch】
【URL】
*2
何らかの理由で失敗した場合、
エラーページにエラー文を渡して表示する。
【メッセージ】
エラーメッセージ

*1:URL(/WEB-INF/jsp/usersearch.jsp)
*2:URL(/WEB-INF/jsp/error.jsp)

▼検索処理(SelectUserDAO.java)

(1)インスタンス処理

引数:なし
戻り値:new 検索処理クラス

インプット処理内容アウトプット
コードの簡略化を行うため、
インスタンスオブジェクトの生成時、
新規オブジェクトを返却する。
【オブジェクト】
new 検索処理クラス

(2)検索処理

引数:Beanクラス
戻り値:ArrayList<Beanクラス>

インプット処理内容アウトプット
【Beanクラス】
ユーザID
初期値をセットする。
・DB接続=null
・ユーザID=BeanクラスのユーザID
・Beanを格納する配列を作成(戻り値用)
【try】
jdbcドライバを読み込む。(OracleDB)(*1)
【DB情報】
ユーザ名
パスワード
PDB情報
DBへ接続する。(*2)
実行するSQL文をセットする。(初期値:空文字)
【条件分岐】
▼ユーザIDを指定している場合
実行するSQL文をセットする。(条件指定あり)
▼ユーザIDを指定しない場合
実行するSQL文をセットする。(条件指定なし)
SQLを実行する。
検索結果格納のため、Beanクラスをインスタンスする。
↓【ループ処理】SQL文の実行結果件数分ループ処理(*3)
ユーザIDと名前をBeanクラスへセットする。
配列にBeanクラスごと格納する。
Beanクラスを初期化する。
↑【ループ処理】ここまで
【catch】sql実行失敗
エラーメッセージをコンソールに出力する。【メッセージ】
エラーメッセージ
【catch】JDBCドライバ関連エラー
エラーメッセージをコンソールに出力する。【メッセージ】
エラーメッセージ
【finally】
【条件分岐】
▼DB接続中の場合
DBとの接続を切る。
Beanを格納する配列を返す【戻り値】
Beanを格納する配列

(*1)jdbcドライバを読み込む。

以下のようにドライバ(ojdbc10.jar)を配置する。

なお、ドライバ(ojdbc10.jar)は、Oracle19cのものを使用し、Oracle社からダウンロードしたものを使用する。


(*2)DBへ接続する

DBへの接続は、以下の2通りのうち、Thin接続にて行う。

・Thin接続

jdbc:oracle:thin:<ユーザ名>/<パスワード>@//<ホスト名:ポート番号>/<PDB名>

・OCI接続(クライアント側にオラクルクライアントをインストールする必要あり)

jdbc:oracle:oci:<ユーザ名>/<パスワード>@<サービス名またはPDB名>

(*3)【ループ処理】SQL文の実行結果件数分ループ処理

本ループ処理のイメージ図を以下に示す。

・1人目のユーザ情報をインスタンスしたBeanクラスにセットし、そのBeanクラスごと配列に格納する。

・2人目のユーザ情報を再度インスタンスしたBeanクラスにセットし、そのBeanクラスごと配列に格納する。
配列には、2つのBeanクラスが格納してある状態

■テーブル定義

ユーザ情報テーブルの定義情報を以下に示す。

カラム名(物理)カラム名(論理)Null判定キー
IDユーザIDNOT NULL主キーCHAR(5)
NAMEユーザ名NOT NULLVARCHAR2(50)

■ユーザ情報テーブルのデータ情報

ユーザ情報テーブルのデータについて、あらかじめ、以下の情報を登録しておく。

IDNAME
12345Mike
12346Taro
12347Jon
12348Nuncy
12349Hanako

■画面仕様

・検索画面(usersearch.jsp)

①ユーザIDを入力して、検索ボタンを押下すると、検索処理が実行されるようにする。
また、ユーザIDを入力しない場合は、全件検索とする。

②デフォルトおよび検索結果が0件の場合は、「検索結果なし」と表示する。

③検索結果が1件以上ある場合は、表形式で、件数分表示する。


・エラー画面(error.jsp)

①エラーメッセージを表示する。

■サンプルコード

・サーブレットクラス(SelectUserServlet.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 bean.UserInfoBean;
import dao.SelectUserDAO;

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

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	// 画面へ遷移(Getの場合は何もしない)
    	RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/jsp/usersearch.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");
		
		try{
			// Beanクラスのインスタンス
			UserInfoBean input_user = new UserInfoBean();
			
			// Beanクラスに入力したユーザIDをセットする
			input_user.setUser_id(input_userID);
			
			// リスト<Beanクラス>に検索結果を格納する
			ArrayList<UserInfoBean> user_list = SelectUserDAO.getInstance().SelectUserData(input_user);
			
			// 検索結果をJSP画面に返す
			request.setAttribute("user_list", user_list);
            request.getRequestDispatcher("/WEB-INF/jsp/usersearch.jsp").forward(request, response);
			
		}catch(Exception e){
			//何らかの理由で失敗したらエラーページにエラー文を渡して表示。
            request.setAttribute("error", e.getMessage());
            request.getRequestDispatcher("/WEB-INF/jsp/error.jsp").forward(request, response);
		}
		
	}

}

・Beanクラス(UserInfoBean.java)

package bean;

import java.io.Serializable;

public class UserInfoBean implements Serializable{
	// フィールド
	private String user_id;
	private String user_name;
	
	// ユーザIDのゲッター/セッターを作成
	public String getUser_id() {
		return user_id;
	}
	public void setUser_id(String id) {
		this.user_id = id;
	}

	// ユーザ名のゲッター/セッターを作成
	public String getUser_name() {
		return user_name;
	}
	public void setUser_name(String name) {
		this.user_name = name;
	}

	// コンストラクタ:設定なし
	public UserInfoBean() {
	}
	
}

・検索処理(SelectUserDAO.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.UserInfoBean;

public class SelectUserDAO {
	
	// インスタンスオブジェクトの生成->返却(コードの簡略化)
	public static SelectUserDAO getInstance() {
		return new SelectUserDAO();
	}
	
	// 検索処理
	// 引数		:Beanクラス
	// 戻り値		:ArrayList<Beanクラス>
	public ArrayList<UserInfoBean> SelectUserData(UserInfoBean input_user) throws SQLException {
		// 初期値をセット
		Connection db_con = null;
		String id = input_user.getUser_id();
		
		// 複数のユーザ情報を格納するため、Beanを格納する配列を作成
		ArrayList<UserInfoBean> array_userinfo = new ArrayList<UserInfoBean>();
	
		try {
			// jdbcドライバの読み込み(OracleDB)
			Class.forName("oracle.jdbc.driver.OracleDriver");
		
			//  DB接続
			db_con = DriverManager.getConnection(
				"jdbc:oracle:thin:ユーザ名/パスワード@//ホスト名:ポート番号/PDB名");
		
			// 実行するSQL文をセット(空文字)
			String sql = "";
			
			// 実行するSQL文をセット
			// JSPでIDを指定しない場合は全件検索
			if(id == "") {
				sql = "select * from usertbl";
			}else {
				sql = "select * from usertbl where ID = ?";
			}
		
			// DBで実行するSQL文を「prepareStatement」インスタンスに格納する
			PreparedStatement ps = db_con.prepareStatement(sql);
			// ユーザIDを指定している場合は、条件指定する
			if(id != "") {
				ps.setString(1, id);
			}
			
			// SQL文の実行結果を格納
			ResultSet rs = ps.executeQuery();
			
			// 検索結果格納のため、Beanクラスをインスタンス
			UserInfoBean resultUserInfo = new UserInfoBean();
					
			// SQL文の実行結果件数分ループ処理
			while(rs.next()) {
				// ユーザIDと名前をBeanクラスへセット
				resultUserInfo.setUser_id(rs.getString("ID"));
				resultUserInfo.setUser_name(rs.getString("NAME"));
				
				// リストにBeanクラスごと格納
				array_userinfo.add(resultUserInfo);
				
				//Beanクラスを初期化
				resultUserInfo = new UserInfoBean();
				}
			
		} 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;
	}
}


・検索画面(usersearch.jsp)

<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ page import="bean.UserInfoBean" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ユーザ検索画面</title>
</head>
<body>

<form action="./SelectUserServlet" method="post">
	<p>
	ユーザID:<input type="text" name="userid">
	</p>
	
	<input type="submit" value="検索">
	
</form>

<p>#################### 検索結果 ####################</p>

<!-- 検索結果の配列をインスタンスし、件数分ループ処理で表示する。 -->
<%
	ArrayList<UserInfoBean> user_list = (ArrayList<UserInfoBean>)request.getAttribute("user_list");
	
	if (user_list == null || user_list.size() == 0){
%>
	<br>
	<P>検索結果なし</P>
	<br>
<%	} else { %>
	<table border="1">
		<tr>
			<th>ID</th>
			<th>名前</th>
		</tr>
<%		for(int i = 0; i < user_list.size(); i++){ %>
		<tr>
			<th><%= user_list.get(i).getUser_id() %></th>
			<th><%= user_list.get(i).getUser_name() %></th>
		</tr>
		<% } %>
	</table>
	<% } %>

</body>
</html>

・エラー画面(error.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>エラーページ</title>
</head>
<body>
<%=request.getAttribute("error") %>

</body>
</html>

■実行結果

・デフォルト画面


・全件検索(ユーザID指定なし)


・ユーザID指定(存在するID:12348)


・ユーザID指定(存在しないID:11123)

コメント

タイトルとURLをコピーしました