📌 list.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- /springmvc2/src/main/webapp/WEB-INF/view/board/list.jsp --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html><head><meta charset="UTF-8">
<title>게시판 목록 보기</title>
<script>
if ('${param.msg}') {
alert('${param.msg}')
}
</script>
</head>
<body>
<table class="w3-table-all">
<tr><td colspan="4">${boardName} 게시판</td><td>글개수:${listcount}</td></tr>
<c:if test="${listcount > 0}">
<tr><th>번호</th><th>제목</th><th>글쓴이</th><th>날짜</th><th>조회수</th></tr>
<%-- 글목록 출력 --%>
<c:forEach var="board" items="${boardlist}">
<tr><td>${boardno}</td>
<c:set var="boardno" value="${boardno - 1}" />
<td style="text-align: left;">
<c:if test="${! empty board.fileurl}">
<a href="file/${board.fileurl}">@</a></c:if>
<c:if test="${empty board.fileurl}"> </c:if>
<c:forEach begin="1" end="${board.grplevel}"> </c:forEach>
<c:if test="${board.grplevel > 0}">└</c:if> <%-- ㅂ한자 --%>
<a href="detail?num=${board.num}">${board.subject}</a></td>
<td>${board.writer}</td>
<td><fmt:formatDate value="${board.regdate}" pattern="yyyy-MM-dd HH:mm:ss" /></td>
<td>${board.readcnt}</td></tr>
</c:forEach>
<%-- 페이징 부분 --%>
<tr><td colspan="5">
<div class="w3-center w3-padding-32">
<div class="w3-bar">
<c:if test="${pageNum > 1}">
<a href="list?pageNum=${pageNum - 1}&boardid=${boardid}">[이전]</a></c:if>
<c:if test="${pageNum <= 1}">[이전]</c:if>
<c:forEach var="a" begin="${startpage}" end="${endpage}">
<c:if test="${a == pageNum}"><a class="w3-button w3-black" href="#">${a}</a></c:if>
<c:if test="${a != pageNum}">
<a class="w3-button w3-hover-black"
href="list?pageNum=${a}&boardid=${boardid}">${a}</a></c:if>
</c:forEach>
<c:if test="${pageNum < maxpage}">
<a href="list?pageNum=${pageNum + 1}&boardid=${boardid}">[다음]</a></c:if>
<c:if test="${pageNum >= maxpage}">[다음]</c:if></td></tr>
</div>
</div>
</c:if>
<c:if test="${listcount == 0}">
<tr><td colspan="5">등록된 게시물이 없습니다.</td></tr>
</c:if>
<c:if test="${!empty param.boardid && param.boardid != '1'}">
<tr><td colspan="5" align="right"><a href="write">[글쓰기]</a></td></tr>
</c:if>
<%-- 공지사항인 경우 관리자만 글쓰기가 가능하도록 설정 --%>
<c:if test="${empty param.boardid || param.boardid == '1'}">
<c:if test="${loginUser.userid == 'admin'}">
<tr><td colspan="5" align="right"><a href="write">[글쓰기]</a></td></tr>
</c:if>
</c:if>
</table></body></html>
📌 board.java 생성
package logic;
import java.util.Date;
import org.springframework.web.multipart.MultipartFile;
public class Board {
private int num;
private String boardid;
private String writer;
private String pass;
private String subject;
private String content;
private MultipartFile file1;
private String fileurl;
private String ip;
private Date regdate;
private int readcnt;
private int grp;
private int grplevel;
private int grpstep;
//getter,setter, toString
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getBoardid() {
return boardid;
}
public void setBoardid(String boardid) {
this.boardid = boardid;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public MultipartFile getFile1() {
return file1;
}
public void setFile1(MultipartFile file1) {
this.file1 = file1;
}
public String getFileurl() {
return fileurl;
}
public void setFileUrl(String fileurl) {
this.fileurl = fileurl;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
public int getReadcnt() {
return readcnt;
}
public void setReadcnt(int readcnt) {
this.readcnt = readcnt;
}
public int getGrp() {
return grp;
}
public void setGrp(int grp) {
this.grp = grp;
}
public int getGrplevel() {
return grplevel;
}
public void setGrplevel(int grplevel) {
this.grplevel = grplevel;
}
public int getGrpstep() {
return grpstep;
}
public void setGrpstep(int grpstep) {
this.grpstep = grpstep;
}
@Override
public String toString() {
return "Board [num=" + num + ", boardid=" + boardid + ", writer=" + writer + ", pass=" + pass + ", subject="
+ subject + ", content=" + content + ", file1=" + file1 + ", fileurl=" + fileurl + ", ip=" + ip
+ ", regdate=" + regdate + ", readcnt=" + readcnt + ", grp=" + grp + ", grplevel=" + grplevel
+ ", grpstep=" + grpstep + "]";
}
}
📌 BoardController.java 생성
package controller;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import logic.Board;
import logic.ShopService;
@Controller
@RequestMapping("board")
public class BoardController {
@Autowired
private ShopService service;
@RequestMapping("list")
public ModelAndView list(Integer pageNum, String boardid, HttpSession session) {
ModelAndView mav = new ModelAndView();
if(pageNum == null || pageNum.toString().equals("")) {
pageNum = 1;
}
if(boardid == null || boardid.equals("")) {
boardid = "1";
}
session.setAttribute("boardid",boardid);
String boardName = null;
switch(boardid) {
case "1" : boardName = "공지사항"; break;
case "2" : boardName = "자유게시판"; break;
case "3" : boardName = "QNA"; break;
}
int limit = 10;
int listcount = service.boardcount(boardid);
List<Board> boardlist = service.boardlist(pageNum,limit,boardid);
int maxpage = (int)((double)listcount/limit + 0.95);
int startpage = (int)((pageNum/10.0 + 0.9) -1) * 10 + 1;
int endpage = startpage + 9;
if(endpage > maxpage) endpage = maxpage;
int boardno = listcount - (pageNum - 1) * limit;
mav.addObject("boardid",boardid);
mav.addObject("boardName",boardName);
mav.addObject("pageNum",pageNum);
mav.addObject("maxpage",maxpage);
mav.addObject("startpage",startpage);
mav.addObject("endpage",endpage);
mav.addObject("listcount",listcount);
mav.addObject("boardlist",boardlist);
mav.addObject("boardno",boardno);
return mav;
}
}
📌 ShopService.java 내용 추가
package logic;
import java.io.File;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import dao.ItemDao;
import dao.SaleDao;
import dao.SaleItemDao;
import dao.UserDao;
/*
* @Component : 해당 클래스를 객체화
* - Service 기능 : Controller 와 Model사이의 중간 역할의 클래스
*/
@Service //@Component + Service 기능
public class ShopService {
@Autowired //현재 내 컨테이너(객체)들 중에 itemDao 객체를 주입.
private ItemDao itemDao;
@Autowired
private UserDao userDao;
@Autowired
private SaleDao saleDao;
@Autowired
private SaleItemDao saleItemDao;
public List<Item> itemList() {
return itemDao.list();
}
public Item getItem(Integer id) {
return itemDao.getItem(id);
}
//db에 내용 저장. 파일 업로드.
//item : 저장 정보. 입력된 파라미터 값 + 업로드 된 파일의 내용
public void itemCreate(@Valid Item item, HttpServletRequest request) {
//item.getPicture() : 업로드 된 파일의 내용
if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
uploadFileCreate(item.getPicture(), uploadPath); //업로드 구현 완료
item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름
}
//maxid : item테이블 중 최대 id 값
int maxid = itemDao.maxId();
item.setId(maxid+1);
itemDao.insert(item);
}
private void uploadFileCreate(MultipartFile file, String uploadPath) {
//uploadPath : 파일이 업로드 되는 폴더
String orgFile = file.getOriginalFilename(); //업로드 된 파일의 이름
File fpath = new File(uploadPath);
if(!fpath.exists()) fpath.mkdirs(); //업로드 폴더를 생성(없으면)
try {
//파일의 내용 => uploadPath + orgFile 로 파일 저장
file.transferTo(new File(uploadPath + orgFile)); //파일업로드
} catch(Exception e) {
e.printStackTrace();
}
}
public void itemUpdate(Item item, HttpServletRequest request) {
System.out.println(item);
//item.getPicture() : 업로드 된 파일의 내용
if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
uploadFileCreate(item.getPicture(), uploadPath); //파일 업로드 : 업로드된 내용을 서버에 파일로 저장
item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름을 db에 등록하기 위해 설정
}
itemDao.update(item);
}
public void itemDelete(Integer id) {
itemDao.delete(id);
}
public void userInsert(@Valid User user) {
userDao.insert(user);
}
public User getUser(String userid) {
return userDao.selectOne(userid);
}
public void userUpdate(@Valid User user) {
userDao.update(user);
}
public void userDelete(String userid) {
userDao.delete(userid);
}
public void userChgPass(String userid, String pass) {
userDao.chgpass(userid,pass);
}
public String getSearch(User user, String url) {
return userDao.search(user, url);
}
public List<User> userlist() {
return userDao.list();
}
/*
* 로그인 정보, 장바구니 정보에서 sale, saleitem 테이블에 데이터 저장
* 결과를 Sale 객체로 저장
* 1. sale 테이블의 saleid의 최대 값 조회
* 2. sale 테이블에 최대값+1, userid,sysdate 등록
* 3. Cart 데이터에서 saleitem 데이터 추출. insert
* 4. saleitem 정보를 sale객체에 모든 데이터 저장
* 5. sale 데이터 리턴
*/
public Sale checkend(User loginUser, Cart cart) {
//1. sale 테이블의 saleid의 최대 값 조회
int maxid = saleDao.getMaxSaleId();
//2. sale 테이블 등록
Sale sale = new Sale();
sale.setSaleid(maxid + 1);
sale.setUserid(loginUser.getUserid());
sale.setUser(loginUser);
saleDao.insert(sale); //sale 테이블에 데이터 저장
//3. Cart 데이터에서 saleitem 데이터 추출. insert
int seq = 0;
for(ItemSet is : cart.getItemSetList()) {
SaleItem saleItem = new SaleItem(sale.getSaleid(), ++seq, is);
sale.getItemList().add(saleItem);
saleItemDao.insert(saleItem); //saleitem 테이블에 저장
}
return sale;
}
public List<Sale> salelist(String id) {
//Sale 테이블의 내용 저장
List<Sale> list = saleDao.list(id); //sale 테이블에서 id에 해당하는 목록 조회
for(Sale sa : list) {
//주문 번호에 해당하는 주문상품 조회
List<SaleItem> saleitemlist = saleItemDao.list(sa.getSaleid());
//SaleItem 객체에 Item 객체 저장
for(SaleItem si : saleitemlist) {
Item item = itemDao.getItem(si.getItemid()); //주문상품의 상품데이터(item) 조회
si.setItem(item); //Item 객체를 SaleItem 객체에 추가
}
sa.setItemList(saleitemlist); //Sale 객체에 SaleItem 목록 추가
}
return list;
}
**public int boardcount(String boardid) {
return boardDao.count(boardid);
}
public List<Board> boardlist(Integer pageNum, int limit, String boardid) {
return boardDao.list(pageNum,limit,boardid);
}**
}
📌 BoardDao.java 생성
package dao;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import dao.mapper.BoardMapper;
import logic.Board;
@Repository
public class BoardDao {
@Autowired
private SqlSessionTemplate template;
private Map<String, Object> param = new HashMap<>();
private Class<BoardMapper> cls = BoardMapper.class;
public int count(String boardid) {
return template.getMapper(cls).count(boardid);
}
public List<Board> list(Integer pageNum, int limit, String boardid) {
param.clear();
int startrow = (pageNum - 1) * limit + 1;
int endrow = startrow + limit -1;
param.put("startrow", startrow);
param.put("endrow", endrow);
param.put("boardid", boardid);
return template.getMapper(cls).list(param);
}
}
📌 BoardMapper.java 생성
package dao.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Select;
import logic.Board;
public interface BoardMapper {
@Select("select count(*) from board where boardid=#{value}")
int count(String boardid);
String sql = "select * from "
+ " (select rownum rnum, num, writer, subject, content, file1 fileurl, regdate, grp, grplevel, grpstep, pass, readcnt from "
+ "(select * from board where boardid=#{boardid}"
+ " order by grp desc, grpstep asc))"
+ " where rnum between #{startrow} and #{endrow}";
@Select(sql)
List<Board> list(Map<String, Object> param);
}