본문 바로가기

5월 ~ 7월) 웹/servlet

53Day - DataSourceServlet / JndiServlet/ ojdbc11.jar/ context.xml/ StudentDisplayOldServlet & StudentDisplayNewServlet / &$$ studentdao &$$ GuestDAO & JdbcDAO & StudentDAO / GuestDTO &$$ StudentDTO/

ojdbc11.jar

lib 에 ojdbc11 넣기.

 

 


DataSourceServlet

package xyz.itwill.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;

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 org.apache.tomcat.dbcp.dbcp2.BasicDataSource;

//DBCP(DataBase Connection Pool) 객체 : 다수의 Connection 객체를 미리 생성하여 저장하고 제공하기 위한 객체
// => 일반적으로 DataSource 인터페이스를 상속받은 자식클래스로 객체 생성

//Apache 그룹에서 제공하는 tomcat-dbcp 라이브러리의 클래스를 이용하여 DBCP 객체를 생성해 미리 생성된 
//Connection 객체를 제공받아 Connection 객체의 정보를 클라이언트에게 전달하여 응답하는 서블릿
@WebServlet("/dbcp.itwill")
public class DataSourceServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();

		//BasicDataSource 객체(DataSource 객체) 생성
		BasicDataSource dataSource=new BasicDataSource();
		
		//BasicDataSource 객체(DataSource 객체)에 저장될 다수의 Connection 객체를 생성하기 
		//위한 정보를 메소드를 호출하여 변경 처리 - DataSource 객체의 필드값 변경
		dataSource.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
		dataSource.setUsername("scott");
		dataSource.setPassword("tiger");
		dataSource.setInitialSize(10);//최초 생성될 Connection 객체의 갯수 변경
		dataSource.setMaxIdle(10);//대기상태의 Connection 객체의 최대 갯수 변경
		dataSource.setMaxTotal(15);//생성 가능한 Connection 객체의 최대 갯수 변경
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>DBCP(DataBase Connection Pool)</h1>");
		out.println("<hr>");
		try {
			//DataSource.getConnection() : DataSource 객체에 저장된 다수의 Connection 객체중
			//하나를 제공받아 반환하는 메소드
			Connection con=dataSource.getConnection();
			out.println("<p>con = "+con+"</p>");
			out.println("<hr>");
			out.println("<h3>Connection 객체 제공 후</h3>");
			//DataSource.getNumIdle() : : DataSource 객체에 저장된 다수의 Connection 객체 중
			//대기상태의 Connection 객체의 갯수를 반환하는 메소드
			out.println("<p>Idle Connection Number = "+dataSource.getNumIdle()+"</p>");
			//DataSource.getNumActive() : : DataSource 객체에 저장된 다수의 Connection 객체 중
			//사용중인 Connection 객체의 갯수를 반환하는 메소드
			out.println("<p>Active Connection Number = "+dataSource.getNumActive()+"</p>");
			out.println("<hr>");
			con.close();//Connection 객체 제거 - DataSource 객체에서 Connection 객체를 대기상태로 변경
			out.println("<h3>Connection 객체 제거 후</h3>");
			out.println("<p>Idle Connection Number = "+dataSource.getNumIdle()+"</p>");
			out.println("<p>Active Connection Number = "+dataSource.getNumActive()+"</p>");
			
			dataSource.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		out.println("</body>");
		out.println("</html>");
	}
}

 


 

 


JndiServlet

package xyz.itwill.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
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 javax.sql.DataSource;

//JNDI(Java Naming Directory Interface) 서비스 : WAS 프로그램에 의해 관리되는 객체를 미리 
//생성하여 저장하고 웹프로그램에서 객체가 필요한 경우 WAS 프로그램에 등록된 객체의 이름을  
//이용하여 객체를 제공받아 사용하기 위한 서비스
// => WAS 프로그램에 의해 관리되는 객체에 대한 정보를 src/main/webapp/META-INF/context.xml 파일에 작성

