728x90

게시판 (페이징처리, 검색, 파일up/down, 이미지게시판)

  1. CRUD (create, read, update, delete)

  2. 댓글

  3. 페이징처리 (prev 2,3 next)

    1. 페이지당 글 갯수 : 2개, 

    2. 총 페이지 수,

    3. start_page, end_page ,

    4. start_row, end_row

    5. current_page

  4. 검색

  5. 파일 up/down

  6. 이미지게시판

 

**페이징처리

**밑에서부터 위로 처리해주기(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을 만들어서 데이터를 함께 전달

    1. 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당일 아침까지 준비해오기)

  1. A4지 한장 준비 -로직,SQL,DAO

  2. Image upload는 기본으로 제공해줌

  3. 기본적으로 6번까지는 구현해야 함 9시-5시

  4. CRUD

  5. model2로 구현하기

  6. hitcount구현하기

 

 

 

 

 

728x90

+ Recent posts