【问题标题】:Why I need mapping or annotation for Servlet, but not for JSP?为什么我需要 Servlet 的映射或注释,而不是 JSP?
【发布时间】:2021-04-15 10:17:26
【问题描述】:

要向 Servlet 发出请求,我需要在 XML 文件中使用映射或为给定的 Servlet 添加注释。但是为什么我不需要对 JSP 文件也做同样的事情呢?我会举个例子。

这是如何工作的?

index.html:

<html><body>
 
    <form action="result.jsp">
        <button>go</button>
    </form>
    
</body></html>

result.jsp:

<html><body>
hello
</body></html>

请注意,我不必使用任何 XML 映射或注释。它只是“找到”它。

但这怎么行不通?

index.html:

<html><body>
 
    <form action="com.example.MyServlet">
        <button>go</button>
    </form>
    
</body></html>

com.example.MyServlet:

public class MyServlet extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter pw = resp.getWriter();
        resp.setContentType("text/html");
 
        pw.println("hello");
 
    }
}

在这里,我收到错误:请求的资源 [/TestProject/com.example.MyServlet] 不可用。如何?为什么我不需要使用 XML,也不需要 JSP 的注释,但我需要 Servlet?他们不应该以同样的方式工作吗,因为 JSP 最终转向了 Servlet。那么为什么会有不同的行为呢?我知道我错过了什么,我只是不知道是什么......

【问题讨论】:

  • 参见this 的第一个要点。简短的版本是 Servlet 容器通常在内部注册一个能够编译和服务 JSP 的 Servlet。该 servlet 已注册到类似 *.jsp 的位置。这就是处理您的第一个示例的方法。

标签: java xml jsp servlets annotations


【解决方案1】:

为什么 Servlet 需要映射或注解,而 JSP 不需要?

正如上面@SotiriosDelimanolis 的评论中所指出的,实际情况并非如此。 JSP 最终变成了一个 servlet,其行为与您自己定义的任何其他 servlet 一样。当您定义一个 servlet 时,您还需要添加一个 URL 映射,以便将 URL 路径解析为可以响应对该 URL 的请求的 servlet。

唯一的区别是对于 JSP 文件,这个映射是由 servlet 容器隐式完成的。对于您定义的 servlet,您显然需要定义自己的映射,因为服务器无法知道您想在自己的应用程序中对 servlet 做什么。

The specifications 说以下(强调我的):

Web 组件可以是 servlet 或 JSP 页面。 web.xml 部署描述符中的 servlet 元素用于描述这两种类型的 Web 组件。 JSP 页面组件通过使用隐式 .jsp 扩展映射在部署描述符中隐式定义,或通过使用 jsp-group 元素显式定义。

[...] JSP 页面被翻译成一个实现类加上部署信息。部署信息指示所需的支持类以及到 JSP 页面的原始 URL 路径与 JSP 页面实现的 URL 之间的映射该页面的类。

所以基本上,您的 JSP 被翻译成一个 servlet,并从您的原始 JSP 页面位置路径创建一个映射到由此生成的 servlet。

JSP 并未实际执行。执行的是从 JSP 生成的 servlet。您必须意识到提供 JSP 是为了方便。如果你想从一个 servlet 生成 HTML,你必须为你的整个 HTML 页面做一大堆out.write("&lt;html&gt;"); out.write("\r\n"); 等等。这不仅很容易出错,而且这样做会让你发疯。因此,提供 JSP 的选项与幕后完成的事情相结合,以使其全部工作。

【讨论】:

  • 如果 JSP 文件由 Container 内部映射,如果我也将它映射到 XML 中,它将如何“看到”?它想覆盖它还是什么?我们不可能对单个 URL 有两个映射,对吗?因为这可能意味着我可以有两种不同的配置。虽然这对你来说听起来很容易,但对我作为初学者来说,这相当令人困惑:
  • 您可以映射N URLs to 1 servlet。你不能映射N servlets to 1 URL。如果您尊重这些,那么您可以拥有任何您想要的配置(由容器隐含或由您显式)。如果有冲突,你的服务器会抱怨并在启动时抛出异常。
  • 因此,如果我没有 JSP 文件的显式映射,Container 会为我们制作一个 - 使用 JSP 文件所在的相同 URL。但是如果我有显式映射,它会使用那个而不做任何隐式映射?或者那个jsp文件(servlet)会有2个URL映射到它——一个显式(来自我自己的XML)和一个隐式(来自JSP在项目中的位置)?从这 2 种描述中,它使用了哪种“方法”?
  • 即使您添加或不添加您自己的其他映射,您总是会获得 JSP 的隐式映射。您所说的“方法”,或者更好地说,使用的映射配置是您在发出请求时指定的配置。可以这么说,是不同的门通向同一个房间。
猜你喜欢
  • 2016-02-05
  • 2017-01-06
  • 1970-01-01
  • 2015-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
  • 2011-01-18
相关资源
最近更新 更多