//WAS 프로그램에 등록된 DataSource 객체를 제공받아 DataSource 객체에 저장된 다수의 Connection
//객체 중 하나를 제공받아 Connection 객체의 정보를 클라이언트에게 전달하여 응답하는 서블릿
@WebServlet("/jndi.itwill")
public class JndiServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		try {
			//InitialContext 객체 : JNDI 서비스를 제공하는 객체
			//InitialContext.lookup(String name) : 매개변수로 전달받은 이름의 객체를 반환하는 메소드
			// => 검색된 객체는 Object 객체로 반환하므로 반드시 명시적 객체 형변환 처리하여 사용
			// => 매개변수로 전달받아 이름의 객체가 없는 경우 NamingException 발생 - 예외처리
			DataSource dataSource=(DataSource)new InitialContext().lookup("java:comp/env/jdbc/oracle");
			
			Connection con=dataSource.getConnection();

			out.println("<!DOCTYPE html>");
			out.println("<html>");
			out.println("<head>");
			out.println("<meta charset='UTF-8'>");
			out.println("<title>Servlet</title>");
			out.println("</head>");
			out.println("<body>");
			out.println("<h1>DBCP - JNDI</h1>");
			out.println("<hr>");
			out.println("<p>con = "+con+"</p>");
			out.println("</body>");
			out.println("</html>");
			
			con.close();
		} catch (NamingException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}

 


 


context.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- context.xml : WAS 프로그램에 의해 관리될 객체 관련 정보를 제공하기 위한 파일 -->
<!-- => WAS 프로그램이 실행(Start)될 때 자동으로 파일을 읽어 객체를 생성하여 WAS 프로그램에 의해 관리 -->
<!-- => 웹프로그램은 필요한 객체를 WAS 프로그램에게 이름을 이용하여 제공받아 사용 - LookUp -->

<!-- Context : context.xml 파일의 최상위 엘리먼트 - Resource 엘리먼트를 자식 엘리먼트로 여러개 설정 -->
<Context>
	<!-- Resource : WAS 프로그램에 의해 관리될 객체 관련 정보를 제공하는 엘리먼트 -->
	<!-- => 객체 관련 정보는 엘리먼트의 속성과 속성값으로 제공 -->
	<!-- name 속성 : Resource 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 -->
	<!-- => WAS 프로그램에게 객체를 제공받기 위한 이름으로 사용 -->
	<!-- auth 속성 : 객체를 생성하기 위한 사용자 이름을 속성값으로 설정 -->
	<!-- factory 속성 : 객체를 생성하기 위한 Factory 클래스를 속성값으로 설정 -->
	<!-- => factory 속성 대신 class 속성을 사용하여 객체 생성 가능 -->
	<!-- type 속성 : 객체의 자료형을 속성값으로 설정 - 객체를 반환받기 위한 자료형(클래스 or 인터페이스) -->
	<!-- 객체의 필드값 관련 정보를 속성(필드명)과 속성값(필드값)을 이용하여 설정 - 필드값 변경 -->
	<Resource name="jdbc/oracle" auth="Container" 
		factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
		type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver"
		url="jdbc:oracle:thin:@localhost:1521:xe" username="scott" password="tiger"
		initialSize="10" maxIdle="10" maxTotal="15"/>
</Context>

 


 



&$$ StudentDAO

package xyz.itwill.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import xyz.itwill.dto.StudentDTO;

//DAO(Data Access Object) 클래스 : 테이블에 행 삽입,삭제,변경,검색하는 SQL 명령을 전달하여
//실행하고 실행결과를 Java 객체(값)로 매핑하여 반환하는 기능을 제공하는 클래스
// => 싱글톤 클래스(프로그램에 객체를 하나만 생성하여 제공하는 클래스)로 작성하는 것을 권장

//STUDENT 테이블에 학생정보를 삽입,삭제,변경,검색하는 기능을 제공하는 클래스
public class StudentDAO extends JdbcDAO {
	private static StudentDAO _dao;
	
	private StudentDAO() {
		// TODO Auto-generated constructor stub
	}

	static {
		_dao=new StudentDAO();
	}
	
	public static StudentDAO getDAO() {
		return _dao;
	}
	
