Servlet学习4 -- Servlet一些细节

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/test1,http://localhost/BlogTest/test2,http://localhost/BlogTest/test3,http://localhost/BlogTest/test4,http://localhost/BlogTest/test5 时控制台都会输出Hello World!

    • 注解方式@WebServlet

      注解WebServlet的属性由以下几个:

      属性名 类型 描述
      name String Servlet的name属性,等价于 .若没有显示指定,则默认为类的全名(包括包名)
      value String[] 等价于urlPatterns,但是两个属性不能同时使用
      urlPatterns String[] 指定Servlet的URL匹配模式,等价于
      loadOnStartup int 指定servlet的加载顺序,等价于
      initParams WebInitParam[] 指定一组Servlet初始化参数,等价于
      asyncSupported boolean 声明Servlet是否支持异步模式,等价于
      description String Servlet的描述信息,等价于
      displayName String Servlet的显示名,等价于

      这里我们只关注两个:valueurlPatterns

      注意:

      1. 当配置一个映射时,默认的value是可以省略不写的,因此可以简写不用写上urlPatterns,就比如:@WebServlet("/test1")

      2. 当有多个映射时,此时value和urlPatterns不能同时使用,应该使用urlPatterns.

        如:@WebServlet(urlPatterns = {"/TestServlet", "/TestServlet2"})

      修改上述例子,改为使用注解配置多重映射,删除web.xml文件,修改Servlet为:

      @WebServlet(urlPatterns = {"/test1", "/test2", "/test3", "/test4", "/test5"})
      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);
          }
      }
      
      

      输出结果与上例一样。

  2. Servlet路径配置

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

    • *:表示任意字符
    • /* :表示可以使用任意的字符来访问当前的Servlet(就是/abc,/123,/aaaa都可以)
    • *.xxx:表示可以匹配扩展名为xxx的路径,比如*.jsp 则任意名字的.jsp都可以访问,aaa.jsp,123.jsp等
  3. 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()方法中定义,这样不会产生线程安全问题。

猜你喜欢

转载自www.cnblogs.com/LucasBlog/p/12790819.html
今日推荐