一.功能描述:

頁面如下所示:
運行報錯:
java.io.FileNotFoundException: E:\apache-tomcat-8.0.37\work\Catalina\localhost\20161013ShoppingCart\SESSIONS.ser (系統找不到指定的路徑。)
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:299)
at org.apache.catalina.session.StandardManager.unload(StandardManager.java:265)
at org.apache.catalina.session.StandardManager.stopInternal(StandardManager.java:384)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:221)
at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5533)
at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:221)
at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:821)
at org.apache.catalina.startup.HostConfig.undeploy(HostConfig.java:1395)
at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1321)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1581)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:284)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:95)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1140)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1376)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1380at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1348)
at java.lang.Thread.run(Thread.java:745)
定位到問題,發現是confirm無法獲取到books屬性導致如下代碼空指針異常。

二.問題如下:
1.進入不了confirm.jsp頁面:是因為打開了E:\apache-tomcat-8.0.37\work\Catalina\localhost\20161013ShoppingCart\org\apache\jsp\confirm_jsp.java文件。
涉及知識點:
Web容器處理JSP文件請求的執行過程主要包括以下4個部分:
1. 客戶端發出Request請求
2. JSP Container 將JSP轉譯成Servlet的源代碼
3. 將產生的Servlet源代碼經過編譯后,並加載到內存執行
4. 把結果Response(響應)至客戶端
很多人都會認為JSP的執行性能會和Servlet相差很多,其實執行性能上的差別只在第一次的執行。因為JSP在執行第一次后,會被編譯成Servlet的類文件,即.class,當再重復調用執行時,就直接執行第一次所產生的Servlet,而不再重新把JSP編譯成Servelt。因此,除了第一次的編譯會花較久的時間之外,之后JSP和Servlet的執行速度就幾乎相同了。
在執行JSP網頁時,通常可以分為兩個時期:轉譯時期(Translation Time)和請求時期(Request Time)
轉譯時期:JSP網頁轉移成Servlet類。
請求時期:Servlet類執行后,響應結果至客戶端。
轉譯期間做了兩件事情:
轉譯時期:將JSP網頁轉移為Servlet源代碼 .java.
編譯時期:將Servlet 源代碼 .java編譯成 Servlet類 .class.
當JSP網頁在執行時,JSP Container 會做檢查工作,如果發現JSP網頁有更新修改時,JSP Container 才會再次編譯JSP成Servlet; 如果JSP沒有更新時,就直接執行前面所產生的Servlet.
根據以上知識可知,我錯誤的原因在於:
當JSP網頁有更新修改時,confirm_jsp.java文件處於打開狀態即confirm_jsp.java文件無法被改動,此時JSP Container 無法將JSP再次編譯成 Servlet(無法更新confirm_jsp.java文件),因而運行confirm_jsp.class時不是最新的類,無法打開jsp頁面。
參考:http://zhidao.baidu.com/link?url=nr6hYXlgwXdGzGtj28ivQXhFp1YdKGsGbjBickkipI3cIoQ2kLO8BnYAWRJvz7zJsoo61HMdyOU-yyqfATsG-m1LaT0siFhXgwUJ9PMRT_m
2.每個頁面的sessionID不一樣(session丟失問題):是因為在IE瀏覽器里我禁用了cookie。
2.1疑惑:IE里瀏覽器的設置會影響到Eclipse的里的瀏覽器嗎?二者有何關聯?
2.2 瀏覽器和服務器之間如何傳遞session的?


2.3 不同頁面之間是如何傳遞session的?
只要瀏覽器不關閉,任意頁面的session都是同一個,代表着瀏覽器和服務器的一次會話。因此不同頁面之間可以利用服務器里進行
request.getSession().setAttribute(String attr)和JSP頁面里進行session.getAttribute(String attr,String attrVal)。
2.4 session丟失問題常見原因:
推測應該是沒有更新http response的頭部的set cookie屬性,導致session id沒有返回給客戶端。抓個包包看看服務端在發送重定向響應的時候有沒有把session id也放到response的頭 部。然后再看看客戶端在重定向再請求服務端的時候有沒有把session id帶上去
參考:http://blog.csdn.net/LLorJJ999/article/details/4107464
2.3 session丟失的解決方法:
3.每個頁面的sessionID一樣,但servlet1里設置request.getSession().setAttriubte(“books”,book)里設置session的books屬性,跳轉到step2.jsp卻無法獲取到session的book屬性。
servlet2里request.getSession().setAttriubte(“customer”,customer)里設置session的customer屬性,跳轉到confirm.jsp頁面卻可以獲取到session的customer屬性。這是為什么?同一session為什么不能獲取到session的所有屬性?
相關代碼如下:



