springmvc国际化与服器端校验

前言:今天的内容分为三部分

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>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值