[신세계I&C KDT][Servlet/JSP] #32 서블릿 맵핑, 응답 & 요청 처리 (0521)

박현아·2024년 5월 21일
0

신세계아이앤씨 KDT

목록 보기
36/42

1. 서블릿 (Servlet)

1) 개요

  • servlet-api.jar 안의 패키지 이용
    -> javax.servlet.http 패키지의 HttpServlet 클래스 이용
  • Java EE api 문서 참고하기 !!!
  • HttpServlet의 계층 구조

Servlet(인터페이스)
: init(),destroy(),getServletConfig(),service(,)
ServletConfing(인터페이스)  
: getInitParameter(String name),getServletContext()
				|
				|
        GenericServlet (추상 클래스)
        : service(,)
          init(), destroy()
          getServletConfig()
          getServletContext()
          getInitParameter(String name)
                 |
            HttpServlet  (추상 클래스)
 : doGet(HttpServletRequest req, HttpServletResponse resp)
   doPost(HttpServletRequest req, HttpServletResponse resp)
   doPut(,), doDelete(,)
   service(,)
   init(), destroy()
   getServletConfig()
   getServletContext()
   getInitParameter(String name)
   				 |
               (상속)
                 |
      MyServlet (우리가 만들 서블릿)
   => extends HttpServlet을 하면 웹브라우저의 요청을 처리할 수 있는 클래스가 된다

2) 서블릿을 작성하는 순서

(1) extends HttpServlet

(2) doGet(), doPost() 메서드 재정의

  • doGet(HttpServletRequest req, HttpServletResponse resp) (기본) , doPost(HttpServletRequest req, HttpServletResponse resp)
    메서드를 재정의
   			요청 (url입력,링크클릭,새로고침,버튼클릭,submit)
 웹브라우저 -------------------------> 서버
 				get 요청 ----------> 서블릿이 doGet요청 처리
            	post 요청 ----------> 서블릿이 doPost요청 처리
  • 요청의 대부분은 GET 방식으로 요쳥됨
    POST로 요청하는 단 하나의 경우는?
    < form method="post" >

(3) doGet/doPost 메서드에서 비즈니스 로직 요청 처리하고 html 작성해서 응답 처리

  • 비즈니스 로직 처리
    사용자의 요청 처리 (폼데이터 처리 예> id/pw 얻기)
    유효성 체크 (DB 연동)
    HttpServletRequest req 담당
  • 응답 처리
    비즈니스 로직 처리에 대한 결과 (id/pw 맞다/틀리다)를 사용자에게 알려준다
    HttpServletResponse resp 담당

(4) 서블릿 맵핑

  • web.xml
  • @WebServlet("/서블릿맵핑값")

2. 서블릿 맵핑

1) web.xml

	<servlet>
        <servlet-name>TestServlet</servlet-name>
        <servlet-class>com.servlet.TestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/xxx3</url-pattern>
    </servlet-mapping>

2) @WebServlet("/서블릿맵핑값")

  • eclipse가 자동으로 지원하는 맵핑 방법

3. 서블릿 특징

  • main 메서드가 없다. 따로 시작점이 없다는 뜻
    즉, 사용자가 맨 처음 요청하는 서블릿이 시작점 역할을 한다
  • 서블릿을 명시적으로 new (객체 생성) 안 함
    Tomcat이 서블릿/JSP의 Life cycle (생성~소멸)을 관리함
  • 서블릿은 단 한 번만 생성됨

4. 서블릿의 LifeCycle

  • 콜백 메서드가 제공됨

(1) 서블릿이 생성될 때 호출되는 콜백 메서드

  • init()
  • 용도 : 서블릿이 생성될 때 초기화 작업 처리
  • 중요 : 서블릿은 단 한 번만 생성됨. 따라서 init() 메서드도 단 한 번만 호출됨 !!!
    따라서 서블릿에 인스턴스 변수를 작성하면 여러 사용자들이 공유하게 됨 (보안에 취약. thread-unsafe)
    => 인스턴스 변수 사용을 조심해야된다 !!
    => doGet의 로컬 변수로 작성해야된다 (thread-safe)

(2) (사용자가) 요청할 때 호출되는 콜백 메서드

  • doGet / doPost
  • 용도 : 요청 처리, 응답 처리

(3) 소멸될 때 호출되는 콜백 메서드

  • destroy()
  • 용도 : 서블릿이 삭제될 때 clean up 작업 처리

