该用户从未签到
|
, |& Q/ `. X. t J+ N5 a! G8 b8 O
4 B, @' u# a, e5 h- M
SSH分别是指:struts,spring,hibernate* }8 u& j. t3 V/ y
X1 |& F& Z% W8 n7 x下面是SSH三部分简单主要的知识点:( E0 n; w% ]1 o8 p) y
. J4 b( ]( M+ j! t1 a, t- YSturts:9 u' K& M/ A# U
3 [4 z9 F7 j% e' h+ d
execute : . I! C/ v$ t2 [# S4 ?
execute()方法相当于main()方法,有三种创建模式 :
8 [. o, b) ~" n9 B1 \" i4 b8 W+ e. v2 l0 Y
1 自定义类,类里面不能写main()方法,写个execute方法,返回值为一个字符串,和struts.xml里面的<result name="字符串">对应就行
9 V* F" j. C- [8 K" s public String execute() {
) r6 A- P! S* l) v6 o& j return "success";
0 s) k- h/ B4 J; A- @ }- b7 z' M$ t- g+ |
$ Y7 M8 P, a# _4 y: @! m, X! `# h7 R
2 实现Action这个接口,并实现execute方法,这里的返回值可以是action接口里面的预定义的常量,当然,如果struts.xml里面的<result name="字符串">这里设置不是预定义里面的,这里就不能写常量,因为这几个常量是底层实现了的,别的还是要自己写字符串,和xml对应上
0 p- p" l: s, o& K7 S( K4 V public String execute() throws Exception {
8 K& j8 r2 Q1 U: }, l! B return SUCCESS;//写成 SUCCESS常量也可以- s8 K" |# j: m8 Z$ Z1 I: ?
}8 ^) N) v6 @ i( l" Q
0 n) {7 }: O6 e* }6 k
3 推荐 : 继承ActionSupport这个类,并覆写execute方法,和第一种的写法一样,但是推荐使用这个,因为这个类写了很多方法,方便我们使用$ }. ^$ j: c" p' ^) O" U7 Z
public String execute() throws Exception {
) |. s9 L" E- `: c( a8 ?- d return "success";5 x/ u( n5 A1 q0 Z
}
6 S2 z# c: i# N! {: ~6 C% }
) A x% g3 S( r1 O& w! q& _//充血 贫血 模型 :& z5 Z' ^, v1 W% T% c* T$ q
把增删改查的方法写在实体类里面,就是充血模型# N; R$ f+ X; M7 s
不写在这里面,就是贫血模型0 u. i& o# H* g, t: B
pojo:就是一个实体类& g7 U' U# P1 B X G
& }3 K8 d5 n+ q. f% g$ Y2 ]1 m( n. n/ h9 V
6 C, @% |5 u+ _5 m& d1 c( N; K5 J2 c* B5 p3 d
//拦截器调用 : 调用拦截器3 O# ]7 o+ H0 T0 d
" _$ F0 l8 C- ~4 J! I* h3 b7 v
先从最近的模块找 模块(包:com.jaovo...xx).xml ---> struts.xml ---> default.xml ---> web.xml;
8 ?* Q- t/ w# A: y 一直到找到,都找不到就报错) }% w! }% ]* Q& F- Q; U0 d- v
( Y+ _* c/ r1 N//后台设置的东西,在Action中设置request和httprequest的区别 # L/ g( k. |$ a# ]" x' p& G5 D
! g: A* [0 u7 g5 F. r$ C0 P4 ]
<!-- - e0 m& V( p# a
后台设置的东西,在Action中设置request和httprequest的区别# C/ d" R0 e; F% u6 x
在前台通过request,session,aplication可以去得到
4 ~- t7 k T/ }: P 在后台设置的request全部复制到了HttpRequest中去
# _( c; r5 l5 f- V6 n: O! C: G. E jsp页面中的是HttpRequest(request)" [' u7 U( ?) l& d" X R6 |
-->
+ }4 g$ ]& ^/ r5 h8 Q# _ <s:property value="#request.request_"/> | <%=request.getAttribute("request_") %>//前者是获得Action里面的 后者是获得request里面的(原生)8 [ t0 N: m# s0 J3 d: S
( R2 a0 U+ N9 ~8 z( T5 C
% Y' h1 w2 a( ^& Y8 ~! Qrequest : //每次请求,都会创建一个新的request对象) w" p1 v, i6 m3 r, g; H
x- D6 E3 U$ w3 Z3 L6 Q
session : //只要在同一个浏览器,就只创建一次,作用域是整个浏览器,关闭浏览器,session也随之消失,如果没有,就会创建,如果有,就不会创建( F* E4 k- `& X5 w f# ~2 I1 `% S
4 S- e9 M2 {& L/ }application : //只创建一次,可以跨浏览器使用,如果没有就会创建,如果有就不会创建
2 P3 b0 Z9 h8 d" h9 b3 \* I8 z/ _
+ v: k3 T7 Z3 b5 Z2 Z. k; R9 l% q9 @: D
Spring:
+ ^; W" d# t! g- J0 u4 x- X# R% \1 |4 b& i1 u9 y
; S5 g/ t4 }1 x 1 控制反转 IOC : 控制类的实例化,以及他们的调用关系
* k5 Y; U8 ^- R/ S 2 动态代理 AOP : 主要是事务机制的控制* S7 t9 t1 D* X U6 D7 ?; Y
1 v/ P3 F8 {5 q* e1 j* H 四种方式读取属性 四种读取属性的方式:6 [3 \ z) S" N2 y0 ^
1 DOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取
3 ^) A2 e. A7 r) {. @# l 2 JDOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取2 z2 ?3 [) W% Y _& [& o, A
3 DOM4J : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取
4 O4 x3 a# j! t+ z2 v0 k 4 SAX : //用IO流,一个一个读取,读取一个,放进去一个 哪里报错,报错处往后就不读取,前面读取
|4 V3 z% B; ?$ S" \, G; r0 V" \* R- ]6 C A8 D
DOM : == Document Object Model : 文档对象模型5 a, ]% W4 i, c% I
SAX : 基于事件和流的方式解析xml1 S" ~( b$ J7 E' T9 n4 E
sax,DOM : 这两种已经加入java的核心包,不再需要第三方宝3 d5 {' r1 M; @9 x" f
JDOM : 是DOM的一种增强版本4 ?% K! n6 V3 U. J- z( A8 l" @+ q
DOM4J : JDOM的一个子项目5 _. ]1 b; B4 T; t; M/ N
& x; H$ _$ F E8 [. u
//解析XML文件,解析XML文件的方式都大同小异 :
9 z. {$ ~% T5 ~6 w+ U8 h x7 q; F$ i' ]
1 获得根节点+ m, D8 ^" _, G# A; M9 n7 O
2 遍历根节点里面的子节点, \& ~7 d% j: c0 h% v1 z
3 获取子节点里面的属性
5 H/ r" j/ B3 M4 O/ m3 _ 4 遍历节点里面的内部(子节点)节点+ w- C/ p# S# H3 S/ c' Y
J; Q+ I, C4 J, G6 g* o; |& x2 t0 R& I- V
) s9 O U. A k) ]
Hibernate:
7 Q' o4 R4 P/ h5 n$ O8 m
f4 H9 {; V- t* B( y; i3 S操作数据库7步骤 :
: d$ G7 D* u$ s1 Z- L0 Q3 C g 1 创建一个SessionFactory对象9 s6 S& ]; ^0 |, q) [) f8 E) K; W
2 创建Session对象
$ ?8 H# d7 }/ \4 p; t) P7 T0 F 3 开启事务Transaction : hibernate中,然后数据库操作,都必须是事务的,哪怕是查询, `4 h. [" e1 P2 s! C$ X
4 执行数据保存操作(必须提交,才会执行对应的操作方法)/ ?2 v' o" \2 c1 Y! _; p
5 提交事务
% C: }% P; J! ^ 6 关闭Session
0 } S/ X& G3 t1 t8 a/ w& [0 T3 ] session.close();8 Q7 k* @$ j9 I4 N
getCurrentSession();不需要手动关闭,opensession需要手动关闭
# M2 D! Y# g) o" D1 j; p 7 关闭SessionFactory对象 W* I1 _) X9 v, Y4 R+ Y* @
//三种状态 : * T8 N O1 e3 D
7 u* C G T! @; c$ X( ?" k 瞬时状态(临时状态)--->持久状态(保存到数据库)--->游离状态(保存完成后关闭session对象 (session.close()))
% s) D$ B- u9 X0 ]) W& @; C, w0 B: J$ B$ `" U& W5 L
//三种状态的区分关键在于
/ \/ ?, A/ A! Q5 ]# U7 y2 r 1 有没有ID2 c+ H3 d% o2 I- M! ^: ?# F+ y4 D
2 ID在数据库中有没有
& f, c/ ~& }, ]1 Y 3 内存中有没有(session缓存)
& P" E& z8 f5 c; f
! R( O% b c! i% T2 v& w Transient : + a f/ P( @0 q4 J. {0 N
( ~1 v y: J9 _$ B- T Transient(瞬时状态) : 内存中一个实体类对象,没有ID,缓存中也没有& m7 O; _- q# m8 A# D; f
//实例化实体类的时候,就是瞬时状态0 N+ [. |% D. Q& K
. _0 g1 \4 `0 b) R( q; d Persistent :
3 P' b/ O- o4 K+ q0 d0 d' X: u
& p# P" V5 Z9 R3 C2 H. }8 ^" @ Persistent(持久状态) : 内存中有,缓存中有,数据库中有(ID)
- Y8 Q& } D) e7 d9 ~# n //保存到数据库中,就是持久状态
/ k0 L( R* \% s( X$ B" x( ^' O: e8 ?6 m8 _
Detached :
. l; {5 ]! H+ ~% P; w- Q
% R/ M q5 B! h5 `+ R3 @9 p Detached(游离状态) : 内存有,缓存没有,数据库有,ID n5 y) L, h+ P0 L8 h
//关闭session对象之后(session.close()),就是游离状态
* t1 [8 D- S3 E: k( v) P) M" Z) ^% e! p. V
//这三种状态需要关注的问题是在该状态下,如果进行数据库操作会发生什么结果,比如改变属性的值会不会发出update语句8 l# `7 m: G, P! w# B
J7 e+ K; v, K% J! y6 g 瞬时状态 : 不会发出update语句1 D( \2 y# F+ x7 R( y; s! k
持久状态 和 游离状态 都会发出update语句
" E! G* i/ h. Q
& `9 L; c8 q& }( k1 R |
|