💜 내장 객체 (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)을 통해 추가적인 값 전달 가능
'학교 > JAVA' 카테고리의 다른 글
05) 서블릿 (0) | 2023.12.14 |
---|---|
06) JSP (0) | 2023.12.14 |
모바일 웹 서비스 구현을 위한 JSP 웹 프로그래밍 연습문제_07 JSP 내장 객체 (0) | 2023.12.13 |
모바일 웹 서비스 구현을 위한 JSP 웹 프로그래밍 연습문제_06 JSP (0) | 2023.12.13 |
모바일 웹 서비스를 위한 JSP 웹 프로그래밍 연습문제_05장 서블릿 (0) | 2023.12.13 |