TIL 0510

먼지·2024년 5월 10일

Today I Learned

목록 보기
57/89
post-thumbnail

MVC News 실습

News VO 생성

package kr.news.vo;

import java.sql.Date;

public class NewsVO {
	private int num;
	private String title;
	private String writer;
	private String passwd;
	private String email;
	private String article;
	private String filename;
	private Date reg_date;
	
	public boolean isCheckedPassword(String userPasswd) {
		if(passwd.equals(userPasswd)) { // 일치
			return true;
		} 
		// 불일치
		return false;
		
	}
	
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getArticle() {
		return article;
	}
	public void setArticle(String article) {
		this.article = article;
	}
	public String getFilename() {
		return filename;
	}
	public void setFilename(String filename) {
		this.filename = filename;
	}
	public Date getReg_date() {
		return reg_date;
	}
	public void setReg_date(Date reg_date) {
		this.reg_date = reg_date;
	}

	
}

News DAO 생성

package kr.news.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import kr.news.vo.NewsVO;
import kr.util.DBUtil;

public class NewsDAO {
	// 싱글턴 패턴
	private static NewsDAO instance = new NewsDAO();
	
	public static NewsDAO getInstance() {
		return instance;
	}
	private NewsDAO() {
		
	}
	
	// 뉴스 등록
	public void registerNews(NewsVO newsVO) throws Exception{
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql =  null;
		try {
			conn = DBUtil.getConnection();
			sql="INSERT INTO dailynews(num,title,writer,passwd,email,article,filename)"
					+ "VALUES(dailynews_seq.nextval,?,?,?,?,?,?)";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, newsVO.getTitle());
			pstmt.setString(2, newsVO.getWriter());
			pstmt.setString(3, newsVO.getPasswd());
			pstmt.setString(4, newsVO.getEmail());
			pstmt.setString(5, newsVO.getArticle());
			pstmt.setString(6, newsVO.getFilename());
			pstmt.executeUpdate();
		} catch (Exception e) {
			throw new Exception(e);
		} finally {
			DBUtil.executeClose(null, pstmt, conn);
		}
	}
	
	// 뉴스 총 개수
	public int getCount() throws Exception{
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql =  null;
		int count = 0;
		try {
			conn = DBUtil.getConnection();
			sql="SELECT COUNT(*) FROM dailynews";
			pstmt=conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				// 컬럼 인덱스를 사용하면 된다.하나만 있으면 어차피 1이기 때문에
				count = rs.getInt(1);
			}
		} catch (Exception e) {
			throw new Exception(e);
		} finally {
			DBUtil.executeClose(rs, pstmt, conn);
		}
		return count;
	}
	
	// 뉴스 목록
	public List<NewsVO> getList(int startRow, int endRow) throws Exception{
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		List<NewsVO> list = null;
		String sql = null;
		try {
			conn = DBUtil.getConnection();
			sql="SELECT * FROM (SELECT ROWNUM rnum,a.* FROM (SELECT * FROM dailynews order by num asc )a) WHERE rnum>=? and rnum<=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, startRow);
			pstmt.setInt(2, endRow);
			rs = pstmt.executeQuery();
			list = new ArrayList<NewsVO>();
			while (rs.next()) {
				NewsVO newsVO = new NewsVO();
				newsVO.setNum(rs.getInt("num"));
				newsVO.setTitle(rs.getString("title"));
				newsVO.setWriter(rs.getString("writer"));
				newsVO.setReg_date(rs.getDate("reg_date"));

				list.add(newsVO);
			}
		} catch (Exception e) {
			throw new Exception(e);
		} finally {
			DBUtil.executeClose(rs, pstmt, conn);
		}
		return list;
	}
	
	// 뉴스 상세
	public NewsVO getNews(int num) throws Exception{
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		String sql = null;
		NewsVO news = null;
		try {
			conn = DBUtil.getConnection();
			sql="SELECT * FROM dailynews WHERE num = ?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, num);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				news = new NewsVO();
				news.setNum(num);
				news.setArticle(rs.getString("article"));
				news.setTitle(rs.getString("title"));
				news.setWriter(rs.getString("writer"));
				news.setPasswd(rs.getString("passwd"));
				news.setFilename(rs.getString("filename"));
				news.setReg_date(rs.getDate("reg_date"));
				news.setEmail(rs.getString("email"));
			}
		} catch (Exception e) {
			throw new Exception(e);
		} finally {
			DBUtil.executeClose(rs, pstmt, conn);
		}
		return news;
	}
	
