springMVC是一种思想,将软件划分为,模型Model,视图View,控制器Controller。
MVC的工作原理:用户通过前端视图页面,发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕返回到Controller,再根据请求处理的结果找到对应的视图,经过渲染数据后响应给浏览器。
springMVC基于servlet,封装了servlet的操作,构造了DispatcherServlet前端管理器,对请求和响应统一进行管理。
一、准备工作
1.使用
创建maven项目,并添加web模块,定义打包方式为war包,在pom文件引入对应依赖坐标。
- 配置web.xml
注册前端管理器DispatcherServlet:定义<servlet>和<servlet-mapping>
<url-pattern>定义了路径模型,当请求符合该路径,就会被DispatcherServlet进行处理
这里使用 " / " 意思是除了jsp页面以外的所有请求,都会被拦截处理
而jsp页面需要被tomcat的默认servlet来处理,前端控制器无法处理,所以使用" / "
<init-param>是上下文配置路径,也就是加载spring MVC配置文件的路径
<;oad-on-startup>默认是第一次访问时进行初始化servlet,将该值设置为1,表示在服务器启动时就开始初始化DispatcherServlet
- 创建请求控制器
请求控制器就是一个个普通的pojo类,但需要@Controller声明为控制层组件bean,交给ioc容器,SpringMVC才识别的到。
- 创建SpringMVC的配置文件,配置好web服务器后就可以了
springMVC的配置文件默认处于WEB-INF目录下,但我们都会放到resources目录,
且名字是**<servlet-name>-servlet.xml**
在配置文件中,定义组件扫描component-scan来扫描控制层组件
然后配置thymeleaf的视图解析器,通过逻辑视图来实现页面的重定向和转发。这里使用其他的也可以
二、自定义控制层Controller
1.在控制层定义方法,通过注解@RequestMapping定义请求路径参数,或者按照Resuful风格,定义注解@GetMapping,@PostMapping,@DeleteMapping,@PutMapping,用法类似
2.@RequestMapping标识的位置
可以标识在类上,表示设置请求路径的基础信息,即抽取出相同的请求路径,这样方法中就不用再写出了
可以标识在单个方法上标识,表示设置请求路径的具体信息。
@RequestMapping的属性
value:数组类型,意思是可以设置多个请求路径,也就是一个控制器方法可以处理若干个请求
method:规定控制器方法在请求路径匹配的情况下,继续匹配请求方式get,post等等
params:
headers:
3.ant风格的请求路径
使用 ? 表示任意的单个字符,除了它本身
使用 * 表示当前目录任意的0个或多个字符
使用 ** 表示任意层数的任意目录
4.springMVC中获取请求参数的方式
4.1 通过原生servletAPI:定义HttpServlet的形参,调用getParameter方法等等。
4.2 在springMVC中,只要控制器方法的参数列表和请求的参数保持一致,就可以自动完成接收。
注意参数名称不一致的话,可以使用注解@RequestParam,表示给形参起别名,从而完成映射。
还有两个类似的注解:@RequestHeader用来将请求头的信息和控制器方法的形参绑定@CookieValue:将cookie数据和控制器方法的形参绑定。
4.3 通过pojo类型获取参数,实际上和5.2一样,定义的pojo类,其中的属性名称必须和请求参数保持一致。
4.4 接收PathVariable 路径参数
在路径中使用占位符 {} 动态表示,在控制器方法的参数列表用加上@PathVariable注解的形参进行接收,注意保持名称一致
4.5 接收数组集合参数
4.6 接收日期参数
4.7 接收JSon数据
- springMVC的响应参数
5.1 @ResponseBody
5.2 统一响应结果
定义一个Result类,该类的对象将来会转为json格式的字符串,作为响应结果返回给前端--
- 向请求域中共享数据
6.1 使用原生servlet的setAttribute方法
6.2 使用ModelAndView类进行共享,使用Model的功能向请求域共享数据,再使用View的视图功能设置逻辑视图,并且控制器方法一定要返回ModelAndView的对象作为返回值。
6.3 使用Model,ModelMap,Map
Model:Model是接口类型,addAttribute和上面的addObject用法一样,定义一个属性名称和属性的值
ModelMap:
Map:使用键值对的方式把属性名称和属性值存到map集合
- springMVC实现文件的上传和下载
文件上传:
文件下载:
8.拦截器interceptor
自定义拦截器类,实现HandlerInterceptor接口,重写里面的三个抽象方法,添加业务逻辑
preHandle:在控制器方法执行前执行,返回值为是否放行,false代表拦截,true为放行
postHandle:在控制器方法执行后执行
afterCompletion:在控制器方法执行后,且视图渲染完毕后执行
然后把拦截器类上交ioc容器管理,作为bean组件
在springmvc的配置文件注册拦截器(记得包扫描):
1.通过注解成为bean之后可以直接使用默认的bean名称注册
2.不使用@component,则在xml重新定义一个bean来指定
3.也可以使用,<mvc:interceptor>子标签,里面添加排除拦截的路径和拦截路径