버전에 따른 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을 출력해준다. 응답 결과가 매번 달라지는 방식
'Programming > JSP & Servlet & Mysql' 카테고리의 다른 글
실습 7) JSP란? JSP와 서블릿의 차이, JSP 라이프사이클 (0) | 2020.11.11 |
---|---|
실습 6) 서블릿 Request, Response 이해하기 (0) | 2020.11.11 |
실습 4) 서블릿이란? 자바 웹 어플리케이션 (0) | 2020.11.10 |
실습 3) 맥에서 톰캣 설치하기, 톰캣 실행하기 (0) | 2020.11.10 |
실습 2) 저급언어와 고급언어, HTTP란?, WAS (0) | 2020.10.30 |