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中,完成数据的异常捕获与显示。

 

  

posted @ 2017-04-01 09:05  jiajinhao  阅读(998)  评论(0编辑  收藏  举报