Java Web基础详解

回顾

之前的两篇的文章已经大概的带我们了解了tomcat的一些基本的操作,比如从零搭建我们自己的调试环境以及官方文档构建的方式,接下来的话,我将带大家来了解一下tomcat的一些基础知识,这些基础知识将以问题的方式抛出,然后引起我们自己的思考。

一、 tomcat的产生

这一部门我们从tomcat的产生来进行讨论,主要的是tomcat的构成条件。

1.1 tomcat产生的条件?

维基百科上是这么说的,Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全局管理和Tomcat阀等。
Tomcat是由该基金会的会员和其他志愿者开发与维护的,并且是一个被置于Apache协议之下的开源软件。用户可以根据该协议免费获得其源代码及可执行文件。
简单的说就是SUN公司推出了Servlet的规范和JSP的规范,然后tomcat在这个规范上实现了自己的架构,然后基于各种设计模式和其他的依赖关系,最后在社区工作者的共同努力下构成了我们现在所看到的成品tomcat。
tomcat历史版本
那么这个问题就很好回答了,如果对于我们直接的进行面向Servlet进行编程的话,毫无疑问编程的难度会增加,我们还需要从零开始实现Servlet的规范和JSP的规范,毫无疑问对于现在的我们肯定是无法忍受的。后来的tomcat也是经历了时间的检验,从推出到现在一直活跃在我们的视野,更是作为了SpringBoot的默认嵌入性服务器。(个人看来,这里有利也有弊,虽然它方便了我们的日常开发工作,但是也让我们对于这个软件的认知变得更加的模糊,只需要编辑配置文件即可,面向配置文件编程。)

1.2 tomcat vs jetty

在我们的个人认知中,可能我们现在比较常用的是tomcat,可是在之前也有一个和他性能相近的web容器,它就是Jetty。
Jetty 提供 Web 服务器和 servlet 容器,此外还提供对 HTTP/2、WebSocket、OSGi、JMX、JNDI、JAAS 和许多其他集成的支持。这些组件是开源的,可以免费用于商业用途和分发,并且还可以作为许多框架、云服务、应用程序服务器和设备的嵌入式工具。
Jetty的特性

  • 可以用作 Java 应用程序服务器堆栈的一部分或完整。
  • 由于其灵活性,可以作为其他框架的一部分应用。
  • 支持云式操作。
  • Jetty 用户友好,并且比 Tomcat 具有更好的界面。
  • 与 Tomcat 相比,更适合处理并发用户。
  • 该框架的概念权重较小,速度非常快,而且很薄。
  • 内存小,工作速度快。
  • 用户可以轻松使用它,因为所需的知识和技能很少。
    tomcat的特性
  • 首先tomcat在任何平台上都非常容易安装和配置。
  • 尽管它提供了Web 服务器的所有功能,但其重量却非常轻。
  • 有很多定制选项可以扩展其功能。
  • 非常稳定的产品,因为它已经存在很长时间了。
  • 文档齐全,易于学习。
  • 提供简单的 Web 应用程序部署选项。
  • 支持 Java 企业版。
  • Coyote 引擎可运行多个 Java 企业应用程序,包括 Java Persistence API。
  • 为用户提供额外的安全级别。

我们可以通过对比发现jetty似乎更轻量级,而tomcat更加的重量级,轻量的话一般是性能比较好,而重量的话功能会更加的完善和稳定,当然对于企业级应用来说肯定是追求性能和稳定同在,而他们两个的功能不同也同时注定了他们所采用的架构方式不同,这里就不进行展开细说,之后会慢慢的进行了解tomcat的架构设计,到时候会进行统一的对比,方便我们掌握他们的各自实现。

1.3 网络请求

这里简单的复习一下基本的网络请求是什么?可能我们都学过了很多的网络课程,可是当我们把知识当作文字记在脑中时仍然会觉得生硬,所以我们来采用类比的方法来理解请求。

1.3.1 网络协议

