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=\u7528\u6237\u540D(用户名)
i18n.password=\u5BC6\u7801(密码)
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的内容。
Spring中的国际化资源以及视图跳转的更多相关文章
- idea中springboot静态资源及页面跳转问题
1,静态资源放在resources/static下,html页面放在resources/templates下 2,在html中引入静态资源时,不用带static(对于路径来说是透明的) 3, 配置ht ...
- Spring 中的国际化Message的简单例子(ApplicationContext) 不跟框架集成的版本
首先,建立一个描述message的XML文件,名为messages.xml <?xml version="1.0" encoding="UTF-8" ...
- Spring中Resource(资源)的获取
1.通过Resource接口获取资源 Resource接口的实现类有: Resource接口继承了InputStreamSource 接口,InputStreamSource 接口中有一个方法:get ...
- Spring 中拦截器与过滤器的区别
spring 中拦截器 与servlet 的filter 有相似之处.比如二者都是aop 编程思想的体现都能实现权限检查,日志记录等. 不同之处 使用范围不同 Filter 是Servlet 规定的. ...
- Spring官网阅读(十七)Spring中的数据校验
文章目录 Java中的数据校验 Bean Validation(JSR 380) 使用示例 Spring对Bean Validation的支持 Spring中的Validator 接口定义 UML类图 ...
- Spring的国际化资源messageSource
Spring中可以使用两个类加载资源文件:ReloadableResourceBundleMessageSource和ResourceBundleMessageSource. 可配置如下message ...
- Spring MVC资源绑定视图解析器
ResourceBundleViewResolver使用属性文件中定义的视图bean来解析视图名称. 以下示例显示如何使用Spring Web MVC框架中的ResourceBundleViewRes ...
- 一个简单的示例在spring boot中实现国际化
最近在网上找了一个有关账单管理的spring boot项目,其中有一部分是涉及显示国际化信息的,即将页面上的中英文进行转换.因为在这之前这部分内容没有接触过,所以在这记录下过程. 中文效果图如下所示: ...
- IOS中在自定义控件(非视图控制器)的视图跳转中 代理方法与代码块的比较
//代码块与代替代理的设计方法 我就以在自定义视图中(非视图控制器,不能实现视图控制功能),通过代理和代码块两种方法分别实现视图的跳转,进行对比 首先自定义了一个视图,上面有一个已经注册了得BUtto ...
随机推荐
- 容器窗口 <QTabWidget>
////////////////////////////////////////// #include "test9_2a.h" #include "M_win.h&qu ...
- zabbix agent监控主机配置
zabbix agent监控主机配置 环境说明 系统版本 CentOS 7.2 x86_64 软件版本 zabbix 3.0.18 1.监控zabbix服务器端 1.1 安装zabbi ...
- Java基础- super 和 this 解析
1. superkeyword表示超(父)类的意思.this变量代表对象本身. 2. super訪问父类被子类隐藏的变量或覆盖的方法.当前类假设是从超类继承而来的,当调用super.XX()就是调用基 ...
- Datatable和实体还有实体集List的差别与转化
机房收费系统大家想必不是做完.就是已经在手上了,在一開始做的时候就明白规定.我们必须用实体.而不能使Datatable,由于说是Datatable直接面向了数据库,当时不是非常明白,于是也没有再深究, ...
- Laravel之备忘项(不定期更新)
1.自定义字段验证错误信息 $this->validate($request, ['name' => 'required|max:50'], ['name.required' => ...
- 【Excle数据透视表】如何在Excle中使用数据鼠标拖放
数据透视表建立好之后,我们有时候需要改动数据透视表,那么直接可以对字段进行拖拽就可以改变,这样使数据透视变得比较方便使用 原始样式 拖拽后样式 步骤 右键数据透视表任意单元格→数据透视表选项→显示→经 ...
- IIS7 经典模式和集成模式的区别分析
IIS7.0中的Web应用程序有两种配置模式:经典模式和集成模式.两者区别大家可以参考下,根据实际情况选用. 经典模式是为了与之前的版本兼容,使用ISAPI扩展来调用ASP.NET运行库,原先运行于I ...
- Linux的IO栈
- hdu 4112 Break the Chocolate(乱搞题)
题意:要把一块n*m*k的巧克力分成1*1*1的单元,有两种操作方式:1,用手掰(假设力量无穷大),每次拿起一块,掰成两块小的:2,用刀切(假设刀无限长),可以把多块摆在一起,同时切开.问两种方式各需 ...
- Unity3d多人在线教程
[转载]Unity3d多人在线教程 (2013-02-25 16:02:49) 转载▼ 标签: 转载 原文地址:Unity3d多人在线教程作者:lsy0031 Unity 多个玩家开发教程 Uni ...