	//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 List 객체로 반환하는 메소드
	public List<StudentDTO> selectStudentList() {
		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		List<StudentDTO> studentList=new ArrayList<>();
		try {
			con=getConnection();
			
			String sql="select * from student order by no";
			pstmt=con.prepareStatement(sql);
			
			rs=pstmt.executeQuery();
			
			while(rs.next()) {
				//ResultSet 커서 위치의 행을 DTO 객체로 표현
				// => ResultSet 커서 위치의 행에 대한 컬럼값은 DTO 객체의 필드에 매핑하여 저장
				StudentDTO student=new StudentDTO();
				student.setNo(rs.getInt("no"));
				student.setName(rs.getString("name"));
				student.setPhone(rs.getString("phone"));
				student.setAddress(rs.getString("address"));
				student.setBirthday(rs.getString("birthday"));
				
				//List 객체에 DTO 객체를 요소로 추가
				studentList.add(student);
			}
		} catch (SQLException e) {
			System.out.println("[에러]selectStudentList 메소드의 SQL 오류 = "+e.getMessage());
		} finally {
			close(con, pstmt, rs);
		}
		return studentList;
	}
}

 


&$$  GuestDAO 

package xyz.itwill.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import xyz.itwill.dto.GuestDTO;

//GUEST 테이블에 행을 삽입,변경,삭제,검색하기 위한 기능을 제공하는 클래스
public class GuestDAO extends JdbcDAO {
	private static GuestDAO _dao;
	
	private GuestDAO() {
		// TODO Auto-generated constructor stub
	}
	
	static {
		_dao=new GuestDAO();
	}
	
	public static GuestDAO getDAO() {
		return _dao;
	}
	
	//방명록 게시글정보를 전달받아 GUEST 테이블에 삽입하고 삽입행의 갯수를 반환하는 메소드
	public int insertGuest(GuestDTO guest) {
		Connection con=null;
		PreparedStatement pstmt=null;
		int rows=0;
		try {
			con=getConnection();
			
			String sql="insert into guest values(guest_seq.nextval, ?, ?, ?, sysdate)";
			pstmt=con.prepareStatement(sql);
			pstmt.setString(1, guest.getWriter());
			pstmt.setString(2, guest.getSubject());
			pstmt.setString(3, guest.getContent());
			
			rows=pstmt.executeUpdate();
		} catch (SQLException e) {
			System.out.println("[에러]insertGuest() 메소드의 SQL 오류 = "+e.getMessage());
		} finally {
			close(con, pstmt);
		}
		return rows;
	}
	
	//방명록 게시글정보를 전달받아 GUEST 테이블에 저장된 행을 변경하고 변경행의 갯수를 반환하는 메소드
	public int updateGuest(GuestDTO guest) {
		Connection con=null;
		PreparedStatement pstmt=null;
		int rows=0;
		try {
			con=getConnection();
			
			String sql="update guest set writer=?, subject=?, content=? where num=?";
			pstmt=con.prepareStatement(sql);
			pstmt.setString(1, guest.getWriter());
			pstmt.setString(2, guest.getSubject());
			pstmt.setString(3, guest.getContent());
			pstmt.setInt(4, guest.getNum());
			
			rows=pstmt.executeUpdate();
		} catch (SQLException e) {
			System.out.println("[에러]updateGuest() 메소드의 SQL 오류 = "+e.getMessage());
		} finally {
			close(con, pstmt);
		}
		return rows;
	}
	
	//방명록 게시글번호를 전달받아 GUEST 테이블에 저장된 행을 삭제하고 삭제행의 갯수를 반환하는 메소드
	public int deleteGuest(int num) {
		Connection con=null;
		PreparedStatement pstmt=null;
		int rows=0;
		try {
			con=getConnection();
			
			String sql="delete from guest where num=?";
			pstmt=con.prepareStatement(sql);
			pstmt.setInt(1, num);
			
			rows=pstmt.executeUpdate();
		} catch (SQLException e) {
			System.out.println("[에러]deleteGuest() 메소드의 SQL 오류 = "+e.getMessage());
		} finally {
			close(con, pstmt);
		}
		return rows;
	}
	
	//방명록 게시글번호를 전달받아 GUEST 테이블에 저장된 행을 검색하여 DTO 객체를 반환하는 메소드
	public GuestDTO selectGuest(int num) {
		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		GuestDTO guest=null;
		try {
			con=getConnection();
			
			String sql="select * from guest where num=?";
			pstmt=con.prepareStatement(sql);
			pstmt.setInt(1, num);
			
			rs=pstmt.executeQuery();
			
			if(rs.next()) {
				guest=new GuestDTO();
				guest.setNum(rs.getInt("num"));
				guest.setWriter(rs.getString("writer"));
				guest.setSubject(rs.getString("subject"));
				guest.setContent(rs.getString("content"));
				guest.setRegdate(rs.getString("regdate"));
			}
		} catch (SQLException e) {
			System.out.println("[에러]selectGuest() 메소드의 SQL 오류 = "+e.getMessage());
		} finally {
			close(con, pstmt, rs);
		}
		return guest;
	}
	
