[JSP] HTTP 헤더


HTTP 헤더


1. HTTP 헤더


아래 헤더 정보는 텍스트만 있는 HTML 문서에 대한 요청/응답 헤더임.

HTTP Version 1.1을 기준으로 작성된 헤더 정보임.

(클라이언트 환경은 Windows XP, NET Framework 1.1, IE 6.0)


2. 요청 헤더


(1)  GET /test/test.htm HTTP /1.1

요청 Method와 요청 파일 정보, HTTP 버전을 뜻함.

HTTP 프로토콜은 클라이언트가 서버에게 요청하는 방식에 대한 몇 가지 동작을 정의하고 있음.

즉, 요청 Method 란 클라이언트가 서버로의 요청하는 방법을 명시함.


1) GET

지정된 리소스(URI)를 요청함.

 

2) POST

서버가 클라이언트의 폼 입력 필드 데이터의 수락을 요청함.

클라이언트는 서버로 HTTP Body에 Data 를 전송함.

 

3) HEAD

문서의 헤더 정보만 요청함.

응답 데이터(Body)를 받지 않음.


4) PUT

클라이언트가 전송한 데이터를 지정한 URI로 대체함.

cf.) FTP의 PUT과 동일함.

역시 클라이언트는 서버로 HTTP Body에 Data를 전송함.

 

5) DELETE

클라이언트가 지정한 URI 를 서버에서 삭제함.

 

6) TRACE

 클라이언트가 요청한 자원에 도달하기까지의 경로를 기록하는루프백(loop back) 검사용을 말함.

클라이언트가 요청 자원에 도달하기 까지 거쳐가는 프록시나 게이트웨이의 중간 경로부터 최종 수진 서버까지의 경로를 알아낼 때 사용함.

 

(2) Accept

클라이언트가 허용할 수 있는 파일 형식을 뜻함.(MIME TYPE)

*/* 은 특정 유형이 아닌 모든 파일형식을 다 지원한다는 의미임.


(3) User-Agent

클라이언트 소프트웨어(브라우저, OS 등)의 이름과 버전 등을 뜻함.

위의 정보에서는 MS IE 6.0, 윈도우 XP, .NET Framework 1.1 버전이 클라이언트에 설치되어 있음을 나타냄.


(4) Host

요청을 한 서버의 Host 임.


(5) If-Modified-Since

페이지가 수정되었으면 최신 버전 페이지 요청을 위한 필드임.

만일 요청한 파일이 이 필드에 지정된 시간 이후로 변경되지 않았다면, 서버로부터 데이터를 전송 받지 않음.

단, 이 경우 서버로부터 Not Modified (304) 상태코드를 전송 받음.


위의 헤더 정보는 동일한 파일을 재요청했을 때의 응답 헤더임.

파일을 변경사항이 없으므로 304(수정되지 않음)과 Content-Length : 0(데이터 받지 않음) 응답을 받음.

이렇게 함으로써 HTTP 는 요청의 부하를 줄이고 있음.


(6)  Refer

특정 페이지에서 링크를 클릭하여 요청을 하였을 경우에 나타나는 필드로써 링크를 제공한 페이지를 나타냄.

위의 요청 헤더에는 나와 있지 않지만 이 정보도 헤더에 자주 등장하는 필드임.


(7) Cookie

웹 서버가 클라이언트에 쿠키를 저장해 놓았다면 해당 쿠키의 정보를 이름과 값 쌍으로 웹 서버에게 전송함.

역시 위의 요청에는 없지만 자주 등장하는 필드임.


(8) Accept-Language

클라이언트가 인식할 수 있는 언어를 뜻함.

우선 순위 지정이 가능합니다


(9) Accept-Encoding

클라이언트가 인식할 수 있는 인코딩(압축) 방법을 뜻함.

위의 내용에서는 서버에서 gzip, deflate 로 압축한 리소스를 클라이언트가 해석 할 수 있다는 것을 뜻함.

만일 서버에서 압축을 했으면 응답헤더에 Content-Encoding 헤더에 해당 압축 방법이 명시됨.


3. 응답 헤더

(1)  HTTP /1.1 200 OK

HTTP 버전과 응답 코드를 뜻함.

여기서 200 은 성공을 뜻함.


(2) Server

웹 서버 정보를 나타냄.

위의 정보에서는 Microsoft IIS 5.1 을 뜻함.


(3) Date

현재 날짜를 나타냄.


(4) Content-Type

요청한 파일의 MIME 타입을 나타냄.

text/html 은 text 중 html 파일임을 나타냄.


(5) Last-Modified

요청한 파일의 최종 수정일을 나타냄.


(6) Content-Length

헤더 이후 이어지는 데이터의 길이을 뜻함. (바이트 단위)

이어지는 데이터란 요청한 파일의 데이터라 보시면 됨.


(7) ETag

캐쉬 업데이트 정보를 위한 임의의 식별 숫자을 뜻함.


아래에 링크로 가시면 HTTP 1.1 기준의 Header 의 상세 정보를 보실 수 있음.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html


'Programing > JSP/Servlet' 카테고리의 다른 글

[JSP] 커넥션 풀  (2) 2014.12.19
[Servlet] 서블릿 이벤트  (0) 2014.12.18
[Servlet] 서블릿 필터  (0) 2014.12.10
[Servlet] 서블릿 기초  (0) 2014.12.10
[Servlet] 데이터 저장 영역  (0) 2014.12.10

[JSP] 커넥션 풀

커넥션 풀(Connection Pool)


1. 커넥션 풀(DBCP)

데이터베이스와 연결된 커넥션을 미리 만들어서 풀(pool) 속에 저장해 두고 있다가 필요할 때 커넥션을 풀에서 쓰고 다시 풀에 반환하는 기법을 말한다.

웹 프로그램에서는 데이터베이스의 환경설정과 연결 관리 등을 따로 XML파일이나 속성 파일을 사용해서 관리하고, 이렇게 설정된 정보를 이름을 사용하여 획득하는 방법을 사용한다.

- 웹 컨테이너가 실행되면서 커넥션(connection) 객체를 미리 풀(pool)에 생성해 둡니다.

- DB와 연결된 커넥션(connection)을 미리 생성해서 풀(pool) 속에 저장해 두고 있다가 필요할 때에 가져다 쓰고 반환한다.

- 미리 생성해두기 때문에 데이터베이스에 부하를 줄이고 유동적으로 연결을 관리 할 수 있다.

이렇게 풀 속에 미리 생성되어 있는 커넥션을 가져다가 사용하고, 사용이 끝나면 커넥션을 풀에 반환한다.


2. 커넥션풀(DBCP) 사용 이유


만약 한명의 접속자가 웹 사이트에 접속했다고 가정한다. 해당 웹 사이트에서 접속자는 게시판을 확인하고 자신이 쓴 게시물을 수정하고 또 새로운 게시글을 등록한다고 가정해보자.

그럼 이 한명의 접속자로 인해 DB접속은 아래와 같이 발생한다.

1) 데이터 취득

2) 검색 후 데이터 취득

3) 데이터 갱신

4) 데이터 새등록


즉 한명의 접속자로 인해 단 시간에 4번의 DB 접속이 일어난다.

그럼 웹상에서 아주 짧은 시간에 몇번의 DB 접속이 일어날까? 만약 접속자가 1000명 이라면? 즉 커넥션 풀이란 미리 커넥션 객체를 생성하고 해당 커넥션 객체를 관리하는것을 의미한다.

즉 '커넥션 풀에 DB와 연결을 해 놓은 객체를 두고 필요할 때마다 커넥션 풀에서 빌려온다' 라고 이해하면 개념잡기에 쉬울듯 하다.

그리고 연결이 끝나면 다시 풀에 돌려준다.

커넥션 풀을 너무 크게 해놓으면 당연히 메모리 소모가 클것이고, 적게 해놓으면 커넥션이 많이 발생할 경우 대기시간이 발생할 것이다. 즉 웹 사이트 동시 접속자수 등 서버 부하에 따라 크기를 조정해야 할것이다.


cp.) 

서버는 동시에 사용할 수 있는 사람의 수라는 개념이 존재합니다.일반적인 커넥션을 이용하면 동시 접속자 수를 벗어나게 될 경우 에러(예외)가 발생하게 됩니다.

예외가 발생하면 그 접속자는 더이상 처리를 하지 못하므로, 사이트 이용자는 다시 접속을 시도해야하는 불편함이 있습니다.이를 해결하기 위해 탄생한 것이 커넥션 풀 입니다.

 커넥션 풀이란 동시 접속자가 가질 수 있는 커넥션을 하나로 모아놓고 관리한다는 개념입니다. 누군가 접속하면 자신이 관리하는 풀에서 남아있는 커넥션을 제공합니다.

하지만 남아있는 커넥션이 없는 경우라면 해당 클라이언트는 대기 상태로 전환시킵니다. 그리고 커넥션이 다시 풀에 들어오면 대기 상태에 있는 클라이언트에게 순서대로 제공합니다.

- JDBC를 통하여 DB에 연결하기 위해서는 드라이버(Driver)를 로드하고 커넥션(connection) 객체를 받아와야 한다.

- JDBC를 사용하면 사용자가 요청을 할 때마다 매번 드라이버를 로드하고 커넥션 객체를 생성하여 연결하고 종료하기 때문에 매우 비효율적이다.

- 이런 문제를 해결하기 위해서 커넥션풀(DBCP)를 사용한다.


3. 커넥션풀(DBCP)의 특징

 - 풀 속에 미리 커넥션이 생성되어 있기 때문에 커넥션을 생성하는 데 드는 연결 시간이 소비되지 않는다.

 - 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수가 많지 않다.

--> 커넥션 풀을 사용하면 커넥션을 생성하고 닫는 시간이 소모되지 않기 때문에 그만큼 어플리케이션의 실행 속도가 빨라지며, 또한 한 번에 생성될 수 있는 커넥션 수를 제어하기 때문에 동시 접속자 수가 몰려도 웹 어플리케이션이 쉽게 다운되지 않는다.


4. 그렇다면 동시 접속자 처리는..?

커넥션 풀에서 생성되어 있는 커넥션의 갯수는 한정적이다. 그렇다면 동시 접속자가 많아지면 어떻게 될까?

커넥션 풀은 누군자 접속하면 커넥션 풀에 남아 있는 커넥션을 제공하는 식이다. 하지만 남아있는 커넥션이 없을 경우 해당 클라이언트는 대기 상태로 전환이 되고, 커넥션이 반환되면 대기하고 있는 순서대로 커넥션이 제공된다.


5. 환경설정

(1) DBCP 라이브러리 추가

- 이전버전 commons-dbcp-1.4jar, commons-pool-1.6.jar, commons-collections-3.2.1-bin.zip 3개의 라이브러리는 톰캣 6.0 부터 tomcat-dbcp.jar 파일로 하나로 통합되었다.

- 톰캣설치폴더 lib 폴더에 있는 tomcat-dbcp.jar 파일을 웹프로젝트\WebContent\WEB-INF\lib 경로에 복사한다.



(2) DB 라이브러리 추가(오라클 - ojdbc.jar)



(3) \Servers\Tomcat v6.0 Server at localhost-config\context.xml 파일에 Resource 태그 추가


※ 커넥션 풀의 속성

  속성

 설명

 maxActive 

 커넥션 풀이 제공할 최대 커넥션 갯수 

 whenExhaustedAction

 커넥션 풀에서 가져올 수 있는 커넥션이 없을 때 어떻게 동작할지를 지정.

0일 경우 에러 발생

1일 경우 maxWait 속성에서 지정한 시간만큼 커넥션을 구할때까지 기다림.

2일 경우 일시적으로 커넥션을 생성해서 사용

 maxWait

whenExhaustedAction 속성의 값이 1일 때 사용되는 대기 시간.

단위는 1/1000초, 0보다 작을 경우 무한히 대기

 maxIdle 

 사용되지 않고 풀에 저장될 수 있는 최대 커넥션 갯수.

음수일 경우 제한이 없음

 minIdle

사용되지 않고 풀에 저장될 수 있는 최소 커넥션 갯수. 

 testOnBorrow 

 true일 경우 커넥션 풀에서 커넥션을 가져올 때 커넥션이 유효한지의 여부를 검사 

 testOnReturn 

 true일 경우 커넥션 풀에 커넥션을 반환할 때 커넥션이 유효한지의 여부를 검사 

 timeBetweenEvctionRunsMillis 

사용되지 않는 커넥션을 추출하는 쓰레드의 실행 주기 지정.

양수가 아닐 경우 실행되지 않는다.

시간 단위는 1/1000초. 

 numTestsPerEvictionRun 

사용되지 않는 커넥션을 몇 개 검사할 지 지정 

 minEvictableIdleTimeMillis 

사용되지 않는 커넥션을 추출할 때 이 속석에서 지정한 시간 이상 비활성화 상태인 커넥션만 추출.

양수가 아닌 경우 비활성화된 시간으로는 풀에서 제거되지 않음.

시간 단위는 1/1000초 

 testWhileIdle

 true일 경우 비활성화 커넥션을 추출할 때 커넥션이 유효한지의 여부를 검사해서 유효하지 않은 커넥션은 풀에서 제거.



(4) 웹프로젝트\WebContent\WEB-INF\web.xml 파일에 <resource-ref> 태그 추가

- <res-ref-name> 태그의 이름은 contex.xml 파일 <resource>태그의 name 속성의 이름과 같아야한다.

- (4) 작업은 톰캣 6.0 이상부터는 생략 가능하다.



(5) JAVA 코드로 연결

- 서블릿에서 작성한다. (MVC 구조로 구현할 경우)

- 예외를 가지고 있으므로 예외처리를 해준다.

import java.sql.Connection;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.sql.DataSource;

 

public class DBCP {

    /*

     * 이 코드를 아래와 같이 줄여서 작성가능하다.

    Context initContext = new InitialContext();

    Context envContext  = (Context) initContext.lookup("java:/comp/env");

    // ("java:comp/env"): JNDI 서비스에 접근하기 위한 기본 이름(이 자원을 찾겠다.--> web.xml의 <res-ref-name>

    DataSource dataSource = (DataSource) envContext.lookup("jdbc/oracle");

    Connection conn = dataSource.getConnection();

    */

     

    Context context = new InitialContext();

    DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/oracle");

    Connection con = dataSource.getConnection();        

}



