티스토리 뷰

1.    URL – pattern 종류

-      1 ) 디렉터리 패턴 ( /hello )

-       : 디렉터리 패턴과 일치하는 형태의 URL을 지정한 웹 컴포넌트가 수행된다.

-       : 디렉터리 패턴은 반드시 “ /디랙터리패턴값 의 형식으로 지정해야 하며, 계층구조를 가질 수 있다.

-      2 ) 확장자 패턴 ( *.do )

-       : 일치하는 확장자 형태의 URL을 지정한 웹 컴포넌트가 수행된다.

-       : 확장자 패턴은 반드시 “ *.확장자 의 형식으로 지정해 줘야 한다.

-       : 확장자의 종류로는 .do, .nhn, .go가 있다.


[ 1. URL - Mapping : 확장자 패턴 ]

 

package org.zerock.myapp;

import java.io.IOException;
import java.io.PrintWriter;

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 lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@NoArgsConstructor // 기본 생성자 Constructor
@Log4j2

// @WebServlet는 Servlet을 자동으로 web.xml파일에 등록시켜 준다. ( 작성되지는 않는다. )

//@WebServlet("/Hello") // http://localhost:8080/Hello일때 실행
//@WebServlet({"/Hello", "/test/hello", "/test"}) // URL - Mapping : 디렉터리 방식

// 확장자 패턴방식으로 *.do을 지정하면, URL이 .do로 끝나기만 하면 해당 서블릿을 수행시켜 준다. (**)
// 확장자 패턴은 반드시 "*.확장자" 형태로 지정해 줘야 한다.
// 확장자의 종류로는 .do, .nhn, .go가 있다.
// *는 와일드카드로 all이라는 의미이기에, *에는 아무거나 들어가도 된다.

@WebServlet("*.do") // URL - Mapping : 확장자 패턴 방식
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	//========================================================
	
	// 1. GET 방식

	
    // request는 요청 받는 것, response는 응답을 보내는 것
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

		log.trace("doGet({}, {}) invoked.", req, res);
		
		PrintWriter out =  res.getWriter();
		out.println("<h1>World!!!</h1>");
		// 출력 스트림
		// WAS는 이처럼 동적으로 태그를 넣어서 문서를 만들 수 있다.
		
		out.flush();
		out.close();
		
	} // doGet : Get방식으로 가지고 올때 ( POST방식이면 응답을 보내지 않는다. )
	
	// + URL로 넣는 모든 요청은 GET방식으로 이루어진다.
	
	//========================================================
	
	// 2. POST 방식

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.trace("doPost(req, res) invoked.");
		
		this.doGet(req, res);
		
	} // doPost : Post방식으로 가지고 올때 ( Get방식이면 응답을 보내지 않는다. )
	
	//========================================================

} // end class

[ 2. Servlet에서 JDBC 연동하기 ] (*****)

 

package org.zerock.myapp;

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 javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor
@WebServlet("/EmpSelect")
public class EmpSelectServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) 
    throws ServletException, IOException {
		
		log.trace("service(rea, res) invoked.");
		
		// req.setCharacterEncoding("UTF-8"); 
        // MyFilter가 대신 수행시켜 주고 있다.
		
		// 응답문서 준비
		
		res.setContentType("text/html; charset=utf8");
		
		@Cleanup
		PrintWriter out = res.getWriter();
		
		out.println("<html><head></head><body>");
		
		// =======================================
		// 		JDBC 연동
		// =======================================
		
		String jdbcUrl = "jdbc:oracle:thin:@db0000_high?TNS_ADMIN=C:/opt/OracleCloudWallet/ATP";
		String driverClass = "oracle.jdbc.OracleDrive";
		String user = "scott";
		String pass = "Oracle000";
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try {
			
			// WAS 안에는 JVM의 표준 클래스로더를 대체하는 Change-aware Classloader이 구현되어 있다.
			// 그렇기 때문에 JDBCDriver Class를 직접 로딩해줘야 하기에, Class.forName을 넣어줘야 한다. (***)
            
			Class.forName(driverClass); 
            // 드라이버클래스의 객체를 얻어오고 있다.
			
            // Connection 생성
			conn = DriverManager.getConnection(jdbcUrl,user,pass);
			log.debug("\t + conn : {}", conn);
			
            // SQL 준비
			String sql = "SELECT empno, ename, sal, deptno FROM emp ";
            
            // Prepared SQL 준비
			pstmt = conn.prepareStatement(sql);
			
            // SQL 수행
			rs = pstmt.executeQuery();
			
            // 결과셋에서 데이터 추출
			while(rs.next()) {
				
				String empno = rs.getString("empno");
				String ename = rs.getString("ename");
				int sal = rs.getInt("sal");
				String deptno = rs.getString("deptno");
				
				out.println(String.format("<p> %s, \t %s, \t %s, \t %s </p>", empno, ename, sal, deptno));
				
			} // while
			
			// 자원해제
			rs.close();
			pstmt.close();
			conn.close();
			
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			out.println("</body></html>");
		} // try - catch
		
	} // service

} // end class

