WEB/✿JSP

[JSP] 🔗기본 객체

W_W_Woody 2022. 1. 6. 21:27

JSP가 제공하는 기본 객체 (내장 객체)

Servlet은 컨테이너가 인자를 넣어줘야하는 반면

jsp는 컨테이너가 미리 만들어놔서 만들어져있는 객체를 호출만하면 사용가능

 

 

 

기본객체 실제 타입 설명
request
javax.servlet.http.HttpServletRequest 클라이언트의요청정보를저장한다.
데이터 저장 / 사용 가능
response javax.servlet.http.HttpServletResponse 응답 정보를 저장한다.
pageContext javax.servlet.jsp.PageContext JSP페이지에 대한 정보를 저장한다.
데이터 저장 / 사용 가능
session javax.servlet.http.HttpSession HTTP 세션정보를저장한다.
데이터 저장 / 사용 가능
application javax.servlet.ServletContext 어플리케이션에 대한 정보를 저장한다.
데이터 저장 / 사용 가능
out javax.servlet.jsp.JspWriter JSP 페이지가 생성하는 결과를 출력할 사용되는 출력 스트림이다.
config javax.servlet.ServletConfig JSP 페이지에 대한 설정 정보를 저장한다.
page java.lang.Object JSP 페이지를 구현한 자바 클래스 인스턴스이다.
문법적으로 정의되어있지만 직접 호출할 일이 없음
exception java.lang.Throwable 예외 객체. 에러 페이지에서만 사용된다.

4개의 기본객체 request, pageContext, session, application은 속성을 갖고 있습니다

속성은 각각의 기본 객체가 존재하는 동안에 사용될수 있으며, JSP페이지 사이에서 정보를 주고 받거나 공유하기 위한 목적으로 사용된다.

이들은 속성처리 메서드를 제공하고 있으며, 메서드를 사용해서 속성을 추가하거나 속성의 값을 변경하거나, 또는 속성을 삭제 할 수 있다.

속성 처리 메서드

 메소드 리턴타입  설명 
setAttribute
  (String name, Object value)
 void 이름이 name 인 속성의 값을 value로 지정한다.
getAttribute(String name)  Object 이름이 name 속성의 값을 구한다.
지정한 이름의 속성이 존재하지 않을 경우 null을 리턴한다.
removeAttribute(String name)  void 이름이 name 속성을 삭제 합니다. 
getAttributeNames( )  java.util
 Enumeration
속성의 이름 목록을 구한다.

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=kimkwon429&logNo=220760918355 

 getParameter()와   getAttribute() 의 차이점

더보기

식별자 name값으로 데이터를 받는

request.getParameter("id");

지정한 이름의 속성의 값을 구하는

getAttribute(String name)

이 둘의 가장 큰 차이점은 리턴 타입이다.

 

getParameter()메서드의 경우 String타입을 리턴하는반면,
getAttribute()는 Object 타입을 리턴하기 때문에 주로 빈 객체나 다른 클래스를 받아올때 사용된다.

또한, getParameter()는 웹브라우저에서 전송받은 request영역의 값을 읽어오고

getAttribute()의 경우 setAttribute()속성을 통한 설정이 없으면 무조건 null값을 리턴한다.

◎ request  : 웹 브라우저가 웹 서버에 전송한 요청 관련 정보 제공

request의 주요 기능

클라이언트의 IP : <%= request.getRemoteAddr() %>

클라이언트의 아이피 주소를 구한다.
클라이언트와 서버가 같은 피씨(로컬환경)로 인식해서 아이피주소가 나온다.

요청정보 프로토콜 : <%= request.getProtocol() %>

프로토콜의 정보를 구해온다

- 요청정보 전송방식 : <%= request.getMethod() %>

전송방식을 구해온다

요청URL(Uniform Resoure Locator) : <%= request.getRequestURL() %>

URL = 인터넷 주소

전체 주소(절대 주소)출력
서버 바깥에서 호출 할 때, 서버의 자원을 탐색할때

요청URI(Uniform Resoure Identifier) : <%= request.getRequestURI() %>

컨텍스트루트(여기서는 /jspMain)로 부분 주소(상대 주소)출력
같은 서버 내에서는 부분 주소로 호출 한다.

컨텍스트 경로 : <%= request.getContextPath() %>

루트를 생략하고 링크가 가능하게 경로를  => uri형식

 

- 서버 이름 : <%= request.getServerName() %>

같은 피씨에 있기때문에 localhost출력

 

- 서버 포트 : <%= request.getServerPort() %>

톰캣 8081 테스트 포트
상용 서비스시 80

 

- 헤더 정보 : request.getHeaderNames() 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.Enumeration" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>헤더 목록 출력</title>
</head>

헤더에있는 모든 헤더이름을 Enumeration에 저장한다

.hasMoreElements() : 헤더명이있으면 계속 roop를 돈다

<body>
<%
	Enumeration headerEnum = request.getHeaderNames();
	while(headerEnum.hasMoreElements()){ 
		//헤더명
		String headerName = (String)headerEnum.nextElement();
		//헤더값 구하기
		String headerValue = request.getHeader(headerName);
%>
<%= headerName %> <%= headerValue %><br>
<% 
	}
%>

클라이언트가 서버쪽으로 많은 정보를 보내주고 서버에서 필요한 정보만 뽑아내서 쓴다.

 

 

◎ response  : 웹 브라우저에 전송하는 응답 정보 설정

 

response 주요 기능

  • 헤더 정보 입력
  • 리다이렉트 처리

- Redirect

 경로 변경 : response.sendRedirect(" "); 

