Forward() :这可以通过 Request 和 ServeletContext 两种方式完成。将请求从一个 servlet 转发到服务器上的另一个资源(servlet、JSP 文件或 HTML 文件)。转发是在服务器端完成的,而客户端不知道。
当您调用转发请求时,请求被发送到服务器上的另一个资源,而无需通知客户端另一个资源将处理该请求。此过程完全在 Web 容器中进行。
简单来说:
include:将在当前文件中包含另一个文件
forward:将当前请求转发到转发页面
Forward() :这可以通过 Request 和 ServeletContext 两种方式完成。将请求从一个 servlet 转发到服务器上的另一个资源(servlet、JSP 文件或 HTML 文件)。转发是在服务器端完成的,而客户端不知道。
当您调用转发请求时,请求被发送到服务器上的另一个资源,而无需通知客户端另一个资源将处理该请求。此过程完全在 Web 容器中进行。
简单来说:
include:将在当前文件中包含另一个文件
forward:将当前请求转发到转发页面
include
时,调用response.sendError
或response.sendRedirect
对实际响应没有影响。而使用forward
则会操作实际响应。 - Yeti如果资源是静态的,则 include 方法可以实现编程式服务器端包含。如果资源是 Web 组件,则该方法的效果是将请求发送到所包含的 Web 组件,执行 Web 组件,然后将执行结果包含在包含 Servlet 的响应中。
所包含的 Web 组件可以访问请求对象,但在对响应对象进行操作时受到限制。
通常,在 Web 组件返回响应时,包含其他 Web 资源(例如横幅内容或版权信息)非常有用。
javax.servlet.forward.[request-uri|context-path|servlet-path|path-info|query-string]
应该使用forward方法将用户的响应责任交给另一个资源。如果你在servlet中已经访问了ServletOutputStream或PrintWriter对象,则不能使用此方法;这样做会抛出IllegalStateException异常。
相关链接
两者之间的主要区别在于forward()方法在被调用后会关闭输出流,而include方法则不会关闭输出流。
举个例子:
假设有一个名为xxx.java的servlet页面和一个名为yy.jsp的jsp页面。
在yy.jsp中:
WELCOME to yy.jsp
在xxx.java中 //使用forward()
RequestDispatcher rd = request.getRequestDispatcher("yy.jsp");
rd.forward(request,response);
out.println("back to servlet"); //这不会被显示
输出结果
WELCOME to yy.jsp
在xxx.java中//使用include()
RequestDispatcher rd = request.getRequestDispatcher("yy.jsp");
rd.include(request,response);
out.println("回到servlet");
输出结果
WELCOME to yy.jsp back to servlet
但最重要的是它不关乎控制,因为如果我们在.forward()
或者.include()
调用之后放置一个
System.out.println("console output");
在这两种情况下控制台输出都会生成。 它关乎对客户端的响应。
所以,基本的部分就是:如果我们正在处理一个服务器端组件并且转发到 JSP 或 Servlet 以生成客户端标记,则一旦该 JSP 或 Servlet 完成处理,我们就不能再调用任何其他组件生成可发送给客户端的标记。一旦我们执行了转发,当前请求和响应周期的标记生成过程就完成了。
相反,使用 include 时,输出流仍然保持打开状态,因此我们可以调用尽可能多的不同文件来生成客户端标记。 我们可以在生成客户端基础标记的组件链中包含两个或三个 JSP 文件甚至是一个 Servlet。当我们使用 include 时,在调用之后输出流不会关闭。
forward()函数将控制权转移到目标资源,目标资源将直接向客户端发送响应。
include()函数将控制权转移到目标资源,目标资源将向源资源发送响应。然后源资源将捕获目标资源的响应并将其转发回客户端。