【杂谈】从CGI到Servlet

访问服务器的静态页面

  每个Web服务器都运行着一个HTTP服务软件,用于响应web浏览器的请求,返回客户想要的页面。HTTP服务器都会有一个文件夹用于放置相关的页面文件,默认是  /user/local/apache/htdocs 。例如,服务器的域名叫 example.com。那客户端浏览器访问http://example.com/index.html   就是访问服务器上的HTTP服务器(URL如果没有指定端口,就是访问80端口,80端口绑定的是HTTP服务,80端口是默认对外开启的),那HTTP服务器就会重定向到 /user/local/apache/htdocs 文件夹,并查询是否有index.html 文件,有则返回,没有则返回错误报文。

访问服务器的动态页面

  服务器只提供静态页面还不够,客户端想要更多的服务,比如动态的页面(页面上显示当前使用者信息等等),或者修改数据库内容。这时候,服务端就不能单纯地映射并返回文件来实现了,这时候就需要有可执行的脚本程序来对页面进行更改,或者其他操作。就拿动态页面来说,客户端浏览器访问 http://example.com/home?name=randy 这里用户带上了自己的用户名,希望访问的主页右上角能显示自己的名字。这里 home 通过映射到一个CGI程序,并执行。该程序通过标准I/O流,解析HTTP报文,获取到了请求参数,并通过程序生成对应的HTML文件,在通过标准I/O流,将文件返回给请求客户。

注:CGI (Common Gateway Interface)通用网关接口,CGI程序常见的由Perl,Python,C,C++  或者任何可利用标准I/O流的语言。

Java的一种想法

  一开始,人们想最理想的方式就是完全基于Java的实现方案, servlets <=> applets 。即

  客户端用applet校验并发送数据,

  服务端用servlet接收并处理数据。

  就连这名称都是一对。

  但是,并非所有浏览器都支持Java。这样就带来一个问题,那就是你搭建的网站,只有部分浏览能够访问,而且需要安装对应程序。后来,就把所有的操作都交给服务器处理,然后把最终生成的网页发给客户端浏览器。这样,只要有浏览器,就可以访问对应网站,且不需要安装任何程序。

Servlet的引入

  Servlet是基于Java的CGI程序框架。首先,因为它是一个框架,所以就可以省去很多底层编写的工作。又因为是用Java实现的,Java程序运行于Java虚拟机,跨平台性好,便于网站迁移。

Servlet的体系架构

  Servlet容器,如Tomcat,接收所有客户端请求,如 http://example.com:8080/project/oneServlet,根据"project"找到对应的项目(tomcat的server.xml保存项目映射信息),再根据"oneServlet"找到对应的Servlet(Web项目的web.xml保存Servlet映射信息),然后调用该Servlet对象的service()方法。service方法会根据请求的方式,委派给doGet、doPost、doDelete等方法进行处理。

  注:Servlet的多数内容由容器实现,如Session的保存和获取,Tomcat实现内容在其子目录lib下的catalina相关包内。

Servlet的持久化

  Servlet会保存其变量域的值,使其在多个请求之间保留相应变量值。Servlet容器会持久化Servlet对象。至于什么时候刷新,尚未考察,应该是在每次service()方法返回之后。

如果是CGI程序,则需要自己手动将数据写入到磁盘,这也是Servlet的优点之一。

Servlet的页面生成与JSP

  如果单纯用Servlet生成页面,那么将会非常痛苦,因为这样代码里就会掺杂大量的 换行符、转义标识、“+”符号,字符串的构建以及代码阅读都非常困难。后来就有了JSP文件,整合了HTML和Java代码。使得文件内可以直接抒写HTML代码,而不需要用字符串拼接。也可以用有特殊标签包围的Java代码。(实际上JSP就是Servlet,它会被容器内会被转换成Servlet的.java文件,然后在编译成.class文件)但是,JSP还有问题没解决,那就是,负责维护JSP的开发人员必须既懂HTML又懂Java。而且两种语言混合在一起(一种程序语言,一种标记语言),在加上各种标签库,看起来比较吃力。

偏题内容:页面渲染的位置

  早期是服务器把网页完全渲染好后,然后发给客户端浏览器,浏览器负责显示就可以了。但是这样的话,服务器的压力就比较大,而且响应时间会比较长,客户端要等到服务端把页面完全渲染好后才能看见页面。后来的做法,是这样的,服务器先把有基本内容的网页文件发给客户端浏览器,然后浏览器再异步地请求(如通过Ajax)获取数据,然后根据获取到的数据对网页进行渲染(例如获取到一个数组对象,然后根据数组生成一个表格,显示数据)。这样,服务器的压力就小多了,而且客户端也能较早地看见页面(尚不完整,部分数据还未加载)。

  那浏览器有是怎么就知道发异步请求呢?是这样的,用javascript写全局代码,或者覆盖Vue对象中的created函数,这样浏览器一收到网页文件并加载的时候,这些JS代码就会被触发执行。

Servlet与多线程

  Servlet容器维护有一个线程池用于分派处理客户端的请求。所以,多个请求可以并发,甚至并行处理。

Servlet处理会话(Session)—— 利用Cookie

  HTTP是无状态协议,多次请求中,单纯靠HTTP协议,我们并不能辨别其是否是同一个人。但是,有处理会话的需求(例如购物车的实现需求),这时候就要追踪会话。追踪会话的方式有很多,最常见的是持久化Cookie。

