看这儿!!! 带你了解spring mvc

目录

1.什么是Spring MVC         

1.1什么是mvc

1.2MVC与Spring MVC 之间的关系

2.spring mvc的重要性

3.Spring mvc项目创建

4.实现spring mvc web开发——用户端返回的请求

4.1@RequestMapping注解

4.2@ResponseBody

4.3@RequestMapping 是 post 还是 get 请求?

4.4显示的标明所使用的方法

4.4.1get请求的三种写法

4.4.2post请求的两种写法

4.5.转发和重定向

4.5.1转发

4.5.2重定向

4.6.自定义返回内容

5.实现spring mvc web开发——服务器接收客户端的请求

5.1.获取参数

5.1.1获取单个参数

5.1.2传递对象

5.1.3表单参数传递/传递多个参数(非对象)

5.1.4后端参数重命名

5.1.5设置参数必传@RequestParam 

​5.1.6@PathVariable注解获取URL中参数

5.2获取请求头 ——Cookie/Session/header

5.2.1获取header

​5.2.2获取Cookie

5.2.3session的存储和获取


1.什么是Spring MVC         

根据官方文档中得到:Spring web mvc ,通常称为Spring mvc,是基于servlet构件的原始web框架,从一开始就包含在spring框架中。

因此我们可以得到的信息为:

  1. spring mvc是web框架
  2. spring mvc 是基于servlet api  实现的

然而要理解spring mvc 我们首先要了解mvc是什么

1.1什么是mvc

mvc是Model View Controller的缩写,他是软件工程中一种软件架构模式,他把软件分为模型,视图,控制器三个部分。 

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

1.2MVC与Spring MVC 之间的关系

mvc是一种思想,而Spring mvc是对mvc这个思想的实现.总的来说,spring mvc实现了mvc模式,并继承了servlet api的框架。

2.spring mvc的重要性

现在绝大多数的Java项目都是基于spring(或者spring boot)来实现的,而spring 的核心就是spring mvc。也就是说spring mvc是spring框架的核心模块,而spring boot是spring的脚手架,因此我们可以直到市面上绝大多数项目约等于spring mvc项目。这就是我们要学spring mvc 的原因。

我们学习spring mvc掌握三个功能即可:

  1. 连接功能:将用户和Java程序连接起来,也就是说用户访问一个url,可以联系到我们的程序
  2. 获取参数的功能:用户访问的时候通常会获取参数,在程序中要想办法获取参数
  3. 输出数据的功能:执行业务逻辑之后,要把执行结果返回给用户

3.Spring mvc项目创建

配置我们的服务端口,端口号默认8080,可以显示标明,也可以配置别的端口号。

对于spring mvc的学习实现,我们使用ajax前后端分离的技术,遵循以下几点:

  • 约定好前后端的接口
  • 所有的接口都遵循http/https的应用层协议
  • 但对于一个接口的时候,通常基于http,并且请求响应的数据格式也要约定
  • 要明白前端的代码是运行在客户端浏览器中,后端的代码时运行在服务器上 

4.实现spring mvc web开发——用户端返回的请求

4.1@RequestMapping注解

RequestMapping注解是spring web框架中最常用的注解之一,主要用来注册接口的路由映射的

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

 通俗的来讲,就是@RequestMapping修饰类或者方法,定义请求的路径。完整的访问路径为:类路径 + 方法路径(类路径可以不用指定)

同时我们添加@Controller注解,表示该类是一个Bean,并且执行web请求和响应处理

4.2@ResponseBody

@ResponseBody注解的作用是将controller的方法返回的对象 通过适当的转换器 转换为指定的格式之后,写入到response对象的body区(响应体中),默认返回是JSON.如果该注解修饰类,表示类中所有的返回值格式都为JSON,修饰方法时,表示该方法返回JSON.

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@ResponseBody
@Controller
public class ArticleController {
    @RequestMapping("/u1")
    public Object u1(){
        Map<String,Object> map = new HashMap<>();
        map.put("a",123);
        map.put("b",true);
        map.put("c","abc");
        return map;
    }
}

这就是一个简单的 spring mvc 代码,我们就可以通过url获取到具体的内容

通常我们会使用@Controller 和@ResponseBody两个注解来使用,表示返回的为JSON格式并且这个类为执行web的请求和处理,因此,我们有@RestController将这两者的功能结合起来 :@RestController = @Controller + @ResponseBody

4.3@RequestMapping 是 post 还是 get 请求?

我们http协议中最常用的两个方法就是post/get方法,这两个可以涵盖大多数请求应答等的需求,那么我们@RequestMapping 是get还是post方法呢,我们可以使用postMan来测试。

@RequestMapping默认是get方法,不支持post方法

那么我们如何才能接收post请求

4.4显示的标明所使用的方法

4.4.1get请求的三种写法

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

4.4.2post请求的两种写法

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

4.5.转发和重定向

4.5.1转发

我们通常所返回的结果是一个JSON格式,但是其实我们还可以实现其他的非JSON的形式,包括转发和重定向。

package com.example.springmvc_study.controller;

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

@Controller//要返回重定向,不能设置响应格式
public class RedirectController {

