리루

2. Servlet (써블릿) - 원시적인 코드로 확인 본문

#Spring

2. Servlet (써블릿) - 원시적인 코드로 확인

뚱보리루 2020. 2. 2. 15:10

1. 준비

 - Maven : maven-archetype-webapp

 - 톰켓

 

 - Servlet dependency

https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api/4.0.1

 

Maven Repository: javax.servlet » javax.servlet-api » 4.0.1

Professional Java Data: RDBMS, JDBC, SQLJ, OODBMS, JNDI, LDAP, Servlets, JSP, WAP, XML, EJBs, CMP2.0, JDO, Transactions, Performance, Scalability, Object and Data Modeling (2001)by Carl Calvert Bettis, Michael Bogovich, Sean Rhody, Mark Wilcox, Kelly Lin P

mvnrepository.com

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>

 

* privided scope : 코딩하는 시점에는 사용할 수 있지만 프로젝트 패키징 할때는 프로젝트에서 빠짐(해당 의존성은 어디선가에서 제공됨---> 톰켓 컨테이너에서 제공됨)

 

 

 

2. 서블릿 생성

 - Servelt 생성

package me.json;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        System.out.println("init");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet");
        resp.getWriter().print("<html>");
        resp.getWriter().print("<head>");
        resp.getWriter().print("<body>");
        resp.getWriter().print("<h1>Hello Servlet</h1>");
        resp.getWriter().print("</body>");
        resp.getWriter().print("</head>");
        resp.getWriter().print("</html>");
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

 - webapp/WEB-INF/web.xml 설정

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>


  <!-- Register servlet -->
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>me.json.HelloServlet</servlet-class>
  </servlet>


  <!-- Mapping Servlet with url pattern -->
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

</web-app>

 

 

3. 서블릿 실행

 - 서블릿 독자적으로 실행할 수 있는 방법은 없다.

 - 서블릿 컨테이너(톰켓)에 배포하는 식으로 실행을 해야한다.

 - 우측 상단 Add confituration... -> Tomcet Server -> Local 선택

 - Tomcat 설치 및 설치 폴더 내 *.sh 파일에 실행권한 부여(chmod +x ./bin/*.sh)

- Tomcat Delpoyment 설정에 war:exploded 추가

 : 배포를 하는데 톰켓을 띄울 때 해당 애플리케이션을 war로 묶어서 배포하는 방법(:war)이 있고, war를 압축을 풀어버린 상태로 톰켓에 배포(:war:exploded)하는 방식이 있다.

- 해당 설정을 하면 application context가 설정이 되고, Server 탭에 앱이 떴을때의 기본 url로 설정된다.

- url 이 굉장히 길어서, Deployment/Application Context를 root(/)로 설정하기도 한다.

 

 

4. 마치며..

 - Spring MVC가 이 httpServlet 기반으로 만들어 졌는데,

 - 어떻게 애노테이션(@Controller, @RequestMapping)을 사용해서 요청을 처리 할 수 있나?

 - 어떻게 뷰를 println으로 찍는게 아니라 thymeleaf 사용할 수 있나?

 - 어떻게 web.xml 없이 Servlet Application을 띄울 수 있었나?

 

 

[참고] Infrean 백기선의 스프링 웹 MVC 기반으로 저같은 초보들이 알기 쉽도록 재구성 해보았습니다., (매우 유용하고 친절한 강의라고 생각합니다. 들으시면 기본적인 구조나 원래를 익히는데 도움이 되실 것 같습니다!! 20% 할인하는 기간도 간간히 있으니 잘 활용하세용~)