week16_day04_SpringMVC05

Locale处理
对应语言信息,方便 i18n国际化

  1. 注册一个组件localeResolver
    如果Locale放在cookie中就选择CookieLocaleResolver,如果放在session中就选择SessionLocaleResolver。
    week16_day04_SpringMVC05_第1张图片
  2. 使用
    HelloController :
package com.cskaoyan.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Locale;

@RestController
public class HelloController {
     

    @RequestMapping("hello")
    //Locale作为参数传入即可
    public String hello(Locale locale){
     
        System.out.println(locale);
        return "OK";
    }
}

week16_day04_SpringMVC05_第2张图片
前端可以从控制台修改Locale信息。


MessageSource
Locale和MessageSource合起来可以做国际化
MessageSource做的事情,是通过key从配置文件中取出值,利用MessageSource组件

  1. 注册MessageSource组件
    week16_day04_SpringMVC05_第3张图片
    //如果配置文件中有中文,编码要写的和你配置文件的编码一致。
    在setting中可以查看编码格式。
    week16_day04_SpringMVC05_第4张图片
    或者File—>Other settings—>setting for New projects
    week16_day04_SpringMVC05_第5张图片
    //如果没有对应的key,是否选择key作为对应的value
    比如配置文件中没有userz.password(key)这个key,就可以使userz.password(key)的value为userz.password。

  2. 使用
    通过key从配置文件中取出对应值
    week16_day04_SpringMVC05_第6张图片
    访问:http://localhost:8080/hello/username
    week16_day04_SpringMVC05_第7张图片


利用MessageSource和localeResolver来做i18n国际化
week16_day04_SpringMVC05_第8张图片
week16_day04_SpringMVC05_第9张图片

  1. 注册LocaleResolver组件
    在这里插入图片描述
  2. 使用Locale
    week16_day04_SpringMVC05_第10张图片
  3. 创建国际化的message配置文件
    week16_day04_SpringMVC05_第11张图片
    相同的key对应不同的message
    week16_day04_SpringMVC05_第12张图片
  4. 使用国际化获取message
    week16_day04_SpringMVC05_第13张图片
    week16_day04_SpringMVC05_第14张图片

MseeageSource接口中的getMessage()方法
在这里插入图片描述
参数var2数组类似于Jdbc中的PreparedStatement,按照占位符做赋值。
week16_day04_SpringMVC05_第15张图片
测试结果:
week16_day04_SpringMVC05_第16张图片


Hibernate-Validator

用处:参数校验

之前是在service、dao或者controller层做的参数校验。类似这种:
if(username .length > 6)
if(age > 100)
if(password != “niupi”)

Hibernate-Validator将校验逻辑,绑定在javabean上,校验javabean的成员变量,其中Javabean是作为handler方法的形参来使用。.

register(User user)

入门案例

  1. 导包
    导入hibernate-validator
    hibernate-validator的版本比spring的版本多1
    week16_day04_SpringMVC05_第17张图片
  2. 注册组件
    在这里插入图片描述
  3. 使用
    限定username和password 长度为6~8
    限定age小于150
    限定married为false
    week16_day04_SpringMVC05_第18张图片
  4. 测试
    week16_day04_SpringMVC05_第19张图片

拿到错误的参数去做个性化的处理
需要拿到错误的参数,在handler方法中增加一个参数bindingResult,拿到校验过程的结果
在这里插入图片描述
week16_day04_SpringMVC05_第20张图片


@size、@Min、@Max、@AssertFalse这些注解中都有默认的message信息的。
在这里插入图片描述
我们也可以修改默认的message
week16_day04_SpringMVC05_第21张图片
week16_day04_SpringMVC05_第22张图片
前端就可以拿到这样的json数据,然后可以在前端页面告诉用户发生错误的信息。


message也可以去做国际化

  1. 组件注册
    week16_day04_SpringMVC05_第23张图片
  2. 使用MessageSource中的key
    week16_day04_SpringMVC05_第24张图片

常见的注解:
week16_day04_SpringMVC05_第25张图片


