Java 阶段三 Day12 SpringMVC

SpringMVC

一、什么是MVC

1.1 MVC设计思想

MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分。

  • M:Model,模型层,负责业务逻辑判断,数据库存取
  • V:View,视图层,负责界面展示,向用户呈现数据的方式(html页面、图片、文本等)
  • C:Controller,控制器,负责接收用户请求,并根据请求调用相应的模型来处理业务逻辑
    在这里插入图片描述
    SpringMVC是一种基于MVC(模型-视图-控制器)模式的Web框架,它是基于Spring框架的一个子项目。它通过将请求分派给相应的控制器来处理Web请求,然后将处理结果发送回客户端。SpringMVC提供了很多有用的组件和注解,如@Controller、@RequestMapping等,使开发Web应用变得更加简单和高效。

1.2 Spring MVC

在这里插入图片描述
SpringMVC是一种基于MVC(模型-视图-控制器)模式的Web框架,它是基于Spring框架的一个子项目。

它通过将请求分派给相应的控制器来处理Web请求,然后将处理结果发送回客户端。

处理流程如图:
在这里插入图片描述

  1. 客户端发送请求至前端控制器DispatcherServlet;
  2. DispatcherServlet收到请求后,调用处理器映射器HandlerMapping;
  3. HandlerMapping根据请求URL找到具体的Controller;
  4. 通过处理器适配器HandlerAdapter找到具体执行该方法的实现类;
  5. Controller处理请求,并返回ModelAndView;
  6. DispatcherServlet通过ViewReslover(视图解析器)确定负责显示数据的具体View;
  7. DispatcherServlet对View进行渲染视图(即将Model填充至视图组件中),并将完整的视图响应到客户端。

二、SpringMVC快速入门

  1. 创建工程
    选择 spring Initializr
    Type:Maven
    java版本为8

  2. Spring Boot 选择 2.7.15 版本,并勾选 Spring Web 依赖项

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
  3. 启动工程

  4. 在resources/static目录下创建index.html

    <h1>
    左大凯到此一游
    </h1>
    
  5. Rebuid static
    在这里插入图片描述

  6. 浏览器访问工程首页
    http://localhost:8080/index.html

三、SpringMVC处理请求

3.1 请求分类及处理方式

  • 静态请求

    • 定义
      指请求的页面由服务器上预先准备好的静态web资源组成,如HTML、CSS、JS、IMG等,返回给客户端的信息内容是不变的。

    • 处理方式
      由服务器直接将请求的资源返回给客户端,服务器不处理任何逻辑,只是将预先准备好的资源返回给客户端。

  • 动态请求

    • 定义
      服务器会根据用户的请求动态生成内容,将数据返回到客户端显示页面内容。

    • 处理方式
      由服务器从数据库中获取数据,并进行相应的逻辑处理后将处理结果返回客户端。

3.2 处理静态请求

  • 处理html文件请求

    • 创建index.html(已经创建)浏览器输入地址测试 http://localhost:8080/index.html

    • 显示工程首页
      在这里插入图片描述

  • 处理图片等请求

    • 复制任意一张图片到static下
    • 右键static目录,Rebuild static
    • 浏览器测试
      浏览器:http://localhost:8080/xxx.jpg

3.3 处理动态请求

静态和动态的区别

  • 静态可以理解为任何人任何时刻请求到的数据都是一样的,比如首页、图片、音频、视频等。
  • 动态是可以根据请求随时变化的数据,比如说用户列表、用户查看订单等等,每个人看到的数据都不一样,动态的必须由controller 包来处理。

1)注解说明

  • @Controller 注解
    标注一个类;
    表示该类是一个控制器,负责处理用户的请求,并将处理结果生成响应返回给客户端。
  • @RequestMapping 注解
    请求注解;
    添加在控制器类或控制器方法上;
    将HTTP请求映射到控制器中的方法,指定处理请求的路径
    • 控制器类上:为整个控制器指定一个基础路径
    • 控制器方法上:指定相对于基础路径的具体路径
  • @ResponseBody 注解
    响应注解;
    添加在控制器方法上;
    可以使控制器方法通过返回值的方式将响应返回给客户端。

