기초 코드를 생각하면서 사용하기
public String testView03(@RequestParam("abc") int no, @RequestParam("def") String name) {
System.out.println("no : " + no + "======= name : " + name);
return "/test/testView.jsp";
}
기존코드
String str = request.getParameter("abc");
int no = Integer.parseInt(str);
String def = request.getParameter("def");
public String testView04(@RequestParam("abc") int no, @RequestParam(value = "def", required = false) String name) {
System.out.println("no : " + no + "======= name : " + name);
return "/test/testView.jsp";
}
public ModelAndView logon05(@ModelAttribute("user") User user) {
ModelAndView mv = new ModelAndView();
mv.setViewName("/user/logonResult.jsp");
return mv;
}
생략된 코드(request로 부터 데이터를 가져오고 binding까지 처리한 뒤 requestScope에 넣어준다)
User user = new User();
user.setUserName(request.getParameter("userName"));
request.setAttribute("user", user);
interface를 implements시 interface에 명시된 method들중 일부만 구현하고 싶을 때 default method를 사용한다.(java8 이후로 추가 된 기능)
interface method에 구현 내용을 적용 시킬 수 있다.
아래는 SpringFramework에서 제공하는 HandlerInterceptor이다.
HandlerInterceptor는 default default method로 preHandler(), postHandle(), afterCompletion()를 제공하며 이를 구현하는
하위 class들은 위 method를 전부 구현하지 않아도 된다.
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
경우에 따라서 Controller를 실행시키고싶은 경우와 실행시키고싶지 않은 경우가 존재한다.
Interceptor는 HandlerMapping에서 Controller를 호출하기 전에 Interceptor의 조건에 맞지 않으면 Controller를 호출하지 않는다.
SpringFramework는 HandlerInterceptorAdapter를 통해 해당 기능을 제공하며
Controller 호출전에 실행되는 preHandle(), Controller 호출 후 실행되는 postHandle(), view 생성 후 실행되는 afterCompletion()을 제공한다.
session에 user정보의 유무를 확인하는 Interceptor
public class LogonCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("[LogonCheckInterceptor] init");
HttpSession session = request.getSession(true);
if(session.isNew() || session.getAttribute("user") == null) {
session.setAttribute("user", new User());
}
User sessionUser = (User) session.getAttribute("user");
if(sessionUser.isActive()) {
String uri = request.getRequestURI();
if(uri.indexOf("logonAction") != -1 || uri.indexOf("logon") != -1) {
RequestDispatcher dispatcher = request.getRequestDispatcher("/user002/home.jsp");
dispatcher.forward(request, response);
System.out.println("[LogonCheckInterceptor] end");
return false;
}
System.out.println("[로그인 상태]");
System.out.println("[LogonCheckInterceptor] end");
return true;
}else {
String uri = request.getRequestURI();
System.out.println("LogonCheckInterceptor uri = " + uri);
if(uri.indexOf("logonAction") != -1 || uri.indexOf("logon") != -1) {
System.out.println("[로그인 시도 상태]");
System.out.println("[LogonCheckInterceptor] end");
return true;
}
RequestDispatcher dispatcher = request.getRequestDispatcher("/user002/logon.jsp");
dispatcher.forward(request, response);
System.out.println("[LogonCheckInterceptor] end");
return false;
}
}
}
Interceptor 역시 bean이기에 xml에 등록하는 작업과 HandlerMapping에 해당 Interceptor를 wiring하는 작업이 필요하다
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
<property name="order" value = "0"/>
<property name="interceptors" ref="logonCheckInterceptor"/>
</bean>
<bean id="logonCheckInterceptor" class="spring.common.web.LogonCheckInterceptor"/>
Q) model, modelAndView 차이
A) model은 requestScope에 정보를 저장하는 역할까지만 수행하지만 modelAndView는 requestScope에 정보를 저장하고 path 정보를 ViewResolver에 전달하는
역할까지 수행한다.