有人可以解释一下Servlet映射吗?

14 浏览
0 Comments

有人可以解释一下Servlet映射吗?

我正在尝试使用SpringMVC编写一个web应用程序。通常我会将一些虚构的文件扩展名映射到Spring的前端控制器上,并且过得很开心,但这次我想要使用类似REST的URL,不带文件名扩展名。\n将我的上下文路径下的所有内容都映射到前端控制器(我们称之为“app”)意味着我还应该处理静态文件,这是我不愿意做的事情(为什么要重新发明轮子?),所以与tomcat的默认servlet(我们称之为“tomcat”)结合起来似乎是更好的方法。\n我通过以下方式使它工作起来:\n


  app
  /


  tomcat
  *.ext

\n然后为我的静态内容的每个文件扩展名重复上述操作。我只是想知道为什么下面的设置,对我来说与上面的设置是等价的,但却不起作用。\n



  app
  /*


  tomcat
  *.ext



  app
  /


  tomcat
  /some-static-content-folder/*

\n有人可以给予一些解释吗?

0
0 Comments

有人提出了一个关于servlet映射的问题,他对于将servlet映射到"/*"这样的路径表示方式产生了疑问。虽然他从未尝试过这样的映射方式,但他认为"/*"既以"/"开头又以"/*"结尾,尽管两个匹配项使用了相同的字符。

这个问题的出现原因可能是该用户对servlet映射的规则不够了解,他可能希望得到对于这种映射方式的解释和验证。他可能认为以"/"开头和以"/*"结尾的路径应该是不同的,因为这两个字符是不一样的。

解决这个问题的方法可能是提供有关servlet映射规则的详细说明,以便用户能够理解为什么"/*"可以作为一个有效的映射路径。可以解释"/*"表示匹配所有请求路径的意思,而不是以"/"开头和以"/*"结尾的路径。

这样的解释可以通过以下方式进行:

@WebServlet("/*")
public class MyServlet extends HttpServlet {
    // Servlet implementation
}

在上述代码中,使用了"/*"作为一个有效的servlet映射路径,这意味着该servlet将匹配所有的请求路径。这是因为"/*"表示通配符,它可以匹配任何路径。

希望这样的解释能够帮助用户理解servlet映射规则,并解决他对于"/*"映射方式的疑问。

0
0 Comments

servlet映射问题的出现是因为Tomcat的一个bug,在版本6.0.29中得到了修复。

修复方法如下所示:

<!-- Correct for Tomcat >= 6.0.29 or other Servlet containers -->
<servlet-mapping>
  <servlet-name>app</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>/some-static-content-folder/*</url-pattern>
</servlet-mapping>

0
0 Comments

有人可以解释一下Servlet映射吗?

在你的工作web.xml中,你将servlet设置为默认servlet(/本身是默认servlet,如果没有其他匹配,它将响应任何请求),它将回答任何不匹配其他映射的请求。

在“失败1”中,你的/*映射似乎是一个有效的路径映射。在web.xml中,/*映射回答除其他路径映射之外的所有请求。根据规范,扩展映射是被显式映射覆盖的隐式映射。这就是为什么扩展映射失败的原因。所有内容都被显式映射到了app。

在“失败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 for serving static content,Jetty给出了你和我期望的行为。

有没有什么原因你不能做一些像为你的rest调用映射一个根目录的事情。类似将app映射到/rest_root/*,然后你需要负责rest_root文件夹中发生的任何事情,但其他任何地方都应该由Tomcat处理,除非你进行另一个显式映射。我建议将你的rest servlet设置为一个路径映射,因为它更好地声明了意图。使用/或/*似乎不合适,因为你必须映射出例外情况。以SO为例,我的rest映射将是这样的:

/users/* 用于用户servlet

/posts/* 用于帖子servlet

映射顺序

1. 显式映射(路径映射)

2. 隐式映射(扩展映射)

3. 默认映射(/)

请纠正我说错的任何内容。

对于“失败尝试#1”的解释是准确的。还是弄不明白另一个。

如果/*已经映射到“app”servlet,那么从映射“/”中获得什么好处呢?

如果使用/*映射,映射/就不会被调用,所以没有从映射/中获得任何好处。与此相比,/*的缺点是你将需要处理所有内容,而使用/仍然可以设置扩展映射。

好吧,我试图理解你对第2种情况的解释。至于你的问题,没有特殊原因不创建/rest_root/*映射,只是个人喜好。听起来比与默认和扩展映射斗争要简单一些。:-)

我再编辑一次。在看到另一篇帖子后,我几乎弄清楚了第2种情况的原因。

我变得有点疯狂意识到Servlet不支持像'/myAppModules/*/Services/*'这样的通配符。我可以想到许多其他服务器可以处理这个问题,但Servlet却不能。有趣的是,业余级的WAMP可以做到,但“企业级”的Servlet却不能。

我还没有研究过,但Jersey(jersey.java.net)应该可以更容易地构建REST映射。似乎找不到适用于Java的Rails Routes风格的分发器。

0