CodeGym /Java Blog /무작위의 /파트 5. 서블릿 및 Java 서블릿 API. 간단한 웹 애플리케이션 작성
John Squirrels
레벨 41
San Francisco

파트 5. 서블릿 및 Java 서블릿 API. 간단한 웹 애플리케이션 작성

무작위의 그룹에 게시되었습니다
이 자료는 "엔터프라이즈 개발 소개" 시리즈의 일부입니다. 이전 기사: 파트 5. 서블릿 및 Java 서블릿 API.  간단한 웹 애플리케이션 작성 - 1콘솔에 텍스트를 표시하는 Java 애플리케이션을 작성하는 방법은 이미 알고 있지만 첫 번째 웹 애플리케이션을 만드는 방법은 아직 잘 모르십니까? 좋습니다. 편안하게 지내십시오. 이 기사에서는 서블릿에 대해 알아보고 JAR 파일을 보내지 않고 Java를 다운로드하도록 강요하지 않고 친구에게 자랑할 수 있는 애플리케이션을 작성합니다. 간단한 웹 애플리케이션을 작성해 봅시다 . 웹 개발에 사용되는 접근 방식에 아직 익숙하지 않은 경우 " 엔터프라이즈 개발 소개 " 시리즈 의 첫 번째 기사를 읽는 것부터 시작하는 것이 좋습니다 .

서블릿이란 무엇입니까?

먼저, 서블릿이 무엇이며 왜 서블릿에 대해 자주 듣는지 알아봅시다. Java Servlet API는 서버에서 구현하기 위한 표준화된 API입니다. 요청-응답 체계에 따라 클라이언트와 상호 작용합니다. 서블릿은 클라이언트 로부터 요청을 받고 클라이언트에 응답을 반환할 수 있는 클래스입니다. 실제로 서블릿은 Java에서 클라이언트-서버 아키텍처를 생성하는 데 사용하는 빌딩 블록입니다. 시리즈의 다른 기사에서 해당 아키텍처에 대해 이미 언급한 것을 기억할 수 있습니다. 우리는 덤불 주위를 이기지 않을 것입니다. 바로 몇 가지 코드를 작성해 봅시다.

웹 애플리케이션을 만드는 데 필요한 것

Java 서블릿으로 작업할 때 최대한의 편의를 위해 IntelliJ IDEA Ultimate Edition이 필요합니다. 유료 제품이지만 30일 평가판을 활성화하거나 항상 무료인 얼리 액세스 버전을 사용할 수 있습니다. 또한 애플리케이션의 서버인 Apache Tomcat을 설치합니다. Tomcat은 서블릿 컨테이너입니다. 들어오는 요청을 처리하고 애플리케이션에 전달합니다. 여기 에서 Tomcat을 다운로드하십시오 .

첫 번째 웹 애플리케이션을 만들어 보겠습니다.