	//GUEST 테이블에 저장된 모든 행을 검색하여 List 객체로 반환하는 메소드
	public List<GuestDTO> selectGuestList() {
		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		List<GuestDTO> guestList=new ArrayList<>();
		try {
			con=getConnection();
			
			String sql="select * from guest order by num desc";
			pstmt=con.prepareStatement(sql);
			
			rs=pstmt.executeQuery();
			
			while(rs.next()) {
				GuestDTO guest=new GuestDTO();
				guest.setNum(rs.getInt("num"));
				guest.setWriter(rs.getString("writer"));
				guest.setSubject(rs.getString("subject"));
				guest.setContent(rs.getString("content"));
				guest.setRegdate(rs.getString("regdate"));
				
				guestList.add(guest);
			}
		} catch (SQLException e) {
			System.out.println("[에러]selectGuestList() 메소드의 SQL 오류 = "+e.getMessage());
		} finally {
			close(con, pstmt, rs);
		}
		return guestList;
	}
	
}

 


 

&$$ JdbcDAO 

package xyz.itwill.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

//JDBC 기능을 제공하는 DAO 클래스가 상속받아 사용하기 위해 작성된 부모클래스 - 추상클래스
// => WAS 프로그램에 의해 관리되는 DataSource 객체를 제공받아 필드에 저장 - 정적영역에 작성하여 한번만 실행
// => DataSource 객체로부터 Connection 객체를 제공받아 반환하는 메소드
// => 매개변수로 전달받은 JDBC 관련 객체를 제거하는 메소드
public abstract class JdbcDAO {//상속만을 목적으로 작성된 클래스
	private static DataSource dataSource;
	
	static {
		try {
			dataSource=(DataSource)new InitialContext().lookup("java:comp/env/jdbc/oracle");
		} catch (NamingException e) {
			e.printStackTrace();
		}	
	}
		
	public Connection getConnection() throws SQLException {
		return dataSource.getConnection();
	}
	
	public void close(Connection con) {
		try {
			if(con!=null) con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}	
	}
	
	public void close(Connection con, PreparedStatement pstmt) {
		try {
			if(pstmt!=null) pstmt.close();
			if(con!=null) con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}	
	}
	
	public void close(Connection con, PreparedStatement pstmt, ResultSet rs) {
		try {
			if(rs!=null) rs.close();
			if(pstmt!=null) pstmt.close();
			if(con!=null) con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}	
	}
}

 


&$$ StudentDAO 

package xyz.itwill.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import xyz.itwill.dto.StudentDTO;

//DAO(Data Access Object) 클래스 : 테이블에 행 삽입,삭제,변경,검색하는 SQL 명령을 전달하여
//실행하고 실행결과를 Java 객체(값)로 매핑하여 반환하는 기능을 제공하는 클래스
// => 싱글톤 클래스(프로그램에 객체를 하나만 생성하여 제공하는 클래스)로 작성하는 것을 권장

//STUDENT 테이블에 학생정보를 삽입,삭제,변경,검색하는 기능을 제공하는 클래스
public class StudentDAO extends JdbcDAO {
	private static StudentDAO _dao;
	
	private StudentDAO() {
		// TODO Auto-generated constructor stub
	}

	static {
		_dao=new StudentDAO();
	}
	
	public static StudentDAO getDAO() {
		return _dao;
	}
	
	//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 List 객체로 반환하는 메소드
	public List<StudentDTO> selectStudentList() {
		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		List<StudentDTO> studentList=new ArrayList<>();
		try {
			con=getConnection();
			
			String sql="select * from student order by no";
			pstmt=con.prepareStatement(sql);
			
			rs=pstmt.executeQuery();
			
			while(rs.next()) {
				//ResultSet 커서 위치의 행을 DTO 객체로 표현
				// => ResultSet 커서 위치의 행에 대한 컬럼값은 DTO 객체의 필드에 매핑하여 저장
				StudentDTO student=new StudentDTO();
				student.setNo(rs.getInt("no"));
				student.setName(rs.getString("name"));
				student.setPhone(rs.getString("phone"));
				student.setAddress(rs.getString("address"));
				student.setBirthday(rs.getString("birthday"));
				
				//List 객체에 DTO 객체를 요소로 추가
				studentList.add(student);
			}
		} catch (SQLException e) {
			System.out.println("[에러]selectStudentList 메소드의 SQL 오류 = "+e.getMessage());
		} finally {
			close(con, pstmt, rs);
		}
		return studentList;
	}
}

 

 


 

