벡엔드 웹프로그래밍/JSP

JSP 웹프로그래밍 70일차 (25/2/25)

wkun 2025. 2. 25. 17:46

contents

 

프로젝트 BookMarket 구성도

4.게시판(C/R)

 

-----------------------------------------

 

 

프로젝트 BookMarket 구성도

 

4.게시판(C/R)

BookMarket_CRUD/src/main/webapp/menu.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="dto.Member" %>
<%@ page session="false" %>
<%
HttpSession session = request.getSession(false);
Member mb=null;
if(session!=null){
mb = (Member)session.getAttribute("member");
}
%>


<header class="pb-3 mb-4 border-bottom">
<div class="container ">
<div class="d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start">
<a href="./welcome.jsp" class="d-flex align-items-center mb-3 mb-md-0 me-md-auto text-dark text-decoration-none">
<svg width="32" height="32" fill="currentColor" class="bi bi-house-fill" viewBox="0 0 16 16">
<path d="M8.707 1.5a1 1 0 0 0-1.414 0L.646 8.146a.5.5 0 0 0 .708.708L8 2.207l6.646 6.647a.5.5 0 0 0 .708-.708L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.707 1.5Z"/>
<path d="m8 3.293 6 6V13.5a1.5 1.5 0 0 1-1.5 1.5h-9A1.5 1.5 0 0 1 2 13.5V9.293l6-6Z"/>
</svg>
<span class="fs-4">Home</span>
</a>


<ul class="nav nav-pills">


<% if(mb==null){ %>


<li class="nav-item"><a class="nav-link" href="login">로그인 </a></li>
<li class="nav-item"><a class="nav-link" href="addmember">회원 가입</a></li>


<%}else {%>
<li style="padding-top: 7px">[<%=mb.getName()%>님]</li>
<li class="nav-item"><a class="nav-link" href="<c:url value="logout"/>">로그아웃 </a></li>
<li class="nav-item"><a class="nav-link" href="<c:url value="/member/updateMember.jsp"/>">회원 수정</a></li>
<%} %>


<li class="nav-item"><a href="read_All" class="nav-link" >도서 목록</a></li>
<li class ="nav-item"><a href = "addBook" class = "nav-link" >도서 등록</a></li>
<li class ="nav-item"><a href = "editBook.jsp?edit=update" class = "nav-link" >도서 수정</a></li>
<li class ="nav-item"><a href = "editBook.jsp?edit=delete" class = "nav-link" >도서 삭제</a></li>
<li class ="nav-item"><a href = "BoardListAction?pageNum=1" class = "nav-link" >게시판</a></li>
</ul>
</div>
</div>
</header>

*Session: <%@ page session="false" %>

BookMarket_CRUD/src/main/java/dto/Board.java

package dto;


public class Board {
private int num;
private String id;
private String name;
private String subject;
private String content;
private String regist_day;
private int hit;
private String ip;


public Board() {
super();
}


public int getNum() {
return num;
}


public void setNum(int num) {
this.num = num;
}


public String getId() {
return id;
}


public void setId(String id) {
this.id = id;
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public String getSubject() {
return subject;
}


public void setSubject(String subject) {
this.subject = subject;
}


public String getContent() {
return content;
}


public void setContent(String content) {
this.content = content;
}


public String getRegist_day() {
return regist_day;
}


public void setRegist_day(String regist_day) {
this.regist_day = regist_day;
}


public int getHit() {
return hit;
}


public void setHit(int hit) {
this.hit = hit;
}


public String getIp() {
return ip;
}


public void setIp(String ip) {
this.ip = ip;
}


@Override
public String toString() {
return "Board [num=" + num + ", id=" + id + ", name=" + name + ", subject=" + subject + ", content=" + content
+ ", regist_day=" + regist_day + ", hit=" + hit + ", ip=" + ip + "]";
}




}

*DTO: 1)변수생성

           2)생성자

           3)getter/setter

           4)toString()

sql

USE BookMarketDB;

CREATE TABLE board (
       num int not null auto_increment,
       id varchar(10) not null,
       name varchar(10) not null,
       subject varchar(100) not null,
       content text not null,
       regist_day varchar(30),
       hit int,
       ip varchar(20),
       PRIMARY KEY (num)
)default CHARSET=utf8;

select * from board;
desc board;
insert into board values(null,"a","abc","제목입니다a","내용입니다a","2025-01-01",1,"1.1.1.1");
insert into board values(null,"b","aaa","제목입니다b","내용입니다b","2025-01-02",1,"1.1.1.2");
insert into board values(null,"c","bbb","제목입니다c","내용입니다c","2025-01-03",1,"1.1.1.3");
insert into board values(null,"d","ccc","제목입니다d","내용입니다d","2025-01-04",1,"1.1.1.4");

select count(*) from board

 

실행 결과

 

 

BookMarket_CRUD/src/main/java/Controller/Board_Read_Controller.java

package Controller;


import java.io.IOException;
import java.util.*;
import dto.Board;


import dao.BoardRepository;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/BoardListAction")
public class Board_Read_Controller extends HttpServlet {
//read의 최종적인 목표 : DB에서 특정테이블의 모든행 혹은 하나의 행을 읽어와서 뷰에서 보여준다.(DTO, DB데이터 준비)
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Board_Read_Controller doGet()");
//전처리
int pagenum = Integer.parseInt(req.getParameter("pageNum"));
int limit = 5;
int total_page;
//모델이동
BoardRepository br = BoardRepository.getInstance();
ArrayList<Board> boardlist =br.getAllList(pagenum, limit);
int total_record = br.getListCount();


if (total_record % limit == 0){
total_page =total_record/limit;
Math.floor(total_page);
}
else{
total_page =total_record/limit;
Math.floor(total_page);
total_page = total_page + 1;
}
//뷰이동
req.setAttribute("Total_Record", total_record);
req.setAttribute("Total_Page", total_page);
req.setAttribute("pageNum", pagenum);
req.setAttribute("list", boardlist);
RequestDispatcher ds = req.getRequestDispatcher("board/list.jsp");
ds.forward(req, resp);


}


@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


}


}

*컨트롤러: 1)전처리: 파라미터多, 객체 묶음

                  2)모델이동: dao.Repository

                  3)뷰이동

*dto 변수를 dopost에 getParameter로 가져오기

BookMarket_CRUD/src/main/java/dao/BoardRepository.java

package dao;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import dto.Board;


public class BoardRepository {


//싱글톤
private static BoardRepository br = new BoardRepository();
public static BoardRepository getInstance() {
return br;
}
private BoardRepository() {}
//공용변수선언
Connection conn=null;
PreparedStatement pstmt= null;
ResultSet rs = null;

//Create
public void addBoard(Board bd) {
//데이터베이스 연결
try {
conn = DBConnection.connection();
//쿼리 작성 및 실행
String sql = "insert into Board values(?,?,?,?,?,?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, null);
pstmt.setString(2, bd.getId());
pstmt.setString(3, bd.getName());
pstmt.setString(4, bd.getSubject());
pstmt.setString(5, bd.getContent());
pstmt.setString(6, bd.getRegist_day());
pstmt.setInt(7, bd.getHit());
pstmt.setString(8, bd.getIp());
pstmt.executeUpdate();

//ResultSet
}catch(Exception e){}
}


//Read
public int getListCount() {
int result = 0;
try {
//데이터베이스 연결
conn = DBConnection.connection();
//쿼리 작성 및 실행
String sql = "select count(*) from board";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();

//ResultSet 변환
if(rs.next()) {
result = rs.getInt("count(*)"); //컬럼명
//result = rs.getInt(1); 첫번째 컬럼
}
System.out.println("총게시글의 갯수 : " + result);
}catch(Exception e) {}
return result;
}

public Board getOneList(int num) {
Board board=null;
try {
//데이터베이스 연결
conn = DBConnection.connection();
//쿼리작성 및 실행
String sql = "select * from Board where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
rs = pstmt.executeQuery();
//ResultSet --> DTO --> ArrayList<DTO>
while (rs.next()) {
board = new Board();
board.setNum(rs.getInt("num"));
board.setId(rs.getString("id"));
board.setName(rs.getString("name"));
board.setSubject(rs.getString("subject"));
board.setContent(rs.getString("content"));
board.setRegist_day(rs.getString("regist_day"));
board.setHit(rs.getInt("hit"));
board.setIp(rs.getString("ip"));

}

} catch (SQLException e) {e.printStackTrace();}

return board;
}

public ArrayList<Board> getAllList(int page, int limit){
//페이징 처리된 함수 : 일부 발췌


int total_record = getListCount();
int start = (page - 1) * limit;
int index = start + 1;


ArrayList<Board> ab = new ArrayList<Board>();
try {
//데이터베이스 연결
conn = DBConnection.connection();
//쿼리작성 및 실행
String sql = "select * from Board";
pstmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = pstmt.executeQuery();
// ResultSet --> DTO --> ArrayList<DTO>
while (rs.absolute(index)) {
Board board = new Board();
board.setNum(rs.getInt("num"));
board.setId(rs.getString("id"));
board.setName(rs.getString("name"));
board.setSubject(rs.getString("subject"));
board.setContent(rs.getString("content"));
board.setRegist_day(rs.getString("regist_day"));
board.setHit(rs.getInt("hit"));
board.setIp(rs.getString("ip"));
ab.add(board);


if (index < (start + limit) && index <= total_record)
index++;
else
break;
}
} catch (SQLException e) {e.printStackTrace();}
return ab;
}
public ArrayList<Board> getAllList2(){
//페이징 안된 함수
ArrayList<Board> ab = new ArrayList<Board>();
try {
//데이터베이스 연결
conn = DBConnection.connection();
//쿼리작성 및 실행
String sql = "select * from Board";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
//ResultSet --> DTO --> ArrayList<DTO>
while (rs.next()) {
Board board = new Board();
board.setNum(rs.getInt("num"));
board.setId(rs.getString("id"));
board.setName(rs.getString("name"));
board.setSubject(rs.getString("subject"));
board.setContent(rs.getString("content"));
board.setRegist_day(rs.getString("regist_day"));
board.setHit(rs.getInt("hit"));
board.setIp(rs.getString("ip"));
ab.add(board);
}

} catch (SQLException e) {e.printStackTrace();}

return ab;
}

//Update

//Delete
}

