Web/Spring

나프 - 게시판 만들기 (3)

now0204 2023. 8. 3. 12:32

1. 등록 및 조회 구현 

 

List.jsp 타이플에 a태그 걸어서 상세보기 페이지로 넘어가도록 함

<td><a href="<c:url value='/get.do?bno=${vo.idx}'/>">${vo.title}</a></td>
@RequestMapping("/get.do")
	public String get(@RequestParam("bno") int bno, Model model) {
		BoardVO board=service.get(bno);
		model.addAttribute("board", board);
		return "get";//get.jsp
	}

- 처리 컨트롤러, 넘어온 번호를 통해 DB에서 해당 번호에 게시글 찾아서 BoardVO에 담아서 리턴 

- model에 이를 담은 다음 get.jsp로 forward

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
 
<div class="container">
  <h2>Board Read</h2>
  <div class="panel panel-default">
    <div class="panel-heading">Board Read Page</div>
    <div class="panel-body">Panel Content
     
     <div class="form-group">
    <label>BNO</label>
    <input type="text" class="form-control" id="idx" name="idx" value="${board.idx}" readonly="readonly">
  </div>
    
    <div class="form-group">
    <label>Title</label>
    <input type="text" class="form-control" id="title" name="title" value="${board.title}" readonly="readonly">
  </div>
  <div class="form-group">
    <label>Text area</label>
   <textarea class="form-control" rows=3 name="contents"readonly="readonly" >${board.contents}</textarea>
  </div>
  <div class="form-group">
    <label>Writer</label>
    <input type="text" class="form-control" id="writer" name="writer" value="${board.writer}" readonly="readonly">
  </div>
    
    <button class="btn btn-default">Modify</button>
    <button class="btn btn-info">List</button>
    </div>
     <div class="panel-footer">Panel Content</div>
  </div>
</div>

</body>
</html>

- get.jsp는 위와 같다.

 

2. 수정페이지 구현 

 

- get.jsp에 modify나 List버튼을 누르면, 수정페이지 혹은 List페이지로 넘어가도록 버튼을 설정

$(document).ready(()=>{
	$("#list").click(()=>{
		location.href="<c:url value='/list.do'/>";
	});
	
	$("#modify").click(()=>{
		const idx = $("#idx").val();
		location.href="<c:url value='/modify.do'/>?bno="+idx;
	})
});

- 이때 게시물의 번호를 가져가야한다. -> 특정 글에 대한 수정이므로, 수정페이지는 특정 게시글 기반으로 페이지를 꾸려야하기 때문

@RequestMapping(value="/modify.do",method=RequestMethod.GET) //get.jsp에 modify버튼
	public String modifyGET(@RequestParam("bno") int bno, Model model){
		BoardVO board=service.get(bno);
		model.addAttribute("board", board);
		return "modify";

- modify.do를 get 혹은 post방식으로 나누어 처리하도록 하자 

- get방식으로 넘어온 요청은 get.jsp에 modify버튼이다. 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>    
<!DOCTYPE html>
<html lang="en">
<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<script type="text/javascript">
$(document).ready(()=>{
	$("#list").click(()=>{
		
		location.href="<c:url value='/list.do'/>"
	})
	
	
});

</script>

</head>
<body>
 
<div class="container">
<h2>Board Modify Page</h2>
  <div class="panel panel-default">

    <div class="panel-heading">Board Modify Page</div>
    <div class="panel-body">
  
   <form action="<c:url value='modify.do'/>" method="post">
  
  <div class="form-group">
    <label>Bno</label>
    <input type="text" class="form-control" id="idx" name="idx" value="${board.idx}" readonly="readonly">
  </div>
  
  
  <div class="form-group">
    <label>Title</label>
    <input type="text" class="form-control" id="title" name="title" value="${board.title}">
  </div>
  <div class="form-group">
    <label>Text area</label>
   <textarea class="form-control" rows=3 name="contents" >${board.contents}</textarea>
  </div>
  <div class="form-group">
    <label>Writer</label>
    <input type="text" class="form-control" id="writer" name="writer" value="${board.writer}" readonly="readonly">
  </div>
  <button type="submit" class="btn btn-default">Modify</button>
  <button id="remove" type="button" class="btn btn-default">Remove</button>
  <button id="list" type="button" class="btn btn-info">List</button>
</form>
    </div>
    <div class="panel-footer"></div>
  </div>
</div>

</body>
</html>

-modify.jsp -> 몇가지 readonly 속성만 제외하면, register와 유사 

 

3. 수정 및 삭제 구현 

 

- modify.jsp에서 버튼을 통해 수정 혹은 삭제 요청이 발생할 때 이를 처리할 컨트롤러 구성 

@RequestMapping(value="/modify.do",method=RequestMethod.POST)
	public String modifyPOST(BoardVO board){
		service.modify(board);
		return "redirect:/list.do";
	}
	
	
	@RequestMapping("/remove.do")
	public String remove(@RequestParam("bno") int bno) {
		service.remove(bno);
		return "redirect:/list.do";
	}
$("#remove").click(()=>{
		
		location.href="<c:url value='/remove.do'/>?bno=${board.idx}";
	});

- modify.jsp에 삭제만 추가, modify는 form에 submit을 통해 post방식으로 전달된다.

 

 

4. 조회수 업데이트 

 

4.1 xml 및 인터페이스에 메서드 추가

<update id="countUpdate" parameterType = "Integer">
     update tb_board set count=count+1 where idx=#{idx}
</update>
public void countUpdate(int bno);

- 상세보기 클릭시 조회수가 올라가도록 처리할 것이다.

- service에 get이 호출 될 때마다 mapper에 countUpdate메서드가 실행되도록 하자 

- 상세보기 클릭시 해당 게시물의 번호가 넘어온다. 이를 받아서 해당 게시물 번호의 조회수를 업데이트 하자 

 

4.2 service메서드 기존 get에 mode추가 

@Override
	public BoardVO get(int bno, String mode) {
		if(mode.equals("get"))
		mapper.countUpdate(bno);
		return mapper.read(bno);
	}

- List.jsp에서 상세보기를 클릭시, 혹은 modify버튼을 클릭 시 두가지 경우에 service메서드에 get이 호출 된다.

- 이때 조회수는 controller에 get메서드에 의해서만 조회수가 올라가고 modify메서드에는 반응하면 안된다.

- 따라서 get에 mode 매개변수를 추가하여, 서비스의 get이 호출 될 때, 컨트롤러에 get메서드인지 modify메서드인지에 따라 조회수를 올릴 것인지 말 것인지를 결정하도록 하자  

@RequestMapping("/get.do")
	public String get(@RequestParam("bno") int bno, Model model) {
		BoardVO board=service.get(bno,"get");
		model.addAttribute("board", board);
		return "get";//get.jsp
	}
    
    @RequestMapping(value="/modify.do",method=RequestMethod.GET)
	public String modifyGET(@RequestParam("bno") int bno, Model model){
		BoardVO board=service.get(bno,"modify");
		model.addAttribute("board", board);
		return "modify";
	}