|
该用户从未签到
|
1、创建Web Project
/ R% u0 M. j, Y3 ?5 e! V2、web工程与struts2整合) Y* M1 X1 f4 I7 |
(1)添加struts2类库4 z& g+ A; k# M# s2 p
struts2-core-2.1.8.1.jar
# w7 O }2 Y- Y1 ] xwork-core-2.1.6.jar
( }5 g4 t1 [3 V, N( V0 C commons-fileupload-1.2.1.jar" b! @) i: d8 _6 k I7 I
commons-io-1.3.2.jar
' B8 ]& {, [7 C+ b9 q9 g ognl-2.7.3.jar
+ m& X, B4 B |. S7 g freemarker-2.3.15.jar( A& a' n. h3 B/ _5 o
(2) 在web.xml文件中添加struts2集成) z0 a# `! }; K9 U6 b6 ^
<filter>! i. Y* Y$ X. ^7 F5 u( n
<filter-name>struts</filter-name>
4 c* X$ }. J3 T4 b+ C0 V/ l5 C <filter-class>
8 W% `8 C: j/ }" d org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
# ` S" A3 C3 X. K0 v& R& ~' f2 g* { </filter-class>
% C& ^+ g3 D2 {# G- o/ [- Q* R9 o9 o <init-param>
; d" y6 D: ~$ L% K <param-name>config</param-name>/ M E; y" T" a( w! {
<!--
! Q2 Y; z/ _+ \0 p 修改struts2默认配置文件,
* L# t: m2 I# D [ 必须把struts-default.xml,8 Z5 }3 ` a, z- e
struts-plugin.xml一起添加 B/ p# @# t _( k1 J# g- Y3 u
必须:按顺序添加
$ n/ e8 {) q8 x4 _9 ?) B/ q: G -->
, z/ S/ }1 H$ j <param-value>
& O' q7 f5 x6 F8 o0 N struts-default.xml,struts-plugin.xml,config/struts/struts.xml6 M& i0 l# |: C/ x& e3 k4 @
</param-value>& c6 D& x/ O8 J$ [/ i6 d3 m5 ]9 A
</init-param>3 s: r* g8 e" s, ~! A% p
</filter>
) {; l; _# f( }6 i# a) l2 q <filter-mapping>
( h( {- z! F/ T1 F <filter-name>struts</filter-name>0 Z2 F: N1 v# L) B3 k2 `
<url-pattern>/*</url-pattern>/ x Y, i+ S$ T
</filter-mapping> * j( U; v9 X' E, L4 j
<!--struts2 *.action struts2 *.do-->9 P% d' k* Y6 ^) K/ G# ^
(3)创建struts2配置文件struts.xml配置
/ S4 s& W, B" B+ z j( T (4)完成页面跳转
" v( Z2 D( f5 I6 D& z3、测试struts2工程$ u1 j5 ?) L7 T9 ]& u. G
4、struts2与spring集成( s) {, [' P% R# @0 F8 n
(1)添加spring类库与struts支持spring插件
5 ?' r' r( Y5 N$ y. T! Q z' m9 ` struts2-spring-plugin-2.1.8.1.jar% f {, f. J6 K! W, D
cglib-nodep-2.1_3.jar" S1 M: \; F0 F! I
commons-logging.jar$ w* H/ w" Y7 ?6 d8 H' f
log4j-1.2.15.jar
8 o0 s } ^, o: ]7 I spring.jar
+ ~# G% j3 y. K2 D3 m) ^ dom4j-1.6.1.jar/ z) P3 n. E6 D7 r Z
(2)在web.xml中完成spring集成" F3 W, R& ^- b+ y
<listener>
: W. ^1 z! h+ }/ \) O <listener-class>
. |, Q+ ]2 s4 b, ~6 i3 _- W org.springframework.web.context.ContextLoaderListener6 y" D8 d& n9 g# k8 ~ w. A8 i
</listener-class>7 f) E7 x: c. l; p
</listener>
% l- _$ s8 Q: Z1 a7 F <context-param>/ ^: X: C5 C" t; V6 D
<param-name>contextConfigLocation</param-name>
* U4 f- ?+ a# c' \/ _5 O3 L- w <param-value>' x a' R+ @" u8 P: F) Q
classpath:config/spring/applicationContext.xml
# O a. x1 g: b <!--classpath:config/spring/applicationContext*.xml-->) r* I% M0 x- } @2 E0 k1 _! i
</param-value>
t+ {( Y- a0 v5 `! P7 U </context-param>
8 k% T) \; M9 T j (3)创建spring配置文件applicationContext.xml( K8 r3 C/ v% g9 R8 p* e* l
(4)在struts2配置文件中添加spring 集成常量& `4 Q+ e2 u0 e @4 o
<!-- 设置集成spring框架 --># E- Y% x0 K1 _. c! ^) t
<constant name="struts.objectFactory" value="spring"/>& H/ e, o. u |: l) E5 W- R3 N# i
(5)spring管理struts2中Action b9 O; e$ }* h6 |: z
(1)在spring 配置文件中加入bean管理# {* Q1 M" F, g& B: u. j) ~
<bean id="userAction" class="com.tarena.web.action.UserAction" >& v" i% X0 d0 h$ P0 X q
</bean>4 u$ L2 }* i# C$ ^: g) o
(2)修改struts-user.xml配置5 t& f! e4 N: i3 t9 N
<action class="userAction" >
! k* q- s7 h2 {4 C: X. V9 k1 j </action>$ X$ [) n/ V* Q$ T1 v5 Q
5 测试struts+spring集成4 c C, w! ^8 } D% L6 |( D
6 spring+hibernate集成
2 w6 S: o! Y' P3 m& f9 B (1)添加hibernate类库
0 H9 ?4 Z' o4 I1 e5 H; u! J! J slf4j-nop-1.5.8.jar
( {! i; P ~& o9 Q/ S, R" A slf4j-api-1.5.8.jar/ U, _4 I! b( g8 t0 [9 b0 R
jta-1.1.jar$ p, t" y, Q- I: Q
javassist-3.9.0.GA.jar
9 v% L& S0 m! f9 _0 l G! Z hibernate3.jar
' I4 m- R t# m, C0 S' L5 ]8 q; N+ G commons-collections-3.1.jar9 e6 |+ e4 C% ~5 E \. Y1 l
antlr-2.7.6.jar
$ L7 ]% W1 g7 ], M (2)添加MySQL驱动类库 + |5 M6 V0 _" v9 K8 i, W
mysql-connector-java-5.1.16-bin.jar
8 ~- T0 }4 o" K; \3 }, V; o3 g (3)创建实体类0 u1 \( U7 K1 P) z! z; }, t3 N
(4)编写User.hbm.xml映射文件0 w! V( h; W2 ?8 Y% S4 J
(5)反向生成表结构
& b! J# R& P/ O8 { (6)spring管理hibernate * J) @; b s: i' p7 @4 `
在spring applicationContext.xml配置文件中添加spring对hibernate管理
2 F& i" V5 G! n8 L' F (A) 添加DBCP连接池
' p+ ]0 w6 X. X3 F6 K a、添加类库7 q% U7 H4 Z; Q# d: l
commons-dbcp.jar1 Y% o9 g) t' I5 C: m- M; E# \
commons-pool.jar
- v" ^& }/ Y- |; F b、applicationContext.xml在配置连接池
6 s2 i% P: L/ X7 n( [% l. F <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">3 W% \6 b9 W+ S2 ]& b' u- i
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>7 t9 T. N0 ]8 H u- T
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mydb"/>- C) T; f) _, S$ Z
<property name="username" value="root"/>7 B \9 A1 r( q
<property name="password" value="1234"/>
1 Z( O- A, {9 l, k C7 n+ Q' j <property name="initialSize" value="2"/>
5 t9 u' ]6 o% D2 r, s; v: E% x <property name="maxActive" value="8"/>/ e" ]- w( G7 I& _" w/ f/ Z
<property name="maxIdle" value="5"/>
3 F; W' q& c" A, H% B ] <property name="minIdle" value="3"/>
4 u, H+ s F+ \2 ` <property name="maxWait" value="3000"/>5 N3 p' T3 I+ z8 n2 D9 [
<property name="removeAbandonedTimeout" value="60000"/>7 i: {; c* P! [. Z5 O1 F
<property name="removeAbandoned" value="true"/>) s& Y; @2 t8 P/ w7 H1 {4 u
</bean>& U2 x8 l9 H9 _* l4 A
连接池参数如下:
% X& y) e" f6 r+ m" N7 N8 C initialSize9 F/ k i! C, \' H/ A d, F
连接池启动时创建的初始化连接数量
. i, h' w0 F$ N- u! T (默认值initialSize :连接池启动时
! T5 i4 h4 J. d# r! q0 v 创建的初始化连接数量(默认值为0) + U+ `. Z- w0 C/ ? n
maxActive
* [. n5 A) j3 J0 X5 u5 h' q 连接池中可同时连接的最大的连接数
+ l& G9 A5 l5 g' i; F5 u0 ~1 C (默认值为8 ,调整为20,高峰单机器在20并发左右,
% P8 B0 l- ^! J. p 自己根据应用场景定)
* E6 P9 _* Y9 n0 g1 _7 W: i maxIdle. w$ u6 a8 y4 J+ W- y5 h" Z
连接池中最大的空闲的连接数,% l7 z3 K8 _0 H$ b$ g- K4 R# X7 Y5 g
超过的空闲连接将被释放," [ P9 [& [3 _' P! n$ W
如果设置为负数表示 不限制(默认为8个)! R; @4 [. T/ D+ A( N) B
minIdle
: E8 ?5 {; g! Y* F" y$ }5 ^ 连接池 中最小的空闲的连接数,低于这个数量会被5 R- C* M: |6 N7 v8 @
创建新的连接(默认为0,调整为5, 该参数越接近
- r, Z1 o. L% V1 y3 C0 _ maxIdle,性能越好,因为连接的创建和销毁,
8 [+ H- D2 p- W4 `3 \& M) e. { 都是需要消耗资源的,但是不能太大,
v/ @4 w! T- D6 G- ~# B! a 因为在机器很空闲的时候,也会创建低于
: s: q2 {1 ]1 P# K) s, N1 u" p) D minidle个数的连接)
4 ~3 w2 C i$ j1 c1 I maxWait
3 b: G/ ~' ]" ^3 C, P 最大等待时间,当没有可用 连接时,
3 r0 T, G1 K% ]. J 连接池等待连接释放的最大时间,* ?2 p0 D' h* k
超过该时间限制会抛出异常,
! {2 i) [: g1 @6 o! z% C' C' ? 如果设 置-1表示无限等待(
( A [1 i# W5 ^, P t9 ?) X6 j 默认为无限,调整为60000ms,
\6 z. N" }& { \ 避免因线程池不够用,而导致 请求被无限制挂起)
, l: F- { E( Y5 H4 ` removeAbandonedTimeout :# [2 Q+ {4 K$ M! B
超过时间限制,回收没有用(废弃)的连接
8 [# o0 _7 U; `& i (默认为 300秒,调整为180)
5 P3 H8 Z" M) p2 ?' Z) V removeAbandoned :3 p2 X* r( e" K& v
超过 removeAbandonedTimeout时间后,
9 L3 g, M, E$ F* V+ L! T0 O 是否进行没用连接(废弃)的回收% R" N9 C& e' E- c2 N- |1 Y% X
(默认为 false,调整为true) S9 n& E# e& [+ H
(B)spring管理hibernate实体映射文件:
4 C: L7 u4 u0 {" a; X <bean id="sessionFactory"6 S( m! r5 \+ O1 I, U% W$ L
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
+ E/ q. @- @. E g# H <property name="dataSource" ref="dataSource" />; |- I6 p+ w) W
<property name="hibernateProperties">
- X e% U/ S% p" w# e" i" G4 { <props>
& v, X0 x' Z, D+ h/ }6 y <prop key="hibernate.dialect">9 \, h7 ?4 D% f6 b4 k n5 q0 l
org.hibernate.dialect.MySQLDialect" t" Z7 Q: Z2 }: L6 B# S4 s
</prop>
1 _7 s( j$ L: g6 o0 F <prop key="hibernate.show_sql">true</prop>1 C- A/ L! |* k
<prop key="hibernate.format_sql">true</prop>
3 i* |$ u6 N7 H, \! d* V </props>0 N z8 F) N( T. g6 t' I
</property>
% c' w. a4 h# a, F <property name="mappingLocations">
' m0 a7 n) }, B' I2 X( a <list>
; ^1 n9 D* P8 t1 P* H7 m+ z. m7 A' { <value># v) W# s2 Z2 X* q, I! `
classpath:config/hibernate/hbm/User.hbm.xml* b/ L# H s4 N6 Z. b; v! k
</value>
8 c' Q1 \% h2 C5 {, p </list>
+ w5 W ^* g6 |# G+ Y' h( Y </property>
" I& M2 w( h! n5 ] </bean>
! j: A( j+ D; Q4 u8 m/ V (C)spring读写属性(properties)文件$ l( `: f4 @' x
a、创建属性文件 db.properties! H2 O& W- z6 U- Y, C
b、在applicationContext.xml配置
7 e. N% \# M" x# ~' q4 v( H, W <bean id="propertyPlaceholderConfigurer"
8 r. e5 j6 H2 R- U5 } class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
. @! v q$ F4 R0 j: s2 P <property name="locations">7 B( d4 K6 C, w: H! h
<list>' }4 n8 a( |* k+ x& c% E) e
<value>classpath:config/props/db.properties</value>
% t% Z- _6 @+ i ~+ ]7 e: V! n </list>4 Y# C- x% |3 q6 Q1 f" c d
</property>1 c0 J2 W% M0 Y, ]- T" @
</bean>
8 d# f9 [' E+ P1 } c:引用: ${username}0 r/ R& A$ w( j6 T
! ]: ~+ s* f- D4 \2 m( m) N: G
(8)spring分文件管理
! J4 t4 E6 C( D <!-- 引入其他spring 配置文件 -->$ U1 @4 l9 ^+ R# _& S0 ? k
applicationContext.xml引入下列文件0 @- i. M3 k- Y! _
<import resource="applicationContext-web.xml"/>
9 D7 r; O% B: q/ N$ b <import resource="applicationContext-biz.xml"/>" ~3 g3 t' S9 U3 j( ^, D
<import resource="applicationContext-dao.xml"/>2 @0 [! R* d7 @, m7 g( ]- I( {& t6 [
7、开发数据访问层
3 c* {- W) @. R& \9 r3 }$ @ 使用spring提供hibernate 模板类 HibernateDaoSupport6 A$ Q& R2 y& k, C4 u0 y% h- A
UserDaoImpl extends HibernateDaoSupport: N/ v% s! M9 c( Z
在UserDaoImpl注入到spring 配置文件 applicationContext-dao.xml& g4 ?' F- g6 e2 ^) e$ G0 Q- s5 n, W
<bean id="userDaoImpl" class="com.tarena.dao.impl.UserDaoImpl">
' C; m: e o7 R( P( T) e7 [) s5 @ <!--HibernateDaoSupport中的sessionFactory-->
% E2 N% L; b0 H7 {3 o: m9 b4 }, M8 [ <property name="sessionFactory" ref="sessionFactory" />- x1 M# ?3 ^1 k, C2 K- ^
</bean>( A, F9 w, _* d
8、添加spring声明事务管理(AOP)1 {& I: k* \3 k2 h0 m
声明式事务管理: o2 p7 J, l* T. x- Z
添加spring 类库
7 D- V( }3 N& f8 g- n aspectjrt.jar
$ F, i w, O5 Y% G& [ aspectjweaver.jar: L0 i6 R- H. K
了解事务的几种传播特性
+ d& o( ?& v9 n" ]9 \
. F; Z7 _' p2 {2 s$ B1 \ (1)PROPAGATION_REQUIRED: 5 p1 A/ ?, |& ~: i0 {
如果存在一个事务,则支持当前事务,如果没有事务则开启。; g" c# o4 A; G' j, t3 h+ D
(2)PROPAGATION_SUPPORTS: $ _% a$ ?; E$ r" d8 d4 p
如果存在一个事务,支持当前事务。
0 a# @; S- y; q, m" z1 X# A 如果没有事务,则非事务的执行。
4 h6 j3 T$ V4 c; j1 `& r* L (3)PROPAGATION_MANDATORY: ! |; X) ^0 @, }$ p9 L( M8 _ J# e
如果已经存在一个事务,支持当前事务。' K' `- b! ?, J0 }0 |
如果没有一个活动的事务,则抛出异常。
- C4 G/ b# C" J* a. G (4)PROPAGATION_REQUIRES_NEW: 5 y2 U- l1 R) J
总是开启一个新的事务。如果一个事务已经存在,
0 q8 k3 `( v1 X 则将这个存在的事务挂起。0 f. ~0 Z2 R( j: j' a
(7)PROPAGATION_NESTED:(spring特有)
; _, h* I0 S% M- E 如果一个活动的事务存在,则运行在一个嵌套的事务中. . U6 [8 @2 K: ?* E- _& u9 ^
如果没有活动事务, 则按TransactionDefinition.
+ B! F% Y" ?3 b8 s PROPAGATION_REQUIRED 属性执行
1 z. s0 T2 E4 c o+ {% L. e9 C& u
7 X+ R( n% U8 g4 ] (5)PROPAGATION_NOT_SUPPORTED:
! M/ ?2 x0 d: A5 f 总是非事务地执行,并挂起任何存在的事务。
) C; j. _% c4 `' Y( \- I (6)PROPAGATION_NEVER:
2 F) ?$ h( @$ J' g7 y7 H 总是非事务地执行,如果存在一个活动事务,则抛出异常。
- {; A+ a3 F' Y1 Z1 B: P! F5 p8 O) I+ |! n j. y+ M+ [( d. L6 u: a7 B$ W, N
0 a# c; z/ C \; O: s
<!-- 配置声明事务管理 spring2.x-->
9 ^# a+ A, h5 f8 }# m <!-- 定义事务管理 -->9 J0 X5 \2 K- ~$ Z6 ?+ f% R: X
<bean id="transactionManager"
; C( |2 n1 M2 V7 K* j5 X class="org.springframework.orm.hibernate3.HibernateTransactionManager">
0 D5 _1 T1 Z3 f- e* Y' Q <property name="sessionFactory" ref="sessionFactory" />5 G; m, {. e. E q. o7 S
</bean>) n5 b% z+ |# i% N3 j# I
<!-- 事务规则 -->
/ m" G& C+ q- a+ U <tx:advice id="tmAdvice" transaction-manager="transactionManager">0 `$ i( e0 J. B7 g& ]" H1 ?
<tx:attributes>
. x; N) h$ y# V2 Q <!--*通配符 save* 方法名必须是以save开始-->
& I, W0 _8 z7 x. P5 O# ^# ]% S <tx:method name="save*" propagation="REQUIRED" />
8 Q+ q9 G! k% t- }: b <tx:method name="update*" propagation="REQUIRED" />
; b$ k3 l3 B+ a$ \3 ~9 ] <tx:method name="delete*" propagation="REQUIRED" />& A1 `; L+ i% g: r+ t J1 N4 S
<tx:method name="find*" read-only="true" />9 v# B8 A& c: \6 v
<!-- read-only 只读:-->) U4 c% x5 l3 N- B9 ]( r2 m; o/ q
</tx:attributes>* M0 m d* l8 ~$ r6 x) Q
</tx:advice>+ M: f) T* g; ?2 }" y' L
<aop:config>
" s: d5 |; t) e# c <!-- point cut -->
6 f T4 u1 m j; i; l- N& O <aop:pointcut id="pointCut"2 A0 t7 j# Z, i. F& l
expression="execution(* com.tarena.biz.*.*(..))" />
' N. q/ Z4 p9 J$ m0 Z <aop:advisor advice-ref="tmAdvice" pointcut-ref="pointCut"/> 2 h$ A4 ]4 k# ]' Y2 @ x8 M
</aop:config>
]% e4 T) Z! D+ e/ N' l7 } 3 A) `1 }0 ^, j1 H" P( ?% S$ t2 n
9、测试( [ A8 @3 Z9 K% b( h# I6 k- N; O
添加测试类库 spring2.5.6
, K9 P4 j( z0 _% K junit-4.4.jar2 ?" w" u+ o1 _9 j6 |. ]
spring-test.jar- u/ Y3 V8 G: p* q2 E; Z
//使用spring测试$ K b* ]7 ~; z6 f
@RunWith(SpringJUnit4ClassRunner.class)
! u- n' k, v1 R: W" v //加载spring配置文件4 _, c- f+ _1 e* u" u* R8 q
@ContextConfiguration(locations = {
1 W& H$ ]/ e4 ]5 P. ` "classpath:config/spring/applicationContext.xml",
9 }3 L: r! d$ c "classpath:config/spring/applicationContext-dao.xml",
+ Q( b* |4 `0 G, H" N "classpath:config/spring/applicationContext-biz.xml",
2 ^0 n8 q- x5 p/ v5 u- O "classpath:config/spring/applicationContext-web.xml" })9 \( [7 L3 M6 n- e
//自动注入
( c X% z4 z' Y$ H9 L @Autowired
- S. g& Q! i" c. {$ ?+ b9 x0 O+ Z; w private IUserDao iuserDao;
7 X9 J1 E( R7 r5 P
6 A8 a3 n- r4 [1 O9 N. w. L, a) I: r @Test
, K3 P7 n/ x7 w. A2 }7 ?1 | public void saveUserTest(){1 e2 f+ g3 K1 j/ a
//测试方法 T' T& f+ b; Y2 r: k8 _
}- C2 {; T# w. U( F: l6 [
10、完成业务层代码编写' `2 s3 ?) v; i) m
11、完成表示层代码编写9 t: p5 q2 u9 K+ Y
12、测试工程
* C4 T) T& x; i' [0 b, m5 O8 b9 Y& @% z9 O/ T/ H- F! E, T8 C
13、spring处理hibernate延时加载
5 y4 c3 {' A x' J; O/ o 1、配置延时过滤器$ A$ j7 W R; b7 j
OpenSessionInViewFilter.class$ p1 o y& @; Y) _
2、在web.xml配置OpenSessionInViewFilter
% E6 o: c6 F. I
+ a. g" S1 J4 i: p& t8 x <filter>3 S; r* L" w) W v0 f& R4 F: G& {
<filter-name>openSessionInViewFilter</filter-name>+ n! _1 c6 G; U0 U7 c
<filter-class>
! r- m+ M# j1 x3 z. v* {' M; l: @! w org.springframework.orm.hibernate3.support.OpenSessionInViewFilter/ p2 R" b) L. O" h* O9 A
</filter-class>
! T- G- k- f* d) P6 z <init-param>
: G/ W, V1 Y! a0 i <param-name>sessionFactoryBeanName</param-name>% x+ i- U B/ }
<param-value>sessionFactory</param-value>, q1 c$ Q" b# G. V' Q B9 F4 \
</init-param>
5 b n( I4 V% `$ p </filter>
$ O1 c" x S* z& D <filter-mapping>
7 ~8 ~7 e! h. Z$ _ <filter-name>openSessionInViewFilter</filter-name>' r9 }0 Y n4 Z6 a7 }' R. u
<url-pattern>/*</url-pattern>: ~8 _' r a& z7 E e
</filter-mapping>$ h+ X r( P# s% _2 v. w& b) `$ [; W
; f$ W0 I3 N* k F |
|