본문 바로가기

카테고리 없음

Spring3: servlet-context.xml

 

<?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;
			
		}
	}
	
	

}