iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 5
1

前言

今天要來介紹一下有關servlet轉頁及傳值的方法


跳轉頁面的方法

主要分成兩種:

  • 1.forward(request, response)
  • 2.sendRedirect()

兩種都是servlet支援跳轉頁面的方式
在這裡簡單整理一下比較:

forward(request, response)

  • 屬於server side呼叫
  • 定義在RequestDispatcher的介面,由request.getRequestDispatcher呼叫
  • 內部轉址,URL不會顯示程式名稱(可設定成參數)
  • 因是內部轉址,可以透過setAttribute傳遞參數
  • 效率較高
  • 適用於權限管理轉頁時使用

sendRedirect()

  • 屬於server side呼叫
  • 定義在HttpServletResponse
  • 直接外部呼叫另一支程式,會顯程式名稱
  • 定義在HttpServletResponse
  • 效率較低(因為cilent會在request一次)
  • 適用於跳至外部網站或回主畫面使用

forward()

在前面的範例都是使用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的名稱
http://ithelp.ithome.com.tw/upload/images/20161205/201034250vJtC7mB36.png

sendRedirect()

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上
http://ithelp.ithome.com.tw/upload/images/20161205/20103425xHjLp979OI.png

若使用sendRedirect相對路徑表示的話
有沒有斜線是有差別的
若相對路徑加了斜線
Container會自動抓到root目錄

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
		//request.getRequestDispatcher("Longin.jsp").forward(request, response);
    	response.sendRedirect("/Longin.jsp");
} 

http://ithelp.ithome.com.tw/upload/images/20161205/20103425wxSgFjaLXX.jpg

若不加斜線預設就會從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所帶的參數是抓不到的

今天就整理到這裡
但主要都是servlet的部分
相關的方法在JSP也有
這些內容網路上已有很完整的說明
只是紀錄一下
也整理一下自己學習的思路

參考資料
http://fanli7.net/a/bianchengyuyan/C__/20130113/289805.html
https://dotblogs.com.tw/alantsai/2013/10/03/servlet-forward#WizKMOutline_1380811714885901


上一篇
[Day 4 ] Servlet & JSP簡介(part 2)
下一篇
[Day 6] Servlet生命週期
系列文
30 days JSP & Servlet學習紀錄 30

尚未有邦友留言

立即登入留言