生命周期方法:
void init(ServletConfig):出生之后(1次);
void service(ServletRequest request, ServletResponse response):每次处理请求时都会被调用;
void destroy():临死之前(1次);
特性:
单例,一个类只有一个对象;当然可能存在多个Servlet类!
线程不安全的,所以它的效率是高的!
Servlet类由我们来写,但对象由服务器来创建,并且由服务器来调用相应的方法!!!
1、 什么是servlet?
Servlet是JavaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
接收请求数据;
处理请求;
完成响应。
例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。
2、实现Servlet的方式(由我们自己来写!)
实现Servlet有三种方式:
实现javax.servlet.Servlet接口;
继承javax.servlet.GenericServlet类;
继承javax.servlet.http.HttpServlet类;
通常我们会去继承HttpServlet类来完成我们的Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习。
Servlet.java
1 public interface Servlet { 2 public void init(ServletConfig config) throws ServletException; 3 public ServletConfig getServletConfig(); 4 public void service(ServletRequest req, ServletResponse res) 5 throws ServletException, IOException; 6 public String getServletInfo(); 7 public void destroy(); 8 } 9 //[Servlet中的方法大多数不由我们来调用,而是由Tomcat来调用。并且Servlet的对象也不由我们来创建,由Tomcat来创建!]
HelloServlet.java,继承 Servlet.java.
1 public class HelloServlet implements Servlet { 2 public void init(ServletConfig config) throws ServletException {} 3 4 public ServletConfig getServletConfig() {return null;} 5 6 public void destroy() {} 7 8 public String getServletInfo() {return null;} 9 10 public void service(ServletRequest req, ServletResponse res) 11 throws ServletException, IOException { 12 System.out.println("hello servlet!"); 13 } 14 }
配置web.xml
在web.xml中配置Servlet的目的其实只有一个,就是把访问路径与一个Servlet绑定到一起,下面配置是把访问路径:“/helloworld”与“cn.servlet.HelloServlet”绑定到一起。
*<servlet>:指定HelloServlet这个Servlet的名称为hello;
* <servlet-mapping>:指定/helloworld访问路径所以访问的Servlet名为hello。
*<servlet>和<servlet-mapping>通过<servlet-name>这个元素关联在一起了!
*接下来,我们编译HelloServlet,注意,编译HelloServlet时需要导入servlet-api.jar,因为Servlet.class等类都在servlet-api.jar中。
javac -classpath F:/tomcat6/lib/servlet-api.jar -d . HelloServlet.java
然后把HelloServlet.class放到/helloworld/WEB-INF/classes/目录下,然后启动Tomcat,在浏览器中访问:http://localhost:8080/helloservlet/helloworld即可在控制台上看到输出!
* /helloservlet/WEB-INF/classes/cn/itcast/servlet/HelloServlet.class;
1 <servlet> 2 <servlet-name>hello</servlet-name> 3 <servlet-class>cn.servlet.HelloServlet</servlet-class> 4 </servlet> 5 <servlet-mapping> 6 <servlet-name>hello</servlet-name> 7 <url-pattern>/helloworld</url-pattern> 8 </servlet-mapping>
Servlet接口
1、Servlet的生命周期
所谓xxx的生命周期,就是说xxx的出生、服务,以及死亡。Servlet生命周期也是如此!与Servlet的生命周期相关的方法有:
* void init(ServletConfig);
* void service(ServletRequest,ServletResponse);
* void destroy();
1.1 Servlet的出生
服务器会在Servlet第一次被访问时创建Servlet,或者是在服务器启动时创建Servlet。如果服务器启动时就创建Servlet,那么还需要在web.xml文件中配置。也就是说默认情况下,Servlet是在第一次被访问时由服务器创建的。
而且一个Servlet类型,服务器只创建一个实例对象,例如在我们首次访问http://localhost:8080/helloservlet/helloworld时,服务器通过“/helloworld”找到了绑定的Servlet名称为cn.servlet.HelloServlet,然后服务器查看这个类型的Servlet是否已经创建过,如果没有创建过,那么服务器才会通过反射来创建HelloServlet的实例。当我们再次访问http://localhost:8080/helloservlet/helloworld时,服务器就不会再次创建HelloServlet实例了,而是直接使用上次创建的实例。
在Servlet被创建后,服务器会马上调用Servlet的void init(ServletConfig)方法。请记住, Servlet出生后马上就会调用init()方法,而且一个Servlet的一生。这个方法只会被调用一次。这好比小孩子出生后马上就要去剪脐带一样,而且剪脐带一生只有一次。
我们可以把一些对Servlet的初始化工作放到init方法中!
1.2 Servlet服务
当服务器每次接收到请求时,都会去调用Servlet的service()方法来处理请求。服务器接收到一次请求,就会调用service() 方法一次,所以service()方法是会被调用多次的。正因为如此,所以我们才需要把处理请求的代码写到service()方法中!
1.3 Servlet的离去
Servlet是不会轻易离去的,通常都是在服务器关闭时Servlet才会离去!在服务器被关闭时,服务器会去销毁Servlet,在销毁Servlet之前服务器会先去调用Servlet的destroy()方法,我们可以把Servlet的临终遗言放到destroy()方法中,例如对某些资源的释放等代码放到destroy()方法中。
2、Servlet接口相关类型
在Servlet接口中还存在三个我们不熟悉的类型:
* ServletRequest:service() 方法的参数,它表示请求对象,它封装了所有与请求相关的数据,它是由服务器创建的;
* ServletResponse:service()方法的参数,它表示响应对象,在service()方法中完成对客户端的响应需要使用这个对象;
* ServletConfig:init()方法的参数,它表示Servlet配置对象,它对应Servlet的配置信息,那对应web.xml文件中的<servlet>元素。