10_MVC

文章目录

  • JSON
    • 常用的JSON解析
    • Jackson的常规使用
      • 指定日期格式
  • MVC设计模式
    • MVC介绍
    • 前后端分离
    • 案例(开发与Json相关接口)
  • 三层架构
    • 三层架构介绍

JSON

  • JSON(JavaScript Object Notation)
    • 是一种轻量级数据交换格式,是存储和交换文本信息的一种语法,它与XML具有相同的特性,是一种数据存储格式,却比 XML 更小、更快、 更易于人编写和阅读、更易于生成和解析。
    • 为了更好的做前端和后端之间的交互

常用的JSON解析

  • fastjson是阿里巴巴的开源JSON解析库
  • Gson是Google提供的JSON解析库
  • Jackson是SpringBoot默认序列化JSON解析库
  • 性能方面,Jackson和FastJson差距很小,Jackson是SpringBoot默认的序列化库,也是最稳定的一个

分别对应的依赖:

<!--Gson-->
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.9</version>
</dependency><!--fastjson-->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.73</version>
</dependency><!--jackson-->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version>
</dependency>

Jackson的常规使用

  1. 实例化一个Jackson中用来做序列化的对象ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
  1. 使用ObjectMapper提供的方法完成转换
方法名参数返回值说明
writeValueAsString(Object object):StringObject:被转换的对象String:转换的结果将Object转换为JSONString
readValue(String content,Class<T> valueType):TString content:被转换的字符串;Class<T> valueType:指定接收返回值的类型泛型:在第二个参数被指定的类型将JSONString转换为指定转换类型

eg:

  • bean目录
/***  {*      "name":"中国",*      "province":[{"name":"黑龙江",”cities”:["哈尔滨","大庆"]},*                  {"name":"广东","cities":["广州","深圳","珠海"]},*                  {"name":"辽宁","cities":["沈阳", "大连"]},*                  {"name":"新疆","cities":["乌鲁木齐"]}*                 ]*  }*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Country {String name;List<Province> province;
}/*** {"name":"黑龙江",”cities”:["哈尔滨","大庆"]}*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Province {String name;String[] cities;
}
  • Execution目录
public class JsonParseExecution {@SneakyThrowspublic static void main(String[] args) {Country country = new Country();country.setName("中国");// List<Province> provinces = new ArrayList<>();Province province1 = new Province("黑龙江", new String[]{"哈尔滨", "大庆"});Province province2 = new Province("广东", new String[]{"深圳", "珠海", "广州"});Province province3 = new Province("辽宁", new String[]{"沈阳", "大连"});Province province4 = new Province("新疆", new String[]{"乌鲁木齐"});List<Province> provinces = Arrays.asList(province1, province2, province3, province4);country.setProvince(provinces);ObjectMapper objectMapper = new ObjectMapper();// 序列化:将country对象转化为字符串String jsonStr = objectMapper.writeValueAsString(country);System.out.println(jsonStr);/*** {"name":"中国","province":[{"name":"黑龙江","cities":["哈尔滨","大庆"]},* {"name":"广东","cities":["深圳","珠海","广州"]},* {"name":"辽宁","cities":["沈阳","大连"]},{"name":"新疆","cities":["乌鲁木齐"]}]}*/// 反序列化:将字符串转换为country对象Country jsonCountry = objectMapper.readValue(jsonStr, Country.class);System.out.println(jsonStr);}
}

指定日期格式

语句:objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));

eg:

  • User中增加一个成员变量Date birthday
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {Integer id;String username;String password;Integer age;Date birthday;Date createDate;String mobile;UserDetail userDetail;
}@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDetail {Integer id;String email;String mobile;
}
  • Execution目录
public class JsonParseExecutionTest {@SneakyThrowspublic static void main(String[] args) {UserDetail userDetail = new UserDetail(1, "1234@163.com", "12345678909");User user = new User(1, "zs", "123456", 22, new Date(), new Date(), "12345678900", userDetail);ObjectMapper objectMapper = new ObjectMapper();// 解决日期格式的语句objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));String userJsonStr = objectMapper.writeValueAsString(user);System.out.println(userJsonStr);/*** {*     "id": 1,*     "username": "zs",*     "password": "123456",*     "age": 22,*     "birthday": 1711811845446, // 2024-03-30*     "createDate": 1711811845446,*     "mobile": "12345678900",*     "userDetail": {*         "id": 1,*         "email": "1234@163.com",*         "mobile": "12345678909"*     }* }*/}
}

MVC设计模式

在这里插入图片描述