5. 서블릿의 응답 처리

  • doGet의 두 번째 파라미터인 HttpServletResponse resp가 담당

1) 개념

: 웹 브라우저에 서 볼 수 있도록 html 작성

2) HttpServletResponse 인터페이스의 메서드

  • response.addCookie(Cookie cookie) : 쿠키 저장할 때 사용

  • response.addHeader(String name, String value) : 응답 헤더에 헤더값을 추가할 때

  • response.getHeader(String name) : 응답 헤더값 얻어오기

  • response.getStatus() : 응답에 대한 status 값

  • response.sendRedirect(String location) : 서블릿에서 JSP로 위임할 때 사용

  • response.setContentType(String type) : 웹 브라우저에게 처리할 데이터의 종류를 알려주는 기능. MIME 타입
    예> text/plain
    text/html
    application/json

  • PrintWriter out = response.getWriter();
    out.print(값): // 이 값이 웹 브라우저에 출력됨

cf) 헤더 정보 (header)

              요청 (요청 헤더가 전달)
              method:get
              Accept:text/html;~~
              Accept-Language:ko-kr,~~
              User_Agent:Mozilla~
웹브라우저  ------------------------------>  서버
		   <------------------------------
               응답 (응답 헤더가 전달)
               Content-Type:text/html; charset=utf-8

3) 웹브라우저에 html 출력하는 방법

(1) MIME 설정

response.setContentType("text/html; charset=utf-8");

(2) html 작성 출력

PrintWriter out = response.getWriter();
out.print("html 코드");
==> 서블릿에서하는 응답처리는 쉽지 않음. 실제로는 서블릿에서 응답 처리 X
대신 JSP에 위임해서 응답 처리를 한다

                                      서버
      웹브라우저 ------------------>  서블릿
                                      |
                                      | 위임 (2가지 방법)
				          		- response.sendRedirect(String location)
					  			- request.getRequestDispatcher(String path)
               <------------------   jsp

6. 서블릿의 요청 처리

  • doGet의 첫 번째 파라미터인 HttpServletRequest req가 담당

1) 개념

: 웹 브라우저에서 요청했을 때 서블릿에서 처리하는 작업 의미
예> 사용자 입력 데이터 얻기, 한글 처리

2) HttpServletResponse 인터페이스의 메서드

  • request.getContextPath() : 요청 URL에서 context명 얻을 때

  • request.getCookies() : 쿠키를 배열로 반환. Cookie[]

  • request.getHeader(String name) : 요청 헤더값 얻어오기

  • request.getQueryString() : 요청 URL에서 ? name=value&name=value

  • request.getSession() : 세션 얻을 때 사용. 매우 중요 !!! (로그인할 때)

  • request.setAttribute(key, value) : key/value 쌍으로 데이터 저장할 때 사용

  • request.getAttribute(key) : key 이용해서 value 얻을 때

  • request.setCharacterEncoding(String env) : "utf-8" 지정해서 한글 처리 가능

// 다음 4개이 메서드로 사용자 입력 데이터를 얻을 수 있다

  • request.getParameter(String name)
    -> 무조건 String으로 반환됨
    -> 일치하지 않는 name을 지정하면 null을 반환한다
    -> GET 방식으로 요청했을 때, 한글 처리가 잘 된다
    -> POST 방식으로 요청시, 한글이 깨짐 (request.setCharacterEncoding("utf-8")) 이용하기)

  • request.getParameterNames()

  • request.getParameterValues(String name)

  • request.getParameterMap()

  • request.getRequestDispatcher(String path): 서블릿에서 JSP로 위임할 때 사용

7. 경로

1) 절대 경로

  • / 로 시작
  • 서블릿에서 /는 다음 URL에서 8090 뒤의 /를 의미한다
    즉, / 를 기준으로 경로를 선택하는 방법
    예> http://localhost:8090/app5/memberForm.html
    action="/login" ( 8090/login 의미 )
    href="/~"
    src="/~"

2) 상대 경로

  • / 로 시작안하고 . 또는 .. 사용
  • 현재 URL에 보여지는 페이지의 경로를 기준으로 경로를 선택하는 방법이다

cf) 405 에러

클라이언트의 method="get | post"와 서블릿의 doGet | doPost 가 일치하지 않는 경우에 발생됨

0개의 댓글