Annotation 어노테이션
원래는 HadlerMapping , Controller, ViewResolver 같은 여러 클래스를 스프링 설정파일에 bean 등록을 해서
스프링 컨테이너가 Controller 클래스를 생성했다면
어노테이션을 설정하여 XML 설정을 최소화할 수 있다.
xml 파일에 어노테이션 설정방법
먼저 <beans> 엘리먼트 안에 context 네임스페이스 추가
: Eclipse의 Source다음에 있는 Namespaces탭을 클릭 후 context를 체크함.
xmlns:context="http://www.springframework.org/schema/context"
두번째 <context:component-scan> 엘리먼트의 base-package 속성에 Controller 클래스들이 있는 가장 상위 패키지 등록
<context:component-scan base-package="com.spring.view"/>
위와 같이 설정하면 base pacakage 하위의 @Controller, @Service @Repository, @Component 클래스가 모두 빈으로 등록
1. @Controller 어노테이션
기존에 여러 Controller 클래스를 스프링 설정파일에 bean 등록할 필요가 없이
@Controller를 클래스 선언부 위에 붙이면 xml 에 설정해둔 <context:component-scan> 이 스프링 컨테이너가
컨트롤러 객체들을 자동으로 생성(메모리에 생성하는 기능)해준다.
그리고 DispaterServlet 이 인식하는 Controller로 객체를 만들어준다.
이 말은 클라이언트 요청을 DispaterServlet이 받아 HandlerMapping 에게 주면 요청을 처리할 Controller를 검색해
hadleRequest() 메소드를 호출할 필요없다
그럼 바로 검색 된 Controller로 바로 매핑된다는 말??
@Controller
public class InsertBoardController {
public void insertBoard(HttpServletRequest request){
~
}
}
InsertBoardController 클래스 객체는 스프링 컨테이너가 자동으로 생성. = Controller 객체로 인식
2. @RequestMapping 어노테이션
앞에서 Controller 어노테이션을 쓰면 컨트롤러 객체는 생성하여 Controller 인식이 가능하지만
클라이언트 요청에 대해 해당 Controller의 메서드가 실행될 순 없다.
이 어노테이션을 쓰면 HandlerMapping 을 대체할 수 있다.
HandlerMapping 이란?
: 클라이언트 요청(예를 들어 로그인 버튼 login.do 클릭 )을 DispaterServlet이 먼저 받아 HandlerMapping 에게 주면
요청을 처리할 Controller를 검색(LoginController)하여 매핑시켜주는 역할
@RequestMapping(value="/login.do") ▶ 클라이언트의 /login.do 요청이 들어오면 insertBoard() 메소드와 매핑하겠다.
* value 속성은 생략가능
@Controller
public class InsertBoardController {
@RequestMapping(value="/insertBoard.do")
public void insertBoard(HttpServletRequest request){
~
}
}
3. Command 객체
Command 객체는 Controller 메소드 매개변수로 받은 VO 객체이다.
@Controller
public class InsertBoardController {
@RequestMapping(value="/insertBoard.do")
public void insertBoard(BoardVO vo){ → command 객체
~
}
}
Command 객체 구현과정
위와 같이 매개변수로 사용자가 입력한 값을 매핑할 BoardVO 클래스를 선언한다면?
1. 클라이언트가 글 등록할 정보를 입력하고 "/insertBoard.do" 요청 전달
2. 스프링 컨테이너가 @Controller가 붙은 모든 컨트롤러 객체 생성하고 insertBoard() 메서드를 실행
3. insertBoard() 메서드의 매개변수에 해당하는 BoardVO 객체 생성
public class BoardVO {
publiv void setTitle(String title) {..} // 제목
publiv void setWriter(String writer) {..} // 작성자
publiv void setContent(String content) {..} // 내용
}
4. 사용자가 입력한 파라미터 값(title,writer,content) 들을 추출하여 BoardVO 객체에 저장
이때 BoardVO 클래스의 Setter 메소드 이름과 반드시 일치해야함!! (name ="title") = (setTitle)
[insertBoard.jsp]
<form action="insertBoard.do" method="post">
~생략
<input type="text" name="title">
<input type="writer" name="writer">
<input type="content" name="content">
5. 이제 insertBoard() 메서드 호출시 사용자 입력값이 설정된BoardVO 객체가 public voidinsertBoard(BoardVO vo) 인자로 전달된다.
<form action="insertBoard.do" method="post">
~
<input type="text" name="title">
4. @ModelAttribute
@ModelAttributed 은 두가지 기능이 있다.
1. Command 객체 이름변경을 위해 사용
2. View 페이지에서 사용할 데이터를 설정하기 위해 사용
우선 첫번째
기존에는 Command 객체 이름의 첫 글자를 소문자로 변경하여 뷰화면에 UserVO 객체의 변수에 접근할때 사용
[LoginController]
@Controller
public class LoginController {
@RequestMapping(value="/login.do")
public String loginView(UserVO vo){ → command 객체
~
return "login.jsp";
}
}
[login.jsp]
<input type="text"name="id" value="${userVO.id}" >
4-1. @ModelAttributed("") 어노테이션을 썼을때
[LoginController]
@Controller
public class LoginController {
@RequestMapping(value="/login.do")
public String loginView(@ModelAttributed("user"), UserVO vo){ → command 객체
~
return "login.jsp";
}
}
[login.jsp]
<input type="text"name="id" value="${user.id}" >
4-2. @ModelAttributed("conditionMap")
우선 클라이언트의 요청시
@ModelAttributed 는 @RequestMapping 어노테이션이 적용된 메소드보다 먼저 호출된다(우선권을 가짐)
@ModelAttributed 이 붙은 메서드가 리턴한 값을 model 객체에 저장하고
@RequestMapping가 붙은 다음 메소드가 실행 될 때 리턴된 jsp파일에 사용가능하다.
검색기능을 만들어보자
[BoardController]
@ModelAttributed("conditionMap")
public Map searchConditionMap(){
Map conditionMap = new HashMap(),
conditionMap.put("제목","TITLE");
conditionMap.put("내용","CONTENT");
return conditionMap;
}
@RequestMapping("/getBoardList.do")
public String getBoardList(BoardVO vo, BoardDAO dao, Model model){
model.addAttribute("boardList", dao.getBoardList(vo));
return "getBoardList.jsp";
}
@ModelAttributed 동작순서
1. 클라이언트가 "/getBoardList.do" 요청시
2. @ModelAttributed 이 붙은 메서드가 붙은 searchConditionMap() 메서드가 먼저 우선권을 가져서 실행된다.
searchConditionMap() 메서드는 다양한 검색 조건이 저장된 conditionMap 리턴하여 getBoardList() 가 리턴한 뷰페이지에 사용가능하다.
3. searchConditionMap() 메서드가 리턴한 값을 model 객체에 저장
4. 이제 클라이언트가 호출한 getBoardList() 메서드 실행
5. getBoardList() 메서드에서 "boardList" 이름을 가진 Model에는 (model.addAttribute("boardList", dao.getBoardList(vo));)
searchConditionMap() 메서드에서 리턴 된 값인 "conditionMap" 이름을 가진 map 도 있다.
즉 Model 에는 총 두개의 컬렉션이 저장됨.
[getBoardList.jsp]
~~생략
<c:forEach items="${conditionMap}" var="option">
<option value="${option.value}">${option.key}
</c:forEach>
~~
뷰화면에서는 model 에 저장된 검색목록(내용,제목)과 글목록 모두 사용가능.
'공부' 카테고리의 다른 글
입력방법 BufferedReader (0) | 2023.01.20 |
---|---|
[백준] 1단계 | 입출력과 사칙연산 1~9 (0) | 2023.01.20 |
정합성 문제 | DB의 격리수준 | 스프링부트의 트랜잭션 (0) | 2022.11.07 |
STS4 툴에서 JSP , HTML , CSS 확장자 파일 없을 때 해결법 (0) | 2022.11.05 |
lombok 설정 | yml 설정 (0) | 2022.11.01 |