servlet,三种实现方式,生命周期,和filter的区别

解释一下什么是servlet?

可以从两个方面看servlet

1.API:有一个接口Servlet,它是Servlet规范中定义的用来处理客户端请求的程序需要实现的顶级接口。

2.组件:服务器端用来处理客户端请求的组件,需要在web.xml中配置。


一般来说,写一个servlet,有三种实现方式:

1、实现Servlet接口。

2、继承GenericServlet。

3、继承HttpServlet。

第三种方式是现在比较常用的。

第一种:

[java]  view plain  copy
  1. package com.tsinghua;  
  2. //这是我的第一个servlet,使用实现servlet接口的方式来开发。  
  3.   
  4. import javax.servlet.*;  
  5.   
  6. import java.io.*;  
  7.   
  8.   
  9. public class Hello implements Servlet{  
  10.   
  11.     /** 
  12.      * 销毁servlet实例,释放内存 
  13.      * 3种情况: 
  14.      * 1.reload 该servlet(所在的webapps) 
  15.      * 2.关闭tomcat 
  16.      * 3.关机 
  17.      */  
  18.     @Override  
  19.     public void destroy() {  
  20.         // TODO Auto-generated method stub  
  21.         System.out.println("destroy it");  
  22.           
  23.           
  24.     }  
  25.   
  26.     @Override  
  27.     public ServletConfig getServletConfig() {  
  28.         // TODO Auto-generated method stub  
  29.         return null;  
  30.     }  
  31.   
  32.     @Override  
  33.     public String getServletInfo() {  
  34.         // TODO Auto-generated method stub  
  35.         return "";  
  36.     }  
  37.   
  38.     /** 
  39.      * 初始化该servlet,类似于构造函数。 
  40.      * 该函数只会被调用一次。当用户第一次访问该servlet时被调用。 
  41.      */  
  42.     @Override  
  43.     public void init(ServletConfig arg0) throws ServletException {  
  44.         // TODO Auto-generated method stub  
  45.         System.out.println("init it");  
  46.     }  
  47.   
  48.       
  49.     /** 
  50.      * 这个函数用于处理业务逻辑 
  51.      * 程序员应该把业务逻辑代码写在这里 
  52.      * 这个函数会被调用多次,当用户每访问该servlet时都会被调用。 
  53.      * req:用来获得客户端的信息 
  54.      * res:用来对客户端返回信息 
  55.      */  
  56.     @Override  
  57.     public void service(ServletRequest req, ServletResponse res)  
  58.             throws ServletException, IOException {  
  59.         // TODO Auto-generated method stub  
  60.           
  61.         System.out.println("service it");  
  62.         //从res中得到PrintWriter  
  63.         PrintWriter pw=res.getWriter();  
  64.         pw.println("hello,world");  
  65.           
  66.           
  67.           
  68.     }  
  69.       
  70. }  

第二种:


[java]  view plain  copy
  1. package com.tsinghua;  
  2. //这是我的第二个servlet,通过继承GenericServlet来开发  
  3.   
  4. import javax.servlet.GenericServlet;  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.ServletRequest;  
  7. import javax.servlet.*;  
  8.   
  9. import java.io.*;  
  10.   
  11.   
  12. public class HelloGen extends GenericServlet{  
  13.   
  14.     /** 
  15.      * 重写service方法即可。 
  16.      */  
  17.     @Override  
  18.     public void service(ServletRequest req, ServletResponse res)  
  19.             throws ServletException, IOException {  
  20.         // TODO Auto-generated method stub  
  21.         //返回HelloWorld!generic  
  22.         PrintWriter pw=res.getWriter();  
  23.         pw.println("HelloWorld!generic");  
  24.           
  25.           
  26.           
  27.     }  
  28.   
  29.       
  30.       
  31. }  

第三种:

[java]  view plain  copy
  1. package com.tsinghua;  
  2. //这是我的第3个servlet,通过继承HttpServlet来开发  
  3.   
  4. import javax.servlet.http.HttpServlet;  
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletResponse;  
  7.   
  8. import java.io.*;  
  9.   
  10.   
  11. public class HelloHttp  extends HttpServlet{  
  12.       
  13.     /** 
  14.      * 处理get请求 
  15.      * req:客户端的请求信息 
  16.      * resp:客户端的返回信息 
  17.      */  
  18.     public void doGet(HttpServletRequest req, HttpServletResponse resp)  
  19.     {  
  20.         //业务逻辑在这里写。  
  21.         try {  
  22.             PrintWriter pw=resp.getWriter();  
  23.             pw.println("Hello,Http");  
  24.         } catch (IOException e) {  
  25.             // TODO Auto-generated catch block  
  26.             e.printStackTrace();  
  27.         }  
  28.           
  29.     }  
  30.       
  31.     /** 
  32.      * 处理post请求 
  33.      * req:客户端的请求信息 
  34.      * resp:客户端的返回信息 
  35.      */  
  36.     public void doPost(HttpServletRequest req, HttpServletResponse resp)  
  37.     {  
  38.         //post和get请求一样  
  39.         this.doGet(req, resp);  
  40.     }  
  41.   
  42. }  



web.xml中配置servlet

[html]  view plain  copy
  1. xml version="1.0" ?>  
  2.   
  3.   <servlet>  
  4.     <servlet-name>helloservlet-name>  
  5.     <servlet-class>com.tsinghua.Helloservlet-class>  
  6.   servlet>  
  7.     
  8.   <servlet-mapping>  
  9.     <servlet-name>helloservlet-name>  
  10.     <url-pattern>/hellourl-pattern>  
  11.   servlet-mapping>  
  12.     
  13.     
  14.   <servlet>  
  15.     <servlet-name>helloGenservlet-name>  
  16.     <servlet-class>com.tsinghua.HelloGenservlet-class>  
  17.   servlet>  
  18.     
  19.   <servlet-mapping>  
  20.     <servlet-name>helloGenservlet-name>  
  21.     <url-pattern>/helloGenurl-pattern>  
  22.   servlet-mapping>  
  23.     
  24.     
  25.   <servlet>  
  26.     <servlet-name>helloHttpservlet-name>  
  27.     <servlet-class>com.tsinghua.HelloHttpservlet-class>  
  28.   servlet>  
  29.     
  30.   <servlet-mapping>  
  31.     <servlet-name>helloHttpservlet-name>  
  32.     <url-pattern>/helloHttpurl-pattern>  
  33.   servlet-mapping>  
  34.     
  35.     
  36.     
  37.   
  38. web-app>  

说一声Servlet的生命周期

Servlet的生命周期分为五个阶段:

0)。加载  容器通过类加载器使用Servlet类对应的文件来加载Servlet

1)。创建  通过调用Servlet的构造函数来创建一个Servlet实例

2)。初始化阶段  调用init()方法

3)。响应客户请求阶段  调用service()方法-->doGet/doPost()

4)。终止阶段  调用destroy()方法

    如果某个Servlet配置了 1 ,该Servlet也是在Tomcat(Servlet容器)启动时初始化。

  如果Servlet没有配置1 ,该Servlet不会在Tomcat启动时初始化,而是在请求到来时初始化。

            配置这个参数,有两个好处:1、如果初始化过程失败,则容器会提示启动失败,此时我们能够提前知道相关错误;2、配置该参数相当于将初始化servlet的工作转移到容器启动过程,使得容器只要启动成功后,就可立即响应web请求。(例如可判断网络是否通畅)

servlet和filter的区别:

    servlet是一种运行在服务器端的Java应用程序,独立于平台和协议,可以动态的生成web页面,它工作于客户端请求和服务器的中间层

  filter是一个可以复用的代码片段,可以用来转换请求,响应以及头信息,filter不能产生请求和响应,他只能在请求到达servlet之前对请求进行修改,或者在请求返回客户端之前对响应进行处理

    servlet的流程比较短,url来了之后就对其进行处理,处理完就返回数据或者转向另一个页面

  filter的流程比较长,在一个filter处理之后还可以转向另一个filter进行处理,然后再交给servlet,但是servlet处理之后不能向下传递了。

  filter可用来进行字符编码的过滤,检测用户是否登陆的过滤,禁止页面缓存等

Filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处 理,是个典型的处理链。它与Servlet的区别在于:它不能直接向用户生成响应。完整的流程是:Filter对用户请求进行预处理,接着将请求交给 Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。




你可能感兴趣的:(servlet,三种实现方式,生命周期,和filter的区别)