✿∘˚˳°∘°

56일차 : mvc2WebProject - 3 본문

국비수업/Server

56일차 : mvc2WebProject - 3

_HYE_ 2023. 2. 16. 23:21

20230216

 

1. 회원탈퇴

mypage2.jsp에서 준회원/정회원일 경우엔 회원탈퇴버튼을 활성화

<a class="btn bc6 bs2" href="/deleteMember.do">회원탈퇴</a>
package kr.or.iei.member.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import kr.or.iei.member.model.service.MemberService;
import kr.or.iei.member.model.vo.Member;

/**
 * Servlet implementation class DeleteMemberServlet
 */
@WebServlet(name = "DeleteMember", urlPatterns = { "/deleteMember.do" })
public class DeleteMemberServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public DeleteMemberServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 1. 인코딩
		request.setCharacterEncoding("utf-8");
		// 2. 값추출
		// 회원번호 or 회원아이디가 있어야 쿼리문의 where절에 사용
		// jsp에서 세션에 있는 정보를 가져와도 되지만 세션은 서블릿에서도 접근이 가능
		// 세션에서 필요한 데이터 추출
		HttpSession session = request.getSession(false);
		Member m = (Member) session.getAttribute("m");
		String memberId = m.getMemberId();
		// 3. 비즈니스로직
		MemberService service = new MemberService();
		int result = service.deleteMember(memberId);
		// 4. 결과처리
		RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
		if(result > 0) {
			request.setAttribute("title", "탈퇴 완료");
			request.setAttribute("msg", "탈퇴가 완료되었습니다.");
			request.setAttribute("icon", "success");
			request.setAttribute("loc", "/logout.do");
		}else {
			request.setAttribute("title", "탈퇴 실패");
			request.setAttribute("msg", "오류가 발생했습니다.");
			request.setAttribute("icon", "error");
			request.setAttribute("loc", "/mypage2.do?memberId="+memberId);
		}
		view.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

Service

	public int deleteMember(String memberId) {
		Connection conn = JDBCTemplate.getConnection();
		int result = dao.deleteMember(conn, memberId);
		if(result > 0) {
			JDBCTemplate.commit(conn);
		}else {
			JDBCTemplate.rollback(conn);
		}
		return result;
	}

Dao

	public int deleteMember(Connection conn, String memberId) {
		PreparedStatement pstmt = null;
		int result = 0;
		String query = "delete from member_tbl where member_id = ?";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, memberId);
			result = pstmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(pstmt);
		}
		return result;
	}

 

2. 게시판만들기(공지사항) : 공지사항 게시물 작성하기

공지사항을 위한 SQL 테이블

-- 게시판 : 공지사항
-- 글번호, 제목, 작성자, 내용, 조회수, 작성일, 첨부파일
CREATE TABLE NOTICE(
    NOTICE_NO       NUMBER          PRIMARY KEY, -- 공지사항번호
    NOTICE_TITLE    VARCHAR2(300)   NOT NULL, -- 제목
    NOTICE_WRITER   VARCHAR2(20) REFERENCES MEMBER_TBL(MEMBER_ID) ON DELETE CASCADE, -- 작성자
    NOTICE_CONTENT  VARCHAR2(1000)  NOT NULL, -- 내용
    READ_COUNT      NUMBER, -- 조회수
    REG_DATE        CHAR(10), -- 작성일(날짜연산/시분초까지 보여주고싶은 경우 DATE타입으로 사용)
    FILENAME        VARCHAR2(300), -- 파일이름(사용자가 업로드한 파일명)
    FILEPATH        VARCHAR2(300) -- 파일경로(실제 서버에 올라간 파일명)
    -- 파일이름과 파일경로가 나눠지는 이유
    -- 여러명의 CLIENT가 파일을 서버에 업로드 할 경우 이름이 동일하면 덮어쓰는 상황발생
    -- 이름이 겹칠 경우 이름을 다르게해서 저장 - FILEPATH에 저장
    -- 다운로드할때는 업로드한 이름 그대로 다운받게 할것
);
CREATE SEQUENCE NOTICE_SEQ;

- 상단 메뉴1을 공지사항으로 변경

<li><a href="/noticeList.do?reqPage=1">공지사항</a></li>

 

- 리스트를 보여줄 Servlet(아직 만들지는 않았으므로 페이지 이동만 하기위한 Sevlet으로 이용)

