<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<annotaion-driven/>
@(annotation)을 활성화해주는 설정
Controller annotation을 가진 클래스를 Controller로 로딩
<!-- Enables the Spring MVC @Controller programming model -->
<!-- 이 태그가 컨트롤러 역할을 함, @Controller와 같이 어노테이션을 활성화해주는 설정 -->
<annotation-driven />
<resources>
정적 자원 정보 기술 (img, stylesheet 등)
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
ViewResolver 클래스 bean
@Controller annotation을 통해 등록된 controller의 view 지정시 view 앞뒤 자동으로 붙여줄 접두사, 접미사 설정
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<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>
component-scan
base-package 설정 패키지 및 하위 패키지 스캔 후 등록 가능한 component를 모드 등록
<!-- 컨트롤러를 빈으로 등록하는 방법2: -->
<context:component-scan base-package="com.kh.spring" />
<!-- 내가 만든 패키지 경로, 이 태그에 의해 com.kh.spring아래에 있는 폴더들을 쫙 스캔하면서 컨트롤러를 찾음
base-package에서 설정된 패키지와 그 이하 패키지를 감시하여 등록가능한 도구(@Component)를 모두 찾아 자동 등록하는 설정
-->
controller class 등록방법 1) xml 방식
=> 장점: xml문서 내에서 한 눈에 볼 수 있음 , 관리 편리
=> 단점: bean개수가 많아지면 오히려 관리하기 어려움 (여러 개발자가 동일한 파일을 사용하면 충돌 가능성 높아짐)
servlet-context.xml파일에 직접 bean으로 등록
// 1. 요청시마다 실행될 controller클래스들을 bean으로 등록
<beans:bean class="com.kh.spring.member.controller.LoginController id="loginController"/>
<beans:bean class="com.kh.spring.member.controller.LogoutContorller id="logoutController"/>
// 2. 어떤 url요청시 어떤 Controller를 구동시킬지 매핑시키는 HandlerMapping관련 클래스를 빈으로 등록해야함
<beans:bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<bean:property name="mappings">
<beans:prop>
<beans:prop key="login.me">loginController</beans:prop>
<beans:prop key="logout.me">logoutController</beans:prop>
</beans:prop>
</bean:property>
</beans:bean>
controller class 등록방법 2) annotation(@) 방식
controller 로 등록할 클래스 상단 @Component 또는 @Controller annotation 달기
=> component-scan에서 지정한 감시할 패키지명 하위 모든 클래스들이 스캔되어
@Controller와 같은 mvc annotation이 붙은 클래스이 자동으로 bean으로 등록되는 방식
단, 내가 직접 만든 클래스가 아닐 경우 이미 compile이 완료된 .class파일이 배포되므로
수정이 불가능하기 떄문에 코드상으로 annotation 추가가 불가
이 경우에는 xml 파일로 설정하여 bean 등록
interceptor
<interceptors>
<interceptor>
<mapping path="/myPage.me"/>
<mapping path="/enrollFrom.bo"/>
<beans:bean class="com.kh.spring.common.interceptor.LoginInterceptor" id="loginIncerceptor"></beans:bean>
</interceptor>
</interceptors>
interceptor등록을 위한 , HandlerInterceptorAdapter클래스를 상속받는 클래스 작성
package com.kh.spring.common.interceptor;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class LoginInterceptor extends HandlerInterceptorAdapter {
/*
Interceptor (정확히 handlerInterceptor)
interceptor가 controller
Dispatcher Servlet이 제공하는 PreHandle을 사용해서 controller 메소드를 사용하기 전에
전처리 과정을 통해서로그인여부를 판별할 것임
controller 가 실행되기 전, 후에 낚아채서 실행할 내용을 작성가능
로그인유무 판단, 회원의 권한체크
preHandle(전처리): 핸들러 호출전 낚아챔
postHandle(후처리): 요청처리 후 DispatcherServlet이View 정보를 받기 전 낚아챔
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
// true리턴시: 기존 요청 흐름대로 controller를 정상실행
// false리턴시: controller 실행 x (controller까지 못감)
// 현재 요청을 보낸 사람이 로그인이 되어있을 경우 controller 실행
HttpSession session = request.getSession();
if(session.getAttribute("loginUser") != null) {
return true;
} else {
session.setAttribute("alertMsg", "로그인을 해야 사용햘 수 있는 기능입니다");
response.sendRedirect(request.getContextPath());
return false;
}
}
}