关于 Servlet 和 Web
文中也只是对Servlet和Web作简单的了解,有个初步的认识,深入的内容有待于进一步去研究。 T. T _ . _
Servlet
Servlet(Server Applet),全称Java Servlet,是用Java编写的服务器端程序。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一个Servlet 就是 Java 编程语言中的一个类。
Servlet是一种独立于操作系统平台和网络传输协议的服务器端Java应用程序,运行于支持Java的应用服务器中,是Java Web技术的核心基础。Servlet与传统Java应用程序的最大不同在于,它不是从命令行启动的,而是由Java虚拟机的web服务器进行加载。
功能: 扩展基于HTTP协议的Web服务器的功能,交互式地浏览和修改数据,生成动态Web页面内容。
生命周期:Servlet加载 - -> 实例化 - -> 服务 - -> 销毁
- [1] init():服务器装入Servlet时执行该方法,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。
- [2] service():Servlet的核心,负责响应客户的请求。每当一个客户机请求一个HttpServlet对象,该对象的Service()方法就要调用,并以一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法,默认的服务功能是调用与HTTP请求的方法相应的do功能。
- [3] destroy():当Servlet对象退出生命周期,服务器端停止且卸载Servlet时执行该方法,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此在调用destroy()方法时,要确保这些线程已经终止或完成。
注:在Servlet的生命周期中,仅执行一次init()和destroy()方法。
工作原理:
- [1] 首先简单解释一下Servlet接收和响应客户请求的过程:客户发送一个请求,Servlet调用service()方法对请求进行响应。通过源代码看出,service()方法中对请求的方式进行了匹配,选择调用doGet, doPost等方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中没有doGet(),doPost()这些方法,HttpServlet中定义了这些方法,但是都返回error信息,所以每次定义一个Servlet时,都必须实现doGet()或doPost()这些方法。
- [2] 每一个自定义的Servlet都必须实现Servlet接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet生命周期,分别是init(), service(), destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet, 实现了Servlet接口。HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口。所以定义Servlet时只需继承HttpServlet即可。
- [3] Servlet接口和GenericServlet不特定于任何协议,HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest、响应ServletResponse 强转为HttpRequest 和 HttpResponse。
Servlet容器
主要任务:管理Servlet的生命周期。
Servlet 与 Servlet 容器相互依存 ,彼此又相互独立发展,接口是连接Servlet和Servlet容器的关键,从技术角度来说是为了解耦,通过标准化接口来相互协作。
创建Servlet对象:
- [1] Servlet容器启动时:读取web.xml配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,并将ServletConfig对象作为参数来调用Servlet对象的init()方法。
- [2] Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建它,然后根据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet对象的service()方法。
在 Web 应用程序中,一个 Servlet 在一个时刻可能被多个用户同时访问。这时 Web 容器将为每个用户创建一个线程来执行 Servlet。如果 Servlet 不涉及共享资源的问题,不必关心多线程问题。但如果 Servlet 需要共享资源,需要保证 Servlet 是线程安全的。
参考:
http://www.cnblogs.com/xuekyo/archive/2013/02/24/2924072.html
http://www.ibm.com/developerworks/cn/java/j-lo-servlet/
与 Applet 比较
Web
Web容器:管理和部署Web应用,更多的是跟基于HTTP的请求打交道。
区别于应用服务器:可以部署EJB应用,可以实现容器管理的事务,更多的跟数据库、其它服务打交道。
关于 Servlet 和 Web的更多相关文章
- Java Servlet与Web容器之间的关系
自从计算机软件开发进入网络时代,就开始涉及到通讯问题.在客户/服务器(也叫C/S应用)时期,每个软件都有自己的客户端和服务器端软件.并且客户端和服务器端之间的通讯协议差别也很大.后来随着互联网的发展, ...
- servlet和web容器之间的关系
Java是一种动态加载和运行的语言.也就是说当应用程序持有一个类的地址(CLASSPATH)和名称(包名和类名)的情况下,可以在程序运行期 间任何时候加载这个类,并创建和使用该类的对象.Servlet ...
- Servlet中Web.xml的配置详解
1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码. DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用 ...
- Servlet中web.xml 以及 <url-pattern>总结
web.xml中添加Servlet配置信息 使用Eclipse创建Servlet,会自动的在WEB-INF下的web.xml中声明,但是有的时候需要我们手动的写入配置信息,以下就是Servlet在we ...
- 支持JSP和Servlet的Web服务器
支持JSP和Servlet的Web服务器 1.Tomcat 服务器 目前非常流行的Tomcat服务器是Apache-Jarkarta开源项目中的一个子项目,是一个小型.轻量级的支持JSP和Servle ...
- 各种容器与服务器的区别与联系 Servlet容器 WEB容器 Java EE容器 应用服务器 WEB服务器 Java EE服务器
转自:https://blog.csdn.net/tjiyu/article/details/53148174 各种容器与服务器的区别与联系 Servlet容器 WEB容器 Java EE容器 应用服 ...
- Eclipse创建第一个Servlet(Dynamic Web Project方式)、第一个Web Fragment Project(web容器向jar中寻找class文件)
创建第一个Servlet(Dynamic Web Project方式) 注意:无论是以注解的方式还是xml的方式配置一个servlet,servlet的url-pattern一定要以一个"/ ...
- Servlet中Web.xml的配置详解(一)
1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码.DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用的 ...
- Servlet 工程 web.xml 中的 servlet 和 servlet-mapping 标签
本文转载自 陈蒙的博客 最近在学习JavaEE轻量级框架,对于servlet-mapping中的url-partten标签以及网页访问时的执行顺序不是很清楚,搜索了很多遍终于找到了这篇博文(搜索也是个 ...
随机推荐
- Propagation of Visual Entity Properties Under Bandwidth Constraints
1. Introduction The Saga of Ryzom is a persistent massively-multiplayer online game (MMORPG) release ...
- .NET Framework中重点类型的继承关系
继承关系 Object ├─Array │ └─T[] ├─ArrayList ├─List<T> └─String 集合类型的接口 下图展示了集合类型的各种接口的相互关系.注意,下图中所 ...
- cocoapods 更新
sudo gem update --system sudo gem install cocoapods pod setup pod --version
- VM~Linux联不上网
使用桥接的链接方式,centos6.4配置静态ip,能ping通网关,但ping 外网时出现 "network is unreachable" 如:ping www.baidu.c ...
- 关于WPF中RichTextBox失去焦点后如何保持高亮显示所选择的内容
其实很简单,只要将容器控件中的附加属性FocusManager.IsFocusScope设为True就可以了 下面是个简单的用例: <Window x:Class="WpfApplic ...
- 关于C#中的线程重启的问题
首先不管是C#也好,还是java也好,对于已经Abort的线程是无法再次Start的,除非是声明私有变量new一个新的线程,网上也有很多人说可以Suspend挂起线程,然后再Resume继续,但是相信 ...
- Python数据类型之“数字(numerics)”
上一节内容说的是"Python基本语法",本节主要讲下Python中的数据类型. 存储在内存中的数据通常有两个属性: 在内存中的存放位置:这个存放位置通过变量名可以找到: 在内存中 ...
- 详解JavaScript模块化开发
什么是模块化开发? 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了,jQuery,Ajax,Node.Js,MVC,MVVM等 ...
- python类定义与c#的一些区别
c#中可以定义一个空类,但是python中定义空类需要加pass class EmptyClass(object): pass python的lei是多继承 python子类继承了基类,如果子类也 ...
- php代码习惯(一)
1: 利用sprintf来绑定变量,分离绑定的参数与语句 $query = sprintf("SELECT * FROM users WHERE user='%s' AND password ...