该用户从未签到
|
( \! ?! u9 G4 t* ]
4 V5 F9 L4 C! ^5 jSSH分别是指:struts,spring,hibernate3 |3 T( @/ C G: a# ?
4 j! C( z( d7 h' @! D
下面是SSH三部分简单主要的知识点:4 {$ h. g% Q! b$ l2 P1 O( J7 f
8 h/ ]+ g! r3 Y
Sturts:
Y, G3 i W/ L
6 p% e8 u0 ]0 u# Gexecute : 6 W! J0 J$ {6 ?. c. c" j$ m
execute()方法相当于main()方法,有三种创建模式 :
5 ]$ c, ^, U& x: P
* U) _) ^/ [1 |* X# |6 b& ^6 j 1 自定义类,类里面不能写main()方法,写个execute方法,返回值为一个字符串,和struts.xml里面的<result name="字符串">对应就行) V8 [ B3 Z% Q+ W5 P" W: p
public String execute() {
7 a4 I5 G* m, |% y6 V6 J return "success";) b( g' H$ C& n9 Q/ n
}2 O- i) p/ [2 Y7 Z* i
# T% E) B" Y" {# B+ s* b% Y( e) p
2 实现Action这个接口,并实现execute方法,这里的返回值可以是action接口里面的预定义的常量,当然,如果struts.xml里面的<result name="字符串">这里设置不是预定义里面的,这里就不能写常量,因为这几个常量是底层实现了的,别的还是要自己写字符串,和xml对应上
) c& W' z& d7 e6 j4 k& X+ E* q3 ]* N public String execute() throws Exception {5 O ]5 W* F8 g+ f1 z4 Y
return SUCCESS;//写成 SUCCESS常量也可以' ]/ i8 ~4 p! `$ B6 ~
}
# x3 P- F' K, D/ f& Z
6 f' S3 |% w: ?. B. F9 J( { Q 3 推荐 : 继承ActionSupport这个类,并覆写execute方法,和第一种的写法一样,但是推荐使用这个,因为这个类写了很多方法,方便我们使用
1 R+ ~4 C9 z0 ^) R( [ public String execute() throws Exception {* @/ D/ M# w. j/ B6 U3 @
return "success";5 L% o3 Q! q" k" ]8 T
}3 U. d. P# ~' u' @$ j+ k. s
$ n) t( [% n3 H2 d+ A; B3 a//充血 贫血 模型 :$ T0 K& y4 D: V: E, [
把增删改查的方法写在实体类里面,就是充血模型
' y( B \% L1 z; }) G& ~ 不写在这里面,就是贫血模型
, L% e: q" `# a8 | pojo:就是一个实体类
3 c# u0 c5 T: ]/ W( ?+ {8 Z; x5 H5 r2 Z+ f/ ~
9 S% G" _* h: G. E. o: z* Y- G& a2 n: w) }# ~3 H
# Z: v6 ?: R/ q m
//拦截器调用 : 调用拦截器1 |- k7 }4 r$ U% @! O g
* c% @1 r- j* Y' f
先从最近的模块找 模块(包:com.jaovo...xx).xml ---> struts.xml ---> default.xml ---> web.xml;
e$ l2 J& U6 @1 y, A4 o 一直到找到,都找不到就报错
* X3 G5 h! n( v& r8 K" p' N9 p" E& n( J$ f
//后台设置的东西,在Action中设置request和httprequest的区别 ) \' ~" H/ V( n! ]8 e- n; f8 y* H
1 P6 K8 q X8 M- S <!-- - A8 @2 {2 z- C5 d7 e `
后台设置的东西,在Action中设置request和httprequest的区别6 m% S0 X' z O+ j3 R/ r2 `; y# q* G
在前台通过request,session,aplication可以去得到. q2 t& ^% J0 [
在后台设置的request全部复制到了HttpRequest中去
5 M" Y% \' q9 S+ w- O8 ~2 W jsp页面中的是HttpRequest(request)3 U+ Z- ~. e; X! j: h. v; {6 z
-->
' _* r( |: L1 g; p3 e m <s:property value="#request.request_"/> | <%=request.getAttribute("request_") %>//前者是获得Action里面的 后者是获得request里面的(原生)
J3 H+ j& Z! i: X4 A" V2 b5 e% n' l0 W. Q
9 X- L9 z+ Q& o! {
request : //每次请求,都会创建一个新的request对象
; K* |7 C9 X) u0 y; Y
* v8 ?2 I5 k3 B; O% `6 T: Zsession : //只要在同一个浏览器,就只创建一次,作用域是整个浏览器,关闭浏览器,session也随之消失,如果没有,就会创建,如果有,就不会创建) m' o$ k" u, E' u, g
# j l2 r8 K( b1 [& C" @6 I! e1 x
application : //只创建一次,可以跨浏览器使用,如果没有就会创建,如果有就不会创建
, |% H+ K5 p+ s% u3 ^" a* x
( E2 H8 @% ?) n% g H/ ~7 Z7 J7 K0 p6 r
Spring:5 ~) G/ R- q8 ?; |% v, i! V
, g5 c& u9 b) W; G" p9 Z
& B( w2 e, `/ F6 z. Y4 f 1 控制反转 IOC : 控制类的实例化,以及他们的调用关系& D ~! C% R1 U0 {. m
2 动态代理 AOP : 主要是事务机制的控制$ p8 u" {1 g3 H
5 U% d' }+ }7 ~- E3 J" C# m" | ] 四种方式读取属性 四种读取属性的方式:% \1 F) E3 H @ p9 C9 A* x
1 DOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取& G& {! t9 G; U: q
2 JDOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取. k" ~3 @/ b( @: o: ~
3 DOM4J : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取
' d, X U6 a. X* N4 U: ` 4 SAX : //用IO流,一个一个读取,读取一个,放进去一个 哪里报错,报错处往后就不读取,前面读取
, S9 h* V/ [ u& L2 N
0 N- w# m" d @5 K- {* e DOM : == Document Object Model : 文档对象模型. a7 t( y" [. F2 q ^- h U S
SAX : 基于事件和流的方式解析xml$ p. ~, L- l9 q- t1 U
sax,DOM : 这两种已经加入java的核心包,不再需要第三方宝
+ w9 O) }% H. w JDOM : 是DOM的一种增强版本: F% J5 G* c6 p; ~* Q5 z4 u) Q; {1 f
DOM4J : JDOM的一个子项目
- y, A E/ y! `
* V" u7 H0 ~# i4 t' k' {//解析XML文件,解析XML文件的方式都大同小异 : ) X, V- o" @5 C$ [! B8 J: v
3 s- B6 ]. |+ O) ^4 p6 v 1 获得根节点
1 B8 H9 C* ^6 R( e3 Q6 p 2 遍历根节点里面的子节点
7 R$ [( o' Q- \8 e9 I 3 获取子节点里面的属性
2 d* u+ P! v+ O* }: g& s 4 遍历节点里面的内部(子节点)节点
3 G& n. ^, x. R Y
, j# `1 A- Y+ l" u ?5 B( l% \4 I2 X6 P4 @( Q- |3 U! t
' o. Y# G- I. D( _Hibernate:
$ [$ V# U" v( l/ B2 c1 U# T0 C9 }' i3 R, \* ~' F
操作数据库7步骤 : + w: L# E% C2 i, ?5 z% `
1 创建一个SessionFactory对象
4 X6 d% h, S' q; N) t 2 创建Session对象* W7 y1 W& U' `9 v3 X4 ~) H
3 开启事务Transaction : hibernate中,然后数据库操作,都必须是事务的,哪怕是查询
7 e! S' t- k. \ i8 u. i/ S 4 执行数据保存操作(必须提交,才会执行对应的操作方法)
* S0 j. R2 l& l. }# X: O) l6 A/ T 5 提交事务0 {; S( Q5 X, J# J- |
6 关闭Session# R9 X( I- T( o9 M
session.close(); ^5 U- X9 `' j, d) [& m8 v
getCurrentSession();不需要手动关闭,opensession需要手动关闭8 G% O/ W& c" |. o, q" \% I
7 关闭SessionFactory对象
. G6 A( B4 D+ _7 t7 @$ {//三种状态 : 0 V/ [+ J8 M7 p! M. _0 _. ~
0 a5 N+ q7 L6 N9 t+ z- E 瞬时状态(临时状态)--->持久状态(保存到数据库)--->游离状态(保存完成后关闭session对象 (session.close()))8 f& V2 H! \8 l- s' L$ l# M
2 |7 v4 M4 j1 e- i, g& @: J //三种状态的区分关键在于
" _) m; E3 Y( o 1 有没有ID8 i" M- n ^8 W' T7 G: R% ^
2 ID在数据库中有没有- x: D P; F2 w$ v4 _0 r
3 内存中有没有(session缓存)0 N$ o( g R+ t& H3 l* B
}9 c n$ u3 Y& [, Y Transient :
$ w& @9 J: u2 D' v6 T& [
& {4 F ~" T0 A3 A Transient(瞬时状态) : 内存中一个实体类对象,没有ID,缓存中也没有( o9 k* @ o! _. U* w$ o
//实例化实体类的时候,就是瞬时状态1 [% w$ A# y( V4 K% J4 m3 s+ P
, c; J0 w' W4 Y8 d$ I* v, z" V
Persistent :
& F7 g7 v" E. B' } Z
4 t9 L, H/ U6 J" [2 l: K% Y Persistent(持久状态) : 内存中有,缓存中有,数据库中有(ID)
3 e! U, Z* `2 _: X) t, }$ U //保存到数据库中,就是持久状态5 @3 Q5 z$ J& a; f+ L
: y1 B9 H7 J4 Q s0 Q |$ k
Detached :
$ |- \4 B& K2 B$ W! s3 k9 u# f, m+ l4 J- D/ v$ I
Detached(游离状态) : 内存有,缓存没有,数据库有,ID
2 V" X3 T: R: r5 Y# H //关闭session对象之后(session.close()),就是游离状态
( J1 C, |' U4 D5 C
$ N/ I& L. g5 F. w5 x( E //这三种状态需要关注的问题是在该状态下,如果进行数据库操作会发生什么结果,比如改变属性的值会不会发出update语句- }8 a# I/ F& _" T7 k: o2 [
+ I, E: @7 |( A' u1 b
瞬时状态 : 不会发出update语句
/ V; D4 I- o. c3 i9 k 持久状态 和 游离状态 都会发出update语句7 j T' C7 E2 Z- ^
. R9 G6 R" v- {* _
|
|