지금까지는 jsp 파일내에 다른 jsp 파일을 경로로 링크를 걸어서(예1) 페이지를 연결하여 게시판을 구현했었으며 필요에 따라 jsp 파일 내에 스크립틀립 <%%>을 사용해서 java 코드를 넣어줬었다(예2).
-> 예1) Main 페이지에서 로그인/회원가입 버튼에 하이퍼링크를 Login.jsp/Register.jsp 로 연결해준다거나, 'form action = '에 jsp 파일을 연결하여 페이지 이동이 일어날 수 있도록.
이 경우, 주소창에 jsp 파일명이 그대로 노출되었었음.
-> 예2) 메인화면에서 게시판 클릭시 List.jsp에서 로그인 여부를 java 코드로 확인 후 로그인 상태일 경우 게시판을, 로그아웃 상태일경우 로그인 화면으로 이동하도록.
Servlet 매핑은 두 가지가 있는데 나는 직접 @WebServlet 애너테이션을 이용하여 맵핑하는 방식을 선호한다. (이 때, 주의해야 하는 점은 @WebServlet ("/경로") 를 선언할 때 경로 앞에 ★ / 슬래쉬 ★ 표시를 꼭!!! 잊지 않고 해줘야한다. 그렇지 않으면 경로를 찾을 수 없어서 에러가 뜸)
Servlet을 사용하여 MVC 패턴을 적용하므로 지금까지 jsp로 구현했던 입출력 과정을 Controller 클래스를 생성하여 구현한다.
먼저, 내가 jsp파일로 구현한 게시판을 servlet 방식으로 바꾸기 전에 각 컨트롤러별 수행할 기능을 아래와 같이 정리해보았다.

