■作成するプログラムの概要
・ユーザ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 | ユーザID | NOT NULL | 主キー | CHAR(5) |
NAME | ユーザ名 | NOT NULL | – | VARCHAR2(50) |
■ユーザ情報テーブルのデータ情報
ユーザ情報テーブルのデータについて、あらかじめ、以下の情報を登録しておく。
ID | NAME |
---|---|
12345 | Mike |
12346 | Taro |
12347 | Jon |
12348 | Nuncy |
12349 | Hanako |
■画面仕様
・検索画面(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)
コメント