基於session的簡易購物車引發的問題


一.功能描述

 頁面如下所示:

 

 

運行報錯:

 

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>

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM