contents
PART 03 페이지 처리 기법
chapter 12 필터: 로그 기록하기
[필터 경유하여 서블릿이 실행되는 순서]
04.북마켓 로그 기록하기
PART 04 JSP 고급 문법
chapter 13 세션: 장바구니 페이지 만들기
01.세션의 개요
02.세션 생성
03.세션 정보
04.세션 삭제
05.세션 유효 시간 설정
06.북마켓 장바구니 페이지 만들기
------------------------------------------------------
PART 03 페이지 처리 기법
chapter 12 필터: 로그 기록하기
[필터 경유하여 서블릿이 실행되는 순서]
-Java 웹 애플리케이션에서 필터를 경유하여 서블릿이 실행되는 순서는 다음과 같음
1)클라이언트 요청:
사용자가 웹 브라우저에서 특정 URL에 접근하려고 요청을 보냄
2)필터 매핑:
웹 애플리케이션의 web.xml 파일이나 어노테이션을 통해 정의된 필터가 요청 URL과 매핑됨. 필터는 요청이 서블릿에 도달하기 전에 실행됨
3)필터 실행:
요청이 필터에 도달하면, 필터의 doFilter 메서드가 호출됨. 필터는 요청을 가로채어 필요한 전처리 작업을 수행할 수 있음. 예를 들어, 인증, 로깅, 요청 수정 등을 할 수 있음. 필터는 chain.doFilter(request, response) 메서드를 호출하여 다음 필터 또는 서블릿으로 요청을 전달함
4)서블릿 실행:
요청이 필터를 통과하면, 해당 요청을 처리하는 서블릿의 doGet 또는 doPost 메서드가 호출됨. 서블릿은 비즈니스 로직을 수행하고, 클라이언트에게 응답을 생성함
5)필터 후처리:
서블릿이 응답을 생성한 후, 다시 필터의 doFilter 메서드로 돌아옴. 필터는 응답을 가로채어 필요한 후처리 작업을 수행할 수 있음. 예를 들어, 응답 수정, 추가 헤더 설정 등을 할 수 있음
6)클라이언트 응답:
필터가 후처리를 완료하면, 최종적으로 클라이언트에게 응답이 전송됨. 이러한 순서로 필터와 서블릿이 상호작용하여 요청을 처리하게 됨. 필터는 요청과 응답을 가로채어 추가적인 처리를 할 수 있는 유용한 방법임
04.북마켓 로그 기록하기
-필터 처리 방법을 적용하여 로그 기록과 로그 기록 파일을 만듬
*Java
1)코드작성: extends -> 자동호출
implements
2)객체생성? 나중에(new)
미리(web.xml)
3)함수 호출
*controller : 미리 객체 생성->임의로 호출(x): 제어 못함, 특정 시점에 호출
filter
예제 12-4.필터 처리로 로그 기록하기
1)Filter 인터페이스의 구현 클래스 작성하기
BookMarket/src/mian/java/filter/LogFilter.java
package filter;
import java.io.IOException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; public class LogFilter implements Filter{ //필터 인터페이스: 상속 -> 오버라이딩 @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("BookMarket 초기화..."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println(" 접속한 클라이언트 IP : " + request.getRemoteAddr()); //전처리 long start=System.currentTimeMillis(); System.out.println(" 접근한 URL 경로 : " + getURLPath(request)); System.out.println(" 요청 처리 시작 시각 :" + getCurrentTime()); chain.doFilter(request, response); //본처리 long end = System.currentTimeMillis(); System.out.println(" 요청 처리 종료 시각 : " + getCurrentTime()); //후처리 System.out.println(" 요청 처리 소요 시간 : " + (end-start) + "ms "); } //response 가지고 클라이언트로 돌아감 @Override public void destroy() { } private String getURLPath(ServletRequest request) { HttpServletRequest req; String currentPath=""; String queryString=""; if(request instanceof HttpServletRequest) { //자식 객체of 부모 req=(HttpServletRequest)request; currentPath=req.getRequestURI(); queryString=req.getQueryString(); queryString=queryString==null ? "" : "?" + queryString; //3항 연산자 } return currentPath + queryString; } private String getCurrentTime() { DateFormat formatter=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Calendar calendar=Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); return formatter.format(calendar.getTime()); } } |
*chain.doFilter(request, response); => 다음 필터 혹은 컨트롤러로 이동
*intenceof: 개체 of ~의 일부(parts of): true/false 리턴 => 객체 타입을 알려줌
BookMarket/src/mian/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <display-name>BookMarket</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> <security-role> <description></description> <role-name>manager</role-name> </security-role> <security-constraint> <display-name>BookMarket Security</display-name> <web-resource-collection> <web-resource-name>BookMarket</web-resource-name> <description></description> <url-pattern>/addBook.jsp</url-pattern> </web-resource-collection> <auth-constraint> <description>관한 관리자명</description> <role-name>manager</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/login_failed.jsp</form-error-page> </form-login-config> </login-config> <error-page> <error-code>404</error-code> <location>/exceptionNoPage.jsp</location> </error-page> <filter> <filter-name>LogFilter</filter-name> <filter-class>filter.LogFilter</filter-class> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> |
cf) /* 전체 -> 필터거쳐가라
실행 결과
![]() |
에제 12-5.필터 처리로 로그 기록 파일 만들기
BookMarket/src/mian/java/filter/LogFileFilter.java
package filter;
import jakarta.servlet.*; import jakarta.servlet.http.*; import java.util.*; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.io.PrintWriter; import java.io.FileWriter; import java.io.IOException; public class LogFileFilter implements Filter{ PrintWriter writer; @Override public void init(FilterConfig config) throws ServletException { String filename=config.getInitParameter("filename"); if(filename==null) throw new ServletException("로그 파일의 이름을 찾을 수 없습니다."); try { writer=new PrintWriter(new FileWriter(filename, true), true); } catch(IOException e) { throw new ServletException("로그 파일을 열 수 없습니다."); } } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { writer.println(" 접속한 클라이언트 IP : " + request.getRemoteAddr()); long start=System.currentTimeMillis(); writer.println(" 접근한 URL 경로 : " + getURLPath(request)); writer.println(" 요청 처리 시작 시각 : " + getCurrentTime()); chain.doFilter(request, response); long end=System.currentTimeMillis(); writer.println(" 요청 처리 종료 시각 : " + getCurrentTime()); writer.println(" 요청 처리 소요 시간 : " + (end - start) + "ms "); writer.println(" ================================================== "); } @Override public void destroy() { writer.close(); } private String getURLPath(ServletRequest request) { HttpServletRequest req; String currentPath=""; String queryString=""; if(request instanceof HttpServletRequest) { req=(HttpServletRequest)request; currentPath=req.getRequestURI(); queryString=req.getQueryString(); queryString=queryString==null ? "" : "?" + queryString; } return currentPath + queryString; } private String getCurrentTime() { DateFormat formatter=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Calendar calendar=Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); return formatter.format(calendar.getTime()); } } |
BookMarket/src/mian/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" version="5.0"> <display-name>BookMarket</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> <security-role> <description></description> <role-name>manager</role-name> </security-role> <security-constraint> <display-name>BookMarket Security</display-name> <web-resource-collection> <web-resource-name>BookMarket</web-resource-name> <description></description> <url-pattern>/addBook.jsp</url-pattern> </web-resource-collection> <auth-constraint> <description>관한 관리자명</description> <role-name>manager</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/login_failed.jsp</form-error-page> </form-login-config> </login-config> <error-page> <error-code>404</error-code> <location>/exceptionNoPage.jsp</location> </error-page> <filter> <filter-name>LogFileFilter</filter-name> <filter-class>filter.LogFileFilter</filter-class> <init-param> <param-name>filename</param-name> <param-value>c:\\logs\\bookmarket.log</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFileFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> |
*logs 폴더 미리 만들어둠
실행 결과
![]() |
PART 04 JSP 고급 문법
chapter 13 세션: 장바구니 페이지 만들기
01.세션의 개요
-세션(session)은 클라이언트와 웹 서버 간의 상태를 지속적으로 유지하는 방법을 말함. 예를 들면 웹 쇼핑몰에서 장바구니나 주문 처리와 같은 회원 전용 페이지의 경우 로그인 인증을 통해 사용 권한을 부여함. 그래서 다른 웹 페이지에 갔다가 되돌아와도 로그인 상태가 유지되므로 회원 전용 페이지를 계속 사용할 수 있음. 이렇게 사용자 인증을 통해 특정 페이지를 사용할 수 있도록 권한 상태를 유지하는 것이 세션임
-세션은 웹 서버에만 접근이 가능하므로 보안 유지에 유리하며 데이터를 저장하는 데 한계가 없음. 세션은 오직 웹 서버에 존재하는 객체로 웹 브라우저마다 하나씩 존재하므로 웹 서버의 서비스를 제공받는 사용자를 구분하는 단위가 됨. 이러한 세션을 사용하면 클라이언트가 웹 서버의 세션에 의해 가상으로 연결된 상태가 됨. 따라서 웹 브라우저를 닫기 전까지 웹 페이지를 이동하더라도 사용자의 정보가 웹 서버에 보관되어 있어 사용자 정보를 잃지 않음
cf)가상: 물리적x, 논리적o ex) 돈-> 은행, 하드디스크->c/d 파티션
*데이터 저장
(1)Request <- String
(2)ArrayList <- 객체
(3)DTO(book) 멤버 -> 변수의 모음
(4)Session <- 객체
Session: Request와 유사: 객체 소멸시기 차이 -> 로그아웃, 종료
Request(나가면 끝, 객체 새로 생성)/ getParameter가짐
cf)TCP설정(창닫기): 종료
-이와 같이 JSP 페이지는 세션 기능을 사용할 수 있도록 session 내장 객체를 제공함. session 내장 객체는 다음과 같은 메소드를 지원함
◎session 내장 객체 메소드의 종류
메소드 | 반환 유형 | 설명 |
getAttribute(String name) | java.lang.Object | 세션 속성 이름이 name인 속성 값을 Object 형으로 반환함. 해당되는 속성 이름이 없을 때는 null을 반환함. 반화 값이 Object 형이므로 반드시 형 변환을 하여 사용해야 함 |
getAttributeNames() | java.util.Enumeration | 세션 속성 이름을 Enumeration 객체 타입으로 반환함 |
getCreationTime() | long | 세션이 생성된 시간을 반환함. 1970년 1월 1일 0시 0초부터 현재 세션이 생성된 시간까지 경과한 시간을 1/1,000초 값으로 반환함 |
getId() | java.lang.String | 세션에 할당된 고유 아이디를 String 형으로 반환함 |
getLastAccessedTime() | long | 해당 세션에 클라이언트가 마지막으로 request를 보낸 시간을 반환함 |
getMaxInactiveInterval(int interval) | int | 해당 세션을 유지하기 위해 세션 유지 시간을 반환함. 기본값은 1,800초(30분)임 |
isNew() | boolean | 해당 세션의 생성 여부를 반환함. 처음 생성된 세션이면 true를 반환하고 이전에 생성된 세션이면 false를 반환함 |
removeAttribute(String name, Object value) | void | 세션 속성 이름이 name인 속성을 제거함 |
setAttribute(String name, Object value) | void | 세션 속성 이름이 name인 속성에 value를 할당함 |
setMaxInactiveInteval(int interval) :(자동) 라이프사이클 | void | 해당 세션을 유지하기 위한 세션 유지 시간을 초 단위로 설정함 |
Invalidate() : (수동)로그아웃 | 현재 세션에 저장된 모든 세션 속성을 제거함 |
02.세션 생성: JSP 자동생성
-세션을 사용하려면 먼저 세션을 생성해야 함. 세션 생성은 session 내장 객체의 setAttribute() 메소드를 사용하며 형식은 다음과 같음. setAttribute() 메소드를 이용하여 세션의 속성을 설정하면 계속 세션 상태를 유지할 수 있음. 만약 동일한 세션의 속성 이름으로 세션을 생성하면 마지막에 설정한 것이 세션 속성 값이 됨
void setAttribute(String name, Object value) |
-첫 번째 매개변수 name은 세션으로 사용할 세션 속성 이름을 나태나며, 세션에 저장된 특정 값을 찾아오기 위한 키로 사용됨. 두 번째 매개변수 value는 세션의 속성 값을 나타냄. 세션 속성 값은 Object 객체 타입만 가능하기 때문에 int, double, char 등의 기본 타입은 사용할 수 없음
예제.세션 생성 순서
1)index.html에 <a> 태그 URL 작성하기
index.html
<!DOCTYPE html>
<html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <style> body{ padding-left: 30%; } </style> </head> <body> <h1>실습리스트</h1> <h3>챕터13</h3> <p><a href="ch13_1">실습 13-1</a></p> <p><a href="ch13_2">실습 13-2</a></p> <p><a href="ch13_3">실습 13-3</a></p> <p><a href="ch13_4">실습 13-4</a></p> <p><a href="ch13_7">실습 13-7</a></p> <p><a href="ch13_8">실습 13-8</a></p> </body> </html> |
2)@WebSerblet("/ch13_1") URL 경로 매핑하여 doGet 메서드 호출하기
JSPBook/src/main/java/controller/ch13/ch13_1_controller.java
package controller.ch13;
import java.io.IOException; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; @WebServlet("/ch13_1") public class ch13_1_controller extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { RequestDispatcher ds = req.getRequestDispatcher("ch13/login.jsp"); ds.forward(req, resp); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id = request.getParameter("id"); String pw = request.getParameter("pw"); HttpSession session=null; //세션 변수 if(id.equals("admin") && pw.equals("1234")) { System.out.println("일치함"); session = request.getSession(); //객체 생성: 3가지 방법 /(), (true) 같음: 없으면 새로 생성, 있으면 있는 것 그대로 씀 //session = request.getSession(true); //true 로그인 할 때 사용 : true나 false 하나는 지정해야함 //session = request.getSession(false); //없으면 null 있으면 있는 것 } String result = "세션에 포함된 데이터입니다."; String result2 = "리퀘스트에 포함된 데이터입니다."; session.setAttribute("data", result); request.setAttribute("data2", result2); //forward: 내부이동 request(o)/ sendRedirect: 외부이동 request(x) System.out.println(session.getId()); //f12 -> Network ->Headers -> cookie: JSESSIONID= 동일함 RequestDispatcher ds = request.getRequestDispatcher("ch13/result.jsp"); ds.forward(request, response); } } |
3)jsp 페이지의 폼 내용 입력하기->doPost로 이동: 세션 객체 생성(name=getParameter: key 일치)
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Session</title> </head> <body> <form name="loginForm" action="ch13_1" method="post"> <p> 사용자명: <input type="text" name="id"> <p> 비밀번호: <input type="password" name="pw"> <p> <input type="submit" value="전송"> </form> </body> </html> |
4)생성한 세션의 키 값 가져오기
result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% String data = (String)session.getAttribute("data"); //Object로 들어가기 때문에 캐스팅 해줘야함: 필수! String data2 = (String)request.getAttribute("data2"); %> <%=data %> <%=data2 %> </body> </html> |
실행 결과
![]() |
![]() |
![]() |
*session.getId( ); = [f12] -> Network ->Headers -> cookie: JSESSIONID= 동일함
예제 3-1.세션 생성하기
JSPBook/src/main/webapp/ch13/session01.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Session</title> </head> <body> <form name="loginForm" action="ch13_8" method="post"> <p> 사용자명: <input type="text" name="id"> <p> 비밀번호: <input type="password" name="pw"> <p> <input type="submit" value="전송"> </form> </body> </html> |
JSPBook/src/main/webapp/ch13/session01_process.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Session</title> </head> <body> <% String user_id = request.getParameter("id"); String user_pw = request.getParameter("pw"); if(user_id.equals("admin") && user_pw.equals("1234")) { session.setAttribute("userID", user_id); session.setAttribute("userPW", user_pw); out.println("세션 설정이 성공했습니다<br>"); out.println(user_id + "님 환영합니다"); }else{ out.println("세션 설정이 실패했습니다"); } %> </body> </html> |
실행 결과
![]() |
![]() |
◎세션을 생성하는 또 다른 방법
1)request.getSession()을 이용한 세션 생성: HTTPSession을 생성하는 또 다른 방법은 request 기본 객체의 getSession() 메소드를 사용하는 것임. request.getSession() 메소드는 현재 요청과 관련된 session 내장 객체를 반환함
<%@ page session="false" %> <% HTTPSession httpSession=request.getSession(); List list=(List)httpSession.getAttribute("list"); list.add(bookId); %> |
-request.getSession() 메소드는 세션이 생성되어 있으면 생성된 세션을 반환하고, 생성되어 있지 않으면 새롭게 세션을 생성해서 반환함
2)<%@ page session = "ture" %>를 이용한 세션 생성: page 디렉티브 태그 내 session 속성의 기본값이 true이므로 session 속성의 값을 false로 지정하지만 않으면 세션이 생성됨. 일단 세션이 생성되면 session 내장 객체를 통해 세션을 사용할 수 있음
<%@ page session="true" %> <% ··· (생략) ··· session.setAttribute("userInfo", userInfo); ··· (생략) ··· %> |
03.세션 정보
-생성된 세션의 정보를 얻어오려면 session 내장 객체의 getAttribute() 또는 getAttributeNames() 메소드를 사용함
1)단일 세션 정보 얻기
-세션에 저장된 하나의 세션 속성 이름에 대한 속성 값을 얻어오려면 getAttribute() 메소드를 사용하며 형식은 다음과 같음. getAttribute() 메소드는 반환 유형이 Object 형이므로 반드시 형 변환을 하여 사용해야 함
Object getAttribute(String name) |
-매개변수 name은 세션에 저장된 세션 속성 이름임. 해당 속성 이름이 없는 경우 null을 반환함.
-다음의 세션에 저장된 세션 속성 이름이 memberId인 세션 속성 값을 얻어오는 예임. getAtrribute() 메소드는 반환 유형이 Object형 이므로, 세션 속성 이름 memberId 값이 String 형의 admin이라면 cast 연산자인 (String)을 사용하여 형 변환을 해야 함. 만약 세샨에 memberID라는 속성 이름이 저장되어 있지 않으면 null을 반환함
[getAtrribute() 메소드 사용 예]
String id=(String)session.getAttribute("memberId "); |
예제 13-2.세션에 저장된 속성 값 가져와 출력하기
JSPBook/src/main/webapp/ch13/session02.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Session</title> </head> <body> <% String user_id=(String) session.getAttribute("userID"); String user_pw=(String) session.getAttribute("userPW"); out.println("설정된 세션의 속성 값[1] : " + user_id + "<br>"); out.println("설정된 세션의 속성 값[2] : " + user_pw); %> </body> </html> |
실행 결과
![]() |
2)다중 세션 정보 얻기: key 다 주세요!(모를 때)
-세션에 저장된 여러 개의 세션 속성 이름에 대한 속성 값을 얻어오려면 getAttributeNames() 메소드를 사용하며 형식은 다음과 같음. getAttributeNames() 메소드는 반환 유형이 Enumeration 객체 타입이므로 모든 세션 정보를 얻어오는 데 유용함. Enumeration 객체를 사용하려면 JSP 페이지에 page 디렉티브 태그의 import 속성을 사용하여 java.util.Enumeration을 설정해야함
Enumeration getAttributeNames(); |
-다음은 세션에 저장된 모든 세션 속성 이름과 속성 값을 얻어오는 예임
[getAttributeNames() 메소드 사용 예]
Enumeration enum=session.getAttributeNames(); while(enum.has.hasMoreElements(){ String name=enum.nextElement().toString(); String value=session.getAttribute(name).toString(); } cf) String value=(String) session.getAttribute(name); => 같음 |
예제 13-3.세션에 저장된 모든 세션 속성 이름과 속성 값 가져와 출력하기
JSPBook/src/main/webapp/ch13/session03.jsp
<%@ 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>Session</title> </head> <body> <% String name; String value; Enumeration en=session.getAttributeNames(); int i=0; while(en.hasMoreElements()){ i++; name=en.nextElement().toString(); value=session.getAttribute(name).toString(); out.println("설정된 세션의 속성 이름 [ " + i + " ] : " + name + "<br>"); out.println("설정된 세션의 속성 값 [ " + i + " ] : " + value + "<br>"); } %> </body> </html> |
실행 결과
![]() |
04.세션 삭제
-생성된 세션을 더 유지할 필요가 없으면 session 내장 객체의 removeAttribute() 또는 invalidat() 메소드를 사용하여 세션을 삭제함. 세션이 삭제되면 현재 사용 중인 session 내장 객체가 삭제되므로 session 내장 객체에 저장된 모든 속성도 함께 삭제됨
1)단일 세션 삭제하기
-세션에 저장된 하나의 세션 속성 이름을 삭제하려면 removeAttribute() 메소드를 사용하며 형식은 다음과 같음
void removeAttribute(String name) |
-여기서 매개변수 name은 세션에 저장된 세션 속성 이름임
-다음은 세션에 저장된 세션 속성 이름 memberId에 해당하는 세션을 삭제하는 예임. 세션 속성 이름이 memberId인 세션을 삭제하면 계속 유지되었던 세션의 속성 이름 memberId는 더 이상 사용할 수 없음
[removeAttribute() 메소드 사용 예]
session.removeAttribute("memberId:); |
예제 13-4.세션에 저장된 세션 속성 삭제하기
JSPBook/src/main/webapp/ch13/session04.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Session</title> </head> <body> <h4>----- 세션을 삭제하기 전 -----</h4> <% String user_id=(String) session.getAttribute("userID"); String user_pw=(String) session.getAttribute("userPW"); out.println("설정된 세션 이름 userID : " + user_id + "<br>"); out.println("설정된 세션 값 userPW : " + user_pw + "<br>"); session.removeAttribute("userID"); %> <h4>----- 세션을 삭제한 후 -----</h4> <% user_id=(String) session.getAttribute("userID"); user_pw=(String) session.getAttribute("userPW"); out.println("설정된 세션 이름 userID : " + user_id + "<br>"); out.println("설정된 세션 값 userPW : " + user_pw + "<br>"); %> </body> </html> |
![]() |
2)다중 세션 삭제하기
-세션에 저장된 모든 세션 속성 이름을 삭제하려면 invalidate() 메소드를 사용하며 형식은 다음과 같음
void invalidate() |
-다음은 세션을 종료하고 세션에 저장된 모든 세션 속성을 삭제하는 예임
[invalidate() 메소드 사용 예]
session.invalidatio() |
05.세션 유효 시간 설정
-세션 유효 시간은 세션을 유지하기 위한 세션의 일정 시간을 말함. 웹 브라우저에 마지막 접근한 시간부터 일정 시간 이내에 다시 웹 브라우저에 접근하지 않으면 자동으로 세션이 종료됨. 이러한 세션 유효 시간을 설정하기 위해 session 내장 객체의 setMaxInactiveInterval() 메소드를 사용하며 형식은 다음과 같음
void setMaxInactiveInterval(int interval) |
-여기서 매개변수 interval은 세션 유효 시간임. 세션 유효 시간은 기본값이 1,800초이고 초 단위로 설정함. 만역 세션 유효 시간을 0이나 음수로 설정하면 세션 유효 시간이 없는 상태가 됨. 이 경우 세션을 삭제했을 때 session.invalidate() 메소드를 호출하지 않으면 생성된 세션 속성이 웹 서버에서 제거되지 않고 유지됨. 즉 세션 유효 시간이 없는 상태에서 session.invalidate() 매소드를 명시적으로 실행하지 않으면 한 번 생성된 세션이 계속 메모리에 남아 있고, 시간이 흐르면 이 세션 때문에 메모리 부족 현상이 발생함
-다음은 세션 유효 시간을 360초로 설정하는 예임
[setMaxtInactiveInteral() 메소드 사용 예]
session.setMaxtInactiveInteral(60*60); |
예제 13-7.세션 유효 시간을 가져와 출력하기
JSPBook/src/main/webapp/ch13/session07.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Session</title> </head> <body> <h4>----- 세션 유효 시간 변경 전 -----</h4> <% int time=session.getMaxInactiveInterval() / 60; out.println("세션 유효 시간 : " + time + "분<br>"); %> <h4>----- 세션 유효 시간 변경 후 -----</h4> <% session.setMaxInactiveInterval(60*60); time=session.getMaxInactiveInterval() / 60; out.println("세션 유효 시간 : " + time + "분<br>"); %> </body> </html> |
실행 결과
![]() |
예제 13-8.세션 아이디와 웹 사이트에서 유지한 시간 출력하기
JSPBook/src/main/webapp/ch13/session08.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Session</title> </head> <body> <% String session_id=session.getId(); long last_time=session.getLastAccessedTime(); long start_time=session.getCreationTime(); long used_time=(last_time - start_time) / 60000; out.println("세션 아이디 : " + session_id + "<br>"); out.println("요청 시작 시간 : " + start_time + "<br>"); out.println("요청 마지막 시간 : " + last_time + "<br>"); out.println("웹 사이트의 경과 시간 : " + used_time + "<br>"); %> </body> </html> |
실행 결과
![]() |
06.북마켓 장바구니 페이지 만들기
-세션 처리 방법을 적용하여 장바구니 페이지를 만듬
예제 13-9.세션을 이용하여 장바구니 페이지 만들기
1)도서 클래스에 멤버 변수 추가하기
2)추가된 멤버 변수의 Setter/Getter() 메소드 작성하기
BookMarket/src/main/java/dto/Book.java
package dto;
import java.io.Serializable; public class Book implements Serializable{ private static final long serialVersionUID=-4274700572038677000L; private String bookId; //도서 ID private String name; //도서명 private int unitPrice; //가격 private String Author; //저자 private String description; //설명 private String publisher; //출판사 private String category; //분류 private long unitsInStock; //재고개수 private String releaseDate; //출판일(월/년) private String condition; //신제품 or 구제품 or 리퍼브제품 private String filename; //이미지 파일명 -------------------------- 추가 ------------------------------- private int quantity; //장바구니에 담은 개수 public Book() { super(); } public Book(String bookId, String name, int unitPrice) { super(); this.bookId = bookId; this.name = name; this.unitPrice = unitPrice; } public String getBookId() { return bookId; } public void setBookId(String bookId) { this.bookId = bookId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getUnitPrice() { return unitPrice; } public void setUnitPrice(int unitPrice) { this.unitPrice = unitPrice; } public String getAuthor() { return Author; } public void setAuthor(String author) { Author = author; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getPublisher() { return publisher; } public void setPublisher(String publisher) { this.publisher = publisher; } public String getCategory() { return category; } public void setCategory(String category) { this.category = category; } public long getUnitsInStock() { return unitsInStock; } public void setUnitsInStock(long unitsInStock) { this.unitsInStock = unitsInStock; } public String getReleaseDate() { return releaseDate; } public void setReleaseDate(String releaseDate) { this.releaseDate = releaseDate; } public String getCondition() { return condition; } public void setCondition(String condition) { this.condition = condition; } public static long getSerialversionuid() { return serialVersionUID; } public String getFilename() { return filename; } public void setFilename(String filename) { this.filename = filename; } -------------------------- 추가 ------------------------------- public int getQuantity() { return quantity; } public void setQuantity(int quantity) { this.quantity = quantity; } } |
3)도서 상세 정보 페이지 수정하기
BookMarket/src/main/webapp/book.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <%@ page import="dto.Book" %> <%@ page import="dao.BookRepository" %> <%@ page errorPage="exceptionNoBookId.jsp" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src="https://kit.fontawesome.com/fa848000d2.js" crossorigin="anonymous"></script> <link rel ="stylesheet" href ="./resources/css/bootstrap.min.css" /> <title>도서 상세 정보</title> -------------------------- 추가 ------------------------------- <script type="text/javascript"> function addToCart(){ if(confirm("도서를 장바구니에 추가하시겠습니까?")){ document.addForm.submit(); }else{ document.addForm.reset(); } } </script> </head> <body> <div class="container py-4"> <%@ include file="menu.jsp" %> <div class="p-5 mb-4 bg-body-tertiary rounded-3"> <div class="container-fluid py-5"> <h1 class="display-5 fw-bold">도서정보</h1> <p class="col-md-8 fs-4">BookInfo</p> </div> </div> <% String id=request.getParameter("id"); BookRepository dao=BookRepository.getInstance(); Book book=dao.getBookById(id); %> <div class="row align-items-md-stretch"> <div class="col-md-5"> <img src="./resources/images/<%=book.getFilename() %>" style="width : 70%"> </div> <div class="col-md-12"> <h3><b><%=book.getName() %></b></h3> <p> <%=book.getDescription() %> <p> <b>도서코드 : </b><span class="badge text-bg-danger"> <%= book.getBookId()%></span> <p> <b>저자</b> : <%=book.getAuthor() %> <p> <b>출판사</b> : <%=book.getPublisher() %> <p> <b>출판일</b> : <%=book.getReleaseDate() %> <p> <b>분류</b> : <%=book.getCategory() %> <p> <b>재고수</b> : <%=book.getUnitsInStock() %> <h4><%=book.getUnitPrice() %>원</h4> -------------------------- 추가 ------------------------------- <p> <form name="addForm" action="./addCart.jsp?id=<%=book.getBookId() %>" method="post"> <a href="#" class="btn btn-info" onclick="addToCart()">도서주문 »</a> <a href="cart.jsp" class="btn btn-warning">장바구니 »</a> <a href=" ./books.jsp" class="btn btn-secondary" >도서 목록 »</a> </form> </div> </div> <jsp:include page="footer.jsp" /> </div> </body> </html> |
4)장바구니에 등록하는 페이지 작성하기
BookMarket/src/main/webapp/addCart.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %> <%@ page import="dto.Book" %> <%@ page import="dao.BookRepository" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% String id=request.getParameter("id"); if(id==null || id.trim().equals("")){ response.sendRedirect("books.jsp"); return; } BookRepository dao=BookRepository.getInstance(); Book book=dao.getBookById(id); if(book==null){ response.sendRedirect("exceptionNoBookId.jsp"); } ArrayList<Book> goodsList=dao.getAllBooks(); Book goods=new Book(); for(int i=0; i<goodsList.size(); i++){ goods=goodsList.get(i); if(goods.getBookId().equals(id)){ break; } } ArrayList<Book> list= (ArrayList<Book>) session.getAttribute("cartlist"); if(list==null){ <!-- //로그인 후 첫 주문 --> list=new ArrayList<Book>(); session.setAttribute("cartlist", list); -> 장바구니 생성 } int cnt=0; Book goodsQnt=new Book(); for(int i=0; i<list.size(); i++){ goodsQnt=list.get(i); if(goodsQnt.getBookId().equals(id)){ cnt++; int orderQuantity=goodsQnt.getQuantity() +1; goodsQnt.setQuantity(orderQuantity); } } if(cnt==0){ goods.setQuantity(1); list.add(goods); } response.sendRedirect("book.jsp?id=" + id); %> </body> </html> |
(1)주소: 변수 선언
(2)내용 복사: 변수 선언=new
5)장바구니 페이지 작성하기
BookMarket/src/main/webapp/cart.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %> <%@ page import="dto.Book" %> <%@ page import="dao.BookRepository" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <script src="https://kit.fontawesome.com/fa848000d2.js" crossorigin="anonymous"></script> <link rel ="stylesheet" href ="./resources/css/bootstrap.min.css" /> <% String cartId=session.getId(); %> <title>장바구니</title> </head> <body> <div class="container py-4"> <%@ include file="menu.jsp" %> <div class="p-5 mb-4 bg-body-tertiary rounded-3"> <div class="container-fluid py-5"> <h1 class="display-5 fw-bold">장바구니</h1> <p class="col-md-8 fs-4">Cart</p> </div> </div> <div class="row align-items-md-stretch"> <div class="row"> <table width="100%"> <tr> <td align="left"><a href="./deleteCart.jsp?cartId=<%=cartId %>" class="btn btn-danger">삭제하기</a></td> <td align="right"><a href="#" class="btn btn-success">주문하기</a></td> </tr> </table> </div> <div style="padding-top: 50px"> <table class="table table-hover"> <tr> <th>도서</th> <th>가격</th> <th>수량</th> <th>소계</th> <th>비고</th> </tr> <% int sum=0; ArrayList<Book> cartList=(ArrayList<Book>) session.getAttribute("cartlist"); if(cartList==null) cartList=new ArrayList<Book>(); for(int i=0; i < cartList.size(); i++){ //상품리스트 하나씩 출력하기 Book book=cartList.get(i); int total=book.getUnitPrice()*book.getQuantity(); sum=sum + total; %> <tr> <td><%=book.getBookId() %> - <%=book.getName() %></td> <td><%=book.getUnitPrice() %></td> <td><%=book.getQuantity() %></td> <td><%=total %></td> <td><a href="./removeCart.jsp?id=<%=book.getBookId() %>" class="badge text-bg-danger">삭제</a></td> </tr> <% } %> <tr> <th></th> <th></th> <th>총액</th> <th><%=sum %></th> <th></th> </tr> </table> <a href="./books.jsp" class="btn btn-secondary">« 쇼핑 계속하기</a> </div> </div> <jsp:include page="footer.jsp" /> </div> </body> </html> |
6)장바구니에 등록된 개별 도서 삭제 페이지 작성하기
BookMarket/src/main/webapp/removeCart.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %> <%@ page import="dto.Book" %> <%@ page import="dao.BookRepository" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% String id=request.getParameter("id"); if(id==null||id.trim().equals("")){ response.sendRedirect("books.jsp"); return; } BookRepository dao=BookRepository.getInstance(); Book book=dao.getBookById(id); if(book==null){ response.sendRedirect("exceptionNoBookId.jsp"); } ArrayList<Book> cartList=(ArrayList<Book>) session.getAttribute("cartlist"); Book goodsQnt=new Book(); for(int i=0; i<cartList.size(); i++){ goodsQnt=cartList.get(i); if(goodsQnt.getBookId().equals(id)){ cartList.remove(goodsQnt); } } response.sendRedirect("cart.jsp"); %> </body> </html> |
7)장바구니에 등록된 전체 도서 삭제 페이지 작성하기
BookMarket/src/main/webapp/deleteCart.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <%@ page import="dto.Book" %> <%@ page import="dao.BookRepository" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% String id=request.getParameter("cartid"); if(id==null || id.trim().equals("")){ response.sendRedirect("cart.jsp"); return; } session.invalidate(); response.sendRedirect("cart.jsp"); %> </body> </html> |
실행 결과
![]() |
![]() |
'벡엔드 웹프로그래밍 > JSP' 카테고리의 다른 글
JSP 웹프로그래밍 68일차 (25/2/21) (0) | 2025.02.21 |
---|---|
JSP 웹프로그래밍 67일차 (25/2/20) (2) | 2025.02.20 |
JSP 웹프로그래밍 65일차 (25/2/18) (0) | 2025.02.18 |
JSP 웹프로그래밍 64일차 (25/2/17) (0) | 2025.02.17 |
JSP 웹프로그래밍 63일차 (25/2/14) (0) | 2025.02.14 |