@RequestParam (메서드에 인자로 사용)
Command 객체에는 없는 파라미터를 Controller 클래스에게 전달해주기 위해 사용
ex) @RequestParam(value="searchCondition",defaultValue="TITLE",required=false)String searchCondition
value="무엇을 받을지" defaultValue="값이 없을때 기본 값" required="필수 여부"
String SearchCondition에 View에서 보내준 searchCondition이라는 name의 value 값이 들어간다.
@ModelAttribute("설정한 이름") (메서드에 작성하거나 인자 앞에 붙여 사용)
View 작업자 입장에서 화면을 구성할 때 칼럼을 알아야 만들 수 있는 것들에 대해 해당 값들에 대한 정보를 몰라도
출력할 수 있도록 컨트롤러에서 세팅해서 값을 넘겨줄 수 있다.
즉, View에서 사용할 데이터를 Controller에서 설정하는 용도로 사용되며 @RequestMapping 메서드보다 먼저 호출된다.
@ModelAttribute 메서드는 실행 이후에 객체를 반환하는데, 이 반환 값은 Model에 자동 저장된다.
Model에 자동 저장되기 때문에, View에서 사용이 가능하다.
Controller 예시
@ModelAttribute("scMap")
public Map<String,String> searchConditionMap(){
Map<String,String> scMap = new HashMap<String,String>();
scMap.put("제목", "title"); // 뷰에 어떻게 보여야하는지, 모델에서 어떻게 쓰는지
scMap.put("작성자", "writer");
return scMap;
}
View 예시
<select name="searchCondition">
<c:forEach var="v" items="${scMap}">
<option value="${v.value}">${v.key}</option>
</c:forEach>
</select>
실행화면
@SessionAttributes("설정한 이름") (클래스에 사용)
View 작업자는 기능만 알고, 내부 로직은 모르는 상황에서 (필요한 데이터인데) 전달되지 않는 파라미터가 발생할 수 있다.
때문에 전달되지 않은 파라미터의 값은 null이 되어 null 값이 업데이트될 수도 있는 "NULL 업데이트 이슈"가 발생한다.
이러한 NULL 업데이트 이슈를 방지하기 위하여 @SessionAttributes를 사용한다.
해당 클래스 내의 메서드에서 설정한 이름의 데이터가 Model 객체에 세팅이 된다면,
세팅된 데이터를 session에 기억시킨다.
@Controller
@SessionAttributes("data") // "data라는 이름의 데이터가 Model 객체에 세팅이 된다면, 그것을 session에 기억시키겠다.
public class BoardController {}
@ModelAttribute("이름")을 Controller의 메서드 인자(==Command 객체) 앞에 붙이면
해당 "이름"을 가진 데이터와 메서드 인자(==Command 객체)가 동일하다는 설정
1) 사용자가 요청을 했을 때 @SA에 설정된 이름으로 Model에 저장
2) Model에 @SA에 설정한 이름으로 저장된 데이터가 존재한다면,
해당 데이터를 세션에도 자동으로 저장하겠다는 설정
3) NULL 업데이트 이슈가 발생할법한 메서드의 인자에게 @MA를 설정하면,
@SA에 의해 저장되어있던 데이터가 자동 매핑됨
예시)
게시판 상세 페이지로 이동하기 위해 selectOneBoard 메서드를 사용하면 모델에 data라는 이름으로 bVO객체를
세팅하기 때문에 @SessionAttributes("data")에 의해 세션에도 자동 저장
이후 updateBoard 메서드 사용 시 인자로 사용되는 bVO에 @ModelAttribute("data")에 의해 모델에 세팅된
data라는 데이터가 bVO로 설정
@ModelAttribute("data")의 설정이 먼저 진행되고 사용자의 요청 정보는 해당 객체 위에 덮어씌워 진다.
@Controller
@SessionAttributes("data") // "data라는 이름의 데이터가 Model 객체에 세팅이 된다면, 그것을 session에 기억시키겠다.
public class BoardController {
@RequestMapping("/board.do")
public String selectOneBoard(BoardVO bVO,BoardDAO bDAO,Model model) {
bVO=bDAO.selectOneBoard(bVO);
model.addAttribute("data",bVO);
return "board.jsp";
}
@RequestMapping("/updateBoard.do")
public String updateBoard(@ModelAttribute("data")BoardVO bVO,BoardDAO bDAO) {
bDAO.updateBoard(bVO);
return "redirect:main.do";
}
}
'Spring' 카테고리의 다른 글
Spring 이미지 업로드 (0) | 2022.09.27 |
---|---|
2-Layered 아키텍처 (0) | 2022.09.26 |
Spring MVC2 .xml 설정 어노테이션으로 변경 (0) | 2022.09.22 |
Spring MVC2 DispatcherServlet.xml 설정 (0) | 2022.09.21 |
MVC 패턴의 변화 (0) | 2022.09.20 |