---
# System prepended metadata

title: 서블릿과 JSP

---

# 서블릿과 JSP

## 서블릿 파일

1. 서블릿 파일 만들기
2. 파일 정리
3. service 메서드 구현
4. 톰캣

## 서블릿 역할

- 데이터 얻어오기
- 비즈니스 로직 persistence logic 데이터 처리
- html로 응답 페이지 만들기

## 서블릿과 JSP 비교
공통점
- 웹페이지 동적으로 생성하는 서버 프로그램

차이점
- JSP는 HTML안 에 코드가 있음
- 서블릿은 자바 코드 안에 HTML코드가 있음

## Service LifeCycle
![](https://i.imgur.com/zlpoRlI.png)
![](https://i.imgur.com/pOl59SE.png)

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



## JSP Service LifeCycle
![](https://i.imgur.com/T0kwsHy.png)

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 스크립팅 요소 
![](https://i.imgur.com/jpxNKix.png)
#### Declaration Tag(선언 태그) 
<%!멤버변수 및 메소드%>>
자바의 전역변수 및 일반 메소드를 선언할 때 사용
#### Scriptlet
<% 자바코드%>
client 요청 시 매번  호출되는 영역으로 service부분에 해당하는 자바 코드 (request, response에 관련된 구현코드가 온다.)
#### Expression Tag(표현 태그)
<%= 문자열%>
해당위치에 결과 데이터를 브라우저에 출력할 때 사용한다.
#### Comment Tag(주석 태그)
<%-- --%>
부가설명이나 JSP에서 자바로 변환시 제외시킬 때 사용한다. 즉, 주석에 해당하는 문장은 변환된 자바파일에서는 보이지 않는다.

\* 참고! html 주석과 jsp주석의 차이점
jsp주석 -> 출력 결과에 포함X
html주석 -> 출력 결과 포함O

![](https://i.imgur.com/vURlEzb.png)
![](https://i.imgur.com/wteqli2.png)

![](https://i.imgur.com/2nkFrDW.png)
![](https://i.imgur.com/Aofq0un.png)
![](https://i.imgur.com/lt2v1Ns.png)
![](https://i.imgur.com/CeHRuU7.png)

## forward와 sendRedirect
![](https://i.imgur.com/nK4zlLs.png)

### 로그인 예시에서 웹페이지 이동
#### 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);
}
```
