zoukankan      html  css  js  c++  java
  • Spring中的国际化资源以及视图跳转

    一、SpringMVC对国际化的支持
    SpringMVC进行资源国际化主要是通过ResourceBundleMessageSource实现的,xml如下配置:
    <bean id="messageSource"
            class="org.springframework.context.support.ResourceBundleMessageSource">
            <property name="basename" value="i18n"></property>  
    </bean>
    

    资源文件如下:
    i18n.properties:
    i18n.username=Username
    i18n.password=Password
    i18n_zh_CN.properties:
    i18n.username=u7528u6237u540D(用户名)
    i18n.password=u5BC6u7801(密码)
    i18n_en_US.properties:
    i18n.username=Username
    i18n.password=Password
    测试页面如下
    <!--   加载的为i18n_zh_CN.properties 与语言无关  -->
        <fmt:bundle basename="i18n_zh_CN" prefix="i18n.">
            <fmt:message key="username"></fmt:message>
        </fmt:bundle>
    
    
        <!--  资源国际化 --> 
        <br><br>
        <fmt:message key="i18n.username"></fmt:message>
        <br><br>
    
    
        <fmt:message key="i18n.password" ></fmt:message>
        <br><br>

    这样的话,当SpringMVC检测到语言为en时,页面显示将为英文;当语言为zh时,页面显示将为中文。


    二、SpringMVC处理转发和重定向
    spring控制器返回最后一个ModelAndView时,其中的urName可以是一个视图名称,这样视图解析器负责解析后将响应流写回客户端。也可以通过return redirect/forward:url方式转到另一个控制器进行处理。
    redirect代表重定向,若使用 return “redirect:/hello”; 浏览器的地址栏会变为*****/hello。
    而forward表示转发,若SpringMVC处理函数使用 return “forward:/hello”;形式的语句,浏览器的地址栏不会变,但是有新的视图返回来。

    1、redirect方式
    return redirect:url相当于”response.sendRedirect()”。采用这种方式浏览器地址栏最后显示的路径是重定向后的新的路径。
    具体流程如下:服务器端会首先发一个response给浏览器, 然后浏览器收到这个response后再发一个requeset给服务器, 然后服务器发新的response给浏览器。这时页面收到的request是一个新的从浏览器发来的请求。这种方式的结果是:
    (1)在重定向前后有两个不同的request对象,重定向前后的两个控制器在request上的参数(request.getParameter())和request属性(request.getAttribute())不能共享;
    (2)如果重定向前后的两个控制器都配置在spring 拦截器范围内,这样拦截器会拦截前后两个request,即会拦截两次;
    (3)最后返回到浏览器后,因为地址栏显示的是重定向后的url,所以刷新页面时只会执行后面的url映射的控制器。
    示例:
    JSP 页面:
    <a href="springmvc/testRedirect">Test Redirect</a>
    控制器代码:
    //方法所在的类被@RequestMapping("/springmvc")所修饰
        @RequestMapping("/testRedirect")
        public String testRedirect(){
            System.out.println("testRedirect");
            return "redirect:/index2.jsp";//这里的'/'表示相对于项目根目录
        }
    这样映射的页面将会在index2.jsp,并且url将是 项目根目录/index2.jsp。也就是说这会忽略在类上修饰的@RequestMapping。
    若改为return "redirect:index2.jsp";,则url将是 项目根目录/springmvc/index2.jsp,这时类上修饰的@RequestMapping也会起作用。

    2、forward方式:
    return forward:url相当于request.getRequestDispatcher().forward(request,response),这种方式的外部特征是浏览器地址显示的路径是转发前的路径。工作方式如下:forward 发生在服务器内部,在前一个控制器处理完毕后,直接进入下一个控制器处理, 并将转发后的控制器的response发给浏览器。这种方式的结果是:
    (1)转发前后是同一个request,后一个控制器可共享前一个控制器的参数与属性;
    (2)因为是同一个request,拦截器只会拦截前一个url,如果前一个url在映射时未配置到拦截器拦截,则拦截后一个url,即只拦截一次;
    (3)最后返回到浏览器后,因为地址栏显示的是转发前的url,所以刷新页面时会依次执行前后两个控制器。
    示例:
    index.jsp 页面
    <a href="springmvc/testForward">Test Redirect</a>
    控制器代码:
    //方法所在的类被@RequestMapping("/springmvc")所修饰
        @RequestMapping("/testForward")
        public String testForward(){
            System.out.println("testForward");
            return "forward:/index2.jsp";
        }

    这样当我们点击浏览器链接,虽然页面URL没有变化,但是页面已经是index2.jsp的内容。


  • 相关阅读:
    initctl 创建自己的JOB
    TortoiseXX 与TotalCommander (TC)的图标问题
    eclipse 与 tomcat 的那些路径
    把函数视为对象
    序列增量赋值的一个谜题: +=
    __new__ 和 __init__ 的区别
    Python 中 is 与 == 区别
    Flask 2.0.1 changes
    flask run 与 DispatcherMiddleware 不兼容处理
    waitress 部署 flask服务
  • 原文地址:https://www.cnblogs.com/kangsir/p/6653208.html
Copyright © 2011-2022 走看看