Servlet三种实现方式


前言

Servlet是JavaWeb的 三大组件之一 ,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:

  • 接收请求数据;

  • 处理请求;

  • 完成响应。

例如客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Servlet生命周期

在这里插入图片描述Servlet默认创建的时间: 在第一次请求的时候创建 第一次惩罚
init():服务器启动时执行
service : 服务方法,更新开启服务器都会执行。
destroy: 摧毁方法,仅在服务器正常关闭时执行一次 。
getServletConfig():获取servlet的配置信息。
getServletInfo():获取servlet的一些基本信息,比如作者,版权等等

  • 注意:内存中只存在一个servlet对象,但它可被多个类引用,存在安全问题,所以尽量不要在它的方法中定义成员变量。

二、实现Servlet三种方式?

实现Servlet有三种方式:

  • 实现javax.servlet.Servlet接口;

  • 继承javax.servlet.GenericServlet类;

  • 继承javax.servlet.http.HttpServlet类;

通常我们会去继承HttpServlet类来完成我们的Servlet,但学习Servlet还要从javax.servlet.Servlet接口开始学习。

public interface Servlet { 
    public void  init(ServletConfig config)  throws  ServletException; 
    public ServletConfig getServletConfig();       
    public void  service(ServletRequest req, ServletResponse res) throws      ServletException, IOException;      
    public  String getServletInfo();       
    public  void   destroy();
}

三、GenericServlet

概述:GenericServlet是Servlet接口的实现类,我们可以通过继承GenericServlet来编写自己的Servlet。下面是GenericServlet类的源代码:

public abstract class GenericServlet implements Servlet, ServletConfig,    java.io.Serializable {       
    private  static  final long serialVersionUID = 1L;       
    private  transient ServletConfig config;       
    public   GenericServlet() {} 
    @Override
    public void destroy() {}  
    @Override       
    public String getInitParameter(String name) {         
        return getServletConfig().getInitParameter(name);  
    }  
    @Override       
    public Enumeration<String> getInitParameterNames() {         
        return getServletConfig().getInitParameterNames();  
    }  
    @Override       
    public ServletConfig getServletConfig() {         
        return config;  
    }  
    @Override       
    public ServletContext getServletContext() {         
        return getServletConfig().getServletContext();  
    }
    @Override       
    public String getServletInfo() {         
        return      "";  
    }  
    @Override       
    public void init(ServletConfig config) throws ServletException {         				this.config = config;
        this.init();  
    }       
    public void init()throws ServletException {}       
    public void log(String msg) {    
        getServletContext().log(getServletName() + ": " + msg); 
    }       
    public void log(String message, Throwable t) {
        getServletContext().log(getServletName() + ": " + message, t);  
    }  
    @Override       
    public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; 
    @Override       
    public String getServletName() {         
        return config.getServletName();  
    }
}
  • 实现了Servlet的init(ServletConfig)方法,把参数config赋给了本类的成员config,然后再调用本类自己的无参的init()方法。

  • init()这个方法是GenericServlet自己的方法,而不是从Servlet继承下来的。当我们自定义Servlet时,如果想完成初始化作用就不要再重复init(ServletConfig)方法了,而是应该去重写init()方法。因为在GenericServlet中的init(ServletConfig)方法中保存了ServletConfig对象,如果覆盖了保存ServletConfig的代码,那么就不能再使用ServletConfig了。

  • 在GenericServlet中,定义了一个ServletConfig config实例变量,并在init(ServletConfig)方法中把参数ServletConfig赋给了实例变量。然后在该类的很多方法中使用了实例变量config。

3.1GenericServlet中的init()

  • 如果子类覆盖了GenericServlet的init(StringConfig)方法,那么this.config=config这一条语句就会被覆盖了,也就是说GenericServlet的实例变量config的值为null,那么所有依赖config的方法都不能使用了。如果真的希望完成一些初始化操作,那么去覆盖GenericServlet提供的init()方法,它是没有参数的init()方法,它会在init(ServletConfig)方法中被调用。

3.2实现了ServletConfig接口

  • GenericServlet还实现了ServletConfig接口,所以可以直接调用getInitParameter()、getServletContext()等ServletConfig的方法。
2.3.3 实现了ServletConfig接口

四、HttpServlet

概述:HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持,所以通常我们都会通过继承HttpServlet来完成自定义的Servlet。

4.1

HttpServlet类中提供了service(HttpServletRequest,HttpServletResponse)方法,这个方法是HttpServlet自己的方法,不是从Servlet继承来的。在HttpServlet的service(ServletRequest,ServletResponse)方法中会把ServletRequest和ServletResponse强转成HttpServletRequest和HttpServletResponse,然后调用service(HttpServletRequest,HttpServletResponse)方法,这说明子类可以去覆盖service(HttpServletRequest,HttpServletResponse)方法即可,这就不用自己去强转请求和响应对象了。

​ 其实子类也不用去覆盖service(HttpServletRequest,HttpServletResponse)方法,因为HttpServlet还要做另一步简化操作,下面会介绍。

4.2实现代码

public abstract class HttpServlet extends GenericServlet {       
    protected void service(HttpServletRequest req, HttpServletResponse resp)       throws ServletException, IOException { 
        //...代码省略
    }  
    @Override       
    public void service(ServletRequest req, ServletResponse res) throws      ServletException, IOException {     
        HttpServletRequest  request;    
        HttpServletResponse response;          
        try{
            //强转
            request = (HttpServletRequest) req;      
            response = (HttpServletResponse) res;    
        }catch(ClassCastException e) {           
            throw new ServletException("non-HTTP request or response");    
        }
        //调用service(HttpServletRequest,HttpServletResponse)方法
        service(request, response);
    }
    //其他方法省略……
}

4.3 doGet()和doPost()

在HttpServlet的service(HttpServletRequest,HttpServletResponse)方法会去判断当前请求是GET还是POST,如果是GET请求,那么会去调用本类的doGet()方法,如果是POST请求会去调用doPost()方法,这说明我们在子类中去覆盖doGet()或doPost()方法即可。

public class AServlet extends  HttpServlet {	     
    public void doGet(HttpServletRequest request, HttpServletResponse response)		throws ServletException, IOException {	
        System.out.println("hello doGet()...");	
    }
}
 public class BServlet extends HttpServlet {	     
     public void doPost(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {	
         System.out.println("hello doPost()...");	
     }
 } 
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值