# 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 ...)
## 介绍

## 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
~~~
## 适配 器

## 基于注解环境
实现条件:
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 预检有效期 建议设置 单位是秒
## 拦截器

前后端分离认证:常见的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 // 编译正则的选项
}
~~~