Spring MVC 功能及常用注解

一、什么是 Spring MVC?

1.Spring MVC 功能

Spring MVC是一种Web框架,从一开始就包含在 Spring 框架中,它是基于 Servlet API构建的, 它提供了一种基于模型-视图-控制器(MVC)的Web开发模型。 Spring MVC的核心是DispatcherServlet,它负责接收HTTP请求,将请求分发给相应的控制器,并将控制器的结果返回给客户端。

Spring MVC的控制器是一个Java类,它负责处理HTTP请求并返回响应。控制器通常包含一个方法,该方法将HTTP请求映射到相应的视图。视图是一种用于呈现数据的模板,它可以是HTML、JSON、XML等格式。

2.MVC 相关定义

MVC 是一种思想,而Spring MVC 是对 MVC 思想的具体实现。

MVC 是 Model View Controller 的缩写,它是软件⼯程中的⼀种软件架构模式,它把软件系统分
为模型、视图和控制器三个基本部分

  • Model(模型) 是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。
  • View(视图) 是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。
  • Controller(控制器) 是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

二、Spring MVC 常用注解

前提:在 Spring Boot 项目基础上引入 Spring Web 依赖。

1. @RequestMapping

功能:是用来注册接口的路由映射的

路由映射:所谓的路由映射指的是,当用户访问一个 url 时,将用户的请求对应到程序中某个类的某个方法的过程就叫路由映射

@RequestMapping 常用参数:

  • value: 指定 URL 请求的实际地址
  • method: 指定请求的 method 类型, 例如GET、POST、PUT等,

以下代码设置了路由请求类型

@RestController     @RestController=@Controller+@ResponseBody
@ResponseBody     //定义返回的数据格式为非视图(text/html)。
public class UserController {
    @RequestMapping(value = "/sayhi",method = RequestMethod.POST)   //post请求才能访问
    public String sayHi(){
        return "hi spring mvc";
    }
}

2. @GetMapping 和 @PostMapping

“另一种设置请求类型的写法”

@RestController
@ResponseBody     //定义返回的数据格式为非视图(text/html)。
public class UserController {

    @PostMapping("/sayhello")   //请求类型为 POST
    public String sayhello(){
        return "hello spring mvc";
    }
    @GetMapping("/hi")       //请求类型为 GET
    public String hi(){
        return "spring mvc hi";
    }
}

3. 传递单个或多个参数

请求路径:http://localhost:8080/sayhi?name=zhangsan

    //传一个或多个参数
    @RequestMapping("/sayhi")
    public String sayHi(String name){    //传递单个参数
        return "hi "+name;  //如果传递的不带参数的话,返回的是 null
    }

4. 传递参数为对象

首先要在后端定义一个 Java 类,比如 UserInfo 实体类

import lombok.Data;

@Data
public class Userinfo {
    private int id;
    private String name;
    private String password;
    private int age;
}

请求路径: http://localhost:8080/reg?name=zhangsan&password=123

@RequestMapping("/reg")
    public Object reg(Userinfo userinfo){
        System.out.println(userinfo);
        return userinfo;
    }

@RequestParam 后端参数重命名 及 设置参数是否必传

某些特殊的情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,比如前端传递了一个username 给后端,而后端又是有 name 字段来接收的,这样就会出现参数接收不到的情况,如果出现这种情况,我们就可以使用 @RequestParam 来重命名前后端的参数值。
例如:
请求路径: 127.0.0.1:8080/reg?username=zhangsan&password=123

 @RequestMapping("/reg")
      //对参数进行重命名  (前端传username)    
      //required=false -> 表示username 为非必传参数
    public Object reg(@RequestParam(value = "username",required = false) String name,String password){
        return name+": "+password;
    }

5. 传递参数为 JSON 对象 (参数前加@RequestBody注解 )

@RequestMapping("/reg3")
    public Object reg3(@RequestBody Userinfo userinfo){
        return userinfo;
    }

6. 获取URL中参数 (?之前的参数) (@PathVariable)

请求路径:127.0.0.1:8080/reg4/{zhangsan}/{123}

// 从基础 URL 中获取参数 ?之前的参数  (不是从 URL 参数中获取)
    @RequestMapping("/reg4/{name}/{pwd}")
    public Object reg4(@PathVariable String name,@PathVariable("pwd") String password){
        return "name->"+name+"  |  password->"+password;
    }

7. 上传文件 @RequestPart

 @RequestMapping("/myupload")
    public Object upload(@RequestPart("img")MultipartFile file)  {
        String  fileName= UUID.randomUUID()+   //文件名
                file.getOriginalFilename().substring(  //文件后缀
                        file.getOriginalFilename().lastIndexOf("."));

        File saveFile=new File("E:\\Java\\TestFile\\"+fileName);
        try {
            file.transferTo(saveFile);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

8. 获取Cookie、Session、header

8.1 获取Cookie @CookieValue

// 获取cookie
    @RequestMapping("/getck")
    public Object getCk(@CookieValue(value = "java",required = false) String java){
        return java;
    }

8.2 获取 Header 中的某个信息 @RequestHeader

// 获取 Header 中的某个信息
    @RequestMapping("/gethd")
    public Object getHeader(@RequestHeader("User-Agent")String ua){
        return "header->"+ua;
    }

8.3 Session 的存储和获取
获取 Session

// 获取 session
	private static final String SESSION_KEY="USERINFO_SESSION_KEY";
    @RequestMapping("/getsession")
    public Object getSession(@SessionAttribute(SESSION_KEY)String name){
        return "session -> "+name;
    }

存储 Session

//存储 session
    private static final String SESSION_KEY="USERINFO_SESSION_KEY";
    @RequestMapping("/setsession")
    public void doPostConstruct(HttpServletRequest request){
        HttpSession session=request.getSession();
        session.setAttribute(SESSION_KEY,"zhangsan");
    }

9. 请求转发 和 请求重定向 (forward VS redirect)

后端给前端返回(return)不但可以返回一个视图,还可以实现跳转,跳转的方式有两种:

  • forward 请求转发;
  • redirect:请求重定向。
	//请求转发
    @RequestMapping("/fw")
    public Object fw(){
        return "forward:/index.html";
    }

	//请求重定向
    @RequestMapping("/rd")
    public Object rd(){
        return "redirect:/index.html";

forward 和 redirect 具体区别:

  1. 请求重定向(redirect)将请求重新定位到资源;请求转发(forward)服务器端转发。
  2. 请求重定向地址发生变化,请求转发地址不发⽣变化。
  3. 请求重定向与直接访问新地址效果⼀直,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值