학교/JAVA

07) JSP 내장 객체 종류

서윤-정 2023. 12. 14. 11:14

 

💜 내장 객체 (Implicit Object)

- JSP에 의해 미리 정의된 객체

- JSP 페이지 내에서 변수 선언 없이 이용 가능한 객체

- 별도의 선언 없이 이용 가능

- 지정된 값으로만 이용 가능 (변수 이름 수정 불가)

 

- 변수 없이 사용될 수 있는 이유?

--> JSP 컨테이너에 의해 자동으로 추가되고 초기화됨(_jspService() 함수 생성 코드 참고)

 

 

 

💛 내장 객체의 종류

 

 

 

1️⃣ request 객체

- HTTP 요청 메시지의 쿼리 스트링 처리 관련 API

- getParameter() 함수가 대표적으로 이용

 

 

 

* HTTP 요청 메시지 헤더 처리 관련 API 

- getHeader() 함수가 주로 이용

 

 

* HTTP 요청 메시지 헤더 출력 예제

(getHTTPHeaders.jsp)

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%@ page import="java.util.Enumeration" %>
<%
Enumeration<String> en = request.getHeaderNames();
while (en.hasMoreElements()) {
String name = (String) en.nextElement();
String value = request.getHeader(name);
out.print(name + ": " + value + "<br>");
}
%>

 

 

 

 

 

2️⃣ response 객체

- HTTP 응답 메시지의 헤더 처리 관련 API

 

 

 

* URL 리디렉션(Redirection) 예제 (1/2)

- 매월 12일이 되면 시스템 정기 점검을 알리는 페이지인 underCheck.jsp로 이동

(login.jsp)

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%
Date now = new Date();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String date = df.format(now);
if (date.endsWith("12")) {
response.sendRedirect("underCheck.jsp");
return;
}
String uid = request.getParameter("id");
String res = "<h3>사용자 아이디: " + uid + "</h3>";
res += "<br>로그인 시간: " + now.toString();
out.print(res);
%>

 

* 예제 (2/2) 

(underCheck.jsp)

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%
String res = "<h3>매월 12일은 시스템 점검일니다.</h3>";
res += "<br>12일 이후 다시 이용해주세요.";
out.print(res);

 

 

* response.sendRedirect()

- 현재 실행 중인 JSP page의 실행을 중단하고 다른 Web page가 대신 호출되도록 만드는 기능

 

 

 

 

 

3️⃣ out 객체

- HTTP 응답 메시지의 바디 출력 관련 API

 

 

* JSP에서 변수 값을 출력하기 위한 두 가지 방법

- out.print() 함수 vs 표현식(Expression)

 

 

 

4️⃣ application 객체

- 서비스의 실행 기간 동안 유지될 필요가 있는 속성 값 설정

 

 

* 방문자 수 카운트 예제

- 서버 실행 시간 동안만 유지됨에 주의

(visitCount.jsp)

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%
String strcnt = (String) application.getAttribute("counter");
int count = (strcnt == null) ? 1 : Integer.valueOf(strcnt);
out.print("방문자수: " + count);
application.setAttribute("counter", String.valueOf(++count));
%>

 

 

 

 

 

* HTTP 프로토콜의 특징: Connectionless

- HTTP 메시지 간에 정보(쿼리 스트링)가 공유되지 않음

- 이 경우 로그인 이후, 다른 html 페이지에서 로그인 정보를 알기 어려움

 

 

 

 

5️⃣ session 객체

- 이름-값 형태의 데이터를 클라이언트 단위(IP 주소 + Agent)로 세션 테이블(HashMap)에 저장

- 데이터 유지 시간 지정 가능 (디폴트값: 30분)

 

 

 

* login.jsp 수정

- session.setAttribute()를 이용하여 아이디 정보를 세션 테이블에 저장

(login.jsp)

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%
String uid = request.getParameter("id");
if (uid == null) {
out.print("로그인 정보가 없습니다.");
}
else {
session.setAttribute("id", uid);
response.sendRedirect("main.jsp");
}
%>

 

* main.jsp 작성

-  session.setAttribute()를 이용하여 세션 테이블에 로그인 아이디가 존재하는지 체크

(main.jsp)

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%
String uid = (String) session.getAttribute("id");
if (uid == null) {
out.print("로그인 정보가 없습니다.");
}
else {
out.print("메인 페이지입니다.");
session.setAttribute("id", uid);
}
%>

 

 

* logout.jsp

- session.invalidate() 를 이용하여 세션 테이블에서 클라이언트 관련 데이터를 모두 삭제

(logout.jsp)

<%@ page contentType="text/html" pageEncoding="utf-8" %>
<%
session.invalidate();
out.print("로그아웃 하였습니다.");
%>

 

 

 

 

 

 

 

+ 세션과 쿠키

- Connectionless HTTP의 단점을 보완하기 위해 이름-값 형태의 데이터를 별도의 공간에 저장하여 해결하고자 한다는 점에서 유사

- 쿠키는 클라이언트에 저장된다는 점에서 차이

--> 사용자가 윈도우 탐색기 등을 통해 직접 열어볼 수 있으므로 보안이 필요없는 정보를 저장하는데 이용

--> 예를 들어, 사용자가 입력했던 정보를 기억해 둠으로써, 페이지가 업데이트 되었을 때 재입력 하지 않도록 편의를 제공하기 위한 목적으로 주로 활용

 

 

+ 웹페이지 이동시키기

1) 리다이렉트 방식

- 사용자 요청이 2번 이루어짐

- 사용 방법: response.sendRedirect("url");

 

2) 포워드 방식

- 사용자 요청이 1번 이루어짐

- 사용자 요청 정보는 request 객체 정보를 통해 공유됨

- 사용 방법:

-- (1) forward() 사용을 위한 RequestDispatcher 인스턴스 생성

RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
dispatcher.forward(request, response);

-- (2) requset.setAttribute(String, String), request.getAttribute(String)을 통해 추가적인 값 전달 가능