朕JAVEE 實驗04 實驗報告

  • 項目描述

項目名字

所用知識點

項目效果

Lab 12

會話管理與數據傳遞

①能使用過濾器將所有Sevlet統一編碼

②Cookie專題:能通過Cookie傳遞樣式表信息,能輸出Cookie的一些屬性和方法

③hidden專題:能添加客戶,編輯用戶,顯示用戶列表

④session專題:將老師程序解耦爲product和cart兩個Servlet交互。通過txt文件讀入產品信息,添加店鋪和庫存信息,若商品售光則不予顯示。購物車能合併相同商品的不同訂單,購物車按照店鋪>產品分組顯示。將不合理的訂單或其他錯誤信息顯示給客戶。更正了原項目刷新導致表單重複提交的錯誤。

⑤url專題:添加了城市“雲南”。點擊城市能分頁顯示其十個特色景點。

Lab 13

JSP、Servlet、EL表達式的應用

用相應知識點展示了一個小故事。

Lab 14

JSP、JSTL、EL表達式的示例應用

①用兩種URL快捷登錄

②設置、傳遞、展示了Cookie信息

③一些服務器信息的展示、不同域變量的設置和展示

④模擬超市,進行頁面信息的交互

Lab 15

javaBean作用域

①做了javaBean使用域分別爲page、request、session、application的登錄頁面

②page:無論登錄幾次,都是第一次登錄

③request:通過include到success頁面,顯示出類通過requst共享。即一次登錄,會因爲success頁面,而變成兩次登錄

④session:登錄幾次就是幾次,關掉瀏覽器會失去信息

⑤application:即使關掉瀏覽器,再打開,其登錄次數的數據不會丟失

 

  • 問題描述

問題1描述:在刷新Product頁時,發現瀏覽器果然重複了加入購物車操作,即重複提交表單。如圖:

問題分析:肯定是購買數據在使用後未清零。但是後續發現由於是getParameter,並不能進行變量的修改。

問題解決:將購買訂單增添一個獨一無二的timeId,將上一個時間timeId儲存在session中,如果發現訂單與session的timeId相同,則判斷爲重複提交表單,不予處理。

 

問題3描述:如圖:

問題分析:代碼沒寫完整。

問題解決:補全代碼。(雖然問題很一般,但這個警告很獨特,留作紀念。)

 

問題4描述:嚴重: Servlet.service() for servlet [ShoppingProductServlet] threw exception

java.lang.StackOverflowError

at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:306)

at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:306)

at org.apache.catalina.core.ApplicationHttpRequest.setAttribute(ApplicationHttpRequest.java:306)

問題分析:由於.StackOverflowError,可能是兩個Servlet的相互調用陷入死循環。

問題解決:分析邏輯,解開死循環。

 

問題5描述:java.lang.IllegalStateException: Cannot forward after response has been committed

at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:323)

at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)

問題分析:是txt路徑問題。

問題解決:百度,尋找到txt合適的存放路徑,並且合理取出。

 

  • 知識點總結

【1】@Override

       答:@Override是僞代碼,表示重寫。(當然不寫@Override也可以),不過寫上有如下好處: 1、可以當註釋用,方便閱讀;2、編譯器可以給你驗證@Override下面的方法名是否是你父類中所有的,如果沒有則報錯。例如,你如果沒寫@Override,而你下面的方法名又寫錯了,這時你的編譯器是可以編譯通過的,因爲編譯器以爲這個方法是你的子類中自己增加的方法。

 

【2】Cookie MaxAge屬性及其使用

       答:public void setMaxAge(int expiry); maxAge 可以爲正數,表示此cookie從創建到過期所能存在的時間,以秒爲單位,此cookie會存儲到客戶端電腦,以cookie文件形式保存,不論關閉瀏覽器或關閉電腦,直到時間到纔會過期。可以爲負數,表示此cookie只是存儲在瀏覽器內存裏,只要關閉瀏覽器,此cookie就會消失。maxAge默認值爲-1。

還可以爲0,表示從客戶端電腦或瀏覽器內存中刪除此cookie。

 

