티스토리 뷰
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
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 91일차 - Servlet 고급 ( FrontController / Command 패턴 ) (****) (0) | 2022.07.07 |
---|---|
KH 90일차 - Servlet ( JDBC와 커넥션풀로 연결 ) / 패턴 (****) (0) | 2022.07.06 |
KH 88일차 - ServletContext 2 (*****) + 리스너 / 필터 생성 (0) | 2022.07.04 |
KH 87일차 - ServletContext (*****) (0) | 2022.07.01 |
KH 86일차 - Servlet 3 ( 파라미터 값 가지고 오기,초기화 파라미터 ) (***) (0) | 2022.06.30 |
댓글