今天是專題發表前的最後一個假日,目前大部分修改都差不多了,記錄一下這半年來利用所學所完成的專題成果。如果您沒學過程式這篇文章有些地方會難以理解,也就是說若上完半年資策會Java課程後程度類似這樣囉。
本組專題是製作一個購物網站。購物網站除了一般消費者可以看到前台部份外,產品的上下架,會員的管理,訂單的管理等也需要一個後台來維護,因此我的功課是完成產品上下架還會員管理的功能。
由於網站的美工排版也是很耗時的工作,但有了bootstrap這好用的工具一切就交給它吧。在Start Bootstrap這個網站上找到一個適合做為後台介面的樣板(SB Admin)直接套上去就行了
要登入管理後台當然要先有管理員權限囉,由於登入的是管理員而非一般會員,因此管理員名單就直接在資料庫修改了。
登入這邊我只寫個簡單的Filter(Filter讓我頭很痛,在驗證登入這邊一直出現無窮迴圈的錯誤...),如果帳號不存在,或是密碼錯誤在Servlet就把錯誤訊息用request.setAttribute放好並forward回去JSP,然後用EL顯示出錯誤提示。
若曾經登入過在Session未消滅的情況下就會自動登入囉。其實應該再做個Cookie記住密碼還有閒置自動登出功能的,但時間不夠所以只能之後另做練習了。
管理會員這邊沒什麼功能,只能刪除會員和把會員設為黑名單(功能是一旦會員被設定為黑名單就不能留言了,但做前台的同學沒有把這功能做出來)。
黑名單狀態抓個Bootstrap Swtich做成類似開關的模樣(不就是個checkbox),也是花了我一陣子才知道如何操作,因為文件對於事件的觸發寫得好少,上Stack Overflow查才知道怎麼操作的(天阿,真難想像沒有這個網站要去問誰,可以說80%的問題就是在這網站找答案解決的,希望有一天自己也能上去幫人回答問題。另外一個MKyoung網站則提供了很多關於Hibernate的教學範例,推薦)。
另外一個目前無法解決得問題是每次從資料庫查詢出來的狀態好像都會被不知道哪裡的cache所影響,所以調整黑名單狀態後會慢好幾拍頁面上的開關位置才會正確顯示,hibernate的second-cache明明都設成false而且查詢完還把session給close掉還是沒辦法。
管理產品頁面,功能包括根據產品主類別及次類別篩選產品,關鍵字查詢產品(jQuery AutoComplete Widget),刪除產品。產品的展現全都是利用Ajax寫出的。
第一次寫得有點辛苦,原本ajax及附加元素都用javascript寫,後來覺得應該要練習jQuery,用了之後就不想回頭用javascript寫了,但按照昨天ZK的簡單面試的經驗,如果要走前端javascript是一定要超級熟才行,不能只光會jQuery,如教學認真的吳永志老師(資策會常看到的那位中壢的吳老師,我們班的Hibernate及Struts是吳老師教的。吳老師教學超級用心,為了讓同學搞懂總是額外利用自己的時間幫同學補充,上到晚上九點多是很正常的事,真得覺得吳老師都快爆肝了,菸真的要少抽一點)說的一樣,好的框架用久真的慢慢無行為能力變白痴(因為框架是建構在Java基礎語法上頭的,框架很好用的話基礎會變得生疏)。
新增產品,把資料塞進資料庫囉,點選上傳檔案可以把圖片秀在下面的img方框內,送出用Ajax來submit表單資料,將圖片從jsp傳遞到Servlet。還有圖片的儲存資料夾這問題困擾了好一陣子,但走過之後就似乎沒什麼了,剛開始真是一個頭兩個大。
還有Hibernate many to one,one to many及delete cascade的設定也是搞了好久,到現在用hibernate很怕碰到有foreign key設定的資料表動作,感覺怎麼比JDBC還麻煩。
修改產品的問題其實與新增產品類似,但修改其他圖片在業務邏輯上可真苦惱,所以乾脆只要修改圖片就會把原來的舊圖片全刪了,要不然舊圖會永遠躺在資料夾裡占用硬碟空間直到空間不夠。
上課老師一直提到MVC架構很重要,所以一開始寫就參考(抄襲)吳老師的範例(IBMxxxx),從資料庫存取的VO(JavaBean), DAO(Model),管理各種方法的Service,處理前端傳來的資料的Servlet(Controller),到呈現畫面的jsp(View)。
Package名稱寫得太偷懶,應該改成xxx.xxx.xxx這樣。
products.jsp,產品呈現都是用ajax去呼叫Servlet傳回jsonString(使用simple json libarary)然後在append上去的,用了ajax就不想用jsp普通的submit去叫Servlet了。
ProductServlet,只要是管理產品頁面的按鈕都會呼叫到這隻程式。
ProductDAO,用來存取資料庫的程式。從不會到會最簡單的作法就是先抄襲啦,抄到後來就會了。
使用Hibernate來存取資料庫要做一堆複雜的設定,還沒時間去看官方文件呢,一知半解就直接用了,碰到問題再上網找google大神吧。
也是hibernate的相關設定,常常改了A忘了B,改了資料庫欄位,務必記得要改這裡,JavaBean對應的property,DAO內寫好方法參數,每個字都要仔細核對,最常碰到的蠢問題就是product打成proudct這種typo的問題(所以使用及帶入變數時最好都用複製貼上),這種錯誤都要抓半天,但三折肱為良醫,同樣的錯誤碰多了很直覺的可以馬上抓出問題(多虧了錯誤訊息,老師說的沒錯,錯誤訊息是程式設計師的好朋友,越是理解它,錯誤越好抓)。可以看到因為資料表沒正規化所以是這個模樣,也只能靠sql語法去解決了。
以上其實花了我半個月的時間了,畢竟是第一次實作阿,但親手做了才是真的有學到的感覺,很有成就感,但可惜就是做得不夠多,很想把別人要負責的部份也拿來自己全部做一做好了。
心得是覺得寫程式有點像是寫作文,不知道從何就先從最簡單的寫就對了,邊寫邊思考,有問題再來修正,一開始寫專題時也不知該從何下手,所以我就從最簡單的html頁面開始寫,在試著將form表單的資料傳到Servlet,如此下去就搞清楚是怎麼回事了。
像有些同學就是想把老師上課教的範例還有課本念完才想動手做,但其實這樣反而學得慢且沒效率,因為程式這種東西真的是要透過"寫"及"Run",出錯誤,找答案這個過程才能融會貫通並內化成為自己的東西,但光看書沒試著做就如同別人直接給你答案一樣,很難印象深刻。
另外在學程式之前不太懂查google大神的道理,現在已經了解那是什麼意思了,正確來說應該是程度必須到達某個門檻以後google才會非常有幫助,由於google上查到的都是片段的答案,所以學程式沒先到達某個門檻那些片段的解答反而會讓人更迷糊。
雖然課程教了很多東西,但很多沒碰就忘了,像是資料表的正規化,Spring, Struts, Https的設定,RESTful...,Android,還要找時間練習才行。
沒有留言:
張貼留言