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的网址也进入了这个默认网页
所以这个方法能不用就不用