Spring, Spring MVC, 애노테이션 이용하기 2
@RequestParam
Command객체
- Command 객체를 이용하면 클라이언트에서 넘겨준 요청 파라메터 정보를 받아낼 수 있다.
- 그러려면 반드시 요청 파라메터(BoardVO vo), 매핑될 변수(vo.seq), Setter메소드(SetSeq())가 Command(=DTO)클래스에 선언되어있어야 한다.
@RequestParam
-
HttpServletRequest.getParameter() 와 같은 기능
@RequestParam(value="searchCondition", defaultValue="TITLE", required=false)
// value : 파라메터이름 , defaultValue : 기본 설정값, required : 파라메터 생략 여부
- 이 애노테이션을 이용하면 Command(=DTO) 객체에 없는 파라메터를 Controller클래스에서 사용할 수 있다.
예시
- 글 목록 화면에서 검색 조건, 검색 키워드를 설정하고 검색하는 상황
- 검색 조건과 키워드는 BoadVO의 변수가 아니다
- /getBoardList.do에 매핑된 getBoard()가 실행될때 BoardVO를 Command객체로 사용할 수 없다.
@RequestMapping("/getBoardList.do")
public String getBoardList( @RequestParam(value="searchCondition", defaultValue="TITLE", required=false) String condition,
@RequestParam(value="searchKeyword", defaultValue="", required=false) String keyword,
BoardDAO boardDao, BoardVO vo, Model model) {
// 매개변수로 선언하면 컨테이너가 자동으로 객체생성해준다
System.out.println("검색 조건 : "+ condition);
System.out.println("검색 키워드 : " + keyword);
// 3. 결과값을 model에 저장, 이동할곳(view)을 리턴
model.addAttribute("boardList", boardDao.getBoardList());
return "getBoardList.jsp";
}
@ModelAttribute
- @ModelAttribute가 설정된 메소드는 @RequestMapping 어노테이션이 적용된 메소드보다 먼저 호출된다.
- @ModelAttribute 메소드 실행 결과로 리턴된 객체는 자동으로 Model에 적용되고, View 페이지에서 사용할 수 있다.
예제
-
- BoardController.java
- 검색조건을 만들어서 view에서 사용한다
@ModelAttribute("conditionMap")
public Map<String, String> searchConditionMap(){
Map<String, String> conditionMap = new HashMap<>();
conditionMap.put("제목", "TITLE");
conditionMap.put("작성자", "WRITER");
conditionMap.put("내용", "CONTENT");
return conditionMap;
}
@RequestMapping("/getBoardList.do")
public String getBoardList( @RequestParam(value="searchCondition", defaultValue="TITLE", required=false) String condition,
@RequestParam(value="searchKeyword", defaultValue="", required=false) String keyword,
BoardDAO boardDao, BoardVO vo, Model model) {
// 3. 결과값을 model에 저장, 이동할곳(view)을 리턴
model.addAttribute("boardList", boardDao.getBoardList());
return "getBoardList.jsp";
}
<select name="searchCondition">
<!-- @ModelAttribute활용 -->
<c:forEach items="${conditionMap}" var="option">
<option value="${op tion.value}">${option.key}</option>
</c:forEach>
</select>
@SessionAttributes
- Model에 저장되어있는 데이터가 있다면 그 데이터를 세션(HttpSession)에도 자동으로 저장하라는 설정
예제_글 update하기
- 글 상세 정보를 가져올때 Model에 board라는 이름으로 게시글의 정보를 입력한다
- @SessionAttributes("board")에 의해서 Model에 저장되어있는 board데이터를 세션에 저장한다
- 글 수정시에 @ModelAttribute(“board”) BoardVO vo 에서 세션에 저장되어있는 board를 vo에 할당한다
@Controller
@SessionAttributes("board")
public class BoardController {
@RequestMapping("/getBoard.do")
public String getBoard(BoardVO vo, BoardDAO boardDao, Model model) {
System.out.println("글 상세보기 처리");
model.addAttribute("board", boardDao.getBoard(vo)); // Model 정보 저장
return "getBoard.jsp"; // 이동할 View는 String으로 처리
}
@RequestMapping("/updateBoard.do")
public String updateBoard(@ModelAttribute("board") BoardVO vo, BoardDAO boardDao, ModelAndView mav) {
System.out.println("글 수정 처리");
boardDao.updateBoard(vo);
return "getBoardList.do";
}
}
Reference