[필기정리]Day76-3 - 저장영역(page, request, session, application)

Web/JSP

2020. 10. 14. 21:02

# 저장영역

   객체의 유효기간, 객체를 누구와 공유할 것인가를 나타냄

   

① page 영역

    한 번의 클라이언트 요청에 대해 하나의 JSP 페이지 호출

ㄴ pageContext 객체 : 주로 다른 내장 객체를 구하거나, 페이지의 흐름 제어, 에러 데이터를 얻어낼 때 사용됨

// pageContext 내장 객체의 메소드

메소드 설명
ServletRequest
getRequest()
페이지 요청 정보 가지고 있는 request 내장 객체 리턴
ServletResponse getResponse()  페이지 요청에 대한 응답 정보 가지고 있는 response 내장 객체 리턴 
JSPWriter getOut()  페이지 요청에 대한 출력 스트림인 out 내장 객체 리턴
HttpSession getSession()  요청한 웹 브라우저의 세션 정보를 담고 있는 session 내장 객체 리턴 
ServletContext getServletContext() 페이지에 대한 서블릿 실행 환경 정보를 담고 있는 application 내장 객체 리턴
Object getPage() page 내장 객체 리턴
ServletConfig getServletConfig() 해당 페이지의 서블릿 초기 정보 설정 정보를 담고 있는 config 내장 객체 리턴
Exception getException() 페이지 실행 중 발생되는 에러 페이지에 대한 예외 정보를 갖고 있는 exception 내장 객체 리턴

 

② request 영역  ex) 페이지 모듈화

    한 번의 클라이언트 요청에 대해 같은 요청을 공유하는 페이지 대응

    include 액션태그, forward 액션태그 사용 시 request 기본객체를 공유하게 되어 같은 request 영역이 됨

   

  // request 내부 객체의 요청 파라미터 관련 메소드

메소드 설명
String getParameter(name) 파라미터 변수 name에 저장된 변수를 얻어내는 메소드
변수값은 String으로 리턴 
String[] getParameterValues(name) 파라미터 변수 name에 저장된 모든 변수값을 얻어내는 메소드
변수값은 String으로 리턴
checkbox에서 주로 사용
Enummeration getParameterNames() 요청에 의해 넘어오는 모든 파라미터 변수를 java.util.Enumeration타입으로 리턴 
이름을 모르고도 가능

// request 내장 객체의 웹 브라우저, 웹 서버의 요청 헤더의 정보 관련 메소드

메소드 설명
String getProtocol() 웹 서버로 요청 시, 사용중인 프로토콜 리턴
String getServerName() 웹 서버로 요청 시, 서버의 도메인명 리턴
String getMethod() 웹 서버로 요청 시, 요청에 사용된 요청 방식 리턴
String getQueryString() 웹 서버로 요청 시, 요청에 사용된 QueryString 리턴
String getRequestURI() 웹 서버로 요청 시, 요청에 사용된 URL로부터 URI값 리턴
String getRemoteAddr() 웹 서버로 정보를 요청한 웹 브라우저 IP주소 리턴
int getServerPort() 웹 서버로 요청 시, 서버 Port번호 리턴
String getContextPath() 해당 JSP 페이지가 속한 웹 어플리케이션 콘텍스트 경로 리턴
String getHeader(name) 웹 서버로 요청 시, HTTP 요청 헤더의 name에 해당하는 속성값 리턴
Enumeration getHeaderNames() 웹 서버로 요청 시, HTTP 요청 헤더의 모든 헤더 이름 리턴 

 

③ session 영역

    하나의 웹 브라우저 당 1개의 session 객체 생성

    같은 웹 브라우저 내에 요청되는 페이지들은 같은 객체를 공유하게 됨

    기본값이 true이기 때문에 세션 사용 가능한 것

// session 내장 객체의 메소드

