# 서블릿과 JSP
## 서블릿 파일
1. 서블릿 파일 만들기
2. 파일 정리
3. service 메서드 구현
4. 톰캣
## 서블릿 역할
- 데이터 얻어오기
- 비즈니스 로직 persistence logic 데이터 처리
- html로 응답 페이지 만들기
## 서블릿과 JSP 비교
공통점
- 웹페이지 동적으로 생성하는 서버 프로그램
차이점
- JSP는 HTML안 에 코드가 있음
- 서블릿은 자바 코드 안에 HTML코드가 있음
## Service LifeCycle


1. 클라이언트에서 요청을 보내면 서버에 서블릿이 메모리에 로드되었는지 확인
2. a. 로드되지 않았다면 객체생성 후 init()호출 (1번)
b. 로드되었다면 service() --> doGet(), doPost() (매요청마다)
3. 서블릿이 메모리에서 해제되면 호출 (1번)
## JSP Service LifeCycle

1. 클라이언트에서 GET 또는 POST 요청 보내기
2. 서버에 요청 서블릿이 메모리에 로드되었는지 확인 (Is Server loaded? 객체 생성되어 있니?)
#### 객체가 없을 경우
1. **jsp 파일을 servlet java 파일로 변환**
2. **servlet java 파일 컴파일해서 class 파일 얻기**
3. class 파일 메모리 load
4. new 연산자로 객체를 생성하여 init() 호출하여 초기화(1번)
#### 객체가 있을 경우
5. ready() 호출하여 서비스 요청 받을 준비
6. service() 요청마다, 요청수만큼 실행(여러번)
- doGet() : 클라이언트 요청 처리후 응답
- doPost() : 클라이언트 요청 처리후 응답
7. destroy() 호출하여 객체 소멸
## JSP 스크립팅 요소

#### Declaration Tag(선언 태그)
<%!멤버변수 및 메소드%>>
자바의 전역변수 및 일반 메소드를 선언할 때 사용
#### Scriptlet
<% 자바코드%>
client 요청 시 매번 호출되는 영역으로 service부분에 해당하는 자바 코드 (request, response에 관련된 구현코드가 온다.)
#### Expression Tag(표현 태그)
<%= 문자열%>
해당위치에 결과 데이터를 브라우저에 출력할 때 사용한다.
#### Comment Tag(주석 태그)
<%-- --%>
부가설명이나 JSP에서 자바로 변환시 제외시킬 때 사용한다. 즉, 주석에 해당하는 문장은 변환된 자바파일에서는 보이지 않는다.
\* 참고! html 주석과 jsp주석의 차이점
jsp주석 -> 출력 결과에 포함X
html주석 -> 출력 결과 포함O






## forward와 sendRedirect

### 로그인 예시에서 웹페이지 이동
#### 1. sendRedirect 적용
#### 기본형식
- `request.getContextPath()` : 프로젝트 path만 얻어온다.
예) http://localhost:8081/board/list.jsp
return: /board
```java=
response.sendRedirect(request.getContextPath()+"/login.jsp");
```
#### 문제점
`sendRedirect()`는 데이터를 전달하지 못한다. 그래서 `setAttribute()`에 사용자 정보 `userDto`를 클라이언트에게 전달해도 클라이언트는 사용자 정보를 받지 못한다.
#### 교훈
`location.href`처럼 데이터 전달없이 단순 페이지 이동일 때 사용하자
```java=
if(memberDto != null) {
request.setAttribute("userinfo", memberDto);
response.sendRedirect(request.getContextPath()+"/index.jsp");
}else { //실패
path = "/user/login.jsp";
HttpSession session = request.getSession();
session.setAttribute("userInfo", memberDto);
request.setAttribute("msg", "가입하지 않은 아이디이거나, 잘못된 비밀번호입니다.");
response.sendRedirect(request.getContextPath()+"/login.jsp");
}
```
#### 2. forward() 적용
#### 기본 형식
```java=
RequestDispatcher disp = request.getRequestDispatcher(path);
disp.forward(request, response);
```
#### 문제점
`forward()`는 request에 데이터를 전달하면 다음페이지 밖에 쓰지못한다.
#### 교훈
`location.href`처럼 데이터 전달없이 단순 페이지 이동일 때 사용하자
```java=
String path = "/index.jsp";
if(memberDto != null) {
request.setAttribute("userinfo", memberDto);
}else { //실패
path = "/user/login.jsp";
request.setAttribute("userInfo", memberDto);
// 4개의 바구니
request.setAttribute("msg", "가입하지 않은 아이디이거나, 잘못된 비밀번호입니다.");
}
RequestDispatcher disp = request.getRequestDispatcher(path);
disp.forward(request, response);
}
```