今天一大早去到學校,便開始編寫網上商城。寫到下午3點多,完成了!感覺十分的好,因為這是自己第一次將所學的WEB知識規整到一起了。做出來的成品,雖然不能拿出來展示(只是個練習,很多校驗沒加),但已經讓我十分開心了。以前為網上商城這個東西還是十分的恐懼,工程顯得比較龐大。其實加上了論壇和評論等功能,還是十分龐大的。
今天寫些什么好呢?把工程中的一個難點寫出來吧!
我們在添加書籍的時候可以添加一張書籍的照片,照片是存在硬盤目錄里的。而數據庫中保存的是照片在硬盤目錄中的路徑。
1. 如何獲取瀏覽器向服務器端發送過來的圖片文件?使用request輸入流嗎?太麻煩了!Apache組織為我們提供了一個方便的工具——commons-fileupload,它可以很好的解決這一問題。
2. 如何確保,圖片的名稱不一樣?當然是大名鼎鼎的UUID了,生成了一個不重復的隨機串就OK了!
我把代碼粘貼出來:
private String uploadFields(HttpServletRequest request, Map<String, String> map) { // 獲取request中的請求參數 DiskFileItemFactory dfif = new DiskFileItemFactory(); ServletFileUpload sfu = new ServletFileUpload(dfif); sfu.setHeaderEncoding("UTF-8"); String file = null; try { List<FileItem> list = sfu.parseRequest(request); // 遍歷所有參數 for (Iterator<FileItem> its = list.iterator(); its.hasNext();) { FileItem fi = its.next(); // 是否為表單字段,如果不是則為文件上傳輸入流。 if (!fi.isFormField()) { InputStream is = fi.getInputStream(); // 獲取圖片目錄 String dir = this.getServletContext().getRealPath("/") + "/images/"; File dirF = new File(dir); if (!dirF.exists()) dirF.mkdirs(); // 使用UUID創建文件名稱 file = UUID.randomUUID().toString() + fi.getName().substring( fi.getName().lastIndexOf(".")); // 寫出文件 byte[] buf = new byte[1024]; int len = 0; FileOutputStream fos = new FileOutputStream(new File(dir + file)); while ((len = is.read(buf)) != -1) { fos.write(buf, 0, len); } // 關閉流 fos.close(); is.close(); fi.delete(); } else { // 如果為表單字段,則將這些信息添加到map中返回給調用函數 // filter無法對文件上傳進行過濾,所以需要手動對編碼轉換。 map.put(fi.getFieldName(), new String(fi.getString() .getBytes("iso8859-1"), "UTF-8")); } } } catch (Exception e) { e.printStackTrace(); } // 返回在服務器保存后的文件路徑。 return "images/" + file; } |
然后老方在下午4點鐘時,給大家講解了訂單的提交。訂單提交是唯一涉及到多表操作的模塊,這也是練習的重點。一個多對多的設計方式。如下模塊流程圖。
看到里邊的orderitem和orders表了吧,這就是一個多對多的關系。Orderitem就是中間表,記錄訂單的的id和書的id,還包含數量和總計字段。這樣,添加訂單或是查詢訂單這樣操作起來更直觀方便些,這就是面向對象的有點。
訂單處理模塊中也是首次使用到MVC,以前我認為Servlet就是業務邏輯層,其實不是。Servlet只是個Web層(V)。通過今天老方的講解,我發現自己并未完全融入面向對象的設計模式,還有些面向過程的東西在影響著我。不過我想,這一點很快就會改變!
今天的練習確實達到的預期效果,雖然有些同學還未完成。不過,有的同學昨天晚上已經完成了,有的上午已經完成了。臥虎藏龍!我需要向他們好好學習。
今晚回來時我把老方的工程復制到工作空間里了,結果我的工程名與他相同。暈!幸好我的包名與他不同,只有幾個JSP頁面的名稱與他相同,嚇我一跳。我今天嘗試著將數據庫字段、request和response中的屬性名稱封裝到靜態類中,但操作起來十分不方便,比如編寫一個SQL語句。在大工程中,這肯定非常有用!
繼續整理工程去…
加油!