簡單的說, 登入功能是一個服務
要在服務完成之後將畫面轉為請求來的那一頁
必須要(在服務開始的時候)將傳請求來的路徑存下來,如以下
String requestURI = (String) session.getAttribute("requestURI");
經過這段文字,傳請求來的路徑就存在requestURI字串中了
如果用
System.out.println(requestURI);
就會看得很清楚
會得到"/eDMo/_04_ShoppingCart/ShowCartContent.jsp"
另外在結尾的時候,服務完成了,要將畫面轉換時,就可以用下列程式碼來做
if (errorMsgMap.isEmpty()) { //如果沒有錯誤訊息則執行以下
if (requestURI != null) {
requestURI = (requestURI.length() == 0 ? request.getContextPath() : requestURI);
response.sendRedirect(response.encodeRedirectURL(requestURI));
System.out.println(requestURI);
return;
} else {
response.sendRedirect(response.encodeRedirectURL(request.getContextPath()));
return;
}
} else {
// 如果errorMsgMap不是空的,表示有錯誤,交棒給login.jsp
RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
rd.forward(request, response);
return;
}
}
這裡有幾個重要觀念
1 null vs .lenth()==0
乍看之下, 我起初認為null不就是length()==0, 一查之後發現, 原來不是這樣
這裡引用他方網站的定義 : http://ych0108.iteye.com/blog/2125427
空对象:
String s = null;
空对象是指定义一个对象s,但是没有给该对象分配空间,即没有实例化该对象,因此,空对象在调用所有对象方法时候都会抛出异常,如s.length(), s.isEmpty()等方法。
空值:
String k = "";
空值是指一个字符床对象已经实例化,即系统已经给该变量分配了空间,只是对象的内容为空。
空格:
String n = " ";
是指一个字符对象已经实例化,对象的内容为空格。
簡單的說,空對象null, 就是沒有實例化
而not null還有兩種的可能, 就是已經空值的實例 k.length() == 0 ; ,或是為空格的實例 n.length() 的输出值为1
2 ? 跟 :合用
問號的前面是判斷式,後面是回傳方法
而判斷為True時回傳冒號前的方法,判斷為False時回傳冒號後的方法
就著這段文字
(requestURI.length() == 0 ? request.getContextPath() : requestURI);
(requestURI.length() == 0是判斷式
如果結果為真則執行 request.getContextPath()
如果結果為假則執行 requestURI
這些觀念有了就能看懂這段程式
主要是判斷如果requestURI已經產生實例,則有兩種狀況
有可能為空值,那就傳回request.getContextPath()
如果唯有值則傳回之前存下來的字串requestURI