9 SpringMVC

1.什么是 Spring MVC

  1. Spring MVC 是一个 Web 框架
  2. Spring MVC 是基于 Servlet API 构建的
1.MCV 定义

MVC: Model View Controller 翻译中文就是"模型 ,视图, 控制器",它是一种设计模式,这种设计模式将软件(项目) 分为三部分: 模型,视图和控制器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hOe228AU-1660204295429)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723135317073.png)]

2. MVC 和 Spring MVC 的关系

MVC 是一种设计思想,而 Spring MVC 是一个具体的实现框架

Spring MVC 是一个基于 MVC 设计模式和 Servlet API 实现的 Web 项目, 同时 Spring MVC 又是 Spring 框架中的一个 Web 模块, 它是随着 Spring 的诞生而存在的一个框架

Spring 和 Spring MVC 诞生的历史是比较久远,在他们之后才有了 Spring Boot

2. 为什么要学 Spring MVC

现在绝大部分的 Java 项目都是基于 Spring(或者 Spring Boot)的,而Spring 的核心就是 Spring MVC,也就是说 Spring MVC 是 Spring 框架的核心模块,而Spring Boot 是 Spring 的脚手架,因此可以推断出,现在市面上绝大部分的Java 项目约等于 Spring MVC 项目,这是我们要学 Spring MVC的原因

3.怎么学 Spring MVC

  • 实现用户和程序的映射(在浏览器输入 URL 地址之后,能够在程序中匹配到相应方法)
  • 服务器端要得到用户的请求参数
  • 服务器端要将结果返回给用户(前端)
1. Spring MVC 创建和连接
① 创建 Spring MVC 项目

基于 Spring Boot 框架添加一个 Spring Web(它使用的就是 Spring MVC)依赖,此时项目就变成了 Spring MVC项目

②@RequsetMapping 注解介绍

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

@Controller
@ResponseBody
public class UserController {
    @RequestMapping("sayhi")
    public String syahi(){
        return "hello Spring MVC";
    }
}

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TBwyRNKg-1660204295429)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723142040454.png)]

@RequsetMapping 即可修饰类, 也可以修饰方法,当修饰类和方法时,访问方式是 类 + 方法

@RequsetMapping 也可以直接修饰方法

③RequsetMapping 是 post 还是 get 请求

@RequsetMapping 特征:

  1. @RequsetMapping 既能修饰类(可选)也能修饰方法
  2. 默认情况下 @RequsetMapping 即支持 POST 请求方式, 也支持 GET 请求方式

@RequsetMapping 参数扩展(只支持某种类型的请求方式, 比如 POST 类型的请求方式)

@RequestMapping(value = "/sayhi2",method = RequestMethod.POST)
    public String syahi2(){
        return "method : Post";
    }

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pljH4GpR-1660204295430)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723143602177.png)]

④@GetMapping 和PostMapping

get 请求的 3 种 写法:

//写法1
@RequestMapping("sayhi")

//写法2
@RequestMapping(value = "/sayhi2",method = RequestMethod.GET)

//写法3
@GetMapping("sayhi3")

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FAJcFZcl-1660204295430)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723144035158.png)]

Post 请求的2中写法

//方法1
@RequestMapping(value = "/sayhi2",method = RequestMethod.POST)

//方法2
@PostMapping("sayhi4")

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZXqZ7up1-1660204295430)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723144343435.png)]

2.获取参数
①传递单个参数/多个对象
@RequestMapping("/getuserbyid")
    public UserInfo getUserById(Integer id){
        UserInfo userInfo = new UserInfo();
        userInfo.setId(id == null? 0 : id);
        userInfo.setName("张三");
        userInfo.setAge(18);
        return userInfo;
    }

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xXCpsZFw-1660204295431)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723145116105.png)]

获取多个参数

@RequestMapping("/login")
    public String login(String username, String password){
        return "用户名: " + username + "| 密码: " + password;
    }

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jhPDEE1P-1660204295431)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723150948977.png)]

②传递对象
@RequestMapping("/reg")
    public String reg(UserInfo userInfo){
        return "用户信息: " + userInfo;
    }

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KNWfDOaZ-1660204295431)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723151223679.png)]

⑤设置参数必传@RequsetParam

使用 @RequestParam 注解

@RequestMapping("/login")
    public String login(@RequestParam("name") String username, String password){
        return "用户名: " + username + "| 密码: " + password;
    }

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fxMEOqzL-1660204295432)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723151725742.png)]

@RequsetParam 注意事项:

如果在参数中添加 @RequsetParam 注解,那么前端一定要传递此参数,否则就会报错,如果想要解决此问题,可以给 @RequestParam 里面添加 required = false

