스프링 개념 정리 (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에서 데이터를 다루는 방식

  1. HttpServletRequest 객체를 이용한 HTTP 전송 정보 얻기

1

  1. @RequestParam 어노테이션을 이용한 HTTP 전송 정보 얻기

2

  1. 커맨드 객체를 이용한 HTTP 전송 정보 얻기

3


@ModelAttribute


Session 사용법

  1. HttpServletRequest
  • 파라미터로 HttpServletRequest를 받은 후, getSession()으로 세션을 얻는다.
public String memLogin(Member member, HttpServletRequest request) {...}
  1. HttpSession
  • 파라미터로 HttpSession을 받아 세션을 사용한다.
public String memLogin(Member member, HttpSession session) {...}

세션 주요 메소드

  1. getId()
    세션 ID를 반환한다.
  2. setAttribute()
    세션 객체에 속성을 저장한다.
  3. getAttribute()
    세션 객체에 저장된 속성을 반환한다.
  4. removeAttribute()
    세션 객체에 저장된 속성을 제거한다.
  5. setMaxInactiveInterval()
    세션 객체의 유지시간을 설정한다.
  6. getMaxInactiveInterval()
    세션 객체의 유지시간을 반환한다.
  7. invalidate()
    세션 객체의 모든 정보를 삭제한다.

  1. 쿠키 생성

    @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,
,
{

)
;

;
}
  1. 쿠키 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>
	(...)




© 2019. by mintheon

Powered by mintheon