原文: https://beginnersbook.com/2017/07/requestdispatcher-methods-with-examples-in-servlet/

RequestDispatcher接口定义一个对象,该对象从客户端接收请求并将其分派给资源(例如 servlet,JSP,HTML 文件)。该接口有以下两种方法:

public void forward(ServletRequest request, ServletResponse response):它将请求从一个 servlet 转发到另一个资源(例如 servlet,JSP,HTML 文件)。

public void include(ServletRequest request, ServletResponse response):它包含响应中的资源内容(如 servlet,JSP,HTML 文件)。

forward()include()方法的区别

为了理解这两种方法之间的区别,让我们举一个例子:假设你有两个页面XY。在页面X中你有一个include标签,这意味着控制流将在页面X中,直到它遇到包含标签,之后控制流将被转移到页面Y。在页面Y的处理结束时,控制流将返回到包含标签之后的页面X并保持在X直到结束。

在这种情况下,客户的最终回复将由X页面发送。

现在,我们正在采用相同的例子。我们有相同的页面XY。在页面X中,我们有转发标签。在这种情况下,控制流将在页面X中,直到它遇到转发,此后控制流将被转移到页面Y。这里的主要区别是控制流不会返回到X,它将在页面Y中直到结束它的。

在这种情况下,对客户的最终回复将由Y页面发送。

例:

在这个例子中,我将使用includeforward两种方法。使用include方法,我将更改当前页面的内容,当我准备将控制流转移到下一页时,我将使用forward方法。

index.html

  1. <form action="loginPage" method="post">
  2. User Name:<input type="text" name="uname"/><br/>
  3. Password:<input type="password" name="upass"/><br/>
  4. <input type="submit" value="SUBMIT"/>
  5. </form>

Validation.java

  1. import java.io.*;
  2. import java.io.*;
  3. import javax.servlet.*;
  4. import javax.servlet.http.*;
  5. public class Validation extends HttpServlet
  6. {
  7. public void doPost(HttpServletRequest request,
  8. HttpServletResponse response)
  9. throws ServletException, IOException
  10. {
  11. response.setContentType("text/html");
  12. PrintWriter pwriter = response.getWriter();
  13. String name=request.getParameter("uname");
  14. String pass=request.getParameter("upass");
  15. if(name.equals("Chaitanya") &&
  16. pass.equals("beginnersbook"))
  17. {
  18. RequestDispatcher dis=request.getRequestDispatcher("welcome");
  19. dis.forward(request, response);
  20. }
  21. else
  22. {
  23. pwriter.print("User name or password is incorrect!");
  24. RequestDispatcher dis=request.getRequestDispatcher("index.html");
  25. dis.include(request, response);
  26. }
  27. }
  28. }

WelcomeUser.java

  1. import java.io.*;
  2. import javax.servlet.*;
  3. import javax.servlet.http.*;
  4. public class WelcomeUser extends HttpServlet {
  5. public void doPost(HttpServletRequest request,
  6. HttpServletResponse response)
  7. throws ServletException, IOException
  8. {
  9. response.setContentType("text/html");
  10. PrintWriter pwriter = response.getWriter();
  11. String name=request.getParameter("uname");
  12. pwriter.print("Hello "+name+"!");
  13. pwriter.print(" Welcome to Beginnersbook.com");
  14. }
  15. }

web.xml

  1. <web-app>
  2. <display-name>BeginnersBookDemo</display-name>
  3. <welcome-file-list>
  4. <welcome-file>index.html</welcome-file>
  5. </welcome-file-list>
  6. <servlet>
  7. <servlet-name>Login</servlet-name>
  8. <servlet-class>Validation</servlet-class>
  9. </servlet>
  10. <servlet>
  11. <servlet-name>Welcome</servlet-name>
  12. <servlet-class>WelcomeUser</servlet-class>
  13. </servlet>
  14. <servlet-mapping>
  15. <servlet-name>Login</servlet-name>
  16. <url-pattern>/loginPage</url-pattern>
  17. </servlet-mapping>
  18. <servlet-mapping>
  19. <servlet-name>Welcome</servlet-name>
  20. <url-pattern>/welcome</url-pattern>
  21. </servlet-mapping>
  22. <welcome-file-list>
  23. <welcome-file>index.html</welcome-file>
  24. </welcome-file-list>
  25. </web-app>

输出:

输入错误的凭据:

Servlet 中的`RequestDispatcher`方法 - 图1

错误屏幕:

Servlet 中的`RequestDispatcher`方法 - 图2

输入正确的用户名和密码时欢迎屏幕:

Servlet 中的`RequestDispatcher`方法 - 图3