Forward是通过RequestDispatcher对象的forward(HttpServletRequest req,HttpServletResponse res)方法来实现的。RequestDispatcher可以通过HttpServletRequest的getRequestDispatcher()方法获得。
例如下面的代码转跳到另一个Servlet:
RequestDispatcher dispatcher=request.getRequestDispacher("/servlet/LifeCycleServlet");
dispatcher.forward(request,response);
**requestDispatcher()方法的参数必须为以“/”开始,“/”表示本Web应用程序的根目录。如果要转跳到Servlet为http://localhost:8080/servlet/servlet/LifeCycleServlet,则参数应为“/servlet/LifeCycleServlet“。
Forward是MVC框架中常用的一种技术。Forward不仅可以转跳到本应用的另一个Servlet,JSP页面,也可以转跳到另外一个文件,甚至WEB-INF文件夹下的文件。其中跳转到Servlet与JSP页面是最常见的。
框架中常使用一个Servlet来集中处理请求然后跳转到响应的Servlet,或者在Servlet中处理业务逻辑,然后跳转到JSP页面中显示处理结果。
下面通过一个例子。使用向导新建ForwardServlet,输入如下代码:
ForwardServlet.java**
package com.helloweenvsfei.servlet;
import java.io.IOException;
import java.util.Date;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ForwardServlet extends HttpServlet {
private static final long serialVersionUID = -291840563095094360L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String destination = request.getParameter("destination");
// 跳转到 /WEB-INF/web.xml。通过地址栏输入网址是不能访问到该文件的,但是 forward 可以
if("file".equals(destination)){
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/web.xml");
dispatcher.forward(request, response);
}
// 跳转到 /forward.jsp
else if("jsp".equals(destination)){
// 通过 setAttribute 方法传递一个 Date 对象给 JSP 页面
Date date = new Date();
request.setAttribute("date", date);
RequestDispatcher dispatcher = request.getRequestDispatcher("/forward.jsp");
dispatcher.forward(request, response);
}
// 跳转到另一个 Servlet
else if("servlet".equals(destination)){
RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/LifeCycleServlet");
dispatcher.forward(request, response);
}
else{
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
response.getWriter().println("缺少参数。用法:" + request.getRequestURL() + "?destination=jsp 或者 file 或者 servlet ");
}
}
public void doPut(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
}
}
**ForwardServlet中根据地址栏传入的destination参数不同而跳转到不同的目的地。如果destination参数值为file,则跳转到文件/WEB-INF/web.xml;如果为servlet,则跳转到/servlet/LifeCycleServlet;如果为jsp则跳转到JSP页面/forward.jsp.
本程序使用了一个JSP程序。在项目servlet的WebRoot文件夹上右击,新建forward.jsp页面。输入代码如下:**
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<jsp:directive.page import="java.util.Date" />
<jsp:directive.page import="java.text.SimpleDateFormat" />
<%
Date date = (Date) request.getAttribute("date");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Forward 跳转</TITLE>
<link rel='stylesheet' type='text/css'
href='<%=request.getContextPath()%>/css/style.css'>
</HEAD>
<BODY>
<div align='center'>
<br />
<fieldset style=width:90%>
<legend>
Forward 跳转
</legend>
<br />
<div style='line'>
<div class='leftDiv' style='width:250px; '>
从 ForwardServlet 中取到的 Date 为
</div>
<div align='left' class='rightDiv'>
<%=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS")
.format(date)%>
</div>
</div>
<br />
<div style='line'>
<div align="center">
<input type='button'
οnclick='location="<%=request.getContextPath()%>/servlet/ForwardServlet?destination=servlet"; '
οnmοuseοver="window.status='<%=request.getContextPath()%>/servlet/ForwardServlet?destination=servlet'"
value='跳转到 Servlet' class=button>
<input type='button'
οnclick='location="<%=request.getContextPath()%>/servlet/ForwardServlet?destination=file"; '
οnmοuseοver="window.status='<%=request.getContextPath()%>/servlet/ForwardServlet?destination=file'"
value='跳转到 web.xml' class=button>
<input type='button'
οnclick='location="<%=request.getContextPath()%>/servlet/ForwardServlet?destination=jsp"; '
οnmοuseοver="window.status='<%=request.getContextPath()%>/servlet/ForwardServlet?destination=jsp'"
value='跳转到 JSP' class=button>
</div>
</div>
</BODY>
</HTML>