* 모델: 1)기본데이터

            2)객체(1) DTO

            3)ArrayList<DTO>

*sql 추가: select count(*) from board

   

BookMarket_CRUD/src/main/webapp/board/list.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page import="java.util.*"%>
<%@ page import="dto.Board"%>
<%@ page session="false" %>
<%
//게시글 5개가 담겨있음
ArrayList<Board> boardList = (ArrayList<Board>) request.getAttribute("list");

int total_record = (Integer) request.getAttribute("Total_Record");
int pageNum =(Integer) request.getAttribute("pageNum");
int total_page=(Integer) request.getAttribute("Total_Page");
HttpSession session = request.getSession(false);
//String sessionId = (String) session.getAttribute("sessionId");
String sessionId =null;
if(session!=null){
sessionId = session.getId();
System.out.println("세션아이디값"+sessionId);
}else{
System.out.println("세션아이디값이 없습니다.");
}

%>
<html>
<head>
<link rel="stylesheet" href="./resources/css/bootstrap.min.css" />
<title>Board</title>
<script type="text/javascript">
function checkForm() {
let session_value="<%=sessionId%>";
console.log(session_value);
if (session_value=="null") {
alert("로그인 해주세요.");
return false;
}


location.href = "BoardWriteForm?id=<%=sessionId%>"
}
</script>
</head>
<body>
<div class="container py-4">
<jsp:include page="../menu.jsp" />

<div class="p-5 mb-4 bg-body-tertiary rounded-3">
<div class="container-fluid py-5">
<h1 class="display-5 fw-bold">게시판</h1>
<p class="col-md-8 fs-4">Board</p>
</div>
</div>

<div class="row align-items-md-stretch text-center">
<form action="<c:url value="./BoardListAction.do"/>" method="post">


<div class="text-end">
<span class="badge text-bg-success">전체 <%=total_record%></span>
</div>

<div style="padding-top: 20px">
<table class="table table-hover text-center">
<tr>
<th>번호</th>
<th>제목</th>
<th>작성일</th>
<th>조회</th>
<th>글쓴이</th>
</tr>
<%

for (int j = 0; j < boardList.size() ; j++){

Board notice = (Board) boardList.get(j);
%>
<tr>
<td><%=notice.getNum()%></td>
<td><a href="./BoardViewAction?num=<%=notice.getNum()%>&pageNum=<%=pageNum%>"><%=notice.getSubject()%></a></td>
<td><%=notice.getRegist_day()%></td>
<td><%=notice.getHit()%></td>
<td><%=notice.getName()%></td>
</tr>
<%
}
%>
</table>
</div>
<div align="center">
<% for(int i=1; i<=total_page;i++){ %>
<a href="BoardListAction?pageNum=<%=i%>">
<%if(pageNum==i){ %>
<font color='FF0000'><b> [<%=i %>]</b></font>
<%
}
else
{
%>
<font color='000000'> [<%=i %>]</font>
<%} %>
</a>
<%} %>
</div>

