week_16_day01_SpringMVC02
入门案例 1
核心DispatcherServlet如何配置
HandlerMapping
HandlerAdapter
Handler
application.xml → DispatcherServlet启动的时候加载这个配置文件
-
引入依赖
SpringMVC:spring-web、spring-webmvc、servlet-api(provided) -
配置成idea中的标准web应用
首先在pom.xml中写这句代码:
先进webapp目录,webapp目录下新建WEB-INF目录。WEB-INF目录下新建web.xml。 -
配置DispatcherServlet
我们之前说dispatchServlet会处理所有的请求,那么url-pattern这里是否要写/*呢?
不写,应当写成/。
dispatchServlet的/是经过特殊处理的,它不会去解析jsp、html相关的请求,除此之外所有的请求都进行拦截。 -
加载xml配置文件
得加载Spring容器,注册组件,HandlerMapping、HandlerAdapter、Handler这些组件。
要通过application.xml去加载容器。
要在DispatcherServlet初始化的时候加载xml配置文件。
而Servlet什么时候加载?在第一次我们访问url-pattern的时候。 -
注册组件
HandlerMapping、HandlerAdapter、Handler这些组件
我们需要把Handler作为一个组件注册在容器中,这个组件需要我们去实现。 -
deploy应用
-
思考:这种方式ok不
仔细看,这和JavaEE阶段的代码没啥区别,这样写和之前写Servlet一样笨重,不够灵活。
入门案例2
依然要配置成SpringMVC的web应用
依然要去注册组件HandlerMapping、HandlerAdapter
handler相关的组件发生了变化,handler不再以组件的形式存在了,而是以方法的形式存,handler方法仍然是要和请求url建立映射关系
-
搭建成一个SpringMVC的web应用
同上 -
配置SpringMVC容器中的组件
RequestMapping
RequestMappingHandlerMapping
RequestMappingHandlerAdapter
不用去写bean标签注册
这一行代码能够注册必需的组件。 -
注册controller组件
handler方法在controller组件中存在
业务:访问/hello → songge niupi ligenli daqi
handler方法中返回的ModelAndView → viewName:hello.jsp → content:ligenli daqi
handler方法可以单独的和url映射起来,这就是一个解耦操作,我们可以在这个类中处理很多个请求。而不是像案例一,一个类只能处理一个请求。
接下来的内容都是围绕handler展开的
一、@RequestMapping注解
- URL路径映射(最常用)
就是通过@RequestMapping注解的value属性将handler方法和请求url建立映射关系。
入门案例2其实已经做过这样的事情了
补充:将多个请求url映射到同一个handler方法上
方法一:
value接收的是一个字符串数组,它可以接收多个url。
方法二:可以使用*来通配
*可以代替一个单词或一个单词的一部分
接下来redeploy一下,在写JavaEE项目的时候,只需要更新一下class就好了,这次为什么的redeploy呢?
我们是把UrlMappingController作为容器中的组件,加载application.xml配置文件的时候,其实通过init-param就初始化了容器,容器中是单例,也就是说容器初始化的时候,组件生命周期就开始了,才注册了组件,所以不能通过更新class去更新代码。
二、窄化请求映射
比如 user相关的请求(handler方法),都放在UserController这个组件中
对应的请求url都是和user相关的
user/insert、user/delete、user/update
之前都是写在handler方法的@RequestMapping注解的value中,能否把user提取出来,只写insert、delete、update呢?
常见错误:
@Controller做的是组件注册,@RequestMapping做的才是窄化请求。
三、请求方法限定 (405)
请求方法即:RequestMethod → get、post 这些
在@RequestMapping注解这个增加method属性
当请求方法和限定方法不一致:
限定的方法是post,也就是说get方法不允许。
限定多个请求方法(or)
3.1.3.3引申的注解
@GetMapping → @RequestMapping(method=GET)
@PostMapping→ @RequestMapping(method=POST)
@PostMapping和@RequestMapping源码:
四、请求参数限定
仍然是在@RequestMapping的注解中写param属性
五、请求header限定
这就是请求头:
- 通用限定
@RequestMapping headers属性 - 特殊的限定
a. produces → Accept(406)
Accept是浏览器接收的正文的类型。
b. consumes → Content-Type(415)
Content-Type是发送的正文的类型。
handler的返回值
- 处理视图层
a. void
如何配置model参数,如何设置视图view
使用request和response(其实就相当于之前的doGet和doPost方法)
这个并不建议使用,这相当于开历史的倒车,我们又去使用底层的request和response方法了。
b. ModelAndView
c. String
返回这个字符串的含义是什么?
(1). 物理视图名
→ viewName
我们的model怎么办? → model放入handler方法的形参,传入的是接口Model。
Model的addAttribute方法和前面写的ModelAndView类的addObject方法是一样的。
(2). 逻辑视图名
何为逻辑视图名?
物理视图名中我们写了一个"/WEB-INF/view/string.jsp"这样的返回值,我们的返回值不想写这么多,只想写一个string(/WEB-INF/view/string.jsp中的string),这时候可以使用逻辑视图名。
需要去配置组件:viewResolver
那么配置了视图解析器viewResolver,有何影响
modelAndView中viewName会拼接
在上面物理视图名的案例中返回值也会受影响 → 也就是所有的返回值为字符串都会做一个拼接
看到的是网页源代码。选择preview就会显示的和浏览器中一样
不写的话就是啥请求都可以接收