Hoon222y

[JSP & Servlet] 6장. JSP 내장 객체 본문

코딩/교육

[JSP & Servlet] 6장. JSP 내장 객체

hoon222y 2019. 1. 16. 21:19

Chap06 JSP 내장 객체

 

6.1 JSP 내장 객체

- JSP 내에서 선언하지 않고 사용하는 객체 

- 보통 스크립트릿에서 사용하며, 내장 객체를 통하면 사용자 요청을 컨트롤 하거나 페이지 간 데이터 공유 가능 


request : 클라이언트의 요청을 객체화한 객체

response : 리다이렉트 기능을 활용하려면 필수로 사용해야 함

session : 클라이언트 상태 정보 저장해서 유지

application : 다이나믹 웹 프로젝트는 하나의 웹 어플리케이션. 이에 대한 정보 담음

out : 버퍼를 객체화한 객체

exception : isPageError 이용해 다른 JSP에서 발생한 예외를 대신 처리할 때 활성화

 

* JSP 내장 객체 특징

JSP는 별도로 객체를 생성하지 않아도 자동으로 내장객체 생성

서블릿은 request, response만 자동으로 내장객체 생성

 

6.2 request 

- 사용자 요청과 관련된 기능을 제공하는 내장객체이며 주로 클라이언트에서 서버로 전달되는 정보를 처리하려고 사용

현재 클라이언트 요청을 객체화 한 객체

 

getParameterNames( ) : 파라미터 이름 모를 경우 자바의 열거형 객체로 반환

getParameter( ) : 파라미터의 값 가져옴

getParameterValues( ) : 하나의 파라미터의 값이 여러 개인 경우 값을 배열 형태로 가져옴

checkbox, multiple list 등에 주료 사용함

getCookies( ) : 클라이언트 상태 정보를 유지하면서 사용하기 위한 쿠키를 읽음

쿠키와 세션은 추후에 정리

getMethod( ) : 해당 요청이 GET인지 POST인지 가져옴

getRemoteAddr( ) : 클라이언트 IP 주소. 로그인 정보를 남길 때 사용

setCharacterEncoding( ) : 클라이언트로부터 서버로 올라오는 요청에 대한 캐릭터셋 설정

(웹에서 기본 캐릭터셋 ISO-8859-1)

POST 방식에서만 동작하며, GET 방식은 동작하지 않음(바디 영역 사용 안하기 때문)

 

쿠키 : 클라이언트와 서버간의 연결이 유지되지 않는 웹 프로그램의 문제점을 보완하려고 클라이언트에 간단한 데이터를 저장하고 있다가 서버에서 요청이 오면 브라우저가 이를 제공하는 기술


서버에서 정보부스러기를 남기려고 할 때 쿠키를 생성

쿠키가 클라이언트에서 저장되다보니 자바스크립트로 읽을 수 있음

자바스크립트로 생성된 쿠키는 다큐먼트의 객체로 생성

 

* request_form.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<HTML>
<HEAD>
    <meta charset="UTF-8">
    <TITLE>ch06 : request_form.html</TITLE>
    <script>
        document.cookie = "test=OK.";
    </script>
    <style> <!-- tr은 테두리 속성 지정 못함 -->
        table, td {
            border: 1px solid gray;
            border-collapse: collapse; 
            padding: 20px;
        }
    </style>
</HEAD>
<BODY>
    <div align=center>
    <H2>request  테스트 폼 </H2>
    <HR>
    <form method=post action=request_result.jsp>
    <table>
        <tr>
            <td>이름</td>
            <td><input type=text size=10 name=username></td
        <tr>
            <td>직업</td>
            <td>
                <select name=job > <!-- multiple 넣으면 다중 선택 -->
                    <option selected>무직</option>
                    <option>회사원</option>
                    <option>전문직</option>
                    <option>학생</option>
                </select>
            </td>
        <tr>
            <td>관심분야</td>
            <td>  <!-- 같은 그룹의 체크 박스는 name 속성이 동일해야 함 -->
                <input type=checkbox name=favorite value="정치">정치
                <input type=checkbox name=favorite value="사회">사회
                <input type=checkbox name=favorite value="정보통신">정보통신
            </td>
        <tr>
            <td colspan=2 align=center<!-- 2개의 열을 결합 -->
                <input type=submit value="확인">
                <input type=reset value="취소">
            </td>
        </tr>
    </table>
    </form>
    </div>
