web.xml
파일은 Eclipse Jetty 9/ servlet 3 서버를 포함하는 런타임에 자바 앱을 배포 할 때만 사용됩니다. 자세한 내용은
Eclipse Jetty 9.3 런타임을 참조하세요.
자바 웹 애플리케이션은 배포 설명자 파일을 사용하여 URL이 서블릿에 매핑되는 방법, 인증이 필요한 URL 등의 정보를 확인합니다. 이 파일은 이름이 web.xml
이며 앱의 WAR에서 WEB-INF/
디렉터리에 위치합니다.
web.xml
은 웹 애플리케이션의 서블릿 표준에 포함됩니다.
web.xml
표준에 대한 자세한 내용은 서블릿 사양을 참조하세요.
배포 설명자 정보
웹 애플리케이션의 배포 설명자는 애플리케이션의 클래스, 리소스, 구성 및 웹 서버가 이를 사용해서 웹 요청을 처리하는 방법을 기술합니다. 웹 서버는 애플리케이션에 대한 요청이 수신되면 배포 설명자를 사용하여 요청의 URL을 해당 요청을 처리해야 하는 코드에 매핑합니다.
배포 설명자는 이름이 web.xml
인 파일입니다. 이 파일은 앱의 WAR에서 WEB-INF/
디렉터리에 위치하며, 루트 요소가 <web-app>
인 XML 파일입니다.
다음의 간단한 web.xml
예시에서는 모든 URL 경로(/*
)를 서블릿 클래스 mysite.server.ComingSoonServlet
에 매핑합니다.
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>comingsoon</servlet-name>
<servlet-class>mysite.server.ComingSoonServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>comingsoon</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
서블릿 및 URL 경로
web.xml
은 URL 경로와 해당 경로의 요청을 처리하는 서블릿 사이의 매핑을 정의합니다. 웹 서버는 이 구성을 사용하여 특정한 요청을 처리할 서블릿을 식별하고 요청 메서드에 해당하는 클래스 메서드를 호출합니다(예: HTTP GET 요청의 doGet()
메서드).
URL을 서블릿에 매핑하려면 <servlet>
요소로 서블릿을 선언한 후 <servlet-mapping>
요소로 URL 경로에서 서블릿 선언으로 이어지는 매핑을 정의합니다.
서블릿을 선언하는 <servlet>
요소에는 파일의 다른 요소에서 서블릿을 참조하는 데 사용할 이름, 서블릿에 사용할 클래스, 초기화 매개변수가 포함됩니다. 동일한 클래스에 서로 다른 초기화 매개변수를 사용하여 여러 서블릿을 선언할 수 있습니다. 각 서블릿의 이름은 배포 설명자 내에서 고유해야 합니다.
<servlet>
<servlet-name>redteam</servlet-name>
<servlet-class>mysite.server.TeamServlet</servlet-class>
<init-param>
<param-name>teamColor</param-name>
<param-value>red</param-value>
</init-param>
<init-param>
<param-name>bgColor</param-name>
<param-value>#CC0000</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>blueteam</servlet-name>
<servlet-class>mysite.server.TeamServlet</servlet-class>
<init-param>
<param-name>teamColor</param-name>
<param-value>blue</param-value>
</init-param>
<init-param>
<param-name>bgColor</param-name>
<param-value>#0000CC</param-value>
</init-param>
</servlet>
<servlet-mapping>
요소는 URL 패턴 및 URL이 해당 패턴과 일치하는 요청에 사용할 선언된 서블릿의 이름을 지정합니다. URL 패턴의 시작 또는 끝 부분에 별표(*
)를 사용하여 0개 이상의 모든 문자를 나타낼 수 있습니다. 표준에서는 문자열 중간의 와일드 카드를 지원하지 않으며, 패턴 하나에 여러 와일드 카드를 허용하지 않습니다. 패턴은 도메인 이름 다음에 오는 슬래시(/
)부터 URL의 전체 경로와 일치하며, 슬래시 자체도 여기에 포함됩니다.
<servlet-mapping>
<servlet-name>redteam</servlet-name>
<url-pattern>/red/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>blueteam</servlet-name>
<url-pattern>/blue/*</url-pattern>
</servlet-mapping>
이 예에서는 URL http://www.example.com/blue/teamProfile
에 대한 요청을 TeamServlet 클래스가 처리하며 teamColor
매개변수는 blue
, bgColor
매개변수는 #0000CC
입니다. 서블릿은 ServletRequest 객체의 getPathInfo()
메서드를 사용하여 와일드 카드와 일치하는 URL 경로의 일부를 가져올 수 있습니다.
서블릿에서 초기화 매개변수에 액세스하려면 자신의 getServletConfig()
메서드를 사용하여 서블릿 구성을 가져온 후 구성 객체에 대해 getInitParameter()
메서드를 호출하면서 매개변수 이름을 인수로 사용합니다.
String teamColor = getServletConfig().getInitParameter("teamColor");
JSP
앱에서 JSP(자바 서버 페이지)를 사용하여 웹페이지를 구현할 수 있습니다. JSP는 HTML 등의 정적 콘텐츠와 자바 코드를 함께 사용하여 정의된 서블릿입니다.
App Engine은 JSP 자동 컴파일 및 URL 매핑을 지원합니다. 애플리케이션의 WAR(WEB-INF/
외부)에서 파일 이름이 .jsp
로 끝나는 JSP 파일은 자동으로 서블릿 클래스로 컴파일되며, WAR 루트를 기준으로 JSP 파일 경로에 해당하는 URL 경로에 매핑됩니다. 예를 들어 WAR의 register/
하위 디렉터리에 이름이 start.jsp
인 JSP 파일이 앱에 포함된 경우 App Engine이 이를 컴파일하여 URL 경로 /register/start.jsp
로 매핑합니다.
JSP가 URL에 매핑되는 방식을 더 세밀하게 제어하려면 배포 설명자의 <servlet>
요소에 매핑을 선언하여 명시적으로 지정할 수 있습니다. <servlet-class>
요소 대신 WAR 루트의 JSP 파일에 대한 경로로 <jsp-file>
요소를 지정합니다. JSP의 <servlet>
요소는 초기화 매개변수를 포함할 수 있습니다.
<servlet>
<servlet-name>register</servlet-name>
<jsp-file>/register/start.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>register</servlet-name>
<url-pattern>/register/*</url-pattern>
</servlet-mapping>
<taglib>
요소로 JSP 태그 라이브러리를 설치할 수 있습니다. 태그 라이브러리에는 JSP TLD(태그 라이브러리 설명자) 파일의 경로(<taglib-location>
) 및 JSP에서 로드할 라이브러리를 선택하는 데 사용하는 URI(<taglib-uri>
)가 포함됩니다. JSTL(자바 서버 페이지 표준 태그 라이브러리)은 App Engine에서 제공하므로 직접 설치할 필요가 없습니다.
<taglib>
<taglib-uri>/escape</taglib-uri>
<taglib-location>/WEB-INF/escape-tags.tld</taglib-location>
</taglib>
시작 파일 목록
사이트의 URL이 WAR에 포함된 정적 파일 또는 JSP에 대한 경로를 나타내는 경우 디렉터리 경로에 유용한 기능을 부여하는 것이 좋습니다.
계정 비밀번호를 확인하고자 URL 경로 /help/accounts/password.jsp
를 방문하는 사용자는 계정 시스템에 대한 정보를 알려주는 페이지를 찾기 위해 /help/accounts/
를 방문하려고 할 수 있습니다. 배포 설명자는 아직 서블릿에 명시적으로 매핑되지 않은 WAR 하위 디렉터리를 나타내는 경로에 사용자가 액세스할 때 서버에서 시도할 파일 이름 목록을 지정할 수 있습니다. 서블릿 표준에서는 이를 '시작 파일 목록'이라고 부릅니다.
예를 들어 사용자가 URL 경로 /help/accounts/
에 액세스하면 배포 설명자에 있는 다음 <welcome-file-list>
요소는 서버가 URL이 존재하지 않음을 보고하기 전에 help/accounts/index.jsp
및 help/accounts/index.html
이 있는지 확인하도록 지시합니다.
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
필터
필터는 서블릿과 같이 요청에 따라 작동하는 클래스이지만 다른 필터 또는 서블릿으로 요청을 계속 처리하도록 허용할 수 있습니다. 필터는 로깅, 특화된 인증 검사, 서블릿 호출 전 요청 또는 응답 객체 주석 처리와 같은 보조 태스크를 수행할 수 있습니다. 필터를 사용하면 배포 설명자에서 요청 처리 태스크를 구성할 수 있습니다.
필터 클래스는 doFilter()
메서드를 포함한 javax.servlet.Filter
인터페이스를 구현합니다. 다음은 메시지를 로깅하고 배포 설명자에 기술된 대로 다른 필터 또는 서블릿을 포함할 수 있는 체인을 따라 제어를 전달하는 간단한 필터 구현입니다.
package mysite.server;
import java.io.IOException;
import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class LogFilterImpl implements Filter {
private FilterConfig filterConfig;
private static final Logger log = Logger.getLogger(LogFilterImpl.class.getName());
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
log.warning("Log filter processed a " + getFilterConfig().getInitParameter("logType")
+ " request");
filterChain.doFilter(request, response);
}
public FilterConfig getFilterConfig() {
return filterConfig;
}
public void init(FilterConfig filterConfig) {
this.filterConfig = filterConfig;
}
public void destroy() {}
}
배포 설명자에 필터를 구성하는 방법은 서블릿과 비슷합니다. <filter>
요소로 필터를 선언한 후 <filter-mapping>
요소로 URL 패턴에 매핑하면 됩니다. 필터를 다른 서블릿에 직접 매핑할 수도 있습니다.
<filter>
요소에는 <filter-name>
, <filter-class>
, 선택사항 <init-param>
요소가 포함됩니다.
<filter>
<filter-name>logSpecial</filter-name>
<filter-class>mysite.server.LogFilterImpl</filter-class>
<init-param>
<param-name>logType</param-name>
<param-value>special</param-value>
</init-param>
</filter>
<filter-mapping>
요소에는 선언된 필터의 이름과 일치하는 <filter-name>
이 포함되고, URL에 필터를 적용하는 <url-pattern>
요소 또는 선언된 서블릿의 이름과 일치하며 해당 서블릿이 호출될 때마다 필터를 적용하는 <servlet-name>
요소 중 하나가 포함됩니다.
<!-- Log for all URLs ending in ".special" -->
<filter-mapping>
<filter-name>logSpecial</filter-name>
<url-pattern>*.special</url-pattern>
</filter-mapping>
<!-- Log for all URLs that use the "comingsoon" servlet -->
<filter-mapping>
<filter-name>logSpecial</filter-name>
<servlet-name>comingsoon</servlet-name>
</filter-mapping>
오류 핸들러
배포 설명자를 사용하여 오류가 발생할 때 서버가 사용자에게 전송하는 내용을 맞춤설정할 수 있습니다. 서버는 특정 HTTP 상태 코드를 전송하려고 할 때 또는 서블릿에서 특정 자바 예외가 발생할 때 대체 페이지 위치를 표시할 수 있습니다.
<error-page>
요소는 HTTP 오류 코드 값이 있는 <error-code>
요소(예: 500
) 또는 예상되는 예외의 클래스 이름이 있는 <exception-type>
요소(예: java.io.IOException
)를 포함합니다. 또한 오류가 발생할 때 표시할 리소스의 URL 경로를 갖는 <location>
요소가 포함됩니다.
<error-page>
<error-code>500</error-code>
<location>/errors/servererror.jsp</location>
</error-page>
지원되지 않는 web.xml 기능
다음 web.xml
기능은 App Engine에서 지원되지 않습니다.
- App Engine은 서블릿 선언에
<load-on-startup>
요소를 지원합니다. 그러나 실제로 로드되는 시점은 웹 서버 인스턴스가 첫 번째 요청을 처리할 때이며, 그 이전에는 로드되지 않습니다. - 배포 설명자의 일부 요소는 IDE에서 사람이 읽을 수 있는 표시 이름, 설명, 아이콘을 사용할 수 있습니다. App Engine은 이러한 항목을 사용하지 않고 무시합니다.
- App Engine은 JNDI 환경 변수(
<env-entry>
)를 지원하지 않습니다. - App Engine은 EJB 리소스(
<resource-ref>
)를 지원하지 않습니다. - 서블릿, 서블릿 컨텍스트 또는 필터 삭제 알림은 지원되지 않습니다.
<distributable>
요소는 무시됩니다.<run-at>
을 사용한 서블릿 예약은 지원되지 않습니다.- 보안 제약조건이 지원되지 않습니다. 동일한 기능은 클라이언트 라이브러리를 사용하여 Cloud 서비스에 인증을 참조하세요.
- CONFIDENTIAL은
web.xml
에서 지원되지 않습니다.