1.项目介绍' @8 f/ l$ J& l M, |8 ^0 @* s
典型电子商务系统(在线购物平台)。模拟了当当系统部分功能。 6 X6 m. ]( }) B8 v* Z2 Z2.功能需求! o1 S }4 X$ K7 C- U$ r
1)用户管理模块(3天)user 3 h3 Q# u. V5 @7 p+ ] 实现登录、注册功能4 f5 [9 a7 y/ l
2)产品浏览模块(2天)main: M# V* c9 p! X0 y. {
实现主界面和类别浏览功能 . \( i4 x* y! u( U& m 3)购物车模块(1.5天)cart$ M$ [. V. f. X( B ^: t
实现购买、变更数量、删除等功能 * R7 ^3 N; q$ x! x, A% x, a 4)生成订单模块(1.5天)order5 m: F1 w6 K% U* C* s( g
订单确认、填写送货地址、生成订单功能/ s5 j9 c5 q+ b' {3 n
3.技术应用 : K7 J# `+ h8 E @% m 1)技术架构- ^2 C" S" i& ^ F struts2,JDBC(连接池),jQuery,Ajax ) K* Y5 ^ b( Y+ o 2)设计思想 * b3 q* G0 F% ^0 {; z MVC和分层设计思想 . u" N- W/ {7 P( j( u a.显示层:JSP组件(jQuery,Ajax)- L+ o8 D1 }- r
b.控制层:Struts2控制器组件、Action组件. A7 N8 q* ]9 V2 {" t2 g- F/ S
c.业务层:Bean组件 # N. [2 l* |# _/ v4 u6 e d.数据访问层:DAO组件(JDBC) & E; j8 |- D* y & e! g' `; R8 G! X4.数据库设计7 F9 y3 z! @. E) E: X. L
1)数据库导入! s, v, r7 u& i; w
create database dangdang; //创建库: |: J% ]1 @0 b) F0 i5 p% z/ C( e7 g
use dangdang; //进入dangdang库 5 T# I4 S' O6 b! T6 G set names utf8; //设置连接和发送SQL编码 , o# s$ i' U8 x. Y8 d# W0 v0 A7 W source 路径/dangdang.sql; //导入sql文件 ) O4 U# o2 a7 r1 E# J2 V 2)数据表功能 ! n6 t5 }1 J1 F0 ]1 g/ X$ H' m. n; v a.d_user(用户信息表) / O w& t: q% o" T 存储了用户信息,涉及登录和注册功能 . X6 E' `6 B( {8 ]+ a b.d_receive_address(收货地址信息表) ' P' a5 {1 C- a" {: A7 F" O 存储了收货地址信息,涉及填写送货地址功能9 n/ n9 ^$ `# K) z8 n6 w' f" _4 y
c.d_category(类别信息表) " l$ r @; G7 u 存储了图书的类别信息,涉及主界面左侧类别菜单功能: I# { g4 Y3 U% A7 ~2 J K
d.d_book(图书信息表)* f, t% T! q+ x
存储了图书的特有信息,涉及产品浏览等功能. O3 x4 K$ z- n9 W5 c* D3 @" j
e.d_product(产品信息表) 6 ?0 u8 m9 Q8 g1 T+ f 存储了各类型产品的共通信息字段。+ W2 I0 C) j, v$ j
f.d_category_product(类别和产品对应关系表) 6 x6 y! T( p- O5 k 存储了类别和产品之间包含关系,涉及产品浏览功能 : s `6 |0 } n/ B g. d_order(订单信息表) ! Y8 P7 a: a' K" n( D! W0 { 存储了订单信息,涉及创建订单功能, u% Z* p1 L# T- J' v
h. d_item(订单明细表)# b0 }6 D# M3 q5 [, S/ {& d4 J' ^
存储了订单中所购买的商品信息,涉及创建订单功能。 / h, n: W! h9 f* A ( W7 U' J& O' C, X1 T* L) u5. 搭建工程结构$ b; `$ y5 [- y( U' q Z4 i
1)引入需要的开发包: p/ }6 n, j4 e Y$ v
struts2开发包- U3 O1 _* f* g& j \
jdbc开发包+ ~0 D, t, O' k9 i. e$ x% Y4 Q; p
dbcp连接池开发包 |* C% ?- A) F- }5 f 2)src文件结构 + a! Z( a$ W9 P: f, ? B8 S org.tarena.dang.action :控制层% a& F' B6 d) W# _
org.tarena.dang.action.user :用户模块的action/ E+ P* f; M# v5 ~
org.tarena.dang.action.main :产品浏览的action F' C( i+ D% b* [* d# [& p org.tarena.dang.action.order :订单的action 1 E" G- b* S( `) ?7 C7 s& ?, Y. B org.tarena.dang.action.cart :购物车的action # { u5 |3 ?. }4 o2 z org.tarena.dang.service :业务层2 s5 L1 n9 y8 D
org.tarena.dang.dao :数据访问层 / m" z- p8 ~) D) C" b org.tarena.dang.entity :实体类 / P3 e) ~3 k) ^2 c org.tarena.dang.util :工具类$ B) d! b/ d( y
org.tarena.dang.interceptor :拦截器 ! F1 I+ S7 |8 b/ h) o; j* f) V 3)struts配置文件结构* w% H) \1 Z9 n. w
web.xml(配置Filter控制器) ; W1 d' I/ \& w" T+ T" `& Q+ _ struts.xml (struts主配置文件) V) j. p) n5 @) [. o" y& `
struts-user.xml(用户模块配置文件) ( O. ] N) e' r" a- P5 J struts-main.xml(浏览模块配置文件) . Y. {% ?5 y1 ^: c struts-order.xml(订单模块配置文件)7 J" u5 F7 V2 I4 X, m+ g- W
struts-cart.xml(购物车模块配置文件) ( o8 T4 S, v$ I' p; J: A& A/ c( s* T( o- @ V. l$ Y( x& R! ~
4)WebRoot文件结构 p' F8 K; f1 m: n D
/user/* :用户管理的JSP , U6 X3 Z' h ~% j /cart/* :购物车的JSP : x- |/ I* T7 o) Z: r2 N /order/* :订单的JSP7 I2 Z( ]$ a' {' }: N
/main/* :产品浏览的JSP $ `4 ]6 s4 W( Q4 Y r: J /common/* :页眉、页脚等共同JSP4 e- }1 m2 j* A6 @3 d# l
/js/* : 放置js脚本文件; _% J, \( x+ h( l. x5 F& c
/css/* :放置css样式文件- d# F3 Z( V8 T: Z6 r( [
/images/* :放置页面图片文件: q6 t% n! @* S5 O4 ]8 p
/productImages/* :放置产品图片 @" ?- R- t* U
( g. `8 K5 n E; ~-----------------连接池的优点----------------- & [1 L! ^# r0 I1 B Fa.可以管理Connection对象,并且将Connection数量控制在一个安全范围内。提高数据库的访问安全性。; P. X! B- G2 Z* p+ B
b.连接池中的Connection对象与数据库保持连接状态,避免频繁的建立和销毁连接。( j$ W8 l+ F5 Q, ~$ \ W
- T4 [' o/ D6 J============用户管理模块============== # F3 g; b$ R- C) O/ {3 A$ k1.注册需求 : T; n8 f0 U* [4 B4 J 1)表单验证(采用js+Ajax) " \3 {2 W" V8 n z6 U/ j+ _6 I 邮箱:非空、格式、唯一性(ajax) # G$ t6 S& p, b2 Y& o 昵称:非空、格式 ; S6 L/ y: Z+ w' M T8 o0 X" Z 密码:非空、格式 8 G q& J: i5 l4 q; T( l# W% p d; i 确认密码:非空、与密码一致 : G9 o4 g( P8 u; z* W2 z 验证码:非空、正确性(ajax)" h8 P7 I% i) x4 I
- {" C1 p- }' \6 [/ E$ ^6 G
2)将表单信息写入数据表d_user [" J7 b0 F. H% T
编写实体类、DAO、Action ! u/ X) X* ]" u: r2 O' R" L, v7 p" C* Q 3)给用户邮箱发送验证码' E# E8 C( I2 v6 F
引入commons-email.jar,email.jar + E' S; G3 u. L+ e4 [ 参考EmailUtil工具类代码 & F* A$ A& _, c 4)进入邮箱验证页面verify_form.jsp 2 G X+ U1 [, M% ^# a/ L6 }" u: U* G- J# y
2.邮箱验证 / k/ D. S+ R/ i+ D% G8 F 1)表单验证 : j: h- N m) c; S+ ]& B( g 验证码:非空、正确性(ajax) ) }8 A' x$ [$ J2 O6 _2 ?' N) I7 G- x 正确后跳转到成功提示界面:window.location = "register_ok.jsp"; 3 R( v9 p/ V9 T$ g 2)Action逻辑 ( X. F1 L; b/ ]' M3 f/ `0 c a.利用验证码去d_user检查8 \% u/ C( ~% S' \0 b: I" ?0 W
b.如果正确,将d_user的is_email_verify字段更新成Y;不正确在verify_form.jsp提示“验证失败” 1 u& I5 T |" \. a4 f9 Q, c c.跳转到register_ok.jsp , N, t) L1 t' `9 N$ v: h/ r0 N8 D3.用户登录 Q% H, k. V, h& u* }4 ` 1)表单验证% ^0 a; S" x: S! G
邮箱:非空、格式 ; H0 \! ~( u( i2 m 密码:非空 ( N7 D8 v: F' H i4 d: z0 D 2)Action逻辑 : _) g) `8 }9 n- k7 ]9 I9 s a.检测Email和密码是否正确,失败回到login_form.jsp提示 8 v& t* i- z$ ` b.检测is_email_verify邮箱是否通过验证,未通过进入verify_form.jsp ) z) t/ L) F* ]& @; e2 C4 l c.更新最后一次登录时间last_login_time和IP地址last_login_ip。+ d) A: z$ d. @( z; k# \$ m% v
d.将用户信息放入session。, A) N- e* v7 z4 y* a5 Q" C. \+ n
e.都正确进入/main/main.jsp1 B' a" l( p1 `/ ]
4.main.jsp页面的页眉部分,显示用户是否登录的状态 , G, J% R' N6 g 如果用户已登录,显示"欢迎XXX,【登出】" ! L( W, e9 n# K% z 如果用户未登录,显示"【登录】【注册】"% H2 O5 d# T$ D5 Y. y