반응형
1)book
1-1)bookForm, bookList
1-2) siteMeshFilter변경
1-3)bookClass 생성 및 테이블생성
1-4) mapper , controller , Dao 생성
1-5) 결과(bookList)
1)book
1-1) bookForm , bookList
해당 폼이 작동되도록
Controller , 객체 , mapper 등 다 만들어보자
/view/book/bookForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%--
--%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>방명록 글쓰기 화면</title>
</head>
<body>
<form action="bookwrite" method="post"
onsubmit="return inputcheck(this)">
<h2>방명록쓰기</h2>
<table class="table">
<tr><td>방문자</td><td><input type="text" name="writer" class="form-control"></td></tr>
<tr><td>제목</td><td><input type="text" name="title" class="form-control"></td></tr>
<tr><td>내용</td>
<td><textarea rows="10" cols="60" name="content" class="form-control"></textarea></td></tr>
<tr><td colspan="2" align="center">
<input type="submit" value="글쓰기" class="btn btn-info"></td></tr>
</table></form>
<script type="text/javascript">
function inputcheck(f) {
if(f.writer.value == '') {
alert("방문자를 입력하세요");
f.writer.focus();
return false;
}
if(f.title.value == '') {
alert("제목 입력하세요");
f.title.focus();
return false;
}
if(f.content.value == '') {
alert("내용 입력하세요");
f.content.focus();
return false;
}
return true;
}
</script>
</body></html>
해당폼은
http://localhost:8080/model2Study/book/
의 url로 작동하게 만들것임
/view/book/bookList.jsp
<%@ 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"%>
<%-- /webapp/view/book/bookList.jsp : 방명록 목록 조회하기
--%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>방명록 목록</title>
</head>
<body>
<h2>회원목록</h2>
<table class="table">
<tr>
<th> </th><th>작성자</th><th>제목</th>
<th>내용</th><th>등록일</th>
</tr>
<c:forEach var="b" items="${list}">
<tr>
<c:set var="num" value="${num}"></c:set>
<td style="color:purple">${num}</td>
<c:set var="num" value="${num-1}"></c:set> <!--숫자를 하나씩 내림(내림차순) -->
<td>${b.writer}</td>
<td>${b.title}</td>
<td>${b.content}</td>
<fmt:formatDate value="${b.dt}" type="both" var="dt"/> <!-- 날짜포맷팅을위함 -->
<td>${dt}</td>
</tr>
</c:forEach>
<tr><td colspan="5" align="center">
<c:if test="${pageNum <= 1}">[이전]</c:if>
<c:if test="${pageNum > 1}">
<a href="bookList?pageNum=${pageNum-1}">[이전]</a>
</c:if>
<c:forEach var="a" begin="${startpage}" end="${endpage}">
<c:if test="${a == pageNum}"><a href="#">[${a}]</a></c:if><!-- 현재페이지를 누르면 아무일도일어나지않음 -->
<c:if test="${a != pageNum}"><!-- 다른페이지클릭시 해당 pageNum으로넘어감 -->
<a href="bookList?pageNum=${a}">[${a}]</a>
</c:if>
</c:forEach>
<c:if test="${pageNum >= maxpage}">[다음]</c:if>
<c:if test="${pageNum < maxpage}">
<a href="bookList?pageNum=${pageNum+1}">[다음]</a>
</c:if>
</td></tr>
<tr><td colspan="5"><p align="right"><a href="bookForm" class="btn btn-outline-primary ">[글쓰기]</a></p></tr>
</table>
</body>
</html>
1-2) sitemeshFilter 변경
사진과같은 경로의 sitemeshFilter에
다음과같이 book경로의 모든파일들을 layout적용을 시켜준다
builder.addDecoratorPath("/book/*", "/layout/layout.jsp");
1-3) book 클래스생성 및 테이블
package model.book;
import java.util.Date;
public class Book {
private String writer;
private String title;
private String content;
private Date dt;
//getter,setter프로퍼티 필수(길어서여기선생략했음)
}
DB에book테이블을 만들어준다!!(난 이미만들어놓은게있었음)
CREATE TABLE IF NOT EXISTS `book` (
`writer` varchar(100) NOT NULL,
`title` varchar(100) DEFAULT NULL,
`content` varchar(300) DEFAULT NULL,
`dt` datetime
PRIMARY KEY (`writer`)
)
1-4) mapper , controller , Dao 생성
Controller
package controller;
import java.util.Date;
import java.util.List;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import gdu.mskim.MskimRequestMapping;
import gdu.mskim.RequestMapping;
import model.book.Book;
import model.book.BookDao;
//http://localhost:8080/model2Study/book/* 경로로접근하게됨
@WebServlet(urlPatterns = {"/book/*"},
initParams = {@WebInitParam(name="view",value="/view/")}
)
public class BookController extends MskimRequestMapping {
BookDao dao = new BookDao();
@RequestMapping("bookwrite")
public String write(HttpServletRequest request, HttpServletResponse response) {
String writer = request.getParameter("writer");
String title = request.getParameter("title");
String content = request.getParameter("content");
Date dt = new Date();//작성한 날짜시간
Book book = new Book();
book.setWriter(writer);
book.setTitle(title);
book.setContent(content);
book.setDt(dt);
if(dao.insert(book)) {
request.setAttribute("msg", "성공");
request.setAttribute("url", "bookList");
return "alert";
}
else {
request.setAttribute("msg", "실패");
request.setAttribute("url", "writeForm");
return "alert";
}
}
@RequestMapping("bookList")
public String bookList(HttpServletRequest request, HttpServletResponse response) {
int pageNum = 1;
try {
pageNum = Integer.parseInt(request.getParameter("pageNum"));
} catch (NumberFormatException e) {}
int limit = 10;
int boardcount = dao.bookCount();//현재등록된 게시물건수
//pageNum에 해당하는 게시물목록을 최대10개 조회
List<Book> list = dao.list(pageNum,limit);
int maxpage = (int)((double)boardcount/limit + 0.95);
//11개 존재 시 -> 11/10 + 0.95 : 2.1 (2페이지필요함)
int startpage = ((int)(pageNum/10.0 + 0.9) - 1) * 10 +1;
//현재페이지가 1이라면 1페이지부터시작
int endpage = startpage+9;
if(endpage > maxpage) {
endpage = maxpage;
}
int num = boardcount - (pageNum-1)*limit;
//13 - 0 = 13 (1페이지)
//13 - 10 = 3 (2페이지)
request.setAttribute("boardcount", boardcount);//게시판종류별 등록된게시물
request.setAttribute("pageNum", pageNum);//현재페이지
request.setAttribute("list", list);//현재페이지에출력한 게시물목록
request.setAttribute("startpage", startpage);//페이지시작번호
request.setAttribute("num", num); //글번호
request.setAttribute("endpage", endpage);//페이지마지막번호
request.setAttribute("maxpage", maxpage);//페이지의 갯수
return "book/bookList";
}
}
DAO
package model.book;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import model.MyBatisConnection;
import model.mapper.BookMapper;
public class BookDao {
private Class<BookMapper> cls = BookMapper.class;
private Map<String, Object> map = new HashMap<>();
public boolean insert(Book book) {
SqlSession session = MyBatisConnection.getConnection();
try {
return session.getMapper(cls).insert(book)>0;
}
catch(Exception e) {
e.printStackTrace();
}
finally {
MyBatisConnection.close(session);
}
return false;
}
public List<Book> list(int pageNum, int limit) {
SqlSession session = MyBatisConnection.getConnection();
try {
map.clear();
map.put("pageNum", (pageNum-1)*limit);
map.put("limit", limit);
return session.getMapper(cls).list(map);
}
catch(Exception e) {
e.printStackTrace();
}
finally {
MyBatisConnection.close(session);
}
return null;
}
public int bookCount() {
SqlSession session = MyBatisConnection.getConnection();
try {
return session.getMapper(cls).bookCount();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
MyBatisConnection.close(session);
}
return 0;
}
}
Mapper
package model.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import model.book.Book;
public interface BookMapper {
@Insert("insert into book(writer,title,content,dt)"
+ " values(#{writer},#{title},#{content},#{dt})")
int insert(Book book);
@Select("select * from book order by dt desc limit #{pageNum},#{limit} ")
//page번 행부터 limit개만 select (0행부터시작함)
//날짜의 내림차순정렬(최신날짜가 상단)
List<Book> list(Map<String, Object> map);
@Select("select count(*) from book")
int bookCount();
}
1-5 ) 결과(bookList)
'JSP' 카테고리의 다른 글
부트캠프56일차(jqeury이용한DB연결 , XML분석 , model2의 시,구,동 설정) (0) | 2025.04.22 |
---|---|
부트캠프56일차(ajax설명,fetch , jquery , json 설명) (0) | 2025.04.22 |
부트캠프54일 (답변게시판 , 수정 , 삭제 , 권한) (0) | 2025.04.18 |
부트캠프53일차(게시판생성,writeForm , list , info) (1) | 2025.04.17 |
부트캠프52일차(framwork설명,동적쿼리,인터페이스이용한Mapper , model2Study 리팩토링) (0) | 2025.04.16 |