관리 메뉴

거니의 velog

(5) JSP 스크립트 요소 기능 3 본문

Java_JSP

(5) JSP 스크립트 요소 기능 3

Unlimited00 2023. 9. 8. 20:28

7. 내장 객체(내장 변수) 기능

* JSP 페이지의 내장 객체(내장 변수)란 JSP가 서블릿으로 변환될 때 컨테이너가 자동으로 생성시키는 서블릿 멤버 변수를 말한다. 즉, 서블릿으로 구현 시 자주 사용했던 객체를 개발자가 일일이 만드는 것이 아니라 서블릿으로 변환 시 컨테이너가 자동으로 생성하여 사용하게끔 제공하는 것이다.

* 다음은 JSP 파일이 서블릿으로 변환되었을 때 _jspService() 메서드에 생성된 내장 객체를 저장하는 내장 변수가 선언된 코드이다.

<JSP에서 제공하는 내장 객체들>

내장 객체 서블릿 타입 설명
request javax.servlet.http.HttpServletRequest 클라이언트의 요청 정보를 저장한다.
response javax.servlet.http.HttpServletResponse 응답 정보를 저장한다.
out javax.servlet.jsp.JspWriter JSP 페이지에서 결과를 출력한다.
session javax.servlet.http.HttpSession 세션 정보를 저장한다.
application javax.servlet.ServletContext 컨텍스트 정보를 저장한다.
pageContext javax.servlet.jsp.PageContext JSP 페이지에 대한 정보를 저장한다.
page java.lang.Object JSP 페이지의 서블릿 인스턴스를 저장한다.
config javax.servlet.ServletConfig JSP 페이지에 대한 설정 정보를 저장한다.
exception java.lang.Exception 예외 발생 시 예외를 처리한다.

* 이 중 application, request, response, session은 이미 서블릿에서 사용해본 객체들이다. 따라서 앞에서 배웠던 동일한 기능을 제공한다.

* 다음 표는 자주 사용되는 내장 객체들의 스코프를 정리한 것이다. request, session, application은 서블릿의 스코프와 같다. page는 요청하는 해당 JSP 페이지에 대해서만 공유할 수 있다.

<내장 객체들의 스코프>

내장 객체 서블릿 스코프
page this 한 번의 요청에 대해 하나의 JSP 페이지를 공유한다.
request HttpServletRequest 한 번의 요청에 대해 같은 요청을 공유하는 JSP 페이지를 공유한다.
session HttpSession 같은 브라우저에서 공유한다.
application ServletContext 같은 애플리케이션에서 공유한다.

(1) session 내장 객체에 데이터 바인딩 실습

1. JSP 파일이 많아지므로 test01 폴더를 만든 후 session1.jsp, session2.jsp 등 실습 파일들을 생성한다.

2. SessionTest 클래스를 다음과 같이 작성한다. 서블릿에서 getSession() 메서드를 이용해 session 객체를 얻은 후 name을 바인딩한다.

package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


@WebServlet("/sess")
public class SessionTest extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter pw = response.getWriter();
		HttpSession session = request.getSession(); // session 객체를 가져온다.
		session.setAttribute("name", "이순신"); // session 객체에 name을 바인딩한다.
		
		pw.println("<html><body>");
		pw.println("<h1>세션에 이름을 바인딩합니다.</h1>");
		pw.println("<a href='/pro12/test01/session1.jsp'>첫번째 페이지로 이동하기 </a>");
		pw.println("</body></html>"); 
		
	}

}

3. session1.jsp 파일을 다음과 같이 작성한다. session 객체의 사용법은 서블릿에서 배운 HttpSession 사용법과 같다. 차이점은 JSP에서는 자동으로 세션 객체를 생성해 주므로 굳이 getSession() 메서드를 호출해서 세선을 얻을 필요가 없다는 것이다. getAttribute() 메서드를 이용해 첫 번째 JSP에서 session에 바인딩된 name 값을 가져온 후 setAttribute() 메서드를 이용해 session에 address를 바인딩한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
  String name = (String)session.getAttribute("name"); // session 객체에 바인딩된 name 값을 가져온다.
  session.setAttribute("address","서울시 강남구"); // session 객체에 address를 바인딩한다.
