猿创征文|SpringMVC程序开发

什么是SpringMVC

SpringWeb MVC是基于Servlet API构建的Web框架,在Spring下的一个Web模块!通常又被称为SpringMVC

  • SpringMVC是一个Web框架
  • SpringMVC是基于Servlet API构建的

MVC又是个啥呢?
MVC定义:

Model View Controller缩写,是软件工程中的一种软件架构模式,把软件系统分为模型视图,控制器三个基本部分!

在这里插入图片描述

可以看到上面就是一个完整的http请求响应过程!而基本上的Web程序都是通过http协议进行交互的!也就是说要实现一个完整的Web程序就要有这三个基本部分!

  • Model 是应用程序中用于处理数据逻辑的部分,通常模型对象负责在数据库读取数据.(一些实体model等等)
  • View 这里的视图应用程序中处理数据显示的部分.通常视同是依据模型数据创建的(由一些(jsp)框架加数据模型然后经过渲染呈现在服务器上的,这里的视图并非前端页面,这里的视图类似于运行在控制台上的信息)
  • Controller程序中处理用户交互的部分.通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据

SpringMVC 和MVC

MVC是一种思想,SpringMVC是对MVC思想的具体实现!
就是说SpringmVC实现了MVC软件工程架构模式,并基继承了ServletAPI的Web框架.所以Web项目,用户在浏览器输入了url,SpringMVC项目可以感知到用户的请求!

SpringMVC作用

现在市面上绝大多数java项目都是基于Spring/SpringBoot实现的.而Spring的核心就是SpringMVC. SpringMVC是Spring框架核心模块,而SpringBoot是Spring的脚手架.所以大部分java项目都约等于SpringMVC项目!
所以SpringMVC是十分重要!

SpringMVC核心功能

学习SpringMVC只需要掌握下面三个功能:

  • 连接功能:将用户输入的url java程序中的方法连接起来,访问一个地址可以调用我们的Spring程序
  • 获取参数功能;想办法获取到用户在浏览器给我们传输的数据参数
  • 输入数据功能: 拿到请求处理了业务数据,我们需要能够将响应数据发送给用户

这不就之前的Servlet项目需要实现的功能嘛,对滴!SpringMVC也能实现这些功能,并且更加简洁!
而且SpringMVC是基于ServletAPI实现的,所以Servlet的方法我们SpringMVC也都有!例如:每个方法的request/response 参数SpringMVC项目默认也有!

SpringMVC项目创建和连接

SpringMVC项目的创建和SpringBoot项目创建一样,唯一不同就是,在项目创建的时候添加Spring Web依赖,就是SpringMVC项目了!

在这里插入图片描述
编写Web接口代码用于浏览器访问

注意:

  • 用于浏览器访问的接口只能用 @Controller注解
  • SpringMVC项目默认返回的是html静态页面,加上@ResponseBody 取消默认可以返回静态页面以及文本数据等
  • @RequestMapping 注解设置路由,类上的可以省略,方法上的路由不能省略,前端通过ip+端口+这里的路径访问该方法
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 //只能用Controller注解,直接和客户端交互!
@ResponseBody //默认只能返回静态页面(html) 加上该注解可以返回text/html
@RequestMapping("/user") //设置路由,url一级路径,可省略类上的路由!
public class UserController {

    @RequestMapping("/get") //设置路由,url二级路径,这里就不能省略!
    public String getUser(){
        return "Hello 刘备";
    }
}

启动项目:
在这里插入图片描述
浏览器输入对应的url:
在这里插入图片描述

@RequestMapping 注解

@RequestMapping是SpringMVC项目中最常使用的一个注解!
用来注册接口的路由映射!

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

  • 基础使用:

基础使用就是在类上和方法上注册接口的路由映射
如果同时修饰类和方法,那用户访问的url路径就要包含这地址类+方法上的路由映射

也可以直接修饰方法直接访问方法路由映射
在这里插入图片描述

在这里插入图片描述

  • @RequestMapping 是 post 还是 get 请求

我们用postman验证一下

在这里插入图片描述

在这里插入图片描述
@RequestMapping可用这两个请求方法访问

我们查看一下@RequestMapping注解中可以访问的请求方法类型!

在这里插入图片描述
可以看到基本的请求方法都可以访问!

那如何设置指定请求访问访问呢?

GetMapping和PostMapping

  • get请求的3种写法
//默认写法所有请求方法都可以访问
@RequestMapping("/index")
//指定get方法访问
@RequestMapping(value="/index",method = RequestMethod.GET)
//指定get方法访问
@GetMapping("/index")

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
我们通过其他请求方法进行访问
在这里插入图片描述方法不允许

  • @post请求的3种方法也是如此
//默认
@RequestMapping("/index")
//设置指定方法
@RequestMapping(value="/index",method = RequestMethod.POST)
@PostMapping("/index")

通过get请求访问! 在这里插入图片描述

获取参数

获取参数,就是获取到客户端给我们服务器传来的参数!

传递单个参数