    //返回值不作为响应体的时候,就只能返回String,表示我们重定向资源路径

//这是转发的代码
    @RequestMapping("/f")
    public String f(){
        //这是转发
        return "/index.html";   
        // return "forword:/index.html";两种写法
    }
}

此时没有重定向,是直接返回页面,这个属于转发,我们可以使用fiddler抓包响应观察:

4.5.2重定向

package com.example.springmvc_study.controller;

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

@Controller//要返回重定向,不能设置响应格式
public class RedirectController {

    //返回值不作为响应体的时候,就只能返回String,表示我们重定向资源路径
    //重定向
    @RequestMapping("/r")
    public String r(){
        return "redirect:/index.html";
    }
}

 此时页面发生了两次跳转:

此时执行路径为 :http://localhost:8080/r

 第二次跳转页面为:http://localhost:8080/index.html

 此时就完成了重定向。

4.6.自定义返回内容

我们在某些时候返回的不单单是上面的几种类型,需要返回特定的格式,此时我们就可以自定义。spring mvc提供了灵活处理响应的类ResponseEntity,可以手动设置响应状态码,响应格式,响应正文。

package com.example.springmvc_study.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;


@RestController
public class RespAnyController {

    @RequestMapping("/any")
    public ResponseEntity any() throws IOException {
        Path path = new File("C:\\Users\\15047\\Pictures\\Camera Roll\\4.jpg").toPath();
        byte[] bytes = Files.readAllBytes(path);
        return ResponseEntity.ok().header("content-type","application/x-jpg").body(bytes);
    }
}

他的执行结果可以直接保存在本地

5.实现spring mvc web开发——服务器接收客户端的请求

5.1.获取参数

5.1.1获取单个参数

在spring mvc 中,可以直接使用方法中的参数来实现传参:

@RequestMapping("/m1")
public Object method_1(String name){
    System.out.println("参数 name:"+name);
    return "/index.html";
}

 

5.1.2传递对象

package com.example.springmvc_study.model;

import lombok.Data;
@Data
public class User {
    private Integer id;
    private String username;
    private Integer age;
    private Integer weight;
}
    @RequestMapping("/complex")
    public Object complex(User user){
        user.setUsername("张三");
        user.setId(1);
        user.setAge(18);
        user.setWeight(80);
        return user;
    }

5.1.3表单参数传递/传递多个参数(非对象)

    @RequestMapping("/log")
    public Object log(String username, Integer age, int weight){
        Map<String,Object> map = new HashMap<>();
        map.put("user",username);
        map.put("age",age);
        map.put("weight",weight);
        return  map;
    }

5.1.4后端参数重命名

在特殊情况下,前端所传参数和后端服务器接收可以不一致,比如前端传入time,后端是由createtime来接收,此时参数不一致,那么就不能接收到参数。出现这种问题我们可以使用@RequestParam 来重命名前后端的参数值。

@RequestMapping("/m4")
public Object method_4(@RequestParam("time") String createtime) {
    System.out.println("时间:" + createtime);
    return "/index.html";
}

5.1.5设置参数必传@RequestParam 

同样使用@RequestParam注解来设置,在方法体写参数时使用@RequestParam 注解修饰,即可完成设置必传参数,如果前端不传入相应的参数或者传入参数不够,那么就会报错。

 @RequestMapping("/rp")
    public Object rp(@RequestParam String username, @RequestParam String email ,@RequestParam Integer age){
        Map<String,Object> map = new HashMap<>();
        map.put("username",username);
        map.put("email",email);
        map.put("age",age);
        return  map;
    }

其他情况:

5.1.6@PathVariable注解获取URL中参数

    @RequestMapping("/queryStudent/{name}")
    public Object queryStudent(@PathVariable String name){
        Map<String,Object> map = new HashMap<>();
        map.put("name",name);
        return  map;
    }

5.2获取请求头 ——Cookie/Session/header

5.2.1获取header

作用:使用@RequestHeader注解通过绑定请求头中的字段名,获取请求头的字段信息

这里我们获取请求头中的UA(标识浏览器的版本型号等)。

  @RequestMapping("/header")
    public Object header(@RequestHeader("User-Agent") String userAgent){
        Map<String,Object> map = new HashMap<>();
        map.put("User-Agent",userAgent);
        return  map;
    }

5.2.2获取Cookie

 作用:使用@CookieValue注解通过绑定cookie中的键名,获取cookie中的信息

   @RequestMapping("/cookie")
    public Object cookie(@CookieValue("My-Cookie") String cookie){
        Map<String,Object> map = new HashMap<>();
        map.put("My-Cookie",cookie);
        return  map;
    }

5.2.3session的存储和获取

session是工作在服务器中,例如一个用户登录之后,就会将他的信息等保存下来,然后我们就可以使用@SessionAttribute注解绑定设置session时的键来获取

    @RequestMapping("/login")
    public Object login(HttpServletRequest req){
        HttpSession session = req.getSession();
        session.setAttribute("user","123456");
        Map<String,Object> map = new HashMap<>();
        map.put("user","123456");
        return  map;
    }

    @RequestMapping("/getSession")
    public Object getSession(@SessionAttribute("user") String user){
        Map<String,Object> map = new HashMap<>();
        map.put("session中User",user);
        return  map;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值