%>

<!DOCTYPE html>
<html lang="ko">

    <head>
        <meta charset="UTF-8" />
        <title>session 내장 객체 테스트1</title>
    </head>

    <body>
        이름은 <%=name %>입니다.<br>
        <a href=session2.jsp>두번째 페이지로 이동</a>
    </body>

</html>

4. session2.jsp에서는 getAttribute()를 이용해 서블릿과 JSP에서 session에 바인딩된 name과 address 값을 가져온다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String name = (String)session.getAttribute("name");
	String address = (String)session.getAttribute("address");
	// session 객체에 바인딩된 name 값과 address 값을 가져온다.
%>

<!DOCTYPE html>
<html lang="ko">

    <head>
        <meta charset="UTF-8">
        <title>session 내장 객체 테스트2</title>
    </head>

    <body>
        이름은 <%=name %>입니다.<br>
        주소는 <%=address %>입니다.
    </body>

</html>

5. 다음은 최초 서블릿에 요청한 결과이다. 서블릿 요청 시 session 객체에 name을 바인딩한다.

- http://localhost:8090/pro12/sess

6. '첫번째 페이지로 이동하기' 클릭 시 서블릿에서 바인딩한 name을 출력한다. '두번째 페이지로 이동'을 클릭한다.

7. 서블릿과 첫 번째 JSP에서 바인딩한 이름(name)과 주소(address)를 출력한다.

* 다음은 session과 application 내장 객체의 스코프에 대해 알아보자.


(2) application 내장 객체에 데이터 바인딩 실습

1. 다음과 같이 appTest1.jsp, appTest2.jsp 실습 파일을 준비한다.

2. appTest1.jsp를 다음과 같이 작성한다. 첫 번째 JSP에서 session과 application 내장 객체에 name과 address 값을 바인딩한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
   session.setAttribute("name","이순신");
   application.setAttribute("address","서울시 성동구");
   // 이름과 주소를 session과 application 내장 객체에 바인딩한다.
%>

<!DOCTYPE html>
<html lang="ko">

    <head>
        <meta charset="UTF-8">
        <title>내장 객체 스코프 테스트1</title>
    </head>

    <body>
        <h1>이름과 주소를 저장합니다.</h1>
        <a href=appTest2.jsp>두번째 웹페이지로 이동</a>
    </body>

</html>

3. appTest2.jsp를 다음과 같이 작성한다. 첫 번째 JSP에서 session과 application 내장 객체에 바인딩한 값을 가져온다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    String name = (String)session.getAttribute("name");
    String address = (String)application.getAttribute("address");
 	// 첫 번째 웹 페이지에서 저장한 데이터를 session과 application 내장 객체에서 가져온다.
%>

<!DOCTYPE html>
<html lang="ko">

    <head>
        <meta charset="UTF-8">
        <title>내장 객체 스코프 테스트2</title>
    </head>

    <body>
        <h1>이름은 <%=name %>입니다.</h1>
        <h1>주소는 <%=address %>입니다.</h1>
    </body>

</html>

4. 다음의 주소로 요청한다. 첫 번째 JSP에서 name과 address를 session과 application에 바인딩한다.

- http://localhost:8090/pro12/test01/appTest1.jsp

5. 같은 브라우저에서 요청할 경우 두 번째 JSP에서 session과 application에 접근할 수 있다.

6. 하지만 다른 브라우저(익스플로러)는 application의 값에만 접근할 수 있다.

* 같은 브라우저에서 appTest2.jsp를 요청하면 session과 application에 저장된 값을 그대로 출력한다. 그러나 다른 브라우저로 요청할 경우 session 내장 객체의 스코프는 접근할 수 없으므로 null을 출력한다. 이를 통해 application 내장 객체의 스코프는 애플리케이션 전체이고, session 내장 객체의 스코프는 같은 브라우저임을 알 수 있다.

* 다음으로 가장 널리 사용되는 내장 객체인 request에 대해 알아보자.


(3) request 내장 객체에 데이터 바인딩 실습

1. request 내장 객체 실습 파일인 request1.jsp, request2.jsp 를 준비한다.

