理解Servlet

搞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,稍带补充

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,107评论 19 139
  • 0 系列目录# WEB请求处理 WEB请求处理一:浏览器请求发起处理 WEB请求处理二:Nginx请求反向代理 本...
    七寸知架构阅读 14,763评论 22 189
  • 前言 这篇文章的出发点是为了整理Servlet相关知识点,以免在相关概念混淆或分不清的时候到处查阅资料。 一、什么...
    maxwellyue阅读 8,762评论 2 35
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,149评论 6 342
  • Servlet学习的大纲 servlet概念及相关接口简介 servet 执行过程 servlet映射路径 缺省s...
    奋斗的老王阅读 4,944评论 1 51

友情链接更多精彩内容