JSP 17スチールデータベースプログラミング(JDBC、DBPP)

54648 ワード

データベースのプログラミング順序


  • 接続:データベース
  • を使用するには、データベースに接続する必要があります.
  • データベースにデータを挿入/変更/削除します.
    完了するまで2~3回目の処理を繰り返します.
  • 必要なタスクが完了すると、接続
  • が閉じる.
    DBはコンセプトです!
    <条件>
    1.共有
    2.通行
    3.保存
    4.運営

    JDBC(Java Database Connectivity)


  • JavaでDBプログラミングを行うためのAPI

  • JDBC APIアプリケーションの基本構成


  • Javaは、DBMSタイプを考慮することなく、データベース操作を処理するためにJDBC APIを使用することができる.
  • JDBCドライバ


  • DBMSとの通信を担当するJavaクラス

  • 各DBMSには適切なJDBCドライバが必要です
    ->通常jarファイルとして提供

  • JDBCドライバのロード
    **ロード?HDDからメモリへのアップロード
  • コードのロード
    Class.forName(「JDBCドライバクラスのフルネーム」);
    メインDBMSのJDBCドライバ
  • oracle:oracle.jdbc.driver.OracleDriver
  • MySQL : com.mysql.jdbc.Driver
  • MS SQLサーバー:com.microsoft.sqlserver.jdbc.SQLServerDriver
  • JDBC URL
  • DBMSを接続するための識別値
  • フォーマットは、
  • JDBCドライバ
  • に依存する.
  • の一般的な構成
    ->jdbc:[DBMS]:[データベース識別子]
  • 構成
  • 主要DBMSのJDBC URL
    Oracle: jdbc:oracle:thin:@HOST:PORT:SID
    MySQL : jdbc:mysql://HOST[:PORT]/DBNAME[?param=value& param1...]
    MS SQL : jdbc:sqlserver://HOST[:PORT];databaseName=DB
  • ->oracleドライバにはスリムドライバとOCIドライバがあります.スリムドライバはJava言語のみで実現されるJDBCドライバで、JDKをインストールするだけでどこでも使用できます.

    JDBCプログラミングコード順


  • JDBCドライバのロード
    Class.forName("oracle.jdbc.driver.OracleDriver");
    ->バック・メソッド:Oracle JDBCドライバはOracle~

  • データベース接続の作成(接続オブジェクト)
    ->順序:1)jdbcDriver 2)アカウントID 3)パスワード
    String jdbcDriver = "jdbc:oracle:thin:@localhost:1521:xe";
    String dbUser=「ユーザーアカウント名」
    String dbPass="パスワード";
  • ->コネクタオブジェクトにこの3つを含めます.
    conn = DriverManager.getConnection(jdbcDriver,dbUser,dbPass);

  • 作成ステータス
    stmt = conn.createStatement();

  • クエリーの実行
    rs = stmt.excuteQuery(query);

  • クエリ実行結果出力{{くえりじっこうけっか:しゅつりょく}}
    ->while(rs.next()の使用

  • 使用したStatementオブジェクトを終了
    重要だ!オフにしないと、メモリがいっぱいになり、接続オブジェクトが切断されます.
    if(rs!=null)try{rs.close();}catch(SQLException ex){}
    if(stmt!=null)try{stmt.close();}catch(SQLException ex){}

  • コネクタオブジェクトを終了
    if(conn!=null)try{conn.close();}catch(SQLException ex){}
  • viewMemberList.jsp

    <%@page import="java.sql.SQLException"%>
    <%@page import="java.sql.ResultSet"%>
    <%@page import="java.sql.Statement"%>
    <%@page import="java.sql.Connection"%>
    <%@page import="java.sql.DriverManager"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    <!DOCTYPE html>
    <html>
    <head>
    <title>회원 목록</title>
    </head>
    <body>
    MEMBER 테이블의 내용<br>
    <table width="100%" border="1">
    	<tr>
    		<th>이름</th><th>아이디</th><th>이메일</th>
    	</tr>
    <%
    //1.JDBC 드라이버 로딩
    Class.forName("oracle.jdbc.driver.OracleDriver");
    //-->오라클 JDBC 드라이버는 오라클꺼다~~
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    
    try{
    //2.데이터베이스 커넥션(연결 객체) 생성
    //jdbcDriver? 2)계정아이디? 3)비밀번호?
    String jdbcDriver = "jdbc:oracle:thin:@localhost:1521:xe";
    String dbUser = "jspexam";
    String dbPass = "java";
    
    	String query = "SELECT MEMBERID,PASSWORD,NAME,EMAIL FROM MEMBER";
    	conn = DriverManager.getConnection(jdbcDriver,dbUser,dbPass);
    //Connection 객체에 위에서 만든 세개 담기
    
    //3.Statement 생성
    	stmt = conn.createStatement();
    
    //4.쿼리 실행
    	rs = stmt.executeQuery(query);
    
    //5.쿼리 실행 결과 출력
    	while(rs.next()){
    		out.print("<tr>");
    		out.print("<td><a href='viewMember_pool.jsp?memberId="+rs.getString("MEMBERID")+"'>"+rs.getString("NAME")+"</td>");
    		out.print("<td>"+rs.getString("MEMBERID")+"</td>");
    		out.print("<td>"+rs.getString("EMAIL")+"</td>");
    		out.print("</tr>");
    	}
    
    }catch(SQLException ex){
    	out.print(ex.getMessage());
    	ex.printStackTrace();
    }finally{
    //6.사용한 Statement객체 종료 (중요!!! 닫지않으면 메모리 꽉차서 Connection객체와 연결 끊어짐)
    	if(rs!=null)try{rs.close();}catch(SQLException ex){}
    	if(stmt!=null)try{stmt.close();}catch(SQLException ex){}
    //7.커넥션 객체 종료
    	if(conn!=null)try{conn.close();}catch(SQLException ex){}
    }
    %>
    </table>
    </body>
    </html>
    

    updateForm.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    <!DOCTYPE html>
    <html>
    <head>
    <title>이름 변경 폼</title>
    </head>
    <body>
    <form method="post" action="update.jsp">
    	<table border="1">
    		<tr>
    			<td>아이디</td><td><input type="text" name="memberId" size="10" /></td>
    			<td>이름</td>
    			<td><input type="text" name="name" size="10" /></td>
    		</tr>
    		<tr>
    			<td colspan="4"><input type="submit" value="변경" /></td>
    		</tr>
    	</table>
    </form>
    </body>
    </html>
    Statementオブジェクトを使用したクエリーの実行
  • Connectionオブジェクトを作成したら、Connectionオブジェクトから接続します.createStatement()メソッドを使用してStatementを作成し、Queryを実行できます.
  • ステータスオブジェクトが提供する方法を使用してクエリーを実行します.
    ->insert、update、delete文の実行時にint executeUpdate(String query)メソッドを使用する
    ===>実行結果変更のレコード数を返します.
  • ->選択文の実行時にResultSet executeQueryメソッドを使用する
    ===>ResultSetは結果値を返します!
    ResultSetでの値の検索

  • next()メソッドを使用してデータをクエリーするかどうかを確認します(カーソルが移動しています)


  • データ・クエリーの主な方法
    ->ResultSetは、現在のカーソルがある行からデータを取得するget~~()形式の方法を提供します.
    ex) getString(), getInt(),getLong()...
  • ResultSetでのデータの問合せコード
  • 単行処理(if文を使用)
  • マルチライン処理(whie文を使用)
  • PreparedStatement処理の使用
  • SQLのフレームワークを事前に定義し、値を指定します.
    stmt = conn.prepareStatement(
    "insert into MEMBER (MEMBERID, NAME, EMAIL) values (?, ?, ?)");
    pstmt.setString(1, “a001”);//最初の疑問符の値の指定
    Pstmt.setString(2,金銀台);//2番目の疑問符の値を指定
    pstmt.executeUpdate()
  • なぜPreparedStatementを使用するのですか?
  • は、同じクエリを繰り返し実行する速度
  • を向上させる.

    update.jsp

    <%@page import="java.sql.DriverManager"%>
    <%@page import="java.sql.SQLException"%>
    <%@page import="java.sql.Statement"%>
    <%@page import="java.sql.Connection"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    <%
    	request.setCharacterEncoding("UTF-8");
    
    	//파라미터 목록 중 memberId 및 name을 get함
    	String memberId = request.getParameter("memberId");
    	String name = request.getParameter("name");
    	
    	out.print("memberId : "+ memberId + ", name : " + name + "<br>");
    	
    	//jdbc 드라이버 로딩(메모리에 올림)
    	Class.forName("oracle.jdbc.driver.OracleDriver");
    	
    	//커넥션 객체 선언
    	Connection conn = null;
    	//Statement 객체 선언
    	Statement stmt = null;
    	
    	String query = "UPDATE MEMBER SET NAME = '"+name+"' WHERE MEMBERID = '"+memberId+"'";
    	int updateCount = 0;
    	
    	try{
    		String jdbcDriver = "jdbc:oracle:thin:@localhost:1521:xe";
    		String dbUser = "jspexam";
    		String dbPass = "java";
    		
    		//커넥션 객체 생성
    		conn = DriverManager.getConnection(jdbcDriver,dbUser,dbPass);
    		
    		//Statement 객체 생성
    		stmt = conn.createStatement();
    		
    		//insert,update,delete --> executeUpdate()
    		//select --> executeQuery()
    		updateCount = stmt.executeUpdate(query);
    	}catch(SQLException ex){
    		out.print(ex.getMessage());		
    	}finally{
    		if(stmt!=null)try{stmt.close();}catch(SQLException ex){}
    		if(conn!=null)try{conn.close();}catch(SQLException ex){}		
    	}
    	if(updateCount>0){
    		out.print(memberId + "의 이름을 " + name + "(으)로 변경");
    	}else{
    		out.print(memberId + " 아이디가 없음");
    	}
    	
    	
    %>

    insertForm.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    <!DOCTYPE html>
    <html>
    <head>
    <title>MEMBER 테이블에 레코드 입력</title>
    </head>
    <body>
    <form method="post" action="insert.jsp">
    	<table border="1">
    		<tr>
    			<th>아이디</th>
    			<td><input type="text" name="memberid" size="10"></td>
    			<th>비밀번호</th>
    			<td><input type="password" name="password" size="10"></td>
    		</tr>
    		<tr>
    			<th>이름</th>
    			<td><input type="text" name="name" size="10"></td>
    			<th>이메일</th>
    			<td><input type="text" name="email" size="10"></td>
    		</tr>
    		<tr>
    			<td colspan="4"><input type="submit" value="입력" /></td>
    		</tr>
    	</table>
    </form>
    </body>
    </html>

    insert.jsp

    <%@page import="java.sql.PreparedStatement"%>
    <%@page import="java.sql.SQLException"%>
    <%@page import="java.sql.DriverManager"%>
    <%@page import="java.sql.Statement"%>
    <%@page import="java.sql.Connection"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    <%
    	request.setCharacterEncoding("UTF-8");
    
    	String memberid = request.getParameter("memberid");
    	String password = request.getParameter("password");
    	String name = request.getParameter("name");
    	String email = request.getParameter("email");
    	
    	out.print(memberid + ", " + password + ", " + name + ", " + email);
    	
    	Class.forName("oracle.jdbc.driver.OracleDriver");
    	
    	//커넥션 객체 선언
    	Connection conn = null;
    	//Statement 객체 선언
    	PreparedStatement pstmt = null;
    	
    	String query = "INSERT INTO MEMBER(MEMBERID,PASSWORD,NAME,EMAIL) "
    			+ " VALUES(?,?,?,?)";
    	
    	try{
    		String jdbcDriver = "jdbc:oracle:thin:@localhost:1521:xe";
    		String dbUser = "jspexam";
    		String dbPass = "java";
    		
    		//커넥션 객체 생성
    		conn = DriverManager.getConnection(jdbcDriver,dbUser,dbPass);
    		
    		//Statement 객체 생성
    		pstmt = conn.prepareStatement(query);
    		pstmt.setString(1, memberid);
    		pstmt.setString(2, password);
    		pstmt.setString(3, name);
    		pstmt.setString(4, email);
    		
    		//insert,update,delete --> executeUpdate()
    		//select --> executeQuery()
    		pstmt.executeUpdate();
    	}catch(SQLException ex){
    		out.print(ex.getMessage());		
    	}finally{
    		if(pstmt!=null)try{pstmt.close();}catch(SQLException ex){}
    		if(conn!=null)try{conn.close();}catch(SQLException ex){}		
    	}
    	
    %>
    
    <!DOCTYPE html>
    <html>
    <head>
    <title>입력</title>
    </head>
    <body>
    	MEMBER 테이블에 새로운 레코드를 입력했습니다.
    </body>
    </html>
    作成
  • javabeanクラス
  • Mem.java

    package dto;
    //자바빈 클래스
    public class Mem {
    	private String memberid;
    	private String password;
    	private String name;
    	private String email;
    	
    	//기본생성자
    	public Mem() {
    		super();
    	}
    
    	public String getMemberid() {
    		return memberid;
    	}
    
    	public void setMemberid(String memberid) {
    		this.memberid = memberid;
    	}
    
    	public String getPassword() {
    		return password;
    	}
    
    	public void setPassword(String password) {
    		this.password = password;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public String getEmail() {
    		return email;
    	}
    
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	
    	
    }
    

    接続プール


  • 1つの方法は、データベースに関連付けられたコネクタを事前に作成してプールに格納し、必要に応じてプールから書き込み、使用終了後にプールに戻すことです.

  • 特長

  • あらかじめインタフェースが作成されているため、ユーザはDBを使用するたびに、毎回作成するよりも高速であることを保証することができる.

  • また、コネクタの最大作成数を制御することもできるので、多くのユーザーが集まっても過負荷を防止できます.
  • 接続プールのオープンソースコードに代表的なDBPPとC 3 P 0があり、ここではDBPPが用いられる.DBCPはApacheサイトで入手できます.
  • の他にDBPPで使用するPool Commons Poolも必要です.
  • に追加されたログ記録用のCommonsログも必要です.
  • DBCAPI接続プールの使用


    1.デマンド・ライブラリ

    インストール方法
    https://mvnrepository.com/から
    commons-dbcp検索
    Apache Commons DBPP-2.9.0をクリック
    jarをクリックしてダウンロード
    commons-pool検索
    Apache Commons Pool-2.90をクリックします
    jarをクリックしてダウンロード
    commons-ログ検索
    Apache Commons Logging-1.2をクリック
    jarをクリックしてダウンロード
    ダウンロードしたファイルをコピーしてWEB-INFlibに貼り付ける
    2.データベースの設定
    1)アカウントの作成と承認
    2)テーブルの作成
  • DBPP設定クラス
  • DBCPInit.java

    package jdbc;
    
    import java.sql.DriverManager;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    
    import org.apache.commons.dbcp2.ConnectionFactory;
    import org.apache.commons.dbcp2.DriverManagerConnectionFactory;
    import org.apache.commons.dbcp2.PoolableConnection;
    import org.apache.commons.dbcp2.PoolableConnectionFactory;
    import org.apache.commons.dbcp2.PoolingDriver;
    import org.apache.commons.pool2.impl.GenericObjectPool;
    import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
    
    //서블릿 클래스
    public class DBCPInit extends HttpServlet {
    	@Override
    	public void init() throws ServletException{
    		//JDBC Driver를 로딩
    		loadJDBCDriver();
    		//커넥션풀을 초기화
    		initConnectionPool();
    	}
    	
    	//JDBC Driver를 로딩
    	private void loadJDBCDriver() {
    		try {
    			//커넥션풀이 내부에서 사용할 JDBC Driver를 로딩함
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    		}catch(ClassNotFoundException ex){
    			throw new RuntimeException("fail to load JDBC Driver", ex);
    		}
    	}
    	//커넥션풀을 초기화
    	private void initConnectionPool() {
    		try {
    			//의국에서 새로운 외과 의사를 생성할 때 필요한 외과가 있어야 함
    			//커넥션풀에서 새로운 커넥션을 생성할 때 사용할 커넥션 팩토리를 생성 
    			ConnectionFactory connFactory = 
    					new DriverManagerConnectionFactory(
    							"jdbc:oracle:thin:@localhost:1521:xe"
    							,"jspexam"
    							,"java"
    							);
    			//DBCP는 커넥션풀에 커넥션을 보관할 때 PoolableConnection을 사용
    			//이 Class는 내부적으로 실제 Connection을 담고 있음
    			//커넥션풀을 관리
    			PoolableConnectionFactory poolableConnFactory = 
    					new PoolableConnectionFactory(connFactory, null);
    			
    			//커넥션이 유효한지 여부 검사 시 사용할 쿼리
    			poolableConnFactory.setValidationQuery("select 1");
    			//커넥션 풀의 설정 정보 생성
    			GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    			//유휴 커넥션 검사 주기(1/1000초)
    			//놀고 있는 커넥션을 풀에서 제거하는 시간 기준 (5분)
    			poolConfig.setTimeBetweenEvictionRunsMillis(1000L * 60L * 5L);
    			//풀에 보관중인 커넥션이 유효한지 검사할지 여부
    			poolConfig.setTestWhileIdle(true);
    			//커넥션 최소 개수
    			poolConfig.setMinIdle(4);
    			//커넥션 최대 개수
    			poolConfig.setMaxTotal(50);
    			
    			//커넥션풀의 설정 정보를 생성. 팩토리와 커넥션풀 설정을 파라미터로 받음
    			GenericObjectPool<PoolableConnection> connectionPool = 
    					new GenericObjectPool<>(poolableConnFactory, poolConfig);
    			//풀러블커넥션팩토리에도 생성이 된 커넥션 풀을 연결
    			poolableConnFactory.setPool(connectionPool);
    			//커넥션풀을 제공하는 JDBC 드라이버를 등록함
    			Class.forName("org.apache.commons.dbcp2.PoolingDriver");
    			PoolingDriver driver = (PoolingDriver)DriverManager.getDriver("jdbc:apache:commons:dbcp:");
    			//커넥션 풀 드라이버에 생성된 커넥션풀을 등록
    			//jdbc:apache:commons:dbcp:ddit
    			driver.registerPool("ddit", connectionPool);
    		}catch(Exception e) {
    			throw new RuntimeException(e);
    			
    		}//end try
    	}//end initConnectionPool();
    }
    
  • レベルインタフェース

    ConnectionProvider.java

    package jdbc;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    //커넥션을 제공해주는 클래스
    public class ConnectionProvider {
    	public static Connection getConnection() throws SQLException{
    		return DriverManager.getConnection("jdbc:apache:commons:dbcp:ddit");
    	}
    }
    
  • JDBCUtilクラスを作成し、使用を終了するオブジェクト
  • を容易にします.

    JDBCUtil.java

    package jdbc;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    //하나의 클래스에 같은 이름의 메소드를 여러번 사용 가능?
    //오버로딩
    
    public class JdbcUtil {
    	public static void close(ResultSet rs) {
    		if(rs!=null) try {rs.close();}catch(SQLException ex) {}
    	}
    	public static void close(Statement stmt) {
    		if(stmt!=null) try {stmt.close();}catch(SQLException ex) {}
    	}
    	public static void close(Connection conn) {
    		if(conn!=null) try {conn.close();}catch(SQLException ex) {}
    	}
    	public static void close(PreparedStatement pstmt) {
    		if(pstmt!=null) try {pstmt.close();}catch(SQLException ex) {}
    	}
    	public static void rollback(Connection conn) {
    		if(conn!=null) try {conn.close();}catch(SQLException ex) {}
    	}
    }
    

    JSP Servlet

  • 動的Webアプリケーションコンポーネント
  • .JAva拡張子
  • クライアントの要求に動的に応答しhtmlを使用する
  • に応答する.
  • java threadを使用すると、動作->サーバへの低負荷
  • を実現できます.
  • MVCモードでコントローラ(JSPビュー用)
  • として使用
    DBCPを使用してリストを出力する

    viewMemberUsingPool.jsp

    <%@page import="jdbc.ConnectionProvider"%>
    <%@page import="jdbc.JdbcUtil"%>
    <%@page import="java.sql.SQLException"%>
    <%@page import="java.sql.DriverManager"%>
    <%@page import="java.sql.ResultSet"%>
    <%@page import="java.sql.Statement"%>
    <%@page import="java.sql.Connection"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    <!DOCTYPE html>
    <html>
    <head>
    <title>Insert title here</title>
    </head>
    <body>
    MEMBER 테이블의 내용<br>
    <table width="100%" border="1">
    	<tr>
    		<th>이름</th><th>아이디</th><th>이메일</th>
    	</tr>
    <%
    //1.JDBC 드라이버 로딩
    	Class.forName("oracle.jdbc.driver.OracleDriver");
    	//-->오라클 JDBC 드라이버는 오라클꺼다~~
    	Connection conn = null;
    	Statement stmt = null;
    	ResultSet rs = null;
    
    try{
    //2.데이터베이스 커넥션(연결 객체) 생성
    //1)jdbcDriver? 2)계정아이디? 3)비밀번호?
    	String jdbcDriver = "jdbc:apache:commons:dbcp:ddit";
    	String query = "SELECT MEMBERID,PASSWORD,NAME,EMAIL FROM MEMBER";
    // 	conn = DriverManager.getConnection(jdbcDriver); 이제 이거 안씀
    	conn = ConnectionProvider.getConnection();
    
    //3.Statement 생성
    	stmt = conn.createStatement();
    
    //4.쿼리 실행
    	rs = stmt.executeQuery(query);
    
    //5.쿼리 실행 결과 출력
    	while(rs.next()){
    		out.print("<tr>");
    		out.print("<td><a href='viewMember.jsp?memberId="+rs.getString("MEMBERID")+"'>"+rs.getString("NAME")+"</td>");
    		out.print("<td>"+rs.getString("MEMBERID")+"</td>");
    		out.print("<td>"+rs.getString("EMAIL")+"</td>");
    		out.print("</tr>");
    	}
    
    }catch(SQLException ex){
    	out.print(ex.getMessage());
    	ex.printStackTrace();
    }finally{
    //6.사용한 Statement객체 종료 
    	JdbcUtil.close(rs);
    	JdbcUtil.close(stmt);
    //7.커넥션 객체 종료 -> dbcp이니까 커넥션 객체를 커넥션 풀로 반환
    	JdbcUtil.close(conn);
    }
    %>
    </table>
    </body>
    </html>
    上のリストのaラベルをクリックすると詳細画面が移動します

    viewMember.jsp

    <%@page import="dto.Mem"%>
    <%@page import="jdbc.ConnectionProvider"%>
    <%@page import="jdbc.JdbcUtil"%>
    <%@page import="java.sql.DriverManager"%>
    <%@page import="java.sql.SQLException"%>
    <%@page import="java.sql.ResultSet"%>
    <%@page import="java.sql.Statement"%>
    <%@page import="java.sql.Connection"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 
    <%
    	String memberId = request.getParameter("memberId");
    %>
    <!DOCTYPE html>
    <html>
    <head>
    <title>회원 정보</title>
    </head>
    <body>
    <%
    	//jdbc 드라이버 로딩(메모리에 올림)
    	Class.forName("oracle.jdbc.driver.OracleDriver");
    
    	Connection conn = null;
    	Statement stmt = null;
    	ResultSet rs = null;
    	Mem memVO = new Mem();
    	
    	String query = "SELECT MEMBERID,PASSWORD,NAME,EMAIL FROM MEMBER "
    				+ " WHERE MEMBERID = '"+memberId+"'";
    		
    	try{
    // 		conn = DriverManager.getConnection(
    // 				"jdbc:oracle:thin:@localhost:1521:xe",
    // 				"jspexam",
    // 				"java");
    		conn = ConnectionProvider.getConnection();
    		stmt = conn.createStatement();
    		rs = stmt.executeQuery(query);
    		if(rs.next()){
    			memVO.setMemberid(rs.getString("MEMBERID"));
    			memVO.setName(rs.getString("NAME"));
    			memVO.setPassword(rs.getString("PASSWORD"));
    			memVO.setEmail(rs.getString("EMAIL"));
    		}
    		out.print("memVO : " + memVO.toString());
    	}catch(SQLException ex){
    		out.print(ex.getMessage());
    	}finally{
    		//6.사용한 Statement객체 종료 
    		JdbcUtil.close(rs);
    		JdbcUtil.close(stmt);
    		//7.커넥션 객체 종료 -> dbcp이니까 커넥션 객체를 커넥션 풀로 반환
    		JdbcUtil.close(conn);
    	}
    %>
    <c:set var="memVO" value="<%=memVO%>" scope="request" />
    <!-- scope="request" 면 하나의 객체를 공유해서 쓸수있다 -->
    <table border="1">
    	<tr>
    		<th>아이디 </th><td>${memVO.memberid}</td>
    	</tr>
    	<tr>
    		<th>비밀번호 </th><td>${memVO.password}</td>
    	</tr>
    	<tr>
    		<th>이름</th><td>${memVO.name}</td>
    	</tr>
    	<tr>
    		<th>이메일</th><td>${memVO.email}</td>
    	</tr>
    </table>
    
    
    
    </body>
    </html>