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);@Deprecatedpublic 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.mzph.cn/news/580053.shtml

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

相关文章

【SpringCloud笔记】(11)消息驱动之Stream

Stream 技术背景 底层不同模块可能使用不同的消息中间件&#xff0c;这就导致技术的切换&#xff0c;微服务的维护及开发变得麻烦起来 概述 官网&#xff1a; https://spring.io/projects/spring-cloud-stream#overview https://cloud.spring.io/spring-cloud-static/spring…

最小覆盖子串(LeetCode 76)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路参考文献 1.问题描述 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 注意&#xff1a; 对于 t 中重复字符&#xff…

git 常用基本命令, reset 回退撤销commit,解决gitignore无效,忽略记录或未记录远程仓库的文件,删除远程仓库文件

git 基本命令 reset 撤销commit https://blog.csdn.net/a704397849/article/details/135220091 idea 中 rest 撤销commit过程如下&#xff1a; Git -> Rest Head… 在To Commit中的HEAD后面加上^&#xff0c;点击Reset即可撤回最近一次的尚未push的commit Reset Type 有三…

Flink Has Become the De-facto Standard of Streaming Compute

摘要&#xff1a;本文整理自 Apache Flink 中文社区发起人、阿里巴巴开源大数据平台负责人王峰&#xff08;莫问&#xff09;&#xff0c;在 Flink Forward Asia 2023 主会场的分享。Flink 从 2014 年诞生之后&#xff0c;已经发展了将近 10 年&#xff0c;尤其是最近这些年得到…

爬虫系列----Python解析Json网页并保存到本地csv

Python解析JSON 1 知识小课堂1.1 爬虫1.2 JSON1.3 Python1.4 前言技术1.4.1 range1.4.2 random1.4.3 time.sleep1.4.4 with open() as f: 2 解析过程2.1 简介2.2 打开调试工具2.3 分析网址2.3.1 网址的规律2.3.2 网址的参数 2.4 爬取第一页内容2.5 存入字典并获取2.6 循环主体数…

7-2 设计一元二次方程求解类(高教社,《Python编程基础及应用》习题9-4)——python

设计一个类Root来计算ax2bxc0的根。该类包括&#xff1a;a、b、c共3个属性表示方程的3个系数&#xff0c;getDiscriminant()方法返回b2-4ac, getRoot1()和getRoot2()返回方程的两个根。 其中&#xff0c;getRoot1()返回的根对应&#xff1a; getRoot2()返回的根对应&#xff1a…

百度沧海文件存储CFS推出新一代Namespace架构

随着移动互联网、物联网、AI 计算等技术和市场的迅速发展&#xff0c;数据规模指数级膨胀&#xff0c;对于分布式文件系统作为大规模数据场景的存储底座提出了更高的要求。已有分布式文件系统解决方案存在着短板&#xff0c;只能适应有限的场景&#xff1a; >> 新型分布式…

格密码:傅里叶矩阵

目录 一. 铺垫性介绍 1.1 傅里叶级数 1.2 傅里叶矩阵的来源 二. 格基与傅里叶矩阵 2.1 傅里叶矩阵详细解释 2.2 格基与傅里叶矩阵 写在前面&#xff1a;有关傅里叶变换的解释太多了&#xff0c;这篇博客主要总结傅里叶矩阵在格密码中的运用。对于有一定傅里叶变换基础的同…

IntelliJ IDEA [设置] 隐藏 .idea 等 .XXX 文件夹

文章目录 1. 问题描述2. 解决办法3. 最后效果4. 特殊处理&#xff08;正常不需要此步骤&#xff09;总结 我们使用 IntelliJ IDEA 导入项目的时候&#xff0c;经常会看到一些 .XXX 的文件夹&#xff08;例如&#xff1a;.idea&#xff0c;.mvn&#xff0c;.gradle 等&#xff0…

支付宝、学习强国小程序input、textarea数据双向绑定

前言 和 vue 的绑定有些区别&#xff0c;需要注意。直接 value"{{inputValue}}" 是无法双向绑定的。 正确思路 文档说的比较详细&#xff0c;不过没有组合使用的案例&#xff0c;需要自行理解。这里正确的方法是先用 value 绑定数据&#xff0c;再使用 onInput 事件…