//	뉴스 수정
	public void update(NewsVO newsVO) throws Exception{
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql =  null;
		String sub_sql = "";
		int cnt = 0;
		try {
			conn = DBUtil.getConnection();
			if(newsVO.getFilename()!= null && !newsVO.getFilename().isEmpty()) {
				sub_sql +=", filename=?";
			}
			sql="UPDATE dailynews SET title=?, writer=?,email=?,article=?"+sub_sql+" WHERE num=?";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(++cnt, newsVO.getTitle());
			pstmt.setString(++cnt, newsVO.getWriter());
			pstmt.setString(++cnt, newsVO.getEmail());
			pstmt.setString(++cnt, newsVO.getArticle());
			if(newsVO.getFilename()!= null && !newsVO.getFilename().isEmpty()) {
				// 파일이 업로드가 되었다면 ++cnt의 값은 5번, num => 6번이 될것이다
				pstmt.setString(++cnt, newsVO.getFilename());
			}
			// 파일의 업로드가 없다면 if문이 실행되지 않기 때문에 번호가 5번이 된다.
			pstmt.setInt(++cnt, newsVO.getNum());
			pstmt.executeUpdate();
		} catch (Exception e) {
			throw new Exception(e);
		} finally {
			DBUtil.executeClose(null, pstmt, conn);
		}
	}

//	뉴스 삭제
	public void delete(int num) throws Exception{
		Connection conn = null;
		PreparedStatement pstmt = null;
		String sql =  null;
		try {
			conn = DBUtil.getConnection();
			sql="DELETE FROM dailynews WHERE num = ?";
			pstmt=conn.prepareStatement(sql);
			pstmt.setInt(1, num);
			pstmt.executeUpdate();
		} catch (Exception e) {
			throw new Exception(e);
		} finally {
			DBUtil.executeClose(null, pstmt, conn);
		}
	}
}

ActionMap Properties

#DispatcherServlet에서 읽어갈 정보를
#key 와 value의 쌍으로 명시
#요청 URL = 모델클래스
/list.do=kr.news.action.ListAction
/writeForm.do=kr.news.action.WriteFormAction
/write.do=kr.news.action.WriteAction
/detail.do=kr.news.action.DetailAction
/modifyForm.do=kr.news.action.ModifyFormAction
/modify.do=kr.news.action.ModifyAction
/deleteForm.do=kr.news.action.DeleteFormAction
/delete.do=kr.news.action.DeleteAction

CSS

@charset "UTF-8";

body{
    padding: 0;
    margin: 0;
    font-family: "Noto Sans KR", sans-serif;
}
.page-main{
    width: 800px;
    margin: 0 auto; /* 중앙 정렬 */
}
.result-display{
    width:  400px;
    height: 200px;
    margin: 50px auto;
    border: 1px solid #000;
    display: flex;
    align-items: center; /* 세로 정렬 */
    justify-content: center; /* 가로 정렬 */
}
.align-center{
    text-align: center;
}
.align-right{
    text-align: right;
}

/* 목록 */
table{
    width: 100%;
    border: 1px solid #000;
    border-collapse: collapse;
    margin-top: 5px;
}
table td, table th{
    border: 1px solid #000;
    padding: 5px;
}
/* 등록, 수정폼 */
form{
    width: 500px;
    margin: 0 auto;
    border: 1px solid #000;
    padding: 10px 10px 10px 30px;
}
ul{
    list-style: none;
    padding: 0; /* 리스트의 기본 padding 제거 */
}
li {
    margin-bottom: 10px; /* 각 항목 사이의 간격 조정 */
}
label{
    width: 100px;
    float: left; /* 태그를 왼쪽으로 정렬 */
    font-size: 15px;
}

#list > .align-right > input[type="button"]{
	font-family: "Noto Sans KR", sans-serif;
	border: 2px solid #7dbcf4;
	border-radius: 20px;
	cursor : pointer;
	width: 18%;
	background-color: white;
	padding: 7px;
	font-weight: bold;
	color: black;
	margin-bottom : 20px;
	box-shadow: 0 8px 16px 0 rgba(0,0,0,0.2), 0 6px 20px 0 rgba(0,0,0,0.19);
}
#list > .align-right > input[type="button"]:hover{
	color: white;
	background-color: #7dbcf4;
	font-weight: bold;
}

input[type="submit"],input[type="button"]{
    background-color: white;
    color: black;
    border: 1px solid #7dbcf4; 
    padding: 7px; 
    border-radius: 20px; 
    cursor: pointer; 
    transition: background-color 0.3s ease; 
    width: 15%;
}
input[type="submit"]:hover, input[type="button"]:hover {
    background-color: #7dbcf4;
    color:white;
}
input[type="text"],input[type="password"],input[type="email"],textarea {
    width: 60%; 
    padding: 8px; 
    border: 1px solid #ccc; 
    border-radius: 5px; 
    box-sizing: border-box; 
}
form {
    margin-top: 20px;
}
button{
	background-color: white;
    color: black;
    border: 1px solid #7dbcf4; 
    padding: 7px; 
    border-radius: 20px; 
    cursor: pointer; 
    transition: background-color 0.3s ease; 
    width: 50%;
}
button:hover {
    background-color: #7dbcf4;
    color:white;
}
a {
	text-decoration: none;
	color: #c2c3c4;
}
a:hover {
	color: black;
}

#detail_btn > input[type="button"] {
    background-color: white;
    color: black;
    border: 1px solid #7dbcf4; 
    padding: 7px; 
    border-radius: 20px; 
    cursor: pointer; 
    transition: background-color 0.3s ease; 
    width: 10%;
}

#detail_btn > input[type="button"]:hover {
    background-color: #7dbcf4;
    color:white;
}

#detail_page > li {
    margin-bottom: 5px; /* 각 항목 사이의 간격 조정 */
}

input[type=file]::file-selector-button {
  width: 30%;
  height: 30px;
  background: #fff;
  border: 1px solid #7dbcf4;
  border-radius: 20px;
  cursor: pointer;
}
 input[type=file]::file-selector-button:hover {
    background-color: #7dbcf4;
    color: #fff;
  }

p img {
  	display: block;
  	margin: 0 auto;
  	width: 70%;
  	height: auto;
}

 #detail_page > #title{
 	font-weight: bold;
 	font-size: 30px;
 }
 #detail_page > #writer{
 	font-size: 13px;
 	float: right;
 }
 #detail_page > #email{
 	font-size: 13px;
 	float: right;
 }
.image-container {
    max-width: 100%;
    height: auto; 
}
.image-container img {
    display: block;
  	margin: 0 auto;
  	width: 100%;
  	height: auto;
    margin-top: 10px;
}


뉴스 등록

뉴스 등록 폼 Action

package kr.news.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.controller.Action;

public class WriteFormAction implements Action {

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		return "/WEB-INF/views/writeForm.jsp";
	}

}

뉴스 등록 폼 View

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>뉴스 작성</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&display=swap" rel="stylesheet">
<script type="text/javascript">
	window.onload = function() {
		const myForm = document.getElementById('write_form')
		myForm.onsubmit = function() {
			const items = document
					.querySelectorAll('.input-check')
			for (let i = 0; i < items.length; i++) {
				if (items[i].value.trim() == '') {
					const label = document.querySelector('label[for="'+ items[i].id + '"]');
					alert(label.textContent + ' 항목은 필수 입력하셔야 합니다.');
					items[i].value = '';
					items[i].focus();
					return false;
				} // end of if
			} // end of for
		};
	};
</script>
</head>
<body>
<div class="page-main"> 
<h1>새 뉴스 작성</h1>
<form action="write.do" id="write_form" method="post" enctype="multipart/form-data">
<ul>
	<li>
		<label for="title">기사 제목</label>
		<input type="text" id="title" name="title" size="30" maxlength="50" class="input-check">
	</li>
	<li>
		<label for="writer">작성자</label>
		<input type="text" id="writer" name="writer" size="10" maxlength="10" class="input-check">
	</li>
	<li>
		<label for="passwd">비밀번호</label>
		<input type="password" id="passwd" name="passwd" size="12" maxlength="12" class="input-check">
	</li>
	<li>
		<label for="email">이메일</label>
		<input type="email" id="email" name="email" size="20" maxlength="50" class="input-check"> 
	</li>
	<li>
		<label for="article">기사 내용</label>
		<textarea rows="5" cols="40" id="article" name="article" class="input-check"></textarea>
	</li>
	<li>
    	<label for="filename">사진</label> 
		<input type="file" id="filename" name="filename" class="input-check" 
		accept="image/gif,image/png,image/jpeg">
	</li>
</ul>
	<div class="align-center">
		<input type="submit" value="등록">
		<input type="button" value="목록" onclick="location.href='list.do'">
	</div>
</form>
</div>
</body>
</html>

뉴스 등록 Action

package kr.news.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.controller.Action;
import kr.news.dao.NewsDAO;
import kr.news.vo.NewsVO;
import kr.util.FileUtil;

public class WriteAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		request.setCharacterEncoding("utf-8");
		
		NewsVO newsVO = new NewsVO();
		newsVO.setTitle(request.getParameter("title"));
		newsVO.setArticle(request.getParameter("article"));
		newsVO.setEmail(request.getParameter("email"));
		newsVO.setPasswd(request.getParameter("passwd"));
		newsVO.setWriter(request.getParameter("writer"));
														// 파라미터 명
		newsVO.setFilename(FileUtil.createFile(request,"filename"));
		
		NewsDAO dao = NewsDAO.getInstance();
		dao.registerNews(newsVO);
		
		return "/WEB-INF/views/write.jsp";
	}

}

뉴스 등록 View

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>뉴스 등록 완료</title>
<link rel="stylesheet" href="<%= request.getContextPath() %>/css/style.css">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&display=swap" rel="stylesheet">
</head>
<body>
	<div class="page-main">
		<h1>뉴스 작성 완료</h1>
		<div class="result-display">
			<div class="align-center">
			 	뉴스가 정상적으로 등록되었습니다.
				<p>
				<button onclick="location.href='list.do'">목록</button>
			</div>
		</div>
	</div>
</body>
</html>

뉴스 개수 / 목록

뉴스 목록 Action

package kr.news.action;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.controller.Action;
import kr.news.dao.NewsDAO;
import kr.news.vo.NewsVO;
import kr.util.PagingUtil;

public class ListAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		//선택한 페이지 반환
		String pageNum = request.getParameter("pageNum");
		if(pageNum==null) pageNum = "1";
		
		NewsDAO dao = NewsDAO.getInstance();
		int count = dao.getCount();
		
		PagingUtil page = new PagingUtil(
				  Integer.parseInt(pageNum),count,10,10,"list.do");
		
		List<NewsVO> list = null;
		if(count > 0) {
			list = dao.getList(page.getStartRow(), page.getEndRow());
		}
		
		request.setAttribute("count", count);
		request.setAttribute("list", list);
		request.setAttribute("page", page.getPage());
		
		//JSP 경로 반환
		return "/WEB-INF/views/list.jsp";
	}
}

뉴스 목록 View

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>뉴스 목록</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">
</head>
<body>
<div class="page-main" id="list">
	<h1>뉴스 목록</h1>
	<div class="align-right">
 		<input type="button" value="뉴스 작성" onclick="location.href='writeForm.do'">
	</div>
	<c:if test="${count == 0}">
	<div class="result-display">
		표시할 게시물이 없습니다.
	</div>
	</c:if>
	<c:if test="${count > 0}">
	<table>
		<tr>
			<th>글번호</th>
			<th>제목</th>
			<th>작성자</th>
			<th>작성일</th>
		</tr>
		<c:forEach var="newsVO" items="${list}">
		<tr>
			<td>${newsVO.num}</td>
			<td><a href="detail.do?num=${newsVO.num}">${newsVO.title}</a></td>
			<td>${newsVO.writer}</td>
			<td>${newsVO.reg_date}</td>
		</tr>
		</c:forEach>
	</table>
	<div class="align-center">
		${page}
	</div>
	</c:if>
</div>
</body>
</html>

뉴스 세부

뉴스 상세 정보 View

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="kr.news.dao.NewsDAO"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>뉴스 상세 정보</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&display=swap" rel="stylesheet">
</head>
<body>
<div class="page-main">
    <h1>${newsVO.num}번 뉴스 보기</h1>
    <ul id="detail_page">
        <li id="title">${newsVO.title}</li>

        <li id="writer">작성자 : ${newsVO.writer}<br>${newsVO.email}</li>
    </ul>
    <hr width="100%" size="1" noshade="noshade">
    <p><img src="${pageContext.request.contextPath}/upload/${newsVO.filename}" alt="뉴스 이미지"></p>
    <p>${newsVO.article}</p>
    <hr width="100%" size="1" noshade="noshade">
    
    <div class="align-right" id="detail_btn">
        작성일 : ${newsVO.reg_date}
		<input type="button" value="수정" onclick="location.href='modifyForm.do?num=${newsVO.num}'">
		<input type="button" value="삭제" onclick="location.href='deleteForm.do?num=${newsVO.num}'">
		<input type="button" value="목록" onclick="location.href='list.do'">
    </div>
</div>
</body>
</html>

뉴스 세부 정보 Action

package kr.news.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.controller.Action;
import kr.news.dao.NewsDAO;
import kr.news.vo.NewsVO;

public class DetailAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("UTF-8");
		
		// 해당 뉴스 번호 가져옴
		int num = Integer.parseInt(request.getParameter("num"));
		
		NewsVO newsVO = new NewsVO();
		NewsDAO dao = NewsDAO.getInstance();
		newsVO = dao.getNews(num);
		
		request.setAttribute("newsVO", newsVO);
		
		return "/WEB-INF/views/detail.jsp";
	}

}

뉴스 수정

뉴스 수정 폼 Action

package kr.news.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.controller.Action;
import kr.news.dao.NewsDAO;
import kr.news.vo.NewsVO;

public class ModifyFormAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		request.setCharacterEncoding("utf-8");
		
		int num = Integer.parseInt(request.getParameter("num"));
		NewsVO newsVO = new NewsVO();
		NewsDAO dao = NewsDAO.getInstance();
		newsVO = dao.getNews(num);
		
		request.setAttribute("newsVO", newsVO);
		
		return "/WEB-INF/views/modifyForm.jsp";
	}

}

뉴스 수정 폼 View

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>뉴스 수정</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/style.css" type="text/css">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&display=swap" rel="stylesheet">
<script type="text/javascript">
	window.onload = function() {
		const myForm = document.getElementById('modify_form')
		myForm.onsubmit = function() {
			const items = document
					.querySelectorAll('.input-check')
			for (let i = 0; i < items.length; i++) {
				if (items[i].value.trim() == '') {
					const label = document.querySelector('label[for="'+ items[i].id + '"]');
					alert(label.textContent + ' 항목은 필수 입력하셔야 합니다.');
					items[i].value = '';
					items[i].focus();
					return false;
				} // end of if
			} // end of for
		};
	};
</script>
</head>
<body>
<div class="page-main"> 
<h1>뉴스 수정</h1>
<form action="modify.do" id="modify_form" method="post" enctype="multipart/form-data">
	<input type="hidden" value="${newsVO.num}" name="num">
