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並沒有重新向新頁面發送請求,他只是完全采用了新頁面來對用戶生成響應——請求依然是一次請求,所以請求參數,請求屬性都不會丟失。