✿∘˚˳°∘°
56일차 : mvc2WebProject - 3 본문
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