Web.xml이란?
Web
Application의
Deployment Descriptor(환경 파일)로서
XML 형식의 파일
Web.xml에 작성되는 내용
-ServletContext의 초기 파라미터
-Session의 유효시간 설정
-Servlet/JSP에 대한 정의
-Servlet/JSP
매핑
-Mime
Type 매핑
-Welcome
File list
-Error
Pages 처리
-리스너/필터 설정
-보안
Web Application은 임의의 디렉토리로 구성되며 JSP,
HTML 기타 이미지 파일 등이 존재하게 되는 디렉토리와 Deployment Desciptor(DD파일, 환경 파일)가 존재하는 디렉토리 그리고 Servlet과 같은 서버상에서 수행되는 클래스 파일들이 존재하게 되는 디렉토리가 이미 정해져 있다. 최상위 디렉토리(docbase)를
edu 디렉토리라고 한다면 다음과 같은 구조가 된다.
web.xml은 <web-app>태그로 시작하고 종료하는 문서로서 web.xml이
정의된 Web Application의 동작과 관련된 다양한 환경 정보를 태그기반으로 설정하는 파일입니다.
web.xml의 작성 규칙은 XML Schema로 정의되어 있습니다. 그러므로 XML Schema에 대한 사전 지식이 없는 경우에는 작성
규칙을 보면서 이해한다는 것이 좀 어려윤 것은 사실입니다. web.xml을 구성하는 모든 태그들에 대하여
모두 학습하는 것은 의미 없습니다. web.xml의 태그들과 관련된
Servlet 기술을 학습할 때 같이 학습하는 것이 좋은 방법입니다.
작성 규칙1 :
-Servlet
2.3 까지의
web.xml의 작성 규칙은 DTD 파일이었고, 2.4부터 XML Schema 파일로 바뀜
-다음과 같이 web.xml의 루트
엘리먼트인 <web-app> 태그에 사용될 XML
Schema를 선언해 주어야 함
-web.xml에는 목적과 용도에 따라 필요한 태그만을 작성하면 되지만 태그의 작성 위치가
중요
-XML 문서이니만큼 대소문자 구분, 속성에
값을 할당할 때 인용 부호 지정, 시작 태그와 종료 태그의 매핑에 대하여 주의 깊게 작성하여야 함
다음은 <web-app> 태그에
정의 가능한 주요 서브 태그들에 대한 리스트입니다. 서브 태그는
XML Schema에 정의된 순서대로 작성해 주어야 합니다.
web.xml은 주로
다음고 ㅏ같은 형식의 내용으로 작성 됩니다.
다음은 web.xml에 정의될 수 있는 주요 태그에 대한 설명입니다. 다음에 소개 하는 태그들은 모두 <web-app>의 바로
아래 레벨의 태그들입니다.
출처 -
http://blog.naver.com/b1ack7circ1e?Redirect=Log&logNo=10052647428
<!-- DBCP 설정 추가 -->
<resource-ref>
<description>Oracle DataSource</description>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<!-- JSP, Servlet, JDBC를 이용한 자유게시판 서블릿 설정 -->
<servlet>
<servlet-name>boardServlet</servlet-name>
<!--
.do로 끝나는 서블릿 주소 요청이 있는 경우
BoardServlet 클래스를 연결합니다.
-->
<servlet-class>com.board.BoardServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>boardServlet</servlet-name>
<!--
*.do는 서블릿 주소가 .do로 끝나는 모든 경우를 말함
서블릿 주소는 임의 지정가능.
여러개의 서블릿 주소가 있는 페이지 운영시
예를 들어, *.do, *.ac 등.
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
출처 - http://blog.naver.com/mxncbv?Redirect=Log&logNo=110107153297
Deployment Descriptor로 각 어플리케이션의 환경을 설정하는 부분을 담당한다. WAR 파일이 패키지 될 때 같이 포함되며 root directory 밑에 /WEB-INF 디렉토리에 위치한다.
by kkaok
2003-05-12
web.xml 의 구조
xml 정의와 schema 선언
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd> |
위 스키마는 sun 사에서 미리 정의된것이다.
웹 어플리케이션의 환경 설정
<web-app>
<servlet>
<servlet-name>사용되는 클래스명</servlet-name>
<servlet-class>클래스 경로</servlet-class>
</servlet>
<mime-mapping>
<extension>txt</extension>
<mime-type>text/plain</mime-type>
</mime-mapping>
<welcome-file-list>
<welcome-file>기본 파일 경로</welcome-file>
<welcome-file>두번째 시작하는 파일 경로</welcome-file>
</welcome-file-list>
<taglib>
<taglib-uri>태그라이브러리</taglib-uri>
<taglib-location>경로</taglib-location>
</taglib>
</web-app>
|
web.xml은 xml파일이다. 따라서 xml 작성과 동일한 규칙이 적용된다.
환경설정은 <web-app>으로 시작하고 </web-app>로 끝난다. 그외 삽입되는 요소로는 다음과 같다.
.ServletContext Init Parameters
.Session Configuration
.Servlet/JSP Definitions
.Servlet/JSP Mappings
.Mime Type Mappings
.Welcom File list
.Error Pages
web.xml의 elements의 순서
각 element의 순서는 아래 순서에 따른다.
<icon?>,
<display-name?>,
<description?>,
<distributable?>,
<context-param*>,
<filter*>,
<filter-mapping*>,
<listener*>,
<servlet*>,
<servlet-mapping*>,
<session-config?>,
<mime-mapping*>,
<welcome-file-list?>,
<error-page*>,
<taglib*>,
<resource-env-ref*>,
<resource-ref*>,
<security-constraint*>,
<login-config?>,
<security-role*>,
<env-entry*>,
<ejb-ref*>,
<ejb-local-ref*> |
자주 쓰이는 elements 예제
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd>
<web-app>
<display-name>어플리케이션 이름</display-name>
<description>어플리케이션 설명</desccription>
<!-- 서블릿 매핑 : 보안과 주소를 간략화 하기 위해 사용
http://localhost/servlet/KCount 이렇게 사용가능 -->
<servlet>
<servlet-name>KCount</servlet-name>
<servlet-class>kr.pe.kkaok.mycount.KCount</servlet-class>
</servlet>
<!-- load-on-startup 옵션은 서버 구동시 자동으로 시작 되도록 하는 것이다. -->
<servlet>
<servlet-name>PoolManager</servlet-name>
<servlet-class>kr.pe.kkaok.jdbc.PoolManager</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 서블릿 매핑 : 위에서 servlet 부분을 삭제한다.
http://localhost/KCount 이렇게 사용가능 -->
<servlet-mapping>
<servlet-name>KCount</servlet-name>
<url-pattern>/KCount</url-pattern>
</servlet-mapping>
<!-- /servlet/* 과 동일한 패턴의 요청이 들어오면 servlet으로 처리 -->
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
<!-- 세션 기간 설정 -->
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<!-- mime 매핑 -->
<mime-mapping>
<extension>txt</extension>
<mime-type>text/plain</mime-type>
</mime-mapping>
<!-- 시작페이지 설정 -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!-- 존재하지 않는 페이지, 404에러시 처리 페이지 설정 -->
<error-page>
<error-code>404</error-code>
<location>/error.jsp</location>
</error-page>
<!-- 태그 라이브러리 설정 -->
<taglib>
<taglib-uri>taglibs</taglib-uri>
<taglib-location>/WEB-INF/taglibs-cache.tld</taglib-location>
</taglib>
<!-- resource 설정 -->
<resource-ref>
<res-ref-name>jdbc/jack1972</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
|
* 만약 톰캣 4에서 servelt에 접근이 안되는 경우
아래는 okjsp.pe.kr 운영자 kenu님의 처리 방법이다.
invoker 서블릿의 매핑이 보안문제로 막혀있어서 발생하는 문제로 $CATALINA_HOME/conf/web.xml를 열고 해당 부분의 주석을 제거한다.
<!-- The mapping for the invoker servlet -->
<servlet-mapping>
<servlet-name>invoker</servlet-name>
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
security-constraint 엘리먼트를 $CATALINA_HOME/conf/web.xml 파일의 welcome-file-list 엘리먼트 아래쪽 <web-app> 에 중첩되게 복사합니다.
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<security-constraint>
<display-name>Default Servlet</display-name>
<!-- Disable direct alls on the Default Servlet -->
<web-resource-collection>
<web-resource-name>Disallowed Location</web-resource-name>
<url-pattern>/servlet/org.apache.catalina.servlets.DefaultServlet/*</url-pattern>
<http-method>DELETE</http-method>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>PUT</http-method>
</web-resource-collection>
<auth-constraint>
<role-name></role-name>
</auth-constraint>
</security-constraint>
톰캣을 재시동하고 테스트해보면 정상적으로 작동하는걸 확인할 수 있다.
|
출처 -
http://blog.naver.com/habakukwjb?Redirect=Log&logNo=100006013373
▣ web.xml 파일이란?
1. 톰캣의 실행환경에 대한 정보를 담당하는 '환경설정' 파일 이다.
2. 각종 servlet의 설정과 servlet 매핑, 필터, 인코딩 등을 담당한다.
3. web.xml은 톰캣에 있는 모든 web application의 기본설정을 정의한다.
4. web.xml은 각 application이 deploy될 때 각 application의 'WEB-INF/web.xml' deployment descripter에 따라서 처리가 된다.
5. 각 application 마다 설정시, web.xml은 파일을 복사해서 필요한 것만 적으면 된다.
▣ 디렉토리 위치?
:%CATALINA_HOME%\conf\web.xml //CATALINA_HOME은 톰캣의 홈디렉토리!~
▣ 내용설명
각 servlet을 설정하자~~
DefaultServlet :공유자원을 제공하며 servlet mapping을 가진 모든 요청을 처리한다.
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
InvokerServlet :web.xml 파일에 정의되지 않은 어떠한 servlet 클래스라도 실행할 수 있도록 한다.
이 servlet은 기본적으로 "/servlet/*"의 URL에 매핑되어 있음.
Tomcat의 버전이 올라가면서 보안상의 이유로 기본적으로는 서블릿을 실행하지 못하도록 설정이 되어있다.(default 주석처리)
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>org.apache.catalina.servlets.InvokerServlet</servlet-class>
<... 기타 속성들 ...>
</servlet>
JspServlet : JSP의 컴파일과 실행을 담당하는 servlet
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<... 기타 속성들 ...>
</servlet>
기타 servlet 으로.. 아래 두개가 있지만 잘 안쓰는지 모두 주석처리 되어 있다. -ㅇ-..
그래서 뭐.. 설명생략!~
<servlet-name>ssi</servlet-name>
<servlet-name>cgi</servlet-name>
이제.. 위에서 설정한 servlet에 대한 매핑작업에 대한 정보!~
<servlet-mapping>
<servlet-name>default</servlet-name> // 일반적으로는 모두 '/' 로..
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--
<servlet-mapping>
<servlet-name>invoker</servlet-name> // invoker는 '/servlet/*' 로..
<url-pattern>/servlet/*</url-pattern>
</servlet-mapping>
-->
<servlet-mapping>
<servlet-name>jsp</servlet-name> // jsp는 '/*.jsp' 로..
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
세션 기간 설정~
<session-config>
<session-timeout>30</session-timeout>
</session-config>
mime 매핑~
<mime-mapping>
<extension>abs</extension>
<mime-type>audio/x-mpeg</mime-type>
</mime-mapping>
<mime-mapping>
<extension>ai</extension>
<mime-type>application/postscript</mime-type>
</mime-mapping>
시작페이지 설정~
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
위까지 내용은 톰캣 설치하면 보이는 기본값에 대한 설정이고..
아래내용은 필요할 때마다 참고하자궁..(web.xml 파일내용)
아래의 블로그 내용을 참조하였음.
http://brainism.tistory.com/7?srchid=BR1http%3A%2F%2Fbrainism.tistory.com%2F7
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
- version="2.5">
-
-
- <resource-ref>
- <description>OracleDatasource</description>
- <res-ref-name>jdbc/myoracle</res-ref-name>
- <res-type>javax.sql.DataSource</res-type>
- <res-auth>Container</res-auth>
- </resource-ref>
-
- <context-param>
- <param-name>ds</param-name>
- <param-value>jdbc/myoracle</param-vlaue>
- </context-param>
-
-
- <filter>
- <filter-name>Encoding Filter</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>UTF-8</param-value>
- </init-param>
- </filter>
-
- <filter-mapping>
- <filter-name>Encoding Filter</filter-name>
- <servlet-name>action</servlet-name>
- </filter-mapping>
-
-
- <servlet>
- <servlet-name>action</servlet-name>
- <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
- <init-param>
- <param-name>config</param-name>
- <param-value>/WEB-INF/struts-config.xml</param-value>
- </init-param>
- <init-param>
- <param-name>debug</param-name>
- <param-value>3</param-value>
- </init-param>
- <init-param>
- <param-name>detail</param-name>
- <param-value>3</param-value>
- </init-param>
- <load-on-startup>0</load-on-startup>
- </servlet>
-
- <servlet-mapping>
- <servlet-name>action</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
-
-
- <session-config>
- <session-timeout>30</session-timeout>
- </session-config>
-
-
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
-
-
- <error-page>
- <error-code>404</error-code>
- <location>/404.jsp</location>
- </error-page>
-
-
- <error-page>
- <error-code>500</error-code>
- <location>/500.jsp</location>
- </error-page>
-
-
- <error-page>
- <exception-type>java.lang.NullPointerException</exception-type>
- <location>/null.jsp</location>
- </error-page>
-
-
- <jsp-config>
- <taglib>
- <taglib-url>http://java.sun.com/jsp/jstl/core</taglib-url>
- <taglib-location>/WEB-INF/tld/c.tld</taglib-location>
- </taglib>
- </jsp-config>
- </web-app>
출처 -
http://blog.daum.net/_blog/BlogTypeView.do?blogid=090sk&articleno=5494232#ajax_history_home
web.xml Listener, Filter의 활용
1. Listener의 이해
1.1 Listener 란
- 어떠한 이벤트가 발생하면 호출되어 처리하는 객체.
1.2 Listener 사용법
- 구현할 기능과 관련된 각종 인터페이스만 제공함으로 클래스는 구현해야함.
1.3 Listener 인터페이스 종류
- ① ServletContextListener
웹 어플리케이션의 시작과 종료시 자동으로 발생되는 이벤트를 수행하기 위한 메소드를 정의한 인터페이스이다.Listener 객체 | 설명 |
---|
contextInitialized(ServletContextEvent sce) : void | 웹 컨테이너가 처음 구동될 때 실행되는 메소드 |
contextDestoryed(ServletContextEvent sce) : void | 웹 컨테이너가 종료될 때 실행되는 메소드 |
- ② ServletContextAttributeListener
컨테이너에 저장된 속성 값들의 변화가 있을 때 수행하기 위한 메소드를 정의한 인터페이스이다.Listener 객체 | 설명 |
---|
attributeAdded(ServletContextAttributeEvent scae) : void | 새로운 속성 값이 추가될 때 실행되는 메소드 |
attributeRemoved(ServletContextAttributeEvent scae) : void | 속성 값이 제거될 때 실행되는 메소드 |
attributeReplaced(ServletContextAttributeEvent scae) : void | 속성 값이 변경될 때 실행되는 메소드 |
- ③ HttpSessionListener
HTTP 세션이 활성화 되거나 비활성화 되려할 때 혹은 속성 값들이 추가, 삭제, 변경될 경우 수행하기 위한 인터페이스Listener 객체 | 설명 |
---|
sessionCreated(HttpSession se) : void | 세션이 생성되었을 경우 이 메소드가 실행 |
sessionDestoryed(HttpSession se) : void | 세션이 무효화 되었을 경우 이 메소드 실행 |
- ④ HttpSessionAttributeListener
HTTP 세션에 대한 속성 값이 변경되었을 경우 수행하기 위한 인터페이스Listener 객체 | 설명 |
---|
attributeAdded(HttpSessionBindingEvent e) : void | 세션에 새로운 속성 값이 추가될 때 실행 |
attributeRemoved(HttpSessionBindingEvent e) : void | 세션의 속성 값이 제거될 실행 |
attributeReplaced(HttpSessionBindingEvent e) : void | 세션의 속성 값이 변경될 때 실행 |
- ⑤ HttpSessionActivationListener
세션에 대한 내용이 새로 생성되어 세션이 활성화 되었을 때 발생하는 이벤트를 수행하기 위한 인터페이스Listener 객체 | 설명 |
---|
sessionDidActivate(HttpSessionEvent e) : void | 세션이 활성화 될 때 실행 |
sessionWillPassivate(HttpSessionEvent e) : void | 세션이 비활성화 되려고 할 때 실행 |
- ⑥ HttpSessionBindingListener
클라이언트의 세션 정보에 대한 바인딩이 이루어졌을 경우 감지되는 이벤트를 수행하기 위한 인터페이스Listener 객체 | 설명 |
---|
valueBound(HttpSessionBindingEvent e) : void | 세션에 연결될 때 발생하는 이벤트를 실행 |
valueUnBound(HttpSessionBindingEvnet e) : void | 세션으로부터 연결이 해제될 때 발생하는 이벤트를 실행 |
1.4 Listener 간단예제
① 해당이벤트가 발생했을 경우 수행할 리스너 클래스 작성
package com.test;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class TestListener implements ServletContextListener {
public TestListener(){};
public void contextInitialized(ServletContextEvent contextEvent) {
System.out.println("서버가 시작되었습니다!");
}
public void contextDestoryed(ServletContextEvent contextEvent) {}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("서버가 중지되었습니다");
}
}
② web.xml에 리스너 등록
<listener>
<listener-class>TestListener</listener-class>
</listener>
2. Filter의 이해
2.1 Filter란
2.2 Filter Chain 이란
여러 개의 필터가 모여서 하나의 체인을 형성할 때 첫번째 필터가 변경하는 요청 정보는 클라이언트의 요청 정보가 되지만,출처:http://javacan.tistory.com
- 체인의 두번째 필터가 변경하는 요청 정보는 첫번째 필터를 통해서 변경된 요청 정보가 된다.
즉, 요청 정보는 변경에 변경에 변경을 거듭하게 되는 것이다. 응답 정보의 경우도 요청 정보와 비슷한 과정을 거치며
차이점이 있다면 필터의 적용 순서가 요청 때와는 반대라는 것이다.
2.3 Filter 인터페이스
Filter 객체 | 설명 |
---|
public void init(FilterConfig filterConfig) throws ServletException | 필터를 웹 콘테이너내에 생성한 후 초기화할 때 호출 |
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException | 체인을 따라 다음에 존재하는 필터로 이동한다. 체인의 가장 마지막에는 클라이언트가 요청한 최종 자원이 위치한다. |
public void destroy() | 필터가 웹 콘테이너에서 삭제될 때 호출 |
2.4 Filter 간단 예제
package com.example.web;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class LoginCheckFilter implements Filter {
public void init(FilterConfig config) throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpSession session = httpRequest.getSession(false);
boolean login = false;
String id = request.getParameter("id");
String pw = request.getParameter("pw");
System.out.println(id+pw);
if(id.equals(pw)) {
session.setAttribute("MEMBER",id);
}
if(session != null){
if(session.getAttribute("MEMBER") != null){
login = true;
}
}
if(login){
chain.doFilter(request, response);
}
else{
System.out.println("로그인에 실패!");
RequestDispatcher dispatcher = request
.getRequestDispatcher("/loginForm.jsp");
dispatcher.forward(request, response); }
}
public void destroy() {
}
}
<filter>
<filter-name>LoginCheck</filter-name>
<filter-class>com.example.web.LoginCheckFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginCheck</filter-name>
<url-pattern>/Login.jsp</url-pattern>
</filter-mapping>
문서정보
출처 - http://wiki.gurubee.net/pages/viewpage.action?pageId=26740229