ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ 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

     

Designed by Tistory.