jb.log

..loading

Servlet 다루기

September 20, 2019

  • 기존의 html 문서만으로는 동적인 내용을 전달할 수 없다. --> WAS : web application server 에서 동작하는 프로그래밍 언어를 사용하면 가능하다.
  • 그렇기에 해당 Java에서 제공하는 servlet 클래스를 활용하여 동적인 웹 페이지를 사용자에게 보여줄 수 있다.

서블릿 만들기

이클립스에서 제공하는 Dynamic web project 를 생성하면 쉽게 servlet 프로그램을 구현할 수 있다.

  • src 하위에 자바 클래스 파일을 생성한다.(이름은 상관 없다)
  • 만든 클래스에게 HttpServlet 클래스를 상속받게 한다.
  • 구현된 메소드들 중 service, doGet, doPost 등이 있는데 먼저 service 메소드를 오버라이드해보자.
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException 
    {
        PrintWriter out = response.getWriter();
        
        out.println("hello servlet");
    }
}
  • HttpServlet 클래스를 상속 받아 servlet 기능을 사용할 수 있음
  • service 메소드는 입력도구 HttpServletRequest와 출력도구 HttpServletResponse을 매개변수로 받아 활용 가능
  • 위의 코드는 출력도구 response를 사용하여 사용자에게 hello servlet 문구를 응답하는 내용

서블릿 mapping

위의 클래스 파일은 바로 사용할 수 없다. 톰캣에게 web.xml의 내용을 통해 servlet 클래스라는 것을 명시해 주어야 한다. 명시하는 방법은 2가지가 있다.

web.xml 에서 설정해주기

  • 해당 프로젝트의 WebContent\WEB-INF 경로에 web.xml 파일 생성
  • 다음 내용 적용
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0"
  metadata-complete="true">

  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
  
  <!-- servlet mapping! -->
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
     <servlet-name>hello</servlet-name>
     <url-pattern>/hello</url-pattern>
  </servlet-mapping>

</web-app>

하단의 <!-- servlet mapping! --> 부분만 이해해보자.

  • 먼저 servlet 클래스를 명시해주는데 src 폴더의 하위 경로를 기준으로 해당 Servlet 클래스명 입력
    • 사실 src 폴더의 경로는 아니다. 프로젝트의 최상위 디렉토리에 가보면 build라는 폴더가 있는데 해당 폴더의 .class 파일을 찾는 것 같다.
  • 그리고 servlet이 이름이 hello 인 servlet가 주소(url) 요청이 '프로젝트 주소/hello' 로 오면 해당 서블릿 클래스를 실행하라는 내용이다.

annotaction(@) 사용

  • 서블릿 3.0 버전 이상에서 사용가능하다.
  • web.xml의 servlet과 servlet-mapping 태그가 필요 없다.
  • 대신 web.xml의 root element인 metadata-complete의 값을 false로 바꿔주어야 함
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0"
  metadata-complete="false"> <!-- 이부분 -->
  • 그리고 해당 서블릿 클래스 파일에 어노테이션을 작성
@WebServlet("/hello") // <-- 다음과 같이 명시
public class HelloServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) 
            throws ServletException, IOException 
    {
        PrintWriter out = res.getWriter();
        
        out.println("hello servlet");
    }
}

위와 같이 작성하면 web.xml에서 설정한 것과 같이 작동한다.

위 설정들이 완료 되었다면 이클립스에서 톰캣에 해당프로젝트를 올려 실행하면 잘 작동할 것이다.

Other Posts

October 1, 2019
jsp 프로젝트 만들기 - mvc1, mvc2
이전에 만든 `board-detail.jsp`은 DB와 잘 연결되어 화면에 데이터를 잘 출력하는 것을 볼 수 있다. 하지만 jsp 파일 내의 코드를 보면 자바코드와 html코드가 뒤엉켜 있는 것을 볼 수 있다. 이것을 스파게티 코드라 한다.
September 29, 2019
jsp 프로젝트 만들기 - 시작
본격적으로 jsp를 이용한 servlet 프로젝트를 만들어보겠다. jsp와 servlet의 활용 목적이 주된 내용이기 html/css 는 가급적 손대지 않고 비즈니스 로직에 집중하도록 하겠다.
September 25, 2019
jsp 프로그래밍
jsp란 `Java Server Pages` 의 약자이며 HTML 코드에 JAVA 코드를 넣어 동적웹페이지를 생성하는 웹어플리케이션 도구이다.
September 24, 2019
Servlet 상태관리
서블릿은 요청이 오면 응답을 주고 메모리에서 사라지기 때문에 서블릿들 간의 연결이 불가능하다. 만약 기존의 데이터를 저장할 일이 생겼다고 하면 서블릿 스스로 저장할 수 있는 것은 아니다. 이것은 ServletContext로 해결할 수 있다.
September 22, 2019
한글 인코딩
servlet 클래스에서 한글을 출력하면 한글이 깨지는 것을 볼 수 있다. 해당 문제점은 다음과 같이 해결할 수 있다.
September 20, 2019
Servlet 다루기
기존의 html 문서만으로는 동적인 내용을 전달할 수 없다. 때문에 WAS(web application server) 에서 동작하는 프로그래밍 언어를 사용하면 가능하다.