# 서블릿과 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); } ```