@Controller
컨트롤러 객체를 생성하는 어노테이션, DispatcherServlet에서 @Controller를 참고하여 연결한다.
@RequestMapping
-@Controller를 통해 들어와 @RequestMapping의 value값을 통해 해당 메서드를 찾아갈 수 있도록한다.
-method속성: view에서 요청하는 방식에 따라 맞는 처리를 해준다.
@ModelAttribute
사용용도
1)Command객체 이름변경(변수앞에붙여둠)
@Controller
public class MemberController {
//get방식 요청시
@RequestMapping(value="/login.do", method=RequestMethod.GET)
//속성이 2개이상이면 value 생략 불가능
public String login(@ModelAttribute("user")MemberVO vo) {
//@ModelAttribute("user")MemberVO vo를 사용해서 경로만 리턴
// view에서 ${user.id} 이런식으로 사용하면된다.
System.out.println("Get로 login.do 요청");
vo.setId("test");
vo.setPassword("1234");
return "login.jsp";//리다이렉트 vs 포워드
}
//post방식 요청시
@RequestMapping(value="/login.do", method=RequestMethod.POST)
public String login(MemberVO vo,MemberDAO memberDAO,HttpSession session) {
System.out.println("POST로 login.do 요청");
vo=memberDAO.getMember(vo);
if(vo==null){
return "redirect:login.jsp";
}
session.setAttribute("member", vo);
return "redirect:main.do";
}
}
경우에 따라 다르지만 command객체 내에서는 @ModelAttribute보다는 직접적으로 Model객체를 생성해서 많이 쓴다.
@RequestMapping(value="/main.do")
public String getBoardList(BoardVO vo,BoardDAO boardDAO,Model model) {
List<BoardVO> datas=boardDAO.getBoardList(vo);
model.addAttribute("datas",datas); // Model을 이용하여 전달할 정보를 저장!//☆
return "main.jsp";//경로만 String으로 보낸다.
}
2)View에서 사용할 데이터를 설정 (메서드 앞에 붙여둠)
-@RequestMapping 설정된 메서드 보다 먼저 수행된다.
-selectbox에서 많이 사용되는데
-JSP페이지에서 사용할데이터를 설정하고 view에서는 foreach로 불러내기만 하면된다.
controller에서 반환값은 자동으로 Model에 저장(다음 view에서 볼 수 있다.)
BoardController.java
@ModelAttribute("conMap") // @RequestMapping이 설정된 메서드보다 먼저 수행됨
public Map<String,String> searchConditionMap() {
Map<String,String> conMap=new HashMap<String,String>();
conMap.put("제목", "title");
conMap.put("작성자", "writer");
conMap.put("내용", "content");
return conMap; // 반환값은 자동으로 Model에 저장 == (model.attribute("conMap",conMap))
}
@RequestMapping(value="/main.do")
public String getBoardList(BoardVO vo,BoardDAO boardDAO,Model model) {
// 검색 로직 추가할 예정
List<BoardVO> datas=boardDAO.getBoardList(vo);
model.addAttribute("datas",datas); // Model을 이용하여 전달할 정보를 저장!//☆
return "main.jsp";
}
main.jsp
<select name="searchCondition">
<c:forEach var="v" items="${conMap}">
<option value="${v.value}">${v.key}</option>
</c:forEach>
</select>
<input type="text" name="searchKeyword">
<input type="submit" value="검색">
@RequestParam
vo에 없는 멤버변수 들을 자동세팅할 때 사용한다. (getparam)과 같은 역할.
but, vo를 잘 설계하여 [ex)검색 조건, 검색어같은] 멤버변수들을 잘 설정하였다면 사용할 필요없다.
or, [ex)검색용] vo를 하나더 만드는 방식으로 하여도 사용할 필요 없다.
@RequestMapping(value="/main.do")
public String getBoardList(@RequestParam(value="searchCondition",defaultValue="title",required=false)String sc,@RequestParam(value="searchKeyword",defaultValue="",required=false)String sk,BoardVO vo,BoardDAO boardDAO,Model model) {
System.out.println("검색조건: "+sc);
System.out.println("검색어: "+sk);
List<BoardVO> datas=boardDAO.getBoardList(vo);
model.addAttribute("datas",datas); // Model을 이용하여 전달할 정보를 저장!
return "main.jsp";
}
@SessionAttribute
null 업데이트 이슈를 방지 할때 사용한다.
-> ex) 기존의 writer정보가 존재한다면, 기존의 정보를 유지해 주세요!
1) @SessionAttribute를 등록
2) C는 동작시 "data"라는 이름의 Command객체 존재여부를 확인
-> ModelAttribute를 통해 data라는 이름 설정해줘서 mapping되게 함
3)기존에 존재하던 data정보를 먼저 set
4) 요청시 새로들어온 정보를 나중에 set
@Controller
@SessionAttributes("data") // 2. data라는 이름의 정보가 Model에 들어온다면, session에 기억해둬라!//☆
public class BoardController {
@RequestMapping(value="/board.do")
public String getBoard(BoardVO vo,BoardDAO boardDAO,Model model) {
vo=boardDAO.getBoard(vo);
model.addAttribute("data", vo); // 1. Model을 이용하여 전달할 정보를 저장!//☆
return "board.jsp";
}
@RequestMapping(value="/updateBoard.do")
public String updateBoard(@ModelAttribute("data")BoardVO vo,BoardDAO boardDAO) {//3. ☆
System.out.println(" null 업데이트 이슈 확인: "+vo.getWriter());//session에 저장해둔 정보가 먼저 setter
System.out.println(" null 업데이트 이슈 확인: "+vo.getTitle());//이후에 파라미터로 들어온 정보가 나중에 setter
System.out.println(" null 업데이트 이슈 확인: "+vo.getContent());
boardDAO.updateBoard(vo);
return "redirect:main.do";
}
}
'Spring > Spring' 카테고리의 다른 글
day71) Spring-Controller 설계3 : 2-layered-아키텍쳐 (0) | 2022.04.11 |
---|---|
day70) [AOP] 횡단관심 - 트랜잭션 (0) | 2022.04.08 |
day68) Spring - Model 설계2 : JDBC Template (0) | 2022.04.07 |
day67)[AOP] - 횡단관심: 로깅 처리하기2 (0) | 2022.04.05 |
day66) [AOP] - 횡단관심: 로깅 처리하기1 (0) | 2022.04.04 |
댓글