버전에 따른 Servlet 작성 방법
1. Servlet 3.0 spec 이상에서 사용하는 방법
web.xml 파일을 사용하지 않습니다.
자바 어노테이션(annotation)을 사용합니다.
앞에서 실습했던 first web에서 사용합니다.
2. Servlet 3.0 spec미만에서 사용하는 방법
servlet을 등록할 때 web.xml 파일에 등록합니다.
1. Servlet 3.0 spec 이상에서 사용하는 방법
- @WebServlet("/ten") 이라는 어노테이션이 추가된다.
- URL mapping은 임의로 지정할 수 있다.
package exam;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/ten")
public class TenServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public TenServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter(); // 통로
out.print("<h1>1-10까지 출력</h1>");
for(int i=1; i<=10; i++) {
out.print("<h2>"+i+"</h2>");
}
out.close();
}
}
TenServlet.java
2. Servlet 3.0 spec미만에서 사용하는 방법
- 서블릿을 추가하면 xml에 서블릿 관련 내용이 삽입된다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>exam25</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<description></description>
<display-name>TenServlte</display-name>
<servlet-name>TenServlte</servlet-name>
<servlet-class>exam.TenServlte</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TenServlte</servlet-name>
<url-pattern>/ten</url-pattern>
</servlet-mapping>
</web-app>
web.xml
package exam;
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 TenServlte extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public TenServlte() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter(); // 통로
out.print("<h1>1-10까지 출력</h1>");
for(int i=1; i<=10; i++) {
out.print("<h2>"+i+"</h2>");
}
out.close();
}
}
TenServlte.java
Servlet 생명 주기
1. 서블릿의 생명주기를 알기 위해 테스트 코드를 작성한다.
package examples;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LifecycleServlet() {
System.out.println("LifecycleServlet 생성!!");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("init 호출!!");
}
public void destroy() {
System.out.println("destroy 호출!!");
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("service 호출!!");
}
}
LifecycleServlet.java
2. 결과
1) 처음 실행 시,
생성자
init
service
2) 새로고침 시,
service
3) 기존 코드 변경 시,
destroy
4) destroy 후 코드 변경 시,
생성사
init
service
Servlet 생명주기
WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인합니다.
if (메모리에 없음) { - 해당 서블릿 클래스를 메모리에 올림 - init() 메소드를 실행 } - service()메소드를 실행
was가 종료되거나, 웹 어플리케이션이 새롭게 갱신될 경우 destroy() 메소드가 실행됩니다.
응답해야 하는 모든 내용은 service() 에 구현해야 한다 !!
그렇다면, doGet() 에서는 service() 가 없었는데 어떻게 실행이 된 것일까?
doGet()은 HttpServlet 이 가지고 있는 service 메소드를 상속받아서 실행된다.
service(request, response) 메소드
HttpServlet의 service메소드는 템플릿 메소드 패턴으로 구현합니다.
클라이언트의 요청이 GET일 경우에는 자신이 가지고 있는 doGet(request, response)메소드를 호출
클라이언트의 요청이 Post일 경우에는 자신이 가지고 있는 doPost(request, response)를 호출
😆service() 대신에 doGet()과 doPost()를 넣어 보았다 !
package examples;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LifecycleServlet() {
System.out.println("LifecycleServlet 생성!!");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("init test 호출!!");
}
public void destroy() {
System.out.println("destroy 호출!!");
}
// url 주소를 입력하거나, 링크를 클릭하는 것은 GET 방식으로 서버에 요청을 보내는 것이므로 doGet()이 실행된다.
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head><title>form</title></head>");
out.println("<body>");
out.println("<form method='post' action='/firstweb/LifecycleServlet'>"); // submit 버튼이 눌렸을 때, action 주소로 요청해주세요
out.println("name : <input type='text' name='name'><br>"); // , 메서드는 post이므로 post 메서드를 실행한다.
out.println("<input type='submit' value='ok'><br>");
out.println("</form>");
out.println("</body>");
out.println("</html>");
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
String name = req.getParameter("name"); // doGet에서 설정한 name 을 받아
out.println("<h1> hello " + name + "</h1>"); // 동적인 페이지 : 받은 name을 출력해준다. 응답 결과가 매번 달라지는 방식
out.close();
}
}
1) url 주소를 입력하거나, 링크를 클릭하는 것은 GET 방식으로 서버에 요청을 보내는 것이므로 먼저 doGet()이 실행된다.
2) out .println( "<form method='post' action='/firstweb/LifecycleServlet'>");
-> "submit 버튼이 눌렸을 때, action 주소로 요청해주고, post 메소드를 실행해주세요 " 라고 말하고 있다.
3) String name = req .getParameter("name" );
-> doGet에서 설정한 name 을 받아
4) out .println( "<h1> hello " + name + "</h1>" );
-> 동적인 페이지 : 받은 name을 출력해준다. 응답 결과가 매번 달라지는 방식