|
该用户从未签到
|
1、创建Web Project
4 i& o* H" a& ^2 V+ _' g2、web工程与struts2整合4 x0 W% Z' a3 B% z& x6 A& y
(1)添加struts2类库
4 P, M, K, \4 e9 N5 D+ r% ? struts2-core-2.1.8.1.jar6 V3 D" N! k% y, z
xwork-core-2.1.6.jar, h9 e* f5 E4 h' S6 [
commons-fileupload-1.2.1.jar
, I$ L2 \. o4 G9 J commons-io-1.3.2.jar# R: Y$ O5 e4 q2 C; A9 Y3 K }2 b" D
ognl-2.7.3.jar% j2 n. r$ z3 N% A2 E! a
freemarker-2.3.15.jar5 C, D5 L4 f0 {4 K: a
(2) 在web.xml文件中添加struts2集成
+ H8 W% b; _- X, m. S8 s <filter>
# y1 F' ]9 f- g3 z' j( |/ O% u" B <filter-name>struts</filter-name>
5 r. O: g& y, |0 v' ? <filter-class>; ?' h5 `, s4 `2 h% g, z7 a
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter6 J& F% T9 e) ]0 T) A+ L
</filter-class>& Y6 g& p& B& }
<init-param>+ c9 @: ]5 l$ |4 t
<param-name>config</param-name>+ K2 \ c' Y8 Q( }8 e* ?# ^0 f
<!-- c4 `. U, q: q5 X2 W
修改struts2默认配置文件,2 w$ p3 l7 G3 o+ a- E
必须把struts-default.xml,6 |. t( X+ Y) n2 ~7 V! r
struts-plugin.xml一起添加
) J9 S4 B# Z$ i7 H5 u 必须:按顺序添加$ _7 s/ d7 N; p
-->2 F; L6 F( l- [* a
<param-value>
' F3 d7 n& i1 L- x A5 r struts-default.xml,struts-plugin.xml,config/struts/struts.xml8 C! N+ Z8 f. q/ S' a
</param-value>
3 @9 I8 D. r' B+ h" Q </init-param>
9 `/ s0 f+ h) N7 n; R </filter>
) a2 A# D/ q& M <filter-mapping>
N/ S3 Z( ]1 Y( r8 A) p <filter-name>struts</filter-name>
) w8 u3 Q4 o3 w2 g# ~5 w, n1 y <url-pattern>/*</url-pattern>
, m$ n4 [7 t/ }. i. B, r& B </filter-mapping>
0 \- D$ P6 S1 Y% h& O( L <!--struts2 *.action struts2 *.do-->( a' `5 W3 z% w- E
(3)创建struts2配置文件struts.xml配置 / n2 z8 P. A/ w4 x8 U* I
(4)完成页面跳转
6 h$ H0 t6 ^0 ^0 T+ f0 v- ]3、测试struts2工程
6 ?% A) c) I; k2 u4 b* @% `4、struts2与spring集成9 Y8 S) Q: T2 a+ Q0 I# d4 e
(1)添加spring类库与struts支持spring插件
7 L; z4 h- G; |% w7 ]- o0 C struts2-spring-plugin-2.1.8.1.jar
- o0 G& u4 D3 ] cglib-nodep-2.1_3.jar
s" ^$ c: I' j7 U5 O5 G commons-logging.jar
3 J; N9 b3 v( |* C log4j-1.2.15.jar
6 D: R$ V3 U0 P' {; T$ b spring.jar
2 r& D. d3 M, f& L7 V dom4j-1.6.1.jar
% e6 w& N' L" h5 A w$ L! \ (2)在web.xml中完成spring集成
/ [" l: ?! ]# u) i& b0 s( E <listener>6 X; \' S: B" \" Y7 a3 D" u8 O! Y
<listener-class>5 J0 m8 h3 G5 [$ C* a2 z" ?
org.springframework.web.context.ContextLoaderListener/ X) S+ u$ H" Y
</listener-class>
p# y- b: A9 Y( A' l </listener>
8 L6 y% g- v' @+ i' _! N; U+ P6 D, ] <context-param>
6 ^& C. ]5 m, g& w7 @! C <param-name>contextConfigLocation</param-name>
" H! s$ W7 W4 ?+ q( I, x7 A* K <param-value>2 ^) j; Z9 S) j; S; c$ s2 D$ {
classpath:config/spring/applicationContext.xml
; k; \, O6 x8 ^, {/ k! _ <!--classpath:config/spring/applicationContext*.xml-->* \# J7 c- I" g. B
</param-value>
6 u# ]2 t$ C* Q. y5 j </context-param># ?' D Z4 g5 A' ?( L8 C
(3)创建spring配置文件applicationContext.xml
, o. |3 M" [; e- x (4)在struts2配置文件中添加spring 集成常量 f2 C5 I* _% q
<!-- 设置集成spring框架 -->
: e, j7 z. }3 ?/ W6 l* O( V1 W( X <constant name="struts.objectFactory" value="spring"/>* s0 z' K2 k% _* |
(5)spring管理struts2中Action
5 A+ J- n, n( c (1)在spring 配置文件中加入bean管理
6 x/ }: _6 G% Y- f <bean id="userAction" class="com.tarena.web.action.UserAction" >" s5 R2 p1 Z! V) J) \
</bean>
0 E& H9 ^1 |- y/ Q7 L! S% e9 t (2)修改struts-user.xml配置
7 S+ d( ^0 ?3 D9 K; y/ \ <action class="userAction" >* I0 r8 [( N) ~9 H6 X6 E! j
</action>9 m) l f8 P+ v! u, u1 }, P
5 测试struts+spring集成& i' a+ b( @& h
6 spring+hibernate集成+ n" @3 {9 e( T. y
(1)添加hibernate类库% J! Y3 ]% E( G b( j2 d
slf4j-nop-1.5.8.jar
8 E5 ]( c0 {1 `- k slf4j-api-1.5.8.jar
0 ^! t% V% y# _1 g, R7 H0 W jta-1.1.jar
) d9 h7 e+ A2 O% G! f: h javassist-3.9.0.GA.jar
' M. b2 Y! f/ G% P/ H0 w9 {# ~ hibernate3.jar% A4 R( N/ F4 y( B5 G+ q1 `7 ]% e5 i! a
commons-collections-3.1.jar
q9 t6 d4 z! \- ~ antlr-2.7.6.jar
4 D: q) W# A0 P; f( H6 _ (2)添加MySQL驱动类库 : N1 N |. }0 |+ z
mysql-connector-java-5.1.16-bin.jar# z+ V, z+ V! V* y
(3)创建实体类. R+ k2 C$ Z9 E
(4)编写User.hbm.xml映射文件- E' m; h f7 L( w6 L; @6 a
(5)反向生成表结构
& E% @. _: M- _0 D' C0 j (6)spring管理hibernate
) {2 W( {0 A8 q% Y 在spring applicationContext.xml配置文件中添加spring对hibernate管理
( u: a+ r: o* K" c: G (A) 添加DBCP连接池
& V8 H7 \1 J$ w' U a、添加类库' `. E3 X( _ r2 ?5 W' g
commons-dbcp.jar
; k9 Z2 S0 @) N; R& L) B; U commons-pool.jar6 T$ E0 P1 c, W% P( }
b、applicationContext.xml在配置连接池
) Z$ J1 u% W# J7 s/ p% [ <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
- h, r" h& }; {7 S" l <property name="driverClassName" value="com.mysql.jdbc.Driver"/>) P) k! K5 W9 g$ d8 F v7 E* X
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/>5 [% i \( g& l. a* x2 Q( e
<property name="username" value="root"/>
- p$ v4 w4 M, O <property name="password" value="1234"/>
( B( y/ D% M& B7 T3 T( |8 [! r <property name="initialSize" value="2"/>1 U4 n! s1 c- U( P5 T
<property name="maxActive" value="8"/>
4 D Z! L& D3 y& {3 P% O7 p <property name="maxIdle" value="5"/>
, H4 I* }, [8 @' i- ]7 j7 i# ] <property name="minIdle" value="3"/>
Q" K3 l9 w7 O9 x! v( t: w <property name="maxWait" value="3000"/>
; X' K# N9 z# T <property name="removeAbandonedTimeout" value="60000"/>3 F7 J' {" s0 E9 N& T" [
<property name="removeAbandoned" value="true"/>& k: e& s" n+ v- A: Z
</bean>) z; F8 {# h0 a" I: j+ G: l
连接池参数如下:( e" o) V; [* `1 g+ s o$ z: z
initialSize8 N& p$ T3 b& G& W+ O- M. D
连接池启动时创建的初始化连接数量
' J6 u$ U8 s3 J8 ~) o (默认值initialSize :连接池启动时" @" _% J! Q5 O4 F' |
创建的初始化连接数量(默认值为0)
7 h% |$ [& ~' z3 n$ C' t5 q6 q4 _ maxActive ( w- |$ U; G( K4 ~9 ^" D
连接池中可同时连接的最大的连接数) i4 f6 G: D$ l+ _2 M F
(默认值为8 ,调整为20,高峰单机器在20并发左右,% Q" p" ]5 S1 g+ ~) ^+ Q
自己根据应用场景定)
* j6 P5 j) d) I+ |% A+ ^ maxIdle
3 u0 _( l/ a, Y 连接池中最大的空闲的连接数,8 ?+ P* m" g9 h0 ~- o" x1 k/ F+ m) u$ r
超过的空闲连接将被释放,
% ^# w# X) m h- R. F 如果设置为负数表示 不限制(默认为8个), X% L) h/ W0 T6 _/ \2 V
minIdle$ U2 a1 P% ^. d; P: C7 t( w
连接池 中最小的空闲的连接数,低于这个数量会被# u1 x2 _& y" ]5 ]6 p/ I
创建新的连接(默认为0,调整为5, 该参数越接近5 i! E* @8 J3 p
maxIdle,性能越好,因为连接的创建和销毁,
: m- c. f7 T, ]0 q: O' |. L5 f. F 都是需要消耗资源的,但是不能太大,+ n6 g( R/ H" t3 J+ f% B- W7 i
因为在机器很空闲的时候,也会创建低于4 o- h9 c; I' O
minidle个数的连接)
$ Q* d2 L% t" R8 ?) K3 W& z# \3 ` maxWait . I( p1 i, }9 o6 c
最大等待时间,当没有可用 连接时,
7 w0 ~/ V/ e! i, `/ _6 K" \* ^ 连接池等待连接释放的最大时间,/ N( D6 R, _6 ^ {% o
超过该时间限制会抛出异常,
' u/ T. P# {& M 如果设 置-1表示无限等待(
: Y. {& Z* h1 n; l3 s6 e 默认为无限,调整为60000ms,% j% D6 z- P. h9 |/ ^0 ~; d
避免因线程池不够用,而导致 请求被无限制挂起)
4 b- F3 V" [. P& n removeAbandonedTimeout :
0 j. z7 D$ n& H, R2 H 超过时间限制,回收没有用(废弃)的连接
! n0 ]1 q# U7 h6 |$ ]# d (默认为 300秒,调整为180) & p7 d2 a- z# C" P N
removeAbandoned :! d% v) w, s: }& `& k
超过 removeAbandonedTimeout时间后,
9 L6 f) d+ E+ }4 {% g9 k+ A 是否进行没用连接(废弃)的回收( M/ G% O' Z( V A, H3 ^
(默认为 false,调整为true)4 w% e9 x1 I4 _# a0 H% U9 p
(B)spring管理hibernate实体映射文件:$ u# f% K/ F7 n/ c1 a+ ^- a/ U
<bean id="sessionFactory"
& Y$ s4 f7 }' p; v" B3 O class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">/ }) Z7 J( [0 s9 P7 W2 W4 ?
<property name="dataSource" ref="dataSource" />
4 y! S5 p, G. Z+ A% t$ P! r <property name="hibernateProperties">. \8 E8 A" @. ~8 m/ G- O t: o& A
<props>
0 i9 {, G" q l" d <prop key="hibernate.dialect">
# a# l+ o; p, G+ E0 a- n org.hibernate.dialect.MySQLDialect& D8 B; c, ^# g$ u0 X
</prop>
* q9 v2 U9 O0 g, a$ _ <prop key="hibernate.show_sql">true</prop>
% u6 l+ o- P; c9 c6 Q2 _7 O( T <prop key="hibernate.format_sql">true</prop>; r3 F0 T) |5 j
</props>
5 W+ U" n/ E6 D, x' r </property>
- ~5 M" Q! `( c( e* g5 S6 M <property name="mappingLocations">
" w; r! b0 H$ h4 y- B$ t <list>6 U* W1 w. Z4 E3 s6 ~; u
<value>
5 |' i% \$ X% J4 H2 h classpath:config/hibernate/hbm/User.hbm.xml
$ M7 K4 [: {8 {( v- i* W </value>* z- w/ ` Y, N" G
</list>
0 {" V. j+ b* H9 E1 c0 r </property>( Y, g8 l8 x. Q% k/ w% q4 `. ^
</bean>0 S! f" J/ L1 N |6 _
(C)spring读写属性(properties)文件
: _ t! l$ ]5 D8 \2 h, T1 {6 g a、创建属性文件 db.properties- e$ i- F. N |0 N v! ?' q
b、在applicationContext.xml配置& K7 v1 ? R. J3 Z! [
<bean id="propertyPlaceholderConfigurer"
9 F u5 v$ w/ R class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
+ l4 z" ^2 X* A9 Q# W! H <property name="locations">/ w3 }% [9 M. K
<list>
4 _& _$ V5 V( e: J+ h8 t: T9 I: S, n <value>classpath:config/props/db.properties</value>5 l7 D( v1 h7 n* R, E3 a
</list>" R3 K/ _$ O6 h4 q5 m
</property>, F t& n0 C2 ~: z; p
</bean>; d1 y( w [ j' K: o! C9 n" e- I
c:引用: ${username}8 W4 s, j# f# K$ {' M
3 D1 [! z, n: J
(8)spring分文件管理
. n5 o# i. B$ W3 w+ E <!-- 引入其他spring 配置文件 -->
) @. k( `9 ^8 ^ applicationContext.xml引入下列文件
: I6 a% b+ ]1 `. Q. h <import resource="applicationContext-web.xml"/>
* Q( s9 O" D4 f) F# M; Z' j <import resource="applicationContext-biz.xml"/>6 S' g Y. e i
<import resource="applicationContext-dao.xml"/>% ]" Z: a+ z4 }/ o* z* T) Q
7、开发数据访问层0 V* b9 }* D, h" q/ f, V) m8 ~ E
使用spring提供hibernate 模板类 HibernateDaoSupport% w0 U0 G! A. n! Y
UserDaoImpl extends HibernateDaoSupport# _ u6 E* w2 q* G( u4 i5 v6 [
在UserDaoImpl注入到spring 配置文件 applicationContext-dao.xml
4 R& B0 V; c& {% D# v+ s+ O6 l+ G <bean id="userDaoImpl" class="com.tarena.dao.impl.UserDaoImpl">
2 ]4 Z1 a d) o, i) D <!--HibernateDaoSupport中的sessionFactory-->8 Z& S0 c7 j! V% D$ Y. t2 h
<property name="sessionFactory" ref="sessionFactory" />
0 ?1 R& n0 D* k v7 ?5 @/ L </bean>
2 @% w m! o# Y% i1 M8、添加spring声明事务管理(AOP)
# i* `, x6 ~0 i; w) E 声明式事务管理:7 O# I, C' w5 U9 J8 c, y
添加spring 类库( T3 m$ i3 n: B& i, F& ?
aspectjrt.jar* c$ {! U- N" Q/ Z
aspectjweaver.jar0 z. x' {7 x$ V8 ~# b' G: d) Q
了解事务的几种传播特性
$ U5 q* K; }) N% l, h/ C, x( s O6 r- u+ k
(1)PROPAGATION_REQUIRED: 0 ?% ]# K; L: N' |* z
如果存在一个事务,则支持当前事务,如果没有事务则开启。
; a# }% A S R% q# D! s6 q (2)PROPAGATION_SUPPORTS:
: @( q# l* }+ b, W/ k$ f5 g 如果存在一个事务,支持当前事务。/ d, _. C. f, j9 ] [
如果没有事务,则非事务的执行。2 b5 e& [. y+ |! n0 Y
(3)PROPAGATION_MANDATORY:
; c: k4 z9 E# t# p3 {+ v 如果已经存在一个事务,支持当前事务。
1 D! C' p$ s3 b s4 f0 G 如果没有一个活动的事务,则抛出异常。0 x$ e9 J$ n5 f, L) I" C$ z7 q
(4)PROPAGATION_REQUIRES_NEW:
% X5 g! q6 Q/ m 总是开启一个新的事务。如果一个事务已经存在,
% v- X; n! j2 G1 Q. P 则将这个存在的事务挂起。
( s: N+ j) ^* m; n+ [8 h9 Q (7)PROPAGATION_NESTED:(spring特有)
* _2 L: {4 f5 t; t( ] 如果一个活动的事务存在,则运行在一个嵌套的事务中. 5 a$ i( L) ^- K. R
如果没有活动事务, 则按TransactionDefinition.
( B" X& I8 |6 k. @: F PROPAGATION_REQUIRED 属性执行
. O# k4 n a b, r5 c+ j+ O' W
- W% {6 x( @* h7 R. Z( p. s# ` (5)PROPAGATION_NOT_SUPPORTED: 7 U x: r! w: x$ H
总是非事务地执行,并挂起任何存在的事务。, u. `$ b ?8 c% u0 u
(6)PROPAGATION_NEVER: ' B8 Z- {+ s& r6 I+ ]
总是非事务地执行,如果存在一个活动事务,则抛出异常。+ y u9 u! ~9 A
. H" I$ ^# o$ I+ Y+ s
# u3 m7 w1 \4 R9 V1 J- a( u+ R- g, D B
<!-- 配置声明事务管理 spring2.x-->
1 X2 X: W$ Y9 }5 A& {8 O* _5 R <!-- 定义事务管理 -->5 m8 k; i4 n) g, r/ F
<bean id="transactionManager"
- Z! M& W) B, g' V, k8 Z: |- t) i class="org.springframework.orm.hibernate3.HibernateTransactionManager">
. R1 s; ^2 _4 [) R* K% k8 ? <property name="sessionFactory" ref="sessionFactory" />
/ l7 f( r4 I4 R, O1 S </bean>
% c9 E5 T3 s+ u1 n ~ <!-- 事务规则 -->5 n- \, l1 T: X n& e9 L
<tx:advice id="tmAdvice" transaction-manager="transactionManager">
9 U l8 D& J* J- u% \3 w7 s7 ]* `5 v <tx:attributes>0 \8 C; I* X2 ^2 T4 K
<!--*通配符 save* 方法名必须是以save开始-->7 d6 m+ _7 k# R- e% m$ k
<tx:method name="save*" propagation="REQUIRED" />8 L' h( C6 B, H! X' M9 P" Q
<tx:method name="update*" propagation="REQUIRED" />
# ] ?9 _( T/ ^7 ^3 | <tx:method name="delete*" propagation="REQUIRED" />: X1 s# S" O/ ~, b
<tx:method name="find*" read-only="true" />) P* j" l2 ]; T7 d
<!-- read-only 只读:-->8 J% c% `/ z* m' W4 T" e0 _8 D) E
</tx:attributes>
5 [, D2 D5 P! c3 H8 w& M </tx:advice>3 Z0 i; D5 J" a7 ~- j$ `
<aop:config>
( V. R) P2 q4 P" @% M5 G. l# R <!-- point cut -->
- F' q- R6 b: N4 f4 t' b* a <aop:pointcut id="pointCut"
0 y) ]: D4 X, @6 `% d expression="execution(* com.tarena.biz.*.*(..))" />
+ e1 [6 N8 P* a; ?6 I3 w7 T9 ^ <aop:advisor advice-ref="tmAdvice" pointcut-ref="pointCut"/> % j6 W/ F1 E0 z$ t: B5 y
</aop:config>
+ u# q$ s& p) ^& u+ K , H$ l: Z- Z2 o0 G/ V- ^
9、测试( C' [3 y" F# H6 |# a
添加测试类库 spring2.5.6: e/ L! {. M7 a) D2 C, I; }! U5 h
junit-4.4.jar! H B9 k6 s4 |% h$ C
spring-test.jar7 h% L* {$ n$ H O# d
//使用spring测试& H( f6 t0 u! y; p
@RunWith(SpringJUnit4ClassRunner.class)0 k5 @1 Y) t; ]8 W8 s& ^! P! O
//加载spring配置文件
; p& [( D' t* D+ [1 C- T9 _5 [ @ContextConfiguration(locations = {! y" g% O+ c z/ p
"classpath:config/spring/applicationContext.xml",
- E3 }# b1 `( P8 |" b1 x8 s/ } "classpath:config/spring/applicationContext-dao.xml",& v7 n" ]/ b: x
"classpath:config/spring/applicationContext-biz.xml",
# B) n( a) }! [4 L) [# k, ^ "classpath:config/spring/applicationContext-web.xml" })4 S- _; b0 d4 E: U/ E! f
//自动注入
- f, b% p3 l H' ? @Autowired
! H- G) M( s2 {: F private IUserDao iuserDao;% R9 {# ]3 d, Z1 c
' a/ H% t# X6 U# j
@Test" B9 T _ t+ `. S/ u6 X( L( k
public void saveUserTest(){/ ~+ x2 g/ _; a+ ^) \
//测试方法
5 d4 H7 f6 M7 f4 }5 ]' O }7 {5 ]9 K# a' y0 ?6 ?. x9 L
10、完成业务层代码编写
9 }4 t5 d! V3 Q1 R1 u11、完成表示层代码编写' L( W8 w+ b2 t+ o
12、测试工程' ?& X2 S Q1 Z6 P
5 ^$ z' p7 w7 d& K
13、spring处理hibernate延时加载" }' x9 q" s8 X
1、配置延时过滤器
+ h9 {- d* J7 ]( y9 R OpenSessionInViewFilter.class5 T) C( j! {( b8 e4 ^' z
2、在web.xml配置OpenSessionInViewFilter1 m2 S0 Z% ]& c3 b* x( O8 d
% b" `2 ^; ?4 K% l- b w
<filter>
7 z! Y0 Z; @" g7 F+ Q- e <filter-name>openSessionInViewFilter</filter-name>
' L" `, W- \1 r1 R/ m6 z" I% r <filter-class>
; x; o( S( B5 p org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
0 I& n( M" z' ]5 B/ r# b5 L </filter-class>
\$ R, q6 R/ X) J9 o6 ` <init-param>
, Q7 \/ Y; r* j* ?! d) c <param-name>sessionFactoryBeanName</param-name>
, M( S: }4 ~9 ^3 Y# T- Y <param-value>sessionFactory</param-value>
% v" ]9 }" A3 I4 ], f </init-param>6 l0 v) y# i1 S) U, t6 x7 r
</filter>
3 z6 R- Y8 z* ], l4 o- ^ <filter-mapping>
: U7 v3 \: t1 E. u4 D <filter-name>openSessionInViewFilter</filter-name>) ^1 `6 {) J* c# ?* z1 m
<url-pattern>/*</url-pattern>
( [/ y1 I/ x, E& T+ S! O </filter-mapping>
4 @9 s7 C" Q5 A \0 }; `3 l- S6 Q
; L q! E7 Y- a7 ]0 [ |
|