1. 程式人生 > >Java工程師培訓課(十七【新的領域】)

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

 

 

 

 

email

 

 

 

 

descr

 

 

 

 

 

 

 

 

 

 

4、使用者表-即註冊成為本網會員的使用者

 

Users:

列名

名稱

主否主鍵

長度

備註

id

 

Y

 

 

name

 

 

 

不可以重複

password

 

 

 

 

phone

 

 

 

 

email

 

 

 

 

 

 

 

 

 

 

5、使用者收貨地址列表

一個使用者可以擁有多個收貨地址,但多個收貨地址,只可以一個有效。一個使用者,最多隻能擁有5個收貨地址。

address:

列名

名稱

主否主鍵

長度

備註

id

 

Y

 

 

name

收貨人姓名

 

 

不可以重複

 

 

 

 

 

phone

收貨人電話

 

 

必須輸入

zip

收貨人郵編

 

 

 

dft

是否是預設收貨地址

 

Char(1)

1:是,0:否。

userid

Users表的外來鍵

 

 

 

mktime

設定時間

 

 

按時間倒序排列

 

 

 

 

 

 

6、使用者訂單表

記錄使用者已經交易成功,或是沒有交易成功的所有記錄。對於已經發貨的交易,使用者不可以取消。只可以在收貨後再做退貨處理。

且退貨狀態,只可以由維護人員完成。使用者無權在頁面上設定狀態為退貨。

orders:

列名

名稱

主否主鍵

長度

備註

id

訂單編號

 

訂單生成規則為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包。