【3】eclipse寫JAVA相對路徑的總結

答:使用工程相對路徑是靠不住的。使用CLASSPATH路徑是可靠的。對於程序要讀取的文件,儘可能放到CLASSPATH下,這樣就能保證在開發和發佈時候均正常讀取

在Java開發工具的project中使用相對路徑

在project中,相對路徑的根目錄是project的根文件夾(與src平級)了。

創建文件的寫法是:

File f = new File("src/xxx/a.txt");

File f = new File("xxx/b.txt");

注意:路徑不以“/”開頭;

 

通過CLASSPATH讀取包內文件

讀取包內文件,使用的路徑一定是相對的classpath路徑,比如a,位於包內,此時可以創建讀取a的字節流:

InputStream in = ReadFile.class.getResourceAsStream("/com/lavasoft/res/a.txt");

注意:這裏必須以“/”開頭

獲取CLASSPATH下文件的絕對路徑

當使用相對路徑寫入文件時候,就需要用到CLASSPATH絕對路徑(Eclipse中是bin目錄)

 

  • 思考題

【1】servletDataPass.url

① 請選一個自己感興趣的城市,列舉十個地點,加入到頁面中

答:項目效果如圖。

 

② 體會和理解用request和response通過頁面傳值的情況

request.getRequestDispatcher("a.jsp").forward(rquest,response)只能轉到同一個Web應用程序中的某個資源;可以共享request中的數據;地址不變化。

response.sendRedirect("b.jsp")可以重定向到任何URL;數據不共享;地址欄也會變化。

response.setHeader("REFRESH", stayTime+";URL="+URL)重定向有延遲時間。

Request頁面傳值可以通過使用requst域中的變量、信息,進行傳值。使用request.setAttribute()、request.getParameter()等。

Response頁面傳值可以將參數寫在URL上,如url+”?變量名=變量值”+“&”+”另一個變量名=變量值”。

 

③ 思考,用Servlet的方式,頁面間傳遞了哪些數據?以什麼樣的形式傳遞數據的?數據的封裝形式是什麼?

答:頁面間傳遞了city、page數據。傳遞數據的行爲封裝成URL,數據在URL中以相應格式的字符串存儲。以URL形式傳遞。取出數據的行爲封裝爲request.getParameter函數。

 

【2】servletDataPass.hidden

① 包中有多少次處理中文亂碼的地方?

       答:4次。CustomerServlet的sendCustomerList、sendEditCustomerForm、doGet、doPost。

 

