forward指令用于将页面响应转发到另外的页面。既可以转发到静态的HTML页面,也可以转发到动态的JSP页面,或者转发到容器中的Servlet。
forward指令格式如下:
<jsp:forward page="{relativeURL|<%=expression%>}"> {jsp:param..../>} </jsp:forward>
jsp: param用于在转发时增加额外的请求参数。请求参数的值可以通过HttpServletRequest类的getParameter()方法获得。
下面是代码实例:
jsp-forward.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>forward's original page</title> </head> <body> <h3> forward's original page </h3> <jsp:forward page="forward-result.jsp"> <jsp:param name="age" value="29" /> </jsp:forward> </body> </html>
此jsp页面的作用是将客户端的请求转发到forward-result.jsp页面,转发请求时增加请求参数:参数名称和参数值。
在forward-result.jsp页面中,使用request内置对象来获取增加的请求值。
forward-result.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>forward's result page</title> </head> <body> <%=request.getParameter("age")%> <%=request.getParameter("username")%> </body> </html>
执行效果如下所示:
从图中可以看出,执行forward指令时,用户请求的地址依然没有发生变化,但页面内容却完全被forward目标页的内容。
另外,在执行forward指令转发请求时,客户端的请求参数不会丢失。来看下面例子,该页没有任何动态内容,只是一个静态的表单页,作用是将请求参数提交到jsp-forward.jsp页。
form.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>submit</title> </head> <body> <form id="login" method="post" action="jsp-forward.jsp"> <input type="text" name="username"> <input type="submit" value="login"> </form> </body> </html>
修改forward-result.jsp页面,增加输出表单参数的代码,如下:
<%=request.getParameter("username")%>
在表单提交页面中的文本框中输入任意字符串后提交该表单,运行结果如下图所示:
从表面看,forward指令给人一种感觉:它将用户请求“转发”到另一个新页面,但实际上,forward并没有重新向新页面发送请求,他只是完全采用了新页面来对用户生成响应——请求依然是一次请求,所以请求参数,请求属性都不会丢失。