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.  Licensed to the Apache Software Foundation (ASF) under one or more  
  4.   contributor license agreements.  See the NOTICE file distributed with  
  5.   this work for additional information regarding copyright ownership.  
  6.   The ASF licenses this file to You under the Apache License, Version 2.0  
  7.   (the "License"); you may not use this file except in compliance with  
  8.   the License.  You may obtain a copy of the License at  
  9.   
  10.       http://www.apache.org/licenses/LICENSE-2.0  
  11.   
  12.   Unless required by applicable law or agreed to in writing, software  
  13.   distributed under the License is distributed on an "AS IS" BASIS,  
  14.   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  15.   See the License for the specific language governing permissions and  
  16.   limitations under the License.  
  17. -->  
  18.   
  19. <web-app xmlns="http://java.sun.com/xml/ns/javaee"  
  20.    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  21.    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"  
  22.    version="2.5">  
  23.   
  24.   <display-name>Welcome to Tomcat</display-name>  
  25.   <description>  
  26.      Welcome to Tomcat  
  27.   </description>  
  28.     
  29.     
  30.   <!-- servlet的配置 -->  
  31.   <servlet>  
  32.     <servlet-name>hello</servlet-name><!-- servlet的名字,任意的 -->  
  33.     <servlet-class>com.tsinghua.Hello</servlet-class><!-- 指明servlet的包名+类名 -->  
  34.   </servlet>  
  35.   <!-- 映射关系配置 -->  
  36.   <servlet-mapping>  
  37.     <servlet-name>hello</servlet-name><!-- servlet的名字,和上面一样 -->  
  38.     <url-pattern>/hello</url-pattern><!-- 这是在浏览器中输入的访问该servlet的url -->  
  39.   </servlet-mapping>  
  40.     
  41.   <!-- servlet的配置 -->  
  42.   <servlet>  
  43.     <servlet-name>helloGen</servlet-name><!-- servlet的名字,任意的 -->  
  44.     <servlet-class>com.tsinghua.HelloGen</servlet-class><!-- 指明servlet的包名+类名 -->  
  45.   </servlet>  
  46.   <!-- 映射关系配置 -->  
  47.   <servlet-mapping>  
  48.     <servlet-name>helloGen</servlet-name><!-- servlet的名字,和上面一样 -->  
  49.     <url-pattern>/helloGen</url-pattern><!-- 这是在浏览器中输入的访问该servlet的url -->  
  50.   </servlet-mapping>  
  51.     
  52.   <!-- servlet的配置 -->  
  53.   <servlet>  
  54.     <servlet-name>helloHttp</servlet-name><!-- servlet的名字,任意的 -->  
  55.     <servlet-class>com.tsinghua.HelloHttp</servlet-class><!-- 指明servlet的包名+类名 -->  
  56.   </servlet>  
  57.   <!-- 映射关系配置 -->  
  58.   <servlet-mapping>  
  59.     <servlet-name>helloHttp</servlet-name><!-- servlet的名字,和上面一样 -->  
  60.     <url-pattern>/helloHttp</url-pattern><!-- 这是在浏览器中输入的访问该servlet的url -->  
  61.   </servlet-mapping>  
  62.     
  63.     
  64.     
  65.   
  66. </web-app>  

说一声Servlet的生命周期

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

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

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

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

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

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

    如果某个Servlet配置了 <load-on-startup >1 </load-on-startup >,该Servlet也是在Tomcat(Servlet容器)启动时初始化。

  如果Servlet没有配置<load-on-startup >1 </load-on-startup >,该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再对服务器响应进行后处理。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值