@Controller
@RequestMapping(value = "/parame",method = RequestMethod.POST)//接收post请求
@ResponseBody //可以返回非静态页面!
public class GetParameter {
    @RequestMapping("/get")
    public void getSingerParamer(String name){
        System.out.println("客户端发来的name: "+name);
    }
}

启动项目后在浏览器发送一个post请求给服务器即可
在这里插入图片描述
在这里插入图片描述
可以看到SpringMVC接收请求直接通过参数就拿到了客户端的请求信息,不用使用之前Servlet通过Request请求中的信息读取!

注意

前后端的属性参数名要一致

在这里插入图片描述
当前后端参数名称不一致时:
在这里插入图片描述
不一致,服务器端将获取不到客户端传来的数据

传递对象

对象实体类

@Data //生成get/setter等方法
public class User {
    private String id;
    private String name;
    private String password;
}

获取到一个对象参数

@Controller
@ResponseBody
@RequestMapping("/user")
public class GetUser {
    @RequestMapping("/get")
    public void getUser(User user){
        System.out.println(user.toString());
    }
}

前端命名要和对象中的属性名相同
在这里插入图片描述

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

@Controller
@RequestMapping(value = "/parame",method = RequestMethod.POST)//接收post请求
@ResponseBody //可以返回非静态页面!
public class GetParameter {
    @RequestMapping("/get")
    public void getSingerParamer(String name,Integer password){
        System.out.println("客户端发来的name: "+name);
        System.out.println("客户端发来的password: "+password);
    }
}

在这里插入图片描述

可以看到这里参数的前后顺序并不会影响参数的传递,服务器会根据客户端的发来的名称进行匹配

后端参数重命名(后端参数映射)

我们发现只要客户端发送的数据属性名和参数名不匹配,服务器端就无法接收到客户端传来的数据!

我们如何解决这样的问题呢?

  • 让客户端和我们后端的参数名匹配!
  • 在我们服务器后端进行参数映射

显然第一种方法不是很科学,咱也不能这样子命令前端,都是打工人!

我们可以通过后端参数映射解决这个问题!
直接改参数名嘛? 显然可取,但是当我们已经用该参数写了好多代码时,这不就裂开了!
我们可以在方法头参数前加一个注解即可!

通过 @RequestParam 注解进行参数映射!
这样我们既不用改动前端的代码,也不用改变我们的参数名称就可以实现后端参数重命名!

@Controller
@RequestMapping(value = "/parame",method = RequestMethod.POST)//接收post请求
@ResponseBody //可以返回非静态页面!
public class GetParameter {
    @RequestMapping("/get")
    public void getSingerParamer(@RequestParam("username") String name, Integer password){
        System.out.println("客户端发来的name: "+name);
        System.out.println("客户端发来的password: "+password);
    }
}

在这里插入图片描述

设置参数必传(@RequestParam)

在这里插入图片描述
当我们加了这个注解后如果,前端的名称不匹配,就会报错!
可能你会疑惑,刚刚没重命名都只是接收不到数据而已,也不会报错呀!
为啥会这样呢?

因为我们@RequestParam注解加上后,默认该参数必传,如果前端没有传递该名称的参数就会报错!

修改默认参数必传
@RequestParame("username",requird=false)
修改required属性值为false即可修改默认!
在这里插入图片描述
修改为false后,我们没有传递username参数也不会报错!
在这里插入图片描述

RequestBody接收json数据

我们直接前端发送json数据给服务器:
在这里插入图片描述
显然服务器接收不到!

我们通过在参数上加上@RequestBody就可以接收到json数据了!
在这里插入图片描述

获取URL中的参数@PathVariable

@ResponseBody
@Controller
@RequestMapping("/user")
public class Path {
    @GetMapping("get/{name}/{password}")
    public void getPathVariable(@PathVariable String name,@PathVariable String password){
        System.out.println("name:"+name);
        System.out.println("password:"+password);
    }
}

在参数上加上@PathVariable注解还有在Mapping路由设置上加上对应的参数名!@GetMapping("get/{name}/{password}")
在这里插入图片描述

在这里插入图片描述

上传文件@RequestPart

@Controller
@ResponseBody
@RequestMapping("/file")
public class ParamePart {
    @RequestMapping("/get")
    public void getPart(@RequestPart MultipartFile file) throws IOException {
        //将前端的文件保存在服务器路径
        String filePath = file.getOriginalFilename();
        //文件保存路径
        String path = "D:/java/上传/"+filePath;
        //创建文件对象
        File desc = new File(path);
        //该文件目录在磁盘中不存在,就创建该目录
        if(!desc.exists()){
            desc.mkdir();
        }
        //上传到该目录下
        file.transferTo(desc);
    }
}

未上传前
在这里插入图片描述

启动项目!
上传文件
在这里插入图片描述

在这里插入图片描述
注意:

上传文件默认文件最大值大小是有限制的,所以如果没有修改单次文件上传大小,上传大文件就可能会服务器报错!

获取Cookie/Session/header

