0


Spring Web MVC

1. Spring Web MVC

Spring Web MVC是⼀个Web框架

1.1 MVC

举个例子理解:

Controller相当于前台,接送请求,传给相关部门,部门派人处理,此时这就是Model

MVC是一种思想,Spring进行了实现,称为Spring MVC

Spring Boot是创建Spring MVC项目的一种方式而已

1.2 Spring MVC

而在当前阶段,MVC的概念又发生了一些变化,后端开发人员不涉及前端页面的开发,所以也就没有view层

view层又有了一种解释:

之间返回的是试图,现在返回的是视图所需要的数据

2. 学习SpringMVC

学习SpringMVC,重点也就是学习如何通过浏览器和⽤⼾程序进⾏交互.

  • 建⽴连接(客户端和服务器)
  • 请求
  • 响应

2.1 @RequestMapping

2.1.1 @RequestMapping修饰方法和类

访问地址:类的路径+方法路径

2.1.2 @RequestMapping支持get和post

那么如果就想要get请求怎么办?

注意:

此时再用postman发送post请求:

2.2 请求(即传参)

2.2.1 传递单个函数

底层逻辑:

从请求的参数中,获取参数名为name的值,并给name赋值


2.2.2 传递多个参数

①使用Integer(包装类型)

参数的顺序可以调换

②使用int(基本类型)

看日志:

建议使用包装类型

如果使用基本类型,必须要传值,否则会报错


2.2.3 传递对象

直接传递参数,每修改一个,就需要修改接口,为了避免这种情况,把参数封装成多个对象


2.2.4 后端参数重命名

那如果使用username传参呢?

如果使用了重命名,必须要使用@RequestParam注解里的名字

如果不想报错:


2.2.5 传递数组

当我们请求中,同一个参数有多个时,浏览器就会帮我们给封装成一个数组


2.2.6 传递集合


2.2.7 传递JSON(使用最多)

本质上是一个字符串,表示对象的字符串

传递JSON,使用@RequestBody

注意:

这个数据一定是在请求正文中


2.2.8 获取URL中的参数

使用注解@PathVariable

获取两个:

注意:

获取多个时,要注意顺序,请求格式必须和后端定义的URL格式匹配

也可以修改名字:


2.2.9 上传图片


2.2.10 获取Cookie

简单回顾:

HTTP是无状态的.即http没有记忆功能,现在请求和过段时间请求,同样的请求参数,得到的结果一样(这里并不是指数据,而是处理逻辑)

Cookie客户端机制,Session服务端机制(这里可以以学生和门岗为例理解)

Cookile可以伪造(学生证),Session不能

①先看用Servlet的方式获取:

注意:

②使用注解的方式获取(只能一个一个去获取):


2.2.11 获取Session

①先看用Servlet的方式获取:

注意:


②使用注解的方式获取(只能一个一个去获取):

使用注解的方式,默认是一个必传参数,修改:

③通过spring的内置对象


2.2.12 获取Header

①先看用Servlet的方式获取:


②通过注解获取:


2.3 响应

2.3.1 返回静态页面

可以看到@RestController无法返回页面

下面来学习@RestController与@Controller:

@Controller告诉Spring,帮我们管理这个代码,我们后续访问时,才能访问到.


2.3.2 返回数据

注:

@ResponseBody可以修饰类,也可以修饰方法.

修饰类的时候,表示这个类下的所有方法,返回的均为数据.

修饰方法的时候,表示该方法返回的是数据

如果一个类中的所有方法返回的都是数据,我们就把这个注解加在类上


2.3.3 返回html代码片段


2.3.4 返回JSON

注:

当我们的接口返回的是String时,content-Type是text/html

当当我们的接口返回的是对象或Map时,content-Type自动设置为application/JSON


2.3.5 设置状态码

HTTP状态码

状态码不影响页面展示


2.3.6 设置Header(了解)

  • value: 指定映射的URL
  • method:指定请求的method类型,如GET,POST等
  • consumes:限制处理请求(request)的提交内容类型(Content-Type),例如application/json,text/html
  • produces: 设置返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
  • Params:指定request中必须包含某些参数值时,才让该⽅法处理
  • headers: 指定request中必须包含某些指定的header值,才能让该⽅法处理请求


3. 练习

3.1 计算器

3.2 登录

@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("/login")
    public Boolean login(String userName, String password, HttpSession session){
        //校验参数的合法性
//        if (userName==null || userName.length()==0 || password ==null || password.length() ==0){
//            return false;
//        }

        if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){
            return false;
        }
        //进行用户名和密码的校验
        if ("admin".equals(userName) && "admin".equals(password)){
            //设置Session
            session.setAttribute("username","admin");
            return true;
        }
        return false;
    }

    @RequestMapping("/getUserInfo")
    public String getUserInfo(HttpServletRequest request){
        //从Session 获取登录用户
        HttpSession session = request.getSession(false);
        String userName = null;
        if (session!=null){
            userName = (String) session.getAttribute("username");
        }
        return userName;
    }
}