package kr.or.iei.notice.cotroller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.or.iei.notice.model.service.NoticeService;
import kr.or.iei.notice.model.vo.NoticePageData;

/**
 * Servlet implementation class NoticeListServlet
 */
@WebServlet(name = "NoticeList", urlPatterns = { "/noticeList.do" })
public class NoticeListServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public NoticeListServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1. 인코딩
		request.setCharacterEncoding("utf-8");
		//2. 값추출
		//3. 비즈니스로직
		//4. 결과처리
		RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/notice/noticeList.jsp");
		view.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

리스트들을 보여줄 view - 로그인 한 사람이 관리자일 경우에만 글쓰기 버튼을 활성화

<%@page import="kr.or.iei.notice.model.vo.Notice"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
	.notice-tbl a:hover{
		text-decoration: underline;
	}
	.notice-tbl tr{
		border-bottom: 1px solid #ccc;
	}
	.notice-tbl tr>td:nth-child(2){
		text-align: left;
	}
	#pageNavi{
		margin: 30px;
	}
</style>
</head>
<body>
	<%@include file="/WEB-INF/views/common/header.jsp" %>
	<div class="page-content">
		<div class="page-title">공지사항</div>
		<%if(m!=null && m.getMemberLevel() == 1) {%>
		<a class="btn bc2 writeBtn" href="/noticeWriteFrm.do">글쓰기</a>
		<%} %>
		
		<table class="tbl tbl-hover notice-tbl">
			<tr class="tr-2">
				<th style="width:10%">번호</th>
				<th style="width:55%">제목</th>
				<th style="width:10%">작성자</th>
				<th style="width:10%">작성일</th>
				<th style="width:10%">조회수</th>
			</tr>
		</table>
	</div>
	<%@include file="/WEB-INF/views/common/footer.jsp" %>
</body>
</html>

- 페이지 이동을 위한 Servlet

package kr.or.iei.notice.cotroller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class NoticeWriteFrmServlet
 */
@WebServlet(name = "NoticeWriteFrm", urlPatterns = { "/noticeWriteFrm.do" })
public class NoticeWriteFrmServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public NoticeWriteFrmServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.인코딩
		request.setCharacterEncoding("utf-8");
		//2.값추출
		//3.비즈니스로직
		//3.결과처리
		RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/notice/noticeWriteFrm.jsp");
		view.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

공지사항 작성 View

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
	#noticeWrite td, #noticeWrite th{
		border: 1px solid #ccc;
	}
</style>
</head>
<body>
	<%@include file="/WEB-INF/views/common/header.jsp" %>
	<div class="page-content">
		<div class="page-title">공지사항 작성</div>
		<form action="/noticeWrite.do" method="post" enctype="multipart/form-data">
		<!-- 
			첨부파일이 존재하는 경우 
			일단 양이 많기때문에 method = post
			파일이 포함되는 경우 enctype="multipart/form-data
			이 양식을 반드시 지켜줘야한다. 
		-->
			<table class="tbl" id="noticeWrite">
				<tr class="tr-1">
					<th class="td-3">제목
					<td colspan="3">
						<input type="text" name="noticeTitle" class="input-form">
					</td>
				</tr>
				<tr class="tr-1">
					<th class="td-3">작성자
					<td>
						<%=m.getMemberId() %>
						<input type="hidden" name="noticeWriter" value="<%=m.getMemberId() %>">
					</td>
					<th class="td-3">첨부파일</th>
					<td><input type="file" name="upfile"></td>
				</tr>
				<tr class="tr-1">
					<td colspan="4">
						<textarea name="noticeContent" class="input-form"></textarea>
					</td>
				</tr>
				<tr class="tr-1">
					<td colspan="4">
						<button type="submit" class="btn bc4 bs4">공지사항작성</button>
					</td>
				</tr>
			</table>
		</form>
	</div>
	<%@include file="/WEB-INF/views/common/footer.jsp" %>
</body>
</html>

작성한 공지사항을 insert해줄 Servlet

package kr.or.iei.notice.cotroller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

import kr.or.iei.notice.model.service.NoticeService;
import kr.or.iei.notice.model.vo.Notice;

/**
 * Servlet implementation class NoticeWriteServlet
 */
