Author:宇哥 WeChat/QQ: Warmheart170712 / 939638113
整理不易,重在分享,欢迎转发收藏,助力面试上岸,学编程找宇哥
MVC是一种软件架构的思维,将软件按照模型,视图,控制器来换分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类成为实体类Bean,专门存储数据业务,如POJO实体类 一类成为业务处理Bean,指Service或者Dao对象,专门用于处理业务逻辑或和数据访问 V:View,视图层,指工程中的html或者jsp页面,作用是与用户进行交互,展示数据 C:Controller,控制层,指工程中的Servlet,作用是接收请求和响应浏览器 MVC的工作流程: 用户通过视图层发送请求到服务器,在服务器中请求被Controller接收, Controller调用相应的Model层处理请求,处理完毕将结果返回给Controller。 Controller再根据请求的结果找到相应的View视图,渲染数据后最终响应给浏览器1.2 什么是Spring MVC
SpringMVC是Spring的一个后续产品,,是Spring的一个子项目 SpringMVC是Spring为表述层开发提供的一套完备的解决方案, 目前普遍使用SpringMVC作为javaEE项目表述层的首选方案 备注:三层架构分为表述层,业务逻辑层,数据访问层,表述层是表示前台页面和后台servlet1.3 Spring MVC的特点
SpringMVC是Spring框架的一个子项目,与IOC容器无缝对接 基于原生的Servlet,通过功能强大的前端控制器DispatcherServlet, 对请求和响应进行统一处理 代码清晰简洁,大幅度提升开发效率 内部组件化程度高,可插拔式组件,即插即用 性能卓著,尤其适合大型互联网项目的要求2 环境搭建 2.1 开发环境
IDEA 2020.1 Maven 3.6.3 MariaDB:10.3.7 Tomcat 8 Spring 5.3.72.2 创建maven工程
1 添加web模块
2 打包方式 warwar
3 引入依赖2.3 配置web.xmlorg.springframework spring-webmvc 5.3.7 ch.qos.logback logback-classic 1.2.3 javax.servlet javax.servlet-api 3.1.0 provided org.thymeleaf thymeleaf-spring5 3.0.15.RELEASE
注册SpringMVC的前端控制器:dispatcherServlet
1 默认配置方式 在配置作用下,SpringMVC的配置文件默认位于WEB-INF下 默认名称为< servlet-name >-servlet.xml 文件名为:SpringMVC-servlet.xml 设置SpringMVC的核心控制器所能处理的请求的请求路径 / 匹配的请求可以是/login或.html或.css或.js等方式的额请求路径 但是不能匹配 .jsp 请求路径的请求SpringMVC org.springframework.web.servlet.DispatcherServlet SpringMVC /
2 扩展配置方式 - 常用方式 可通过init-param标签设置SpringMVC配置文件的位置和名称, 通过load-on-startup标签设置SpringMVC前端控制器DispatcherServlet的初始化时间SpringMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml 1 SpringMVC /
面试题:标签中使用/和 @RequestMapping(value = "/") public String index(){ //返回视图的名称 return "index"; } }
配置tomcat
DEBUG运行
其中 /springmvc/ 表示上下文路径
请求跳转,跳转到target.html页面,
本质是请求的转发,地址栏未发生改变
首页
访问目标页面target.html
在请求控制器中创建处理请求的方法:
@RequestMapping("/target")
public String target(){
return "target";
}
2.7 总结
1 浏览器发送请求,若请求地址符合前端控制器的url-pattern, 2 该请求会被前端控制器DispatcherServlet处理, 3 前端控制器会读取SpringMVC的核心配置文件,通过扫描组件找到控制器 4 将请求地址和控制器中的@RequestMapping的value属性值进行匹配 5 若匹配成功,该注解所标识的控制器方法就是处理请求的方法 6 处理请求的方法需要返回一个字符串类型的视图名称, 7 该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径, 8 通过thymeleaf对视图进行渲染,最终转发到视图所对应的页面3 @RequestMapping注解详解 3.1 @RequestMapping注解的功能
从注解的名称上可以看到, @RequestMapping注解的作用是: 将请求和处理请求的控制器方法关联起来,建立映射关系。 SpringMVC接收到指定的请求,就回来找到在映射关系中对应的控制器方法来处理这个请求3.2 @RequestMapping注解的位置
@RequestMapping标识一个类,设置映射请求的请求路径的初始信息 @RequestMapping标识一个方法,设置映射请求路径的具体信息
@Controller
@RequestMapping("/req")
public class ReqMappingController {
@RequestMapping("/testRequestMapping")
public String testReqMapping(){
return "success";
}
}
1 thymeleaf中的@{}的含义:
thymeleaf中的@{}:表示获取应用的上下文路径
等同于Jsp 的老方法:
${pageContext.request.contextPath} = @{}
jsp中获取上下文路径拼接资源路径:
th:action= "${pageContext.request.contextPath}/upload
thymeleaf中获取上下文路径拼接资源路径:
th:action= "@{/upload}
2 为什么 Tomcat 运行时默认打开 index.html,或者 index.jsp Tomcat 安装目录下的 confweb.xml 包含所有项目的配置信息 如果 IDEA 中的 web.xml 没有相关的配置信息, 就运行 Tomcat 安装目录下的 confweb.xml。3.3 @RequestMapping注解的value属性如果需要修改模块的欢迎页面也是可以的, 只需要在当前模块的 web.xml 文件配置即可 index.html index.jsp love.html
@RequestMapping注解的value属性通过请求的请求地址匹配请求映射 @RequestMapping注解的value属性是一个字符串类型的数组, 表示该请求映射能够匹配多个请求地址所对应的请求 @RequestMapping注解的value属性必须设置,至少通过请求地址匹配请求映射
测试@RequestMapping注解value属性--/testValue1
测试@RequestMapping注解value属性--/testValue2
@RequestMapping(value = {"/testValue1","/testValue2"})
public String testValue(){
return "success";
}
3.4 @RequestMapping注解的method属性
@RequestMapping注解的method属性通过请求的请求方式(GET/POST)匹配请求映射 @RequestMapping注解的method属性是一个RequestMethod类型的数组, 表示请求映射能能够匹配多种请求方式的请求 若当前请求的请求地址满足请求映射的value属性, 但是请求方式不满足method属性,则浏览器报405.Request method ‘POST’ not support
@RequestMapping(value = "/testMethod",method = {RequestMethod.GET,RequestMethod.POST})
public String testMethod(){
return "success";
}
备注: 1 兑取处理指定请求方式的控制器方法, SpringMVC中提供了@RequestMapping的派生注解 处理GET请求的映射:GetMapping 处理POST请求的映射:PostMapping 处理PUT请求的映射:PutMapping 处理DELETE请求的映射:DeleteMapping 2 常用的请求方式有get post put delete: 但目前浏览器只支持get和post,若在form表单提交时, 为method设置了其他请求方式的字符串,put或者delete, 则按照默认的GET请求方式处理 若要发送put和delete请求, 则需要通过spring提供的过滤器HiddenHttpMethodFilter。3.5 @RequestMapping注解的params属性
@RequestMapping注解的headers属性通过请求的请求参数匹配请求映射 @RequestMapping注解的headers属性是一个字符串类型的数组, 可以通过四种表达式设置请求参数和请求映射的匹配关系 ‘param’:要求请求映射所匹配的请求必须携带param请求参数 ‘!param’:要求请求映射所匹配的请求必须携带param请求参数 ‘param=value’:要求请求映射所匹配的请求必须携带param请求参数,且param=value ‘param!=value’:要求请求映射所匹配的请求必须携带param请求参数,但是param=value
测试@RequestMapping注解的param属性
@RequestMapping(value = {"/testParam"},
params = {"username","password"})
public String testParam(String username,String password){
System.out.println(username+password);
return "success";
}
注意:
若当前请求满足@RequestMapping注解的value和method属性,但是不满足params属性,
此时页面会报400错误
Parameter conditions "username,password" not met for actual
request parameters: username={tom}, password={123456}
3.6 @RequestMapping注解的headers属性
@RequestMapping注解的headers属性通过请求的请求头信息匹配请求映射 @RequestMapping注解的headers属性是一个字符串类型的数组, 可以通过四种表达式设置请求头信息和请求映射的匹配关系 ‘header’,要求请求映射所匹配的请求必须携带header请求头信息 ‘!header’:要求请求映射所匹配的请求不能携带header请求头信息 ‘header=value’:要求请求映射所匹配的请求必须携带header请求头信息,且header=value ‘header!=value’:要求请求映射所匹配的请求必须携带header请求头信息,且header!=value 若当前请求满足@RequestMapping和value和method属性,但不满足headers属性,此时页面报404错误,即资源未找到
测试@RequestMapping注解的headers属性
@RequestMapping(value = {"/testHeader"},
params = {"username","password"},
headers = ("Host=localhost:8085"))
public String testHeader(){
return "success";
}
3.7 SpringMVC支持ant风格的路径
? 表示任意的单个字符 * 表示任意的0个或者多个字符 ** 表示任意的一层或多层目录 注意:在使用**时,只能使用xxx方式,注解中不允许在**前后添加内容
测试@RequestMapping注解的ant风格路径
@RequestMapping("/a?a/testAnt")
public String testAnt(){
return "success";
}
执行后的请求路径: GET http://localhost:8085/springmvc/req//a1a/testAnt3.8 SpringMVC支持路径中的占位符
原始方式:/deleteById?id=1
rest方式:/deleteById/1
SpringMVC路径中的占位符常用语restful风格中,
当请求路径中将某些数据通过路径的方式传输到服务器中,
就可以在相应的@RequestMapping注解的value属性中通过占位符{xxx}表示传输的数据,
再通过@PathVariable注解,将占位符所表示的数据复制给控制器方法的形参
注意:路径中的占位符名称必须和@PathVariable中的value属性值一致
测试@RequestMapping注解支持路径中的占位符
@RequestMapping("/testPath/{id}")
public String testPath(@PathVariable(value = "id") Integer ids){
System.out.println(ids);
return "success";
}
4 SpringMVC获取请求参数
4.1 通过servletAPI获取请求参数
将HttpServletRequest作为控制器方法的形参, 此时HttpServletRequest类型的参数表示封装了当前请求报文的对象
通过servletAPI获取请求参数
@RequestMapping("/testServletAPI")
//形参位置的request表示当前的请求的封装对象
public String testServletAPI(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username+password);
return "success";
}
4.2 通过控制器方法的形参获取请求参数
在控制器方法的形参位置,设置和请求参数同名的形参, 当浏览器发送请求,匹配到请求映射时,在DispatcherServlet中。 就会将请求参数赋值给相应的形参
通过控制器方法的形参获取请求参数
@RequestMapping("/testMethodParam")
//形参位置的request表示当前的请求的封装对象
public String testMethodParam(String username,String password){
System.out.println(username+password);
return "success";
}
@RequestMapping(value = "/testMethodParam2")
//形参位置的request表示当前的请求的封装对象
public String testMethodParam2(String username,String password,String[] hobby){
//若请求参数中出现多个同名的请求参数,
// 可以在控制器方法的形参位置设置字符串类型,或者字符串数组接受参数
//使用字符串,参数值会使用逗号拼接
System.out.println(username+password+ Arrays.toString(hobby));
return "success";
}
注: 若请求所传输的请求参数中有多个同名的请求参数, 此时可以在控制器方法的形参中: 设置字符串数组或者字符串类型的形参接收此请求参数 若使用字符串数组类型的形参,此参数的数组中包含了每一个数据 若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果4.3 @RequestParam
@RequestParam是将请求参数与控制器方法的形参创建映射关系 @RequestParam注解一共有三个属性: value:指定为形参赋值的请求参数的参数名 required 设置是否必须传输此请求参数,默认值为true4.4 @RequestHeader 4.5 @CookieValue 4.6 通过POJO获取请求参数 4.9 解决获取请求参数的乱码问题 5 域对象共享数据



