Spring MVC基础知识整理➣国际化和异常处理
概述
Spring框架为WEB项目提供了国际化以及异常处理机制。所谓的国际化也就是不同国籍,显示不同国籍的语言与符号。异常处理,也就是能够捕获WEB项目下的所有异常信息,并能处理记录这些异常信息机制。
国际化
Spring对国际化的语言采用配置的方式存储到配置文件中,在springservletconfig.xml文件,添加下面语句:
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <!-- 国际化信息所在的文件名 --> <property name="basename" value="messages" /> <!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称 --> <property name="useCodeAsDefaultMessage" value="true" /> </bean>
Spring MVC国际化的方式,可以基于Session,也可以基于Cookie,这里主要基于Session完成国际化,在springservletconfig.xml添加下面拦截器配置
<mvc:interceptors> <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 --> <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" /> </mvc:interceptors> <!-- 基于session国际化--> <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
<!-- 基于Cookie国际化
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" />-->
在当前目录下添加如下文件,messages.properties、messages_zh_CN.properties、messages_en_US.properties三个文件,其中messages.properties、messages_zh_CN.properties;
messages_en_US.properties:
umoney=money
udate=date
messages_zh_CN.properties:
umoney=余额 udate=日期
Controller代码如下:
@RequestMapping("/cuser") public String ShowUser(HttpServletRequest request, HttpServletResponse response,Model model,
@RequestParam(value="langType", defaultValue="zh") String langType) { UserInfo Usermodel=new UserInfo(); SessionLang(request, langType); //CookieLang(request,response,langType); RequestContext Rq=new RequestContext(request); model.addAttribute("udate",Rq.getMessage("udate")); model.addAttribute("umoney",Rq.getMessage("umoney")); return "Fuser/cuser"; } /** * @Title: SessionLang * @Description: 基于session的国际化 * @param @param request * @param @param langType 设定文件 * @return void 返回类型 * @throws */ public void SessionLang(HttpServletRequest request,String langType) { if(langType.equals("zh")){ Locale locale = new Locale("zh", "CN"); request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale); } else if(langType.equals("en")){ Locale locale = new Locale("en", "US"); request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale); } else request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,LocaleContextHolder.getLocale()); } /** * @Title: CookieLang * @Description: 基于Cookie的国际化 * @param @param request * @param @param response * @param @param langType 设定文件 * @return void 返回类型 * @throws */ public void CookieLang(HttpServletRequest request,HttpServletResponse response,String langType) { Locale locale =null; if(langType.equals("zh")){ locale = new Locale("zh", "CN"); } else if(langType.equals("en")){ locale = new Locale("en", "US"); } else { locale=LocaleContextHolder.getLocale(); } (new CookieLocaleResolver()).setLocale (request, response, locale); }
前台JSP页面
<%@taglib prefix="spring" uri="http://www.springframework.org/tags" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a href="cuser?langType=zh">中文</a> | <a href="cuser?langType=en">英文</a><br/> 下面展示的是后台获取的国际化信息:<br/> ${umoney}<br/> ${udate}<br/> </body> </html>
异常处理
MVC Spring异常处理的方式有2种,一种是写个Class继承HandlerExceptionResolver,在配置文件中,添加Bean配置,另外一种方式,可以通过定义基类控制器,编写异常处理的公用方法,子类继承基类Controller即可。代码配置如下
编写基类Controller:
package justin.com.controllers; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.ExceptionHandler; public abstract class BaseController { @ExceptionHandler public String exception(HttpServletRequest request,Exception ex) { request.setAttribute("exceptionMessage", ex.getMessage()); return "error"; } }
子类继承BaseController
package justin.com.controllers; import javax.servlet.http.HttpServletRequest; import org.apache.catalina.connector.Request; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; @Controller @RequestMapping("/helloworld") public class HelloWorldController extends BaseController { @RequestMapping(value={"/*","/say"},method=RequestMethod.GET) public ModelAndView China() throws SQLException { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message", "Hello World!"); modelAndView.setViewName("HelloWorld/CIndex"); int Result=10/0; return modelAndView; } }
当打开该页面,页面自动跳转到错误Controller中,完成数据的异常捕获与显示。