什么是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。
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)