@RequestMapping(value = "saveBoard", method = RequestMethod.POST)
public String saveBoard(@ModelAttribute("BoardVO")BoardVO boardVO,
@RequestParam("mode") String mode,
RedirectAttributes rttr)throws Exception{
//edit이 오면 수정 아니면 글쓰기
if(mode.equals("edit")) {
boardService.updateBoard(boardVO);
}else {
boardService.insertBoard(boardVO);
}
return "redirect:/board/getBoardList";
}
게시판에서 글쓰기버튼을 눌러서 글쓰기페이지로 이동 후,
글 작성 또는 수정을 하는 이벤트의 컨트롤러 부분이다.
항상 작성과 수정을 나눠서 구현했지만 이번엔 같이 합쳐보았다.
· ModelAttribute
글수정 또는 작성을 버튼을 누르면 saveBoard url을 RequestMapping을 통해 컨트롤러에서 받으면
saveBoard() 메소드가 호출되고 스프링컨테이너는 @ModelAttribute설정을 해석해서 세션에 BoradVO라는 이름으로 저장된 데이터가 있는지 확인한다.
그 후 있다면 해당 객체를 세션에서 꺼내서 매개변수로 선언된 boardVO변수에 할당한다.
그리고 boardVO객체에 사용자가 입력한 파라미터값을 할당한다.
수정정보값만 새롭게 할당되고, 상세보기 했을때 세션에 저장된 데이터가 유지된다.
순서대로 설명하면
1.@ModelAttribute를 선언하면 BoradVO클래스의 객체 boardVO를 자동으로 생성
2.자동바인딩하여 해당 변수의 setter를 통해 변수에 저장 (ModelAttribute의 매개변수는 항상 getter&setter(vo,dto)여야함)
3.ModelAttribute([NAME])의 형태로 붙일경우 jsp파일에서 ${[NAME].property}의 형태로 Model객체의 값을 사용 할 수 있게 된다.
4.그래서 뷰단에선 $("#title").val('<c:out value="${boardContent.title}"/>'); 이런 형식으로 사용
model객체에 추가되고 뷰단까지 그 내용이 전달이 됨으로써 model과 뷰에 동시에 반영가능.
· RedirectAttributes
POST방식으로 서버로 보낸 후 바로 다른 페이지로 리다이렉트를 한다.
위 코드의 리다이렉트 주소는 게시판메인화면이다.
리턴 후 바로 주소값을 입력해서 메인화면으로 돌아가지 않는 이유는 중복방지이다.
글쓰기화면 - 저장단계(서버) - 리스트화면인데 뒤로가기를 누르면 저장단계로 가게되서 자칫 게시물 도배가 될 수도 있다 . 여기서 RedirectAttributes를 사용하면 저장단계를 지나 글쓰기 폼으로 돌아가기 때문에 도배가 되는 상황을 막을 수 있다.
리다이렉트를 통해 데이틀 전송할 수도 있지만, 리다이렉트는 GET방식이라 URL에 표시가 되기 때문에
적합하지 않다. 그래서addFlashAttribute()를 사용한다.
addFlashAttribute() 는 리다이렉트 직전 플래시에 저장하는 메소드다. 리다이렉트 이후에는 소멸한다.
header가 아닌 세션을 통해 전달하는 addFlash는 뒤에 피라미터가 보이지 않는다.
rttr.addAttribute로 전달한 값은 url뒤에 붙으며,
리프레시해도 데이터가 유지된다.
rttr.addFlashAttribute로 전달한 값은 url뒤에 붙지 않는다.
일회성이라 리프레시할 경우 데이터가 소멸한다.
또한 2개이상 쓸 경우, 데이터는 소멸한다.
따라서 맵을 이용하여 한번에 값전달해야한다.
// 게시판 수정
@RequestMapping(value = "/update", method = RequestMethod.POST)
public String update(BoardVO boardVO, @ModelAttribute("scri") SearchCriteria scri, RedirectAttributes rttr) throws Exception{
logger.info("update");
service.update(boardVO);
rttr.addAttribute("page", scri.getPage());
rttr.addAttribute("perPageNum", scri.getPerPageNum());
rttr.addAttribute("searchType", scri.getSearchType());
rttr.addAttribute("keyword", scri.getKeyword());
return "redirect:/board/list";
}
컨트롤러의 게시판 수정중, 리 다이렉트 사용 예제이다.
리 다이렉트는 /board/list까지 지만 실제 url을 보면 뒤에 ?page&perPageNum=&searchType= 이런식으로
addAttribute를 통해 url이 추가된다. 선택한 게시물에 대한 url을 수정할때 위치를 전달해준다.
flash는 예를들면 로그인 시에 사용할 수 있다.
로그인 시 회원정보가 맞으면 로그인,맞지않으면 값을 초기화 해야하는데
그때 addFalshAttribute를 사용 할 수 있다.
'SPRING > Spring' 카테고리의 다른 글
HttpserveltRequest와 HttpSession,세션과 로그인 로그아웃 (0) | 2021.08.03 |
---|---|
UriComponents과 URLEncoding (0) | 2021.07.31 |
AOP를 이용한 트랜잭션 구현 중 트랜잭션이 먹지 않는 현상과 메모리누수경고(Memory leak)=(톰캣구동안됨) 404에러 해결 (0) | 2021.07.21 |
스프링 데이터를 전달하는 형태(Model,ModelAndView) (0) | 2021.07.18 |
스프링 파라미터 받아오기(HttpServletRequest,RequestParam) (0) | 2021.07.18 |