상세 컨텐츠

본문 제목

Board관련 sts 코드

JAVA/Spring

by 영공쁘이 2021. 8. 9. 17:30

본문

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>

관련글 더보기