spring - 인터셉터(에러)

오늘·2021년 6월 10일
0

웹 페이지 연습

목록 보기
31/35

인터셉터(Interceptor)

  • 브라우저 요청 시 요청 메소드 호출 전/후에 개발자가 원하는 기능을 수행한다
  • 필터와 기능이 유사하지만, 필터보다는 좀 더 자유롭게 위치를 변경해서 기능을 수행
  • 쿠키 제어, 파일 업로드 등의 작업을 수행한다

HandlerInterceptor 클래스의 메소드

인터셉터를 사용해 다국어 기능 구현

servlet-context.xml

mvc 태그 추가

...
	<!-- 인터챕터 기능을 사용하도록 설정 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<!-- 특정 요청(/test/*.do)에 대해서만 인터셉터 빈을 수행할 것이다 -->
			<mvc:mapping path="/test/*.do"/>
			<!-- 모든 요청에 대해 인터셉터 빈을 수행할 것이다 -->
			<mvc:mapping path="/*/*.do"/>
			<!-- 인터셉터 기능을 수행할 빈 -->
			<beans:bean class="com.spring.pro28.ex05.LocaleInterceptor" />
		</mvc:interceptor>
	</mvc:interceptors>

</beans:beans>

message-context.xml

파일 위치는 이렇다

다국어 기능과 관련된 빈 + 메시지 파일을 읽어들이는 곳이다

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
	
	<!-- 스프링의 SessionLocaleResolver 클래스를 이용해 locale 정보를 세션에 저장해서 사용할 것이다 -->
	<bean id="localeResolver" 
                  class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
    <bean id="messageSource"
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        
    	<property name="basenames">
    		<list>
    			<!-- 패키지 locale에서 message.properties를 읽어들인다 -->
    			<value>classpath:locale/messages</value>
    		</list>
    	</property>
    	
    	<!-- 파일의 기본 인코딩 지정 -->
    	<property name="defaultEncoding" value="utf-8"/>
    	
    	<!-- properties 파일이 변경되었는지 확인하는 텀. value에 지정한다(여기서는 60초 간격) -->
    	<property name="cacheSeconds" value="60" />
	
	</bean>
</beans>

properties 파일

다국어 메시지들을 저장하기 위한 파일. 파일 위치는 아래 참조

1. messages.properties

site.title=\ud68c\uc6d0\uc815\ubcf4
site.name=\uc774\ub984
site.job=\uc9c1\uc5c5
name=\uAE40\uC790\uBC14
job=\uD504\uB85C\uADF8\uB798\uBA38\uAC00\uB418\uACE0\uC2F6\uC740\uD559\uC0DD
btn.send=\uc804\uc1a1
btn.cancel=\ucde8\uc18c
btn.finish=\uc885\ub8cc
  1. messages_ko.properties
site.title=\ud68c\uc6d0\uc815\ubcf4
site.name=\uc774\ub984
site.job=\uc9c1\uc5c5
name=\uAE40\uC790\uBC14
job=\uD504\uB85C\uADF8\uB798\uBA38\uAC00\uB418\uACE0\uC2F6\uC740\uD559\uC0DD
btn.send=\uc804\uc1a1
btn.cancel=\ucde8\uc18c
btn.finish=\uc885\ub8cc
  1. messages_en.properties
site.title=Member Info
site.name=name
site.job=job
name=hong kil-dong
job=student
btn.send=send
btn.cancel=cancel
btn.finish=finish

자바 파일

인터셉터를 구현할 클래스 파일을 준비

LocaleController.java

package com.spring.pro28.ex05;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller("localeController")
public class LocaleController {
   @RequestMapping(value="/test/locale.do", method={RequestMethod.GET})
   public String locale(HttpServletRequest request, HttpServletResponse response) 
                                                          throws Exception {
      System.out.println("localeController입니다.");
      return "locale";
   }
}

LocaleInterCeptor.java

스프링의 인터셉터 기능은 스프링에서 제공하는 HandlerInterceptorAdapter 클래스를 상속받거나 인터페이스인 HandlerInterceptor를 구현해서 사용한다. preHandle() 메서드는 컨트롤러를 실행하기 전에 호출되어 수행

package com.spring.pro28.ex05;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

// 사용자 정의 인터셉트는 반드시 저걸 상속 받아야 한다
public class LocaleInterceptor extends HandlerInterceptorAdapter{
	
	// 컨트롤러가 실행 전 호출 되는 곳
	@Override
	public boolean preHandle(HttpServletRequest request,
				HttpServletResponse response, Object handler) throws Exception {
		HttpSession session = request.getSession();
		
		// 브라우저에서 전달한 locale 정보를 가져오는 곳
		String locale = request.getParameter("locale");
		
		// 최초 요청시 locale을 한국어로 설정할 것
		if(locale == null) {
			locale="ko";
		}
		
		// Locale 속성 값을 세션에 저장해서 SessionLocalResolver가 사용될 수 있게 한다
		session.setAttribute("org.springframework.web.servlet.i18n.SessionLocaleResolver.LOCALE",new Locale(locale));
		
		return true;
	}
	
	// 컨트롤러가 실행 된 후 호출된다
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}
	
	// 뷰(jsp)를 수행한 후 호출된다
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	}
}

jsp 페이지

다국어 표시를 위한 태그

jsp 에서 다국어들을 표시하기 위해서는 스프링의 <spring:message> 태그를 이용한다
<spring:message code="properties의 키" text="기본값" />

locale.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	import="java.io.*" pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%  request.setCharacterEncoding("UTF-8"); %>    

<!-- spring:message 태그를 이용할 수 있도록 taglib 해주기 -->
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>


<!DOCTYPE html >
<html>
<head>
<meta charset="UTF-8">

<!-- spring:message 태그를 이용해서 code 속성에 프로퍼티 파일의 site.title 값을 주기 -->
<title><spring:message code="site.title" text="Member Info" /></title>

</head>
<body>

<!-- 한국어 요청하기 -->
<a href="${pageContext.request.contextPath }/test/locale.do?locale=ko">한국어</a>

<!-- 영어 요청하기 -->
<a href="${pageContext.request.contextPath }/test/locale.do?locale=en">ENGLISH</a> 
<h1><spring:message code="site.title" text="Member Info" /></h1>

<!-- 프로퍼티 site.name에 해당하는 값 표시하기 -->
<p><spring:message code="site.name" text="no name" /> : <spring:message code="name" text="no name" /></p>

<!-- 프로퍼이 name에 해당하는 값 표시하기 -->
<p><spring:message code="site.job" text="no job" />   : <spring:message code="job" text="no job" /></p>


<!-- spring:message 태그를 이용해 (code=)을 버튼 이름으로 하기 -->
<input type=button value="<spring:message code='btn.send' />" />
<input type=button value="<spring:message code='btn.cancel' />" />
<input type=button value="<spring:message code='btn.finish' />" />

</body>
</html>

실행

에러
WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/pro28/test/locale.do] in DispatcherServlet with name 'appServlet' ←이게 떠버렸고.. 해결이 안되고 있고..


0개의 댓글