Spring MVC

目录

什么是Spring MVC

Spring MVC的执行流程

创建Spring MVC项目

怎么学习Spring MVC

Spring MVC 的使用

1.连接

2.获取

1.获取单个参数

2..获取对象

3.获取参数的重命名

4.获取JSON对象

5.获取URL参数

6.获取上传文件

7.获取Cookie

8.获取session

9.获取header

3.输出

1.返回 text 与静态页面

实现一个网页计算器

2.返回一个JSON对象

实现一个登录界面

3.请求转发 与 请求重定位 (重点)

请求转发与请求重定位的区别


什么是Spring MVC

Spring MVC 是一个web框架,而且是基于servlet API 构建的.

MVC 的全称是 model(模型)  view(视图)  controller(控制)

MVC是一种设计思想,而Spring MVC就是具体实现它的方式. 就好比IoC容器的设计思想,具体实现是通过依赖注入(DI) 依赖查找

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

  • 控制器:        在应用程序中用于处理前后端数据交互的部分,负责从视图读取数据,控制用户输入发送给模型
  • 模型:        在应用程序中用于处理数据逻辑的部分,负责在数据库存取数据
  • 视图:        在应用程序中用于处理数据显示的部分,负责将模型响应的数据生成视图给用户

Spring MVC的执行流程

如上图

用户的请求首先到Controller

Controller将请求信息发送给model

model在数据库获取数据后返回给Controller

Controller再将数据返回给view

最后由view将数据生成最终的页面提供给用户

创建Spring MVC项目

在项目创建中勾选Spring Web 就是勾选了Spring MVC项目

通过下面的描述中我们也可以看到,它说使用了Spring MVC

怎么学习Spring MVC

当我们学会了以下三种功能后,就基本上掌握了Spring MVC

  • 连接                将用户(浏览器)与Java程序连接起来,使用用户可以通过地址访问程序
  • 获取参数         获取用户访问请求中的参数
  • 输出数据         把程序的执行结果返回给用户

Spring MVC 的使用

1.连接

在 Spring MVC 中使⽤ @RequestMapping 来实现 URL 路由映射,也就是浏览器连接程序的作⽤。
接下来要实现的功能是访问地址: http://localhost:8080/user/hi ,能打印“hello,spring mvc”信息。

新建一个User类

package com.example.demo.controller;

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

@RestController
public class User {

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

@RequestMapping 默认是Get 请求 Post请求都能接收

如果我们想指定接收 Get请求

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

如果想指定接收 Post请求

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

如图,设置为Post 后再用 Get请求就会报错, Post请求则能成功获取

Post:

2.获取

1.获取单个参数

这里创建的对象名必须与请求中的key值一致,才可成功获取

2..获取对象

如果要获取多个参数,再如上一个一个输入就太麻烦了,我们通过一个对象来接收

model包里新建Student类   通过@Data 注解自动生成getter,setter等方法

controller包里新建StudentController类,方法是获取这个对象然后返回这个对象

启动后打开网址  localhost:8080/object

3.获取参数的重命名

如果用户传递参数的key值是 n , 我们觉得太粗略,可以通过@RequestParam 注解进行重命名

我们将其重命名为 name , 然后返回name

此时 n 是必传的参数,如果程序没获取到就会报错

参数不是n,报错了       

我们再补充n上去,就正常了

如果参数 n 可传可不传,则要添加一个说明

此时不报错了

4.获取JSON对象

java程序是不能直接获取JSON对象的,我们通过Postman来演示

构造了一个JSON对象后发送给java程序,返回的值都是null,说明JSON对象没有被获取到

通过注解@RequestBody 实现获取JSON对象

此处就是成功接收到了JSON对象 并返回了各参数的值

5.获取URL参数

此处的URL参数不是指URL字符串里的参数,而是URL地址的参数

传递参数有两种方式

如图,csdn还是常规的URL格式,,存在键值对

而掘金网站的网页则是只有文章id, 这样就很简洁, 唯一定位到这篇文章

通过注解 @PathVariable 

6.获取上传文件

通过注解 @RequestPart

然后通过postman来实现一下,文件传输

选择Post请求,body,form-data,选择 File文件格式

key值一定要与注解 @RequestPart 的参数一致, 然后发送,后台就提示已成功保存到哪个路径里

打开这个路径就找到了保存的文件了

但这样的写法,是把文件名 和 文件后缀给写死的,因此我们要改进设置保存路径的代码

UUID通过一系列算法,保证了生成的id是全球唯一的

        randomUUID() 生成随机值 

        toString() 将随机值打印为字符串

        replace("-","") 去掉随机值中的横杠

通过 getOriginalFilename() 可以获取到原文件的名称

        substring()  选择这一段字符串                               