@RequestMapping("/login")
    public String login(@RequestParam(value = "name",required = false) String username, String password){
        return "用户名: " + username + "| 密码: " + password;
    }
⑥@RequestBody 接收JSON对象

使用 Postman 模拟发送 JSON 数据给服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PPceKfOo-1660204295432)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723163428715.png)]

服务器端实现 JSON数据的接收需要使用 @RequsetBody 注解

@RequestMapping("/reg")
    public String reg(@RequestBody UserInfo userInfo){
        return "用户信息: " + userInfo;
    }

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xitEJAmO-1660204295432)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723163651140.png)]

⑦获取URL中参数@Pathvariable

从 URL 地址找中获取参数(不是从 URL 地址中的参数部分获取参数)

@RequestMapping("/hero/{id}/{name}")
    public String getHeroInfo(@PathVariable Integer id, @PathVariable String name){
        return "ID : " + id + " | name: " + name;
    }

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AjyAjhIT-1660204295432)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723190215561.png)]

⑧上传文件@RequsetPart
@RequestMapping("/uping")
    public boolean upImg(Integer uid, @RequestParam("img")MultipartFile file){
        boolean result = false;
        //得到图片的名字
        String fileName = file.getOriginalFilename();
        //得到图片的后缀名
        fileName = fileName.substring(fileName.lastIndexOf("."));
        fileName = UUID.randomUUID().toString() +fileName;
        //保存到本地

        try {
            file.transferTo(new File(imgPath + fileName));
        } catch (IOException e) {
            log.error("上传图片失败" + e.getMessage());
        }
        return true;
    }

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nrzCok9I-1660204295432)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723191811271.png)]
在这里插入图片描述

⑨获取Cookie/Session/header

Cookie获取

//方法1
@RequestMapping("/cookie")
    public void getCookie(HttpServletRequest req){
        Cookie[] cookies = req.getCookies();
        for(Cookie cookie : cookies){
            log.info("cookie : name" + cookie.getName() + " value : "+ cookie.getValue());
        }
    }

//方法2

@RequestMapping("/cookie2")
    public String getCookie(@CookieValue("wei")String cookie){
        return "Cookie : " + cookie;
    }

结果

方法1:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ufBI0JVK-1660204295433)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723202033076.png)]

方法2:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6cExidzR-1660204295433)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723202508912.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mua8mPH1-1660204295433)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723202529677.png)]

header获取

//方法1
@RequestMapping("/getua")
    public String getHead(HttpServletRequest req){
        return "header : " + req.getHeader("User-Agent");
    }
//方法2
@RequestMapping("/getua1")
    public String getHead1(@RequestHeader("User-Agent")String userAgent){
        return "header: " + userAgent;
    }

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wBCEOxtA-1660204295434)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723202900890.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-poth1TwH-1660204295434)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723203145214.png)]

Session存储\获取

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vDrNe7Sm-1660204295434)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723211642114.png)]

存储 Seesion代码实现:

@RequestMapping("/setsess")
    public boolean setSession(HttpServletRequest req){
        boolean result = false;
        HttpSession session = req.getSession(true);
        session.setAttribute("userInfo","张三");
        result = true;
        return result;
    }

获取 Session 方法1(Servlet 模式)

@RequestMapping("/getsess")
    public String getSeesion(HttpServletRequest req){
        String result = null;
        HttpSession session = req.getSession(false);
        if(session != null && session.getAttribute("userInfo") != null){
            result = (String) session.getAttribute("userInfo");
        }
        return  result;
    }

获取 seesion 方式2: @SeesionAttribute

@RequestMapping("/getsess2")
    public String getSeesion2(@SessionAttribute(value = "userInfo", required = false)String userinfo){
        return "会话: " + userinfo;
    }

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8BxPFg72-1660204295434)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723212732358.png)]

3.返回数据
①返回静态页面
@RequestMapping("/sayhi6")
    public String syahi(){
        return "hello.html";
    }

结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cxkd3HFK-1660204295434)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723214109454.png)]

反回一个非静态页面的数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x0uNYfqC-1660204295435)(C:\Users\17673\AppData\Roaming\Typora\typora-user-images\image-20220723214308163.png)]

②返回 text/html

html页面

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <form action="http://localhost:8080/calc">
    <h1>计算器</h1>
    数字1:<input name="num1" type="text"><br>
    数字2:<input name="num2" type="text"><br>
    <input type="submit" value=" 点击相加 ">
    </form>
</body>
</html>

java代码

@RequestMapping("/calc")
    public String sum(Integer num1, Integer num2){
        return "<h1> 计算结果: "+ (num1 + num2) +"</h1>" + "<a href = 'javascript: history.go(-1);'>返回'</a>";
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值