目录
前言
将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性
可以在方法参数、方法或者类上使用
一般适用这几种场景:
- 表单处理:通过
@ModelAttribute
将表单数据绑定到模型对象上 - 预处理逻辑:在请求处理之前执行一些初始化操作,如设置常见模型属性
- RESTful API:结合
@RequestBody
处理 JSON 数据
对于Java的相关知识推荐阅读:java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
1. 注解用法
1.1 方法参数
将表单参数(name 和 email)绑定到 User 对象上,并将这个对象作为模型属性传递给视图
后端结合User,对应这个User属性要写全,才能获取到对应属性
@ControllerpublicclassUserController{@RequestMapping(value ="/user", method =RequestMethod.POST)publicStringaddUser(@ModelAttributeUser user,Model model){// 处理业务逻辑
model.addAttribute("user", user);return"userDetails";}}
前端对应捕捉相关的表单值
<formaction="/user"method="post"><inputtype="text"name="name"/><inputtype="text"name="email"/><buttontype="submit">Submit</button></form>
1.2 方法
控制器方法上使用
@ModelAttribute
注解,可以在每个请求处理方法调用之前执行一些预处理操作,如初始化模型数据
对应的后端示例如下:
@ControllerpublicclassUserController{@ModelAttributepublicvoidaddAttributes(Model model){
model.addAttribute("message","Welcome to the user page!");}@RequestMapping(value ="/user", method =RequestMethod.GET)publicStringgetUserForm(Model model){// 模型中已经包含了 "message" 属性return"userForm";}}
前端视图如下:
<!-- userForm.jsp --><html><body><h1>${message}</h1><formaction="/user"method="post"><inputtype="text"name="name"/><inputtype="text"name="email"/><buttontype="submit">Submit</button></form></body></html>
对应每次请求都会在控制器方法调用之前添加一个名为
"message"
的模型属性
1.3 类
在类上使用
@ModelAttribute
注解,可以为所有该类的请求处理方法添加共同的模型属性
对应后端写法如下:
@Controller@SessionAttributes("user")publicclassUserController{@ModelAttribute("user")publicUsercreateUser(){returnnewUser();}@RequestMapping(value ="/user", method =RequestMethod.GET)publicStringgetUserForm(@ModelAttribute("user")User user){return"userForm";}@RequestMapping(value ="/user", method =RequestMethod.POST)publicStringsubmitUser(@ModelAttribute("user")User user){// 处理业务逻辑return"userDetails";}}
2. 注解场景
与上面的第一章有些重复,不过容易理解
2.1 表单参数
表单参数:处理来自前端 HTML 表单的数据,将表单字段绑定到 Java 对象上
(其Demo对应此章的1.1)
也可通过编辑用户信息,绑定到相关的模型对象
@ControllerpublicclassUserController{@RequestMapping(value ="/user/edit", method =RequestMethod.GET)publicStringeditUser(@ModelAttributeUser user,@RequestParam("userId")Long userId,Model model){// 通过 userId 获取用户信息并填充到 user 对象
user = userService.findById(userId);
model.addAttribute("user", user);return"editUserForm";}}
2.2 AJAX请求
配合前端进行交互,此处写一个示例的Demo
使用 JavaScript(例如 jQuery 或者原生的 XMLHttpRequest)发送异步请求,后端通过
@RequestBody
结合
@ModelAttribute
解析 JSON 数据
$.ajax({url:'/user',type:'POST',contentType:'application/json',data:JSON.stringify({name:'John',email:'[email protected]'}),success:function(response){
console.log(response);}});
对应后端如下:
@ControllerpublicclassUserController{@RequestMapping(value ="/user", method =RequestMethod.POST)@ResponseBodypublicUseraddUser(@RequestBody@ModelAttributeUser user){// 处理业务逻辑return user;}}
2.3 文件上传
前端使用
<form>
标签并设置
enctype="multipart/form-data"
,后端通过
@ModelAttribute
绑定文件数据
前端:
<form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file"/><button type="submit">Upload</button></form>
后端:
@ControllerpublicclassFileUploadController{@RequestMapping(value ="/upload", method =RequestMethod.POST)publicStringhandleFileUpload(@RequestParam("file")MultipartFile file){// 处理文件上传逻辑return"fileUploadSuccess";}}
3. 实战
通过实战前端交互加深印象
此处使用Vue3 + Java
对应的函数调用如下:
options中添加了file的对应属性,但是后续需要将id传输给后端
对应的JS如下:
// 上传文件exportconstupdateFile=(data: any)=>{const formData =newFormData();
formData.append('file', data.file);
formData.append('appointmentId', data.id.toString());return request.upload({url:'/dangerous/appointment-commission/appointment-file/upload',data: formData
});}
其后端的写法如下:
@PostMapping("/appointment-file/upload")@Operation(summary ="上传文件", description ="模式一:后端上传文件")publicCommonResult<String>uploadFile(@ModelAttributeFileUploadReqVO uploadReqVO,@RequestParam("appointmentId")Long appointmentId)throwsException{MultipartFile file = uploadReqVO.getFile();String path = uploadReqVO.getPath();returnsuccess(appointmentCommissionService.createFile(file.getOriginalFilename(), path,IoUtil.readBytes(file.getInputStream()),appointmentId));}
4. 总结
@RequestBody
:数据来自请求体,通常是 JSON 格式
@ControllerpublicclassUserController{@RequestMapping(value ="/api/user", method =RequestMethod.POST)@ResponseBodypublicUseraddUser(@RequestBodyUser user){// 处理 JSON 请求体return user;}}
@ModelAttribute
:数据来自 URL 查询参数、表单参数,或其他请求参数
@ControllerpublicclassUserController{@RequestMapping(value ="/form/user", method =RequestMethod.POST)publicStringaddUser(@ModelAttributeUser user){// 处理表单参数return"userDetails";}}
其他注解详情如下:
注解说明@ModelAttribute适用于将多个请求参数绑定到复杂对象,或在处理请求之前初始化模型数据@RequestParam适用于获取单个或少量请求参数@RequestBody适用于处理 JSON 格式的请求体数据@PathVariable适用于从 RESTful 风格的 URL 中提取路径变量@RequestHeader适用于访问 HTTP 请求头信息@CookieValue适用于从请求中获取特定的 Cookie 值
版权归原作者 码农研究僧 所有, 如有侵权,请联系我们删除。