BoardController.java
package co.kr.Hello;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.beans.factory.annotation.Autowired;
import org.apache.ibatis.session.SqlSession;
import java.util.*; //HashMap사용
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import javax.naming.NamingException;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.bind.annotation.ModelAttribute;
import co.kr.Hello.dto.BoardDTO;
@Controller
public class BoardController {
@Autowired
private SqlSession sqlSession; //변수, setter 자동으로 된다.
//글쓰기 폼, 답글 쓰기(복잡 주의!!) - 답글과 원글 쓰기를 여기서 쓸 수 있다.
//글 내용을 보고 답글을 쓰기를 하기 때문에 밑에처럼 둘다 넣는다.
@RequestMapping("writeForm.do")
public String writeForm(Model model, String num, String ref, String re_level, String re_step, String pageNum) {
if(num==null) { //원글쓰기
num="0"; //html에서의 num은 전부다 문자열이다! (글 번호)
ref="1"; //ref가 string형이어서 쌍따옴표다. (글 그룹)
re_step = "0"; //(글 순서)
re_level="0"; //(글 깊이)
}
//답글이면 (아래는 답글일 대나 원글 일 때나 다 넣어줘야 함)
model.addAttribute("pageNum",pageNum); //페이지 번호는 꼐속 보내야함
model.addAttribute("num",new Integer(num));
model.addAttribute("ref",new Integer(ref));
model.addAttribute("re_step",new Integer(re_step));
model.addAttribute("re_level",new Integer(re_level));
return "board/writeForm"; //뷰 리턴 writeForm.jsp
} //writeForm-end
//DB 글 쓰기
@RequestMapping(value="writePro.do" , method=RequestMethod.POST)
public String writePro(@ModelAttribute("boardDTO")BoardDTO boardDTO, HttpServletRequest request) {
int maxNum = 0; //최대 글 번호 넣을 변수 (글 그룹에 쓰려고 넣어둔 거다!)
if(sqlSession.selectOne("board.numMax")!=null) //글이 있으면! = 글번호가 있다.
{
maxNum = sqlSession.selectOne("board.numMax"); //최대 글번호(board.xml 참조하기!)를 numMax에 할당(기존의 최대 글 번호를 가져온 것)
}
if(maxNum != 0) {//글이 존재하면
maxNum = maxNum+1; //ref 글을 그룹에 넣으려고
}
else {
//처음 글이면,
maxNum=1; //ref(글 그룹)에 1을 넣는다.
}
//ip얻어오기(악플 잡아내기 용!)
String ip = request.getRemoteAddr(); //실제 ip를 얻는 것임
boardDTO.setIp(ip);
//원글 답글 처리
if(boardDTO.getNum()!=0) //답글이면
{
//답글 끼워넣기 위치 확보!
sqlSession.update("board.reStep", boardDTO);
boardDTO.setRe_step(boardDTO.getRe_step()+1); //글순서+1
boardDTO.setRe_level(boardDTO.getRe_level()+1); //글깊이+1
}else {//원글이면
boardDTO.setRef(new Integer(maxNum)); //글 그룹
boardDTO.setRe_step(new Integer(0)); //원 글이니까 글 순서가 0이 된다.
boardDTO.setRe_level(new Integer(0)); //레벨도 0이된다.
}
sqlSession.insert("board.insertDao", boardDTO);
return "redirect:/list.do"; //뷰 리턴
}
//리스트
@RequestMapping("list.do")
public String listBoard(Model model, String pageNum) {
//pageNum이 안넘어오면 무조건 페이지는 1페이지로 해놔라
if(pageNum==null) {
pageNum="1";
}
int pageSize=10; //페이지당 10개씩 표시
int currentPage = Integer.parseInt(pageNum);// 현재 페이지
int startRow = (currentPage-1)*pageSize+1; //페이지의 첫번째 행 (1~10, 11~20, 21~30)
int endRow = currentPage*pageSize; //페이지의 마지막 행
int count=0; //총 글 개수 넣을 변수
int pageBlock = 10; //페이지당 블럭 블럭당 10개의 페이지
count=sqlSession.selectOne("board.countDao");
int number = count-(currentPage-1)*pageSize; //글이 37개이면, 37이 먼저(역순)
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("start", startRow+1);
map.put("cnt", pageSize);
//총 페이지 수 구하기
int pageCount = count/pageSize+(count%pageSize==0?0:1); //37개 일 경우, 몫(3) 나머지 나오니까 +1 하기 총 4페이지가 된다.
// 몫 꽁다리 레코드
int startPage = (currentPage/pageBlock)*10+1;//블럭의 시작페이지
int endPage = startPage+pageBlock-1; //블럭의 끝 페이지
//------------------------------------------------------------------------여기까지가 페이지 처리다--------------------------------------
List<BoardDTO> list = sqlSession.selectList("board.listDao", map); //myBatis를 사용해서 데이터를 가져오겠다! map은 매개변수로, 결과를 받았다!
model.addAttribute("pageNum",pageNum);
model.addAttribute("currentPage",currentPage);
model.addAttribute("startRow",startRow);
model.addAttribute("endRow",endRow);
model.addAttribute("pageBlock",pageBlock);
model.addAttribute("pageCount", pageCount);
model.addAttribute("startPage", startPage);
model.addAttribute("endPage", endPage);
model.addAttribute("count", count);
model.addAttribute("pageSize", pageSize);
model.addAttribute("number", number);//글번호
model.addAttribute("list", list); //db에서 받는 것
return "board/list"; //list.jsp 뷰 리턴
}
//글 내용 보기
@RequestMapping("content.do")
public String content(Model model, String num, String pageNum) { //글번호와 페이지 번호
int num1 = Integer.parseInt(num);
sqlSession.update("board.readcountDao",num1); //조회수 업데이트(매개변수로 업데이트 한다.)
BoardDTO bdto = sqlSession.selectOne("board.getBoard",num1);
String content = bdto.getContent();
content=content.replace("\n", "<br>"); //줄 바꿈하는 거다.
model.addAttribute("content",content);
model.addAttribute("pageNum", pageNum);
model.addAttribute("num",num1);
model.addAttribute("bdto",bdto);
return "board/content"; //content.jsp 뷰 리턴
}
//수정폼
@RequestMapping("updateForm.do")
public ModelAndView updateForm(String num, String pageNum) {
int num1 = Integer.parseInt(num);
BoardDTO bdto = sqlSession.selectOne("board.getBoard",num1);
ModelAndView mv = new ModelAndView();
mv.addObject("pageNum", pageNum);
mv.addObject("bdto",bdto);
mv.setViewName("content"); //content.jsp가 있어야 함
return mv;
}
//DB 글 수정
@RequestMapping(value="updatePro.do", method=RequestMethod.POST)
public ModelAndView updatePro(BoardDTO boardDTO, String pageNum) {
sqlSession.update("board.updateDao", boardDTO);
ModelAndView mv = new ModelAndView();
mv.addObject("pageNum",pageNum);
mv.setViewName("redirect:list.do");
return mv;
}
//글 삭제
@RequestMapping("delete.do")
public String delete(Model model, String num, String pageNum)
{
sqlSession.delete("board.deleteDao", new Integer(num));
model.addAttribute("pageNum"); //페이지 번호를 추가(삭제했으니 바뀐거를 넣어야 함)
return "redirect:/list.do";
}
//이제 뷰 작업을 할 거다.
}// class-end
BoardDTO.java
package co.kr.Hello.dto;
import java.util.Date;
public class BoardDTO {
//전역변수 = 필드 = 프로퍼티 = property
private int num; //글번호
private String writer; //글쓴이
private String subject; //글제목
private String pw;
private Date regdate;
private int readcount; //조회수
private int ref; // 답글그룹
private int re_step; //글 순서
private int re_level;//답글 깊이
private String content; //글 내용
private String ip; //악플러 잡아내기 위함!
public BoardDTO() {} //이는 default 생성자다.
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public Date getRegdate() {
return regdate;
}
public void setRegdate(Date regdate) {
this.regdate = regdate;
}
public int getReadcount() {
return readcount;
}
public void setReadcount(int readcount) {
this.readcount = readcount;
}
public int getRef() {
return ref;
}
public void setRef(int ref) {
this.ref = ref;
}
public int getRe_step() {
return re_step;
}
public void setRe_step(int re_step) {
this.re_step = re_step;
}
public int getRe_level() {
return re_level;
}
public void setRe_level(int re_level) {
this.re_level = re_level;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
}
board.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">
<!-- 매핑시키는 IMapperDAO 부분이 여기다! -->
<mapper namespace="board">
<!-- 최대 글번호 얻기 -->
<select id="numMax" resultType="Integer">
select max(num) from board
</select>
<!-- 답글 끼워넣기 위치 확보(답글달기) -->
<update id="reStep" parameterType="Board77"> <!-- re_Step이 더 큰거는 뒤로 미뤄나라! -->
update board set re_step=re_step+1 <!-- 댓글에 대댓글을 달게되면 그림 상으로 원 글 아래에 댓글(대댓글3-얘는 원글에 댓글을 다는 것) 댓글(대댓글2) 댓글(대댓글4-댓글에 댓글다는 것) 그래서 +1을 한다.-->
where ref=#{ref} and re_step > #{re_step}
</update>
<!-- insert 글쓰기, 글쓴이 답글쓰기 -->
<insert id="insertDao" parameterType="Board77"> <!-- 글 번호는 oracle 줘야 한다 -->
insert into board(writer, subject, pw, regdate, ref, re_step, re_level, content, ip) values(#{writer},#{subject},#{pw},NOW(),#{ref},#{re_step},#{re_level},#{content},#{ip})
</insert>
<!-- 글 개수 -->
<select id="countDao" resultType="int">
select count(*) from board;
</select>
<!-- 글 리스트 -->
<select id="listDao" parameterType="java.util.Map" resultType="co.kr.Hello.dto.BoardDTO"> <!-- dto로 작업하기 좀 그런거는 map을 이용한다. -->
select * from board order by ref desc, re_step asc limit #{start}, #{cnt}
</select> <!-- ref: 그룹으로 묶다. re_step: 그룹으로 묶여진 글 순서! -->
<!-- 조회수 증가 -->
<update id="readcountDao" parameterType="Integer">
update board set readcount = readcount+1 where num=#{num}
</update>
<!-- 글 내용 보기, 글 수정 폼 -->
<select id="getBoard" parameterType="Integer" resultType="co.kr.Hello.dto.BoardDTO">
select * from board where num=#{num}
</select>
<!-- DB 글 수정 -->
<update id="updateDao" parameterType="co.kr.Hello.dto.BoardDTO">
update board set writer=#{writer}, subject=#{subject}, content=#{content} where num=#{num} and pw=#{pw}
</update>
<!-- 글 삭제 -->
<delete id="deleteDao" parameterType="int">
delete from board where num=#{num}
</delete>
</mapper>
sts를 이용한 board 뷰들 (0) | 2021.08.09 |
---|---|
sts를 이용한 member의 뷰 파일들 (0) | 2021.08.09 |
Member 관련 sts 코드 (0) | 2021.08.09 |
AJAX, ERROR415, Qualifier, Input/button tag(에러 처리하기) (0) | 2021.08.07 |
웹소켓 기반으로 하는 채팅2 (0) | 2021.08.07 |