</BODY>
</HTML>
cs

 파싱하는 과정에서 브라우저에 쿠키를 저장 -> "test=OK."이라는 이름으로 저장

브라우저에 저장된 쿠키는 쿠키를 생성한 서버에게 재요청이 갈 때 자동으로 쿠키가 탑재

쿠키는 여러 개일 수 있음

select는 콤보 박스로, 필요에 따라 multiple을 이용해 다중 선택 가능

하나의 그룹으로 묶여 있는 체크 박스에서 다중 체크 가능하게 함

라디오는 각각의 항목이 배타적이므로 하나만 선택 가능

form 태그 내 name 속성은 고유해야 하지만 checkbox, radio에서는 name이 같아야 함

같은 그룹의 checkbox, radio는 name 속성이 같아야 함

colspan : 열 병합, rowspan : 행 병합 



* request_result.jsp

out 객체 사용. <BR>은 줄 바꿈

쿠키는 하나밖에 없으니까 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<%@ page contentType="text/html; charset=UTF-8" %>
<!-- 반드시 어떤 파라미터를 읽기 전에 설정해야 함 -->
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
    <title>6 : request_result.jsp</title>
</head>
<body>
    <div align="center">
    <H2>request  테스트 결과 - 1</H2>
    <HR
    <table border=1>
    <tr>
        <td>이름</td>
        <td><%=request.getParameter("username")%> </td>
    <tr>
        <td>직업</td>
        <td><%=request.getParameter("job")%></td>
    <tr>
        <td>관심분야</td>
        <td>
            <%
                String favorites[] = request.getParameterValues("favorite");
                for(String favorite: favorites) {
                    out.println(favorite+"<BR>");
                }       
            %>
        </td>
    </tr>
    </table>
    <HR>
    <H2>request  테스트 결과 - 2</H2>
    <table border=0>
        <tr>
            <td>
                1. 클라이언트 IP 주소 : <%= request.getRemoteAddr() %> <BR>
                2. 요청 메서드 : <%= request.getMethod() %> <BR>
                <%
                    Cookie cookie[] = request.getCookies();
                %>
                3. <%= cookie[0].getName() %> 에 설정된 쿠키값 : <%=cookie[0].getValue() %><BR
<!-- 쿠키가 하나밖에 없으므로 -->
                4. 프로토콜 : <%= request.getProtocol() %>
            </td>
        </tr>
    </table>
    </div>
</body>
</html>
cs

 request_form.html 에서 체크항목이 전부 favorite로 되어 있는데 같은 이름으로 설정된 할목이 여러개인 경우에는 getParametetValues() 메서드를 이용해야 한다. 반환값은 문자열 배열로 선택한 항목만 배열 형식으로 전달된다.  



6.3 response 객체

- request와 반대되는 개념으로, 사용자 응답과 관련된 기능을 제공한다. 

- request 를 처리하고 응답을 다른 페이지로 전달하는 기능을 제공 

 

* response 객체 속성

setContentType( ) : contentType을 설정 / page 자시어에서 contentType을 지정한 MIME Type을 무시하고 새로운 MIME Type이 헤더로 전달 .

setHeader( ) : 헤더를 세팅

sendError( ) : 오류 코드를 세팅하고 메시지를 보냄. 오류 메시지를 사용자가 지정 가능

sendRedirect( ) : 현재 페이지를 다른 페이지로 전달한다. 클라이언트 요청을 다른 페이지로 보냄


결과만 보면 forward 액션과 비슷하지만, sendRedirect() 는 단순히 사용자 요청을 다른 페이지로 보내는것으로 새로운 페이지를 위한 request 및 response 객체가 생성되며, forward 액션의 경우에는 원래 요청에 포함된 request 및 response 객체가 그대로 전달됨.

 

forward는 클라이언트가 모르게 서버 내에서 페이지 흐름을 조절

redirect는 브라우저에 의해 페이지 흐름 제어가 이루어짐

 

최초 요청에 포함된 파라미터 정보는 B.jsp에 탑재될 수 없음(강제로 가능하긴 함)

 

* page_control.jsp

각각의 form에서 사용자 이름 받아서 요청에 탑재

get 방식으로만 리다이렉트가 됨

