首页 > 其他分享 >第三十三章 Spring之梦开始的地方——MVC

第三十三章 Spring之梦开始的地方——MVC

时间:2025-01-12 14:00:57浏览次数:3  
标签:Spring MVC 第三十三章 假如 println Servlet out

Spring源码阅读目录

第一部分——IOC篇

第一章 Spring之最熟悉的陌生人——IOC
第二章 Spring之假如让你来写IOC容器——加载资源篇
第三章 Spring之假如让你来写IOC容器——解析配置文件篇
第四章 Spring之假如让你来写IOC容器——XML配置文件篇
第五章 Spring之假如让你来写IOC容器——BeanFactory和FactoryBean
第六章 Spring之假如让你来写IOC容器——Scope和属性填充
第七章 Spring之假如让你来写IOC容器——属性填充特别篇:SpEL表达式
第八章 Spring之假如让你来写IOC容器——拓展篇
第九章 Spring之源码阅读——环境搭建篇
第十章 Spring之源码阅读——IOC篇

第二部分——AOP篇

第十一章 Spring之不太熟的熟人——AOP
第十二章 Spring之不得不了解的内容——概念篇
第十三章 Spring之假如让你来写AOP——AOP联盟篇
第十四章 Spring之假如让你来写AOP——雏形篇
第十五章 Spring之假如让你来写AOP——Joinpoint(连接点)篇
第十六章 Spring之假如让你来写AOP——Pointcut(切点)篇
第十七章 Spring之假如让你来写AOP——Advice(通知)上篇
第十八章 Spring之假如让你来写AOP——Advice(通知)下篇
第十九章 Spring之假如让你来写AOP——番外篇:Spring早期设计
第二十章 Spring之假如让你来写AOP——Aspect(切面)篇
第二十一章 Spring之假如让你来写AOP——Weaver(织入器)篇
第二十二章 Spring之假如让你来写AOP——Target Object(目标对象)篇
第二十三章 Spring之假如让你来写AOP——融入IOC容器篇
第二十四章 Spring之源码阅读——AOP篇

第三部分——事务篇

第二十五章 Spring之曾经的老朋友——事务
第二十六章 Spring之假如让你来写事务——初稿篇
第二十七章 Spring之假如让你来写事务——铁三角篇
第二十八章 Spring之假如让你来写事务——属性篇
第二十九章 Spring之假如让你来写事务——状态篇
第三十章 Spring之假如让你来写事务——管理篇
第三十一章 Spring之假如让你来写事务——融入IOC容器篇
第三十二章 Spring之源码阅读——事务篇

第四部分——MVC篇

第三十三章 Spring之梦开始的地方——MVC
第三十四章 Spring之假如让你来写MVC——草图篇
第三十五章 Spring之假如让你来写MVC——映射器篇
第三十六章 Spring之假如让你来写MVC——拦截器篇
第三十七章 Spring之假如让你来写MVC——控制器篇
第三十八章 Spring之假如让你来写MVC——适配器篇
第三十九章 Spring之假如让你来写MVC——番外篇:类型转换
第四十章 Spring之假如让你来写MVC——ModelAndView篇
第四十一章 Spring之假如让你来写MVC——番外篇:数据绑定
第四十二章 Spring之假如让你来写MVC——视图篇
第四十三章 Spring之假如让你来写MVC——上传文件篇
第四十四章 Spring之假如让你来写MVC——异常处理器篇
第四十五章 Spring之假如让你来写MVC——国际化篇
第四十六章 Spring之假如让你来写MVC——主题解析器篇
第四十七章 Spring之假如让你来写MVC——闪存管理器篇
第四十八章 Spring之假如让你来写MVC——请求映射视图篇
第四十九章 Spring之假如让你来写MVC——番外篇:属性操作
第五十章 Spring之假如让你来写MVC——融入IOC容器篇
第五十一章 Spring之源码阅读——MVC篇


文章目录


前言

    对于Spring一直都是既熟悉又陌生,说对它熟悉吧,平时用用没啥问题,但面试的时候被问的一脸懵逼,就很尴尬,都不好意思在简历上写着熟悉Spring了
在这里插入图片描述

    所以决定花点时间研究研究Spring的源码。主要参考的书籍是:《Spring源码深度解析(第2版)》、《Spring揭秘》、《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》


     在前边的内容中, A君 在完成 AOP之后,顺手把 事务 也给完成了。事务 总体给人的感觉就是概念比实现简单,A君 在做的时候,大部分的时间都用在整理概念上了,虽然没有实现 异步事务,也凑活事吧。接下来,A君 准备继续前行,开启新的篇章——MVC篇

尝试动手写IOC容器

    出场人物:A君(苦逼的开发)、老大(项目经理)

    背景:老大 要求 A君在一周内开发个简单的 IOC容器

    前情提要: 继 AOP 功能之后,A君 又实现了 事务 部分的内容 。。。

Servlet?万恶之源

    在 A君 完成 事务 部分,还没来得及清闲一段时间呢。 老大 就又跑过来了,径直走到 A君 的身边。笑着说到:“A君 最近这段时间,加把劲,争取把剩余的内容进行做出来,现在可以开始着手实现 MVC 部分了。” 说完,也不等 A君 回话,就回到了自己的办公室

    “诶。这活怎么就干不完呢?” A君 不禁一阵叹气,又得去了解 MVC 了。说到 MVC,又不得不提到 ServletA君 那死去的记忆如潮水般涌来。。。

    严格意义上来说,SpringMVC 其实不是 A君 的梦始之处,真正开始的地方其实是 Servlet/JSP,可能对于年轻一点的小伙伴来说,这都是传说中的东西了,属于老古董级别的技术了,得和 Applet 坐一桌了。没办法,大学就是这么教的,说的好听点,叫:打好基础。其实 Servlet 本身是一个 Java 类,并不能独立运行,它依赖于 容器,嗯,好像有点歧义,不是云原生那个。或者叫中间件?貌似也有歧义。算了,就让 Tomcat 作为代表吧。简单的说:Tomcat 启动时候,会去加载并初始化对应的 Servlet,浏览器发起请求时,Tomcat 会去匹配对应的 Servlet。那这就有两个问题:

  1. Tomcat 怎么知道要加载哪些 Servlet
  2. 请求过来时,Tomcat 要怎么匹配对应的 Servlet

这就引出了 web.xml 配置文件了,注:Servlet 3.0 之后开始支持注解,这里为了直观,只用xml作为例子

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>springmvc-demo</display-name>

   <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>com.hqd.demo.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/HelloServlet</url-pattern>
  </servlet-mapping>

servlet-class 定义了类的全路径,url-pattern 又指定的浏览器访问时的路径,这两者又通过 servlet-name 关联起来。既然 web.xml 都配置好了,就下来 A君 顺手写了个 Servlet 类。代码如下:

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(this);
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Hello Servlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Hello, this is a GET request!</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            String name = request.getParameter("name");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Hello Servlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Hello, " + name + "! This is a POST request!</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
}

一切都准备好之后,Tomcat 会根据url找到对应的servlet,而后再根据请求方法,调用GETPOST。这就是一个简单的调用过程(省略生命周期)。那这也不对啊,JSP 的作用又在哪里?在上面的例子中,可以看到 Servlet 手握着两个最重要的东西requestresponse几乎可以实现所有相关操作。但是这样引出了一系类问题,要知道软件行业一直都在追求职责清晰,Servlet 既然包揽了所有的活,意味着所有逻辑都得在Servlet实现,上面仅仅是个hello的页面,就那么多代码了,后边如果更大的页面呢,在加上业务逻辑呢?可以想象得出,这种代码根本就没法维护。这也就是最常见的 “神奇Servlet(Magic Servlet)”

JSP的出现

    为了解决“神奇Servlet(Magic Servlet)”带来的问题,那就把渲染单独拎出来呗,这时候,JSP 就出现了。有了 JSP 之后,HelloServlet代码如下:

public class HelloServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(this);
        RequestDispatcher dispatcher = request.getRequestDispatcher("hello.jsp");
        dispatcher.forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println(this);
        RequestDispatcher dispatcher = request.getRequestDispatcher("hello.jsp");
        dispatcher.forward(request, response);
    }
}

hello.jsp代码如下:

<html>
<body>
<h2>Hello World!</h2>
</body>
</html>

似乎一切都是这么的美好,但是对 JSP 有过了解的人都知道,JSP 会在服务器端被编译成一个 Servlet,最终是会以 Servlet 进行运行的。也就是说,它的本质并没有改变,而且 JSP 中也可以编写 JAVA 代码。这提高了 JSP 的灵活性,也带来了弊端。经验老到的程序员会知道,JSP 只负责渲染,Servlet 负责业务逻辑,但经不住一些铁头娃图省事,把 JAVA 代码直接写在 JSP 中,得!这下子从“魔法Servlet” 变成 “魔法JSP”,兜兜转转又回到了原点。如下:

<%@ page import="java.sql.*" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <title>Database Connection Example</title>
</head>
<body>
    <h2>Database Records</h2>
    <table border="1">
        <thead>
            <tr>
                <th>ID</th>
                <th>Name</th>
                <th>Email</th>
            </tr>
        </thead>
        <tbody>
            <%
                // 数据库连接信息
                String url = "jdbc:mysql://localhost:3306/your_database";
                String username = "your_username";
                String password = "your_password";

                try {
                    // 加载数据库驱动
                    Class.forName("com.mysql.cj.jdbc.Driver");
                    Connection conn = DriverManager.getConnection(url, username, password);
                    
                    // 查询数据
                    Statement stmt = conn.createStatement();
                    ResultSet rs = stmt.executeQuery("SELECT id, name, email FROM users");

                    // 输出查询结果
                    while (rs.next()) {
                        out.println("<tr>");
                        out.println("<td>" + rs.getInt("id") + "</td>");
                        out.println("<td>" + rs.getString("name") + "</td>");
                        out.println("<td>" + rs.getString("email") + "</td>");
                        out.println("</tr>");
                    }

                    // 关闭连接
                    rs.close();
                    stmt.close();
                    conn.close();
                } catch (Exception e) {
                    out.println("<p>Error: " + e.getMessage() + "</p>");
                }
            %>
        </tbody>
    </table>
