관리 메뉴

거니의 velog

231109_JSP 개론 11 본문

대덕인재개발원_웹기반 애플리케이션

231109_JSP 개론 11

Unlimited00 2023. 11. 9. 08:36

[web.xml]

  <error-page>
  	<error-code>404</error-code>
  	<location>/exceptionNoPage.jsp</location>
  </error-page>

- http://localhost/product.jsp?id=P1238

등록되지 않은 상품의 코드를 요청시...

- http://localhost/abcd.jsp

404 오류...


[LogFilter.java]

package filter;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class LogFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("LogFilter 초기화...!");
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		System.out.println("LogFilter 실행...!");
		
		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");
		
	}
	
	// 접속 URL 정보를 가져온다.
	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 cal = Calendar.getInstance();
		cal.setTimeInMillis(System.currentTimeMillis());
		return formatter.format(cal.getTime());
	}
	
	@Override
	public void destroy() {
		System.out.println("LogFilter 해제...!");
	}

}

[LogFileFilter.java]

package filter;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class LogFileFilter implements Filter {
	
	PrintWriter writer;

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		System.out.println("LogFileFilter 초기화...!");
		String filename = filterConfig.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 {
		System.out.println("LogFileFilter 실행...!");
		
		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("=================================================");
	}
	
	// 접속 URL 정보를 가져온다.
	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 cal = Calendar.getInstance();
		cal.setTimeInMillis(System.currentTimeMillis());
		return formatter.format(cal.getTime());
	}
	
	@Override
	public void destroy() {
		System.out.println("LogFileFilter 해제...!");
		writer.close();
	}

}

[web.xml]

  <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>
  
  <filter>
  	<filter-name>LogFileFilter</filter-name>
  	<filter-class>filter.LogFileFilter</filter-class>
  	<init-param>
  		<param-name>filename</param-name>
  		<param-value>C:\\logs\\webmarket.log</param-value>
  	</init-param>
  </filter>
  <filter-mapping>
  	<filter-name>LogFileFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

- http://localhost/products.jsp


* 세션이 왜 서버에 속해 있는가? 제일 큰 이유? 보안 때문. 

* 브라우저를 보면 jsessonid가 있다. 이것은 세션인가 쿠키인가? 왜 세션이라 하는가? 

* 쿠키와 세션은 다름. 쿠키는 클라이언트, 세션은 서버

* 내가 브라우저를 켜고 어떤 플랫폼을 요청한다는 것은 서버를 거쳤다가 클라이언트 단으로 보여지는 것.

*  서버를 거쳤다가 나오는 과정에셔  jsesson 을 만들어냄. 이를 만든 사람은 개발자만 안다. 알 방법이 없다. 서버 안의 세션을 기반으로 만들어지는 쿠키. 

[session01.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html class="no-js" lang="zxx">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>쉽게 배우는 JSP 웹 프로그래밍</title>
    <meta name="description" content="" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <%@ include file="/pageModule/headPart.jsp" %>
</head>

<body>
    <%@ include file="/pageModule/header.jsp" %>

    <div class="breadcrumbs" style="padding-top:40px;">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">세션</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH13</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <section class="about-us section">
        <div class="container">
            <div class="row align-items-center justify-content-center">
                <div class="col-lg-12 col-md-12 col-12">
                    <div class="content-left wow fadeInLeft" data-wow-delay=".3s">
						<form action="session01_process.jsp" method="post">
							아이디 : <input type="text" name="id" /><br />
							비밀번호 : <input type="text" name="pw" /><br />
							<button type="submit">전송</button>
						</form>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <%@ include file="/pageModule/footer.jsp" %>

    <%@ include file="/pageModule/footerPart.jsp" %>
</body>

</html>

[session01_process.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html class="no-js" lang="zxx">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>쉽게 배우는 JSP 웹 프로그래밍</title>
    <meta name="description" content="" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <%@ include file="/pageModule/headPart.jsp" %>
</head>

<body>
    <%@ include file="/pageModule/header.jsp" %>

    <div class="breadcrumbs" style="padding-top:40px;">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">세션</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH13</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <section class="about-us section">
        <div class="container">
            <div class="row align-items-center justify-content-center">
                <div class="col-lg-12 col-md-12 col-12">
                    <div class="content-left wow fadeInLeft" data-wow-delay=".3s">
						<% 
							String id = request.getParameter("id");
							String pw = request.getParameter("pw");
							
							if(id.equals("admin") && pw.equals("1234")) {
								session.setAttribute("userId", id);
								session.setAttribute("userPw", pw);
								
								out.println("세션 설정이 성공했습니다!");
								out.println(id + "님 환영합니다!");
							}else {
								out.println("세션 설정이 실패했습니다!");
							}
						%>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <%@ include file="/pageModule/footer.jsp" %>

    <%@ include file="/pageModule/footerPart.jsp" %>
</body>

</html>

- http://localhost/ch13/session01.jsp



[session02.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html class="no-js" lang="zxx">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>쉽게 배우는 JSP 웹 프로그래밍</title>
    <meta name="description" content="" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <%@ include file="/pageModule/headPart.jsp" %>
</head>

<body>
    <%@ include file="/pageModule/header.jsp" %>

    <div class="breadcrumbs" style="padding-top:40px;">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">세션</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH13</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <section class="about-us section">
        <div class="container">
            <div class="row align-items-center justify-content-center">
                <div class="col-lg-12 col-md-12 col-12">
                    <div class="content-left wow fadeInLeft" data-wow-delay=".3s">
						<% 
							String userId = (String) session.getAttribute("userId");
							String userPw = (String) session.getAttribute("userPw");
							
							out.println("설정된 세션의 속성 값[1] : " + userId + "<br />");
							out.println("설정된 세션의 속성 값[2] : " + userPw);
						%>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <%@ include file="/pageModule/footer.jsp" %>

    <%@ include file="/pageModule/footerPart.jsp" %>
</body>

</html>

- http://localhost/ch13/session02.jsp


[session03.jsp]

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html class="no-js" lang="zxx">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>쉽게 배우는 JSP 웹 프로그래밍</title>
    <meta name="description" content="" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <%@ include file="/pageModule/headPart.jsp" %>
</head>

<body>
    <%@ include file="/pageModule/header.jsp" %>

    <div class="breadcrumbs" style="padding-top:40px;">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">세션</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH13</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <section class="about-us section">
        <div class="container">
            <div class="row align-items-center justify-content-center">
                <div class="col-lg-12 col-md-12 col-12">
                    <div class="content-left wow fadeInLeft" data-wow-delay=".3s">
						<% 
							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 />");
							}
						%>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <%@ include file="/pageModule/footer.jsp" %>

    <%@ include file="/pageModule/footerPart.jsp" %>
</body>

</html>

- http://localhost/ch13/session03.jsp


[session04.jsp]

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html class="no-js" lang="zxx">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>쉽게 배우는 JSP 웹 프로그래밍</title>
    <meta name="description" content="" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <%@ include file="/pageModule/headPart.jsp" %>
</head>

<body>
    <%@ include file="/pageModule/header.jsp" %>

    <div class="breadcrumbs" style="padding-top:40px;">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">세션</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH13</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <section class="about-us section">
        <div class="container">
            <div class="row align-items-center justify-content-center">
                <div class="col-lg-12 col-md-12 col-12">
                    <div class="content-left wow fadeInLeft" data-wow-delay=".3s">
                    	<h3>---------------------- 세션을 삭제하기 전 ----------------------</h3>
                    	<% 
							String userId = (String) session.getAttribute("userId");
							String userPw = (String) session.getAttribute("userPw");
							
							out.println("설정된 세션 값 userId : " + userId + "<br />");
							out.println("설정된 세션 값 userPw : " + userPw + "<br />");
							
							session.removeAttribute("userId"); // userId 세션을 삭제
						%>
                    	<h3>---------------------- 세션을 삭제하기 후 ----------------------</h3>
						<% 
							userId = (String) session.getAttribute("userId");
							userPw = (String) session.getAttribute("userPw");
							
							out.println("설정된 세션 값 userId : " + userId + "<br />");
							out.println("설정된 세션 값 userPw : " + userPw + "<br />");
						%>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <%@ include file="/pageModule/footer.jsp" %>

    <%@ include file="/pageModule/footerPart.jsp" %>
</body>

</html>

- http://localhost/ch13/session04.jsp


[session05.jsp]

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html class="no-js" lang="zxx">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>쉽게 배우는 JSP 웹 프로그래밍</title>
    <meta name="description" content="" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <%@ include file="/pageModule/headPart.jsp" %>
</head>

<body>
    <%@ include file="/pageModule/header.jsp" %>

    <div class="breadcrumbs" style="padding-top:40px;">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">세션</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH13</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <section class="about-us section">
        <div class="container">
            <div class="row align-items-center justify-content-center">
                <div class="col-lg-12 col-md-12 col-12">
                    <div class="content-left wow fadeInLeft" data-wow-delay=".3s">
                    	<h3>---------------------- 세션을 삭제하기 전 ----------------------</h3>
                    	<% 
                    		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 />");
                    		}
							
							session.removeAttribute("userId"); // userId 세션을 삭제
						%>
                    	<h3>---------------------- 세션을 삭제하기 후 ----------------------</h3>
						<% 
							en = session.getAttributeNames();
							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 />");
                    		}
						%>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <%@ include file="/pageModule/footer.jsp" %>

    <%@ include file="/pageModule/footerPart.jsp" %>