메소드 설명
String getId() 해당 웹 브라우저에 대한 고유 세션ID 리턴
long getCreationTime() 해당 세션 생성 시간 리턴
long getLastAccessedTime() 웹 브라우저 요청이 시도된 마지막 접근시간 리턴
void setMaxInactiveInterval(time) 해당 세션 유지 시간 초단위 설정
int getMaxInactiveInterval() 기본값 30분, setMaxInactiveInterval(time) 지정 값 리턴
boolean isNew() 새로 생성된 세션의 경우 true값 리턴
void invalidate() 현재 정보의 유지로 사용 시 설정된 세성 속성값 모두 제거
세션 무효화 시 사용 

 

④ application 영역

    하나의 웹 어플리케이션 당 1개의 application 객체 생성

    같은 웹 어플리케이션에 요청되는 페이지들은 같은 객체를 공유하게 됨

 

// application 내장 객체의 메소드

메소드 설명
String getServerInfo() 웹 컨테이너 이름, 버전 리턴
String getMimeType(fileName) 지정 파일의 MIME타입 리턴
String RealPath(path) 지정 경로를 웹 어플리케이션 시스템 상의 경로로 변경해 리턴
void log(message) 로그 파일에 메시지 기록

 

ex) 저장영역

- web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>TestArea</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
	<servlet>
		<servlet-name>My01_01</servlet-name>
		<servlet-class>Round15_01_ReqArea_01</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>My01_02</servlet-name>
		<servlet-class>Round15_01_ReqArea_02</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>My02_01</servlet-name>
		<servlet-class>Round15_02_SesArea_01</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>My02_02</servlet-name>
		<servlet-class>Round15_02_SesArea_02</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>My02_03</servlet-name>
		<servlet-class>Round15_02_SesArea_03</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>My03_01</servlet-name>
		<servlet-class>Round15_03_Cookie_01</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>My03_02</servlet-name>
		<servlet-class>Round15_03_Cookie_02</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>My04_01</servlet-name>
		<servlet-class>Round15_04_ServletContext_01</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>My04_02</servlet-name>
		<servlet-class>Round15_04_ServletContext_02</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>My01_01</servlet-name>
		<url-pattern>/Servlet01_01</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>My01_02</servlet-name>
		<url-pattern>/Servlet01_02</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>My02_01</servlet-name>
		<url-pattern>/Servlet02_01</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>My02_02</servlet-name>
		<url-pattern>/Servlet02_02</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>My02_03</servlet-name>
		<url-pattern>/Servlet02_03</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>My03_01</servlet-name>
		<url-pattern>/Servlet03_01</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>My03_02</servlet-name>
		<url-pattern>/Servlet03_02</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>My04_01</servlet-name>
		<url-pattern>/Servlet04_01</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>My04_02</servlet-name>
		<url-pattern>/Servlet04_02</url-pattern>
	</servlet-mapping>  
</web-app>

- Round15_01_ReqArea_01.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.*;//Vector 사용을 위해...

public class Round15_01_ReqArea_01 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		//여기는 웹 페이지의 내용 작성 없이 바로 다음 페이지로 넘어 간다.
		
		String data1 = new String("java!");
		//문자열 데이터를 작성한다.
		Vector<String> data2 = new Vector<String>();
		//Vector 객체를 생성하고
		data2.add("c");		
		data2.add("c++");
		//두개의 문자열을 추가한다.
		
		request.setAttribute("data1", data1);
		//request scope에 data1 이라는 이름으로 문자열 데이터를 저장한다.
		request.setAttribute("data2", data2);
		//request scope에 data2 라는 이름으로 Vector 데이터를 저장한다.
		
		ServletContext context = this.getServletContext();
		//ServletContext 객체를 생성한 후
		RequestDispatcher dispatcher = context.getRequestDispatcher("/Servlet01_02?data3=string&data4=ok");
		//forward를 위한 RequestDispatcher 객체를 생성한다. 
		//객체 생성시 주소줄에 Query String으로 data3=string&data4=ok 라는 문자열을 넣어 준다.(문자열만 가능하다.)
		dispatcher.forward(request, response);
		//Servlet01_02 라는 주소로 forward 이동한다.
		//forward 이동은 sendRedirect와는 다르게 저장된 모든 값을 가지고 이동한다.
	}
}

