当前位置: 首页 > web >正文

SpringMVC基础

一、注解使用及概念解释

1.1、SpringMVC M 模型 V 视图 C 控制器

也有这种设计模式
设计模式(......)不是新的技术 是优秀代码的实现

1.2、转发和重定向

在springmvc中 
转发 return "forword:easyb" 默认就是转发
重定向      return "redirect":
  • easya方法中设置了request属性,但使用了redirect重定向

  • 重定向会发起新的请求,原request对象及其属性不会传递到新请求中

  • 所以在easyb方法中获取不到student_name属性

@RequestMapping("easya")
public String easya(HttpServletRequest request){request.setAttribute("student_name","张三");return "redirect:easyb";//默认是转发到b
}@RequestMapping("easyb")
@ResponseBody
public String easyb(HttpServletRequest request, HttpServletResponse response){System.out.println(request.getAttribute("student_name"));return "method B";
}

如果需要在方法间传递数据:

  1. 使用转发(forward)

    return "forward:easyb"; // 保持同一个请求
  2. 使用重定向时传递参数

    return "redirect:easyb?student_name=张三"; // 通过URL参数传递
  3. 使用会话(Session)

    request.getSession().setAttribute("student_name", "张三");
    return "redirect:easyb";

总结对比表

特性转发(forward)重定向(redirect)
请求次数1次2次
URL变化不变改变
数据传递保持request属性不保持request属性
速度更快更慢
使用场景同一应用内的页面跳转跨应用跳转或需要改变URL时

1.3 关于 @RequestMapping("easya") 的解释

基本功能

  1. 映射地址

    • @RequestMapping("easya") 指定了一个映射地址 /easya

    • 当用户访问这个地址时,Spring MVC 会调用被注解的方法

  2. Handler 封装

    • Spring MVC 会将标注了 @RequestMapping 的方法封装成一个 Handler(处理器)

    • 这个 Handler 包含两部分信息:

      • 地址(如 /easya

      • 要执行的方法(Method)

注解使用位置

@RequestMapping 可以标注在:

  1. 类级别(Type Level)

    • 定义该类中所有方法的公共路径前缀

    • 例如:@Controller @RequestMapping("easy")

  2. 方法级别(Method Level)

    • 定义具体处理方法的路径

    • 例如:@RequestMapping("A")

组合路径规则

当类和方法上都有 @RequestMapping 时:

  • 类路径 + 方法路径 = 完整访问路径

  • 如您例子中:

    • 类上标注 @RequestMapping("easy")

    • 方法上标注 @RequestMapping("A")

    • 则完整访问路径为 /easy/A

实际代码示例

java

@Controller
@RequestMapping("easy")  // 类级别映射
public class MyController {@RequestMapping("A")  // 方法级别映射public String methodA() {return "viewA";}@RequestMapping("B")  // 方法级别映射public String methodB() {return "viewB";}
}
  • 访问 /easy/A → 调用 methodA()

  • 访问 /easy/B → 调用 methodB()

其他特性

  1. 支持多种请求方法

    • 可以指定处理哪种 HTTP 方法(GET/POST/PUT/DELETE 等)

    • 例如:@RequestMapping(value="A", method=RequestMethod.GET)

  2. 路径变量

    • 支持 RESTful 风格的路径变量

    • 例如:@RequestMapping("users/{id}")

  3. 组合注解

    • Spring 4.3+ 提供了更简洁的注解:

      • @GetMapping@PostMapping 等

      • 这些是 @RequestMapping 的特定方法变体

二、SpringMVC常见注解(1到11 11!!!)

@PutMapping("user")@ResponseBodypublic User editUser(User user) {return user;}@DeleteMapping("user/{id}")public boolean deleteUser(@PathVariable("id") int id){return false;}@PostMapping("user")public User addUser(@RequestParam User user){System.out.println("RequestParam---表单数据");return user;}@PostMapping("usera")@ResponseBodypublic User addUsera(@RequestBody User user){System.out.println("RequestBody---JSON数据");return user;}@GetMapping("user/{id}")@ResponseBodypublic User getOne(@PathVariable("id") int id){User user=new User();user.setId(id);user.setUsername("zhangsan");user.setPassword("123123");return user;}
}

1 @GetMapping get请求映射 获取数据