</body>

</html>

- http://localhost/ch13/session05.jsp


[session06.jsp]

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html class="no-js" lang="zxx">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>쉽게 배우는 JSP 웹 프로그래밍</title>
    <meta name="description" content="" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <%@ include file="/pageModule/headPart.jsp" %>
</head>

<body>
    <%@ include file="/pageModule/header.jsp" %>

    <div class="breadcrumbs" style="padding-top:40px;">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">세션</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH13</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <section class="about-us section">
        <div class="container">
            <div class="row align-items-center justify-content-center">
                <div class="col-lg-12 col-md-12 col-12">
                    <div class="content-left wow fadeInLeft" data-wow-delay=".3s">
                    	<h3>---------------------- 세션을 삭제하기 전 ----------------------</h3>
                    	<% 
							String userId = (String) session.getAttribute("userId");
							String userPw = (String) session.getAttribute("userPw");
							
							out.println("설정된 세션 값 userId : " + userId + "<br />");
							out.println("설정된 세션 값 userPw : " + userPw + "<br />");
							
							if(request.isRequestedSessionIdValid() == true) {
								out.println("세션이 유효합니다!");
							}else{
								out.println("세션이 유효하지 않습니다!");
							}
							
							session.invalidate(); // 세션 초기화(모든 세션 삭제)
						%>
                    	<h3>---------------------- 세션을 삭제하기 후 ----------------------</h3>
						<% 
							if(request.isRequestedSessionIdValid() == true) {
								out.println("세션이 유효합니다!");
							}else{
								out.println("세션이 유효하지 않습니다!");
							}
						%>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <%@ include file="/pageModule/footer.jsp" %>

    <%@ include file="/pageModule/footerPart.jsp" %>
</body>

</html>

- http://localhost/ch13/session06.jsp


[session07.jsp]

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html class="no-js" lang="zxx">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>쉽게 배우는 JSP 웹 프로그래밍</title>
    <meta name="description" content="" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <%@ include file="/pageModule/headPart.jsp" %>
</head>

