학습목표
web.xml 파일의 다양한 설정에 대해 설명할 수 있다.
Servlet을 web.xml 파일에 등록하는 방법과 어노테이션(Annotation)으로 등록하는 방법에 대해 설명할 수 있다.
ServletConfig 객체를 이용한 초기 파라미터 값 획득 방법에 대해 설명할 수 있다.
web.xml 파일 : 웹 애플리케이션의 메인 환경파일
자바 웹 애플리케이션(Java Web Application)의 환경파일
클라이언트 요청 -> URL -> 컨테이너 -> Servlet 실행
welcome-file-list, error-page, servlet, init-param 등 다양한 설정 시 이용
welcome-file-list
클라이언트 요청 URL에 URI가 지정이 되지 않은 경우 서비스 페이지 지정
http://localhost:8080/WebLab/로 요청 시 index.html 페이지가 서비스됨
특정 파일에 대한 요청이 없는 경우 서비스 파일은 순서대로 판단함
error-page
에러 상황
- 상태 코드 값에 의한 에러 상황
- 내부적인 애플리케이션 에러 상황
에러가 발생했을 때 어떻게 웹 애플리케이션에서 반응할 것인가?
에러가 발생하더라도 준비되어 있는 화면 출력 (에러 전문 페이지)
에러가 발생 시 컨테이너가 알아서 특정 error-page 출력
1. 상태 코드 등록
- web.xml 파일에 HTTP Response 상태 코드 등록
- 상태 코드의 에러 발생 시 서비스 리소스 지정
<error-page>
<error-code>404</error-code>
<location>/ch6/test/error_code.html</location>
</error-page>
- 200번대 : 정상
- 400번대 : 클라이언트의 잘못된 요청
- 404 에러 : 클라이언트의 요청에 의해 서비스 될 리소스가 없는 경우, 서버 사이드에 파일이 없는 경우
- 500번대 : 서버 오류 (Internal-error)
2. 에러 타입 등록
- web.xml 파일에 서버 에러 타입 지정
- 에러 발생 시 서비스 리소스 지정
- RuntimeException, Error, Servlet Exception
- 또는 그 하위 클래스, IOException
- 또는 그 하위 클래스를 타입으로 지정할 수 있음
- 특정 타입에 맞는 에러 페이지를 web.xml에 명시해 서비스 되도록 지정 가능
<error-page>
<exception-type>java.lang.RuntimeException</exception-type>
<location>/ch6/test/error_page.html</location>
</error-page>
Servlet 등록 방법 (1) web.xml 등록
- web.xml 파일에 Servlet 클래스와 Servlet이 실행되기 위한 URL 조건 등록
- Servlet 등록은 <servlet> 태그 이용
- Servlet이 실행될 URL 조건은 <servlet-mapping> 태그 이용
클라이언트 URL 조건에 의해 실행될 Servlet을 web.xml에 등록해 컨테이너가 그 등록 정보를 보고 Servlet 실행
<servlet>
<servlet-name>TestSevlet</servlet-name>
<servlet-class>ch6.test.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
Servlet 등록 방법 (2) 어노테이션을 이용한 servlet 등록
web.xml에 servlet을 등록하지 않고 Servlet 클래스에 어노테이션으로 등록
--> 해당 Servlet 내에 어떻게 정보가 설정되어 있는지 판단 가능
@WebServlet 어노테이션 이용
@WebServlet("/test1")
public class TestServlet extends HttpServlet {
}
web.xml에 설정을 하는것 보다 해당 서블릿 클래스에 URL 정보를 어노테이션 정보로 직접 지정하는 방법이 더 편하다.
이 Servlet은 URL에 test1 이라고 들어오면 실행된다.
하나의 Servlet에 여러 URL 등록 가능
@WebServlet에 urlPatterns 속성 이용
@WebServlet(
urlPatterns = {
"/test1",
"/test2"
}
}
public class TestServlet extends HttpSetvelt {
}
이렇게 등록하면 url이 test1, test2로 들어오는 경우 둘 다 실행된다.
ServletConfig
- 해당 Servlet이 실행될 때 부가정보를 가지고 있는 객체 (컨테이너 안에 들어가는 설정)
- Servlet에 대한 여러 가지 기능 제공
- 여러 Servlet 간 공유 불가능
- 주요 기능
- ServletContext 객체 획득
- Servlet 초기화 작업
- lifecycle
- Servlet과 동일하게 생성되며 Servlet 소멸 시 같이 소멸됨
ServletConfig 초기화 파라미터 등록
web.xml
<servlet>
<servlet-name>TestSevlet</servlet-name>
<servlet-class>ch6.test.TestServlet</servlet-class>
<init-param>
<param-name>param1</param-name>
<param-value>param1 data</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<param-value>param2 data</param-value>
</init-param>
</servlet>
<init-param> 을 반복해서 파라미터 이름과 값을 명시해서 ServletConfig를 통해 해당 Servlet에게 전달된다.
web.xml에 등록해서 이용하는게 기본이지만 ServletConfig 역시 어노테이션 사용이 가능하다.
@WebServlet 어노테이션에 initParams 속성으로 지정
@WebServlet(
urlPatterns = {
"/test1",
"/test2"
},
initParams = {
@WebInitParam(name="param1", value="param1 data"),
@WebInitParam(name="param2", value="param2 data"),
}
ServletConfig의 파라미터 값 획득 방법
(1) init 함수를 이용한다.
- Servlet init() 함수의 매개변수로 ServletConfig 객체 전달
- ServletConfig의 getInitParameter() 함수를 이용해 파라미터 값을 얻을 수 있다.
public class TestServlet extends HttpServlet {
@override
Public void init(ServletConfig config) throws ServletException {
super.init(config);
param1 = config.getInitParameter("param1");
param2 = config.getInitParameter("param2");
}
}
(2) doGet(), doPost() 함수에서 getInitParameter() 함수로 파라미터 값 획득
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletExcpetion, IOException {
String param1 = getInitParameter("param1");
String param2 = getInitParameter("param2");
}
실습
(1) web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>WebLab</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<error-page>
<error-code>404</error-code>
<location>/ch6/error_page.html</location>
</error-page>
<error-page>
<exception-type>java.lang.RuntimeException</exception-type>
<location>/ch6/error_code.html</location>
</error-page>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>ch6.MyServlet</servlet-class>
<init-param>
<param-name>param1</param-name>
<param-value>param1.data</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<param-value>param2.data</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
</web-app>
web.xml 파일에 에러 발생 시 나오는 HTML을 지정했기 때문에 해당 HTML이 나온다.
(2) Annotation
MyServlet.java
@WebServlet(
urlPatterns = {
"/url1",
"/url2"
},
initParams = {
@WebInitParam(name="param1", value="param1.data"),
@WebInitParam(name="param2", value="param2.data")
}
)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//String data = null;
//data.indexOf(0);
PrintWriter out = response.getWriter();
out.println("<h1>param test</h1>");
String param1 = getInitParameter("param1");
String param2 = getInitParameter("param2");
//브라우저에 단순 출력시킴
out.println("param : " + param1 + "," + param2);
}
web.xml 에서 만든 error-page와 에러 발생 식은 주석 처리하고, Annotation을 이용해서 작성했다.
근데 자꾸 404 에러가 떠서 ^^... 리소스가 가용하지 않다는데 왜 안되는지 구글링 중..
[에러]Origin 서버가 대상 리소스를 위한 현재의 representation을 찾지 못했거나, 그것이 존재하는지
1.Server Modules탭에서 /path 바꿔도 안 될 때 https://jnju.tistory.com/7 [404 에러 eclipse 설정]Origin 서버가 대상 리소스를 위한 현재의 representation을 찾지 못했거나, 그것 jsp 만으로 돌아가는 테스트페이지를
october-east-sea.tistory.com
이거 보면서 따라하다 path 값도 변경하고 component 파일도 들어가서 봤는데 프로젝트명 잘 써있고..??
정 안되면 이클립스 껐다 켜보래서 껐다 키고 다시 구동했는데
갑자기 해결
이게..코딩?
web.xml 파일에 등록 또는 Annotation으로 Servlet 등록해서 사용 가능한데, 확실히 어노테이션이 간편하다고 느꼈다.
ㅎ.. 오류의 세계로 빠질뻔...
'온라인 강좌 > JSP & Servlet 활용' 카테고리의 다른 글
8차시 Servlet Filter와 Listener (0) | 2023.06.30 |
---|---|
7차시 상태 정보 활용 (0) | 2023.06.30 |
5차시 웹 Query 문자열 (0) | 2023.06.29 |
4차시 Response 분석 (0) | 2023.06.29 |
3차시 Request 분석 (0) | 2023.06.29 |