servlet详解

11 篇文章 0 订阅

什么是servlet:

Servlet 是一种基于java技术的web组件,是一种基于java的且与第三方平台无关的类。通常,它可以被Web 服务器编译、加载和运行,最后生成动态的资源内容。

为什么要使用Servlet?
Servlet是采用java语言编写,而由java 跨平台性的特点可知,servlet的移植性很好,且servlet API具有完善的标准,几乎所有的主流服务器都支持servlet.
Servlet与传统的CGI(Common Gateway Interface)相比,功能要强大,且处理的请求采用的是线程,而非进程,从而节省大量的资源开销,因此Servlet处理请求更轻量级、更高效。

Servlet规范提供了一个标准的、平台独立的框架用来实现在Servlet和Servlet容器之间的通信。该框架是由一组Java接口和类组成的,它们统称为Servlet API


两个包:
javax.servlet定义了14个接口和11个类。开发独立于协议的服务器小程序的接口和类。


javax.servlet.http定义了8个接口和7个类。这些接口和类定义了开发采用HTTP协议通信的Servlet。




servlet 接口:

servletAPI的核心就是Servlet接口,所有的类都必须实现该接口。他定义了五个方法,其中三个init、service、和destroy是由servelet调用的
 在servlet容器或web server启动时, 对servlet进行实例化,此时调用servlet的构造方法;
servlet实例化后,调用该servlet实例的init方法,对servlet进行一些初始化处理,处理完成后,将该servlet注入到servlet容器中;
当client向web server或servlet容器请求servlet时,web server或servlet容器首先会根据请求的servlet名称去servlet容器中找对应的servlet,如果servlet不存在该名称对应的servlet,则向client响应请求不存在等信息;
如果请求的servlet存在于servlet容器,则调用servlet的service方法,生成动态资源,响应给client; (记住,整个过程该servlet只有一个实例,即单例);
当web server退出或servlet容器销毁时,调用servlet的destroy方法,最后唯一的sevlet实例将会被GC。

另外两个方法:
public ServletConfig getServletConfig()
-----该方法返回容器调用init()方法时传递给Servlet对象的ServletConfig对象
public String getServletInfo()
-----返回String,其中包括关于Servlet的信息,如作者、版本等,此方法很少用,返回null即可
HttpServlet类 
增加了一个新的service()方法,格式如下:
protected void service (HttpServletRequest,
                  HttpServletResponse)
      throws ServletException, IOException;
该方法是Servlet向客户请求提供服务的一个方法。
编写Servlet可以覆盖该方法。 

HttpServletRequest接口    
该接口扩展了ServletRequest接口;
提供了关于HTTP请求对象的视图;
定义了从请求对象中获取如HTTP请求头、cookies信息的方法。
HttpServletResponse接口 
该接口扩展了ServletResponse接口;
提供了针对HTTP的发送响应的方式;
定义了为响应设置如HTTP响应头、设置cookies信息的方法;
该方法是Servlet向客户请求提供服务的一个方法。

Servlet容器处理请求的过程


1)用户点击一个链接,指向了一个servlet而不是一个静态页面。
2)容器“看出”这个请求是一个Servlet,所以它创建了两个对象HttpServletRequest和HttpServletResponse。
3)容器根据请求中的URL找到正确的Servlet,为这个请求创建或分配一个线程,并把请求和响应对象传递给这个Servlet线程。
4)容器调用Servlet的service()方法。根据请求的不同类型,service()方法会调用doGet()或doPost()方法。这里假设调用doGet()方法。
5)doGet()方法生成动态页面,并把这个页面“塞到”响应对象里,需要注意的是,容器还有响应对象的一个引用!
6)线程结束,容器把响应对象转换为一个HTTP响应,并把它发回给客户,然后删除请求和响应对象。




java Web应用的生命周期分为三个阶段:

启动:

1. 把web.xm 加载到内存中
2. 为web应用创建一个ServletContext对象
3. 对所有的Filter进行初始化。
4. 对那些需要在启动时初始化的servlet初始化。

运行:

在这个阶段所有的servlet处于待命状态,等待客户端的请求。如果客户端的请求servlet不存在,则初始化对应的servlet。