[ 3. Servlet에서 JDBC 연동하기 2 - 효율성 + ] (*****)

 

package org.zerock.myapp;

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.ServletConfig;
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 lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

//@WebServlet("/EmpSelect2")
public class EmpSelectServlet2 extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	private String jdbcUrl;
	private String driverClass;
	private String user;
	private String pass;
	
	private Connection conn;
	
	// =============================================================================
	
	@Override
	public void init(ServletConfig config) throws ServletException {
		
		log.trace("init(config) invoked.");
		
		super.init(config);
		
		this.jdbcUrl = config.getInitParameter("jdbcUrl");
		this.driverClass = config.getInitParameter("driverClass");
		this.user = config.getInitParameter("user");
		this.pass = config.getInitParameter("pass");
		
		log.trace("\t + jdbcUrl : {}", jdbcUrl);
		log.trace("\t + driverClass : {}", driverClass);
		log.trace("\t + user : {}", user);
		log.trace("\t + pass : {}", pass);
		
		try {
			Class.forName(driverClass); // 드라이버클래스의 객체를 얻어오고 있다.
			
			Connection conn = DriverManager.getConnection(jdbcUrl,user,pass);
			log.debug("\t + conn : {}", conn);
			
			this.conn = conn;
		} catch (Exception e) {
			throw new ServletException(e);
		} // try - catch
		
	} // init
	
	// =============================================================================
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.trace("service(rea, res) invoked.");
		
		// 응답문서 준비
		
		res.setContentType("text/html; charset=utf8");
		
		@Cleanup
		PrintWriter out = res.getWriter();
		
		out.println("<html><head></head><body>");
		
		// =============================================================================
		// 		JDBC 연동
		// =============================================================================
		
		try {
			
			String sql = "SELECT empno, ename, sal, deptno FROM emp ";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			
			ResultSet rs = pstmt.executeQuery();
			
			try ( pstmt; rs; ){
				
				while(rs.next()) {
					
					String empno = rs.getString("empno");
					String ename = rs.getString("ename");
					int sal = rs.getInt("sal");
					String deptno = rs.getString("deptno");
					
					out.println(String.format("<p> %s, \t %s, \t %s, \t %s </p>", empno, ename, sal, deptno));
					
				} // while
				
			} // try - with - resources
			
		} catch(Exception e) {
			throw new IOException(e);
		} finally {
			out.println("</body></html>");
		} // try - catch
		
		out.flush();
		
	} // service
	
	// =============================================================================

	@Override
	public void destroy() {
		
		log.trace("destroy() invoked.");
		
		try { if( conn != null && !conn.isClosed()) conn.close(); }
		catch(SQLException e) { ;; }
				
	} // destroy
	
	// =============================================================================

} // end class

[ 4. Servlet에서 JDBC 연동하기 3 - 효율성 +++ : 커넥션 풀 사용 ] (*********)

 

[ 4 - 1. context.xml 생성 ]

 

<?xml version="1.0" encoding="UTF-8"?>

<Context>

    <!-- url="jdbc:oracle:thin:@localhost:1521/seoul" -->
    
    <!-- 오라클 로컬 버전 -->
    <!-- <Resource 
        name="jdbc/OracleLocalDB" 
        auth="Container"
        type="javax.sql.DataSource"
        username="scott"
        password="oracle"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@seoul?TNS_ADMIN=C:/u01/oracle/product/19.3.0/dbhome/network/admin"
        maxTotal="8"
        maxIdle="2"
    /> -->

    <!-- 오라클 클라우드 버전 : name = 커넥션 풀의 이름(*), type = 커넥션풀이 있는 곳 / 타입(***) -->
    <Resource 
        name="jdbc/OracleCloudATP" 
        auth="Container"
        type="javax.sql.DataSource"
        username="scott"
        password="Oracle00000"
        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@db000000_high?TNS_ADMIN=C:/opt/OracleCloudWallet/ATP"
        maxTotal="8"
        maxIdle="2"
    />

<!--     <Resource 
        name="jdbc/OracleLocalDBWithDriverSpy" 
        auth="Container"
        type="javax.sql.DataSource"
        username="HR"
        password="oracle"
        driverClassName="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"
        url="jdbc:log4jdbc:oracle:thin:@seoul?TNS_ADMIN=C:/u01/oracle/product/19.3.0/dbhome/network/admin"
        maxTotal="8"
        maxIdle="2"
    /> -->

    <!-- <Resource 
        name="jdbc/OracleCloudATPWithDriverSpy" 
        auth="Container"
        type="javax.sql.DataSource"
        username="scott"
        password="Oracle00000"
        driverClassName="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"
        url="jdbc:log4jdbc:oracle:thin:@db000000_high?TNS_ADMIN=C:/opt/OracleCloudWallet/ATP"
        maxTotal="8"
        maxIdle="2"
    /> -->

</Context>

[ 4 - 2. 커낵션 풀에서 연결하기 ]

 

package org.zerock.myapp;

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

import javax.annotation.Resource;
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;