<div class="py-3" align="right">
<a href="#" onclick="checkForm(); return false;" class="btn btn-primary">&laquo;글쓰기</a>
</div>
<div align="left">
<select name="items" class="txt">
<option value="subject">제목에서</option>
<option value="content">본문에서</option>
<option value="name">글쓴이에서</option>
</select> <input name="text" type="text" /> <input type="submit" id="btnAdd" class="btn btn-primary " value="검색 " />
</div>

</form>
</div>
<jsp:include page="../footer.jsp" />
</div>


</body>
</html>

*<a href="#" onclick="checkForm(); return false;">, <form type="submit">

: return false;  -> 태그기능 취소시킴, onclick= "함수호출"

-return false는 JavaScript에서 주로 이벤트 핸들러 내에서 사용되며, 특정 이벤트의 기본 동작을 방지하고 이벤트 전파를 중단하는 데 사용

*request 거치면 무조건 String: 변환해야 쓸 수 있음 ex) (Integer) request.getAttribute("Total_Record");

 

BookMarket_CRUD/src/main/webapp/footer.jsp

<%@ page session="false" %>
<footer class="pt-3 mt-4 text-body-secondary border-top">
&copy; BookMarket
</footer>

<%@ page session="false" %> 추가

 

실행 결과

총게시글의 갯수 : 4
총게시글의 갯수 : 4
세션아이디값이 없습니다.
admin
1234
Board_Read_Controller doGet()
총게시글의 갯수 : 4
총게시글의 갯수 : 4
세션아이디값95F43E8B83B97F0ECD403F602557E980

null/로그인

 

 

BookMarket_CRUD/src/main/java/Controller/Board_Create_Controller.java

package Controller;


import java.io.IOException;
import java.time.LocalDate;


import dao.BoardRepository;
import dto.Board;
import dto.Member;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;


@WebServlet("/BoardWriteForm")
public class Board_Create_Controller extends HttpServlet{


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
RequestDispatcher ds = req.getRequestDispatcher("board/writeForm.jsp");
ds.forward(req, resp);


}


@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession(false);
Member mb = null;
if(session != null) {
mb = (Member) session.getAttribute("member");
}
String id = mb.getId();
String name = req.getParameter("name");
String subject = req.getParameter("subject");
String content = req.getParameter("content");
String regist_day = LocalDate.now().toString();
int hit = 0;
String ip = req.getRemoteAddr();
System.out.println(id);
System.out.println(name);
System.out.println(subject);
System.out.println(content);
System.out.println(regist_day);
System.out.println(ip);

Board bd = new Board();
bd.setId(id);
bd.setName(name);
bd.setSubject(subject);
bd.setContent(content);
bd.setRegist_day(regist_day);
bd.setHit(hit);
bd.setIp(ip);
//모델이동
BoardRepository br = BoardRepository.getInstance();
br.addBoard(bd);

resp.sendRedirect("BoardListAction?pageNum=1");
}


}

1)@WebServlet("/BoardWriteForm")

   list.jsp(location.href = "BoardWriteForm?id=<%=sessionId%>") 연결 매핑

2)doget: board/writeForm.jsp

3)<form name="newWrite" action="BoardWriteForm" : writeForm.jsp

4)dopost 객체 Board bd = new Board(); -> BoardRepository.java: Create -> public void addBoard(Board bd) {}

5)resp.sendRedirect("BoardListAction?pageNum=1");

Board_Read_Controller.java의 Integer.parseInt(req.getParameter("pageNum")); 가져와야 함

*session: 멤버 객체 -> 아공간, DB 갈 필요x

 

BookMarket_CRUD/src/main/webapp/board/writeForm.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page session="false" %>
<%@ page import="dto.Member" %>
<%
HttpSession session = request.getSession(false);
Member mb = null;
if(session != null){
mb = (Member) session.getAttribute("member");
}

%>
<html>
<head>
<link rel="stylesheet" href="./resources/css/bootstrap.min.css" />
<title>Board</title>
</head>
<script type="text/javascript">
function checkForm() {
if (!document.newWrite.name.value) {
alert("성명을 입력하세요.");
return false;
}
if (!document.newWrite.subject.value) {
alert("제목을 입력하세요.");
return false;
}
if (!document.newWrite.content.value) {
alert("내용을 입력하세요.");
return false;
}
}
</script>
<body>
<div class="container py-4">
<jsp:include page="../menu.jsp" />

<div class="p-5 mb-4 bg-body-tertiary rounded-3">
<div class="container-fluid py-5">
<h1 class="display-5 fw-bold">게시판</h1>
<p class="col-md-8 fs-4">Board</p>
</div>
</div>


<div class="row align-items-md-stretch text-center">


<form name="newWrite" action="BoardWriteForm" method="post" onsubmit="return checkForm()">
<input name="id" type="hidden" class="form-control"
value="${sessionId}">
<div class="mb-3 row">
<label class="col-sm-2 control-label" >성명</label>
<div class="col-sm-3">
<input name="name" type="text" class="form-control" value="<%=mb.getName() %>" readOnly>
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2 control-label" >제목</label>
<div class="col-sm-5">


<input name="subject" type="text" class="form-control" placeholder="subject">
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2 control-label" >내용</label>
<div class="col-sm-8">
<textarea name="content" cols="50" rows="5" class="form-control"placeholder="content"></textarea>
</div>
</div>
<div class="mb-3 row">
<div class="col-sm-offset-2 col-sm-10 ">
<input type="submit" class="btn btn-primary " value="등록 ">
<input type="reset" class="btn btn-primary " value="취소 ">
</div>
</div>
</form>

</div>
<jsp:include page="../footer.jsp" />
</div>
</body>
</html>





*<%@ page session="false" %>

 

 

실행 결과

연결 확인

admin
kim
ddddd
ddddd
2025-02-25
0:0:0:0:0:0:0:1

 

 

 

게시판 상세정보 보기

BookMarket_CRUD/src/main/java/Controller/Board_View_Controller.java

package Controller;


import java.io.IOException;


import dao.BoardRepository;
import dto.Board;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;


@WebServlet("/BoardViewAction")
public class Board_View_Controller extends HttpServlet{


@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int num = Integer.parseInt(req.getParameter("num")) ;
int pageNum = Integer.parseInt(req.getParameter("pageNum"));

BoardRepository br = BoardRepository.getInstance();
Board bd=br.getOneList(num);

req.setAttribute("board", bd);
req.setAttribute("num", num);
req.setAttribute("page", pageNum);
RequestDispatcher ds = req.getRequestDispatcher("board/view.jsp");
ds.forward(req, resp);
}


@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


}


}

 

BookMarket_CRUD/src/main/webapp/board/view.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


<%@ page import="dto.Board"%>


<% //BoardViewAction?num=1&pageNum=1
Board notice = (Board) request.getAttribute("board");
int num = ((Integer) request.getAttribute("num")).intValue();
int nowpage = ((Integer) request.getAttribute("page")).intValue();
%>
<html>
<head>
<link rel="stylesheet" href="./resources/css/bootstrap.min.css" />
<title>Board</title>
</head>
<body>


<div class="container py-4">
<jsp:include page="../menu.jsp" />

<div class="p-5 mb-4 bg-body-tertiary rounded-3">
<div class="container-fluid py-5">
<h1 class="display-5 fw-bold">게시판</h1>
<p class="col-md-8 fs-4">Board</p>
</div>
</div>






<div class="row align-items-md-stretch text-center">
<form name="newUpdate" action="BoardUpdateAction.do?num=<%=notice.getNum()%>&pageNum=<%=nowpage%>" method="post">
<div class="mb-3 row">
<label class="col-sm-2 control-label" >성명</label>
<div class="col-sm-3">
<input name="name" class="form-control" value=" <%=notice.getName()%>">
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2 control-label" >제목</label>
<div class="col-sm-5">
<input name="subject" class="form-control" value=" <%=notice.getSubject()%>" >
</div>
</div>
<div class="mb-3 row">
<label class="col-sm-2 control-label" >내용</label>
<div class="col-sm-8" style="word-break: break-all;">
<textarea name="content" class="form-control" cols="50" rows="5"> <%=notice.getContent()%></textarea>
</div>
</div>
<div class="mb-3 row">
<div class="col-sm-offset-2 col-sm-10 ">
<c:set var="userId" value="<%=notice.getId()%>" />
<c:if test="${sessionId==userId}">
<p>
<a href="./BoardDeleteAction.do?num=<%=notice.getNum()%>&pageNum=<%=nowpage%>" class="btn btn-danger"> 삭제</a>
<input type="submit" class="btn btn-success" value="수정 ">
</c:if>
<a href="BoardListAction?pageNum=<%=nowpage%>" class="btn btn-primary"> 목록</a>
</div>
</div>
</form>

</div>
<jsp:include page="../footer.jsp" />
</div>
</body>
</html>

 

실행 결과

 

*dto -> Repositoty  -> Controller 연결 -> view: 뷰 뿌리거나 입력받음(view 가공에 따라 작성시간 달라짐)

            DB 연결