" @6 u G% q! ~3 t9 c" i3 ^ ) E3 i. E+ j7 ~* h1 |* tSSH分别是指:struts,spring,hibernate: o9 d4 w& h9 A7 ~* L& t
/ ?& T6 I. V9 Z W: D7 q( u
下面是SSH三部分简单主要的知识点: # e6 W( i- Z! `+ x6 A: d, V* _ [ n9 v. b$ S: D" B5 uSturts:8 E. `' N0 d) d3 t: ^* V4 K2 K9 u* Q2 [
& k# N. _5 D# f1 p
execute : ) i( u9 [% q9 y; A execute()方法相当于main()方法,有三种创建模式 : 3 i. u2 G! z/ j, i8 E
5 l$ y8 F/ v: `/ ^4 l+ ~1 h 1 自定义类,类里面不能写main()方法,写个execute方法,返回值为一个字符串,和struts.xml里面的<result name="字符串">对应就行" n" H* W* m$ G, ?$ b
public String execute() { 8 a1 D" t, G: f& u7 v* X4 |& Q return "success"; ; e- W! x8 Y u; f. F }# Q9 g; ^9 v, K+ J
) I1 R; F" T) Q- ]- t5 j3 {7 i: a
2 实现Action这个接口,并实现execute方法,这里的返回值可以是action接口里面的预定义的常量,当然,如果struts.xml里面的<result name="字符串">这里设置不是预定义里面的,这里就不能写常量,因为这几个常量是底层实现了的,别的还是要自己写字符串,和xml对应上 5 `" h- e% h- F6 Z public String execute() throws Exception { - |; U. G, u- c* C7 F! J return SUCCESS;//写成 SUCCESS常量也可以 6 Y& z1 F4 Q/ f6 X }) c7 Q: b+ O1 o6 v n' N
4 y" c3 g3 }. O, X0 @
3 推荐 : 继承ActionSupport这个类,并覆写execute方法,和第一种的写法一样,但是推荐使用这个,因为这个类写了很多方法,方便我们使用* M% s" K( j# }0 |7 f
public String execute() throws Exception { K2 O" z7 @: m) O/ @ return "success"; 4 L) m% c# s0 a5 m( _! {5 _6 G } * ^9 G9 a( `0 P$ d! N' U5 @! ?: d$ p" X
//充血 贫血 模型 : 3 r; i4 N- v, W2 x) ~$ o 把增删改查的方法写在实体类里面,就是充血模型8 i% h( q. `, n
不写在这里面,就是贫血模型 5 K$ s4 R, K# h2 d pojo:就是一个实体类 2 U$ m% }, `! L4 T, Q. X3 s' O& F, H2 {0 z0 ~* w0 ^
6 V& Q! M5 L6 \, O: g" K c
: B9 u8 h. K- W2 ?) V3 E) n7 ]5 H" {) I% T/ P: Y# x- c
//拦截器调用 : 调用拦截器+ {1 m- _( V# p7 ~0 D9 S+ m
, k2 ?8 v" g* S0 E0 w
先从最近的模块找 模块(包:com.jaovo...xx).xml ---> struts.xml ---> default.xml ---> web.xml; * U3 ]9 ~; n# i) ]/ D5 J 一直到找到,都找不到就报错* _: T1 g- `7 L! M! h( t* n
3 U, s# {$ [& F4 r* G, e
//后台设置的东西,在Action中设置request和httprequest的区别 ( e+ S4 l' ?) l: Q% T' q; ^+ L3 M
& z+ W8 x4 `! J& P- J1 Y. s& J <!-- 1 W7 v, \6 v8 A8 D: E1 V 后台设置的东西,在Action中设置request和httprequest的区别: y( c- r4 y @( d7 ?
在前台通过request,session,aplication可以去得到2 i6 J a: l7 E4 H
在后台设置的request全部复制到了HttpRequest中去 " t; H+ i% R1 Q* J' |+ p jsp页面中的是HttpRequest(request) c' ?' T* F7 O) C -->, W7 I& ^" \8 z) |1 r7 l- l2 g
<s:property value="#request.request_"/> | <%=request.getAttribute("request_") %>//前者是获得Action里面的 后者是获得request里面的(原生)$ j. x! Q$ A- `: ?% t b
9 s8 t- h6 C1 h; Q& _8 f ! n' o. m; K8 P1 Hrequest : //每次请求,都会创建一个新的request对象, K; f& `4 { R
9 @2 Y8 P+ F/ _+ J' A
session : //只要在同一个浏览器,就只创建一次,作用域是整个浏览器,关闭浏览器,session也随之消失,如果没有,就会创建,如果有,就不会创建 9 B& ?, \5 s# H7 g% K8 t7 M4 b. N4 N) E9 J/ A
application : //只创建一次,可以跨浏览器使用,如果没有就会创建,如果有就不会创建 9 X/ S: l9 x& X! G( S * |7 m& h( [9 M3 ?" W: O- X( m- z' l5 V
Spring:2 P' x/ b9 u1 Z8 ]2 [) @; F: n9 d
) ]& m: ^% O% M g" d* c. i( C
* q- [$ V( H( R
1 控制反转 IOC : 控制类的实例化,以及他们的调用关系 " H# }! y2 ^( t1 c3 v( e6 V 2 动态代理 AOP : 主要是事务机制的控制& f* y# p/ L6 c. d
1 b% F' F6 r2 X: w) y4 I 四种方式读取属性 四种读取属性的方式:% J* o7 C4 u$ h0 u2 }
1 DOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取: e, d8 }* n, L( b3 S
2 JDOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取 ; E, f+ \' f ? 3 DOM4J : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取) C5 j9 L" g! r* l
4 SAX : //用IO流,一个一个读取,读取一个,放进去一个 哪里报错,报错处往后就不读取,前面读取 $ Q4 j' I7 v y6 |' X7 X' X+ j) Z |2 s
DOM : == Document Object Model : 文档对象模型 " j: a& `; n( j; x2 |3 B SAX : 基于事件和流的方式解析xml' q8 l. k- I5 o0 U! Z3 v; ~
sax,DOM : 这两种已经加入java的核心包,不再需要第三方宝9 X: o1 y9 @1 E1 @$ N7 F2 E6 B/ q. U! ]
JDOM : 是DOM的一种增强版本3 I1 u, r! K' F
DOM4J : JDOM的一个子项目 & R' S* \0 q6 q7 X9 [8 u- E o0 B s! `+ i
//解析XML文件,解析XML文件的方式都大同小异 : 5 e6 q# m1 G6 `, Z% u# W# z
9 J u3 W& I% }# ^
1 获得根节点) |' z9 G" ?8 [2 `( t8 T( N) Z
2 遍历根节点里面的子节点 , I; n/ P9 b7 [8 p$ e7 i0 N 3 获取子节点里面的属性" C9 ] ^% B; g: \8 l; }* z
4 遍历节点里面的内部(子节点)节点& W, r2 v" l' Q: N I2 Z" h
) O2 l' b. g4 b% a
W" @+ a( i3 _' A' t' y1 \1 o2 U 6 ?; U2 l( r3 T3 d# r; L2 B( oHibernate:. O; ^1 w. W8 ^4 D8 v; \ M5 h! }% ]
) r% q3 N3 a, h" E1 Q! W0 M0 @操作数据库7步骤 : ) G; b1 e. L8 [' e* \5 L( s0 T/ H; r/ `
1 创建一个SessionFactory对象7 J1 i& G- u6 E' E! r% x. `- e
2 创建Session对象 k) M- w, U& q* y* W* b
3 开启事务Transaction : hibernate中,然后数据库操作,都必须是事务的,哪怕是查询 - [& X7 `/ i( E% v+ K 4 执行数据保存操作(必须提交,才会执行对应的操作方法) 3 E6 ~' l. z* i0 v0 G D; L2 G5 A+ e 5 提交事务" y( b# ~2 k; u1 D( Q
6 关闭Session ! ~# |; f6 t) M) Y5 ~$ q session.close();# F, M8 V- G* X& V0 \
getCurrentSession();不需要手动关闭,opensession需要手动关闭: L( Q, |4 j* N- a& @
7 关闭SessionFactory对象. ?$ l' }6 Q. |
//三种状态 : 9 t/ s5 K- q8 R+ y5 L
5 j+ w9 L# }" K0 e9 L+ W' R 瞬时状态(临时状态)--->持久状态(保存到数据库)--->游离状态(保存完成后关闭session对象 (session.close())) ) g5 e0 w9 d8 P' r8 i ! W8 P4 L8 R& \ //三种状态的区分关键在于4 W, _( O3 c3 z8 C
1 有没有ID4 D# J, v# P2 k! ?4 ?
2 ID在数据库中有没有 * a# Z8 m5 y* L 3 内存中有没有(session缓存)7 e* h" R! b) w0 v" s
0 K. b1 [9 J, q( I6 I, T- d Transient : 6 M" ?' `3 w& m& \. T$ w . a4 R: ~& o7 ] Transient(瞬时状态) : 内存中一个实体类对象,没有ID,缓存中也没有 % S8 m# m) F1 `+ v; n. A/ `7 n" f //实例化实体类的时候,就是瞬时状态: n2 R. M6 t5 M, P @6 S
7 [: t* ]( n9 p Persistent : * c0 Y, \" V" Z" f 8 o" V3 q5 \2 T+ m1 ` Persistent(持久状态) : 内存中有,缓存中有,数据库中有(ID)5 q5 c4 a7 w! Q9 ]/ g
//保存到数据库中,就是持久状态. Z- t) k' g( H3 z! Q, Y: U1 v
0 m) m" K% V+ h0 y Detached : $ E. i: |" K0 e# z$ x9 C& \0 m1 _% |2 |+ E" U. R4 s
Detached(游离状态) : 内存有,缓存没有,数据库有,ID 2 Z8 u" J& E8 @0 f4 Y' u4 \; k //关闭session对象之后(session.close()),就是游离状态4 D/ _4 D9 i! q* s: d) C% k