该用户从未签到
|
/ _% m+ f; R, }' ?
. [+ G$ m" I5 G% j& F' T" rSSH分别是指:struts,spring,hibernate1 f$ a# j- D, A' ^
+ a' S9 Y# S5 p: W5 t- v7 \ g T下面是SSH三部分简单主要的知识点:
. S: ~* \* Z( V- C9 p2 E: ~+ n- s) P7 V3 q0 x; h
Sturts:
! p& k; v/ s5 }1 s0 [) P( e: U) V% t1 D2 @1 V; k
execute : W8 K) H7 @8 S. w) d" `* X4 e
execute()方法相当于main()方法,有三种创建模式 : ; E0 f# z$ q: w( e8 I
' P! f9 D7 r, p$ [7 P$ O1 u5 u. u" X 1 自定义类,类里面不能写main()方法,写个execute方法,返回值为一个字符串,和struts.xml里面的<result name="字符串">对应就行
3 r3 f* I# [1 S) c( b+ B0 X public String execute() { ]; `: f! M9 O) I
return "success";) A/ m4 N! r3 V" p( N, S
}
( ~2 _( |( o t* K; J2 y7 ]& z3 D& \# i3 N6 D, `: T
2 实现Action这个接口,并实现execute方法,这里的返回值可以是action接口里面的预定义的常量,当然,如果struts.xml里面的<result name="字符串">这里设置不是预定义里面的,这里就不能写常量,因为这几个常量是底层实现了的,别的还是要自己写字符串,和xml对应上
) ?# F! Z4 ?/ S public String execute() throws Exception {) W0 s0 A; X+ A' g/ k' k) p
return SUCCESS;//写成 SUCCESS常量也可以
; |, A; v6 A. p) D5 `/ Y! | }
2 ~ Z6 j: Z4 j k3 J' H/ ^: v9 V2 H& X, _' v8 P, s6 W3 H
3 推荐 : 继承ActionSupport这个类,并覆写execute方法,和第一种的写法一样,但是推荐使用这个,因为这个类写了很多方法,方便我们使用
7 V2 n. u% ?& O& h& ` public String execute() throws Exception {, ?& B8 E) f% A# T! P% d
return "success";& [/ D3 D2 M d2 k" `
}* K% F4 K+ B5 ]% b8 v
2 Z2 x; L, Q# X* v o- ~1 C//充血 贫血 模型 :
! J& I4 E- X5 j7 i3 u2 D% } 把增删改查的方法写在实体类里面,就是充血模型+ q' x6 I* ]" B' y Q2 h4 a
不写在这里面,就是贫血模型
8 V' D# W) [% ~' q0 G: G! v5 ?8 R pojo:就是一个实体类: m$ |6 ~' I% [7 V+ Y' u0 X
/ G8 A8 _6 x$ C) r0 y0 V% N R* Z
. _; N0 D& w* R/ R% z
" P2 ^+ ]1 [1 ^$ {' w* N
, ~, U- x; U0 M( P& `. ~//拦截器调用 : 调用拦截器
* v2 J. S9 d% r2 O+ o, x+ w7 z) C; u- N2 l5 w8 t, D6 w
先从最近的模块找 模块(包:com.jaovo...xx).xml ---> struts.xml ---> default.xml ---> web.xml;" f" z2 f% D3 Y! E) k
一直到找到,都找不到就报错
1 j0 W4 |6 S1 [2 V, s7 C# J0 g2 X1 |
//后台设置的东西,在Action中设置request和httprequest的区别 8 g/ V$ h% P5 m) ?. ]5 p
/ V$ N; M- b% L <!--
/ P7 R3 g" U8 A/ M9 x6 |% z 后台设置的东西,在Action中设置request和httprequest的区别
1 q3 k L* y2 m1 F* P' q 在前台通过request,session,aplication可以去得到
+ |5 {8 Q6 w" N) ^$ \ 在后台设置的request全部复制到了HttpRequest中去
5 v7 L$ k o1 a jsp页面中的是HttpRequest(request)& [( k }) ]4 J! y
-->4 B$ V/ V# c6 s) H. {& x! b
<s:property value="#request.request_"/> | <%=request.getAttribute("request_") %>//前者是获得Action里面的 后者是获得request里面的(原生)
j4 \4 y Z- Q/ t7 ?, G3 x2 X+ p, O3 T7 A: m' u
& ]9 T0 ]! d Q" c# r/ \+ hrequest : //每次请求,都会创建一个新的request对象% I. q- a& z3 ^$ o
; q T% y& g1 [) [; C9 \
session : //只要在同一个浏览器,就只创建一次,作用域是整个浏览器,关闭浏览器,session也随之消失,如果没有,就会创建,如果有,就不会创建" o" {+ ?3 P( J. R) V) e
4 c* d7 }/ j4 c- [application : //只创建一次,可以跨浏览器使用,如果没有就会创建,如果有就不会创建
4 W) x- b% _6 f' w
/ i3 r. h2 d( q% P
7 W. J: R+ @: p# y; [Spring:
- I- j1 P! p; y& a- W. T2 \0 O2 y4 G: G
Y; i: m' i) O" H' Y6 p6 A9 g
1 控制反转 IOC : 控制类的实例化,以及他们的调用关系
( G1 |9 X8 u6 V5 g8 f' d4 L 2 动态代理 AOP : 主要是事务机制的控制
1 S6 U, B" {# d# n) C1 @& ]9 W; j7 A$ Y1 e0 v1 J& j
四种方式读取属性 四种读取属性的方式:) I; {. V, A2 j9 c7 U
1 DOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取
8 @3 B* g Z& t; ]0 V 2 JDOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取0 W3 v4 v3 I k; [" j
3 DOM4J : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取
$ Y3 }8 w4 \7 X! e+ } 4 SAX : //用IO流,一个一个读取,读取一个,放进去一个 哪里报错,报错处往后就不读取,前面读取0 G) K% ?; i5 y; @% _$ {$ C: i
6 H" S, R4 O+ F% P& \2 |% x/ } v
DOM : == Document Object Model : 文档对象模型' {' ^# r- u# H
SAX : 基于事件和流的方式解析xml2 [$ z& d! Y& j2 t/ K1 m1 n% f
sax,DOM : 这两种已经加入java的核心包,不再需要第三方宝5 c1 W, D4 F8 g3 z+ o' m. m9 J6 j
JDOM : 是DOM的一种增强版本
. J5 y V, f( F1 R DOM4J : JDOM的一个子项目
# V1 m& h7 F9 u! Q8 Q* v- A: s4 y( d+ Q, F2 m4 i" j( i& r
//解析XML文件,解析XML文件的方式都大同小异 : # v2 e6 A f" E( c5 n' w4 Q
+ q% E3 _3 x* H9 W& ~( r 1 获得根节点
9 h' ^+ e1 c4 ] 2 遍历根节点里面的子节点" N. q" F1 _5 X! Z# O
3 获取子节点里面的属性
$ L b0 W; f% C4 z, ]8 t 4 遍历节点里面的内部(子节点)节点5 [- K! `7 r% P; ?' N8 O; E
7 y' _/ E) D5 C; `
+ V9 A/ I4 e6 ~) r- z( ?
; v0 B; c( X: g& THibernate:
$ A6 m& L6 K% x, h: l' ~/ u/ }& X p% V" @! V, ]) _% d, M
操作数据库7步骤 :
6 d7 L) V% h& A- ]" o7 S 1 创建一个SessionFactory对象
" E5 U0 [5 x/ R0 B. r* o! o% a 2 创建Session对象% x Q _ \8 k
3 开启事务Transaction : hibernate中,然后数据库操作,都必须是事务的,哪怕是查询
* o" y! w! |; E# o' V 4 执行数据保存操作(必须提交,才会执行对应的操作方法)
0 Y& x& h) w# a, u 5 提交事务5 H2 k, ?0 {5 W# X s1 D
6 关闭Session3 w d* U: J1 q! W* \7 H
session.close();
) j: ^+ f% y# q' B getCurrentSession();不需要手动关闭,opensession需要手动关闭
7 v. J$ |7 y- t8 f! g% M& d- P7 l 7 关闭SessionFactory对象2 E4 u B3 Y( Q
//三种状态 : % V) G9 N" O @
3 S7 T. M- I. `8 p 瞬时状态(临时状态)--->持久状态(保存到数据库)--->游离状态(保存完成后关闭session对象 (session.close()))
) q" O( b0 U8 _$ _
. N( X6 Q- e/ m //三种状态的区分关键在于( j8 _% |4 S+ d, Q3 V/ b6 l
1 有没有ID! a5 v* }( b# p5 n3 }- Q5 [! p
2 ID在数据库中有没有2 z( `# P# O; P9 Y/ G1 A6 q) _
3 内存中有没有(session缓存)
4 |) G1 O& ~$ ]0 ]
+ ~/ O3 @0 d7 l9 ] Transient :
9 w" S4 `/ k8 u5 _5 x" e
) t( S' {7 |$ P) z% T! }& N ~ Transient(瞬时状态) : 内存中一个实体类对象,没有ID,缓存中也没有
$ l) T5 a7 x4 D //实例化实体类的时候,就是瞬时状态2 j7 m9 s0 `; \9 o: c
8 f( q5 i3 R# U
Persistent :
+ x7 _0 `+ K W1 _! n# L a m8 b6 J9 y: `, R1 h3 X
Persistent(持久状态) : 内存中有,缓存中有,数据库中有(ID)
' U3 j! t/ B' {: l //保存到数据库中,就是持久状态
! L& K- b" t$ ]8 t! m9 z7 n
+ i3 ?: G/ h1 M& N Detached :
8 P1 ?* d% q' o$ l1 g ^& D. R D" N
Detached(游离状态) : 内存有,缓存没有,数据库有,ID+ i& R2 t1 Y/ J/ {( {# [
//关闭session对象之后(session.close()),就是游离状态' G- {8 p3 l5 D* }! t
+ l2 s! a% }6 w$ i) z: A Z7 h //这三种状态需要关注的问题是在该状态下,如果进行数据库操作会发生什么结果,比如改变属性的值会不会发出update语句
6 g8 L/ g% u) w/ U
8 d6 A& u# S5 h* L0 ]; d 瞬时状态 : 不会发出update语句" v( k2 X" k+ d% N; Q+ M
持久状态 和 游离状态 都会发出update语句
+ E% |& a# @& k2 F9 C2 D) _! X6 L% L+ E( e' L: t5 O
|
|