化妆品企业网站建设的缺点,站内seo怎么做,邢台网站建设行情,设计公司网站源码下载目录 背景为何会出现ServletWeb开发的本质 ServletsCGIFastCGIWSGIServlet总结 wsgi与servlet出现时间社区特点对web开发的影响 servlet详解特性主要工作执行逻辑 应用Tomcat背景embedded tomcat本质 背景
为何会出现Servlet
Servlet是Server Applet 的缩写#xff0c;译为“… 目录 背景为何会出现ServletWeb开发的本质 ServletsCGIFastCGIWSGIServlet总结 wsgi与servlet出现时间社区特点对web开发的影响 servlet详解特性主要工作执行逻辑 应用Tomcat背景embedded tomcat本质 背景
为何会出现Servlet
Servlet是Server Applet 的缩写译为“服务器端小程序”是一种使用 Java 语言来开发动态网站的技术。虽被称作“小程序”但其功能却异常强大因为它是基于 Java 的所以几乎可以使用所有的 Java APIJava 能做的事情Servlet 也能做。 Java 是一种功能强大的通用型编程语言可以处理 HTTP 请求可以访问数据库可以生成 HTML 代码您完全可以使用原生 Java 来开发动态网站。但是使用原生 Java 开发动态网站非常麻烦需要自己解析 HTTP 请求的报头需要自己分析用户的请求参数需要自己加载数据库组件……种种原因导致使用原生 Java 开发动态网站几乎是一件不能被接受的事情。正是基于这种原因Java 官方后来推出了 Servlet 技术它对开发动态网站需要使用的原生 Java API 进行了封装形成了一套新的 API称为 Servlet API。 Servlet之所以产生就是为了更方便的开发动态网站程序员只需要集中精力处理业务逻辑不需要再为那些基础性的、通用性的功能编写代码。
最终演变Sun 公司推出一种基于 Java 的动态网站开发技术–Servlet。编写 Servlet 代码需要遵循 Java 语法一个 Servlet 程序其实就是一个按照 Servlet 规范编写的 Java 类。Servlet 程序需要先编译成字节码文件.class文件然后再部署到服务器运行。它的功能异常强大完全可以胜任企业级开发能够处理那些高并发、大吞吐量、业务逻辑复杂的应用场景。
严格来说Servlet其实只是一套 Java Web 开发的规范或者说是一套 Java Web 开发的技术标准。只有规范并不能做任何事情必须要有人去实现它。所谓实现 Servlet 规范就是真正编写代码去实现 Servlet 规范提到的各种功能包括类、方法、属性等。
Servlet 规范是开放的除了 Sun 公司其它公司也可以实现 Servlet 规范目前常见的实现了 Servlet 规范的产品包括 Tomcat、Weblogic、Jetty、Jboss、WebSphere 等它们都被称为“Servlet 容器”。Servlet 容器用来管理程序员编写的 Servlet 类。
Web开发的本质
也就是说java是为了更方便的进行web开发才出现的servlet所以搞清楚web开发的本质就搞定了servlet的本质。
Web应用的本质
浏览器发送一个HTTP请求服务器收到请求生成一个HTML文档服务器把HTML文档作为HTTP响应的Body发送给浏览器浏览器收到HTTP响应从HTTP Body取出HTML文档并显示。
所以最简单的Web应用就是先把HTML用文件保存好用一个现成的HTTP服务器软件接收用户请求从文件中读取HTML返回。Apache、Nginx、Lighttpd等这些常见的静态服务器就是干这件事情的。
如果要动态生成HTML就需要把上述步骤自己来实现。不过接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活如果我们自己来写这些底层代码还没开始写动态HTML呢就得花个把月去读HTTP规范。
正确的做法是底层代码由专门的服务器软件实现我们专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式所以需要一个统一的处理。
Servlets
任何语言都可以进行web开发在Web部署的方案上有一个方案是目前应用最广泛的
首先部署一个Web服务器专门用来处理HTTP协议层面相关的事情比如如何在一个物理机上提供多个不同的Web服务单IP多域名单IP多端口等这种事情。然后部署一个用各种语言编写Java, PHP, Python,Ruby等的应用程序这个应用程序会从Web服务器上接收客户端的请求处理完成后再返回响应给Web服务器最后由Web服务器返回给客户端。
那么要采用这种方案Web服务器和应用程序之间就要知道如何进行交互。为了定义Web服务器和应用程序之间的交互过程就形成了很多不同的规范。这种规范里最早的一个是CGI][31993年开发的。后来又出现了很多这样的规范。比如改进CGI性能的FasgCGIJava专用的Servlet规范还有Python专用的WSGI规范等。提出这些规范的目的就是为了定义统一的标准提升程序的可移植性。
CGI
CGI(Common Gateway Interface) 是WWW技术中最重要的技术之一有着不可替代的重要地位。CGI是外部应用程序CGI程序与WEB服务器之间的接口标准是在CGI程序和Web服务器之间传递信息的过程。
它允许Web浏览器发送请求到Web服务器并将用户输入与服务器端执行的程序进行交互。通过CGI技术可以实现动态生成网页、处理表单数据、访问数据库等功能。CGI程序是基于脚本语言编写的常用的有Perl、Python、PHP等语言。
CGI程序包括两个主要部分服务器端和客户端。服务器端负责解析客户端请求并调用相应的CGI程序进行处理然后将处理结果返回给客户端。客户端则负责向Web服务器发送请求并将请求结果呈现给用户。
在CGI程序中服务器端通过标准输入和标准输出与客户端进行通信。当Web服务器收到一个CGI请求时它会创建一个新的进程来执行该请求并将输入数据作为标准输入传递给CGI程序。CGI程序处理完数据后将结果通过标准输出返回给Web服务器。
CGI技术可以实现动态网页的生成和数据传输。当用户访问一个动态网页时Web服务器接收到请求并将页面请求发送到CGI程序中。CGI程序读取页面请求并从数据库或其他数据源获取所需的信息然后将这些信息插入到HTML模板中最终生成动态网页并返回给Web服务器。Web服务器再将动态网页发送到用户端显示。
相比于静态网页动态网页能够根据用户的不同请求生成不同的页面内容因此具有更广泛的应用场景。例如在电子商务领域中动态网页可以根据用户的购买历史和偏好推荐相关商品从而提高用户的购物体验和满意度。
虽然CGI技术在Web开发中具有广泛的应用前景但是其也存在一些局限性和不足。首先CGI程序往往需要消耗大量的系统资源导致处理速度较慢并且扩展性不够强。其次由于CGI程序必须在每个请求中重新启动因此会导致额外的性能损失。此外CGI程序还存在一定的安全隐患和漏洞需要采取相应的措施进行防范和修复。
随着Web技术的不断发展和进步现代Web开发更倾向于使用其他技术如ASP、JSP、Servlets等这些技术可以更好地满足Web应用程序的需求并具有更高的效率和安全性。与CGI相比这些技术可以实现更高效的网页生成和数据传输同时也能够更好地保护Web应用程序的安全性。
然而尽管CGI技术存在一些局限性但它在某些领域仍具有重要的应用价值。例如在一些小型网站中CGI技术可以提供简单有效的动态网页生成方法。此外在一些特殊的环境中如互联网浏览器兼容性测试等方面CGI技术仍然具有不可替代的作用。
CGI的处理步骤
通过Internet把用户请求送到web服务器。web服务器接收用户请求并交给CGI程序处理。CGI程序把处理结果传送给web服务器。web服务器把结果送回到用户。
FastCGI
FastCGI是一种网络协议它是工作在socket上、而与语言无关的。以前的CGI一般来说是每个请求进来时从server fork出一个进程仅仅处理这一个请求处理完成就退出处理的过程是从环境变量中获取HTTP头从标准输入中读取POST数据从标准输出中输出HTTP响应。由于需要不停地创建和销毁进程这种实现方式性能是比较低下的功能也受到许多限制。FastCGI是CGI的一种改进它在单个连接上接受连续的多个请求一个一个进行处理这样就提高了吞吐量。FastCGI和CGI一样与语言无关任何语言只要遵循FastCGI的协议就可以使用FastCGI但是它的处理模型是受限的通常在单个连接上一次只能处理一个请求这样要达到一定的并发度就必须创建许多进程。
WSGI
WSGI的全称是Web Server Gateway Interface翻译过来就是Web服务器网关接口。具体的来说WSGI是一个规范定义了Web服务器如何与Python应用程序进行交互使得使用Python写的Web应用程序可以和Web服务器对接起来。
WSGI相当于是Web服务器和Python应用程序之间的桥梁。其目的只有两个
让Web服务器知道如何调用Python应用程序并且把用户的请求告诉应用程序。让Python应用程序知道用户的具体请求是什么以及如何返回结果给Web服务器。
Servlet
Servlet程序是由WEB服务器调用web服务器收到客户端的Servlet访问请求后
Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是则直接执行第4步否则执行第2步。装载并创建该Servlet的一个实例对象。调用Servlet实例对象的init()方法。创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。WEB应用程序被停止或重新启动之前Servlet引擎将卸载Servlet并在卸载之前调用Servlet的destroy()方法。
总结
CGI、WSGI、servlet 和类似的东西。其作用大同小异 实质就是服务器运行脚本并发送其输出的一种方式而不是一些静态网页。
Web 开发昨天还没有诞生标准(和名称)还没有被某个神圣的实体透露。人们尝试了不同的方法来使相同(或类似)的东西工作而通用网关接口(interface)一直是旨在标准化这些东西的规范。嗯在 20 多年前的那个时代互联网(和网络开发)主要是一项学术业务学者们喜欢“大”名(嗯营销人员更喜欢他们)。
至于 servlet在 Java 世界中(总是有点具体)有 小程序 对于客户端(浏览器)端任务因此服务器端任务的名称变为 小服务程序 .
对于一件未知的事情你必须了解事物是如何演变的而不仅仅是它们现在的样子。 wsgi与servlet
web开发的接口规范除了最早的cgi各个语言也开始有自己独立的规范。
这些规范从产生的过程中看分为两类一个弱势如wsgi一个强势如servlet。
wsgi从外观上很接近cgi的调用方式和unix环境中调用一个程序也很类似给你一堆环境变量加上参数。如果把wsgi application 看作一个脚本其实就是外界通过wsgi 调用python的脚本而已。
从功能上servlet要比wsgi复杂得多。wsgi更多关注接口层只要返回规定格式的数据至于appliation中怎么实现并无要求。servlet规定了各个组件的写法往往要继承某个基类override某几个方法然后在web.xml中配置还有复杂的生命周期管理。
wsgi的规范就是 pep333 和 pep 3333servlet3.0的规范是个230页的pdf。
二者只是在web开发中有对应的地位但实现细节操作细节都差别很大。
刚从java web开发接触python的时候对wsgi和servlet的差别简直不可想像这也成为我一直很好奇的地方现在总结有两个原因。
出现时间
关于wsgi 和servlet 有几个时间特别值得玩味
python诞生于1989年而pep333第一个wsgi规范是03年发布。
java诞生于 1995年而servlet发布于1997年。
看过 《wsgi 之 因何而生》的读者应该了解 wsgi 规范因为要适应业已存在的诸多python web框架必须做到简单否则这些框架很难实现pep333 就是一纸空文。
java语言诞生不久加上当时web的流行cgi编程方兴未艾在java web框架还几乎没有的时候java之父就开始构思完整的web开发规范足见servlet的远见。以后几乎所有的java web框架都遵循统一的规范这也是java web开发可以大规模推广的原因。想想python web开发者在选择框架时的傲娇。。。
社区特点
python 发迹于科研界因为快速开发原型的特点被中小企业认可后来得益于google的“推广”得以进入众多开发者的视线。但是推动python发展的社区一直都是松散的一直不温不火的发展着。在这样的环境中想强行去统一一件事需要投入的资源是社区本身承受不了的。
java背后一直都是大公司可以做到花钱保证高质量走的是高端大气上档次的路线。生于大公司用于大企业。java的世界里充满了一致和规范。
对web开发的影响
wsgi 对各个web 框架的影响太弱熟悉wsgi对于你熟悉某个python web开发框架帮助并不大 你还是需要看框架的文档。只要熟悉了servlet如果不使用各serlvlet应用服务器特殊的功能切换应用服务器其实学习成本并不高。在最终部署方式来说无疑servlet更加适合开发运维等角色分离的大公司做法。
和servlet 不同python的web框架可以差异巨大就像一个生物圈什么物种都有从老泰龙钟的zope到新潮的bottle。可选择的范围广加上用python写个可用的web框架实在不难基础工具一大堆拼拼凑凑一个“框架”就出来了。 所以python的web开发技术上可以很快进化。
随着web开发技术的成熟很多开发人员希望更多地控制web开发地细节相比大一统地web框架小巧灵活地web开发工具包更加受新一代developer的青睐。这也是web技术发展的一个方向。
如果崇尚自由可定制可以尝试wsgi web开发的信马由韁如果坚守稳定可靠 servlet的规范一致给你足够的信心。好坏只在你的需求无关对错。
servlet详解
特性
// 重点方法
ServletRequestAttributes(服务应用程序请求属性)
ServletResponseAttributes(服务应用程序响应属性)public interface Servlet public interface ServletConfig
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable 》 general 不注册通用的应用程序
public abstract class HttpServlet extends GenericServlet 》 http协议的应用程序public final class CGIServlet extends HttpServlet 》 Common Gateway Interface 公共网关接口应用程序public class DefaultServlet extends HttpServlet public abstract class FrameworkServlet extends HttpServletBean implements ApplicationContextAwareServletServer Applet是 Java Servlet 的简称称为小服务程序或服务连接器用 Java 编写的服务器端程序是运行在Web服务器或应用服务器上的程序它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。Servlet具有独立于平台和协议的特性主要功能在于交互式地浏览和生成数据生成动态Web内容。 Java Servlet 是运行在 Web 服务器或应用服务器上的程序它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。 狭义的 Servlet 是指 Java 语言实现的一个接口广义的 Servlet 是指任何实现了这个 Servlet 接口的类一般情况下人们将 Servlet 理解为后者。Servlet 运行于支持 Java 的应用服务器中。从原理上讲Servlet 可以响应任何类型的请求但绝大多数情况下 Servlet 只用来扩展基于 HTTP 协议的 Web 服务器。 最早支持 Servlet 标准的是 JavaSoft 的 Java Web Server此后一些其它的基于 Java 的 Web 服务器开始支持标准的 Servlet。 使用 Servlet您可以收集来自网页表单的用户输入呈现来自数据库或者其他源的记录还可以动态创建网页。 Java Servlet 通常情况下与使用 CGICommon Gateway Interface公共网关接口实现的程序可以达到异曲同工的效果。但是相比于 CGIServlet 有以下几点优势 性能明显更好。Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。Servlet 是独立于平台的因为它们是用 Java 编写的。服务器上的 Java 安全管理器执行了一系列限制以保护服务器计算机上的资源。因此Servlet 是可信的。Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。 Java Servlet 是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java 类。 Servlet 可以使用 javax.servlet 和 javax.servlet.http 包创建它是 Java 企业版的标准组成部分Java 企业版是支持大型开发项目的 Java 类库的扩展版本。这些类实现 Java Servlet 和 JSP 规范。 Java Servlet 就像任何其他的 Java 类一样已经被创建和编译。在安装 Servlet 包并把它们添加到计算机上的 Classpath 类路径中之后就可以通过 JDK 的 Java 编译器或任何其他编译器来编译 Servlet。 Servlet 是 JavaEE 下的技术标准不是 JDK 的组成部分所以在编译 Servlet 前需要先引入 servlet-api.jar 包在 Apache Tomcat 安装目录下的 lib 文件夹中提供了此 jar 包。
主要工作
浏览器请求静态内容–》web服务器 浏览器请求动态内容–》web服务器 --》 servlet容器 --》 servlet程序
因此常见链路web browser-》 http protocol -》 http server -》 servlet -》 database 读取客户端浏览器发送的显式的数据。这包括网页上的 HTML 表单或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。 读取客户端浏览器发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。 处理数据并生成结果。这个过程可能需要访问数据库执行 RMI 或 CORBA 调用调用 Web 服务或者直接计算得出对应的响应。 发送显式的数据即文档到客户端浏览器。该文档的格式可以是多种多样的包括文本文件HTML 或 XML、二进制文件GIF 图像、Excel 等。 发送隐式的 HTTP 响应到客户端浏览器。这包括告诉浏览器或其他客户端被返回的文档类型例如 HTML设置 cookies 和缓存参数以及其他类似的任务。
执行逻辑
第一个到达服务器的 HTTP 请求被委派到 Servlet 容器加载和实例化 Servlet。这项操作一般是动态执行的。然而Server 通常会提供一个管理的选项用于在 Server 启动时强制装载和初始化特定的 Servlet。init()service()destory()然后 Servlet 容器处理由多个线程产生的多个请求每个线程执行一个单一的 Servlet 实例的 service() 方法。
应用
Tomcat
背景
首先Tomcat服务器是java开发语言开发的是一个免费的开放源代码的Web应用服务器。是Apache 软件基金会Apache Software Foundation的Jakarta 项目中的一个核心项目由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。
Jakarta开放源代码开发项目受到来自IBM等公司在财力和技术上的鼎力支持。是Apache基金旗下的开源Java项目社区著名的Tomcat服务器即出自Jakarta旗下。为方便管理剥离Tomcat、Lucene等大型、成熟的子项目成为相对独立的Apache直接子项目。 Jakarta项目于2011年12月21日退役无剩余子项目。
以上便是Tomcat的生长环境。
Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定而且免费因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可成为比较流行的Web 应用服务器实际上Tomcat是Apache 服务器的扩展但运行时它是独立运行的所以当tomcat运行时它实际上作为一个与Apache 独立的进程单独运行的当配置正确时Apache 为HTML页面服务而Tomcat 实际上运行JSP 页面和ServletTomcat和IIS等Web服务器一样具有处理HTML页面的功能另外它还是一个Servlet和JSP容器独立的Servlet容器是Tomcat的默认模式。不过Tomcat处理静态HTML的能力不如Apache服务器Tomcat最新版本为10.0.23
embedded tomcat
最近开发项目时才发现原来tomcat有两种 org.apache.tomcat 和 org.apache.tomcat.embed
parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starters/artifactIdversion2.2.7.RELEASE/version
/parent
groupIdorg.springframework.boot/groupId
artifactIdspring-boot-starter-web/artifactId
version2.2.7.RELEASE/version
nameSpring Boot Web Starter/name
descriptionStarter for building web, including RESTful, applications using Spring
MVC. Uses Tomcat as the default embedded container/description
urlhttps://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-web/url
organizationnamePivotal Software, Inc./nameurlhttps://spring.io/url
/organizationtomcat和embedded tomcat都是 Apache Tomcat官方发布的从官网上看从Tomcat 7开始 tomcat和embedded tomcat版本是同步发布的。同时也可以看到独立版tomcat有window 32、64版本和unix版本而embedded tomcat没有区分操作系统。估计embedded tomcat代码和tomcat应该是一样的可能做了一些精简但具体减少了些什么东西官方并没有说明但有一点几乎可以确定独立的tomcat有操作系统native支持和APR特性但embedded没有这方面的支持。另外在jmx和可监控性上embedded tomcat是否支持比如是否支持以MBean的形式监控embedded tomcat另外独立版tomcat支持SSI我经常用到embedded tomcat有这个功能但没有说明文档只能去翻源代码。从官网每个版本的bugfix列表可以看到和embedded相关的bug还比较多embedded的使用上面还不是特别成熟可能会遇到更多的问题。有一点很重要embedded tomcat几乎没有任何说明文档网上资料也太少了甚至找不到embedded tomcat的性能测试。更别说如果在embedded tomcat上做一些高级特性的配置只能自己去摸索
总之embedded tomcat尽量不要用
本质
tomcat就是一个容器而已一个软件运行在java虚拟机。tomcat是一种能接收http协议的软件因此其实java程序员自己也可以写出http解析的服务器。tomcat支持servlettomcat有自己写好的java jar包java.servlet.*jar包只需要编写相关程序时import 这个包就好。tomcat 的jar路径package jakarta.servlet.http;