一、什么是Servlet
一个Servlet程序就是一个实现了特殊接口的java类,他由支持Servlet的WEB服务器(Servlet引擎)调用和启动运行。一个Servlet程序负责处理他所对应的一个或者一组URL地址访问请求,并接受客户端发来的请求信息和产生的响应信息内容。
二、Servlet API中几个常用类的关系
1、一个Servlet程序就是一个实现了javax.servlet.Servlet接口的java类,Servlet接口定义了Servlet引擎和Servlet程序的通讯协议。
2、javax.servlet.GenericServlet是实现了Servlet接口的类。他实现了Servlet接口的基本特征和功能
3、javax.servlet.http.HttpServlet是javax.servlet.GenericServlet的子类。他在GenericServlet类的基础上对Http协议做了些扩充。
4、客户端调用一个支持Http的Servlet程序时,Servlet引擎将调用service方法,改方法接受两个参数,一个是用于封装http请求消息的对象,其类型为HttpServletRequest,一个是代表http响应消息的对象,其类型为HttpServletResponse
5、调用HttpServletResponse对象的getWriter()方法可获得一个文本输出流对象。向这个流对象写入的内容可作为http响应消息的实体对象部分发送个客户端。
6、HttpServletRequest和HttpServletResponse是Servlet引擎和Servlet程序通信的纽带。这好比两个好朋友A和B,当A去拜访B的时候带来两个盒子,一个盒子里是A给B的礼物,另一个是用来装B回送的礼物的。当A把HttpServletRequest给B时,B打开看了下,决定回送给A些什么装入到HttpServletResponse
举例说明:编写一个Servlet类
import javax.servlet.*;
import.java.io.*
import.servlet.http.*;
public class ServletTest extends HttpServlet{
public void service(HttpServletRequest request,HttpServletResponse response){
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<strong>11111");
out.println("</strong>");
out.println("</html>");
}
}
三、Servlet的注册和运行
1、Servlet程序必须通过Servlet引擎来启动运行,并且存储目录有特殊要求,一般是放在WEN-INF/calssess目录下
2、Servlet必须在web.xml里配置才能使用
3、一个<servlet>元素用于注册一个Servlet,他包含两个元素<servlet-name>和<servlet-class>分别用于设置servlet的名称和servlet的完整类名。
4、一个<servlet-maping>用于映射一个注册好的servlet的对外访问路径,它包含两个元素,<servlet-name>和<servlet-url>分别用于指定Servlet的注册名称和Servlet的对外访问路径
<web-app>
....................
<servlet>
<servlet-name>AnyName</servlet-name>
<servlet-class>com.cws.servlet.HelloServlet<servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AnyName<servlet-name>
<servlet-url>/demo/hello.html</servlet-url>
</servlet-mapping>
....................
<web-app>
四、Servlet的映射细节
1、同一个Servlet可以被映射到多个URL上
即多个<servlet-mapping>元素中的<servlet-name>中指定的名字可以是同一个。
2、在servlet的url中可以使用(*)通配符,并且通配符只能有两种形式,一种是以*.扩展名,另一种是已/开头已/*结尾
五、Servlet激活器
在每个web应用程序的WEB-INF目录下都有一个web.xml文件,其中记录了servlet的一些配置信息,在tomcat的conf目录下也有一个web.xml文件,这个xml文件是所有在该tomcat上部署的web应用程序的基础配置,就是说,每个web应用程序的web.xml都是在 conf/web.xml上的基础上进行扩展和覆盖的。
在一些web应用程序的web.xml文件中可能找到下面的映射:
<servlet-mapping> <servlet-name>invoker</servlet-name> <url-pattern>/servlet/*</url-pattern> </servlet-mapping>
这说明当匹配/servlet/*路径时,会调用一个注册名称为invoker的Servlet。可是在web.xml文件中根本找不到这个 Servlet的注册。这里注意,一个web应用程序的部署描述除了包含在该应用程序内部的web.xml文件中,还包含<tomcat主目 录>\conf目录下的web.xml文件中的全局设置信息,在<tomcat主目录>\conf\web.xml文件中可以看到:
<servlet> <servlet-name>invoker</servlet-name> <servlet-class> org.apache.catalina.servlets.InvokerServlet </servlet-class> <load-on-startup>2</load-on-startup> </servlet>
这样,如果有多个web应用程序要用到这个Servlet,我们不必在每个web应用程序中都单独注册这个servlet,而只需在web.xml文件中 映射其访问路径即可。这个Servlet的作用就是激活和调用任何其他Servlet,被称为Servlet激活器。 <load-on-startup>2</load-on-startup>设置它随Tomcat的启动而加载(其中的2代表加载的优先顺序)。所以,在web 应用程序中为Servlet激活器invoker映射的访问路径以"/*"结尾,即使某个Servlet程序没有在web.xml文件中注册,我们只需将 Servlet激活器所映射的访问路径中的通配符(*)替换为这个Servlet的完整类名,就可以通过servlet激活器来调用这个Servlet程 序。
六、缺省的Servlet
1.在tomcat安装目录中:conf下的web.xml中有这样一个代码:
<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
servlet的映射路径为一个(/),称之为缺省的servlet。则这个servlet就成为了当前web应用程序的缺省servlet。
缺省的servlet的作用为:凡是在web.xml文件总找不到匹配的<servlet-mapping>元素的URL,他们的方位请求都将交给缺省的servlet处理。也就是说,缺省的servlet用于处理所有其他servlet不处理的访问请求。
2.当访问tomcat服务中的某个静态html文件和图片时,实际上是在访问这个缺省的servlet。
3.把上述中的代码注释掉,重启tomcat服务器,输入http://localhost:8080 ,将发现页面中的图片将显示不出,也即是因为这个原因
七、Servlet查询数据库的过程
八、Servlet的运行过程
1、Servlet引擎检查是否已经装载创建了改Servlet对象,如果是则执行第四步,否则执行第二步。
2、装载并创建一个Servlet对象
3、调用Servlet对象的init()方法
4、创建一个用于封装请求消息的HttpServletRequest类型对象和一个代表响应消息的HttpServletResponse对象,然后调用Servlet的Service方法,并把请求消息的对象和响应消息的对象传进去
5、web程序被停止或者重新启动时,Servlet引擎将卸载Servlet程序。并在卸载前调用Servlet的destroy()方法
九、Servlet运行过程-》特殊说明
1、在<servlet>元素中嵌套一个<load-on-startup>元素,web程序在启动的时候就会装载并创建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>
2、在servlet的生命周期中,init()方法和destroy()方法只被调用一次。而service()方法每一次请求都调用一次。
3、tomcat也提供了是否自动重新装载被修改的servlet的选项,在tomcat目录下的conf子目录的server.xml中的<context>中的reloadable改为true。
十、