- JSP/Servlet 기술에서 사용되는 네 종류의 애트리뷰트

① Page

② request

③ session

④ application

 

- EL 식 안에 있는 데이터 이름이 해석되는 순서

Page -> Request -> Session -> Application

 

- 같은 이름의 애트리뷰트 존재시 콕 짚어서 특정 애트리뷰트를 출력하고 싶을 때 사용법

  데이타 영역의 스코프와 함께 표시한다.

${pageScope.SUM}    ${requestScope.RESULT}    ${sessionScope.CART}    ${application.DB_NAME}

이렇게? 이런 일이 있을까?

 

 

<web-app>

<context-param>

<param-name>MY_NAME</param-name>

<param-value>DANIEL</param-value>

</context-param>

</web-app>

 

- 웹 어플리케이션 안에서 초기화 파라미터 값을 어디에서든 읽어 올수 있다.

EX) <%= application.getInitParameter("MY_NAME") %>

<web-app>

<servlet>

-- JSP 페이지의 본래의 URL 경로명이 들어갈 부분 ---

<servlet-name>winners-jsp</servlet-name>

<jsp-file>/Winners.jsp</jsp-file>   -> JSP 페이지의 본래의 URL경로명

<init-param>

<param-name>FILE_NAME</param-name>

<param-value>winner-list.txt</param-value>

-- 해당 JSP 페이지에서 getInitParameter 메서드를 호출해서 가져올수 있다 --

</init-param>

</servlet>

<servlet-mapping>

-- JSP 페이지를 호출할 때 사용할 URL 경로명이 들어갈 부분 --

<servlet-name>winners-jsp</servlet-name>

<url-pattern>/winners</url-pattern> -> JSP페이지의 새로운 URL 경로명(별칭)

</servlet-mapping>

</web-app>

 

EX) String filename = getInitParameter("FILE_NAME");

<jsp-file></jsp-file>경로로 jsp를 호출 할때만 getInitParameter(); 가 정상 호출 된다.

 

log4j.properties

log4j.properties- DB Query 도 찍히게 되어있다

log4j-1.2.16.jar

- log4j는 자바 어플리케이션에서 빠르고 효과적으로 로깅 할 수 있도록 도와주는 오픈 소스 프로젝트입니다.

log4j.properties 기본 경로 : /WEB-INF/classes/

web-application classes 경로도 : /WEB-INF/classes/ 로 해야 Logger.getLogger(getClass()); 가능한 것 같다.

로그찍을 클래스에서 
private final Logger logger = Logger.getLogger(getClass());

 

1. LOG4J 구조

① Logger(Category) : 로깅 메세지를 Appender에 전달합니다.

② Appender : 전달된 로깅 메세지를 파일에다 기록할 것인지, 콘솔에 출력할 것인지

아니면 DB에 저장할 것인지 매개체 역활을 합니다.

③ Layout : Appender가 어디에 출력할 것인지 결정했다면 어떤 형식으로 출력할 것이지

출력 layout을 결졍합니다.

 

2. LOG4J 로깅 레벨

① FATAL : 가장 크리티컬한 에러가 일어 났을 때 사용합니다.

② ERROR : 일반 에러가 일어 났을 때 사용합니다.

③ WARN : 에러는 아니지만 주의할 필요가 있을 때 사용합니다.

④ INFO : 일반 정보를 나타낼 때 사용합니다.

⑤ DEBUG : 일반 정보를 상세히 나타낼 때 사용합니다.

※   만약 로깅 레벨을 WARN 으로 설정하였다면 그 이상 레벨만 로깅하게 됩니다.

즉 WARN, ERROR, FATAL 의 로깅이 됩니다.

 

3.  property 파일에 설정
    log4j.properties를 만들어 /WEB-INF/classes 밑에 놓으세요

log4j.rootLogger=INFO, stdout, rolling

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender

log4j.appender.rolling.File=output.log

