JavaRush /Java Blog /Random-KO /5부. 서블릿, Java 서블릿 API. 간단한 웹 애플리케이션 작성

5부. 서블릿, Java 서블릿 API. 간단한 웹 애플리케이션 작성

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

서블릿이란 무엇입니까?

먼저, 서블릿이 무엇인지, 왜 그렇게 자주 듣는지 알아보겠습니다. Java Servlet API는 서버에서 구현하고 요청-응답 체계를 사용하여 클라이언트와 작동하도록 설계된 표준화된 API입니다. 서블릿은 클라이언트로부터 요청을 받고 응답을 반환할 수 있는 클래스입니다. 그렇습니다. Java의 서블릿은 바로 클라이언트-서버 아키텍처가 구축되는 요소입니다. 기억하신다면, 우리는 이미 시리즈의 기사 중 하나에서 이에 대해 이야기했습니다. 너무 서두르지 말고 바로 코드를 작성해 봅시다.

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

Java에서 서블릿을 편안하게 사용하려면 Intellij IDEA Ultimate Edition이 필요합니다. 유료이지만 30일 평가판 기간을 활성화하거나 조기 액세스 버전을 사용할 수 있습니다. 항상 무료입니다. 또한 애플리케이션 서버인 Apache Tomcat을 설치하십시오. Tomcat은 서블릿 컨테이너입니다. 외부에서 들어오는 요청을 처리하고 이를 애플리케이션에 전달하는 컨테이너입니다. 이 링크 에서 Tomcat을 다운로드할 수 있습니다 .

첫 번째 웹 애플리케이션 만들기

모든 것이 준비되었으면 Maven 프로젝트를 생성해 보겠습니다. Maven에 대해 잘 모르신다면 이전 글을 주목해주세요 . 시작하자!
  1. pom.xml에서 javax.servlet-api 종속성을 추가하고 패키징 전쟁을 설정합니다.

    <?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 클래스에서 상속해야 합니다. 클래스 위에는 서블릿을 특정 경로("/hello")에 바인딩(매핑)하는 @WebServlet() 주석을 지정합니다. 이 주석은 Java Servlet API 3.0에만 나타나므로 XML 파일을 통해 서블릿 매핑이 발생하는 예가 인터넷에 많이 있습니다. 이제 이것은 필요하지 않습니다. GET 요청을 처리하기 위해 doGet() 메서드를 재정의합니다. 메소드 인수(HttpServletRequest 및 HttpServletResponse)에 주의하세요. 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을 확인해야 합니다. 요청 매개변수에도 동일하게 적용됩니다. 사용자가 사용자 이름 매개변수를 전달하지 않은 경우 해당 값은 null이 됩니다. 이 경우 익명으로 이용자를 맞이하겠습니다. GET 요청에서 매개변수를 전달하려면 경로 변수가 사용됩니다. 즉, http://localhost:8080/hello?username=Pavel 링크에 액세스해야 합니다 . 시리즈의 이전 기사 에서 http 요청에 대한 자세한 내용을 읽을 수 있습니다 . 이제 우리 애플리케이션에는 최소한의 논리가 있지만 루트 경로의 404 오류는 약간 짜증스럽습니다. 이를 수정하기 위해 다른 서블릿을 생성하고 이를 초기 페이지 @WebServlet("/")에 매핑해 보겠습니다. 이 서블릿의 역할은 요청을 "/hello" 경로로 리디렉션하는 것입니다. 이를 수행하는 방법에는 전달 또는 리디렉션을 사용하는 두 가지가 있습니다. 아마도 그들 사이의 차이점이 무엇인지 이해하는 것이 좋습니다. 전달 - 요청 처리를 서버의 다른 서블릿에 위임하며 클라이언트는 관련되지 않습니다. 이렇게 하려면 새 서블릿의 doGet() 메서드에 다음 코드를 추가해야 합니다.
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
이 코드에서는 서블릿 컨텍스트에 액세스하여 원하는 서블릿의 요청 관리자를 가져오고 지정된 매개변수(req, resp)를 사용하여 특정 요청을 처리하도록 요청합니다. 리디렉션 - 요청을 처리하기 위해 연락해야 하는 주소를 클라이언트에게 반환합니다. 대부분의 브라우저는 전송된 링크로 자동으로 이동합니다. 리디렉션을 구현하려면 다음 코드를 추가해야 합니다.
resp.sendRedirect(req.getContextPath() + "/hello");
HttpServletResponse에서 우리는 Redirect() 메소드를 호출하고 클라이언트가 접속해야 하는 주소를 전달합니다. 중요한 세부 사항: 전체 리디렉션 경로 끝에 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) 패턴 소개 8부. spring-boot에서 작은 애플리케이션 작성
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION