• Day40-Servlet原理、Mapping问题、ServletContext


    Day40-Servlet原理、Mapping问题、ServletContext

    Servlet原理

    Servlet是由Web服务器调用,web服务器在收到浏览器请求之后

    在这里插入图片描述

    Mapping问题

    1. 一个Servlet可以指定一个映射路径
      <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>/hellourl-pattern>
      servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4

    查看

    在这里插入图片描述

    1. 一个Servlet可以指定多个映射路径
      <servlet-mapping>
        <servlet-name>helloxiaozhaoservlet-name>
        <url-pattern>/helloxiaozhaourl-pattern>
      servlet-mapping>
      <servlet-mapping>
        <servlet-name>helloxiaozhaoservlet-name>
        <url-pattern>/helloxiaozhao1url-pattern>
      servlet-mapping>
      <servlet-mapping>
        <servlet-name>helloxiaozhaoservlet-name>
        <url-pattern>/helloxiaozhao2url-pattern>
      servlet-mapping>
      <servlet-mapping>
        <servlet-name>helloxiaozhaoservlet-name>
        <url-pattern>/helloxiaozhao3url-pattern>
      servlet-mapping>
      <servlet-mapping>
        <servlet-name>helloxiaozhaoservlet-name>
        <url-pattern>/helloxiaozhao4url-pattern>
      servlet-mapping>
      <servlet-mapping>
        <servlet-name>helloxiaozhaoservlet-name>
        <url-pattern>/helloxiaozhao5url-pattern>
      servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    查看

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    1. 一个Servlet可以指定通用映射路径
      
    <servlet-mapping>
        <servlet-name>helloxiaozhaoservlet-name>
        <url-pattern>/*url-pattern>
    servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    1. 指定一些后缀或者前缀等等…
      
      <servlet-mapping>
        <servlet-name>helloxiaozhaoservlet-name>
        <url-pattern>*.xzurl-pattern>
      servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看

    在这里插入图片描述

    在这里插入图片描述

    1. 优先级问题
      
      <servlet>
        <servlet-name>helloxiaozhaoservlet-name>
        <servlet-class>com.xz.servlet.HelloServletservlet-class>
      servlet>
      
      <servlet-mapping>
        <servlet-name>helloxiaozhaoservlet-name>
        <url-pattern>/helloxiaozhaourl-pattern>
      servlet-mapping>
      
      <servlet>
        <servlet-name>errorservlet-name>
        <servlet-class>com.xz.servlet.ErrorServletservlet-class>
      servlet>
      <servlet-mapping>
        <servlet-name>errorservlet-name>
        <url-pattern>/*url-pattern>
      servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求

    查看

    在这里插入图片描述

    默认处理请求(自定义404)

    在这里插入图片描述

    ServletContext

    web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用。

    共享数据

    我在这个Servlet中保存的数据,可以在另一个servlet中拿到

    package com.xz.servlet;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    /**
     * @author 小龚
     * @create 2022-08-30 18:11
     */
    public class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //this.getInitParameter()初始化参数
            //this.getServletConfig()Servlet配置
            //this.getServletContext()Servlet上下文
            ServletContext context = this.getServletContext();
    
            String username = "小赵";//数据
            context.setAttribute("username",username);//将一个数据保存在了ServletContext中,名字为username,值为username(object)
            resp.setContentType("text/html");
            resp.setCharacterEncoding("utf-8");
            PrintWriter out = resp.getWriter();
            out.print("已存放用户名");
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    ​ 获取数据的Servlet

    package com.xz.servlet;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @author 小龚
     * @create 2022-08-30 22:11
     */
    public class GetServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context = this.getServletContext();
            String username = (String) context.getAttribute("username");//需要强转
    
            resp.setContentType("text/html");
            resp.setCharacterEncoding("utf-8");
            resp.getWriter().print("用户名:"+username);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    查看

    • 未拿到数据

    在这里插入图片描述

    • 存放数据

    在这里插入图片描述

    • 再次运行

    在这里插入图片描述

    获取初始化参数

    ServletDemo03

    package com.xz.servlet;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @author 小龚
     * @create 2022-08-30 22:50
     */
    public class ServletDemo03 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context = this.getServletContext();
            String url = context.getInitParameter("url");
            resp.setContentType("text/html");
            resp.setCharacterEncoding("utf-8");
            resp.getWriter().print(url);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    web.xml配置

        <context-param>
            <param-name>urlparam-name>
            <param-value>jdbc:mysql//localhost:3306/mybatisparam-value>
        context-param>
        <servlet>
            <servlet-name>gpservlet-name>
            <servlet-class>com.xz.servlet.ServletDemo03servlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>gpservlet-name>
            <url-pattern>/gpurl-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    测试

    在这里插入图片描述

    请求转发

    ServletDemo04

    package com.xz.servlet;
    
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    /**
     * @author 小龚
     * @create 2022-08-30 23:18
     */
    public class ServletDemo04 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context = this.getServletContext();
            //请求转发
            //RequestDispatcher rc = context.getRequestDispatcher("/gp");//转发的请求路径
            //rc.forward(req,resp);//调用forward方法实现请求转发
            //以上两句合并成一句
            context.getRequestDispatcher("/gp").forward(req,resp);
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    web.xml

        <servlet>
            <servlet-name>sd4servlet-name>
            <servlet-class>com.xz.servlet.ServletDemo04servlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>sd4servlet-name>
            <url-pattern>/sd4url-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    测试

    在这里插入图片描述

    路径没有变化

    读取资源文件

    Properties类

    • 在java目录下新建properties(需要在注意资源导出失败问题)
    • 在resources目录下新建properties

    发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classPath

    读取配置文件

    ServletDemo05

    package com.xz.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    
    /**
     * @author 小龚
     * @create 2022-08-30 23:55
     */
    public class ServletDemo05 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
            Properties pp= new Properties();
            pp.load(is);
            String username = pp.getProperty("username");
            String password = pp.getProperty("password");
            resp.setContentType("text/html");
            resp.getWriter().print(username+";"+password);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    db.properties

    username=root
    password=123456
    
    • 1
    • 2

    web.xml

        <servlet>
            <servlet-name>sd5servlet-name>
            <servlet-class>com.xz.servlet.ServletDemo05servlet-class>
        servlet>
        <servlet-mapping>
            <servlet-name>sd5servlet-name>
            <url-pattern>/sd5url-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    测试

    在这里插入图片描述

  • 相关阅读:
    什么是神经网络?
    推荐系统之简单线性回归
    理解编码器M法/T法M\T法转速测量原理
    【花雕体验】14 行空板pinpong库测试外接传感器模块(之一)
    upload-labs通关
    Docker部署微服务项目
    千亿IT运维市场,产品要凭实力说话
    torchscript相关知识介绍(二)
    经纬恒润汽车电子研发新成果亮相重庆智博会
    西瓜书-2.4模型评估与选择
  • 原文地址:https://blog.csdn.net/GHY0911/article/details/126615480