- 강의 소리가 너무 작아서 크롬 확장 프로그램 Volumn Control을 사용함.
Day 2
4. Servlet 맛보기
-
servlet cannot resolved 에러
해결 레퍼런스 : Tomcat 8.5를 추가해준다. - url 매핑
- 서블렛 만들 때 나오는거.
@WebServlet("{url 매핑 부분}")
요렇게 들어가게 된다. context path 뒤에 들어가는게 url 매핑 파트에 적히는 부분이다.
- 서블렛 만들 때 나오는거.
5. Servlet 맵핑
5.1. Servlet 맵핑이란?
- 서블렛을 외부에서 요청하기 쉽도록 특정 문자를 이용해서 맵핑하는 방법
- 웹 컨테이너에 포함된 수십개, 수백개의 서블릿 중 어떤 것을 request하는지 알기 위해 서블릿의 고유한 이름이 필요하다. 이처럼 서블릿을 구분하기 위해선,
- full path naming은
http://도메인:포트번호/context-path(프로그램의 루트)/servlet/패키지명을 포함한 서블릿의 full name
=> 패키지경로, 서블릿의 풀네임까지 들어가며 url이 복잡해지고 정보가 다 드러나므로 보안에 취약해진다. -
Servlet Mapping
(mapping path naming) : context-path 뒤의 내용을 매핑해서 간결하게 URL로 나타낸다.
- full path naming은
- 맵핑하는 방법
- web.xml (배치지시자deployment descriptor, 라고 부르는데 환경설정이라고 쉽게 생각하면 된다.)
- Java Annotation
5.2. web.xml 파일을 이용한 맵핑
- 조금 더 고전적인 방법이지만, 여전히 많이 선호되는 방법이다.
-
web.xml
에서 매핑을 넣어주는 방법.
<servlet>
<servlet-name>servletEx</servlet-name>
<servlet-class>com.servlet.ServletEx</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletEx</servlet-name>
<url-pattern>/SE</url-pattern>
</servlet-mapping>
- 위처럼 servlet-name을 key로 servlet-class와 url-pattern을 매핑해주는 방법이다.
- 직접 해보기
- 우선 서블릿 파일 상단의
@WebServlet("/hs")
을 주석처리해준다.
- 우선 서블릿 파일 상단의
[web.xml]
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>lec04</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>servletEx</servlet-name>
<servlet-class>com.testPrj.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletEx</servlet-name>
<url-pattern>/hs</url-pattern>
</servlet-mapping>
</web-app>
- 위 코드처럼
하단에 서블릿 매핑 정보가 들어가게 된다. 저렇게 해두면 `http://localhost:8090/lec04/hs` 으로 잘 들어가진다.
5.3. Java Annotation을 이용한 맵핑
-
@WebServlet("/hs")
처럼 url 매핑 값을 WebServlet Annotation에 넣어주는 방법. - 어노테이션 사용하는 방법이 간편하지만, web.xml을 보는 방법은 최소한 알아야합니다.
6. Servlet request, response
- 사용자의 요청(request)과 웹 서버의 응답(response)을 담당하는 객체에 대해서 학습합니다.
6.1. HttpServlet
- HttpServlet은 추상 클래스
- 클래스 다이어그램
- 사용자가 만든 Servlet class는
- HttpServlet이라는 추상 클래스를 상속extends받아서 만드는데
- HttpServlet은 GenericServlet이라는 추상 클래스를 상속받아서 만들고
- GenericServlet은 ServletConfig, Servlet, Serializable이라는 인터페이스를 구현한다.
- 왜? 로컬에서 작업하는게 아니라, 웹서버, 웹어플리케이션서버와의 통신을 위한 프로토콜이 존재하고, 이에 따라 많은 데이터가 오고간다. 이때 필요한 많은 기능들은 이미 구현이 되어 있으므로, HttpServlet만을 상속받아서 사용하는 것이다.
- 결론 : HttpServlet만 상속받아서 사용하면 된다.
package com.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/tsc")
public class TestServletClass extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
- 위는 서블릿을 만든 것인데, 서블릿으로 만들었기 때문에 자동으로 HttpServlet을 extends해오고있는 것을 확인할 수 있다. (기본 서블릿 파일에서 필요없는 내용만 적당히 지운 코드)
6.2. HttpServletRequest
-
protected void doGet(HttpServletRequest request, HttpServletResponse response)
을 통해 request, response를 가져오게 된다. 그렇게 가져온 request는 요청에 대한 정보를 가지고 있는 객체로,request.getParameter()
,request.getParameterValues()
등의 메서드로 정보를 받을 수 있다.
6.3. HttpServletResponse
- 서블릿이 응답을 하는 것. 응답에 대한 정보를 가지고 있는 객체이다.
7. Servlet Life-Cycle
- 사용자의 요청에 의해서 생성된 servlet의 생명주기(생성, 진행, 종료)
7.1. Servlet 생명주기
-
@PostContruct
: 생성을 준비하는 단계 - 생성단계(init단계) :
init()
- 서비스단계
- 소멸단계 :
destroy()
-
@PreDestroy
: 소멸 이후 서블릿을 정리하는 단계
7.2. 생명주기 관련 메서드
- 생성, 실행, 종료와 관련된 메서드 학습
// servlet 실행 (service)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(" -- doGet() -- ");
}
@PostConstruct
public void postConstruct() {
System.out.println(" -- postConstruct() -- ");
}
//servlet 생성
@Override
public void init() throws ServletException {
System.out.println(" -- init() -- ");
}
//servlet 종료
@Override
public void destroy() {
System.out.println(" -- destroy() -- ");
}
@PreDestroy
public void preDestory() {
System.out.println(" -- preDestory() -- ");
}