理解Servlet

作者: 多了去的YangXuLei | 来源:发表于2017-07-03 00:58 被阅读114次

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

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

  • 编写java类,继承HttpServlet类
  • 重新doGet和doPost方法
  • Servlet程序交给tomcat服务器运行!!
    • servlet程序的class码拷贝到WEB-INF/classes目录
    • 在web.xml文件中进行配置(虽然现在IDE都很智能化自动化,但了解下还是有必要的)
<!-- 配置一个servlet -->
  <!-- servlet的配置 -->
  <servlet>
    <!-- servlet的内部名称,自定义。尽量有意义 -->
    <servlet-name>FirstServlet</servlet-name>
    <!-- servlet的类全名: 包名+简单类名 -->
    <servlet-class>yxl.com.FirstServlet</servlet-class>
  </servlet>
  
  
  <!-- servlet的映射配置 -->
  <servlet-mapping>
    <!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
    <servlet-name>FirstServlet</servlet-name>
    <!-- servlet的映射路径(访问servlet的名称) -->
    <url-pattern>/first</url-pattern>
  </servlet-mapping>

这个就算配置好了,然后就可以访问了 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中会有个映射配置,看注释里面写的很清楚

  <!-- servlet的映射配置 -->
  <servlet-mapping>
    <!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
    <servlet-name>FirstServlet</servlet-name>
    <!-- servlet的映射路径(访问servlet的名称) -->
    <url-pattern>/first</url-pattern>
  </servlet-mapping>

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

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

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

还有一个内容就是 servlet的缺省路径(<url-pattern>/</url-pattern>)是在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的配置信息中,加上一个<load-on-startup>即可!!

<servlet>
    <servlet-name>LifeDemo</servlet-name>
    <servlet-class>yxl.com.LifeDemo</servlet-class>
    <!-- 让servlet对象自动加载 -->
    <load-on-startup>1</load-on-startup>  //注意: 整数值越大,创建优先级越低!!
  </servlet>

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

学习ing,稍带补充

六、Servlet的多线程并发问题

学习ing,稍带补充

七、 ServletConfig对象

学习ing,稍带补充

八、ServletContext对象

学习ing,稍带补充

相关文章

  • 理解Servlet、Servlet容器

    本文参考总结自 理解Servlet和Servlet容器、Web服务器等概念 CGI是什么 CGI 早期的Web服务...

  • 理解Servlet

    搞Java开发不可避免要用到Servlet,知其然知其所以然,它是什么呢?可以看我前面写的1-Java的认识扫盲,...

  • 理解Servlet

    前言 这篇文章的出发点是为了整理Servlet相关知识点,以免在相关概念混淆或分不清的时候到处查阅资料。 一、什么...

  • 第12讲.Servlet

    Servlet 学习摘要: 理解为何要学习Servlet? 什么是Sevlet?如何编写一个Servlet程序。S...

  • JavaEE学习笔记Day2

    JavaEE学习笔记day2 理解Servlet的编写和访问过程掌握Servlet父子类之间的继承关系理解Serv...

  • java web 学习

    servlet 的理解 servlet:java server applet 服务端小程序,它是JSP组件的前身,...

  • 深入理解Servlet

    深入理解Servlet 什么是Servlet 在Java web中Servlet是一种用来处理请求和发送响应的组件...

  • servlet 理解大全

    看完我的servlet大全希望你对servlet有个清晰的认识 JVM与编辑器对比 java拾荒 java创建的对...

  • Servlet的理解

    前言 好记性不如烂笔头,而且学习了却没有做笔记总结,就不算学习。因此写了一篇文章总结一下对 Servlet的理解。...

  • 深入理解Tomcat——Servlet容器(Container)

    深入理解Tomcat——Servlet容器 Servlet容器处理客户端的请求并填充response对象。Serv...

网友评论

    本文标题:理解Servlet

    本文链接:https://www.haomeiwen.com/subject/xroocxtx.html