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

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.dtcms.com/a/317748.html

相关文章:

  • 关于 idea 里 properties 文件的中文乱码问题
  • 「iOS」————单例与代理
  • 使用PHP与Apache实现服务器端文件管理
  • 19day-人工智能-机器学习-分类算法-决策树
  • docker 部署Bedrock Connector
  • 希尔排序:高效插入排序的进阶之道
  • 从零开始部署Qwen3-8b大模型到本地
  • Centos 安装 redis
  • 17_INIT_WORKLinux内核模块
  • prefetch 下载 GEO 数据注意事项
  • 设计模式—桥梁模式(Bridge)
  • 移动端跨平台框架(支持Harmony、iOS、Android)
  • 《第十篇》深入解析 `MilvusKBService`:基于 Milvus 的知识库服务实现
  • 在线计算“蛋白-蛋白复合物”的MM/GBSA
  • KMP算法详解及应用指南
  • Cartographer安装测试与模块开发(四)--Cartographer纯定位思路
  • 【代码随想录day 12】 力扣 102.107.199. 二叉树的层序遍历
  • 数据库设计方法详解
  • Spring之【初识AOP】
  • 应急响应linux
  • 英伟达算力卡巅峰对决:H100、A100与消费级显卡哪里找?
  • 数语科技登陆华为云商店,助力企业释放数据潜能
  • day20|学习前端
  • JavaScript 基础语法
  • 频数分布表:数据分析的基础工具
  • Adobe Analytics 数据分析平台|全渠道客户行为分析与体验优化
  • Qt 容器类详解:顺序容器与关联容器及其遍历方法
  • [LVGL] 配置lv_conf.h | 条件编译 | 显示屏lv_display
  • 组合模式(Composite Pattern)及其应用场景
  • 基于spring boot的个人博客系统