打印信息如下:(在Servlet1和Servlet2中能獲取到session的book屬性,但是step1.jsp和step2.jsp不能獲取book屬性。customer屬性都正常)

原因:在step1.jsp和step2.jsp里我獲取session的book屬性是錯誤的!應該是books屬性!因為在servlet1里設置session的attribute時是設置的books屬性!如此低級的錯誤,真是對自己無話可說-_-||
完整代碼如下:

step1.jsp:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <h4>Step1:選擇要購買的圖書:</h4> 11 12 <% 13 System.out.println("step1.jsp--->sessionID:"+session.getId() ); 14 System.out.println("step1.jsp :MaxInactiveInterval"+session.getMaxInactiveInterval() ); 15 16 %> 17 <br> 18 19 <form action="<%= request.getContextPath()%>/processStep1" method="post"> 20 <table cellpadding="10" cellspacing="0" border="1"> 21 <tr> 22 <td>書名</td> 23 <td>購買</td> 24 </tr> 25 <tr> 26 <td>Java</td> 27 <td><input type="checkbox" name="book" value="java"></td> 28 </tr> 29 <tr> 30 <td>Oracle</td> 31 <td><input type="checkbox" name="book" value="Oracle"></td> 32 </tr> 33 <tr> 34 <td>Struts</td> 35 <td><input type="checkbox" name="book" value="Struts"></td> 36 </tr> 37 <tr> 38 <td>Spring</td> 39 <td><input type="checkbox" name="book" value="Spring"></td> 40 </tr> 41 <tr> 42 <td>Hibernate</td> 43 <td><input type="checkbox" name="book" value="Hibernate"></td> 44 </tr> 45 <tr> 46 <td colspan="2"> 47 <input type="submit" value="Submit"> 48 </td> 49 </tr> 50 </table> 51 </form> 52 </body> 53 </html>
ProcessServlet1.java:
1 package com.tt.javaweb; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.annotation.WebServlet; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import javax.servlet.http.HttpSession; 10 11 /** 12 * Servlet implementation class ProcessStep1Servlet 13 */ 14 15 public class ProcessStep1Servlet extends HttpServlet { 16 private static final long serialVersionUID = 1L; 17 /** 18 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 19 */ 20 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 21 22 //1.獲取選中的圖書信息:book 23 String[] books = request.getParameterValues("book"); 24 25 //2.把圖書信息放入到HttpSession中 26 HttpSession session = request.getSession(); 27 session.setAttribute("books", books); 28 29 System.out.println("Servlet1--->sessionID:"+session.getId()); 30 31 String[] books2=(String[])session.getAttribute("books"); 32 for(String temp:books2){ 33 System.out.println("servlet1,session attribute[[book]:"+temp); 34 } 35 36 //3.重定向頁面到shoppingCart/step2.jsp 37 System.out.println(request.getContextPath()+"/shoppingCart/step2.jsp"); 38 response.sendRedirect(request.getContextPath()+"/shoppingCart/step2.jsp"); 39 // request.getRequestDispatcher("/shoppingCart/step2.jsp").forward(request,response); 40 //f不同頁面之間怎樣保證相同的sesion 41 } 42 43 }
step2.jsp:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 11 <h4>Step2: 請輸入寄送地址和信用卡信息</h4> 12 <% 13 System.out.println("step2.jsp--->sessionID:"+session.getId() ); 14 System.out.println("step2.jsp,session attribute:[book]"+session.getAttribute("books") ); 15 System.out.println("step2.jsp :MaxInactiveInterval"+session.getMaxInactiveInterval() ); 16 %> 17 <br> 18 19 <form action="<%= request.getContextPath() %>/processStep2" method="post"> 20 <table cellpadding="10" cellspacing="0" border="1"> 21 22 <tr> 23 <td colspan="2">寄送信息</td> 24 </tr> 25 26 <tr> 27 <td>姓名:</td> 28 <td><input type="text" name="name"/></td> 29 </tr> 30 31 <tr> 32 <td>寄送地址:</td> 33 <td><input type="text" name="address"/></td> 34 </tr> 35 36 <tr> 37 <td colspan="2">信用卡信息</td> 38 </tr> 39 40 <tr> 41 <td>種類:</td> 42 <td> 43 <input type="radio" name="cardType" value="Visa"/>Visa 44 <input type="radio" name="cardType" value="Master"/>Master 45 </td> 46 </tr> 47 48 <tr> 49 <td>卡號:</td> 50 <td> 51 <input type="text" name="card"/> 52 </td> 53 </tr> 54 55 <tr> 56 <td colspan="2"><input type="submit" value="Submit"/></td> 57 </tr> 58 59 </table> 60 </form> 61 62 </body> 63 </html>
ProcessServlet2.java:
1 package com.tt.javaweb; 2 3 import java.io.IOException; 4 import javax.servlet.ServletException; 5 import javax.servlet.annotation.WebServlet; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 import javax.servlet.http.HttpSession; 10 11 /** 12 * Servlet implementation class ProcessStep2Servlet 13 */ 14 15 public class ProcessStep2Servlet extends HttpServlet { 16 private static final long serialVersionUID = 1L; 17 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 18 // TODO Auto-generated method stub 19 //1.獲取請求參數:name,address,cardType,card 20 String name = request.getParameter("name"); 21 String address = request.getParameter("address"); 22 String cardType = request.getParameter("cardType"); 23 String card = request.getParameter("card"); 24 25 //2.把用戶信息封裝成一個Customer對象 26 Customer customer = new Customer(name, address, cardType, card) ; 27 28 //3.把請求參數存入到HttpSession中 29 HttpSession session = request.getSession(); 30 session.setAttribute("customer", customer); 31 32 System.out.println("Servlet2--->sessionID:"+request.getSession().getId()); 33 System.out.println("servlet2,session attribute:[customer]"+session.getAttribute("customer")); 34 String[] books2=(String[])request.getSession().getAttribute("books"); 35 36 for(String temp:books2){ 37 System.out.println("servlet2,session attribute[[book]:"+temp); 38 } 39 40 //4.重定向頁面到confirm.jsp 41 System.out.println(request.getContextPath()+"/shoppingCart/confirm.jsp"); 42 // request.getRequestDispatcher("/confirm.jsp").forward(request,response); 43 response.sendRedirect(request.getContextPath() + "/confirm.jsp"); 44 } 45 46 }
confirm.jsp:
1 <%@ page import="com.tt.javaweb.Customer" %> 2 <%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <h4>Step3:訂單確認</h4> 12 <% 13 System.out.println("confirm.jsp--->sessionID:"+session.getId() ); 14 System.out.println("confirm.jsp,session attribute:[book]"+session.getAttribute("books") ); 15 System.out.println("confirm.jsp,session attribute:[customer]"+session.getAttribute("customer") ); 16 17 %> 18 <br> 19 <% 20 String [] books = (String[])request.getSession().getAttribute("books"); 21 Customer customer = (Customer)request.getSession().getAttribute("customer"); 22 23 24 //for(String temp:books){ 25 // System.out.println(temp); 26 //} 27 %> 28 29 <table> 30 <tr> 31 <td>顧客姓名:</td> 32 <td><%= customer.getName() %></td> 33 </tr> 34 <tr> 35 <td>地址:</td> 36 <td><%= customer.getAddress() %></td> 37 </tr> 38 <tr> 39 <td>卡號:</td> 40 <td><%= customer.getCard() %></td> 41 </tr> 42 <tr> 43 <td>卡的類型:</td> 44 <td><%= customer.getCardType() %></td> 45 </tr> 46 <tr> 47 <td>Books:</td> 48 <td> 49 <% 50 for(String book: books){ 51 out.print(book); 52 out.print("<br>"); 53 } 54 %> 55 </td> 56 </tr> 57 </table> 58 59 </body> 60 </html>