<body>
    <%@ include file="/pageModule/header.jsp" %>

    <div class="breadcrumbs" style="padding-top:40px;">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">세션</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH13</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <section class="about-us section">
        <div class="container">
            <div class="row align-items-center justify-content-center">
                <div class="col-lg-12 col-md-12 col-12">
                    <div class="content-left wow fadeInLeft" data-wow-delay=".3s">
                    	<h3>---- 세션 유효 시간 변경 전 ----</h3>
                    	<% 
                    		int defaultTime = session.getMaxInactiveInterval();
                    		int time = session.getMaxInactiveInterval() / 60;
                    		
                    		out.println("세션 유효 시간(기본) : " + defaultTime + "<br />");
                    		out.println("세션 유효 시간 : " + time + "분<br />");
                    	%>
                    	<h3>---- 세션 유효 시간 변경 후 ----</h3>
                    	<% 
                    		session.setMaxInactiveInterval(60 * 60); // 1시간
                    		time = session.getMaxInactiveInterval() / 60;
                    		out.println("변경된 세션 유효 시간 : " + time + "분<br />");
                    	%>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <%@ include file="/pageModule/footer.jsp" %>

    <%@ include file="/pageModule/footerPart.jsp" %>
</body>

</html>

- http://localhost/ch13/session07.jsp


[session08.jsp]

<%@page import="java.util.Enumeration"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html class="no-js" lang="zxx">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="x-ua-compatible" content="ie=edge" />
    <title>쉽게 배우는 JSP 웹 프로그래밍</title>
    <meta name="description" content="" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <%@ include file="/pageModule/headPart.jsp" %>
</head>

<body>
    <%@ include file="/pageModule/header.jsp" %>

    <div class="breadcrumbs" style="padding-top:40px;">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">세션</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH13</li>
                    </ul>
                </div>
            </div>
        </div>
    </div>

    <section class="about-us section">
        <div class="container">
            <div class="row align-items-center justify-content-center">
                <div class="col-lg-12 col-md-12 col-12">
                    <div class="content-left wow fadeInLeft" data-wow-delay=".3s">
                    	<% 
                    		String sessionId = session.getId();
                    	
                    		long last_time = session.getLastAccessedTime();
                    		long start_time = session.getCreationTime();
                    		long used_time = (last_time - start_time) / 60000; // 경과시간 분 단위로 출력
                    		
                    		out.println("세션 아이디 : " + sessionId + "<br />");
                    		out.println("요청 시작 시간 : " + start_time + "<br />");
                    		out.println("요청 마지막 시간 : " + last_time + "<br />");
                    		out.println("웹 사이트에서 경과 시간 : " + used_time + "분<br />");
                    	%>
                    </div>
                </div>
            </div>
        </div>
    </section>

    <%@ include file="/pageModule/footer.jsp" %>

    <%@ include file="/pageModule/footerPart.jsp" %>
</body>

</html>

- http://localhost/ch13/session08.jsp


[product.jsp]

<form action="addCart.jsp?id=<%= product.getproductId() %>" method="post" name="addForm">
    <p>
        <a href="#" class="btn btn-info" onclick="addToCart()">상품 주문 &raquo;</a>
        <a href="cart.jsp" class="btn btn-warning">장바구니 &raquo;</a>
        <a href="products.jsp" class="btn btn-secondary">상품 목록 &raquo;</a>
    </p>
</form>
<script type="text/javascript">
	function addToCart(){
		if(confirm("상품을 장바구니에 추가하시겠습니까?")){
			document.addForm.submit();
		}else{
			document.addForm.reset();
		}
	}
</script>

- http://localhost/products.jsp


[addCart.jsp]

