■作成するプログラムの概要
・画面にて「ユーザ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」で更新されている。





コメント