본문 바로가기
Project Development/Java_programming

게시판 만들기 - model1 방식

by SeleniumBindingProtein 2021. 12. 20.
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
반응형

댓글