자바 서블릿 소개

1. 개요

이 기사에서는 자바 웹 개발의 핵심 인 서블릿을 살펴 보겠습니다.

2. 서블릿과 컨테이너

간단히 말해서 Servlet은 요청을 처리하고 처리하고 응답으로 응답하는 클래스입니다.

예를 들어 서블릿을 사용하여 HTML 양식을 통해 사용자로부터 입력을 수집하고 데이터베이스에서 레코드를 쿼리하며 웹 페이지를 동적으로 생성 할 수 있습니다.

서블릿은 서블릿 컨테이너 라는 다른 Java 애플리케이션의 제어를 받습니다. 웹 서버에서 실행되는 응용 프로그램이 요청을 받으면 , 서버 손 서블릿 컨테이너에 요청 - 다시 대상 서블릿에 전달합니다.

3. Maven 종속성

웹 앱에 서블릿 지원을 추가하려면 javax . servlet-api 종속성이 필요합니다.

 javax.servlet javax.servlet-api 3.1.0 

최신 maven 종속성은 여기에서 찾을 수 있습니다.

물론 앱을 배포 할 Servlet 컨테이너도 구성해야합니다. Tomcat에 WAR을 배포하는 방법을 시작하기에 좋은 곳입니다.

4. 서블릿 라이프 사이클

서블릿의 라이프 사이클을 정의하는 일련의 메소드를 살펴 보겠습니다.

4.1. init ()

초기화 방법은 한 번만 호출 할 수 있도록 설계되었습니다. 서블릿의 인스턴스가 존재하지 않는 경우 웹 컨테이너는 다음을 수행합니다.

  1. 서블릿 클래스를로드합니다.
  2. 서블릿 클래스의 인스턴스를 만듭니다.
  3. init 메서드 를 호출하여 초기화 합니다.

초기화 서블릿은 모든 요청을받을 수 있습니다 전에 방법이 성공적으로 완료해야합니다. init 메소드가 ServletException을 발생 시키거나 웹 서버가 정의한 기간 내에 리턴하지 않으면 서블릿 컨테이너는 서블릿을 서비스에 배치 할 수 없습니다 .

public void init() throws ServletException { // Initialization code like set up database etc.... }

4.2. 서비스()

이 메소드는 서블릿의 init () 메소드가 성공적으로 완료된 후에 만 호출 됩니다.

Container 는 클라이언트로부터 오는 요청을 처리하기 위해 service () 메서드를 호출하고 HTTP 요청 유형 ( GET , POST , PUT , DELETE 등)을 해석하고 doGet , doPost , doPut , doDelete 등의 메서드를 적절하게 호출합니다 .

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { // ... }

4.3. 멸하다()

서블릿을 서비스에서 제외하기 위해 서블릿 컨테이너에 의해 호출됩니다.

이 메소드는 서블릿의 서비스 메소드 내의 모든 스레드 가 종료되거나 제한 시간이 지난 후에 만 호출 됩니다. 컨테이너가이 메서드를 호출 한 후에는 Servlet 에서 서비스 메서드를 다시 호출하지 않습니다 .

public void destroy() { // }

5. 예제 서블릿

이제 양식을 사용하여 정보를 처리 하는 전체 예제설정해 보겠습니다 .

시작하려면 / calculateServlet 매핑을 사용하여 서블릿을 정의 해 보겠습니다. / calculateServlet 은 양식에 의해 게시 된 정보를 캡처하고 RequestDispatcher를 사용하여 결과를 반환합니다.

@WebServlet(name = "FormServlet", urlPatterns = "/calculateServlet") public class FormServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String height = request.getParameter("height"); String weight = request.getParameter("weight"); try { double bmi = calculateBMI( Double.parseDouble(weight), Double.parseDouble(height)); request.setAttribute("bmi", bmi); response.setHeader("Test", "Success"); response.setHeader("BMI", String.valueOf(bmi)); RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp"); dispatcher.forward(request, response); } catch (Exception e) { response.sendRedirect("index.jsp"); } } private Double calculateBMI(Double weight, Double height) { return weight / (height * height); } }

위와 같이 @WebServlet 주석이 달린 클래스 는 javax.servlet.http.HttpServlet 클래스를 확장해야합니다 . @WebServlet 주석은 Java EE 6 이상에서만 사용할 수 있다는 점에 유의해야합니다 .

The @WebServlet annotation is processed by the container at deployment time, and the corresponding servlet made available at the specified URL patterns. It is worth noticing that by using the annotation to define URL patterns, we can avoid using XML deployment descriptor named web.xml for our Servlet mapping.

If we wish to map the Servlet without annotation, we can use the traditional web.xml instead:

  FormServlet com.root.FormServlet   FormServlet /calculateServlet  

Next, let's create a basic HTML form:


    
Your Weight (kg) :
Your Height (m) :

${bmi}

Finally – to make sure everything's working as expected, let's also write a quick test:

public class FormServletLiveTest { @Test public void whenPostRequestUsingHttpClient_thenCorrect() throws Exception { HttpClient client = new DefaultHttpClient(); HttpPost method = new HttpPost( "//localhost:8080/calculateServlet"); List nvps = new ArrayList(); nvps.add(new BasicNameValuePair("height", String.valueOf(2))); nvps.add(new BasicNameValuePair("weight", String.valueOf(80))); method.setEntity(new UrlEncodedFormEntity(nvps)); HttpResponse httpResponse = client.execute(method); assertEquals("Success", httpResponse .getHeaders("Test")[0].getValue()); assertEquals("20.0", httpResponse .getHeaders("BMI")[0].getValue()); } }

6. Servlet, HttpServlet and JSP

It's important to understand that the Servlet technology is not limited to the HTTP protocol.

실제로는 거의 항상 그렇습니다 .하지만 Servlet 은 일반 인터페이스이고 HttpServlet 은 해당 인터페이스의 확장입니다. 즉 , doGetdoPost 와 같은 HTTP 특정 지원을 추가합니다 .

마지막으로 Servlet 기술은 JSP (JavaServer Pages, Spring MVC 등)와 같은 여러 다른 웹 기술의 주요 동인이기도합니다.

7. 결론

이 빠른 기사에서는 Java 웹 애플리케이션에서 서블릿의 기초를 소개했습니다.

예제 프로젝트는 GitHub 프로젝트로 다운로드하여 실행할 수 있습니다.