Day40-Servlet原理、Mapping问题、ServletContext

本文介绍Servlet的工作原理,包括Servlet的调用流程、映射配置、ServletContext的使用及数据共享方式,并演示了请求转发和资源文件读取的具体实现。

Day40-Servlet原理、Mapping问题、ServletContext

Servlet原理

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

在这里插入图片描述

Mapping问题

  1. 一个Servlet可以指定一个映射路径
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

查看

在这里插入图片描述

  1. 一个Servlet可以指定多个映射路径
  <servlet-mapping>
    <servlet-name>helloxiaozhao</servlet-name>
    <url-pattern>/helloxiaozhao</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>helloxiaozhao</servlet-name>
    <url-pattern>/helloxiaozhao1</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>helloxiaozhao</servlet-name>
    <url-pattern>/helloxiaozhao2</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>helloxiaozhao</servlet-name>
    <url-pattern>/helloxiaozhao3</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>helloxiaozhao</servlet-name>
    <url-pattern>/helloxiaozhao4</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>helloxiaozhao</servlet-name>
    <url-pattern>/helloxiaozhao5</url-pattern>
  </servlet-mapping>

查看

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 一个Servlet可以指定通用映射路径
<!--默认请求路径-->  
<servlet-mapping>
    <servlet-name>helloxiaozhao</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

查看

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 指定一些后缀或者前缀等等…
  <!--可以自定义后缀实现请求映射-->
  <servlet-mapping>
    <servlet-name>helloxiaozhao</servlet-name>
    <url-pattern>*.xz</url-pattern>
  </servlet-mapping>

查看

在这里插入图片描述

在这里插入图片描述

  1. 优先级问题
  <!--注册Servlet-->
  <servlet>
    <servlet-name>helloxiaozhao</servlet-name>
    <servlet-class>com.xz.servlet.HelloServlet</servlet-class>
  </servlet>
  <!--Servlet的请求路径-->
  <servlet-mapping>
    <servlet-name>helloxiaozhao</servlet-name>
    <url-pattern>/helloxiaozhao</url-pattern>
  </servlet-mapping>
  <!--404页面-->
  <servlet>
    <servlet-name>error</servlet-name>
    <servlet-class>com.xz.servlet.ErrorServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>error</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

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

查看

在这里插入图片描述

默认处理请求(自定义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("已存放用户名");
    }

​ 获取数据的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);
    }
}

查看

  • 未拿到数据

在这里插入图片描述

  • 存放数据

在这里插入图片描述

  • 再次运行

在这里插入图片描述

获取初始化参数

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);
    }
}

web.xml配置

    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql//localhost:3306/mybatis</param-value>
    </context-param>
    <servlet>
        <servlet-name>gp</servlet-name>
        <servlet-class>com.xz.servlet.ServletDemo03</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>gp</servlet-name>
        <url-pattern>/gp</url-pattern>
    </servlet-mapping>

测试

在这里插入图片描述

请求转发

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);
    }
}

web.xml

    <servlet>
        <servlet-name>sd4</servlet-name>
        <servlet-class>com.xz.servlet.ServletDemo04</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>sd4</servlet-name>
        <url-pattern>/sd4</url-pattern>
    </servlet-mapping>

测试

在这里插入图片描述

路径没有变化

读取资源文件

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);
    }

db.properties

username=root
password=123456

web.xml

    <servlet>
        <servlet-name>sd5</servlet-name>
        <servlet-class>com.xz.servlet.ServletDemo05</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>sd5</servlet-name>
        <url-pattern>/sd5</url-pattern>
    </servlet-mapping>

测试

在这里插入图片描述

<?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"> <display-name></display-name> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.mp3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.mp4</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ttf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.woff</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.woff2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ppt</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.doc</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.docx</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xls</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xlsx</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.zip</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.rar</url-pattern> </servlet-mapping> <filter> <filter-name>Set Character Encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>wangzhan/index.jsp</welcome-file> </welcome-file-list> </web-app>
最新发布
09-09
在Spring MVC中,`web.xml`文件主要用于配置欢迎页、servlet、filter、listener等以及定制servlet、JSP、Context初始化参数,是Web应用的重要配置文件,以下是一段典型的Spring MVC的`web.xml`配置示例及其含义: ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <!-- 配置Spring IOC容器需要读取的定义了非web层的Bean(DAO/Service)的XML文件路径 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!-- 配置Spring的监听器,用于启动Spring的IOC容器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置Spring MVC的DispatcherServlet --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- 映射DispatcherServlet的请求路径 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> ``` 下面详细解释各部分的含义和作用: - **`<context-param>`**:配置`contextConfigLocation`初始化参数,指定Spring IOC容器需要读取的定义了非web层的Bean(DAO/Service)的XML文件路径,可以指定多个XML文件路径,用逗号、冒号等分隔[^3]。 - **`<listener>`**:配置Spring的监听器`ContextLoaderListener`,用于启动Spring的IOC容器,在Web应用启动时自动加载Spring的配置文件,创建并管理Spring的IOC容器。 - **`<servlet>`**:配置Spring MVC的核心控制器`DispatcherServlet`,`servlet-name`是Servlet的名称,`servlet-class`指定Servlet的类名,`init-param`用于配置Servlet的初始化参数,这里指定了Spring MVC的配置文件路径,`load-on-startup`表示Servlet的加载顺序,值越小越先加载。 - **`<servlet-mapping>`**:将`DispatcherServlet`映射到指定的请求路径,这里将所有请求都交给`DispatcherServlet`处理。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值