一、Servlet简介
1、Servlet定义:
Servlet(Server Applet)是Java Servlet的简称,是为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。servlet是一个java小程序运行在web服务器。servlet接收并响应来自Web客户端的请求,通常通过HTTP,超文本传输协议。
servlet的角色:
2、Servlet实现过程:
配置Servlet路径映射配置:
l由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
l<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。
l一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。例如:
<web-app>
<servlet>
<servlet-name>AnyName</servlet-name>
<servlet-class>HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AnyName</servlet-name>
<url-pattern>/demo/hello.html</url-pattern>
</servlet-mapping>
</web-app>·
l同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名。
l在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“*.扩展名”,另一种格式是以正斜杠(/)开头并以“/*”结尾。
<servlet-mapping>
<servlet-name>
AnyName
</servlet-name>
<url-pattern>
*.do
</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>
AnyName
</servlet-name>
<url-pattern>
/action/*
</url-pattern>
</servlet-mapping>
(1)客户端发送请求至服务器端;
(2)服务器将请求信息发送至 Servlet;
(3)Servlet 生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;
(4)服务器将响应返回给客户端。
Servlet的运行过程:
lServlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
servlet类之间的关系:
3、Servlet可以完成以下任务:
(1)动态生成HTML文档。
(2)将请求转发给Servlet组件。
(3)读取客户端的Cookie,以及向客户端写入Cookie。
(4)访问服务器的资源,如数据库、 XML、文件对像等。
4、Servlet的特点:
(1)Servlet对像,由Servlet容器(Tomcat)创建。
(2)Servlet是一个接口:位于javax.servlet包中。
(3)service方法用于接收用户的请求并返回响应。
(4)用户访问时多次被执行(可以统计网站的访问量)。
二、Servlet底层原理:
1、javax.servlet Interface Servlet
2、javax.servlet Interface Servlet 中的method
3、Servlet接口、GenericServlet类、HttpServlet类三者之间的关系
servletCofig对象分析:
三、Servlet实现方式
1、Servlet的实现方式一(实现Servlet接口):
Servlet接口:
package cn.hncu;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FirstServlet implements Servlet {
/**init方法*/
@Override
public void init(ServletConfig paramServletConfig) throws ServletException {
}
/**getServletConfig方法*/
@Override
public ServletConfig getServletConfig() {
return null;
}
/**service方法*/
@Override
public void service(ServletRequest paramServletRequest,
ServletResponse paramServletResponse) throws ServletException,
IOException {
}
/**getServletInfo方法*/
@Override
public String getServletInfo() {
return null;
}
/**destroy方法*/
@Override
public void destroy() {
}
}
2、Servlet的实现方式二(继承GenericServlet类):
GenericServlet类:
package cn.hncu;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**【注意】GenericServlet是抽象类,service是抽象方法*/
public class ExtendGenericServlet extends GenericServlet {
/**service方法*/
/**【注意】唯独service方法没有被实现,这个service方法我们自己使用*/
@Override
public void service(ServletRequest paramServletRequest,
ServletResponse paramServletResponse) throws ServletException,
IOException {
}
/**destroy方法*/
/**【注意】除过service方法之外,其他方法都已经被实现了,并且这些方法都调用父接口的方法*/
@Override
public void destroy() {
super.destroy();
}
/**getServletConfig方法*/
@Override
public ServletConfig getServletConfig() {
return super.getServletConfig();
}
/**getServletInfo方法*/
@Override
public String getServletInfo() {
return super.getServletInfo();
}
/**init方法*/
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
3、Servlet的实现方式三(继承HttpServlet类):
可以在dopost中调用doget,从而简化编程:
HttpServlet类:
package cn.hncu;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ExtendHttpServlet extends HttpServlet {
/**service方法*/
/**【注意】此service方法是HttpServlet类 继承 GenericServlet类 后实现的其抽象service方法的*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.service(req, resp);
}
/**destroy方法*/
/**【注意】下面的这些方法全部是继承与GenericServlet类中的方法*/
@Override
public void destroy() {
super.destroy();
}
/**getServletConfig方法*/
@Override
public ServletConfig getServletConfig() {
return super.getServletConfig();
}
/**getServletInfo方法*/
@Override
public String getServletInfo() {
return super.getServletInfo();
}
/**init方法*/
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
}
四、Servlet生命周期
1、在JavaWeb项目中测试Servlet的生命周期
(1)init方法:
只会被初始化一次,由容器初始化,初始化成功后将缓存与容器中。
它的初始时间分为两种:
用户第一次访问时。
服务器启动时,需要配置。
(2)service方法:
每次请求都会访问此方法。
每次请求都会创建新的Request和Response对像。
(3)destory方法:
当服务器关闭时由容器调用并销毁。
2、JavaWeb项目—-TestServlet project
(1)、TestServlet框架:
(2)、index.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>测试Servlet的生命周期</title>
</head>
<body>
<h2>测试Servlet的生命周期</h2>
<a href="servlet/TestServlet">测试servlet的生命周期</a>
</body>
</html>
五、配置自动加载
l如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。
举例:
<servlet>
<servlet-name>invoker</servlet-name>
<servlet-class>
org.apache.catalina.servlets.InvokerServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
例如:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据
六、配置访问路径
七、编写绝对路径
ServletConfig对象:
l在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。
l当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
l阅读ServletConfig API,并举例说明该对象的作用:
•获得配置文件,查看struts案例的web.xml文件
ServletContext对象:
lWEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
lServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
l由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
l查看ServletContext API文档,了解ServletContext对象的功能。
ServletContext应用:
1.获取WEB应用的全局初始化参数
2.通过ServletContext对象实现数据共享
•案例--- 统计站点访问次数
3.利用ServletContext对象读取资源文件
域对象:
关于缺省Servlet:
l如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。
l凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它们的访问请求都将交给缺省Servlet处理,也就是说,缺省Servlet用于处理所有其他Servlet都不处理的访问请求。
l在<tomcat的安装目录>\conf\web.xml文件中,注册了一个名称为org.apache.catalina.servlets.DefaultServlet的Servlet,并将这个Servlet设置为了缺省Servlet。
l当访问Tomcat服务器中的某个静态HTML文件和图片时,实际上是在访问这个缺省Servlet。