(6) servers > context.xml 파일 복사

- 서버가 변경되거나 서버에서 프로젝트를 제거하는 경우에 다시 추가해서 실행하는 번거로움이 있다.

- \Servers\Tomcat v6.0 Server at localhost-config\context.xml 파일을 복사한다.

- 웹프로젝트\WebContent\WEB-INF\ 디렉터리에 붙여넣기 한다.


6. JNDI(Java Naming and Directory Interface) 

설정된 정보를 이름으로 획득하려면 자바의 네이밍 API를 사용해야 한다. 네이밍 패키지의 클래스를 가지고 이름으로 객체를 획득하는 것을 JNDI(Java Naming and Directory Interface)라고 한다.

- 서비스가 다른 서비스를 탐색할 때 유용하게 사용된다. (분산된 자원)

- 분산된 자원 끼리의 탐색을 원할하게 하기 위한 type casting 임. (DNS 도 이에 속함) 

- JNDI에 설정해 놓았다는것은 Context.xml에 리소스를 생성해놓은 것을 말한다.

cf.) 

이름을 이용해서 원하는 정보 혹은 자원(Connection)을 찾을 수 있는 서비스

javax.naming 서비스

initialContext 클래스


(1) META-INF/context.xml

리소스 등록하는 설정파일

<Context> 

<!-- Resource를 등록하여 웹에서 JNDI로 호출할 이름과 정보를 설정한다. -->

   <Resource name="jdbc/myconn" auth="Container" type="javax.sql.DataSource"

   factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"

   driverClassName="org.gjt.mm.mysql.Driver"

   url="jdbc:mysql://localhost:3306/web_java?autoReconnect=true"

   username="root" password="12345678" 

   maxActive="100" maxIdle="30" maxWait="10000"

   removeAbandoned="true" removeAbandonedTimeout="60"/> 

   <!-- 

1. name : JNDI로 호출될 이름을 설정한다. (접근 -> java:comp/env/jdbc/myconn)

   2. auth : DBCP를 관리할 관리자 (Container or Application)

   3. type : 해당 resource의 return type 

      (DataSource는 Connection 객체를 반환할 수 있다.)

   4. factory : dbcp를 유용하는 관리 클래스 (Tomcat 5.x에 기본으로 존재하는 클래스)

      (직접 DBCP 클래스를 지정해도 동작하는데 문제가 없다.)

      (그러나, Factory 클래스를 이용하면 좀더 안정적으로 관리할 수 있다.)

   5. driverClassName : JDBC를 이용하기 위한 드라이버 클래스

   6. url : DB의 접속 URL (속성으로 자동 재 접속을 선택했다.)

   7. username : DB의 계정 명

   8. password : 계정에 대한 비밀번호

   9. maxActive : 최대 접속 허용 개수

   10. maxIdle : DB Pool에 여분으로 남겨질 최대 Connection 개수

   11. maxWait : DB 연결이 반환되는 Timeout의 최대 시간 (-1은 무한 대기)

   12. removeAbandoned : Connection이 잘못 관리되어 버려진 연결을 찾아 재활용할 것인지의 여부 설정

       (true 설정일 때 현재 DB 연결이 적으면 버려진 연결을 찾아 재활용)

   13. removeAbandonedTimeout : 버려진 연결로 인식할 기본 시간 설정

       (초 단위로 해당 시간이 지나면 버려진 연결로 인식한다.)

   -->   

</Context>


(2) WEB-INF/web.xml
<servlet-mapping>
<servlet-name>My_06</servlet-name>
<url-pattern>/Servlet_06</url-pattern>
</servlet-mapping>
<resource-ref>
<description>My SQL Resource</description><!-- 리소스 설명 -->
<res-ref-name>jdbc/myconn</res-ref-name><!-- 리소스 이름(JNDI명) -->
<res-type>javax.sql.DataSource</res-type><!-- 리턴 Type -->
<res-auth>Container</res-auth><!-- 관리 계층 -->
</resource-ref>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>


(3) 자바코드

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.sql.*;

import javax.sql.*;//DataSource 클래스를 위해 사용

import javax.naming.*;//JNDI를 위해 사용


