原文: 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()
方法的区别
为了理解这两种方法之间的区别,让我们举一个例子:假设你有两个页面X
和Y
。在页面X
中你有一个include
标签,这意味着控制流将在页面X
中,直到它遇到包含标签,之后控制流将被转移到页面Y
。在页面Y
的处理结束时,控制流将返回到包含标签之后的页面X
并保持在X
直到结束。
在这种情况下,客户的最终回复将由X
页面发送。
现在,我们正在采用相同的例子。我们有相同的页面X
和Y
。在页面X
中,我们有转发标签。在这种情况下,控制流将在页面X
中,直到它遇到转发,此后控制流将被转移到页面Y
。这里的主要区别是控制流不会返回到X
,它将在页面Y
中直到结束它的。
在这种情况下,对客户的最终回复将由Y
页面发送。
例:
在这个例子中,我将使用include
和forward
两种方法。使用include
方法,我将更改当前页面的内容,当我准备将控制流转移到下一页时,我将使用forward
方法。
index.html
<form action="loginPage" method="post">
User Name:<input type="text" name="uname"/><br/>
Password:<input type="password" name="upass"/><br/>
<input type="submit" value="SUBMIT"/>
</form>
Validation.java
import java.io.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Validation extends HttpServlet
{
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter pwriter = response.getWriter();
String name=request.getParameter("uname");
String pass=request.getParameter("upass");
if(name.equals("Chaitanya") &&
pass.equals("beginnersbook"))
{
RequestDispatcher dis=request.getRequestDispatcher("welcome");
dis.forward(request, response);
}
else
{
pwriter.print("User name or password is incorrect!");
RequestDispatcher dis=request.getRequestDispatcher("index.html");
dis.include(request, response);
}
}
}
WelcomeUser.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class WelcomeUser extends HttpServlet {
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
PrintWriter pwriter = response.getWriter();
String name=request.getParameter("uname");
pwriter.print("Hello "+name+"!");
pwriter.print(" Welcome to Beginnersbook.com");
}
}
web.xml
<web-app>
<display-name>BeginnersBookDemo</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Login</servlet-name>
<servlet-class>Validation</servlet-class>
</servlet>
<servlet>
<servlet-name>Welcome</servlet-name>
<servlet-class>WelcomeUser</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/loginPage</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Welcome</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
输出:
输入错误的凭据:
错误屏幕:
输入正确的用户名和密码时欢迎屏幕: