ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [spring]board Business,Dataservice(xml방식)
    JAVA 2021. 8. 6. 17:22

    게시판 추가

    DTO,VO : 모델빈
    ◆src/main/java/
    co.kr.Hello.dto.BoardDTO.java  

    DAO : 비니지스 로직 
    ◆src/main/resources/ mybatis /mybatis-config.xml : 여기에 board.xml를 등록 
    ◆src/main/resources/ mybatis /board.xml

    컨트롤러 
    ◆ co.kr.Hello.BoardController.java

    ◆ views
           board 폴더/*.jsp

    Board - num ref 제목 re_level re_step
    원글과 댓글과 대댓글 한번에 관리

    - num : 글번호
    - ref : 글 그룹 ( 원글의 num 으로 통일 )
    하나의 원글과 그에 따른 댓글 대댓글 모두 한그룹
    - re_level : 원글이면 0, 댓글이면 1, 대댓글이면 2...
    - re_step : 글 순서
    댓글1 - 대댓글1 - 댓글2 - 대댓글1
    순서대로 가다가 댓글1 에 대댓글2 를 넣는다면?

    댓글1 - 대댓글1 -대댓글2 - 댓글2 - 대댓글1
    이렇게 중간에 삽입이 된다. 그 때 순서대로 들어가는 re_step 를 다시 정렬하기 위해
    뒤의 글들의 re_step 은 +1 이 된다.

    컨트롤러 
    BoardController.java ( 수정중 )

     

    >> mybatis-config.xml ( 수정 )

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd" >
    
    <configuration>
    	<typeAliases>
    	  <typeAlias alias="member77" type="co.kr.Hello.dto.MemberDTO"/>
    	</typeAliases>
    
    	<mappers>
    		<mapper resource="/mybatis/member.xml"/>
    		<mapper resource="/mybatis/board.xml"/>
    	</mappers>
    </configuration>

     

    >> 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;//ip
    	
    	public BoardDTO() {}
    	
    	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">
    
    <mapper namespace="board">
    <!-- resultType 에 co.kr.Hello.dto.BardoDTO 또는 별칭인 board77 둘 다 가능 -->
    	<!-- 최대 글번호 얻기 -->
    	<select id="numMax" resultType="Integer">
    		select max(num) from board
    	</select>
    	
    	<!-- 답글 끼워넣기 위치 확보 -->
    	<update id="reStep" parameterType="board77">
    		update board set re_step=re_step+1
    		where ref=#{ref} and re_step>#{re_step}
    	</update>
    
    	<!-- insert 글쓰기, 답글쓰기 -->
    	<insert id="insertDao" parameterType="board77">
    		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="board77">
    		select * from board
    		order by ref desc,re_step asc
    		limit #{start},#{cnt}
    	</select>
    	
    	<!-- 조회수 증가 -->
    	<update id="readcountDao" parameterType="Integer">
    		update board set readcount=readcount+1
    		where num=#{num}
    	</update>
    	
    	<!-- 글 내용 보기, 글 수정 폼 -->
    	<select id="getBoard" parameterType="Integer" resultType="board77">
    		select * from board
    		where num=#{num}
    	</select>
    	
    	<!-- DB 글 수정 -->
    	<update id="updateDao" parameterType="board77">
    		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>

     

    >> 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;//MyBatis
    
    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.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_step,String re_level,String pageNum) {
    		
    		if(num==null) {//원글 쓰기(답글이라면 원글의 num 이 들어올 예정)
    			//원글이면 초기화해서 게시판목록보여주기!
    			num = "0";//글번호
    			ref = "1";//글 그룹
    			re_step="0";//글순서
    			re_level="0";//글 깊이
    		}//if-end
    		
    		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");//최대 글번호 maxNum에 할당
    		}
    		
    		if(maxNum != 0) {//글이 존재하면
    			maxNum = maxNum+1;//ref(글그룹)에 넣으려고 - 원글의 num 으로 통일( 원글의 num 이 마지막글에서 +1 이다 ) 
    		}else {//처음 글이면
    			maxNum=1;//ref그룹에 1을 넣는다.
    		}
    		
    		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));//글 순서
    			boardDTO.setRe_level(new Integer(0));//글 깊이
    		}
    		
    		sqlSession.insert("board.insertDao",boardDTO);//글 DB저장
    		
    		return "redirect:list.do";
    	}//writePro()-end
    	
    	//리스트
    	@RequestMapping("list.do")
    	public String listBoard(Model model,String pageNum) {
    		if(pageNum==null) {//처음 진입시
    			pageNum="1";//페이지는 1번으로
    		}
    		
    		int pageSize = 10;//페이지 당 10개의 글
    		int currentPage=Integer.parseInt(pageNum);//현재 페이지
    		
    		int startRow = (currentPage - 1)*pageSize + 1;//페이지의 첫번째 행(첫번째 글) 파라미터는 0부터 시작
    		int endRow = currentPage * pageSize;//페이지의 마지막 행(마지막 글)
    		
    		int count = 0;//총 글 갯수 넣을 변수
    		int pageBlock = 10;//블럭당 10개 페이지 넣을려고(페이지블럭단위)
    		
    		count = sqlSession.selectOne("board.countDao");
    		int number = count - (currentPage-1)*pageSize;//글 37개이면, 37  36  35(나중쓴글이 최근글이니 반대로 글번호 매기기)
    		
    		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
    		//                   몫          +    꽁다리 레코드
    		
    		int startPage=(currentPage/pageBlock)*10+1;//블럭의 시작 페이지
    		int endPage=startPage+pageBlock-1;//블럭의 끝 페이지
    		//----------------------------------
    		List<BoardDTO> list = sqlSession.selectList("board.listDao",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);
    		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("board/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;
    	}
    	
    	
    }//class-end

    댓글

Designed by Tistory.