public class Round16_06_Servlet extends HttpServlet {

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

request.setCharacterEncoding("euc-kr");

String subject = request.getParameter("subject");

String author = request.getParameter("author");

String contents = request.getParameter("contents");

response.setContentType("text/html;charset=euc-kr");

PrintWriter out = response.getWriter();

out.println("<html><body><center><h3>");

Connection conn = null;

PreparedStatement pstmt = null;

String query = "insert into Round16_Table_01 values (null, ?, ?, ?)";

try {

Context context = new InitialContext();

//JNDI를 이용하기 위한 객체 생성

DataSource source = (DataSource)context.lookup("java:comp/env/jdbc/myconn");

  // lookup(): 등록된 naming 서비스로부터 자원을 찾고자할 때 사용하는 메서드

//context 객체를 통해 이름으로 Resource를 획득한다. 

  //("jdbc/myconn"): JNDI 서비스에 접근하기 위한 기본 이름(이 자원을 찾겠다.--> web.xml의 <res-ref-name>

//JNDI의 모든 이름은 기본적으로 java:comp/env에 등록되어 있다.

//해당 영역에서 jdbc/myconn으로 설정된 이름을 획득한다.

conn = source.getConnection();

//source로 부터 Connection 객체를 획득한다. 

//이 객체는 이제 Container의 DBCP에 의해 관리된다. 

}catch(Exception e) {}

try {

pstmt = conn.prepareStatement(query);

pstmt.setString(1, subject);

pstmt.setString(2, author);

pstmt.setString(3, contents);

int res = pstmt.executeUpdate();

if(res > 0)

out.println("Success Save!!");

pstmt.close();

conn.close();

}catch(Exception e) {

out.println("SQL Process Error : " + e.getMessage());

}

out.println("</h3></center></body></html>");

}

}



'Programing > JSP/Servlet' 카테고리의 다른 글

[JSP] HTTP 헤더  (0) 2014.12.25
[Servlet] 서블릿 이벤트  (0) 2014.12.18
[Servlet] 서블릿 필터  (0) 2014.12.10
[Servlet] 서블릿 기초  (0) 2014.12.10
[Servlet] 데이터 저장 영역  (0) 2014.12.10

[Servlet] 서블릿 이벤트


서블릿 이벤트

서블릿은 다양한 시점에 발생되는 이벤트와 이벤트를 처리하기 위한 인터페이스를 정의하고 있다. 이들 이벤트와 인터페이스를 이용하면 웹 어플리케이션에서 필요로 하는 데이터의 초기화나 요청 처리 등을 추적할 수 있게 된다. 서블릿 규약은 다양한 이벤트를 처리할 수 있는 인터페이스를 정의하고 있는데, 이 장에서는 그 중에서 ServletContextListener이다. 데이터 저장 영역(application, session, request)에 데이터가 들어가고 나가는 혹은 그 객체가 생성되고 소멸되는 일련의 작업들에 대해 컨트롤한다.


1. 이벤트가 사용되는 경우

1) 컨텍스트가 초기화되는 경우

2) 세션이 생기거나 소멸되는 경우

3) 속성이 바뀌는 경우

--> 이런 이벤트에 대해서 미리 web.xml 파일에 등록해두면 웹 서버는 자동으로 이벤트를 감지하고 우리가 지정한 클래스 내의 메서드를 실행해준다. 이벤트는 외부의 변화보다는 내부의 변화를 처리하는 경우가 많다. 서블릿에서 이벤트 클래스를 실행되게 하려면 무엇보다 web.xml 파일의 설정이 중요하다. 초기에 웹 서버가 구동하면서 해당 이벤트를 대기 상태로 두기 때문이다. 


2. ServletContextListener를 이용한 이벤트 처리

웹 컨테이너는 웹 어플리케이션(컨텍스트)이 시작되거나 종료되는 시점에 특정 클래스의 메서드를 실행할 수 있는 기능을 제공하고 있다.

이 기능을 사용하면 웹 어플리케이션을 실행하는 데 필요한 초기화 작업이나 웹 애플리케이션이 종료된 후 사용된 자원을 반환하는 등의 작업을 수행할 수 있다.

웹 어플리케이션이 시작되고 종료될 때 특정한 기능을 실행하려면 다음과 같이 코드를 작성해야 한다.

1 javax.servlet.ServletContextListener 인터페이스를 구현한 클래스를 작성한다.

2 web.xml 파일에 1에서 작성한 클래스를 등록한다.


javax.servlet.ServletContextListener 인터페이스는 웹 어플리케이션이 시작되거나 종료될 때 호출되는 메서드를 정의한 인터페이스로서, 다음과 같은 두 개의 메서드가 정의되어 있다.

public void contextInitialized(SerlvetContextEvent sce) 웹 애플리케이션이 초기화될 때 호출된다.

public void contextDestoryed(ServletContextEvent sce) 웹 애플리케이션이 종료될 때 호출된다.


ServletContextListener 인터페이스를 구현한 클래스가 웹 애플리케이션이 시작되거나 종료될 때 실행되도록 하려면 web.xml <listener> 태그와 </listener-class> 태그를 사용해서 완전한 클래스 이름을 명시해주면 된다.
<web-app>
<listener>
<listener-class>mvcjsp.jdbc.loader.DBCPInitiListener</listener-class>
</listener>
<listener>
<!-- 웹 애플리케이션의 시작/종료 이벤트를 처리할 리스너 클래스의 완전한 이름을 값으로 갖는다. -->
<listener-class>mvcjsp.jdbc.chap24.CodeInitListener</listener-class>
</listener>
</web-app>

ServletContextListener 인터페이스에 정의된 두 메서드는 모두 파라미터로 javax.servlet.ServletContextEvent 타입의 객체를 전달 받는데, ServletContextEvent 클래스는 시작되거나 종료된 웹 애플리케이션 컨텍스트를 구할 수 있는 getServletContext() 메서드를 제공하고 있다.
public ServletContext getServletContext()

<web-app>
<context-param>
<param-name>jdbcdriver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
</web-app>

cf.) getServletContext() 메서드가 리턴하는 ServletContext 객체는 JSP의 application 기본 객체와 동일한 객체로서, ServletContext 객체를 이용하면 web.xml 파일에 설정된 어플리케이션 초기화 파라미터를 
구할 수 있다. 어플리케이션 초기화 파라미터는 <context-param> 태그를 사용해서 설정한다.

(1) ServletContext가 제공하는 초기화 파라미터 관련 메서드
1) String getInitParameter(String name)
지정한 이름을 갖는 초기화 파라미터의 값을 리턴한다. 존재하지 않을 경우 null을 리턴한다. name 파라미터에는 <param-name> 태그로 지정한 이름을 입력한다.

2) java.util.Enumeration.getInitParameterNames()
web.xml 파일에 정의된 초기화 파라미터의 이름 목록을 Enumeration 타입으로 리턴한다.
--> 초기화 파라미터는 주로 웹 어플리케이션을 구동하는 데 필요한 초기화 작업을 수행하는데 필요한 값을 설저하는 데 사용한다.

※ 리스너의 실행 순서
<listener>
<listener-class>mvcjsp.jdbc.loader.AListener</listener-class>
</listener>
<listener>
<listener-class>mvcjsp.jdbc.loader.BListener</listener-class>
</listener>
web.xml에 한 개이상의 리스너가 등록되어 있는 경우, contextInitialized() 메서드는 등록된 순서대로 실행되고 contextDestoryed() 메서드는 등록된 반대 순서대로 실행된다. 즉, 위 코드의 경우 웹 애플리케이션이 시작될 때는 AListener가 먼저 실행되고 그 다음에 BListenter가 실행된다. 반대로 웹 어플리케이션이 종료될 때는 BListener가 실행되고 그 다음에 AListener가 실행된다.

3. web.xml에서 사용되는 태그

(1) <listener> 태그는 서블릿의 이벤트를 대기 상태로 둔다.

cp.) <listener> 태그를 가지고 설정할 수 있는 이벤트는 다음과 같다.

- ServletContextListener 이벤트 

ServletContext 객체가 초기화되거나 소멸될 때 발생하는 이벤트이다. contextInitialized(),contextDestoryed() 메서드가 있다.


- ServletContextattributeListener 이벤트

ServletContext 객체에 속성이 추가되거나 삭제되거나, 수정될 때 발생하는 이벤트이다. attributeAdded(), attributeRemoved(), attributereplaced() 메서드가 있다.


- HttpSessionListener 이벤트

HttpSession 객체가 생성되거나 소멸될 때 발생하는 이벤트이다. sessionCreated(), sessionDestroyed() 메서드가 있다.


- HttpSessionAttributeListener 이벤트

ServletRequest 객체가 초기화되거나 소멸될 때 발생하는 이벤트이다. requestInitialzed(), requestDestroyed() 메서드가 있다.


- ServletRequestAttributedListener 이벤트

ServletRequest 객체에 속성이 추가되거나 삭제되거나, 수정될 때 발생하는 이벤트이다. attributeAdded(), attributeRemoved(), attributeReplaced() 메서드가 있다.


(2) <context-param> 태그는 초기화 매개 변수가 된다.


(3) 예제 1

1) web.xml

<display-name>Round18</display-name>

<context-param>

<param-name>co_name</param-name>

<param-value>승현 주식회사</param-value>

</context-param>

<context-param>