2 @PostMapping post 请求映射 新增数据

3 @PutMapping put请求映射 修改数据

4 @DeleteMapping delete请求映射 删除数据

5 @ResponseBody 将下面方法体内的内容转化成JSON

js:{name:'zhangsan'} JSON :"{"name":"zhangsan")"

6 @GetMapping("user/{id}")  

7 @PathVariable 获取地址上的参数


8 @ResponseBody将方法的放回直接写入Response中,取消默认转发形式

springmvc中返回对象,会使用JACKSON工具包将对象转成JSON数据

//9  @RequestBody接收JSON格式的参数 并且json格式的参数只能接收一个 下面只能一个   //  (user)
10  @PostMapping("user")
public User addUser(@RequestParam User user){
System.out.println("RequestParam---表单数据");
return user;
}

@PostMapping("usera")
@ResponseBody
public User addUsera(@RequestBody User user){
System.out.println("RequestBody---JSON数据");
return user;
}//对应第9个

11、@RequestMapping("")

//接收参数
//1、通过值的方式接受
@RequestMapping("easyaa")
public void easya(@RequestParam("num") int num){System.out.println(num);
}
//2、使用Map接收
@RequestMapping("easybb")
public void easya(@RequestParam Map params){System.out.println(params);
}
//3、使用封装对象 (最推荐)
@RequestMapping("easycc")
public void easycc(UserQueryParams params) {System.out.println("用户名: " + params.getUsername());System.out.println("年龄: " + params.getAge());System.out.println("邮箱: " + params.getEmail());
}  有一个类定义在前

三、SpringMVC常见方法

3.1、get add delete edit方法

获取数据 getuser 新增数据  adduser 删除数据 deleteuser
修改数据 edituser

3.2、RESTFUL风格

Restful风格  Get:user/1 Post:user Delete:user/1 Put:/user
REST  资源状态转换
REST思想将服务器中所有可以通过地址访问的内容,都看成一个资源,
每一个资源都有一个对应的地址,访问该地址就访问到了该资源,
对这个资源的处理(增删改查)转换成了对这个资源的请求方式

编写Restful风格的请求可以在类上标注@RestController注解
标注@RestController注解后,该类中所有的请求方法相当于默认使用@ResponseBody

3.3、拦截器  HandlerInterceptor

package com.easy.controller;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class EasyInterceptor implements HandlerInterceptor {/*拦截器 HandlerInterceptorspringmvc中提供一个请求预处理组件。1 preHandle 返回 boolean 在handler执行之前处理  返回true放行请求,返回false终止请求2 postHandle handler执行完成后处理3 afterCompletion  Springmvc整个请求过程执行完毕后处理* */@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("1-------preHandle");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("2-------postHandle");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("3-------afterCompletion");}
}

3.4、异常处理器  ExceptionHandler(异常类型)

package com.easy.controller;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;@ControllerAdvice
public class EasyExceptionHandler {/*异常处理器* ExceptionHandler(异常类型)** 1.ExceptionHandler定义在Controller中只对当前类中的方法起作用* 2.可以使用@ControllerAdvice标注类,类中的异常处理器就是全局的异常处理器* */@ExceptionHandler(RuntimeException.class)@ResponseBodypublic String handlerRunTimeException(){return "发生了一点小问题,请稍后";} @ExceptionHandler(value={NullPointerException.class, IndexOutOfBoundsException.class})public String handlerNullPointerException(){return "有个小外衣没找到";}
}

3.5、SpringMVC视图登录小部分

