게시글을 작성, 수정할 수 있는 코드이다. SmartEditor 기능을 추가하였다.
SmartEditor 를 사용하기 위한 설정
1. webapp 에 SmartEditor 폴더를 복사해서 붙여 넣기
2. webapp 에 upload 폴더 만들어 두기
3. webapp/WEB-INF/lib 폴더에 commons-io.jar 파일과 commons-fileupload.jar 파일 붙여 넣기
4. <textarea id="content" name="content"> content 가 아래의 javascript 에서 사용 되기때문에 다른 이름으로 바꾸고 싶으면 javascript 에서 content 를 찾아서 모두 다른 이름으로 바꿔주면 된다.
5. textarea 의 크기가 SmartEditor 의 크기가 된다.
6. 폼을 제출하고 싶으면 submitContents(this) 라는 javascript 가 폼 안에 있는 버튼에서 실행되면 된다.
list.jsp
<%@page import="test.cafe.dao.CafeDao"%>
<%@page import="test.cafe.dto.CafeDto"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//한 페이지에 몇개씩 표시할 것인지
final int PAGE_ROW_COUNT=5;
//하단 페이지를 몇개씩 표시할 것인지
final int PAGE_DISPLAY_COUNT=5;
//보여줄 페이지의 번호를 일단 1이라고 초기값 지정
int pageNum=1;
//페이지 번호가 파라미터로 전달되는지 읽어와 본다.
String strPageNum=request.getParameter("pageNum");
//만일 페이지 번호가 파라미터로 넘어 온다면
if(strPageNum != null){
//숫자로 바꿔서 보여줄 페이지 번호로 지정한다.
pageNum=Integer.parseInt(strPageNum);
}
//보여줄 페이지의 시작 ROWNUM
int startRowNum=1+(pageNum-1)*PAGE_ROW_COUNT;
//보여줄 페이지의 끝 ROWNUM
int endRowNum=pageNum*PAGE_ROW_COUNT;
//하단 시작 페이지 번호
int startPageNum = 1 + ((pageNum-1)/PAGE_DISPLAY_COUNT)*PAGE_DISPLAY_COUNT;
//하단 끝 페이지 번호
int endPageNum=startPageNum+PAGE_DISPLAY_COUNT-1;
//전체 글의 갯수
int totalRow=CafeDao.getInstance().getCount();
//전체 페이지의 갯수 구하기
int totalPageCount=(int)Math.ceil(totalRow/(double)PAGE_ROW_COUNT);
//끝 페이지 번호가 이미 전체 페이지 갯수보다 크게 계산되었다면 잘못된 값이다.
if(endPageNum > totalPageCount){
endPageNum=totalPageCount; //보정해 준다.
}
//CafeDto 객체에 startRowNum 과 endRowNum 을 담아서
CafeDto dto=new CafeDto();
dto.setStartRowNum(startRowNum);
dto.setEndRowNum(endRowNum);
//글 목록을 얻어온다.
List<CafeDto> list=CafeDao.getInstance().getList(dto);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/cafe/list.jsp</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2" crossorigin="anonymous"></script>
</head>
<body>
<div class="container">
<h1>글 목록 입니다.</h1>
<table class="table table-striped">
<thead class="table-dark">
<tr>
<th>번호</th>
<th>작성자</th>
<th>제목</th>
<th>조회수</th>
<th>등록일</th>
</tr>
</thead>
<tbody>
<%for(CafeDto tmp:list){ %>
<tr>
<td><%=tmp.getNum() %></td>
<td><%=tmp.getWriter() %></td>
<td>
<a href="detail.jsp?num=<%=tmp.getNum() %>"><%=tmp.getTitle() %></a>
</td>
<td><%=tmp.getViewCount() %></td>
<td><%=tmp.getRegdate() %></td>
</tr>
<%} %>
</tbody>
</table>
<nav>
<ul class="pagination">
<%if(startPageNum != 1){ %>
<li class="page-item">
<a class="page-link" href="list.jsp?pageNum=<%=startPageNum-1 %>">Prev</a>
</li>
<%} %>
<%for(int i=startPageNum; i<=endPageNum; i++){ %>
<%if(pageNum == i){ %>
<li class="page-item active">
<a class="page-link" href="list.jsp?pageNum=<%=i %>"><%=i %></a>
</li>
<%}else{ %>
<li class="page-item">
<a class="page-link" href="list.jsp?pageNum=<%=i %>"><%=i %></a>
</li>
<%} %>
<%} %>
<%if(endPageNum < totalPageCount){ %>
<li class="page-item">
<a class="page-link" href="list.jsp?pageNum=<%=endPageNum+1 %>">Next</a>
</li>
<%} %>
</ul>
</nav>
<a href="${pageContext.request.contextPath }/cafe/private/insertform.jsp">새글 작성</a>
</div>
</body>
</html>
insertform.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/cafe/private/insertform.jsp</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2" crossorigin="anonymous"></script>
<style>
img{
max-width: 100%;
}
</style>
</head>
<body>
<div class="container">
<h1>새글 작성 폼 입니다.</h1>
<form action="insert.jsp" method="post">
<div class="mb-2">
<label class="form-label" for="title">제목</label>
<input class="form-control" type="text" name="title" id="title"/>
</div>
<div class="mb-2">
<label class="form-label" for="content">내용</label>
<textarea class="form-control" name="content" id="content"></textarea>
</div>
<button class="btn btn-primary btn-sm" type="submit" onclick="submitContents(this);">저장</button>
</form>
</div>
<%--
[ SmartEditor 를 사용하기 위한 설정 ]
1. webapp 에 SmartEditor 폴더를 복사해서 붙여 넣기
2. webapp 에 upload 폴더 만들어 두기
3. webapp/WEB-INF/lib 폴더에
commons-io.jar 파일과 commons-fileupload.jar 파일 붙여 넣기
4. <textarea id="content" name="content">
content 가 아래의 javascript 에서 사용 되기때문에 다른 이름으로 바꾸고
싶으면 javascript 에서 content 를 찾아서 모두 다른 이름으로 바꿔주면 된다.
5. textarea 의 크기가 SmartEditor 의 크기가 된다.
6. 폼을 제출하고 싶으면 submitContents(this) 라는 javascript 가
폼 안에 있는 버튼에서 실행되면 된다.
--%>
<!-- SmartEditor 에서 필요한 javascript 로딩 -->
<script src="${pageContext.request.contextPath }/SmartEditor/js/HuskyEZCreator.js"></script>
<script>
var oEditors = [];
//추가 글꼴 목록
//var aAdditionalFontSet = [["MS UI Gothic", "MS UI Gothic"], ["Comic Sans MS", "Comic Sans MS"],["TEST","TEST"]];
nhn.husky.EZCreator.createInIFrame({
oAppRef: oEditors,
elPlaceHolder: "content",
sSkinURI: "${pageContext.request.contextPath}/SmartEditor/SmartEditor2Skin.html",
htParams : {
bUseToolbar : true, // 툴바 사용 여부 (true:사용/ false:사용하지 않음)
bUseVerticalResizer : true, // 입력창 크기 조절바 사용 여부 (true:사용/ false:사용하지 않음)
bUseModeChanger : true, // 모드 탭(Editor | HTML | TEXT) 사용 여부 (true:사용/ false:사용하지 않음)
//aAdditionalFontList : aAdditionalFontSet, // 추가 글꼴 목록
fOnBeforeUnload : function(){
//alert("완료!");
}
}, //boolean
fOnAppLoad : function(){
//예제 코드
//oEditors.getById["ir1"].exec("PASTE_HTML", ["로딩이 완료된 후에 본문에 삽입되는 text입니다."]);
},
fCreator: "createSEditor2"
});
function pasteHTML() {
var sHTML = "<span style='color:#FF0000;'>이미지도 같은 방식으로 삽입합니다.<\/span>";
oEditors.getById["content"].exec("PASTE_HTML", [sHTML]);
}
function showHTML() {
var sHTML = oEditors.getById["content"].getIR();
alert(sHTML);
}
function submitContents(elClickedObj) {
//SmartEditor 에 의해 만들어진 (작성한 글) 내용이 textarea 의 value 가 되도록 한다.
oEditors.getById["content"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다.
// 에디터의 내용에 대한 값 검증은 이곳에서 document.getElementById("content").value를 이용해서 처리하면 됩니다.
try {
//폼 제출하기
elClickedObj.form.submit();
} catch(e) {}
}
function setDefaultFont() {
var sDefaultFont = '궁서';
var nFontSize = 24;
oEditors.getById["content"].setDefaultFont(sDefaultFont, nFontSize);
}
</script>
</body>
</html>
insert.jsp
<%@page import="test.cafe.dto.CafeDto"%>
<%@page import="test.cafe.dao.CafeDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//1. 폼 전송되는 글의 제목, 내용을 읽어온다.
String title=request.getParameter("title");
String content=request.getParameter("content");
//2. 세션에서 글 작성자를 읽어온다.
String writer=(String)session.getAttribute("id");
//3. 읽어온 모든 정보를 CafeDto 에 담는다.
CafeDto dto=new CafeDto();
dto.setWriter(writer);
dto.setTitle(title);
dto.setContent(content);
//4. CafeDao 를 이용해서 DB 에 저장하고
boolean isSuccess=CafeDao.getInstance().insert(dto);
//5. 응답한다.
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/cafe/private/insert.jsp</title>
</head>
<body>
<%if(isSuccess){ %>
<script>
alert("새글이 추가 되었습니다.");
location.href="${pageContext.request.contextPath }/cafe/list.jsp";
</script>
<%}else{ %>
<script>
alert("글 작성 실패!");
location.href="insertform.jsp";
</script>
<%} %>
</body>
</html>
updateform.jsp
<%@page import="test.cafe.dao.CafeDao"%>
<%@page import="test.cafe.dto.CafeDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//1. 수정할 글번호를 읽어온다.
int num=Integer.parseInt(request.getParameter("num"));
//2. DB 에서 수정할 글정보를 읽어온다.
CafeDto dto=CafeDao.getInstance().getData(num);
//3. 글수정 폼을 응답 한다.
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/cafe/private/updateform.jsp</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2" crossorigin="anonymous"></script>
</head>
<body>
<div class="container">
<h1>글 수정 양식</h1>
<form action="update.jsp" method="post">
<input type="hidden" name="num" value="<%=dto.getNum() %>"/>
<div class="mb-2">
<label class="form-label" for="title">제목</label>
<input class="form-control" type="text" name="title" id="title" value="<%=dto.getTitle() %>"/>
</div>
<div class="mb-2">
<label class="form-label" for="content">내용</label>
<textarea class="form-control" id="content" name="content" rows="10"><%=dto.getContent() %></textarea>
</div>
<button class="btn btn-primary btn-sm" type="submit" onclick="submitContents(this)">수정확인</button>
<button class="btn btn-danger btn-sm" type="reset">취소</button>
</form>
</div>
<!-- SmartEditor 에서 필요한 javascript 로딩 -->
<script src="${pageContext.request.contextPath }/SmartEditor/js/HuskyEZCreator.js"></script>
<script>
var oEditors = [];
//추가 글꼴 목록
//var aAdditionalFontSet = [["MS UI Gothic", "MS UI Gothic"], ["Comic Sans MS", "Comic Sans MS"],["TEST","TEST"]];
nhn.husky.EZCreator.createInIFrame({
oAppRef: oEditors,
elPlaceHolder: "content",
sSkinURI: "${pageContext.request.contextPath}/SmartEditor/SmartEditor2Skin.html",
htParams : {
bUseToolbar : true, // 툴바 사용 여부 (true:사용/ false:사용하지 않음)
bUseVerticalResizer : true, // 입력창 크기 조절바 사용 여부 (true:사용/ false:사용하지 않음)
bUseModeChanger : true, // 모드 탭(Editor | HTML | TEXT) 사용 여부 (true:사용/ false:사용하지 않음)
//aAdditionalFontList : aAdditionalFontSet, // 추가 글꼴 목록
fOnBeforeUnload : function(){
//alert("완료!");
}
}, //boolean
fOnAppLoad : function(){
//예제 코드
//oEditors.getById["ir1"].exec("PASTE_HTML", ["로딩이 완료된 후에 본문에 삽입되는 text입니다."]);
},
fCreator: "createSEditor2"
});
function pasteHTML() {
var sHTML = "<span style='color:#FF0000;'>이미지도 같은 방식으로 삽입합니다.<\/span>";
oEditors.getById["content"].exec("PASTE_HTML", [sHTML]);
}
function showHTML() {
var sHTML = oEditors.getById["content"].getIR();
alert(sHTML);
}
function submitContents(elClickedObj) {
oEditors.getById["content"].exec("UPDATE_CONTENTS_FIELD", []); // 에디터의 내용이 textarea에 적용됩니다.
// 에디터의 내용에 대한 값 검증은 이곳에서 document.getElementById("content").value를 이용해서 처리하면 됩니다.
try {
elClickedObj.form.submit();
} catch(e) {}
}
function setDefaultFont() {
var sDefaultFont = '궁서';
var nFontSize = 24;
oEditors.getById["content"].setDefaultFont(sDefaultFont, nFontSize);
}
</script>
</body>
</html>
update.jsp
<%@page import="test.cafe.dao.CafeDao"%>
<%@page import="test.cafe.dto.CafeDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//1. 폼 전송되는 수정할 글의 정보를 읽어온다.
int num=Integer.parseInt(request.getParameter("num"));
String title=request.getParameter("title");
String content=request.getParameter("content");
//2. DB 에 수정 반영
CafeDto dto=new CafeDto();
dto.setNum(num);
dto.setTitle(title);
dto.setContent(content);
boolean isSuccess=CafeDao.getInstance().update(dto);
//3. 응답
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/cafe/private/update.jsp</title>
</head>
<body>
<%if(isSuccess){ %>
<script>
alert("수정 했습니다.");
location.href="${pageContext.request.contextPath }/cafe/detail.jsp?num=<%=num %>";
</script>
<%}else{ %>
<script>
alert("수정이 실패 되었습니다.");
location.href="${pageContext.request.contextPath }/cafe/private/updateform.jsp?num=<%=num %>";
</script>
<%} %>
</body>
</html>
detail.jsp
<%@page import="test.cafe.dao.CafeDao"%>
<%@page import="test.cafe.dto.CafeDto"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//GET 방식 파라미터로 전달되는 글 번호를 읽어온다.
int num=Integer.parseInt(request.getParameter("num"));
//글 번호를 이용해서 글 하나의 정보를 읽어온다.
CafeDto dto=CafeDao.getInstance().getData(num);
//로그인된 아이디
String id=(String)session.getAttribute("id");
//조회수 올리기
CafeDao.getInstance().addViewCount(num);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>/cafe/detail.jsp</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-0evHe/X+R7YkIZDRvuzKMRqM+OrBnVFBL6DOitfPri4tjfHxaWutUpFmBp4vmVor" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-pprn3073KE6tl6bjs2QrFaJGz5/SUsLqktiwsUTF55Jfv3qYSDhgCecCxMW52nD2" crossorigin="anonymous"></script>
<style>
img{
max-width: 100%;
}
</style>
</head>
<body>
<div class="container">
<h1>글 상세 보기</h1>
<table class="table table-bordered">
<colgroup>
<col class="col-6"/>
<col class="col-6"/>
</colgroup>
<tr>
<th>글번호</th>
<td><%=dto.getNum() %></td>
</tr>
<tr>
<th>작성자</th>
<td><%=dto.getWriter() %></td>
</tr>
<tr>
<th>제목</th>
<td><%=dto.getTitle() %></td>
</tr>
<tr>
<th>조회수</th>
<td><%=dto.getViewCount() %></td>
</tr>
<tr>
<td colspan="2">
<div><%=dto.getContent() %></div>
</td>
</tr>
</table>
<%-- 만일 글 작성자가 로그인된 아이디와 같다면 수정, 삭제 링크를 제공한다. --%>
<%if(dto.getWriter().equals(id)){ %>
<a href="private/updateform.jsp?num=<%=dto.getNum()%>">수정</a>
<a href="javascript:" onclick="deleteConfirm()">삭제</a>
<script>
function deleteConfirm(){
const isDelete=confirm("이 글을 삭제 하겠습니까?");
if(isDelete){
location.href="private/delete.jsp?num=<%=dto.getNum()%>";
}
}
</script>
<%} %>
</div>
</body>
</html>
delete.jsp
<%@page import="test.cafe.dao.CafeDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//삭제할 글번호를 읽어온다.
int num=Integer.parseInt(request.getParameter("num"));
//DB 에서 삭제
boolean isSuccess=CafeDao.getInstance().delete(num);
//글 목록 보기로 리다일렉트 이동 ( 특정 경로로 요청을 다시하라고 클라이언트에게 강요하기)
String cPath=request.getContextPath();
response.sendRedirect(cPath+"/cafe/list.jsp");
%>
'Servlet&JSP' 카테고리의 다른 글
Step04_Final (popup) (0) | 2022.08.24 |
---|---|
Step04_Final (sql 자료) (0) | 2022.08.24 |
Step04_Final (users, private) 비밀번호 수정, 회원 탈퇴 (0) | 2022.08.24 |
Step04_Final (UsersDao, UsersDto 자료) (0) | 2022.08.24 |
Step04_Final (users/private, 가입정보 관리) (0) | 2022.08.23 |