response.sendRedirect("이동할 경로");

"/jspMain/ch03-nestedObject/s10_resposeB.jsp" 

→경로가같으면 파일명으로만 명시가능하다
→"s10_responseB.jsp"
redirect

redirect
forward

forward

다른 주소로 주소가 바뀐다.

responseA에서 호출하였으나 결과는 responseB가 호출되어져 나와있고 주소 또한 바뀌어있다.

리다이렉트작업을 수행하여 responseA은 전송하지않으므로 responseA에 HTML내용을 넣는건 무의미하다.

 

< forward 와 redirect 의 특징 비교 >

메서드 특징
forward

<jsp:forward />
같은 웹서버, 같은 웹 애플리케이션 디렉토리에 속하는 웹 자원만 호출 가능
request 내장 객체를 통해 데이터를 전달
redirect

response.sendRedirect()
다른 웹 서버에 있는 웹 자원도 호출할 수 있음
호출할 JSP페이지의 URL 뒤에 데이터를 붙여서 전달

forward → [JSP] 🔗include

 

 

◎ out  : JSP 페이지가 생성하는 모든 내용은 out 기본 객체를 통해서 전송

빈도수가 높진않고 필요하면 볼수 있는메서드들

out : 출력과 관계가 깊은 내장객체인데 그객체가 가지고있는 메서드들 

버퍼 크기 : <%= out.getBufferSize() %> <br>

남은 크기 : <%= out.getRemaining() %> <br>

auto flush : <%= out.isAutoFlush() %>

 

◎ pageContext  : 다른 기본 객체에 대한 접근 메서드 제공

일반적으로 사용되진 않고 객체에 데이터를 저장하고 필요할 경우에 꺼내쓸 때

 

◎ application  : 웹 어플리케이션에 대한 정보를 저장

servlet을 만들거나 jsp를 구동시켰을 때 글로벌한 객체(개별적인 servlet, jsp의 정보를 제공해줌)가 있는데

그 application에서 설정정보를 관리

???

 

기본 객체와 영역

기본 객체 영역(데이터를 가져다 쓸 수 있는 호출 영역)
pageContext page
: 하나의  jsp와 일대일 대응(하나의 JSP 페이지를 처리할 때 사용되는 영역)
제일 좁음
request request
: 하나의 HTTP 요청을 처리할 때 사용되는 영역
Inclued,forward 액션 태그를 사용해서 영역을 확장
session
[JSP] 🔗세션
session
: 하나
의 클라이언트(브라우저)와 일대일 대응
브라우저를 끄기 전까지 속성을 공유
타브라우저의 세션에는 접근못함
ex.회원제 서비스
application application
: 웹어플리케이션 1개당 1개의 어플리케이션 객체가 생성
브라우저(클라이언트)와 관계없이 어떠한 브라우저가 진입해도 모두 공유

(그래서 데이터의 왜곡이 생기는 문제가 생길 수 있다.)
일반데이터는 어플리케이션에 저장 안하고. 공유해도 문제없는 설정정보 같은 것을 저장한다.
영역이 제일 넓음

 pageContext는 페이지와 일대일 대응한다.

request도 마찬가지지만 액션태그로 영역을 확장시킬 수 있다.

session이 중요한데 사용자 한명에 대해서 

 

<body>
<%
				//속성명  속성값
	pageContext.setAttribute("msg1", "봄"); /* 속성을 저장 */
	request.setAttribute("msg2", "여름");
	session.setAttribute("msg3", "가을");
%>
<!-- page 영역으로 부터 msg1을 읽어온다 -->
pages 영역 msg1 = <%= pageContext.getAttribute("msg1") %> <br> <!-- 같은 페이지에서 읽어오기 --> 
request 영역 msg2 = <%=request.getAttribute("msg2") %> <br>
session 영역 msg3 = <%= session.getAttribute("msg3")%>
</body>

scopeA에서 저장한 page영역의 msg1을 읽어와보면

 

<body>
page 영역의 msg1 = <%= pageContext.getAttribute("msg1") %> <br> <!-- 못읽어온다 -->
<!-- 페이지 하나당 pageContext하나만 생성되기 때문이다
자신이 가지고 있는 pageContext에만 접근해서 읽어온다. 공유의 의미가 없음 -->

request 영역의 msg2 = <%= request.getAttribute("msg2") %> <br> <!-- 태그를 사용하면 공유범위넓어질 예정 -->
session 영역의 msg3 = <%= session.getAttribute("msg3") %>
<!-- scopeA실행하고 브라우저를 껐다가 scopeB 실행하면 
새롭게 세션이 생성되서 가을이 안나오고 null나온다. -->
</body>

 

<body>
<%
	application.setAttribute("user_id", "dragon");
%>
application에 속성 저장 완료!! <!-- 클라이언트와 상관없이 다 공유한다 -->
</body>

클라이언트와 상관없이 다공유한다 
브라우저를 껏다켜도 새로 생성 안돼고 새로 생성하려면 서버(톰캣)을 껐다 켜야한다.

<%@ page import="java.util.Enumeration" %>

<body>
<%
	//어플리캐이션의 속성명 모두 구하기
	Enumeration attrEnum  = application.getAttributeNames();
	while(attrEnum.hasMoreElements()){
		//속성명 구하기
		String name = (String)attrEnum.nextElement();
	//속성명이 객체형태로 관리되기때문에??
	Object Value = application.getAttribute(name);
%>
appliction 속성 : <b><%= name %></b> = <%= Value %> <br>
<% 
	}
%>
application에 속성 저장 완료!!
</body>