一、Servlet简介
Servlet是Sun公司提供的一门用于开发动态Web资源的技术。
Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
1、编写一个Java类,实现servlet接口。
2、把开发好的Java类部署到web服务器中。
(按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet)
二、Servlet的生命周期(重点)
(Servlet是一个单例,只在Servlet容器中初始化一次,整个Servlet容器中只有一个Servlet对象)
Servlet程序是由Web服务器调用,Web服务器收到客户端的Servlet访问请求后:
①Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
②装载并创建该Servlet的一个实例对象。
③调用Servlet实例对象的init()方法。
④创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
⑤WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
三、Servlet接口实现类
sun公司给Servlet接口定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
HttpServlet只能够处理HTTP请求的Servlet,它在原有的Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,复写了service方法,该方法体内的代码会自动判断用户的请求方式,如为get请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法,所以在编写Servlet时,通常只需要复写doGet或doPost方法,而不需要复写service方法。
Java ee eclipse的项目中创建servlet文件,如下:
web.xml中会自动生成:
<servlet><description>
</description>
<display-name>Servlet1</display-name>
<servlet-name>Servlet1</servlet-name>
<servlet-class>com.zl.servlets.Servlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet1</servlet-name>
<url-pattern>/Servlet1</url-pattern>
</servlet-mapping>
四、Servlet中使用配置和注解两种方式
4.1、使用配置方式
<servlet> //注册Servlet
<servlet-name>Servlet1</servlet-name> //Servlet的注册名称
<servlet-class>com.zl.servlets.Servlet1</servlet-class> //Servlet的完整类名
</servlet>
<servlet-mapping> //映射一个已注册的Servlet的一个对外访问路径
<servlet-name>Servlet1</servlet-name> //指定Servlet的注册名称
<url-pattern>/ss</url-pattern> //Servlet的对外访问路径,可以随便写一个
</servlet-mapping>
Servlet访问URL映射配置:
<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。
4.2、使用注解方式
@WebServlet("/ss") //映射名前斜杠不能掉!!!
Servlet版本在3.0及以上,jdk在1.6及以上才可以使用注解方式!!!
@WebServlet("/ss")
public class Servlet1 extends HttpServlet {
......
}
五、Servlet与普通Java类的区别
Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。
针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。
在Servlet的整个生命周期内,Servlet的init( )方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service( )方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service( )方法,service( )方法再根据请求方式分别调用doXXX方法。(后面会讲解Servlet的生命周期这个问题)