JavaWeb——关于servlet种mapping地址映射的一些问题

6、Servlet

6.4、Mapping问题

  1. 一个Servlet可以指定一个映射路径

    xml 复制代码
    <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>/hello</url-pattern>
    </servlet-mapping>
  2. 一个Servlet可以指定多个映射路径

    xml 复制代码
    <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>/hello01</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>/hello02</url-pattern>
    </servlet-mapping>
  3. 一个Servlet可以指定通用映射路径(即使用通配符==*==)

    xml 复制代码
    <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>

    注意:如果什么都不写直接写==/,则会直接把index页面给挤掉,servlet优先级更高,因此请考虑好再使用/==的写法

  4. 指定一些后缀或者前缀等等

    xml 复制代码
    <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    此处用了后缀即,我们可以通过localhost:8080/javaweb-02-servlet/xxxxxx.do进入servlet页面(xxxxxx可以随便写)

    注意:*前面不能加映射的路径(如:/hello)

  5. 优先级问题:

    指定了固有的映射路径优先级最高,如果找不到就会走/*处理比如:

    xml 复制代码
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
    
      <!--注册Servlet-->
      <servlet>
        <servlet-name>hello</servlet-name>
        <!--全限定类名-->
        <servlet-class>com.xu.servlet.HelloServlet</servlet-class>
      </servlet>
      <servlet>
        <servlet-name>error</servlet-name>
        <servlet-class>com.xu.servlet.ErrorServlet</servlet-class>
      </servlet>
        
      <!--Servlet的注册(请求)路径-->
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
     <servlet-name>error</servlet-name>
        <url-pattern>/*</url-pattern>
      </servlet-mapping>
    </web-app>

    此处定义了两个servket,一个路径为/hello,一个路径为/ *。按理来说,/ *包含了/hello,但由于优先级问题,我们在网址栏输入/hello时,它会优先找/hello,如果找不到,再找/ *。

    注意:根据多次试错发现:servlet标签必须放一起,写完servlet之后再将对应的servlet-mapping写完,这样才能不报错。(一开始笔者写一个servlet,就写其对应的servlet-mapping,结果web-app报错了)

  6. 自己写一个404页面:

    • 创建一个ErrorServlet.java

      java 复制代码
      package com.xu.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.PrintWriter;
      
      public class ErrorServlet extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              // resp.setContentType("test/html");
              // resp.setCharacterEncoding("utf-8");
      
              resp.getWriter().writer.print("<h1>404</h1>");
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }

      这里为什么注释掉

      java 复制代码
          // resp.setContentType("test/html");
          // resp.setCharacterEncoding("utf-8");

      因为根据狂神说的视频,需要写上这两句来调整页面的字体布局,但是笔者在经历多次打不开页面而出现以下情况后:

      便开始排查问题,一开始是以为web.xml配置问题,但是经过几次调整后都没有解决,后来排查java文件是否出现问题,一开始以为自己少引入了包,后来修改doget后才恢复正常

    • 在web.xml配置多个servlet映射路径(这里有两个servlet,一个是hello,一个是404)

      xml 复制代码
      <!--注册Servlet-->
      <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.xu.servlet.HelloServlet</servlet-class>
      </servlet>
      <servlet>
        <servlet-name>error</servlet-name>
        <servlet-class>com.xu.servlet.ErrorServlet</servlet-class>
      </servlet>
      
      <!--Servlet的注册(请求)路径-->
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>error</servlet-name>
        <url-pattern>/*</url-pattern>
      </servlet-mapping>
相关推荐
露天赏雪3 分钟前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
天天被压力11 分钟前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python
天天被压力17 分钟前
【A股分钟级高频数据完全手册 #05】指数历史分钟数据接口:Pro版沪深指数分时回放
java·人工智能·python
captain37633 分钟前
▲统一功能——DispatcherServlet源码分析
java·spring·java-ee·log4j·maven
金銀銅鐵44 分钟前
JDK 21 中 List.of 的实现细节:从 List12 到 ListN
java·后端·ai编程
yeccheng2 小时前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
这个昵称不容易2 小时前
SpringBoot 读书笔记共享平台部署实战:97 个 Java 文件 / 113 个接口 / 10 张表
java·springboot·毕设
Nerd(BUG版)3 小时前
Flutter学习day5--事件手势与命中测试
学习·flutter
Nerd(BUG版)4 小时前
KMP学习day4--Kotlin空安全与泛型
学习·安全·kotlin
東隅已逝,桑榆非晚4 小时前
算法6. 双指针法-查找总价格为目标的两个商品
c++·学习·算法