  1. 这个Servlet可以称之为控制器 → Controller
  2. 查询student信息就是处理数据逻辑 → Model ;另外这部分工作是在Servlet(Controller)中进行的
  3. 将数据和jsp共享 → 在Controller中将Model封装的数据准备就绪
  4. Servlet(Controller)设置转发的jsp(视图View),并且在jsp(视图)中渲染出Model提供的信息

MVC介绍

三个核心部件:

  • 模型(Model)应用程序中用于处理应用程序数据逻辑的部分
    • 获得一些具体的对象,比如说:User的对象、Order的list
  • 视图(View)应用程序中处理数据显示的部分,就是页面的展示,采集用户数据
  • 控制器(Controller)应用程序中处理用户交互的部分。接收用户端的请求,指的是Servlet的功能,根据界面传递过来不同的值进行不同的增删改查操作之后再跳转到不同的界面显示。做一个承上启下的作用。
    • 比如说:requestresponse所处的位置,就是servlet

强制性地使应用程序的输入、处理和输出分开。它们各自处理自己的任务。最典型的MVC就是JSP + Servlet + JavaBean的模式。MVC其实说的就是一个事情:解耦

在这里插入图片描述


前后端分离

通过js向后端发起Ajax异步请求,然后请求到Server服务器,找到对应的控制器,由控制器和Model层和View做交互,最终服务器处理的结果以Json的形式交给JSJS可以直接解析这个Json对象,在前端页面上呈现最终的效果

在这里插入图片描述
也就是我们在Servlet中完成开发之后,响应体中响应的是Json字符串


案例(开发与Json相关接口)

  • 请求相关信息

    • 请求URL:http://localhost:8080/demo3/auth/account/check
    • 请求方法:POST
    • 请求参数:请求参数是JSON字符串
      {"userAccount":"admin123"}
      
  • 提供Postman构造Json数据
    在这里插入图片描述
    在这里插入图片描述

    • 提供filder抓取的请求报文
      在这里插入图片描述

业务:传入的用户名信息,然后完成一些业务,需要在数据库user_t表中根据用户名查询id信息

  • 如果用户名长度小于6响应一段JSON数据

  • {"data":null,"errmsg":"字符串长度至少6位","errno":400
    }
    
  • 如果用户不存在响应一段JSON数据

  • {"data":null,"errmsg":"用户不存在","errno":502
    }
    
  • 如果用户存在响应一段JSON数据

  • {"data":user的json字符串,"errmsg":"用户存在","errno":200
    }
    

eg:

  • bean目录下
@NoArgsConstructor
@Data
public class ResponseVo {@JsonProperty("data")private Object data;@JsonProperty("errmsg")private String errmsg;@JsonProperty("errno")private Integer errno;/*** {*     "data":null,*     "errmsg":"字符串长度至少6位",*     "errno":400* }*/
}
  • servlet目录下
@WebServlet("/auth/account/*")
public class AuthAccountCheckServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {process(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {process(req, resp);}@SneakyThrowsprivate void process(HttpServletRequest request, HttpServletResponse response) {DispatchUtil.dispatch(request, response, this);}@SneakyThrowsprivate void check(HttpServletRequest request, HttpServletResponse response) {// JSON字符串:{"userAccount":"admin123"}// 首先获得Json字符串并解析它String jsonStr = request.getReader().readLine();ObjectMapper objectMapper = new ObjectMapper();Map map = objectMapper.readValue(jsonStr, Map.class);String userAccount = (String) map.get("userAccount");String responseStr = null;// 判断长度if (userAccount == null || userAccount.length() < 3) {// 不符合要求/*** {*     "data":null,*     "errmsg":"字符串长度至少6位",*     "errno":400* }*/ResponseVo responseVo = new ResponseVo();responseVo.setErrmsg("字符串长度至少6位");responseVo.setErrno(400);responseStr = objectMapper.writeValueAsString(responseVo);}UserMapper userMapper = MybatisUtil.getSqlSession().getMapper(UserMapper.class);List<User> users = userMapper.selectByUserName(userAccount);if (users != null && users.size() > 0) {// user存在/*** {*     "data":user的json字符串,*     "errmsg":"用户存在",*     "errno":200* }*/ResponseVo responseVo = new ResponseVo();responseVo.setData(users.get(0));responseVo.setErrmsg("用户存在");responseVo.setErrno(200);responseStr = objectMapper.writeValueAsString(responseVo);} else {// user不存在/*** {*     "data":null,*     "errmsg":"用户不存在",*     "errno":502* }*/ResponseVo responseVo = new ResponseVo();responseVo.setErrmsg("用户不存在");responseVo.setErrno(502);responseStr = objectMapper.writeValueAsString(responseVo);}response.setContentType("application/json;charset=utf-8");response.getWriter().println(responseStr);}
}

在这里插入图片描述


三层架构

三层架构这里和MVC并不是冲突的概念,而是在MVC的基础上进一步解耦,之前在Controller控制层直接调用了Model,为了后续业务上的解耦,在中间增加增加了一层业务逻辑层,在业务逻辑层中处理大部分业务

在这里插入图片描述

三层架构介绍

  • 三层架构:表示层、业务逻辑层、数据访问层
    • 避免了表示层直接访问数据访问层,表示层只和业务逻辑层有联系,提高了数据安全性
    • 如果切换B/S、C/S架构,直接替换表示层即可,比如替换Servlet
    • 项目结构更清楚,分工明确,增加可维护性

实际在开发过程中的体现,就是控制层(Servlet)中直接调用Service(业务逻辑层),在Service中调用Dao(数据访问层)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/783502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JUC并发编程(七)

1、不可变对象 1.1、概念 不可变类是指一旦创建对象实例后&#xff0c;就不能修改该实例的状态。这意味着不可变类的对象是不可修改的&#xff0c;其内部状态在对象创建后不能被更改。不可变类通常具有以下特征&#xff1a; 实例状态不可改变&#xff1a;一旦不可变类的对象被…

unordered系列容器OJ

目录 1、unordered系列容器 2、unordered系列容器OJ 1、重复n次的元素 2、两个数组的交集I 3、两个数组的交集II 4、存在重复元素 5、两句话中不常见的单词 1、unordered系列容器 在C标准库中&#xff0c;unordered系列容器是基于哈希表实现的&#xff0c; 用于存储唯一…

用html实现一个文章图片缩略展示

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>文章图片缩略展示</title><link rel"stylesheet" href"./style.css"> </head> <body> <div class&qu…

初始《string》及手搓模拟实现《string》

目录 前言&#xff1a; 为什么学习string类&#xff1f; 标准库中的string类 1. string类对象的常见构造 ​编辑 2. string类对象的容量操作 ​编辑 3. string类对象的访问及遍历操作 4. string类对象的修改操作 5. string类非成员函数 vs和g下string结构的说明 vs下s…

k8s1.28.8版本安装prometheus并持久化数据

本文参考 [k8s安装prometheus并持久化数据_/prometheus-config-reloader:-CSDN博客](https://blog.csdn.net/vic_qxz/article/details/119598466)前置要求: 已经部署了NFS或者其他存储的K8s集群. 这里注意networkpolicies网络策略问题&#xff0c;可以后面删除这个策略&#x…

LangChain使用本地LLM的简单实现

所用模型&#xff1a;stable-code-instruct-3b-Q8_0.gguf 下载链接&#xff1a;bartowski/stable-code-instruct-3b-GGUF Hugging Face 详细内容请查看&#xff1a;Introduction | &#x1f99c;️&#x1f517; Langchain 目录 LangChain 代码示例 LangChain LangChain…

再生式收音机填坑记

年前踩坑再生式收音机&#xff0c;还是得找机会把坑填上&#xff0c;最终选定了K8TND的方案&#xff0c;其实与Mr. Kitchen的也基本差不多。电路图如下&#xff1a; 实物图如下&#xff1a; 实际接收效果还不错&#xff0c;但是感觉频段上哪哪都是中国之声&#xff0c;对这种…

UE4_碰撞_碰撞蓝图节点——Line Trace For Objects(对象的线条检测)

一、Line Trace For Objects&#xff08;对象的线条检测&#xff09;&#xff1a;沿给定线条执行碰撞检测并返回遭遇的首个命中&#xff0c;这只会找到由Object types指定类型的对象。注意他与Line Trace By Channel(由通道检测线条&#xff09;的区别&#xff0c;一个通过Obje…

React系列之合成事件与事件处理机制

文章目录 React事件处理机制原生事件的事件机制事件代理&#xff08;事件委托&#xff09; 合成事件使用合成事件目的合成事件原生事件区别事件池 原生事件和React事件的执行顺序e.stopPropagation() React17事件机制的修改 React事件处理机制 react 事件机制基本理解&#xf…

时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测

时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现CPO-BP冠豪猪算法优化BP神经网络时间序列预测&#xff08;完整源码…

Linux(CentOS7)安装软件方式(编译安装,yum,rpm)

目录 前言 安装方式 编译安装 下载 解压 安装 创建软链接 yum rpm 前言 在使用 CentOS 安装软件时&#xff0c;发现安装的方式有好几种&#xff0c;有官网下载 tar 包解压&#xff0c;然后自己编译安装的&#xff0c;也有直接通过 yum 命令一键安装的&#xff0c;还有…

力扣刷题Days29-第二题-70.爬楼梯(js)

只有学习&#xff0c;没有自己的思路解题哈哈哈 1&#xff0c;题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 2&#xff0c;代码 这种解法的本质是斐波那契数列 /*** param {number} n* re…

appium辅助自动化工具-- Appium studio

这里我要给大家介绍一款appium辅助自动化测试工具appium studio&#xff0c;你没看错&#xff0c;不是android studio&#xff0c;也不是appium android studio&#xff0c;就是appium studio&#xff01; 下载地址&#xff1a; Appium Studio | Digital.ai Continuous Test…

探究ThreadLocal的魔数0x61c88647和Entry数组

探究ThreadLocal 下面有一个很重要的HASH_INCREMENT,他的值是0x61c88647 public class ThreadLocal<T> {/***ThreadLocals依赖于附加到每个线程的每线程线性探针哈希映射 (thread.threadLocals和inheritableThreadLocals)。ThreadLocal对象充当键&#xff0c;通过threa…

Visual Studio 2022 中VLD库如何安装

GitHub链接 Release v2.5.1 KindDragon/vld 点击可执行程序进行下载 点击可执行程序进行安装 双击打开 一直点击next即可完成安装&#xff08;不用在意安装路径&#xff0c;总共不到2MB&#xff09; 如果GitHub无法打开&#xff0c;可以私信我发你安装包直接安装

二维码门楼牌管理应用平台建设:实现民主参与的新途径

文章目录 前言一、二维码门楼牌管理应用平台的兴起二、投票表决功能的实现三、居民参与度的提升四、面临的挑战与前景展望 前言 在数字化时代&#xff0c;二维码技术的应用已经渗透到我们生活的方方面面。近期&#xff0c;二维码门楼牌管理应用平台的建设成为了社区治理的一大…

[flask]请求全局钩子

flask从入门到精通之钩子、异常、context、jinjia模板、过滤器 - 异步非阻塞 - 博客园 (cnblogs.com) 参考的这个博客&#xff0c;但有一个需要注意的是&#xff0c;最新版本的flask不知道是不是更新了还是怎么了&#xff0c;他的before_first_request不见了&#xff0c;如果继…

Linux非root用户安装mysql5.7

1、下载安装包MySQL :: Download MySQL Community Server 点击Archives 我下载的是5.7.27版本&#xff0c;linux主机直接选择linux-Generic即可&#xff0c;选择第一个包下载即可 2、安装mysql 解压 shell> tar xzvf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz shell&g…

抽象类和接口的简单认识

目录 一、抽象类 1.什么是抽象类 2.抽象类的注意事项 3.抽象类与普通类的对比 二、接口 1.接口的简单使用 2.接口的特性 3.接口的使用案例 4.接口和抽象类的异同 一、抽象类 所谓抽象类&#xff0c;就是更加抽象的类&#xff0c;也就是说&#xff0c;这个类不能具体描…

NFC RC522开发记录

文章目录 一、ID卡、IC卡(M1卡、CPU卡)的区别二、RC522读写操作1. 数据读写流程三、RC522驱动代码1. RC522 与 STM32 的接线图2. RC522.c3. RC522.h4. main.c一、ID卡、IC卡(M1卡、CPU卡)的区别 ID卡 :只存储了ID号,设备识别ID号,没有算法可言,容易复制,安全性低IC卡包含了…