게시판 (페이징처리, 검색, 파일up/down, 이미지게시판)
-
CRUD (create, read, update, delete)
-
댓글
-
페이징처리 (prev 2,3 next)
-
페이지당 글 갯수 : 2개,
-
총 페이지 수,
-
start_page, end_page ,
-
start_row, end_row
-
current_page
-
검색
-
파일 up/down
-
이미지게시판
**페이징처리
**밑에서부터 위로 처리해주기(Action -> Service -> DAO -> Mapper ->MyBatis(XML))
**board.xml -> BoardMapper -> boardDAO2 -> boardService (list에 페이지정보를 넣어서 전달, ListModel클래스 만듦)> list.jsp
--board.xml
<!--전체 글갯수를 알고싶어요 -->
<select id="countBoard" resultType = "int">
select count(*) from board
</select>
--BoardMapper
List<Board> listBoard(RowBounds row);
--BoardDAO2
public List<Board> listBoard(int startRow) {
SqlSession sqlSession = getSqlSessionFactory().openSession();
List<Board> list = null;
try {
list = sqlSession.getMapper(BoardMapper.class).listBoard(new RowBounds(startRow, 2));
} catch (Exception e) {
e.printStackTrace();
}finally {
if(sqlSession!=null) {
sqlSession.close();
}
}
return list;
}
--BoardService
public ListModel listBoardService(HttpServletRequest request) throws Exception{
/*
* request.setCharacterEncoding("utf-8"); Search search = new Search();
* search.setArea(request.getParameterValues("area")); //search객체 안에 담음
* search.setSearchKey("%"+request.getParameter("searchKey")+"%"); //%%안에 문자열
* 넣을때 ''사용 안해도 됨
*
* return dao.listBoard(search);
*/
//페이지처리
//페이지당 글갯수(PAGE_SIZE), 총글갯수, 총페이지수, 전체페이지
//총글갯수(DB에 물어보기)
int totalCount = dao.countBoard();
//총페이지수
int totalPageCount = totalCount/PAGE_SIZE;
if(totalCount%PAGE_SIZE> 0) {
totalPageCount++;
}
//현재페이지
String pageNum = request.getParameter("pageNum");
if(pageNum == null) {
pageNum = "1";
}
int requestPage = Integer.parseInt(pageNum);
//startPage
//startPage = 현재페이지 - (현재페이지-1) % 5
int startPage = requestPage - (requestPage-1)%5;
//endPage
int endPage = startPage + 4;
if(endPage>totalPageCount) {
endPage = totalPageCount;
}
//startRow = (현재페이지-1) * (페이지당 글갯수)
int startRow = (requestPage-1)*PAGE_SIZE;
List<Board> list = dao.listBoard(startRow);
ListModel listModel =
new ListModel(list, requestPage, totalPageCount, startPage, endPage);
return listModel;
}
--kosta.model(ListModel.java)
package kosta.model;
import java.util.List;
public class ListModel {
private List<Board> list;
private int requestPage;
private int totalPageCount;
private int startPage;
private int endPage;
public ListModel() {}
--list.jsp
<!-- 페이지처리 영역 -->
<!-- 이전영역 -->
<c:if test="${listModel.startPage>5}">
<a href="listAction.do?pageNum=${listModel.startPage-1}">[이전]</a>
</c:if>
<!-- 페이지목록 -->
<c:forEach var="pageNo" begin="${listModel.startPage }" end ="${listModel.endPage }" >
<c:if test="${listModel.requestPage == pageNo }"><b></c:if>
<a href ="listAction.do?pageNum=${pageNo }">[${pageNo }]</a>
<c:if test="${listModel.requestPage == pageNo }"></b></c:if>
</c:forEach>
<!-- 이후영역 -->
<c:if test="${listModel.endPage<listModel.totalPageCount}">
<a href="listAction.do?pageNum=${listModel.endPage + 1}">[이후]</a>
</c:if>
++검색
--BoardDAO2
public List<Board> listBoard(Search search, int startRow) {
SqlSession sqlSession = getSqlSessionFactory().openSession();
List<Board> list = null;
try {
list = sqlSession.getMapper(BoardMapper.class).listBoard(search, new RowBounds(startRow, 2));
} catch (Exception e) {
e.printStackTrace();
}finally {
if(sqlSession!=null) {
sqlSession.close();
}
}
return list;
}
public int countBoard(Search search) {
SqlSession sqlSession = getSqlSessionFactory().openSession();
int re = 0;
try {
re = sqlSession.getMapper(BoardMapper.class).countBoard(search);
} catch (Exception e) {
e.printStackTrace();
}finally {
if(sqlSession!=null) {
sqlSession.close();
}
}
return re;
}
--BoardMapper
List<Board> listBoard(Search search, RowBounds row);
int countBoard(Search search);
--BoardService
request.setCharacterEncoding("utf-8");
Search search = new Search();
//검색할 경우
if(request.getParameterValues("area")!=null) {
search.setArea(request.getParameterValues("area")); //search객체 안에 담음
search.setSearchKey("%"+request.getParameter("searchKey")+"%"); //%%안에 문자열 넣을때 ''사용 안해도 됨
}
int totalCount = dao.countBoard(search);
--Board.xml
<select id="listBoard" parameterType="Search" resultType="Board" >
select * from board
<if test="area != null">
<where>
<!--where (title LIKE %aa% OR writer LIKE %aa% 조건이3개 이므로 여러개일때-->
<foreach collection="area" item = "item" separator="OR" open ="(" close=")" >
${item} LIKE #{searchKey}
</foreach>
</where>
</if>
order by seq desc
</select>
<!--전체 글갯수를 알고싶어요 -->
<select id="countBoard" parameterType="Search" resultType = "int">
select count(*) from board
<if test="area != null">
<where>
<!-- where (title LIKE %aa% OR writer LIKE %aa% 조건이3개 이므로 여러개일때 -->
<foreach collection="area" item = "item" separator="OR" open ="(" close=")" >
<!-- item은 리터럴 형식이라 $사용 searchKey만 변수로 가져와서 # -->
${item} LIKE #{searchKey}
</foreach>
</where>
</if>
</select>
--mybatis-config.xml
<typeAlias type="kosta.model.Search" alias = "Search"/>
--list.jsp
<form action = "listAction.do" method = "post">
<input type ="checkbox" name = "area" value ="title">제목
<input type ="checkbox" name = "area" value ="writer">작성자
<input type = "text" name = "searchKey" size = "10">
<input type = "submit" value = "검색"><br>
<a href = "listAction.do">list로 다시 돌아가기</a>
</form>
Q.문제발생 - 검색했을때 2번페이지를 누르면 검색한 데이터가 넘어오지 않음
Sol) 1. script단에서 hidden form을 만들어서 데이터를 함께 전달
-
session에서 데이터 값을 전달
--BoardService
public ListModel listBoardService(HttpServletRequest request) throws Exception{
request.setCharacterEncoding("utf-8");
Search search = new Search();
HttpSession session = request.getSession();
//검색할 경우
if(request.getParameterValues("area")!=null) {
session.removeAttribute("search");
search.setArea(request.getParameterValues("area")); //search객체 안에 담음
search.setSearchKey("%"+request.getParameter("searchKey")+"%"); //%%안에 문자열 넣을때 ''사용 안해도 됨
session.setAttribute("search", search);
}
//검색 후 페이지를 출력할 경우
else if(session.getAttribute("search")!=null) {
search = (Search)session.getAttribute("search");
}
++파일업로드
--insert_form.jsp
<form action="insertAction.do" method="post"
enctype="multipart/form-data">
작성자 : <input type="text" name="writer"><br>
제목 : <input type="text" name="title"><br>
파일 : <input type = "file" name = "fname"><br>
내용 <br>
<textarea rows="6" cols="70" name="contents"></textarea>
<br>
<input type="submit" value="등록">
</form>
--BoardService
public int insertBoardService(HttpServletRequest request)throws Exception{
request.setCharacterEncoding("utf-8"); //boardService에 만들어주는 것이 더 타당
//파일업로드(경로,파일크기,인코딩방식,파일이름 중첩정책)
String uploadPath = request.getRealPath("upload");
int size = 20 * 1024 * 1024; //20MB
//실질적인 파일업로드가 이뤄지는 곳
MultipartRequest multi = new MultipartRequest(request, uploadPath, size, "utf-8", new DefaultFileRenamePolicy());
Board board = new Board();
board.setTitle(multi.getParameter("title"));
board.setWriter(multi.getParameter("writer"));
board.setContents(multi.getParameter("contents"));
board.setFname("");
//파일업로드 DB(파일이름 저장)
if(multi.getFilesystemName("fname")!=null) {
String fname = (String)multi.getFilesystemName("fname");
board.setFname(fname);
}
return dao.insertBoard(board);
}
alter table board
add fname varchar(50);
--board.xml
<insert id="insertBoard" parameterType="Board">
insert into board values(board_seq.nextval, #{writer},#{title},
#{contents}, sysdate, 0, #{fname})
</insert>
C:\JavaDev\WorkSpace\jsp_work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\MVC\upload
여기에 업로드 되면 업로드 된 것.
--download.jsp
--FileDownloadHelper.java
--detail.jsp
"/MVC/download.jsp" => 절대경로 사용
<li><a href = "/MVC/download.jsp?filename=${board.fname }">${board.fname}</a></li>

++이미지게시판
썸네일 이미지 만들기
--BoardService.java
public int insertBoardService(HttpServletRequest request)throws Exception{
C:\Users\mhee4\AppData\Local\WebMa2
//파일업로드 DB(파일이름 저장)
if(multi.getFilesystemName("fname")!=null) {
String fname = (String)multi.getFilesystemName("fname");
board.setFname(fname);
//썸네일 이미지(gif, jpg) => aa.gif, aa.jpg
String pattern = fname.substring(fname.indexOf(".")+1);//gif
String head = fname.substring(0,fname.indexOf("."));//aa
//원본 File객체
String imagePath = uploadPath + "\\"+fname;
File src = new File(imagePath);
//썸네일 File객체
String thumPath = uploadPath + "\\" + head + "_small."+pattern;
File dest = new File(thumPath);
if(pattern.equals("gif")|| pattern.equals("jpg")) {
ImageUtil.resize(src, dest, 100, ImageUtil.RATIO);
}
}
}
--kosta.model -> ImageUtil.java(이미지를 썸네일로 바꿔줌)
**웹마다운1234
C:\Users\mhee4\AppData\Local\WebMa2

C:\JavaDev\WorkSpace\jsp_work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\MVC\upload

이미지 파일경로 하나/ 썸네일파일경로 하나씩 저장됨
--list.jsp
<td>이미지</td>
<td>
<c:if test="${board.fname != null }">
<c:set var="head" value="${fn:substring(board.fname,
0, fn:length(board.fname)-4) }"></c:set>
<c:set var="pattern" value="${fn:substring(board.fname,
fn:length(head) +1, fn:length(board.fname)) }"></c:set>
<c:choose>
<c:when test="${pattern == 'jpg' || pattern == 'gif' }">
<img src="/MVC/upload/${head }_small.${pattern}">
</c:when>
<c:otherwise>
<c:out value="NO IMAGE"></c:out>
</c:otherwise>
</c:choose>
</c:if>
</td>

**TEST**(test당일 아침까지 준비해오기)
-
A4지 한장 준비 -로직,SQL,DAO
-
Image upload는 기본으로 제공해줌
-
기본적으로 6번까지는 구현해야 함 9시-5시
-
CRUD
-
model2로 구현하기
-
hitcount구현하기
'FULLSTACK > SERVLET&JSP' 카테고리의 다른 글
CRUD 과제를 위한 한장짜리 준비물 (0) | 2020.11.13 |
---|---|
SERVLET&JSP 7차시 - CRUD self로 구현해보기 (0) | 2020.11.13 |
SERVLET&JSP 6차시 - MVC모델(CRUD) (0) | 2020.11.13 |
SERVLET&JSP 5차시 - 쿠키, 세션 (0) | 2020.11.13 |
SERVLET&JSP 4차시 - memberCRUD 복습, 동적쿼리, 익스프레션언어, JSTL(EL태그) (0) | 2020.11.13 |