springMVC源码分析--国际化实现Session和Cookie(二)

上一篇博客 springMVC源码分析--国际化LocaleResolver(一)中我们介绍了springMVC提供的国际化的解决方案,接下来我们根据springMVC提供的解决方案来简单的实现一个多语言的支持。

一、基于Session的国际化实现

基于Session的国际化实现其实说来也简单,就是在Session中保存语言信息Locale,这样springMVC会从我们提供的多语言配置文件中读取相关语言的信息。

(1)首先我们需要配置springMVC的多语言配置,因为我们打算使用Session来实现,所有对于localeResolver我们要配置其实现类SessionLocaleResolver,在springMVC的配置文件中添加如下配置:

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>

(2)这里我们提供了一个多语言拦截器LanguageInterceptor,通过这个拦截器设置多语言信息,其实主要的代码就是request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale),这样springMVC会根据Locale的信息来获得多语言。

 public class LanguageInterceptor implements HandlerInterceptor{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		String language = request.getParameter("language");
		if (language != null&&language.equals("zh")) {
			Locale locale = new Locale("zh", "CN");
			request.getSession()
					.setAttribute(
							SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
							locale);
			request.setAttribute("language", language);
		} else if (language != null&&language.equals("en")) {
			Locale locale = new Locale("en", "US");
			request.getSession()
					.setAttribute(
							SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
							locale);
			request.setAttribute("language", language);
		} else {
			request.getSession().setAttribute(
					SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,
					LocaleContextHolder.getLocale());
			language = LocaleContextHolder.getLocale().getLanguage();
			request.setAttribute("language", language);
		}
		return true;
	}
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	}

}

在springMVC的配置文件中配置拦截器

<mvc:interceptors>
	<!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 -->
	<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
	<bean class="com.tianjunwei.interceptor.LanguageInterceptor"></bean>
</mvc:interceptors>
在工程中添加多语言配置文件,在src/main/resources目录下新建messages目录,分别添加中英文的多语言配置文件message_en_US.properties和message_zh_CN.properties,文件中以key = value的形式保存多语言信息



运行结果图:



二、基于Cookie的国际化实现

与上面类似,我们首先创建一个拦截器用来将多语言信息写到Cookie中,这样就可以通过cookie来切换多语言了。

 public class LanguageCookieInterceptor implements HandlerInterceptor{

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		String language = request.getParameter("language");
		if (language != null&&language.equals("zh")) {
			Locale locale = new Locale("zh", "CN");
			(new CookieLocaleResolver()).setLocale (request, response, locale);
			request.setAttribute("language", language);
		} else if (language != null&&language.equals("en")) {
			Locale locale = new Locale("en", "US");
			(new CookieLocaleResolver()).setLocale (request, response, locale);
			request.setAttribute("language", language);
		} else {
			(new CookieLocaleResolver()).setLocale (request, response,
					LocaleContextHolder.getLocale());
			language = LocaleContextHolder.getLocale().getLanguage();
			request.setAttribute("language", language);
		}
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		
	}

}
springMVC的配置文件如下:

<mvc:interceptors>
	<!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 -->
	<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"/>
	<!-- <bean class="com.tianjunwei.interceptor.LanguageInterceptor"></bean> -->
	<bean class="com.tianjunwei.interceptor.LanguageCookieInterceptor"></bean>
</mvc:interceptors>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver"/>

这样我们也可以实现通过Session实现的效果。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
SpringMVCSpring 框架的一部分,主要用于构建 Web 应用程序。它采用了基于请求的模型,通过将请求映射到控制器类和处理方法来处理请求,并使用视图解析器来渲染响应。SpringMVC 的核心是 DispatcherServlet,它充当前端控制器,负责协调处理请求,并调用适当的处理器来处理请求。 下面是 SpringMVC源码分析: 1. DispatcherServlet:DispatcherServlet 是 SpringMVC 的核心类,它充当前端控制器,负责协调处理请求,并调用适当的处理器来处理请求。DispatcherServlet 的主要任务是将请求委托给适当的处理器来处理,然后将处理结果返回给客户端。 2. HandlerMapping:HandlerMapping 是一个接口,用于将请求映射到控制器类和处理方法。SpringMVC 提供了多种 HandlerMapping 实现,例如 BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping 和 RequestMappingHandlerMapping 等。 3. HandlerAdapter:HandlerAdapter 是一个接口,用于将请求委托给适当的处理器来处理。SpringMVC 提供了多种 HandlerAdapter 实现,例如 SimpleControllerHandlerAdapter、RequestMappingHandlerAdapter 和 HttpRequestHandlerAdapter 等。 4. HandlerInterceptor:HandlerInterceptor 是一个接口,用于在控制器执行之前或之后执行一些操作。SpringMVC 提供了多种 HandlerInterceptor 实现,例如 LocaleChangeInterceptor、ThemeChangeInterceptor 和 HandlerInterceptorAdapter 等。 5. ViewResolver:ViewResolver 是一个接口,用于将逻辑视图名称解析为实际的视图对象。SpringMVC 提供了多种 ViewResolver 实现,例如 InternalResourceViewResolver、FreeMarkerViewResolver 和 VelocityViewResolver 等。 6. HandlerExceptionResolver:HandlerExceptionResolver 是一个接口,用于处理控制器抛出的异常。SpringMVC 提供了多种 HandlerExceptionResolver 实现,例如 SimpleMappingExceptionResolver、AnnotationMethodHandlerExceptionResolver 和 DefaultHandlerExceptionResolver 等。 7. ModelAndView:ModelAndView 是一个类,用于封装控制器处理结果和逻辑视图名称。它包含一个模型对象和一个视图名称。 总之,SpringMVC源码分析需要深入了解 Spring Framework 的各个方面,包括 IoC 容器、AOP、Servlet API 等。同时,需要对 Web 应用程序的基本概念和架构有一定的了解。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值