Spring Web MVC

张裕  高级会员 | 2024-8-25 02:28:30 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 212|帖子 212|积分 636

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 登录 


  1. @RequestMapping("/user")
  2. @RestController
  3. public class UserController {
  4.     @RequestMapping("/login")
  5.     public Boolean login(String userName, String password, HttpSession session){
  6.         //校验参数的合法性
  7. //        if (userName==null || userName.length()==0 || password ==null || password.length() ==0){
  8. //            return false;
  9. //        }
  10.         if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){
  11.             return false;
  12.         }
  13.         //进行用户名和密码的校验
  14.         if ("admin".equals(userName) && "admin".equals(password)){
  15.             //设置Session
  16.             session.setAttribute("username","admin");
  17.             return true;
  18.         }
  19.         return false;
  20.     }
  21.     @RequestMapping("/getUserInfo")
  22.     public String getUserInfo(HttpServletRequest request){
  23.         //从Session 获取登录用户
  24.         HttpSession session = request.getSession(false);
  25.         String userName = null;
  26.         if (session!=null){
  27.             userName = (String) session.getAttribute("username");
  28.         }
  29.         return userName;
  30.     }
  31. }
复制代码




3.3 留言板



  1. @RequestMapping("/message")
  2. @RestController
  3. public class MessageController {
  4.     private List<MessageInfo> messageInfos = new ArrayList<>();
  5.     @RequestMapping("/publish")
  6.     public Boolean publish(MessageInfo messageInfo){
  7.         //进行参数校验//!.. = 为空
  8.         if (!StringUtils.hasLength(messageInfo.getFrom())
  9.                 || !StringUtils.hasLength(messageInfo.getTo())
  10.                 || !StringUtils.hasLength(messageInfo.getMessage())){
  11.             return false;
  12.         }
  13.         //添加留言
  14.         messageInfos.add(messageInfo);
  15.         return true;
  16.     }
  17.     @RequestMapping("/getMessageInfo")
  18.     public List<MessageInfo> getMessageInfo(){
  19.         return messageInfos;
  20.     }
  21. }
复制代码
  1. @Data
  2. public class MessageInfo {
  3.     private String from;
  4.     private String to;
  5.     private String message;
  6. }
复制代码
  注:
  这里补充一个依赖lombok,取代getter和setter   @Data
  

  如果只想加到from上:
  

  后端测试:


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


  1. @RequestMapping("/user")
  2. @RestController
  3. public class UserController {
  4.     @RequestMapping("/login")
  5.     public Boolean login(String userName, String password, HttpSession session){
  6.         //校验
  7.         if (!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){
  8.             return false;
  9.         }
  10.         //验证是否正确
  11.         if ("admin".equals(userName) && "123".equals(password)){
  12.             session.setAttribute("userName",userName);
  13.             return true;
  14.         }
  15.         return false;
  16.     }
  17. }
复制代码

  1. @RequestMapping("/getBookList")
  2.     public List<BookInfo>  getBookList(){
  3.         //1.获取图书的数据
  4.         //2.对图书的数据进行处理
  5.         //3.返回数据
  6.         //mock表示虚拟的假数据
  7.         List<BookInfo> bookInfos = mockData();
  8.         for(BookInfo bookInfo : bookInfos){
  9.             if (bookInfo.getStatus() == 1){
  10.                 bookInfo.setStatusCN("可借阅");
  11.             }else {
  12.                 bookInfo.setStatusCN("不可借阅");
  13.             }
  14.         }
  15.         return bookInfos;
  16.     }
  17.     private List<BookInfo> mockData(){
  18.         List<BookInfo> bookInfos = new ArrayList<>(15);
  19.         for (int i = 0; i < 15; i++){
  20.             BookInfo bookInfo = new BookInfo();
  21.             bookInfo.setId(i);
  22.             bookInfo.setBookName("图书"+i);
  23.             bookInfo.setAuthor("作者"+i);
  24.             bookInfo.setCount(new Random().nextInt(200));
  25.             bookInfo.setPrice(new BigDecimal(new Random().nextInt(100)));
  26.             bookInfo.setPublish("出版社"+i);
  27.             bookInfo.setStatus(i%5==0?2:1);
  28.             bookInfos.add(bookInfo);
  29.         }
  30.         return bookInfos;
  31.     }
复制代码
  1. @Data
  2. public class BookInfo {
  3.     private Integer id;
  4.     private String bookName;
  5.     private String author;
  6.     private Integer count;
  7.     private BigDecimal price;
  8.     private String publish;
  9.     private Integer status;//1-可借阅
  10.     private String statusCN;
  11. }
复制代码
 后端代码经测试无误
4. 应用分层

4.1 三层架构 



  • 体现层:担当请求,返回结果
  • 业务逻辑层:告急处置惩罚业务逻辑
  • 数据层:处置惩罚数据,包罗数据的存储,获取(增删改查)
可以结合下图理解:

以图书管理系统为例:


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



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



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



  • ⾼内聚指的是:⼀个模块中各个元素之间的联系的紧密水平,如果各个元素(语句、程序段)之间的联系水平越⾼,则内聚性越⾼,即"⾼内聚"。
  • 低耦合指的是:软件中各个层、模块之间的依赖关联程序越低越好。
⽐如说:
邻⾥邻人,楼上漏⽔,楼下遭殃,就是耦合.
家庭⼀个成员⽣病,其他成员资助照顾,就叫内聚.
⼀个家庭内部的关系越紧密越好, ⼀个家庭尽可能少的影响另⼀个家庭,就是低耦合

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张裕

高级会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表