2. 첫 번째 JSP인 request1.jsp를 다음과 같이 작성한다. 브라우저의 요청에 대한 request 객체에 name과 address를 바인딩한다. 그리고 RequestDispatcher를 애용해 request 객체를 두 번째 JSP로 전송한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    import="javax.servlet.RequestDispatcher"
    pageEncoding="UTF-8"
    %>
<%
  request.setAttribute("name","이순신");
  request.setAttribute("address","서울시 강남구"); 
  // request 객체에 setAttribute()를 이용해 name과 address를 바인딩한다.
%>

<!DOCTYPE html>
<html lang="ko">

    <head>
        <meta charset="UTF-8">
        <title>첫 번째 JSP</title>
    </head>

    <body>
        <%
	      RequestDispatcher dispatch = request.getRequestDispatcher("request2.jsp");  
	      dispatch.forward(request, response);
	      // request 객체를 다른 JSP로 포워딩한다.
	    %>
    </body>

</html>

3. 두 번째 JSP인 request2.jsp를 다음과 같이 작성한다. 첫 번째 JSP에서 전송된 request 객체에서 바인딩된 name과 address를 가져온다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
   String name = (String)request.getAttribute("name");
   String address = (String)request.getAttribute("address");
   // 첫 번째 JSP 페이지에서 포워딩된 request 객체에서 getAttribute()를 이용해 정보를 가져온다.
%>

<!DOCTYPE html>
<html lang="ko">

    <head>
        <meta charset="UTF-8">
        <title>두 번째 JSP</title>
    </head>

    <body>
        <h1>이름은 <%=name %>입니다.</h1>
        <h1>주소는 <%=address %>입니다.</h1>
        <!-- 이전 JSP에서 전송된 정보를 출력한다. -->
    </body>

</html>

4. 브라우저에서 다음 주소로 요청하면 request 객체에 바인딩한 후 request2.jsp로 포워딩하여 이름과 주소를 출력한다.

- http://localhost:8090/pro12/test01/request1.jsp


(4) out 내장 객체 이용해 데이터 출력하기

* 이번에는 결과를 출력할 때 사용하는 out 내장 객체를 사용해 보자.

1. 다음과 같이 실습 파일 out1.jsp, out2.jsp를 준비한다.

2. 첫 번째 JSP 페이지인 out1.jsp를 작성한다. 이름과 나이를 두 번째 JSP로 전송한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="ko">

    <head>
        <title>데이터입력창</title>
        <meta charset="UTF-8">
    </head>

    <body>
        <form method="post" action="out2.jsp">
            이름:<input type="text" name="name"><br>
            나이: <input type="text" name="age"><br>
            <input type="submit" value="전송">
        </form>
    </body>

</html>

3. 두 번째 JSP 페이지인 out2.jsp를 작성한다. 전송된 이름과 나이를 표현식과 out 내장 객체를 이용해 출력한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
   request.setCharacterEncoding("utf-8" );
   String name = request.getParameter("name");
   String age = request.getParameter("age");
%>

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8">
        <title>데이터출력창</title>
    </head>

    <body>
        <%
           if(name!=null ||name.length()!=0){
        %>
            <!-- name과 age의 값을 표현식으로 출력한다. -->
            <h1><%=name %> , <%=age %></h1>
        <%
           }else{
        %>
        	<h1>이름을 입력하세요</h1>
        <%
           }
        %>

        <%
           if(name!=null ||name.length()!=0){
        %>
        	<!-- name과 age의 값을 out 내장 객체로 출력한다. -->
            <h1><% out.println(name + " , " + age); %></h1>
        <%
           }else{
        %>
            <h1>이름을 입력하세요</h1>
        <%
           }
        %>
    </body>

</html>

4. 브라우저에서 요청하여 이름과 나이를 입력한 후 전송한다.

- http://localhost:8090/pro12/test01/out1.jsp

5. 전달받은 정보를 표현식과 out 내장 객체로 출력한다.

* out 내장 객체를 이용해 스크립트릿으로 출력하면 복잡한 코드를 상대적으로 간단하게 출력할 수 있다.