- Round15_01_ReqArea_02.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.*;//Vector를 사용하기 위해..

public class Round15_01_ReqArea_02 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
	//forward 전송을 받기 위해서 doGet 메서드를 사용해야 한다.(Get 방식의 전송이다.) 
		
		String data1 = (String)request.getAttribute("data1");
		//request scope에 data1이라는 이름으로 저장된 문자열 데이터 추출
		Vector data2 = (Vector)request.getAttribute("data2");
		//request scope에 data2라는 이름으로 저장된 Vector 데이터 추출
		String data3 = request.getParameter("data3");
		//Query String으로 넘어온 data3이라는 이름의 문자열
		String data4 = request.getParameter("data4");
		//Query String으로 넘어온 data4라는 이름의 문자열
		
		response.setContentType("text/html;charset=utf-8");
		//출력 객체에 대한 Encoding 처리
		
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<body>");
		
		out.println("data1 = " + data1 + "<br/>");
		
		out.println("data2 = ");
		for(int i = 0; i < data2.size(); ++i) {
			out.println(data2.get(i) + "&nbsp;&nbsp;");
		}
		//Vector 속에 들어 있는 모든 데이터 출력...
		//Generic으로 인해 String 형변환 필요 없이 출력 가능...
		
		out.println("<br/>");
		out.println("data3 = " + data3 + "<br/>");
		out.println("data4 = " + data4 + "<br/>");
		
		out.println("</body>");
		out.println("</html>");
	}
}

- Round15_02_SesArea_01.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.*;//Calendar 클래스 사용을 위해...

public class Round15_02_SesArea_01 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		request.setAttribute("data1", "홍길동");
		//request scope에 data1이라는 이름으로 문자열 저장
		
		HttpSession session = request.getSession(true);
		//request 객체로 부터 session 객체 획득
		//매개변수 true는 새로운 Session을 생성하라는 의미
		session.setAttribute("data2", "자바");
		//session scope에 data2라는 이름으로 문자열 저장
		Calendar data3 = Calendar.getInstance();
		//오늘 날짜를 위한 Calendar 객체 생성
		session.setAttribute("data3", data3);
		//session scope에 data3이라는 이름으로 오늘 날짜의 Calendar 객체 저장
		
		ServletContext context = this.getServletContext();
		RequestDispatcher dispatcher = context.getRequestDispatcher("/Servlet02_02");
		dispatcher.forward(request, response);
		//Servlet02_02 이름으로 맵핑된 주소로 forward
	}
}

- Round15_02_SesArea_02.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.*;//Calendar 클래스 사용을 위해...
import java.text.*;//SimpleDateFormat 클래스 사용을 위해...

public class Round15_02_SesArea_02 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
	//forward에 의한 이동이므로 Get방식 메서드 호출
		String data1 = (String)request.getAttribute("data1");
		//request scope에 data1이라는 이름으로 설정된 데이터 추출
		HttpSession session = request.getSession();
		//request 객체로 부터 session 객체 획득
		String data2 = (String)session.getAttribute("data2");
		//session scope에 data2라는 이름으로 설정된 데이터 추출
		Calendar data3 = (Calendar)session.getAttribute("data3");
		//session scope에 data3이라는 이름으로 설정된 데이터 추출
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		//날짜 출력을 위한 format 클래스 객체 생성
		String data4 = format.format(data3.getTime());
		//날짜 출력을 위한 format 변환
		
		response.setContentType("text/html;charset=utf-8");		
		
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		
		out.println("data1 = " + data1 + "<br/>");
		out.println("data2 = " + data2 + "<br/>");
		out.println("data3 = " + data4 + "<br/><br/>");
		//각 데이터 출력
		
		out.println("<a href='Servlet02_03'>다음페이지로</a>");
		//다음 페이지로 이동하여 request scope의 데이터는 더 이상 존재하지 않는다는 것을 확인
		//session scope의 데이터는 웹 페이지가 사라질 때 까지 존재...
		
		out.println("</body></html>");
	}
}

