springMVC理解

springMVC是一种思想,将软件划分为,模型Model,视图View,控制器Controller。

MVC的工作原理:用户通过前端视图页面,发送请求到服务器,在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕返回到Controller,再根据请求处理的结果找到对应的视图,经过渲染数据后响应给浏览器。

springMVC基于servlet,封装了servlet的操作,构造了DispatcherServlet前端管理器,对请求和响应统一进行管理。

一、准备工作

1.使用

创建maven项目,并添加web模块,定义打包方式为war包,在pom文件引入对应依赖坐标。

  1. 配置web.xml

注册前端管理器DispatcherServlet:定义<servlet>和<servlet-mapping>

<url-pattern>定义了路径模型,当请求符合该路径,就会被DispatcherServlet进行处理

这里使用 " / " 意思是除了jsp页面以外的所有请求,都会被拦截处理

而jsp页面需要被tomcat的默认servlet来处理,前端控制器无法处理,所以使用" / "

<init-param>是上下文配置路径,也就是加载spring MVC配置文件的路径

<;oad-on-startup>默认是第一次访问时进行初始化servlet,将该值设置为1,表示在服务器启动时就开始初始化DispatcherServlet

  1. 创建请求控制器

请求控制器就是一个个普通的pojo类,但需要@Controller声明为控制层组件bean,交给ioc容器,SpringMVC才识别的到。

  1. 创建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数据

  1. springMVC的响应参数

5.1 @ResponseBody

5.2 统一响应结果

定义一个Result类,该类的对象将来会转为json格式的字符串,作为响应结果返回给前端--

  1. 向请求域中共享数据

6.1 使用原生servlet的setAttribute方法

6.2 使用ModelAndView类进行共享,使用Model的功能向请求域共享数据,再使用View的视图功能设置逻辑视图,并且控制器方法一定要返回ModelAndView的对象作为返回值。

6.3 使用Model,ModelMap,Map

Model:Model是接口类型,addAttribute和上面的addObject用法一样,定义一个属性名称和属性的值

ModelMap:

Map:使用键值对的方式把属性名称和属性值存到map集合

  1. springMVC实现文件的上传和下载

文件上传:

文件下载:

8.拦截器interceptor

自定义拦截器类,实现HandlerInterceptor接口,重写里面的三个抽象方法,添加业务逻辑

preHandle:在控制器方法执行前执行,返回值为是否放行,false代表拦截,true为放行

postHandle:在控制器方法执行后执行

afterCompletion:在控制器方法执行后,且视图渲染完毕后执行

然后把拦截器类上交ioc容器管理,作为bean组件

在springmvc的配置文件注册拦截器(记得包扫描):

1.通过注解成为bean之后可以直接使用默认的bean名称注册

2.不使用@component,则在xml重新定义一个bean来指定

3.也可以使用,<mvc:interceptor>子标签,里面添加排除拦截的路径和拦截路径

相关推荐
Ylucius24 分钟前
动态语言? 静态语言? ------区别何在?java,js,c,c++,python分给是静态or动态语言?
java·c语言·javascript·c++·python·学习
七夜zippoe44 分钟前
分布式系统实战经验
java·分布式
是梦终空1 小时前
JAVA毕业设计176—基于Java+Springboot+vue3的交通旅游订票管理系统(源代码+数据库)
java·spring boot·vue·毕业设计·课程设计·源代码·交通订票
落落落sss1 小时前
sharding-jdbc分库分表
android·java·开发语言·数据库·servlet·oracle
码爸1 小时前
flink doris批量sink
java·前端·flink
Monodye2 小时前
【Java】网络编程:TCP_IP协议详解(IP协议数据报文及如何解决IPv4不够的状况)
java·网络·数据结构·算法·系统架构
一丝晨光2 小时前
逻辑运算符
java·c++·python·kotlin·c#·c·逻辑运算符
无名指的等待7122 小时前
SpringBoot中使用ElasticSearch
java·spring boot·后端
Tatakai253 小时前
Mybatis Plus分页查询返回total为0问题
java·spring·bug·mybatis
武子康3 小时前
大数据-133 - ClickHouse 基础概述 全面了解
java·大数据·分布式·clickhouse·flink·spark