</body>
</html>

现在人们总喜欢把责任推卸给 JSP,但其实技术本身并没有错,JSP 并不推荐直接写 Java 代码

MVC横空出世

    现在说到 MVC(Model-View-Controller),几乎无人不知,无人不晓。而 MVC 的出现正是为了解决 ServletJSP 之间暧昧不清的关系。它将应用程序分为三个主要部分:模型(Model)视图(View)控制器(Controller),每个部分负责不同的任务,从而实现应用程序的分离关注点。各个组件的作用如下:

  • Model(模型): 模型只负责应用状态和数据逻辑

  • View(视图): 视图只负责将模型的数据进行渲染

  • Controller(控制器): 控制器负责接受请求并处理,通知对应的模型进行相应的操作,而后在找到对应的视图进行展示,可以说是模型和视图之间的‘红娘’

在这里插入图片描述

好了,本着够用就行的原则,这些应该也凑活事,A君 今天就了解到这里了,明天的事明天再说吧,下班咯。。。


总结

    正所谓树欲静而风不止,欲知后事如何,请看下回分解(✪ω✪)

标签:Spring,MVC,第三十三章,假如,println,Servlet,out
From: https://blog.csdn.net/weixin_42789334/article/details/144427539

相关文章

  • springboot整合EasyExcel导出excel表格
    文章目录什么是EasyExcel?EasyExcel的特点使用EasyExcel导出excel1.添加EasyExcel依赖2.定义converter3.定义导出实体类型4.查询数据库数据并导出5.导出样式什么是EasyExcel?  EasyExcel是阿里巴巴开源的一款高性能、简洁易用的Excel读写工具库,基于Java开......
  • 基于Spring Boot的景区服务平台【代码实现+数据库设计+实现文档】
    ......
  • [免费]微信小程序(高校就业)招聘系统(Springboot后端+Vue管理端)【论文+源码+SQL脚本
    大家好,我是java1234_小锋老师,看到一个不错的微信小程序(高校就业)招聘系统(Springboot后端+Vue管理端),分享下哈。项目视频演示【免费】微信小程序(高校就业)招聘系统(Springboot后端+Vue管理端)Java毕业设计_哔哩哔哩_bilibili项目介绍随着越来越多的用户借助于移动手机......
  • 基于springboot的老年人体检管理系统
      博主介绍:java高级开发,从事互联网行业多年,熟悉各种主流语言,精通java、python、php、爬虫、web开发,已经做了多年的设计程序开发,开发过上千套设计程序,没有什么华丽的语言,只有实实在在的写点程序。......
  • 基于Springboot的图书电子商务系统【附源码】
    基于Springboot的图书电子商务系统效果如下:系统主页面图书信息管理页面图书资讯页面系统登陆页面个人中心页面我的地址页面图书分类管理页面在线客服页面图书信息页面研究背景随着互联网技术的快速发展,尤其是移动互联网的普及,电子商务已成为人们日常生......
  • 【开题报告+论文+源码】基于SpringBoot+Vue的大学生创新创业申报平台系统
    背景与意义在全球创新创业浪潮的推动下,高等教育机构愈发重视培养大学生的创新精神和创业能力,积极构建有利于学生发挥创新能力、实现创业梦想的良好环境。然而,在实际操作中,项目申报流程繁琐、审核效率低下、权限分配不清晰等问题成为了制约大学生创新创业活动发展的重要瓶颈。......
  • springboot“伊牛”养牛场管理平台源码毕设+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着农业现代化的不断推进,畜牧业作为农业的重要组成部分,其管理模式也逐渐向智能化、信息化方向发展。传统的养牛场管理往往依赖于人工记录和口头传达,......
  • SpringBoot面试题(2025)
    什么是SpringBoot?多年来,随着新功能的增加,spring变得越来越复杂。只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的所有Spring项目的不同功能。如果必须启动一个新的Spring项目,我们必须添加构建路径或添加Maven依赖关系,配置应......
  • 0045.基于springboot+vue的客户关系管理系统(crm)+论文
    一、系统说明基于springboot+vue+elementui开发的客户关系管理系统(crm),系统功能齐全,代码简洁易懂,适合小白学编程。二、系统架构     前端:vue|elementui     后端:springboot|mybatis      环境:jdk1.8+|mysql8.0+|maven三、代码及数据库四、......
  • springboot高校社团管理系统-毕业设计源码36784
    目 录摘要1绪论1.1研究背景1.2 研究意义1.3论文结构与章节安排2 系统分析2.1可行性分析2.2系统流程分析2.2.1数据新增流程2.2.2数据删除流程2.3 系统功能分析2.3.1功能性分析2.3.2非功能性分析2.4 系统用例分析3系统总体设计3......