理解Servlet

搞Java开发不可避免要用到Servlet,知其然知其所以然,它是什么呢?可以看我前面写的1-Java的认识扫盲,更详细的就要好好了解Tomcat了,可以看看这位老哥的Tomcat系列之Java技术详解
,很好理解吧,这篇文章会着重在技术上说一说Servlet。

一、如何开发一个Servlet(面试会问到的哦)

  • 编写java类,继承HttpServlet类
  • 重新doGet和doPost方法
  • Servlet程序交给tomcat服务器运行!!
    • servlet程序的class码拷贝到WEB-INF/classes目录
    • 在web.xml文件中进行配置(虽然现在IDE都很智能化自动化,但了解下还是有必要的)

  
  
    
    FirstServlet
    
    yxl.com.FirstServlet
  
  
  
  
  
    
    FirstServlet
    
    /first
  

这个就算配置好了,然后就可以访问了 http://localhost:8080/demo/first ,这个过程是怎么样呢?

  • tomcat服务器启动时,首先加载webapps中的每个web应用的web.xml配置文件。
  • http://: 就是http协议,通过这个协议对浏览器客户端和服务器端之间数据传输的格式规范;localhost:到本地的hosts文件中查找是否存在该域名对应的IP地址(127.0.0.1);通过8080这个端口找到Tomcat服务器,在Tomcat的webapps目录找到demo的目录;first是资源名称,又会分为下面几步骤
    • 1)在demo的web.xml中查找是否有匹配的url-pattern的内容(/first)
    • 2)如果找到匹配的url-pattern,则使用当前servlet-name的名称到web.xml文件中查询是否相同名称的servlet配置
  • 3)如果找到,则取出对应的servlet配置信息中的servlet-class内容:字符串: yxl.com.FirstServlet
  • 4)通过反射:
    a)构造FirstServlet的对象
    b)然后调用FirstServlet里面的方法

二、理解上面的再看看映射路径就是demo/ 后面的东东

在servlet中会有个映射配置,看注释里面写的很清楚

  
  
    
    FirstServlet
    
    /first
  

它提供了我们精准和模糊两种匹配

  • 精准匹配
    可以在里输入具体的路径,比如
    是/first。就在浏览器输入http://localhost:8080/demo/first ;
    是/yxl/demo1 ,就可以写http://localhost:8080/yxl/demo1
  • 模糊匹配
    /* 浏览器输入:http://localhost:8080/demo/任意路径

*.后缀名 浏览器输入: http://localhost:8080/demo/任意路径.do

  • 注意
  • 1)url-pattern要么以 / 开头,要么以*开头。 例如, dmeo是非法路径。
  • 2)不能同时使用两种模糊匹配,例如 /demo/*.do是非法路径
  • 3)当有输入的URL有多个servlet同时被匹配的情况下:
    - 3.1 精确匹配优先。(长的最像优先被匹配)
    - 3.2 以后缀名结尾的模糊url-pattern优先级最低!!!

还有一个内容就是 servlet的缺省路径(/)是在tomcat服务器内置的一个路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件;如果没有匹配的url-pattern,则交给tomcat的内置的DefaultServlet处,DefaultServlet程序到应用的根目录下查找是存在一个名称为index.html的静态文件;如果找到该文件,则读取该文件内容,返回给浏览器;如果找不到该文件,则返回404错误页面。

三、Servlet的生命周期

Servlet的生命周期: servlet类对象什么时候创建?什么时候调用什么方法?什么时候销毁?
请先记住这个句话:Servlet程序的生命周期由tomcat服务器控制的!!!!!!!!!!!!!!!!!!!

四大生命周期:

  • 构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象 调用1次。证明servlet对象在tomcat是单实例的。
  • init方法: 创建完servlet对象的时候调用。只调用1次。
  • service方法: 每次发出请求时调用。调用n次。
  • destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。

这是是不是很烦躁,接下来就是show code time

//Tomtcat内部代码运行:
            //通过映射找到到servlet-class的内容,字符串: yxl.com.FirstServlet
             //通过反射构造FirstServlet对象
                    //1 得到字节码对象
                    Class clazz = class.forName("yxl.com.FirstServlet");
                    //2 调用无参数的构造方法来构造对象
                    Object obj = clazz.newInstance();     //---1.servlet的构造方法被调用
         //创建ServletConfig对象,通过反射调用init方法
                    //1 得到方法对象
                    Method m = clazz.getDeclareMethod("init",ServletConfig.class);
                    //2 调用方法
                    m.invoke(obj,config);            // --2.servlet的init方法被调用
            //创建request,response对象,通过反射调用service方法
                    //1 得到方法对象
                    Methodm m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
                    //2 调用方法
                    m.invoke(obj,request,response);  //--3.servlet的service方法被调用
            //当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法
                    //1 得到方法对象
                    Method m = clazz.getDeclareMethod("destroy",null);
                    //2 调用方法
                    m.invoke(obj,null);            //--4.servlet的destroy方法被调用

四、自动加载

默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。

改变servlet创建对象的时机: 提前到加载web应用的时候!!!

在servlet的配置信息中,加上一个即可!!


    LifeDemo
    yxl.com.LifeDemo
    
    1  //注意: 整数值越大,创建优先级越低!!
  

五、 有参的init方法和无参的init方法

学习ing,稍带补充

六、Servlet的多线程并发问题

学习ing,稍带补充

七、 ServletConfig对象

学习ing,稍带补充

八、ServletContext对象

学习ing,稍带补充

你可能感兴趣的:(理解Servlet)