* 요청
웹 브라우저 ➡️ HTTP 요청 ➡️ 웹서버 ➡️ 데이터 조회 ➡️ DB
* 응답
DB ➡️ 데이터 반환 ➡️ 웹서버 ➡️ 웹페이지 구성 ➡️ HTTP 응답 ➡️ 웹브라우저
http://localhost8080/ <파일 경로>프로젝트명/요청페이지명.html(.jsp) <쿼리 스트링>name = value 형태클라이언트 측에서 요청받은 페이지를 출력할 때 회원 정보와 같은 경우 동적으로 변경되는 데이터 값을 갖는다. 따라서 웹 서버 내에서 정적 페이지에 동적 요소를 추가해주어 페이지를 구성해주는 작업이 필요한데, 이를 수행해주는 것이 WAS(Web Application Server)이다. WAS에 의해서 완성된 웹 애플리케이션(웹 페이지)을 Servlet이라고 한다.
웹 애플리케이션 프로그래밍을 위해 작성한 클래스를 서블릿 클래스라고 하며, 자바 클래스 형태이다.
서블릿 클래스 실행을 위해서는 서블릿 객체 생성 및 초기화 과정을 거쳐야 한다.
위 과정은 서블릿 컨테이너에 의해 수행되며, 개발자는 서블릿 클래스 작성 후 서블릿 컨테이너에 등록만 해주면 된다.
서블릿 운영 방식은 멀티 쓰레드 방식인데, 웹 서버에서는 동시에 여러 개의 요청을 처리해야 하는 경우가 발생하기 때문에 하나의 쓰레드로는 처리하기에는 한계가 있다.
멀티 쓰레드 사용 시 주의할 점은 프로세스의 자원을 공유하여 사용하기 때문에, 동기화 및 deadlock이 발생할 위험이 있다. 따라서 이를 방지하기 위해서 서블릿 클래스에 인스턴스 변수를 선언하지 않는 것이 좋다.
Servlet Container와 WAS 차이점
WAS는 간단히 설명하면, Web Server + Web Container로 구성되어 있다.
따라서 WAS는 정적 요소를 제공(Web Server) 하면서 웹 컨테이너를 이용해 내부 로직을 거쳐 동적인 페이지를 만들 수 있다.
Servlet은 자바 웹 애플리케이션 구현 기술로서 Servlet이 관리하고 jsp 파일을 실행할 수 있도록 해주는 것이 Servlet Container 이다.
즉, WAS가 Servlet Container를 포함하는 개념이다.
HttpServlet 상속service(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException 메서드 내부에 기능 구현.1. 서블릿 클래스 코드 작성
public class 클래스명 extends HttpServlet{
service(HttpServletRequest request,
HttpServletResponse response)throws IOException,
ServletException{
코드 구현
}
}
2. 일반적으로 서블릿 클래스는 보호목적으로 WEB-INF/classes 라는 폴더 안에 컴파일 후 저장된다. WEB-INF 폴더 안의 파일은 서버 내에서만 접근이 가능하며,외부에서는 접근이 불가능하다.
3. 클라이언트가 서버 내 서블릿에 접근할 수 있도록 하기 위해 서블릿과 매핑된 URL을 제공한다. 만약 URL 요청이 들어오면, 해당 요청 URL과 매핑된 Servlet 코드를 찾아서 실행하도록 한다.
4. 매핑 URL 주소 등록을 위해 WEB-INF/web.xml(서블릿 설계도) 안에 서블릿과 매핑할 URL 등을 정의해줘야 한다.
<web-app>
<servlet>
<!-- 서블릿 클래스의 이름이 들어갈 부분 -->
<servlet-name>servlet 명칭</servlet>
<servlet-class>servlet 클래스 명칭(full name)</servlet-class>
</servlet>
<servlet-mapping>
<!-- 서블릿 클래스를 호출할 때 사용할 URL이 들어갈 부분 -->
<servlet-name>servlet 명칭</servlet-name>
<url-pattern>매핑할 URL</url-pattern>
</servlet-mapping>
</web-app>
※ 주의할점은 servlet-name 내 정의한 이름은 <servlet>과 <servlet-mapping>
은 동일한 값으로 넣어줘야 mapping이 가능하다.
◎ 웹으로 입출력하기 위한 방법.(stream을 이용한 데이터 출력)
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
public class OutputStringServlet extends HttpServlet{
public void service(HttpServletRequest request,
HttpServletResponse response) throws IOException,
ServletException{
OutputStream os = response.getOutputStream();
PrintStream out = new PrintStream(os,true);
out.println("Hello Servlet");
}
}
* PrintStream(InputStream is, boolean b);
PrintStream : print 계열의 메서드를 제공하는 객체.
boolean b : 네트워크로 데이터를 전송하는 스트림은 기본적으로 버퍼를 사용하는데, 버퍼의 특성 상 용량(8Kbyte)이 꽉차야 전송이 되는데, print 매개 값의 용량이 꽉차지 않아도, 바로 전송되도록 하기 위한 매개변수. true -> 바로바로 전송, false -> 꽉차야 전송
==== 결과 ====
Hello Servlet
◎ PrintWriter 객체 사용.
PrintWriter out = response.getWriter();
out.println("Hello Servlet!");
- Writer 객체는 문자열 전송을 위한 스트림으로, 기본적으로 다국어 기능도 포함하고 있다.
- 따라서 Servlet에서는 PrintWriter라는 객체를 많이 사용한다.
- 상대적으로 코드가 짧기도 하다.