美文网首页
Servlet学习4 -- Servlet一些细节

Servlet学习4 -- Servlet一些细节

作者: 张氏小毛驴 | 来源:发表于2022-04-12 16:14 被阅读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!

    • 注解方式@WebServlet

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

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

      这里我们只关注两个: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);
          }
      }
      
      

      输出结果与上例一样。

    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()方法中定义,这样不会产生线程安全问题。

    相关文章

      网友评论

          本文标题:Servlet学习4 -- Servlet一些细节

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