什么是“程序化服务器端包含”?

时间:2019-01-09 14:03:21

标签: java servlets java-ee requestdispatcher

来自the documentation

  

如果资源是静态的,则include方法将启用程序化服务器端包含。

     

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

我不太确定“程序化服务器端包含”的含义以及它们与Web组件的区别。

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

有人可以详细说明吗?

1 个答案:

答案 0 :(得分:2)

您已经省略了引号之前的标题和文本。这些为您提出的评论提供了重要的背景信息:

  

在响应中包括其他资源

     

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

include(request, response);

因此,当评论继续时

  
    

如果资源是静态的,则include方法将启用程序化服务器端包含。

  

它们正在表征前面代码段的作用,但没有引入一些新概念。在这种情况下,“程序化服务器端包含”是调用与静态资源关联的include()的{​​{1}}方法。它的作用是在准备好的响应中内联包括与调度程序关联的资源。因此,这是“服务器端”,因为这都是由服务器完成的,对客户端透明,而不是客户端必须对包含的资源进行单独的请求。 *

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

  

我的意思是,无论我包括什么资源,我都会通过   向其请求/响应对象元组并获得一些副作用   可以或可以不与客户交流,对吧?

将其视为将请求和响应对象传递到include()会更准确。如果调度程序与静态资源相关联,则不会,请求和响应对象不会()呈现给该资源(本身),因为它没有接收或操纵它们的机制。相反,运行代码的servlet引擎会根据需要来操纵响应对象。

如果目标资源是Web组件,则可以,它可以自行决定从所提供的请求中读取数据,操纵该请求及其上下文以及操纵所提供的响应。通常,它无法区分这种情况和直接访问它的情况。但是没有,调用RequestDispatcher的组件最多只能控制通过该机制传达给客户端的内容。


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