온라인 강좌/JSP & Servlet 활용

6차시 Servlet 설정

범박사 2023. 6. 29. 23:18

학습목표

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

에러 상황

  1. 상태 코드 값에 의한 에러 상황
  2. 내부적인 애플리케이션 에러 상황

에러가 발생했을 때 어떻게 웹 애플리케이션에서 반응할 것인가?

에러가 발생하더라도 준비되어 있는 화면 출력 (에러 전문 페이지)

에러가 발생 시 컨테이너가 알아서 특정 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>

 

Servlet 에러 발생

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 파일도 들어가서 봤는데 프로젝트명 잘 써있고..??

정 안되면 이클립스 껐다 켜보래서 껐다 키고 다시 구동했는데

url1, url2 로도 실행이 된다.

갑자기 해결

이게..코딩?

 

web.xml 파일에 등록 또는 Annotation으로 Servlet 등록해서 사용 가능한데, 확실히 어노테이션이 간편하다고 느꼈다.

ㅎ.. 오류의 세계로 빠질뻔...