该用户从未签到
|
! ]2 P6 L! l4 U% n% [2 u6 {" |8 p7 r7 _/ r8 n
SSH分别是指:struts,spring,hibernate
6 b1 g5 G2 M" {0 [4 |; w8 n
" w W2 K9 ?4 Q下面是SSH三部分简单主要的知识点:
~9 k; L5 `" Z8 j# c' Z$ ?' ] [8 a3 s5 J5 o
Sturts:
! C% f: e$ u5 c7 s j" F3 g
$ w7 M2 r- h; U1 nexecute : 1 D5 I/ E9 O$ x- P
execute()方法相当于main()方法,有三种创建模式 : ; s, k- k" J5 L' ]" b2 Q# a+ h+ B6 P2 p
: o4 {; J8 {3 U* S 1 自定义类,类里面不能写main()方法,写个execute方法,返回值为一个字符串,和struts.xml里面的<result name="字符串">对应就行
; m. j, q5 K! u: ?) Z3 F+ \1 Q. l public String execute() {, p, `3 M4 R h7 Y
return "success";2 F8 C% w& \' T( t5 v( H
}# V" x/ J$ }. `. _5 l
9 Q. Q) T# ~( J# Z$ N% {' R% E 2 实现Action这个接口,并实现execute方法,这里的返回值可以是action接口里面的预定义的常量,当然,如果struts.xml里面的<result name="字符串">这里设置不是预定义里面的,这里就不能写常量,因为这几个常量是底层实现了的,别的还是要自己写字符串,和xml对应上. u2 F9 {7 }# K. w5 a, K! \
public String execute() throws Exception {
( v9 M% N/ ~3 C+ O return SUCCESS;//写成 SUCCESS常量也可以
" C# c% T" X! |% r. I n }
+ S8 _$ z: N, v6 Y( c# s' r# n: C- x; w, c, c7 x
3 推荐 : 继承ActionSupport这个类,并覆写execute方法,和第一种的写法一样,但是推荐使用这个,因为这个类写了很多方法,方便我们使用: G0 v: n% O, [1 F0 Z: a0 n
public String execute() throws Exception {
, n8 |3 P8 P+ U0 }) f* \) r return "success";
; c4 P) T/ f ^2 [. {# l/ | }# G3 n$ n) u; P" w- L; O/ s
- b8 {+ B% I' Z4 g, Q0 P) {1 G//充血 贫血 模型 :
h+ C0 r5 |/ C1 I5 e D. l 把增删改查的方法写在实体类里面,就是充血模型
+ Q) `8 i% [; W0 B K: f 不写在这里面,就是贫血模型7 N3 ]' [$ \. {, P4 I
pojo:就是一个实体类2 l+ f/ G# G6 Z) L3 u0 |9 ~' W
% y7 M& c5 C1 j) y3 [3 |8 {1 f* D' ^6 H r3 e# f
o$ \5 p& }: W) w( u) k
( o7 Q& j( u3 S: Q
//拦截器调用 : 调用拦截器8 M" z! q1 V% Z- e
4 d3 ^3 o$ o) N6 ~ k 先从最近的模块找 模块(包:com.jaovo...xx).xml ---> struts.xml ---> default.xml ---> web.xml;
& r5 v7 {0 ]9 f( A1 V 一直到找到,都找不到就报错6 Q; E: e/ ?6 T7 ~& J
* A- s4 c D q: s5 [ S' }//后台设置的东西,在Action中设置request和httprequest的区别 1 U' g2 w; u9 C& r2 ~
8 n8 }( V- R! s+ H- `2 w
<!--
+ v, x6 W( v: M 后台设置的东西,在Action中设置request和httprequest的区别0 v- A$ i1 z/ \# }3 F4 r3 X# n) v
在前台通过request,session,aplication可以去得到
! F! u; h( Q$ ]5 s 在后台设置的request全部复制到了HttpRequest中去
* v4 I5 a9 h; \/ M. |2 T jsp页面中的是HttpRequest(request)" t$ ~: M$ L: o3 M' m0 N k9 i
-->4 \! s* [* T! L8 ?8 a5 L, W4 Z
<s:property value="#request.request_"/> | <%=request.getAttribute("request_") %>//前者是获得Action里面的 后者是获得request里面的(原生)/ I$ _9 ^, l& T+ j R" J2 O- ]
/ E7 W+ W; K& ?: P- Y8 S
8 E# {1 h, A# l0 [6 ? f: Rrequest : //每次请求,都会创建一个新的request对象
+ [) I; j' j; j$ H& B& m
" J8 \$ E W/ q b6 D7 A! j5 Ysession : //只要在同一个浏览器,就只创建一次,作用域是整个浏览器,关闭浏览器,session也随之消失,如果没有,就会创建,如果有,就不会创建 Q0 u9 |# Z* L9 E' r9 ]
5 M/ E! \9 b# i& P( L
application : //只创建一次,可以跨浏览器使用,如果没有就会创建,如果有就不会创建
3 D( p7 c: j c" |/ c) {
D7 r2 K8 |5 w% y1 @0 E" E6 ~& u2 W
Spring:
2 @/ W. c# D, `0 K$ ]7 U" A! f) F) {$ p
" l- b, L" V% w* @5 A, x. { 1 控制反转 IOC : 控制类的实例化,以及他们的调用关系
% J) F2 _/ x* M 2 动态代理 AOP : 主要是事务机制的控制" E5 t5 B' `3 {) s
0 u e% n/ R& k8 N
四种方式读取属性 四种读取属性的方式:( n* y# S g9 I8 Z1 O* E u' M3 Y
1 DOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取
5 A6 @8 `1 u# h w 2 JDOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取
6 H* u& \& W: w. m \! ?( ` t 3 DOM4J : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取) V1 |2 C7 l: J' `3 z# q$ i& d
4 SAX : //用IO流,一个一个读取,读取一个,放进去一个 哪里报错,报错处往后就不读取,前面读取' W2 Y G; j* M6 T1 F: p
: ?3 r. @2 z& Y: n& G0 a DOM : == Document Object Model : 文档对象模型
* C- s0 j4 ?! Y- P2 s. b6 d" } SAX : 基于事件和流的方式解析xml
1 v0 P6 G" ?$ S6 B9 P4 ~ sax,DOM : 这两种已经加入java的核心包,不再需要第三方宝
" f4 h# J6 ^; W9 @ JDOM : 是DOM的一种增强版本6 U) T' z8 o. w! H: K6 j v
DOM4J : JDOM的一个子项目9 y: p V+ N, L/ p/ V6 H
! d6 [2 {% p9 o3 D
//解析XML文件,解析XML文件的方式都大同小异 : 8 _1 @' D! R7 P0 {- R
7 o5 s0 Y2 |+ E d
1 获得根节点
i3 i% g) l6 c4 y 2 遍历根节点里面的子节点3 D+ `5 P' Z V
3 获取子节点里面的属性
6 @* C& B6 k3 [ 4 遍历节点里面的内部(子节点)节点, q, N3 G+ z* b& H7 e
* E0 Z" a9 d, p' o8 U
' m9 f3 d. r1 t( }7 Y6 ]# I, F" N
$ s" V5 h) T! E
Hibernate:
5 c) T3 [( W) d! q
! F/ w5 U- R: z. _3 b" L操作数据库7步骤 : % E/ a- s3 N0 O$ O/ M, q; f0 L
1 创建一个SessionFactory对象0 q6 B3 U& X' R7 Z* W, U3 r4 e1 I
2 创建Session对象
4 T7 s8 W7 x4 I- ~ 3 开启事务Transaction : hibernate中,然后数据库操作,都必须是事务的,哪怕是查询
+ O% t4 M: C1 A% n, [( k' s0 S 4 执行数据保存操作(必须提交,才会执行对应的操作方法)
. A: s, F- k; b& X1 J8 a0 k1 ` 5 提交事务
( D) D j. v1 G7 P 6 关闭Session
% |& y6 x+ r# d" [7 @ session.close();
6 Q( P/ w, {. ?) M ^ getCurrentSession();不需要手动关闭,opensession需要手动关闭' H( L+ f( v# U
7 关闭SessionFactory对象# D8 z* c- o* Q. |" ^$ C3 S% ]
//三种状态 : + [1 B; b F3 T; l! s/ ]
5 P+ c+ N" r5 ^7 E
瞬时状态(临时状态)--->持久状态(保存到数据库)--->游离状态(保存完成后关闭session对象 (session.close()))9 B0 m; ?8 `4 y+ V% b" i( }4 }
: T+ i% m" J) o0 w3 ~( b //三种状态的区分关键在于! @1 Q# F# {0 v3 S. x( O: K! Q
1 有没有ID0 R8 p" b9 Z9 a& D; C
2 ID在数据库中有没有7 i8 {/ n9 d4 o5 }1 G. `$ t
3 内存中有没有(session缓存)
7 H# M; E6 t; d' ~, [% p, \- c' g$ c9 a+ U
Transient : 4 Z3 G7 v, q& p/ c0 d: c
( ]2 t% u; I/ o+ r+ m `! j! F Transient(瞬时状态) : 内存中一个实体类对象,没有ID,缓存中也没有8 X2 K4 ^/ |& P. p# o3 D
//实例化实体类的时候,就是瞬时状态6 e; G/ r" x$ Z/ s& L. F0 }
8 f+ _ V8 S3 ]' r6 U Persistent :
' u& c) N9 ?/ j. l% r g3 @' L5 h' A+ L! S9 ?: S6 x
Persistent(持久状态) : 内存中有,缓存中有,数据库中有(ID)
, r0 S7 A# ]7 i% {$ k0 q; @ //保存到数据库中,就是持久状态
R* v0 X/ a* R9 H
' Y) Q# ]5 D8 `3 z% g. P5 Q8 J Detached : % i" x1 m9 U( |) ^" O
* B/ c. T! |% q3 F. Y% S Detached(游离状态) : 内存有,缓存没有,数据库有,ID
% v! I+ o2 T8 q: Q9 X //关闭session对象之后(session.close()),就是游离状态
) g9 N3 V9 _: I& U' r# j% v
3 T7 L. [, E6 j3 P7 c //这三种状态需要关注的问题是在该状态下,如果进行数据库操作会发生什么结果,比如改变属性的值会不会发出update语句
# f' v; b+ }/ o: S( A0 x3 H, Z) c2 H6 i1 c
瞬时状态 : 不会发出update语句7 u, c ~- I# [3 @) O, _
持久状态 和 游离状态 都会发出update语句$ z2 \) P) U2 x* u4 U7 Z3 |
x1 Y* k' V1 M& u- z) S
|
|