博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2014-1-6_Servlet路径和配置那些事儿
阅读量:6637 次
发布时间:2019-06-25

本文共 2498 字,大约阅读时间需要 8 分钟。

关于JavaWeb开发的Servlet中,有这样几个函数很绕人:

String RequestURI=req.getRequestURI();

String ServletPath =req.getServletPath();

String ContextPath=req.getContextPath();

String PathInfo=req.getPathInfo();

它们有着怎样的对应关系呢?

RequestURI = ContextPath  + ServletPath + PathInfo;

假如有一个WEB项目部署在Tomcat中,项目名称为TestWeb,我们配置了如下的Servlet:

<servlet-mapping>

<servlet-name>BgMainServlet</servlet-name>

<url-pattern>/back/*</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>ActionHandleServlet</servlet-name>

<url-pattern>*.action</url-pattern>

</servlet-mapping>

<servlet-mapping>

<servlet-name>CustomerServlet</servlet-name>

<url-pattern>/back/list.action</url-pattern>

</servlet-mapping>

在了解路径之前,我们先要了解Servlet的匹配规则,一共有三种:

1、精确匹配,例如

<servlet-mapping>

<servlet-name>CustomerServlet</servlet-name>

<url-pattern>/back/list.action</url-pattern>

</servlet-mapping>

2、路径匹配,例如

<servlet-mapping>

<servlet-name>BgMainServlet</servlet-name>

<url-pattern>/back/*</url-pattern>

</servlet-mapping>

3、后缀名匹配,例如

<servlet-mapping>

<servlet-name>ActionHandleServlet</servlet-name>

<url-pattern>*.action</url-pattern>

</servlet-mapping>

 其匹配优先级为:精确匹配》路径匹配》后缀名匹配

如果访问链接是

匹配的是BgMainServlet

如果访问链接是

尽管/back/*/back/list.action都符合规则,根据 精确匹配》路径匹配,匹配到CustomerServlet

如果访问链接是

尽管*.actiont/back/*都符合规则,根据 路径匹配》后缀名匹配 ,匹配到BgMainServlet

在一个访问链接中,一个URL一共有如下几个部分:

URL=协议类型+主机名+端口号+文件+参数

每个部分之间都有间隔符号将他们区分

连接部分

间隔符号

协议类型 -   主机名

://

主机名   -   端口号

:

端口号   -   文件

/

路径     -   参数

?

比如

协议类型

http

主机名

localhost

端口号

8983

文件

/TestWeb/back/aa/bb/

参数

s=123

为例

在Sertlet中函数及对应关系为

Request类中的函数

返回结果

案例URL的值

getRequestURI()

URL的文件部分

/TestWeb/back/aa/bb/

getContextPath();

项目名称

/TestWeb

getServletPath();

匹配的servlet

/back

getPathInfo();

URL中Servlet后的实际请求路径

/aa/bb/list.do

最终得出结论:RequestURI= ContextPath+ ServletPath + PathInfo;

弄清楚了上面的关系,还有几点是需要注意的。

1、所有Servlet的url-pattern都是从ContextPath后面开始匹配的。

2、每一次请求,只会匹配一个Servlet。

到这里就有一些好玩儿的东西了。我们如何用Servlet来实现Filter的功能呢?

答案:

用Request.getRequestDispatcher(url).forward(request, response);

进行请求的转发。

这里的url可以使用相对路径。

如果在BgMainServletdoGet方法如下:

protectedvoid doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

request.getRequestDispatcher("/back/aa/")

.forward(request, response);

//或者用

//request.getSession().getServletContext()

//.getRequestDispatcher("/TestWeb/back/aa/")

//.forward(request, response);

}

那么我们将请求转到的实际url

http://localhost:8983/TestWeb/back/aa/

这个url会继续匹配Servlet,而且匹配到的ServletBgMainServlet

这样的话,就变成了一个死循环。

我们只要结合web.xml改变重定向的url就可以在Servlet中实现类似于Filter的功能,是不是很酷?

参考文章:

转载地址:http://esivo.baihongyu.com/

你可能感兴趣的文章
HTML_HTML5基础
查看>>
VB 编程
查看>>
php 获取ip
查看>>
spring整合mybatis使用<context:property-placeholder>时的坑
查看>>
洛谷P1162 填涂颜色 解题报告
查看>>
计算图片的宽和高 动态设置图片的位置
查看>>
从校招网申看华为
查看>>
接口测试
查看>>
C#网络编程(订立协议和发送文件) - Part.4
查看>>
计算 1!+2!+...+n!
查看>>
开始Flask项目
查看>>
BAE WebApp开发 [0]——基于移动BAE平台开发的WebApp的演示
查看>>
SpringBoot与docker
查看>>
LeetCode 680: Valid Palindromes
查看>>
He angrily answer MBT Tunisha
查看>>
SpringBoot 监控管理模块actuator没有权限的问题
查看>>
L国的战斗之伞兵
查看>>
Academic Map UI Re-Design
查看>>
[HDU]2202最大三角形、3934Summer holiday
查看>>
[导入]wap!delphi能做到!―― 应用于移动电话的WML(Wireless Markup Language)开发
查看>>