一、springmvc运行流程和流程图

1、运行流程

(1)用户从浏览器发起请求到服务器;
(2)由前端控制器(Controller,核心DispatcherServlet)接管所有请求(类似于原servlet,用于接收请求和转发请求);
(3)DispatcherServlet调用处理器映射器(HandlerMapping)来查找项目中是否已经有定义好的对象(HandlerMethod)来处理当前请求;
注意:映射器是根据handler所在的name属性的值,以及class属性的值查找执行类Handler。
(4)如果找到对应的处理该请求的handler对象,那么就将该对象以及一系列的拦截器返回给前端控制器;
(5)前端控制器获取到HandlerMapping返回的执行链(Handler),调用处理器适配器(handlerAdapter)去执行目标的handler;
(6)handlerAdapter在接收到DispatcherServlet的请求后,首先会判断自己是否由能力执行当前的handler,如果可以执行,就去执行当前的handler对象。
(7)handler对象执行完后,返回一个ModelAndView对象(JavaBean,包含逻辑视图名称和模型数据data[将来填充到作用域,渲染到页面的数据])或者逻辑视图的名称(String);
(8)handlerAdapter将ModelAndView对象返回给DispatcherServlet;
(9)DispatcherServlet调用视图解析器(ViewResolver),视图解析器将逻辑视图解析为物理视图返回给前端控制器;
(10)前端控制器获取到物理视图后,将数据模型取出来,设置到request作用域;同时进行视图渲染(即根据地址找到jsp页面);
(11)最后,jsp页面通过jsp引擎的拦截,动态生成Java文件,再编译成class文件,再响应到html页面。

2、流程图

image.png

二、springmvc的配置方式

(一)、xml方式一(了解)

步骤:

1、导包

(1)spring核心包:core (依赖commons-logging包)、context 、expression 、 beans;
(2)web相关包:spring-web 、spring-webmvc;

2、配置web.xml文件

(1)将DispatcherServlet配置到web.xml文件中;
(2)配置DispatcherServlet的初始化参数
配置标签,在该标签中配置
:contextConfigLocation;
:springmvc的xml配置文件的路径,
一般为:classpath:applicationContext-springmvc.xml;
(3)标签中的标签配置为:/;
注意:
1)“/”表示拦截除jsp以外的所有请求。
2)如果不在web.xml文件中指明springmvc的配置文件的自动hi,则默认使用WEB-INF下的dispatcher-servlet.xml的springmvc的配置文件进行加载,此时就必须要保证WEB-INF下有一个名字叫做dispatcher-servlet.xml的文件存在。

3、在classpath路径下配置applicationContext-springmvc.xml文件

(1)引入约束
需要引入的约束为:beans、mvc
(2)配置springmvc的三大组件:
1)处理器映射器handlerMapping:此处使用实现类BeanNameUrlHandlerMapping;
2)处理器适配器handlerAdapter:此处使用实现类SimpleControllerHandlerMapping;
3)视图解析器:InternalResourceViewResolver;
在视图解析器中可以配置property节点,用于配置视图的前缀(prefix)、后缀(suffix);

4、编写handler方法

  1. 1)处理业务逻辑;<br /> 2)编写时需要按照处理器适配器的要求,实现Controller接口,重写handlerRequest方法,在方法中处理相应的请求,最终返回ModelAndView对象,该对象携带数据和逻辑视图名称;<br /> **注意:在handler中设置逻辑视图的名称时,从该项目的根目录开始,以/开始,以尾缀结尾,写全页面的路径**;

5、在springmvc的xml配置文件中配置自己编写的handler的bean结点。

   **注意:该bean结点中的name属性,映射访问的url路径名称,从项目名称后的根/开始写。**

(二)、xml方式二(了解)

步骤:

1、导包

(1)spring核心包:core 、commons-logging、context 、expression 、 beans、aop;
(2)web相关包:spring-web 、spring-webmvc;

2、配置web.xml文件