整合spring和springmvc

  1. Spring容器和SpringMVC容器的分家
    week16_day04_SpringMVC05_第26张图片
    容器中有这些组件,可以使用@Controller或@Service等注解将这些组件注册到容器中。
    SpringMVC通过dispatcherServlet加载配置文件中的信息。在第一次访问url的时候才开始加载。

如何把这些加载项前置呢?
比如我们只想让controller组件在第一次访问url的时候加载,而controller依赖的组件如:service、dao、dataSource、tx这样的组件可以提前完成加载。

把controller组件之外的组件单独放到一个容器中,controller组件单独放到另一个容器中。

父容器子容器类比父类与子类,子类可以调用父类的方法,父类不可以调用子类的方法。
子容器依赖父容器的组件,父容器不依赖子容器的组件。


  1. 在web.xml中加载配置文件
    week16_day04_SpringMVC05_第27张图片

如果spring配置文件和springMVC配置文件的扫描包都是com.cskaoyan,controller组件就会发生重复注册的情况。

如何判断一个组件是否完成注册?
利用生命周期进行判断。生命周期最开始会调用实例化,实例化通常都是通过无参构造方法来做的,我们可以重写controller的无参构造方法来看。

package com.cskaoyan.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
     

    @RequestMapping("hello")
    public String hello(){
     
        System.out.println("hello");
        return "hello";
    }

    public HelloController() {
     
        System.out.println("hello controller init");
    }
}

访问http://localhost:8080/hello,运行结果:
week16_day04_SpringMVC05_第28张图片
在这里插入图片描述
说明controller组件确实发生了重复注册的情况。
week16_day04_SpringMVC05_第29张图片
那么就需要把controller组件从spring容器中移除。

  1. Spring配置文件
    在这里插入图片描述

  2. SpringMvc配置文件
    在这里插入图片描述
    或者
    在这里插入图片描述
    week16_day04_SpringMVC05_第30张图片


使用javaconfig来使用springmvc

spring容器和springMVC容器是分开的
spring容器 → 配置类
springmvc容器 → 配置类

web.xml → 启动类
application.xml → 配置类
application-mvc.xml → 配置类
这些配置文件都可以变成java代码的形式。

前后端分离的话,我们后端主要用到的是json数据,就不去写jsp,也就不创建webapp目录了。

  1. 替代web.xml的启动类
    week16_day04_SpringMVC05_第31张图片

  2. Spring配置类
    week16_day04_SpringMVC05_第32张图片

  3. SpringMVC配置类
    week16_day04_SpringMVC05_第33张图片


增加了@Configuration注解后,本身的配置类也是一个组件。
这样就会导致一个问题:WebConfiguration就在SpringConfiguration的扫描范围内。

mvc配置类在spring配置类扫描包范围内
把springMVC的配置类从spring配置类的扫描范围内去除掉。
week16_day04_SpringMVC05_第34张图片


SpringMVC的组件使用javaconfig怎么使用

  1. characterEncodingFilter
    web.xml → AACDSI
    week16_day04_SpringMVC05_第35张图片

  2. mvc:resources静态资源映射

    week16_day04_SpringMVC05_第36张图片

  3. mvc:interceptors interceptor过滤器
    在这里插入图片描述
    指定对哪些url进行过滤

  4. converter(复杂)

    做一个外科 → 心脏搭桥 → 把心脏取出、搭桥、放回去
    三步走:
    1、拿到conversionService
    2、增加上我们定义的converter
    3、conversionService放回去
    week16_day04_SpringMVC05_第37张图片

  5. multipartResolver

bean id=”指定id” class/>

在这里插入图片描述
6. localeResolver
week16_day04_SpringMVC05_第38张图片
7. MessageSource
week16_day04_SpringMVC05_第39张图片
8. validator

week16_day04_SpringMVC05_第40张图片
9. viewResolver
week16_day04_SpringMVC05_第41张图片
10. HandlerExceptionResolver
week16_day04_SpringMVC05_第42张图片


你可能感兴趣的:(Spring)