销毁:

1.销毁所有处于运行状态的servlet;
2.销毁所有处于运行状态的Filter;
3.销毁与web应用相关的对象,如servletContext,释放应用占用的资源。

用Tomcat的管理平台管理Web应用的生命周期
一般情况下,Web应用随着Servlet容器的启动而启动,随着Servlet容器的运行而运行,随着Servlet容器的终止而终止。
通常,在应用运行期间,对应用的web.xml文件进行修改后,不能立即生效,必须重新启动应用才会生效。
Tomcat作为Servlet容器的一种具体实现,提供了一个管理平台,用户可以在Tomcat运行时,手工管理单个Web应用的生命周期。




(演示)步骤:
1、修改<CATALINA_HOME>/conf/tomcat-user.xml,加入下面的用户:
<tomcat-users>
<role rolename=“manager-gui"/>
<user username="tomcat" password="tomcat"                 roles="manager-gui"/>
</tomcat-users>
2、启动Tomcat
3、http://localhost:8080/manager/html
在下列时刻Servlet容器装载Servlet:
 
Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码:


                         <loadon-startup>1</loadon-startup>  


2.   在Servlet容器启动后,客户首次向Servlet发送请求
 
3.   Servlet类文件被更新后,重新装载Servlet
 
Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。在Servlet的整个生命周期内,init()方法只被调用一次。

Servlet初始化阶段

Servlet初始化步骤:
Servlet容器加载Servlet类
Servlet容器创建ServletConfig对象。该对象包含了特定Servlet的初始化配置信息,并与Web应用的ServletContext对象关联。
Servlet容器创建Servlet对象。
Servlet容器调用Servlet对象的init()方法。

Servlet响应请求阶段:

对于用户到达Servlet的请求,Servlet容器会创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet的service方法。service方法从ServletRequest对象获得客户请求信息,处理该请求,并通过ServletResponse对象向客户返回响应信息。
 
对于Tomcat来说,它会将传递过来的参数放在一个Hashtable中,该Hashtable的定义是:


private Hashtable<String String[]> paramHashStringArray = new Hashtable<String String[]>(); 


这是一个String-->String[]的键值映射。
 
  HashMap线程不安全的,Hashtable线程安全。

servlet工作原理:

首先客户发送一个请求,Servlet调用service()方法对请求进行响应的。
service()方法中对请求的方式进行了匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。
在Servlet接口和GenericServlet中没有doGet,doPost等等方法,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。
servlet销毁阶段:

当Web应用终止时,Servlet容器会先调用Web中所有的Servlet对象的destroy()方法,然后再销毁这些Servlet对象。
在destroy()方法中通常写关系文件传输流,关闭数据库连接等语句,释放Servlet所占有的系统资源。

Web.xml的配置:

web.xml配置
<servlet> 
<servlet-name>lifeInit</servlet-name> 
<servlet-class>mypack.LifeServlet</servlet-class> 
<load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
<servlet-name>lifeInit</servlet-name> 
<url-pattern>/lifeInit</url-pattern> 
</servlet-mapping> 
<servlet> 
<servlet-name>life</servlet-name> 
<servlet-class>mypack.LifeServlet</servlet-class>
</servlet>
<servlet-mapping> 
<servlet-name>life</servlet-name> 
<url-pattern>/life</url-pattern> 
</servlet-mapping>

ServletContext与Web应用的范围:

ServletContext对象与Web应用具有同样的生命周期


启动一个Web应用时,Servlet容器会为它创建唯一的ServletContext对象;终止一个Web应用时,销毁ServletConext对象。


ServletContext接口提供了一组在Web应用范围内存取共享数据的方法。

使用ServletContext实现数据的共享:

得到ServletContext 
this.getServletContext();


可将其看做一张表:每一行就为一个属性 ---------------------------------------------------- | 属性名字(String)| 值(Object)| ---------------------------------------------------- |                                     |                          |-------->属性1 ---------------------------------------------------- |                                     |                          | ----------------------------------------------------
操作
添加属性:setAttribute(String name,Object ob);
得到值:    getAttribute(String)返回Object
删除属性:removeAttribute(String name)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值