2)示例
处理用户查询订单的请求

  • 请求地址:http://localhost:8080/selectOrder
  • 返回响应:String “查询订单成功~~”
    第1步: 工程目录下新建controller.OrderController
// @Controller:用于将一个类标识为SpringMVC中的控制器,负责处理用户的请求并将响应返回给客户端
@Controller
public class OrderController {
    // 1.请求注解
    @RequestMapping("/selectOrder")
    // 2.响应体注解,添加此注解后,可以通过返回值的方式响应给客户端数据
    @ResponseBody
    public String selectOrder(){
        return "查询订单成功~~";
    }
}

第2步:重启工程 后浏览器测试
http://localhost:8080/selectOrder

3.4 常见问题

  • 工程已修改,但是浏览器刷新未出现效果
    • 工程static目录下文件修改后必须 Rebuild static
    • 浏览器有之前页面的缓存,Shift + F5 刷新页面
  • 404错误码代表找不到资源
    • 找不到静态资源
      • 检查请求的路径是否正确
      • 检查静态资源文件的存储位置是否在static里面
      • 选中static文件夹 ReBuild 重新编译再测试
    • 找不到动态资源
      • 检查请求的路径是否正确
      • 检查@Controller注解是否添加
      • 检查@RequestMapping注解里面的处理路径是否正确

四、HTTP请求方法

4.1 GET请求

GET请求通常用于获取服务器资源,将请求参数放在URL中。

1)URL统一资源定位符
是标准的Web地址,用于唯一地标识互联网上的资源(如网页、图片、文档等)

http://www.example.com/search?q=keyword

其中http是协议名,www.example.com是域名,search是路径名,q是查询参数,keyword是查询参数。

  • 请求参数在请求地址的后面通过 ? 分割,多个查询参数之间使用 & 符号分隔
    GET请求的参数在地址后面所以有大小限制(4k左右)
  • 应用场景
    一般从服务器获取数据都使用GET请求

2)特点
如果请求参数过多,GET请求会导致URL变长,并且传输的数据量也有一定限制;安全性较低;所以GET请求适合于请求数据不敏感的情况,如查询信息、浏览网页等。

4.2 POST请求

  • POST请求是将请求参数放在请求体中发送的;POST请求相对于GET请求传输的数据量更大,数据更加安全;
  • 所以POST请求适合于请求数据敏感的情况,如登录、注册等。

五、客户端传递参数

客户端负责发送请求,服务端负责处理请求;

客户端在发送请求时可能需要向服务端传递数据,具体传递数据的方式有如下几种方式。

5.1 GET请求[查询参数]

在浏览器地址栏中输入URL地址,在URL中添加查询参数,默认发送的是 GET请求。

比如:登录功能

完成登录功能,客户端需要将用户名 username 和 密码 password 传递给服务端

http://localhost:8080/v1/users/login?username=liying&password=123456

第1步:新建controller.UserController 处理请求

@Controller
public class UserController {
    @RequestMapping("/v1/users/login")
    @ResponseBody
    public String login(HttpServletRequest request){
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        return username + ":" + password;
    }
}

第2步:重启工程后浏览器输入地址测试

http://localhost:8080/v1/users/login?username=liying&password=123456

5.2 POST请求[请求体]

POST请求无法在浏览器地址栏中发送,一般会通过如下方式发送:

html中:Form表单完成POST请求方式的发送

<h3>前端向后端传递参数: POST请求</h3>
<form action="/v1/users/login" method="post">
  <input type="text" name="username" placeholder="用户名">
  <input type="password" name="password" placeholder="密码">
  <input type="submit" value="登录">
</form>

IDEA中:.http 后缀文件完成POST请求的发送

5.3 .http文件测试接口

使用SpringMVC中提供的 .http 后缀的文件来测试 Controller 层接口。

使用三个 # 号 作为不同测试方法的分隔符,也可以作为注释说明。

第1步:在test目录下创建 Directory :http

