관리 메뉴

거니의 velog

231107_JSP 과제 5 본문

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

231107_JSP 과제 5

Unlimited00 2023. 11. 7. 13:23

[MemberVO.java]

package kr.or.ddit.ch11.vo;

public class MemberVO{
	private String mem_id;
	private String mem_pw;
	private String mem_name;
	private String mem_sex;
	
	public String getMem_id() {
		return mem_id;
	}
	public void setMem_id(String mem_id) {
		this.mem_id = mem_id;
	}
	public String getMem_pw() {
		return mem_pw;
	}
	public void setMem_pw(String mem_pw) {
		this.mem_pw = mem_pw;
	}
	public String getMem_name() {
		return mem_name;
	}
	public void setMem_name(String mem_name) {
		this.mem_name = mem_name;
	}
	public String getMem_sex() {
		return mem_sex;
	}
	public void setMem_sex(String mem_sex) {
		this.mem_sex = mem_sex;
	}
	
	@Override
	public String toString() {
		return "MemberVO [mem_id=" + mem_id + ", mem_pw=" + mem_pw + ", mem_name=" + mem_name + ", mem_sex=" + mem_sex
				+ "]";
	}
	
}

[MemberDAO.java]

package kr.or.ddit.ch11.dao;

import java.util.ArrayList;

import kr.or.ddit.ch11.vo.MemberVO;


public class MemberDAO{
	
	private ArrayList<MemberVO> memberList = new ArrayList<MemberVO>();
	private static MemberDAO instance = new MemberDAO();
	public static MemberDAO getInstance() {
		return instance;
	}
	
	public MemberDAO() {
		MemberVO memVo1 = new MemberVO();
		memVo1.setMem_id("qwer");
		memVo1.setMem_name("홍길동");
		memVo1.setMem_pw("1234");
		memVo1.setMem_sex("남성");
		
		MemberVO memVo2 = new MemberVO();
		memVo2.setMem_id("asdf");
		memVo2.setMem_name("강감찬");
		memVo2.setMem_pw("1234");
		memVo2.setMem_sex("남성");
		
		MemberVO memVo3 = new MemberVO();
		memVo3.setMem_id("zxcv");
		memVo3.setMem_name("성춘향");
		memVo3.setMem_pw("1234");
		memVo3.setMem_sex("여성");
		
		memberList.add(memVo1);
		memberList.add(memVo2);
		memberList.add(memVo3);
	}
	
	public ArrayList<MemberVO> getMemberList() {
		return memberList;
	}
	
	public MemberVO getMemberById(String mem_id) {
		MemberVO memberById = null;
		
		for(int i = 0; i < memberList.size(); i++) {
			MemberVO member = memberList.get(i);
			if(member != null && member.getMem_id() != null && member.getMem_id().equals(mem_id)) {
				memberById = member;
				break;
			}
		}
		return memberById;
	}

}

[BoardVO.java]

package kr.or.ddit.ch11.vo;

import java.util.List;

public class BoardVO implements Comparable<BoardVO>{
	private int no = 0;
	private String title;
	private String content;
	private String writer;
	private String regDate;
	private int hit = 0;
	private BoardFileVO fileVO;
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public String getRegDate() {
		return regDate;
	}
	public void setRegDate(String regDate) {
		this.regDate = regDate;
	}
	public int getHit() {
		return hit;
	}
	public void setHit(int hit) {
		this.hit = hit;
	}
	public BoardFileVO getFileVO() {
		return fileVO;
	}
	public void setFileVO(BoardFileVO fileVO) {
		this.fileVO = fileVO;
	}
	
	@Override
	public int compareTo(BoardVO board) {
		if (board.no < no) {
            return 1;
        } else if (board.no > no) {
            return -1;
        }
        return 0;
	}
	
	@Override
	public String toString() {
		return "BoardVO [no=" + no + ", title=" + title + ", content=" + content + ", writer=" + writer + ", regDate="
				+ regDate + ", hit=" + hit + ", fileVO=" + fileVO + "]";
	}
	
}

[BoardRepository.java]

package kr.or.ddit.ch11.dao;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;

import kr.or.ddit.ch11.vo.BoardFileVO;
import kr.or.ddit.ch11.vo.BoardVO;

public class BoardRepository {
	private static int no = 0;	// 게시글번호
	private static int fno = 0; // 파일 번호
	private ArrayList<BoardVO> listOfBoard = new ArrayList<BoardVO>();
	private static BoardRepository instance = new BoardRepository();

	public static BoardRepository getInstance(){
		return instance;
	} 

	public BoardRepository() {}

	public ArrayList<BoardVO> selectBoardList() {
		return listOfBoard;
	}
	
	public BoardVO getBoardById(int no) {
		BoardVO boardVO = null;

		for (int i = 0; i < listOfBoard.size(); i++) {
			BoardVO board = listOfBoard.get(i);
			if (board != null && board.getNo() == no) {
				boardVO = new BoardVO();
				boardVO = board;
				break;
			}
		}
		
		boardVO.setHit(boardVO.getHit() + 1);
		return boardVO;
	}
	
	public void deleteBoard(int no) {
		for (int i = 0; i < listOfBoard.size(); i++) {
			BoardVO board = listOfBoard.get(i);
			if (board != null && board.getNo() == no) {
				listOfBoard.remove(i);
			}
		}
	}
	
	public void updateBoard(BoardVO board) {
		for (int i = 0; i < listOfBoard.size(); i++) {
			BoardVO gBoard = listOfBoard.get(i);
			if (gBoard != null && gBoard.getNo() == board.getNo()) {
//				gBoard.setNo(board.getNo());
				gBoard.setTitle(board.getTitle());
				gBoard.setContent(board.getContent());
				gBoard.setRegDate(getCurrentTime());
				if(!board.getFileVO().getFileName().equals("")) {
					gBoard.setFileVO(board.getFileVO());
				}
				break;
			}
		}
	}
	
	public void addFileNo(BoardFileVO fvo) {
		fvo.setNo(++fno);
	}
	
	public void addBoard(BoardVO board) {
		board.setNo(++no);
		board.setRegDate(getCurrentTime());
		listOfBoard.add(board);
	}
	
	public int getNo() {
		return no;
	}
	
	public String getCurrentTime() {
		DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		return formatter.format(calendar.getTime());
	}
	
}

[BoardFileVO.java]

package kr.or.ddit.ch11.vo;

public class BoardFileVO {
	private int no = 0;
	private String contentType;
	private long fileSize;
	private String fileName;
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getContentType() {
		return contentType;
	}
	public void setContentType(String contentType) {
		this.contentType = contentType;
	}
	public long getFileSize() {
		return fileSize;
	}
	public void setFileSize(long fileSize) {
		this.fileSize = fileSize;
	}
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	@Override
	public String toString() {
		return "BoardFileVO [no=" + no + ", contentType=" + contentType + ", fileSize=" + fileSize + ", fileName="
				+ fileName + "]";
	}
}

[login.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% 
	request.setCharacterEncoding("utf-8");

	String fail = request.getParameter("fail");
	//System.out.println(fail);
%>
<!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">JSP 개요</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH01</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">
						<!-- 
							1. 로그인 페이지를 작성해주세요.
							** 아래 처럼 만들어주세요.
							아이디 : _________
							비밀번호 : __________
							[  로그인   ]
							
							2. 로그인 처리는 login_process.jsp 로 요청해주세요.
							> 회원가입을 진행하지 않고, 특정 아이디/비밀번호를 정해서 로그인 처리해주세요.
						 -->
						 <form id="loginForm" name="loginForm" class="form-horizontal" action="login_process.jsp" method="post">
						 	<div class="form-group row" style="margin-bottom: 10px;">
								<label for="loginId" class="col-sm-3">아이디 : </label>
								<div class="col-sm-9">
									<input type="text" name="loginId" id="loginId" class="form-control" >
								</div>
							</div>
						 	<div class="form-group row" style="margin-bottom: 10px;">
								<label for="loginPw" class="col-sm-3">비밀번호 : </label>
								<div class="col-sm-9">
									<input type="text" name="loginPw" id="loginPw" class="form-control" >
								</div>
							</div>
							<div class="form-group row">
								<div class="col-sm-offset-2 col-sm-12">
									<button id="loginBtn" class="btn btn-primary" type="button">로그인</button>
								</div>
							</div>
						 </form>
                    </div>
                </div>
            </div>
        </div>
    </section>
	<%@ include file="/pageModule/footer.jsp" %>

	<%@ include file="/pageModule/footerPart.jsp" %>
</body>
<script type="text/javascript">
	$(function(){
		var loginForm = $("#loginForm");
		var loginBtn = $("#loginBtn");
		var fail = <%= fail %>;
		
		loginBtn.on("click", function(){
			var loginId = $("#loginId").val();
			var loginPw = $("#loginPw").val();
			if(!loginId) {
				alert("아이디를 입력해주세요.");
				return false;
			}
			if(!loginPw) {
				alert("비밀번호를 입력해주세요.");
				return false;
			}
			loginForm.submit();
		});
		
		if(fail == "0"){
			alert("로그인 실패!");
		}
	});
</script>
</html>

[login_process.jsp]

<%@page import="kr.or.ddit.ch11.vo.MemberVO"%>
<%@page import="kr.or.ddit.ch11.dao.MemberDAO"%>
<%@page import="java.util.ArrayList"%>
<%@ 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">JSP 개요</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH01</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">
					<!-- 
						1. 로그인 화면에서 넘겨받은 아이디/비밀번호를 이용하여 로그인 인증을 진행해주세요.
						> 본인이 결정한 아이디/비밀번호일때 로그인 처리해주세요.
						
						2. 로그인 인증
						> 로그인 성공 시, menu.jsp로 이동합니다.
						> 로그인 실패 시, login.jsp로 이동합니다.
					 -->
					 <% 
					 	request.setCharacterEncoding("utf-8");
					 
					 	String loginId = request.getParameter("loginId");
					 	String loginPw = request.getParameter("loginPw");
					 	//System.out.println("loginId : " + loginId);
					 	//System.out.println("loginPw : " + loginPw);
					 	
					 	MemberDAO memDao = MemberDAO.getInstance();
					 	MemberVO memVo = memDao.getMemberById(loginId);
					 	//System.out.println("memVo : " + memVo);
					 	if(memVo != null){
					 		if(loginId.equals(memVo.getMem_id()) && loginPw.equals(memVo.getMem_pw())) { // 로그인 성공
						 		response.sendRedirect("menu.jsp");
						 	}else { // 로그인 실패
						 		response.sendRedirect("login.jsp?fail=0");
						 	}
					 	}else { // 로그인 실패
					 		response.sendRedirect("login.jsp?fail=0");
					 	}
					 %>
                    </div>
                </div>
            </div>
        </div>
    </section>
	<%@ include file="/pageModule/footer.jsp" %>

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

[menu.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">JSP 개요</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH01</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">
					<!-- 
						1. 메뉴 페이지를 작성해주세요.
						
						[출력 예시]
						
						메뉴
						_____________________
						[  게시판    ] [  자료실    ]
						
						2. 게시판 버튼을 클릭 시, 게시판 페이지(boardList.jsp)로 이동합니다.
						3. 자료실 버튼을 클릭 시, 자료실 페이지(dropbox.jsp)로 이동합니다.  
					 -->
					 <h3>메뉴를 선택해주세요!</h3>
					 <br />
					 <div>
					 	1 : <button id="goToBoard" name="goToBoard" class="btn btn-primary" type="button">게시판</button>
					 	<br />
					 	<br />
					 	2 : <button id="goToRefer" name="goToRefer" class="btn btn-secondary" type="button">자료실</button>
					 </div>
                    </div>
                </div>
            </div>
        </div>
    </section>
	<%@ include file="/pageModule/footer.jsp" %>

	<%@ include file="/pageModule/footerPart.jsp" %>
</body>
<%@ include file="/ch11/test/pageModuleTest/commonJsFooter.jsp" %>
</html>

[commonJsFooter.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<script type="text/javascript">
	$(function(){
		$("#goToBoard").click(function(){
			location.href = "boardList.jsp";
		});
		$("#goToRefer").click(function(){
			location.href = "dropbox.jsp";
		});
		$("#memLogout").click(function(){
			location.href = "login.jsp";
		});
	});
</script>

- http://localhost/ch11/test/login.jsp


[tomcat-users.xml]

...
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="admin"/>
  <user username="tomcat" password="1234" roles="tomcat"/>
  <user username="both" password="1234" roles="tomcat,role1"/>
  <user username="role1" password="1234" roles="role1"/>
  <user username="admin" password="1234" roles="admin"/>
...

[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_3_1.xsd" version="3.1">
  <display-name>JSPBook</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <!-- 11장 예외처리 과제 시작 -->
  <security-role>
  	<role-name>admin</role-name>
  </security-role>
  <security-constraint>
  	<display-name>addBoardSecurity</display-name>
  	<web-resource-collection>
  		<web-resource-name>JSPBookProject</web-resource-name>
  		<description></description>
  		<url-pattern>/ch11/test/boardForm.jsp</url-pattern>
  	</web-resource-collection>
  	<auth-constraint>
  		<description>권한 관리자명</description>
  		<role-name>admin</role-name>
  	</auth-constraint>
  </security-constraint>
  <login-config>
  	<auth-method>FORM</auth-method>
	<form-login-config>
		<form-login-page>/ch11/test/loginSecurity.jsp</form-login-page>
		<form-error-page>/ch11/test/login_failed.jsp</form-error-page>
	</form-login-config>
  </login-config>
  <!-- 11장 예외처리 과제 끝 -->
  
</web-app>

[boardList.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">JSP 개요</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH01</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">
					<!-- 
						1. 게시판 목록을 출력해주세요.
							> JSTL을 활용해주세요.
							> 초기 화면에서는 데이터가 없으므로 '조회하실 게시글이 존재하지 않습니다.'를 출력해주세요.
							> 데이터가 있는 경우엔 제목, 작성자, 작성일, 조회수를 맞춰서 데이터를 출력해주세요.
									
							** 초반 데이터는 없습니다.
										제목						작성자		작성일			조회수
						─────────────────────────────────────────────────────────────────────────────
											조회하실 게시글이 존재하지 않습니다.
						─────────────────────────────────────────────────────────────────────────────						
						[ 게시글 등록하기  ]
						
							** 데이터가 있는 경우 아래와 같이 출력됩니다.
									제목						작성자		작성일			조회수
						─────────────────────────────────────────────────────────────────────────────
							게시판 제목입니다......! 1			허나훔		2022-12-12		1245
							게시판 제목입니다......! 2			송서영		2022-12-12		1245
							게시판 제목입니다......! 3			채진영		2022-12-12		1245
							게시판 제목입니다......! 4			배영호		2022-12-12		1245
							게시판 제목입니다......! 5			조은혁		2022-12-12		1245
							게시판 제목입니다......! 6			조현수		2022-12-12		1245
							.....
						─────────────────────────────────────────────────────────────────────────────
						 [ 게시글 등록하기  ]
						
						2. 시큐리티 적용
							> 게시판 등록 페이지를 시큐리티 보호자원으로 설정해주세요.
								- 시큐리티 인증방식 : FORM
								- 시큐리티 로그인 
							> 등록 페이지는 역할명 admin만 접근 가능토록 해주세요.
								- id : admin
								- pw : a1234
							> 로그인 인증 시, loginSecurity.jsp로 이동하여 인증을 진행 할 수 있도록 해주세요.
							> 로그인 인증 실패 시, loginFailed.jsp로 이동할 수 있도록 해주세요.
								  
						3. 게시글 클릭 시, 해당 게시글 상세보기 페이지로 이동합니다.
							> 상세보기 페이지로 이동할 때, 조회수가 상승합니다.
					 -->
						<%@ include file="/ch11/test/pageModuleTest/lnbContainer.jsp" %>
						<table class="table table-hover" style="margin-top: 10px;">
							<tr>
								<th>번호</th>
								<th>제목</th>
								<th>작성자</th>
								<th>작성일</th>
								<th>조회수</th>
							</tr>
							<tr>
								<td colspan="5">
									조회하실 게시글이 존재하지 않습니다.
								</td>
							</tr>
						</table>
						<a class="btn btn-info" href="boardForm.jsp">게시글 등록</a>
                    </div>
                </div>
            </div>
        </div>
    </section>
	<%@ include file="/pageModule/footer.jsp" %>

	<%@ include file="/pageModule/footerPart.jsp" %>
</body>
</body>
<%@ include file="/ch11/test/pageModuleTest/commonJsFooter.jsp" %>
</html>

[loginSecurity.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">JSP 개요</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH01</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">
						<!-- 
							1. 시큐리티 보호자원 이동 시, 인증 페이지를 작성해주세요.
							
							[출력 예시]
							아이디 : ________
							비밀번호 : _________
							[ 로그인  ]
						 -->
						 <form class="form-signin" action="j_security_check" method="post">
						 	<div class="form-group row" style="margin-bottom: 10px;">
								<label for="loginId" class="col-sm-3">아이디 : </label>
								<div class="col-sm-9">
									<input type="text" name="j_username" id="j_username" class="form-control" >
								</div>
							</div>
						 	<div class="form-group row" style="margin-bottom: 10px;">
								<label for="loginPw" class="col-sm-3">비밀번호 : </label>
								<div class="col-sm-9">
									<input type="text" name="j_password" id="j_password" class="form-control" >
								</div>
							</div>
							<div class="form-group row">
								<div class="col-sm-offset-2 col-sm-12">
									<button id="loginBtn" class="btn btn-primary" type="submit">로그인</button>
								</div>
							</div>
						 </form>
                    </div>
                </div>
            </div>
        </div>
    </section>
	<%@ include file="/pageModule/footer.jsp" %>

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

[login_failed.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">JSP 개요</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH01</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">
						<!-- 
							1. 시큐리티 로그인 인증 실패 페이지를 작성해주세요.
								> 로그인
							[출력 예시]
							
							인증에 실패하였습니다!
							[ 로그인 페이지 이동  ]
						-->
						<h3>인증에 실패하였습니다!</h3>
						<br />
						<button id="goLoginPage" name="goLoginPage" class="btn btn-primary" type="button">로그인 페이지로 이동</button>
                    </div>
                </div>
            </div>
        </div>
    </section>
	<%@ include file="/pageModule/footer.jsp" %>

	<%@ include file="/pageModule/footerPart.jsp" %>
</body>
<%@ include file="/ch11/test/pageModuleTest/commonJsFooter.jsp" %>
</html>

[commonJsFooter.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<script type="text/javascript">
	$(function(){
		// 게시판 이동
		$("#goToBoard").click(function(){
			location.href = "boardList.jsp";
		});
		// 자료실 이동
		$("#goToRefer").click(function(){
			location.href = "dropbox.jsp";
		});
		// 로그아웃
		$("#memLogout, #goLoginPage").click(function(){
			location.href = "login.jsp";
		});
	});
</script>

- http://localhost/ch11/test/boardList.jsp

admin 계정 이외의 계정으로 로그인을 시도하면?
시큐리티한테 걸려서 쫓겨남...


admin 계정으로 올바르게 접속하면?
화면을 넘어간다. 캐시를 날리지 않으면 자동으로 로그인 상태가 되어 등록 페이지로 넘어온다.


[login_process.jsp]

 <% 
    request.setCharacterEncoding("utf-8");

    String loginId = request.getParameter("loginId");
    String loginPw = request.getParameter("loginPw");
    //System.out.println("loginId : " + loginId);
    //System.out.println("loginPw : " + loginPw);

    MemberDAO memDao = MemberDAO.getInstance();
    MemberVO memVo = memDao.getMemberById(loginId);
    //System.out.println("memVo : " + memVo);
    if(memVo != null){
        if(loginId.equals(memVo.getMem_id()) && loginPw.equals(memVo.getMem_pw())) { // 로그인 성공
            response.sendRedirect("menu.jsp?id=" + loginId);
        }else { // 로그인 실패
            response.sendRedirect("login.jsp?fail=0");
        }
    }else { // 로그인 실패
        response.sendRedirect("login.jsp?fail=0");
    }
 %>

[menu.jsp]

 <h3>메뉴를 선택해주세요!</h3>
 <br />
 <div>
    <% 
        request.setCharacterEncoding("utf-8");

        String id = request.getParameter("id");
    %>
    <input id="logMemId" name="logMemId" type="hidden" value="<%= id %>" />
    1 : <button id="goToBoard" name="goToBoard" class="btn btn-primary" type="button">게시판</button>
    <br />
    <br />
    2 : <button id="goToRefer" name="goToRefer" class="btn btn-secondary" type="button">자료실</button>
 </div>

[boardList.jsp]

<%@ include file="/ch11/test/pageModuleTest/lnbContainer.jsp" %>
<% 
    request.setCharacterEncoding("utf-8");

    String id = request.getParameter("id");
%>
<input id="logMemId" name="logMemId" type="hidden" value="<%= id %>" />
<table class="table table-hover" style="margin-top: 10px;">
    <tr>
        <th>번호</th>
        <th>제목</th>
        <th>작성자</th>
        <th>작성일</th>
        <th>조회수</th>
    </tr>
    <tr>
        <td colspan="5">
            조회하실 게시글이 존재하지 않습니다.
        </td>
    </tr>
</table>
<a class="btn btn-info" href="boardForm.jsp?id=<%= id %>">게시글 등록</a>

[dropbox.jsp]

<%@ include file="/ch11/test/pageModuleTest/lnbContainer.jsp" %>
<% 
    request.setCharacterEncoding("utf-8");

    String id = request.getParameter("id");
%>
<input id="logMemId" name="logMemId" type="hidden" value="<%= id %>" />

[boardForm.jsp]

<%@page import="kr.or.ddit.ch11.vo.MemberVO"%>
<%@page import="kr.or.ddit.ch11.dao.MemberDAO"%>
<%@ 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">JSP 개요</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH01</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">
						<!-- 
							1. 게시판 등록 페이지를 작성해주세요.
							
							[출력 예]
							
							게시글 등록
							─────────────────────────────
							제목 : 
							작성자 : 
							내용 :
							─────────────────────────────
							첨부파일 : [파일 선택 ]
							─────────────────────────────
							[ 등록  ] [ 목록  ]
							
							2. 등록 버튼 클릭 시, 게시글 등록(boardInsert.jsp)을 진행해주세요.
							3. 목록 버튼 클릭 시, 게시판 목록 페이지(boardList.jsp)로 이동해주세요
						
						 -->
						 <h4>게시글 등록</h4>
						 <br />
						 <form id="boardForm" name="boardForm" class="form-horizontal" action="boardInsert.jsp" method="post" enctype="multipart/form-data">
						 	<div class="form-group row" style="margin-bottom: 10px;">
								<label for="title" class="col-sm-3">제목 : </label>
								<div class="col-sm-9">
									<input type="text" name="title" id="title" class="form-control" >
								</div>
							</div>
						 	<div class="form-group row" style="margin-bottom: 10px;">
								<label for="content" class="col-sm-3">내용 : </label>
								<div class="col-sm-9">
									<textarea id="content" name="content" class="form-control" style="height: 200px;" wrap="soft"></textarea>
								</div>
							</div>
							<div class="form-group row" style="margin-bottom: 10px;">
								<label for="file" class="col-sm-3">파일 : </label>
								<div class="col-sm-9">
									<input id="file" name="file" class="form-control" type="file" />
								</div>
							</div>
							<div class="form-group row">
								<div class="col-sm-offset-2 col-sm-12">
									<% 
								 		request.setCharacterEncoding("utf-8");
								 	
								 		String id = request.getParameter("id");
								 	%>
								 	<input id="logMemId" name="logMemId" type="hidden" value="<%= id %>" />
									<% 
										MemberDAO memDao = MemberDAO.getInstance();
										MemberVO memVo = memDao.getMemberById(id);
										//System.out.println("memVo : " + memVo);
									%>
									<input id="writer" name="writer" type="hidden" value="<%= memVo.getMem_name() %>" />
									<input id="regDate" name="regDate" type="hidden" />
									<button id="boardInsBtn" class="btn btn-primary" type="button">등록</button>
									<button id="goToBoard" class="btn btn-secondary" type="button">목록</button>
								</div>
							</div>
						 </form>
                    </div>
                </div>
            </div>
        </div>
    </section>
	<%@ include file="/pageModule/footer.jsp" %>

	<%@ include file="/pageModule/footerPart.jsp" %>
</body>
<%@ include file="/ch11/test/pageModuleTest/commonJsFooter.jsp" %>
</html>

[commonJsFooter.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<script type="text/javascript">
	$(function(){
		var today = new Date();
		var todayStr = today.toLocaleString();
		// 게시판 이동
		$("#goToBoard").click(function(){
			var logMemId = $("#logMemId").val();
			location.href = "boardList.jsp?id=" + logMemId;
		});
		// 자료실 이동
		$("#goToRefer").click(function(){
			var logMemId = $("#logMemId").val();
			location.href = "dropbox.jsp?id=" + logMemId;
		});
		// 로그아웃
		$("#memLogout, #goLoginPage").click(function(){
			location.href = "login.jsp";
		});
		// 게시글 등록 처리 이동 겸 validation 처리
		$("#boardInsBtn").click(function(){
			var titleVal = $("#title").val();
			var contentVal = $("#content").val();
			var fileVal = $("#file").val();
			var writerVal = $("#writer").val();
			//console.log("todayStr : " + todayStr);
			$("#regDate").val(todayStr);
			var regDateVal = $("#regDate").val();
			var boardForm = $("#boardForm");
			
			if(!titleVal) {
				alert("게시글 제목을 입력해 주세요.");
				$("#title").focus();
				return false;
			}
			if(!contentVal) {
				alert("게시글 내용을 입력해 주세요.");
				$("#content").focus();
				return false;
			}
			//console.log("fileVal : " + fileVal);
			if(!fileVal) {
				alert("파일을 넣어 주세요.");
				$("#content").focus();
				return false;
			}
			
			// 테스트용
			//console.log("writerVal : " + writerVal);
			//console.log("regDateVal : " + regDateVal);
			
			boardForm.submit();
		});
	});
</script>

[boardInsert.jsp]

<%@page import="kr.or.ddit.ch11.vo.BoardFileVO"%>
<%@page import="kr.or.ddit.ch11.vo.BoardVO"%>
<%@page import="kr.or.ddit.ch11.dao.BoardRepository"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.commons.fileupload.DiskFileUpload"%>
<%@page import="java.io.File"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");

	String realFolder = request.getServletContext().getRealPath("/resources/images");
	String encType = "UTF-8";
	
	int maxSize = 100 * 1024 * 1024;
	
	File folder = new File(realFolder);
	if(!folder.exists()) {
		folder.mkdirs();
	}
	
	DiskFileUpload upload = new DiskFileUpload();
	upload.setSizeMax(1000000);
	upload.setSizeThreshold(maxSize);
	upload.setRepositoryPath(realFolder);
	
	List items = upload.parseRequest(request);
	Iterator params = items.iterator();
	
	// 데이터를 저장할 변수 설정
	
	// MemberVO 기준 들어가야 할 값들
	// 번호(no)는 조회해서 1씩 증가시켜야 함
	// fileVO로 파일 업로드 경로 세우는 듯...
	String title = ""; // 게시판 제목
	String content = ""; // 게시판 내용
	String writer = ""; // 작성자(id기준)
	
	BoardRepository dao = BoardRepository.getInstance();
	BoardFileVO fileVo = new BoardFileVO();
	// FileVO 기준 들어가야 할 값들
	// 번호(no)는 조회해서 1씩 증가시켜야 함
	String contentType = ""; // 파일 컨텐츠 타입
	long fileSize = 0L; // 파일 크기 정보
	String fileName = ""; // 저장 파일 이름
	
	while(params.hasNext()) {
		FileItem item = (FileItem) params.next();
			
		if(item.isFormField()) { // 일반 데이터일 때
			String fieldName = item.getFieldName();
			//System.out.println(fieldName);
		
			if(fieldName.equals("title")) {
				title = item.getString(encType);
			}else if(fieldName.equals("content")) {
				content = item.getString(encType);
			}else if(fieldName.equals("writer")) {
				writer = item.getString(encType);
			}
		}else { // 파일 데이터일 때
			contentType = item.getContentType(); // 파일 컨텐츠 타입
			fileSize = item.getSize(); // 파일 크기 정보
			fileName = item.getName(); // 저장 파일 이름
			File saveFile = new File(realFolder + "/" + fileName);
			item.write(saveFile); // 파일 복사
			
			dao.addFileNo(fileVo);
			fileVo.setFileName(fileName);
			fileVo.setContentType(contentType);
			fileVo.setFileSize(fileSize);
		}
	}
	
	BoardVO boardVo = new BoardVO();
	boardVo.setTitle(title);
	boardVo.setContent(content);
	boardVo.setWriter(writer);
	
	boardVo.setFileVO(fileVo);
	
	System.out.println("boardVo : " + boardVo);
	
	dao.addBoard(boardVo);
	
	response.sendRedirect("boardList.jsp?id=" + writer);
%>

[boardList.jsp]

<%@page import="kr.or.ddit.ch11.vo.BoardVO"%>
<%@page import="java.util.ArrayList"%>
<%@page import="kr.or.ddit.ch11.dao.BoardRepository"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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">JSP 개요</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH01</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">
					<!-- 
						1. 게시판 목록을 출력해주세요.
							> JSTL을 활용해주세요.
							> 초기 화면에서는 데이터가 없으므로 '조회하실 게시글이 존재하지 않습니다.'를 출력해주세요.
							> 데이터가 있는 경우엔 제목, 작성자, 작성일, 조회수를 맞춰서 데이터를 출력해주세요.
									
							** 초반 데이터는 없습니다.
										제목						작성자		작성일			조회수
						─────────────────────────────────────────────────────────────────────────────
											조회하실 게시글이 존재하지 않습니다.
						─────────────────────────────────────────────────────────────────────────────						
						[ 게시글 등록하기  ]
						
							** 데이터가 있는 경우 아래와 같이 출력됩니다.
									제목						작성자		작성일			조회수
						─────────────────────────────────────────────────────────────────────────────
							게시판 제목입니다......! 1			허나훔		2022-12-12		1245
							게시판 제목입니다......! 2			송서영		2022-12-12		1245
							게시판 제목입니다......! 3			채진영		2022-12-12		1245
							게시판 제목입니다......! 4			배영호		2022-12-12		1245
							게시판 제목입니다......! 5			조은혁		2022-12-12		1245
							게시판 제목입니다......! 6			조현수		2022-12-12		1245
							.....
						─────────────────────────────────────────────────────────────────────────────
						 [ 게시글 등록하기  ]
						
						2. 시큐리티 적용
							> 게시판 등록 페이지를 시큐리티 보호자원으로 설정해주세요.
								- 시큐리티 인증방식 : FORM
								- 시큐리티 로그인 
							> 등록 페이지는 역할명 admin만 접근 가능토록 해주세요.
								- id : admin
								- pw : a1234
							> 로그인 인증 시, loginSecurity.jsp로 이동하여 인증을 진행 할 수 있도록 해주세요.
							> 로그인 인증 실패 시, loginFailed.jsp로 이동할 수 있도록 해주세요.
								  
						3. 게시글 클릭 시, 해당 게시글 상세보기 페이지로 이동합니다.
							> 상세보기 페이지로 이동할 때, 조회수가 상승합니다.
					 -->
						<%@ include file="/ch11/test/pageModuleTest/lnbContainer.jsp" %>
						<% 
					 		request.setCharacterEncoding("utf-8");
					 	
					 		String id = request.getParameter("id");
					 		
					 		BoardRepository dao = BoardRepository.getInstance();
					 		ArrayList<BoardVO> boardList = dao.selectBoardList();
					 		System.out.println("boardList : " + boardList);
					 	%>
					 	
					 	<c:set var="boardList" value="<%= boardList %>"></c:set>
					 	<c:set var="id" value="<%= id %>"></c:set>
					 	
						<input id="logMemId" name="logMemId" type="hidden" value="<%= id %>" />
						
						<table class="table table-hover" style="margin-top: 10px;">
							<tr>
								<th>번호</th>
								<th>제목</th>
								<th>작성자</th>
								<th>작성일</th>
								<th>조회수</th>
							</tr>
							<c:choose>
								<c:when test="${boardList.size() ne 0}">
									<c:forEach var="boardVo" items="${boardList}">
										<tr>
											<td>${boardVo.getNo()}</td>
											<td>${boardVo.getTitle()}</td>
											<td>${boardVo.getWriter()}</td>
											<td>${boardVo.getRegDate()}</td>
											<td>${boardVo.getHit()}</td>
										</tr>
									</c:forEach>
								</c:when>
								<c:otherwise>
									<tr>
										<td colspan="5">
											조회하실 게시글이 존재하지 않습니다.
										</td>
									</tr>
								</c:otherwise>
							</c:choose>
						</table>
						
						<a class="btn btn-info" href="boardForm.jsp?id=${id}">게시글 등록</a>
                    </div>
                </div>
            </div>
        </div>
    </section>
	<%@ include file="/pageModule/footer.jsp" %>

	<%@ include file="/pageModule/footerPart.jsp" %>
</body>
</body>
<%@ include file="/ch11/test/pageModuleTest/commonJsFooter.jsp" %>
</html>

- http://localhost/ch11/test/boardForm.jsp


[web.xml] => 에러페이지 이동 처리

  <error-page>
  	<error-code>500</error-code>
  	<location>/ch11/test/exceptionBoard_error.jsp</location>
  </error-page>

[boardList.jsp]

...

<table class="table table-hover" style="margin-top: 10px;">
    <tr>
        <th>번호</th>
        <th>제목</th>
        <th>작성자</th>
        <th>작성일</th>
        <th>조회수</th>
    </tr>
    <style>
        .boardInfo {
            cursor: pointer;
        }
    </style>
    <c:choose>
        <c:when test="${boardList.size() ne 0}">
            <c:forEach var="boardVo" items="${boardList}">
                <tr class="boardInfo">
                    <td>${boardVo.getNo()}</td>
                    <td>${boardVo.getTitle()}</td>
                    <td>${boardVo.getWriter()}</td>
                    <td>${boardVo.getRegDate()}</td>
                    <td>${boardVo.getHit()}</td>
                </tr>
            </c:forEach>
        </c:when>
        <c:otherwise>
            <tr>
                <td colspan="5">
                    조회하실 게시글이 존재하지 않습니다.
                </td>
            </tr>
        </c:otherwise>
    </c:choose>
</table>

...

[commonJsFooter.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<script type="text/javascript">
	$(function(){
		
		var today = new Date();
		var todayStr = today.toLocaleString();
		
		// 게시판 이동
		$("#goToBoard, #goToBoardList").click(function(){
			var logMemId = $("#logMemId").val();
			location.href = "boardList.jsp?id=" + logMemId;
		});
		
		// 자료실 이동
		$("#goToRefer").click(function(){
			var logMemId = $("#logMemId").val();
			location.href = "dropbox.jsp?id=" + logMemId;
		});
		
		// 로그아웃
		$("#memLogout, #goLoginPage").click(function(){
			location.href = "login.jsp";
		});
		
		// 게시글 등록 처리 이동 겸 validation 처리
		$("#boardInsBtn").click(function(){
			var titleVal = $("#title").val();
			var contentVal = $("#content").val();
			var fileVal = $("#file").val();
			var writerVal = $("#writer").val();
			//console.log("todayStr : " + todayStr);
			$("#regDate").val(todayStr);
			var regDateVal = $("#regDate").val();
			var boardForm = $("#boardForm");
			
			if(!titleVal) {
				alert("게시글 제목을 입력해 주세요.");
				$("#title").focus();
				return false;
			}
			if(!contentVal) {
				alert("게시글 내용을 입력해 주세요.");
				$("#content").focus();
				return false;
			}
			//console.log("fileVal : " + fileVal);
			if(!fileVal) {
				alert("파일을 넣어 주세요.");
				$("#content").focus();
				return false;
			}
			
			// 테스트용
			//console.log("writerVal : " + writerVal);
			//console.log("regDateVal : " + regDateVal);
			
			boardForm.submit();
		});
		
		// 게시글 상세보기
		$(".boardInfo").click(function(){
			var thisIs = $(this);
			var boardNo = thisIs.children().eq(0).html().trim();
			console.log(boardNo);
			var logMemId = $("#logMemId").val();
			location.href = "boardView.jsp?bno=" + boardNo + "&id=" + logMemId;
		});
		
		// 게시글 삭제하기
		$("#boardRemove").click(function(){
			//console.log(window.confirm("게시글을 정말로 삭제하시겠습니까?"));
			var bno = $("#bno").val();
			if(window.confirm("게시글을 정말로 삭제하시겠습니까?")) {
				location.href = "boardRemove.jsp?bno=" + bno;
			}
		});
		
	});
</script>

[boardView.jsp]

<%@page import="kr.or.ddit.ch11.vo.BoardFileVO"%>
<%@page import="kr.or.ddit.ch11.vo.BoardVO"%>
<%@page import="kr.or.ddit.ch11.dao.BoardRepository"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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">JSP 개요</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH01</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">
						<!--
							1. 게시글 상세보기를 출력해주세요.
								> JSTL을 활용해주세요. 
							
							[출력 예]
							
							게시판 상세보기
							──────────────────────────────────────────────
							제목 : 
							작성자 작성일 조회수
							──────────────────────────────────────────────
							내용
							──────────────────────────────────────────────
							
							[ 수정  ] [ 삭제  ] [ 목록  ]
							
							2. 수정 버튼 클릭 시, 수정 페이지(boardUpdateForm.jsp)로 이동합니다.
							3. 삭제 버튼 클릭 시, 해당 게시글이 삭제 처리 될 수 있도록 합니다.
								> "정말로 삭제하시겠습니까?" 알림창이 나타나고, [확인]버튼을 클릭 시 삭제가 처리(boardRemove.jsp) 될 수 있도록 해주세요.
								> "정말로 삭제하시겠습니까?" 알림창이 나타나고, [취소]버튼을 클릭 시 알림창이 꺼질 수 있게 해주세요.
							4. 목록 버튼 클릭 시, 목록 페이지(boardList.jsp)로 이동합니다.
						 -->
						<%@ include file="/ch11/test/pageModuleTest/lnbContainer.jsp" %>
					 	<% 
					 		request.setCharacterEncoding("utf-8");
					 	
					 		String id = request.getParameter("id");
					 		
					 		String bno = request.getParameter("bno");
					 		int ibno = Integer.parseInt(bno);
					 		
					 		BoardRepository dao = BoardRepository.getInstance();
					 		BoardVO bvo = dao.getBoardById(ibno);
					 		System.out.println("bvo : " + bvo);
					 	%>
					 	<input id="logMemId" name="logMemId" type="hidden" value="<%= id %>" />
					 	<input id="bno" name="bno" type="hidden" value="<%= bvo.getNo() %>" />
					 	
					 	<c:set var="bvo" value="<%= bvo %>"></c:set>
						<c:set var="id" value="<%= id %>"></c:set>
					 	
					 	<table class="table table-hover" style="margin-top: 10px;">
					 		<tr>
					 			<th>제목</th>
					 			<td colspan="3">${bvo.getTitle()}</td>
					 		</tr>
					 		<tr>
					 			<td>${bvo.getWriter()}</td>
					 			<td colspan="3">${bvo.getRegDate()}</td>
					 		</tr>
					 		<tr>
					 			<td colspan="4">
					 				<p style="white-space: pre-wrap"><c:out value="${bvo.getContent()}"/></p>
					 			</td>
					 		</tr>
					 		<tr>
					 			<th>첨부파일</th>
					 			<td colspan="3">
					 				<a href="#none">${bvo.getFileVO().getFileName()}</a>
					 			</td>
					 		</tr>
					 		<tr>
					 			<td colspan="4">
					 				<button id="boardModify" name="boardModify" class="btn btn-warning" type="button">수정</button>
					 				<button id="boardRemove" name="boardRemove" class="btn btn-danger" type="button">삭제</button>
					 				<button id="goToBoardList" name="goToBoard" class="btn btn-dark" type="button">목록</button>
					 			</td>
					 		</tr>
					 	</table>
					 	
                    </div>
                </div>
            </div>
        </div>
    </section>
	<%@ include file="/pageModule/footer.jsp" %>

	<%@ include file="/pageModule/footerPart.jsp" %>
</body>
<%@ include file="/ch11/test/pageModuleTest/commonJsFooter.jsp" %>
</html>

[boardRemove.jsp]

<%@page import="kr.or.ddit.ch11.dao.BoardRepository"%>
<%@ 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">JSP 개요</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH01</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">
					<!-- 
						삭제할 게시글 정보를 넘겨받고, 삭제를 진행해주세요.
						삭제가 실패하여 에러가 발생 할 경우, exceptionBoard_error.jsp 페이지로 이동할 수 있게 해주세요.
						
						삭제 완료 후, 게시판 목록 페이지(boardList.jsp)로 이동해주세요.
					 -->
					 <!-- 
						1. 게시글 삭제를 처리해주세요.
							> 삭제 성공 후, 상세보기 페이지(boardList.jsp)로 이동해주세요.
							> 삭제 실패 후, 에러 페이지(exceptionBoard_error.jsp)로 이동해주세요.
					 -->
					 <% 
					 	request.setCharacterEncoding("utf-8");
					 
					 	String id = request.getParameter("id");
					 	String bno = request.getParameter("bno");
					 	int ibno = Integer.parseInt(bno);
					 	
					 	BoardRepository dao = BoardRepository.getInstance();
					 	dao.deleteBoard(ibno);
					 	
					 	response.sendRedirect("boardList.jsp?id=" + id);
					 %>
                    </div>
                </div>
            </div>
        </div>
    </section>
	<%@ include file="/pageModule/footer.jsp" %>

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


[commonJsFooter.jsp]

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<script type="text/javascript">
	$(function(){
		
		var today = new Date();
		var todayStr = today.toLocaleString();
		
		// 게시판 이동
		$("#goToBoard, #goToBoardList").click(function(){
			var logMemId = $("#logMemId").val();
			location.href = "boardList.jsp?id=" + logMemId;
		});
		
		// 자료실 이동
		$("#goToRefer").click(function(){
			var logMemId = $("#logMemId").val();
			location.href = "dropbox.jsp?id=" + logMemId;
		});
		
		// 로그아웃
		$("#memLogout, #goLoginPage").click(function(){
			location.href = "login.jsp";
		});
		
		// 게시글 등록 처리 이동 겸 validation 처리
		$("#boardInsBtn").click(function(){
			var titleVal = $("#title").val();
			var contentVal = $("#content").val();
			var fileVal = $("#file").val();
			var writerVal = $("#writer").val();
			//console.log("todayStr : " + todayStr);
			$("#regDate").val(todayStr);
			var regDateVal = $("#regDate").val();
			var boardForm = $("#boardForm");
			
			if(!titleVal) {
				alert("게시글 제목을 입력해 주세요.");
				$("#title").focus();
				return false;
			}
			if(!contentVal) {
				alert("게시글 내용을 입력해 주세요.");
				$("#content").focus();
				return false;
			}
			//console.log("fileVal : " + fileVal);
			if(!fileVal) {
				alert("파일을 넣어 주세요.");
				$("#content").focus();
				return false;
			}
			
			// 테스트용
			//console.log("writerVal : " + writerVal);
			//console.log("regDateVal : " + regDateVal);
			
			boardForm.submit();
		});
		
		// 게시글 상세보기
		$(".boardInfo").click(function(){
			var thisIs = $(this);
			var boardNo = thisIs.children().eq(0).html().trim();
			console.log(boardNo);
			var logMemId = $("#logMemId").val();
			location.href = "boardView.jsp?bno=" + boardNo + "&id=" + logMemId;
		});
		
		// 게시글 삭제하기
		$("#boardRemove").click(function(){
			//console.log(window.confirm("게시글을 정말로 삭제하시겠습니까?"));
			var bno = $("#bno").val();
			var logMemId = $("#logMemId").val();
			if(window.confirm("게시글을 정말로 삭제하시겠습니까?")) {
				location.href = "boardRemove.jsp?bno=" + bno + "&id=" + logMemId;
			}
		});
		
		// 게시글 수정하기 이동
		$("#boardModify").click(function(){
			var bno = $("#bno").val();
			var logMemId = $("#logMemId").val();
			location.href = "boardUpdateForm.jsp?bno=" + bno + "&id=" + logMemId;
		});
		
		// 게시글 수정하기
		$("#boardModifyAccept").click(function(){
			var logMemId = $("#logMemId").val();
			location.href = "boardUpdate.jsp?id=" + logMemId;
		});
		
	});
</script>

[boardUpdateForm.jsp]

<%@page import="kr.or.ddit.ch11.vo.BoardVO"%>
<%@page import="kr.or.ddit.ch11.dao.BoardRepository"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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">JSP 개요</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH01</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">
						<!-- 
							1. 게시판 수정 페이지를 작성해주세요.
							
							[출력 예]
							
							게시글 등록
							─────────────────────────────
							제목 : 제목입니다1
							작성자 : 홍길동
							내용 : 내용입니다1
							─────────────────────────────
							[ 수정  ] [ 목록 ]
							
							2. 수정 버튼 클릭 시, 게시글 수정(boardUpdate.jsp)을 진행해주세요.
							3. 목록 버튼 클릭 시, 목록 페이지(boardList.jsp)로 이동해주세요. 
						 -->
						 
						<%@ include file="/ch11/test/pageModuleTest/lnbContainer.jsp" %>
					 	<% 
					 		request.setCharacterEncoding("utf-8");
					 	
					 		String id = request.getParameter("id");
					 		
					 		String bno = request.getParameter("bno");
					 		int ibno = Integer.parseInt(bno);
					 		
					 		BoardRepository dao = BoardRepository.getInstance();
					 		BoardVO bvo = dao.getBoardById(ibno);
					 		System.out.println("bvo : " + bvo);
					 	%>
						 
						<form id="boardUpForm" name="boardUpForm" class="form-horizontal" action="boardUpdate.jsp" method="post" enctype="multipart/form-data">
							
							<input id="bno" name="bno" type="hidden" value="<%= bvo.getNo() %>" />
							<input id="logMemId" name="logMemId" type="hidden" value="<%= id %>" />
							<input id="bfileno" name="bfileno" type="hidden" value="<%= bvo.getFileVO().getNo() %>" />
							<input id="writer" name="writer" type="hidden" value="<%= bvo.getWriter() %>" />
							<input id="regDate" name="regDate" type="hidden" value="<%= bvo.getRegDate() %>" />
							
							<c:set var="bvo" value="<%= bvo %>"></c:set>
							<c:set var="id" value="<%= id %>"></c:set>
							
							<table class="table table-hover" style="margin-top: 10px;">
								<tr>
									<th>제목</th>
									<td colspan="3">
										<input id="title" name="title" class="form-control" type="text" value="${bvo.getTitle()}" />
									</td>
								</tr>
								<tr>
									<td>
										${bvo.getWriter()}
									</td>
									<td colspan="3">
										${bvo.getRegDate()}
									</td>
								</tr>
								<tr>
									<td colspan="4">
										<textarea id="content" name="content" class="form-control" style="height: 200px;" wrap="soft">${bvo.getContent()}</textarea>
									</td>
								</tr>
								<tr>
									<th>첨부파일</th>
									<td colspan="3">
										<input id="file" name="file" class="form-control" type="file" />
									</td>
								</tr>
								<tr>
									<td colspan="4">
										<button id="boardModifyAccept" name="boardModify" class="btn btn-primary" type="button">수정</button>
										<button id="goToBoardList" name="goToBoard" class="btn btn-secondary" type="button">취소</button>
									</td>
								</tr>
							</table>
						</form>
                    </div>
                </div>
            </div>
        </div>
    </section>
	<%@ include file="/pageModule/footer.jsp" %>

	<%@ include file="/pageModule/footerPart.jsp" %>
</body>
<%@ include file="/ch11/test/pageModuleTest/commonJsFooter.jsp" %>
</html>

[boardUpdate.jsp]

<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="kr.or.ddit.ch11.vo.BoardVO"%>
<%@page import="kr.or.ddit.ch11.vo.BoardFileVO"%>
<%@page import="kr.or.ddit.ch11.dao.BoardRepository"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.commons.fileupload.DiskFileUpload"%>
<%@page import="java.io.File"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");

	String realFolder = request.getServletContext().getRealPath("/resources/images");
	String encType = "UTF-8";
	
	int maxSize = 100 * 1024 * 1024;
	
	File folder = new File(realFolder);
	if(!folder.exists()) {
		folder.mkdirs();
	}
	
	DiskFileUpload upload = new DiskFileUpload();
	upload.setSizeMax(1000000);
	upload.setSizeThreshold(maxSize);
	upload.setRepositoryPath(realFolder);
	
	List items = upload.parseRequest(request);
	Iterator params = items.iterator();
	
	// MemberVO 기준 들어가야 할 값들
	String title = ""; // 게시판 제목
	String content = ""; // 게시판 내용
	String writer = ""; // 작성자(id기준)
	String logMemId = ""; // 로그인된 아이디
	String bno = ""; // 수정할 게시판 번호
	
	BoardRepository dao = BoardRepository.getInstance();
	BoardFileVO fileVo = new BoardFileVO();
	// FileVO 기준 들어가야 할 값들
	String contentType = ""; // 파일 컨텐츠 타입
	long fileSize = 0L; // 파일 크기 정보
	String fileName = ""; // 저장 파일 이름
	String bfileno = ""; // 파일 번호
	
	while(params.hasNext()) {
		FileItem item = (FileItem) params.next();
			
		if(item.isFormField()) { // 일반 데이터일 때
			String fieldName = item.getFieldName();
			//System.out.println(fieldName);
		
			if(fieldName.equals("title")) {
				title = item.getString(encType);
			}else if(fieldName.equals("content")) {
				content = item.getString(encType);
			}else if(fieldName.equals("writer")) {
				writer = item.getString(encType);
			}else if(fieldName.equals("logMemId")) {
				logMemId = item.getString(encType);
			}else if(fieldName.equals("bno")) {
				bno = item.getString(encType);
			}else if(fieldName.equals("bfileno")) {
				bfileno = item.getString(encType);
			}
		}else { // 파일 데이터일 때
			contentType = item.getContentType(); // 파일 컨텐츠 타입
			fileSize = item.getSize(); // 파일 크기 정보
			fileName = item.getName(); // 저장 파일 이름
			File saveFile = new File(realFolder + "/" + fileName);
			item.write(saveFile); // 파일 복사
			
			fileVo.setFileName(fileName);
			fileVo.setContentType(contentType);
			fileVo.setFileSize(fileSize);
		}
	}
	
	int ibfileno = Integer.parseInt(bfileno);
	fileVo.setNo(ibfileno);
	
	BoardVO boardVo = new BoardVO();
	boardVo.setTitle(title);
	boardVo.setContent(content);
	boardVo.setWriter(writer);
	int ibno = Integer.parseInt(bno);
	boardVo.setNo(ibno);
	
	boardVo.setFileVO(fileVo);
	
	System.out.println("boardVo : " + boardVo);
	
	dao.updateBoard(boardVo);
	
	response.sendRedirect("boardList.jsp?id=" + logMemId);
%>


[dropbox.jsp]

<%@page import="java.util.ArrayList"%>
<%@page import="kr.or.ddit.ch11.vo.BoardVO"%>
<%@page import="kr.or.ddit.ch11.dao.BoardRepository"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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">JSP 개요</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">INDEX</a></li>
                        <li>CH01</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">
						<!-- 
							첨부한 파일들을 확인 할 수 있는 자료실 페이지를 구성해주세요.
							- 자료실을 구성하는데 필요한 내용 모두는 board를 작성했던 방식을 참고하여 작성한다.
							
							1. 파일의 유형에 따라 유형에 맞는 default 이미지로 리스트를 구성하세요.
							
							[출력 예]
							
							자료실
							[pdf]	[excel]	[excel]	[ppt]
							[image] [txt]	[word]	[txt]
							[etc]	[etc]	[pdf]	[ppt]
							[...]
							
							목록 
						 -->
					 	<%@ include file="/ch11/test/pageModuleTest/lnbContainer.jsp" %>
					 	<% 
					 		request.setCharacterEncoding("utf-8");
					 	
					 		String id = request.getParameter("id");
					 		
					 		BoardRepository dao = BoardRepository.getInstance();
					 		ArrayList<BoardVO> bvoList = dao.selectBoardList();
					 		
					 		System.out.println("bvoList : " + bvoList);
					 	%>
					 	<input id="logMemId" name="logMemId" type="hidden" value="<%= id %>" />
					 	
					 	<br />
					 	<h3>자료실</h3>
					 	
					 	<c:set var="bvoList" value="<%= bvoList %>"></c:set>
					 	
					 	<table class="table table-hover" style="margin-top: 10px;">
					 		<c:choose>
					 			<c:when test="${bvoList.size() ne 0}">
					 				<c:forEach var="bvo" items="${bvoList}">
								 		<tr>
								 			<td>
								 				<img src="${pageContext.request.contextPath }/resources/images/${bvo.getFileVO().getFileName()}" style="width: 300px;"/>
								 			</td>
								 			<td>
								 				이미지 파일명 : <a href="${pageContext.request.contextPath}/resources/images/${bvo.getFileVO().getFileName()}" download="${bvo.getFileVO().getFileName()}">${bvo.getFileVO().getFileName()}</a> <br />
								 				이미지 크기 : ${bvo.getFileVO().getFileSize()} <br />
								 				컨텐츠 타입 : ${bvo.getFileVO().getContentType()}
								 			</td>
								 		</tr>
					 				</c:forEach>
					 			</c:when>
					 			<c:otherwise>
					 				<tr>
					 					<td colspan="2">
					 						조회할 파일 목록이 없습니다.
					 					</td>
					 				</tr>
					 			</c:otherwise>
					 		</c:choose>
					 	</table>
                    </div>
                </div>
            </div>
        </div>
    </section>
	<%@ include file="/pageModule/footer.jsp" %>

	<%@ include file="/pageModule/footerPart.jsp" %>
</body>
<%@ include file="/ch11/test/pageModuleTest/commonJsFooter.jsp" %>
</html>

파일명을 클릭하면 다운로드 처리 가능

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

231109_JSP 개론 11  (0) 2023.11.09
231108_JSP 개론 10  (0) 2023.11.08
231107_JSP 개론 9  (0) 2023.11.07
231106_JSP 개론 8  (0) 2023.11.06
231103_JSP 과제 4  (0) 2023.11.03