鸿蒙的基本项目_tabbar,首页,购物车,我的

以上效果&#xff0c;由四个ets文件实现&#xff0c;分别是容器页面。首页&#xff0c;购物车&#xff0c;我的。 页面里的数据&#xff0c;我是用json-server进行模拟的数据。 一、容器页面 使用组件Tabs和Tabcontent结合。 import Home from "./Home"; import …

短剧付费变现小程序源码系统:开通会员+在线充值+风口项目,变现利器+完整的代码包 附带部署安装教程

在当今数字化时代&#xff0c;短剧付费变现小程序源码系统已经成为了一个热门的风口项目。它以开通会员、在线充值、完整的代码包等特色功能&#xff0c;成为了一种有效的变现利器&#xff0c;受到了广泛的关注和应用。本文将详细介绍这个源码系统的背景和特色功能&#xff0c;…

实现阿里云oss云存储,简单几步

一、前言 虽然平常学习用的不多&#xff0c;但是用的时候再去找官方文档&#xff0c;也很繁琐&#xff0c;不如直接整理以下&#xff0c;方便粘贴复制&#xff0c;本文介绍两种图片上传方式①普通上传②服务端签名直传 1.普通上传 加载maven依赖 <dependency><grou…

centos 安装oracle 11.2.04 并配置数据库自启动操作记录,一次完成

环境&#xff1a; centos版本7.3&#xff0c;安装的有图形化界面 Oracle11.2.04&#xff0c;之所以选择这个版本是因为网上有人说11其他版本的在安装的过程中会出现这样或那样的问题&#xff0c;下载地址放到文章下面 步骤&#xff0c;按顺序&#xff1a; 1、创建安装Oracle…

万用表测接地电阻方法

万用表测接地电阻方法 用万用表在不同土质的土壤对接地电阻进行了实验&#xff0c;并将万用表所测数据和专用接地电阻测试仪所测数据进行了比较&#xff0c;两者十分接近。具体测量方法如下&#xff1a; 找两根8mm、1m长的圆钢&#xff0c;将其一端磨尖作为辅助测试棒&#x…

Mysql之视图

Mysql之视图 常见的数据库对象视图概述为什么使用视图视图的理解创建视图创建单表视图别名的运用 创建多表联合视图利用视图对数据进行格式化contact 函数以视图为基&#xff0c;再创建新的视图 查看视图更新视图的数据一般情况不可更新的视图 修改和删除视图修改视图删除视图注…

【C#】Visual Studio 2022 远程调试配置教程

在某些特殊的情况下&#xff0c;开发机和调试机可能不是同一台设备&#xff0c;此时就需要远程调试了。 开发机配置 首先需要确保两台机器在同一局域网下。 创建共享文件夹 随便找个地方新建一个文件夹&#xff0c;用来放编译结果。例如我这里是 D:\DebuggingWorkspace\。 …

什么是阿里云负载均衡SLB?

目录 硬件或软件负载均衡的区别是什么&#xff1f; 什么是阿里云负载均衡SLB&#xff1f; 阿里云传统型负载均衡CLB 硬件或软件负载均衡的区别是什么&#xff1f; 通过专用硬件实现负载均衡&#xff0c;那么整体成本会较高&#xff0c;而且设备容易出现单点故障&#xff0c;…

【MySQL】InnoDB和MyISAM区别

文章目录 一、索引不同1 InnoDB聚簇索引&#xff0c;MyISAM非聚簇索引1 InnoDB聚簇索引2 MyISAM非聚簇索引 2 InnoDB必须要有主键&#xff0c;MyISAM允许没有主键3 InnoDB支持外键4 InnoDB不支持全文索引5 索引保存位置不同 二、对事物的支持三、存储结构不同四、存储空间不同五…

Elasticsearch中复制一个索引数据到新的索引中

问题 我有时候&#xff0c;需要调试一个已经存在的ES索引&#xff0c;需要从已有的索引复制数据到新的索引中去。 解决 这里我借助一个GUI工具&#xff0c;来解决这个问题&#xff0c;底层它是使用Reindex的API实现索引数据复制的。 步骤 选中已存在的redix菜单&#xff0…