[boostcourse] 1.5. Servlet - BE

자바 웹 애플리케이션

- WAS에 설치(deploy)되어 동작하는 애플리케이션

- HTML, CSS, 이미지, 자바로 작성된 클래스(Servlet, package, interface 등), 각종 설정 파일 등이 포함됨

자바 웹 애플리케이션의 폴더 구조

  • 자바 웹 애플리케이션
    • WEB-INF 폴더
      • web.xml 파일 (웹 애플리케이션에 대한 정보를 모두 담고 있음)
      • lib 폴더 (각종 jar 파일들)
      • classes 폴더 (java 패키지, servlet 클래스 등)
    • 리소스들
      • 각종 폴더, 이미지, 다양한 리소스들

 

Servlet이란?

- 자바 웹 애플리케이션의 구성요소 중 동적인 처리를 하는 프로그램의 역할

- WAS에서 동작하는 Java 클래스

- 서블릿은 HttpServlet 클래스를 상속 받아야 함

- 서블릿과 JSP로부터 최상의 결과를 얻으려면, 웹 페이지를 개발할 때 이 둘을 조화롭게 사용해야 함

ex) 웹 페이지를 구성하는 화면(HTML)은 JSP로 표현하고, 복잡한 프로그래밍은 서블릿으로 구현

- Servlet 3.0 spec 이상에서는 web.xml 파일을 사용하지 않고, 자바 annotation을 사용함

 

Servlet 작성하기

- Servlet 3.0 이상인 경우

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/ten")
public class TenServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public TenServlet() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        /*
         * HttpServletRequest: 서버가 요청을 받아내는 객체
         * HttpServletResponse: 서버가 응답을 하기 위한 객체
         */

        response.setContentType("text/html;charset=utf-8");     // setContentType: 응답할 콘텐츠의 타입을 알려주는 메소드

        PrintWriter out = response.getWriter();
        out.print("<h1>1부터 10까지 출력합니다.</h1>");
        for(int i = 1; i <= 10; i++) {
            out.print(i + "<br>");
        }
        out.close();
    }
}

 

Servlet 생명주기

- WAS는 Servlet 요청을 받으면, 해당 Servlet이 메모리에 있는지 확인

- 메모리에 없으면, 해당 Servlet 클래스를 메모리에 올림. init() 메소드 실행

- 메모리에 있으면, service() 메소드 실행

- WAS가 종료되거나, 웹 애플리케이션이 새롭게 갱신될 경우 destroy() 메소드 실행

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {

    public LifecycleServlet() {
        System.out.println("Create LifecycleServlet");
    }

    public void init(ServletConfig config) throws ServletException {
        System.out.println("This is init");
    }

    public void destroy() {
        System.out.println("This is destroy");
    }

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("This is service");
    }
}

service (request, response) 메소드

- HttpServlet의 service 메소드는 템플릿 메소드 패턴으로 구현됨

- 클라이언트 요청이 GET인 경우, 자신이 갖고 있는 doGet(request, response) 메소드 호출

- 클라이언트 요청이 POST인 경우, 자신이 갖고 있는 doPost(request, response) 메소드 호출

 

import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {

    public LifecycleServlet() {
        System.out.println("Create LifecycleServlet");
    }

    public void init(ServletConfig config) throws ServletException {
        System.out.println("This is init");
    }

    public void destroy() {
        System.out.println("This is destroy");
    }

//    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        System.out.println("This is service");
//    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>form</title></head>");
        out.println("<body>");
        out.println("<form method='post' action='/basic-servlet/LifecycleServlet'>");
        out.println("name : <input type='text' name='name'><br>");
        out.println("<input type='submit' value='ok'><br>");
        out.println("</form>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String name = request.getParameter("name");
        out.println("<h1> hello " + name + "</h1>");
        out.close();
    }
}


https://actually94.tistory.com/121

 

[Servlet, JSP] Intellij JSP, Servlet Setting 및 실습

Intellij JSP, Servlet 환경 구성하기 진짜 intellij로 이부분 세팅하는데 고생을 너무 많이했다 ㅠㅠ 1. 2. 3. 4. web -> web-INF내부에 server-config.wsdd 삭제 및 web.xml 내부 수정 5. tomcat 설정 (요건 기억안나면 검

actually94.tistory.com

 

Request, Response 객체

요청과 응답

- 클라이언트로부터 요청이 들어오면, WAS는 HttpServletRequest 객체와 HttpServletResponse 객체를 생성함

- Path로 매핑된 Servlet에게 전달됨

HttpServletRequest

- http 프로토콜의 request 정보를 Servlet에게 전달하기 위한 목적으로 사용

- 헤더 정보, 파라미터, 쿠키, URL 등의 정보를 읽어 들이는 메소드를 가지고 있음

- Body의 Stream을 읽어 들이는 메소드를 가지고 있음

HttpServletResponse

- WAS는 어떤 클라이언트가 요청을 보냈는지 알고, 해당 클라이언트에게 응답을 보내기 위해 해당 객체를 생성해서 Servlet에게 전달

- Servlet은 해당 객체를 이용하여 content type, 응답 코드, 응답 메시지 등을 전송함

Header 정보 읽어 들이기

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

@WebServlet("/HeaderServlet")
public class HeaderServlet extends HttpServlet {

    public HeaderServlet() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>form</title></head>");
        out.println("<body>");

        Enumeration<String> headerNames = request.getHeaderNames();
        while(headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            String headerValue = request.getHeader(headerName);
            out.println(headerName + " : " + headerValue + "<br>");
        }
        out.println("</body>");
        out.println("</html>");
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

Parameter 읽어 들이기

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/param")
public class ParameterServlet extends HttpServlet {

    public ParameterServlet() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>form</title></head>");
        out.println("<body>");

        String name = request.getParameter("name");
        String age = request.getParameter("age");
        out.println("name: " + name + "<br>");
        out.println("age: " + age + "<br>");

        out.println("</body>");
        out.println("</html>");
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

그 외 요청 정보 출력하기

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/info")
public class InfoServlet extends HttpServlet {

    public InfoServlet() {
        super();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>form</title></head>");
        out.println("<body>");

        String uri = request.getRequestURI();
        StringBuffer url = request.getRequestURL();
        String contentPath = request.getContextPath();      // WAS에는 여러 웹 애플리케이션이 돌아갈 수 있음. 특정 애플리케이션을 찾아가는 이름
        String remoteAddr = request.getRemoteAddr();

        out.println("uri: " + uri + "<br>");
        out.println("url: " + url + "<br>");
        out.println("contentPath: " + contentPath + "<br>");
        out.println("remoteAddr: " + remoteAddr + "<br>");

        out.println("</body>");
        out.println("</html>");
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}