■作成するプログラムの概要
・画面にて「ユーザID」および「ユーザ名」を入力する。
・入力したユーザIDからテーブルのユーザ名を更新(Update)する。
・更新が完了した場合、検索画面に遷移する。
■フローチャート
▼全体概要
今回は、赤およびオレンジのオブジェクトについて実装する。
検索処理については、「■参考」を参照。
▼ユーザ更新サーブレットクラスの処理
・GET処理
・POST処理
▼ユーザ更新処理
■プログラム仕様
▼サーブレットクラス(UpdateUserServlet.java)
(1)GET処理
インプット | 処理内容 | アウトプット |
---|---|---|
【URL】 *1 | 更新画面へ遷移する。 | – |
*1:URL(/WEB-INF/jsp/userupdate.jsp)
(2)POST処理
インプット | 処理内容 | アウトプット |
---|---|---|
【フォーム情報】 ユーザID ユーザ名 | 【フォーム情報】を取得する。 | – |
– | 【try】 | – |
– | Beanクラスをインスタンスする。 | – |
– | Beanクラスに入力したユーザIDとユーザ名をセットする。 | – |
– | ユーザ更新処理を実行する。 | – |
【URL】 *1 | 検索画面へ遷移する。 | – |
– | 【catch】 | – |
【URL】 *2 | 何らかの理由で失敗した場合、 エラーページにエラー文を渡して表示する。 | 【メッセージ】 エラーメッセージ |
*1:URL(/WEB-INF/jsp/usersearch.jsp)
*2:URL(/WEB-INF/jsp/error.jsp)
▼更新処理(UpdateUserDAO.java)
(1)インスタンス処理
引数:なし
戻り値:new 更新処理クラス
インプット | 処理内容 | アウトプット |
---|---|---|
– | コードの簡略化を行うため、 インスタンスオブジェクトの生成時、 新規オブジェクトを返却する。 | 【オブジェクト】 new 更新処理クラス |
(2)更新処理
引数:Beanクラス
インプット | 処理内容 | アウトプット |
---|---|---|
【Beanクラス】 ユーザID ユーザ名 | 初期値をセットする。 ・DB接続=null ・ユーザID=BeanクラスのユーザID ・ユーザ名=Beanクラスのユーザ名 | – |
– | 【try】 | – |
– | jdbcドライバを読み込む。(OracleDB)(*1) | – |
【DB情報】 ユーザ名 パスワード PDB情報 | DBへ接続する。(*2) | – |
– | 実行するSQL文をセットする。 | – |
– | SQLを実行する。 | – |
– | 【catch】sql実行失敗 | – |
– | エラーメッセージをコンソールに出力する。 | 【メッセージ】 エラーメッセージ |
– | 【catch】JDBCドライバ関連エラー | – |
– | エラーメッセージをコンソールに出力する。 | 【メッセージ】 エラーメッセージ |
– | 【finally】 | – |
– | 【条件分岐】 ▼DB接続中の場合 DBとの接続を切る。 | – |
(*1)jdbcドライバを読み込む。
以下のようにドライバ(ojdbc10.jar)を配置する。
なお、ドライバ(ojdbc10.jar)は、Oracle19cのものを使用し、Oracle社からダウンロードしたものを使用する。
(*2)DBへ接続する
DBへの接続は、以下の2通りのうち、Thin接続にて行う。
・Thin接続
jdbc:oracle:thin:<ユーザ名>/<パスワード>@//<ホスト名:ポート番号>/<PDB名>
・OCI接続(クライアント側にオラクルクライアントをインストールする必要あり)
jdbc:oracle:oci:<ユーザ名>/<パスワード>@<サービス名またはPDB名>
■テーブル定義
ユーザ情報テーブルの定義情報を以下に示す。
カラム名(物理) | カラム名(論理) | Null判定 | キー | 型 |
---|---|---|---|---|
ID | ユーザID | NOT NULL | 主キー | CHAR(5) |
NAME | ユーザ名 | NOT NULL | – | VARCHAR2(50) |
■ユーザ情報テーブルのデータ情報
ユーザ情報テーブルのデータについて、あらかじめ、以下の情報を登録しておく。
ID | NAME |
---|---|
11111 | Hoge |
12345 | Mike |
12346 | Taro |
12347 | Jon |
12348 | Nuncy |
12349 | Hanako |
■画面仕様
・ユーザ更新画面
①「ユーザID」および「ユーザ名」を入力し、「更新」ボタンを押下して更新処理を実行する。
なお、入力値の制約は以下の通り。
「ユーザID」:5桁以下で入力必須
「ユーザ名」:入力必須
■サンプルコード
▼サーブレットクラス(UpdateUserServlet.java)
package servlet;
import java.io.IOException;
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.UpdateUserDAO;
@WebServlet("/UpdateUserServlet")
public class UpdateUserServlet 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/userupdate.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_userName = request.getParameter("username");
try{
// Beanクラスのインスタンス
UserInfoBean input_user = new UserInfoBean();
// Beanクラスに入力したユーザIDをセットする
input_user.setUser_id(input_userID);
input_user.setUser_name(input_userName);
// 更新処理実行
UpdateUserDAO.getInstance().UpdateUser(input_user);
// 更新処理が問題なく完了した場合は検索画面のJSPに遷移する
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)
Beanクラスは「■参考」のユーザ検索処理のものを使用する。
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() {
}
}
▼ユーザ更新処理(UpdateUserDAO.java)
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import bean.UserInfoBean;
public class UpdateUserDAO {
// インスタンスオブジェクトを返却してコード簡略化
public static UpdateUserDAO getInstance() {
return new UpdateUserDAO();
}
public void UpdateUser(UserInfoBean input_user) {
// 初期値をセット
Connection db_con = null;
String id = input_user.getUser_id();
String name = input_user.getUser_name();
try {
// jdbcドライバの読み込み(OracleDB)
Class.forName("oracle.jdbc.driver.OracleDriver");
// DB接続
db_con = DriverManager.getConnection(
"jdbc:oracle:thin:ユーザ名/パスワード@//ホスト名:ポート番号/PDB名");
// 実行するSQL文をセット(空文字)
String sql = "UPDATE usertbl SET NAME = ? WHERE ID = ?";
// DBで実行するSQL文を「prepareStatement」インスタンスに格納する
PreparedStatement ps = db_con.prepareStatement(sql);
// 更新するIDと名前をセットする
ps.setString(1, name);
ps.setString(2, id);
// SQL実行
ps.executeUpdate();
} 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) {
try {
db_con.close();
} catch (SQLException e) {
System.out.println("sqlクローズ失敗");
e.printStackTrace();
}
}
}
}
}
▼更新画面(userupdate.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>
<form action="./UpdateUserServlet" method="post">
<p>
更新対象のユーザID:<input type="text" name="userid" maxlength="5" required>
<br>
更新後のユーザ名:<input type="text" name="username" required required>
</p>
<input type="submit" value="更新">
</form>
</body>
</html>
■実行結果
・更新画面
ユーザID:12345
ユーザ名:Hoge
・「更新」ボタンを押下後、検索画面へ遷移
・検索処理を実行すると、先ほどのユーザID「12345」が、ユーザ名「Hoge」で更新されている。