<%@page import="java.util.ArrayList"%>
<%@page import="vo.Product"%>
<%@page import="dao.ProductRepository"%>
<%@ page language="java" pageEncoding="UTF-8"%>
<%
	// 상품 ID 얻어오기
	String id = request.getParameter("id");

	// 상품 ID가 존재하지 않는 경우, 상품 목록 화면으로 이동
	if(id == null || id.trim().equals("")){
		response.sendRedirect("products.jsp");
		return;
	}
	
	// dao instance 얻어오기
	ProductRepository dao = ProductRepository.getInstance();
	
	// 상품 ID로 상품 조회
	Product product = dao.getProductById(id);
	if(product == null) {
		response.sendRedirect("exceptionNoProductId.jsp");
	}
	
	// 상품 전체 조회
	ArrayList<Product> goodsList = dao.getAllProducts();
	
	// 전체 목록에서 id에 해당하는 상품 꺼내기
	Product goods = new Product();
	for(int i = 0; i < goodsList.size(); i++) {
		goods = goodsList.get(i);
		if(goods.getproductId().equals(id)) {
			break;
		}
		// 상품 전체에서 id가 같은 상품일 때 for문을 끝낸다.
	}
	
	// 카트 목록 꺼내오기
	ArrayList<Product> list = (ArrayList<Product>) session.getAttribute("cartList");
	if(list == null) {
		list = new ArrayList<Product>();
		session.setAttribute("cartList", list);
	}
	
	// 세션에서 얻어온 cartList에서 index에 해당하는 product를 꺼내 goodsQnt 변수에 주소 전달
	// 그 주소에 같은 상품일 경우 수량만 카운팅해서 셋팅
	int cnt = 0;
	Product goodsQnt = new Product();
	for(int i = 0; i < list.size(); i++) {
		goodsQnt = list.get(i);
		if(goodsQnt.getproductId().equals(id)) {
			cnt++;
			int orderQuantity = goodsQnt.getQuantity() + 1;
			goodsQnt.setQuantity(orderQuantity);
		}
	}
	
	// 상품 수량이 0일 때 1개로 셋팅
	if(cnt == 0) {
		goods.setQuantity(1);
		list.add(goods);
	}
	
	response.sendRedirect("product.jsp?id="+id);
%>

[cart.jsp]

<%@ page pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="vo.Product"%>
<%@ page import="dao.ProductRepository"%>
<html>
<head>
<link rel="stylesheet" href="./resources/css/bootstrap.min.css" />
<title>장바구니</title>
</head>
<body>
	<%@ include file="menu.jsp" %>
	<% 
		String cartId = session.getId(); // 카트 ID 설정
	%>
	<div class="jumbotron">
		<div class="container">
			<h1 class="display-3">장바구니</h1>
		</div>
	</div>
	<div class="container">
		<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="./shoppingInfo.jsp?cartId=<%= cartId %>" 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<Product> cartList = (ArrayList<Product>) session.getAttribute("cartList");
					if(cartList == null) {
						cartList = new ArrayList<Product>();
					}
					
					for(int i = 0; i < cartList.size(); i++){
						Product product = cartList.get(i);
						int total = product.getUnitPrice() * product.getQuantity();
						sum = sum + total;
				%>
					<tr>
						<td><%= product.getproductId() %> - <%= product.getPname() %></td>
						<td><%= product.getUnitPrice() %></td>
						<td><%= product.getQuantity() %></td>
						<td><%= total %></td>
						<td><a href="./removeCart.jsp?id=<%= product.getproductId() %>" class="badge badge-danger">삭제</a></td>
					</tr>
				<%
					}
				%>
				<tr>
					<th></th>
					<th></th>
					<th>총액</th>
					<th><%= sum %></th>
					<th></th>
				</tr>
			</table>
			<a href="./products.jsp" class="btn btn-secondary"> &laquo; 쇼핑 계속하기</a>
		</div>
		<hr>
	</div>
	<%@ include file="footer.jsp" %>
</body>
</html>

- http://localhost/products.jsp

장바구니에 추가 버튼을 누르면 갯수가 카운트 된다.


breakpoint 설정
디버깅 모드로 접속

* 디버그 모드 단축키 잘 알아두기

* 다음 스텝으로 넘어가는 방법? f6

* f8은 디버깅 모드 종료

null인지 아닌지 체크!


[removeCart.jsp]

<%@page import="java.util.ArrayList"%>
<%@page import="vo.Product"%>
<%@page import="dao.ProductRepository"%>
<%@ page language="java" pageEncoding="UTF-8"%>
<%
	String id = request.getParameter("id");
	if(id == null || id.trim().equals("")) {
		response.sendRedirect("products.jsp");
		return;
	}
	
	ProductRepository dao = ProductRepository.getInstance();
	
	Product product = dao.getProductById(id);
	if(product == null) {
		response.sendRedirect("exceptionNoProductId.jsp");
	}
	
	ArrayList<Product> cartList = (ArrayList<Product>) session.getAttribute("cartList");
	Product goodsQnt = new Product();
	for(int i = 0; i < cartList.size(); i++) {
		goodsQnt = cartList.get(i);
		if(goodsQnt.getproductId().equals(id)) {
			cartList.remove(goodsQnt);
		}
	}
	
	response.sendRedirect("cart.jsp");