(1)将DispatcherServlet配置到web.xml文件中;
(2)配置DispatcherServlet的初始化参数
配置标签,在该标签中配置
:contextConfigLocation;
:springmvc的xml配置文件的路径,
一般为:classpath:applicationContext-springmvc.xml;
(3)标签中的标签配置为:/;
注意:
1)“/”表示拦截除jsp以外的所有请求。
2)如果不在web.xml文件中指明springmvc的配置文件的自动hi,则默认使用WEB-INF下的dispatcher-servlet.xml的springmvc的配置文件进行加载,此时就必须要保证WEB-INF下有一个名字叫做dispatcher-servlet.xml的文件存在。

3、在classpath路径下配置applicationContext-springmvc.xml文件

(1)引入约束
需要引入的约束为:beans、mvc
(2)配置springmvc的三大组件:
1)处理器映射器handlerMapping:此处使用实现类SimpleUrlHandlerMapping;
在该bean节点下配置property节点


自定义的controller(userController)


2)处理器适配器handlerAdapter:此处使用实现类HttpRequestHandlerMapping;
3)视图解析器:InternalResourceViewResolver;
在视图解析器中可以配置property节点,用于配置视图的前缀(prefix)、后缀(suffix);

4、编写handler方法

   1)处理业务逻辑;<br />       2)编写时需要按照处理器适配器的要求,实现HttpRequestHandler接口,重写handlerRequest方法,在方法中通过request或者response处理相应的请求;<br />       **注意:在handler中设置逻辑视图的名称时,从该项目的根目录开始,以/开始,以尾缀结尾,写全页面的路径**;

5、在springmvc的xml配置文件中配置自己编写的handler的bean结点。

(三)、注解式配置(掌握)

步骤:

1、导入jar包

core、beans、expression、context、aop、common-loging、spring-web、spring-webmvc;

2、配置web.xml文件

(1)将DispatcherServlet配置到web.xml文件中;
(2)配置DispatcherServlet的初始化参数
配置标签,在该标签中配置
:contextConfigLocation;
:springmvc的xml配置文件的路径,
一般为:classpath:applicationContext-springmvc.xml;
(3)标签中的标签配置为:/;
注意:
1)“/”表示拦截除jsp以外的所有请求。
2)如果不在web.xml文件中指明springmvc的配置文件的自动hi,则默认使用WEB-INF下的dispatcher-servlet.xml的springmvc的配置文件进行加载,此时就必须要保证WEB-INF下有一个名字叫做dispatcher-servlet.xml的文件存在。

3、在classpath路径下配置applicationContext-springmvc.xml文件

(1)引入约束
   需要引入的约束为:beans、mvc、context

(2)配置包扫描

只扫描controller:


</ context:component-scan >

(3)配置springmvc的三大组件
   注解中处理器映射器和处理器适配器使用的实现类分别为:<br />处理器映射器:RequestMappingHandlerMapping;<br />处理器适配器:RequestMappingHandlerMapping;<br />配置方式:<br />       1)配置三大组建的bean。<br />       2)开启三大组件的注解:<mvc:annotation-driven></mvc:annotation-driven>

(4)手动配置视图解析器:InternalResourceViewResolver;

在视图解析器中可以配置property节点,用于配置视图的前缀(prefix)、后缀(suffix);

4、编写handler方法

1)自定义controller;
2)在类上添加注解:@Controller;
3)在方法和类上添加注解:@RequestMapping(value=”/url“)
注意:
a.类上的 @RequestMapping的value值可写可不写,一般为区分不同的模块会选择添加(“/url1“);
b.方法上的 @RequestMapping 必须要写(“/url2“);
c.controller的请求路径为:localhost:8080/web/url1/url2;
d.controller返回的视图路径根据mvc配置文件中的配置情况而定,赔了前后缀的不需要再写前后缀。

三、springmvc的@RequestMapping注解详解

1、作用的位置

(1)作用在方法上

