该用户从未签到
|
1、创建Web Project2 S ^+ p, [9 ^4 c& q% w8 Z) Z
2、web工程与struts2整合
& `% s5 a9 k/ j; V/ d (1)添加struts2类库
1 E3 K3 K0 X5 g3 k6 M3 L; [4 d# M struts2-core-2.1.8.1.jar
6 u, k" t/ \# x$ l9 V; _ xwork-core-2.1.6.jar
0 J* _+ W' X3 z, Y, P9 g commons-fileupload-1.2.1.jar, O1 I5 U9 O- |
commons-io-1.3.2.jar! W0 D p9 _) A" c. Z% C+ T
ognl-2.7.3.jar
# f/ b6 P( j, z$ J( r" V freemarker-2.3.15.jar
# H. W: q) r. G0 h (2) 在web.xml文件中添加struts2集成+ A4 o5 e$ a) J* G* D! H1 j6 B0 M% ^
<filter>
; n) ?/ X; f* e# a5 `8 n <filter-name>struts</filter-name>
J% M; h7 T5 s6 e' E. Y2 {1 R <filter-class>
4 _9 l. _3 d+ H# H; l5 F y org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter5 Y2 x0 W* V( V; ~
</filter-class>
# B! ~& x4 C6 m( V% j0 ^. F <init-param>, r, {. }% U, z
<param-name>config</param-name>
, H, ^' r" e- M! q1 S& o <!--, R$ e/ Z1 U" U, D0 ~2 v
修改struts2默认配置文件,
% E3 Y: `0 Z- I/ R" B 必须把struts-default.xml,' }4 @ m7 N1 u8 D8 q
struts-plugin.xml一起添加
) x0 ?% V \/ d3 I( G5 o, Q4 U 必须:按顺序添加
0 I# x2 L' f# b% {% { -->
3 X& ^ T% ^$ n1 d. ~ O9 c <param-value>
% a1 t3 \% S4 F! e8 y% V struts-default.xml,struts-plugin.xml,config/struts/struts.xml
$ `6 H8 R: M+ f9 x0 x </param-value>; m, o- H0 W7 T1 w6 r5 f
</init-param>: U. Q1 @6 P1 S3 l; B
</filter>! t1 F/ K, Y4 [/ ~
<filter-mapping>" v& |8 d% U$ V& h9 v
<filter-name>struts</filter-name>8 m" s" |0 L( p/ \
<url-pattern>/*</url-pattern>
6 r8 o1 p+ k9 G. k- ~+ G' g </filter-mapping> ' C: Z" z4 F4 P' x/ ~( {" j- ~
<!--struts2 *.action struts2 *.do-->' Q! i3 Y/ I. Z8 @: J. Q
(3)创建struts2配置文件struts.xml配置 # I0 @- Z2 M- w9 P6 A0 E
(4)完成页面跳转5 L" I# B( B6 s' q: e) v
3、测试struts2工程
& `- O% G% a! ?# V6 r; Y4、struts2与spring集成
* z2 D: B% G' M; Y (1)添加spring类库与struts支持spring插件4 W1 W6 J! |% q6 ^1 w' E
struts2-spring-plugin-2.1.8.1.jar0 \/ I J' \8 O, ~- f$ ^, D$ E
cglib-nodep-2.1_3.jar9 n' U' X/ m; J- M6 A
commons-logging.jar% ]: P8 g) M- v" R7 T' ?5 M& s
log4j-1.2.15.jar
. I9 e3 x5 h$ b0 X5 X0 i- _ spring.jar
$ K+ [0 X8 o* r3 r+ ?0 Z1 ` dom4j-1.6.1.jar
2 n1 A3 S2 p% Q8 F1 j' X& r0 A (2)在web.xml中完成spring集成. g1 ^% f+ G$ N* p
<listener>% y- X! i! q+ n; e3 \
<listener-class>
. T7 i, H' ?# v+ A) F+ B org.springframework.web.context.ContextLoaderListener8 y1 G& }2 ~6 h) [4 h3 U
</listener-class>+ r4 ]* D' m, w/ H ]; C
</listener>8 M. ]! I% E9 m: Q& s
<context-param>6 `$ x# ^. A0 V! ?& f
<param-name>contextConfigLocation</param-name>
+ N' V* d% }; I- m5 N; k5 J$ \ <param-value>
6 ]; T# ?0 M4 R" Y$ h classpath:config/spring/applicationContext.xml3 k9 G+ B3 U6 H: G
<!--classpath:config/spring/applicationContext*.xml-->
% B; Z! ]7 s( C </param-value>
& U' i8 Y9 W B: D8 ] </context-param>' h- T' ^' a8 @8 C4 ]; O
(3)创建spring配置文件applicationContext.xml0 [0 B# q/ V9 H
(4)在struts2配置文件中添加spring 集成常量
8 p0 s9 y, g8 u; ~ J! F; c <!-- 设置集成spring框架 -->
7 |, p4 p. k8 L0 D0 ~* s <constant name="struts.objectFactory" value="spring"/>
, Z1 E( o# ]; d1 F7 }9 M! ?: [6 w8 r (5)spring管理struts2中Action3 \- a! [) H3 i8 C% ~) _
(1)在spring 配置文件中加入bean管理2 [7 Q% L) G0 {7 w' G& f! P
<bean id="userAction" class="com.tarena.web.action.UserAction" >" n: P) F0 N8 G& A( A
</bean>
6 Y: t2 w8 a7 H1 N/ j (2)修改struts-user.xml配置) _0 y( a: _6 r% m" m" u
<action class="userAction" >
6 t) \* K1 J B </action>
# F& T9 c0 X3 B' i) v5 测试struts+spring集成
/ f3 L4 Y2 p, z7 h; M& X6 spring+hibernate集成
8 g" ~# e! ]; {8 E. w3 ?4 g (1)添加hibernate类库
3 |1 N( r a' X! {) ?& i2 I* o slf4j-nop-1.5.8.jar
3 n/ ^" e/ r5 ]; u( _* l7 x slf4j-api-1.5.8.jar
$ e) D2 E- N% x& c" Z% h jta-1.1.jar v/ `* i7 d, q% e8 |9 f
javassist-3.9.0.GA.jar
; V+ y. P. J1 ^3 M5 ^ hibernate3.jar
+ ~4 p( r. q# _2 o6 U' [0 a$ x commons-collections-3.1.jar
2 q ^% Y. w5 j* R* A0 z1 M antlr-2.7.6.jar
1 |; I/ A8 K8 f. g (2)添加MySQL驱动类库 6 g# H6 ^9 C& h; H F
mysql-connector-java-5.1.16-bin.jar0 X- Y# K- U: A- Q5 o, c* F! p
(3)创建实体类1 m- A$ e( G; E3 e, u0 q7 `
(4)编写User.hbm.xml映射文件
; y5 P, d4 j; G6 Q (5)反向生成表结构' k# E. @8 Z2 j' i- j
(6)spring管理hibernate * b' w/ J" D- f& E- ^/ t3 l d2 W3 t
在spring applicationContext.xml配置文件中添加spring对hibernate管理
7 d7 ~9 a7 |/ u (A) 添加DBCP连接池0 d8 b5 h `' ]: j; J$ I" B. `
a、添加类库
& }% i" {- y. D: Q0 `) R commons-dbcp.jar) A5 J! P: r- `+ d
commons-pool.jar
" E p& W1 x. m6 y7 Z' f" _* V b、applicationContext.xml在配置连接池' J! ?- K5 E1 g( w- D: [" @
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
6 K) @+ h* p. r3 n$ |! y' y <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
# p" e5 M4 x: M0 H" _+ _ <property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/>+ e/ J x# k. A |/ F
<property name="username" value="root"/>, T, ]; D+ _+ K3 p8 {7 A
<property name="password" value="1234"/>
, ~( ]% U6 d- g; q <property name="initialSize" value="2"/>+ t9 y `$ K$ g( o* R; w
<property name="maxActive" value="8"/>
' n& L& H* [9 t k <property name="maxIdle" value="5"/>
& X0 h8 k) M2 @ i# r <property name="minIdle" value="3"/>
/ n$ l* Z2 M6 ` m <property name="maxWait" value="3000"/>
j, C% J1 a7 K+ |4 ^1 Z <property name="removeAbandonedTimeout" value="60000"/>7 x5 g! Q! d6 S1 x+ C( Q
<property name="removeAbandoned" value="true"/>
# Z* r, L% t3 X# ] </bean>
+ D/ U9 c# ?4 d2 k4 m* s7 i' p 连接池参数如下:
6 Y- S" E7 H! d" d' Z2 Z V1 C$ a initialSize
) D+ I+ A/ X( o( d) g 连接池启动时创建的初始化连接数量
+ R) W2 Z, G) z5 m9 s |& b" ?3 `, q (默认值initialSize :连接池启动时" `+ K* \$ i. D! T$ ?
创建的初始化连接数量(默认值为0) $ c$ m# ~) |% |6 |7 Z
maxActive 9 p% Q' M" m* s B
连接池中可同时连接的最大的连接数, y0 ], r* Q! s6 C5 K# d- K
(默认值为8 ,调整为20,高峰单机器在20并发左右,
' T- z: N4 c/ \1 ?& P 自己根据应用场景定) ) A1 }* t! t& \
maxIdle
, K1 `& y( K# s9 o3 z" l6 V ^ 连接池中最大的空闲的连接数,2 [1 e, w5 Q! H7 G' }) d( L1 \5 Z
超过的空闲连接将被释放,
3 y# p$ M9 M1 v2 _ 如果设置为负数表示 不限制(默认为8个)' P8 r9 Y" q# R" V, h0 A- b: O( b
minIdle
# v0 B+ O* ?/ `' i( p$ C 连接池 中最小的空闲的连接数,低于这个数量会被
1 {1 {3 ~/ P+ s' U, H# U$ _ 创建新的连接(默认为0,调整为5, 该参数越接近
" w2 C$ I9 }6 |0 W9 M maxIdle,性能越好,因为连接的创建和销毁,
6 J, K" P9 ~% W 都是需要消耗资源的,但是不能太大,6 a% d2 F& d& D4 ^
因为在机器很空闲的时候,也会创建低于
8 T0 \# h" m+ Z* z/ N minidle个数的连接)
7 X( `3 F0 z5 e maxWait ! Y/ T' \- ?( L& ]) {1 T
最大等待时间,当没有可用 连接时,( Q( B- ^' |+ \: X" ]1 L
连接池等待连接释放的最大时间,
. W3 h2 g% R/ F! a; d+ D' C& x 超过该时间限制会抛出异常,
' u c5 g! l4 F8 ]% y3 I6 o 如果设 置-1表示无限等待(
2 C! r4 c0 c+ u 默认为无限,调整为60000ms,9 ?6 P4 C/ N* ?" x' E2 e& [) P
避免因线程池不够用,而导致 请求被无限制挂起) % i3 |; j0 F8 \$ _4 Y
removeAbandonedTimeout :7 k' X0 T' ^. b+ j# Y
超过时间限制,回收没有用(废弃)的连接
9 @7 ~& [0 A# T/ O3 b1 l) i (默认为 300秒,调整为180) + p, G( u# F- G6 ?$ g
removeAbandoned :' O Z. }' m! b* o( K* w2 b8 a9 m0 {
超过 removeAbandonedTimeout时间后,/ G% Q4 n6 Y3 S" z- @/ X
是否进行没用连接(废弃)的回收& V( ?' @9 Q% l, d# @
(默认为 false,调整为true)
, \0 _2 g+ G8 v. o; t" l (B)spring管理hibernate实体映射文件:# X( q8 Y2 U8 R
<bean id="sessionFactory"
- E+ I4 w1 }& l7 o; {' t class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
2 D: l! i8 n) r+ ]6 L/ C <property name="dataSource" ref="dataSource" />
6 l v, d: o3 n" W; p" l4 T9 C1 R <property name="hibernateProperties">
/ `1 W: }- Z0 j* E* S2 | <props>
& R' s/ G' q" |( C$ W H$ Z <prop key="hibernate.dialect">
9 k1 N4 c$ L6 [) _ org.hibernate.dialect.MySQLDialect
4 j# E2 |0 _; l$ e" m4 O o$ t8 U </prop>% x$ V; ?! m0 b# n' j; Y! F
<prop key="hibernate.show_sql">true</prop>7 l* i9 y! Z+ B4 S7 j+ V" l
<prop key="hibernate.format_sql">true</prop>1 K- h+ f9 I6 [# _! g5 u( E' y
</props>9 Z+ k: X5 z3 F/ t2 N$ Y. y7 c
</property>
- q4 W8 m; Q, W8 b0 H <property name="mappingLocations">$ ]% W' v% X+ g# _0 T9 Y
<list>. A& j- G V2 F& h2 k. ^8 x7 f
<value>
" Q# @) R$ @$ o# j classpath:config/hibernate/hbm/User.hbm.xml: q& E, S! ?# u& t& K1 n
</value>8 R* m+ j! j3 o7 q- Y
</list>( A3 B7 Y% C" d1 A7 {3 w% u3 |
</property>! i7 f9 I- [: {
</bean>, m1 G. \9 s4 z% b, P- W
(C)spring读写属性(properties)文件1 M6 _+ \1 S1 d! p' l% ^
a、创建属性文件 db.properties
2 ]: @ ~- s% }) c7 m' P" A! Z7 [ b、在applicationContext.xml配置8 k8 e v; a" j, F0 ?, O
<bean id="propertyPlaceholderConfigurer"& U, f! H* E7 i1 n2 Y4 C$ V
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
% a3 G5 o: i* O( ~: k. ? <property name="locations">+ L5 ?7 u! D2 A6 m9 P
<list>& o% B$ e% P1 p/ ^
<value>classpath:config/props/db.properties</value>
) Y7 d& L k! b6 l3 L4 i. @4 b </list>. T+ o! `0 z. e& A8 L; ]$ Z, C
</property>/ h7 l# u5 {1 d5 H, v8 ^ k
</bean>
Z4 I6 E0 p. |4 t9 s c:引用: ${username}( N- g3 _! G/ k( d! L9 F" \, M; \5 ?
% B& B; M0 @5 z/ o/ c (8)spring分文件管理" l" e9 P% p6 n7 H. {
<!-- 引入其他spring 配置文件 -->! D9 B9 m: T& ^* I7 q9 l3 d
applicationContext.xml引入下列文件
$ n! Q! Q/ _0 a: p) I3 A <import resource="applicationContext-web.xml"/>
2 k0 T% X* l5 R2 d; S5 _7 t( s <import resource="applicationContext-biz.xml"/>
) _9 Q8 Z& K1 J3 ` <import resource="applicationContext-dao.xml"/>
: B9 O+ y) O4 ]; M7 R: I% Y7、开发数据访问层
7 G) y6 T5 ~0 z9 m 使用spring提供hibernate 模板类 HibernateDaoSupport
! |# ?8 Z# Z; v3 F, W3 s UserDaoImpl extends HibernateDaoSupport/ R0 i( |. p, ]. V: S1 j
在UserDaoImpl注入到spring 配置文件 applicationContext-dao.xml
- z9 ?7 h# N* t# U; a3 a <bean id="userDaoImpl" class="com.tarena.dao.impl.UserDaoImpl">
2 S6 F/ ^! ^7 E' y7 M5 V7 P c1 R <!--HibernateDaoSupport中的sessionFactory-->
3 S5 d" A- y3 d% } <property name="sessionFactory" ref="sessionFactory" /> E( W( `# p. E: t1 f
</bean>2 x" J* D4 }" j
8、添加spring声明事务管理(AOP): B f% P7 U% {& N1 s
声明式事务管理:& I' E: `, s/ e3 p) {
添加spring 类库
0 B& V, x8 A( ~3 \ aspectjrt.jar0 m; `* ?, F/ I% w& a
aspectjweaver.jar
, `: S% `1 T4 R3 V$ b# ^ 了解事务的几种传播特性
2 F! |+ @7 U. `+ ]. M
7 l2 A- Y4 K- c3 [: X; v+ M: |. o (1)PROPAGATION_REQUIRED:
: j6 ?+ g/ r, r$ y1 S" a* |: c 如果存在一个事务,则支持当前事务,如果没有事务则开启。
9 o9 [% e! T# s: | (2)PROPAGATION_SUPPORTS:
1 Q$ `& i3 D* `4 S" G! h, s4 |+ t" { 如果存在一个事务,支持当前事务。
! S/ b0 Q4 c' G5 W( u/ g 如果没有事务,则非事务的执行。
3 a* u0 E0 N3 x0 m7 V% n% U1 W" E (3)PROPAGATION_MANDATORY:
/ f$ r, r/ D7 I8 `5 M5 D 如果已经存在一个事务,支持当前事务。
P9 n4 B' k1 m; T2 Y. O 如果没有一个活动的事务,则抛出异常。7 e2 z4 }' {: M L$ Z
(4)PROPAGATION_REQUIRES_NEW:
0 s, }/ U4 B) |- M! v+ ] 总是开启一个新的事务。如果一个事务已经存在,
; G5 k B0 K% a2 Y5 N/ r: u 则将这个存在的事务挂起。
% k" u& {$ K: |2 D, k$ A# d (7)PROPAGATION_NESTED:(spring特有)% }7 i% d' A; p; U0 N
如果一个活动的事务存在,则运行在一个嵌套的事务中. 7 G9 E8 c, b% h5 u8 ^$ R; }& D' Z
如果没有活动事务, 则按TransactionDefinition.
1 N6 j: ]/ P k! O PROPAGATION_REQUIRED 属性执行% V3 m3 ]6 ?+ F
' j% y3 h1 c8 X3 i5 t (5)PROPAGATION_NOT_SUPPORTED:
( E+ b/ z, w% ~7 s 总是非事务地执行,并挂起任何存在的事务。
3 y6 ]1 V8 H4 b5 W; E+ _ (6)PROPAGATION_NEVER: / e/ c% C4 U% `
总是非事务地执行,如果存在一个活动事务,则抛出异常。* L! ]4 P% ]: `' F; x
_2 o& `1 `$ E" Q) Y! [; _, B
1 n! S8 q! u# g3 Q3 B
<!-- 配置声明事务管理 spring2.x-->: w/ E2 \6 x% o( F: v
<!-- 定义事务管理 -->
, t& b% L+ `1 ~5 D i <bean id="transactionManager"
, C7 g* p& L3 s( j class="org.springframework.orm.hibernate3.HibernateTransactionManager">
. h2 `2 ~+ k- A$ v( o8 Y; f5 H <property name="sessionFactory" ref="sessionFactory" />8 v: E* r4 W# s+ O+ G
</bean>$ i q9 U5 t6 h: S
<!-- 事务规则 -->6 c+ l$ z1 L; D g
<tx:advice id="tmAdvice" transaction-manager="transactionManager">
( K: Z$ u- ` F: W- }4 `0 e <tx:attributes>
+ Q3 W( Z7 F# k4 v9 y! s+ n <!--*通配符 save* 方法名必须是以save开始-->
0 p+ @* {& }8 B/ c: U5 v: {7 a, l <tx:method name="save*" propagation="REQUIRED" />7 @; d5 ?& M& A9 p& ]2 J
<tx:method name="update*" propagation="REQUIRED" />; I9 e% C4 J9 ^8 V5 A4 f
<tx:method name="delete*" propagation="REQUIRED" />7 a C! D8 l: y7 D! \# o
<tx:method name="find*" read-only="true" />2 e8 T1 Z0 ^* v; `2 b7 K1 \7 W- p
<!-- read-only 只读:-->
- o$ H7 e: a# F7 Q! ? </tx:attributes>
& T+ B. |* |0 m. ]' b </tx:advice>
3 ~! ]# `! D* _7 ]0 _ <aop:config>& E7 r/ K3 n1 J1 h
<!-- point cut -->7 E$ |4 U& B# Q9 c+ N
<aop:pointcut id="pointCut"
( p# K# x- _2 C. ~' G8 k expression="execution(* com.tarena.biz.*.*(..))" />; r$ B2 Z* r; u3 U9 P/ |$ u
<aop:advisor advice-ref="tmAdvice" pointcut-ref="pointCut"/> 9 z" V6 x. S( i1 m) A( y4 p+ t9 k [
</aop:config>
" Q+ {- ]' \" a, K' G+ |
! }- t# ?/ Q$ v" A2 ~9、测试
1 Q, y! L9 M& `+ d$ X5 W9 T 添加测试类库 spring2.5.6
" Z) S8 Q0 ^- m# {6 ? junit-4.4.jar$ r! p7 s; x$ _
spring-test.jar; T0 u8 Q9 _5 z
//使用spring测试
; N- R. z8 P# \" P) ~& x0 K1 q @RunWith(SpringJUnit4ClassRunner.class)
9 y3 m, q \: W0 F //加载spring配置文件6 b2 N0 T3 G+ j. ?: R
@ContextConfiguration(locations = {( P2 i# I! ~- \1 t, I5 o
"classpath:config/spring/applicationContext.xml",
: c- @. Q$ V3 M" E "classpath:config/spring/applicationContext-dao.xml",) c" ]5 r- s& H
"classpath:config/spring/applicationContext-biz.xml",: b$ z2 ?' n3 a: w1 p2 i' f
"classpath:config/spring/applicationContext-web.xml" })1 K, [/ d6 J. ]/ w7 d; T
//自动注入
% o3 e( |1 ]7 d! F, @6 p, q @Autowired
( v8 q s2 b/ y) U& r private IUserDao iuserDao;4 `% }8 h9 \0 z$ Z; H* p! x
' @' A- o4 u9 E O: w r: f @Test
z. S& i. U+ O& C+ b7 l public void saveUserTest(){3 L6 E0 V7 O1 s# M3 ^
//测试方法$ J0 B% z, X7 H
}
w( C' D a/ g6 U. s. t2 `10、完成业务层代码编写( W! t% h* g7 z ]6 V1 c
11、完成表示层代码编写+ M, P' o3 G8 |6 `3 z% @- {
12、测试工程
. E& J$ c5 P& ~$ B
) l7 a. y; k# O: u% O, P( F13、spring处理hibernate延时加载& W6 M" D% r! Z- A, O( F& Q. R
1、配置延时过滤器
Z6 F2 f8 r/ r# z' Y/ G& Q& Q" N# S1 [ OpenSessionInViewFilter.class
% M0 ^; x _# _" {% [ 2、在web.xml配置OpenSessionInViewFilter. D" `7 S4 ~, E' e" C
7 F, Q. }( R& Y! u3 G
<filter>
+ s1 e' D7 k+ a7 F2 T- m2 p. P1 S H0 | <filter-name>openSessionInViewFilter</filter-name>
1 f9 m+ [# J0 e7 N% v A <filter-class>9 g& O5 c0 C2 A3 Z
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
$ T) T4 ]% @0 X0 P+ Z </filter-class>
* y" j4 t' p' A' G3 t) { <init-param>
; ~6 F0 c2 `& w2 B8 R$ | <param-name>sessionFactoryBeanName</param-name>
) c( c2 y X$ b, J5 | <param-value>sessionFactory</param-value>
2 H- A4 y2 M& [. N2 j7 j7 R </init-param>
: n, h; o' h/ Q/ d# ?3 O6 J </filter>
) n1 f, d, `6 [% B! ~( A: D) \ <filter-mapping>
0 X7 O1 V" A& W; J3 M$ T3 } <filter-name>openSessionInViewFilter</filter-name>) P6 s; G8 t* }4 U
<url-pattern>/*</url-pattern>
- ~" N4 [8 W$ s$ [* m+ m </filter-mapping>
; f6 Q& f8 @/ O3 H! v1 ]! U( M c8 `2 F- i( ^. ~, W7 K, q9 N) M3 }
|
|