前言:今天的内容分为三部分
1.JAVA国际化与格式化
2.springMVC国际化与格式化
3.服务器端校验JSR303
首先介绍——JAVA国际化与格式化
国际化是指应用程序运行时,可根据客户端请求来自的国家语言的不同而现实不同的界面。
国际化的英文单词是:internationalization,所以简称 I18N,18表示中间省略了18个字母。
1.国际化(internationalization)
简称i18n,是一种让软件在开发阶段就支持多种语言的技术
2.java.util.Locale
语言代码_国家代码
注:国家代码可省略 zh_CN (中国) en_US (美国)
@Test
public void testLocale(){
//zh_CN en_US 语言代码_国家代码
Locale locale = Locale.getDefault();//Locale用来封装国家语言 得到本地区域语言的信息
System.out.println(locale);
Locale l2 = Locale.US;
System.out.println(l2);
String[] countries = Locale.getISOCountries(); //得到所有的国家
System.out.println(countries.length); //250个国家
String[] langs = Locale.getISOLanguages(); //得到语言
System.out.println(langs.length); //188种语言
}
3.创建资源文件
添加资源文件 ---resources文件夹创建 i18n_zh_CN.properties 和 i18n_en_US.properties
资源文件就是 key-value 对,每个资源文件中的 key 是不变的,但是value 随着不同的国家语言而改变;
idea中注意设置,否则可能出现乱码
创建好资源文件后,打开源码,有乱码的话语言修改编码
4.java.util.ResourceBundle用于加载国家、语言资源包5
public static void main(String[] args) {
// Locale locale = Locale.getDefault();
Locale locale = Locale.US;
ResourceBundle message = ResourceBundle.getBundle("i18n",locale);
System.out.println(message.getString("user.username"));
}
5.java.text.MessageFormat处理资源文件中的占位符
@Test
public void test2(){
//1.Locale用于封装特定的国家/区域、语言环境
// Locale locale = Locale.getDefault(); //得到本地区域语言的信息
Locale locale = Locale.US; //得到美国区域语言的信息
//2.ResourceBundle根据你的语言地区环境(Locale)来加载国家、语言资源包
ResourceBundle message = ResourceBundle.getBundle("i18n",locale);//i18n是资源文件的主文件名 locale根据本地的信息加载响应的资源文件
String userName = message.getString("user.username");
System.out.println(message.getString("user.username"));
String hello = message.getString("hello");
//3.MessageFormat处理资源文件中的占位符
String helloStr = MessageFormat.format(hello,userName); //资源文件hello只有一个占位符,所以只要传一个值
System.out.println(helloStr);
}
springMVC国际化与格式化
1.修改springMVC.xml,加载资源文件
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 国际化信息所在的文件名 -->
<property name="basename" value="i18n" />
</bean>
2.jsp页面(是用Controller跳转到jsp页面的)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!--导入标签库-->
<%@taglib prefix="s" uri="http://www.springframework.org/tags" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--国际化输出-->
hello:<s:message code="author"/>
</body>
</html>
3.controller中添加跳转到jsp页面的方法
Controller页面跳转到jsp
基于session实现
1.在原有配置基础上,在springMVC.xml中添加以下配置(SessionLocaleResolver)
<!--拦截器 以后装配所有拦截器都是在<mvc:interceptors>里面-->
<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" />
2.创建Controller
@RequestMapping("/change")
public String change(String lang, HttpSession session){
Locale locale;
if(lang.equals("en")){ //创建locale对象
locale= Locale.US;
}else{
locale= Locale.CHINA;
}
session.setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,locale);
return "i18n/demo3";
}
3.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!--导入spring标签库-->
<%@taglib prefix="s" uri="http://www.springframework.org/tags" %>
<html>
<head>
<title>Title</title>
</head>
<body>
change
<a href="../i18n/change?lang=en">english</a>|<a href="../i18n/change?lang=zh">中文</a><br>
国际化:<s:message code="user.username"/>
</body>
</html>
LocaleResolver
注:有四种解析方式,我们列举SessionLocaleResolver(按会话属性解析区域)
1. 按HTTP请求头部解析区域
Spring采用的默认区域解析器是AcceptHeaderLocaleResolver。它通过检验HTTP请求的accept-language头部来解析区域。这个头部是由用户的web浏览器根据底层操作系统的区域设置进行设定。请注意,这个区域解析器无法改变用户的区域,因为它无法修改用户操作系统的区域设置。
2. 按会话属性解析区域
解析区域的另一种方法是通过SessionLocaleResolver。它通过检验用户会话中预置的属性来解析区域。如果该会话属性不存在,它会根据accept-language HTTP头部确定默认区域。
3. 按Cookie解析区域
可以检验用户浏览器中的Cookie,用CookieLocaleResolver来解析区域。如果Cookie不存在,它会根据accept-language HTTP头部确定默认区域。
4. FixedLocaleResolver
一直使用固定的Local, 改变Local 是不支持的 。
数据验证框架-JSR 303
B/S系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务端校验是不可缺少的,本节主要学习springmvc实现控制层添加校验。
Spring支持JSR-303验证框架,JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator(与Hibernate ORM 没有关系),JSR 303 用于对Java Bean 中的字段的值进行验证。
1.POM.XML
<!--hibernate validator-->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.6.Final</version>
</dependency>
2.添加验证规则
public class ValidatorPojo{
@NotNull(message = "不能为空")
private Integer id;
@Length(min = 6,message="最小长度为6")
private String name;
//..省略get/set方法..
}
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式@Length: 最小长度最大长度(hibernate)
3.捕获错误
@RequestMapping("/demo/toedit")
public String toedit(@Validated DemoPojo item, BindingResult result){
return "demo_edit";
}
@RequestMapping("/demo/edit")
public String edit(@Validated @ModelAttribute("item") DemoPojo item, BindingResult result, Model model){
if(result.hasErrors()){
List<FieldError> list = result.getFieldErrors();
Map<String,String> map = new HashMap<>();
for (FieldError error : list){
map.put(error.getField(),error.getDefaultMessage());
}
model.addAttribute("errors",map);
return "demo_edit";
}
return "redirect:hello";
}
1. 添加@Validated表示在对item参数绑定时进行校验,校验信息写入BindingResult中,在要校验的pojo后边添加BingdingResult, 一个BindingResult对应一个pojo,且BingdingResult放在pojo的后边
2.显示错误消息
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<html>
<body>
<form action="edit">
<p>编号<sf:input name="id"/>${errors.id}</p>
<p>名称<input type="text" name="name" value="${item.name}"/>${errors.name}</p>
<p><input type="submit" value="保存"/></p>
</form>
</body>
</html>
SSM整合
1. 修改web.xml文件
<!-- Spring配置 spring容器,dao,service层-->
<!-- 当系统启动的时候,spring需要进行一些资源加载或者配置,都需要使用此监听去做 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- spring容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>