서블릿이란 무엇입니까?
먼저, 서블릿이 무엇인지, 왜 그렇게 자주 듣는지 알아보겠습니다. Java Servlet API는 서버에서 구현하고 요청-응답 체계를 사용하여 클라이언트와 작동하도록 설계된 표준화된 API입니다. 서블릿은 클라이언트로부터 요청을 받고 응답을 반환할 수 있는 클래스입니다. 그렇습니다. Java의 서블릿은 바로 클라이언트-서버 아키텍처가 구축되는 요소입니다. 기억하신다면, 우리는 이미 시리즈의 기사 중 하나에서 이에 대해 이야기했습니다. 너무 서두르지 말고 바로 코드를 작성해 봅시다.웹 애플리케이션을 만드는 데 필요한 것
Java에서 서블릿을 편안하게 사용하려면 Intellij IDEA Ultimate Edition이 필요합니다. 유료이지만 30일 평가판 기간을 활성화하거나 조기 액세스 버전을 사용할 수 있습니다. 항상 무료입니다. 또한 애플리케이션 서버인 Apache Tomcat을 설치하십시오. Tomcat은 서블릿 컨테이너입니다. 외부에서 들어오는 요청을 처리하고 이를 애플리케이션에 전달하는 컨테이너입니다. 이 링크 에서 Tomcat을 다운로드할 수 있습니다 .첫 번째 웹 애플리케이션 만들기
모든 것이 준비되었으면 Maven 프로젝트를 생성해 보겠습니다. Maven에 대해 잘 모르신다면 이전 글을 주목해주세요 . 시작하자!-
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(); } }
-
애플리케이션을 실행하려면 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” 문자열을 얻습니다!
매개변수 및 세션 작업
요청 매개변수를 처리하고 세션과 함께 작업할 수 있도록 서블릿을 개선해 보겠습니다.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");
}
}
GO TO FULL VERSION