log4j.appender.rolling.Append=true

log4j.appender.rolling.MaxFileSize=500KB

log4j.appender.rolling.DatePattern='.'yyyy-MM-dd

log4j.appender.rolling.layout=org.apache.log4j.PatternLayout

log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

--  설명 --

#최상위 카테고리에 INFO로 레벨 설정 및 appender로 stdout, rolling을 정의
log4j.rootLogger=INFO, stdout, rolling

#stdout 어펜더는 콘솔에 뿌리겠다는 정의
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

#stdout 어펜더는 patternlayout을 사용하겠다는 정의

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#페턴은 다음과 같이 포맷팅 하겠다는 것을 정의

log4j.appender.stdout.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

#역시나 rolling 어펜더는 파일로 처리한다라고 정의
log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender

#로그 파일 이름은 output.log
log4j.appender.rolling.File=output.log

#true면 톰캣을 내렸다 올려도 파일이 리셋되지 않습니다.
log4j.appender.rolling.Append=true

#파일 최대 사이즈는 500KB로 설정
log4j.appender.rolling.MaxFileSize=500KB

#파일 포맷은 output.log.2005-03-10 으로 관리하겠다고 정의
log4j.appender.rolling.DatePattern='.'yyyy-MM-dd

#역시나 rolling 어펜더는 패턴 레이아웃을 사용하겠다고 정의
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout

#rolling 어펜더는 패턴 레이아웃 포맷
log4j.appender.rolling.layout.ConversionPattern=%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n

 

 

4. 설정포멧

로그파일명 포맷 (DatePattern)
로그파일명 포맷입니다. 날짜, 시간 및 분단위로까지 로그 파일을 분리할 수 있습니다.

형식 설명
'.'yyyy-MM 매달 첫번째날에 로그파일을 변경합니다
'.'yyyy-ww 매주의 시작시 로그파일을 변경합니다.
'.'yyyy-MM-dd 매일 자정에 로그파일을 변경합니다.
'.'yyyy-MM-dd-a 자정과 정오에 로그파일을 변경합니다.
'.'yyyy-MM-dd-HH 매 시간의 시작마다 로그파일을 변경합니다.
'.'yyyy-MM-dd-HH-mm 매분마다 로그파일을 변경합니다.



PatternLayout 포맷
로그자체를 어떤 포맷으로 남길지 결정합니다.
layout에는 HTMLLayout, PatternLayout, SimpleLayout, XMLLayout등이 있으며 PatternLayout이 일반적으로 가장 많이 쓰입니다.

형식 설명
%p debug, info, warn, error, fatal 등의 priority 가 출력된다.
%m 로그내용이 출력됩니다
%d 로깅 이벤트가 발생한 시간을 기록합니다.
포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로 사용하며 SimpleDateFormat에 따른 포맷팅을 하면 된다
%t 로그이벤트가 발생된 쓰레드의 이름을 출력합니다.
%% % 표시를 출력하기 위해 사용한다.
%n 플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다.
%c 카테고리를 표시합니다
예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다.
%C 클래스명을 포시합니다.
예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다
%F 로깅이 발생한 프로그램 파일명을 나타냅니다.
%l 로깅이 발생한 caller의 정보를 나타냅니다
%L 로깅이 발생한 caller의 라인수를 나타냅니다
%M 로깅이 발생한 method 이름을 나타냅니다.
%r 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds)
%x 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다.
%X 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다.

1. Tomcat - web,xml 파일은 웹 어플리케이션 디렉터리마다 딱 하나씩 만들 수 있습니다.

web.xml 파일의 루트 엘리먼트

<web-app>

</web-app>

 

2. 웹 서버가 웹 브라우저로 부터 URL을 받았을 때 서블릿 클래스를 찾아서 호출하기 위해 필요한 정보를 입력해야 한다.

   URL 과 서블릿클래스의 이름이 필요하다.

   <servlet> 과 <servlet-mapping> 이라는 엘리먼트를 만들고 그 안에 각각 써 넣어야 한다.

<web-app>

<servlet>

<servlet-name></servlet-name> // 3. 서블릿 클래스의 서블릿 이름

<servlet-class></servlet-class> // 4. 서블릿 클래스명

-- 서블릿 클래스의 이름이 들어갈 부분 --

</servlet>

<servlet-mapping>

<servlet-name></servlet-name> // 2. 불러올 서블릿 이름

<url-pattern></url-pattern> // 1. 웹 브라우저에서 호출할 URL

-- 서블릿 클래스를 호출할 떄 사용할 URL이 들어갈 부분 --

※전체URL이 아니라, 웹 서버의 도메인 이름, 포트번호, 웹 어플리케이션 디렉터리의 이름까지를 제외 나머지 부분※

</servlet-mapping>

</web-app>

 

※부연설명

1. 톰캣 실행 후, 웹 브라우저 에서 <url-pattern> 을 호출을 하면,

2. <servlet-mapping> -> <servlet-name> 을 호출

3. 2.<servlet-name>과 일치하는 <servlet> -> <servlet-name> 호출

4. 3.<servlet> - > <servlet-name> 에 등록 된 <servlet> -> <servlet-class> 호출 끝!

'공부 > SERVLET' 카테고리의 다른 글

SERVLET_[XML 문법의 기초]  (0) 2012.09.08
SERVLET_[서블릿의 기초]  (0) 2012.09.07

 - XML 은 HTML 과 마찬가지로 텍스트 내용에 태그(태그 & 마크업)를 첨가하기 위해 사용되는 문법입니다.

이 언어는 언뜻 보기에 HTML과 비슷해 보인다.

 

1. XML 문서의 제일 앞에는 XML 선언이 올수 있다.

         XML 선언은 XML 문서작성에 사용된 XML 규격서의 버전과 XML 문서를 저장하는 데 사용된 문자 코드의 인코딩

   방식을 표시하는 역할을 합니다.

<?xml versio="1.0" encoding="ISO-8859-1"?>

  XML 문서에서 XML 선언이 생략될 수 있는 경우 : XML 문서의 내용이 ASCII 문자로면 구성되었을 경우 XML 선언생략

 

2. HTML에서는 엘리먼트 이름과 애트리뷰트 이름에 이는 대소문자를 구분하지 않지만, XML은 엄격하게 구분한다.

 

3. HTML에서는 단독으로 사용되는 태그가 < >로 끝나야 하지만, XML에서는 < />로 끝나야 한다.

 

4. HTML에서는 애트리뷰트 갓을 따옴표로 묶지 않고 쓸 수 도 있지만, XML엣는 반드시 따옴표를 묶어서 써야한다.

   EX) HTML : <IMG src=/img/car.jps>                           XML : <role rolename="admin">

 

5. HTML에서는 다소 문법에 맞지 않는 부분이 있으면 웹 브라우저가 이를 보정해서 처리하지만, XML 에서는

   문법에 조금이라도 맞지 않는 부분이 있으면 XML 문서가 올바르게 처리되지 않는다. 

'공부 > SERVLET' 카테고리의 다른 글

SERVLET_[톰캣의 서블릿 클래스 등록]  (0) 2012.09.08
SERVLET_[서블릿의 기초]  (0) 2012.09.07

import javax.servlet.*;

inport javax.servlet.http.*;

import java,io.*;


/* HttpServlet 클래스를 상속받아야 한다. */