我们大概是从计算机网络这门课程中都已经了解过七层网络架构,这里我们来进行串一下TCP/IP的五层协议,这个比较适用于现在计算机软件应用。
应用层
应用层的分层主要为我们解决了数据获取和写入,这里的话我们可以通过应用层协议然后把我们需要的数据给封装或者是解封装。如果是我们进行寄信如果我们不进行封装信封,填写个人的信息,那么我们的信件肯定也是不能准确的投放到我们期望的目的地。
传输层
传输层的设计就涉及到了计算机的一些特性了,在计算机中如果向外进行通信的话就必须绑定一个对外的端口,这个端口就和这个应用进行了绑定,对于不同的协议也是可以绑定相同的端口的。这样的话我们只需要通过知道目标的IP和端口号我们就大概知道了它的具体位置,就相等于门牌号。
网络层
网络层的主要部分就是ip,网络数据报在不同的网段间进行传输,通过ip然后不断的在路由器之间传送,这里更像是送信时走过的马路,当然每个路由器就相当于是一个指示器,能够告诉我们如何能够最快的到达我们想要去的目的地。
数据链路层
数据链路层的最基本的功能是向该层用户提供透明的和可靠的数据传送基本服务。当请求到达了ip时,然后就需要通过将ip地址转化为mac地址,然后就等于说是到了小区需要然后转化为门牌号。
物理层
物理层则是将字节流转化为电气特性,然后进行传播,因为在具体的物理传输中是不能直接传输二进制的。
当然其中必然还有保证数据的顺序,和校验传输数据的完整性的算法,这些共同构成了我们目前所见到的TCP/IP协议簇。

1.3.2 HTTP协议

我们平常使用的最多的便是HTTP协议,它是一种传输协议具体的也经历了不断的迭代,从1.1到2.0再到3.0。不断的更新迭代让它逐渐的适应了现在的传输要求。
对于最早版本的HTTP协议在每发出一个请求就会新建一个tcp连接,毫无疑问这里是不合理的,到了http1.1则是通过请求头的keep-alive,然后达到复用tcp连接。
http1.1之前是采用明文传输,如果中间被其他人截获后可以很容易的查看到请求的参数以及一些私密的信息,于是对于重要的信息都推荐采用https的方式进行通信。
http2
在这里可以看到阿里云的大部分接口已经是http2.0协议。
(这里插入一点之前的抓包就是通过抓取http的参数,然后定时或者不定时的进行请求接口达到签到的目的)在http2就改为了二进制的方式进行传输,只是不能直观的观察了,但是安全性的问题还是要依靠https,而且也进行了请求头压缩,将常用的请求头维护在两端,这样的话请求的数据量也会变少。

二、Servlet

我们来看一下Servlet4.0的规范,来观察一下这个Servlet到底是一个怎样的东西,怎么撑起了JAVA的web世界。

2.1 什么是Servlet

Servlet用我们自己的话来说就是一个入口JAVA类,它接收封装好的网络请求Request然后对外返回响应Response。当它进行配置后放入Servlet容器就可以进行正常的进行工作,它是后来JAVA Web框架的基础,构成了JAVA Web的基石。


public interface Servlet {


    public void init(ServletConfig config) throws ServletException;

    public ServletConfig getServletConfig();

    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException;

    public String getServletInfo();

    public void destroy();
}

2.2 Servlet容器

Servlet容器是Servlet的具体存放地,它可以控制每一个Servlet的声明周期,当一个请求到达时他负责将网络请求进行组装为可以识别的Servlet。当数据返回时他又负责装为可供发送的响应response。

2.3 Servlet容器初始化

Servlet的初始化随着程序的启动发生,只有当所有的Servlet初始化之后程序才对外提供服务,将对应的请求进行绑定到具体的Servlet,同时在初始化的时候会进行调用对应的init方法。

2.4 Servlet生命周期

通过init,service和destroy方法等进行控制。

2.5 Request

请求对象封装了来自客户端请求的所有信息。在HTTP协议中,此信息从客户端传输到HTTP报头和请求的消息体中的服务器。

public interface ServletRequest {

    public Object getAttribute(String name);

    public Enumeration<String> getAttributeNames();

    public String getCharacterEncoding();

    public void setCharacterEncoding(String env)
            throws java.io.UnsupportedEncodingException;

    public int getContentLength();

    public long getContentLengthLong();

