1. 브라우저의 언어와 servlet 또는 JSP만 직접 소통 html/css/javascript는 절대 일반 순수 자바 클래스와 소통 불가 즉 웹 요청/응답 처리는 일반 자바 클래스로는 불가능을 의미 따라서 웹 요청/응답 처리는 servlet 또는 JSP로 개발 해야 함
2. 이클립스 웹 개발 구조 src - *.java 개발 - 순수 DAO와 DTO 또는 일반 모든 자바 소스 - web 상에서 http 기반으로 요청/응답 직접 처리하는 Servlet WebContent - *.html/*.css/*.js/이미지, 동영상../*.jsp
3. http 기반의 url 형식 http://ip:port/project명/file명 http://ip:port 를 도메인으로 매핑 필수 80만 http의 기본 따라서 생략 가능 http://localhost:80/step01_basic/request.html http://localhost/step01_basic/request.html - Servlet1.java 라는 servlet을 playdata라는 url 가짜명으로 매핑 http://localhost/step01_basic/playdata
4. 하나의 프로세스 내부에 쓰레드로 개별 실행 단위로 설계된 WAS 및 API - 장점 : 자원 절약/기업 관점에서 비용 절감 / client 관점에선 실행 속도 향상 Servlet 객체 수 : 요청한 client 수 = 1 : * doGet() : 요청한 client 수 = 1 : 1 HttpServletRequest 객체 수 : HttpServletResponse 객체 수 : client 수 = 1 : 1 : 1
5. Web container(web server=servlet engine) 기능 - client가 요청시 client에 1:1 매핑되는 HttpServletRequest객체와 HttpServletResponse객체가 자동 생성 - Servlet 객체는 최초의 client가 요청시에만 단 한번 생성
//http://localhost/step01_basic/playdata
@WebServlet("/playdata")
public class Servlet1 extends HttpServlet {
private static final long serialVersionUID = 1L;
public Servlet1() {
System.out.println("Servlet1 생성자");
}
/*doGet()
* - 실행 시점 : client가 url로 요청시 자동 실행
* - doGet() 재정의는 하나 명시적으로 호출하는 코드는 없다!!!!!
* - web container(web server, was, servlet engine)에 요청이 오면 감지 후에
* 자동 실행
* - web container 필수
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//server console 창에 출력하는 로직
System.out.println("Servlet1 doGet()");
//접속한 client 브라우저에 한글 데이터 출력
//인터넷 상에 http 기반으로 응답
//한글 encoding 설정 / html 포맷으로 응답 설정
response.setContentType("text/html;charset=utf-8");
//2byte 단위로 client 브라우저에 응답 가능한 출력객체
PrintWriter out = response.getWriter();
out.println("유재석과 백종원, 펜싱");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Servlet1 doPost()");
}
}
Servlet API
1. HttpSevlet - http 프로토콜을 사용 가능하게 구현된 클래스 - 사용자 정의 servlet은 상속 및 재정의로만 쉽게 개발 가능 - 장점 : 서비스 로직에만 집중해서 개발 가능
2. HttpServletRequest - http 프로토콜 기반으로 요청하는 client의 정보를 보유 - ip/브라우저 기본정보/client가 server에 전송하는 입력데이터등.. - doGet() or doPost() 메소드 실행시 parameter 즉 메소드 실행을 위해 필요한 client의 정보를 제공해주는 API
3. HttpServletResponse - http 프로토콜 기반으로 요청하는 client에게만 응답 처리 - 한글 등 속성 지정해서 응답 포멧 설정 - client 브라우저에 응답하는 객체 - setContentType() : client 브라우저에 응답하는 포멧 + 인코딩 설정 - getWriter() : 2byte 출력 가능한 PrintWriter 객체 생성 /PrintWriter 는 접속된 client에게만 출력
4. PrintWriter - 2byte 단위로 client 브라우저에 출력
Servlet LifeCycle
1. 기본 생성자 - () parameter가 없는 생성자 - 최초 client가 호출시 실행되서 객체 생성 - 새로운 로직의 갱신된 객체 생성시 단 한번 생성(갱신직후 최초 client가 요청시 단 한번 실행)
2. init() - 생성자 호출 직후에 단 한번 실행 - 권장하는 로직, 공유 자원초기화 로직으로 적합
3. doGet()/doPost() - client 요청시 1:1 실행 - service 메소드라 표현
4. destroy() - 갱신된 servlet bytecode가 서버 메모리에 로딩시 자동 호출 - 구버전 객체 메모리 해제시에 자동 실행 - 자원 반환용 로직 구현시 적합 - 서버 다운 직전에도 자동 호출(자원 해제를 깨끗이 하기 위한 action)
@WebServlet("/Servlet2LifeCycle")
public class Servlet2LifeCycle extends HttpServlet {
public Servlet2LifeCycle() {
System.out.println("생성자");
}
public void init() {
System.out.println("init()");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet() 언제?");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost()");
}
public void destroy() {
System.out.println("destroy()");
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>request2form.html</title>
</head>
<body>
<h3>로그인 화면</h3>
<!-- http://localhost:80/step01_basic/idcheck
request2form.html과 동일한 url 선상의 servlet 지정 및 요청 설정
-->
<form action="idcheck" method="post">
<!-- 1 line 입력 가능한 form tag -->
id 입력 form : <input type="text" name="id"> <br>
pw 입력 form : <input type="password" name="pw"> <br>
<!-- server에 데이터 전송하면서 요청하는 tag -->
<input type="submit" value="로그인">
</form>
<hr>
<form>
</form>
<hr>
</body>
</html>