Servlet的三种创建方式与线程安全

一、实现javax.servlet.Servlet接口
     详细代码如下:
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ServletDemo implements Servlet{
       @Override
       public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
             System.out.println("demo1");
       }
       @Override
       public void destroy() {
       }
       @Override
       public ServletConfig getServletConfig() {
             return null;
       }
       @Override
       public String getServletInfo() {
             return null;
       }
       @Override
       public void init(ServletConfig arg0) throws ServletException {
       }
} 
二、继承javax.servlet.GenericServlet类(适配器设计模式)
     GenericServlet类其实也是实现了Servlet接口和ServiceConfig接口,该类重写了Servlet中的方法,它之中只有一个抽象方法,就是service()方法,所以在继承了GenericServlet类后,我们只需要实现service()方法就可以使用了。
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class TestGenericServlet extends GenericServlet{
       @Override
       public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
             // TODO Auto-generated method stub
             System.out.println("GenericServlet");
       }
}
三、继承javax.servlet.http.HttpServlet类
     该创建方式是开发中最常用的方式,该类采用了模板方法设计模式,其中的模板就是该类中的service()方法,如果继承该类,要求其子类必须至少重写一个方法,通常是以下方法:
          1、doGet():用于HTTP GET请求
          2、doPost():用于HTTP Post请求    
          3、doPut():用于HTTP Put请求
          4、doDelete():用于HTTP Delete请求
          5、init()与destory() 用于管理servlet的生命周期
     需要注意的是,不要去重写其中的service()方法,因为service()方法通过将HTTP的请求分发给每个doXxx()方法来处理这些请求。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestHttpServlet extends HttpServlet{
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             // TODO Auto-generated method stub
             System.out.println("doGet");
       }
       @Override
       protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
             // TODO Auto-generated method stub
             System.out.println("doPost");
       }
}
     这里说一下方法调用的方式,当访问servlet程序时,由于通过<servlet></servlet>标签创建的时Servlet类对象,即Servlet s = new TestHttpServlet();所以访问时会调用其子类重写的service()方法,而该子类TestHttpServlet没有重写service()方法,所以就会调用HttpServlet类的service()方法,该方法中包含了对HTTP的请求进行响应的一系列方法,比如doGet()方法,如果在TestHttpServlet重写了doGet()方法,那么service()就会去调用该类中的doGet()方法,而不去执行HttpServlet类中的doGet()方法。
四、Servlet的线程安全
          Servlet是单实例的,但是每次访问的时候是多线程的,因为每访问一次就要调用一遍service()方法,解决线程安全的方法最好是:将重写的方法中的变量写为局部变量,而不写为全局变量,原因是实例只有一个,而多个用户访问时,如果设置了全局变量,那多个用户就操作的是同一个变量,容易出现错误。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值