<param-name>co_tel</param-name>

<param-value>02-1234-1234</param-value>

</context-param>

<context-param>

<param-name>admin_email</param-name>

<param-value>kimsh@sh.com</param-value>

</context-param>


2) 자바코드

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


public class Round18_03_Servlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

ServletContext context = this.getServletContext();

String co_name = context.getInitParameter("co_name");

String co_tel = context.getInitParameter("co_tel");

String admin_email = context.getInitParameter("admin_email");

response.setContentType("text/html;charset=euc-kr");

PrintWriter out = response.getWriter();

out.println("<html><head>");

out.println("<style type='text/css'>");

out.println(".n_bo { border:none }");

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

out.println("</head><body><center>");

out.println("회사상호 : ");

out.println("<input type='text' class='n_bo' value='" + co_name + "'/><br/>");

out.println("회사전번 : ");

out.println("<input type='text' class='n_bo' value='" + co_tel + "'/><br/>");

out.println("대표메일 : ");

out.println("<input type='text' class='n_bo' value='" + admin_email + "'/><br/>");

out.println("</center></body></html>");

}

}

화면 출력)

회사상호: 승현 주식회사

회사전번: 02-1234-1234

대표메일: kimsh@sh.com


이렇게 ServletContext 객체를 가지고 web.xml 파일에 등록된 초기화 매개변수들을 가져와서 사용할 수 있다. 그러나 ServletContext 객체와 관련된 이벤트에서는 이들 값의 추가, 삭제, 수정에 대한 정보를 확인할 수 없다. 이벤트가 관리하는 값들은 오직 해당 객체의 속성들뿐이며, 매개변수는 관리 대상에서 제외된다.


(4) 예제2

이제 ServletContext 객체와 관련된 이벤트를 처리해 보도록 하자. ServletContext 객체의 변화에 대해 반응하는 메서드들은 ServletContextListener와 ServletContextAttributeListener 인터페이스에 정의되어 있기 때문에 이를 구현해 주어야 한다.

1) web.xml : 태그 순서 주의!

<listener>

<display-name>Context Listener</display-name>

<listener-class>Round18_04_Servlet_Listener</listener-class>

</listener>

<context-param>

<param-name>co_name</param-name>

<param-value>승현 주식회사</param-value>

</context-param>


2) 자바코드

import javax.servlet.*;


public class Round18_04_Servlet_Listener implements ServletContextListener, ServletContextAttributeListener {


public void contextInitialized(ServletContextEvent e) {

  // 톰캣이 구동될 때 실행된다.

System.out.println("ServletContext 가 초기화 되었습니다.");

System.out.println("init context = " + e.getServletContext());

}

public void contextDestroyed(ServletContextEvent e) {

  // 톰캣이 종료될 때 실행된다.

System.out.println("ServletContext 가 소멸 되었습니다.");

System.out.println("dest context = " + e.getServletContext());

}

public void attributeAdded(ServletContextAttributeEvent e) {

        // ServletContext 객체에 속성이 새로 추가될 때 실행된다.

System.out.println("Context 영역에 값이 추가 되었습니다.");

System.out.println("added = " + e.getName() + " : " + e.getValue());

}

public void attributeRemoved(ServletContextAttributeEvent e) {

        // ServletContext 객체의 속성이 삭제될 때 실행된다.

System.out.println("Context 영역에 값이 삭제 되었습니다.");

System.out.println("removed = " + e.getName() + " : " + e.getValue());

}

public void attributeReplaced(ServletContextAttributeEvent e) {

        // ServletContext 객체의 속성이 수정될 때 수정 직전에 실행된다.

System.out.println("Context 영역에 값이 변경 되었습니다.");

System.out.println("replaced = " + e.getName() + " : " + e.getValue());

}

}


(5) 예제 3

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


public class Round18_04_Servlet extends HttpServlet {

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

response.setContentType("text/html;charset=euc-kr");

PrintWriter out = response.getWriter();

out.println("<html><body><center>");

out.println("<form method='post'>");

out.println("<input type='submit' value='Context 값 할당 하기'/>");

out.println("</form></center></body></html>");

}

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

ServletContext context = this.getServletContext();

context.setAttribute("my_name", "김승현");

context.setAttribute("my_name", "승현");

context.removeAttribute("my_name");

response.setContentType("text/html;charset=euc-kr");

PrintWriter out = response.getWriter();

out.println("<html><body><center>");

out.println("Context 값 추가, 삭제, 변경 성공!");

out.println("</center></body></html>");

}

}

ServletContext 객체의 속성을 바꾸는 서블릿 코드이다.

웹서버가 구동시점에는 최초로 contextInitialzed() 메서드가 실행되어 ServletContext 객체가 초기화된다.

URL 패턴에 맞추어 서블릿을 실행하면  페이지가 열리고 아무런 이벤트도 발생하지 않는다. 여기에서 Context 값 할당 하기 단추를 누르면 doPost() 메서드가 실행되면서 ServletContextAttributeListener 이벤트가 발생하여 차례로 추가, 삭제, 수정 메시지를 확인할 수 있다.

이상과 같이 이벤트를 web.xml 파일에 등록하면 웹에서 특정 동작에 이벤트가 발생해서 해당 메서드를 실행하게 된다.


'Programing > JSP/Servlet' 카테고리의 다른 글

[JSP] HTTP 헤더  (0) 2014.12.25
[JSP] 커넥션 풀  (2) 2014.12.19
[Servlet] 서블릿 필터  (0) 2014.12.10
[Servlet] 서블릿 기초  (0) 2014.12.10
[Servlet] 데이터 저장 영역  (0) 2014.12.10

[Servlet] 서블릿 필터

서블릿 필터


서블릿은 웹에서 실행되는 프로그램이기 때문에 네트워크 통신의 사이 사이에서 특별한 동작을 만들어 낼 수 있다.

예를 들면, 홈페이지에 접속하기 직전에 이벤트 창을 띄운다든지 아니면 데이터를 입력한 후 실제 저장하는 페이지로 넘어가지 전에 넘겨지는 데이터들에 대하여 한글 처리를 한다든지 등의 작업을 할 수 있다.

또한, 세션이 만들어지거나 삭제될 때 이것을 감지하는 작업도 할 수 있다.

이렇게 여러가지 동작에 있어서 사이 사이에 끼워져서 실행되는 서블릿의 클래스를 필터라 부르고 동작이 발생할 때 감지하는 것을 이벤트라 부른다.


1. 서블릿 필터


필터는 말 그대로 여과 기능을 수행한다. 웹 프로그램에서도 하나의 페이지에서 다른 페이지로 전달되는 데이터가 필터를 지나 가공되거나 걸러지게 된다.

일반적으로 웹 프로그램은 A->B라는 식으로 실행 흐름이 있다. 그러나 기존의 흐름에 C라는 작업을 끼워 넣을 수 있다면 도움이 될 것이다.

예를 들어 A에서 B로 넘겨지는 데이터에 인코딩을 한다든지 데이터에 세션을 확인해서 B 페이지를 보여 줄지 작업 등을 할 수 있다.


(1) 본문

필터는 데이터를 가로채서 처리를 한다고 생각하면 된다. 하나의 작업에서 다른 작업으로 넘어갈 때나 어떤 작업이 또 다른 작업으로 넘어갈 때 데이터를 가로채서 처리를 할 수 있다.

요청이나 세션에 담긴 데이터뿐 아니라 헤더에도 필터가 적용될 수 있다. 기존 작업이 일어나기 직전(전처리)이나 일어나 직후(후처리) 모두 필터가 적용되는 시점이다.


웹 관련 클래스가 모두 그러하듯이 필터 클래스의 메서드도 요청 객체와 응답 객체를 매개변수로 가진다.

여기에 추가적으로 FilterChain 객체를 매개 변수로 갖는데, 이유는 필터 기능 자체가 페이지의 분기점에 있기 때문이다.

따라서, FilterChain 객체는 필터 기능이 완료되고 다음 페이지로 연결하는 기능에 사용된다. 또한, 서블릿의 일반 클래스처럼 web.xml 파일에 등록해야 한다.

당연하겠지만, 일반 클래스가 아니므로 <servlet> 태그가 아니라, <filter> 태그를 사용한다.

필터 관련 클래스로 javax.servlet.Filter, javax.servlet.FilterConfig, javax.servlet.FilterChain 등이 있다.


(2) 필터가 웹 프로그램에서 사용되는 경우

- 전달받은 데이터를 인코딩하는 경우

- 세션 데이터를 인증하는 경우

- 이벤트나 공지 등 팝업을 추가 하는 경우


(3) 예제(전달받은 데이터를 인코딩하는 경우)

1) web.xml

  <filter> <!--<filter> 태그는 <servlet> 태그보다 앞에 놓여야 한다./ 필터를 지정하는 역할-->

<filter-name>My_Ft_01</filter-name> <!--getFilterName()-->

<filter-class>Round18_01_Filter</filter-class>

</filter>

  <filter-mapping>

<filter-name>My_Ft_01</filter-name>

