August 30, 2021
Web Server
WAS(Web Application Server)
Web Container
라고도 한다.⚡ Web Server와 WAS를 함께 사용하는 이유
클라이언트의 요청을 처리하고 그 결과를 반환하는, Servlet 클래스의 구현규칙을 지킨 자바 웹 프로그래밍 기술
javax.servlet.Servlet
인터페이스를 구현한 자바 클래스이다.자바로 구현된 CGI라고도 한다.
💡 CGI (Common GateWay Interface)
웹서버와 외부 프로그램 사이에서 정보를 주고받는 방법이나 규약
WAS(Web Application Server) 중 Servlet API를 지원하는 것.
클라이언트의 요청/응답을 처리하기 위해 서블릿을 관리하고 동작시킬 수 있는 환경을 제공하는 서버 프로그램으로, 주된 역할은 다음과 같다.
통신 지원
생명주기 관리
Servlet LifeCycle
에서 자세히 설명멀티스레딩 관리
Servlet과 객체 생성
에서 자세히 설명) 보안관리
Apache Tomcat은 대표적인 서블릿 컨테이너이다.
환경변수 설정
프로젝트의 Java Resources - Libraries 하단에 Tomcat이 들어갔는지 확인하자. 그 안에 servlet-api.jar
파일이 들어있다.
⚡ 서블릿 활용 이클립스의 다이나믹 웹프로젝트 개발구조
src 폴더 내
- 순수 DTO, DAO 등등.. 일반 모든 자바 소스 위치
- http 기반으로 요청/응답 처리하는 Servlet 파일 위치 (Controller로 사용)
WebContent 폴더 내
- *.html, *.jsp (View로 사용) / *.css / *.js / 이미지, 동영상 … 등 위치
[이미지 출처] https://mangkyu.tistory.com/14
Servlet 객체는 최초의 클라이언트 요청시 단 한번만 생성된다.
1 : N
deGet() / doPost() 메소드는 클라이언트 요청 수만큼 실행된다.
=> 하나의 프로세스 내에 여러 스레드로 개별 실행 = 멀티스레딩
1 : 1
웹브라우저는 get과 post 두 방식 중 한가지를 이용해서 데이터(requeset의 파라미터)를 전송한다.
GET
방식
POST
방식
기본생성자 - 객체 생성
init()
service()
/ deGet()
/ doPost()
destroy()
HTTP 프로토콜을 지원해주는 클래스이다.
일반적으로 서블릿이라 하면 대부분 javax.servlet.http.HttpServlet
를 상속받은 것을 의미한다. HttpServlet은 GenericServlet을 상속받아 추상 메서드인 service를 HTTP 프로토콜 요청 메서드에 적합하게 구현한 것이다.
처리하고자 하는 방식 (method)에 따라 알맞은 메소드를 오버라이딩해서 구현한다.
✨ 메소드
doGet()
: get방식으로 처리시 사용한다. HttpServletRequest와 HttpServletResponse 두 파라미터를 갖는다. doPost()
: post방식으로 처리시 사용한다. HttpServletRequest와 HttpServletResponse 두 파라미터를 갖는다. service()
: 서블릿이 초기화된 후 클라이언트로부터 온 요청에 대한 서비스 수행 (get/post 방식 관계없이)http 프로토콜 기반으로 클라이언트의 request 정보를 서블릿에게 전달하기 위한 클래스이다.
ip, 브라우저 기본정보, 클라이언트가 서버에 전송하는 입력 데이터 등등의 정보를 담고 있다.
✨ 메소드
setCharacterEncoding()
: 클라이언트 request로 들어오는 데이터의 포맷 및 인코딩 설정
request.setCharacterEncoding("utf-8");
getRequestQueryString()
: 클라이언트가 서버에 전송하는 map 구조의 데이터 (queryString
) 을 받아옴String getParameter(name)
: 클라이언트가 서버에 전송한 데이터 획득 (queryString
의 key
값을 받아옴)String [] getParameterValues(name)
: 데이터값이 여러개일때 배열 형태로 받음setAttribute(key, value)
: request 객체에 map 구조로 데이터 저장 (key에 저장할 데이터인 value 매핑)getRequestDispatcher()
: 페이지 이동💡 참고: url의 형식
http://ip:port/project명/file명?key1=value1&key2=value2 …
여기서 key1=value1&key2=value2 … 부분을
queryString
라고 함
http 프로토콜 기반으로 클라이언트 브라우저에게 응답하기 위한 클래스이다.
✨ 메소드
setContentType()
: 클라이언트 브라우저에 응답하는 데이터의 포멧 및 인코딩 설정
response.setContentType("text/html;charset=utf-8");
getWriter()
: 2byte 출력 가능한 PrintWriter 객체 생성sendRedirect()
: redirect 방식으로 화면 이동 ✅ Servlet 사용 실습
<index.html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>index.html</title>
</head>
<body>
<form action="page1">
<!-- page1에 해당하는 곳으로 form태그 내 모든 input값을 전송(default : GET방식) -->
id: <input type="text" name="id"><br>
pw: <input type="password" name="pw"><br>
interest:
Java <input type="checkbox" name="interest" value="Java">
Python <input type="checkbox" name="interest" value="Python">
기타 <input type="checkbox" name="interest" value="기타">
<br>
<input type="submit">
</form>
</body>
</html>
이렇게 form에 입력한 데이터들을 가지고 화면 이동하면 URL값은 http://localhost:8088/test/page1?id=abc&pw=123&interest=Java&interest=Python&interest=기타
이 된다. URL의 queryString 값을 가지고 화면에 출력하는 연습을 해보자.
<ServletTest.java>
package test;
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("/page1") // url mapping값 : page1
public class ServletTest extends HttpServlet {
// GET방식으로 데이터 전송하므로 doGet() 메소드 사용
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// request값 한글 인코딩 설정
request.setCharacterEncoding("utf-8");
// queryString의 value값 획득
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String [] interest = request.getParameterValues("interest");
// response값 출력형식 및 한글 인코딩 설정
response.setContentType("text/html;charset=utf-8");
// 클라이언트 브라우저에 출력가능한 객체 생성
PrintWriter out = response.getWriter();
out.print("아이디: " + id);
out.print("<br>비밀번호: " + pw);
out.print("<br>관심사: ");
for(String v : interest) {
out.print(v + " ");
}
}
}