Servlet学习4 -- Servlet一些细节

2022-04-12  本文已影响0人  张氏小毛驴

Servlet的一些小细节

  1. Servlet可以多重映射

    多重映射是指:同一个Servlet可以被映射成多个路径,客户端有多个路径可以访问同一个Servlet。

    对于Servlet的映射,有两种方式:(Servlet3.0开始支持注解方式)

    • web.xml文件配置

      配置多个<servlet-mapping>,指定<url-pattern>

      比如:创建一个Servlet,使用web.xml配置,相关文件如下:

      public class TestServlet extends HttpServlet {
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              System.out.println("Hello World!");
          }
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              doPost(request, response);
          }
      }
      
      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
               version="3.1">
      
      
          <!--配置Servlet -->
          <servlet>
              <servlet-name>TestServlet</servlet-name>
              <servlet-class>com.zzy.web.TestServlet</servlet-class>
          </servlet>
      
          <servlet-mapping>
              <servlet-name>TestServlet</servlet-name>
              <url-pattern>/test1</url-pattern>
              <url-pattern>/test2</url-pattern>
              <url-pattern>/test3</url-pattern>
          </servlet-mapping>
      
          <servlet-mapping>
              <servlet-name>TestServlet</servlet-name>
              <url-pattern>/test4</url-pattern>
              <url-pattern>/test5</url-pattern>
          </servlet-mapping>
          
      </web-app>
      

      当访问http://localhost/BlogTest/test1http://localhost/BlogTest/test2http://localhost/BlogTest/test3http://localhost/BlogTest/test4http://localhost/BlogTest/test5 时控制台都会输出Hello World!

  1. Servlet路径配置

    Servlet支持使用通配符*配置路径。

    • *:表示任意字符
    • /* :表示可以使用任意的字符来访问当前的Servlet(就是/abc,/123,/aaaa都可以)
    • *.xxx:表示可以匹配扩展名为xxx的路径,比如*.jsp 则任意名字的.jsp都可以访问,aaa.jsp,123.jsp等
  2. Servlet是单例的(学习博文:https://mp.weixin.qq.com/s/dCPSPqxTTY3SBwUTm3xuKA

    1. 为什么Servlet是单例的。

      浏览器多次对Servlet请求,一般情况下,服务器只创建一个Servlet对象。

      也就是说,Servlet对象一旦创建了是常驻内存中的,持续为请求做服务,直到服务器关闭。

    2. 每次访问request对象和response对象都是新的。

      对于每一个访问请求,Servlet都会创建一个新的HttpServletRequest对象和HttpServletResponse对象

      然后将这两个对象作为参数传递给调用的Servlet的service()方法,service方法再根据请求方式去调用相关的doGet方法或doPost方法等。

    3. 线程安全问题

      当多个用户访问Servlet时,服务器会为每一个用户创建一个线程,当多个用户并发访问Servlet共享资源时候就可能产生线程安全问题了。

      线程安全问题原则是:

      • 如果一个变量需要被多个用户共享,则应在访问该变量时,使用同步机制synchronize(对象) {}
      • 如果一个变量不需要共享,则直接在相关的doGet()或doPost()方法中定义,这样不会产生线程安全问题。
上一篇下一篇

猜你喜欢

热点阅读