该用户从未签到
|
1、创建Web Project
/ x. {6 J- q4 r/ b! ^2、web工程与struts2整合
) a' i3 h1 w" [' L+ ? (1)添加struts2类库$ z f2 {- n% x4 U
struts2-core-2.1.8.1.jar
f" @/ p% z, e% R xwork-core-2.1.6.jar; V2 W: X [8 e5 c7 p I U
commons-fileupload-1.2.1.jar
: W) c \4 n t) g) F- ~, ? commons-io-1.3.2.jar
" d9 k) G' D, |5 w) a, B8 @) [; L$ [ ognl-2.7.3.jar, A! l( v+ ?$ f' R/ ^
freemarker-2.3.15.jar0 Q" {7 X+ Q. N4 n3 ?
(2) 在web.xml文件中添加struts2集成1 Y8 n4 U/ s2 O$ N0 `0 m" L
<filter>
2 |2 d; g% d M7 T3 D <filter-name>struts</filter-name>
, t, y) P' p: j4 n" ^ <filter-class>1 {* O" D( B* B8 k/ p2 v) y x
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter* b' {% m! }, _ {& b1 O6 b8 w6 ~
</filter-class>& e5 _5 x' }' F
<init-param>* n+ o1 K: h* M& C. G, H/ x+ d6 t
<param-name>config</param-name>" B$ H* b/ {( \$ Y, }. J, g: Z
<!--
# [3 ^8 S t2 X/ s9 ] 修改struts2默认配置文件,
& h' G$ w. I. [/ Y+ Z5 v 必须把struts-default.xml,, @ r$ v! B6 `- a3 c
struts-plugin.xml一起添加$ \2 b* v% S/ t, n8 x4 n2 N( g
必须:按顺序添加
0 p% { i. `, L9 y" s -->
6 m2 P/ n+ `( [1 g$ J5 ? <param-value>
* g8 o* a2 h5 f struts-default.xml,struts-plugin.xml,config/struts/struts.xml' K# ^. \9 p! r; `" h- j9 |/ U
</param-value>
; t# f# k+ f ~6 ? </init-param>
4 x3 E$ |( N! {6 x& b' i' R4 @ </filter>
6 i3 i* U9 ~/ w* n! O <filter-mapping>
' x0 Z4 f9 x5 p* _1 k& T <filter-name>struts</filter-name>% w" Q/ ^# l: o+ x" [" `: J0 I5 f; Y
<url-pattern>/*</url-pattern>
9 x1 h2 W9 E1 k) I' z </filter-mapping>
% k* T% O1 `/ O* Y; R3 X4 i <!--struts2 *.action struts2 *.do-->
+ f# w$ F5 X5 ]& `0 L4 G (3)创建struts2配置文件struts.xml配置
- G: A: A2 _+ H. l+ s" f+ ^& f (4)完成页面跳转# Q: w% x4 U) y' q8 O
3、测试struts2工程5 @$ d. ~, Y2 b: T' s0 ~
4、struts2与spring集成; I2 c6 A5 P' A! o% e, C, V, d
(1)添加spring类库与struts支持spring插件
( A$ s3 C" v6 l% h d" \ D struts2-spring-plugin-2.1.8.1.jar
+ H9 q4 w4 I' p3 p+ L' [ K cglib-nodep-2.1_3.jar
, V/ a1 v" {; Z, s! J. u9 e commons-logging.jar
6 M( V' c; D! C, E log4j-1.2.15.jar) W& ?+ U% M7 C1 @, }4 w) Y
spring.jar
. l8 j: C/ `7 j7 b dom4j-1.6.1.jar
# q2 X( v/ ^& Y n [4 k, K0 \# J (2)在web.xml中完成spring集成
0 z4 @/ T+ t/ @1 k9 ~ <listener>* i5 U. l$ w5 ^& _; w
<listener-class>
+ p7 M' n" F+ |; U$ ^1 e org.springframework.web.context.ContextLoaderListener
. [0 \2 p! o* m7 i9 ^3 s </listener-class>) q/ D# O9 |/ G4 j
</listener>8 ^- _0 Q- Y/ L& E2 ^1 I3 H
<context-param>
% r. E2 V9 U1 x' ` c9 Q' M1 q <param-name>contextConfigLocation</param-name> O, Q* G k1 T# I
<param-value>+ H# n, {; D& \5 p
classpath:config/spring/applicationContext.xml7 h8 X+ H/ T0 W- H* _
<!--classpath:config/spring/applicationContext*.xml-->5 s3 k' ^6 H G m) t) M! K
</param-value>" m! _ r. l+ h5 ^
</context-param>
% n& Z9 N, v3 j: j K (3)创建spring配置文件applicationContext.xml- n6 F6 U5 I8 W' T2 I! m/ ]. o7 a, r! I
(4)在struts2配置文件中添加spring 集成常量
+ P, H8 z1 `. O2 Q: _9 _ <!-- 设置集成spring框架 -->
% e+ _; [1 s' d& Q7 K$ }3 s <constant name="struts.objectFactory" value="spring"/>$ ^0 Q, r& w' ?* U( g+ y
(5)spring管理struts2中Action! B: S6 Z/ b7 G) o$ a
(1)在spring 配置文件中加入bean管理
4 L5 g2 ?8 P2 U6 R/ D <bean id="userAction" class="com.tarena.web.action.UserAction" >- ]* _$ }: p/ m' }# I
</bean>: ?+ N" J& O5 v' D6 u1 D. x I
(2)修改struts-user.xml配置
% O% D) o3 W/ d <action class="userAction" >) c- _: `1 p# o
</action>7 g3 [0 i, L' @ p
5 测试struts+spring集成( Q2 c. m9 K0 J; H% c$ u: z
6 spring+hibernate集成
; N! F0 x1 ~9 G (1)添加hibernate类库$ v$ h+ `& K# A3 ]" |5 B4 r& d) K- {/ T) [
slf4j-nop-1.5.8.jar
/ y2 X9 E0 y4 t slf4j-api-1.5.8.jar
/ V. p1 ?( L- s5 T jta-1.1.jar9 R( s0 u. ~* B$ ?
javassist-3.9.0.GA.jar5 T* ]" e7 e4 C( n. F! X% G
hibernate3.jar
6 X; o% ~4 y0 m5 y, w) H8 H commons-collections-3.1.jar
! Y# w/ z0 N1 O# A. w( T antlr-2.7.6.jar
9 j$ M G2 t9 U+ u$ \ (2)添加MySQL驱动类库
% b# `+ D5 W1 M8 @ mysql-connector-java-5.1.16-bin.jar
# `9 P' B0 V' m" Q# o% c( A (3)创建实体类( k0 i' j: j1 I! k
(4)编写User.hbm.xml映射文件
2 C" m+ [! ]0 X H* o* t# j (5)反向生成表结构4 B# f+ I" y) n5 @2 I, h
(6)spring管理hibernate ; H$ r: H& b: c
在spring applicationContext.xml配置文件中添加spring对hibernate管理
5 v3 D; c, E5 ], e (A) 添加DBCP连接池
2 C& e( v I7 k. }. e a、添加类库8 c+ N4 R, X; R9 d; n6 o' M
commons-dbcp.jar
# y/ _! k% _" P# @/ w3 I commons-pool.jar0 ?" @" s% A) r) N+ {
b、applicationContext.xml在配置连接池+ S4 u$ z- N( Q0 @, S. I% W& e
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
# j6 g6 V+ A- g <property name="driverClassName" value="com.mysql.jdbc.Driver"/>" W: y8 Q9 C, e4 I4 a+ X# m7 f d6 ^
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/>7 y5 H3 Q( l8 `1 s" ]
<property name="username" value="root"/>: k% P- W7 i7 `0 r
<property name="password" value="1234"/>3 L ]3 T, c( k7 A
<property name="initialSize" value="2"/>
/ g" T& m' n J! U <property name="maxActive" value="8"/>! i$ T5 y1 H* _8 E' w) Y: r
<property name="maxIdle" value="5"/>; t9 Q, w1 y0 H" _8 s: A
<property name="minIdle" value="3"/>- o/ i9 d6 X2 F7 T) h. e2 s$ _
<property name="maxWait" value="3000"/> R% [& p% l# Q) @' _; ~
<property name="removeAbandonedTimeout" value="60000"/>- B- |* C/ I5 B; a" }/ t" `
<property name="removeAbandoned" value="true"/>
. a8 N; L; P: i, O" Q" F( S! p" j </bean>
& X9 B+ O$ b; E2 F d. b$ h8 m- c 连接池参数如下:
+ |- Z% m5 K6 W5 T* |( Z initialSize
% v- j" u5 x( Z! P8 d( a1 ? 连接池启动时创建的初始化连接数量% \5 ]8 z8 P& k: d( |! c
(默认值initialSize :连接池启动时- E6 X! S* V+ N9 Z
创建的初始化连接数量(默认值为0) $ i; K& z4 _0 H
maxActive
# K C9 O% h3 Z 连接池中可同时连接的最大的连接数5 T' E% q( B" o; s
(默认值为8 ,调整为20,高峰单机器在20并发左右,7 f3 z6 q( c' S
自己根据应用场景定) 8 W, R# t. T: j7 D5 f) j
maxIdle( E: @' @9 C0 a4 y( ~* e
连接池中最大的空闲的连接数,
; v& S5 ~8 e. Z' F$ _) s 超过的空闲连接将被释放,
( U; _9 k* _. Y+ c 如果设置为负数表示 不限制(默认为8个)6 B& k, u) t: d7 M$ n
minIdle- F+ M" [' D8 S4 D: ^7 j
连接池 中最小的空闲的连接数,低于这个数量会被2 Z1 r8 ~. ^, v' l
创建新的连接(默认为0,调整为5, 该参数越接近
! F6 _' I, m& x maxIdle,性能越好,因为连接的创建和销毁,# j! \, [+ k! J$ z- @9 n3 F
都是需要消耗资源的,但是不能太大,
* B8 q. [4 u$ \* v 因为在机器很空闲的时候,也会创建低于; p1 E5 z! {+ B; r7 }- m
minidle个数的连接) + W! A( E( p# G) V
maxWait
( r4 a5 s4 ^# Y4 t& {9 I6 N' s5 H6 n. P 最大等待时间,当没有可用 连接时,4 e Q, l w; {( }
连接池等待连接释放的最大时间,
+ x8 z2 N* M3 i4 ~1 L; p3 v8 t 超过该时间限制会抛出异常, }8 l3 l: d& b+ X3 M5 U
如果设 置-1表示无限等待(1 }: K$ W) o6 r
默认为无限,调整为60000ms,
8 ` E% X- j$ q0 `( m5 M) |: _ 避免因线程池不够用,而导致 请求被无限制挂起)
$ G( f2 t) W7 X removeAbandonedTimeout :6 q5 [, b5 y' D
超过时间限制,回收没有用(废弃)的连接
; V2 r, T* n! S (默认为 300秒,调整为180)
9 i; U, y+ ~+ J# Y removeAbandoned :
, w* {# `# O4 Q" U9 ^ 超过 removeAbandonedTimeout时间后,
9 K: ]' y+ O. k 是否进行没用连接(废弃)的回收 d! k/ i( K; N3 y
(默认为 false,调整为true)4 {6 u9 A7 ] o7 s5 O
(B)spring管理hibernate实体映射文件:6 P9 r' b6 o1 ]4 r4 E# l
<bean id="sessionFactory"
( a9 l! y; e1 Z/ |3 l& d class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
, m( o9 p: w9 @2 x$ H6 W1 u) z <property name="dataSource" ref="dataSource" />
# K! T5 X. V1 [6 f! F <property name="hibernateProperties">
6 T) @1 T6 Q7 u" M <props>
2 X, W) O# j: }- s1 s2 S <prop key="hibernate.dialect">
& a2 t8 j# [+ u8 e& J4 m org.hibernate.dialect.MySQLDialect
8 W$ B. W7 p) H; p2 W' x1 E </prop>& H/ R' E( l# D5 |, t
<prop key="hibernate.show_sql">true</prop>
. K# } A1 t. Z* M <prop key="hibernate.format_sql">true</prop>. N4 b' H+ N( e" F* r0 P
</props>
& Z, o- n% i. L$ z3 P% j7 t </property>
" `$ w* |- J% { <property name="mappingLocations">
6 e: d: F" E6 L; T- n <list>
1 i5 b" [& a) f5 h1 {/ `. o7 F <value>7 w+ g, g' d, F0 ^4 s1 \
classpath:config/hibernate/hbm/User.hbm.xml9 b4 f l0 G' I g5 Q
</value>% f. A) ~/ K1 l5 e, u3 f
</list>% J4 E; h6 K/ }5 |% s$ C. ~+ X; M7 E
</property>
o0 |# k# _# v o! x, g </bean>8 L. o# a4 w: G. k, u
(C)spring读写属性(properties)文件
% _6 j. D0 K5 Y4 x9 O7 v a、创建属性文件 db.properties
) v$ ^. M& k9 M2 O# O b、在applicationContext.xml配置3 K+ P+ t( _" s5 h& D
<bean id="propertyPlaceholderConfigurer"0 y5 K! |% T; [% L `; B9 V' f& E
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">4 E9 R' q2 C) d t8 Q6 A/ r- G
<property name="locations">1 [# E4 D1 w g" R* m1 g9 ?- }
<list>
- L8 ~1 { A$ r0 v0 \7 B- T <value>classpath:config/props/db.properties</value># g; j2 t# b) ^ H
</list>' E+ U h' j9 v! A
</property>
' f) ~1 l, S6 ~" }$ q6 I' C' M </bean>% }" l/ ^+ r9 Z
c:引用: ${username}' H a4 o% z- f. c, t& m
8 v$ @+ Q7 j# z8 z (8)spring分文件管理
& t* y- p; u2 Y1 s0 Y <!-- 引入其他spring 配置文件 -->
8 z% F! Y1 h4 ^/ l: E y6 t applicationContext.xml引入下列文件
) l6 @8 j; V9 n$ C3 V. y* |! I <import resource="applicationContext-web.xml"/>/ [& a/ E/ E; J. w2 H7 j0 ?) X, f1 [1 [
<import resource="applicationContext-biz.xml"/>" v& \3 l( ~% {" s2 ~9 H
<import resource="applicationContext-dao.xml"/>
0 M, r' o: t, x) n7、开发数据访问层
# h$ B. j+ E$ x2 i/ n! \ 使用spring提供hibernate 模板类 HibernateDaoSupport" M8 q) [8 ]6 T* E. J9 l
UserDaoImpl extends HibernateDaoSupport
% f+ u+ l' H- F! |8 K5 s 在UserDaoImpl注入到spring 配置文件 applicationContext-dao.xml
1 [9 J' d* ^+ _6 q/ a: X2 |/ | <bean id="userDaoImpl" class="com.tarena.dao.impl.UserDaoImpl">
- |# G3 K: s. P5 \' U <!--HibernateDaoSupport中的sessionFactory-->8 _: c/ b( }9 c1 m) s7 r9 ?
<property name="sessionFactory" ref="sessionFactory" />! f) E. Q& ~& K. N; G) |
</bean>
' M5 s) H6 V" V8、添加spring声明事务管理(AOP): T# n$ P0 |# D- f3 s
声明式事务管理:& }' f3 w9 u: ~; f L8 N$ `6 B
添加spring 类库+ _; C5 [( N% l+ M4 h1 d' `2 m
aspectjrt.jar( _3 x# }9 W% w8 E7 H5 o
aspectjweaver.jar% X' b7 f l2 H" `/ y T# O; n5 D4 N
了解事务的几种传播特性4 I: N( W/ C& u+ ~ S
4 m {6 |0 ^8 Z) t (1)PROPAGATION_REQUIRED: $ v4 A+ f3 J& B5 ?: [& V2 n, Y& R8 A
如果存在一个事务,则支持当前事务,如果没有事务则开启。2 q0 m* `) m1 B1 B1 S7 y$ [
(2)PROPAGATION_SUPPORTS: $ \2 Y& o8 w6 N& L0 p: o! G% T% y' m
如果存在一个事务,支持当前事务。
/ U+ d" n" Y9 u# M& b3 y4 l5 A 如果没有事务,则非事务的执行。
1 \4 r/ W7 n! E. K' \ (3)PROPAGATION_MANDATORY: ! D, ]( ^/ v* E& `- }' E) t- k; W% N4 m
如果已经存在一个事务,支持当前事务。
( B, e( [0 i1 A6 _6 z 如果没有一个活动的事务,则抛出异常。
, A: A1 J; Q( u# w5 I5 `% _ (4)PROPAGATION_REQUIRES_NEW:
F8 C; ~8 @* C4 G$ a 总是开启一个新的事务。如果一个事务已经存在,5 p" w) l. [2 J- o
则将这个存在的事务挂起。
* f8 g6 I1 E# ^4 F! N (7)PROPAGATION_NESTED:(spring特有)& W' ]3 r/ u& p' }0 E" [6 A F" T1 Z
如果一个活动的事务存在,则运行在一个嵌套的事务中.
% ~9 p; H% R# g" q) P0 d* ] 如果没有活动事务, 则按TransactionDefinition.
6 ]( v! H4 x2 N& V7 I0 P' } l0 | PROPAGATION_REQUIRED 属性执行
3 C: _) J; X. s2 k8 J; _! ^2 S4 u) z
(5)PROPAGATION_NOT_SUPPORTED: 4 d$ F1 H3 ~* A
总是非事务地执行,并挂起任何存在的事务。% Q) N' a g0 V
(6)PROPAGATION_NEVER:
) I0 T9 F0 b0 @) C4 @" h 总是非事务地执行,如果存在一个活动事务,则抛出异常。 A: b! K2 B# \* l ] `# I
w% E( t5 z; b) U( B! S1 f
6 Y$ _5 o1 D+ I- R M3 d# V <!-- 配置声明事务管理 spring2.x-->2 v& @" c" M3 \6 v0 z
<!-- 定义事务管理 -->* w) t0 \/ r- l y" e
<bean id="transactionManager"# _+ G6 \# Y k4 v% ^1 J& S
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
/ _% T" w* e& e% ]9 w- { <property name="sessionFactory" ref="sessionFactory" />
/ L0 Q; S) C" ]- O, U# \* _$ U' ^ </bean>
$ J; U& F9 i- n; K8 D$ B- n+ S <!-- 事务规则 -->
+ _. j/ j3 B5 [9 [" F4 r <tx:advice id="tmAdvice" transaction-manager="transactionManager">, f/ W+ O( D9 Y" k
<tx:attributes>
: f2 l' t8 t8 P) V% [6 T- k# D <!--*通配符 save* 方法名必须是以save开始-->
6 I; \7 u1 I n0 h( x# X <tx:method name="save*" propagation="REQUIRED" />
9 \, o+ g' c/ ^% B <tx:method name="update*" propagation="REQUIRED" />
% v3 F& }8 \- t% E) y6 z: L <tx:method name="delete*" propagation="REQUIRED" />$ b+ s* X$ C5 J& O
<tx:method name="find*" read-only="true" />
% |3 n' S# b4 O! s! c* F3 y <!-- read-only 只读:-->" T) k6 h1 G0 {" a& L# _
</tx:attributes>
- p1 j8 B: i/ |% w9 ?8 w) g* k </tx:advice>2 ^0 [; ?- k; h6 }7 E+ C1 s$ R
<aop:config>. u; i% R/ n% T4 p
<!-- point cut -->3 a0 B; r% M# O0 Q. |
<aop:pointcut id="pointCut"
4 e* n5 g0 |* d( | expression="execution(* com.tarena.biz.*.*(..))" />$ E( ~# ?, t' U/ j# }7 f( y. K& u# Q- T) |
<aop:advisor advice-ref="tmAdvice" pointcut-ref="pointCut"/> ( E# r1 G, ]% D2 j0 ]) Z: P
</aop:config>
$ H0 j' N& h8 z5 A
$ a5 ?# c+ g' n9、测试6 E; @& T5 m9 d& e, a+ L S; _6 Z
添加测试类库 spring2.5.6 S% S4 V: w: j7 u7 w z3 z3 q+ r
junit-4.4.jar4 I- `& l6 E$ @- D
spring-test.jar M$ w( z2 E1 `* C, z% p
//使用spring测试
, r: G' l! o/ |4 v4 V( A7 m @RunWith(SpringJUnit4ClassRunner.class)
5 s5 `# t7 B, t0 |! F" S& V% ]9 f //加载spring配置文件
6 h6 ~3 o6 \. r5 y! L @ContextConfiguration(locations = {* ~0 N8 Q2 k5 C- }# P* K4 V2 t
"classpath:config/spring/applicationContext.xml", i. p3 }6 X* w
"classpath:config/spring/applicationContext-dao.xml",
- z- ^/ ^4 |8 H) E4 J8 @- } "classpath:config/spring/applicationContext-biz.xml",1 ?: B0 } F8 {& d j
"classpath:config/spring/applicationContext-web.xml" })& n! D( Y5 [( s1 t6 V
//自动注入8 ?* e& N. b, ~, V. @- e6 _ |
@Autowired
, D9 {" M- L1 E: [7 v- W* o! c) \; J private IUserDao iuserDao;
+ b- M7 l! {$ \9 {$ n e. d 4 D2 r* }( w6 x$ c8 {
@Test8 f: z# `* m- @0 P7 O
public void saveUserTest(){+ k) ^; m/ m! b6 o* Z N5 I
//测试方法" }8 D0 G$ L+ \3 h7 j
}
% B6 ?8 {& `* }) r10、完成业务层代码编写
- V% n- H# f+ a& E11、完成表示层代码编写! a" Z8 m( S) w5 ^
12、测试工程 N# {! E" _- q- \( A! j
8 m* i1 M- P( y13、spring处理hibernate延时加载
' h! k: C2 I/ M0 I! K1 p 1、配置延时过滤器2 U* b% f& g, ~6 I9 ]* f
OpenSessionInViewFilter.class
0 c& Z& | \/ I f; J5 r( n 2、在web.xml配置OpenSessionInViewFilter' \2 I! r, Z8 W4 I
! L& h. ^/ d0 r; b <filter> J8 D1 w8 [5 K+ x# {, A
<filter-name>openSessionInViewFilter</filter-name>
7 D# l' o1 Y$ r f. X <filter-class>7 `* x5 H2 S% w" q; ^- u
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
. ~7 g& A- y# f6 r6 g </filter-class>) {5 M. p( R# E; k; K \
<init-param> ]; x5 e- Z/ q+ D
<param-name>sessionFactoryBeanName</param-name>
" l" S; j* K/ B0 _ <param-value>sessionFactory</param-value>* w F, B* K2 B5 h% B* ^
</init-param>
/ B' C# T [. x2 `7 L </filter>* b! x7 p o3 u6 b! B
<filter-mapping>
5 ^2 ^; g% J$ X% f& R5 p <filter-name>openSessionInViewFilter</filter-name>
7 e' m7 _ Z* |, k <url-pattern>/*</url-pattern>
2 D& n' e9 V+ R. ^2 v2 T </filter-mapping>/ s, X& }4 |! \+ x5 p5 E4 i1 q
0 v$ a1 v6 U1 U! P$ Q( K
|
|