JSP

54일차의 내용추가(book 관련)

동곤일상 2025. 4. 19. 23:58
반응형

 

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)