week_16_day01_SpringMVC02

入门案例 1

核心DispatcherServlet如何配置
HandlerMapping
HandlerAdapter
Handler

application.xml → DispatcherServlet启动的时候加载这个配置文件

  1. 引入依赖
    SpringMVC:spring-web、spring-webmvc、servlet-api(provided)
    week_16_day01_SpringMVC02

  2. 配置成idea中的标准web应用
    首先在pom.xml中写这句代码:
    week_16_day01_SpringMVC02
    先进webapp目录,webapp目录下新建WEB-INF目录。WEB-INF目录下新建web.xml。
    week_16_day01_SpringMVC02

  3. 配置DispatcherServlet
    week_16_day01_SpringMVC02
    我们之前说dispatchServlet会处理所有的请求,那么url-pattern这里是否要写/*呢?
    不写,应当写成/。
    dispatchServlet的/是经过特殊处理的,它不会去解析jsp、html相关的请求,除此之外所有的请求都进行拦截。

  4. 加载xml配置文件
    得加载Spring容器,注册组件,HandlerMapping、HandlerAdapter、Handler这些组件。
    要通过application.xml去加载容器。
    要在DispatcherServlet初始化的时候加载xml配置文件。
    而Servlet什么时候加载?在第一次我们访问url-pattern的时候。
    week_16_day01_SpringMVC02

  5. 注册组件
    HandlerMapping、HandlerAdapter、Handler这些组件
    week_16_day01_SpringMVC02
    我们需要把Handler作为一个组件注册在容器中,这个组件需要我们去实现。
    week_16_day01_SpringMVC02

  6. deploy应用
    week_16_day01_SpringMVC02

  7. 思考:这种方式ok不
    week_16_day01_SpringMVC02
    仔细看,这和JavaEE阶段的代码没啥区别,这样写和之前写Servlet一样笨重,不够灵活。


入门案例2

依然要配置成SpringMVC的web应用
依然要去注册组件HandlerMapping、HandlerAdapter
handler相关的组件发生了变化,handler不再以组件的形式存在了,而是以方法的形式存handler方法仍然是要和请求url建立映射关系

  1. 搭建成一个SpringMVC的web应用
    同上

  2. 配置SpringMVC容器中的组件
    RequestMapping
    RequestMappingHandlerMapping
    RequestMappingHandlerAdapter
    不用去写bean标签注册
    week_16_day01_SpringMVC02
    week_16_day01_SpringMVC02
    这一行代码能够注册必需的组件。

  3. 注册controller组件
    handler方法在controller组件中存在
    业务:访问/hello → songge niupi ligenli daqi
    handler方法中返回的ModelAndView → viewName:hello.jsp → content:ligenli daqi
    week_16_day01_SpringMVC02
    handler方法可以单独的和url映射起来,这就是一个解耦操作,我们可以在这个类中处理很多个请求。而不是像案例一,一个类只能处理一个请求。


接下来的内容都是围绕handler展开的

一、@RequestMapping注解

  1. URL路径映射(最常用
    就是通过@RequestMapping注解的value属性将handler方法和请求url建立映射关系。
    入门案例2其实已经做过这样的事情了

补充:将多个请求url映射到同一个handler方法上
方法一:
week_16_day01_SpringMVC02
value接收的是一个字符串数组,它可以接收多个url。

方法二:可以使用*来通配
*可以代替一个单词或一个单词的一部分
week_16_day01_SpringMVC02
接下来redeploy一下,在写JavaEE项目的时候,只需要更新一下class就好了,这次为什么的redeploy呢?
我们是把UrlMappingController作为容器中的组件,加载application.xml配置文件的时候,其实通过init-param就初始化了容器,容器中是单例,也就是说容器初始化的时候,组件生命周期就开始了,才注册了组件,所以不能通过更新class去更新代码。week_16_day01_SpringMVC02


二、窄化请求映射
比如 user相关的请求(handler方法),都放在UserController这个组件中
对应的请求url都是和user相关的
user/insert、user/delete、user/update
之前都是写在handler方法的@RequestMapping注解的value中,能否把user提取出来,只写insert、delete、update呢?
week_16_day01_SpringMVC02
常见错误:
week_16_day01_SpringMVC02
@Controller做的是组件注册,@RequestMapping做的才是窄化请求。


三、请求方法限定 (405)
请求方法即:RequestMethod → get、post 这些
在@RequestMapping注解这个增加method属性
week_16_day01_SpringMVC02
当请求方法和限定方法不一致:
限定的方法是post,也就是说get方法不允许。
week_16_day01_SpringMVC02
限定多个请求方法(or)
week_16_day01_SpringMVC02
3.1.3.3引申的注解
@GetMapping → @RequestMapping(method=GET)
@PostMapping→ @RequestMapping(method=POST)

@PostMapping和@RequestMapping源码:
week_16_day01_SpringMVC02
week_16_day01_SpringMVC02


四、请求参数限定
week_16_day01_SpringMVC02
仍然是在@RequestMapping的注解中写param属性
week_16_day01_SpringMVC02


五、请求header限定

这就是请求头:
week_16_day01_SpringMVC02

  1. 通用限定
    @RequestMapping headers属性
    week_16_day01_SpringMVC02
    week_16_day01_SpringMVC02
  2. 特殊的限定
    a. produces → Accept(406)
    Accept是浏览器接收的正文的类型。
    week_16_day01_SpringMVC02
    week_16_day01_SpringMVC02
    b. consumes → Content-Type(415)
    Content-Type是发送的正文的类型。
    week_16_day01_SpringMVC02
    week_16_day01_SpringMVC02

handler的返回值

  1. 处理视图层

a. void
如何配置model参数,如何设置视图view
使用request和response(其实就相当于之前的doGet和doPost方法)
这个并不建议使用,这相当于开历史的倒车,我们又去使用底层的request和response方法了。
week_16_day01_SpringMVC02
b. ModelAndView
week_16_day01_SpringMVC02
c. String
返回这个字符串的含义是什么?

(1). 物理视图名
→ viewName
我们的model怎么办? → model放入handler方法的形参,传入的是接口Model。
week_16_day01_SpringMVC02
Model的addAttribute方法和前面写的ModelAndView类的addObject方法是一样的。

(2). 逻辑视图名
何为逻辑视图名?
物理视图名中我们写了一个"/WEB-INF/view/string.jsp"这样的返回值,我们的返回值不想写这么多,只想写一个string(/WEB-INF/view/string.jsp中的string),这时候可以使用逻辑视图名。

需要去配置组件:viewResolver
week_16_day01_SpringMVC02
week_16_day01_SpringMVC02
那么配置了视图解析器viewResolver,有何影响
modelAndView中viewName会拼接
week_16_day01_SpringMVC02
在上面物理视图名的案例中返回值也会受影响 → 也就是所有的返回值为字符串都会做一个拼接
week_16_day01_SpringMVC02


看到的是网页源代码。选择preview就会显示的和浏览器中一样
不写的话就是啥请求都可以接收