개발자 도구 - 네트워크 - 어떻게 통신이 이뤄지는지 알 수 있음

forward -> 200, redirect -> 302

브라우저에서 forward에서는 url이 다르게 나타나지만 redirect는 url이 정상적으로 표시됨

redirect는 브라우저를 통해서 리다이렉트가 되기 때문에 자동으로 url이 표시됨

forward는 브라우저는 어떤 문서에서 출력된 것인지 알 수 없음

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <TITLE>ch06 : page_control.jsp</TITLE>
</head>
<body>
    <H2>forward, sendRedirect 테스트</H2>
    <HR>
    <form method=post action=forward_action2.jsp>
        forward action : <input type=text name=username>
        <input type=submit value="확인">
    </form>
     
    <form method=post action=response_sendRedirect.jsp>
        response.sendRedirect : <input type=text name=username>
        <input type=submit value="확인">
    </form>
</body>
</html>
cs

 

* forward_action2.jsp

1
2
3
4
5
6
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<% request.setCharacterEncoding("UTF-8"); %>
    <jsp:forward page="page_control_end.jsp">
    <jsp:param name="tel" value="000-000-0000" />
</jsp:forward>
cs

 

* response_sendRedirect.jsp

1
<% response.sendRedirect("page_control_end.jsp"); %>
cs

 