import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@WebServlet("/EmpSelect3")
public class EmpSelectServlet3 extends HttpServlet { // 커넥션 풀 사용 ver.
	private static final long serialVersionUID = 1L;
	
	// =============================================================================
	
	// JNDI LOOKup을 통해 CP 주소 획득 및 CP 객체의 주소를 변수에 저장
	@Resource(name="jdbc/OracleCloudATP")
	private DataSource dataSource;
	
	// =============================================================================
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.trace("service(rea, res) invoked.");
		
		log.debug("this.dataSource : {}", this.dataSource);
		
		// 응답문서 준비
		res.setContentType("text/html; charset=utf8");
		
		@Cleanup
		PrintWriter out = res.getWriter();
		
		out.println("<html><head></head><body>");
		
		// =============================================================================
		// 		JDBC 연동
		// =============================================================================
		
		try {
			
			Connection conn = this.dataSource.getConnection();
			log.debug("\t + conn : {}", conn);
			// 커낵션 풀에서 얻은 커넥션의 정보가 나오기에, URL이 우리가 지정한 jdbcUrl이 나온다.
			
			String sql = "SELECT empno, ename, sal, deptno FROM emp ";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			
			try ( conn; pstmt; rs; ){
				
				while(rs.next()) {
					
					String empno = rs.getString("empno");
					String ename = rs.getString("ename");
					int sal = rs.getInt("sal");
					String deptno = rs.getString("deptno");
					
					out.println(String.format("<p> %s, \t %s, \t %s, \t %s </p>", empno, ename, sal, deptno));
					
				} // while
				
			} // try - with - resources
			
		} catch(Exception e) {
			throw new IOException(e);
		} finally {
			out.println("</body></html>");
		} // try - catch
		
		out.flush();
		
	} // service
	
	// =============================================================================

} // end class

[ 5. Servlet에서 JDBC 연동하기 4 - 효율성 +++ : JDNI Lookup 수동으로 하기 ] (*********)

 

package org.zerock.myapp;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Objects;

import javax.naming.Context;
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;

import lombok.Cleanup;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;


@Log4j2
@NoArgsConstructor

@WebServlet("/EmpSelect4")
public class EmpSelectServlet4 extends HttpServlet { // JNDI LOOKup 직접 하는 방법
	private static final long serialVersionUID = 1L;
	
	// =============================================================================
	
	// JNDI LOOKup을 통해 CP 주소 획득 및 CP 객체의 주소를 변수에 저장
	private DataSource dataSource;
	
	// =============================================================================
	
	@Override
	public void init() throws ServletException {
		log.trace("init() invoked.");
		
		try {
			
			// JNDI Lookup
			
			// 1. JNDI tree 뿌리(root)에 접근할 수 있게 해주는 객체를 얻어야 한다.
			// 방법 : InitialContext 타입의 객체를 생성해야 한다.
			Context ctx = new InitialContext();
			
			// 2. Context 객체를 얻고 나서, Context 인터페이스에 정의된 메소드로 JNDI Lookup 수행
			// 특이사항 : JNDI tree에 공유자원객체를 바인딩할 때는, 이름 앞에 아래와 같은 prefix를 붙여야 한다.
			// ex. Prefix : "java:comp/env/" + 공유객체의 name으로 바인딩해야 한다.(***)
			Object obj = ctx.lookup("java:comp/env/jdbc/OracleCloudATP");
			
			// 3. null인지 검증
			Objects.requireNonNull(obj);
			
			// 4. 원래 타입으로 강제형변환
			this.dataSource = (DataSource) obj;
			
			log.debug("\t + this.dataSource : {}", this.dataSource);
			
		}catch(NamingException | NullPointerException e) {
			throw new ServletException(e);
		} // try - catch
		
	} // init
	
	// =============================================================================
	
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		
		log.trace("service(rea, res) invoked.");
		
		// 응답문서 준비
		res.setContentType("text/html; charset=utf8");
		
		@Cleanup
		PrintWriter out = res.getWriter();
		
		out.println("<html><head></head><body>");
		
		// =============================================================================
		// 		JDBC 연동
		// =============================================================================
		
		try {
			
			Connection conn = this.dataSource.getConnection();
			String sql = "SELECT empno, ename, sal, deptno FROM emp ";
			PreparedStatement pstmt = conn.prepareStatement(sql);
			ResultSet rs = pstmt.executeQuery();
			
			try ( conn; pstmt; rs; ){
				
				while(rs.next()) {
					
					String empno = rs.getString("empno");
					String ename = rs.getString("ename");
					int sal = rs.getInt("sal");
					String deptno = rs.getString("deptno");
					
					out.println(String.format("<p> %s, \t %s, \t %s, \t %s </p>", empno, ename, sal, deptno));
					
				} // while
				
			} // try - with - resources
			
		} catch(Exception e) {
			throw new IOException(e);
		} finally {
			out.println("</body></html>");
		} // try - catch
		
		out.flush();
		
	} // service
	
	// =============================================================================

} // end class
728x90
댓글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
최근에 올라온 글
Total
Today
Yesterday
공지사항