    public String getContentType();

    public ServletInputStream getInputStream() throws IOException;

    public String getParameter(String name);

    public Enumeration<String> getParameterNames();

    public String[] getParameterValues(String name);

    public Map<String, String[]> getParameterMap();

    public String getProtocol();

    public String getScheme();
    
    public String getServerName();

    public int getServerPort();

    public BufferedReader getReader() throws IOException;

    public String getRemoteAddr();
    
    public String getRemoteHost();
    
    public void setAttribute(String name, Object o);

    public void removeAttribute(String name);

    public Locale getLocale();

    public Enumeration<Locale> getLocales();

    public boolean isSecure();

    public RequestDispatcher getRequestDispatcher(String path);

    @Deprecated
    public String getRealPath(String path);

    public int getRemotePort();

    public String getLocalName();

    public String getLocalAddr();

    public int getLocalPort();

    public ServletContext getServletContext();

    public AsyncContext startAsync() throws IllegalStateException;

    public AsyncContext startAsync(ServletRequest servletRequest,
            ServletResponse servletResponse) throws IllegalStateException;

    public boolean isAsyncStarted();

    public boolean isAsyncSupported();

    public AsyncContext getAsyncContext();

    public DispatcherType getDispatcherType();
}

可以看到主要是封装了方法如获取请求的路径、请求参数、请求类型等等,然后这样的话就可以被Servlet容器识别然后进行处理,这里的话是一个接口,后续的具体的协议实现是看我们使用什么样的应用层协议,比如他就有个具体实现HttpServletRequest,对应的也有HttpServletResponse和HttpServlet。
这里的话来提一下一个具体的URL构成.:

  • domin域名构成了URL的第一层,它可以通过DNS服务器映射到我们的服务器的ip地址,由此便可以找到服务器的具体位置。
  • port 端口号则是标明了我们需要和服务器的哪个应用进行通信,对于传输层的协议来说,端口号就是对应的应用身份ID。
  • context Path上下文路径是针对服务器而言的,如果没有对项目进行配置的话默认是以项目名为主,主要为了区分不同的项目。
  • Servlet Path Servlet主要是区分不同的请求处理,如通过对于路径名我们可以区分不同的Servlet操作,可以一一的进行映射。
  • Parameter URL后的参数,主要是对Servlet传递信息。

2.6 Response

主要封装了对应的响应信息。

2.7 Filter

过滤器是可重用的代码片段,它可以用作书写统一的逻辑,可以更改初始的请求逻辑或者响应逻辑,我们可以用它来进行修改字符编码,或者实现一些我们自己的业务逻辑。
过滤器在首次启动就必须初始化完毕,因为后续的Servlet都需要经过它才能进行正常的业务处理。一般是通过链式调用,将过滤器链上的过滤器全部都需要运行一遍才能真正的走到Servlet。
这里就可以得到filter在JAVA Web的执行优先级还是蛮高的。

2.8 Session

超文本传输协议(HTTP)被设计为一种无状态协议。为了构建有效的Web应用程序,必须将来自特定客户端的请求相互相关联。因此Session就横空出世了,它是通过cookie进行跟踪会话机制,当客户端发送请求后,服务器会向客户端返回一个Session,之后的每一次请求都会携带上这个Session ID用作验证是否是同一个客户端,当然Session ID是可以复制的。
那么如果不支持Cookie的话我们该怎么办呢,我们也可以通过路径重写的方式,将对应的SessionID写入请求的URL里面,作为参数进行传递。

2.9 Event

可以用于事件的监听,对于Web应用的生命周期更好的掌控

2.10 Context

上下文信息,用于管理Servlet,可以用于获取当前应用的上下文,然后动态的进行添加Servlet等。

三、回顾

我们今天了解了tomcat的一些优势以及和其他web容器的对比,然后我们也进行大概的了解了Servlet在JAVA Web中的地位,至于有更多的知识本文并没有进行提出,我们还需要恶补操作系统,计算机网络等方面的知识,只有不断的强化自己,到了最后我们才能屡战屡胜。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

精选50张网络监控拓扑图,都看懂了才算入门