@WebServlet(name = "NoticeWrite", urlPatterns = { "/noticeWrite.do" })
public class NoticeWriteServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public NoticeWriteServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1. 인코딩
		request.setCharacterEncoding("utf-8");
		
		//2. 값추출
		//enctype="multipart/form-data"(파일업로드)의 경우 데이터를 변환 후 출력(예시를 들면 취급주의 택배에 뽁뽁이로 한번더 감싸있는 것처럼감싸져있음)
		// cos.jar라는 파일업로드를 도와주는 라이브러리를 이용(/WEB-INF/lib/폴더에 해당 라이브러리가 존재해야함)
		//2-1. 파일이 업로드될 경로를 지정
		//webapp폴더의 절대경로를 구하는 방법(절대경로 : C드라이버부터 경로)
		String root = getServletContext().getRealPath("/");
		//업로드한 파일을 저장할 경로
		String saveDirectory = root+"upload/notice";
		//2-2. 파일 업로드 최대용량 설정(일반적으로 웹은 10MB가 최대)
		int maxSize = 10*1024*1024; //10MB
		//2-3. multipart/form-data에서 데이터를 꺼내기위한 객체변환작업(뽁뽁이 뜯기)
		//request객체를 MultipartRequest 객체로 변환(cos.jar에서 제공해주는 기능)
		//매개변수 5개를 전달하면 변환
		//1)request, 2)파일저장경로, 3)파일최대크기, 4)인코딩타임, 5)파일중복처리(cos에서 제공해주는 객체가있음)
		MultipartRequest mRequest = new MultipartRequest(request, saveDirectory, maxSize, "utf-8", new DefaultFileRenamePolicy());
		//request -> MultipartRequest로 변환완료
		//변환완료시점 -> 파일업로드가 완료되는 시점
		//입력정보 추출(request가 아닌 MultipartRequest에서 추출)
		String noticeTitle = mRequest.getParameter("noticeTitle");
		String noticeWriter = mRequest.getParameter("noticeWriter");
		String noticeContent = mRequest.getParameter("noticeContent");
		//파일은 2개를 가져와야함 - 원본파일이름 / 경로에올라가는파일이름
		//페이지에 내가 첨부한 파일이름(중복처리 전 파일명)
		String filename = mRequest.getOriginalFileName("upfile");
		//실제 서버에 업로드된 파일이름(중복처리 후 파일명)
		String filepath = mRequest.getFilesystemName("upfile"); 
		Notice n = new Notice();
		n.setNoticeTitle(noticeTitle);
		n.setNoticeWriter(noticeWriter);
		n.setNoticeContent(noticeContent);
		n.setFileName(filename);
		n.setFilePath(filepath);
		//3. 비즈니스로직
		NoticeService service = new NoticeService();
		int result = service.insertNotice(n);
		//4. 결과처리
		RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
		if(result > 0) {
			request.setAttribute("title", "게시글 작성 성공");
			request.setAttribute("msg", "게시글이 작성되었습니다.");
			request.setAttribute("icon", "success");
		}else {
			request.setAttribute("title", "게시글 작성 실패");
			request.setAttribute("msg", "오류가 발생했습니다.");
			request.setAttribute("icon", "error");
		}
		request.setAttribute("loc", "/noticeList.do?reqPage=1");
		view.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

Service

	public int insertNotice(Notice n) {
		Connection conn = JDBCTemplate.getConnection();
		int result = dao.insertNotice(conn, n);
		if(result > 0) {
			JDBCTemplate.commit(conn);
		}else {
			JDBCTemplate.rollback(conn);
		}
		JDBCTemplate.close(conn);
		return result;
	}

Dao

	public int insertNotice(Connection conn, Notice n) {
		PreparedStatement pstmt = null;
		int result = 0;
		String query = "insert into notice values(notice_seq.nextval, ?, ?, ?, 0, to_char(sysdate, 'yyyy-mm-dd'), ?, ?)";
		
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, n.getNoticeTitle());
			pstmt.setString(2, n.getNoticeWriter());
			pstmt.setString(3, n.getNoticeContent());
			pstmt.setString(4, n.getFileName());
			pstmt.setString(5, n.getFilePath());
			result = pstmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(pstmt);
		}
		return result;
	}

 

'국비수업 > Server' 카테고리의 다른 글

58일차 - mvc2WebProject - 5  (0) 2023.02.21
57일차 : mvc2WebProject - 4  (0) 2023.02.19
55일차 : mvc2WebProject - 2  (0) 2023.02.16
54일차 : mvc2WebProject - 1  (0) 2023.02.16
53일차 : JSP, MVC1, MVC2  (0) 2023.02.16
Comments