Java工程師培訓課(十七【新的領域】)
夜光序言:
你不願意種花,你說,我不願看見它一點點凋落。是的,為了避免結束,你避免了一切開始。
但是.............這樣就好了麼?
正文:
叮咚購書商城功能說明書:
一、物件-領域模型-需求分析
被管理物件,是系統操作、資料流轉、資料封裝的主要物件。一般情況下稱為領域模型。一張表,與一個JavaBean形成一一對應關係,即領域模型。
通過以下分析,應該生成表結構。JavaBean物件。
1、圖書分類
分類:types |
||||
列名 |
名稱 |
主否主鍵 |
長度 |
備註 |
id |
|
Y |
Varchar(32) |
|
name |
|
|
|
|
descr |
說明 |
|
|
|
|
|
|
|
|
2、圖書
圖書是系統是管理的主要物件。
圖書:books |
||||
列名 |
名稱 |
主否主鍵 |
長度 |
備註 |
id |
|
Y |
Varchar(32) |
|
name |
|
|
|
|
price |
|
|
|
原價 |
auth |
|
|
|
|
img |
圖片名稱UUID |
|
|
只儲存圖片的名稱全名。不用打散目錄。 |
rebate |
折扣 |
|
numeric(3,2) |
0.xx保留兩位 |
stock |
庫存數量 |
|
int |
|
publisher |
出版社 |
|
|
|
publishdate |
出版時間 |
|
|
yyyy-MM-dd |
pages |
頁數 |
|
|
|
size |
開本 |
|
|
16開,8開等 |
printtimes |
印次 |
|
int |
主要記錄第幾次印刷 |
versions |
版次 |
|
int |
主要記錄第幾個版本 |
brief |
內容簡介 |
|
Text || varchar(2000) |
|
content |
目錄 |
|
Varchar(4000) |
必須以HTML形式儲存。顯示格式良好的HTML文件。 |
|
|
|
|
|
onlinetime |
上架時間 |
|
|
用於設定是何時上架的。Yyyy-MM-dd |
3、圖書分類和圖書關係表
一本書可能會屬於多種分類。所以應該是多對多的關係。至少一本書,要屬於一種分類
booktype |
||||
列名 |
名稱 |
主否主鍵 |
長度 |
備註 |
Bookid |
|
|
|
外來鍵 |
typeid |
|
|
|
外來鍵 |
|
|
|
|
|
|
|
|
|
|
priamy key(booki,typeid)
3、管理員
維護人員,是系統的管理員。對於不同的管理員,應該具有不同的功能。
管理員:admins |
||||
列名 |
名稱 |
主否主鍵 |
長度 |
備註 |
id |
|
Y |
Varchar(32) |
|
name |
|
|
|
不能相同 |
password |
|
|
|
需要MD5加密,使用Spring的MD5演算法 |
sex |
|
|
|
|
|
|
|
|
|
descr |
|
|
|
|
|
|
|
|
|
4、使用者表-即註冊成為本網會員的使用者
Users: |
||||
列名 |
名稱 |
主否主鍵 |
長度 |
備註 |
id |
|
Y |
|
|
name |
|
|
|
不可以重複 |
password |
|
|
|
|
phone |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5、使用者收貨地址列表
一個使用者可以擁有多個收貨地址,但多個收貨地址,只可以一個有效。一個使用者,最多隻能擁有5個收貨地址。
address: |
||||
列名 |
名稱 |
主否主鍵 |
長度 |
備註 |
id |
|
Y |
|
|
name |
收貨人姓名 |
|
|
不可以重複 |
|
|
|
|
|
phone |
收貨人電話 |
|
|
必須輸入 |
zip |
收貨人郵編 |
|
|
|
dft |
是否是預設收貨地址 |
|
Char(1) |
1:是,0:否。 |
userid |
Users表的外來鍵 |
|
|
|
mktime |
設定時間 |
|
|
按時間倒序排列 |
|
|
|
|
|
6、使用者訂單表
記錄使用者已經交易成功,或是沒有交易成功的所有記錄。對於已經發貨的交易,使用者不可以取消。只可以在收貨後再做退貨處理。
且退貨狀態,只可以由維護人員完成。使用者無權在頁面上設定狀態為退貨。
orders: |
||||
列名 |
名稱 |
主否主鍵 |
長度 |
備註 |
id |
訂單編號 |
Y |
|
訂單生成規則為User.hashCode+ ddHHmmssSSS不可以使用同步。 |
userid |
所屬使用者ID |
F |
|
|
consignee |
收貨人明細資訊 |
|
Varchar(300) |
將收貨人資訊全部寫入此處。保證在修改了原始收貨資訊後,不會影響到已經生成的訂單。如:張三,廣州天河區棠東東路,13146789813。 |
paytype |
付款方式 |
|
Char(1) |
1:貨到付款,2:網上支付。 |
amt |
訂單總金額 |
|
Numeric(10,2) |
|
state |
訂單狀態 |
|
|
0:客戶已經提交,等待發貨。1商家已經發貨2:交易已經完成,3:交易取消。4:客戶已經退貨。 |
orderdate |
下單時間 |
|
|
Yyyy-MM-dd HH:mm:ss |
|
|
|
|
|
7、訂單明細
訂單明細,主要記錄一張訂單的詳細內容。修改源資料後,不應該對已經買過的商品產生任何影響。所以,應該將產品資訊,全部拷貝到明細中來。
orderline: |
||||
列名 |
名稱 |
主否主鍵 |
長度 |
備註 |
id |
|
Y |
|
|
orderid |
所屬於的訂單編號 |
|
|
|
bookid |
圖書id |
|
|
只需要儲存id,查詢時也可以帶更多的資訊。需要JavaBean的資訊比表多。需要時再新增即可。 |
Amt |
數量,如購入了幾本 |
|
|
|
price |
價格 |
|
|
|
|
|
|
|
|
二、詳細設計
1、根據需求分析完成表結構。
略
2、根據需求分析完成領域模型的建立
略。注意建立實體之間的關係。
3、建立JavaWeb專案(搭建基礎環境)
建立一系列的公共元件:gz.itcast.util
3.1 EncodingFilter - 字元編碼過濾器(GET和POST字元編碼過濾器統一為UTF-8)
3.2 ValidateCodeUtil- 驗證碼生成工具類
3.3 MD5Util - MD5加密字串工具類(MessageDigest)
3.4 WebUtil - 拷貝請求資料到javabean的工具類
3.5 BaseServlet - 控制層servlet的基礎類, 具體業務servlet繼承此類。
3.6 BaseDao<T> - 資料訪問層泛型DAO ,具體業務dao繼承此類
4、開發客戶端程式
開發要求:
1、任意使用者都可以登入本系統瀏覽。
2、使用者選購圖書時,必須是已經註冊使用者。沒有註冊的使用者不可以在本系統中購買。
3、使用者購買的所有圖書,可以永久的保在使用者的訂單系統中。
4、提供使用者註冊功能。
5、使用者登入,檢視訂單進度。歷史訂單資訊等。
6、使用者登入後,修改收貨人地址資訊。
7、在沒有發出貨物之前,使用者可以取消訂單。
4.1、功能-實現主頁的顯示
實現主頁顯示。
主要解決的問題:主頁如何演示,如何顯示分類,如何顯示圖書。
4.2、實現使用者註冊
只有註冊使用者才可以在本系統是購物。
4.3、功能-實現使用者登入
使用者只有在成功登入後才可以將商品新增到購物車中。
4.4、實現使用者購物
使用者購物的過程就是將產品不斷的向購物車中新增的過程。
4.5、實現使用者提交訂單
使用者只有在提交了訂單以後,才可以將本次所購買的所有資訊儲存到訂單及訂單明細表中。使用者在提交了訂單以後,可以不支付,也可以繼承支付。系統將自動計算本次費用總和。
如果使用者選擇是貨到付款則直接提交訂單。如果使用者選擇銀行支付,則轉到銀行的支付閘道器。
4.6、實現使用者查詢訂單進度,訂單明細功能
5、開發後臺程式
1、管理員登入。
2、管理員新增分類資訊。
3、管理員新增一本圖書。
4、管理員修改、刪除一本圖書。
(更加高階的功能)
5.1、功能-實現維護人員登入
僅管理使用者登入。
5.2、功能-實現增加分類
在表單中增加一個新的分類。所有分類,都是頂層分類。目前先不涉及子分類。
5.3、功能-實現增加圖書
在儲存圖書時,必須要選擇此圖書是何種分類。至少選擇一項。
未來可以擴充套件的功能:
1, 實現網站線上支付功能。對接第三方支付平臺(如易寶支付)
2. 使用者註冊成功後需通過郵件啟用,以及訂單生成後,通過傳送郵件給使用者提醒。
3. 後臺區分不同分角色的管理員,實現不同角色的管理員擁有不同系統操作許可權,更加靈活。
4. 購物車資訊儲存到資料庫,這樣使用者下次登入後依然可以看到上次加入購物車的圖書。
..........
一、密碼採用使用MD5加密
使用MD5加密之後再儲存到資料庫
md5演算法是生成一個32位的16進位制的字串
12345 -> fdfdfrerer
root -> dsdfxcv
二、資料庫設計
一對多的關係:在多方表設計一個外來鍵
多對多的關係: 獨立設計一個關係表,存放兩張表的外來鍵
三、收貨地址
Struts2入門
1.1 簡介
Struts2就是基於MVC模式的開發框架,對servlet技術的封裝!!!!
回顧MVC模式:
M: Model 模型。使用javabean技術,對業務資料的封裝
V: View 檢視。 使用jsp技術,對業務資料的顯示。
C:Control 控制器。使用servlet技術
控制器的作用:
1)接收請求,獲取使用者的引數
2)呼叫業務邏輯處理方法
3)獲取結果,導航檢視,把結果顯示檢視中。
需求: 使用者登入和註冊功能(使用者模組)。使用MVC模式進行開發。
設計:
dao層:
UserDao類:
queryUser(User user); //查詢登入使用者
addUser(User user);//新增使用者方法
service層:
UserService類:
login(User user);//登入業務方法
register(User user);// 註冊業務方法
web層:
一個功能對應一個Servlet類
登入功能: LoginServlet類 : /login訪問
處理登入請求
跳轉到檢視(jsp)
如果是登入成功
跳轉到主頁
否則,不成功
跳轉到失敗頁面
註冊功能: RegisterServet類: /register訪問
處理註冊請求
跳轉到檢視(jsp)
註冊成功,
跳轉到登入頁面
關注: 能不能優化web層的MVC的程式碼呢???
現狀: 一個功能對應一個Servlet處理類,這樣的話專案管理的servlet就會很多!!!管理web.xml檔案很麻煩!!更多的servlet物件會消耗更多的伺服器記憶體。(單例)
目標: 一個專案只對應一個Servlet處理類。
1.2 自定義Struts2框架
編寫ActionServlet類,這是核心控制器類,在這個類讀取mystrus.xml檔案
(為了瞭解struts2框架的核心原理)
2 Struts2的使用
2.1 使用步驟
1)匯入strust2的支援jar包
commons-beautils [beanutils工具包]
commons-filupload.ajr [檔案上傳]
commons-io.jar
commons-lang [struts2對java.lang.*類的支援]
freemarker.jar [檢視顯示技術]
javassit [struts2對位元組碼運算的支援]
ognl.jar [struts2對ognl表示式的支援]
struts2-core.jar [ struts2的核心包 ]
xwork-core.jar [webwork框架的支援,struts2的前身就是webwork(對webwork的封裝)]
2)配置啟動的全域性的過濾器(Filter) - 和ActionServlet類似!!!
在web.xml中配置
<!-- 配置啟動strut2的全域性過濾器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <!-- 過濾所有請求 --> <url-pattern>/*</url-pattern> </filter-mapping> |
3)編寫不同的業務Action類,編寫不同業務方法。預設execute方法。
public class LoginAction implements Action{ //預設方法 public String execute() throws Exception { System.out.println("執行了LoginAction的execute方法"); return "success"; }
} |
4)在src目錄下(類路徑的根目錄下),新建一個struts.xml,配置Action物件
<struts> <package name="xxx" extends="struts-default">
<!-- 配置Action http://localhost:8080/day28_struts/login.action--> <action name="login" class="gz.itcast.action.LoginAction"> <result name="success" type="redirect">/index.jsp</result> </action> </package>
</struts> |
5)訪問Action的業務方法
http://localhost:8080/day28_struts/login.action
2.2 struts2框架的作用
strurs2是基於MVC開發模型的web層框架。
struts1也是MVC開發模式的框架。struts2並不是struts1的升級版。
struts2是基於webwork的升級版。struts2=webwork+sturts1
struts2的具體功能:
請求資料封裝
簡化國際化
簡化檔案上傳
後臺資料校驗
......
2.3 Struts2的執行過程
專案啟動:
1)建立核心過濾器StrutsPrepareAndExecuteFilter物件
2)執行核心過濾器的init方法
讀取了依次以下的配置:
struts-default.xml [struts2框架的預設配置檔案(不需要自定修改)]
struts-plugin.xml [struts2的外掛配置檔案]
struts.xml [我們寫的業務配置檔案(包含配置的Action)]
訪問資源:
3) 在記憶體中查詢對應的Action配置,得到class內容,建立Action物件。
4)讀取Action配置的method內容,執行Action物件對應的方法。
2.4 struts-default.xml檔案的詳解
1)宣告struts2框架執行過程中使用到的一些物件
<bean class="com.opensymphony.xwork2.ObjectFactory" name="xwork" />
|
2)預設包,包名叫struts-default(注意:我們自己寫的package必須繼承這個預設包,只有繼承了這個預設包才可以使用該預設包下的功能)
<package name="struts-default" abstract="true"> |
2.1 )跳轉型別:
常用的跳轉型別
redirect: 重定向到頁面
dispatcher: 轉發到頁面
redirectAction: 重定向到Action
chain: 轉發到Action
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> |
2.2 ) 宣告攔截器(Interceptor)
struts2預設的攔截器(32個): 完成strutrs2的核心功能。(請求封裝,檔案上傳,國際化..)
攔截器(Intercptor) vs 過濾器(Filter)
過濾器: 可以過濾任何型別的請求(html、servlet、jsp)和響應。加入通用的程式碼邏輯。
攔截器: 是sturts2的特有功能。只能過濾Action!!在執行Action的時候加入通用的程式碼。
2.3) 宣告攔截器棧 (<interceptor-stack name="basicStack">)
預設攔截器:
<interceptor-stack name="defaultStack"> (18個攔截器) |
2.4 ) 預設包當前使用的攔截器:
<default-interceptor-ref name="defaultStack"/> |
注意:
我們寫的包(package)就是繼承struts-default預設包的,那麼就繼承了預設的18個攔截器
2.5) 當前預設包下的預設Action
<default-class-ref class="com.opensymphony.xwork2.ActionSupport" /> |
2.5 struts.xml檔案詳解
該檔案是開發者自行配置的業務配置檔案。(關鍵是Action的配置)
1)包(package),用於管理Action,一般可以按模組劃分包!!
package: 代表一個包。管理action配置。在用一個包下面不能有同名的action name: 包名.在一個專案中不能出現同名的包。 extends: 繼承。類似於類的繼承。如果一個包繼承另一個包,那麼就會把父包的功能繼承下來。 我們開發的包就必須繼承struts-default包。
|