你们好&#xff0c;我的网工朋友。 拓扑图说白了就是一种结构图&#xff0c;方便网工们直观看到网络中各个节点之间的链接&#xff0c;还有接口之间的链接&#xff0c;方便配置和排除错误。 根据结构不同&#xff0c;“网络拓扑图”分为星型拓扑结构、环型网络拓扑结构、总线…

Python实现API接口并发测试

目录 一、引言 二、准备工作 三、并发测试的实现 1、导入必要的库 2、定义并发测试函数 3、调用并发测试函数 四、测试结果分析和优化 五、总结 一、引言 随着微服务架构和RESTful API的普及&#xff0c;API接口测试变得越来越重要。并发测试是API测试的一个重要方面&…

Hadoop集群部署

目录 1 模板虚拟机环境准备 1.1 修改网卡配置文件 扩展 1.2 修改主机名 1.3 在虚拟机中需要的基础文件包 1.4 关闭防火墙 1.5 创建Hadoop的账户及文件 2 模板虚拟机安装JDK 3 模板虚拟机安装Hadoop 4 克隆虚拟机 5 虚拟机配置主机名称映射 6 集群分发脚本 7 SSH无…

蓝牙物联网通信网络设计方案

随着当前经济的快速发展&#xff0c;社会运行节奏加快&#xff0c;人们更倾向于选择高效的出行方式&#xff0c;而飞机就是其中之一。近年来&#xff0c;全国各地机场的吞吐量不断增长&#xff0c;导致航站楼面积过大&#xff0c;而 GPS全球定位系统在室内感测不到卫星信号无法…

嵌入式单片机的存储区域与堆和栈

一、单片机存储区域 如图所示位STM32F103ZET6的参数&#xff1a; 单片机的ROM&#xff08;内部FLASH&#xff09;&#xff1a;512KB&#xff0c;用来存放程序代码的空间。 单片机的RAM&#xff1a;64KB&#xff0c;一般都被分配为堆、栈、变量等的空间。 二、堆和栈的概念 …

配置Nginx出现403 (Forbidden)静态文件加载不出来

出现问题如图 出现此问题可能和索引文件缺失、访问限制等原因有关&#xff0c;在默认的Nginx的配置中&#xff0c;出现此问题的大概率问题可能出现在启动用户和nginx工作用户不一致所致。 Nginx的默认配置文件的 nginx.conf 里首行是 user www-data; 如果你是在 root 下启用…

【数学建模美赛M奖速成系列】Matplotlib绘图技巧(一)

Matplotlib图像基础 写在前面1 基本绘图实例&#xff1a;sin、cos函数图2 plot()函数详解**kwargs参数&#xff1a; 3 matplotlib中绘图的默认配置4 设置图的横纵坐标的上下界5 设置横纵坐标上的记号6 调整图像的脊柱7 添加图例8 给一些特殊点加注释9 子图最后 写在前面 前面我…

云上安全责任共担模型

对于传统自建物理服务器模式&#xff0c;用户需要承担所有的安全责任&#xff0c;负责从物理基础设施到上层应用的所有层面的安全体系构建。 云服务器的安全责任确实与物理服务器不同&#xff0c;云上的安全性是一种责任共担模式&#xff0c;其中云服务器ECS的安全责任需要你&…

Qt/C++音视频开发61-多屏渲染/一个解码渲染到多个窗口/画面实时同步

一、前言 多屏渲染就是一个解码线程对应多个渲染界面&#xff0c;通过addrender这种方式添加多个绘制窗体&#xff0c;我们经常可以在展会或者卖电视机的地方可以看到很多电视播放的同一个画面&#xff0c;原理应该类似&#xff0c;一个地方负责打开解码播放&#xff0c;将画面…

颗粒物PM2.5在建筑室外环境的污染扩散传播CFD模拟仿真

颗粒物PM2.5在建筑室外环境的污染扩散传播CFD模拟仿真 一、引言 随着城市化进程的加速,室外环境中的颗粒物污染问题日益严重。颗粒物在建筑室外环境中的扩散传播受到多种因素的影响,如风速、湍流、建筑物布局等。计算流体动力学(CFD)模拟作为一种有效的预测工具,可以模拟…