第2步:创建 .http 后缀的文件进行测试:testUserController.http

### GET请求测试
GET http://localhost:8080/v1/users/login?username=liying&password=123456
Accept: application/json

### POST请求测试
POST http://localhost:8080/v1/users/login
Content-Type: application/x-www-form-urlencoded

username=liying&password=123456

第3步:执行对应的请求方法测试

在这里插入图片描述

六、服务端接收参数

6.1 HttpServletRequest接收

以上述案例为准,客户端把用户名和密码信息传递给服务端,服务端接收传递过来的用户名和密码信息。

第1步:controller.UserController 处理请求

/**方式1:使用HttpServletRequest接收数据*/
@RequestMapping("/v1/users/login")
@ResponseBody
public String login(HttpServletRequest request){
    String username = request.getParameter("username");
    String password = request.getParameter("password");

    return username + ":" + password;
}

第2步:重启工程后执行对应的测试脚本(testCase.http)测试

6.2 声明参数接收

可以在处理请求的方法中通过 声明参数的方式 来接收客户端传递过来的数据。

应用分析

第1步:controller.UserController处理登录请求

/**方式2:通过声明参数的方式接收*/
@RequestMapping("/v1/users/login")
@ResponseBody
// 好处:代码简洁,并且可以自动根据声明的类型进行转换
public String login(String username, String password){
    return "username = " + username + ", password = " + password;
}

第2步:重启工程,执行测试脚本测试

6.3 声明POJO类接收

如果客户端传递数据过多,通过 HttpServletRequest 方式接收复用性较差,通过 声明参数接收 很繁琐;所以可以将数据封装到 POJO类 中来接收。

操作步骤

第1步:controller.UserController处理登录请求

/**方式3:通过声明Pojo类接收*/
@RequestMapping("/v1/users/login")
@ResponseBody
public String login(User user){
    return user.toString();
}

第2步:自定义pojo类,工程目录下创建entity.User

public class User {
    // 客户端传递几个参数,此处就有几个属性
    private String username;
    private String password;
    
    // 省略 setter()  getter()  和 toString() 方法
}

第3步:重启工程,执行测试脚本测试

6.4 练习

使用当前工程实现:BMI身体质量指数测试 BMIController

客户端将用户的 身高height和 体重weight 传递给服务端,服务端接收参数并计算用户的身体健康指数。

计算公式:bmi = 体重kg/(身高m*身高) 
<18.5 偏瘦 
<24 正常 
<27 微胖
>=27 该减肥了
6.4.1 接口说明
  • 请求地址:/bmi

  • 请求方法:GET

  • 传递数据:height=用户身高 weight=体重

  • 返回响应:String 偏瘦 | 正常 | 微胖 | 该减肥了

6.4.2 步骤梳理
  1. 创建controller.BMIController
    在其中定义bmi方法处理 /bmi请求,在参数列表中通过 声明变量的方式 接收传递过来的身高和体重
  2. 在bmi方法中通过bmi的计算公式得到结果,然后根据取值范围给客户端响应 偏瘦/正常/微胖/该减肥了
  3. 测试成功后,请用 POJO类方式 接收数据再次实现

七、POJO

7.1 定义

Plain Ordinary Java Object:简单的Java对象;是没有继承任何类或实现任何接口的简单 Java 对象,也不依赖于其他复杂的框架或技术;POJO 对象通常包含了纯粹的数据和简单的业务逻辑,是一种用于简化 Java 应用程序开发的编程模型;是entity实体类、VO(Value Object或View Object)视图对象、DTO(Data Transfer Object)数据传输对象 这3个对象的总称。

7.2 entity实体类|DTO|VO

  • entity实体类作用

用来和数据库中的表字段一一对应的,比如UserEntity(id,username,password,nickname);

  • DTO作用

用来接收客户端传递给服务器的数据的,比如:UserLoginDTO(username,password) 实现登录功能,客户端向服务器端传递数据;

  • VO作用

用来处理服务器响应给客户端的数据的,比如:UserListVO(id,username,nickname) 登录成功后的列表页显示当前用户信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值