【问题标题】:Why not call the servlet directly? web.xml为什么不直接调用servlet? web.xml
【发布时间】:2015-12-25 21:37:43
【问题描述】:

这对某些人来说可能是一个显而易见的问题,但我正在尝试更深入地了解 JSP web.xml 文件。

到目前为止,我对 web.xml 文件的理解是,我们可以将虚构的 url 映射到内部名称到物理 servlet。

  <servlet>
    <servlet-name>internalName</servlet-name>
    <servlet-class>dk.something.servlets.Servlet1</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>internalName</servlet-name>
    <url-pattern>/fictionalUrl.do</url-pattern>
  </servlet-mapping>

最终用户将看到虚构的Url.do。

但是我们为什么不直接调用servlet呢?为什么我们需要/想要在它前面创建一个虚构的 url?

我尝试并用谷歌搜索了这个主题,但我只能得到一个模糊的解释,即直接调用 servlet 会带来安全风险,但他们对这个主题没有更深入的解释。

我还看到示例最后使用 .do,有什么具体原因吗?

【问题讨论】:

    标签: jsp web.xml


    【解决方案1】:

    但是我们为什么不直接调用 servlet 呢?为什么我们需要/想要在它前面创建一个虚构的 url?

    那是因为浏览器不理解 JAVA 代码。浏览器理解一组通常用标签定义的语言(HTML、JSP、XML,...)。如果您直接将 servlet 调用到浏览器中,它不会理解所有这些代码。这就是为什么您需要使用包含浏览器可以理解的内容的 JSP 页面,以便在 JAVA 代码和浏览器之间架起一座桥梁。这是MVC (Model-View-Controller) Framework

    我还看到示例最后使用 .do,有什么具体原因吗?

    不,没有。你可以使用 .jsp 或者更好的,什么都没有。

    【讨论】:

    • 感谢您的回复!根据我的理解,.jsp 页面在执行过程中被提升为 servlet,但即使我们直接调用 servlet,用户也不会看到 Java 代码(即使可能),因为我们将请求/响应对象设置为 .html 或.jsp 页面(包含 html)。所以我的问题仍然是为什么我们不直接在 url 中映射 servlet 而不是通过内部名称。
    • 因为您可以为一个 servlet 使用多个 JSP。如果您直接使用 servlet,则需要为您制作的每个页面创建一个,这很乏味。假设您的网站中有 1000 个页面,为每个页面创建每个 servlet 是不可接受的。但是通过映射,您可以将许多 jsp 页面映射到一个 servlet。例如,您可以对登录、注册和注销页面使用相同的 servlet。
    【解决方案2】:

    但是我们为什么不直接调用 servlet 呢?为什么我们需要/想要 在它前面创建一个虚构的 url?

    我们需要指定一个 URL 路径以允许服务器将请求定向到正确的 servlet。此路径可以与 servlet 名称相同/相似,但出于安全原因,我们可能决定不希望将应用程序的内部结构暴露给外部世界。因此,使用不同的 URL 路径是个好主意。使用不同路径的另一个原因是我们可能希望有一个对最终用户来说更好的 URL 路径。当然,没有什么能阻止您拥有 servlet 类,servlet 名称和 URL 路径几乎相同。

    为什么我们不直接将 URL 映射到 servlet 类,而是需要通过 URL 到 servlet 名称到 servlet 类的映射? 好吧,我们可能会多次使用同一个 servlet 类,例如,如果我们想为不同的用例配置不同的 servlet 类。

    <servlet>
      <servlet-name>HelloWorld</servlet-name> 
      <servlet-class>examples.HelloWorld</servlet-class>
    
      <init-param>
        <param-name>greeting</param-name> 
        <param-value>Welcome</param-value> 
      </init-param>
    </servlet>
    <servlet>
      <servlet-name>HelloWorld2</servlet-name> 
      <servlet-class>examples.HelloWorld</servlet-class>
    
      <init-param>
        <param-name>greeting</param-name> 
        <param-value>Hello</param-value> 
      </init-param>
    </servlet>
    

    请注意,我们也可以将多个 URL 路径映射到同一个 servlet,并且在早期的 web.xml 标准中,一个映射只包含一个 URL(从 servlet 2.5 标准开始不再是这种情况)。肯定有其他方法可以解决这个问题,但 web.xml 格式的早期设计者采用的方向是使用名称到类,然后是名称到 URL 映射,因为这提供了高度的灵活性和可配置性.

    我还看到示例最后使用 .do,它们是否具体 原因是什么?

    这只是作者选择的一个约定,因为他/她发现在末尾说“do”表示对该 URL 的调用将执行一些操作。

    【讨论】:

      猜你喜欢
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      相关资源
      最近更新 更多