Mapping问题之映射路径问题★★★★★

声明

本文部分内容参考自其他作者原创文章,仅供个人学习留档,特此声明

参考文章链接

(1条消息) B站---【狂神说Java】JavaWeb入门到实战---笔记_夜里的雨的博客-CSDN博客_狂神说java笔记

映射路径问题

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

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

2.一个servlet可以指定多个映射路径

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello2</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello3</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello4</url-pattern>
</servlet-mapping>

在地址栏输入 localhost:8080/servlet-001/hello1(2,3,4) 都会访问到 servlet-001 这个文件夹下的我们自己写的class程序(HelloServlet)

测试一下


3.一个servlet可以指定通用映射路径

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello/*</url-pattern>
</servlet-mapping>

在地址栏输入 localhost:8080/servlet-001/hello/任意内容 都会访问到 servlet-001 这个文件夹下的我们自己写的class程序(HelloServlet),这个任意内容可以为空,也就是说我输入localhost:8080/servlet-001/hello 也是可以访问成功的

测试一下


4.默认请求路径(尽量不用)

<!--默认请求路径(尽量不要这样写)-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

在地址栏输入 localhost:8080/servlet-001/任意内容 包括 localhost:8080/servlet-001都会访问到 servlet-001 这个文件夹下的我们自己写的class程序(HelloServlet)

如上图所示,此时我们就没法访问到index.jsp的内容了

所以尽量不要这么写


5.指定一些后缀或者前缀(加前缀存疑)

  • 指定路径后缀.xypersonal

    ==注意, 前边不能加项目映射的路径==*

    错误示例

    <servlet-mapping>
    	<servlet-name>hello</servlet-name>
        <url-pattern>/*.xypersonal</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
    	<servlet-name>hello</servlet-name>
        <url-pattern>/hello/*.xypersonal</url-pattern>
    </servlet-mapping>
    

    正确示例

    <servlet-mapping>
    	<servlet-name>hello</servlet-name>
        <url-pattern>*.xypersonal</url-pattern>
    </servlet-mapping>
    

    如下图所示,访问成功

  • 指定前缀为 xypersonal.

    <servlet-mapping>
    	<servlet-name>hello</servlet-name>
        <url-pattern>/xypersonal.*</url-pattern>
    </servlet-mapping>
    

    如下图所示失败了

    但是这样就成功访问到了,为什么呢?

    经过测试,所谓的加前缀必须指定固定映射路径,因为 . 和 * 一块用时 * 就不是通配符了

    也许以后随着学习理解的加深,会有更好的处理办法吧

    mark~


6.优先级问题(尽量不用)

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

  • 先写一个错误处理类,当输入的网址不是我们提前指定的映射路径时就走这个类

    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;
    
    /**
     ErrorServlet类用于解决 404 not found 问题
     原理就是mapping问题中的优先级问题
     指定的固有的映射路径优先级最高,如果找不到就会走默认的处理请求;
     */
    
    public class ErrorServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html");
            resp.setCharacterEncoding("utf-8");
            PrintWriter writer = resp.getWriter();
            writer.print("<h1>404<h1>");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
  • 在web.xml中为新写的servlet程序注册映射路径

    <servlet>
        <servlet-name>Error</servlet-name>
        <servlet-class>com.xy.servlet.ErrorServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Error</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    
  • 测试:

    只要输入的网址不是我们指定的固定的映射路径,就会走我们提前写好的ErrorServlet

    • 输入正确路径

    • 输入错误路径

但是这样就存在一个很明显的问题:默认请求路径把index.jsp给覆盖掉了,我们现在进不去index.jsp网页了

如下图所示,输入index.jsp的网址也进入了这个默认网页

所以这个方法能不用就不用

posted @ 2022-05-24 16:44  无关风月7707  阅读(175)  评论(0)    收藏  举报