Eclipse package
(1) org.kh.notice.model.vo
class : Notice
package org.kh.notice.model.vo;
import java.sql.Date;
public class Notice {
private int rnum; // 새로 만든것!!
private int noticeNo;
private String noticeTitle;
private String noticeContent;
private String noticeWriter;
private Date noticeDate;
private int readcount;
private String filename;
private String filepath;
public Notice() {
super();
// TODO Auto-generated constructor stub
}
public Notice(int rnum, int noticeNo, String noticeTitle, String noticeContent, String noticeWriter, Date noticeDate,
int readcount, String filename, String filepath) {
super();
this.rnum = rnum;
this.noticeNo = noticeNo;
this.noticeTitle = noticeTitle;
this.noticeContent = noticeContent;
this.noticeWriter = noticeWriter;
this.noticeDate = noticeDate;
this.readcount = readcount;
this.filename = filename;
this.filepath = filepath;
}
public int getRnum() {
return rnum;
}
public void setRnum(int rnum) {
this.rnum = rnum;
}
public int getNoticeNo() {
return noticeNo;
}
public void setNoticeNo(int noticeNo) {
this.noticeNo = noticeNo;
}
public String getNoticeTitle() {
return noticeTitle;
}
public void setNoticeTitle(String noticeTitle) {
this.noticeTitle = noticeTitle;
}
public String getNoticeContent() {
return noticeContent;
}
public void setNoticeContent(String noticeContent) {
this.noticeContent = noticeContent;
}
public String getNoticeWriter() {
return noticeWriter;
}
public void setNoticeWriter(String noticeWriter) {
this.noticeWriter = noticeWriter;
}
public Date getNoticeDate() {
return noticeDate;
}
public void setNoticeDate(Date noticeDate) {
this.noticeDate = noticeDate;
}
public int getReadcount() {
return readcount;
}
public void setReadcount(int readcount) {
this.readcount = readcount;
}
public String getFilename() {
return filename;
}
public void setFilename(String filename) {
this.filename = filename;
}
public String getFilepath() {
return filepath;
}
public void setFilepath(String filepath) {
this.filepath = filepath;
}
}
class : NoticeComment
package org.kh.notice.model.vo;
import java.sql.Date;
public class NoticeComment {
private int noticeCommentNo;
private int noticeCommentLevel;
private String noticeCommentWriter;
private String noticeCommentContent;
private int noticeRef;
private int noticeCommentRef;
private Date noticeCommentDate;
public NoticeComment() {
super();
// TODO Auto-generated constructor stub
}
public NoticeComment(int noticeCommentNo, int noticeCommentLevel, String noticeCommentWriter,
String noticeCommentContent, int noticeRef, int noticeCommentRef, Date noticeCommentDate) {
super();
this.noticeCommentNo = noticeCommentNo;
this.noticeCommentLevel = noticeCommentLevel;
this.noticeCommentWriter = noticeCommentWriter;
this.noticeCommentContent = noticeCommentContent;
this.noticeRef = noticeRef;
this.noticeCommentRef = noticeCommentRef;
this.noticeCommentDate = noticeCommentDate;
}
public int getNoticeCommentNo() {
return noticeCommentNo;
}
public void setNoticeCommentNo(int noticeCommentNo) {
this.noticeCommentNo = noticeCommentNo;
}
public int getNoticeCommentLevel() {
return noticeCommentLevel;
}
public void setNoticeCommentLevel(int noticeCommentLevel) {
this.noticeCommentLevel = noticeCommentLevel;
}
public String getNoticeCommentWriter() {
return noticeCommentWriter;
}
public void setNoticeCommentWriter(String noticeCommentWriter) {
this.noticeCommentWriter = noticeCommentWriter;
}
public String getNoticeCommentContent() {
return noticeCommentContent;
}
public void setNoticeCommentContent(String noticeCommentContent) {
this.noticeCommentContent = noticeCommentContent;
}
public int getNoticeRef() {
return noticeRef;
}
public void setNoticeRef(int noticeRef) {
this.noticeRef = noticeRef;
}
public int getNoticeCommentRef() {
return noticeCommentRef;
}
public void setNoticeCommentRef(int noticeCommentRef) {
this.noticeCommentRef = noticeCommentRef;
}
public Date getNoticeCommentDate() {
return noticeCommentDate;
}
public void setNoticeCommentDate(Date noticeCommentDate) {
this.noticeCommentDate = noticeCommentDate;
}
}
class: NoticeViewData
package org.kh.notice.model.vo;
import java.util.ArrayList;
public class NoticeViewData {
private Notice n;
private ArrayList<NoticeComment> list;
public NoticeViewData() {
super();
// TODO Auto-generated constructor stub
}
public NoticeViewData(Notice n, ArrayList<NoticeComment> list) {
super();
this.n = n;
this.list = list;
}
public Notice getN() {
return n;
}
public void setN(Notice n) {
this.n = n;
}
public ArrayList<NoticeComment> getList() {
return list;
}
public void setList(ArrayList<NoticeComment> list) {
this.list = list;
}
}
class: PageData
package org.kh.notice.model.vo;
import java.util.ArrayList;
public class PageData {
private ArrayList<Notice> list;
private String pageNavi;
public PageData() {
super();
// TODO Auto-generated constructor stub
}
public PageData(ArrayList<Notice> list, String pageNavi) {
super();
this.list = list;
this.pageNavi = pageNavi;
}
public ArrayList<Notice> getList() {
return list;
}
public void setList(ArrayList<Notice> list) {
this.list = list;
}
public String getPageNavi() {
return pageNavi;
}
public void setPageNavi(String pageNavi) {
this.pageNavi = pageNavi;
}
}
(2) org.kh.notice.model.controller
Servlet : NoticeListServlet(전체 공지사항 출력)
package org.kh.notice.controller;
import java.io.IOException;
import java.util.ArrayList;
import javax.security.auth.message.callback.PrivateKeyCallback.Request;
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 org.kh.notice.model.service.NoticeService;
import org.kh.notice.model.vo.Notice;
import org.kh.notice.model.vo.PageData;
/**
* Servlet implementation class NoticeListServlet
*/
@WebServlet(name = "NoticeList", urlPatterns = { "/noticeList" })
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.변수저장
int reqPage;
try {
reqPage = Integer.parseInt(request.getParameter("reqPage"));
}catch(NumberFormatException e) {
reqPage = 1;
}
//3.비지니스로직
NoticeService service = new NoticeService();
PageData pd = service.selectList(reqPage);
//4.뷰 처리
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/notice/noticeList.jsp");
request.setAttribute("pd", pd);
request.setAttribute("list", pd.getList());
request.setAttribute("pageNavi", pd.getPageNavi());
rd.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);
}
}
Servlet : NoticeViewServlet(공지사항 1개 보기)
package org.kh.notice.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 org.kh.notice.model.service.NoticeService;
import org.kh.notice.model.vo.Notice;
import org.kh.notice.model.vo.NoticeViewData;
/**
* Servlet implementation class NotiveViewServlet
*/
@WebServlet(name = "NotiveView", urlPatterns = { "/noticeView" })
public class NoticeViewServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public NoticeViewServlet() {
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.변수저장
int noticeNo = Integer.parseInt(request.getParameter("noticeNo"));
//3.비지니스로직
NoticeService service = new NoticeService();
NoticeViewData nvd = service.selectOne(noticeNo);
//4.뷰 처리
if(nvd.getN() != null) {
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/notice/noticeView.jsp");
request.setAttribute("notice", nvd.getN());
request.setAttribute("comments", nvd.getList());
rd.forward(request, response);
}else {
request.setAttribute("msg", "해당 게시글이 없습니다.");
request.setAttribute("loc", "/noticeList");
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
rd.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);
}
}
Servlet : NoticeWriteServlet(공지사항 글쓰기)
package org.kh.notice.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 org.kh.member.model.vo.Member;
/**
* Servlet implementation class NoticeWriteServlet
*/
@WebServlet(name = "NoticeWrite", urlPatterns = { "/noticeWrite" })
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.변수저장
//3.비지니스로직
HttpSession session = request.getSession(false);
if(session != null) {
String memberId = ((Member)session.getAttribute("member")).getMemberId();
if(memberId.equals("admin")) {
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/notice/noticeWriter.jsp");
rd.forward(request, response);
}else {
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
request.setAttribute("msg", "당신은 관리자가 아닙니다");
request.setAttribute("loc", "/");
rd.forward(request, response);
}
}else {
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
request.setAttribute("msg", "로그인 해 주세요");
request.setAttribute("loc", "/noticeList");
rd.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);
}
}
Servlet : NoticeDeleteServlet(공지사항 삭제)
package org.kh.notice.controller;
import java.io.File;
import java.io.IOException;
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 org.kh.notice.model.service.NoticeService;
import org.kh.notice.model.vo.Notice;
/**
* Servlet implementation class NoticeDeleteServlet
*/
@WebServlet(name = "NoticeDelete", urlPatterns = { "/noticeDelete" })
public class NoticeDeleteServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public NoticeDeleteServlet() {
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. 변수저장
int noticeNo = Integer.parseInt(request.getParameter("noticeNo"));
NoticeService ns = new NoticeService();
int result = ns.deleteNotice(noticeNo);
String filepath = request.getParameter("filepath");
//4. view 처리
if(result > 0) {
String saveDirectory = getServletContext().getRealPath("/upload/notice/");
File delFile = new File(saveDirectory + filepath);
delFile.delete();
if(delFile.exists()) {
delFile.delete();
}
}
if(result > 0) {
request.setAttribute("msg", "공지사항 삭제 성공");
request.setAttribute("loc", "/noticeList");
}else {
request.setAttribute("msg", "공지사항 삭제 실패");
request.setAttribute("loc", "/noticeView?noticeNo="+noticeNo);
}
}
/**
* @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);
}
}
Servlet : NoticeUpdateServlet(공지사항 수정)
package org.kh.notice.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 org.kh.notice.model.service.NoticeService;
import org.kh.notice.model.vo.NoticeViewData;
/**
* Servlet implementation class NoticeUpdateServlet
*/
@WebServlet(name = "NoticeUpdate", urlPatterns = { "/noticeUpdate" })
public class NoticeUpdateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public NoticeUpdateServlet() {
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.변수저장
int noticeNo = Integer.parseInt(request.getParameter("noticeNo"));
//3. 비지니스로직
NoticeService service = new NoticeService();
NoticeViewData nvd = service.selectOne(noticeNo);
System.out.println("NoticeUpdateServlet-noticeNo-변환후:"+noticeNo);
System.out.println("NoticeUpdateServlet-notice:"+nvd.getN());
if(nvd.getN() != null) {
request.setAttribute("notice", nvd.getN());
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/notice/noticeUpdate.jsp");
rd.forward(request, response);
}else {
request.setAttribute("msg", "수정을 실패 했습니다.");
request.setAttribute("loc", "/noticeUpdate");
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
rd.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);
}
}
Servlet : NoticeUpdateEndServlet(공지사항 수정완료)
package org.kh.notice.controller;
import java.io.File;
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 org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
import org.kh.notice.model.service.NoticeService;
import org.kh.notice.model.vo.Notice;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
/**
* Servlet implementation class NoticeUpdateEndServlet
*/
@WebServlet(name = "NoticeUpdateEnd", urlPatterns = { "/noticeUpdateEnd" })
public class NoticeUpdateEndServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public NoticeUpdateEndServlet() {
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. 비지니스 로직
// enctype check!!
if (!ServletFileUpload.isMultipartContent(request)) {
request.setAttribute("msg", "[enctype] 확인하세요!");
request.setAttribute("loc", "/");
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
rd.forward(request, response);
return;
}
// 파일 업로드 준비!!!!
// 1) 파일 업로드 경로 지정하기
String root = getServletContext().getRealPath("/"); // 실제 서버의 절대 경로를 가져오는것
String saveDirectory = root + "upload/notice"; // 경로 지정
// 2) 파일 최대 크기 지정
// cos라이브러리 무료 최대 사이즈는 10MB
int maxSize = 10 * 1024 * 1024; // byte 단위로 줘야되기때문에 곱한것!
// 3) request -> multipartRequest
MultipartRequest mRequest = new MultipartRequest(request, saveDirectory, maxSize, "UTF-8",new DefaultFileRenamePolicy());
// DefaultFileRenamePolicy 파일을 등록 할 때 중복을 방지해 주는것 뒤에 숫자를 1,2,3 붙임
String noticeTitle = mRequest.getParameter("noticeTitle");
String noticeContent = mRequest.getParameter("noticeContent");
int noticeNo = Integer.parseInt(mRequest.getParameter("noticeNo"));
String filename = mRequest.getOriginalFileName("filename");
String filepath = mRequest.getFilesystemName("filename"); // 있을수도 있고 없을수도 있음!!!!
// filename 이 2개인 경우 -> 위에가 실제로 올린파일명 // 아래가 번호가 붙은 파일명
String status = mRequest.getParameter("status");
String oldFilename = mRequest.getParameter("oldFilename");
String oldFilepath = mRequest.getParameter("oldFilepath");
if (filename != null) { // 새 첨부파일이 있는 경우
if (oldFilename != null) { // 기존첨부파일이있는경우
// 기존파일 삭제로직
File delFile = new File(saveDirectory + "/" + oldFilepath);
System.out.println(delFile.delete() ? "삭제성공" : "삭제실패"); // 불린형 데이터로 나오기때문에 삭제 실패 성공인지 알 수 있다.
}
} else { // 새 첨부파일이 없는 경우
if (status.equals("stay")) { // old파일 상태 그대로 유지!!!
filename = oldFilename;
filepath = oldFilepath;
} else if (status.equals("delete")) { // old파일을 삭제!!!!!
File delFile = new File(saveDirectory + "/" + oldFilepath);
System.out.println(delFile.delete() ? "삭제성공" : "삭제실패"); // 불린형 데이터로 나오기때문에 삭제 실패 성공인지 알 수 있다.
}
}
System.out.println("fileName : " + filename);
System.out.println("filePath : " + filepath);
Notice n = new Notice(0, noticeNo, noticeTitle, noticeContent, null, null, 0, filename, filepath);
NoticeService service = new NoticeService();
int result = service.updateNotice(n);
if (result > 0) {
request.setAttribute("msg", "수정 성공!");
} else {
request.setAttribute("msg", "수정 실패!");
}
request.setAttribute("loc", "/noticeView?noticeNo=" + noticeNo);
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
rd.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);
}
}
Servlet : InsertNoticeServlet(공지사항 첨부파일 삽입)
package org.kh.notice.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 org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
import org.kh.notice.model.service.NoticeService;
import org.kh.notice.model.vo.Notice;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
/**
* Servlet implementation class InsertNoticeServlet
*/
@WebServlet(name = "InsertNotice", urlPatterns = { "/insertNotice" })
public class InsertNoticeServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public InsertNoticeServlet() {
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 check!!
if(!ServletFileUpload.isMultipartContent(request)) {
request.setAttribute("msg", "[enctype] 확인하세요!");
request.setAttribute("loc", "/");
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
rd.forward(request, response);
return;
}
//파일 업로드 준비!!!!
//1) 파일 업로드 경로 지정하기
String root = getServletContext().getRealPath("/"); // 실제 서버의 절대 경로를 가져오는것
String saveDirectory = root + "upload/notice"; //경로 지정
//2) 파일 최대 크기 지정
//cos라이브러리 무료 최대 사이즈는 10MB
int maxSize = 10*1024*1024; //byte 단위로 줘야되기때문에 곱한것!
//3) request -> multipartRequest
MultipartRequest mRequest
= new MultipartRequest(request, saveDirectory, maxSize, "UTF-8", new DefaultFileRenamePolicy());
//DefaultFileRenamePolicy 파일을 등록 할 때 중복을 방지해 주는것 뒤에 숫자를 1,2,3 붙임
String noticeTitle = mRequest.getParameter("noticeTitle");
String noticeContent = mRequest.getParameter("noticeContent");
String noticeWriter = mRequest.getParameter("noticeWriter");
String filename = mRequest.getOriginalFileName("filename");
String filepath = mRequest.getFilesystemName("filename");
//filename 이 2개인 경우 -> 위에가 실제로 올린파일명 // 아래가 번호가 붙은 파일명
System.out.println("fileName : " + filename);
System.out.println("filePath : " + filepath);
Notice n = new Notice(0, 0, noticeTitle, noticeContent, noticeWriter, null, 0, filename, filepath);
NoticeService service = new NoticeService();
int result = service.insertNotice(n);
if(result > 0){
request.setAttribute("msg", "공지사항 등록 성공!");
}else {
request.setAttribute("msg", "공지사항 등록 실패!");
}
request.setAttribute("loc", "/noticeUpdateEnd");
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
rd.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);
}
}
Servlet : NoticeFileDownloadServlet(공지사항 첨부파일 다운로드)
package org.kh.notice.controller;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class NoticeFileDownloadServlet
*/
@WebServlet(name = "NoticeFileDownload", urlPatterns = { "/noticeFileDownload" })
public class NoticeFileDownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public NoticeFileDownloadServlet() {
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. 변수에 값 저장
String filename = request.getParameter("filename");
String filepath = request.getParameter("filepath");
//3. 비지니스 로직
// (1) 파일 저장경로 생성
String saveDirectory = getServletContext().getRealPath("/upload/notice/");
// 파일을 읽어오기위한 스트림생성
FileInputStream fis = new FileInputStream(saveDirectory+filepath); // 서버에 저장되어있는것은 filepath
BufferedInputStream bis = new BufferedInputStream(fis);
// 파일을 내보내기위한 스트림생성
ServletOutputStream sos = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(sos);
String resFilename = ""; // 사용자가 저장할 파일 이름
//(2) IE 여부 판단
boolean bool = request.getHeader("user-agent").indexOf("MSIE") != -1 ||
request.getHeader("user-agent").indexOf("Trident") != -1;
System.out.println("IE 여부 : " + bool);
// 3) 다운로드 파일 이름 설정
if(bool) { // IE경우
resFilename = URLEncoder.encode(filename,"UTF-8");
resFilename = resFilename.replaceAll("\\\\", "%20");
}else { //그외 다른 브라우저인 경우
resFilename = new String(filename.getBytes("UTF-8"),"ISO-8859-1");
}
// (4) 파일 다운로드를 위한 HTTP Header 설정
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename="+resFilename);
// (5)
int read = -1;
while((read=bis.read())!=-1){
bos.write(read);
}
bos.close();
bis.close();
//4. 뷰처리
//파일만 다운로드되고 나머지 화면은 그대로 있으니까 뷰처리는 안함
}
/**
* @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);
}
}
Servlet : NoticeCommentInsertServlet(공지사항 댓글삽입)
package org.kh.notice.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 org.kh.notice.model.service.NoticeService;
import org.kh.notice.model.vo.NoticeComment;
/**
* Servlet implementation class NoticeCommentInsertServlet
*/
@WebServlet(name = "NoticeCommentInsert", urlPatterns = { "/noticeCommentInsert" })
public class NoticeCommentInsertServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public NoticeCommentInsertServlet() {
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.
int noticeCommentLevel = Integer.parseInt(request.getParameter("noticeCommentLevel"));
String noticeCommentWriter = request.getParameter("noticeCommentWriter");
String noticeCommentContent = request.getParameter("noticeCommentContent");
int noticeRef = Integer.parseInt(request.getParameter("noticeRef"));
int noticeCommentRef = Integer.parseInt(request.getParameter("noticeCommentRef"));
NoticeComment nc = new NoticeComment(0, noticeCommentLevel, noticeCommentWriter, noticeCommentContent, noticeRef, noticeCommentRef, null);
NoticeService service = new NoticeService();
int result = service.insertNoticeComment(nc);
if(result>0) {
request.setAttribute("msg", "댓글 등록 성공!");
}else {
request.setAttribute("msg", "댓글 등록 실패!");
}
request.setAttribute("loc", "/noticeView?noticeNo="+noticeRef); //해당글번호 뒤에 적어줘야됨!
RequestDispatcher rd = request.getRequestDispatcher(("WEB-INF/views/common/msg.jsp"));
rd.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);
}
}
Servlet : NoticeCommentDeleteServlet(공지사항 댓글삭제)
package org.kh.notice.controller;
import java.io.IOException;
import javax.print.attribute.standard.RequestingUserName;
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 org.kh.notice.model.service.NoticeService;
/**
* Servlet implementation class NoticeCommentDeleteServlet
*/
@WebServlet(name = "NoticeCommentDelete", urlPatterns = { "/noticeCommentDelete" })
public class NoticeCommentDeleteServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public NoticeCommentDeleteServlet() {
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.
int noticeCommentNo = Integer.parseInt(request.getParameter("noticeCommentNo"));
int noticeNo = Integer.parseInt(request.getParameter("noticeNo"));
NoticeService service = new NoticeService();
int result = service.deleteNoticeComment(noticeCommentNo);
if(result>0) {
request.setAttribute("msg", "댓글 삭제 성공");
}else {
request.setAttribute("msg", "댓글 삭제 실패");
}
request.setAttribute("loc", "/noticeView?noticeNo="+noticeNo);
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
rd.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);
}
}
Servlet : NoticeCommentUpdateServlet (공지사항 댓글수정)
package org.kh.notice.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 org.kh.notice.model.service.NoticeService;
/**
* Servlet implementation class NoticeCommentUpdateServlet
*/
@WebServlet(name = "NoticeCommentUpdate", urlPatterns = { "/noticeCommentUpdate" })
public class NoticeCommentUpdateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public NoticeCommentUpdateServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
int noticeCommentNo = Integer.parseInt(request.getParameter("noticeCommentNo"));
int noticeNo = Integer.parseInt(request.getParameter("noticeNo"));
String noticeCommentContent = request.getParameter("noticeCommentContent");
NoticeService service = new NoticeService();
int result = service.updateNoticeComment(noticeCommentNo, noticeCommentContent);
if(result > 0) {
request.setAttribute("msg", "댓글 수정 성공");
}else {
request.setAttribute("msg", "댓글 수정 실패");
}
request.setAttribute("loc", "/noticeView?noticeNo="+noticeNo);
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
rd.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);
}
}
(3) org.kh.notice.model.service
package org.kh.notice.model.service;
import java.sql.Connection;
import java.util.ArrayList;
import org.kh.common.JDBCTemplate;
import org.kh.notice.model.dao.NoticeDao;
import org.kh.notice.model.vo.Notice;
import org.kh.notice.model.vo.NoticeComment;
import org.kh.notice.model.vo.NoticeViewData;
import org.kh.notice.model.vo.PageData;
public class NoticeService {
public PageData selectList(int reqPage){
Connection conn = JDBCTemplate.getConnection();
NoticeDao dao = new NoticeDao();
int numberPage = 10; // 한 페이지당 나타나는 게시물 수!!
int totalCount = dao.totalCount(conn); //전체 게시물 수!
System.out.println("totalCount :" + totalCount);
//100 -> 10, 101-> 11, 111 ->12
//나머지가 0인경우 -> 몫 , 나머지가 있는경우 -> 몫+1
int totalPage
= (totalCount%numberPage ==0)?(totalCount/numberPage):(totalCount/numberPage)+1; //삼항연산자!
System.out.println("totalPage :" + totalPage); //총 페이지 출력
//1 page -> 1번글 ~ 10번글, 2page -> 11번 글 ~ 20번 글
//시작페이지 start
int start = (reqPage-1)*numberPage+1;
//끝 페이지 end
int end = reqPage*numberPage;
System.out.println("시작번호 : " + start +"/ 끝 번호 : "+ end);
ArrayList<Notice> list = dao.selectList(conn, start, end);
//페이지 네비게이션 생성!!
int pageNaviSize = 5; //페이지 넘버수
String pageNavi = ""; //페이지 네비 HTML을 저장하는 변수!
int pageNo;
// pageNo 은 해당 페이지 시작번호!!
// 1 ~ 5 -> 1, 6 ~ 10 -> 6, 11 ~ 15 -> 11
// int pageNo =((reqPage-1)/pageNaviSize)*pageNaviSize+1;
if(reqPage<3) {
pageNo= 1;
}else {
pageNo= reqPage-2;
}
//이전버튼생성하기!!!▽
if(pageNo != 1) {
pageNavi += "<a class='btn' href='/noticeList?reqPage=+"+(reqPage-1)+"'>이전</a>";
// 6 7 8 9 10 에서 이전버튼 누르면 5페이지 요청하게 만드는것
}
int i = 1;
//i를 1부터 증가시키면서 pageNaviSize만큼 반복문
//단, pageNo 가 totalPage보다 크면 마지막페이지에 도달한것이므로 반복문을 멈춤
while(! (i++>pageNaviSize || pageNo>totalPage)) {
if(reqPage == pageNo) {//선택된 페이지에서는 하이퍼링크를 걸지 않으려고
pageNavi +="<span class='selectPage'>"+pageNo+"</span>";
}else {
pageNavi +="<a class='btn' href='/noticeList?reqPage="+pageNo+"'>"+pageNo+"</a>";
}
pageNo++;
}
if(pageNo <= totalPage) {
pageNavi += "<a class = 'btn' href='/noticeList?reqPage="+(reqPage+1)+"'>다음</a>";
}
PageData pd = new PageData(list, pageNavi); // 리턴타입이 많을경우 객체로 담아서 보내면된다!
//또 VO 만들고 사용하면됨!
JDBCTemplate.close(conn);
return pd;
}
public NoticeViewData selectOne(int noticeNo) {
Connection conn = JDBCTemplate.getConnection();
NoticeDao dao = new NoticeDao();
Notice n = dao.selectOne(conn , noticeNo);
ArrayList<NoticeComment> list = dao.selectNoticeComment(conn,noticeNo);
if(n != null) {
int result = dao.readCount(conn,noticeNo); //조회를 했는데 결과가 있어야만 업데이트를 하겠다!!!!
if(result > 0) {
JDBCTemplate.commit(conn);
}else {
JDBCTemplate.rollback(conn);
}
}
JDBCTemplate.close(conn);
NoticeViewData nvd = new NoticeViewData(n,list);
return nvd;
}
public int insertNotice(Notice n) {
Connection conn = JDBCTemplate.getConnection();
NoticeDao dao = new NoticeDao();
int result = dao.insertNotice(conn,n);
if(result > 0) {
JDBCTemplate.commit(conn);
}else {
JDBCTemplate.rollback(conn);
}
JDBCTemplate.close(conn);
return result;
}
public int deleteNotice(int noticeNo) {
Connection conn = JDBCTemplate.getConnection();
NoticeDao dao = new NoticeDao();
int result = dao.deleteNotice(conn, noticeNo);
if(result > 0) {
JDBCTemplate.commit(conn);
}else {
JDBCTemplate.rollback(conn);
}
JDBCTemplate.close(conn);
return result;
}
public int updateNotice(Notice n) {
Connection conn = JDBCTemplate.getConnection();
NoticeDao dao = new NoticeDao();
int result = dao.updateNotice(conn, n);
if(result > 0) {
JDBCTemplate.commit(conn);
}else {
JDBCTemplate.rollback(conn);
}
JDBCTemplate.close(conn);
return result;
}
public int insertNoticeComment(NoticeComment nc) {
Connection conn = JDBCTemplate.getConnection();
NoticeDao dao = new NoticeDao();
int result = dao.insertNoticeComment(conn, nc);
if(result > 0) {
JDBCTemplate.commit(conn);
}else {
JDBCTemplate.rollback(conn);
}
JDBCTemplate.close(conn);
return result;
}
public int deleteNoticeComment(int noticeCommentNo) {
Connection conn = JDBCTemplate.getConnection();
NoticeDao dao = new NoticeDao();
int result = dao.deleteNoticeComment(conn, noticeCommentNo);
if(result>0) {
JDBCTemplate.commit(conn);
}else
JDBCTemplate.rollback(conn);
JDBCTemplate.close(conn);
return result;
}
public int updateNoticeComment(int noticeCommentNo, String noticeCommentContent) {
Connection conn = JDBCTemplate.getConnection();
NoticeDao dao = new NoticeDao();
int result = dao.updateNoticeComment(conn, noticeCommentNo, noticeCommentContent);
if(result>0) {
JDBCTemplate.commit(conn);
}else
JDBCTemplate.rollback(conn);
JDBCTemplate.close(conn);
return result;
}
}
(4) org.kh.notice.model.dao
package org.kh.notice.model.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.kh.common.JDBCTemplate;
import org.kh.notice.model.vo.Notice;
import org.kh.notice.model.vo.NoticeComment;
public class NoticeDao {
public ArrayList<Notice> selectList(Connection conn, int start, int end){
PreparedStatement pstmt = null;
ResultSet rset = null;
String query = "select * from (select ROWNUM as rnum, n. * from (select * from notice order by notice_no desc) n) where rnum between ? and ? ";
ArrayList<Notice> list = new ArrayList<Notice>();
Notice n = null;
try {
pstmt = conn.prepareStatement(query);
pstmt.setInt(1, start);
pstmt.setInt(2, end);
rset = pstmt.executeQuery();
while(rset.next()) {
n = new Notice();
n.setRnum(rset.getInt("rnum"));
n.setNoticeNo(rset.getInt("notice_no"));
n.setNoticeTitle(rset.getString("notice_title"));
n.setNoticeContent(rset.getString("notice_content"));
n.setNoticeWriter(rset.getString("notice_writer"));
n.setNoticeDate(rset.getDate("notice_date"));
n.setReadcount(rset.getInt("readcount"));
n.setFilename(rset.getString("filename"));
n.setFilepath(rset.getString("filepath"));
list.add(n);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
JDBCTemplate.close(rset);
}
return list;
}
public int totalCount(Connection conn) {
PreparedStatement pstmt = null;
ResultSet rset = null;
String query = "select count(*) as total from notice";
int result = 0;
try {
pstmt = conn.prepareStatement(query);
rset = pstmt.executeQuery();
if(rset.next()) {
result = rset.getInt("total"); // 안에 컬럼명!! 위에 커리문에서 total 로 쓴것!!!!!!!
// as를 사용하지 않으면 count(*) 로 컬럼명이 생김!!
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(rset);
JDBCTemplate.close(pstmt);
}
return result;
}
public Notice selectOne(Connection conn, int noticeNo) {
PreparedStatement pstmt = null;
ResultSet rset = null;
String query = "select * from notice where notice_no=?";
Notice n = null;
try {
pstmt = conn.prepareStatement(query);
pstmt.setInt(1, noticeNo);
rset = pstmt.executeQuery();
while(rset.next()) {
n = new Notice();
n.setNoticeNo(rset.getInt("notice_no"));
n.setNoticeTitle(rset.getString("notice_title"));
n.setNoticeContent(rset.getString("notice_content"));
n.setNoticeWriter(rset.getString("notice_writer"));
n.setNoticeDate(rset.getDate("notice_date"));
n.setReadcount(rset.getInt("readcount"));
n.setFilename(rset.getString("filename"));
n.setFilepath(rset.getString("filepath"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(rset);
JDBCTemplate.close(pstmt);
}
return n;
}
public int readCount(Connection conn, int noticeNo) {
PreparedStatement pstmt = null;
int result = 0;
String query = "update notice set readcount = readcount+1 where notice_no=?";
try {
pstmt = conn.prepareStatement(query);
pstmt.setInt(1, noticeNo);
result = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
public int insertNotice(Connection conn, Notice n) {
// TODO Auto-generated method stub
PreparedStatement pstmt = null;
int result = 0;
String query = "insert into notice values(notice_no_seq.nextval,?,?,?,sysdate,0,?,?)";
try {
pstmt = conn.prepareStatement(query);
pstmt.setString(1, n.getNoticeTitle());
pstmt.setString(2, n.getNoticeContent());
pstmt.setString(3,n.getNoticeWriter());
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;
}
public int deleteNotice(Connection conn, int noticeNo) {
PreparedStatement pstmt = null;
int result = 0;
String query = "delete from notice where notice_no=?";
try {
pstmt = conn.prepareStatement(query);
pstmt.setInt(1, noticeNo);
result = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
public int updateNotice(Connection conn, Notice n) {
PreparedStatement pstmt = null;
int result = 0;
String query = "update notice set notice_title=?, notice_content=?, filepath=?, filename=? where notice_no=?";
try {
pstmt = conn.prepareStatement(query);
pstmt.setString(1, n.getNoticeTitle());
pstmt.setString(2, n.getNoticeContent());
pstmt.setString(3, n.getFilepath());
pstmt.setString(4, n.getFilename());
pstmt.setInt(5, n.getNoticeNo());
result = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
public int insertNoticeComment(Connection conn, NoticeComment nc) {
PreparedStatement pstmt = null;
int result = 0;
String query = "insert into notice_comment values(seq_notice_comment_no.nextval,?,?,?,?,?,sysdate)";
try {
pstmt = conn.prepareStatement(query);
pstmt.setInt(1, nc.getNoticeCommentLevel());
pstmt.setString(2, nc.getNoticeCommentWriter());
pstmt.setString(3, nc.getNoticeCommentContent());
pstmt.setInt(4, nc.getNoticeRef());
pstmt.setString(5, nc.getNoticeCommentRef()==0?null:String.valueOf(nc.getNoticeCommentRef()));
//db의 특성을 이용해서 문자를 넣어도 숫자를 넣을수 있게끔 할수 있는것! db가 강제로 형변환에서 인지하고있음
result = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
public ArrayList<NoticeComment> selectNoticeComment(Connection conn, int noticeNo) {
PreparedStatement pstmt = null;
ResultSet rset = null;
ArrayList<NoticeComment> list = new ArrayList<NoticeComment>();
String query = "select * from notice_comment where notice_ref=?";
try {
pstmt = conn.prepareStatement(query);
pstmt.setInt(1, noticeNo);
rset = pstmt.executeQuery();
while(rset.next()) {
NoticeComment nc = new NoticeComment();
nc.setNoticeCommentContent(rset.getString("notice_comment_content"));
nc.setNoticeCommentDate(rset.getDate("notice_comment_date"));
nc.setNoticeCommentLevel(rset.getInt("notice_comment_level"));
nc.setNoticeCommentNo(rset.getInt("notice_comment_no"));
nc.setNoticeCommentRef(rset.getInt("notice_comment_ref"));
nc.setNoticeCommentWriter(rset.getString("notice_comment_writer"));
nc.setNoticeRef(rset.getInt("notice_ref"));
list.add(nc);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(rset);
JDBCTemplate.close(pstmt);
}
return list;
}
public int deleteNoticeComment(Connection conn, int noticeCommentNo) {
PreparedStatement pstmt = null;
int result = 0;
String query = "delete from notice_comment where notice_comment_no = ? ";
try {
pstmt = conn.prepareStatement(query);
pstmt.setInt(1, noticeCommentNo);
result = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
public int updateNoticeComment(Connection conn, int noticeCommentNo, String noticeCommentContent) {
PreparedStatement pstmt = null;
int result = 0;
String query = "update notice_comment set notice_comment_content=? where notice_comment_no=?";
try {
pstmt = conn.prepareStatement(query);
pstmt.setString(1, noticeCommentContent);
pstmt.setInt(2, noticeCommentNo);
result = pstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCTemplate.close(pstmt);
}
return result;
}
}
(5)View
<noticeList.jsp> 공지사항 전체출력
<%@page import="org.kh.notice.model.vo.PageData"%>
<%@page import="org.kh.notice.model.vo.Notice"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
PageData pd = (PageData)request.getAttribute("pd");
ArrayList<Notice> list = pd.getList();
String pageNavi = pd.getPageNavi();
//ArrayList<Notice> list = (ArrayList<Notice>)request.getAttribute("list");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style>
#pageNavi{
text-align : center;
width : 80%;
margin : 0 auto;
}
#pageNavi>*{
margin : 10px;
}
.selectPage{
font-size: 18px;
color:orange;
}
</style>
</head>
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<section>
<div class="table-wrapper" style="text-align: center; width:80%; margin:0 auto;">
<%if(m!=null && m.getMemberId().equals("admin")){ %>
<a class="btn btn-outline-danger btn-sm float-right" href="/noticeWrite">글쓰기</a>
<%} %>
<table class ="table table-striped">
<tr>
<th colspan="5" style="font-size : 20px; font-weight : bold">
공지사항
</th>
</tr>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>조회수</th>
</tr>
<%for(Notice n : list){ %>
<tr>
<td><%=n.getRnum()%></td>
<td>
<a href="/noticeView?noticeNo=<%=n.getNoticeNo()%>">
<%=n.getNoticeTitle() %>
</a>
</td>
<td><%=n.getNoticeWriter() %></td>
<td><%=n.getNoticeDate() %></td>
<td><%=n.getReadcount() %></td>
</tr>
<%} %>
</table>
<div id="pageNavi"><%=pageNavi %></div>
</div>
</div>
</section>
</body>
</html>
<noticeUpdate.jsp> 공지사항 수정
<%@page import="org.kh.notice.model.vo.Notice"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Notice n = (Notice)request.getAttribute("notice");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<section>
<div class="table-wrapper" style="text-align : center; width:80%; margin: 0 auto;">
<form action="/noticeUpdateEnd" method="post" enctype="multipart/form-data"> <!-- 파일이 수정될수도 있으니까 enctype 해줘야됨 -->
<input type = "hidden" name="noticeNo" value="<%=n.getNoticeNo() %>">
<table class="table table-bordered">
<tr>
<th colspan ="2" style="font-size:20px; font-weight:bold">공지사항</th>
</tr>
<tr>
<th>제목</th>
<td><input type ="text" class="form-control" name="noticeTitle" value="<%=n.getNoticeTitle()%>"></td>
</tr>
<tr>
<th>작성자</th>
<td><%=n.getNoticeWriter()%></td>
</tr>
<tr>
<th>작성일</th>
<td><%=n.getNoticeDate() %></td>
</tr>
<tr>
<th>첨부파일</th>
<td>
<input type="hidden" id="status" name="status" value="stay">
<%if(n.getFilename() != null){ %>
<img class="delFile" src="/img/file.png" width="16px">
<span class="delFile"><%=n.getFilename()%></span>
<button type="button" id="fileDelBtn" class="btn btn-primary btn-sm delFile">삭제</button>
<input type="file" name="filename" id="file" style="display:none;">
<input type ="hidden" name="oldFilename" value="<%=n.getFilename() %>">
<input type ="hidden" name="oldFilepath" value="<%=n.getFilepath() %>">
<%}else{ %>
<input type="file" name="filename">
<%} %>
</td>
</tr>
<tr>
<th>내용</th>
<td><textarea name = "noticeContent" class ="form-control" rows="3" cols="40"><%=n.getNoticeContent() %>
</textarea></td>
</tr>
<tr>
<th colspan="2" style="text-align:center">
<button type ="submit" class="btn btn-outline-primary">수정하기</button>
<a href="/noticeList" class="btn btn-outline-danger">목록</a>
</tr>
</table>
</form>
</div>
</section>
<script>
$(document).ready(function(){
$("#fileDelBtn").click(function(){
if(confirm("첨부파일을 삭제하시겠습니까 ?")){
$(".delFile").hide();
$("#file").show();
$("#status").val("delete");
}
});
});
</script>
</body>
</html>
<noticeView.jsp>공지사항 1개 클릭시 글 출력
<%@page import="org.kh.notice.model.vo.NoticeComment"%>
<%@page import="java.util.ArrayList"%>
<%@page import="org.kh.notice.model.vo.Notice"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
Notice n = (Notice)request.getAttribute("notice");
ArrayList<NoticeComment> list = (ArrayList<NoticeComment>)request.getAttribute("comments");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style>
.commentList{
width : 100%;
clear : both;
border : 1px solid #ccc;
border-radius : 5px;
overflow : hidden;
}
.commentList>li{
float : left;
color : black;
font-weight : bold;
}
</style>
</head>
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<section>
<div class="table-wrapper" style="text-align:center; width: 80%; margin : 0 auto;" >
<div style="text-align:right;">
<%if(m!=null && m.getMemberId().equals("admin")){ %>
<a class="btn btn-outline-primary btn-sm" href="/noticeWrite">글쓰기</a>
<%}%>
</div>
<table class="table table-bordered table-hover">
<tr>
<th colspan="2" style="font-size: 20px; font-weight:bold">공지사항</th>
</tr>
<tr>
<th>제목</th>
<td><%=n.getNoticeTitle()%></td>
</tr>
<tr>
<th>작성자</th>
<td><%=n.getNoticeWriter()%></td>
</tr>
<tr>
<th>작성일</th>
<td><%=n.getNoticeDate() %></td>
</tr>
<tr>
<th>첨부파일</th>
<td>
<%if(n.getFilepath() != null){ %>
<img src="/img/file.png" width="16px">
<a href="javascript:void(0)" onclick="fileDownload('<%=n.getFilename() %>','<%=n.getFilepath() %>')">
<%=n.getFilename() %>
</a>
<%} %>
</td>
</tr>
<tr>
<th>내용</th>
<td><%=n.getNoticeContent()%></td>
</tr>
<tr>
<th colspan="2">
<%if(m!=null && m.getMemberId().equals(n.getNoticeWriter())){ %>
<a class="btn btn-outline-info btn-sm" href="/noticeUpdate?noticeNo=<%=n.getNoticeNo()%>">수정하기</a>
<a class="btn btn-outline-danger btn-sm" href="javascript:void(0)" onclick="deleteNotice('<%=n.getNoticeNo()%>','<%=n.getFilepath()%>');">삭제하기</a>
<%} %>
<a class="btn btn-outline-primary btn-sm" href="/noticeList">목록으로</a>
</table>
</div>
<%if(m!=null) {%> <%--댓글 작성 시작! --%>
<div class="comment-write" style="text-align:center; width:80%; margin:0 auto;">
<form action="/noticeCommentInsert" method="post">
<input type="hidden" name="noticeCommentWriter" value="<%=m.getMemberId()%>">
<input type="hidden" name="noticeRef" value="<%=n.getNoticeNo() %>">
<input type="hidden" name="noticeCommentLevel" value="1">
<input type="hidden" name="noticeCommentRef" value="0">
<table class = "table">
<tr>
<td width="85%">
<textarea rows="1" class="form-control" name="noticeCommentContent"></textarea>
</td>
<td width="15%">
<button type="submit" class="btn btn-primary">등록</button>
</td>
</tr>
</table>
</form>
<%-- --%>
</div>
<%} %> <%--댓글 작성 끝 --%>
<div class="comment-wrapper" style="text-align: center; width:80%; margin: 0 auto;">
<%
for(NoticeComment nc : list){
if(nc.getNoticeCommentLevel()==1){
%>
<ul class="commentList">
<li style="width:5%">
<span><%=nc.getNoticeCommentWriter() %></span>
</li>
<li style="width:65%">
<span><%=nc.getNoticeCommentContent() %></span>
<input type ="text" class="form-control" name ="noticeCommentContent" value="<%=nc.getNoticeCommentContent() %>" style="display:none;">
</li>
<li style="width:10%">
<span><%=nc.getNoticeCommentDate() %></span>
</li>
<%if(m != null){ // 로그인 되어있는경우 버튼 활성화 %>
<li style="width:20%">
<a href="javascript:void(0)" onclick="insertComment(this, '<%=nc.getNoticeCommentNo() %>')">댓글달기</a>
<%if(m.getMemberId().equals(nc.getNoticeCommentWriter())){ %>
<a href="javascript:void(0)" onclick="modifyComment(this, '<%=nc.getNoticeCommentNo() %>')">수정하기</a>
<a href="javascript:void(0)" onclick="deleteComment(this, '<%=nc.getNoticeCommentNo() %>')">삭제하기</a>
<%} %>
</li>
<%} %>
</ul>
<%
} //댓글 if문 종료
%>
<%
for(NoticeComment ncr : list){ //대댓글 for문 시작
if(ncr.getNoticeCommentLevel()==2 && ncr.getNoticeCommentRef() == nc.getNoticeCommentNo()){
%>
<ul class="commentList">
<li style="width:5%"><span>└─</span></li>
<li style="width:5%">
<span><%=ncr.getNoticeCommentWriter() %></span>
</li>
<li style="width:60%; text-align : left; padding-left :30px;">
<span><%=ncr.getNoticeCommentContent() %></span>
<input type ="text" class="form-control" name ="noticeCommentContent" value="<%=ncr.getNoticeCommentContent() %>" style="display:none;">
</li>
<li style="width:10%">
<span><%=ncr.getNoticeCommentDate() %></span>
</li>
<li style="width:20%">
<%if(m!=null && m.getMemberId().equals(ncr.getNoticeCommentWriter())){ %>
<a></a>
<a href="javascript:void(0)" onclick="modifyComment(this, '<%=ncr.getNoticeCommentNo() %>')">수정하기</a>
<a href="javascript:void(0)" onclick="deleteComment(this, '<%=ncr.getNoticeCommentNo() %>')">삭제하기</a>
</li>
<%}%>
</ul>
<%
} // 대댓글 if 문 종료!
} //대댓글 for문 끝!!!
%>
<%
} // 전체 댓글 for문 종료
%>
</div>
</section>
<script>
function fileDownload(filename, filepath){
var url = "/noticeFileDownload";
var encFilename = encodeURIComponent(filename);
var encFilepath = encodeURIComponent(filepath); // 파일명이 한글인 경우 인코딩
location.href=url+'?filename=' + encFilename+'&filepath=' + encFilepath;
}
function deleteNotice(noticeNo, filepath){
var url = "/noticeDelete";
var encFilepath = encodeURIComponent(filepath);
location.href=url+'?noticeNo='+noticeNo+'&filepath='+encFilepath;
}
function insertComment(obj, commentNo){
$(obj).parent().hide();
var form = $("<form action='/noticeCommentInsert' method='post'></form>");
var ul = $("<ul class='commentList'></ul>");
form.append($("<input type='hidden' name='noticeCommentWriter' value='<%=m.getMemberId()%>'>"));
form.append($("<input type='hidden' name='noticeRef' value='<%=n.getNoticeNo()%>'>"));
form.append($("<input type='hidden' name='noticeCommentLevel' value='2'>"));
form.append($("<input type='hidden' name='noticeCommentRef' value='"+commentNo+"'>"));
var li1 = $("<li style='width:5%'>└─</li>");
var li2 = $("<li style='width:75%'></li>");
li2.append($("<input type='text' name='noticeCommentContent' class='form-control' style='height:100%;'>"));
var li3 = $("<li style='width:20%'></li>");
li3.append($("<button type ='submit' class='btn btn-link btn-sm'>등록</button>"));
li3.append($("<button type='button' class='btn btn-link btn-sm' onclick='insertCommentCancle(this)'>취소</button>"));
ul.append(li1).append(li2).append(li3);
form.append(ul);
$(obj).parent().parent().after(form);
}
function insertCommentCancle(obj){
// $(obj).parent().parent().parent().prev().children().last().show();
$(obj).parents('form').prev().children().last().show();
$(obj).parents('form').remove();
}
function modifyComment(obj, commentNo){
$(obj).prev().hide();
$(obj).html('수정완료');
$(obj).attr('onclick','modifyComplete(this,"'+commentNo+'")');
$(obj).next().html('취소');
$(obj).next().attr('onclick','modifyCancle(this,"'+commentNo+'")');
$(obj).parent().parent().find('input').show();
$(obj).parent().parent().find('input').prev().hide();
}
function modifyCancle(obj,commentNo){
$(obj).prev().prev().show();
$(obj).prev().html('수정');
$(obj).prev().attr('onclick','modifyComment(this,"'+commentNo+'")');
$(obj).html('삭제');
$(obj).attr('onclick','deleteComment(this,"'+commentNo+'")');
$(obj).parent().parent().find('input').hide();
$(obj).parent().parent().find('input').prev().show();
}
function modifyComplete(obj,commentNo){
var form = $("<form action='/noticeCommentUpdate' method='post'></form>");
form.append($("<input type='text' name='noticeCommentNo' value='"+commentNo+"'>"));
form.append($("<input type='text' name='noticeNo' value='"+<%=n.getNoticeNo()%>+"'>"));
form.append($(obj).parent().parent().find('input'));
$('body').append(form);
form.submit();
}
function deleteComment(obj,commentNo){
location.href="/noticeCommentDelete?noticeCommentNo="+commentNo+"¬iceNo="+<%=n.getNoticeNo()%>;
}
</script>
</body>
</html>
<noticeWriter.jsp> 공지사항 글쓰기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%@ include file="/WEB-INF/views/common/header.jsp" %>
<section>
<div class="table-wrapper" style="text-align:center; width:80%; margin : 0 auto;">
<form action="/insertNotice" method="post" enctype="multipart/form-data">
<%--파일을 올려주려면 enctype 를 써줘야됨!! method도 꼭 써줘야됨!! 2가지 같이 있어야 파일이 올라감 --%>
<table class="table table-bordered" style="text-align : left;">
<tr>
<th colspan="2" style="font-size:20px; font-weight:bold">공지사항 작성</th>
</tr>
<tr>
<th>제목</th>
<td><input type="text" class="form-control" name="noticeTitle"></td>
</tr>
<tr>
<th>작성자</th>
<td>
<%=m.getMemberId() %>
<input type="hidden" name="noticeWriter" value="<%=m.getMemberId() %>"> <%--옆에 공백 조심!! %>" > --%>
</td>
</tr>
<tr>
<th>첨부파일</th>
<td><input type="file" name="filename"></td>
</tr>
<tr>
<th>내용</th>
<td>
<textarea name="noticeContent" class="form-contorl" rows="3" cols="40"></textarea>
</td>
</tr>
<tr style="text-align: center;">
<th colspan="2">
<button type="submit" class="btn btn-outline-primary">등록하기</button>
</th>
</tr>
</table>
</form>
</div>
</section>
</body>
</html>
'이공계전문기술연수 > Servlet | JSP' 카테고리의 다른 글
<이공계기술전문연수> 15. Servlet / JSP Ajax 실습 (0) | 2019.11.22 |
---|---|
<이공계기술전문연수> 14. Servlet / JSP MVC2 실습(6) 사진등록(ajax) (0) | 2019.11.21 |
<이공계기술전문연수> 12. Servlet / JSP MVC2 실습(4) 아이디찾기 / 비밀번호찾기 / 아이디 중복체크 (2) | 2019.11.20 |
<이공계기술전문연수> 11. Servlet / JSP MVC2 실습(3) 회원정보 수정/회원 탈퇴/마이 페이지 / 회원 전체 관리 / 회원 정보 검색 (0) | 2019.11.20 |
<이공계기술전문연수> 10. Servlet / JSP MVC2 실습(2) 회원가입/로그인/로그아웃 (0) | 2019.11.20 |