[부스트코스 웹 프로그래밍 기초(5)]
CHAPTER. 05 Servlet
Point. 01 Servlet 컴파일 및 실행
perspective 선택
- java EE perspective 선택
프로젝트 생성
- file > New > Dynamic Web Project 선택
- 프로젝트 이름 지정 Target runtime > New Runtime 선택 (사용할 WAS 선택)
- 사용할 WAS 종류 및 버전 선택 > Next > Browse 설치 된 WAS 경로 지정 > Finish
서블릿 파일 생성
- 생성한 프로젝트에서 New > Servlet
- 패키지이름 클래스이름 지정 > Next
- URL mapping : 접근 할 URL Edit으로 지정 혹은 기본 값 이후 Next
- doGet 이외에 나머지는 체크박스 해제 후 Finish
- 생성 된 서블릿 파일
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<h1>HELLO WORLD</h1>");
-
protected void doGet 부분 -> doGet 메서드
-
GET 메서드에 요청이 들어오면 동작해서 출력 할 코드 작성 후 저장 (ctrl + s)
-
PrintWriter 객체 out -> response 객체로부터 가져온 객체 응답결과를 보내줌
- 상단 메뉴 바 Run > Run As > Run on Server > Finish: 작성 웹 앱 컴파일
- 서블릿 파일 동작 확인
Point. 02 Servlet 작성
버전에 따른 Servlet 작성
-
Servlet 3.0 스펙 이상
-
web.xml 파일을 사용하지 않음
-
자바 어노테이션 사용
-
- 자바 어노테이션 (annotation)
@를 이용한 주석, 자바코드에 주석을 달아 의미를 부여 한다.
컴파일러가 프로그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공, 코드에 정보 추가하는 정형화된 방법
import javax.servlet.annotation.WebServlet;
//javax.servlet.annotation 패키지 import
@WebServlet("/net") //WebServlet어노테이션 속성 사용
-
Servlet 3.0 미만에서 사용
- servlet 등록 시 web.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>TenServlet</display-name>
<servlet-name>TenServlet</servlet-name>
<servlet-class>exam.TenServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TenServlet</servlet-name>
<url-pattern>/ten</url-pattern>
</servlet-mapping>
</web-app>
- 18~24라인 서블릿 클래스 작성 및 url 지정
Point. 03 Servlet 라이프사이클
LifecycleServlet 클래스 생성
서블릿 생명주기 확인을 위한 init, service, destroy 메서드 override
생성된 메서드 동작 확인을 위해 콘솔창에 출력
package testweb;
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 Create");
// TODO Auto-generated constructor stub
}
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init 호출!");
}
public void destroy() {
// TODO Auto-generated method stub
System.out.println("destroy 호출");
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("service 호출");
}
}
- System.out -> PrintWrite와 다르게 응답 결과가 아닌 콘솔에 결과 출력
-
서블릿을 생성과 초기화 서비스 호출 동작 콘솔로 확인
-
WAS내 메모리에 서비스가 올라가 있지 않은 경우 생성과 초기화 후 서비스가 동작
System.out.println("destroy 호출");
System.out.println("destroy 호출!"); // 호출 -> 호출! 수정 후 저장
-
서블릿이 수정되면 destroy 메소드를 호출한 후 다시 메모리에 로드 할 수 있게 한다.
-
메모리내에 서블릿이 로드 되어있다면 서비스 메소드만 호출된다.
Servlet 생명주기
-
WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 로드 되어있는지 확인
-
메모리에 없을 경우
해당 서블릿 클래스를 메모리에 올린다
init() 메소드 실행
- 메모리에 로드 되어있는 경우
service() 메소드 실행
-
WAS가 종료되거나, 웹 어플리케이션이 갱신될 경우 destroy() 메소드 실행
-
service() 메소드를 오버라이드 하지 않은 경우
부모인 HttpServlet의 service() 메소드가 실행된다.
[
service(request, response) 메소드
@Override
protected void doGet(HttpServletRequest requset, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<haed><title>form</title></head>");
out.println("<body>");
out.println("<form method = 'post' action='/firstweb/LifecycleServlet'>");
out.println("name : <input type='text' name='name'><br>");
out.println("<input type='submit' value='ok'><br>");
out.println("</form>");
out.println("</body>");
out.println("</html>");
out.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
out.println("<h1> hello" + name + "</h1>");
}
-
클라이언트 요청이 GET일 경우 doGet 메소드 호출
-
클라이언트 요청이 POST일 경우 doPost 메소드를 호출
Point. 04 Request, Response 객체
WAS가 브라우저로부터 Servlet 요청을 받는 경우
-
요청할 때 가지고 있는 정보는 HttpServletRequest 객체를 생성하여 저장
-
웹 브라우저에게 응답을 보내기 위한 HttpServletResponse 객체 생성
-
생성된 HttpServletRequest, HttpServletResponse 객체를 서블릿에 전달
HttpServletRequest
-
http 프로토콜의 요청 정보를 서블릿에 전달하기 위해 사용
-
헤더정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메소드를 가진다.
-
body의 Stream을 읽어 들이는 메소드를 가지고 있다.
HttpServletResponse
-
요청을 보낸 클라이언트에게 응답을 보내기 위한 객체를 생성하여 서블릿에 전달
-
서블릿은 해당 객체를 이용하여 content type, 응답코드, 응답 메시지 등을 전송
- 요청헤더 정보
- 응답헤더 정보