본문 바로가기
JSP

3. Servlet작성

by McNal 2022. 3. 21.

시작


제일먼저 만들고싶은 웹페이지가 필자가 속해있는 야구팀(Mysterya)에 관한 웹페이지 이기때문에 package명은 com.Mysterya.web으로 생성하고 진행하였다.
학습하고 실험은 모두 Test에서 진행하고 이후에 필요한 부분을 활용하여 새로이 class를 생성하고 명명하려한다.

진행


서블릿 클래스를 구현하기위해 HttpServlet클래스를 상속받는다.

  package com.Mysterya.web;

  import jakarta.servlet.http.HttpServlet;

  public class Test extends HttpServlet{

  }

Tomcat v9까지는 상속받을 경우 자동으로 javax.servlet.http.HttpServlet을 import하지만
Tomcat v10부터는 jakarta.servlet.http.HttpServlet를 import하는것으로 바뀌었다.

  package com.Mysterya.web;

  import java.io.IOException;

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

  public class Test extends HttpServlet{
          @Override
          protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
              // TODO Auto-generated method stub
              super.service(arg0, arg1);
          }
  }

이후 service 함수를 Override하기위해 service를 입력후 자동입력을하면 쉽게 불러와준다.
필요한 항목도 import해준다. //TODO 구문과 super구문은 필요없기에 삭제해준다.

편의를 위해 기본으로 arg0, arg1로 되어있는 변수를 reqs,resp로 바꿔주었다.

기본적인 문자열출력을 위해 writer를 사용하였다. 파일읽어 binary로 전달하는게 아니고, 다국어(한글)을 사용하기에 stream이아니라 writer를 사용하였다.

-stream 사용
  package com.Mysterya.web;

  import java.io.IOException;
  import java.io.OutputStream;
  import java.io.PrintStream;

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

  public class Test extends HttpServlet{
          @Override
          protected void service(HttpServletRequest reqs, HttpServletResponse resp) throws ServletException, IOException {

              OutputStream os = resp.getOutputStream();
              PrintStream out = new PrintStream(os, true);
              out.println("hello");
          }
  }

-writer사용
  package com.Mysterya.web;

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

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

  public class Test extends HttpServlet{
          @Override
          protected void service(HttpServletRequest reqs, HttpServletResponse resp) throws ServletException, IOException {

              PrintWriter out = resp.getWriter();
              out.println("안녕");
          }
  }

import 줄이 길어지기에 java.io.*이런식으로 import해도 되기는 하지만 그냥 진행하려고한다.


WEB-INF/web.xml안에 <servlet></servlet>, `'을 사용해서 url을 입력했을 때 불러오게 매핑이 가능하다.

임의로 ~/hello를 입력했을 때 매핑을 해보았다.

```HTML
<web-app>

<servlet>
    <servlet-name>Test</servlet-name>
    <servlet-class>com.Mysterya.web.Test</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Test</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

</web-app>
```

이를 Annotation으로 쉽게 사용할 수 있다.

  package com.Mysterya.web;

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

  import jakarta.servlet.ServletException;
  import jakarta.servlet.annotation.WebServlet;
  import jakarta.servlet.http.HttpServlet;
  import jakarta.servlet.http.HttpServletRequest;
  import jakarta.servlet.http.HttpServletResponse;
  @WebServlet("/hello")
  public class Test extends HttpServlet{
          @Override
          protected void service(HttpServletRequest reqs, HttpServletResponse resp) throws ServletException, IOException {

              PrintWriter out = resp.getWriter();
              out.println("안녕");
          }
  }

Servlet 3.x 이상에서 가능한 방법이며 webapp/WEB-INF/web.xml에서 metadata-complete="false"로 수정해주어야 한다

이 값이 true 이면 모든 설정이 web.xml에 있으니 여기서 찾으라는 의미지만 우리는 각각에 Annotation을 해줄거기 때문에 false 로 변경해준다.

  <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                        https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
    version="5.0"
    metadata-complete="false">

Annotation이 겹치게 되면 어느것이 먼저나오는지는 모르겠는데 꼬이게되므로 주의하자

마지막으로 콘텐츠 형식과 인코딩 형식을 지정해준다.

  package com.Mysterya.web;

  import java.io.*

  import jakarta.servlet.*
  import jakarta.servlet.http.*

  //servlet /hello로 치면 이문서를 불러온다
  @WebServlet("/hello")
  public class Test extends HttpServlet {
      @Override
      protected void service(HttpServletRequest reqs, HttpServletResponse resp) throws ServletException, IOException {

          //이문서는 UTF-8로 작성되었다.
          resp.setCharacterEncoding("UTF-8");
          //이문서의 타입은 text/html이고 UTF-8로 읽어라
          resp.setContentType("text/html; charset=UTF-8");
          //전달받는 입력값을 UTF-8로 받겠다.
          reqs.setCharacterEncoding("UTF-8");
  }

requestresponse는 서버입장이 아니라 사용자입장에서 생각해야 편하다.

'JSP' 카테고리의 다른 글

4. get, post  (0) 2022.03.22
2. 톰캣, 이클립스 설치  (0) 2022.03.21
1. 공부의 시작  (0) 2022.03.20