<url-pattern>/Servlet_01</url-pattern> /Servlet_01 서블릿에 접근하기 전에 필터를 거는 것이다.

    <!--<url-pattern>/*</url-pattern>--> URL 패턴에서 '/*' 와 같이 적으면 모든 페이지에 접근하기 전에 해당 필터 클래스가 실행된다.

</filter-mapping>

  <servlet>

<servlet-name>My_01</servlet-name>

<servlet-class>Round18_01_Servlet</servlet-class>

</servlet>


2) 자바코드

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


public class Round18_01_Filter implements Filter {

// 필터는 Filter 인터페이스를 구현해야 한다.

public void init(FilterConfig fc) throws ServletException { } // 필터 초기화 작업

  // init() 메서드의 매개변수는 FilterConfig 객체이다.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

   // 1. request 파라미터를 이용하여 요청의 필터 작업 수행

  // doFilter() 메서드를 사용하고, 매개 변수로는 반드시 ServletRequest, ServletResponse, FilterChain 세 가지를 사용한다. 

HttpServletRequest h_request = (HttpServletRequest)request;

String method = h_request.getMethod();

if(method.equalsIgnoreCase("POST")) {

request.setCharacterEncoding("euc-kr");

}

  

chain.doFilter(request, response);

    // 2. 체인의 다음 필터 처리

    // 3. response를 이용하여 응답의 필터링 작업 수행

    // 필터 메서드 내용부의 마지막 코드는 현재까지 작업한 내용을 적용하고 연결된 페이지로 이동하도록 만들어 준다. 이런 역할을 하는 메서드가 chain 객체의 doFilter()이다.

    // 세번째 매개변수인 FilterChain 클래스의 객체인 chain을 이용해서 다른 필터나 서블릿과 연결하는 코드를 반드시 작성해야 한다.

}

public void destroy() {

  // 4. 주로 필터가 사용한 자원을 반납

  }

}


(4)  web.xml 필터 설정하기
<web-app>    
     <filter><!-- 웹 어플리케이션에서 사용될 필터를 지정하는 역할 -->
        <filter-name>FilterName</filter-name><!-- getFilterName() -->
        <filter-class>javacan.filter.FilterClass</filter-class>
        <init-param><!-- getInitParameter() -->
           <param-name>paramName</param-name><!-- getInitParameter(String name)-->paramName은 파라미터 name 변수의 key값-->
 <!-- 필터가 초기화될 때, 즉 필터의 init() 메소드가 호출될 때 전달되는 파라미터 값, 이는 서블릿의 초기화 파라미터와 비슷한 역할을 하며 주로 필터를 사용하기 전에 
 초기화해야 하는 객체나 자원을 할당할 때 필요한 정보를 제공하기 위해 사용된다.-->
           <param-value>value</param-value><!-- getInitParameter(String name)에서 name 값--> value는 name 변수의 value값 -->
        </init-param>
     </filter>     
     <filter-mapping> <!-- 특정 자원에 대해 어떤 필터를 사용할지를 지정 -->
        <filter-name>FilterName</filter-name>
        <url-pattern>*.jsp</url-pattern>
        <!-- 클라이언트가 jsp 확장자를 갖는 자원을 요청할 경우 FilterName가 사용되도록 지정, 클라이언트가 요청한 특정 URI에 대해서 필터링을 할 때 사용 -->
     </filter-mapping>   
</web-app>
'/'로 시작하고 '/*'로 끝나는 url-pattern은 경로 매핑을 위해서 사용된다.
'*.'로 시작하는 url-pattern은 확장자에 대한 매핑을 할 때 사용된다.
오직 '/'만 포함하는 경우 어플리케이션의 기본 서블릿으로 매핑한다.
나머지 다른 문자열을 정확한 매핑을 위해서 사용된다.

   <filter-mapping>
        <filter-name>AuthCheckFilter</filter-name>
        <servlet-name>FileDownload</servlet-name>
     </filter-mapping>
     
     <servlet>
        <servlet-name>FileDownload</servlet-name>
        ...
     </servlet>
<url-pattern> 태그를 사용하지 않고 대신 <servlet-name> 태그를 사용함으로써 특정 서블릿에 대한 요청에 대해서 필터를 적용할 수도 있다. 예를 들면 다음과 같이 이름이 FileDownload인 서블릿에 대해서 AuthCheckFilter를 필터로 사용하도록 할 수 있다.

<filter-mapping>
<filter-name>AuthCheckFilter</filter-name>
<servlet-name>FileDownload</servlet-name>
<dispather>INCLUDE</dispather>
</filter-mapping>
<dispather> 태그는 실행되는 자원을 클라이언트가 요청한 것인지, 아니면 RequestDispather의 forward()를 통해서 이동한 것인지 아니면, 
아니면 include() 통해서 포함되는 것인지에 따라서 필터를 적용하도록 지정할 수 있다.

<dispather> 태그가 가질 수 있는 값은 다음과 같다.
REQUEST: 클라이언트의 요청인 경우에 필터를 사용한다.
FORWARD: forward()를 통해서 제어를 이동하는 경웽 필터를 사용한다.
INCLUDE: include()를 통해서 포함하는 경우에 필터를 사용한다.

2. Filter 인터페이스
Filter 인터페이스는 다음과 같은 메서드를 선언하고 있으며, 필터 기능을 제공할 클래스는 Filter 인터페이스를 알맞게 구현해주어야 한다.
1) public void init(FilterConfig filterConfig) throws ServletException 
--> 필터를 초기화할 때 호출한다.

2) public void doFilter(ServletRequest request, ServletResponse reponse, FilterChain chain) throws java.io.IOException, ServletException 
--> 체인을 따라 다음에 존재하는 필터로 이동한다. 체인의 가장 마지막에는 클라이언트가 요청한 최종 자원이 위치한다.

3) public void destory() 
--> 필터가 웹 컨테이너에서 삭제될 때 호출된다.
위 메서드에서 필터의 역할을 하는 메서드가 바로 doFilter() 메서드이다. 서블릿 컨테이너는 사용자가 특정한 자원을 요청했을 때 그 자원 사이에 필터가 종재할 경우 필터 객체의 doFilter() 메서드를 호출하며 바로 이 시점부터 필터가 작용하기 시작한다. 

public  class FirstFilter implements Filter{
public void init(FilterConfig filterConfig) throws ServletException{// 필터 초기화 작업
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{
// 1. request 파라미터를 이용하여 요청의 필터 작업 수행
....
// 2. 체인의 다음 필터 처리
chain.doFilter(request, response);
// 3. response를 이용하여 응답의 필터링 작업 수행
....
}
  // 4. 주로 필터가 사용한 자원을 반납
public void destory{
}
}
위 코드에서 Filter 인터페이스의 doFilter() 메서드는 요청이 있을 때마다 매번 실행된다. 예를 들어, 클라이언트가 요청한 자원이 필터를 거치는 경우 클라이언트의 요청이 있을 때 마다 doFilter() 메서드가 호출되며, doFilter() 메서드는 JSP/서블릿과 마찬가지로 요청에 대해서 알맞은 작업을 처리하게 된다.

※ doFIilter() 메서드내에서 이루어지는 작업의 순서
1) request 파라미터를 이용하여 클라이언트의 요청 필터링: 1단계에서는 RequestWrapper 클래스를 사용하여 클라이언트의 요청을 변경한다.
2) chain.doFiter() 메서드 호출: 2단계에서는 요청의 필터링 결과를 다음 필터에 전달한다.
3) response 파라미터를 사용하여 클라이언트로 가는 응답 필터링: 3단계에서는 체인을 통해서 전달된 응답 데이터를 변경하여 그 결과를 클라이언트에 전송한다.

※ FilterConfig가 제공하는 메서드

 메서드

 리턴 타입

 설명

 getFilterName()

 String

 설정파일에서 <filter-name>에서 지정한 필터의 이름을 리턴한다.

 getInitParameter(String name)

 String

 설정파일의 <init-param>에서 지정한 초기화 파라미터의 값을 읽어온  다. 존재하지 않을 경우 null을 리턴한다.

 getInitParameterNames()

 Enumeration<String>

 초기화 파라미터의 이름 목록을 구한다.

 getServletContext()

 ServletContext

 서블릿 컨텍스트 객체를 구한다.


3. 요청 및 응답 래퍼 클래스

필터가 필터로서의 제기능을 하기 위해서는 클라이언트의 요청을 변경하고, 또한 클라이언트로 가는 응답을 변경할 수 있어야 할 것이다. 

이러한 변경을 할 수 있도록 해주는 것이 바로 ServletRequestWrapperServletResponseWrapper이다.

서블릿 요청/응답 래퍼 클래스를 이용함으로써 클라이언트의 요청 정보를 변경하여 최종 자원인 서블릿/JSP/HTML/기타 자원에 전달할 수 있고, 또한 최종 자원으로부터의 응답 결과를 변경하여 새로운 응답 정보를 클라이언트에 보낼 수 있게 된다.


서블릿 요청/응답 래퍼 클래스로서의 역할을 수행하기 위해서는 javax.servlet 패키지에 정의되어 있는 ServletRequestWrapper 클래스와 ServletResponseWrapper 클래스를 상속받으면 된다. 

하지만, 대부분의 경우 HTTP 프로토콜에 대한 요청/응답을 필터링 하기 때문에 이 두 클래스를 상속받아 알맞게 구현한 HttpServletRequestWrapper 클래스와HttpServletResponseWrapper 클래스를 상속받는 경우가 대부분일 것이다.


HttpServletRequestWrapper 클래스와 HttpServletResponseWrapper 클래스는 모두 javax.servlet.http 패키지에 정의되어 있으며, 이 두 클래스는 각각 HttpServletRequest 인터페이스와 HttpServletResponse 인터페이스에 정의되어 있는 모든 메소드를 이미 구현해 놓고 있다. 필터를 통해서 변경하고 싶은 정보가 있을 경우 그 정보를 추출하는 메소드를 알맞게 오버라이딩하여 필터의 doFilter() 메소드에 넘겨주기만 하면 된다. 예를 들어, 클라이언트가 전송한 "company" 파리머터의 값을 무조건 "JavaCan.com"으로 변경하는 요청 래퍼 클래스는 다음과 같이 HttpServletRequestWrapper 클래스를 상속받은 후에 getParameter() 메소드를 알맞게 구현하면 된다.


import java.util.Collections;

import java.util.Enumeration;

import java.util.HashMap;

import java.util.Map;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletRequestWrapper;


// 요청 레퍼 클래스로 동작하기 위해 HttpServletRequestWrapper 클래스를 상속받는다.

public class NullParameterRequestWrapper extends HttpServletRequestWrapper {


private Map<String, String[]> parameterMap = null;

public NullParameterRequestWrapper(HttpServletRequest request) {

super(request);

// 생성자는 전달받은 request의 파라미터의 정보를 parameterMap에 저장한다.

parameterMap = new HashMap<String, String[]>(request.getParameterMap());

}

// checkNull() 메서드는 검사할 파라미터의 이름 목록을 인자로 전달받는다. 인자로 전달받은 각각의 이름을 검사해서 해당 이름의 파라미터가 존재하지 않으면

// 기본값으로 빈 문자열을 저장한다.

public void checkNull(String[] parameterNames) {

for (int i = 0; i < parameterNames.length; i++) {

if (!parameterMap.containsKey(parameterNames[i])) {

String[] values = new String[] { "" };

parameterMap.put(parameterNames[i], values);

}

}

}


@Override

public String getParameter(String name) {

String[] values = getParameterValues(name);

if (values != null && values.length > 0)

return values[0];

return null;

}


@Override

public Map<String, String[]> getParameterMap() {

return parameterMap;

// 파라미터와 관련된 메서드를 구현해서 parameterMap으로부터 파라미터값을 읽어오도록 한다.

}


@Override

public Enumeration<String> getParameterNames() {

return Collections.enumeration(parameterMap.keySet());

}


@Override

public String[] getParameterValues(String name) {

return (String[]) parameterMap.get(name);

}

}




'Programing > JSP/Servlet' 카테고리의 다른 글

[JSP] 커넥션 풀  (2) 2014.12.19
[Servlet] 서블릿 이벤트  (0) 2014.12.18
[Servlet] 서블릿 기초  (0) 2014.12.10
[Servlet] 데이터 저장 영역  (0) 2014.12.10
[Servlet] 초기화 파라미터  (0) 2014.12.09

[Servlet] 서블릿 기초

서블릿 기초


-HttpServlet을 상속받는 클래스는 doGet() 메소드를 오버라이딩할 수 있기 때문에 이 클래스는 서블릿으로 동작할 수 있게된다.


1. 서블릿 기본

1 서블릿 규약에 따라 자바 코드를 작성한다.

2 자바 코드를 컴파일해서 클래스 파일을 생성한다.

3 클래스 파일을 /WEB-INF/classes 디렉토리에 패키지에 알맞게 위치시킨다.

4 web.xml 파일에 서블릿 클래스를 설정한다.(필요한 경우 진행)

5 톰캣 등의 컨테이러를 재실행한다.(서블릿 리로딩 기능이 있는 경우 생략)

6 웹 브라우저에서 확인한다.


MVC 패턴을 지원하는 서블릿 코드를 직접 구현하지 않더라도 서블릿 자체에 대해서 이해하는 것은 웹 개발을 하는데 있어서 중요한 부분이다.

HttpServlet 클래스는 서블릿 규약에 포함된 클래스로서, 이 클래스를 사용하려면 클래스패스에 /[톰캣]/lib/servlet-api.jar 파일을 포함시켜 주어야 한다.

서블릿 클래스를 구현하려면 먼저 HttpServlet 클래스를 상속받은 클래스를 작성해야 한다. 

HttpServlet 클래스를 상속 받았다면, 처리하고자 하는 HTTP 방식(method)에 따라 알맞은 메서드를 오버라이딩해서 구현해 주어야 한다.

예를 들어, doGet() 메서드를 오버라이딩 해주면 된다. doGet() 메서드는 HttpServletRequest와 HttpServletResponse의 두 파라미터를 갖는데,

이 두 파라미터는 각각 JSP의 request 기본 객체, response 기본 객체와 동일하다.

오버라이딩 한 메서드에서는 request를 이용해서 웹 브라우저의 요청 정보를 읽어오던가 response를 이용해서 응답을 전송할 수 있다.


2. 서블릿의 라이프사이클

① public void init( ) 또는 public void init(ServletConfig sc) {...} 메서드에 의한 초기화

web.xml 파일이 실행되면서나 최초 접속하는 클라이언트에 의해 실행된다.(한번 실행되면 서버가 종료될 때 까지 두번 다시 실행하지 않음)

② public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {...}

클라이언트의 요청에 의해 실행되는 메서드로 콘솔 프로그램의 main( ) 메서드와 같은 역할을 한다.

③ public void destroy( ) {...} 메서드에 의한 메모리 해제

웹 서버가 종료될 때 실행되어 메모리를 해제한다.(서버 종료시 실행)


3. 서블릿 설정

-web.xml 등록

서블릿 클래스를 생성했다면, 그 다음으로 할 작업은 WEB-INF 디렉터리의 web.xml 파일에 서블릿 클래스를 등록하는 것이다.

NowServlet 클래스를 web.xml 파일에 등록한 예를 보여주고 있다.

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

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 

http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"

id="chap20" version="3.0">


<servlet>// 서블릿 클래스를 서블릿으로 등록한다.

<servlet-name>now</servlet-name>// 해당 서블릿을 참조할 때 사용할 이름을 입력한다.

<servlet-class>mvjsp.chap20.NowServlet</servlet-class>// 서블릿으로 사용할 서블릿 클래스의 완전한 이름을 입력한다.

</servlet>

// 위의 경우 mvcjsp.chap20.NowSerlvet 클래스를 "now"라는 이름의 서블릿으로 등록하고 있다.

<servlet-mapping> 

<servlet-name>now</servlet-name>// 매핑할 서블릿의 이름을 지정한다.

<url-pattern>/now</url-pattern>// 매핑할 URL 패턴을 지정한다.

</servlet-mapping>

</web-app>

사용할 서블릿을 지정했다면 그 다음으로 할 작업은 해당 서블릿이 어떤 URL을 처리할 지에 대한 매핑 정보를 등록하는 것이다. 이는 <servlet-mapping> 태그를 이용해서 지정한다. 여기서는 now라는 이름의 서블릿이 /now라는 URL 패턴을 처리한다고 지정하고 있다. 앞서 NowServlet 클래스를 now 라는 이름의 서블릿으로 등록했으므로 결과적으로 /now 라는 URL을 NowServlet이 처리하게 된다.

서블릿을 등록하려면 다음의 두 가지 설정을 해주어야 한다.

1 서블릿으로 사용할 클래스

2 서블릿과 URL 간의 매핑


- 서블릿 파일

package mvjsp.chap20;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Date;


import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class NowServlet extends HttpServlet {

// NowServlet 클래스는 HttpServlet 클래스를 상속 받고 있으며, 따라서 NowServlet은 서블릿으로 동작할 수 있게 된다.


@Override

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html; charset=euc-kr");


PrintWriter out = response.getWriter();

out.println("<html>");

out.println("<head><title>현재시간</title></head>");

out.println("<body>");

out.println("현재 시간은");

out.println(new Date());

out.println("입니다.");

out.println("</body></html>");

}

}


4. 애노테이션으로 매핑하기

서블릿 2.5까지는 web.xml 파일에 서블릿으로 등록해주어야 서블릿 클래스를 사용할 수 있었는데, 서블릿 3.0 버전부터는 web.xml 파일에 따로 등록하지 않아도 @WebServlet 애노테이션을 사용하면 서블릿으로 자동으로 등록된다. 톰캣7 버전과 같이 서블릿 3.0을 지원하는 웹 컨테이너는 @WebServlet이 적용된 서블릿 클래스를 검색해서 사용할 서블릿으로 자동으로 등록해주는 기능을 제공하고 있다.

따라서, web.xml 파일에 따로 등록하지 않더라고 해당 클래스를 서블릿으로 사용할 수 있게 된다.


package mvjsp.chap20;

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;


@WebServlet(urlPatterns = "/hello")

// @WebServlet 애노테이션은 urlPattern 속성을 값으로 갖는데 이 속성은  해당 서블릿과 매핑될 URL 패턴을 지정할 째 사용된다.

위 코드의 경우 /hello로 들어오는 URL을 HelloServlet이 처리하도록 설정하고 있다.

이제 web.xml 파일에 별도의 설정을 하지 않더라도 HelloServlet을 실행할 수 있게 된다.

public class HelloServlet extends HttpServlet {


@Override

protected void doGet(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding("euc-kr");

response.setContentType("text/html; charset=euc-kr");

PrintWriter out = response.getWriter();

out.println("<html>");

out.println("<head><title>인사</title></head>");

out.println("<body>");

out.println("안녕하세요, ");

out.println(request.getParameter("name"));

out.println("님");

out.println("</body></html>");

}

}

@WebServlet 애노테이션을 사용할 때 고려할 점은 서블릿이 범용적으로 사용되는 서블릿인지의 여부이다.

예를 들어, MVC 프레임워크는 어떤 URL을 서블릿이 처리할지 미리 할 수 없다. 단지, 다양한 요청 URL을 MVC 프레임워크가 처리할 수 있는 기능을 구현할 수 있을 뿐이다.

이 얘기는 @WebServlet 애노테이션을 사용할 경우 서블릿이 처리해야 할 URL 패턴이 변경될 때 마다, 자바 소스 코드의 urlPatterns 속성의 값을 변경하고 다시 컴파일해야 한다는 것이다. 반면 @WebServlet을 사용하지 않고 web.xml 파일을 사용할 경우 URL 경로가 바뀔 경우 web.xml 파일만 변경해주면 된다. 따라서, 서블릿의 용도에 따라서 @WebServlet 애노테이션을 사용할지 아니면 web.xml 설정을 사용할지를 알맞게 결정해야 한다.




'Programing > JSP/Servlet' 카테고리의 다른 글

[Servlet] 서블릿 이벤트  (0) 2014.12.18
[Servlet] 서블릿 필터  (0) 2014.12.10
[Servlet] 데이터 저장 영역  (0) 2014.12.10
[Servlet] 초기화 파라미터  (0) 2014.12.09
[Servlet] web.xml 주요 태그  (0) 2014.12.09

[Servlet] 데이터 저장 영역

데이터 저장 영역


서블릿에서는 데이터를 저장하는 영역으로 페이지 객체, 요청 객체, 세션 객체, ServletContext 객체 네 가지를 사용할 수 있다.

1) 페이지 객체는 현재 페이지 내에서만 사용할 변수를 저장하는 영역.

2) 요청 객체는 요청 객체가 유지되는 영역에서 사용할 변수를 저장하는 영역.

3) 세션 객체는 웹 브라우저가 종료되기 전가지나 세션이 끊어지기 전까지 사용할 변수를 저장하는 영역.

클라이언트마다 독립적으로 데이터를 저장하고 관리할 수 있는 최고 범위의 데이터 저장 영역이다. 여기에 저장되는 데이터는 클라이언트가 웹 브라우저를 종료하기 전까지나 세션이 끊어지기 전까지는 사라지지 않는다.

4) ServletContext 객체는 서버가 종료되기 전까지 사용할 변수를 저장하는 영역.


이들 각 영역에 저장된 데이터를 사용해서 여러 페이지에 걸쳐 필요한 범위까지 변수를 선언할 수 있다.


1. 요청 객체

(1) 객체: ServletRequest 또는 HttpServletRequest 객체

(2) 추가: request.setAtrtribute("키","값");

(3) 삭제: request.removeAttribute("키","값");

(4) 획득: Object obj = request.getAttribute("키");


2. 세션객체

(1) 객체: HttpSession 객체

(2) 생성: session = request.getSession() 또는 request.getSession(boolean); 

cf.) getSession(true): 기존에 세션 객체가 없으면 새오룬 HttpSession 객체를 생성하라는 의미이다.

(3) 추가: session.setAtrtribute("키","값");

(4) 삭제: session.removeAttribute("키","값");

(5) 획득: Object obj = session.getAttribute("키");

세션 객체를 사용하려면 각 페이지마다 객체를 사용해야 한다. 세션 객체에 저장된 데이터는 클라이언트별로 데이터를 저장하고 관리한다.

때문에 요청 객체로부터 세션 객체를 생성한다. 데이터늬 추가나 삭제, 획득은 요청 객체에서와 방법이 같다.


3. Servletcontext 객체

(1) 객체: ServletContext 객체

(2) 생성: application = this.getServletContext();

(3) 추가: application.setAttribute("키","값");

(4) 삭제:application.removeAttribute("키","값");

(5) 획득: Object obj = application.getAttribute("키");

특이한 점이자 중요한 점은 현재의 서블릿에서 Servletcontext 객체를 획득한다는 것이다. 이것은 서버 자체의 저장 영역을 사용한다는 의미이다.

서블릿은 서버에서 실행이 되기 때문에 this는 서블릿 자체를 이야기하고, 서블릿과 연결되어 있는 서버는 모든 클라이언트에 공통적인 사항이다. 정리하면 서버의 데이터 저장 영역인 ServletContext 객체를 획득하면 

여기에 저장된 데이터는 클라이언트가 모두 공유할 수 있다는 의미이다.




'Programing > JSP/Servlet' 카테고리의 다른 글

[Servlet] 서블릿 필터  (0) 2014.12.10
[Servlet] 서블릿 기초  (0) 2014.12.10
[Servlet] 초기화 파라미터  (0) 2014.12.09
[Servlet] web.xml 주요 태그  (0) 2014.12.09
[Servlet] 웹 프로그램 기본파일(tomcat환경)  (0) 2014.12.09

[Servlet] 초기화 파라미터


초기화 파라미터


초기화 매개변수는 웹 페이지가 실행될 때 필요한 데이터를 전달해 준다. 그리고 초기화 매개 변수는 서블릿 프로그램이 처음 실행될 때 클라이언트가 아닌 서버로부터 넘겨받는 값이다.

웹 프로그램은 모든 실행 시작점이 웹 서버의 구동이다. 이때 web.xml 파일이 자동으로 로드된다.

여기에 초기화 매개변수를 등록해서 웹 페이지가 매개변수의 값을 읽어들인다.

이렇게 해서 서블릿을 재컴파일하지 않고서도 원하는 초기값을 웹 페이지에 전달할 수 있다.


import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;


public class Round14_01_Servlet extends HttpServlet {

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

ServletConfig config = this.getServletConfig();

//ServletConfig 객체를 획득한다.

//실제로는 HttpServlet이 ServletConfig를 구현했기 때문에

//이렇게 객체를 획득할 필요 없이 this를 사용해도 무방하다.

String start = config.getInitParameter("start");

String end = this.getInitParameter("end");

//config 객체를 통해서도 this를 통해서도 초기화 매개변수를 획득할 수 있다.

int start_su = Integer.parseInt(start);

int end_su = Integer.parseInt(end);

//초기화 매개변수로 전달된 값은 문자열이므로 숫자로 변환한다.

int hap = 0;

for(int i = start_su; i <= end_su; ++i) 

hap += i;

//시작 수에서 끝 수까지의 총합을 구한다.

response.setContentType("text/html;charset=euc-kr");

//응답에 대한 MIME과 Encode를 설정한다.

PrintWriter out = response.getWriter();

//출력 객체를 생성한다.

out.println("<html><body><center>");

out.println(start_su + " ~ " + end_su + "사이의 합은 ");

out.println(hap + "입니다.");

out.println("</center></body></html>");

//결과를 출력한다.

out.close();

//출력 객체를 종료한다.

}

}


web.xml 파일에 서블릿을 등록하면서 다음과 같이 초기화 매개변수로 start와 end의 값을 등록한다. 등록되는 모든 데이터는 자료형이 String이다.

<servlet>

<servlet-name>My01</servlet-name>

<servlet-class>Round14_01_Servlet</servlet-class>

<init-param>

<param-name>start</param-name> // String start = config.getInitParameter("start");에서 start의 초기값은 '1'이다.

<param-value>1</param-value>

</init-param>

<init-param>

<param-name>end</param-name> // String end = this.getInitParameter("end");에서 end의 초기값은 '10'이다.

<param-value>10</param-value>

</init-param>

</servlet>

<servlet>

<servlet-name>My01</servlet-name>

<servlet-class>Round14_01_Servlet</servlet-class>

</servlet>


1. Servlet 초기화 파라미터의 종류


(1) 초기화 파라미터

처음 WAS가 기동될 때 읽어 들이는 파라미터값을 초기화 파라미터라고 합니다.

종류에는 1) 서블릿 초기화 파리미터 와 2) 컨텍스트 초기화 파라미터가 있습니다.


(2) 서블릿 초기화 파라미터(Servlet Initialize Parameter)

1) web.xml에 다음과 같이 기술하고

<servlet>

     <init-param><!-- 초기화 파라미터라고 불리는 설정 값을 지정할 때 사용한다.-->

          <param-name>AdminEmail</param-name><!-- 초기화 파라미터의 이름을 지정한다.-->

          <param-value>admin@admin.com</param-value><!-- 초기화 파라미터의 값을 지정한다.-->

     </init-param>

</servlet>


2) Servlet Code에서 

getServletConfig().getInitParameter("AdminEmail"));  와 같은 코드로 초기화 파라미터 값을 얻을 수 있습니다.

서블릿 초기화 파라미터는 컨텍스트 초기화 파라미터와 달리 서블릿에서만 읽어 들일 수 있습니다.

이 값들을 JSP에서 사용하기 위해서는 HttpServletRequest의 Attribute 속성을 이용해서 JSP로 모델 정보를 넘겨야 합니다.

example)

< TODO Servlet>

String AdminEmail = (String)getServletConfig.getInitParameter("AdminEmail");

request.setAttribute("AdminEmail",AdminEmail);

<TODO JSP>

String AdminEmail = (String)request.getAttribute("AdminEmail");


(3) 컨텍스트 초기화 파라미터(Context Initialize Parameter)

1) web.xml에 다음과 같이 기술하고

<context-param>

     <param-name>adminEmail</param-name>

     <param-value>admin@admin.com</param-value>

</context-param>

주의 : <context-param>은 <web-app> 하위에 존재하지 <servlet> 하위에 존재하지 않습니다.


2) Servlet혹은 JSP에서

getServletContext().getInitParameter("adminEmail");    

와 같은 코드로 코딩하면 값을 얻을 수 있습니다.


(4) 정리

정리하면. 서블릿 초기화 파라미터는 ServetConfig 에서 읽어들이며, ServletConfig는 서블릿 당 하나가 생성됩니다.

컨텍스트 초기화 파라미터는 ServetContext에서 읽어들이고, 웹 어플리케이션 당 하나가 생성됩니다.


즉 웹 어플리케이션 전체의 전역적인 파라미터 설정을 원한다면 컨텍스트 초기화 파라미터에 정의 하시면 되고,특정 서블릿에서 처리 하기 위한 어떤 값을, 즉 서블릿범위 정도에서 처리하기 위한 값을 정의 한다면 서블릿 초기화 파라미터를 사용하면 되겠습니다.


(5) 잘 정리된 표




'Programing > JSP/Servlet' 카테고리의 다른 글

[Servlet] 서블릿 필터  (0) 2014.12.10
[Servlet] 서블릿 기초  (0) 2014.12.10
[Servlet] 데이터 저장 영역  (0) 2014.12.10
[Servlet] web.xml 주요 태그  (0) 2014.12.09
[Servlet] 웹 프로그램 기본파일(tomcat환경)  (0) 2014.12.09

[Servlet] web.xml 주요 태그


web.xml 주요 태그


web.xml파일은 웹 컨테이너와 웹 프로그램의 파일을 서로 연결하고 관리하는 설정 파일이다.

웹 프로그램은 항상 자바를 지원하는 웹 컨테이너에서 실행된다. 때문에 해당 웹 컨테이와의 연게를 반드시 염두에 두어야 한다. 프로젝트별로 환경을 설정하고 파일들 간에 관계를 설정할 때는 web.xml 파일이 기준이 된다. 

web.xml 파일은 웹 서버가 서블릿 파일을 인식하게 해준다.

이 파일은 서블릿의 등록뿐 아니라 필터 클래스의 등록과 맵핑 등 다양한 설정을 지원한다.

주목할 점은 web.xml이 웹 서버를 구동할 때 읽혀진다는 것이다. 만일 특정 작업에 필요해서 web.xml 파일을 수정하고 웹 서버를 재구동하지 않으면 당연히 web.xml 파일은 인식되지 않는다.


<web-app>

<display-name> 프로젝트명 </display-name>


<filter>  <filter> 전체

<filter-name> 필터 닉 네임 </filter-name>  <filter-name>

<filter-class> 필터 클래스 풀 네임(패키지 명까지) </filter-name>  ⓓ 

<init-param> ⓔ <init-param> 전체

<param-name> 매개변수 명 </param-name>

<param-value> 값 </param-value>

</init-param>

</filter> 

<filter-mapping>  ⓕ <filter-mapping> 전체

<filter-name> 필터 닉 네임 </filter-name> 

<url-pattern> 필터 클래스가 실행될 위치 </url-pattern>

</filter-mapping>


<serlvet> ⓙ <serlvet> 전체

<servlet-name> 서블릿 닉 네임 </servlet-name>

<serlvet-class> 서블릿 클래스 풀네임(패키지 명까지) </servlet-class> ⓜ </servlet-class> 전체

<init-param>

<param-name> 매개변수명 </param-name>

<param-value> 값 </param-value>

</init-param>

<load-on-startup> 실행 순서 값(0값은 서버임의실행) </load-on-startup>

</servlet>

<servlet-mapping>  <servlet-mapping> 전체

<servlet-name> 서블릿 닉 네임 </servlet-name>

<url-pattern> url 패턴 </url-pattern>  

</servlet-mapping>


<welcome-file-list> <welcome-file-list> 전체

<welcome-file> 기본 파일 </welcome-file>

</welcom-file-list>

</wep-app>


ⓐ web.xml 파일이 속한 프로젝트의 이름을 적는다.


ⓑ 프로젝트에서 사용될 필터 클래스를 등록한다.


ⓒ 필터 클래스의 닉네임을 적는다. 임의로 정해도 된다.


ⓓ 해당 클래스에 대해 패키지의 이름까지 전체를 등록한다. 패키지가 아니면 클래스 이름만 등록한다.


ⓔ 해당 필터 클래스가 실행되면서 기본적으로 갖는 초기화 매개 변수를 적는다. 여러 개를 등록해도 된다. void main(String [] ar) 메서드의 ar[0], ar[1] 등과 같은 개념이라고 보면된다.

void main() 메서드에서는 ar이라는 이름으로 사용하지만 여기서는 변수의 이름과 값을 모두 등록해야 한다.


ⓕ 해당 필터 클래스가 실행되는 시점을 등록한다.


ⓗ 실행될 필터 클래스의 닉네임을 적는다. ⓒ에서 적은 이름과 대소문자까지 같아야 한다.


ⓘ 실행될 시점을 지정한다.


ⓙ 서블릿을 웹 컨테이너에 등록하고 있다. 여러 개를 등록해도 된다.


ⓚ 서블릿의 닉네임을 등록한다. 닉네임은 클래스의 이름이 너무 길 때 편의상 사용한다. 클래스 이름이 짧으면 클래스 이름과 동일하게 등록해도 무방하다.


ⓜ 필터 클래스처럼 서블릿이 실행될 때 초기값으로 전달될 매개변수를 적고 있다. 여러 개를 등록해도 무방하다.


ⓝ 웹 서버가 구동될 때 서블릿의 init() 메서드를 미리 실행할지 지정하고 있다. 각 서블릿의 생성/초기화 순서를 의미한다.

(값이 작은 것이 먼저 실행)


ex.) B 서블릿 -> A 서블릿 -> C 서블릿 순: B:1, A:2, C:3으로 지정한다.


ⓞ 앞서 등록한 서블릿을 웹 브라우저에서 호출하면서 사용하는 이름을 등록하는 코드이다. 


ⓟ 실행 시점을 지정한다. ex.) <url-pattern> /*.do </url-pattern> 로 지정하면, URL do로 끝나면 해당 서블릿이 실행된다.


ⓠ 클라이언트의 사용자가 웹 브라우저로 웹 서버에 접속할 때 기본적으로 보여주는 메인 페이지를 등록하고 있다.





'Programing > JSP/Servlet' 카테고리의 다른 글

[Servlet] 서블릿 필터  (0) 2014.12.10
[Servlet] 서블릿 기초  (0) 2014.12.10
[Servlet] 데이터 저장 영역  (0) 2014.12.10
[Servlet] 초기화 파라미터  (0) 2014.12.09
[Servlet] 웹 프로그램 기본파일(tomcat환경)  (0) 2014.12.09

[Servlet] 웹 프로그램 기본파일(tomcat환경)


웹 프로그램 기본파일(tomcat환경)


또 찾아서 있으면 추가하겠음



WEB-INF/web.xml:  프로젝트의 속성을 설정하는 파일


META-INF/context.xml: 서버 환경을 설정하는 파일


%JAVA_HOME%/jre/lib/ext: 로컬 응용 프로그램을 실행하기 위한 폴더


tomcat7/common/lib: 톰캣을 이용하는 웹 프로그램을 실행하기 위한 폴더, 모든 프로젝트에 공통으로 적용되는 라이브러리 파일을 인식한다.

cf.) %JAVA_HOME%/jre/lib 폴더나 %JAVA_HOME%/jre/lib/ext  폴더 내의 JAR 파일들도 자동으로 인식된다.


C:\\Web_Java\eclipse\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\webapps: 이클립스에서 웹 프로그램이 실행될 때 파일 구조가 변경


tomcat7/conf/server.xml: 웹 서버를 구동하면서 사용할 포트를 설정하기 위해 인식한다.


tomcat7/conf/web.xml: 모든 프로젝트에 공통으로 적용되는 환경을 설정하기 위해 인식한다.


[프로젝트 이름]/WEB-INF/web.xml: 프로젝트별로 적용되는 환경을 설정하기 위해 인식한다.


[프로젝트 이름]/WEB-INF/lib: 프로젝트별로 적용되는 라이브러리 파일을 인식한다.


[프로젝트 이름]/WEB-INF/classes: 프로젝트별로 적용되는 서블릿 파일을 인식하고 설정에 따라 init() 메서드를 실행한다. <load-on-start> 태그로 정의한다.



'Programing > JSP/Servlet' 카테고리의 다른 글

[Servlet] 서블릿 필터  (0) 2014.12.10
[Servlet] 서블릿 기초  (0) 2014.12.10
[Servlet] 데이터 저장 영역  (0) 2014.12.10
[Servlet] 초기화 파라미터  (0) 2014.12.09
[Servlet] web.xml 주요 태그  (0) 2014.12.09