package com.fastcampus.ch2;
import java.io.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/rollDice2")
// 1. @Controller + @RequestMapping 합친거랑 동일한 효과!
public class TwoDiceServlet extends HttpServlet {
// 2. HttpServlet을 상속 받아야함! (java는 단일상속!)
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 3. service 메소드로 변경! (기존은 main) 고정메소드
int idx1 = (int) (Math.random() * 6) + 1;
int idx2 = (int) (Math.random() * 6) + 2;
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body>");
out.println("<h1>안녕하세요?</h1>");
out.println("</body>");
out.println("</html>");
}
}
package com.fastcampus.ch2;
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("/hello")
public class HelloServlet extends HttpServlet {
public void init() throws ServletException {
// 서블릿 초기화 - 서블릿이 생성 또는 리로딩 때, 단 한번만 수행됨.
System.out.println("[HelloServlet] init()");
}
@Override // 호출될 때 마다 반복적으로 수행됨.
public void service(HttpServletRequest request, HttpServletResponse response) {
// 1. 입력
// 2. 처리
// 3. 출력
System.out.println("[HelloServlet] service()");
}
public void destroy() {
// 뒷 정리 작업 - 서블릿이 메모리상에서 제거(unload)될 때, 단 한번만 수행됨
System.out.println("[HelloServlet] destroy()");
}
}
[Servlet Context]
1. 요청 → 서블릿 인스턴스 존재? (children을 보고 확인)
1-1. (Yes) service() 메소드 실행
1-2. (No) 서블릿 클래스 로딩 & 인스턴스 생성 → init() 메소드 실행 후 service() 메소드 제공
2. 프로그램 변경, 웹 App이 종료돼서 Servlet이 메모리에 변경될 때 Destroy() 호출!
[Servlet Context > children]
// in jsp 값 출력할 때
<img src='resource/img/dice<%=idx1%>.jpg'>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="utf-8"%>
<%@ page import="java.util.Random" %>
<!-- 클래스 영역 -->
<%!
int getRandomInt(int range) {
return new Random().nextInt(range)+1;
}
%>
<!-- 메서드 영역 - service()의 내부 -->
<%
int idx1 = getRandomInt(6);
int idx2 = getRandomInt(6);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>twoDice.jsp</title>
</head>
<body>
<img src='resource/img/dice<%=idx1%>.jpg'>
<img src='resource/img/dice<%=idx2%>.jpg'>
</body>
</html>
-> 아래 메서드 영역부분이 다 webServlet의 service 메서드 안에 들어감
<%
와 <%!
의 차이<%
: 지역 변수<%!
: 인스턴스 변수, 상수 선언 -> 서비스 메서드가 아닌 클래스 안에 들어감.jsp
파일의 경로request
, response
, session
, pageContext
, out
${idx1}
/login/hello.do
)/login/*
)*.do
) ex) .../hi.do[절차]
1. 요청이 들어오면, key값을 확인
2. key값이 존재하면 해당 value가 children(서블릿) key값에 존재하는지 확인
3. value (StandardWrapper) 메모리 값에 따라 서비스를 찾음
ex) /hello, *.jsp = 동적 리소스 (서블릿) / / = 정적 리소스 (default)
=> 요청에 해당하는 서블릿이 없으면 다 dispatcherServlet이 받음!
== 스프링의 경우 jsp, servlet이 없으니까 모~든 요청을 다 dispatcherServlet이 받음!
& dispatcherServlet 내부에 이런 매핑을 다 가지고 있음 (@RequestMapping)
<%=값%>
=> ${값}
<c:set>
,<c:if>
,<c:forEach>
<c:set>
: el값이 지역 변수를 사용하지 못하니까 저장소에 저장하기 위해서 고안