Session-Cookie机制:Cookie是服务器发给客户端的一小段信息(包含Session的唯一标识符),浏览器收到Cookie后,把它写入到磁盘持久化。无论何时,如果访问与某个Cookie相关联的URL时,请求中就会带上这个Cookie。Servlet如果想要获取本次请求的会话,就调用HttpServletRequest.getSession()获取。getSession()方法获取Session的实现方式尚未考察,但猜测应该是根据请求中的Cookie,从Servlet容器内检索对应的Session。

Session的存活时间

  Session即会话的存活时间默认是30min,但是具体情况,得看对应的Servlet容器。每个容器的会话存活时间都不尽相同。

Session的用途

  Session对象的作用就是捕捉客户端与服务端交互的有用数据,如前面提到的购物车信息,还有就是Session对象可以用来保存认证信息(即是否已登录),这样多次请求中,Servlet只要确认"是否登录"状态即可,而不需要用户每次请求都登录。

原文地址:https://www.cnblogs.com/longfurcat/p/9781369.html

时间: 2024-10-16 21:20:54

【杂谈】从CGI到Servlet的相关文章

CGI与Servlet技术对比

CGI:Common Gateway Interface,通用网关接口. CGI处理步骤 首先,客户端(即Web浏览器)根据某资源的URL向Web服务器提出请求:Web服务器的守护进程(HTTP Daemon)将此请求的参数通过标准输入和环境变量传递给指定的CGI程序,并启动此应用程序进行处理,如要存取数据库服务器上数据库的数据,则向数据库服务器发出处理请求,数据库服务器将执行结果返回给CGI程序,CGI程序把处理结果通过标准输出返回给HTTP Daemon进程,再由HTTP Daemon进程返

CGI与Servlet的比较

转自:http://www.maxhis.info/java/cgi-vs-servlet/ 谢! 概括来说,CGI和Servlet可以完成相同的功能. 一:CGI(Common Gateway Interface) CGI(Common Gateway Interface)程序,主要用Perl.Shell Script或C编写,能够向客户端提供动态内容,即每次客户端浏览器访问某一页面时,可以看到不同的内容.CGI应用开发比较困难,因为它要求程序员有处理参数传递的知识,这不是一种通用的技能.CG

CGI与Servlet的区别和联系

1. 定义: CGI(Common Gateway Interface 公共网关接口)是HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上. 2. 功能: 绝大多数的CGI程序被用来解释处理杰自表单的输入信息,并在服 务器产生相应的处理,或将相应的信息反馈给浏览器.CGI程序使 网页具有交互功能. 3. 运行环境: CGI程序在UNIX操作系统上CERN或NCSA格式的服务器上运行. 在其它操作系统(如:windows NT及windows95等)的服务器上

servlet出现的背景

1. web运行模式 所谓的出现背景,其实就是"为什么会想到创造servlet".在解释这个问题需要了解的前提的是Web的运行模式,Web是以客户端/服务器端的模式,通过HTTP协议来交互的.奠定了这个基础之后,再来看无论我们通过本地机即客户端上网做什么,比如搜索一个查询,打开一个邮件,请求所得到的页面还有各种各样的数据都是从服务器端得到的.服务器是一个设备,它可以根据网络上的不同的客户所提交的请求而提供不同的信息.所以总结一句话就是:客户端请求,服务器端提供信息. 2.CGI和ser

JAVA Web学习篇--Servlet

Servlet由来 做过BS项目的人都知道,浏览器可以依据HTML静态标记语言来显示各式各样的网页.可是假设我们须要在网页上完毕一些业务逻辑:比方登陆验证.或者说网页显示的内容在server的数据库中.假设是这样,除了负责显示的HTML标记之外,必须还要有完毕这些业务功能的代码存在.这样的网页我们就叫做动态网页. 对于静态网页而言,server上存在的是一个个纯HTML文件.当client浏览器发出HTTP请求时,server能够依据请求的URL找到相应的HTML文件,并将HTML代码返回给cl

Javaweb基础---&gt;Servlet(转载)

今天看到这篇博客,感觉还不错,拿来借鉴学习一下. 一.Servlet 是什么? Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页. java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程

Servlet与Tomcat

Web应用不仅局限于展示在服务器上的静态页面,更多的是根据用的请求动态的生成页面信息,还可以从数据库中提取数据,生成页面返回给用户. 第一种方法:遵循HTTP协议实现一个服务器端软件 第二种方法:利用已实现HTTP协议的服务器端软件留出的扩展接口,根据相应的规则提供扩展功能 最早的Web服务器扩展机制是CGI,允许用户调用Web服务器上的CGI程序. CGI的全称Common Gateway Interface,即公共网关接口. 大多数CGI程序用Perl编写,也有用C.Python或PHP来编

装机配置相关---tomcat配置CGI

1.修改conf/web.xml 找到并将cgi的servlet和servlet-mapping的注释去掉 <servlet> <servlet-name>cgi</servlet-name> <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class> <init-param> <param-name>debug</param-name

Servlet的介绍

Servlet由来 做过BS项目的人都知道,浏览器能够根据HTML静态标记语言来显示各式各样的网页.但是如果我们需要在网页上完成一些业务逻辑:比如登陆验证.或者说网页显示的内容在服务器的数据库中.如果是这样,除了负责显示的HTML标记之外,必须还要有完成这些业务功能的代码存在.这种网页我们就叫做动态网页. 对于静态网页而言,服务器上存在的是一个个纯HTML文件.当客户端浏览器发出HTTP请求时,服务器可以根据请求的URL找到对应的HTML文件,并将HTML代码返回给客户端浏览器. 但是对于动态网