web.xml?

web.xml?

서블릿 클래스는 JSP 페이지와 달리 설치뿐만 아니라 등록을 하는 과정을 필요로 한다. 여기서 서블릿 클래스를 등록하는 곳의 이름을 Web application deployment descriptor라고 하는데 (줄여서 DD-Deployment Descriptor) 이 역할을 하는 것이 바로 web.xml이다. web.xml 파일은 웹 애플리케이션 디렉터리마다 딱 하나씩만 존재할 수 있다.

DD는 WAS 구동 시 /WEB-INF 디렉토리에 존재하는 web.xml을 읽어 웹 애플리케이션의 설정을 구성하기 위해 존재한다.

web.xml 작성법

web.xml을 작성하기 위해서 우선 루트 앨리먼트인 <web-app></web-app>을 만든다.

그리고, 이 안에 웹 서버가 웹 브라우저로부터 URL을 받았을 때 서블릿 클래스를 찾아서 호출하기 위해 필요한 정보를 기록해야 한다. 그래서 URL과 서블릿 클래스의 이름을 각각 <servlet><servlet-class></servlet-class></servlet>태그와 <servlet-mapping><url-pattern></url-pattern></servlet-mapping>으로 작성해준다. mapping을 위해 입력하는 URL은 전체가 아니라 웹 서버의 도메인 이름, 포트번호, 웹 애플리케이션의 디렉터리 이름을 제외한 나머지 부분을 입력한다.

또한 각각의 URL과 서블릿 클래스를 이어주기 위해 <servlet-name></servlet-name>태그를 이용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<web-app>
	<servlet>
    	<servlet-name>
        	//서블릿의 이름
        </servlet-name>
    	<servlet-class>
    		//서블릿 클래스의 이름
        </servlet-class>
   	</servlet>
    <servlet-mapping>
    	<servlet-name>
        	//참조할 서블릿의 이름
        </servlet-name>
    	<url-pattern>
    		//mapping할 URL
        </url-pattern>
    </servlet-mapping>
</web-app>

여기까지 작성을 하면 기본적인 web.xml의 작성이 된 것이다. 하지만 이를 그대로 사용하면 에러가 날 수 있다. 왜나하면 반드시 넣어야 하는 두 가지 정보가 존재하기 때문이다. 하나는 web.xml 파일의 작성에 사용된 문법의 식별자이고, 다른 하나는 그 문법의 버전이다. 아래의 내용을 제일 상단에 추가해준다.

1
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee">


html과 xml의 다른점

얼핏 보면 <!-- -->로 주석처리하는 것도 똑같고, <라는 태그로 시작해서 >라는 태그로 끝나는 것도 똑같지만 html과 xml은 엄연히 다르다. 아래에서 다른 점을 살펴보자.

  • XML의 선언
    • XML 파일에는 처음에 이 파일이 XML형식으로 작성된 파일임을 표시하는 XML 선언이 올 수 있다.
    • XML 선언은 XML 문서 작성에 사용된 XML 규격서의 버전과 XML 저장하는 데 사용된 문자 코드의 인코딩 방식을 표시하는 역할을 한다. (그렇지만 XML파일의 문자 구성이 ASCII로만 표현된 경우에는 생략해도 무방하다)
  • HTML에서는 모든 문서의 작성 방법이 동일하지만 XML에서는 문서의 종류에 따라 문서 작성 방법이 달라질 수 있다.
    • 예) web.xml = 루트가 <web-app>, server.xml = 루트가 <Server>
  • HTML에서는 엘리먼트 이름과 애트리뷰트 이름에 있는 대소문자를 구분하지 않지만 XML에서는 엄격하게 구분.
    • 예) <BODY> === <body> (HTML), <Server> !== <server> (XML)
  • HTML에서는 단독으로 사용되는 태그는 <로 시작해서 >로 끝나지만 XML에서는 <로 시작해서 />로 끝난다.

  • HTML에서는 애트리뷰트 값을 따옴표로 묶지않고 쓸 수도 있지만 XML에서는 반드시 따옴표로 묶어야 한다.
    • 예) <img src=/img/logo.png> (HTML), <role rolename='admin' /> (XML)
  • HTML에서는 어느정도 문법에 맞지 않는 부분이 있으면 브라우저가 보정해서 처리하지만 XML에서는 조금이라도 다르면 문서 전체가 처리되지 않는다.

이외에도 많은 차이점이 존재한다.


web.xml 분석

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 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">

이 파일이 XML 형식으로 작성된 파일임을 알리고 작성에 사용된 문법의 식별자와 버전 등을 나타낸다.


1
2
3
4
5
6
7
8
9
10
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

웹 애플리케이션에서 공유하기 위한 파라미터를 설정하는 부분. 파라미터로 contextConfigLocation을 설정함으로써 스프링 설정파일을 읽어 들이고 필요한 객체들을 등록하기 위해 필요한 org.springframework.web.context.ContextLoaderListener의 위치를 설정한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- Request Parameter를 UTF-8로 변경하기 위한 필터 -->
<filter>
    <filter-name>encodingFilter</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가 적용될 URL mapping -->
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

주석에 적혀있는 데로 Request parameter를 UTF-8로 바꿔주기 위한 필터이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- HTTP의 PUT 메소드를 사용하기 위해 필터 등록 -->
<!-- 이 필터 없을 시 서플릿이 Request Parameter를 처리하지 못함 -->
<filter>
    <filter-name>httpPutFormFilter</filter-name>
    <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>

<!-- servlet-name으로 mapping -->
<filter-mapping>
    <filter-name>httpPutFormFilter</filter-name>
    <servlet-name>appServlet</servlet-name>
</filter-mapping>

위의 필터는 application/x-www-form-urlencoded 컨텐트 타입의 HTTP PUT Request를 가로채서 요청 바디에서 폼 데이터를 읽고 메서드의 ServletRequest.getParameter*() 계열로 폼 데이터를 사용할 수 있도록 ServletRequest로 감싼다고 한다. 그리고 이 필터의 요청을 appServlet으로 보내 DispatcherServlet이 처리하도록 한다.


1
2
3
4
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>/resources/*</url-pattern>
</servlet-mapping>

.png, .jpg, .js 등 정적인 content를 처리하기 위해 /resources/*으로 요청이 들어오면 요청을 디폴트 서블릿으로 보낸다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<error-page>
    <error-code>400</error-code>
    <location>/error</location>
</error-page>
<error-page>
    <error-code>403</error-code>
    <location>/error</location>
</error-page>
<error-page>
    <error-code>404</error-code>
    <location>/error</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/error</location>
</error-page>

error-code에 맞는 에러가 발생할 경우 /error.jsp를 띄워준다.