ABOUT ME

Today
Yesterday
Total
  • JSP response 내장 객채(Implicit Object)
    TIL(Today I Learned) 2022. 9. 25. 23:10

    response란?

     클라이언트의 요청의 결과를 웹브라우저로 보내는 역할을 하는 내장 객체입니다. 주요 기능으로는 redirect와 HTTP 헤더에 응답 헤더 추가가 있습니다.

     

    response의 페이지 전환 예시

     

    responseMain.jsp // 로그인을 예시로 리다이렉트 코드 작성

    // responseMain.jsp 파일입니다.
    <h2>리다이렉트</h2>
    
    <%
    String idError = request.getParameter("idError");
    
    // 잘못된 id를 입력했을시에 responseLogin.jsp에서 getDispatcher.forward()메서드로
    // 쿼리스트링 값 idError를 1로 설정해서 responseMain.jsp로 보내줍니다.
    // 즉, id를 틀리게 입력했다면 idError가 null이 아니게 되면서 로그인이 실패했다는 문구를 출력합니다.
    if(idError != null) out.print("로그인 실패하였습니다.");
    %>
    
    <form action="./responseLogin.jsp" method="post">
    	<input type="text" name="name" > </br>
    	<input type="text" name="pwd" > </br>
    	<input type="submit" value="전송" > 
    </form>

    responseLogin.jsp // 로그인 처리 페이지

    //responseLogin.jsp 파일 입니다.
    
    <h2>로그인 처리 페이지</h2>
    <%
    String id = request.getParameter("name");
    String pwd = request.getParameter("pwd");
    
    //아직은 DB에 연결하지 않았으므로 임의로 id가 must이면서 pwd가 1234인 경우에 Login 완료 문구를 보내주는 로직입니다. 
    if(id.equalsIgnoreCase("must") && pwd.equalsIgnoreCase("1234")){
    	response.sendRedirect("responseLoginOk.jsp");
    }else{
    	//로그인이 실패하였습니다란 문구가 출력되도록 idError=1을 쿼리스트링으로 넘겨줍니다.
    	request.getRequestDispatcher("responseMain.jsp?idError=1")
    	.forward(request, response); //forward를 사용하여 페이지 전환을 합니다.
        //(forward 메서드는 아래에 상세하게 설명하겠습니다.)
    }
    %>

     

    forward란?

    명확하게는 getRequestDispatcher의 forward 메서드입니다. 선언 예시는 위에 나와 있습니다.

    forward 메서드는 리다이렉트와의 차이점을 알면 더 이해하기 쉽습니다. 

     

    결론부터 얘기드리자면 리다이렉트는 HTTP 트랜잭션을 2번 사용합니다.

    또한 리다이렉트를 호출하는 페이지가 a.jsp, 리다이렉트로 호출되는 페이지를 b.jsp라고 가정했을 때. a.jsp와 b.jsp는 클라이언트 요청 처리 결과값을 서로 공유하지 않습니다. 

     

    하지만 forward메서드는 HTTP 트랜잭션을 1번 사용합니다

    또한 a.jsp와 b.jsp가 서로 클라이언트 요청 처리 결과값을 공유합니다. 

    하지만 forward 메서드는 주의해야할 점이 있습니다. a.jsp에서 요청 처리 결과값을 기대할 수 없다는 것이죠

    이러한 특성은 출력버퍼의 영향아래에 있습니다.

     

    forward 메서드는 어떻게 클라이언트 요청 처리 결과값을 공유할까요?

    전에 설명했듯이 일반적인 웹 프로그램은 출력 버퍼에 데이터를 담아서 한번에 보내는 방식을 사용합니다. 

    그래서 브라우저가 a.jsp를 요청하면 데이터를 출력버퍼에 모았다가 한번에 보내게 되죠.

    하지만 forward()를 사용하게 되면 a.jsp는 출력 버퍼에 넘어가지 않고 b.jsp로 값을 가진채 함께 넘어가게 됩니다.

    결국은 a.jsp와 b.jsp의 값이 모두 출력 버퍼에 담겨서 브라우저에 넘어가게 되는 것이죠 따라서 서로 자원을 공유한다고 볼 수 있겠습니다.
    (이런 특성 때문에 최초 실행되는 a.jsp에서는 값을 출력해봤자 의미가 없습니다.)

     

    리다이렉트는 다른 애플리케이션의 자원을 요청할 수 있습니다.

    리다이렉트는 클라이언트에게 자원을 재요청할 때 자신의 애플리케이션의 자원(페이지)이 아닌 외부에 있는 애플리케이션의 자원으로 요청이 가능합니다.

    다만 forward는 서블릿 내부에서 제어의 흐름을 넘겨주는 방식이기 때문에 외부의 애플리케이션은 자원으로 사용할 수 없게됩니다.

     

    response 내장 객체는 응답 헤더에 정보를 추가하는 기능을 제공합니다

    정보 추가 메서드는 add 계열과 set 계열이 있습니다.

    add 계열은 헤더값을 추가할 때 사용하고
    set 계열은 기존의 헤더를 수정할 때 사용합니다.

Designed by Tistory.