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


    6、Servlet

    6.4、Mapping问题

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

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

      <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>/hello01url-pattern>
      servlet-mapping>
      <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>/hello02url-pattern>
      servlet-mapping>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    3. 一个Servlet可以指定通用映射路径(即使用通配符==*==)

      <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>/hello/*url-pattern>
      servlet-mapping>
      
      • 1
      • 2
      • 3
      • 4

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

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

      <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>*.dourl-pattern>
      servlet-mapping>
      
      • 1
      • 2
      • 3
      • 4

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

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

    5. 优先级问题:

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

      <web-app>
        <display-name>Archetype Created Web Applicationdisplay-name>
      
        
        <servlet>
          <servlet-name>helloservlet-name>
          
          <servlet-class>com.xu.servlet.HelloServletservlet-class>
        servlet>
        <servlet>
          <servlet-name>errorservlet-name>
          <servlet-class>com.xu.servlet.ErrorServletservlet-class>
        servlet>
          
        
        <servlet-mapping>
          <servlet-name>helloservlet-name>
          <url-pattern>/hellourl-pattern>
        servlet-mapping>
        <servlet-mapping>
       <servlet-name>errorservlet-name>
          <url-pattern>/*url-pattern>
        servlet-mapping>
      web-app>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24

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

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

    6. 自己写一个404页面:

      • 创建一个ErrorServlet.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("

        404

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

        这里为什么注释掉

            // resp.setContentType("test/html");
            // resp.setCharacterEncoding("utf-8");
        
        • 1
        • 2

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

        在这里插入图片描述

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

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

        
        <servlet>
          <servlet-name>helloservlet-name>
          <servlet-class>com.xu.servlet.HelloServletservlet-class>
        servlet>
        <servlet>
          <servlet-name>errorservlet-name>
          <servlet-class>com.xu.servlet.ErrorServletservlet-class>
        servlet>
        
        
        <servlet-mapping>
          <servlet-name>helloservlet-name>
          <url-pattern>/hellourl-pattern>
        servlet-mapping>
        <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
  • 相关阅读:
    k8s kubeadm配置
    Faust勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
    美团校招机试 - 小美的MT(20240309-T3)
    【网页】腾讯云轻量应用服务器搭建网站
    GO 比较两个对象是否相同
    Android 在自己的项目中接入OpenCV+YOLOv8+NCNN : 实现人像分割
    【SpringCloud微服务项目学习-mall4cloud项目(1)】——环境部署,构建与运行
    Unity中Shader的变体shader_feature
    指针和数组试题解析(5)二维数组部分
    通过小程序实现会议Oa主界面
  • 原文地址:https://blog.csdn.net/whale_cat/article/details/134065935