servlet概述

servlet
   1.什么是servlet
      servlet其实就是java里面一种java类,只不过这种java类有一些特殊的作用,所以我们就叫它servlet
   2.servlet的作用
      可以让浏览器直接通过一个路径去访问。(一般的java类是做不到这一点的)

   3.怎么写一个类,能成为一个servlet
    三种方式:
      a.实现一个接口:javax.servlet.Servlet
      b.继承一个抽象类:javax.servlet.GenericServlet
      c.继承一个抽象类javax.servlet.http.HttpServlet
      这种是之后一直要用的方法.

    注意:Servlet接口中,有五个抽象方法,其实最重要的一个方法是:service(ServletRequestreq,ServletResponse res)
    抽象类GenericServlet实现了接口Servlet,但是留了一个抽象方法没有实现,就是上面所提到的service方法,除此之外,GenericServlet里面还增加了一些新的方法.
    抽象类HttpServlet,继承了GenericServlet,但是HttpServlet中没有任何抽象方法,除了从父类继承过来的方法之外,里面还有很多新的方法:doXxx方法,另外需要注意的是,HttpServlet里面有俩个service方法,但是俩个方法的参数类型不同.

    i.Servlet接口中的service方法.
       因为无论我们使用哪一种方式去写出来的一个servlet类的中,一定会有一个方法叫做service,这个方法是Servlet接口中的定义的,tomcat服务器接收到客户端请求后,帮我们调用servlet中的方法的时候,它只会调用这一个service方法.
       注意这个service方法中参数的类型:
       service(ServletRequestreq,ServletResponse res)

    ii.GenericServlet中的俩个init方法
    带参数的init(ServletConfig config)方法是从Servlet接口中实现的,还有一个是这个类直接定义的,无参的init()方法.
    tomcat服务器创建servlet对象的时候,会帮我们去调用init(ServletConfig config)进行servlet类中的初始化工作,所以如果我们想在servlet类中初始化自己的一些相关数据的话,需要去重写这个init方法。有参数的init方法中调用了无参的init方法,所以将来我们只需要重写这个无参的init方法就可以了。这样我们就不需要再专门对这个init(ServletConfig config)方法中的参数进行处理了。

    iii.HttpServlet中的俩个service方法

    这个是从Servlet接口中实现的方法.
    service(ServletRequest req, ServletResponse res){
        //强转参数类型
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)res;
        
        //调用新定义的service方法
        service(request,response);
        
    }
    
    
    HttpServlet中新定义的方法
    service(HttpServletRequest req, HttpServletResponse resp){
       //拿到当前请求的类型 get/post
       String method = req.getMethod();
       
       //判断请求的方法 然后去调用doXxx方法
           if(method.equals("GET")){
        doGet(req,resp);
       }
       if(method.equals("POST")){
        doPost(req,resp);
       }
       ...
       ..
    }


http://ip:port/项目名字/资源路径

http://127.0.0.1:8002/web_test/servlet1


    4.servlet的生命周期
        servlet的对象是单例:在web项目整个运行期间,每一个servlet类只会有一个对象存在.默认情况下,这一个对象是在servlet第一次被访问的时候才会创建的,而且之后不管再访问多少次这个servlet,也不会再去创建它的的对象的.(我们可以设置某一个servlet的对象在服务器启动的时候就被创建出来)  
      
         这些操作(方法的调用)都是由服务器来做的:
         1.默认情况下,第一次被访问的时候tomcat创建servlet对象(调用无参构造器)
     2.tomcat调用init(ServletConfig config)方法
          在servlet对象实例化之后,tomcat服务器会立马调用这个方法给servlet的实例进行初始化工作。
     3.客户端访问的时候,tomcat会调用service(ServletRequest req,ServletResponse res)方法
     4.在销毁servlet对象的时候会tomcat调用destroy()方法.


        通过web.xml文件中设置,可以让servlet的对象是在服务器启动的时候被创建出来.
    web.xml:
      <servlet>
         <servlet-name>LifeServletTest</servlet-name>
         <servlet-class>com.briup.servlet.LifeServletTest</servlet-class>
         <load-on-startup>1</load-on-startup>
     </servlet>

     加入<load-on-startup>标签,表示这个servlet需要在启动服务器的时候就被创建对象.其中,标签可以要放一个数字,这个数字的大小就决定了多个servlet对象被创建的顺序,数字越小越先创建.(如果我们配置了多个servlet在启动服务器的时候被创建对象的话)

    5.servlet的线程安全问题
    问题产生的原因:
      1.servlet是单例,一个servlet类只有一个对象在项目运行期间。
      2.web项目项目本身就有多线程的特点,虽然我们在代码中没有写和线程相关的东西,但是这个多线程的特点是由服务器给我们提供出来的,一个客户端发送了一个请求,服务器接收到请求后就会建一个线程去处理这个请求。
    所以就有可能出现这样的情况:俩个线程同时去访问同一个servlet对象.
        
    如何解决/防止
      1.加锁synchronized
      2.尽量少的定义成员变量
          因为只有成员变量才会产生线程安全的问题(在多个线程访问同一个对象的时候),方法中的局部变量是没有这样的问题的.
          3.其他(实现一些安全性的接口)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值