스프링 개념 정리 (WebMVC)
@Controller
@Controller
어노테이션은 컨트롤러를 명시해 주는 어노테이션이다.context.xml
안에<annotation-driven />
이라는 태그만 적어준다면,HandlerAdapter
에서 해당 어노테이션이 적혀있는 Controller 객체를 찾을 수 있다.
@RequestMapping
- 찾은 컨트롤러 객체 내에서 사용할 메소드를 구별시켜주는 어노테이션이다.
@RequestMapping("/success")
public String success(Model model) {
return "success";
}
HandlerMapping
- 사용자의 요청에 부합하는 컨트롤러 검색
HandlerAdapter
- 사용자의 요청에 부합하는 컨트롤러의 메서드 실행 요청
Controller
- Bussiness 로직 수행
- ModelAndView 객체 이용
ViewResolver
- 사용자의 요청에 부합하는 뷰 페이지 요청
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
@RequestMapping
쪽의return "success";
로/WEB-INF/views/success.jsp
로 이동하게 된다.
전체적인 웹프로그래밍 구조
한글처리
- 한글 처리를 위한 코드를
web.xml
에 넣어줘야 깨지지 않는다.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Controller
에서 데이터를 다루는 방식
HttpServletRequest
객체를 이용한 HTTP 전송 정보 얻기
@RequestParam
어노테이션을 이용한 HTTP 전송 정보 얻기
커맨드 객체
를 이용한 HTTP 전송 정보 얻기
@ModelAttribute
Session
사용법
HttpServletRequest
- 파라미터로
HttpServletRequest
를 받은 후,getSession()
으로 세션을 얻는다.
public String memLogin(Member member, HttpServletRequest request) {...}
HttpSession
- 파라미터로
HttpSession
을 받아 세션을 사용한다.
public String memLogin(Member member, HttpSession session) {...}
세션 주요 메소드
- getId()
세션 ID를 반환한다. - setAttribute()
세션 객체에 속성을 저장한다. - getAttribute()
세션 객체에 저장된 속성을 반환한다. - removeAttribute()
세션 객체에 저장된 속성을 제거한다. - setMaxInactiveInterval()
세션 객체의 유지시간을 설정한다. - getMaxInactiveInterval()
세션 객체의 유지시간을 반환한다. - invalidate()
세션 객체의 모든 정보를 삭제한다.
Cookie
사용법
쿠키 생성
@RequestMapping("/main") publicString mallMain(Mall mall, HttpServletResponse response) { Cookie genderCookie = newCookie("gender", mall.getGender()); if(mall.isCookieDel()) {
{
; return”/mall/main”; }
2. 쿠키 받아오기
```java
@RequestMapping("/index")
public String mallIndex(Mall mall,
,
{
)
;
;
}
- 쿠키 JSP 내에서 사용하기
(...) <c:choose> <c:when test="${cookie.gender.value == 'M'}"> 남성 상품 노출 </c:when> <c:when test="${cookie.gender.value == 'W'}"> 여성 상품 노출 </c:when> <c:otherwise> 남성, 여성 상품 노출 </c:otherwise> </c:choose> (...)
인터셉터
란?
preHandle()
- 컨트롤러로 작업하기 전에 실행
postHandle()
- 컨트롤러로 작업한 후 실행
afterCompletion()
- View 까지 모두 실행한 후 실행
HandlerInterceptor
는 인터페이스이기 때문에 구현 코드가 많아진다. 그래서 스프링에는 HandlerInterceptorAdapter
라는 클래스를 제공해주고 있다.
HandlerInterceptorAdapter
사용 방식
MemberLoginInterceptor.java
파일
public class MemberLoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession(false);
if(session != null) {
Object obj = session.getAttribute("member");
if(obj != null)
return true;
}
response.sendRedirect(request.getContextPath() + "/");
return false;
}
@Override
public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
super.afterCompletion(request, response, handler, ex);
}
}
servlet-context.xml
파일
(...)
<interceptors>
<interceptor>
<!-- 해당 경로를 인터셉터를 통하게 하도록 설정 -->
<mapping path="/member/modifyForm"/>
<mapping path="/member/removeForm"/>
<!--
모든 경로를 인터셉터를 통하게 하도록 설정
<mapping path="/member/**"/>
아래의 경로는 인터셉터에서 제외하도록 설정
<exclude-mapping path="/member/joinForm"/>
<exclude-mapping path="/member/join"/>
<exclude-mapping path="/member/loginForm"/>
<exclude-mapping path="/member/login"/>
<exclude-mapping path="/member/logout"/>
<exclude-mapping path="/member/modify"/>
<exclude-mapping path="/member/remove"/>
-->
<beans:bean class="com.bs.lec21.member.MemberLoginInterceptor"/>
</interceptor>
</interceptors>
(...)