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")
    @ResponseBody
    public 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")
    @ResponseBody
    public User addUsera(@RequestBody User user){
        System.out.println("RequestBody---JSON数据");
        return user;
    }

    @GetMapping("user/{id}")
    @ResponseBody
    public 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 {
    /*拦截器 HandlerInterceptor
       springmvc中提供一个请求预处理组件。
       1 preHandle 返回 boolean 在handler执行之前处理  返回true放行请求,返回false终止请求
       2 postHandle handler执行完成后处理
       3 afterCompletion  Springmvc整个请求过程执行完毕后处理
    * */

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("1-------preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("2-------postHandle");
    }

    @Override
    public 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)
    @ResponseBody
    public 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、视图负责将结果显示到浏览器(客户端)。

相关推荐
探索java10 分钟前
Spring MVC框架中全局异常处理机制详解
java·spring·mvc
要努力赚钱10 分钟前
抱着 GPU 取暖:大模型训练那些高阶玩法
后端
树獭叔叔18 分钟前
Node.js 事件循环:单线程模型下的并发魔法
后端·node.js
AI必将改变世界29 分钟前
【软考系统架构设计师备考笔记5】 - 专业英语
java·开发语言·人工智能·笔记·系统架构·英语
程序员小假31 分钟前
我们来说一说 悲观锁、乐观锁、分布式锁的使用场景和使用技巧
后端
_祝你今天愉快32 分钟前
Java Lock
android·java·后端
jzy371142 分钟前
minio集群安装(3节点模拟4节点)
后端
林太白1 小时前
Rust新增优化
后端·rust
熊猫片沃子1 小时前
mybatis 与mybatisplus 比较总结
java·后端·mybatis
brzhang1 小时前
昨天我和同事聊聊架构这事儿,特别是怎么才能睡个好觉,有点点收获
前端·后端·架构