- Round15_02_SesArea_03.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.util.*;//Calendar 클래스의 사용을 위해...
import java.text.*;//SimpleDateFormat 클래스의 사용을 위해...

public class Round15_02_SesArea_03 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
	//<a> 태그에 의한 호출이므로 doGet() 메서드 호출
		
		String data1 = (String)request.getAttribute("data1");
		//request scope에 data1이라는 이름으로 설정된 데이터 추출
		HttpSession session = request.getSession();
		//request 객체로 부터 session 객체 획득
		String data2 = (String)session.getAttribute("data2");
		//session scope에 data2라는 이름으로 설정된 데이터 추출
		Calendar data3 = (Calendar)session.getAttribute("data3");
		//session scope에 data3이라는 이름으로 설정된 데이터 추출
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		//날짜 출력을 위한 format 클래스 객체 생성
		String data4 = format.format(data3.getTime());
		//날짜 출력을 위한 format 변환
		
		response.setContentType("text/html;charset=utf-8");
		
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		
		out.println("data1 = " + data1 + "<br/>");
		//null 값 출력
		out.println("data2 = " + data2 + "<br/>");
		out.println("data3 = " + data4 + "<br/><br/>");
		//각 데이터 출력
		
		out.println("</body></html>");
	}
}

- Round15_03_Cookie_01.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Round15_03_Cookie_01 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		
		String id = "";
		//id가 쿠키로 저장되어 있다면 그것을 가져와 이 변수에 저장한다.
		boolean flag = false;
		Cookie[] cookies = request.getCookies();
		//사용자 컴퓨터에 이 서버가 저장해 둔 쿠키 파일의 내용을 배열로 획득해 온다.
		//데이터가 지금처럼 하나일 수도 있지만 여러 개 일수도 있다.
		//각 cookie의 데이터는 키와 값 이 Map 처럼 쌍으로 존재한다.
		for(int i = 0; cookies != null && i < cookies.length; ++i) {
		//cookies에 넘어온 쿠키 정보가 null이 아니라면 for문을 수행하면서 id라는 키를 찾아야 한다.
			String key = cookies[i].getName();
			if(key.equals("id")) {
			//key가 id라는 글자라면 당연히 우리가 심어둔 id의 값을 가지고 있을 것이다.
				id = cookies[i].getValue();
				//key가 id 이기 때문에 이 위치의 cookie가 해당 value를 가지고 있을 것이다.
				id = java.net.URLDecoder.decode(id, "utf-8");
				//id가 한글일때를 대비해 저장할 때 인코드 변환을 했으므로 
				//이번에는 디코드 변환을 해야 한다.
				flag = true;
			}
		}
		 
		
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();

		out.println("<html>");
		out.println("<head><title>Log In!</title></head>");
		out.println("<body>");
		out.println("<center>");

		out.println("<form method='post' action='Servlet03_02'>");
		//로그인 버튼을 누르면 web.xml에 등록된 Servlet03_02와 맵핑된 주소로 데이터들을 전송한다.
		out.println("<table border='1'>");
		out.println("<tr>");
		out.println("<td align='right' width='30%'>아뒤 : </td>");
		out.println("<td align='center'><input type='text' name='id' value='" + id + "' size='10'/></td>");
		//id 변수의 값을 html 문서상에 포함 시킨다.
		out.println("<td align='center' rowspan='2'><input type='submit' value='로그인'/></td>");
		out.println("</tr>");
		out.println("<tr>");
		out.println("<td align='right'>비번 : </td>");
		out.println("<td align='center'><input type='password' name='pw' size='9'/></td>");
		out.println("</tr>");
		out.println("<tr>");
		out.println("<td align='left' colspan='3'><input type='checkbox' name='id_rem' value='chk'");
		if(flag) out.print("checked");		
		out.println("/>아이디 기억하기</td>");
		//체크박스를 통해 이것이 체크되면 'chk'라는 값이 전달되도록 만든다.
		out.println("</tr>");
		out.println("</table>");
		out.println("</form>");

		out.println("</center>");
		out.println("</body>");
		out.println("</html>");
	}
}

- Round15_03_Cookie_02.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Round15_03_Cookie_02 extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		request.setCharacterEncoding("utf-8");
		
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String id_rem = request.getParameter("id_rem");
		
		System.out.println("id " + id + " pw " + pw + " id_rem " + id_rem );
		 
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html><body><center><h2>");
		out.println(id + "(" + pw + ")님 로그인 성공!!!");
		out.println("</h2></center></body></html>");
		
		if(id_rem != null && id_rem.equals("chk")) {
			System.out.println("쿠키저장");
		//아이디 기억하기 체크박스를 체크 했다면
			Cookie id_cookie = new Cookie("id", java.net.URLEncoder.encode(id, "utf-8"));
			//쿠키 객체를 생성한다. 
			//쿠키의 이름은 'id'로 설정하고 그 내용에 id의 실제 값을 담는다.
			//만약 id가 한글인 경우 encode 변환 후 담아야 한다.
			id_cookie.setComment("아이디 저장");
			//cookie에 대한 comment
			id_cookie.setPath("/");
			//모든 웹 페이지에서 사용 가능한 쿠키로 path 설정
			id_cookie.setMaxAge(60 * 60 * 24 * 365);
			//해당 cookie가 사용될 수 있는 최대 시간 60초 * 60분 * 24시간 * 365일 = 1년
			response.addCookie(id_cookie);
			//쿠키 데이터를 해당 클라이언트 컴퓨터의 Cookies 폴더에 저장 시킨다.
		}
		else {
			System.out.println("쿠키삭제1");
			Cookie[] cookies = request.getCookies();
			if(cookies !=null)
			{
				for(int i=0;i<cookies.length;i++)
				{
					String cookieName = cookies[i].getName();
					if(cookieName.equals("id"))
					{
						cookies[i].setPath("/");
						cookies[i].setMaxAge(0);						
						response.addCookie(cookies[i]);
					}
				}				
			}
		}
	}
}

- Round15_04_ServletContext_01.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Round15_04_ServletContext_01 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		String intro = "안녕하세요! 우리 서버에 오신것을 환영합니다.";
		//서버에 접속하는 모든 이들을 위한 인사 메시지이다.
		
		ServletContext context = this.getServletContext(); // 어플리케이션 영역
		//ServletContext의 객체를 생성한다.
		context.setAttribute("intro", intro);
		//ServletContext 영역에 intro 객체를 저장한다.
		//이렇게 저장된 데이터는 이 서버에 접속된 사용자 누구나 볼수 있게 된다.
		//서버가 종료 되어야 비로소 사라지게 된다.
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		out.println("ServletContext 데이터 생성 완료!");
		out.println("</body></html>");
	}
}

- Round15_04_ServletContext_02.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class Round15_04_ServletContext_02 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		
		ServletContext context = this.getServletContext();
		//ServletContext 객체를 생성한다.
		String intro = (String)context.getAttribute("intro");
		//ServletContext 영역에서 intro라는 key로 저장된 객체를 획득한다.
		
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
				
		out.println("<html><body>");
		out.println("서버의 인사말 = " + intro);
		//intro로 저장된 내용을 출력해 본다.
		//이 예제를 여러 대의 컴퓨터에서 실행해 보면 동일한 값을 출력한다는 사실을 알수 있을 것이다.
		out.println("</body></html>");
	}
}
728x90