② 能不能將這些處理封裝在一個過濾器中來完成?

       答:能。依舊刪掉Servlet相關編碼信息,使用過濾器編碼格式,在xml中,此過濾器的url-pattern爲/*,他能爲項目內所有Servlet設置編碼。

 

③ 自行添加過濾器,完成全包統一編碼,處理中文亂碼問題

       答:見項目。

 

④ 自行添加一個客戶的信息

       答:項目效果如圖。

 

⑤ 隱藏域在哪裏?在傳遞數據時,它是怎麼發揮作用的?

       答:隱藏域的代碼格式爲:<input type="hidden" name="..." value="...">其中,type="hidden"定義隱藏域,name屬性定義隱藏域的名稱,要保證數據的準確採集,必須定義一個獨一無二的名稱,value屬性定義隱藏域的值。

隱藏域是用來收集或發送信息的不可見元素,對於網頁的訪問者來說,隱藏域是看不見的。當表單被提交時,隱藏域就會將信息用你設置時定義的名稱和值發送到服務器上。

 

[3] servletDataPass.cookie

① Cookie在哪裏設置的,在哪裏用的?

       答:此項目中,Cookie在PreferenceServlet裏設置。CookieClassServlet通過獲取Cookie中的"maxRecords"值,調節展示的Cookie方法名的數目。CookieInfoServlet通過獲取Cookie中的值,進行樣式修改。

 

② 在瀏覽器中,怎麼查看Cookie?

       答:程序員可以通過寫代碼查看,如項目中,先使用“request.getCookies()”獲取Cookie對象,再遍歷其中的信息,再進行打印輸出。

而針對直接查看瀏覽器的Cookie,不同瀏覽器有不同的方法。如ie瀏覽器,可按F12進入瀏覽器的開發者模式——console——在命令行輸入javascript:alert(document.cookie),再回車。Chrome瀏覽器,點擊url左邊的文本圖標, 單擊cookie。如圖。

 

③ 自行添加過濾器,完成全包統一編碼,處理中文亂碼問題

       答:建立過濾器,在其中進行編碼設置,並且將請求轉發給過濾器鏈上下一個對象。應當注意的是在xml配置中,此過濾器的url-pattern爲/*。

 

④ Cookie中有哪些方法,一般可用於做什麼?

void  setMaxAge(int expiry)

設置cookie的有效期,以秒爲單位

String getMaxAge()

獲取cookie的有效期,以秒爲單位

void  setValue(Stringh newValue)

在cookie創建後,對cookie進行賦值

String getName()

獲取cookie的名

String getValue()

獲取cookie的值

 

⑤ 導航菜單是怎麼產生的,如何發揮作用的?

       答:Servlet寫頁面時,都使用了“PreferenceServlet.MENU “,而我們追溯MENU,發現它是PreferenceServlet中的String全局變量,採用的html格式,具體內容爲導航菜單。在各Servlet中,在寫頁面時,在合適處直接插入PreferenceServlet.MENU,便可以得到導航菜單。

 

⑥ 樣式表是怎麼產生的,如何發揮作用的?

       答:樣式表是通過設置html中相應style格式的字符串內容,再在Servlet寫頁面時,在合適處插入此字符串內容,頁面以html直接編譯爲具體含義,由此獲得樣式表,併發揮樣式表作用。

 

⑦ 樣式中的字色是如何控制的?

       答:首先有默認字色,其次如果在PreferenceServlet中修改了“字色“表格的值,則在點擊“設置Set”時,Servlet會調用doPost()方法,並在其中獲取表格信息,加入Cookie中。而頁面的字色在顯示前,會從Cookie中獲取相應值,再進行顯示。

 

【4】servletDataPass.session

① JavaBean在哪裏,有幾個Bean,在這個Bean中有哪些項?有沒有無參構造函數?

       答:servletDataPass.session包內的Product.java、ShoppingItem.java,共兩個。沒用無參構造函數。

 

② 購物車在哪裏?有哪些具體的功能?

       答:購物車在

 

③ 觀察它的web.xml中的描述符,根據url-pattern可知,這一個Servlet完成哪些功能?

答:/products展示所有商品,/viewProductDetails獲悉個體商品的詳細信息,/addToCart添加商品進購物車,/viewCart查看購物車。

 

④ 如果把上述功能分散到不同的Servlet中,應該如何進行解耦?

       答:展示商品、獲悉商品詳情可以在一個Servlet,加商品進購物車、查看購物車應該是另一個Servlet。

 

⑤ 如果產品數據不在初始化時創建,在文件中如何讀取呢,可不可以做成可以自由管理的產品?

答:可以做成。只需要將文件信息先讀出來,再自由管理,再將產品數據、購物車數據導出成文件。

 

⑥ 爲何產品列表不需要request,而產品詳情需要request對象?購物車也需要request對象嗎?

       答:因爲在老師項目中,產品信息是在類初始化的時候直接存在類變量中,可以直接For循環打印。但是產品詳情是針對用戶點擊的產品,瀏覽器將與用戶交互的信息存在request中。需要,因爲購物車添加的商品及其數量也是從瀏覽器與用戶的交互信息中取出。

 

⑦ 如果讓你處理那些未處理的異常,你有什麼思路?你可能怎麼給出用戶提示?

       答:首先try..catch捕獲異常,標記到日誌,然後進行頁面上的相應反饋。如產品購買數量大於產品庫存,則如天貓、淘寶一般,在購物車處顯示錯誤。

 

⑧ 查看產品詳情時,id號是何傳進行數據傳遞的?用的是什麼技術?

       答:項目中,id是通過表單傳遞的,使用了隱藏域。詳情見【2】servletDataPass.hidden⑤隱藏域處。

 

⑨ session在哪裏,它的作用是什麼?怎麼產生的,在哪裏用的?

       答:瀏覽器第一次訪問服務器會在服務器端生成一個session,有一個sessionid和它對應。Tomcat 生成的sessionid叫做jsessionid。

Java中的session

創建

sessionid第一次產生是在直到某server端程序調用 HttpServletRequest.getSession(true)這樣的語句時才被創建。

刪除

超時;程序調用HttpSession.invalidate();程序關閉。

(Session不會因爲瀏覽器的關閉而刪除)

session的id

當客戶端第一次請求session對象時候,服務器會爲客戶端創建一個session,並將通過特殊算法算出一個session的ID,用來標識該session對象。

tomcat的ManagerBase類提供創建sessionid的方法:隨機數+時間+jvmid。

 

項目中,session在服務器端程序運行的過程中創建的(這裏表現爲在第一次進入瀏覽器)。session在doPost()中,加入商品進購物車時。由request.getSession()調出使用,後統一加入商品。在showCart()中,查看購物車的時候調出使用。主要方法是先從session中獲取變量,再變量修改,再將變量修改同步進session。

 

⑩ 多次測試後,你覺得這個購物車有哪些方面需要改進?

  • 產品缺少店鋪信息、庫存信息。
  • 購物車缺少折扣(滿減)等情況
  • 購物車劃分等級應該爲 店鋪>產品
  • 購物車不能進行選擇購買
  • 購物車不能對已有的產品進行修改(或與產品信息同步變更)
  • 購物車不能將同樣產品進行數目疊加
  • 購物車不能在結賬時進行優惠卷、滿減
  • 購物車不能在結賬之後生成訂單
  • 未向用戶進行反饋(如購買數量爲負數時,只是不操作而已)
  • 在購物車裏已有物品時,點擊刷新產品Products頁,購物車會直接添加上一次選中購買的物品(重大失誤)。

 

⑪ 多添加幾種產品進來?能做到嗎?

       答:能。比如說我通過txt文件傳入更多產品數據。

 

⑫ 這個購物車可以清空嗎?關閉瀏覽器再打開或是換一個別的瀏覽器後,這個購物車還在嗎?

       答:購物車已經排除購買負數數量的產品,又不提供刪改操作,是不能直接清空購物車的。但我們知道cart是存放在session上的,關閉瀏覽cart就不在了。

進行關閉瀏覽器再打開或是換一個別的瀏覽器操作後,遇到的問題是此網頁完全打不開。

⑬ 百度一下,企業級的購物車,應該具有有哪些功能?

  • 已選中商品的金額計算
  • 修改規格
  • 商品數量、價格的自動更新(如商品已下架、已打折)
  • 促銷活動顯示、優惠券領取
  • 分組(店鋪>>活動>>商品)
  • 生成訂單

 

  • 心得

項目工期一直在拖延,說星期三做完,結果星期四搭進去了一整天才能做完。這體現我對項目量、自己繞的冤枉路長度的錯誤評估。另外自己對於文檔的太過執着,目前都4000+字了,讓自己疲憊不堪,素材卻還沒寫完。很可能項目的生命線被文檔拉長了。

很滿意自己在寫代碼前進行了完整的設計,這讓我沒有繼續上次代碼重構的冤枉路,但是!這次我踏進了左右手不協調的冤枉路,將form錯打成from卻不自知。於是在提交表單時完美失誤,這樣的失誤讓我將代碼邏輯從頭到尾判斷了一遍,甚至開始絕望。在漫長的debug之後,我甚至想到是不是form的位置不對,也是這個想法,讓我發現了單詞拼寫的失誤。甚是同情自己,但也知道自己這一個多小時內對之前知識進行了鞏固。希望自己喫一塹長一智。

現在的問題是,我將項目設計很美好,但沒有足夠的勝負欲迫使自己達到相應設計。項目還是半成品,我就結束了編程。可能以後自己就有勝負欲了吧。

 

僅以紀念2019年第4次javaee實驗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章