该用户从未签到
|
) \( @6 h4 L8 e! F n
8 T* A- J/ U7 x$ L' S0 LSSH分别是指:struts,spring,hibernate
- `; y) v- t& A; R G
5 N: A; i$ _# `6 J, S) O; n% {下面是SSH三部分简单主要的知识点:
; h* V3 u2 B$ }
Q0 m" S4 B0 m4 b7 hSturts:- n* Y: }7 p5 C& j" N8 C
! K& a( N; ?5 M8 q+ R
execute : 1 h/ ]* n- H4 w4 l
execute()方法相当于main()方法,有三种创建模式 :
; v! s4 ~* U5 o5 z7 S8 G
, ~# `0 j7 x' D$ o2 D4 l 1 自定义类,类里面不能写main()方法,写个execute方法,返回值为一个字符串,和struts.xml里面的<result name="字符串">对应就行
2 B8 [7 j- u/ `, ? public String execute() {
^, z7 A, v8 j! z ~- \; M9 H return "success";
e- W% o. A6 }7 @! O& ] }# Q m G9 k, N! W" T
, A& Z3 D3 q% y4 t
2 实现Action这个接口,并实现execute方法,这里的返回值可以是action接口里面的预定义的常量,当然,如果struts.xml里面的<result name="字符串">这里设置不是预定义里面的,这里就不能写常量,因为这几个常量是底层实现了的,别的还是要自己写字符串,和xml对应上, ~& u3 g5 y$ \+ r* P* p7 V
public String execute() throws Exception {, O& ^: |. t" h0 a1 R: U
return SUCCESS;//写成 SUCCESS常量也可以
& @& |! m4 [1 H/ U% ? }5 Q9 H; F$ h1 [) K3 C/ K- M4 e# I
* M+ t+ D- c5 T& y! y6 e, o
3 推荐 : 继承ActionSupport这个类,并覆写execute方法,和第一种的写法一样,但是推荐使用这个,因为这个类写了很多方法,方便我们使用/ q# ~5 H7 |- ?% }
public String execute() throws Exception {
) Z' S: ?+ ^) }4 Q/ }: p6 v return "success";
: ^% e0 B8 w" _7 a) q F }
3 A3 P8 p- y! l h/ t0 i/ Z2 Y; O Z% H# j
//充血 贫血 模型 :; ~ [+ t: f7 h+ ^' G! w; U
把增删改查的方法写在实体类里面,就是充血模型& g% u5 X% u0 L. U1 n
不写在这里面,就是贫血模型1 f! A) u( y: p6 U! m3 s/ F
pojo:就是一个实体类
! X3 b4 J3 n: }' P" P% J- P' I' `# m3 [6 A9 Y3 N! @
4 t/ M; \; s5 G4 a
8 i& R$ y7 ^, o1 S" z9 N0 v/ u, k6 [. R
//拦截器调用 : 调用拦截器7 F6 m% | S) q. V8 i, q
6 Z; F o& W0 X' l* U' D% y
先从最近的模块找 模块(包:com.jaovo...xx).xml ---> struts.xml ---> default.xml ---> web.xml;
! {- R$ A2 `) | ` 一直到找到,都找不到就报错% C. F5 d, l) b) s$ D# u" Q
6 [6 Q- j( v3 U/ }- X8 J. `
//后台设置的东西,在Action中设置request和httprequest的区别 # |# F4 |( o, T# v! U+ A' B! Z
' t$ ?( ]7 O4 P8 f/ ^1 }
<!-- 8 |6 Q2 s: g$ v2 _' V6 Q$ f$ c
后台设置的东西,在Action中设置request和httprequest的区别
( U6 P# X+ H; d3 x& m 在前台通过request,session,aplication可以去得到
! e$ G5 ?# }4 p2 s 在后台设置的request全部复制到了HttpRequest中去
4 \: D# @; k. h% N A1 C jsp页面中的是HttpRequest(request)
. s) o7 ?- a( z( v! f! K -->, W, n; n u& l# ^* w( \+ P+ U) g
<s:property value="#request.request_"/> | <%=request.getAttribute("request_") %>//前者是获得Action里面的 后者是获得request里面的(原生)4 G' @ i& U/ x3 H% T
+ S1 X( o7 s2 k6 S; ~3 r4 a' o; G, i* q2 |- D
request : //每次请求,都会创建一个新的request对象
4 `$ S+ B5 e, f' I3 _5 D3 [7 f
) t5 F( ]$ ~8 Q V3 c) C) Rsession : //只要在同一个浏览器,就只创建一次,作用域是整个浏览器,关闭浏览器,session也随之消失,如果没有,就会创建,如果有,就不会创建$ r) b( Y- N. t9 q1 E! e
3 e1 X' ?0 R: o, e# L
application : //只创建一次,可以跨浏览器使用,如果没有就会创建,如果有就不会创建
5 c4 P: P1 p0 ?7 R2 K% _5 V" ?9 b+ w; W3 I4 V2 | T2 V3 Q5 r
5 }1 v4 ]; `1 N# J) B
Spring:' L) d* @2 x& J- B0 d- b) Y
* f! d! ?* U0 V3 t- V/ W1 X
. v) E) Y# X. k% U' V0 H 1 控制反转 IOC : 控制类的实例化,以及他们的调用关系2 W+ g( I# G( [& k
2 动态代理 AOP : 主要是事务机制的控制
2 d$ C5 c5 \5 B
: `9 i! Z* d' ] h 四种方式读取属性 四种读取属性的方式:
) T/ N: d6 k- X3 O) R0 W 1 DOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取
" X! u* ~% p' {1 l; t 2 JDOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取" @# a7 n3 Z. R5 a, ]1 u5 [4 J
3 DOM4J : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取, i7 P: a) @ ?5 O$ i/ r- d: a6 n
4 SAX : //用IO流,一个一个读取,读取一个,放进去一个 哪里报错,报错处往后就不读取,前面读取
* j7 f! o" Q# m) A9 |) [6 v3 E; h Z- L
DOM : == Document Object Model : 文档对象模型2 S5 t; ]4 O$ B5 x+ y
SAX : 基于事件和流的方式解析xml
1 X* r' W& l( `; f sax,DOM : 这两种已经加入java的核心包,不再需要第三方宝2 g/ W- p% p6 U! |
JDOM : 是DOM的一种增强版本# M) U: g3 D. {% B& ^: H1 h: s0 Y, ]
DOM4J : JDOM的一个子项目5 a6 {+ l! l; I1 K% `8 |! ^
: q6 W. ?0 T2 K7 N$ \% T0 X* T8 \//解析XML文件,解析XML文件的方式都大同小异 : # O- i5 K% X8 a# g3 D/ ~
' y" y3 W7 @( ~ 1 获得根节点5 y6 y' A e5 v
2 遍历根节点里面的子节点' i& v- g, U( T8 F. m
3 获取子节点里面的属性; e$ A# [! y" H9 U/ i C1 j1 ^
4 遍历节点里面的内部(子节点)节点* M/ j% z1 a7 }+ {! ~
9 A1 n+ d' V0 _1 d9 ~# P3 o
6 d6 K' _& n" D- `, Z
( C) N/ b o% {" V( ]$ i
Hibernate:) X9 b3 s. z. y! e* T" D$ t7 E% C
8 `5 W8 V0 A9 N% }2 q8 @
操作数据库7步骤 : # ^4 F3 x! p) a8 f
1 创建一个SessionFactory对象
c6 P) v$ Z# \( j8 d3 g" @ 2 创建Session对象
}" r& A$ I2 p! U 3 开启事务Transaction : hibernate中,然后数据库操作,都必须是事务的,哪怕是查询
) m2 X: _: ?9 k9 j2 t [ 4 执行数据保存操作(必须提交,才会执行对应的操作方法)
0 X$ g+ E2 a; `* T2 n3 w6 @ 5 提交事务5 d; ]/ F% L7 A, [+ s
6 关闭Session8 l) K7 q/ G6 Y
session.close();3 k; `7 @" w/ M1 ~1 b7 l
getCurrentSession();不需要手动关闭,opensession需要手动关闭+ |, E# f- x/ P; I: h
7 关闭SessionFactory对象' _ ^1 j% d9 U( |. q' l6 ^7 d2 p3 }
//三种状态 :
/ |, W7 Z2 u9 T6 V5 x2 w% P
2 `) E6 x' S1 w9 }( ?9 P 瞬时状态(临时状态)--->持久状态(保存到数据库)--->游离状态(保存完成后关闭session对象 (session.close()))
/ d6 x5 [# K3 K1 D- Q% V y( n: p9 L6 D8 o3 H' G- h
//三种状态的区分关键在于
) Q6 t2 e5 j8 i2 h$ ^! R$ m/ L 1 有没有ID
2 L: H+ h" a, ^2 [- m& `7 {, e; n 2 ID在数据库中有没有
1 V* {; e& @& q, |% O) `. ] 3 内存中有没有(session缓存)9 \3 |" @7 v2 T/ g+ d. t
, _9 o1 w* O) q1 I2 |9 J( {+ X, e9 _$ g5 [ Transient : 7 K, H' r( g! P5 }3 c% G: s
' `6 z4 z0 T) J8 O$ Z1 U1 I Transient(瞬时状态) : 内存中一个实体类对象,没有ID,缓存中也没有
! M- V4 c( l' x+ g5 n //实例化实体类的时候,就是瞬时状态! j0 ^; b1 s7 d
5 m$ z5 [/ K3 ?
Persistent : 1 j" V# f8 p+ e& ]0 |2 L2 s
1 b, z5 _0 l+ q' ^: n, E* P Persistent(持久状态) : 内存中有,缓存中有,数据库中有(ID)
( E& Z0 d- c1 V* U* x //保存到数据库中,就是持久状态
! G0 N7 m9 p5 G4 B. O
) p# {" g. T/ y( r Detached :
+ m+ ~* j$ Y- a
8 q7 c7 X: y* [2 u2 h9 [. E! T* O6 O1 I Detached(游离状态) : 内存有,缓存没有,数据库有,ID4 i' Q5 h! }: S- p
//关闭session对象之后(session.close()),就是游离状态& O- L' v, C! [% y: ~+ u! }
- X/ x1 `+ t0 d+ x
//这三种状态需要关注的问题是在该状态下,如果进行数据库操作会发生什么结果,比如改变属性的值会不会发出update语句
. A7 B8 \6 S* m! y) N; Q$ t
b, X4 X: Z' `; L6 Q 瞬时状态 : 不会发出update语句& w/ k) M( ^8 l$ e6 k: V- w
持久状态 和 游离状态 都会发出update语句! M; o; P7 d' l- e9 F' z
6 [; `4 e( V/ i- ]- G7 U, H |
|