&$ GuestDTO 

package xyz.itwill.dto;

//방명글 게시글을 저장하기 위한 GUEST 테이블 생성
//create table guest(num number primary key, writer varchar2(50), subject varchar2(200)
//	    , content varchar2(1000), regdate date);

//방명글 게시글의 글번호를 제공하기 위한 시퀸스 생성  
//create sequence guest_seq;  

/*
이름      널?       유형             
------- -------- -------------- 
NUM     NOT NULL NUMBER          - 방명록 게시글 번호 : 시퀸스로 제공되는 자동 증가값 저장
WRITER           VARCHAR2(50)    - 방명록 게시글 작성자 : 사용자 입력값을 전달받아 저장
SUBJECT          VARCHAR2(200)   - 방명록 게시글 제목 : 사용자 입력값을 전달받아 저장
CONTENT          VARCHAR2(1000)  - 방명록 게시글 내용 : 사용자 입력값을 전달받아 저장
REGDATE          DATE            - 방명록 게시글 작성날짜 : 시스템의 현재 날짜와 시간 저장
*/

//GUEST 테이블의 행을 표현하기 위한 클래스
public class GuestDTO {
	private int num;
	private String writer;
	private String subject;
	private String content;
	private String regdate;
	
	public GuestDTO() {
		// TODO Auto-generated constructor stub
	}

	public GuestDTO(int num, String writer, String subject, String content, String regdate) {
		super();
		this.num = num;
		this.writer = writer;
		this.subject = subject;
		this.content = content;
		this.regdate = regdate;
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getWriter() {
		return writer;
	}

	public void setWriter(String writer) {
		this.writer = writer;
	}

	public String getSubject() {
		return subject;
	}

	public void setSubject(String subject) {
		this.subject = subject;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public String getRegdate() {
		return regdate;
	}

	public void setRegdate(String regdate) {
		this.regdate = regdate;
	}
}

 


&$  StudentDTO

package xyz.itwill.dto;

//DTO(Data Transfer Object) 클래스 : 테이블의 행정보를 표현하여 전달하기 위한 클래스 - VO 클래스

/*
이름       널?       유형            
-------- -------- ------------- 
NO       NOT NULL NUMBER(4)     
NAME              VARCHAR2(50)  
PHONE             VARCHAR2(20)  
ADDRESS           VARCHAR2(100) 
BIRTHDAY          DATE         
*/

//STUDENT 테이블의 학생정보(행)를 저장하여 전달하기 위한 클래스
public class StudentDTO {
	private int no;
	private String name;
	private String phone;
	private String address;
	private String birthday;
	
	//Default Constructor : [Ctrl]+[Space] >> Constructor 선택
	public StudentDTO() {
		// TODO Auto-generated constructor stub
	}

	//Constructor : [Alt]+[Shift]+[S] >> [O] >> 필드 선택 > Generate
	public StudentDTO(int no, String name, String phone, String address, String birthday) {
		super();
		this.no = no;
		this.name = name;
		this.phone = phone;
		this.address = address;
		this.birthday = birthday;
	}

	//Getter & Setter : [Alt]+[Shift]+[S] >> [R] >> 필드 선택 > Generate
	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getBirthday() {
		return birthday;
	}

	public void setBirthday(String birthday) {
		this.birthday = birthday;
	}
}

 


StudentDisplayOldServlet

package xyz.itwill.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 클라이언트에게 전달하여 응답하는 서블릿 - JDBC
// => JDBC 프로그램을 작성하기 위해서는 JDBC 관련 라이브러리 파일(ojdbc 라이브러리)을 프로젝트에 빌드 처리
@WebServlet("/old.itwill")
public class StudentDisplayOldServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//JDBC 관련 객체를 저장하기 위한 변수 선언
		Connection con=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		try {
			//1.OracleDriver 클래스를 읽어 메모리에 저장
			// => OracleDriver 객체가 생성되어 DriverManager 클래스의 JDBC Driver로 등록
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			//2.DriverManager 클래스에 등록된 JDBC Driver를 이용하여 DBMS 서버에 접속해
			//접속정보가 저장된 Connection 객체를 반환받아 저장
			String url="jdbc:oracle:thin:@localhost:1521:xe";
			String username="scott";
			String password="tiger";
			con=DriverManager.getConnection(url, username, password);
			
			//3.Connection 객체로부터 SQL 명령이 저장된 PreparedStatement 객체를 반환받아 저장
			String sql="select * from student order by no";
			pstmt=con.prepareStatement(sql);
			
			//4.PreparedStatement 객체에 저장된 SQL 명령을 DBMS 서버에 전달하여 실행한 후 실행결과를 반환받아 저장
			rs=pstmt.executeQuery();
			
			//5.반환받은 실행결과를 사용자에게 제공
			out.println("<!DOCTYPE html>");
			out.println("<html>");
			out.println("<head>");
			out.println("<meta charset='UTF-8'>");
			out.println("<title>Servlet</title>");
			out.println("</head>");
			out.println("<body>");
			out.println("<h1>학생목록</h1>");
			out.println("<hr>");
			out.println("<table border='1' cellspacing='0'>");
			out.println("<tr>");
			out.println("<th width='100'>학번</th>");
			out.println("<th width='150'>이름</th>");
			out.println("<th width='200'>전화번호</th>");
			out.println("<th width='300'>주소</th>");
			out.println("<th width='250'>생년월일</th>");
			out.println("</tr>");
			//ResultSet 객체에 저장된 모든 행의 컬럼값을 반환받아 클라이언트에 전달 - 반복처리
			while(rs.next()) {
				out.println("<tr>");
				out.println("<td align='center'>"+rs.getInt("no")+"</td>");
				out.println("<td align='center'>"+rs.getString("name")+"</td>");
				out.println("<td align='center'>"+rs.getString("phone")+"</td>");
				out.println("<td align='center'>"+rs.getString("address")+"</td>");
				out.println("<td align='center'>"+rs.getString("birthday").substring(0, 10)+"</td>");
				out.println("</tr>");
			}
			out.println("</table>");
			out.println("</body>");
			out.println("</html>");
		} catch (ClassNotFoundException e) {
			System.out.println("[에러]OracleDriver 클래스를 찾을 수 없습니다.");
		} catch (SQLException e) {
			System.out.println("[에러]JDBC 관련 오류 = "+e.getMessage());
		} finally {
			//6.JDBC 관련 객체 제거
			try {
				if(rs!=null) rs.close();
				if(pstmt!=null) pstmt.close();
				if(con!=null) con.close();
			} catch (SQLException e) {}
		}
		
	}
}

 


& StudentDisplayNewServlet 

package xyz.itwill.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

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 xyz.itwill.dao.StudentDAO;
import xyz.itwill.dto.StudentDTO;

//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 클라이언트에게 전달하여 응답하는 서블릿 - DAO
@WebServlet("/new.itwill")
public class StudentDisplayNewServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();
		
		//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 List 객체로 반환하는 DAO 클래스의 메소드 호출
		List<StudentDTO> studentList=StudentDAO.getDAO().selectStudentList();
		
		out.println("<!DOCTYPE html>");
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");
		out.println("<title>Servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>학생목록</h1>");
		out.println("<hr>");
		out.println("<table border='1' cellspacing='0'>");
		out.println("<tr>");
		out.println("<th width='100'>학번</th>");
		out.println("<th width='150'>이름</th>");
		out.println("<th width='200'>전화번호</th>");
		out.println("<th width='300'>주소</th>");
		out.println("<th width='250'>생년월일</th>");
		out.println("</tr>");
		//List 객체에 저장된 요소(StudentDTO 객체)를 차례대로 제공받아 변수에 저장하는 반복문
		for(StudentDTO student : studentList) {
			out.println("<tr>");
			out.println("<td align='center'>"+student.getNo()+"</td>");
			out.println("<td align='center'>"+student.getName()+"</td>");
			out.println("<td align='center'>"+student.getPhone()+"</td>");
			out.println("<td align='center'>"+student.getAddress()+"</td>");
			out.println("<td align='center'>"+student.getBirthday().substring(0, 10)+"</td>");
			out.println("</tr>");
		}
		out.println("</table>");
		out.println("</body>");
		out.println("</html>");
	}

}