3.3 留言板

@RequestMapping("/message")
@RestController
public class MessageController {
    private List<MessageInfo> messageInfos = new ArrayList<>();

    @RequestMapping("/publish")
    public Boolean publish(MessageInfo messageInfo){
        //进行参数校验//!.. = 为空
        if (!StringUtils.hasLength(messageInfo.getFrom())
                || !StringUtils.hasLength(messageInfo.getTo())
                || !StringUtils.hasLength(messageInfo.getMessage())){
            return false;
        }
        //添加留言
        messageInfos.add(messageInfo);
        return true;
    }

    @RequestMapping("/getMessageInfo")
    public List<MessageInfo> getMessageInfo(){
        return messageInfos;
    }

}
@Data
public class MessageInfo {
    private String from;
    private String to;
    private String message;

}

注:

这里补充一个依赖lombok,代替getter和setter @Data

如果只想加到from上:

后端测试:


3.4 图书管理系统(简版,后续补充)

@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("/login")
    public Boolean login(String userName, String password, HttpSession session){
        //校验
        if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){
            return false;
        }
        //验证是否正确
        if ("admin".equals(userName) && "123".equals(password)){
            session.setAttribute("userName",userName);
            return true;
        }
        return false;
    }
}
@RequestMapping("/getBookList")
    public List<BookInfo>  getBookList(){
        //1.获取图书的数据
        //2.对图书的数据进行处理
        //3.返回数据

        //mock表示虚拟的假数据
        List<BookInfo> bookInfos = mockData();
        for(BookInfo bookInfo : bookInfos){
            if (bookInfo.getStatus() == 1){
                bookInfo.setStatusCN("可借阅");
            }else {
                bookInfo.setStatusCN("不可借阅");
            }
        }
        return bookInfos;
    }

    private List<BookInfo> mockData(){
        List<BookInfo> bookInfos = new ArrayList<>(15);
        for (int i = 0; i < 15; i++){
            BookInfo bookInfo = new BookInfo();
            bookInfo.setId(i);
            bookInfo.setBookName("图书"+i);
            bookInfo.setAuthor("作者"+i);
            bookInfo.setCount(new Random().nextInt(200));
            bookInfo.setPrice(new BigDecimal(new Random().nextInt(100)));
            bookInfo.setPublish("出版社"+i);
            bookInfo.setStatus(i%5==0?2:1);
            bookInfos.add(bookInfo);
        }
        return bookInfos;
    }
@Data
public class BookInfo {
    private Integer id;
    private String bookName;
    private String author;
    private Integer count;
    private BigDecimal price;
    private String publish;
    private Integer status;//1-可借阅
    private String statusCN;

}

后端代码经测试无误

4. 应用分层

4.1 三层架构

  • 表现层:接受请求,返回结果
  • 业务逻辑层:主要处理业务逻辑
  • 数据层:处理数据,包含数据的存储,获取(增删改查)

可以结合下图理解:

以图书管理系统为例:

4.2 MVC与三层架构的区别与联系

  • 从概念上来讲,⼆者都是软件⼯程领域中的架构模式.
  • MVC架构模式由三部分组成,分别是:模型(Model),视图(View)和控制器(Controller).
  • 三层架构将业务应⽤划分为:表现层,业务逻辑层,数据访问层.

  • MVC模式强调数据和视图分离,将数据展⽰和数据处理分开,通过控制器对两者进⾏组合.
  • 三层架构强调不同维度数据处理的⾼内聚和低耦合,将交互界⾯,业务处理和数据库操作的逻辑分开.
  • ⻆度不同也就谈不上互相替代了,在⽇常的开发中可以经常看到两种共存的情况.
  • ⼆者的⽬的是相同的,都是"解耦,分层,代码复⽤"

4.3 高内聚,低耦合

  • ⾼内聚指的是:⼀个模块中各个元素之间的联系的紧密程度,如果各个元素(语句、程序段)之间的联系程度越⾼,则内聚性越⾼,即"⾼内聚"。
  • 低耦合指的是:软件中各个层、模块之间的依赖关联程序越低越好。

⽐如说:

邻⾥邻居,楼上漏⽔,楼下遭殃,就是耦合.

家庭⼀个成员⽣病,其他成员帮忙照顾,就叫内聚.

⼀个家庭内部的关系越紧密越好, ⼀个家庭尽可能少的影响另⼀个家庭,就是低耦合

标签: spring mvc java

本文转载自: https://blog.csdn.net/qq_74812898/article/details/141141051
版权归原作者 小笨猪- 所有, 如有侵权,请联系我们删除。

“Spring Web MVC”的评论:

还没有评论