谁能解释一下 servlet 映射吗?

2024-05-09

我正在尝试使用 SpringMVC 编写一个 Web 应用程序。通常我只是将一些虚构的文件扩展名映射到 Spring 的前端控制器并快乐地生活,但这次我要使用类似 REST 的 URL,没有文件扩展名。

将我的上下文路径下的所有内容映射到前端控制器(我们称之为“app") 意味着我也应该处理静态文件,这是我不想做的事情(为什么要重新发明另一个 Weel?),所以与 tomcat 的默认 servlet 的一些组合(让我们称之为“tomcat”)似乎是一条出路。

我有工作做类似的事情

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

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>*.ext</url-pattern>
</servlet-mapping>

并对我的静态内容的每个文件扩展名重复后者。我只是想知道为什么以下设置(对我来说与上面的设置等效)不起作用。

<!-- failed attempt #1 -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>*.ext</url-pattern>
</servlet-mapping>

<!-- failed attempt #2 -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>tomcat</servlet-name>
  <url-pattern>/some-static-content-folder/*</url-pattern>
</servlet-mapping>

任何人都可以透露一些信息吗?


我想我可能知道发生了什么事。

在您的工作 web.xml 中,您已将 servlet 设置为默认 servlet(如果没有其他匹配项,/ 本身就是默认调用的 servlet),它将回答任何与另一个映射不匹配的请求。

在 Failed 1 中,您的 /* 映射确实看起来是有效的路径映射。通过 web.xml 中的 /* 映射,它可以响应除其他路径映射之外的所有请求。根据规范,扩展映射是被显式映射覆盖的隐式映射。这就是扩展映射失败的原因。一切都明确映射到应用程序。

在失败2中,App负责一切,除了与静态内容映射匹配的内容。为了展示我设置的快速测试中发生的情况。这是一个例子。/some-static-content-folder/包含test.png

尝试访问 test.png 我尝试过:

/some-static-content-folder/test.png

并且找不到该文件。然而尝试

/some-static-content-folder/some-static-content-folder/test.png

它出现了。因此,Tomcat 默认 servlet(至少 6.0.16)似乎删除了 servlet 映射,并尝试使用剩余路径查找该文件。根据这篇文章用于提供静态内容的 Servlet https://stackoverflow.com/questions/132052Jetty 给出了你和我所期待的行为。

是否有某种原因您无法执行诸如为其余调用映射根目录之类的操作。像应用程序映射到 /rest_root/* 这样的东西比你负责在rest_root文件夹中发生的任何事情,但其他任何地方都应该由Tomcat处理,除非你进行另一个显式映射。我建议将其余 Servlet 设置为路径映射,因为它可以更好地声明意图。使用 / 或 /* 似乎不合适,因为您必须找出例外情况。以 SO 为例,我的其余映射将类似于

/users/* 用于用户 servlet

/posts/* 用于 posts servlet

映射顺序

  1. 显式(路径映射)
  2. 隐式(扩展映射)
  3. 默认 (/)

请纠正我任何错误的地方。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谁能解释一下 servlet 映射吗? 的相关文章

随机推荐

  • 按下后退按钮时 SwiftUI 工具栏项目被剪裁

    我在 SwiftUI 中遇到了一种奇怪的行为 我似乎无法解决它 鉴于以下简单的示例应用程序 我遇到了这种行为 工具栏项目在初始运行时正确呈现 但导航离开并返回它会被剪切 重新创建此示例代码 内容视图 swift import SwiftUI
  • ImportError: pycurl: libcurl 链接时 ssl 后端 (schannel) 不包括编译时 ssl 后端 (openssl)

    导入 pycurl ImportError pycurl libcurl 链接时 ssl 后端 schannel 不包括编译时 ssl 后端 openssl 我的系统是Windows 10 我使用的是python 3 9 7 我使用 pyc
  • Haskell:找不到模块“Data.List.Split”

    我正在尝试在 Haskell 中拆分列表 据我所知 最简单的方法是splitOn 但是这个函数需要Data List Split 所以我尝试运行import Data List Split在前奏曲中 但是 我收到以下错误 Could not
  • 使用assertRaise测试异常消息

    我试图在函数内断言引发异常 其中条件引发自定义异常消息 功能 if not Cart objects filter member member count raise CartDoesNotExist Cart Does Not Exist
  • 安装 Sass 时出错(Ruby 2.5.0.1、MSYS2 20161025.0.0)

    我尝试安装 Sass 我安装了Ruby and MSYS2在此之前 来自所有人的最新消息巧克力味 https chocolatey org choco install ruby choco install msys2 看来它们已正确安装 r
  • Restlet 和 MULTIPART_FORM_DATA 或通过 Restlet 将文件放在 Google App Engine 上的其他方式

    我尝试通过 Restlet 接收文件 但只获得完整的 MULTIPART FORM DATA 如何提取我的特定文件 我找到了一些代码块 但它们的类型不可用 RESTlet 如何处理多部分 表单数据请求 https stackoverflow
  • 将固定装置传递给 pytest 中的测试类

    考虑以下伪代码来演示我的问题 import pytest pytest fixture def param1 return smth yield wilma pytest fixture def param2 return smth yie
  • 如何从应用程序内识别 heroku dyno 编号?

    有没有办法从应用程序中识别 heroku dyno 名称 例如 web 1 web 2 我希望能够生成一个唯一的请求 ID 例如 跟踪网络和工作测功机之间的请求 以统一记录整个请求堆栈 在我看来 测功机标识符将是一个不错的起点 如果这不能做
  • 从 UIImagePickerControllerReferenceURL 加载 UIImage

    我正在使用 UIImagePickerController 来允许用户从图像库中选择图像 然后我想在 sqlite 数据库中启动该文件的位置 以便稍后可以参考它 我一直在谷歌上搜索如何做到这一点 但我的结果相当简短 我知道我可以通过调用委托
  • 使用 jQuery 单击切换

    我使用了悬停功能 您可以在鼠标悬停时执行 x 操作 在鼠标移出时执行 y 操作 我正在尝试同样的点击 但它似乎不起作用 offer click function this find checkbox attr checked true fu
  • 提交和 onclick 不能一起工作

  • PDO 如何在执行 rollBack() 函数之前回滚查询?

    这是我的脚本 try dbh con gt beginTransaction stmt1 dbh conn gt prepare UPDATE activate account num SET num num 1 stmt1 gt exec
  • Hibernate 自定义架构创建

  • 如果你想在 datagridview 中显示图像,winform .net 最好的方法

    net web 开发人员 通常不制作任何 win32 应用程序 但现在我必须这样做 我有一个大约有 2000 个条目的列表 每个条目应显示为带有文本框的标签 另一个标签和图片 我用 flowlayoutpanel 做了这个 我对条目做了 f
  • 基于 MSVC 10 范围的 for 循环

    目前 在我们正在开发的一个大型 C 项目中 我们有一堆新样式的 for 循环 如下所示 for auto value values 到目前为止 我们一直只使用 gcc 4 6 进行编译 最近 一些代码库正在移植到 Windows 一些开发人
  • iOS 13.x 中的重复/自动反转动画

    以前在 swift 中你可以这样做 let animator UIViewPropertyAnimator duration 0 25 curve easeIn UIView setAnimationRepeatCount Float in
  • Antlr 处理异常

    我使用 Antlr 3 和 AST 树开发了一个复杂的语法 ANTLR 生成词法分析器和解析器 问题是 例如 当用户输入无效的语法时 该语法需要 用户没有输入此内容 然后在我的 Eclipse IDE 中出现以下异常 line 1 24 m
  • 配置 shiro.ini 以进行 JDBC 连接

    作为我新的一年学习新技术计划的一部分 我开始尝试使用 Apache Shiro 安全框架 我设法让基本示例正常工作 该示例将用户名 密码和角色存储在 shiro ini 文件中 但是当我修改 shiro ini 文件以使用 JDBC 时 它
  • MOQ'ing 方法调用顺序

    我正在模拟我们用于某些企业库调用的包装器 世界上一切都很好 我的测试通过了 实际的代码工作了 不过 我随后扩展了功能 并验证了所有测试仍然通过 宾果游戏 他们做到了 然而他们在现实世界中并没有这样做 因为人们期望 InitialiseDBC
  • 谁能解释一下 servlet 映射吗?

    我正在尝试使用 SpringMVC 编写一个 Web 应用程序 通常我只是将一些虚构的文件扩展名映射到 Spring 的前端控制器并快乐地生活 但这次我要使用类似 REST 的 URL 没有文件扩展名 将我的上下文路径下的所有内容映射到前端