public class ServletTest extends HttpServlet {


/* doGet 이나 doPost 라는 메소드를 선언하고, 그 안에 서블릿 클래스가 호출되었을 때 해야 할 일을 써 넣어야 한다. */

public void goDet(HttpServletRequest request, HttpServletResponse response) throws ServletException. IOException {

PrintWriter out = response.getWriter();

out.println("<HTML>");

out.println("<HEAD><TITLE>Sum of 1 to 100</TITLE></HEAD>");

out.println("<BODY>");

int total = 0;

for ( int cnt = 1; cnt <= 100; cnt++ ) {

total += cnt;

out.println("1 + 2 + 3 + 4 + ... + 100 = " + total );

out.println("</BODY>");

out.println("</HTML>");

}

}

}



- 서블릿의 장점

1. 자바기반

2. 자바의 플랫폼 독립성은 서블릿 클래스의 실행 코드를 다양한 컴퓨터와 운영체제에 옮겨서 그대로 사용할 수 있게 한다.

3. 예) UNIX 운영체제에서 개발한 서블릿 클래스를 윈도우즈 운영체제에 설치해서 사용할 수 있고, 테스크탑 컴퓨터에서 개발한

   서블릿 클래스를 그외 다른 기종의 서버급 컴퓨터에서 설치해서 사용할 수 있다.

4. 네트워크 환경에서 보안이 용이하고, 프로그래밍 언어수준에서 멀티 스레드 기능이 지원된다.

   (때문에, 불특정 다수의 사용자들이 웹 서버에 접속했을 때에도 컴퓨터가 다운되지 않고 안정적으로 작동 한다.)

5. 자바가 제공하는 풍부한 라이브러리는 프로그래머로 하여금 적은 노력으로 양질의 웹 에플리케이션을 작성할 수 있게 한다.


- 서블릿의 단점

1. HTML 코드가 자바 코드 안으로 들어가는 구조로 HTML 문서의 구조를 이해하기 어렵게 만들고, 웹 페이지의 디자인

   작업을 위해서도 소스 코드에 손을 대게 만드는 비효율성을 낳는다.


위의 서블릿의 단점 때문에 자바의 유용한 장점을 살리면서 서블릿 기술의 단점을 보완하는 새로운 기술인 JSP 가 개발되었다.

※ JSP 페이지는 서블릿 클래스와 반대로 HTML 문서에 자바코드가 삽입되는 구조를 갖는다.

'공부 > SERVLET' 카테고리의 다른 글

SERVLET_[톰캣의 서블릿 클래스 등록]  (0) 2012.09.08
SERVLET_[XML 문법의 기초]  (0) 2012.09.08
●벡터(Vector)

   1. 대용량의 데이터를 효과적으로 다룰 수 있는 클래스

   2. 용량의 변경이 용의

   3. 벡터에 저장하는 모든 데이터는 Object타입

   4. 어떤 종류의 객체도 함께 담을 수 있다.

   +++ 배열의 크기를 한번 정해지면 변경 불가하고 같은 종류의 데이터만

        사용할 수 있다는 단점 보안

 

벡터 생성자

   1. Vector :  초기용량이 10, 용량 초과시 크기를 두배 씩 증가

   2. Vector(int aaa) : 지정한 크기의 용량으로 초기화된 Vector 객체를 생성한다.

   3. Vector(int aaa, int bbb) : 지정한 크기의 용량으로 초기화된 벡터객체를 생성하고

                                          용량 초과시 bbb만큼 증가 시킨다.

※ 일반적으로 용량의 문제가 거의 발생하지 않기 때문에 보통 인자가 없는

    생성자를 사용하여 벡터 객체를 생성한다.      Vector v = new Vector();

 

●벡터에 객체 저장

  메소드

   1. void add(int index, Object object) - 지정한 인덱스의 위치에 객체를 추가함

   2. void addElement(Object objec) - 벡터의 끝에 객체를 추가한다

        Vector v = new Vector();

        v.add(1, "객체명");             //지정한 위치에 객체 추가

        v.addElement("객체명");     //마지막에 객체 추가

        v.addElement("객체명");     //마지막에 객체 추가

 

●벡터로 부터 객체 삭제

  메소드

