|
该用户从未签到
|
1、创建Web Project
) R. D! } {6 N% d7 F8 ]% Q2、web工程与struts2整合
) ?3 f6 a3 d6 H$ t (1)添加struts2类库
+ W6 _) r2 X$ A' Q4 q4 i2 b struts2-core-2.1.8.1.jar
! T# T5 G2 I% N9 b xwork-core-2.1.6.jar5 D$ @* B b r
commons-fileupload-1.2.1.jar, p) D7 S' v' Q9 ]1 f
commons-io-1.3.2.jar% e: R" n1 c: h3 e
ognl-2.7.3.jar
( Q+ \- ^9 i) R$ h/ ` freemarker-2.3.15.jar; _5 L6 D2 ]4 X
(2) 在web.xml文件中添加struts2集成. p, h, _9 n5 }2 c/ x" s
<filter>
1 f5 ?4 ^6 X4 r/ C' @2 z <filter-name>struts</filter-name>* s1 k; H" ?& w6 R8 r( y5 k$ A
<filter-class>
/ Q5 [+ d5 q/ _' I0 Y org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter+ v9 c" Q% S; r# U( g. x* k
</filter-class>
( A9 V; J" B' i6 z <init-param>3 F+ X6 H. h* F+ x) j, i9 p
<param-name>config</param-name>
$ S) q) I. r3 v( ^0 q <!--
7 J$ j& @3 u: O6 T! L1 y6 y. D! v 修改struts2默认配置文件,
* C# c5 l* A5 @2 `) Q' C; N7 x 必须把struts-default.xml,
" Q) Q( r9 p) ]6 E/ R struts-plugin.xml一起添加
, F% F6 i/ H* {& h2 y4 B 必须:按顺序添加
$ L& D& L" q( _& A5 C; ]5 m) G -->' G, @) F* }5 f' V! G1 U1 B
<param-value>
1 B7 V! a/ U9 F. ~ struts-default.xml,struts-plugin.xml,config/struts/struts.xml& c6 U) c# e& ^, [. `
</param-value>
7 l7 C1 i' A6 Q5 A8 w5 r </init-param>8 H2 r( S+ F2 v1 O( g6 p
</filter>
2 ], f- Y& [& I0 f3 u4 r <filter-mapping>
1 ^" l, i/ C, g' j2 s* J% W <filter-name>struts</filter-name>. W* v5 D# V, u5 U
<url-pattern>/*</url-pattern>
U2 R: |' ~9 I </filter-mapping>
' F; ?6 u! ^! t$ _+ C, r% f. Q5 T <!--struts2 *.action struts2 *.do-->
' X7 [6 U F; {' h5 ]- ~* o (3)创建struts2配置文件struts.xml配置
) I# G2 R2 D* r S4 w- @ (4)完成页面跳转6 L ~1 K5 K2 l+ _& S/ i% e$ x4 r) Z% B2 h
3、测试struts2工程
" E8 n( M& w3 n1 h f9 E4、struts2与spring集成
, a {& I- m8 N+ F) N+ e (1)添加spring类库与struts支持spring插件
. ^' W) ^+ {! C! | struts2-spring-plugin-2.1.8.1.jar: X3 o0 `9 K, \! b. E# @, r8 }
cglib-nodep-2.1_3.jar4 t! }$ v1 h! r8 R! E4 }: p
commons-logging.jar
2 u: k/ w4 m1 `4 p2 E$ H log4j-1.2.15.jar( V I$ v" X0 I" k& [; }% ^0 S+ D
spring.jar- M) K1 L; m0 p. n
dom4j-1.6.1.jar
2 k( |$ Y/ q. s V7 y5 T: f( a S (2)在web.xml中完成spring集成
2 T+ |5 \! |( I7 ~ <listener>
1 y4 @8 O5 F% ^* N: f& j <listener-class>4 z8 C& Q. P, b& a1 ]3 g) ~
org.springframework.web.context.ContextLoaderListener. C7 Q, v1 p* a( J$ t$ J5 M; v4 d7 Z
</listener-class>
7 `0 w1 L3 l; ]& D) N </listener>
1 Q; Z! v" r# P2 ~1 F <context-param>
. H8 C0 O. X& ]1 Y g <param-name>contextConfigLocation</param-name>& }- z; U* e: b4 r( c7 C* a
<param-value>- W& V; |! f. S" U- C. }. B H
classpath:config/spring/applicationContext.xml
) A6 G) F. O: s% R# p <!--classpath:config/spring/applicationContext*.xml-->
* D1 g% Q3 I% T3 ]& q3 }; b1 F </param-value># c2 i3 b1 }( u9 o
</context-param>3 p' M& K- e! i v+ r$ Q7 E
(3)创建spring配置文件applicationContext.xml! [+ b$ V: y6 T; v* p7 _
(4)在struts2配置文件中添加spring 集成常量
0 m6 a5 g: ]7 N) U; k <!-- 设置集成spring框架 --># K2 H8 O9 H+ q4 M" Y* G
<constant name="struts.objectFactory" value="spring"/>
3 O$ F6 b( K1 ?! Q- U! ~1 L (5)spring管理struts2中Action& I% i. b# R! q" ]
(1)在spring 配置文件中加入bean管理
, Q0 R0 J" u* }9 t: h7 L <bean id="userAction" class="com.tarena.web.action.UserAction" >2 |4 ?* u# s" X
</bean>
- C3 X% T2 |6 \6 p4 U3 E# N (2)修改struts-user.xml配置) U$ [# x" T8 g7 C
<action class="userAction" >
2 C( A( h4 p7 N </action>
7 s7 l8 T8 S% j2 ~7 i3 f# {5 测试struts+spring集成
/ ~) i& a" W2 ]" l6 K6 spring+hibernate集成
" H+ z" _6 B3 \' \5 e" X r# H; C (1)添加hibernate类库
( [) H8 R9 L5 O. n8 ?. g8 ^ slf4j-nop-1.5.8.jar
n& F) D5 F! I3 [0 g slf4j-api-1.5.8.jar
: u/ a1 p; ]6 N; U jta-1.1.jar2 q! p. B& B/ J6 l7 J5 j o
javassist-3.9.0.GA.jar3 \$ E* @" ?) i
hibernate3.jar& F1 n- |7 u @& K6 V9 P. e
commons-collections-3.1.jar2 @* W' l) O( N" a5 o P
antlr-2.7.6.jar
) F. V% j& u ]5 B (2)添加MySQL驱动类库
! H7 N2 L* e" u' W | mysql-connector-java-5.1.16-bin.jar. {; r* q' D* x/ Q8 U1 k' f
(3)创建实体类. {" p4 n4 w. J$ T
(4)编写User.hbm.xml映射文件
5 _1 E! f& s9 D; _1 @ (5)反向生成表结构
" |7 |. ?# B, m9 z' A2 O( d' t (6)spring管理hibernate
$ T, s9 l2 W9 h- y3 z 在spring applicationContext.xml配置文件中添加spring对hibernate管理
, ?. V8 I( P$ b- Q (A) 添加DBCP连接池
}: _0 s* E4 w% q+ ]0 P z a、添加类库
1 A8 ^; o, q' D4 A. ~$ k commons-dbcp.jar
, m& Z! C5 r& N; x. u commons-pool.jar2 W+ v. |5 m/ f$ M
b、applicationContext.xml在配置连接池
9 E9 K& R9 g1 C- t/ J) _ <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">1 E6 { L# l2 \6 V+ V& x
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>1 x& S3 R! r" l) M
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/>% a% g$ l X$ d- [. D
<property name="username" value="root"/>$ p. y) `. F5 t9 o& J. t
<property name="password" value="1234"/>7 i9 x; N% @" G2 t6 G/ ~. n/ l
<property name="initialSize" value="2"/>" b& \8 F* g+ x
<property name="maxActive" value="8"/>
( M7 q9 g' k4 i' R8 B1 g <property name="maxIdle" value="5"/>$ H* w) `. t5 U2 V N
<property name="minIdle" value="3"/>% n' \/ f( I: e& N
<property name="maxWait" value="3000"/>( J# b0 L7 O t4 V' T! S
<property name="removeAbandonedTimeout" value="60000"/>
3 u3 O% x1 p7 y: @/ | <property name="removeAbandoned" value="true"/>( u( o$ ]" L4 l
</bean>9 c- ]; ^# {' `7 ?7 e
连接池参数如下:
/ z$ h' e" L) ~2 m: f7 H initialSize
+ b, _: x5 G' T: m. b) N9 F 连接池启动时创建的初始化连接数量 i( d( ~# D$ o1 t4 C _( m
(默认值initialSize :连接池启动时
6 i0 H& F7 F1 h 创建的初始化连接数量(默认值为0) 9 o' p1 ~, v$ o+ ?* v; S8 ^$ |$ M A4 O
maxActive " P; E1 I1 w- H6 {: T! j
连接池中可同时连接的最大的连接数+ \8 r* w- o1 r1 d+ }3 ^7 m( Z
(默认值为8 ,调整为20,高峰单机器在20并发左右,
* Z' b" I* b7 ?: L( T 自己根据应用场景定)
- j% D) \+ q( i' ? maxIdle, b' |3 c5 k- W
连接池中最大的空闲的连接数,
2 V. L2 k* l9 W7 u6 r; x 超过的空闲连接将被释放,
. J. P0 m( F5 X2 q' z 如果设置为负数表示 不限制(默认为8个). X+ x1 i2 t+ a: h. B
minIdle
- P! h) _" w) O" o( e3 L9 i% L 连接池 中最小的空闲的连接数,低于这个数量会被
: K4 ^" M( n; s5 t7 M8 w 创建新的连接(默认为0,调整为5, 该参数越接近
" D7 V. x! R* f _! w% Z maxIdle,性能越好,因为连接的创建和销毁,
% T# P4 J9 `; T- r" R 都是需要消耗资源的,但是不能太大,
, Q/ S. d2 i/ P3 E! x- O" o 因为在机器很空闲的时候,也会创建低于5 d( T; T0 U% F+ @: e6 u
minidle个数的连接) 4 X! w- E; _! t1 `
maxWait
: h& @* c3 w6 L( C 最大等待时间,当没有可用 连接时,
9 a3 F8 H: Y5 r | 连接池等待连接释放的最大时间,
# e6 t& B( g3 B( ] | 超过该时间限制会抛出异常,
6 W/ s/ \7 v8 Y+ T 如果设 置-1表示无限等待(; |0 i- N8 t( t* L) r; D
默认为无限,调整为60000ms,
4 A0 I$ l+ [7 C6 k 避免因线程池不够用,而导致 请求被无限制挂起)
9 Q+ j3 F2 g0 c' Z( ^% \ removeAbandonedTimeout :
% @: y; ?+ J9 ]: r* L 超过时间限制,回收没有用(废弃)的连接 . S) X% E/ n0 B2 S( Q' Z: k
(默认为 300秒,调整为180)
* q) v9 y! d& C- T* N, s4 H$ p removeAbandoned :
3 F: J6 V* w' f" e 超过 removeAbandonedTimeout时间后,0 v0 x' U$ A! v8 j
是否进行没用连接(废弃)的回收
, ^ a2 w6 j9 o j& J0 T1 H) t (默认为 false,调整为true)
2 J& P7 z+ S9 n# u9 W (B)spring管理hibernate实体映射文件:
. n( k u ^' {& Y- X <bean id="sessionFactory"
) O3 W% `( E1 g- q% B$ t$ p! r class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">1 L6 v! M5 ?- }" k7 y' `
<property name="dataSource" ref="dataSource" />4 P/ t# s, e3 z% s' }0 x
<property name="hibernateProperties">; N I- }8 J5 w* ?
<props>
6 ` w( N6 O/ ?$ Q <prop key="hibernate.dialect">
) }) g* [/ p, L0 m7 t v$ c) ] org.hibernate.dialect.MySQLDialect' R" q$ T& k$ P, `: K& Z# S& N
</prop>" K5 x* v; B4 k l2 q/ J2 D1 f) a
<prop key="hibernate.show_sql">true</prop>4 U; L0 N5 y( u4 z. y" w' M5 T
<prop key="hibernate.format_sql">true</prop>+ x7 Q- \( a$ z/ C M( x
</props>
! g! d6 I, g9 L# y; p g+ J </property> B/ }% m4 k' _, P8 F( i; W
<property name="mappingLocations">
: O7 P5 H' `4 E; V; s% W* t <list>
5 k* L; w, k6 Q1 b, S2 H <value>
: p8 z5 \& I( R2 k2 \" f# { classpath:config/hibernate/hbm/User.hbm.xml _1 d" V# a3 F( F, k& Y
</value>
; R# K& l- v" \! n </list>
' `; j9 D# e2 V& _( x </property>; h! ]# | ]6 w) j, d1 R
</bean>0 r8 S; m* \5 g" \# p) W E
(C)spring读写属性(properties)文件' z. N: B4 t! q/ p' N
a、创建属性文件 db.properties& x- {! C- e: N
b、在applicationContext.xml配置
: \$ E k- V% @! Z1 ]( y <bean id="propertyPlaceholderConfigurer"
7 n$ k* A4 S$ f3 E3 h class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
3 ^. _4 l9 h& c1 T) R <property name="locations">
9 L6 _- i9 E% |3 \6 P <list>
5 p, k1 {9 o- T S8 W9 q8 d <value>classpath:config/props/db.properties</value>
6 X1 r) }7 r5 V. v9 B </list>+ q4 r0 y. P- s; s0 d2 ~, m
</property>
8 H) c- Q" R5 u, Y; N </bean>1 Q6 _0 [3 ^' u$ I' Q
c:引用: ${username}, P; P( W# J m# @/ ~" t- r
- n' r2 J7 C9 R1 @% f (8)spring分文件管理
: A5 {% H8 L! { h8 w q2 u <!-- 引入其他spring 配置文件 -->
. p! y) z. W. b' O6 ?7 l applicationContext.xml引入下列文件& e' m, N. r' A; [4 Q
<import resource="applicationContext-web.xml"/>0 m: C) U6 c) f9 D: z: H4 i
<import resource="applicationContext-biz.xml"/>7 a7 H' O `' \1 i6 x6 L) z
<import resource="applicationContext-dao.xml"/>' T2 E# W8 Y- a1 u0 L
7、开发数据访问层
$ @ C9 j! u+ h5 ~2 |# x 使用spring提供hibernate 模板类 HibernateDaoSupport
( R7 l1 |3 O% F1 q- v' S$ i UserDaoImpl extends HibernateDaoSupport; |* y& ~# S5 j5 v
在UserDaoImpl注入到spring 配置文件 applicationContext-dao.xml" i+ W$ g/ v2 R7 f9 `
<bean id="userDaoImpl" class="com.tarena.dao.impl.UserDaoImpl">
7 v# F4 z$ C2 b- V/ b <!--HibernateDaoSupport中的sessionFactory-->* @1 g+ {. o' \8 V( c
<property name="sessionFactory" ref="sessionFactory" />0 Q! m. ^4 ^5 H
</bean>$ |& D# b5 a: Q9 g
8、添加spring声明事务管理(AOP)
1 q1 W2 r0 F* I5 P" f8 A 声明式事务管理:
$ i" l6 Y+ Z' k 添加spring 类库' A, @: _0 V5 z$ R$ e( |* R$ l
aspectjrt.jar
# }* y& n% t q9 y; o9 z aspectjweaver.jar# T) A5 M8 K- R% m
了解事务的几种传播特性) I' ]2 T' K) D3 a0 d( [: Y. o
' z' E: v* V! r- a2 G
(1)PROPAGATION_REQUIRED:
4 O4 g2 Z1 H9 n2 q5 ?& {! n' c 如果存在一个事务,则支持当前事务,如果没有事务则开启。3 p5 g5 r+ z s. G: I
(2)PROPAGATION_SUPPORTS: $ c' {2 v' a* ?' E" E1 f6 t
如果存在一个事务,支持当前事务。
) z$ U- [$ K- V% x 如果没有事务,则非事务的执行。0 E! N" n! Z& A. X0 v0 Z2 N
(3)PROPAGATION_MANDATORY: 2 d/ I8 I. K9 h$ b9 [/ {7 f
如果已经存在一个事务,支持当前事务。
$ B* L" a6 I `3 y6 y5 c* w 如果没有一个活动的事务,则抛出异常。
$ i( `3 F0 f# K+ G) z: Q9 J2 v (4)PROPAGATION_REQUIRES_NEW:
6 r% Y* @3 a' h 总是开启一个新的事务。如果一个事务已经存在,. f/ H4 }& i, w( L9 j( O
则将这个存在的事务挂起。, A+ Q" v8 R: ~# _
(7)PROPAGATION_NESTED:(spring特有), \/ ]2 j3 L9 l5 \" j x
如果一个活动的事务存在,则运行在一个嵌套的事务中. $ \$ {, x& {; T# }9 J4 b
如果没有活动事务, 则按TransactionDefinition., j4 _$ @7 [6 @2 c$ `* _7 m6 ]
PROPAGATION_REQUIRED 属性执行
! k0 }$ @4 Q- _" ?4 D) \2 J5 n) j) @& i& K
(5)PROPAGATION_NOT_SUPPORTED:
' [ K* S9 A& V: [/ T9 C 总是非事务地执行,并挂起任何存在的事务。! s- e% B8 }3 d3 r: D8 F: j
(6)PROPAGATION_NEVER: 1 G* z, _: D5 r# ^, N
总是非事务地执行,如果存在一个活动事务,则抛出异常。8 F8 e7 O. A; \: K% n% U$ U7 |
4 u% n# _9 `% i8 E3 r1 [
8 O. g, n! V. _
<!-- 配置声明事务管理 spring2.x-->' G K4 [* b6 @( ]
<!-- 定义事务管理 --> w5 n: j! \$ D' [, s/ F
<bean id="transactionManager"
! S' }6 X0 Z: Y2 X class="org.springframework.orm.hibernate3.HibernateTransactionManager">1 [# ]9 J$ y- G ~+ w; d3 M
<property name="sessionFactory" ref="sessionFactory" />
' o2 X9 |+ f/ k+ ^8 k8 | </bean>
: y) E' d c. j# b9 _4 L% r1 N1 X <!-- 事务规则 -->
# l- {0 ^# @# N J <tx:advice id="tmAdvice" transaction-manager="transactionManager">
& u0 q- Z. Q4 e9 A# w c$ ?- E <tx:attributes>
/ D: T" r) `- f9 t <!--*通配符 save* 方法名必须是以save开始-->9 m; H+ u6 R0 x- U% D& B
<tx:method name="save*" propagation="REQUIRED" />7 d7 Y. O7 p" u- o4 n9 k- ?8 A
<tx:method name="update*" propagation="REQUIRED" />6 u, [" X& Q( C
<tx:method name="delete*" propagation="REQUIRED" />: b5 T# v1 C* m
<tx:method name="find*" read-only="true" />
0 f1 g. s4 `' K8 k <!-- read-only 只读:-->
$ j3 T! l# X+ t$ a$ x* P4 ^# o+ y; B </tx:attributes>; g( {. e$ w3 t2 h; [& m
</tx:advice>2 }+ e$ d: p6 t% S! V9 w6 C
<aop:config>
3 A, u7 P+ S* ]2 d <!-- point cut -->6 D6 _% Y) G; C$ Y+ d
<aop:pointcut id="pointCut"
. L& R- ]# ~& o expression="execution(* com.tarena.biz.*.*(..))" /> v3 y2 x5 }" L% a5 _+ n! _
<aop:advisor advice-ref="tmAdvice" pointcut-ref="pointCut"/>
* C" O: a P5 X/ [8 e- h </aop:config>0 q* c" `; F* d# g( r/ Y
+ e+ r! X. n$ J# q
9、测试: w% Y* C1 T- K
添加测试类库 spring2.5.6; R5 P) b- R) I2 U7 g
junit-4.4.jar
1 X: a* l: g- T9 }9 S! h0 E spring-test.jar$ e: B( D0 Q! `3 E" N' C
//使用spring测试9 U, W6 |7 w8 o! M6 a! J- z. e
@RunWith(SpringJUnit4ClassRunner.class)1 p/ `. U! z; J4 h: d5 Y' F V
//加载spring配置文件, x4 j% V* z) b1 L+ j* x! W
@ContextConfiguration(locations = {
0 ^; L( i F8 p% d& C0 q* o3 o "classpath:config/spring/applicationContext.xml",( s% U' {7 f F A3 n4 R7 q9 l1 e
"classpath:config/spring/applicationContext-dao.xml",% q8 R! g, T2 w! x9 C0 Z
"classpath:config/spring/applicationContext-biz.xml",1 [# w3 I$ v( ?) V! {5 Z: Z7 u8 T
"classpath:config/spring/applicationContext-web.xml" }); a% [) u# O4 `6 g, R
//自动注入9 O" P- q6 L; \2 D/ I
@Autowired; c8 K. q+ s7 p
private IUserDao iuserDao;9 s8 h0 O6 E4 h- D( K) f/ y
$ w) E% K# @3 t& f4 H( v @Test
, G& l% _+ R. t0 m public void saveUserTest(){
, G9 I$ Q4 Z. v) I c" k* S //测试方法/ A8 U6 Y6 L1 R
}
# d: z) ^7 x/ h( m1 G3 A10、完成业务层代码编写
3 x4 `: m9 Q, A S11、完成表示层代码编写$ V& U9 ^7 v! k: D1 H* }
12、测试工程! p- ~4 y7 z' D A
7 q( u) M9 o2 d$ }13、spring处理hibernate延时加载
1 P p' Y5 |5 c 1、配置延时过滤器
+ v3 }- n* A* T4 V' c# N OpenSessionInViewFilter.class! X; G3 b* y! q. M
2、在web.xml配置OpenSessionInViewFilter
1 H/ t& h: V4 D
: ]/ h) l$ ]- Z7 g! I' w7 R <filter>
1 W! B0 L! w) U <filter-name>openSessionInViewFilter</filter-name>
/ B4 Q: y* ?" T5 I, v <filter-class>
2 ]+ ?: Q$ A8 M org.springframework.orm.hibernate3.support.OpenSessionInViewFilter% q" V/ }2 f( D9 _) g V' l9 P6 v
</filter-class>5 T: d8 W% N- {& M/ U
<init-param>. B8 }4 W9 i$ t1 q& w6 V4 L
<param-name>sessionFactoryBeanName</param-name>! |& Y. e# B( G
<param-value>sessionFactory</param-value>
1 D0 N4 y: [# R" g3 I7 G% R" T </init-param>
2 @: D+ e8 T8 D0 q; G% V4 ~ </filter> h1 W& t S! Y9 }: r* u% a
<filter-mapping>
. m3 |* R' M( H; Q <filter-name>openSessionInViewFilter</filter-name>
9 N2 C9 T; l0 U <url-pattern>/*</url-pattern>0 C" E( C3 b8 |, b
</filter-mapping>3 e! Q& C: X) S; D, n8 p; Q9 x
, B7 K5 o r; A' M
|
|