https://www.youtube.com/playlist?list=PLieE0qnqO2kTyzAlsvxzoulHVISvO8zA9
Servlet 이란
- 동적 웹어플리케이션 컴포넌트
- 클라이언트의 요청에 동적으로 작동하고, 응답은 html
- java thread 이용하여 동작한다. thread 를 이용하면 요청이 몰려도 서버에 부하가 적게 걸린다.
- mvc 패턴에서 Controller 로 이용된다.
package com.javalec.ex;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class HelloWorld
*/
@WebServlet("/HWorld")
public class HelloWorld extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloWorld() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath()); //getContextPath() 에 출력
System.out.println("HelloWorld"); //콘솔창에 출력
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
web.xml 에 서블릿 맵핑
매핑은 서블릿 파일에 접근할 때, 패키지명을 포함한 파일명이 너무 길 경우 임의의 url 주소를 설정해 주는 것이다.
두 가지 방법이 있는데, Java 서블릿 파일 안에 직접 @WebServlet("/HWorld") 을 입력하여 매핑을 할 수 있다.
두 번째 방법은 web.xml 을 수정하는 것이다.
web.xml 의
<servlet>
<servlet-name>helloworld</servlet-name>
<servlet-class>com.javalec.ex.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/hw</url-pattern>
</servlet-mapping>
- servlet-name: 임의의 이름을 만든다.
- servlet-class: 매핑할 클래스 파일명을 패키지명을 포함하여 입력한다.
- url-pattern: 매핑할 이름을 입력한다. ‘/’로 시작해야한다.
doGet & doPost
클라이언트는 WAS 에 GET, POST 두 가지 방식으로 요청을 할 수 있다.
Form 태그의 method 속성값에 따라서 get 혹은 post 방식 request 를 설정 할 수 있다. get 으로 설정하면 doGet 이 실행되고, post 로 설정하면 doPost 가 호출된다.
get 은 url 값으로 정보가 전달되어 보안에 약하다. post 는 header 로 정보가 전달되어 보안에 강하다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloWorld~~");
response.setContentType("text/html; charset=euc-kr");
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println("<head>");
writer.println("</head>");
writer.println("<body>");
writer.println("<h1>HelloWorld~~~</h1>");
writer.println("</body>");
writer.println("</html>");
writer.close();
}
인자로 요청처리객체 request 와 응답처리객체 response 를 갖는다.
response.setContentType("text/html; charset=euc-kr"); 로 html 을 사용함을 명시해야한다.
response.getWriter(); 를 통해 html 을 사용한다.
Context Path
WAS 에서 웹어플리케이션을 구분하기 위한 path 이다.
이클립스에서 프로젝트를 생성하면, 자동으로 server.xml 에 추가된다.
Servlet 작동 순서
웹브라우저 -> 웹서버 -> WAS(웹 어플리케이션 서버) -> Servlet 컨테이너
Servlet 컨테이너 :
- 스레드 생성
- Servlet 객체 생성
리퀘스트가 서버에 들어오면, 서버 안의 JVM 이 스레드를 생성한다. 그리고 요청이 들어올때마다 스레드를 생성하고, 이를 이용해 처리한다. 서버 부하가 없지는 않지만, 다른 CJI 언어에 비해서 적다.
Servlet 생명 주기
Servlet 은 최초 요청 시 객체가 만들어져 메모리에 로딩되고, 이후 요청 시에는 기존 객체를 재활용하여, 동작 속도가 빠르다.
- Servlet 객체 생성 (최초 한번) @PostConstruct (선처리): 인스턴스 생성 후 실행하기 위함
- Init() 호출 (최초 한번)
- service(), doGet(), doPost 호출 (요청 시 매번)
- destroy() 호출 (마지막 한번. 자원해제-servlet 수정, 서버 재가동 등) @PreDestroy (후처리): 인스턴스 소멸 전 실행하기 위함