정리하면서 다시 한번 머릿속에 정리해본 내용은,
package controller;
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;
@WebServlet ("/main")
public class mainController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/Main.jsp").forward(req, resp);
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>홈화면</title>
<link rel="stylesheet" href="css/HeaderAndNav.css">
</head>
<body>
<%@ include file = "HeaderAndNav.jsp" %>
</body>
</html>
package controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import dao.MemberDao;
import dto.Member;
@WebServlet("/login")
public class loginController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String url = req.getParameter("url");
req.getRequestDispatcher("LoginForm.jsp?url="+url).forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
String pw = req.getParameter("pw");
String url = req.getParameter("back");
String rememberId = req.getParameter("rememberId");
System.out.println("id : "+id);
System.out.println("pw : "+pw);
System.out.println("back : "+url);
System.out.println("rememberId : "+rememberId);
String back = "null".equals(url) || url==null || "".equals(url) ? "main" : req.getParameter("back");
MemberDao dao = new MemberDao(req.getServletContext());
Cookie cookie = new Cookie("id", id);
Member mem = dao.login(id);
if(mem.getId().equals(id)&&mem.getPw().equals(pw)){
if("on".equals(rememberId)){
cookie = new Cookie("id", id);
resp.addCookie(cookie);
/* util.CookieManager.makeCookie(resp, "id", id, 86400); */
}else{
cookie = new Cookie("id","");
cookie.setMaxAge(0);
resp.addCookie(cookie);
/* util.CookieManager.deleteCookie(resp, "id"); */
}
HttpSession session = req.getSession();
session.setAttribute("id", id);
session.setAttribute("name", mem.getName());
resp.sendRedirect(back);
}else{
req.getRequestDispatcher("/LoginForm.jsp?loginError=1").forward(req, resp);
}
dao.close();
}
}
<%@page import="util.CookieManager"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인</title>
<link rel="stylesheet" href="css/HeaderAndNav.css">
<style>
*{box-sizing : border-box;}
form{
border : 2px dashed green;
margin : 0 auto;
border-radius: 5px;
width : 300px;
height : 300px;
display : grid;
grid-template-rows : repeat(5, 1fr);
}
h2{
color : green;
text-align : center;
margin : 40px;
font-weight : bolder;}
.logSec{
width : 300px;
display : flex;
justify-content: center;
align-items: center;
}
input{
height : 35px;
font-size : 15px;
padding : 0 10px;
border-radius : 5px;
border : 1px solid gray;
}
button{
width : 80px;
height : 30px;
font-size : 15px;
}
#login{
font-size : 40px;
font-weight : bolder;
text-align : center;
color : green;
}
#rememberId{
width : 10px;
height : 10px;
border : 1px solid green;
margin-right:3px;
}
label {
display : flex;
align-items: center;
justify-content : center;
}
#msg { text-align: center;
padding-top : 30px;}
</style>
</head>
<body>
<%@ include file = "HeaderAndNav.jsp" %>
<%
/* String rememberId = "";
String check = "";
Cookie[] cookies = request.getCookies(); // 요청 헤더의 모든 쿠키 얻기
if (cookies!=null) {
for (Cookie c : cookies) { // 쿠키 각각의
String cookieName = c.getName(); // 쿠키 이름 얻기
if("id".equals(cookieName)){
rememberId = c.getValue();
check = "checked";
}
}
} */
/* String rememberId = CookieManager.readCookie(request, "id");
String check = "";
if(!rememberId.equals("")) check="checked"; */
%>
<p id="login">로그인</p>
<form action="./login" method="post" onsubmit = "return formCheck(this);">
<div id="msg"></div>
<input type="hidden" name="back" value="${param.url }">
<div class="logSec"><input type="text" name = "id" autofocus placeholder="아이디" value="${cookie.id.value}"></div>
<div class="logSec"><input type="password" name="pw" placeholder="비밀번호"></div>
<label><input type="checkbox" name="rememberId" id="rememberId" ${empty cookie.id.value ? "":"checked"} >아이디 기억</label>
<div class="logSec"><button>로그인</button></div>
</form>
<script>
if("${param.loginError}"!=""){
document.querySelector("#msg").innerText ="아이디와 비밀번호를 확인해주세요"
}
function formCheck(frm) {
if(frm.id.value.length==0) {
setMessage("아이디를 입력해주세요", frm.id);
return false;
}
if(frm.pw.value.length==0) {
setMessage("비밀번호를 입력해주세요", frm.pw);
return false;
}
return true;
}
function setMessage(msg, element){
document.getElementById("msg").innerHTML = msg;
if(element) {
element.select();
}
}
</script>
</body>
</html>
package controller;
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 javax.servlet.http.HttpSession;
@WebServlet ("/logout")
public class logoutController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.invalidate();
resp.sendRedirect("main");
}
}
package controller;
import java.io.IOException;
import java.net.URLEncoder;
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 dao.MemberDao;
import dto.Member;
@WebServlet ("/register")
public class registerController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/RegisterForm.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
MemberDao dao = new MemberDao(req.getServletContext());
String id = req.getParameter("id");
String pw = req.getParameter("pw");
String name = req.getParameter("name");
String pwch = req.getParameter("pwch");
Member mem = new Member(id, pw, name);
if(pw!=null&&pw.equals(pwch)){
int res = dao.register(mem);
if(res==1) {
resp.sendRedirect("login");
}else{
req.getRequestDispatcher("RegisterForm.jsp?msg="+URLEncoder.encode("회원가입에 실패했습니다.", "utf-8")).forward(req, resp);
req.setAttribute("id", id);
req.setAttribute("name", name);
}
}else {
req.getRequestDispatcher("RegisterForm.jsp?msg="+URLEncoder.encode("회원가입에 실패했습니다.", "utf-8")).forward(req, resp);
req.setAttribute("id", id);
req.setAttribute("name", name);
}
dao.close();
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.net.URLDecoder" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>
<link rel="stylesheet" href="css/HeaderAndNav.css">
<style>
form{
border : 2px dashed green;
margin : 0 auto;
padding : 20px 0;
border-radius: 5px;
width : 300px;
height : 320px;
display : grid;
grid-template-rows : repeat(1fr, 5);
}
h2{
color : green;
text-align : center;
margin : 40px;}
.regSec{
width : 300px;
display : flex;
justify-content: center;
align-items: center;
}
input{
height : 35px;
font-size : 15px;
padding : 0 10px;
border-radius : 5px;
border : 1px solid gray;
}
button{
width : 80px;
height : 30px;
font-size : 15px;
margin : 10px;
}
#msg { text-align: center;
</style>
</head>
<body>
<%@ include file = "HeaderAndNav.jsp" %>
<h2>회원가입</h2>
<form action="./register" method="post" onsubmit = "return formCheck(this);">
<div id="msg">${URLDecoder.decode(param.msg, 'utf-8') }</div>
<div class="regSec"><input type="text" name = "id" autofocus placeholder="아이디" value="${param.id }"></div>
<div class="regSec"><input type="password" name="pw" placeholder="비밀번호"></div>
<div class="regSec"><input type="password" name="pwch" placeholder="비밀번호 확인"></div>
<div class="regSec"><input type="text" name="name" placeholder="이름" value="${param.name }"></div>
<div class="regSec"><button>회원가입</button><button type="button" onclick="location.href='Main.jsp'">취소</button></div>
</form>
<script>
/* if("${param.registerError}"!=""){
document.querySelector("#msg").innerText ="회원가입이 완료되지 않았습니다."
} */
function formCheck(frm) {
if(frm.id.value.length==0) {
setMessage("아이디를 입력해주세요", frm.id);
return false;
}
if(frm.pw.value.length==0||frm.pwch.value.length==0) {
setMessage("비밀번호를 입력해주세요", frm.pw);
return false;
}
if(frm.name.value.length==0) {
setMessage("이름을 입력해주세요", frm.pw);
return false;
}
return true;
}
function setMessage(msg, element){
document.getElementById("msg").innerHTML = msg;
if(element) {
element.select();
}
}
</script>
</body>
</html>
package controller;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 dao.BoardDao;
import dto.BoardDto;
import util.JSFunction;
import util.PageHandler;
import util.SearchCondition;
@WebServlet ("/list")
public class listController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if(req.getSession().getAttribute("id")==null) {
String url = req.getRequestURI();
JSFunction.alertLocation("로그인 후 이용해주세요.", "login?url="+url, resp);
return;
}
BoardDao dao = new BoardDao(req.getServletContext());
Map<String, String> map = new HashMap<String, String>();
SearchCondition sc = null;
PageHandler ph = null;
//쿼리스트링 통해서 전달 받을 값
String searchField = req.getParameter("searchField");
String searchWord = req.getParameter("searchWord");
int pageSize = 10;
int pageNum = 1;
String pageTmp = req.getParameter("pageNum");
if(pageTmp != null && !"".equals(pageTmp)&&!"null".equals(pageTmp)) {
pageNum = Integer.parseInt(pageTmp);
}
//검색어가 있다면
if(searchWord!=null&&!"".equals(searchWord)) {
map.put("searchField", searchField);
map.put("searchWord", searchWord);
sc = new SearchCondition(searchField, searchWord, pageNum, pageSize);
} else {
sc = new SearchCondition(pageNum, pageSize);
}
//총 게시물 수 확인
int totalCnt = dao.selectCount(map);
ph = new PageHandler(sc, totalCnt);
map.put("offset", sc.getOffset(pageNum)+"");
map.put("pageSize", pageSize+"");
//게시물 조회
List<BoardDto> blist = dao.selectList(map);
req.setAttribute("blist", blist);
req.setAttribute("ph", ph);
req.setAttribute("pageNum", pageNum);
//날짜 비교
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String now = sdf.format(date);
req.setAttribute("now", now);
dao.close();
req.getRequestDispatcher("List.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@page import="util.PageHandler"%>
<%@page import="dto.BoardDto"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="dao.BoardDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
<style>
section{
width : 1200px;
height : 700px;
margin : 0 auto;}
table{
border-collapse: collapse;
margin : 0 auto;
width : 1000px;
}
tr, th, td {
border : 1px solid lightgray;
padding : 10px;
text-align : center;
}
td{
font-size:15px;
}
th{
background-color : #F2F5F2;
font-size : 17px;
}
h1{
text-align : center;
margin-top : 40px;
}
#searchBar{
text-align : right;
margin : 20px 0;
padding-right:100px;
}
#searchField, #searchWord{
height : 30px;
}
#searchBar>button{
margin-left : 5px;
height : 30px;
}
#postBtn{
text-align : right;
margin : 10px;
padding-right : 100px;
}
#postBtn>a{
color : green;
font-size : 15px;
font-weight : bold;}
a{text-decoration: none; color : black;}
#pageNav{
text-align : center;
}
</style>
<link rel="stylesheet" href="css/HeaderAndNav.css">
</head>
<body>
<%@ include file = "HeaderAndNav.jsp" %>
<section>
<form>
<h1>회원제 게시판</h1>
<div id="searchBar">
<select name = "searchField" id = "searchField">
<option value="title" ${"title" eq param.searchField? "selected":"" }>제목</option>
<option value="content" ${"content" eq param.searchField? "selected":"" }>내용</option>
</select>
<input type="text" id= "searchWord" name="searchWord" value = "${empty param.searchWord ? '' : param.searchWord }"><button>검색</button>
</div>
<table>
<tr>
<th width="10%">번호</th>
<th width="50%">제목</th>
<th width="10%">작성자</th>
<th width="10%">조회수</th>
<th width="10%">좋아요</th>
<th width="10%">작성일</th>
</tr>
<c:choose>
<c:when test="${empty blist }">
<tr><td colspan = "5" align="center">등록된 게시물이 없습니다.</td>
</c:when>
<c:otherwise>
<c:forEach items="${blist }" var="tmp">
<tr>
<td>${tmp.num }</td>
<td><a href="view?num=${tmp.num }&pageNum=${pageNum}">${tmp.title }</a>
<c:if test="${tmp.commentCnt > 0}">
<a style="color:green; margin-left:3px;" href="view?num=${tmp.num }&pageNum=${pageNum}">[${tmp.commentCnt }]</a></td>
</c:if>
<td>${tmp.id }</td>
<td>${tmp.viewCnt }</td>
<td>${tmp.likeCnt }</td>
<fmt:formatDate value="${tmp.postDate }" type="both" pattern="yyyy-MM-dd" var="postdate"></fmt:formatDate>
<fmt:formatDate value="${tmp.postDate}" type="time" pattern="HH:mm" var="posttime"></fmt:formatDate>
<c:choose>
<c:when test="${now eq postdate }">
<td>${posttime }</td>
</c:when>
<c:otherwise>
<td>${postdate }</td>
</c:otherwise>
</c:choose>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
<div id="postBtn"><a href="./post">글쓰기</a></div>
<div id="pageNav" name="pageNav">
<c:if test="${ph.showPrev}">
<a href="./list${ph.sc.getQueryString(ph.beginPage-1)}">이전</a>
</c:if>
<c:forEach var="i" begin="${ph.beginPage }" end="${ph.endPage}">
<c:choose>
<c:when test="${i==ph.sc.page }">
<a style="color:green; font-weight:bold;" href="./list${ph.sc.getQueryString(i) }">${i }</a>
</c:when>
<c:otherwise>
<a href="./list${ph.sc.getQueryString(i)}">${i }</a>
</c:otherwise>
</c:choose>
</c:forEach>
<c:if test="${ph.showNext}">
<a href="./list${ph.sc.getQueryString(ph.endPage+1)}">다음</a>
</c:if>
</div>
</form>
</section>
</body>
</html>
package controller;
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 javax.servlet.http.HttpSession;
import dao.BoardDao;
import dto.BoardDto;
import util.JSFunction;
import util.JSFunction2;
@WebServlet ("/post")
public class postController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
if(session.getAttribute("id")==null) {
JSFunction.alertLocation(getServletName(), getServletInfo(), resp);
return;
}
req.getRequestDispatcher("PostForm.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
BoardDao dao = new BoardDao(req.getServletContext());
String title = req.getParameter("title");
String content = req.getParameter("content");
HttpSession session = req.getSession();
String id = session.getAttribute("id")+"";
BoardDto dto = new BoardDto(title, content, id);
int res = dao.post(dto);
if(res==1){
JSFunction.alertLocation("정상적으로 등록되었습니다.", "list", resp);
}else{
JSFunction.alertBack("잠시 후 다시 시도해주세요.", resp);
}
dao.close();
}
}
<%@ 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>
<link rel="stylesheet" href="css/HeaderAndNav.css">
<style>
*{
box-sizing: border-box;}
section {
width : 500px;
height: 600px;
margin : 0 auto;
}
#boardHeader{
text-align : center;
}
textarea{
font-size : 15px;
width: 500px;
height: 400px;
border: 1px solid green;
border-radius : 10px;
resize: none;
padding : 10px;
}
#title{
font-size : 15px;
width: 500px;
border: 1px solid green;
border-radius : 10px;
padding : 10px;
}
#btn{text-align : right;}
button{
margin : 3px;
background-color : white;
border : 1px solid green;
}
button:hover{
cursor:pointer;
}
</style>
</head>
<body>
<%@ include file = "HeaderAndNav.jsp" %>
<section>
<form action="./post" onsubmit="return formCheck(this);" method="post">
<h1 id="boardHeader">글 쓰기</h1>
<h3>제목</h3>
<input type="text" id="title" name="title">
<h3>내용</h3><textarea name="content"></textarea>
<div id=btn><button>작성</button><button type="reset">취소</button><button type="button" onclick="location.href='List.jsp'" >목록보기</button></div>
</form>
</section>
<script>
function formCheck(form){
console.log(form.title.value);
if(form.title.value.trim()==""){
alert("제목을 입력하세요.");
form.title.focus();
return false;
}
if(form.content.value.trim()==""){
alert("내용을 입력하세요.");
form.content.focuse();
return false;
}
return true;
}
</script>
</body>
</html>
package controller;
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 dao.BoardDao;
import dto.BoardDto;
import util.JSFunction;
@WebServlet ("/edit")
public class editController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if(req.getSession().getAttribute("id")==null) {
JSFunction.alertLocation("로그인 후 이용해주세요.", "login", resp);
return;
}
BoardDao dao = new BoardDao(req.getServletContext());
String snum = req.getParameter("num");
String pageNum = req.getParameter("pageNum");
pageNum = pageNum==null||"".equals(pageNum)||"null".equals(pageNum)? "1" : pageNum;
int num = Integer.parseInt(snum);
BoardDto dto = dao.selectNum(num);
req.setAttribute("dto", dto);
req.setAttribute("pageNum", pageNum);
dao.close();
req.getRequestDispatcher("EditForm.jsp").forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String title = req.getParameter("title");
String content = req.getParameter("content");
String snum = req.getParameter("num");
int num = Integer.parseInt(snum);
String pageNum = req.getParameter("pageNum");
pageNum = pageNum==null||"".equals(pageNum)||"null".equals(pageNum)? "1" : pageNum;
req.setAttribute("pageNum", pageNum);
String id = req.getSession().getAttribute("id")+"";
BoardDto dto = new BoardDto(num, title, content, id);
BoardDao dao = new BoardDao(req.getServletContext());
int res = dao.edit(dto);
if(res==1) {
resp.sendRedirect("view?num="+num+"&pageNum="+pageNum);
}else {
JSFunction.alertBack("잠시 후 다시 시도부탁드립니다.", resp);
}
dao.close();
}
}
<%@page import="dto.BoardDto"%>
<%@page import="dao.BoardDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
<link rel="stylesheet" href="css/HeaderAndNav.css">
<style>
*{
box-sizing: border-box;}
section {
width : 500px;
height: 600px;
margin : 0 auto;
}
#boardHeader{
text-align : center;
}
textarea{
font-size : 15px;
width: 500px;
height: 400px;
border: 1px solid green;
border-radius : 10px;
resize: none;
padding : 10px;
}
#title{
font-size : 15px;
width: 500px;
border: 1px solid green;
border-radius : 10px;
padding : 10px;
}
#btn{text-align : right;}
button{
margin : 3px;
background-color : white;
border : 1px solid green;
}
</style>
</head>
<body>
<%@ include file = "HeaderAndNav.jsp" %>
<%
int num = Integer.parseInt(request.getParameter("num"));
BoardDao dao = new BoardDao(application);
BoardDto dto = dao.selectNum(num);
request.setAttribute("dto", dto);
String pageNum = request.getParameter("pageNum");
pageNum = pageNum==null ? "1":pageNum;
request.setAttribute("pageNum", pageNum);
%>
<section>
<form action="./edit" onsubmit="return formCheck(this);" method="post">
<input type="hidden" name = "num" value="${dto.num}">
<input type="hidden" name = "pageNum" value="${pageNum }">
<h1 id="boardHeader">글 쓰기</h1>
<h3>제목</h3>
<input type="text" id="title" name="title" value="${dto.title }">
<h3>내용</h3><textarea name="content">${dto.content }</textarea>
<div id=btn><button>수정</button><button type="button" onclick="location.href='view?num=${param.num}&pageNum=${pageNum}'">취소</button><button type="button" onclick="location.href='list?pageNum=${pageNum}'">목록보기</button></div>
</form>
</section>
<script>
function formCheck(form){
console.log(form.title.value);
if(form.title.value.trim()==""){
alert("제목을 입력하세요.");
form.title.focus();
return false;
}
if(form.content.value.trim()==""){
alert("내용을 입력하세요.");
form.content.focuse();
return false;
}
return true;
}
</script>
</body>
</html>
package controller;
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 javax.servlet.http.HttpSession;
import dao.BoardDao;
import dao.LikeDao;
import dto.BoardDto;
import util.JSFunction;
@WebServlet ("/view")
public class viewController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
if(session.getAttribute("id")==null) {
JSFunction.alertLocation("로그인 후 이용해주세요.", "login", resp);
return;
}
//게시물 번호
String snum = req.getParameter("num");
int num = Integer.parseInt(snum);
//id값
String id = session.getAttribute("id")+"";
//좋아요 유무
LikeDao ldao = new LikeDao(req.getServletContext());
int like = ldao.selectLike(id, num+"");
req.setAttribute("like", like);
//페이지 번호
String pageNum = req.getParameter("pageNum");
pageNum= pageNum==null || "".equals(pageNum)||"null".equals(pageNum)? "1" :pageNum;
req.setAttribute("pageNum", pageNum);
BoardDao dao = new BoardDao(req.getServletContext());
int res = dao.updateViewCnt(num);
if(res==1) {
BoardDto dto = dao.selectNum(num);
req.setAttribute("dto", dto);
}else {
JSFunction.alertLocation("잠시 후 다시 시도해주세요.", "main", resp);
}
dao.close();
req.getRequestDispatcher("BoardView.jsp").forward(req, resp);
}
}
<%@page import="util.JSFunction"%>
<%@page import="dto.BoardDto"%>
<%@page import="dao.BoardDao"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
<style>
*{box-sizing: border-box;
margin : 0;
}
form {
width : 700px;
height: 600px;
margin : 0 auto;
}
#container{
border : 1px solid grey;
padding : 10px;
}
button{
margin : 3px;
background-color : white;
border : 1px solid green;
}
h2{text-align : center;
margin : 20px;
}
#viewInfo{
font-size : 12px;}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<link rel="stylesheet" href="css/HeaderAndNav.css">
<body>
<%@ include file = "HeaderAndNav.jsp" %>
<h2>상세보기(View)</h2>
<form action="./edit">
<div id="container">
<input type="hidden" name = "num" value="${dto.num }">
<input type="hidden" name = "pageNum" value="${pageNum }">
<div id="like">
<c:choose>
<c:when test="${like ==1}"><button type="button" name = "likeBtn" value="unlike">💚</button>
</c:when>
<c:otherwise><button type="button" name = "likeBtn" value="like">🤍</button>
</c:otherwise>
</c:choose>
</div>
<div><h3>${dto.title }</h3></div>
<div id="viewInfo">
<span>작성자 : ${dto.name } </span>
<span> / 작성일 : ${dto.postDate } </span>
<span> / 조회수 : ${dto.viewCnt } </span>
<span id="cmt"> / 댓글 수 : ${dto.commentCnt }</span>
<span id="likeNum"> / 좋아요 수 : ${dto.likeCnt }</span>
</div>
<br>
<div><h4>내용</h4>${dto.content }</div>
</div>
<c:if test="${dto.id eq sessionScope.id}">
<button>수정</button> <button type="button" onclick="deleteBoard()">삭제</button>
</c:if>
<button type="button" onclick="location.href='list?pageNum=${pageNum }'">목록</button>
</form>
<script>
bno = "${param.bno}";
function deleteBoard(){
let check = confirm("정말로 삭제하시겠습니까?");
if(check){
location.href="delete?num=${dto.num }";
}
}
$(document).ready(function(){
let bno= "${param.num}";
$("#like>button").click(function(){
let mode =$("#like>button").val();
console.log(mode);
let btn = $(this);
$.ajax({
type:'post', // 요청 메서드 (post 방식)
url: './like?', // 요청 URI
/* type:'get', // 요청 메서드 (get 방식)
url: './like?mode='+mode+'&num='+bno, // 요청 URI */
data : { mode:mode , num:bno } ,// 전달 데이터
success : function(result){ // 요청이 성공일 때 실행되는 이벤트
console.log(result.res);
console.log("mode : " + result.mode);
if(result.mode == "unlike"){
btn.val("unlike");
btn.text("💚");
}else{
btn.val("like");
btn.text("🤍");
}
$("#likeNum").text(" / 좋아요 수 : "+result.res)
},
error: function(request, status, error){ alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error) } // 에러가 발생했을 때, 호출될 함수
}); // $.ajax()
});
})
</script>
<%@include file = "Comment.jsp" %>
</body>
</html>
package controller;
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 dao.BoardDao;
import util.JSFunction;
@WebServlet ("/delete")
public class deleteController extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String tmp = req.getParameter("num");
int num = Integer.parseInt(tmp);
BoardDao dao = new BoardDao(req.getServletContext());
String id = req.getSession().getAttribute("id")+"";
int res = dao.delete(num, id);
if(res==1) {
JSFunction.alertLocation("정상적으로 삭제되었습니다.", "list", resp);
}
else {
JSFunction.alertBack("잠시 후 다시 시도해주세요.", resp);
}
}
}
위와 같이 controller를 사용함으로써 process.jsp로 연결되었던 경로는 모두 /main, /login, /register, /post 등과 같은 요청으로 수정되어 주소창에 jsp 파일명 노출없이 각 페이지가 연결되었으며 jsp 파일내에 삽입되었던 java 코드는 controller 내에 작성되어 jsp에는 html 코드만 남게되었다.
한결 깔끔해진 jsp 코드들!