今天要來介紹一下有關servlet轉頁及傳值的方法
主要分成兩種:
兩種都是servlet支援跳轉頁面的方式
在這裡簡單整理一下比較:
forward(request, response)
sendRedirect()
在前面的範例都是使用forward去做頁面轉換,寫法如下
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("Index.jsp").forward(request, response);
return;
}
forward由request.getRequestDispatcher去做呼叫
這裡有再加上一個return;代表跳轉過去就不再執行下面的code了
使用forward由於內部呼叫,在client上並不會看到程式的名稱
而是在JSP中設定action的名稱
sendRedirect直接由 HttpServletResponse 的response回傳
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("Index.jsp");
}
因為sendRedirect視為一個重新的請求,所以request傳進來的參數是不能共享的
sendRedirect通知了client讓cilent重新發出一個request
像是間接的request
因此使用sendRedirect可以看到名稱會直接顯示在URL上
若使用sendRedirect相對路徑表示的話
有沒有斜線是有差別的
若相對路徑加了斜線
Container會自動抓到root目錄
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request.getRequestDispatcher("Longin.jsp").forward(request, response);
response.sendRedirect("/Longin.jsp");
}
若不加斜線預設就會從project下的目錄開始找
而這個差異在forward上沒有差
書裡針對這兩個特性做了一個有趣的說明
sendRedirect =>就像客戶打給你,你叫客戶去找其他的廠商(所以客戶還要再打一通電話)
forward =>就像客戶找你,你交給你同事處理(對客戶來說只有打一通電話)
深深覺得這個例子好貼切
頁面跳轉常常也會有參數的傳遞
使用到的方法為setAttribute("key",value)
範例如下:
request.setAttribute("myname",name);
這裡的naem是自己去的一個變數,值為實際的資料
(eg.client輸入的username)
myname為key值
因此這樣去request.getAttribute("myname")
就可以得到name這個變數值
這在之後也會用到
但setAttribute在sendRedirect()不能用
原因為sendRedirect間接產生一個新的request
因此舊的request所帶的參數是抓不到的
參考資料
http://fanli7.net/a/bianchengyuyan/C__/20130113/289805.html
https://dotblogs.com.tw/alantsai/2013/10/03/servlet-forward#WizKMOutline_1380811714885901