-
[ JSP ] 서블릿(Servlet)의 주요 객체PROGRAMMING/Web 2022. 5. 30. 23:14
하루입니다.
- 서블릿은 서버에서 실행되는 자바이다.
- 서블릿이란 Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술입니다. 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해 줍니다.
Servlet의 주요 객체

시각자료 Servlet 인터페이스
- 서버에서 실행되는 프로그램이 반드시 구현해야 하는 라이프사이클 메소드를 정의하는 인터페이스이다.
GerericServlet 클래스
- 다양한 프로토콜을 기반으로 하는 서버용 애플리케이션을 개발할 때 상속받는 클래스이다.
- Servlet 인터페이스의 추상메소드들을 대부분 재정의하고 있다. (구현)
HttpServlet 클래스
- HTTP 프로토콜에 최적화된 서버용 애플리케이션을 개발할 때 상속받는 클래스이다.
- GerericServlet을 상속한 클래스이다.
- HTTP 요청방식(get, post)에 따라 메소드를 실행하는 service 메소드가 있는데, 요청방식 상관 없이 실행되기에 대부분의 경우는 service메소드를 재정의하여 개발한다.
- 문제점은 HTML 코드를 전부 out.write 메소드를 사용해 수행해야 한다는 것. 그리고 HTML디자인이 변경되면 HttpServlet도 변경해야 했다. 이를 극복하기 위해 JSP기술이 등장했다.
- JSP로 개발한 웹 애플리케이션은 웹애플리케이션 서버가 자바코드(HttpServlet 코드)로 변환한다.
Servlet API의 주요 객체 (요청객체, 응답객체)

자바 웹 기술과 관련해 제공되는 서비스나 인터페이스를 서블릿 api라고 한다.
HttpServletRequest 인터페이스
요청파라미터와 속성(Attribute)의 차이
요청객체 안에 담을 수 있는 정보는 크게 두 가지로 나뉜다.
1. 요청파라미터
요청메세지 안의 쿼리스트링 혹은 바디에 담겨서 오는 것이 요청파라미터이다. 이를 꺼내는 게 getParameter이다. 요청파라미터 작업은 톰캣이 하기에 우리가 set 등을 사용해 건드릴 수 없다. String만 담을 수 있다.
2. 속성
객체를 담을 수 있다. 저장 조회 삭제가 가능하다. 왜 담아야 하는지는 나중에 mvc 패턴에서 배운다고 함.
RequestDispatcher : 지정된 경로로 내부이동시킨다.
HttpServletResponse 인터페이스
sendRedirect : 외부로 이동할 때 쓰인다.
setContentType, setHeader, getOutputStream : 파일을 다운로드 할 때 쓰인다.

RequestDispatcher와 redirection (클라이언트의 요청을 수행하는 두 가지 방법)
redirection
- a.jsp를 요청하면 b.jsp를 재요청하라는 응답을 보내고, b.jsp가 요청되면 b.jsp가 만든 HTML을 응답한다.
- 브라우저의 URL이 변경된다.
- a.jsp와 b.jsp가 사용하는 요청객체와 응답객체가 각자 다르다.
RequestDispatcher :
- a.jsp를 요청하면 b.jsp를 내부에서 요청(특파원, 배차원 보내듯) 한다. a에서 받은 요청을 b로 보내는 것이다.
- 브라우저의 URL이 변경되지 않는다.
- a.jsp와 b.jsp가 사용하는 요청객체와 응답객체가 같다.
- 둘 다 재요청한다는 점에서는 같다.
- 포워드 이동은 a.jsp에 담은 값을 요청응답객체를 이용해 b.jsp에서 꺼내는 것을 가능하게 한다.
- 나중에는 a.jsp에서는 로직 수행만 하고, b.jsp에서는 그 값(객체)를 받아서 표현만 하도록 할 것.
- 이게 MVC이다?
Servlet과 JSP의 주요 객체

ServletContext
- 웹 애플리케이션 프로젝트당 하나 생성되는 객체
- 생성 : 웹 어플리케이션 서버에 처음으로 요청 보낼 때, 로그인 요청시
- 종료 : 웹 어플리케이션 서버에 일정 시간 접속 없을 때, 로그아웃 요청시
- 속성, 초기화 파라미터값 제공
- 모든 웹 어플리케이션에 공유되는 정보를 속성에 담는다.
HttpSession
- 클라이언트당 하나 생성되는 객체
- 생성 : 클라이언트가 웹 어플리케이션 서버에 처음으로 요청 보낼 때
- 종료 : 클라이언트가 웹 어플리케이션 서버에 처음으로 요청 보낼 때
- 속성 제공
- 클라이언트의 개인정보를 속성에 담는다.
HttpServletRequest, httpServletResponse
- 생성 : 클라이언트의 요청이 접수될 때
- 종료 : 응답이 완료됐을 때
- 속성, 요청파라미터 제공
- 내부이동한 다른 웹 어플리케이션에게 전달할 값을 속성에 담는다.
ServletConfig
- 웹 어플리케이션당 하나 생성된다.
- JSP에서는 거의 사용 안 함
PageContext
- JSP의 _jspService 메소드 안에서 생성되고, 메소드가 종료되면 사라진다.
- 대부분의 JSP 내장객체를 반환하는 메소드 제공
- 속성 제공
- 해당 JSP에서만 사용할 값 속성에 담는다.
Filter, HttpFilter
- 웹 어플리케이션 실행 전 혹은 후에 공통으로 수행할 작업을 구현한다.
- 이미지 크기 조절, 암호화, 복호화, 데이터 압축 등

pageContext. ~~~ 가 많다 (왜 하필 얘지). config, session, out pageContext.

- 톰캣 안에는 웹 어플리케이션이 여러개 배포될 수 있다.
- _jspServive 안에서는 항상 위위의 까만 코드가 실행된다. pageContext를 먼저 획득한 뒤 pageContext가 제공하는 메소드를 사용해서 HttpSession, ServletConfig 등의 객체를 획득 가능하다.
- 프로젝트마다 ServletContext 객체가 한 개씩 만들어진다. 안에는 속성과 초기화 파라미터값이 들어 있다.
- jsp 객체마다는 ServletConfig 객체가 하나씩 들어있다.
- Filter객체는 jsp가 실행되기 전(전처리작업)과 후(후처리작업)에 실행된다. 클라이언트로부터의 요청과 서버의 응답은 필터를 거친다.
- HttpServletRequest/HttpServletResponse는 클라이언트의 요청이 올 때 만들어지고 응답이 완료되면 폐기된다.
- 실질적으로 우리가 작성하는 개체는 Filter객체와 jsp객체이다.
- 속성을 가지는 객체는 HttpServletRequest, HttpSession, pageContext, ServletContext.
- 어디에 지정하느냐에 따라 얼마나 오래, 누가 값을 더 사용할 수 있느냐가 정해진다.
- pageContext는 금방 사라져서(해당 _jspService 종료되면 사라짐), ServletContext객체는 지나치게 모두에게 공유되고 / 상주하기에(메모리에 부담) 탈락이다. HttpSession은 특정 클라이언트와 연결되어 있어서 개인적인 정보를 담기 좋다.
실습
[ 로그인 오류 구현하기 (로그인 폼 요청하기)]

로그인 구현할 거다. 그런데 안 되는 거 먼저 거르고 볼 거다.
로그인 프로세스
1. 사용자가 로그인을 누른다 : loginform.jsp 요청
2. 로그인폼 HTML을 응답으로 보낸다 : loginform.jsp?fail=null일 때.
3. 사용자가 이메일과 비밀번호를 입력하고 로그인 버튼을 누른다.
로그인 값은 post 형식이다. get 형식이라면 url에 사용자가 입력한 값 나올테니까.
4. login.jsp가 요청된다. 요청객체의 요청파라미터에는 사용자가 입력한 이메일과 비밀번호가 들어 있다.
5. login.jsp에서 사용자 정보를 조회한다.
5-1. 요청객체에서 getParameter로 뽑아낸 email값을 매개변수로 받는 getUserByEmail에 email을 넣고 돌린다. 기본적으로 User user = null;로 설정되어 있기에, 만약 유저 아이디가 DB에 없다면 Resultset에도 해당되지 않아 null값으로 나올 것이다. 이 경우는 회원정보가 존재하지 않는 것이다.
5-2. 만약 user.getDeleted의 값이 Y와 equals하다면 탈퇴한 유저이다.
5-3. 만약 user.getPassword의 값이 유저가 입력한 password와 equals하지 않다면 비밀번호가 일치하지 않는 것이다.
* 위의 세 경우 모두 로그인 실패이다.
6. loginform.jsp?fail=invalid/deleted/deny라면 로그인폼HTML을 응답으로 보내되 각각의 에러 HTML 컨텐츠도 포함해서 보낸다.
7. 회원정보가 존재하고, 탈퇴한 회원이 아니며, 비밀번호가 일치한다면 로그인시킨다.
~ 여기부턴 내일부터 ~
JSP에 다른 JSP를 포함시키기
1. include 지시어
<%@ include file="포함시킬 jsp파일" %>- include 지시어는 이 jsp에 포함시킬 다른 jsp파일을 지정한다.
- include 지시어는 이 jsp에 다른 jsp파일의 코드를 통째로 포함시킨다.
- 무슨 뜻이냐면 jsp를 자바로 바꾼 코드를 보면 포함시킨 jsp코드가 통째로 그 안에 들어가 있음.
- 코드가 통째로 포함되기 때문에 변수명 충돌이 발생할 수 있다.
2. jsp 액션태그 : 기능이 더 많다.
<jsp:include page="포함시킬 jsp파일"> <jsp:param name="요청파라미터명" value="요청파라미터값" /> -> 생략 가능 <jsp:param name="요청파라미터명" value="요청파라미터값" /> </jsp:include>- include 액션태그는 이 jsp에 포함시킬 다른 jsp파일을 지정한다.
- include 액션태그는 포함시킨 jsp페이지를 실행하고, 이 jsp페이지로 되돌아온다.
- jsp를 자바로 바꾼 코드를 봐도 포함시킬 jsp파일 링크만 적혀있음.
- include 액션태그는 변수명 충돌을 걱정할 필요가 없다.
- include 액션태그는 <jsp:param /> 태그를 포함할 수 있다.
- <jsp:param /> 태그를 사용하면 포함시킨 jsp페이지에 요청파라미터값을 전달할 수 있다.
목적
- 모든 jsp에 공통으로 포함되는 navbar, footer, banner 등을 각각 다른 jsp파일로 정의하고, include지시어로 필요한 jsp 페이지에 포함시킬 수 있다.
- include 지시어나 jsp 액션태그를 사용하면 jsp에서 중복되는 html 코드를 작성할 필요가 없어진다.
잘못된 정보에 대한 지적은 언제나 환영입니다.
복습 끝!
도움받은 곳
https://coding-factory.tistory.com/742
'PROGRAMMING > Web' 카테고리의 다른 글
[ JSP ] 로그인하기, 장바구니 담기 해야 할 것 (0) 2022.06.01 [ JSP ] 로그인하기(HttpSession), 로그인 활용(cart), 절대주소와 상대주소 (0) 2022.05.31 [ JSP ] 클라이언트의 요청방식 (0) 2022.05.26 [ JSP ] JSP 구성요소, 내장객체 (0) 2022.05.26 [ Web ] Tomcat, html, JSP (0) 2022.05.25