【问题标题】:What are "programmatic server-side includes"?什么是“程序化服务器端包含”?
【发布时间】:2019-06-04 08:01:06
【问题描述】:

来自the Java EE tutorial

如果资源是静态的,include 方法会启用编程的服务器端包含。

如果资源是一个web组件,该方法的作用是向包含的web组件发送请求,执行web组件,然后将执行的结果包含在包含servlet的响应中。

我不太清楚“程序化服务器端包含”是什么意思,以及它们与 Web 组件案例有何不同。

我的意思是,无论我包含什么资源,我都会向它传递一个请求/响应对象元组并获得一些我可能会或可能不会与客户端通信的副作用,对吧?

有人可以详细说明一下吗?

【问题讨论】:

  • 也许是一个servlet(例如)? request.getRequestDispatcher("/anotherservlet").include(request, response);
  • @ernest_k 我一直以为 servlet 是一个 Web 组件?
  • 大多数 servlet 都是 Web 组件,但不一定是这种情况(例如,java.servlet.Servlet 是一个通用的独立于协议的解决方案,而javax.servlet.http.HttpServlet 专门用于处理 http 请求。

标签: java servlets jakarta-ee requestdispatcher


【解决方案1】:

您省略了引文前的标题和文字。这些为您询问的 cmets 提供了重要的背景信息:

在响应中包含其他资源

包含其他网络资源(例如横幅)通常很有用 内容或版权信息,在从 Web 返回的响应中 零件。要包含另一个资源,请调用 RequestDispatcher 对象:

include(request, response);

因此,当 cmets 继续时

如果资源是静态的,include 方法会启用编程的服务器端包含。

它们是表征前面代码sn-p的效果,而不是引入一些新概念。此上下文中的“程序化服务器端包含”正在调用与静态资源关联的RequestDispatcher()include() 方法。它具有包含与调度程序关联的资源的效果,内联在正在准备的响应中。因此,这是“服务器端”,因为它全部由服务器完成,对客户端透明,而不是客户端必须对包含的资源发出单独的请求。*

静态和 Web 组件案例之间的区别在于与调用 include() 方法的 RequestDispatcher 关联的资源 -- ie 要包含什么资源 -- 不是关于其代码包含方法调用的组件。静态资源正是可以通过与 Web 组件无关的 URL 来识别的资源。通常这意味着它对应于一个文件。文件内容可以是任何内容,但其常见用途是包含 HTML 片段,例如许多网页共享的页眉或页脚。

我的意思是,无论我包含什么资源,我都会通过 向它请求/响应对象元组并获得一些副作用 可能会也可能不会与客户沟通,对吧?

将其视为将请求和响应对象传递给RequestDispatcher 更为准确。如果调度程序与静态资源相关联,则不,请求和响应对象呈现给该资源(本身),因为它没有接收或操作它们的机制。相反,运行代码的 servlet 引擎会在它认为合适的时候操作响应对象。

如果目标资源是 Web 组件,是的,它将能够从提供的请求中读取数据、操纵请求及其上下文以及操纵提供的响应,这一切都由它自行决定。通常,它无法将这种情况与直接访问的情况区分开来。但是不,调用include() 的组件最多只能有限地控制通过该机制与客户端通信的内容。


*有关术语“服务器端包含”部分的历史和灵感的更多信息,请咨询Wikipedia

【讨论】:

  • 我还是不明白,恐怕。让我们从我最初提出的问题开始:什么是“程序化服务器端包含”?那么,您是否有合理包含静态资源的示例?我想数据库是静态资源,但我不会“包含”数据库,我会包含一个与数据库通信的 servlet。
  • 谢谢。我可以说服您在您的答案中包含(不是双关语)这些 cmets 吗?很高兴接受它,那么。 :)
猜你喜欢
  • 2019-01-01
  • 2010-11-18
  • 2011-06-30
  • 1970-01-01
  • 2016-02-06
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多