SpringMVC基础

发布于:2025-08-07 ⋅ 阅读:(21) ⋅ 点赞:(0)

一、注解使用及概念解释

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


网站公告

今日签到

点亮在社区的每一天
去签到