Servlet 1

WebStudy/Spring / / 2021. 7. 11. 16:18

서블릿 내부 동작

서블릿 - JVM 기반에서 웹 개발을 하기 위한 API

서블릿의 생명 주기

서블릿은 자신만의 생명주기를 가지고 있다.
초기화, 서비스, 소멸의 3단계로 구성

  • 초기화
    • 로드한 서블릿의 인스턴스를 생성하고 리소스를 로드하는 등 클래스 생성자의 초기화 작업과 동일한 역할을 수행
  • 서비스
    • 클라이어트의 요청에 따라서 호출할 메서드를 결정함
  • 소멸
    • 서블릿이 언로드
    • 언로드는 런타임 오류가 발생하거나 서블릿 컨테이너가 종료되었을 때 발생함
      • 이때는 메서드 호출 결과가 정상적으로 호출 되지 않음

서브릿 초기화 & init 메서드

@WebServlet("/init")
public class InitServlet extends HttpServlet{
    @Override
    public void init() throws ServletException{
        System.out.println("init call");
    }
}

HttpSevlet을 상속받아서 서블릿을 만든다.

  • 초기화 메서드 이므로 한 번만호출된다.
  • URL 매핑은 WebServlet 어노테이션으로 작성
  • 초기화 시점에 init 메서드가 호출 되므로 새로고침을 누르더라도 "init call"은 출력되지 않는다.
  • 파라미터를 전달하고 싶은 경우 servletConfig를 사용한다.

서블릿 활용

HTTP 요청과 응답

GET 요청 처리

doGet메서드를 통해 GET 메서드 방식의 요청을 응답받을 수 있다.
HttpServletRequest와 HttpServletResponse를 파라미터로 전달받을 수 있다.

  • HttpServletRequest
    • 요청에 대한 정보
  • HttpServletResponse
    • 브라우저에서 정보를 표현하기 위해 사용
      @WebServlet(name="HelloServlet", urlPartterns ={"/helloget"})
      public class HelloServlet extends HttpServlet{
      protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws SErvletException, IOException {
        System.out.println("doGet 메서드 호출");
        response.setCharacterEncoding("utf-8");
        PrintWriter writer = response.getWriter();
        // contentType 정의
        response.setContentType("text/html");
        writer.println("<html>");
        writer.println("<head>jpub java werservice</head>");
        writer.println("<body>get 요청 예제 입니다.</body>");
        writer.println("</html>");
      }
      }

POST 요청 처리

@WebServlet(name="HelloServlet2", urlPartterns ={"/hellopost"})
public class HelloServlet2 extends HttpServlet{
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws SErvletException, IOException {
        System.out.println("doPost 메서드 호출");
    }
}
  • Post 요청에 대해서만 처리할 수 있는 메서드라 URL로 접속 시 에러 발생

HTML 폼 데이터 전송

FORM 태그의 두 가지 속성

  • action
    • 요청을 보낼 경로
  • method
    • input 태그의 속성
      <form method="post" action="postend">
      <input type="text" name="user" placeholder="Username">
      <input type="password" name="pwd" placeholder="Password">
      <input type="submit" class="login login-submit" value="login">
      </form>

사용자 폼 태그에서 입력한 user필드와 pwd 필드의 값을 읽을 수 있도록 하려면 서블릿의 urlPatterns의 값을 폼의 action 속성값과 동일하게 postend와 일치해야 한다.

@WebServlet(name="LoginServlet", urlPartterns ={"/postend"})
public class LoginServlet extends HttpServlet{
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
    throws SErvletException, IOException {
        System.out.println("doPost 메서드 호출");
        resp.setCharacterEncoding("UTF-8");
        req.setCharacterEncoding("UTF-8");
        PrintWriter writer = resp.getWriter();

        resp.setContetType("text/html");

        String user = req.getParameter("user");
        String pwd = req.getParameter("pwd");
        writer.println("<html>");
        writer.println("<head><title>Login Servlet</title></head>");
        writer.println("<body>");
        writer.println("전달받은 이름은" + user+ "이고" + "<br/>" + "비밀번호는 "+pwd+"입니다.");
        writer.println("</body>");
        writer.println("</html>");
    }
}

멀티파트

멀티파트는 바이너리 데이터 전송을 위해 사용 - 파일 업로드 등

<form method="post" action="upload" enctype="multipart/form-data">
    File:
    <input type="file" name="file" id="file">
    업로드할 서버 경로:
    <input type="text" value="c:/upload" name="destination">
    <br/>
    <input type="submit" value="upload">
</form>

enctype="multipart/form-data"을 설정해 주어야 파일 업로드 기능을 수행

  • 이 예제는 c드라이브에 upload 디렉토리를 만든다.
@WebServlet(name="uploadServlet", urlPartterns ={"/upload"})
@MultiPartConfig(
    fileSizeThreshold = 1024 * 1024 * 2, // 2mb
    maxFileSize = 1024 * 1024 * 10, // 10mb
    maxrequestSize = 1024 * 1024 * 50, // 50mb
    location = "c:/upload" // 파일 저장 위치
)
public class UploadServlet extends HttpServlet{
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws SErvletException, IOException {
        System.out.println("doPost 메서드 호출");
        response.setCharacterEncoding("UTF-8");
        request.setCharacterEncoding("UTF-8");
        // 경로
        final String path = request.getParameter("destination");
        // 파일
        final Part filePart = request.getPart("file");
        // 파일 이름
        final String fileName = getFileName(filePart);
        PrintWriter writer = response.getWriter();

         try (OutputStream out = new FileOutputStream(new File(path + File.separator + fileName)); InputStream filecontent = filePart.getInputStream()) {
            int read = 0;
            final byte[] bytes = new byte[1024];

            while ((read = filecontent.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }

            writer.print("new File: " + fileName + path + "에 생성되었습니다.");

        } catch (FileNotFoundException fne) {
            System.out.println(fne.getMessage());
        }
    }


    private String getFileName(final Part part) {
        final String partHeader = part.getHeader("content-disposition");
        System.out.println("Part Header = {0}" + partHeader);
        for (String content: part.getHeader("content-disposition").split(";")) {
            if (content.trim().startsWith("filename")) {
                return content.substring(
                        content.indexOf('=') + 1).trim().replace("\"", "");
            }
        }
        return null;
    }
}

'WebStudy > Spring' 카테고리의 다른 글

Spring IoC 패턴  (0) 2021.07.14
Servlet 2  (0) 2021.07.12
IntelliJ AWS 연동  (0) 2021.02.02
IntelliJ Ultimate Spring  (0) 2021.02.02
IntelliJ Community Spring 설치  (0) 2021.02.01
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기