1)标定HandlerMethod
springmvc在扫描到该注解之后,会将对应的方法包装为一个HandlerMethod对象;
2)限定请求
通过该注解中的属性来限定请求。

(2)作用在类上

隔离请求,将同一给模块的操作放到同一个类中,防止url冲突,比如user模块的UserController类上限定“/user“,StudentController类上限定”/student“。

2、@RequestMapping注解的属性

(1)value属性

1)限定请求的url路径;
2)值是一个字符串数组,所以可以将多个路径映射到同一方法中,同时,支持通配符:
/:表示一级目录下的任意字符;
/*
:代表多级目录下的任意字符。

(2)method属性

method:限定请求方式,值为常量,分别如下:
1)get:表示数据库查询数据;
2)post:表示数据库增添数据;
3)put:表示数据库修改数据;
4)delete:表示数据库删除数据;
注意:如果没有指定该属性,则表示接收所有的请求方式。
详见restful风格的url路径。

(3)params属性

限定请求参数(自定义的参数),该值可以写多个(字符串数组),用于指定其处理的请求必须携带某些参数,否则会报状态码为400的错误(http报文请求错误)。
请求参数限定方式:
1)可以只写参数名:表示要求请求时必须携带该参数,不限制参数的值;
2)参数名=值:表示限定请求时必须携带限定值的参数;
3)参数名!=值:表示限定请求时必须携带一个不等于限定值的参数。

(4)headers属性

限定http请求头的参数,可以写多个:要求发送请求时请求头中必须要携带指定的参数。
例如:
一个handler限定了headers,要求必须携带cookie参数,但是第一次请求时没有cookie参数,则不能映射到该handler;但是当在请求了别的路径时,请求头自动生成cookie后,再次请求该handler,就可以访问了。

(5)produces属性

用于限定响应的数据格式(详见Json);

(6)consumes属性

用于限定接收的数据格式(详见Json)。

四、springmvc简单参数绑定和相关注解

使用spring从前端获取参数:直接在handler方法的形参列表上声明

1、简单参数的绑定

简单参数:基本参数类型和字符串
注意点:
(1)如果在形参列表上声明了一个参数,但是前端没有传,则赋值为null;
(2)基本数据类型的声明要使用其包装类否则未传值时,赋值为null是非法的;
(3)在形参列表声明的形参名必须要和前端的参数名保持一致,否则无法完成参数绑定;
(4)当形参名和前端参数名不一致时,在形参名前添加注解@RequestParam(value=“前端参数名”);

2、方法签名的相关参数

(1)@RequestParam

1)作用

映射自定义的请求参数;

2)属性

①value:映射前端的参数名;
②required:表示该参数是否为必须的参数,默认值为true,如果添加了该注解,但是没有前端没有传参数,则报400,http请求报文有语法错误。
③defaultValue:表示如果前端参数没有传,则通过该属性给定一个默认值;
应用场景:分页。

(2)@RequestHeader

1)作用

映射请求头的参数;

2)属性

同@RequestParam,有三个属性:value、required、defaultValue;

(3)@CookieValue

1)作用

映射某一个cookie的值;

2)属性

同@RequestParam,有三个属性:value、required、defaultValue;

(4)@PathVariable

1)作用

用于映射url上的参数;

2)属性

该注解只有一个属性:value
①其url限定路径的写法:@RequestMapping(value=“/test/{参数名1}/{参数名2}/{…}”);
②请求时请求路径带参数写法:localhost:8080/web名/test/参数值1/参数值2/…;

五、自定义注解

1、元注解

(1)@target:定义注解作用的位置(类上、方法上、属性上等);
(2)@Retention:定义注解的生命周期;
(3)@Inheried:可以被继承的;
(4)@Documented:生成文档;
这几个注解添加的位置是自定义注解的类上;

2、定义注解的属性

如果定义的注解只有一个属性,则这个属性为value;
定义语法:String value() default “”;

3、定义注解的语法

@Target(value=”值”)
@Retention(value=”值”)
public @interface 注解名称{
String value() default “”;
}