1.       Object remove(int index) ? 지정한 위치의 객제를 벡터에서 제거

2.       boolean remove(Object object) ? 지정한 객체를 벡터에서 제거

3.       void clear() ? 벡터의 모든 요소를 제거

예) Vector v = Vector();            //벡터 생성

   v.remove(int index);                        //지정한 위치의 객체 제거

   v.remove(“객체명”);            //지정한 객체 제거

   v.clear();                        //벡터의 모든 요소를 제거

 

●벡터로 부터 객체 검색

  메소드

1.       Object elementAt(int index) ? 지정한 위치의 객체를 리턴

2.       Object get(int index) ? 지정한 위치의 객체를 리턴

※ 벡터에 요소를 추가할 때는 String형을 그대로 사용할 수 있지만 검색한 결과는 Object형이므로 사용하기 위해서는 원래 데이터형으로 캐스팅해야 한다.

예) Vector v = Vector();                        //벡터 생성

   String s = (String)v.elementAt(0);            //지정한 위치의 객체를 리턴

   String s2 = (String)v.get(1);                   //지정한 위치의 객체를 리턴

   Enumeration e = v.elements();            //Vector의 요소의 리스트를 리턴

    Iterator과 비슷한 역할(저장 객체 추출)

 

 

●벡터의 기타 메소드

1.      int capcity() ? 벡터의 현재 용량의 리턴

2.      boolean contains(Object object) ? 주어진 요소가 벡터에 있는지 알아낸다.

3.      int indexof(Object object) ? 주어진 요소의 위치를 리턴(없으면 -1)

4.      int size() ? 벡터에 포함되어 있는 요소의 수를 리턴

5.      void trimToSize() ? 벡터의 용량을 현재 벡터의 크기에 맞게 수정

 

●Enumeration

벡터에 저장된 객체를 열거형으로 리턴

  Enumeration e = v.elements();               //Vector의 요소의 리스트를 리턴

     While(e.hasMoreElements()) {

    System.out.println(e.nextElement());

}

 

●Iterator

Collection에 저장된 객체를 나열 또는 열거하기 위한 인터페이스

  Iterator ie = v.iterator();         //Vector의 요소의 리스트를 리턴

  While(ie.hasNext()){

    System.out.println(ie.next());

}

 

● Stack

1.      Object를 저장하는 하나의 방법

2.       가장 나중에 들어간 데이터가 가장 먼저 밖으로 나오는 형태

LIFO(Last In First Out)

예) import java.util.*;

public class StackTest{

public static void main(String[] args){

      Stack s = new Stack();

      System.out.println(s.empty());           //스택이 비어있는지 확인 true

      s.push(“데이타1”);           //데이터 넣기

      s.push(“데이타2”);

      System.out.println(s.empty());           //false

      System.out.println(s.peek());   //가장 먼저 나올 데이타(데이타1)

      System.out.println(s.pop());           //스택에 저장 되어 있는 차례로 출력

      System.out.println(s.pop());

      System.out.println(s.empty());            //스택이 비어있는지 확인 true

}

}

 

●LinkedList

1.      List 인터페이스의 링크 리스트의 구현

2.      void add(int index, Object element) ? 지정된 위치에 지정된 요소 삽입

void addLast(Object element) ? 리스트의 마지막에 지정된 요소 추가

Object get(int index) ? 지정된 위치에 있는 요소 리턴

Object getLast() ? 리스트내의 마지막 요소 리턴

Object remove(int index, Object element) ? 지정된 위치에 있는 요소 삭제

3.      데이터의 첨가, 삭제가 편리하고 속도가 빠르다.

 

● Map & hashing

키와 값의 쌍으로 이루어진 요소를 저장하는 자료구조

해싱이란 키객체를 처리하여 hash code(정수값)를 만들어 내는 방법이다.

 

●HashMap

Null허용, Map interface를 implements한 클래스

 

●Hashtable

