zoukankan      html  css  js  c++  java
  • [Servlet]深入掌握Servlet

    Servlet的线程安全

    在Servlet的整个生命周期中,构造方法只被执行一次。也就是说,在Servlet的整个生命周期中,只存在一个Servlet实例对象。这说明Servlet是单例多线程的,可能会引起线程安全问题。

    所谓线程安全就是一个Servlet实例对象会同时处理多个请求,这样的Servlet工作效率的确很高。但如果Servlet中包含成员变量的话,可能一个线程对该成员变量进行写操作,而另一个线程对该成员变量进行读操作。所以,单例多线程的Servlet不能创建成员变量。

    服务器启动创建Servlet

    通过之前的测试操作,我们发现Servlet并不是在Tomcat服务器启动时创建实例对象,而是在第一次请求之后才一并创建实例对象、初始化并处理逻辑的。Servlet又是单例的,在整个生命周期中只创建一个Servlet实例对象。如果可以在Tomcat服务器启动时,进行创建实例对象并完成初始化工作,在请求之后只调用service()方法处理请求逻辑即可。

    可以在web.xml配置文件增加相关配置即可,具体增加内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <servlet>
        <servlet-name>LifeServlet</servlet-name>
        <servlet-class>app.java.servlet.LifeServlet</servlet-class>
        <!-- 
            load-on-startup标签:配置当前Servlet在启动时创建实例对象
             * 标签中的数字,表示级别(0-9级),一般设置为0即可.
         -->
        <load-on-startup>0</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>LifeServlet</servlet-name>
        <url-pattern>/servlet/LifeServlet</url-pattern>
      </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    

    增加配置信息之后,重新启动Tomcat服务器,查看控制台信息如下:

    这里写图片描述

    通过查看控制台打印的信息,可以看出在启动Tomcat服务器时,已经创建并初始化了Servlet实例对象。

    url-pattern的三种配置

    在web.xml配置文件中配置有关Servlet的时候,标签是用于配置当前Servlet拦截的路径,也就是说,客户端浏览器访问标签配置的路径才能访问对应Servlet内容。

    关于拦截路径的配置方式其实有三种方式:

    • 完全路径匹配:是以“/”开始,路径中间不能包含通配符“*”,例如:/firstServclet,表示访问路径为http://localhost:8080/08_servlet/firstServlet
    • 目录匹配:是以“/”开始,以“/”结尾的,例如:/firstServlet/,表示访问路径为http://localhost:8080/08_servlet/firstServlet路径下任意内容。
    • 扩展名匹配:是以“”开始,不能以“/”开始,以“.xxx”结尾,例如:.do,表示访问路径为所有扩展名为“.do”的路径。

    值得注意的问题:

    • 在一个标签中,可以配置多个标签。也就是说,一个Servlet可以拦截多个不同路径的访问。
    • 上述三种配置路径方式具有优先级:完全路径匹配 -> 目录匹配 -> 扩展名匹配。

    下面通过一些测试,来看看路径配置的三种方式:

    • 如下有一些映射关系:
      • Servlet1 映射到 /abc/*
      • Servlet2 映射到 /*
      • Servlet3 映射到 /abc
      • Servlet4 映射到 *.do
    • 问题:
      • 当请求URL为“/abc/a.html”,“/abc/”和“/”都匹配,哪个servlet响应?Servlet1
      • 当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应?Servlet3
      • 当请求URL为“/abc/a.do”时,“/abc/”和“.do”都匹配,哪个servlet响应?Servlet1
      • 当请求URL为“/a.do”时,“/”和“.do”都匹配,哪个servlet响应?Servlet2
      • 当请求URL为“/xxx/yyy/a.do”时,“/”和“.do”都匹配,哪个servlet响应?Servlet2

    如果客户端浏览器请求的路径是错误时,页面会显示404错误内容。这是因为所有发布到Tomcat服务器的Web应用程序的web.xml文件都继承了Tomcat服务器安装目录中conf目录中的web.xml文件。当访问路径是错误的,或者对应Servlet没有配置,实际上会执行Tomcat服务器中的web.xml的相关配置,具体内容如下:

    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    

    转载说明:请注明作者及原文链接,谢谢!

  • 相关阅读:
    剑指offer---二叉搜索树的第k个结点
    剑指offer---把数组排成最小的数
    剑指offer---连续子数组的最大和
    剑指offer---最小的K个数
    Navicat for MySQL(Ubuntu)过期解决方法
    Ubuntu 无法应用原保存的显示器配置
    ubuntu 18.04 install gitlab-ce
    Flask 使用过程
    python版本 3.7.4rc1 (stable) / 3.8.0b1 (pre-release) / 3.9.0a0 (in development)
    Windows10 and MySQL使用
  • 原文地址:https://www.cnblogs.com/longestory/p/4566970.html
Copyright © 2011-2022 走看看