当前位置: 首页 > news >正文

MVC框架简易实现【精细】

目录

mvc 的架构

MVC 框架

传统web开发的弊端

1.创建一个maven项目

2.添加maven依赖

3.创建TomCatService类

        3.1 创建TomcatService类

        3.2 TomcatService类讲解

        3.3 安装项目到本地仓库,给其他项目使用

4.测试启动Tomcat

         4.1 创建一个新的maven项目

        4.2 引用mvc-framework项目的依赖

         4.3 创建一个webapp包,里面在创建index.html文件

         4.4 创建一个测试类

        4.5 启动项目

        4.6 访问项目


mvc 的架构

model     ----------> 业务领域的核心对象(Entity,Service,Dao)

View       ----------> 视图层,做数据的提交和渲染 (JSP、HTML.........)

Controller --------> 控制层,专门用于处理Http请求(Servlet)


MVC 框架

简化控制层以及视图渲染的操作,将这些API进行更高层封装,使用起来更加简便,可以隐藏Servlet的操作,同时还可以提供简便的部署方式。


传统web开发的弊端

1.每一个请求都必须要有一个对应的Servlet去处理:

                在传统的Servlet开发中,每个请求都需要对应一个Servlet类来处理。这导致了项目结构的臃肿,且难以维护和扩展。特别是对于大型项目,Servlet的数量可能会非常庞大,给代码的管理和维护带来挑战


2.请求参数的处理相对繁琐 :

                在Servlet开发中,通常需要手动解析请求参数,包括从URL中解析参数或者从请求体中读取参数。这样的处理方式相对繁琐,容易出错,尤其是在处理复杂的参数结构时更加困难。


3.请求响应的统一性比较繁杂:

                在Servlet开发中,通常需要手动设置响应的内容类型、编码等信息,并且手动编写响应内容。这样的操作需要开发者自行管理,容易导致响应的不一致性,增加了维护成本。


4.部署Web应用相对繁杂,肯能存在缓存的问题:

                在传统的Servlet开发中,部署Web应用通常需要手动将Servlet类部署到Servlet容器中,并且需要手动处理依赖关系、配置信息等。这样的部署方式相对繁琐,容易出错。此外,由于Servlet容器会缓存Servlet类,当修改了Servlet类但未正确地刷新缓存时,可能会导致旧版本的Servlet类被执行,从而引发一系列问题。

 为了解决这传统web开发的弊端,我们自己写一个MVC框架简易实现


1.创建一个maven项目


2.添加maven依赖

对应的依赖为:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xr</groupId><artifactId>mvc-framework</artifactId><version>0.9</version><!--打包方式为jar--><packaging>jar</packaging><properties><!--maven编译源代码的jdk版本--><maven.compiler.source>21</maven.compiler.source><!--maven编译目标代码的jdk版本--><maven.compiler.target>21</maven.compiler.target><!--项目构建编码格式--><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--Tomcat依赖--><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-core</artifactId><version>10.1.19</version></dependency><!--JSP解析器依赖--><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId><version>10.1.19</version></dependency><!--EL表达式依赖--><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-el</artifactId><version>10.1.19</version></dependency><!--servlet依赖--><dependency><groupId>jakarta.servlet</groupId><artifactId>jakarta.servlet-api</artifactId><version>6.0.0</version><!--这个依赖是运行环境提供的,不需要打包到jar中--><scope>provided</scope></dependency><!--yml文件解析器--><dependency><groupId>org.yaml</groupId><artifactId>snakeyaml</artifactId><version>1.33</version></dependency><!--底层工具库(Guava,Hutool)--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.27</version></dependency></dependencies></project>

注意:

        1.这里的项目打包方式一定是jar

        2.servlet依赖范围一定是provided

                如果不是Provided,当其他项目引用这个项目的依赖,那么这个依赖会打包到jar中,而Tomcat自带Servlet,那么tomcat会识别到这个jar中的Servlet,tomcat就不知道使用哪个Servlet


3.创建TomCatService类

        3.1 创建TomcatService类

作用:

        启动一个嵌入式的Tomcat服务器。在Java Web开发中,通常使用Tomcat作为Servlet容器来运行Web应用,而这个类的目的是通过代码的方式启动一个Tomcat服务器,而不是通过传统的部署方式

       

        3.2 TomcatService类讲解

package com.xr.embed;import cn.hutool.core.io.FileUtil;
import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat;import java.io.File;/*** Tomcat容器* @author xr* @Date 2024/5/13 11:32*/
public class TomcatServer {/*** 容器的端口号*/private final Integer port = 8080;/*** ContextPath路径,默认值是"/",表示项目的根*/private final String contextPath = "/";/*** web资源的部署目录*/private String webRoot = "src/main/webapp";/*** 启动Tomcat服务器*/public void startServer() {// 实例化Tomcat对象Tomcat tomcat = new Tomcat();// 设置端口tomcat.setPort(port);// 将webRoot构建为绝对路径webRoot = FileUtil.getWebRoot().getAbsolutePath()+ File.separator + webRoot;// 设置contextPath和web资源目录tomcat.addWebapp(contextPath, webRoot);// 创建连接tomcat.getConnector();try {//启动tomcattomcat.start();//将Tomcat进行阻状态,保持运行状态tomcat.getServer().await();} catch (LifecycleException e) {throw new RuntimeException("启动Tomcat失败!!!",e);}}
}

属性:

                     port  :     配置Tomcat服务器的端口

        ContextPath :   应用的根路径

              webRoot :   指定了Web资源的部署目录,即Web应用的根目录。在实际运行时,会将这个目录构建为绝对路径,并传递给Tomcat


方法 :

        startServer() :     首先实例化了Tomcat对象,然后设置了端口和Web资源目录。接着,通过调用addWebapp()方法将Web应用部署到Tomcat的ContextPath下。最后,启动了Tomcat服务器并使其保持运行状态

注意 :

           为什么要让Tomcat进入阻塞装填???

        如果Tomcat进入阻塞状态的话,只要一启动,Tomcat就直接结束了,所以要让Tomcat保持运行状态

        3.3 安装项目到本地仓库,给其他项目使用


4.测试启动Tomcat

         4.1 创建一个新的maven项目

        4.2 引用mvc-framework项目的依赖

对应的依赖:

        

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xr</groupId><artifactId>webapp-demo</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><properties><maven.compiler.source>21</maven.compiler.source><maven.compiler.target>21</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.xr</groupId><artifactId>mvc-framework</artifactId><version>0.9</version></dependency></dependencies></project>

         4.3 创建一个webapp包,里面在创建index.html文件

有则不用创建,没有则创建

具体代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h2>Hello Tomcat</h2>
</body>
</html>

         4.4 创建一个测试类

具体代码:

package com.xr;import com.xr.embed.TomcatServer;/*** 测试方法* @author xr* @Date 2024/5/13 11:50*/public class Main {public static void main(String[] args) {// 创建TomcatServer对象TomcatServer server = new TomcatServer();// 启动Tomcatserver.startServer();}
}

        4.5 启动项目

项目启动成功!!!!

                之前是要配置了Tomcat才能启动项目,我们这里并没有配置Tomcat

发现 :

        我们并没有在Idea中配置Tomcat,按照之前的方法,我们需要在IDEA中配置Tomcat,而这里所使用的,间接让项目内嵌了Tomcat,所以无需配置Tomcat

        4.6 访问项目

------------------------------------------------------待更新------------------------------------------------------------------

相关文章:

MVC框架简易实现【精细】

目录 mvc 的架构 MVC 框架 传统web开发的弊端 1.创建一个maven项目 2.添加maven依赖 3.创建TomCatService类 3.1 创建TomcatService类 3.2 TomcatService类讲解 3.3 安装项目到本地仓库&#xff0c;给其他项目使用 4.测试启动Tomcat 4.1 创建一个新的maven项目 4.2 引用…...

Java入门基础学习笔记18——赋值运算符

赋值运算符&#xff1a; 就是“”&#xff0c;就是给变量赋值的&#xff0c;从右边往左边看。 int a 10; // 把数据赋值给左边的变量a存储。 扩展赋值运算符&#xff1a; 注意&#xff1a;扩展的赋值运算符隐含了强制类型转换。 package cn.ensource.operator;public class…...

csv 可视化 python代码

excel查看csv后,csv就被锁定了,不能修改,用pyqt写一个csv查看工具,拖拽查看,非常方便 目录 第2版,提升加载速度 选中单元格统计个数,求和,平均值...

HashMap 和 Hashtable区别的底层原理

一、容器键值对&#xff1a; 1.HashMap 的 key 和 value 都允许为 null &#xff0c; HashMap 在 key 为 null 的时候&#xff0c;值必须为null。 2.Hashtable 的 key 和 value 都不允许为 null 。 Hashtable 遇到key或value为 null时 &#xff0c;将抛出 NullPointerException…...

代码随想录35期Day32-Java

Day32题目 LeetCode122.买股票的最佳时机 核心思想&#xff1a;很简单&#xff0c;只要第二天比第一天贵&#xff0c;就第一天买入&#xff0c;第二天卖出 class Solution {public int maxProfit(int[] prices) {// 只要后一天比这一天价钱高就买&#xff0c;然后第二天卖出…...

ROS 2边学边练(45)-- 构建一个能动的机器人模型

前言 在上篇中我们搭建了一个机器人模型(其由各个关节&#xff08;joint&#xff09;和连杆&#xff08;link&#xff09;组成)&#xff0c;此篇我们会通过设置关节类型来实现机器人的活动。 在ROS中&#xff0c;关节一般有无限旋转&#xff08;continuous&#xff09;,有限旋转…...

【第66例】IPD体系进阶:华为IPD发展历程

目录 简介 样例 作者简介 简介 想要引入 IPD,首先就要思考一些问题: 跟我的企业适配吗? 流程会不会太重了? 一定要引入吗,有没有其他方式? 从目前大的环境来说。 中国制造业正在由“中国制造”向“中国创造”转变。 这也是企业价值转移的趋势。 宏碁集团创始人施振…...

websevere服务器从零搭建到上线(四)|muduo网络库的基本原理和使用

文章目录 muduo源码编译安装muduo框架讲解muduo库编写服务器代码示例代码解析用户连接的创建和断开回调函数用户读写事件回调 使用vscode编译程序配置c_cpp_properties.json配置tasks.json配置launch.json编译 总结 muduo源码编译安装 muduo依赖Boost库&#xff0c;所以我们应…...

C语言笔记10

1.用指针打印一维数组 //1.用指针打印一维数组 #include <stdio.h> int main() {//int arr[] { 1,2,3,4,5 };int arr[5] { 0 };int* p &arr[0];int sz sizeof(arr) / sizeof(arr[0]);for (int i 0; i < sz; i){scanf("%d", &arr[i]);}//int* …...

BMS-HiL主要功能

BMS HIL 系统中 PC 机中安装实验管理软件用于测试过程管理和测试序列编辑&#xff0c;通过以太网与 PXI 机箱中的处理器进行连接&#xff0c;处理器中运行实时系统&#xff08;Real Time&#xff09;并安装 Veristand 终端引擎&#xff0c;通过与 PC 中的数据传输&#xff0c;对…...

idea无法识别加载pom.xml文件

有时idea无法识别加载pom.xml文件&#xff0c;直接打开pom.xml文件&#xff0c;然后添加到maven就行...

C语言笔记12

1.使用qsort函数进行排序 #include <stdio.h> #include <stdlib.h> #include <string.h>//void qsort(void* base, //指向待排序数组的第一个元素的指针 // size_t num, //base指向数组中的元素个数 // size_t size,//base指向的数组中一…...

说一下 hibernate 的缓存机制?

Hibernate 的缓存机制是为了提高应用程序的性能&#xff0c;通过减少对数据库物理数据源的访问频次而设计的。Hibernate 的缓存主要可以分为两个级别&#xff1a;一级缓存&#xff08;也称为 Session 级别的缓存&#xff09;和二级缓存&#xff08;也称为 SessionFactory 级别的…...

Mac安装jadx

1、使用命令brew安装 : brew install jadx 输入完命令,等待安装完毕 备注&#xff08;关于Homebrew &#xff09;&#xff1a; Homebrew 是 MacOS 下的包管理工具&#xff0c;类似 apt-get/apt 之于 Linux&#xff0c;yum 之于 CentOS。如果一款软件发布时支持了 homebrew 安…...

风扇开启执行逻辑

执行流程 public static void businessExecutionWork(){//以下为业务逻辑部分System.out.println("1、根据电池包控制风扇服务执行 开始!");//1、获取电池包电压、电流、环境温度//获取电池包电压、电流、环境温度ObtainBatteryDataService obtainBatteryDataServic…...

调用函数实现数组的输入排序插入与输出

输入一串数字&#xff0c;输出排序插入后输出最后的数字序列&#xff1b; 把主要步骤交给主函数&#xff0c;通过调用函数来实现整体的功能&#xff1a; 写出主函数&#xff08;这里使用冒泡排序&#xff09;&#xff1a; int main(){int n;int a[10];cin>>n;inputa(a…...

代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树

代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树 文章目录 代码随想录算法训练营Day 41| 动态规划part03 | 343. 整数拆分、96.不同的二叉搜索树343. 整数拆分一、动态规划二、贪心&#xff08;不需要掌握&#xff09; 96.不同的二叉搜索树一…...

多模态产品在智能文档处理应用的展望------以TextIn模型为例

前言发展现状TextIn 文档解析技术文本向量化展望合合信息 前言 第十四届视觉与学习青年学者研讨会(VALSE 2024)于5月5日-7日在山城重庆渝北区悦来国际会议中心举办。大会聚焦计算机视觉、模式识别、多媒体和机器学习等领域的国际前沿和热点方向。大会中&#xff0c;合合信息智能…...

上海市计算机学会竞赛平台2024年3月月赛丙组最近的数字

题目描述 给定两个正整数 &#x1d45b;n 与 &#x1d451;d &#xff0c;请找到所有最接近 &#x1d45b;n 且是 &#x1d451;d 的倍数的整数。 输入格式 第一行&#xff1a;单个整数表示 &#x1d45b;n第二行&#xff1a;单个整数表示 &#x1d451;d 输出格式 若干行…...

RFID在汽车制造中的应用如何改变行业

随着工业4.0和中国制造2025的推进&#xff0c;企业对于智能化、自动化的需求日益增长&#xff0c;RFID射频技术在制造业中已经相当普遍了。在如今这瞬息万变的行业与时代中&#xff0c;RFID技术可以帮助企业获得竞争优势&#xff0c;简化日益复杂的生产流程&#xff0c;推动企业…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...