# 저장영역
객체의 유효기간, 객체를 누구와 공유할 것인가를 나타냄
① 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) + " ");
}
//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>");
}
}
'Web > JSP' 카테고리의 다른 글
[개인실습] JSP로 회원형 게시판 만들기 (0) | 2020.10.19 |
---|---|
[필기정리]Day77 - include(), forward() 등 (0) | 2020.10.17 |
[필기정리]Day76-2 - ServletMapping, cookie 등 (0) | 2020.10.14 |
[필기정리]Day76-1 - doGet, doPost, service, 회원가입 구현 예시 등 (0) | 2020.10.14 |
[필기정리]Day75 - Servlet 생명주기, session 등 (0) | 2020.10.13 |