10_MVC

news2024/11/26 2:56:20

文章目录

  • 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 {
    @SneakyThrows
    public 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 {
    @SneakyThrows
    public 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 {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        process(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        process(req, resp);
    }

    @SneakyThrows
    private void process(HttpServletRequest request, HttpServletResponse response) {
        DispatchUtil.dispatch(request, response, this);
    }

    @SneakyThrows
    private 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.coloradmin.cn/o/1565491.html

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

相关文章

[中级]软考_软件设计_计算机组成与体系结构_06_ 流水线技术

流水线技术 前言相关考试考点一&#xff1a;流水线执行时间概念流水线步骤解析参数计算案例解析&#xff1a;流水线计算第一问第二问 考点二&#xff1a;流水线吞吐率 前言 第一章比较重要的一种计算题型&#xff0c;经常考到&#xff0c;一般考试1 ~ 2分。 相关考试 流水线…

【智能算法】蜜獾算法(HBA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;FA Hashim等人受到自然界中蜜獾狩猎行为启发&#xff0c;提出了蜜獾算法&#xff08;(Honey Badger Algorithm&#xff0c;HBA&#xff09;。 2.算法原理 2.1算法思想 蜜獾以其…

文献速递:深度学习胰腺癌诊断--深度学习算法用于从疾病轨迹预测胰腺癌风险

文献速递&#xff1a;深度学习胰腺癌诊断--深度学习算法用于从疾病轨迹预测胰腺癌风险 麦田医学 美好事物中转站 2024-04-02 14:36 Title 题目 A deep learning algorithm to predict risk of pancreatic cancer from disease trajectories 深度学习算法用于从疾病轨迹预测…

WPF-基础及进阶扩展合集(持续更新)

目录 一、基础 1、GridSplitter分割线 2、x:static访问资源文件 3、wpf触发器 4、添加xaml资源文件 5、Convert转换器 6、多路绑定与多路转换器 二、进阶扩展 1、HierarchicalDataTemplate 2、XmlDataProvider从外部文件获取源 3、TextBox在CellTemplate中的焦点问题…

【LeetCode热题100】79. 单词搜索(回溯)

一.题目要求 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平…

揭秘代码安全:告别硬编码,灵活策略守护你的账户密码信息安全

前言 在编写代码时&#xff0c;为了遵循严格的安全规范&#xff0c;应避免硬编码任何敏感信息如账号凭证、密钥等直接出现在源代码中。相反&#xff0c;推荐采取安全措施&#xff0c;如使用环境变量、加密存储或安全凭据管理系统来间接引用和保护这类数据。如此一来&#xff0c…

使用 Docker 部署 Puter 云桌面系统

1&#xff09;Puter 介绍 :::info GitHub&#xff1a;https://github.com/HeyPuter/puter ::: Puter 是一个先进的开源桌面环境&#xff0c;运行在浏览器中&#xff0c;旨在具备丰富的功能、异常快速和高度可扩展性。它可以用于构建远程桌面环境&#xff0c;也可以作为云存储服…

c++对象指针

对象指针在使用之前必须先进行初始化。可以让它指向一个已定义的对象&#xff0c;也可以用new运算符动态建立堆对象。 定义对象指针的格式为&#xff1a; 类名 *对象指针 &对象; //或者 类名 *对象指针 new 类名(参数); 用对象指针访问对象数据成员的格式为&#xff1a…

python很坐标报错ufunc ‘isfinite‘ not supported for the input types

python使用plt画图的时候&#xff0c;出错。 出错全文如下&#xff1a; Traceback (most recent call last): plt.show() return _get_backend_mod().show(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ __call__ manager.show(**kwar…

Node.js环境调用百度智能云(百度云)api鉴权认证三步走

方式一 :Postman脚本的方式生成v1版本的认证字符串 Postman脚本下载 下载Postman pre-request Script 设置 Authorization 示例脚本 方式二&#xff1a;在线签名工具生成 (试用于验证编程字符串签名是否有错误) 签名计算工具 https://cloud.baidu.com/signature/index.html …

深入核心招聘场景,用友大易帮助健合集团解决「渠道、效率、体验」三件事

自1999年成立以来&#xff0c;健合集团一直致力于婴幼儿营养与护理、成人自然健康营养与护理、以及宠物营养与护理三大核心领域。作为全球高端家庭营养及护理品牌的佼佼者&#xff0c;健合集团始终秉持「让人们更健康更快乐」的企业理念&#xff0c;这不仅体现在产品和服务上&a…

腾讯云(CVM)托管进行权限维持

前言 刚好看到一个师傅分享了一个阿里云ECS实战攻防&#xff0c;然后想到了同样利用腾讯云CVM的托管亦可实现在实战攻防中的权限维持。 简介 腾讯云自动化助手&#xff08;TencentCloud Automation Tools&#xff0c;TAT&#xff09;是一个原生运维部署工具&#xff0c;它可…

苹果放弃造车计划,专家称之All in AI / 阿里巴巴主席蔡崇信:中国电子商务渗透率有望超过40% |魔法半周报

我有魔法✨为你劈开信息大海❗ 高效获取AIGC的热门事件&#x1f525;&#xff0c;更新AIGC的最新动态&#xff0c;生成相应的魔法简报&#xff0c;节省阅读时间&#x1f47b; &#x1f525;资讯预览 苹果放弃造车计划&#xff0c;专家称之All in AI 阿里巴巴主席蔡崇信&#…

JDK、JRE和JDK的关系

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…

【Python项目】AI动物识别工具

目录 背景 技术简介 系统简介 界面预览 背景 成像技术在全球科技发展中扮演了关键角色。在科学研究领域&#xff0c;拍摄所得的图像成为了一种不可或缺的研究工具。特别是在生态学与动物学研究中&#xff0c;鉴于地球的广阔地域和多样的气候条件&#xff0c;利用图像技术捕…

生物信息学数据库分类

生物信息学数据库 &#xff08;一&#xff09;文献数据库 1、PubMed&#xff1a;拥有超过两百六十万生物医学文献的数据库&#xff0c;这些文献来源于MEDLINE&#xff0c;也就是生物医学文献数据库、生命科学领域学术杂志、以及在线的专业书籍。链接&#xff1a;PubMed (nih.g…

【原创】基于springboot+vue疫苗预约管理系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

亚马逊卧式婴儿车和坐式婴儿车需要那些认证?欧盟美国加拿大要求那些检测标准

卧式婴儿车和坐式婴儿车上亚马逊需要那些认证&#xff1f;欧盟美国加拿大要求那些检测标准&#xff1f; 很荣幸您能看到我的资讯&#xff0c;亚马逊各国认证是我公司的优势产品&#xff0c;确保申诉成功并正常销售。服务周到&#xff0c;速度快&#xff0c;周期短。 欧盟 卧…

蓝色wordpress外贸建站模板

蓝色wordpress外贸建站模板 https://www.mymoban.com/wordpress/7.html

【2024 信息素养大赛c++模拟题】算法创意实践挑战赛(基于 C++)

一、 比赛简介 国务院发布《国务院关于印发新一代人工智能发展规划的通 知》&#xff0c;明确实施全民智能教育项目。教育部印发《2019 年教育信息 化和网络安全工作要点》&#xff0c;推动在中小学阶段设置人工智能相关课 程&#xff0c;逐步推广编程教育。本赛项是在贯彻…