spring - 회원제 게시판 구현하기 - 게시판(2) [목록 보기] (2022-11-07)
1. 서론
게시물에 필자가 게시글을 남겨보았다.
이제 이 게시물의 데이터를 DB에서 가져와서 웹에서 볼 수 있게끔 작업하도록 하자.
2. 본론
먼저 top.jsp에서 게시판 a태그의 href를 교체해주도록 하자. 이건 전에 했던 회원목록 조회와 비슷한 맥락이다.
개념은 요기서 잡자!!!
2022.11.06 - [3층 - 개발의 장/Spring] - spring - 회원제 게시판 구현하기 - 회원 목록(1) [목록] (2022-11-06)
spring - 회원제 게시판 구현하기 - 회원 목록(1) [목록] (2022-11-06)
1. 서론 회원가입까지 끝났다. 이제 관리자 혹은 회원들이 자신의 개인정보를 확인해보거나 회원 탈퇴 및 수정 할 수 있는 페이지를 만들어보고자 한다. 이 페이지는 나중에 프로젝트 진행 시 관
sukw9512.tistory.com
top.jsp(전체)
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<style type="text/css">
<!--
a:link{color:black;font-family:sans-serif;text-decoration:none;}
a:visited{color:black;font-family:sans-serif;text-decoration:none;}
a:hover{color:#cc3300; font-weight:bold; }
a:active{color:#ff00cc; text-decoration:underline; }
-->
</style>
<!-- root를 변수로 지정하여 '/'값을 넣어준다. -->
<c:url var="root" value="/" />
<table width=900>
<tr><td align="center" colspan=5><h1>CARE Lab</h1></td></tr>
<tr align="right">
<td width=600></td>
<!-- ${root}를 통해 http://localhost:8085/pra/경로까지 불러오고?
index?formpath=HomeController.java의 value값을 지정하여 각 value가 갖고있는
return값을 가져올 수 있다. -->
<td><a href="${root }index?formpath=home">홈</a></td>
<c:choose>
<c:when test="${empty sessionScope.id }">
<td><a href="${root }index?formpath=login">로그인</a></td>
</c:when>
<c:otherwise>
<td><a href="${root }logout">로그아웃</a></td>
<td><a href="${root }memberListProc">회원목록</a></td>
</c:otherwise>
</c:choose>
<td><a href="${root }index?formpath=member">회원가입</a></td>
<td><a href="${root }boardProc">게시판</a></td>
</tr>
<tr><td align="center" colspan=5><hr/></td></tr>
</table>
top.jsp(변경된 부분)
<td><a href="${root }boardProc">게시판</a></td>
간단하게 흐름만 말하자면??
게시물 작성, 회원가입, 로그인, 각종 수정요청
HomeController.java에서 페이지를 띄워준다 → 작성,로그인한다 → form태그가 controller로 정보를 보낸다
→ service가 검증 및 데이터를 저장하고 결과를 controller에게 보낸다 → controller가 반환값을 띄운다.
회원목록, 게시판
controller에게 정보를 보낸다 → sercvice가 해당하는 정보를 가져와 controller에게 보낸다 → controller가 반환값을 homeController에게 보낸다 → 띄운다
top.jsp에서 boardProc이라고 value값을 보내면 그 값을 BoardController.java가 받게 된다.
BoardController.java(전체)
package com.care.pra.board.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.care.pra.board.service.IBoardService;
@Controller
public class BoardController {
//console창에 해당 로그가 찍힌다. 따라서 프로그램의 오류 발생 시 어디서 어떤 이유로 오류가 발생했는지
//알 수 있어 이슈처리가 용이하다.
final static Logger logger = LoggerFactory.getLogger(BoardController.class);
@Autowired IBoardService service;
@RequestMapping(value = "writeProc")
public String writeProc(MultipartHttpServletRequest multi) {
service.writeProc(multi);
return "forward:boardProc";
}
@RequestMapping(value = "boardProc")
public String boardProc(Model model) {
service.boardProc(model, 0, null, null);
return "forward:/index?formpath=board";
}
}
@RequestMapping(value = "boardProc")
public String boardProc(Model model) {
service.boardProc(model, 0, null, null);
return "forward:/index?formpath=board";
}
그러면 서비스가 필요한 정보를 DAO에게 요청을 한다.
BoardServiceImpl.java(전체)
package com.care.pra.board.service;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.ui.Model;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import com.care.pra.board.BoardDTO;
import com.care.pra.board.repository.IBoardDAO;
@Service
public class BoardServiceImpl implements IBoardService{
@Autowired IBoardDAO mapper;
@Autowired HttpSession session;
@Override
public void writeProc(MultipartHttpServletRequest multi) {
String id = (String)session.getAttribute("id");
String title = multi.getParameter("title");
String content = multi.getParameter("content");
MultipartFile file = multi.getFile("fileName");
BoardDTO dto = new BoardDTO();
dto.setId(id);
dto.setTitle(title);
dto.setContent(content);
dto.setHit(0);
SimpleDateFormat writeFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
String writeDate = writeFormat.format(date);
dto.setWriteDate(writeDate);
if(file.getSize() != 0) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss-");
Calendar calen = Calendar.getInstance();
String fileName = sdf.format(calen.getTime()) + file.getOriginalFilename();
dto.setFileName(fileName);
File save = new File(IBoardService.FTLE_LOCATION + "\\" + fileName);
try {
file.transferTo(save);
} catch (Exception e) {
e.printStackTrace();
}
}else
dto.setFileName("파일 없음");
mapper.writeProc(dto);
}
@Override
public void viewProc(int no, Model model) {
// TODO Auto-generated method stub
}
@Override
public void boardProc(Model model, int currentPage, String search, String select) {
ArrayList<BoardDTO> boardList = mapper.boardProc();
model.addAttribute("boardList", boardList);
}
@Override
public void upHit(int no) {
// TODO Auto-generated method stub
}
}
@Override
public void boardProc(Model model, int currentPage, String search, String select) {
ArrayList<BoardDTO> boardList = mapper.boardProc();
model.addAttribute("boardList", boardList);
}
IBoardDAO.java(전체)
package com.care.pra.board.repository;
import java.util.ArrayList;
import org.springframework.stereotype.Repository;
import com.care.pra.board.BoardDTO;
@Repository
public interface IBoardDAO {
void writeProc(BoardDTO dto);
ArrayList<BoardDTO> boardProc();
}
boardMapper.xml(전체)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.care.pra.board.repository.IBoardDAO">
<insert id="writeProc" parameterType="com.care.pra.board.BoardDTO">
<selectKey keyProperty="no" resultType="int" order="BEFORE">
SELECT nvl(max(no), 0)+1 FROM quiz_board
</selectKey>
INSERT INTO quiz_board VALUES(#{no}, #{id}, #{title}, #{content}, #{fileName}, #{writeDate}, #{hit} )
</insert>
<select id="boardProc" resultType="com.care.pra.board.BoardDTO">
SELECT * FROM quiz_board
</select>
</mapper>
BoardServiceImpl.java(일부)
@Override
public void boardProc(Model model, int currentPage, String search, String select) {
ArrayList<BoardDTO> boardList = mapper.boardProc();
model.addAttribute("boardList", boardList);
}
model을 통해 받은 값은??
boardForm.jsp(전체)
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<center>
<table style="width: 650px; ">
<thead>
<tr>
<th style="width: 40px; height:20px;" align="center">선택</th>
<th style="width: 330px; height:20px;" align="center">제 목</th>
<th style="width: 80px; height:20px;" align="center">작성자</th>
<th style="width: 120px; height:20px;" align="center">작성일</th>
<th style="width: 80px; height:20px;" align="center">조회수</th>
</tr>
</thead>
<tr>
<td style="width: 40px; height:20px;" align="center"><hr/></td>
<td style="width: 330px; height:20px;" align="center"><hr/></td>
<td style="width: 80px; height:20px;" align="center"><hr/></td>
<td style="width: 120px; height:20px;" align="center"><hr/></td>
<td style="width: 80px; height:20px;" align="center"><hr/></td>
</tr>
<c:forEach var="list" items="${boardList }">
<tr>
<td style="width: 40px; height:40px;" align="center"><input value="${list.no }" type="checkbox"/></td>
<td style="width: 330px; height:40px;" align="center">${list.title }</td>
<td style="width: 80px; height:40px;" align="center">${list.id }</td>
<td style="width: 120px; height:40px;" align="center">${list.writeDate }</td>
<td style="width: 80px; height:40px;" align="center">${list.hit }</td>
</tr>
</c:forEach>
<tr><td colspan=5><hr/></td></tr>
<tr>
<td colspan=2><input type="checkbox"/>전체선택</td>
<td colspan=3 align="right">
<input type="button" value='삭제' style="width: 100px; "/>
<input type="button" value='글쓰기' style="width: 100px; " onclick="location.href='${root }index?formpath=write'" />
</td>
</tr>
<tr><td colspan=5><hr/></td></tr>
</table>
이전 1 2 3 4 다음
<table>
<tr>
<td>
<select>
<option>전체</option>
<option>제목</option>
<option>작성자</option>
</select>
<input type=text name='search'/>
<input type=button name='searchBtn' value='검색' style="width: 80px; "/>
</td>
</tr>
</table>
</center>
위 코드에서 forEach문을 사용할 때 쓰이게 된다. forEach가 돌면서 DAO값을 나열한다.
그래서 결과를 확인해 보면???
게시판에 게시물 목록이 전부 나오는 것을 볼 수 있고??
데이터베이스에서도 동일한 모습을 볼 수 있다.