모든 것이 준비되었으면 Maven 프로젝트를 생성합니다. Maven에 익숙하지 않은 경우 이전 기사를 살펴보십시오 . 의 시작하자!
  1. pom.xml에서 javax.servlet-api 종속성을 추가하고 WAR 패키징을 지정합니다.

    
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
    
       <groupId>org.example</groupId>
       <artifactId>servlets</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>war</packaging>
    
       <dependencies>
           <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>4.0.1</version>
           </dependency>
       </dependencies>
    </project>
    

    간단한 서블릿 클래스:

    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/hello")
    public class MainServlet extends HttpServlet {
    
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           resp.setContentType("text/html");
           PrintWriter printWriter = resp.getWriter();
           printWriter.write("Hello!");
           printWriter.close();
       }
    }
    
  2. 애플리케이션을 실행하려면 Tomcat 구성을 생성해야 합니다.

    파트 5. 서블릿 및 Java 서블릿 API.  간단한 웹 애플리케이션 작성 - 2파트 5. 서블릿 및 Java 서블릿 API.  간단한 웹 애플리케이션 작성 - 3

  3. 다음으로 사용할 Tomcat 버전과 서버와 통신하기 위한 URL 및 포트를 지정합니다. 다음과 같은 것이 있어야 합니다.

    파트 5. 서블릿 및 Java 서블릿 API.  간단한 웹 애플리케이션 작성 - 4
  4. 이제 컨테이너에 배포할 아티팩트(JAR 아카이브에 어셈블된 프로젝트)를 지정하기만 하면 됩니다. 수정 버튼을 클릭하고 전쟁 폭발을 선택할 수 있습니다. 이는 프로젝트가 다시 빌드된 후 아티팩트가 자동으로 서블릿 컨테이너에 배치됨을 의미합니다. 파트 5. 서블릿 및 Java 서블릿 API.  간단한 웹 애플리케이션 작성 - 5

  5. 애플리케이션 컨텍스트 의 기본값은 servlets_war_exploded 입니다 . 즉, http://localhost:8080/servlets_war_exploded 에서 애플리케이션에 액세스합니다 .

    추가 텍스트가 필요한 이유는 무엇입니까? 불필요한 것은 삭제합시다. 이제 웹 애플리케이션의 주소는 http://localhost:8080 입니다 .

    파트 5. 서블릿 및 Java 서블릿 API.  간단한 웹 애플리케이션 작성 - 6
  6. 확인을 클릭합니다. 이제 애플리케이션을 시작할 수 있습니다.

    파트 5. 서블릿 및 Java 서블릿 API.  간단한 웹 애플리케이션 작성 - 7

    이제 브라우저에서 애플리케이션을 열면 404 오류가 표시됩니다. 주소 http://localhost:8080/에는 "/"에 매핑되는 서블릿이 필요하지만 우리의 유일한 서블릿은 "/hello" 에 매핑되기 때문에 이것은 의미가 있습니다 .

  7. http://localhost:8080/hello 에서 액세스 할 수 있습니다 . 그렇게 하면 예상되는 대답인 "Hello"라는 문자열을 얻게 됩니다!

모든 것이 제대로 작동한다면 코드를 분석해 봅시다. 일반 클래스에서 HTTP 서블릿을 만들려면 HttpServlet 클래스를 상속해야 합니다. 클래스 선언 위에 @WebServlet()주석을 표시합니다. 여기서 서블릿을 특정 경로("/hello")에 바인딩(또는 매핑)합니다. 이 주석은 Java Servlet API 3.0에서만 나타났기 때문에 인터넷에는 XML 파일을 통해 서블릿 매핑이 이루어지는 예가 많이 있습니다. 이것은 더 이상 필요하지 않습니다. GET 요청을 처리하기 위해 메서드를 재정의합니다 doGet(). 메소드의 매개변수에 주의하십시오: HttpServletRequestHttpServletResponse. 개체 HttpServletRequest는 요청에 대해 필요한 모든 정보를 제공합니다. 에서 HttpServletResponse응답을 작성하고 필요한 헤더를 설정합니다.

매개변수 및 세션 작업