<ul>
	<li>
		<label for="title">기사 제목</label>
		<input type="text" id="title" name="title" size="30" maxlength="50" class="input-check"
		value="${newsVO.title}">
	</li>
	<li>
		<label for="writer">작성자</label>
		<input type="text" id="writer" name="writer" size="10" maxlength="10" class="input-check"
		value="${newsVO.writer}">
	</li>
	<li>
		<label for="passwd">비밀번호</label>
		<input type="password" id="passwd" name="passwd" size="12" maxlength="12" class="input-check">
	</li>
	<li>
		<label for="email">이메일</label>
		<input type="email" id="email" name="email" size="20" maxlength="50" class="input-check"
		value="${newsVO.email}"> 
	</li>
	<li>
		<label for="article">기사 내용</label>
		<textarea rows="5" cols="40" id="article" name="article" class="input-check">${newsVO.article}</textarea>
	</li>
	<li class="image-container">
        <label for="filename">사진</label> 
        <input type="file" id="filename" name="filename" accept="image/gif,image/png,image/jpeg">
        <img src="${pageContext.request.contextPath}/upload/${newsVO.filename}" alt="뉴스 이미지">
    </li>


</ul>
	<div class="align-center">
		<input type="submit" value="등록">
		<input type="button" value="목록" onclick="location.href='list.do'">
	</div>
</form>
</div>
</body>
</html>

뉴스 수정 Action

package kr.news.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.controller.Action;
import kr.news.dao.NewsDAO;
import kr.news.vo.NewsVO;
import kr.util.FileUtil;

public class ModifyAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		request.setCharacterEncoding("utf-8");
		
		int num = Integer.parseInt(request.getParameter("num"));
		String passwd = request.getParameter("passwd");
		
		NewsDAO dao = NewsDAO.getInstance();
		NewsVO db_news = dao.getNews(num);
		
		boolean check = false;
		if(db_news != null) { // 게시물이 존재할 때 비밀번호 확인
			check = db_news.isCheckedPassword(passwd);
		}
		if(check) { // 비밀번호가 일치할 때 update 메소드 실행
			NewsVO newsVO = new NewsVO();
			newsVO.setNum(num);
			newsVO.setTitle(request.getParameter("title"));
			newsVO.setWriter(request.getParameter("writer"));
			newsVO.setEmail(request.getParameter("email"));
			newsVO.setArticle(request.getParameter("article"));
			newsVO.setFilename(FileUtil.createFile(request,"filename"));
			dao.update(newsVO);
			
			if(newsVO.getFilename()!=null && !newsVO.getFilename().isEmpty()) {
				// 새 파일로 교체할 때 원래 파일 제거
				FileUtil.removeFile(request, db_news.getFilename());
			}
			
			// 상세페이지로 이동하기 위해 글 번호를 저장
			request.setAttribute("num", newsVO.getNum());
		} 
				
		request.setAttribute("check", check);
		
		return "/WEB-INF/views/modify.jsp";
	}

}

뉴스 수정 View

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${check }">
	<script type="text/javascript">
		alert('뉴스 수정을 완료하였습니다.');
		location.href ='detail.do?num=${num}';
	</script>
</c:if>
<c:if test="${!check }">
	<script type="text/javascript">
		alert('비밀번호가 불일치합니다.');
		history.go(-1);
	</script>
</c:if>

뉴스 삭제

뉴스 삭제 폼 Action

package kr.news.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.controller.Action;

public class DeleteFormAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		int num = Integer.parseInt(request.getParameter("num"));
		
		request.setAttribute("num", num);
		
		return "/WEB-INF/views/deleteForm.jsp";
	}

}

뉴스 삭제 폼 View

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	int num = Integer.parseInt(request.getParameter("num"));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>뉴스 삭제</title>
<link rel="stylesheet" href="<%= request.getContextPath() %>/css/style.css">
<link
	href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100..900&display=swap"
	rel="stylesheet">
<script type="text/javascript">
window.onload=function(){
	const myForm = document.getElementById('delete_form');
	// 이벤트 연결
	myForm.onsubmit=function(){
		const passwd = document.getElementById('passwd');
		if(passwd.value.trim()==''){
			alert('비밀번호를 입력하세요');
			passwd.value='';
			passwd.focus();
			return false;
		}
	}
}
</script>
</head>
<body>
<div class="page-main">
	<h2>뉴스 삭제</h2>
	<form action="delete.do" method="post" id="delete_form">
			<input type="hidden" name="num" value="${num}">
			<ul>
				<li>
				<label for="passwd">비밀번호</label>
				<input type="password" name="passwd" id="passwd" size="12" maxlength="12">
				</li>
			</ul>
			<div class="align-center">
				<input type="submit" value="삭제">
				<input type="button" value="목록" onclick="location.href='list.do'">
			</div>
		</form>
</div>	
</body>
</html>

뉴스 삭제 Action

package kr.news.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.controller.Action;
import kr.news.dao.NewsDAO;
import kr.news.vo.NewsVO;

public class DeleteAction implements Action{

	@Override
	public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
		request.setCharacterEncoding("utf-8");
		
		NewsVO newsVO = new NewsVO();
		newsVO.setNum(Integer.parseInt(request.getParameter("num")));
		newsVO.setPasswd(request.getParameter("passwd"));
		
		NewsDAO dao = NewsDAO.getInstance();
		NewsVO db_news = dao.getNews(newsVO.getNum());
		
		boolean check = false;
		if(db_news != null) {
			check =  db_news.isCheckedPassword(newsVO.getPasswd());
		}
		if(check) {
			dao.delete(newsVO.getNum());
		}
		request.setAttribute("check", check);
		
		return "/WEB-INF/views/delete.jsp";
	}

}

뉴스 삭제 View

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${check }">
	<script type="text/javascript">
		alert('뉴스 삭제가 완료되었습니다.');
		location.href ='list.do';
	</script>
</c:if>
<c:if test="${!check }">
	<script type="text/javascript">
		alert('비밀번호가 불일치합니다.');
		history.go(-1);
	</script>
</c:if>

MVC Page 실습

Web.xml 수정사항

max-file-size : 한 파일의 최대 크기
max-request-size : 사이트에서 최대로 받을 수 있는 파일의 총 크기
Member.properties -> 변경된 properties 이름

	<multipart-config>
  		<max-file-size>5242880</max-file-size>	<!-- 5M -->
  		<max-request-size>52428800</max-request-size>	<!-- 50M -->
  	</multipart-config>
    <init-param>
  		<param-name>propertiesPath</param-name>
  		<param-value>/WEB-INF/Member.properties</param-value>
  	</init-param>

Index - JSP

첫 번째로 보여주는 화면
-> main 폴더의 main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	response.sendRedirect(request.getContextPath()+"/main/main.do");
%>

Table 생성

zmember, zmember_detail :

-- 회원 관리
-- 여기에 저장되어 있는 id는 사용할 수 없도록 한다.
create table zmember(
mem_num number not null,
id varchar2(12) unique not null,
auth number(1) default 2 not null, -- 회원 등급 : 0:탈퇴 회원, 1:정지 회원, 2:일반 회원, 9:관리자
constraint zmember_pk primary key (mem_num)
);

Create sequence zmember_seq;

-- 상세 페이지용 Join 해서 사용하기
-- 재가입을 못하게 하도록 테이블을 분리하여 처리함 -> 탈퇴할 때 이 테이블의 내용들을 다 없애야한다
create table zmember_detail(
mem_num number not null,
name varchar2(30) not null,
passwd varchar2(12) not null,
phone varchar2(15) not null,
email varchar2(50) not null,
zipcode varchar2(5) not null,
address1 varchar2(90) not null,
address2 varchar2(90) not null,
photo varchar2(400),
reg_date date default sysdate not null,
modify_date date,
constraint zmember_detail_pk primary key (mem_num),
constraint zmember_detail_fk foreign key (mem_num) references zmember (mem_num)
);
profile
Lucky Things🍀

0개의 댓글