자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램이다. 자바 서블릿은 웹 서버의 성능을 향상시키기 위해 사용되는 자바 클래스의 일종이다.
New>Dynamic Web Project > Apache Tomcat v9.0 > Dynamic web module version 확인
Dynamic web module version 3.0 전후로 차이점이 있는데,
2버전까지는 반드시 Generate web.xml 체크박스를 선택해야 했지만 3 버전 이후로는 체크하지 않고 annotation으로 대체가 가능하다.
Dynamic Web Project를 진행할때는,
참고로, 클라이언트가 http://localhost:port#/root경로/를 요청하게 되면 index.html을 가장 우선적으로 찾아 불러온다. 즉, http://localhost:port#/root경로/index.html을 불러오게 된다.
톰갯은 index.html, index.htm, index.jsp 순서대로 페이지를 찾기 때문이다.
Parameter 전송 방식에는 Get 방식과 Post 방식이 있다.
Get 방식
url뒤에 queryString으로 전달되기 때문에, 글자수의 제한이 있고 url에 노출이 된다.
즉, 길거나 보안이 필요한 정보는 Post방식을 사용해야 한다.
Post 방식
request body에 담겨져 데이터로 전달된다
아래는 Servlet의 가장 기본적인 구조이다.
Servlet을 사용하기 위해서는, 해당 클래스가 Servlet type이어야 한다. 즉, Servlet Interface를 구현해야 한다. 이때, destroy, getServletConfig, getServletInfo, init, service를 재정의 해야한다.
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class TestServlet implements Servlet {
@Override
public void destroy() {}
@Override
public ServletConfig getServletConfig() {return null;}
@Override
public String getServletInfo() {return null;}
@Override
public void init(ServletConfig config) throws ServletException {}
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("code");
}
}
위에서 구현한 servlet은 override해야하는 메서드들이 꽤 많다. 따라서, Generic Servlet이 등장하였다. GenericServlet을 상속받지만, 여전히 service 메서드를 재정의 해야한다.
하지만, 웹에서는 service method가 필요 없는 경우가 있다. Generic Servlet을 사용하면, Get이나 Post 방식을 사용해야 하는 경우에는 if문을 주어서 구분하여 사용해야한다.
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class TestGenericServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("code");
}
}
Http Servlet은 추상 클래스가 없다 (의미상의 추상클래스). 즉, HttpServlet을 상속받게되면 아무 메서드도 재정의하지 않아도 된다. 하지만, 아무런 메서드를 정의하지 않으면 405 에러가 발생하게 된다.
Http Servlet을 사용하여, doGet이나 doPost 메서드 또는 둘다를 재정의하여 용도에 맞게 사용할 수 있다.
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/main")
public class TestHttpServlet extends HttpServlet {
//아무 메서드도 정의하지 않으면 "지원하지 않는 방식이라는 405 에러 발생한다."
//doGet이나 doPost를 사용할 수 있다.
}
Method 1
Context Root를 설정하지 않으면, 프로젝트 명이 default로 root의 이름이 된다. 이는 path이기 때문에, 위의 이미지의 세번째 단계에서 context root에 원하는 path명을 주면, url이 설정한 path로 잡힌다.
Html 코드
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Hello Servlet</title> </head> <body> <h1>Check the Address!</h1> <form method="post" action="temp/new-root"> <input type="text" name="msg"> <button>check it out</button> </form> </body> </html>
Method 2: Annotation
Anotation을 사용하여 url을 mapping 할 수도 있다.
위와 같은 과정으로 프로젝트를 생성하나 [[Step 2]] 는 생략하고 finish를 누른다.
test 파일을 생성하고 annotation을 통해 url을 맵핑해준다.
Annotation사용 방법
Format: @WebServlet("/주소")
자바 소스 코드package temp; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.GenericServlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebServlet; @WebServlet("/temp/update") public class test extends GenericServlet{ @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { PrintWriter out = res.getWriter(); out.println("<h1> Hello, there!</h1>"); out.close(); } }
@WebServlet("/temp/update")로 맵핑했기 때문에, 위의 캡쳐본을 보면 pjt/temp/temp로 제대로 맵핑이 된 것을 확인할 수 있다.