@Controller
@RequestMapping("/header")
public class Param {
    @RequestMapping("/get")
    public void getHeader(HttpServletRequest request, HttpServletResponse response){
        //这里获取cookie方式和之前Servlet一样,因为SpringMVC基于Servlet API
        //获取cookie
        Cookie[] cookies = request.getCookies();
        System.out.println(Arrays.toString(cookies));
        //获取Header中的其他信息
        String UserAgent = request.getHeader("User-Agent");
        System.out.println(UserAgent);
    }
}

在这里插入图片描述

也可以通过注解@CookieValue获取Cookie和@RequestHeader获取Header

@Controller
@RequestMapping("/header")
public class Param {
    @RequestMapping("/get")
    public void getHeader(HttpServletRequest request, HttpServletResponse response){
        //这里获取cookie方式和之前Servlet一样,因为SpringMVC基于Servlet API
        //获取cookie
        Cookie[] cookies = request.getCookies();
        System.out.println(Arrays.toString(cookies));
        //获取Header中的其他信息
        String UserAgent = request.getHeader("User-Agent");
        System.out.println(UserAgent);
    }
    @RequestMapping("/get1")
    public String get1(@RequestHeader("User-Agent") String UserAgent , @CookieValue("bug") String cookieValue){
        System.out.println("UserAgent:"+UserAgent+" \n Cookie bug:"+cookieValue);
        return " ";
    }
}

在这里插入图片描述

返回数据

我们接收到客户端发来的请求后,就后对请求进行业务处理,然后返回响应数据!

而我们SpringMVC默认是返回一个html静态页面,我们可以通过@ResponseBody返回非静态页面!

返回静态页面

@Controller
@ResponseBody
@RequestMapping
public class TestMapping {
    //@GetMapping("/index")
    @RequestMapping(value = "/index",method = RequestMethod.GET)
    public String getMapper(){
        return "index.html";
    }
}

在这里插入图片描述

在这里插入图片描述

返回text/html

我们加上@ResponseBody就可以返回一个非静态页面

@ResponseBody
@RequestMapping
public class TestMapping {
    //@GetMapping("/index")
    @RequestMapping(value = "/index",method = RequestMethod.GET)
    public String getMapper(){
        return "<h1>index</h1>";
    }
}

在这里插入图片描述

返回JSON对象

@RestController //这个注解是@ResponseBody和@Controller组合!
public class GetJson {
    @RequestMapping("/getJson")
    public HashMap<String,Integer> getJson(){
            HashMap<String,Integer> map = new HashMap<>();
            map.put("刘备",18);
            map.put("曹操",21);
            map.put("诸葛亮",88);
           return map;
    }
}

在这里插入图片描述
我们通过Fiddler抓包可以看到服务器返回的响应信息就是JSON格式的数据!

在这里插入图片描述

可以看到我们SpringMVC模块内置了进行JSON数据转换的依赖,不需要像Servlet项目一样通过引入Jackon等依赖进行转换!
而且转换过程直接由Spring完成,也不用通过自己手动进行转换!

请求转发或请求重定向

return 不止可以返回一个视图给前端,还能实现跳转
跳转方式有如下2种:

  • forward : 请求转发
  • redirect : 请求重定向
@Controller
@RequestMapping("/root")
public class Return {
    @RequestMapping("/index1")
    public String index1(){
        //请求转发
        return "forward:/index.html";
    }
    @RequestMapping("/index2")
    public String index3(){
        //请求重定向
        return "redirect:/index.html";
    }
}

forward请求转发
在这里插入图片描述

可以看到请求转发,上面的url地址是不变的,而网页的内容是index.html页面内容!

redirect请求重定向
在这里插入图片描述

请求重定向redirect输入路由接口,直接就跳转到重定向的路由地址,url也随着改变!

注意:

因为我们这里要返回一个静态页面给前端,而又用了redirectforward进行转发和重定向,就不能使用@ResponseBody注解,不然会返回字符串!

forward和redirect区别

  • 请求重定向(redirect),将请求重新定位到资源;请求转发(forward) 服务器转发!
  • 请求重定向地址发生改变,请求转发地址不变
  • 请求重定向与直接访问新地址效果一样,不存在原来的外部资源不能访问;请求转发服务器端转发有可能造成原外部资源不能访问!

这两个如何区分呢?

例如张三找你借钱,你没钱,你向李四借钱再借给张三,你就是请求转发!而你直接告诉张三没钱,让他去找李四借,就是请求重定向!所以请求转发张三找你借钱就好了所以地址不变,而请求重定向,让他找李四借所以地址也改变了

请求转发外部资源丢失问题
请求转发forward如果需要的资源和访问的页面不在通一个页面下,会导致外部资源丢失!
在这里插入图片描述
通过redirect请求重定向!!!

在这里插入图片描述
通过forward请求转发
在这里插入图片描述
外部资源丢失!

@RequestBody说明

  • @RequestBody返回的值如果是字符会转成text/html,如果返回的是对象会转成application/json返回给前端
  • @RequestBody可以用来修饰类或者方法,修饰类表示类中所有的方法都会返回html或者json,而不是视图

@RestController@Controller@ResponseBody组合注解

  • 42
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 34
    评论
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bug 郭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值