• Home
  • About
    • on Weekend photo

      on Weekend

      𝙎𝙩𝙪𝙙𝙮𝙞𝙣𝙜

    • Learn More
    • Instagram
    • Github
  • Archive
    • All Posts
    • All Tags
    • All Categories
  • Categories
    • Problem Solving
    • TIL
    • Study
    • Etc
    • 필사
  • Projects

인프런 - 실전 JSP 2

02 Jan 2021

수강 코스

  • 강의 소리가 너무 작아서 크롬 확장 프로그램 Volumn Control을 사용함.

Day 2

4. Servlet 맛보기

  • servlet cannot resolved 에러 해결 레퍼런스 : Tomcat 8.5를 추가해준다.
  • url 매핑
    • 서블렛 만들 때 나오는거. @WebServlet("{url 매핑 부분}") 요렇게 들어가게 된다. context path 뒤에 들어가는게 url 매핑 파트에 적히는 부분이다.

5. Servlet 맵핑

5.1. Servlet 맵핑이란?

  • 서블렛을 외부에서 요청하기 쉽도록 특정 문자를 이용해서 맵핑하는 방법
  • 웹 컨테이너에 포함된 수십개, 수백개의 서블릿 중 어떤 것을 request하는지 알기 위해 서블릿의 고유한 이름이 필요하다. 이처럼 서블릿을 구분하기 위해선,
    1. full path naming은 http://도메인:포트번호/context-path(프로그램의 루트)/servlet/패키지명을 포함한 서블릿의 full name => 패키지경로, 서블릿의 풀네임까지 들어가며 url이 복잡해지고 정보가 다 드러나므로 보안에 취약해진다.
    2. Servlet Mapping(mapping path naming) : context-path 뒤의 내용을 매핑해서 간결하게 URL로 나타낸다.
  • 맵핑하는 방법
    1. web.xml (배치지시자deployment descriptor, 라고 부르는데 환경설정이라고 쉽게 생각하면 된다.)
    2. 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은 추상 클래스
  • 클래스 다이어그램
    1. 사용자가 만든 Servlet class는
    2. HttpServlet이라는 추상 클래스를 상속extends받아서 만드는데
    3. HttpServlet은 GenericServlet이라는 추상 클래스를 상속받아서 만들고
    4. 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() -- ");
}



jspbackend Share Tweet +1