SpringMVC~MVC设计模式、实现用户请求和程序关联、得到用户的参数

SpringMVC~MVC设计模式、实现用户请求和程序关联、得到用户的参数,第1张

文章目录
  • SpringMVC介绍
  • MVC设计模式
  • MVC使用举例
  • 作用1:实现用户请求和程序关联
      • @RequestMapping注解
      • 修饰类+方法
      • 只修饰方法
      • post请求还是get请求
      • @GetMapping 和 PostMapping
  • 作用2:得到用户的参数
      • 单个参数
      • 多个参数-通过对象的方式
      • 参数重命名(参数映射)
      • @PathVariable
      • @RequestPart

SpringMVC介绍

SpringMVC全称是Spring Web MVC,是基于Servlet API构建的原始Web框架。Spring MVC是Spring的一个核心模块,专门用来处理和web相关的 *** 作,所以是一个Web框架,基于Servlet API进行构建。

  • Spring MVC是Spring的一个核心模块
  • Spring MVC是一个轻量级的Web框架
  • Spring MVC继承于Servlet API.
MVC设计模式

MVC全称是Model View Controller ,即模型视图控制器.这是一种工程软件中常用的架构模式,是一种思想,而SpringMVC是这种思想的具体实现。

三个部分:

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

总结:Spring MVC是一个实现了MVC思想,继承了Servlet API的Web框架,是Spring的一个核心模块。

MVC使用举例

我们创建一个UserController类,然后在浏览器中输入URL映射到这个类中,输入一些信息。

package com.example.demo.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/hi")
    public String sayHi(){
        return "Hello,Spring MVC.";
    }
}

在SpringMVC项目中,默认return返回的是一个页面,如果不想要返回页面,可以添加@ResponseBody注解,定义返回的数据格式非页面,即非视图(html/text)。
在浏览器中访问:

作用1:实现用户请求和程序关联 @RequestMapping注解

在MVC中通过 @RequestMapping注解来注册接口的路由映射

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

修饰类+方法

@RequestMapping即可修饰类,也可以修饰方法,当修饰类和方法时,在浏览器中访问的url是:类+方法

在UserController类中添加类访问路径class,方法访问路径method:

package com.example.demo.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
@RequestMapping("/class") //注解类
public class UserController {

    @RequestMapping("/method") //注解方法
    public String sayHi(){
        return "访问的url是类加方法";
    }
}

在浏览器中访问:

只修饰方法

@RequestMapping只修饰方法时,url只有方法。

package com.example.demo.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
public class UserController {
    @RequestMapping("/hi")
    public String sayHi(){
        return "this is a message.";
    }
}

进行访问:

post请求还是get请求

@RequestMapping默认支持的是Get请求。但也可以在代码中指定接受Post请求:

package com.example.demo.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
@RequestMapping("/p")
public class UserController {
    @RequestMapping(value="/message",method= RequestMethod.POST)
    public String sayHi(){
        return " 这是一条来自post请求的信息.";
    }
}
@GetMapping 和 PostMapping

指定Get请求的url的写法:

    //写法1:
    @Requestmapping("/message")
    //写法2:
    @RequestMapping(value="/message",method = RequestMethod.GET)
    //写法3:
    @GetMapping("/message")

指定Post请求的url的写法:

// 写法1
@RequestMapping(value = "/index",method = RequestMethod.POST)
// 写法2
@PostMapping("/index")

@RequestMapping在不指定任何参数的情况下,即只设置了路由地址时,此方法是即支持Get请求又支持Post请求的。
当给@RequestMapping设置了method属性之后,那么它只能支持设置的请求类型,其他类型会报错(405)。

@GetMapping 和PostMapping,在不设置路由的情况下,两者是和@RequestMapping作用相同的,只不过一个只支持get请求方法,另一个支持post请求方式,且这两个Mapping注解只能修饰方法,不能修饰类。

作用2:得到用户的参数 单个参数
@GetMapping("/reg")
    public String reg(String name){
        return "注册成功:"+name;
    }
多个参数-通过对象的方式

在UserController类中如下方法,用户可以通过url映射到reg方法,然后reg方法会返回一个对象

 @GetMapping("/res")
    public Object reg(User user){
        return user;
    }

User类中:

package com.example.demo.model;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
    private String name;
    private int age;
    private String password;
    private int sex;
    //..其他所有参数
}

前端传递参数时,可以对应User类中的参数,一次传入多个:

参数重命名(参数映射)

当前端传入的参数名称与后端不匹配时,会导致接收不到参数的情况:
前端传入time,后端用createtime接受:

 @GetMapping("/res")
    public String setTime(String createtime){
        //do something....
        return  "时间:"+createtime;
    }

接收不到参数:

此时就可以通过重映射的方式,将前端的参数名映射到后端参数名称,这样在后端代码量非常大,不便修改时可以很轻松的解决问题:

  @GetMapping("/res")
    public String setTime(@RequestParam("time") String createtime){
        //do something....
        return  "时间:"+createtime;
    }

成功接收参数:

当我们用@RequestParam重映射了一个参数后,这个参数就不可以为空,为必传参数,如果为空,会抛出错误:

如果想要设置这个参数可以为空,不是非必传参数,可以修改required属性:
默认是true,必传,改为false,可为空。

 @GetMapping("/res")
    public String setTime(@RequestParam(value="time",required = false) String createtime){
        //do something....
        return  "时间:"+createtime;
    }
@PathVariable

通常情况下我们前端的参数都是通过form表单的形式传递给后端,而不是在url中获取,但有些情况下,为了增加搜索权重,我们会在url中直接获取参数:

 @GetMapping("/p/{name}/{age}")
    public String urlParam(@PathVariable String name,@PathVariable Integer age){
        return "姓名:"+name+",年龄:"+age;
    }

通过注解@PathVariable,将参数对应到具体内容,其功能是:接收请求路径中占位符的值

输入:

@RequestPart

@RequestPart主要用来处理content-type为 multipart/form-data 或 multipart/mixed stream 发起的请求,可以获取请求中的参数,包括普通文本、文件或复杂对象比如json、xml等,针对json等复杂对象,需要明确对应的content-type。

 @RequestMapping("/file")
        public String upload(@RequestPart("myfile") MultipartFile file){
        //1.上传文件目录(从配置文件中读取)
        String basePath=uploadPath;

        //2.生成动态文件名(包含后缀)xxx.jpg
        String fileName= UUID.randomUUID()+(file.getOriginalFilename().substring(file.getOriginalFilename().indexOf(".")));

        //保存文件
        try {
            file.transferTo(new File(basePath+fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "上传成功!";
    }

在postman中进行访问,成功上传:

在对应的C盘log目录下成功出现文件:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/719518.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-25
下一篇 2022-04-25

发表评论

登录后才能评论

评论列表(0条)

保存