* page_control_end.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <TITLE>ch06 : page_control_end.jsp</TITLE>
</head>
<body>
    <div align="center">
    <H2>forward action 및 sendRedirect() 결과</H2>
    <HR>
     지금 보이는 화면은 page_control_end.jsp 에서 출력한 결과 입니다.
    <HR>
    이름 : <%= request.getParameter("username"%> <BR>
    전화번호 : <%= request.getParameter("tel"%>
    </div>
</body>
</html>
cs

 

* query rewrite

response_sendRedirect.jsp를 리다이렉트하는 경우에도 파라미터를 전달하도록 수정

1
2
3
4
5
6
7
<% 
    request.setCharacterEncoding("UTF-8");
    String url = "page_control_end.jsp";
    url += "?username=" + request.getParameter("username");
    url += "&tel=000-0000-0000";
    response.sendRedirect(url);
%>
cs

 

forward_action2.jsp에서 <% request.setCharacterEncoding("UTF-8"); %> 삭제하면 한글 깨짐

forward 시 속성 get으로 변경한 후 <% request.setCharacterEncoding("UTF-8"); %> 삭제해도 한글은 잘 표현됨

<% request.setCharacterEncoding("UTF-8"); %>는 host 방식에서 body에 탑재된 파라미터를 인코딩할때만 사용함



6.4 out

getBufferSize( ) : 버퍼 크기를 바이트로 알려줌(기본은 8k)

getRemaining( ) : 사용 가능한 버퍼 크기 비율

clearBuffer( ) : 버퍼에 있는 컨텐츠 지움

flush( ) : 버퍼 및 output stream 비움. 스트림은 데이터 흐름을 의미

output stream은 컨테이너에서 브라우저로 데이터가 흐르는 것을 의미함

close( ) : output stream 닫고 비움

println(content) : content 내용을 newline과 함께 출력

print(content) : content 내용 출력. 브라우저로 전달됨

 

* out.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>ch06 : out.jsp</title>
</head>
<body>
    <div align="center">
    <H2> out 내장객체의 사용 </H2>
    <HR>
    1. 설정된 버퍼크기 : <%= out.getBufferSize() %> <BR>
    2. 남아있는 버퍼크기 : <%= out.getRemaining() %> <BR>
    <% out.flush(); %>
    3. flush 후 남아있는 버퍼크기 : <%= out.getRemaining() %> <BR>
    <% out.clear(); %>
    </div>
</body>
</html>
cs

 

* session 내장객체

HTTP 프로토콜은 비연결형 프로토콜

연결 지향적인 프로토콜은 정해진 요청에 의해 연결이 성공되면, 클라이언트가 해지하기 전에 지속적인 연결을 유지함 -> HTTP 프로토콜 문제점을 해결하기 위해 세션과 쿠키 이용

쿠키는 클라이언트에 제공, 세션은 서버에 제공

세션은 클라이언트가 수행했던 작업 내역 등을 서버에 기록

세션은 쿠키에 종속적임

클라이언트에게 최초의 요청이 들어오느 순간 세션은 자동으로 생성됨

동일 클라이언트가 작업을 수행하는 동안 계속되서 유지됨

 

일정 시간 동안 어떠한 요청도 없다면 세션 객체는 자동으로 삭제됨

세션 객체 메서드 중 invalidate( )를 사용해서 세션 객체를 스스로 삭제할 수 있음

 

세션 객체는 맵 저장소를 제공(세션 맵)

맵 저장소는 키(String)와 밸류(Object)를 쌍으로 저장

 

세션은 클라이언트마다 따로 생성

세션 객체는 클라이언트로부터 최초 요청이 들어오면 자동으로 생성

정해진 시간 간격 동안 요청이 없거나, 명시적으로 invalidate( ) 실행하면 삭제됨

요청이 들어올 때마다 요청을 받은 JSP 문서의 내장객체로 세션 객체를 넣어줌

이전 JSP 문서에서 키와 밸류를 저장하면 다음 JSP 문서에서도 같은 세션 객체가 들어오기 때문에 이 문서에서도 키와 밸류를 사용할 수 있음

자바에서 오브젝트는 최상위 객체 -> 자바에서 사용하는 모든 값 저장할 수 있음

 

세션은 키와 밸류의 쌍

값을 저장하려면 session.setAttribute(키,밸류)

값을 확인하려면 session.getAttribute(키)

 

* session 내장객체 메서드

getId( ) : SID 반환

getCreatingTime( ) : 세션 생성 시간 반환

getLastAccessedTime( ) : 마지막으로 요청한 시간 반환

getMaxInactiveInterval( ) : 세션 유지 시간을 초 단위로 반환

setMaxInactiveInterval(t) : 세션 유지 시간 설정. 기본값 1800초(30분)

invalidate( ) : 명시적으로 세션 종료. 초기화해서 다른 클라이언트가 사용할 수 있음

getAttribute(key) : 세션의 key값을 object 형태로 반환

setAttribute(key, value) : key는 string, value는 object

 

* session.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <TITLE>ch06 :session.jsp</TITLE>
</head>
<body>
    <div align="center">
    <H2>session 예제 </H2>
    <HR>
    <%
        // isNew()  메서드를 이용해 최초 세션 설정을 확인하고 있다.
        if(session.isNew()) {
            out.println("<script> alert('세션이 해제되어 다시 설정합니다.') </script>");
            session.setAttribute("login","홍길동");
        }
    %>
    # <%= session.getAttribute("login"%> 님 환영 합니다.!!!!<BR>
    1. 세션 ID : <%= session.getId() %> <BR>
    2. 세션 유지시간 : <%= session.getMaxInactiveInterval() %> <BR>
    </div>
</body>
</html>
cs

 

클라이언트에 저장된 쿠키를 확인하는 방법

개발자도구/Application/Storage/Cookies/http://localhost:8080

 

* application 내장객체

웹 어플리케이션(컨텍스트) 전체를 관리하는 객체

각 서블릿이나 JSP에서 공유하려고 하는 각종 정보를 설정하고 참조할 수 있음

 

getServerInfo( ) : 컨테이너의 이름, 버전 반환

getMajorVersion( )

getMinorVersion( )

getMimeType(filename)

getResource(path)

getResourceAsStream(path)

getRealPath(path)

getContext(path)

getRequestDispatcher(path)

log(message)

log(message, exception)

getAttribute(String name)

getAttributeNames( )

setAttribute(String name, Object value)

removeAttribute(String name)

 

세션 객체는 현재 연결을 유지하는 클라이언트를 위한 저장소 제공

어플리케이션 객체도 세션과 마찬가지로 이와 같은 저장소 제공

어플리케이션 객체는 서버 전체에서 하나만 존재한다는 차이점 존재

웹 어플리케이션 내 모든 문서들은 공통으로 동일한 어플리케이션 객체를 내장 객체로 받음

서로 다른 JSP 문서, 서블릿 사이에서 정보 공유를 위한 목적으로 저장소 사용할 수 있음

 

세션은 하나의 클라이언트 대상

어플리케이션은 웹 어플리케이션 내 모든 문서에 대한 공유 데이터 저장 및 사용 방법 제공

 

* application.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <TITLE> </TITLE>
</head>
<body>
    <div align="center">
    <H2>ch06 :application 테스트</H2>
    <HR>
    1. 서버정보 : <%= application.getServerInfo() %> <BR>
    2. 서블릿 API 버전정보 : <%= application.getMajorVersion() +"."+application.getMinorVersion() %> <BR>
    3. application.jsp 파일의 실제경로 :<%= application.getRealPath("application.jsp"%> <BR>
    <HR>
    setAttribute 로 username 변수에 "홍길동" 설정<P>
    <% application.setAttribute("username","홍길동"); 
          application.log("username=홍길동");          <!-- 콘솔로 출력됨 -->
          application.setAttribute("count",1) ;
    %>
    <a href="application_result.jsp">확인하기</a>
    </div>
</body>
</html>
cs

 

* application_result.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ page contentType="text/html; charset=UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <TITLE> </TITLE>
</head>
<body>
    <div align="center">
    <H2>application 예제</H2>
    <HR>
    username 에 설정된 값은 : <%= application.getAttribute("username"%> <P>
    <%
        <!-- Object를 Interger 객체로 형 변환 -->
Integer count = (Integer)application.getAttribute("count");  
        int cnt = count.intValue()+1;
        application.setAttribute("count", cnt);
    %>
    count : <%= cnt %>
    </div>
</body>
</html>
cs

 

application.jsp에서 setAttribute("count", 1)에서 1이 들어가는 이유

오토 박싱 : 자바가 제공하는 래퍼 클래스(객체가 아닌 기본 자료형을 객체화해서 사용, Integer 등)를 자동으로 생성하고 바로 가져올 수 있는 기능

1은 오토 박싱에 의해 Integer 객체가 됨

application_result.jsp에서  setAttribute("count", cnt)에서도 오토 박싱

 

* pageContext 내장객체

pageContext를 이용해 forward, include 액션 작업을 수행할 수 있음

 

* HTTP 프로토콜 특징과 내장객체 속성 관리

JSP에서 page, request, session, application 내장객체에는 저장소가 있음

 

request 객체가 생성이 되고 삭제가 되는 동안 공유/유지해야 하는 정보가 있을 때 사용

최초 생성된 request 객체가 같이 넘어감

포워딩 받은 문서에서도 사용 가능 (포워딩 시 유용)

param( )은 텍스트 정보만 보낼 수 있음

A.jsp에서 B.jsp로 자바 객체를 넘겨야 하는 경우, request 저장소에 자바 객체를 저장 후 포워드하면 전달할 수 있음

 

session 객체는 최초로 클라이언트 요청이 도착했을 때 생성됨

Chrome으로 접속하고, IE로 접속하면 별도로 취급함

세션을 구현하려면 쿠키가 있어야 하는데 브라우저별로 따로 관리되기 때문임

세션 객체는 클라이언트마다 개별적으로 생성되며, 삭제하기 전까지 계속 유지됨

 

application 객체는 서버가 최초 시작될 때 딱 하나 생성됨

어플리케이션 안에서 모든 웹 컨텐츠를 공유할 수 있음

 

* 내장객체 생성 시점과 소멸 시점

request : 해당 페이지 요청 시점 - 서버가 응답을 제공한 시점

session : 사용자 최초 접속 시점 - 웹 브라우저 종료 시점

application : 웹 어플리케이션 시작 시점 - 웹 어플리케이션 종료 시점

보통의 쿠키는 브라우저가 종료되어도 유지되지만, SID는 브라우저가 종료되면 삭제됨

 

getAttribute(String name)은 name에 해당하는 Object를 리턴하므로 적절하게 명시적 형 변환을 수행해야 함

 

컨테이너가 모든 객체의 라이프사이클을 관리하기 때문에 내부 동작을 잘 이해하면 프로그래밍이 쉬워짐

 

* MVC를 사용하는 이유

모델은 자신이 처리한 결과를 누가 쓰는지 모름

뷰는 자신이 사용하는 데이터를 누가 생성한지 모름

둘을 연결하는 것이 컨트롤러

loosely하게 결합해서 어느 한 쪽의 변화가 다른 쪽의 변화를 유발하지 않도록 함

내부 구현이 어떻게 되는지 관계없음

MVC는 디자인 패턴이 아닌 아키텍처 패턴

Comments