%>

[deleteCart.jsp]

<%@ page language="java" pageEncoding="UTF-8"%>
<%
	String id = request.getParameter("cartId");

	if(id == null || id.trim().equals("")){
		response.sendRedirect("cart.jsp");
		return;
	}
	
	session.invalidate();
	
	response.sendRedirect("cart.jsp");
%>

- http://localhost/cart.jsp

새로 등록한 상품도 잘 삭제됨...


08장 유효성 검사 : 상품 등록 데이터의 유효성 검사하기

	01. 유효성 검사란 무엇인가?
    
    	유효성 검사는 사용자가 폼 페이지에서 입력한 데이터 값이 서버로 전송되기 전에 특정 규칙에 맞춰 입력되었는지 검증하는 것을 말합니다.
        
    02. 유효성 검사를 위한 두 가지 처리 기법을 간단히 설명하시오.
    
    	1) 기본 유효성 검사는 사용자가 폼 페이지의 입력 항목에 입력한 데이터 값이 있는지 없는지 확인하고 데이터 길이, 숫자 등 기본적인 것이 맞는지 검사합니다.
        2) 데이터 유효성 검사는 사용자가 폼 페이지의 입력 항목에 입력한 데이터 값이 특정 형태에 적합한지 검사하기 위한 정규 표현식을 사용하는 방법으로
        	기본 유효성 검사보다 복잡합니다.
            
    03. 유효성 검사를 위한 핸들러 함수와 폼 페이지를 작성하는 기법을 설명하시오.
    
    	1) input 태그의 type 속성 값이 submit인 경우 onclick 속성을 이용하여 핸들러 함수를 설정합니다. (위 이벤트는 불가 - 컨트롤 제한 있음)
        	또는 form 태그의 onsubmit 속성 값에 설정합니다.
        	*** 우리는 input type 속성 값이 submit인 경우 버튼 내 click 이벤트를 가지고 컨트롤 하지 않는다고 했습니다.
            	우리가 생각하는 이벤트 컨트롤이 정말 쉽지 않기 때문에 submit 버튼에 클릭 이벤트를 주지 않고 준다 하더라도 form 태그를 활용한
                submit 이벤트로 컨트롤 하겠다고 정의했습니다.
                
        2) 자바 스크립트를 이용하여 스크립트 태그 내에 핸들러 함수를 작성합니다
        
        3) 폼 페이지에서 입력된 데이터 값을 핸들러 함수로 가져오기 위해 form 태그의 name 속성 또는 forms 객체를 이용합니다.
        	forms 객체를 이용하는 경우, forms 객체는 배열의 형태이기 때문이 length로 크기를 알 수 있고 배열 값인 index는 form 태그가
            나타내는 순서로 0부터 시작합니다.
            
10장 시큐리티 : 상품 페이지의 보안 처리하기

	01. 시큐리티란 무엇인가?
    
    	시큐리티는 허가된 사용자만이 특정 웹 페이지에 접근할 수 있도록 제한하는 보안 기능을 말합니다.
        시큐리티는 사용자가 권한이 없는 데이터에 접근하는 것을 막거나 웹 공격자가 전송 데이터를 중간에 가로채는 것을 방지하는 등 중요한 역할을 합니다.
        
    02. 시큐리티의 두 가지 기법에 대해 간단히 설명하시오.
    
    	1) 선언적 시큐리티
        	웹 애플리케이션 배포 설명자(web.xml)파일에 보안 구성을 작성하여 수행하는 방식입니다.
            web.xml 파일에는 보안 역할, 보안 제약 사항, 인증 처리 등을 설정하여 보안을 구성합니다.
            
        2) 프로그래밍적 시큐리티는 웹 애플리케이션의 보안을 위해 코드를 작성하여 사용자의 권한 부여를 처리하는 방식입니다.
        	선언적 시큐리티의 보안으로 충분하지 않을 때 request 내장 객체의 메소드를 사용하여 사용자를 승인하는 방법입니다.
            
    03. form 기반 인증 처리 방법으로 로그인 페이지를 작성하는 방법을 설명하시오.
    
    	-------------------------------------------------------------------------
         속성 이름                         | 속성 값
        -------------------------------------------------------------------------
        form 태그의 action 속성            | j_security_check
        사용자의 name 속성                 | j_username
        비밀번호의 name 속성               | j_password
        -------------------------------------------------------------------------
        
