该用户从未签到
|
1、创建Web Project% q( j. s% K3 m% |
2、web工程与struts2整合% ^$ G p! `8 Q, _! H
(1)添加struts2类库
, a3 m m1 S. J. j struts2-core-2.1.8.1.jar. C t, S! I' h# R& i
xwork-core-2.1.6.jar
* Q. I; V8 n! j6 _ commons-fileupload-1.2.1.jar
) G4 K0 \ r$ V commons-io-1.3.2.jar2 p& y1 A, _" m" n- ^
ognl-2.7.3.jar
* K6 b5 \8 s- ^2 A6 B" v& S freemarker-2.3.15.jar
8 Y2 N2 p) K- o% o (2) 在web.xml文件中添加struts2集成3 G) @ P0 X/ {3 ]
<filter>
- ^- j6 a/ [0 m" I8 z; |) }2 y, n9 Q <filter-name>struts</filter-name>8 l! E5 d& Y0 j" y% _& }
<filter-class>
! j' r5 U3 B7 o( ]+ q! } org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter- T4 x; t8 \) @; G" Z7 @1 z
</filter-class>
5 H. m K( T2 Q- F5 G <init-param> S5 l* }$ r& |2 w! X- J( s
<param-name>config</param-name># L! s: T' w- ? b/ r. N
<!--
( O! N) Z" R) ^" K+ z U# Y7 F 修改struts2默认配置文件,- Y$ R7 w3 }! D/ W# x
必须把struts-default.xml,) u' k) c+ C5 k9 H3 m/ k" F
struts-plugin.xml一起添加5 @9 j6 L6 l8 q( w! K
必须:按顺序添加
; s Y2 v$ z& s1 |1 X -->
; r3 @+ {+ I, k; x3 X4 V <param-value>) c+ U: a$ |: O( T! O) o
struts-default.xml,struts-plugin.xml,config/struts/struts.xml
7 P6 x5 _( b/ J. Z </param-value>: a1 @) k& e+ B) i7 c. O( w
</init-param>
7 p) \1 p) _, C6 N </filter>
" n0 [3 Z1 V% Y( u4 D- c) h <filter-mapping>
0 l2 z' y' ?3 @5 ]; q- ^3 m3 ?6 ` <filter-name>struts</filter-name>
5 W) E: H6 a' {5 o <url-pattern>/*</url-pattern>2 U: f5 }- ~8 J& R# ^
</filter-mapping> 8 Q3 i, |, d6 o1 R7 g4 M. U
<!--struts2 *.action struts2 *.do-->& Q' K* k4 w! ?, W6 E( @ W
(3)创建struts2配置文件struts.xml配置 ) z7 z9 x) V w
(4)完成页面跳转
$ R4 i+ A* M5 _3、测试struts2工程
, @0 O1 W, o7 n4、struts2与spring集成
# B( | z# K, _# d5 d* f/ g (1)添加spring类库与struts支持spring插件$ M1 S9 P* v! @
struts2-spring-plugin-2.1.8.1.jar
. e; i. M0 k' |, o* Z# N# \: o cglib-nodep-2.1_3.jar
5 p+ Z$ e8 _: a$ S; g* r commons-logging.jar
! I7 G4 w6 E9 @ log4j-1.2.15.jar
1 m" E$ I% m! X1 K- t spring.jar
% H( m* M( V0 K# Q: A dom4j-1.6.1.jar# V4 c5 J# z! m9 D2 B
(2)在web.xml中完成spring集成. b, N* p& T1 \+ }$ r" @# g
<listener>% H0 u/ N1 t0 {" u
<listener-class>
4 a1 W$ }; U7 C9 }$ Z org.springframework.web.context.ContextLoaderListener
* e& ]- ?7 d! ~+ J8 J </listener-class>7 u! k: t% M/ j- h2 [# M
</listener>2 w, a3 Z4 j4 X' c
<context-param>& L' y7 E* V) H& P2 n
<param-name>contextConfigLocation</param-name>
& Y) \' R% \$ }! @0 h: L7 g <param-value> ^; f5 R4 r5 x2 m6 X l7 v
classpath:config/spring/applicationContext.xml8 l9 z5 f- p% u0 @! O
<!--classpath:config/spring/applicationContext*.xml-->
6 j/ C% _# }3 e! j+ U6 n) p </param-value>3 ~+ V0 m }* {3 t% x$ T
</context-param>
2 K2 ?5 o# Q+ j$ D$ f' [; O1 e (3)创建spring配置文件applicationContext.xml
/ I# N+ F# H4 J (4)在struts2配置文件中添加spring 集成常量! n: j% X; [0 ]# z4 b
<!-- 设置集成spring框架 -->4 T" C) Q/ L; t
<constant name="struts.objectFactory" value="spring"/>- p3 l+ l8 s! K- g
(5)spring管理struts2中Action
) p) U, r8 ~: X) {+ a8 } (1)在spring 配置文件中加入bean管理 h' z+ ^0 F4 f1 X1 |( H! a. g4 H
<bean id="userAction" class="com.tarena.web.action.UserAction" > A+ X; L# T9 A! z
</bean>* W& P$ j, e% j( s. r1 o4 o
(2)修改struts-user.xml配置" w, R) r5 b+ m9 l; D4 t* l
<action class="userAction" >! _: h+ `+ ?0 ^5 x0 e
</action>: \; u/ Z7 L) m0 j) w
5 测试struts+spring集成( \3 [ {, Z7 H8 K
6 spring+hibernate集成' p. |" f5 w9 v2 x! v' l) S
(1)添加hibernate类库
& y U) M/ w q' A slf4j-nop-1.5.8.jar! N ^8 B: T, I
slf4j-api-1.5.8.jar
& A! ^" P' r# g jta-1.1.jar
( v) n5 T1 d U. \2 {5 F javassist-3.9.0.GA.jar: I$ a; b$ z ^7 f
hibernate3.jar# a) f+ Q( B. P0 H* q
commons-collections-3.1.jar0 w8 u5 n5 n" s" J" R/ p$ |, L" x
antlr-2.7.6.jar; A* G1 C/ C. F- ~7 J3 U
(2)添加MySQL驱动类库
8 Q& k7 X. ^( n3 }* R mysql-connector-java-5.1.16-bin.jar
7 Q3 G& f$ V5 ?0 `4 H. t3 I (3)创建实体类
, h( y+ I7 D+ I" R/ y; t+ V. a( ? (4)编写User.hbm.xml映射文件
/ D& ]' V, d- t4 V( v. a7 x (5)反向生成表结构, S) n( F i" d7 {. F/ @
(6)spring管理hibernate ; L2 F4 K# t6 R- v1 ]
在spring applicationContext.xml配置文件中添加spring对hibernate管理
6 n( `# t+ J3 u" N# L (A) 添加DBCP连接池
: V% k F) w- w( [ a、添加类库0 |% @7 l/ e3 y( W$ F
commons-dbcp.jar
- U8 A8 ~) A& \7 z( ~ commons-pool.jar" r" v6 J) r7 M/ D- v" K) b8 ?. J
b、applicationContext.xml在配置连接池
- E$ k! ]) m+ t8 V5 {: O <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
2 C, k$ g! G# F2 A <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
* ]6 B. c `- T <property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/>
" d# G& q" ~( \4 b, S <property name="username" value="root"/>
+ o8 M8 o, @* C1 x, T <property name="password" value="1234"/>
7 E0 ~, s. e& }5 [6 \ <property name="initialSize" value="2"/>
; Q! d' o& u( U6 ]# d" H6 j <property name="maxActive" value="8"/>
' Q! p. w% A8 w+ x/ \ <property name="maxIdle" value="5"/># j2 @' I- W$ L, _) i# ]3 T* c
<property name="minIdle" value="3"/>% T! ?' F: x% w* R J
<property name="maxWait" value="3000"/>* s+ I# H& p4 B+ v
<property name="removeAbandonedTimeout" value="60000"/>9 Q4 S# X {% g+ R$ c: I6 P) y
<property name="removeAbandoned" value="true"/>
! O3 i, C" r- A" s# t0 T: G </bean>
- Z$ p1 \7 N# a& g# v. M 连接池参数如下:; {) w6 b" Y1 S/ y0 @7 w- z
initialSize
- N4 f I7 m/ i% G: t 连接池启动时创建的初始化连接数量
9 u, Y8 M) F' j5 h# m; ^ (默认值initialSize :连接池启动时
: x! G! ]8 w6 N# k. r 创建的初始化连接数量(默认值为0)
) g' O* n, r0 v6 L: W8 d" L maxActive - t+ z! g0 O8 a9 N6 D6 G4 B
连接池中可同时连接的最大的连接数 t& I. Y, y$ c3 b. h$ l, D: s
(默认值为8 ,调整为20,高峰单机器在20并发左右,
: C# z a- ?% q& B: M3 f 自己根据应用场景定)
$ \ d; ?+ T8 ^5 ?- d+ @. s maxIdle( T0 s9 Z% @- v" j9 [
连接池中最大的空闲的连接数,, d9 | `& ]. U- F
超过的空闲连接将被释放,
% V- H5 s2 h7 Q2 b; d 如果设置为负数表示 不限制(默认为8个)
& H9 ?2 w$ k) b5 J minIdle l! H0 F7 ~6 _# u9 r. c7 w2 V
连接池 中最小的空闲的连接数,低于这个数量会被6 a% a+ c( n: I0 _+ A: T
创建新的连接(默认为0,调整为5, 该参数越接近
5 X8 A0 Y! {0 A( X+ P maxIdle,性能越好,因为连接的创建和销毁,
& ~% H& A5 n/ I0 Y: b 都是需要消耗资源的,但是不能太大,$ D& Q0 x/ q5 f& a
因为在机器很空闲的时候,也会创建低于
1 l; d6 u- R, x3 v2 a+ _ minidle个数的连接) " s$ r0 L: i; {' B3 H
maxWait
7 Z, Z9 |) c- V4 M 最大等待时间,当没有可用 连接时,
& n' W6 S3 Y1 L 连接池等待连接释放的最大时间,
) S f- _8 V6 }% b 超过该时间限制会抛出异常,
' N% @/ u P% c, f$ G6 ]! w 如果设 置-1表示无限等待(
, @6 p* \' `8 ?* P& h4 D9 j! A 默认为无限,调整为60000ms,
( u' p* H! \- |7 V$ I5 J 避免因线程池不够用,而导致 请求被无限制挂起) & } Y& ]1 U. w- v8 _4 v& ?. O
removeAbandonedTimeout :
7 l* H1 I, K" j d 超过时间限制,回收没有用(废弃)的连接
: G* V& ?, [. M4 x9 B3 U- n7 C0 t (默认为 300秒,调整为180)
/ {; ^- [6 f! q+ t1 Y3 U removeAbandoned :, }6 n$ R8 H; H' Y3 p0 f
超过 removeAbandonedTimeout时间后,: `4 T9 F" P0 ^# d, c8 i1 [1 H. j
是否进行没用连接(废弃)的回收0 g$ H' r3 G! e! _
(默认为 false,调整为true)9 d- c4 ]" i. z+ o9 R
(B)spring管理hibernate实体映射文件:3 k$ Q, e/ u9 R2 V9 D+ r& ^7 J: I
<bean id="sessionFactory"
/ V$ J0 \( R4 A( I+ W5 y class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
! e. I# E8 @. W* f/ ]) p <property name="dataSource" ref="dataSource" />
+ A9 c3 j5 {9 U+ U" r1 s' @! G) { <property name="hibernateProperties">
5 `( g+ F' H) E5 E- @8 K" A { <props>
2 B' _. h' n1 @& n, k <prop key="hibernate.dialect">
6 u, J2 u0 g) G9 K! q+ W% | org.hibernate.dialect.MySQLDialect5 a) v" v K# j# Z3 o
</prop>
P z* Y9 q( x1 M, V <prop key="hibernate.show_sql">true</prop>) n' x: z4 w( l: E9 _
<prop key="hibernate.format_sql">true</prop>$ i! ^/ K8 n$ b; j
</props>
0 j" F# G. L& ^- c0 L% q </property>, n2 K% h j6 I9 W4 K% U/ x
<property name="mappingLocations">
2 ]: T# j( j) b& ]/ p! M <list>
6 `) B/ s" @& ?: ?0 P: g3 u <value>
0 i4 O6 q& ^- M- K, f classpath:config/hibernate/hbm/User.hbm.xml# N: M" }1 T& b) b; b
</value>' g! y1 m! J9 } w* J6 x
</list>! H2 N- D6 N6 c3 _
</property>. T& I) Q" y3 n& V& d3 s+ ~/ W
</bean>
- _ V q p, f& i( _ ?' I g (C)spring读写属性(properties)文件
1 X O- W A, |, q8 v5 ?5 f a、创建属性文件 db.properties
8 l+ M* a& m6 U4 q b、在applicationContext.xml配置
4 N9 a! ~' W9 G! s* k3 i1 G <bean id="propertyPlaceholderConfigurer"" F; `7 v6 K+ C, z4 L
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
' C7 d3 ~' c$ c0 o( j <property name="locations">
; b, Y0 Q; d8 L3 u k" o; L9 c <list>( B$ ^7 j9 Y+ W/ R
<value>classpath:config/props/db.properties</value>
. |( z. S" o+ l </list>2 j5 H8 c4 x6 \; d3 Z/ \
</property>
) F8 \# a1 P; {/ K3 Z </bean>
, j9 B: P% j5 w0 W, N c:引用: ${username}- x ]! x. \5 S N/ o+ o4 c
" J7 Z! f2 L/ w" L4 v (8)spring分文件管理
: K5 g9 K1 V' W) _ <!-- 引入其他spring 配置文件 -->
( X" j m, N9 x) ]% k; i applicationContext.xml引入下列文件
{: S3 Y# ^( n7 y <import resource="applicationContext-web.xml"/>, _$ q! b* T ?9 ^2 f6 s2 X/ H' m+ b
<import resource="applicationContext-biz.xml"/>
: B, r' U* R. R" q! t <import resource="applicationContext-dao.xml"/>
^- A3 o( Q: e5 k5 F b7、开发数据访问层+ g! [& E& B' ]0 p" \( p
使用spring提供hibernate 模板类 HibernateDaoSupport
7 J! k4 _* k4 z. e6 V) c UserDaoImpl extends HibernateDaoSupport
1 W0 H; t) ?5 ~6 o7 t! k 在UserDaoImpl注入到spring 配置文件 applicationContext-dao.xml
4 ]9 g) y& |# j+ g" n <bean id="userDaoImpl" class="com.tarena.dao.impl.UserDaoImpl">
+ [/ ?4 h- T Z) K <!--HibernateDaoSupport中的sessionFactory-->0 R* g, v! h3 f' |
<property name="sessionFactory" ref="sessionFactory" />
+ Z. t. z6 y5 w- k% c </bean>
. A$ F2 X, o4 [+ z; ]* }0 c! |$ I8、添加spring声明事务管理(AOP)
% o" h+ g. Z3 g& J 声明式事务管理:1 k" ~' c4 p f7 G: f
添加spring 类库9 P# Y) O* Q0 y/ r+ Y
aspectjrt.jar
" I. H, @+ c; Y$ _ aspectjweaver.jar
|4 `9 R$ | R5 R% r. l+ P& R 了解事务的几种传播特性
8 m$ [7 N) r- I
! V( l" e6 J7 H; C (1)PROPAGATION_REQUIRED: : `4 Z& ]& w' A, q# K( F
如果存在一个事务,则支持当前事务,如果没有事务则开启。
% I6 ~5 J/ k4 m2 m3 j (2)PROPAGATION_SUPPORTS:
* _9 P1 c6 m. k0 b; X 如果存在一个事务,支持当前事务。
9 o% v |# F6 C. d$ Q; o- O 如果没有事务,则非事务的执行。$ H! C" j! J' L2 t4 @ U. A
(3)PROPAGATION_MANDATORY:
) v9 g0 q; B8 [8 D9 C! }9 ^ b 如果已经存在一个事务,支持当前事务。
& }: d2 {: [0 x: T- C 如果没有一个活动的事务,则抛出异常。' Q5 r5 Y8 Y7 l4 a! G
(4)PROPAGATION_REQUIRES_NEW:
7 c" }* ~& m, W3 o2 S6 z 总是开启一个新的事务。如果一个事务已经存在,* I8 V3 s" s9 k/ s
则将这个存在的事务挂起。$ ?! {2 T0 l1 J& k4 p4 ~" v% M
(7)PROPAGATION_NESTED:(spring特有)6 c- c3 N" N- P5 \! B& D% X" {
如果一个活动的事务存在,则运行在一个嵌套的事务中.
; [5 F- z7 g, ] 如果没有活动事务, 则按TransactionDefinition.; h, @! B& H* V5 _9 p
PROPAGATION_REQUIRED 属性执行
6 Z. ?* @$ g' t7 a5 @9 B( w L# }3 i9 O
(5)PROPAGATION_NOT_SUPPORTED: 9 N( H: i+ m8 `
总是非事务地执行,并挂起任何存在的事务。
' ^/ m' W- P k/ X (6)PROPAGATION_NEVER:
$ i2 P7 W1 o4 R; p 总是非事务地执行,如果存在一个活动事务,则抛出异常。
5 q7 r% } }, g- h0 Q5 G% B2 f! b
0 O! P8 P" @* N/ _ <!-- 配置声明事务管理 spring2.x-->
: P. j" I( N9 r0 c6 h# N3 l <!-- 定义事务管理 -->' Y+ R0 s6 d2 y0 b& _7 W- N! f
<bean id="transactionManager"2 _4 K/ A6 ~+ ]% h
class="org.springframework.orm.hibernate3.HibernateTransactionManager">0 w5 j2 V# S/ z: @% x: L" s8 ~
<property name="sessionFactory" ref="sessionFactory" />
1 l3 V2 {. `0 b: M </bean>! i# M# _2 S. H+ {9 g% F/ B
<!-- 事务规则 -->: v$ P+ M9 X# S8 Y- x
<tx:advice id="tmAdvice" transaction-manager="transactionManager">
h* x' h6 O) a% X3 i <tx:attributes>, O) y- I1 B$ F5 h
<!--*通配符 save* 方法名必须是以save开始-->; m9 W, g) x, t3 Z# n1 ]
<tx:method name="save*" propagation="REQUIRED" />7 [7 m$ Z/ E* L2 n* I: v9 I& i
<tx:method name="update*" propagation="REQUIRED" />
0 D% L8 _% n& c; L <tx:method name="delete*" propagation="REQUIRED" />
% B$ z; |* t8 X# x+ V# i+ @ <tx:method name="find*" read-only="true" />) b2 }) B9 |4 q0 `9 ^
<!-- read-only 只读:-->! w3 B& J* h/ E6 W5 y& `7 W! u% w
</tx:attributes>
( W. w3 V) F6 ^, Q } c2 s2 B </tx:advice>
# ~) e" w* q e" W <aop:config>
/ o7 V: ~9 R4 A r! z- I& I <!-- point cut -->5 J! N6 ~4 w/ S3 u( z
<aop:pointcut id="pointCut"
/ |. M! ?" B; _" Y( N4 c expression="execution(* com.tarena.biz.*.*(..))" />
; a" q0 m5 {$ `8 D; K* W <aop:advisor advice-ref="tmAdvice" pointcut-ref="pointCut"/>
/ z" J Q* @1 u0 _' A( \5 k- a </aop:config>6 W' g* I0 i3 A6 a* u
/ w0 }! u6 w, j
9、测试! x9 _& d) _/ T
添加测试类库 spring2.5.6" ?4 E' D. k' V/ \% d! \' i. }
junit-4.4.jar: \6 [2 X6 f! {( {) H
spring-test.jar
) N3 V" T# l, f //使用spring测试
9 D- _! s ~( X) B; R: ^ @RunWith(SpringJUnit4ClassRunner.class)! z/ Q" A' V9 [, z' Y
//加载spring配置文件1 I0 j6 z# z3 K( U1 _ |
@ContextConfiguration(locations = {4 j6 i, @/ M, U3 ~: j+ F
"classpath:config/spring/applicationContext.xml",
* e4 ~' P& W/ Y* R "classpath:config/spring/applicationContext-dao.xml",
" F: s$ j6 f" X; L6 `" W: s; h% O "classpath:config/spring/applicationContext-biz.xml",
0 p: ~; l2 j* g9 J! ]. p+ V* C "classpath:config/spring/applicationContext-web.xml" })/ ?$ j! G% N y& c
//自动注入% H$ }9 Z9 T9 w
@Autowired) v; Q2 V9 f5 T- w% u, V
private IUserDao iuserDao;4 I9 M1 F" D W, ]
; [6 \9 {7 O% ]& p- Y- F @Test
3 L* t ]0 o* o# l' x' T1 { public void saveUserTest(){/ X# z, s7 N( w6 b6 u% B
//测试方法( \3 x* u; G8 \' m) ]& u
}
& r0 z9 a0 c9 ?3 r, v% C |4 K10、完成业务层代码编写- Z: Z$ N* H4 ^+ J& a: }
11、完成表示层代码编写
+ v T3 p5 S: @' A12、测试工程+ k: N+ G5 U' Q& W; j* O( l8 u
. w6 ~+ ~1 g1 h6 O5 k* D& Q
13、spring处理hibernate延时加载; E V" S# J% m4 d
1、配置延时过滤器- h; b8 K. }% b+ g" M% ]- N
OpenSessionInViewFilter.class$ S8 E8 P; s2 Q3 k& J m
2、在web.xml配置OpenSessionInViewFilter
/ P$ g2 |) @& O# B - [+ D- @. z- s5 m
<filter>
/ G# K, q: @8 p; P- O <filter-name>openSessionInViewFilter</filter-name>/ i I1 p- B+ P2 v) J- g
<filter-class>
3 X. \( _% ]$ }- z! ~6 m% H- t org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
2 o/ c6 [# {) Q! A! `9 d </filter-class>! G4 l* A/ o; Y( N
<init-param>
8 e. ]; @# `& z7 d8 C <param-name>sessionFactoryBeanName</param-name>
- }! w5 K- n5 C/ k, `4 ` <param-value>sessionFactory</param-value>
1 g6 M, b0 k8 Y1 C/ D& r </init-param>
2 o$ G" m5 {( f8 ?9 R7 _7 x. ?. ~ </filter>3 W6 ~$ @& z, W M1 W* n
<filter-mapping>" i+ i6 L& T% ]* d
<filter-name>openSessionInViewFilter</filter-name>0 `. g* h: {/ h/ q9 B6 R) m* e
<url-pattern>/*</url-pattern>
/ w/ N' o. A. O% {( [7 Q# x& B8 b </filter-mapping>
) n T2 t/ }2 W6 d7 Z+ Y( _$ Z5 E$ I. v) F9 ^
|
|