您现在的位置是:首页 >学无止境 >Spring Mvc网站首页学无止境

Spring Mvc

Michael byte 2024-06-12 18:01:02
简介Spring Mvc

一.什么是SpringMVC

SpringMVC是对MVC思想的具体实现,它是一个继承Servlet API的框架,是一个Web框架,当我们在地址栏输入URL的时候,SpringMVC项目就能感知到我们的请求

MVC其实就是Model、View、Controller的缩写,它是一种设计思想,是一种软件架构模式

 用户发送请求给Controller,Controller主要是用来安全校验的,来验证前端传来的参数是否合法,

然后Controller把请求信息在转发给Model,Model是一种数据模式(把Controller发送过来的数据进行计算,然后把结果返回给控制器),这时控制器并不会直接把结果给用户,因为Model传过来的数据用户可能看不懂,因此Controller会把Model返回来的结果先交给View(进行数据解析,然后渲染,)把能看懂的数据交给用户。

二.SpringMVC项目的创建

SpringMVC项目的创建

三 @RequestMapping注解

是Spring Web应用程序最常见的注解之一,它用来注册接口的路由映射,

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

@RequestMapping("/up")  //路由注册
@RestController     
public class Hello {
    @RequestMapping("/say")
    public String sayhi(String name)
    {
        return name;
    }

@ RequestMapping可以修饰类,也可以修饰方法,当修饰类和方法时,访问的地址是类+方法

也可以直接修饰在方法上,类上不加

@RequestMapping("/say")
    public String sayhi(String name)
    {
        return name;
    }

 此时访问的地址是方法

 四. 获取参数

(1)获取单个参数

 @RequestMapping("/say")//路由注册
    public String sayhi(String name)
    {
        return name;
    }

(2)获取多个参数

 @RequestMapping("/saye")
    public String saye(String name,Integer age)
    {
        return "姓名是:"+name+"年龄是"+age;
    }

这里注意一点,age我们最好是声明它为Integer 类型,这样当我们不给它传参数的时候它会默认为null,如果是int类型,我们不给它传参数则会报错

(3)获取普通对象

import lombok.Data;

@Data
public class Student {
    public String name;
    public Integer age;
    public Integer id;

}
 @RequestMapping("/sayu")
    public Object sayu(Student student)
    {
        return student;
    }

() 

(4)用RequestBody获取json对象

 @RequestMapping("/sayp")
    public Object sayp(@RequestBody Student student)
    {
        return student;
    }

 

@RequestMapping默认支持那些请求方法呢?我们用postman测试一下 

这种情况下默认支持所有的请求方法,  

那如何指定请求方法呢?

以指定get方法为例

(1)通过注解指定相应的请求方法

(2) 通过给method赋值的方式指定

(5) 后端参数重命名的获取

受实际业务场景的需要,前端传过来的参数和后端实际接收的不一样,这时候我们@RequestPara

这个注解

在@RequestParam注解中我们用value声明前端的参数,然后再把这个参数赋给name,这样就解决了前后端参数不一致的问题

   @RequestMapping("/saym")
    public Object saym(@RequestParam(value = "username") String name)
    {
        return name;
    }

这里其实还涉及到另一个参数required,默认情况下required为true,当前端传过来的参数不是username的时候就会报错

此时如果我们把required设置为false,此时意味着前端可传可不传username参数,此时如果我们不传username此时不会报错,但是因为没拿到这个参数,最后返回的name是null

(6)@PathVariable获取基础Url中的参数

@RequestMapping("/sayo/{name}/{password}")
    public String saye(@PathVariable String name,@PathVariable String password )
    {
        return name+password;
    }

 

 当前端和后端参数不一致时,

用value重命名一下

 @RequestMapping("/sayo/{name}/{pwd}")
    public String saye(@PathVariable String name,@PathVariable(value="pwd") String password )
    {
        return name+password;
    }

当前端参数可传可不传,我们可以将required置为false

 @RequestMapping("/sayo/{name}/{pwd}")
    public String saye(@PathVariable String name,@PathVariable(required = false) String password )
    {
        return name+password;
    }

这时password值为null

(7)cookie和header的获取

传统获取cookie和header

  @RequestMapping("/getck2")
    public Object getck2(HttpServletResponse response,HttpServletRequest request)
    {
        String name=request.getParameter("name");
        Cookie[]cookies=request.getCookies();
        String useragent=request.getHeader("User-Agent");
        return name+" "+useragent;
    }

我们发送一个请求,然后看一下返回结果

然后我们在抓一下包,看一下信息

更简单的方式通过注解@CookieValue获取cookie

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

 更简单的方式通过注解@RequestHeader方式获取Header

  @RequestMapping("/getheader")
    public Object m(@RequestHeader("User-Agent") String useragent)
    {
        return useragent;

    }

 (8)session的获取

传统的获取session的方式

@RequestMapping("/setsession")
    public void set(HttpServletRequest request)
    {
        //参数设置为true,如果不存在session,就创建一个session
        HttpSession session= request.getSession(true);
        if(session!=null)
        {
            session.setAttribute("username","java");
        }

    }

    @RequestMapping("/getsession")
    public String get(HttpServletRequest request)
    {
        HttpSession session= request.getSession();
        String username="";
        if(session!=null&&(String)session.getAttribute("username")!=null)
        {
            username=(String)session.getAttribute("username");
        }
        return username;
    }

更简洁地通过 @SessionAttribute注解来获取

 @RequestMapping("/getsess")
    public Object getsess(@SessionAttribute("username") String name)
    {
        return name;
    }

(9)上传文件:@RequestPart

我们使用postman发送请求

前端三要素:

1.请求方法:get

2.设置key:myfile

3.选择要上传的文件

那么服务器这边接收到文件如何存储呢?这里我们介绍一下本地存储的方式

本地存储:将文件存储到本地服务器磁盘里 

(1)指定路径和文件名

这里要注意一点,如果我们上传的文件比较大的话,会报错,在SpringBoot中,文件上传,默认单个文件大小为10MB,如果上大文件的话,我们在application.properties配置文件里进行一下配置:

spring.servlet.multipart.max-file-size=100MB
spring.servlet.multipart.max-request-size=100MB

这种写法是存在问题的,当我们再重新上传图片的时候,后面的图片会覆盖前面的,因为它们的路径和文件名相同 ,要解决这一问题,我们,可以随机生成文件名

(2)randomUUID()方法随机生成文件名

 @RequestMapping("/hii")
    public Object hii(@RequestPart("myfile") MultipartFile file)
    {
        //randomUUID()方法随机生成文件名
        String newflie= UUID.randomUUID()+file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        System.out.println(newflie);
        File fileave=new File("D:\123\student\"+newflie);
        try {
            file.transferTo(fileave);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }

五. 返回数据

(1).返回前端页面

在static文件夹底下,我们建一个hi.html文件

然后我们通过代码的方式返回这个页面:

 @RequestMapping("/gethtml")
    public Object gethtml()
    {
        return "hi.html";
    }

然后我们输入url访问发现报错了

这时因为我们get.html底下并没有hi.html这个文件,这时我们再加上一个/,返回一个/hi.html(表示从从根目录下去找这个界面) 

(2)返回数据

类外添加@ResponseBody这个注解表示返回数据而不是界面,当类使用@Controller这个注解的时候,我们还可以使用@RestController(相当于@Controller@ResponseBody)

 @RestController

RestController
public class Hello {
    @RequestMapping("/say")
    public String sayhi(String name)
    {
        return name;
    }

@Controller@ResponseBody

@Controller
@ResponseBody
public class Hello {
    @RequestMapping("/say")
    public String sayhi(String name)
    {
        return name;
    }

六.请求转发或请求重定向

请求转发和请求重定向的区别:

含义不同

(1)请求转发指的是客户端发送一个请求给服务器,然后服务器会将请求转发给目标地址,然后再将目标地址返回的结果返回给服务器

(2)请求重定向指的是:客户端发送一个请求给服务器,然后服务器会向客户端返回一个临时响应头,这个响应头里记录了再次发送请求的URL地址,然后客户端重新发送请求到这个新的URL地址

请求方不同

(1)请求转发服务器的行为,服务器代替客户端发送请求,然后把结果返回给客户端

  (2)重定向是客户端的行为,服务器将目标地址返回给客户端,然后客户端再重新发送请求到目标地址

(3)数据共享不同

 请求转发:客户端只发送一次请求,所以客户端发送请求到服务器返回结果的过程中数据是共享的,请求重定向:客户端一共发送两次请求,所以两次请求的数据是不共享的。

(4)最终的url不同

请求转发的URL不变,而请求重定向的URL会变成服务器返回的地址

(5)代码实现方式不同

请求转发

 @RequestMapping("/get")
    public Object get()
    {
        return "forward:/hi.html";
    }

 

我们看到请求转发的URL不变 

请求重定向

 @RequestMapping("/gete")
    public Object gete()
    {
        return "redirect:/hi.html";
    }

 而请求重定向的URL是要变的

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。