728x90
반응형
모델 1 방식을 활용하여 게시판 만들기
//NoticeDTO.java
package miniPrj02.BMK02;
import java.util.Date;
/*
* board 테이블에 데이터를 저장하거나 전송하기 위한 DTO(Data Transfer Object)
*/
public class NoticeBoardDTO {
//멤버변수 선언
private String num;
private String title;
private String content;
private String id;
private Date postdate;
private String visitcount;
private String name;
public NoticeBoardDTO() {
// TODO Auto-generated constructor stub
}
public NoticeBoardDTO(String num, String title, String content, String id, Date postdate, String visitcount,
String name) {
// super();
this.num = num;
this.title = title;
this.content = content;
this.id = id;
this.postdate = postdate;
this.visitcount = visitcount;
this.name = name;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
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 getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Date getPostdate() {
return postdate;
}
public void setPostdate(Date postdate) {
this.postdate = postdate;
}
public String getVisitcount() {
return visitcount;
}
public void setVisitcount(String visitcount) {
this.visitcount = visitcount;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//NoticeDAO.java
//게시글 검색, 상세보기, 작성, 수정, 삭제을 위해 작성
package miniPrj02.BMK02;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/*
* DAO(Data Access Object)는 DB에 접근하여 CRUD 작업 수행하기 위한 객체
*/
import javax.sql.DataSource;
/*
* num NUMBER PRIMARY KEY
, title varchar2(200) NOT NULL
, content varchar2(2000) NOT NULL
, id varchar2(10) NOT NULL
, postdate DATE DEFAULT sysdate NOT NULL
, visitcount number(6)
ADD CONSTRAINT noticeboard_memberform_fk FOREIGN key(id)
REFERENCES member(id);
CREATE SEQUENCE seq_noticeboard_num
INCREMENT BY 1
START WITH 1
MINVALUE 1
NOmaxvalue
NOcycle
NOcache;
*/
public class NoticeBoardDAO {
private Connection conn;
private PreparedStatement pstmt;
private DataSource dataFactory;
private Statement stmt;
private ResultSet rs;
public NoticeBoardDAO() {
try {
Context ctx = new InitialContext();
Context envContext = (Context)ctx.lookup("java:/comp/env"); //JDNI에 접근하기 위해 기본경로를 지정함
dataFactory = (DataSource)envContext.lookup("jdbc/oracle"); // 톰캣 context.xml에 설정한 name 값인 jdbc/oracle을 이용해 톰캣이 미리 연결한 DataSource를 받아옴
System.out.println("DB 연결 성공");
} catch (NamingException e) {
e.printStackTrace();
System.out.println("DB 연결 실패");
}
}
//검색 조건에 맞는 게시물의 개수 반환
public int selectCount(Map<String, Object> map) {
int totalCount = 0; //결과(게시물 수)를 담는 변수
//게시물 수를 얻어오는 쿼리문
//검색어가 있는 경우 Map 컬렉션에 키로 저장된 값이 있을 때만 where절을 추가함
String query = "select count(*) from noticeboard";
if(map.get("searchWord") != null) {
query += " where " +map.get("searchField")+ " " + " Like '%"+map.get("searchWord")+"%'";
}
try {
conn = dataFactory.getConnection();
stmt = conn.createStatement(); //쿼리문 생성
rs = stmt.executeQuery(query); //쿼리문 실행행
rs.next(); //커서를 첫번째 행으로 이동
totalCount = rs.getInt(1); //첫번째 컬럼 값을 가져옴
}
catch (Exception e) {
System.out.println("게시물 수를 구하는 중 예외 발생");
e.printStackTrace();
}
return totalCount;
}
public List<NoticeBoardDTO> selectList(Map<String, Object> map){
List<NoticeBoardDTO> bbs = new ArrayList<NoticeBoardDTO>(); //결과(게시물 목록)를 담을 변수
String query = "SELECT * FROM noticeboard ";
if(map.get("searchWord") != null) {
query += " WHERE " +map.get("searchField")+ ""
+ " LIKE '%"+map.get("searchWord")+"%'";
}
query += " ORDER BY NUM DESC"; //항상 최근 게시물이 상단에 출력 => 일련번호 컬럼 num 내림차순
try {
conn = dataFactory.getConnection();
stmt = conn.createStatement(); //쿼리문 생성
rs = stmt.executeQuery(query); //쿼리문 실행
while(rs.next()){
//한행(게시물하나) 내용을 DTO에 저장
NoticeBoardDTO dto = new NoticeBoardDTO();
dto.setNum(rs.getString("num")); //일련번호
dto.setTitle(rs.getString("title")); //제목
dto.setContent(rs.getString("content")); //내용
dto.setPostdate(rs.getDate("postdate")); //작성일
dto.setId(rs.getString("id")); //작성자 아이디
dto.setVisitcount(rs.getString("visitcount")); //조회수
bbs.add(dto); //결과 목록에 저장
}
}
catch (Exception e) {
System.out.println("게시물 조회 중 예외 발생");
e.printStackTrace();
}
return bbs;
}
//게시글 데이터를 받아 DB에 추가함
public int insertWrite(NoticeBoardDTO dto) {
int result = 0;
try {
conn = dataFactory.getConnection();
String query = "INSERT INTO Noticeboard (num, title, content, id, visitcount) VALUES (seq_noticeboard_num.nextval, ?, ?, ?, 0)";
pstmt = conn.prepareStatement(query);
pstmt.setString(1, dto.getTitle());
pstmt.setString(2, dto.getContent());
pstmt.setString(3, dto.getId());
result = pstmt.executeUpdate();
}
catch (Exception e) {
System.out.println("게시물 입력 중 예외 발생");
e.printStackTrace();
}
return result;
}
//선택한 게시물 상세 내용 반환하기
public NoticeBoardDTO selectView(String num) {
NoticeBoardDTO dto = new NoticeBoardDTO();
String query = "SELECT noticeboard.*, memberform.NAME "
+ "FROM MEMBERform "
+ "INNER JOIN noticeBOARD ON memberform.ID = noticeboard.ID "
+ "WHERE num = ?";
try {
conn = dataFactory.getConnection();
pstmt = conn.prepareStatement(query);
pstmt.setString(1, num);
rs = pstmt.executeQuery(); //쿼리 실행
//결과 처리
if(rs.next()) {
dto.setNum(rs.getString(1));
dto.setTitle(rs.getString(2));
dto.setContent(rs.getString("content"));
dto.setPostdate(rs.getDate("postdate"));
dto.setId(rs.getString("id"));
dto.setVisitcount(rs.getString(6));
dto.setName(rs.getString("name"));
}
}
catch (Exception e) {
System.out.println("게시물 상세보기 중 예외 발생");
e.printStackTrace();
}
return dto;
}
//선택된 게시물의 조회수 1 증가시킴
public void updateVisitCount(String num) {
String query = "UPDATE noticeBOARD SET VISITCOUNT = VISITCOUNT + 1 WHERE NUM = ?";
try {
conn = dataFactory.getConnection();
pstmt = conn.prepareStatement(query);
pstmt.setString(1, num);
rs = pstmt.executeQuery(); //쿼리 실행
}
catch (Exception e) {
System.out.println("게시물 조회수 증가 중 예외 발생");
e.printStackTrace();
}
}
//지정한 게시물을 수정함
public int updateEdit(NoticeBoardDTO dto) {
int result = 0;
String query = "update Noticeboard set title = ?, content = ? where num = ?";
try {
conn = dataFactory.getConnection();
pstmt = conn.prepareStatement(query);
pstmt.setString(1, dto.getTitle());
pstmt.setString(2, dto.getContent());
pstmt.setString(3, dto.getNum());
result = pstmt.executeUpdate(); //쿼리문 실행
}
catch (Exception e) {
System.out.println("게시물 수정 중 예외 발생");
e.printStackTrace();
}
return result;
}
//선택한 게시물을 삭제함
public int deletePost(NoticeBoardDTO dto) {
int result = 0;
try {
conn = dataFactory.getConnection();
String query = "Delete from NoticeBoard Where num = ?";
pstmt = conn.prepareStatement(query);
pstmt.setString(1, dto.getNum());
result = pstmt.executeUpdate();
}
catch (Exception e) {
System.out.println("게시물 삭제 중 예외 발생");
e.printStackTrace();
}
return result;
}
public void close() throws SQLException {
if(conn != null) conn.close();
if(pstmt != null) pstmt.close();
if(rs != null) rs.close();
if(stmt != null) stmt.close();
}
}
//JSFuction.java
//메시지 알림창
package miniPrj02.BMK02;
import javax.servlet.jsp.JspWriter;
public class JSFunction {
// 메시지 알림창을 띄운 후, 명시한 URL로 이동함
/*
* msg : 알림창에 띄울 메세지
* url : 알림창을 닫은 후 이동할 페이지 URL
* out : 자바 스크립트 코드를 삽입할 출력 스트림
*/
public static void alertLocation(String msg, String url, JspWriter out) {
try {
String script = ""
+ "<script>"
+ " alert('"+msg+"');"
+ " location.href='"+url+"';"
+ "</script>";
out.println(script);
}
catch (Exception e) {
e.printStackTrace();
}
}
//메세지 알림창을 띄운 후 이전 페이지로 돌아감
public static void alertBack(String msg, JspWriter out) {
try {
String script = ""
+ "<script>"
+ " alert('"+msg+"');"
+ " history.back();"
+ "</script>";
out.println(script);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
//로그인 정보가 없을 때 ==> 로그인 페이지로 이동시키는 페이지
<%@page import="miniPrj02.BMK02.JSFunction"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
if(session.getAttribute("UserId") == null){
JSFunction.alertLocation("로그인 후 이용해주세요.", "../../HomePage/JSP/Login.jsp", out);
return;
}
%>
1. 로그인을 통해 게시판 글쓰기, 수정 등이 가능하기 때문에 먼저 DB에 저장된 아이디와 패스워드를 통해 로그인을 진행함
//NoticeList.jsp
//게시판 리스트
<%@page import="miniPrj02.BMK02.NoticeBoardDAO"%>
<%@page import="miniPrj02.BMK02.NoticeBoardDTO"%>
<%@page import="java.util.List"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
/* DAO 생성해 DB 연결 */
NoticeBoardDAO dao = new NoticeBoardDAO();
/* //사용자가 입력한 검색 조건을 Map에 저장 */
Map<String,Object> param = new HashMap<>();
String searchField = request.getParameter("searchField");
String searchWord = request.getParameter("searchWord");
if(searchWord != null){
param.put("searchField", searchField);
param.put("searchWord", searchWord);
}
int totalCount = dao.selectCount(param); /* 게시물 수 확인 */
List<NoticeBoardDTO> boardLists = dao.selectList(param); /* 게시물 목록 받기 */
dao.close(); //DB 연결 닫기
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>쇼핑몰 홈페이지</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.14.0/css/all.css"
integrity="sha384-HzLeBuhoNPvSl5KYnjx0BT+WB0QEEqLprO+NBkkk5gbc67FTaL7XIGa2w1L0Xbgc" crossorigin="anonymous">
<link rel="stylesheet" href="../CSS/headerTopBarIcon.css">
<link rel="stylesheet" href="../CSS/navBanner.css">
<link rel="stylesheet" href="../CSS/contentFooter.css">
<link rel="stylesheet" href="../CSS/homePageNotice.css">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap" rel="stylesheet">
</head>
<body>
<div class="wrap">
<div class="header">
<div class="topBar">
<a class="topLogo" href="../../HomePage/JSP/HomePage.jsp"><img src="../IMG/logo.jpg" alt="대체 텍스트"></a>
<div class="searchBox">
<input type="text">
<a class="search" href="#"><i class="fas fa-search"></i></a>
</div>
<div class="topBarIcon">
<a href="#"><i class="fas fa-door-open"></i></a>
<%
if(session.getAttribute("UserId") == null){
%>
<a href="../../HomePage/JSP/Login.jsp"><i class="far fa-user"></i></a>
<%
}
else{
%>
<a href="../../HomePage/JSP/Logout.jsp"><i class="far fa-user-check"></i></a>
<%
}
%>
<a href="#"><i class="fas fa-shopping-cart"></i></a>
</div>
</div>
</div>
<div class="nav">
<div class="navBox">
<ul>
<li class="navBoxFirst"><a href=""><i class="fas fa-bars"></i>전체메뉴</a></li>
<li><a href="">회사소개</a></li>
<li><a href="">브랜드정보</a></li>
<li><a href="">제품정보</a></li>
<li><a href="NoticeList.jsp">게시판</a></li>
</ul>
</div>
</div>
<div class="notice">
<%-- <jsp:include page="Link.jsp"></jsp:include> --%>
<h2>목록 보기</h2>
<!-- 검색폼 -->
<form action="#" method="get" >
<table border="1" width="90%" class="ntTable">
<tr>
<td>
<select name="searchField">
<option value="title">제목</option>
<option value="content">내용</option>
</select>
<input type="text" name="searchWord">
<input type="submit" value="검색하기">
</td>
</tr>
</table>
</form>
<!-- 게시물 목록 테이블 추가 -->
<table border="1" width="100%" class="ntTable">
<!-- 컬럼이름 -->
<tr>
<th width="20%">번호</th>
<th width="20%">제목</th>
<th width="20%">작성자</th>
<th width="20%">조회수</th>
<th width="20%">작성일</th>
</tr>
<!-- 목록 내용 -->
<%
if(boardLists.isEmpty()){
%>
<tr>
<td colspan="5" align="center">
등록된 게시물이 없습니다!!
</td>
</tr>
<%
}
else{
int virtualNum = 0; //화면상의 게시물 번호
for (NoticeBoardDTO dto : boardLists){
virtualNum = totalCount--; //전체 게시물 수에서 시작해 1개씩 감소
%>
<tr align="center">
<td><%=virtualNum %></td> <!-- 게시물 번호 -->
<td align="left">
<a href="View.jsp?num=<%=dto.getNum() %>"><%=dto.getTitle()%></a>
</td>
<td align="center"><%=dto.getId() %></td> <!-- 작성자 아이디 -->
<td align="center"><%=dto.getVisitcount() %></td> <!-- 조회수 -->
<td align="center"><%=dto.getPostdate() %></td> <!-- 작성일 -->
</tr>
<%
}
}
%>
</table>
<!-- [글쓰기]버튼 -->
<table border="1" width="100%" class="ntTable">
<tr align="right">
<td>
<button type="button" onclick="location.href='Write.jsp';">글쓰기</button>
</td>
</tr>
</table>
<div class="ntPaging">
<ul id="pagingul">페이지 번호</ul>
</div>
</div>
<div class="footer">
<div class="footerContent">
<div class="footerLinkList">
<ul>
<li><a href="#">회사소개</a></li>
<li><a href="#">이용약관</a></li>
<li><a href="#">개인정보처리방침</a></li>
<li><a href="#">사고대응메뉴얼</a></li>
<li><a href="#">상품문의</a></li>
</ul>
</div>
<div class="companyInfo">
<span>
주식회사 강사모<br/>
서울특별시 서초구 교보타워<br/>
사업자등록번호 : 123-29-123456<br/>
통신판매업신고 제2021-서울서초-9999호<br/>
고객센터: 070-1111-1111 / puppylove@puppylove.co.kr<br/>
</span>
</div>
</div>
</div>
</div>
</body>
</html>
//Login.jsp
<%@ page import="miniPrj02.BMK01.CookieManager"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500&display=swap" rel="stylesheet">
<link rel="stylesheet" href="../CSS/login.css">
</head>
<body>
<div class="wrap">
<form action="LoginProcess.jsp" name="frmLogin" method="post" class="frmLogin"
enctype="application/x-www-form-urlencoded" accept-charset="utf-8" onsubmit="return validateForm(this)">
<div class="loginFrm">
<div class="frmList">
<h2>로그인</h2>
<span style="color: red; font-size: 1.2em;">
<%= request.getAttribute("LoginErrMsg") == null ? "" : request.getAttribute("LoginErrMsg") %>
</span>
<%
if(session.getAttribute("UserId") == null){ //로그인 상태 확인 => 값이 null이면 저장되지 않은 것
// => 로그아웃 상태를 뜻함
%>
<script type="text/javascript">
function validateForm(form){
if(!form.user_id.value){
alert("아이디를 입력하세요.");
return false;
}
if(form.user_pw.value == ""){
alert("패스워드를 입력하세요.");
return false;
}
}
</script>
<div class="login_id">
<label><span>아이디 : </span><input class="text" type="user_id" name="user_id" placeholder="아이디"></label>
</div>
<div class="login_pw" >
<label><span>비밀번호 : </span><input class="password" type="password" name="user_pw" placeholder="비밀번호"></label>
</div>
<div class="login_btn">
<%
//CookieManager 클래스를 이용하여 이름이 loginId인 쿠키를 읽어와 loginId변수에 저장함.
//저장된 아이디가 있다면, 이 값이 아이디 입력창의 기본값으로 쓰일 것임
String loginId = CookieManager.readCookie(request, "loginId");
String cookieCheck = "";
if(!loginId.equals("")){ //저장된 아이디가 있다면 loginId에 비어있는 문자열 외의 문자열을 저장해둠
cookieCheck = "checked"; //cookieCheck에 "checked"가 대입됨
//==>[아이디 저장하기] 체크박스에 checked 속성 부여될 것임
}
%>
<input type="checkbox" name="user_save" value="Y" <%= cookieCheck %>> 아이디 저장
<input class="btnSubmit" type="submit" value="로그인" >
</div>
<div class="sign_up">
<a class="join" href="MemberForm.jsp">회원가입</a>
<a class="searchIdAndPwd" href="SearchId.jsp">아이디 찾기</a>
<a class="searchIdAndPwd" href="SearchPwd.jsp">패스워드 찾기</a>
</div>
</div>
</div>
</form>
<%
}
else{ //로그인 된 상태
%>
<%= session.getAttribute("UserName")%> 회원님, 로그인하셨습니다.<br>
<jsp:forward page="HomePage.jsp"/>
<%
}
%>
</div>
</body>
</html>
-----------------------------------------------------------------------------------------------------------------------------
//LoginProcess.jsp
<%@page import="miniPrj02.BMK01.MemberBean"%>
<%@page import="miniPrj02.BMK01.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//로그인 폼으로부터 받은 아이디와 패스워드
String userId = request.getParameter("user_id");
String userPw = request.getParameter("user_pw");
//회원 테이블에 DAO를 통해 회원 정보가 있는 bean 정보를 획득
MemberDAO dao = new MemberDAO();
MemberBean bn = dao.getMember(userId, userPw);
dao.close();
if(bn.getId() != null){
//로그인 성공
session.setAttribute("UserId", bn.getId());
session.setAttribute("UserName", bn.getName());
response.sendRedirect("Login.jsp");
}
else{
//로그인 실패
request.setAttribute("LoginErrMsg", "로그인 오류입니다.");
request.getRequestDispatcher("Login.jsp").forward(request, response);
}
%>
-----------------------------------------------------------------------------------------------------------------------------
//Logout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//방법1: 회원인증정보 속성 삭제
/* session.removeAttribute("UserId");
session.removeAttribute("UserName"); */
//방법2: 모든 속성 한꺼번에 삭제
session.invalidate();
//속성 삭제후 페이지 이동
response.sendRedirect("LoginForm.jsp");
%>
2. 글쓰기 작성 버튼을 클릭하여 게시글 작성
//Write.jsp
<%@page import="miniPrj02.BMK02.JSFunction"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
if(session.getAttribute("UserId") == null){
JSFunction.alertLocation("로그인 후 이용해주세요.", "../../HomePage/JSP/Login.jsp", out);
return;
}
%> <%-- 로그인 확인 --%>
<%
request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.14.0/css/all.css"
integrity="sha384-HzLeBuhoNPvSl5KYnjx0BT+WB0QEEqLprO+NBkkk5gbc67FTaL7XIGa2w1L0Xbgc" crossorigin="anonymous">
<link rel="stylesheet" href="../CSS/headerTopBarIcon.css">
<link rel="stylesheet" href="../CSS/navBanner.css">
<link rel="stylesheet" href="../CSS/contentFooter.css">
<link rel="stylesheet" href="../CSS/homePageNotice.css">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap" rel="stylesheet">
<title>게시판 내용 작성</title>
<script type="text/javascript">
function validateForm(form){ //폼 내용 검증
if(form.title.value == ""){
alert("제목을 입력하세요.");
form.title.focus();
return false;
}
if(form.content.value == ""){
alert("내용을 입력하세요.");
form.content.focus();
return false;
}
}
</script>
</head>
<body>
<div class="wrap">
<div class="header">
<div class="topBar">
<a class="topLogo" href="../../HomePage/JSP/HomePage.jsp"><img src="../IMG/logo.jpg" alt="대체 텍스트"></a>
<div class="searchBox">
<input type="text">
<a class="search" href="#"><i class="fas fa-search"></i></a>
</div>
<div class="topBarIcon">
<a href="#"><i class="fas fa-door-open"></i></a>
<%
if(session.getAttribute("UserId") == null){
%>
<a href="../../HomePage/JSP/Login.jsp"><i class="far fa-user"></i></a>
<%
}
else{
%>
<a href="../../HomePage/JSP/Logout.jsp"><i class="far fa-user-check"></i></a>
<%
}
%>
<a href="#"><i class="fas fa-shopping-cart"></i></a>
</div>
</div>
</div>
<div class="nav">
<div class="navBox">
<ul>
<li class="navBoxFirst"><a href=""><i class="fas fa-bars"></i>전체메뉴</a></li>
<li><a href="">회사소개</a></li>
<li><a href="">브랜드정보</a></li>
<li><a href="">제품정보</a></li>
<li><a href="NoticeList.jsp">게시판</a></li>
</ul>
</div>
</div>
<div class="notice">
<%-- <jsp:include page="Link.jsp"/> --%>
<h2>회원제 게시판 - 글쓰기</h2>
<form action="WriteProcess.jsp" name="writeFrm" method="post" onsubmit="return validateForm(this)">
<table border="1" width="100%">
<tr>
<td align="center">제목</td>
<td>
<input type="text" name="title" style="width: 100%; height: 100px">
</td>
</tr>
<tr>
<td align="center">내용</td>
<td>
<textarea name="content" style="width:100%; height: 300px;"></textarea>
</td>
</tr>
<tr>
<td colspan="2" align="center" height="30px">
<button type="submit" >작성완료</button>
<button type="reset">다시입력</button>
<button type="button" onclick="location.href='NoticeList.jsp';">목록보기</button>
</td>
</tr>
</table>
</form>
</div>
<div class="footer">
<div class="footerContent">
<div class="footerLinkList">
<ul>
<li><a href="#">회사소개</a></li>
<li><a href="#">이용약관</a></li>
<li><a href="#">개인정보처리방침</a></li>
<li><a href="#">사고대응메뉴얼</a></li>
<li><a href="#">상품문의</a></li>
</ul>
</div>
<div class="companyInfo">
<span>
주식회사 강사모<br/>
서울특별시 서초구 교보타워<br/>
사업자등록번호 : 123-29-123456<br/>
통신판매업신고 제2021-서울서초-9999호<br/>
고객센터: 070-1111-1111 / puppylove@puppylove.co.kr<br/>
</span>
</div>
</div>
</div>
</div>
</body>
</html>
--------------------------------------------------------------------------------------------------------------
//WriteProcess.jsp
<%@page import="miniPrj02.BMK02.JSFunction"%>
<%@page import="miniPrj02.BMK02.NoticeBoardDAO"%>
<%@page import="miniPrj02.BMK02.NoticeBoardDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
%>
<%
//write.jsp 폼값 얻기
String title = request.getParameter("title");
String content = request.getParameter("content");
//폼값을 DTO에 저장
NoticeBoardDTO dto = new NoticeBoardDTO();
dto.setTitle(title);
dto.setContent(content);
dto.setId(session.getAttribute("UserId").toString());
//DB에 DTO 입력
NoticeBoardDAO dao = new NoticeBoardDAO();
int iResult = dao.insertWrite(dto);
dao.close();
if(iResult == 1){
response.sendRedirect("NoticeList.jsp");
}
else{
JSFunction.alertBack("로그인에 실패했습니다.", out);
}
%
3. 게시글 검색하기
4. 게시글 상세보기
//View.jsp
<%@page import="miniPrj02.BMK02.NoticeBoardDAO"%>
<%@page import="miniPrj02.BMK02.NoticeBoardDTO"%>
<%@page import="java.util.List"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.HashMap"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String num = request.getParameter("num");
NoticeBoardDAO dao = new NoticeBoardDAO();
dao.updateVisitCount(num); //조회수 증가
NoticeBoardDTO dto = dao.selectView(num);
%>
<!DOCTYPE html>
<html>
<script type="text/javascript">
function deletePost(){
var confirmed = confirm("정말로 삭제하겠습니까?");
if(confirmed){
var form = document.writeFrm;
form.method = "post"; //전송방식
form.action = "DeleteProcess.jsp" //전송경로
form.submit(); //폼값 전송
}
}
</script>
<html>
<head>
<meta charset="UTF-8">
<title>쇼핑몰 홈페이지</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.14.0/css/all.css"
integrity="sha384-HzLeBuhoNPvSl5KYnjx0BT+WB0QEEqLprO+NBkkk5gbc67FTaL7XIGa2w1L0Xbgc" crossorigin="anonymous">
<link rel="stylesheet" href="../CSS/headerTopBarIcon.css">
<link rel="stylesheet" href="../CSS/navBanner.css">
<link rel="stylesheet" href="../CSS/contentFooter.css">
<link rel="stylesheet" href="../CSS/homePageNotice.css">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap" rel="stylesheet">
</head>
<body>
<div class="wrap">
<div class="header">
<div class="topBar">
<a class="topLogo" href="../../HomePage/JSP/HomePage.jsp"><img src="../IMG/logo.jpg" alt="대체 텍스트"></a>
<div class="searchBox">
<input type="text">
<a class="search" href="#"><i class="fas fa-search"></i></a>
</div>
<div class="topBarIcon">
<a href="#"><i class="fas fa-door-open"></i></a>
<%
if(session.getAttribute("UserId") == null){
%>
<a href="../../HomePage/JSP/Login.jsp"><i class="far fa-user"></i></a>
<%
}
else{
%>
<a href="../../HomePage/JSP/Logout.jsp"><i class="far fa-user-check"></i></a>
<%
}
%>
<a href="#"><i class="fas fa-shopping-cart"></i></a>
</div>
</div>
</div>
<div class="nav">
<div class="navBox">
<ul>
<li class="navBoxFirst"><a href="#"><i class="fas fa-bars"></i>전체메뉴</a></li>
<li><a href="">회사소개</a></li>
<li><a href="">브랜드정보</a></li>
<li><a href="">제품정보</a></li>
<li><a href="NoticeList.jsp">게시판</a></li>
</ul>
</div>
</div>
<div class="notice">
<form action="#" name="writeFrm" >
<input type="hidden" name="num" value="<%= num%>">
<table border="1" width="100%">
<tr>
<td>번호</td>
<td><%=dto.getNum() %></td>
<td>작성자</td>
<td><%=dto.getName() %></td>
</tr>
<tr>
<td>작성일</td>
<td><%=dto.getPostdate() %></td>
<td>조회수</td>
<td><%= dto.getVisitcount() %></td>
</tr>
<tr>
<td>제목</td>
<td colspan="3" height="100"><%=dto.getTitle() %></td>
</tr>
<tr>
<td>내용</td>
<td colspan="3" height="100"><%=dto.getContent() %></td>
</tr>
<tr>
<td colspan="4" align="center">
<%
if(session.getAttribute("UserId")!= null && session.getAttribute("UserId").toString().equals(dto.getId())){
%>
<button type="button" onclick="location.href='Edit.jsp?num=<%=dto.getNum()%>';">
수정하기
</button>
<button type="button" onclick="deletePost()">
삭제하기
</button>
<%
}
%>
<button type="button" onclick="location.href='NoticeList.jsp'">
목록보기
</button>
</td>
</tr>
</table>
</form>
<div class="ntPaging">
<ul id="pagingul">페이지 번호</ul>
</div>
</div>
<div class="footer">
<div class="footerContent">
<div class="footerLinkList">
<ul>
<li><a href="#">회사소개</a></li>
<li><a href="#">이용약관</a></li>
<li><a href="#">개인정보처리방침</a></li>
<li><a href="#">사고대응메뉴얼</a></li>
<li><a href="#">상품문의</a></li>
</ul>
</div>
<div class="companyInfo">
<span>
주식회사 강사모<br/>
서울특별시 서초구 교보타워<br/>
사업자등록번호 : 123-29-123456<br/>
통신판매업신고 제2021-서울서초-9999호<br/>
고객센터: 070-1111-1111 / puppylove@puppylove.co.kr<br/>
</span>
</div>
</div>
</div>
</div>
</body>
</html>
5. 게시글 수정
Edit.jsp
<%@page import="miniPrj02.BMK02.JSFunction"%>
<%@page import="miniPrj02.BMK02.NoticeBoardDAO"%>
<%@page import="miniPrj02.BMK02.NoticeBoardDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
if(session.getAttribute("UserId") == null){
JSFunction.alertLocation("로그인 후 이용해주세요.", "../../HomePage/JSP/Login.jsp", out);
return;
}
%> <%-- 로그인 확인 --%>
<%
String num = request.getParameter("num"); //수정하기 게시물 번호
NoticeBoardDAO dao = new NoticeBoardDAO(); //DAO 생성
NoticeBoardDTO dto = dao.selectView(num); //게시물 가져오기
String sessionId = session.getAttribute("UserId").toString(); //로그인 아이디 획득
if(!sessionId.equals(dto.getId())){ //작성자 본인인지 확인
JSFunction.alertBack("작성자 본인만 수정할 수 있습니다.", out);
return;
}
dao.close();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.14.0/css/all.css"
integrity="sha384-HzLeBuhoNPvSl5KYnjx0BT+WB0QEEqLprO+NBkkk5gbc67FTaL7XIGa2w1L0Xbgc" crossorigin="anonymous">
<link rel="stylesheet" href="../CSS/headerTopBarIcon.css">
<link rel="stylesheet" href="../CSS/navBanner.css">
<link rel="stylesheet" href="../CSS/contentFooter.css">
<link rel="stylesheet" href="../CSS/homePageNotice.css">
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap" rel="stylesheet">
<title>게시판 수정하기</title>
<script type="text/javascript">
function validateForm(form){ //폼 내용 검증
if(form.title.value == ""){
alert("제목을 입력하세요.");
form.title.focus();
return false;
}
if(form.content.value == ""){
alert("내용을 입력하세요.");
form.content.focus();
return false;
}
}
</script>
</head>
<body>
<div class="wrap">
<div class="header">
<div class="topBar">
<a class="topLogo" href="../../HomePage/JSP/HomePage.jsp"><img src="../IMG/logo.jpg" alt="대체 텍스트"></a>
<div class="searchBox">
<input type="text">
<a class="search" href="#"><i class="fas fa-search"></i></a>
</div>
<div class="topBarIcon">
<a href="#"><i class="fas fa-door-open"></i></a>
<%
if(session.getAttribute("UserId") == null){
%>
<a href="../../HomePage/JSP/Login.jsp"><i class="far fa-user"></i></a>
<%
}
else{
%>
<a href="../../HomePage/JSP/Logout.jsp"><i class="far fa-user-check"></i></a>
<%
}
%>
<a href="#"><i class="fas fa-shopping-cart"></i></a>
</div>
</div>
</div>
<div class="nav">
<div class="navBox">
<ul>
<li class="navBoxFirst"><a href=""><i class="fas fa-bars"></i>전체메뉴</a></li>
<li><a href="">회사소개</a></li>
<li><a href="">브랜드정보</a></li>
<li><a href="">제품정보</a></li>
<li><a href="NoticeList.jsp">게시판</a></li>
</ul>
</div>
</div>
<div class="notice">
<h2>수정하기</h2>
<form action="EditProcess.jsp" name="editFrm" method="post" onsubmit="return validateForm(this)">
<input type="hidden" name="num" value="<%= dto.getNum() %>">
<table border="1" width="100%">
<tr>
<td>제목</td>
<td>
<input type="text" name="title" style="width: 90%;" value="<%= dto.getTitle()%>">
</td>
</tr>
<tr>
<td>내용</td>
<td>
<textarea name="content" style="width:90%; height: 100px;"></textarea>
<%= dto.getContent()%>
</td>
</tr>
<tr>
<td>내용</td>
<td colspan="2" align="center">
<button type="submit">작성완료</button>
<button type="reset">다시입력</button>
<button type="button" onclick="location.href='NoticeList.jsp';">목록보기</button>
</td>
</tr>
</table>
</form>
</div>
<div class="footer">
<div class="footerContent">
<div class="footerLinkList">
<ul>
<li><a href="#">회사소개</a></li>
<li><a href="#">이용약관</a></li>
<li><a href="#">개인정보처리방침</a></li>
<li><a href="#">사고대응메뉴얼</a></li>
<li><a href="#">상품문의</a></li>
</ul>
</div>
<div class="companyInfo">
<span>
주식회사 강사모<br/>
서울특별시 서초구 교보타워<br/>
사업자등록번호 : 123-29-123456<br/>
통신판매업신고 제2021-서울서초-9999호<br/>
고객센터: 070-1111-1111 / puppylove@puppylove.co.kr<br/>
</span>
</div>
</div>
</div>
</div>
</body>
</html>
--------------------------------------------------------------------------------------------------------------------------
//EditProcess.jsp
<%@page import="miniPrj02.BMK02.JSFunction"%>
<%@page import="miniPrj02.BMK02.NoticeBoardDAO"%>
<%@page import="miniPrj02.BMK02.NoticeBoardDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
%>
<%
//수정 내용 얻기
String num = request.getParameter("num");
String title = request.getParameter("title");
String content = request.getParameter("content");
NoticeBoardDTO dto = new NoticeBoardDTO();
dto.setNum(num);
dto.setTitle(title);
dto.setContent(content);
//DB반영
NoticeBoardDAO dao = new NoticeBoardDAO();
int affected = dao.updateEdit(dto);
dao.close();
if(affected == 1){
//업데이트 성공시 상세보기 페이지로 이동
response.sendRedirect("View.jsp?num=" +dto.getNum());
}
else{
JSFunction.alertBack("수정하기에 실패하였습니다.", out);
}
%>
6. 게시글 삭제
//DeleteProcess.jsp
<%@page import="miniPrj02.BMK01.MemberBean"%>
<%@page import="miniPrj02.BMK02.JSFunction"%>
<%@page import="miniPrj02.BMK02.NoticeBoardDAO"%>
<%@page import="miniPrj02.BMK02.NoticeBoardDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="IsLoggedin.jsp" %> <%-- 로그인 확인 --%>
<%
request.setCharacterEncoding("utf-8");
%>
<%
String num = request.getParameter("num"); //삭제할 게시물의 num값 획득
NoticeBoardDTO dto = new NoticeBoardDTO();
NoticeBoardDAO dao = new NoticeBoardDAO();
dto = dao.selectView(num); //삭제할 게시물 일련번호에 해당하는 기게시물 얻기
//로그인한 사용자 ID 얻기
String sessionId = session.getAttribute("UserId").toString();
System.out.println(sessionId);
System.out.println("DP"+dto.getId());
int delResult = 0;
if(sessionId.equals(dto.getId())){ //작성자가 본인이면
dto.setNum(num);
delResult = dao.deletePost(dto); //삭제!
if(delResult == 1){
//삭제되면 목록 페이지로 이동
JSFunction.alertLocation("삭제되었습니다.", "NoticeList.jsp", out);
}
else{
//삭제 실패
JSFunction.alertBack("삭제에 실패하였습니다.", out);
}
}
else{
//삭제 실패
JSFunction.alertBack("본인만 삭제할 수 있습니다.", out);
}
728x90
반응형
'Project Development > Java_programming' 카테고리의 다른 글
MVC2 회원가입 - 추가, 수정, 삭제 (0) | 2021.12.26 |
---|---|
공지사항 페이지 레이아웃 (0) | 2021.12.15 |
비밀번호 찾기 - 메일 인증 (0) | 2021.12.15 |
아이디 찾기 - DB 연결 (0) | 2021.12.15 |
회원가입 - DB 연결 (0) | 2021.12.14 |
댓글