11장 예외 처리 : 예외 처리 페이지 만들기

	01. 예외 처리란 무엇인가?
    
    	예외처리는 프로그램이 처리되는 동안 특정한 문제가 발생했을 때 처리를 중단하고 다른 처리를 하는 것으로 오류 처리라고 합니다.
        
    02. page 디렉티브 태그를 이용한 예외처리 기법에 사용되는 속성에 대해 설명하시오.
    
    	1) errorPage 속성으로 오류 페이지 호출하기
        	errorPage 속성은 오류 페이지를 호출하는 page 디렉티브 태그의 속성으로 형식은 다음과 같습니다.
            <%@ page errorPage="오류 페이지 URL" %>
        
        2) isErrorPage 속성으로 오류 페이지 만들기
        	isErrorPage 속성은 현재 JSP 페이지를 오류 페이지로 호출하는 page 디렉티브 태그의 속성으로 형식은 다음과 같습니다.
            <%@ page isErrorPage="오류 페이지 URL" %>
            
    03. web.xml 파일을 이용한 예외 처리 기법에 대해 설명하시오.
    
    	1) 오류 코드로 오류 페이지 호출하기
        <error-page>
        	<error-code>오류 코드</error-code>
            <location>오류 페이지의 URI</location>
        </error-page>
        
        2) 예외 유형으로 오류 페이지 호출하기
        <error-page>
        	<exception-type>예외 유형</exception-type>
            <location>오류 페이지의 URI</location>
        </error-page>
        
12장 필터 : 로그 기록하기

	01. 필터란 무엇인가?
    
    	필터는 클라이언트와 서버 사이에서 request와 response 객체를 먼저 받아 사전/사후 작업 등 공통적으로 필요한 부분을 처리하는 것을 말합니다.
        
    02. Filter 인터페이스에 있는 메소드의 종류와 기능을 설명하시오.
    
    	init() : 필터 인스턴스의 초기화 메소드입니다.
        doFilter() : 필터 기능을 작성하는 메소드입니다.
        destroy() : 필터 인스턴스의 종료 전에 호출되는 메소드입니다.
        
    03. web.xml 파일에 필터를 구성하는 요소의 종류를 설명하시오.
    
    	1) <filter>
        웹 애플리케이션에서 자바 필터와 매개변수를 설정하는 데 사용
        <filter>
        	<filter-name>필터 이름</filter-name>
            <filter-class>클래스 위치 및 이름(패키지 포함)</filter-class>
            [
            	<init-param>
                	<param-name>매개변수 이름</param-name>
                    <param-value>매개변수 값</param-value>
                </init-param>
            ]
        </filter>
        
        2) <filter-mapping>
        특정 리소스에 대해 어떤 필터를 사용할 지 설정하는 데 사용
        <filter-mapping>
        	<filter-name>필터 이름</filter-name>
            <url-pattern>요청 URL 패턴</url-pattern>
        </filter-mapping>

'대덕인재개발원_웹기반 애플리케이션' 카테고리의 다른 글

231110_JSP 개론 12  (0) 2023.11.10
231109_CRUD 과제  (1) 2023.11.09
231108_JSP 개론 10  (0) 2023.11.08
231107_JSP 과제 5  (0) 2023.11.07
231107_JSP 개론 9  (0) 2023.11.07