        lastIndexOf(".")    获取到从最后一个 "." 开始的字符串片段

再通过postman发送可以发现每次生成的图片名称都是不一样的,且文件后缀都是正确的

7.获取Cookie

通过注解  @CookieValue

然后在网页按F12进入控制台

点击应用程序,Cookie, 右键新增一个cookie

key值要与注解 @CookieValue 的参数一致, value值随意

刷新网页,返回了value值,表示Java程序已经成功获取到了网页cookie

8.获取session

通过注解  @SessionAttribute

该注解有两个属性, value 表示需要获取 Session 对象里面内容的 key 值,还有一个 require 表示修饰的参数是否必须,一般需要设置为 false,如果设置成 true,没有获取到对应的value就会返回一个400的页面。

9.获取header

通过注解  @RequestHeader

header(请求报头)包含哪些内容,可以点击了解  http://t.csdnimg.cn/6idLb

3.输出

1.返回 text 与静态页面

在Spring MVC诞生之初, 前后端是不分离的, Spring通过注解 @Controller

因此后端向浏览器返回的不是一个数据,而是一个页面.

例如,当我们想返回一个字符串(text)  " computer.html " , 却发现他返回了一个静态页面

所以, 如果需要传输的是数据, 而不是页面, 需要再添加一个注解 @ResponseBody

表明传输的是body数据

这样就能成功获取到字符串  computer.html 了

我们也可使用更简洁的注解 @RestController

@RestController =  @Controller  +  @ResponseBody

实现一个网页计算器

前端页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>computer</title>
</head>
<body>
    <form action="computer">
        <h1>计算器</h1>
        数字1:<input name="num1" type="text"><br>
        数字2:<input name="num2" type="text"><br>
        <input type="submit" value="查看结果">
    </form>
</body>
</html>

后端代码:

package com.example.demo.controller;

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

@RestController
public class ComputerController {
    @RequestMapping("/computer")
    public String computer(Integer num1,Integer num2){
        // 非空验证
        if (num1 == null || num2 == null) {
            return "<h2>参数错误!</h2><a href='javascript:history.go(-1)'>返回</a>";
        }
        return "<h1>"+ (num1+num2) +"<h1>";
    }
}

访问网页:  localhost:8080/computer  

效果:

2.返回一个JSON对象

实现一个登录界面

通过这行代码,写死 登录成功的用户名是 张三  密码是 123456

succ 是一个用于表示操作结果的状态码,此处我们设置为200, 

更常见的做法是,登录成功时返回200,登录失败时返回其他的状态码,比如400或401

前端代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <title>login</title>
    <script>
    function mysub() {
      let username = jQuery("#username").val();
      let password = jQuery("#password").val();
      jQuery.getJSON("/login",
            {
              "username":username,
              "password":password
            },
            function (result) {
              if(result.succ==200){
                alert("返回结果:"+result.msg);
              }else{
                alert("操作失败,请重试。");
              }
            });
    }
  </script>
</head>
<body>
<div style="text-align: center;">
    <h1>登录</h1>
    ⽤户:<input id="username">
    <br>
    密码:<input id="password" type="password">
    <br>
    <input type="button" value=" 提交 " onclick="mysub()" style="margin-top: 20px; margin-left: 50px;">
</div>
</body>
</html>

后端代码:

package com.example.demo.controller;

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

import java.util.HashMap;

@RestController
public class LoginCController {

    @RequestMapping("/login")
    public HashMap<String,String> res(String username,String password){
        HashMap<String,String> response = new HashMap<>();
        int succ = 200;
        if(username != null && password != null
                && username.equals("张三") && password.equals("123456")){
            response.put("msg","登录成功");
        }else {
            response.put("msg","登录失败");
        }
        response.put("succ","200");
        return response;
    }
}

3.请求转发 与 请求重定位 (重点)

return 不但可以返回一个视图,还可以实现跳转,跳转的方式分别为两种:

  1. forward:请求转发
  2. redirect:请求重定向

用法:

// 请求重定向
@RequestMapping("/computer")
public String computer(){
 return "redirect:/computer.html";
}

// 请求转发
@RequestMapping("/computer2")
public String computer2(){
 return "forward:/computer2.html";
}

请求转发:

浏览器通过 URL 访问某个地址获取资源, 这个地址是指向服务器的, 然后服务器会去访问资源所在的地址, 获取到资源后, 将资源返回给浏览器, 这期间 浏览器的 URL 是不变的

请求重定位:

浏览器通过 URL 访问某个地址获取资源, 这个地址是指向服务器的, 然后服务器会将资源所在的地址返回给浏览器, 然后浏览器会根据这个资源地址去访问获取资源, 这期间 浏览器的 URL 改变了

示例分析:

请求转发:

注意要将注解改为 @Controller , 不然会将返回值识别成字符串, 而不是html静态页面资源

请求重定位:

请求转发与请求重定位的区别

  1. 定义不同:        请求转发 发生在服务器内部程序上, 当服务器接收到客户端的请求后,服务器会去访问资源地址获取资源, 再将返回结果发送给客户端.        请求重定位 服务器接收到客户端的请求后, 会生成一个临时报头返回给客户端告知 资源所在地址URL, 客户端再通过这个资源地址自己去获取资源        
  2. 资源的请求方不同:        请求转发 是由服务器帮客户端请求资源, 资源请求方是服务器        请求重定位 是由客户端自己去请求资源, 资源请求方是客户端
  3. 数据共享不同:        请求转发是服务器端实现的,所以整个执行流程中,客户端(浏览器端)只需要发送一次请求,因此整个交互过程中使用的都是同一个 Request 请求对象和一个 Response 响应对象,所以整个请求过程中,请求和返回的数据是共享的;而请求重定向客户端发送两次完全不同的请求,所以两次请求中的数据是不同的
  4. 最终的URL地址不同:        请求转发 指向的地址不变        请求重定位 指向的地址会变为资源所在地址
  5. 代码实现不同        

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值