接下来我使用伪代码简单表述一下此图
// 浏览器端流程
Browser {当用户访问 main.html {if (用户未登录) {拦截器.拦截请求();重定向到 login.html;} else {显示 main.html 内容;显示当前登录用户信息;}}当用户点击"退出登录" {清除用户登录状态;重定向到 login.html;}
}// 拦截器逻辑
Interceptor {boolean preHandle(request, response) {if (request 访问的是需要登录的页面 && 用户未登录) {重定向到 login.html;return false; // 拦截请求}return true; // 放行请求}
}// 登录页面
login.html {显示登录表单;当用户提交登录信息 {发送请求到 LoginController;if (返回"登录成功") {跳转到 main.html;} else {显示"用户名或密码错误";}}
}// 控制器
LoginController {@PostMapping("/login")String handleLogin(用户名, 密码) {if (用户服务.验证(用户名, 密码)) {创建用户会话;return "redirect:/main.html";} else {return "用户名或密码错误";}}@GetMapping("/logout")String handleLogout() {销毁用户会话;return "redirect:/login.html";}
}

3.6、SpringMVC改文件:

package com.easy.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.util.UUID;@RestController
public class FileUploadController {@RequestMapping("upload")public String upload(@RequestParam("file") MultipartFile file) throws IOException {String oldName=file.getOriginalFilename();//文件原有名称String fileType=oldName.substring(oldName.lastIndexOf("."));//截取后缀名String newName= UUID.randomUUID().toString()+fileType;//新的文件名File target=new File("D:/uploadfile/"+newName);//要存储的目标路径file.transferTo(target);return "/easyfile/"+newName;}
}

3.7、SpringMVC文件路径目标配置:

package com.easy.config;

import com.easy.controller.EasyInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class EasyConfig implements WebMvcConfigurer {

    @Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new EasyInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/easyaa");
}

    @Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/easyfile/**").addResourceLocations("file:D:/uploadfile/");
}
}

四、springMVC的执行顺序。

例,接收到客户发来的请求,MVC怎么运行??即这道题,非常重要

4.1、用户通过浏览器发起一个 HTTP 请求,该请求会被 DispatcherServlet(前端控制器)拦截;

4.2、DispatcherServlet 调用 HandlerMapping(处理器映射器)找到具体的处理器(Handler)及拦截器,

4.3、HandlerMapping将Handler以 HandlerExecutionChain 执行链的形式返回给 DispatcherServlet。

4.4、DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);

4.5、HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(即 Controller 控制器)对请求进行处理;

4.6、Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC 的底层对象,包括 Model 数据模型和 View 视图信息);

4.7、HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;

4.8、DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;

4.9、ViewResolver 解析完成后,会将 View 视图并返回给 DispatcherServlet;

4.10、DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);

4.11、视图负责将结果显示到浏览器(客户端)。

http://www.xdnf.cn/news/17248.html

相关文章:

  • Linux部署tp5.1,nginx服务器不管访问那个方法,一直访问index/index问题解决方法
  • 【YOLOv8改进 - C2f融合】C2f融合EBlock(Encoder Block):低光增强编码器块,利用傅里叶信息增强图像的低光条件
  • 环保监测新范式:边缘计算网关如何为河长制赋能增效?
  • Java面试宝典:Java内存模型与对象可达性判定原理
  • NWinfo(硬件信息检测工具)v1.4.20绿色免费版,U盘随走随检,结果即刻导出
  • ⭐CVPR 文本到 3D 场景生成新突破:Prometheus 框架解析
  • 贪心算法学习 跳跃游戏
  • app-3
  • 实习文档背诵
  • 2.1.4 砌体材料的性能与应用
  • SG105 Pro 网管交换机的3种VLAN配置
  • 强化应急通信生命线:遨游三防平板、卫星电话破局极端灾害救援
  • 无人机图传的得力助手:5G 便携式多卡高清视频融合终端的协同应用
  • Tdesign-React 请求接口 415 问题借助 chatmaster 模型处理记录
  • 嵌入式学习的第四十四天-ARM
  • 图解 Claude Code 子智能体 Sub-agent
  • CGAL Kernel 和 Traits 类深度解析:从官方教程到实践应用
  • 爆炸粒子效果
  • 记一次ORACLE ORA-00600 [19004] 错误的分析与解决方法
  • python每日一题 贪心算法
  • 【第6话:相机模型2】相机标定在自动驾驶中的作用、相机标定方法详解及代码说明
  • Python虚拟环境完全指南:pyenv vs venv 在macOS上的使用详解
  • 【代码随想录day 12】 力扣 102.107.199. 二叉树的层序遍历
  • SQL Server 2000企业管理器不能执行查询
  • cygwin+php教程(swoole扩展+redis扩展)
  • 利用DeepSeek改写并增强测试Duckdb和sqlite的不同插入方法性能
  • 高可用改造之构建​​双活冗余的TDengine时序数据处理架构
  • LeetCode——2411. 按位或最大的最小子数组长度
  • 浮动路由和BFD配置
  • 协同过滤基础——基线预测器(Baseline Predictors)