Null 허용하지 않음, Map interface를 implements한 클래스

 

'공부 > JAVA' 카테고리의 다른 글

JAVA_[ Int & Integer 차이 ]  (0) 2013.03.22
JAVA_[날짜 형식 변경(SimpleDateFormat)]  (0) 2012.11.12
JAVA_[Thread]  (0) 2012.06.23
JAVA_[객체_직렬화]  (0) 2012.06.23
JAVA_[Adapter_패턴 (일명 : Wrapper 패턴)]  (0) 2012.06.23

package util;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Map;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

public class CookieBox {

    private Map<String, Cookie> cookieMap = new java.util.HashMap<String, Cookie>();
   
    public CookieBox(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
            if ( cookies != null ) {
                for ( int i = 0; cookies.length > i; i++ ) {
                    cookieMap.put(cookies[i].getName(), cookies[i]);
                }
            }
    }
   
    public static Cookie createCookie(String name, String value) throws IOException {
        return new Cookie(name, URLEncoder.encode(value, "euc-kr") );
    }
   
    public static Cookie createCookie(String name, String value, String path, int maxAge) throws IOException {
       
        Cookie cookie = new Cookie(name, URLEncoder.encode(value, "euc-kr") );
        cookie.setPath(path);
        cookie.setMaxAge(maxAge);
        return cookie;
    }
   
    public static Cookie createCookie(String name, String value, String domain, String path, int maxAge) throws IOException {
       
        Cookie cookie= new Cookie(name, URLEncoder.encode(value, "euc-kr") );
        cookie.setDomain(domain);
        cookie.setPath(path);
        cookie.setMaxAge(maxAge);
        return cookie;
    }
   
    public Cookie getCookie(String name) {
       
        return cookieMap.get(name);
    }
   
    public String getValue(String name) throws IOException {
       
        return URLDecoder.decode(cookieMap.get(name).getValue(), "euc-kr");
    }
   
    public boolean exists(String name) {
       
        return cookieMap.get(name) != null;
    }
}

'공부 > JAVA_UTILL_CLASS' 카테고리의 다른 글

UTILL_[파일업로드]  (0) 2012.11.19

<%@page import="org.apache.jasper.tagplugins.jstl.core.Catch"%>
<%@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"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>::: JSP_JDBC_EX ::::</title>
</head>
<body>
MEMBER 테이블의 내용
<table width="100" border="1">
    <tr>
        <td>이름</td>
        <td>아이디</td>
        <td>이메일</td>
    </tr>
   
<%
        /* 1.JDBC 드라이버 로딩(등록) */
        Class.forName("oracle.jdbc.OracleDriver");
       
        Connection conn = null;
        Statement stmt    = null;
        ResultSet rs        = null;
       
        try {
            String jdbcDriver = "jdbc:oracle:thin:@localhost:1521:XE";
                                    /* jdbc:oracle:thin:@hostid:port:SID */
            String dbUser = "HR";
            String dbPass = "HR";
           
            String query = "SELECT * FROM MEMBER ORDER BY MEMBERID";
           
            /* 2.데이터 베이스 커넥션 생성 */
            conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
           
            /* 3.Statement 생성 */
            stmt = conn.createStatement();
           
            /* 4.쿼리실행 */
            rs = stmt.executeQuery(query); // SELECT
                     // executeUpdate - INSERT, UPDATE, DELETE ( RETURN 값 - INT )
           
            /* 5.쿼리 실행 결과 출력 */
              while(rs.next() ) {
        %>
<tr>
    <td><%= rs.getString("NAME") %></td>
    <td><%= rs.getString("MEMBERID") %></td>
    <td><%= rs.getString("EMAIL") %></td>
</tr>
        <%
              }           
           
        } catch (SQLException ex) {
            out.println(ex.getMessage() );
            ex.printStackTrace();
        } finally {
           
            /* 6.사용한 Statement 종료 */
            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>


+ Recent posts