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>
파일 위치는 이렇다
다국어 기능과 관련된 빈 + 메시지 파일을 읽어들이는 곳이다
<?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>
다국어 메시지들을 저장하기 위한 파일. 파일 위치는 아래 참조
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
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
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
인터셉터를 구현할 클래스 파일을 준비
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";
}
}
스프링의 인터셉터 기능은 스프링에서 제공하는 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 에서 다국어들을 표시하기 위해서는 스프링의 <spring:message>
태그를 이용한다
<spring:message code="properties의 키" text="기본값" />
<%@ 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'
←이게 떠버렸고.. 해결이 안되고 있고..