새로고침의 문제점

 

controller를 구현 후 데이터를 입력하면 정상적으로 데이터가  입력이 됐습니다.

하지만 새로고침을 하게 되면 브라우저는 한번 더 POST 방식으로 데이터를 전송할 것인지 묻습니다.

 

 

여기서 확인을 누르게 되면 게시글이 정상적으로 등록이 되는데 

이 현상을 방지하기 위해서는 게시글을 등록하고 바로 다른 페이지로 이동시키면 됩니다!

이렇게 하기 위해서는 ridrecti가 필요합니다.

보통의 페이지들은 글을 작성하고 나면 목록이나 홈으로 이동이 되는데요.

registerPOST가 실행이 된후에 listAll라는 url을 매핑받는 컨트롤러를 실행시켜 listAll.jsp가 보이도록 redirect 처리를 해보겠습니다.

 

BoardController.class 수정

 

  	@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String registerPOST(BoardVO board, Model model) throws Exception {
		logger.info("register POST !!");
		
		service.create(board);
		
		model.addAttribute("result", "registerOK");
		
		return "redirect:/board/listAll";   // 수정
	}
	
         // 추가
	@RequestMapping(value = "/listAll", method = RequestMethod.GET)
	public void listAll(Model model) throws Exception {
		logger.info("listAll!!");
	}

 

listAll를 매핑받는 컨트롤러를 생성했으니 이제 화면을 보여줄 뷰를 만들어보겠습니다.

 

<!-- listAll.jsp -->

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	
	<table>
		<tr> <!-- 한줄 -->
			<th>번호</th> <!-- 첫번째 칸 -->
			<th>제목</th> <!-- 두번째 칸 -->
			<th>작성자</th> <!-- 세번째 칸 -->
			<th>작성일자</th> <!-- 네번째 칸 -->
		</tr>
	</table>
	
</body>
</html>

 

이제 다시 실행을 하기전에 controller를 제외한 jsp나 service, dao, vo등은 수정하고 다시 서버를 재기동 하지 않아도 되는데

controller는 코드 수정을 하고 난 후 반드시 서버를 재기동 시켜야 합니다!

 

다시 서버를 작동하고  글을 작성해보겠습니다.

 

 

위에 이미지를 보시면 아까 컨트롤러에서 redirect로 설정한 listAll.jsp가 정상적으로 실행 됐습니다.

하지만 url에 보이면 안되는 result=registerOK가 보이네요.

이 문제를 해결하기 위해서는 Spring의 RedirectAttributes 객체를 사용해야 합니다.

 

 

RedirectAttributes 란?

 

스프링의 RedirectAttributes 객체는 redirect 할때 일회성으로 데이터를 전송할 수 있도록 도와주는 

addFlashAttributes() 기능을 사용할 수 있는데요.

addFlashAttributes()는 URL상에는 보이지 않도록 숨겨진 데이터 형태로 전달됩니다.

이제 RedirectAttributes객체를 사용해보겠습니다.

 

// BoardController.java

@RequestMapping(value = "/register", method = RequestMethod.POST)
	public String registerPOST(BoardVO board, RedirectAttributes ra) throws Exception {   // RedirectAttributes 수정
		logger.info("register POST !!");
		
		service.create(board);
		
		ra.addFlashAttribute("register", "registerOK");  // addAttributes -> addFlashAttributes 수정
		
		return "redirect:/board/listAll";
	}

 

 

이렇게 URL에 데이터가 보이지 않도록 처리 했습니다.

 

이제 register -> listAll으로 페이지를 이동하면 alert 기능으로 경고창이 보이도록 하겠습니다.

 

listAll.jsp에서 코드를 추가할건데요 listAll.jsp에서 코드를 작성하는 이유는 

controller에서 return값이 listAll.jsp로 설정되있기 때문입니다!!

 

<!-- listAll.jsp -->

<script>
	var register = '${register}';
	if(register === 'registerOK') {
		alert("등록 되었습니다.");
	}
</script>

 

controller에서 보냈던 model값을 jsp에서 사용하는 방법은

'${변수}'로 작성하시면 됩니다( ' ', " " 둘 다 사용 가능)

 

 

 

이렇게 경고창도 잘뜨고 URL에 보여이면 안되는 정보가 보이지 않습니다!!

'JAVA > blog' 카테고리의 다른 글

해당 게시물 조회  (0) 2020.07.09
게시글 목록 구현  (0) 2020.07.09
controller 구현  (0) 2020.07.08
controller를 작성하기 전에 알아야 할 사항  (0) 2020.07.08
비즈니스 계층(service)  (0) 2020.07.08

+ Recent posts