深度学习(九):bert之代码实现

bert之代码实现 任务1: Masked LM任务2&#xff1a;下一句预测代码实现预训练模型模型数据集配置训练评估预测 结果 任务1: Masked LM 即随机屏蔽&#xff08;masking&#xff09;部分输入token&#xff0c;然后只预测那些被屏蔽的token。在模型中&#xff0c;随机地屏蔽了每个…

代码随想录算法训练营Day9 | 20.有效的括号、1047.删除字符串中的所有相邻重复项、150.逆波兰表达式求值

LeetCode 20 有效的括号 本题思路&#xff1a;利用栈来完成&#xff0c;如果遇到左括号类型就放入栈&#xff0c;如果遇到右括号类型&#xff0c;就弹出栈顶的元素和该元素进行匹配&#xff0c;如果不匹配就返回 false。 注意点&#xff1a; 第一个就是右括号类型&#xff0c;那…

SQL数据工程师面试题20231226

1、数据库知识: 表一:Stock(商品库存入库表) 商品编号 入库数量 描述 A 300 A B 400 B C 200 C 注: Stock 表的商品编号是唯一主键。 表二: OutStock(商品库存出库表) 商品编号 出库数量 描述 A 100 A B 40 B B 50 B 注: outStock 表同一个商品存在多次出库。 – 创建 Stoc…

2023开发原子开放者大会:AI时代的前端开发,挑战与机遇并存

前言 12月16日&#xff0c;以“一切为了开发者”为主题的开放原子开发者大会在江苏省无锡市开幕。江苏省工业和信息化厅厅长朱爱勋、中国开源软件推进联盟主席陆首群等领导和专家参加开幕式&#xff0c;工业和信息化部信息技术发展司副司长王威伟、江苏省工业和信息化厅副厅长…

【力扣题解】P589-N叉树的前序遍历-Java题解

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P589-N叉树的前序遍历&#x1f30f;题目描述&#x1f4a1;题解&#x1f30f;总结 【力…

张驰咨询:如何战胜实施精益生产培训的常见难题?

精益生产又称作“Lean Manufacturing”或“Lean Production”&#xff0c;它是一种强调消除生产过程中一切形式的浪费&#xff0c;注重流程优化以提升整体效能的管理哲学。源自丰田生产系统&#xff08;Toyota Production System&#xff09;&#xff0c;精益生产培训目标在于最…

Jenkins下载安装教程(Windows)

Jenkins下载安装教程&#xff08;Windows&#xff09; 1. 配置JDK 前置条件&#xff1a;必须先安装JDK : JDK安装教程&#xff08;Windows&#xff09; 2. 下载Jenkins 下载安装包&#xff1a;Jenkins安装包下载链接 3. 安装Jenkins 选择Jenkins的安装路径&#xff1a; …

virtualBox 在ubuntu 22.04 中自动安装安装增强功能不生效的解决方法

virtualBox 在ubuntu 22.04 中自动安装安装增强功能不生效的解决方法 step 开启双向剪切板复制粘贴支持step2 在设备面板安装增强功能安装后不生效如果选项卡中无设备菜单 step 开启双向剪切板复制粘贴支持 virtualBox界面依次点击:控制---->设置—>高级—>双向—>…

elasticsearch 笔记二:搜索DSL 语法(搜索API、Query DSL)

文章目录 一、搜索 API1. 搜索 API 端点地址2. URI Search3. 查询结果说明5. 特殊的查询参数用法6. Request body Search6.1 query 元素定义查询6.2 指定返回哪些内容**6.2.1 source filter 对_source 字段进行选择****6.2.2 stored_fields 来指定返回哪些 stored 字段****6.2.…

Windows操作系统:共享文件夹,防火墙的设置

1.共享文件夹 1.1 共享文件夹的优点 1.2 共享文件夹的优缺点 1.3 实例操作 ​编辑 2.防火墙设置 2.1 8080端口设置 3.思维导图 1.共享文件夹 1.1 共享文件夹的优点 优点 协作和团队合作&#xff1a;共享文件夹使多个用户能够在同一文件夹中协作和编辑文件。这促进了团…
最新文章