이 자료는 "엔터프라이즈 개발 소개" 시리즈의 일부입니다. 이전 기사:
콘솔에 텍스트를 표시하는 Java 애플리케이션을 작성하는 방법은 이미 알고 있지만 첫 번째 웹 애플리케이션을 만드는 방법은 아직 잘 모르십니까? 좋습니다. 편안하게 지내십시오. 이 기사에서는 서블릿에 대해 알아보고 JAR 파일을 보내지 않고 Java를 다운로드하도록 강요하지 않고 친구에게 자랑할 수 있는 애플리케이션을 작성합니다. 간단한 웹 애플리케이션을 작성해 봅시다 . 웹 개발에 사용되는 접근 방식에 아직 익숙하지 않은 경우 " 엔터프라이즈 개발 소개 " 시리즈 의 첫 번째 기사를 읽는 것부터 시작하는 것이 좋습니다 .
![파트 5. 서블릿 및 Java 서블릿 API. 간단한 웹 애플리케이션 작성 - 1](https://cdn.codegym.cc/images/article/d58ab9dd-ddca-4b0c-8f7e-f273563ed83c/800.jpeg)
서블릿이란 무엇입니까?
먼저, 서블릿이 무엇이며 왜 서블릿에 대해 자주 듣는지 알아봅시다. Java Servlet API는 서버에서 구현하기 위한 표준화된 API입니다. 요청-응답 체계에 따라 클라이언트와 상호 작용합니다. 서블릿은 클라이언트 로부터 요청을 받고 클라이언트에 응답을 반환할 수 있는 클래스입니다. 실제로 서블릿은 Java에서 클라이언트-서버 아키텍처를 생성하는 데 사용하는 빌딩 블록입니다. 시리즈의 다른 기사에서 해당 아키텍처에 대해 이미 언급한 것을 기억할 수 있습니다. 우리는 덤불 주위를 이기지 않을 것입니다. 바로 몇 가지 코드를 작성해 봅시다.웹 애플리케이션을 만드는 데 필요한 것
Java 서블릿으로 작업할 때 최대한의 편의를 위해 IntelliJ IDEA Ultimate Edition이 필요합니다. 유료 제품이지만 30일 평가판을 활성화하거나 항상 무료인 얼리 액세스 버전을 사용할 수 있습니다. 또한 애플리케이션의 서버인 Apache Tomcat을 설치합니다. Tomcat은 서블릿 컨테이너입니다. 들어오는 요청을 처리하고 애플리케이션에 전달합니다. 여기 에서 Tomcat을 다운로드하십시오 .첫 번째 웹 애플리케이션을 만들어 보겠습니다.
모든 것이 준비되었으면 Maven 프로젝트를 생성합니다. Maven에 익숙하지 않은 경우 이전 기사를 살펴보십시오 . 의 시작하자!-
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(); } }
-
애플리케이션을 실행하려면 Tomcat 구성을 생성해야 합니다.
-
다음으로 사용할 Tomcat 버전과 서버와 통신하기 위한 URL 및 포트를 지정합니다. 다음과 같은 것이 있어야 합니다.
-
이제 컨테이너에 배포할 아티팩트(JAR 아카이브에 어셈블된 프로젝트)를 지정하기만 하면 됩니다. 수정 버튼을 클릭하고 전쟁 폭발을 선택할 수 있습니다. 이는 프로젝트가 다시 빌드된 후 아티팩트가 자동으로 서블릿 컨테이너에 배치됨을 의미합니다.
-
애플리케이션 컨텍스트 의 기본값은 servlets_war_exploded 입니다 . 즉, http://localhost:8080/servlets_war_exploded 에서 애플리케이션에 액세스합니다 .
추가 텍스트가 필요한 이유는 무엇입니까? 불필요한 것은 삭제합시다. 이제 웹 애플리케이션의 주소는 http://localhost:8080 입니다 .
-
확인을 클릭합니다. 이제 애플리케이션을 시작할 수 있습니다.
이제 브라우저에서 애플리케이션을 열면 404 오류가 표시됩니다. 주소 http://localhost:8080/에는 "/"에 매핑되는 서블릿이 필요하지만 우리의 유일한 서블릿은 "/hello" 에 매핑되기 때문에 이것은 의미가 있습니다 .
-
http://localhost:8080/hello 에서 액세스 할 수 있습니다 . 그렇게 하면 예상되는 대답인 "Hello"라는 문자열을 얻게 됩니다!
@WebServlet()
주석을 표시합니다. 여기서 서블릿을 특정 경로("/hello")에 바인딩(또는 매핑)합니다. 이 주석은 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을 확인해야 합니다. 요청 매개변수도 마찬가지입니다. 사용자가 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");
}
}
GO TO FULL VERSION