首页 > 代码库 > Spring MVC基础知识整理?国际化和异常处理

Spring MVC基础知识整理?国际化和异常处理

概述

   Spring框架为WEB项目提供了国际化以及异常处理机制。所谓的国际化也就是不同国籍,显示不同国籍的语言与符号。异常处理,也就是能够捕获WEB项目下的所有异常信息,并能处理记录这些异常信息机制。

国际化

  Spring对国际化的语言采用配置的方式存储到配置文件中,在springservletconfig.xml文件,添加下面语句:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">    <!-- 国际化信息所在的文件名 -->                         <property name="basename" value=http://www.mamicode.com/"messages" />       <!-- 如果在国际化资源文件中找不到对应代码的信息,就用这个代码作为名称  -->                   <property name="useCodeAsDefaultMessage" value=http://www.mamicode.com/"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=moneyudate=date

messages_zh_CN.properties:

umoney=余额udate=日期

Controller代码如下:

    @RequestMapping("/cuser")    public String ShowUser(HttpServletRequest request, HttpServletResponse response,Model model,
              @RequestParam(value=http://www.mamicode.com/"langType", defaultValue=http://www.mamicode.com/"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=http://www.mamicode.com/"cuser?langType=zh">中文</a> | <a href=http://www.mamicode.com/"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中,完成数据的异常捕获与显示。

 

  

Spring MVC基础知识整理?国际化和异常处理