为啥我们需要一个 servlet 名称?

Posted

技术标签:

【中文标题】为啥我们需要一个 servlet 名称?【英文标题】:Why do we need a servlet name?为什么我们需要一个 servlet 名称? 【发布时间】:2013-12-03 03:28:43 【问题描述】:

我一直在阅读Head First JSP 和 Servlet,我看到web.xml

  <!-- To name the servlet -->
  <servlet>                                    
    <servlet-name>ServletName</servlet-name>
    <servlet-class>packy.FirstServlet</servlet-class>
  </servlet>

  <!-- For URL's to map to the correct servlet -->
  <servlet-mapping>
    <servlet-name>ServletName</servlet-name>
    <url-pattern>/ServletURL</url-pattern>
  </servlet-mapping>

为什么要隐藏原始 servlet 的位置?我可以简单地看到这是出于安全原因和更多这样的优势,但是为什么每个 servlet 都有一个名称?为什么web.xml 不能这么简单

  <servlet>                                    
    <url-pattern>ServletURL</url-pattern>
    <servlet-class>packy.FirstServlet</servlet-class>
  </servlet>

【问题讨论】:

一个 servlet 可以有多个映射,在您建议的语法中,每个映射都有一个单独的 servlet 实例。除此之外,如果你想拥有同一个 servlet 的多个实例,但设置不同怎么办?! 一个典型的用例是你可以使用 * 来匹配任何东西,所以你可以这样做: /images/* 来匹配所有对事物的请求/images 目录到单个 servlet。如果您需要图像缩放或图像访问控制,则很有用。 【参考方案1】:

它允许您在单个 servlet 实例上拥有多个 servlet 映射(甚至分布在多个 web.xml/web-fragment.xml 文件中),而无需为每个映射创建单独的实例:

<servlet>
    <servlet-name>someServlet</servlet-name>
    <servlet-class>com.example.SomeServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>someServlet</servlet-name>
    <url-pattern>/enroll</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>someServlet</servlet-name>
    <url-pattern>/pay</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>someServlet</servlet-name>
    <url-pattern>/bill</url-pattern>
</servlet-mapping>

(注意:是的,每个映射可以有多个 URL 模式,但这不包括将它们拆分为多个 web.xml/web-fragment.xml 文件)

它允许您在特定的 servlet 上映射过滤器,而不必担心 servlet 正在/将使用什么 URL 模式:

<filter-mapping>
    <filter-name>someFilter</filter-name>
    <servlet-name>someServlet</servlet-name>
</filter-mapping>

你的提议都不支持他们。

请注意,由于 Servlet 3.0 已经推出近 4 年(2009 年 12 月;请确保您通过最新资源了解这些问题......任何超过 1~3 年的东西都应该仔细审查),您可以轻松地使用 @WebServlet 注释来最小化 web.xml 样板:

@WebServlet("/servletURL")
public class SomeServlet extends HttpServlet 

仅此注释已将其映射到 /servletURL 的 URL 模式,而没有任何 web.xml 条目。

【讨论】:

【参考方案2】:

我们并不真正需要一个 servlet 名称。只是这就是 Java EE 设计者选择在 XML 中声明和映射 servlet 的方式。

现在,您可以使用@WebServlet 注释声明和映射一个servlet,并且该注释的name 属性是可选的。

【讨论】:

我认为这更重要。 '它就是这样'的另一个案例!

以上是关于为啥我们需要一个 servlet 名称?的主要内容,如果未能解决你的问题,请参考以下文章

JavaWeb----Servlet和servlet-mapping

浅 谈 Servlet

JavaWeb-Servle介绍

selvet配置;

servle学习

Servlet开发中注意的细节问题