# SpringMVCDemo202602 **Repository Path**: nieps/spring-mvcdemo202602 ## Basic Information - **Project Name**: SpringMVCDemo202602 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-02 - **Last Updated**: 2026-02-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SpringMVC笔记 Spring-web部分 ## 目标 * 掌握SpringMVC工作流程(面试题) * 掌握核心注解 (重点) * 前后端数据交互格式 JSON (简单) * 掌握全局异常处理(统一处理) * 掌握拦截器(重点/难点) * 掌握数据校验(注解 ) 后端校验 * 文件上传(了解、熟悉) 开发常用文件存储系统(minio 阿里OSS ...) ## 介绍 ![image-20260202103242789](assets/image-20260202103242789.png) ## hello示例 ### 引入依赖 ~~~xml org.springframework spring-webmvc 6.2.15 compile jakarta.servlet jakarta.servlet-api 6.1.0 provided ~~~ ### 映射前端控制器 ~~~xml webmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml webmvc / ~~~ ### 处理器 定义 ~~~java public class HelloController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { //创建模型视图对象 ModelAndView mv = new ModelAndView("/hello.jsp"); //向模型加入数据 mv.addObject("name", "张三"); mv.addObject("age", 20); return mv; } } ~~~ ### 处理器映射 ~~~xml ~~~ ## 适配 器 ![image-20260202151757755](assets/image-20260202151757755.png) ## 基于注解环境 实现条件: 1. 要能够识别spring注解 2. 要注册DispatcherServlet ### 示例 1. 配置初始化类 2. 核心配置类 ~~~java @ComponentScan("com.by") // 扫描包 提供spring注解支持 @Configuration //注入IOC容器 @EnableWebMvc//启用SpringMVC public class AppConfig { } ~~~ 3. 控制类 ~~~java @Controller public class UserController { /** * * @return 返回的字符串 视图 */ @RequestMapping("/user") public String queryUser(){ return "user.jsp"; } } ~~~ ### 接收参数 (普通) 实现方式: * 如果参数少 在方法中定义形参,保存形参与参数名一致 增加注解@RequestParam > 这个错误 `IllegalArgumentException: Name for argument of type [java.lang.String] not specified` 主要出现在使用 Spring MVC/Spring Boot 等基于 Jakarta Servlet 的框架时 * 提供一个Javabean,属性名和参数名保持一致,提供get/set方法 (最常见) * 路径参数 查询用户: /user/001 通过注解@PathVariable 获取路径模板中的参数值 ### 接收参数(JSON) 使用注解:@RequestBody 可以用于将json格式 参数转换为javabean 或map ## JSON ### WEB响应方式 1. 请求---处理结果----页面跳转 (如jsp ) MVC v视图 只是用于展示数据 2. 基于XML描述数据 > xml: 可扩展的标记语言 -----描述数据 > > ~~~xml > > 1 > 张三 > > ~~~ > > 约束: > > * dtd 文档验证格式 约束文档中能够出现哪些元素、元素的数量、顺序、属性... > * schema 更符合xml格式 比dtd要强大 3. JSON > JSON (JavaScript Object Notation) 是一种**轻量级的文本数据交换格式** > > 什么是js对象? > > js对象是一组属性的无序集合:属性:值 ,多个属性值之间用逗号隔开 > > ~~~javascript > let user={ > "name":"张三", > "age":23, > "course":["java","spring","mybatis"], > info:function(){ > console.log(this.name+"的年龄是"+this.age) > }, > "contact":{ > "qq":22332, > "mobile":1354544 > } > } > ~~~ > > 属性:---字符串 > > 值:可以是js的任何类型 如字符串 数字 布尔 数组 函数 对象 。。 > > 什么是JSON? > > json是一个特殊的js对象 ,特殊在值的类型有限制 :字符串(双引号)、数字、布尔值 (true/false)、null、对象、数组 > > ~~~json > { > "name": "张三", > "age": 25, > "isStudent": false, > "hobbies": ["篮球", "编程", "阅读"], > "address": { > "province": "北京", > "city": "北京市" > }, > "score": null > } > ~~~ > > ## JSON数据格式 java中要提供一个类库或工具类,能实现将java对象 转换成json格式 , 如果前端提前过来的是json格式 的数据 转换成javabean 常见的工具类: * gson google提供的 * fastjson 阿里 * jackson spring mvc框架 内置 的 要实现json--javabean类型转换,必须提供一个对应的转换器 @ReponseBody的作用: 以文本形式 写入输出流 (plain/json/xml) ~~~java response.getWriter().write("...")//将数据写入响应流 ~~~ 面试题:@Controller 与@RestController的区别 * 响应 @Controller是视图 @RestController 文本 * @RestController是 @Controller与@ResponseBody两个的复合注解 ## json格式请求 测试 工具: * idea Restfultool 工具 * google浏览器 可以安装插件postwoman * apipost (推荐) * swagger接口文档 (knife4j) ## 类型转换 在控制类中,使用@RequestParam 注解 可以获取 提交的参数 ,相当于request.getParamter(name) > 在servlet中 request.getParamter(name) 获取的值类型是: String 在Spring MVC中,提供了常见的类型转换器 ## 路径映射 * @GetMapping ---get请求 代表读取 数据 ## Cors 跨域 协议、域名、端口号三者一致为同源,非同源请求就是跨域。 http://localhost:8080 ## 注解的使用总结 * @RestController 控制层注解 响应文本(json)----@ReponseBody * @RequestMapping > 方法: > > * **GET** @GetMapping 读数据 > * **POST** @PostMapping 创建数据 > * **PUT** @PutMapping 修改数据 > * **DELETE** @Delete 删除数据 > * **OPTIONS (预检)** > * HEAD,PATCH(部发更新), TRACE. * @PathVariable 路径变量 (根据你自己的喜好) * @requestParam 一般不用 > 1. 设置参数非必须时 > 2. 提供默认值时 > 3. 参数名与方法参数名称不 一致时 * **@RequestBody** 针对提交参数类型是json ,将json转换成javabean 或map ## 异常处理 处理方式: * aop 异常通知 针对出现的异常 做日志记录 。。。 * mvc 异常处理 > 1. 传统方式 提供错误视图 出现错误跳转到视图页面 (了解) > > 2. 前后端交互 返回统一格式 > > 代码复用: > > a. 提供一个抽象类 通过继承 > > b. 提到到一个公共类中 ### 局部异常处理 * @ExceptionHandler 应用在方法上,用于捕获指定 的异常 ,交给你应用到的方法去处理 ### 全局异常处理 定义一个单独的控制类,用于处理所有异常,并返回统一结果。 关键注解: * @RestControllerAdvice 异常增强 用于控制类 响应文本 * @ExceptionHandler ## CORS > 了解: ajax async javascript and xml > > 关于端口: > > * http 协议 默认端口号是80 , 不用输入端口号 > * https 协议 默认端口是443 tomcat 借助于**ssl证书** 配置https协议 同源策略: 是指协议,域名,端口都要相同, 非同源请求就是跨域。 > 获取请求头: > > * request.getHeader("") ------@RequestHeader > > 设置响应头: > > * response.setHeader(name,value) 如果name存在覆盖,不存在添加 > * response.addHeader(name,value) 添加 ### 解决办法 * 前端 > 可以通过代理解决跨域 如vue通过代理解决 * 后端 > 设置5个核心响应头参数: > > * ##### Access-Control-Allow-Origin 允许来自哪些域名的请求访问 在开发时 通常设置为* 任何域名都可访问 > > * Access-Control-Allow-Credentials 是否允许携带cookie 一般异步请求不允许 > > * Access-Control-Expose-Headers 异步请求可以访问到的响应头参数 默认只能取到6个 通常设置***** 代表可以获取所有 > > * ##### **Access-Control-Allow-Methods** 允许跨域的方法 想写可以写5种: > > > get > > > > post > > > > put > > > > delete > > > > options 预检请求 > > > > 也可以直接设置为* 任意方法 > > * Access-Control-Max-Age 预检有效期 建议设置 单位是秒 ## 拦截器 ![image-20260206102006408](assets/image-20260206102006408.png) 前后端分离认证:常见的token token:令牌 服务器不需要存储 ,每一次请求,接口都有携带token (加密的字符串) xxx.xxx.xxx > 模拟:token=1,admin,管理员 > > 一般通过请求头传递 ### 拦截器实现步骤 * 定义拦截器,实现HandlerInterceptor接口 * 注册拦截器 > 1. 定义配置类 ,实现WebMvcConfiger接口 > > 2. 重写 addInterceptors方法 注册拦截器 > > 路径: > > * /* 拦截如/a /b 不拦截/a/b > * /** 拦截所有 ### 多个拦截器执行顺序 注册顺序: 1. 登录拦截器 login 2. 日志拦截器 log 执行顺序: 1. login.pre 2. log.pre 3. log.post 4. login.post 5. log.after 6. login.after ### 过滤器(扩展) * servlet环境 继承HttpFilter 请求转发 多次执行 需求: 一次请求,只拦截一次 ,在spring环境 中,要实现过滤 器怎么实现? ## 作业 1. 后端实现 **防止表单重复提交** ## 后端验证 > 验证分两种: > > * 前端验证 通过js或验证规则 > > * 后端验证 > > > 1. 常规验证 > > 2. 通过注解实现验证 分组 : * 如果使用启用验证注解时,没有指定分组,默认 只有不带分组的注解才有效 * 使用@Validated 指定分组后,带有相同分组的注解才生效 ## 上传 分两种: * 同步上传 通过form表单上传 * 异步上传 通常使用第三方组件 多部件 > 如何使用servlet,要实现上传,借助第三 方类库: > > [commons-fileupload](https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload) # 前端 ## 技术 * html * css * javascript ----jquery * node.js 是一个javascript的运行环境 脱离于浏览器 v8引擎(chrome浏览器)v22.16.0 * vue3 * axios 异常请求库 兼容浏览器与node.js环境 > 1. 包含ajax(运行在浏览器 核心是一个js对象 XMLHttpRequest ) > 2. http库 * element plus --vue3 > element ui--vue2 ## SPA应用 spa: signle page application 单页应用 命令: * npm node package manager 包管理工具 类似mvn * pnpm 号称比npm快 > 注意: 淘宝镜像 > > ~~~shell > #淘宝镜像 > https://registry.npmmirror.com/ > > #查看淘宝镜像 > npm config get registry > #设置淘宝镜像 > npm config set registry https://registry.npmmirror.com/ > ~~~ > > ## 创建spa应用 ~~~sh # 创建项目 pnpm create vue@latest #安装所有依赖 pnpm i # install #运行 pnpm dev #安装element plus环境 pnpm add axios #安装ui pnpm add element-plus ~~~ 在main.js引入 ~~~javascript //引入elementplus import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' //安装插件 app.use(ElementPlus) ~~~ ## 路由 ~~~javascript interface RouteConfig = { path: string, component?: Component, name?: string, // 命名路由 components?: { [name: string]: Component }, // 命名视图组件 redirect?: string | Location | Function, props?: boolean | Object | Function, alias?: string | Array, children?: Array, // 嵌套路由 beforeEnter?: (to: Route, from: Route, next: Function) => void, meta?: any, // 2.6.0+ caseSensitive?: boolean, // 匹配规则是否大小写敏感?(默认值:false) pathToRegexpOptions?: Object // 编译正则的选项 } ~~~