|
该用户从未签到
|
1、创建Web Project
- G9 h+ A: G0 b) N2、web工程与struts2整合$ g. e' W/ d0 F7 i# D) H
(1)添加struts2类库
9 Z/ M3 V. B% Y6 v1 D8 E6 [5 e struts2-core-2.1.8.1.jar
4 S: A( d* p2 X A, k* ~) E5 {4 s; x( L( [ xwork-core-2.1.6.jar
, y2 I$ @3 i/ n+ c) q# y. b# M commons-fileupload-1.2.1.jar, n9 @1 Y, ?$ W+ Y+ \/ X! L9 Z
commons-io-1.3.2.jar3 n) b, Q- v2 b' y' e' z+ r1 K
ognl-2.7.3.jar
4 E) ]& ?- |7 i: K. R" w freemarker-2.3.15.jar- I, F; O' p7 g- X6 i/ G' h8 A
(2) 在web.xml文件中添加struts2集成
$ |! C, e/ ?& Q" f5 r. C <filter>
( Y5 \) f+ ]! I7 }* n7 j8 N2 Q; A <filter-name>struts</filter-name>9 i6 T( {4 N* o( v% Q+ H# V
<filter-class># j$ l6 l' p7 F8 |/ {; s
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter5 {( w3 g; v ]) ~- s/ i
</filter-class>
4 E3 P+ M+ h; g" T6 q <init-param>/ k8 t( m4 Y* `0 r6 ~
<param-name>config</param-name>
: s+ l# c- N" {0 q+ Y$ s <!--
1 C% a. _* O( c: X 修改struts2默认配置文件,# p% ~/ O( M$ w J! G5 l
必须把struts-default.xml,- G: K1 j) k# G3 C/ M
struts-plugin.xml一起添加% m$ e. D. b; i" M% e! @6 N
必须:按顺序添加+ ?) w3 {% _1 c' S4 a
-->/ h& f) u/ ~# D$ L0 N
<param-value>: V- }* d$ L: A- }, u& _! q
struts-default.xml,struts-plugin.xml,config/struts/struts.xml8 |- E( }! Q4 f; L6 R
</param-value>5 T% m: ^0 z8 h) `& z, ?! T
</init-param>
' e" n" _* A( G0 T9 }/ [* A </filter>
$ G, y5 c, w: u" e5 B. _ <filter-mapping>
7 a. n: X5 k- T. ]9 E8 Z <filter-name>struts</filter-name>0 k6 G5 }7 O# H$ k+ Z; B1 v
<url-pattern>/*</url-pattern>
- J. ]1 A4 v6 {; g- m( ^- X </filter-mapping> $ [6 @% u1 b: w- j7 N% O
<!--struts2 *.action struts2 *.do-->
- l( x' |6 N9 x! N3 R (3)创建struts2配置文件struts.xml配置
4 R( y1 j2 R$ ? (4)完成页面跳转3 D9 g8 ?1 X. q# |" @3 a
3、测试struts2工程2 e7 m" J# O! b% V* m
4、struts2与spring集成5 f% m6 a- U/ f" y$ W2 x- n
(1)添加spring类库与struts支持spring插件
! T8 h8 A: }1 e$ s struts2-spring-plugin-2.1.8.1.jar7 T. }# x; i1 D% j; `. ^ X
cglib-nodep-2.1_3.jar: U% o- b# x/ H
commons-logging.jar8 K8 e5 T4 u! A5 V7 R
log4j-1.2.15.jar, n s1 e: f4 _9 |2 r: p8 j- c; v* E
spring.jar9 L, d* \' h# ?7 P
dom4j-1.6.1.jar2 E% `1 Q, f5 T$ |; I
(2)在web.xml中完成spring集成3 |" Y. t' E' T
<listener>7 ^. S$ E7 n2 t( ]9 X' W+ C+ v' Y
<listener-class>+ `9 e3 |: b7 o
org.springframework.web.context.ContextLoaderListener
/ D3 ~5 `0 ^" @5 D </listener-class>0 R/ ]& O: b3 O8 r1 j
</listener>
+ D2 Z& K6 v3 v0 K) {, Z; S <context-param>
0 ?) J# @2 V' |( v1 k4 _1 `) `8 O9 | <param-name>contextConfigLocation</param-name>
+ U5 Z8 H- A/ q9 I- w$ {; a <param-value>
% O4 i# T$ m" m9 M) m classpath:config/spring/applicationContext.xml
0 P/ {0 {2 U( X( [1 U <!--classpath:config/spring/applicationContext*.xml-->
* |$ m6 n8 z/ @( z) ~; g/ i </param-value>3 K2 |# c* z5 G8 {+ B
</context-param>
: M+ r% `2 n1 z6 i (3)创建spring配置文件applicationContext.xml
0 n/ S1 ]: P. D3 Y (4)在struts2配置文件中添加spring 集成常量
3 g9 R3 t: X- _( a$ n; T <!-- 设置集成spring框架 --> O3 _: ~" z+ H5 ?& B
<constant name="struts.objectFactory" value="spring"/>0 _1 ~' {+ }) ]: Q. I! L
(5)spring管理struts2中Action- X1 z/ z" W7 X5 } V
(1)在spring 配置文件中加入bean管理
" o {9 q; U2 R( }% E% W! l <bean id="userAction" class="com.tarena.web.action.UserAction" >5 o3 @/ \# @( n/ y" ^8 {
</bean>
' Q$ T3 u2 z2 r' k/ j* X (2)修改struts-user.xml配置
+ q6 K7 z7 R2 [, b4 Z <action class="userAction" >
& O4 \, E4 k- N$ J* h! Z; r% M/ L </action>: i6 S+ o7 P$ J+ s( O. k
5 测试struts+spring集成
5 u- K( E$ G0 m6 spring+hibernate集成
' q( L' d1 x; f+ G a" s) u (1)添加hibernate类库
$ K* R& w; a$ h- Z' N slf4j-nop-1.5.8.jar
/ ~$ r+ n( N L; N) E' H$ C2 m6 { slf4j-api-1.5.8.jar
8 _! d6 \; N$ u5 L7 y# p jta-1.1.jar3 c# @0 J, ?3 A9 i( S8 @/ L4 }
javassist-3.9.0.GA.jar
( m/ J/ w7 L; W hibernate3.jar: ~' C8 J M) T/ O' N x/ }
commons-collections-3.1.jar
+ O f7 U! m& Y9 L; A antlr-2.7.6.jar
- W: u3 B% l7 G. j# F (2)添加MySQL驱动类库 + O% k0 W- W& {( Q- T8 ~
mysql-connector-java-5.1.16-bin.jar7 [* y- f j4 x) F7 r
(3)创建实体类) q% v" Z; r) E. j1 a0 M& @2 Y- U
(4)编写User.hbm.xml映射文件' n3 {( y9 U* r, B
(5)反向生成表结构5 E: K/ \9 ~6 [ ]- f2 _
(6)spring管理hibernate 5 H& h- r) A2 C, J7 ~1 I
在spring applicationContext.xml配置文件中添加spring对hibernate管理
4 ?# d' \8 D% l2 f t+ I1 Q9 c& t (A) 添加DBCP连接池
# u2 P ~4 J; B4 a a、添加类库
* A( \# D3 V/ N8 E8 t8 W5 C( M* Q commons-dbcp.jar
' J6 h, p; }# [, W( }' v5 f# _ commons-pool.jar
0 q7 j1 ]2 L' N& ? b、applicationContext.xml在配置连接池
( }, L( ~3 U6 k+ Q% {. v& V) f <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"># ~ Z+ w4 \' O( P, {
<property name="driverClassName" value="com.mysql.jdbc.Driver"/> \8 m9 i( {# K0 p
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/>8 g2 ~0 q, I( m2 h3 @8 `5 I$ J3 a
<property name="username" value="root"/>
. W$ K: _' S+ e5 b" J# N) y. ? <property name="password" value="1234"/>
5 p" w$ s9 H, ?4 F' |) s <property name="initialSize" value="2"/>0 _1 W: w5 Z6 h2 ^7 e
<property name="maxActive" value="8"/>
, }! e+ _" i) B: l) s' D <property name="maxIdle" value="5"/>& D0 E, U s6 Z1 ~ p$ I
<property name="minIdle" value="3"/>
( T+ {0 `; g7 D e6 a <property name="maxWait" value="3000"/>
# z c6 Q+ X: ~3 v <property name="removeAbandonedTimeout" value="60000"/>; f- j, u4 G/ D! Z; e: S8 ]
<property name="removeAbandoned" value="true"/>
# {; I+ V- V r; R$ t: ?. d </bean>
, @! a/ I" a- B5 z: u; P 连接池参数如下:
5 n! [6 V Q8 S) C. Q; D0 n initialSize
/ D7 a8 B- E8 p& ? 连接池启动时创建的初始化连接数量1 u9 X6 I- d% m' [0 s5 Y" S" f
(默认值initialSize :连接池启动时4 d4 D4 f. e& h4 y
创建的初始化连接数量(默认值为0)
/ J0 X$ @1 V0 T2 D maxActive
8 z- f1 g" m a7 w8 `% E8 w 连接池中可同时连接的最大的连接数0 q- ~3 H J; B4 G
(默认值为8 ,调整为20,高峰单机器在20并发左右,1 H5 S( F0 f4 g3 o& Q Z
自己根据应用场景定)
2 i9 R: Y- l8 w" C maxIdle! q, A) l2 a1 m
连接池中最大的空闲的连接数,
! F( _. e( a; G: j 超过的空闲连接将被释放,
! ]1 `# I' d" c6 \3 ~ 如果设置为负数表示 不限制(默认为8个)
7 b- i E1 Q! A5 V: h9 ?( G minIdle
$ c: W P% W0 F& @ 连接池 中最小的空闲的连接数,低于这个数量会被$ l6 o3 F, w8 ~, _3 f3 D
创建新的连接(默认为0,调整为5, 该参数越接近6 R3 o) {. a4 ?" `3 c8 w/ j
maxIdle,性能越好,因为连接的创建和销毁,
6 X2 }1 V& P7 v" g 都是需要消耗资源的,但是不能太大,' \8 Y# t! {8 z& b. E
因为在机器很空闲的时候,也会创建低于1 E/ v3 {, y8 z# @$ r2 _7 i
minidle个数的连接) / E6 A3 C1 F! |+ ?
maxWait " n8 P8 u0 J9 {; W- \
最大等待时间,当没有可用 连接时,5 P/ [7 C3 a$ X+ V& o+ j& ~5 a7 t
连接池等待连接释放的最大时间,
* L9 M" y3 C c$ x( j 超过该时间限制会抛出异常,
0 [- {/ o* g6 T 如果设 置-1表示无限等待(% {8 j2 o! Y- L* A1 N& N; y
默认为无限,调整为60000ms,
! d' u9 d8 c1 O 避免因线程池不够用,而导致 请求被无限制挂起)
. V0 O1 F8 H3 f- c* ^% q) f8 G: p removeAbandonedTimeout :
: @" T; \/ ^9 P: K/ L: ~' ` 超过时间限制,回收没有用(废弃)的连接
1 e2 Q& L/ m9 t% @ (默认为 300秒,调整为180) % _+ V" B. z) b# c4 \
removeAbandoned :
% |. i0 ]8 a1 L! ]3 E9 V 超过 removeAbandonedTimeout时间后,( G& Q* G) W' V% |
是否进行没用连接(废弃)的回收
: t8 _4 o0 s5 H/ d p (默认为 false,调整为true)2 N' h1 N7 K6 i4 {! t/ w% F
(B)spring管理hibernate实体映射文件:8 c% C2 w+ O8 P3 L0 \
<bean id="sessionFactory") C& E6 x* W/ E! f' l* d H- D6 l
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">0 u" ^0 Z U9 T- p0 o
<property name="dataSource" ref="dataSource" />
3 Z5 b$ J( P9 P& D, e <property name="hibernateProperties">( |$ D( h. p0 D( a9 X& q: L3 d' n5 O
<props>! [$ }5 E: ], x2 B% k2 z( Z# `% b
<prop key="hibernate.dialect">3 K) ?( u/ M; d0 s
org.hibernate.dialect.MySQLDialect/ u* \5 |5 L4 W9 K
</prop>0 W# y: p' f% A* r0 P1 X
<prop key="hibernate.show_sql">true</prop>1 Z$ L! R1 b* @/ q/ \# D3 [( N
<prop key="hibernate.format_sql">true</prop>
; }0 K d& k, |8 D: J/ R# D </props>: L' B* M, H5 i
</property>& V3 A0 m8 m1 Q0 k Z0 F& m( ?
<property name="mappingLocations">
5 T5 `: Z, R6 x0 g' @5 P) x/ d d% O <list>
* y( ]6 R& ^& k <value>5 j* y: X- P% K' \# h4 U9 \5 \
classpath:config/hibernate/hbm/User.hbm.xml. Z: i F E3 c& R+ k1 D* V) o
</value>
! S7 `, d6 H- N </list>7 y* n3 r% K9 o7 X6 F
</property>
6 j0 F1 k& g0 }& a- H5 t2 D </bean>3 D5 g% ~, J! D. j
(C)spring读写属性(properties)文件2 B! w& F% l, l7 R* ^. r
a、创建属性文件 db.properties5 C0 b! X: Z8 V8 [ f) `
b、在applicationContext.xml配置
: l& ^, v# M$ d8 {, }# D <bean id="propertyPlaceholderConfigurer", i: C" x, c- S* j
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
/ H9 L/ C* }8 o <property name="locations">. y- V+ d+ k! E% _' E# l
<list>, G' `0 d0 _, k; M
<value>classpath:config/props/db.properties</value>
$ d6 m. w! E' u* g/ n5 H </list>( R g2 l8 R8 @+ n/ T- ^3 ^; n. o
</property>
( I! A& s: Q5 ~ </bean>
- N: o$ J7 }6 J( [) _/ U c:引用: ${username}
7 p4 c% `# {. O3 a: C/ M; w9 p7 Z 2 ?# T/ n; @ z0 n e- A9 X
(8)spring分文件管理0 d0 H E% `8 ?2 a
<!-- 引入其他spring 配置文件 -->2 Z! G B9 {% \' _2 O' E
applicationContext.xml引入下列文件
0 j# P' h! {+ P: d9 b <import resource="applicationContext-web.xml"/>; g- o' h- m0 I/ X0 v0 U* ^- x) z
<import resource="applicationContext-biz.xml"/>
* f4 B( ?/ k, w" ^9 g# ?1 }$ N$ I# G! @ <import resource="applicationContext-dao.xml"/>+ _1 ~$ t: T0 h7 P9 F6 b" [4 {
7、开发数据访问层
) b, B: M- a0 N7 X5 M% \9 O) s 使用spring提供hibernate 模板类 HibernateDaoSupport. {$ f2 W% Z/ k3 o3 N+ B( y0 B& J+ q# y
UserDaoImpl extends HibernateDaoSupport
+ K$ @0 j" h( T 在UserDaoImpl注入到spring 配置文件 applicationContext-dao.xml, q# t2 N9 d f- a
<bean id="userDaoImpl" class="com.tarena.dao.impl.UserDaoImpl">
& p- j' u6 r9 E" W/ Q$ D <!--HibernateDaoSupport中的sessionFactory-->
, I c, g0 @4 [. L( J <property name="sessionFactory" ref="sessionFactory" />% c5 K ]& J! i, s
</bean>1 I# }7 x2 f3 P$ d6 z& }
8、添加spring声明事务管理(AOP)
* P _) P$ s8 C3 G 声明式事务管理:
: C4 R' Z2 D1 f. Q: v! u8 m" m, G 添加spring 类库
- i8 P: K0 c/ z) r aspectjrt.jar
, T0 I3 p, I* N: G9 V aspectjweaver.jar/ e. x4 d/ x( [& k) q, c Z
了解事务的几种传播特性
4 k" Z) e: m5 q% }6 S$ [
/ _0 G. I0 V. S" d9 X (1)PROPAGATION_REQUIRED:
+ {4 w, o4 ~$ p0 M# ?& u8 v* P 如果存在一个事务,则支持当前事务,如果没有事务则开启。
2 X% i' m2 d6 X% ?! b (2)PROPAGATION_SUPPORTS:
& v8 p% w, k. p. E/ G% H 如果存在一个事务,支持当前事务。5 I& x6 E$ v, K4 }
如果没有事务,则非事务的执行。( F- U! o6 f9 ]9 m* Q+ K, H
(3)PROPAGATION_MANDATORY:
! B/ G5 c3 p/ G* M# t- B8 J 如果已经存在一个事务,支持当前事务。2 h6 P' l. M4 X4 u, o: R& y7 D
如果没有一个活动的事务,则抛出异常。
6 M) H+ k! c$ m: l) w (4)PROPAGATION_REQUIRES_NEW: 6 P7 P' o0 n- d# F+ u
总是开启一个新的事务。如果一个事务已经存在,
& Q% n' u+ q! S6 D/ k/ f: a5 \ 则将这个存在的事务挂起。6 d( B3 e2 o* c: g# j6 e+ e
(7)PROPAGATION_NESTED:(spring特有)' F6 t6 r# C" o: W$ g
如果一个活动的事务存在,则运行在一个嵌套的事务中.
3 k! G) J2 h3 a$ \9 g# s0 K 如果没有活动事务, 则按TransactionDefinition., A2 C9 g1 R; U& ^& C$ r4 |
PROPAGATION_REQUIRED 属性执行
$ i& X% X5 r2 ~! T i2 p# U
$ W* t$ u9 }, K k" W; D (5)PROPAGATION_NOT_SUPPORTED:
9 j) a5 C: k& J4 L8 t 总是非事务地执行,并挂起任何存在的事务。" F& E. X7 u% b" ]9 `2 s
(6)PROPAGATION_NEVER: 4 ?3 x* n! M4 Q5 U/ P- j# L& J$ f
总是非事务地执行,如果存在一个活动事务,则抛出异常。
8 }. o: Y- n ~) C9 T u+ D! Z/ K$ o+ C( O
8 |4 E$ F. ^& ^2 ]. a$ ]2 _ <!-- 配置声明事务管理 spring2.x-->: t6 M3 s' W& q0 X e
<!-- 定义事务管理 -->8 v- [6 O0 B0 F8 Z/ |2 e9 C' d
<bean id="transactionManager"7 V: v6 u1 d) b
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
% f8 H/ |' S) p <property name="sessionFactory" ref="sessionFactory" />! ^ u7 m1 k: o* x
</bean>& T$ E* e. w0 g7 Z' S4 N+ I
<!-- 事务规则 -->
: d c. W6 y0 O" r9 d <tx:advice id="tmAdvice" transaction-manager="transactionManager">1 z% b* m$ u# q$ w
<tx:attributes>) f4 s9 a* y( s( K: o/ n
<!--*通配符 save* 方法名必须是以save开始-->7 c* [- ], a2 O1 S' r. W
<tx:method name="save*" propagation="REQUIRED" /># B4 V5 u: e/ @6 r- v
<tx:method name="update*" propagation="REQUIRED" />
' ]! d2 O5 J2 i0 a <tx:method name="delete*" propagation="REQUIRED" />
3 o! D. {7 V2 p9 Q& j. x6 x6 w <tx:method name="find*" read-only="true" />8 @$ F& R, O7 ^6 B. F: s4 p; p
<!-- read-only 只读:-->
$ `6 k z& G! q </tx:attributes>! a2 E$ ^0 L5 o/ n% V
</tx:advice>
" E8 u1 Y z" N5 T& R) q <aop:config>4 a( g- |2 ^6 ^% H' b1 i/ |% _
<!-- point cut -->6 I# C, x( e) h' ]( x
<aop:pointcut id="pointCut"3 V( G+ Z2 [% [7 G" T
expression="execution(* com.tarena.biz.*.*(..))" />
" H/ z+ T7 O. O+ j+ `( ^6 [ <aop:advisor advice-ref="tmAdvice" pointcut-ref="pointCut"/>
1 R$ K0 j2 i; I- Y* ], y0 A </aop:config>
- U7 Z2 C2 B Y& y: U% F/ O8 f 4 }: C B! a! f" B: p7 H; L: j" p1 [
9、测试
: Q; s+ J2 l S& l9 v, j 添加测试类库 spring2.5.6* q \' O$ u8 x( G3 o4 ?
junit-4.4.jar1 I7 S- X. H0 U4 k( g
spring-test.jar: k$ p# U$ |7 {
//使用spring测试
& U5 x6 D2 U7 J) R5 `' S' t' z* ~8 Y* I @RunWith(SpringJUnit4ClassRunner.class)& {% S* V- G) V* B* r0 K) c
//加载spring配置文件1 e, ~* d" V e" H, i* u
@ContextConfiguration(locations = {
8 R; E/ a4 \2 _! b "classpath:config/spring/applicationContext.xml",. b+ ~" j( C5 s$ [: u6 j% `
"classpath:config/spring/applicationContext-dao.xml",/ [: [& g8 S; S; K5 x- w" r, c
"classpath:config/spring/applicationContext-biz.xml",
! Z7 w7 z6 g* o3 |; w9 h6 w4 C( L "classpath:config/spring/applicationContext-web.xml" })
# d4 t/ B3 t* ?/ I //自动注入
0 A6 S% ]- Q( a7 f1 M7 q L @Autowired* I& o0 g- I$ D) g3 x( [
private IUserDao iuserDao;' v; k) Y! P6 I9 N% n$ j% S1 r" a
8 n: V, ^3 D' t5 D @Test! ^$ U5 s5 e( t) ^
public void saveUserTest(){
- @, U3 |" ~( }! c4 y //测试方法
5 t5 {0 Q, l( D0 ?. @1 @ D$ a }! y/ F. q4 v, j. R
10、完成业务层代码编写0 Y/ a( _3 f% B
11、完成表示层代码编写4 o- M. u& E/ E
12、测试工程
& ?9 j7 W4 D1 `, P6 u3 n& L0 M9 A( i+ H7 Y4 Q. [& A; V3 n9 E
13、spring处理hibernate延时加载0 {8 j" G7 ]: T- _, p" ^
1、配置延时过滤器
7 N" b- q. L! p% z7 \) d OpenSessionInViewFilter.class
! ^ ~8 N6 x2 |! n& O 2、在web.xml配置OpenSessionInViewFilter
' E/ B9 {" m0 r3 |3 [6 y0 d 5 U) i% k6 n8 N) m& X
<filter>
8 n1 q) D: h, a <filter-name>openSessionInViewFilter</filter-name>
# W; m+ ?6 y& X! Y! v <filter-class>
& k9 y: d: g3 V J h org.springframework.orm.hibernate3.support.OpenSessionInViewFilter& B2 f9 T( I- `9 p$ g% T2 p9 z, C# @1 M
</filter-class>
) x! E0 g$ T1 i: r0 F, }% d <init-param>7 |; r" B2 j1 u2 |
<param-name>sessionFactoryBeanName</param-name>
, t% i( D$ g! ^7 n9 _4 W <param-value>sessionFactory</param-value>
6 L- F3 j9 k$ _, H </init-param>
; s* i1 S& j1 k/ W </filter>; u7 a5 @6 O5 i$ |$ @/ P
<filter-mapping>& ^5 o% E* ^: E) x+ C
<filter-name>openSessionInViewFilter</filter-name>0 l* w, e8 C5 d/ Q4 y {
<url-pattern>/*</url-pattern>* x& C- {# S) K- A
</filter-mapping>' i) Z, f. `6 D$ L9 ^
. A) x3 s! b0 _4 @ h5 V3 }
|
|