请求调度概念的包含和转发机制之间的区别?

Aja*_*kur 42 java servlets forward java-ee

Forward():这可以通过Request&ServeletContext以两种方式完成.将servlet中的请求转发到服务器上的另一个资源(servlet,JSP文件或HTML文件).转发是在服务器端完成的,没有客户端的知识.

当您调用转发请求时,请求将被发送到服务器上的另一个资源,而不会通知客户端其他资源将处理该请求.此过程完全在Web容器中进行.

只是

include:将在我们当前的文件中包含另一个文件

forward:将当前请求转发到转发页面

小智 63

两个标签之间的区别在于它们的工作方式.好吧,我会举一个例子,你可以想象它更好.

假设您有两个页面,pageA和pageB.在pageA中,您编写了包含标记.在这种情况下,控件位于pageA中,直到您调用include标记.此时,完全控制转到pageB.当它完成时,控制从包含标记之后的下一个编码点开始返回到pageA,并继续到pageA的其余部分.

好吧,为了让事情更清楚,让我们说我们有相同的页面,pageA和pageB,但这次我们将使用pageA中的forward标记,而不是include标记.同样,控件将从pageA开始,直到我们调用pageA中的forward标签,此时,控件转移到pageB,就像include标签一样.但不同之处在于pageB完成时会发生什么.如果是正向标记,则控制不会再次返回到pageA.

  • 解释是重点。对于像我这样的初学者来说绝对需要它。接受的答案是正确的,但这个例子比接受的答案更扩展和完整。 (2认同)

mtk*_*mtk 33

主要的区别在于,当你使用forward时,控件被转移到你正在调用的下一个servlet/jsp,而include用当前的servlet保留控件,它只包括调用servlet/jsp完成的处理(比如做任何事情) .println或其他处理).


Ani*_*rni 26

包括(请求,响应);

如果资源是静态的,则include方法启用程序化服务器端包含.如果资源是Web组件,则该方法的作用是将请求发送到包含的Web组件,执行Web组件,然后将执行结果包含在来自包含的servlet的响应中.

包含的Web组件可以访问请求对象,但它对响应对象的作用有限.

  • 它可以写入响应的主体并提交响应.
  • 它无法设置标头或调用任何影响响应标头的方法,例如setCookie.

在从Web组件返回的响应中包括另一个Web资源(例如横幅内容或版权信息)通常很有用.

前进(请求,回应);

在某些应用程序中,您可能希望让一个Web组件对请求进行初步处理,并让另一个组件生成响应.例如,您可能希望部分处理请求,然后转移到另一个组件,具体取决于请求的性质.

要将控制权转移到另一个Web组件,请调用RequestDispatcher的forward方法.转发请求时,请求URL将设置为转发页面的路径.原始URI及其组成部分保存为请求属性.

javax.servlet.forward.[request-uri|context-path|servlet-path|path-info|query-string]  
Run Code Online (Sandbox Code Playgroud)

应该使用forward方法为回复用户提供另一个资源责任.如果您已经在servlet中访问过ServletOutputStreamPrintWriter对象,则无法使用此方法; 这样做会抛出IllegalStateException.

相关链接


小智 9

两者之间的关键区别在于,forward()方法将在调用后关闭输出流,而include方法将输出流保留为OPEN.

回答一个例子:让我们有一个名为xxx.java的servlet页面和一个名为yy.jsp的jsp页面

在yy.jsp中

WELCOME to yy.jsp
Run Code Online (Sandbox Code Playgroud)

在xxx.java中 //使用forward()

RequestDispatcher rd = request.getRequestDispatcher("yy.jsp"); rd.forward(request,response); out.println("back to servlet"); //this wont b displayed

产量

WELCOME to yy.jsp 
Run Code Online (Sandbox Code Playgroud)

在xxx.java中 //使用include()

RequestDispatcher rd = request.getRequestDispatcher("yy.jsp"); rd.include(request,response); out.println("back to servlet");

产量

WELCOME to yy.jsp back to servlet
Run Code Online (Sandbox Code Playgroud)

但最重要的是它不是关于控制,因为如果我们放一个

System.out.println("console output");

在调用.forward().include()调用之后,将在每种情况下生成控制台输出.它关于对客户的回应

因此,基本部分是如果我们在服务器端组件中处理然后转发到JSP或Servlet以便为客户端生成标记,一旦JSP或Servlet完成处理,我们就不能再调用任何其他组件生成可以发送给客户端的标记.一旦我们执行了转发,当前请求和响应周期的标记生成就完成了.

或者,使用include,输出流保持打开状态,因此我们可以调用尽可能多的不同文件来生成我们需要的客户端标记.因此,我们可以在生成基于客户端的标记的组件链中包含两个或三个JSP文件甚至Servlet.当我们使用include时,输出流在调用后不会关闭.