요청 매개변수를 처리하고 세션과 함께 작업할 수 있도록 서블릿을 개선해 보겠습니다.

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class MainServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       HttpSession session = req.getSession();
       Integer visitCounter = (Integer) session.getAttribute("visitCounter");
       if (visitCounter == null) {
           visitCounter = 1;
       } else {
           visitCounter++;
       }
       session.setAttribute("visitCounter", visitCounter);
       String username = req.getParameter("username");
       resp.setContentType("text/html");
       PrintWriter printWriter = resp.getWriter();
       if (username == null) {
           printWriter.write("Hello, Anonymous" + "<br>");
       } else {
           printWriter.write("Hello, " + username + "<br>");
       }
       printWriter.write("Page was visited " + visitCounter + " times.");
       printWriter.close();
   }
}
visitCounter이제 서블릿은 세션과 함께 작동하여 페이지를 방문할 때마다 값을 증가시킵니다 . 속성이 아직 생성되지 않은 경우 visitCounter(페이지를 처음 방문할 때) 메서드는 getAttribute()null을 반환하므로 null을 확인해야 합니다. 요청 매개변수도 마찬가지입니다. 사용자가 username 매개변수를 전달하지 않으면 해당 값은 null이 됩니다. 이 경우 사용자를 익명의 방문자로 맞이합니다. GET 요청에서 매개변수를 전달하기 위해 쿼리 문자열이 사용됩니다. 예를 들어 다음 URL을 사용할 수 있습니다. http://localhost:8080/hello? 사용자 이름=폴. 이전 기사 에서 HTTP 요청에 대한 자세한 내용을 읽을 수 있습니다.시리즈에서. 현재 애플리케이션에는 많은 로직이 없지만 루트 경로에서 404 오류가 발생하는 것이 약간 짜증납니다. 이 문제를 해결하기 위해 다른 서블릿을 만들고 시작 페이지에 매핑합니다 @WebServlet("/"). 이 서블릿의 목적은 요청을 "/hello" 경로로 리디렉션하는 것입니다. "전달" 또는 "리디렉션"을 사용하는 두 가지 방법이 있습니다. 아마도 그들 사이의 차이점을 이해하는 것이 가치가 있을 것입니다. 포워드 는 요청 처리를 서버의 다른 서블릿에 위임 합니다. 클라이언트는 관여하지 않습니다. 이렇게 하려면 새 서블릿의 doGet() 메서드에 다음 코드를 추가합니다.

getServletContext().getRequestDispatcher("/hello").forward(req, resp);
이 코드에서 우리는 서블릿 컨텍스트에 액세스하고 관련 서블릿에 대한 요청 디스패처를 가져오고 지정된 인수(req, resp)를 사용하여 특정 요청을 처리하도록 요청합니다. 리디렉션 은 클라이언트가 요청을 처리하는 데 사용해야 하는 주소를 클라이언트에 반환합니다. 대부분의 브라우저는 자동으로 반환된 URL로 이동합니다. 리디렉션을 구현하려면 다음 코드를 추가해야 합니다.

resp.sendRedirect(req.getContextPath() + "/hello");
redirect()매개변수에서 메서드 를 호출 HttpServletResponse하고 클라이언트가 사용해야 하는 주소를 전달합니다. 다음은 중요한 세부 정보입니다. 전체 리디렉션 경로의 끝에 HTTP 매개변수도 추가해야 하는데 이는 그다지 편리하지 않습니다. 우리의 상황에서는 를 사용하는 것이 바람직 forward하지만 때로는 사용하는 것이 redirect더 나을 때도 있습니다. 작동 방식의 차이를 이해한다면 잘못된 선택을 하지 않을 것입니다. 새 서블릿의 코드는 다음과 같습니다.

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

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

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        getServletContext().getRequestDispatcher("/hello").forward(req, resp);
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}

요약

첫 번째 웹 애플리케이션이 완료되었습니다. 다음 문서에서는 IntelliJ IDEA를 사용하지 않고 배포하는 방법을 알아봅니다. GET 요청만 처리하는 애플리케이션을 작성했습니다. 나머지 HTTP 메서드는 부모 클래스의 해당 메서드를 재정의하여 비슷한 방식으로 처리됩니다. 이와 같은 간단한 서블릿을 사용하여 정교한 다목적 웹 애플리케이션을 구축할 수 있습니다. 물론 Spring과 같은 대규모 프레임워크를 사용하면 이 작업이 훨씬 쉬워집니다. 그러나 서블릿의 모든 기능을 더 깊이 파고들고 싶다면 공식 사양을 읽을 수 있습니다 . 6부. 서블릿 컨테이너 7부. MVC(Model-View-Controller) 패턴 소개
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION