该用户从未签到
|
5 F! P" X0 e- H8 G) O" @" w( V% W% t/ i, E* b
SSH分别是指:struts,spring,hibernate
0 Q, F7 G' }- A- z& s
+ t9 v+ Z: Y0 J+ M! D下面是SSH三部分简单主要的知识点:; [; y+ N: U0 R0 ]- q/ t( J0 R
) Y7 e' s8 Z2 T8 w2 M
Sturts:
8 n( G# I# ~9 c2 |( t7 ^
1 C# P: Q* B0 q+ A* G$ X5 Texecute :
: @3 ?, j8 {+ C' D3 h& i! S' `1 g execute()方法相当于main()方法,有三种创建模式 : & S. L* N3 D% f: f: I) a6 G% i- ^
6 F9 P U2 J) Z 1 自定义类,类里面不能写main()方法,写个execute方法,返回值为一个字符串,和struts.xml里面的<result name="字符串">对应就行0 G! g4 Z' |; J" ]- g
public String execute() { m4 M, d: b* P/ B
return "success";& N9 L8 ]4 s2 J
}7 h, ~; t6 m3 E
" T+ x- O6 m" V* b
2 实现Action这个接口,并实现execute方法,这里的返回值可以是action接口里面的预定义的常量,当然,如果struts.xml里面的<result name="字符串">这里设置不是预定义里面的,这里就不能写常量,因为这几个常量是底层实现了的,别的还是要自己写字符串,和xml对应上
5 Z% s0 `4 i$ c6 [ public String execute() throws Exception {% H% n. _" M: k% a. ^0 e- P# F# U
return SUCCESS;//写成 SUCCESS常量也可以
, k# L, X' [& R( V }& b5 Z% R; G. ~; V) R
, J6 y, |) N, V% }2 o& _ 3 推荐 : 继承ActionSupport这个类,并覆写execute方法,和第一种的写法一样,但是推荐使用这个,因为这个类写了很多方法,方便我们使用8 |+ X) h9 E7 |3 t/ |5 k% \- n
public String execute() throws Exception {- R' m# `6 Y1 M, `0 R
return "success";8 [8 ]. Y# A( F; o. u
}
; n1 D: d, Z5 N' f$ ]) I0 g2 G3 Q. a
//充血 贫血 模型 :" g. f" [: P$ c& f
把增删改查的方法写在实体类里面,就是充血模型6 @1 f" O" v2 o7 h- |
不写在这里面,就是贫血模型% }3 ]. B, K; }( _
pojo:就是一个实体类" e" _5 H# ^) F& b: f
9 p1 W k, ]! I6 i6 n' Q# H7 P
1 ^5 T; l! o0 Y* G$ Y2 t0 ^
( w7 s0 {5 Y1 K+ }# Z
2 _; Q8 Q3 {% g; [( v" `# f Q( T: E//拦截器调用 : 调用拦截器4 I9 X4 N1 i2 |) x( w* h* w7 h
( w, q$ C0 t$ M" ~ 先从最近的模块找 模块(包:com.jaovo...xx).xml ---> struts.xml ---> default.xml ---> web.xml;
0 L0 `0 h! C, |7 {! K2 G 一直到找到,都找不到就报错
9 q2 l1 [2 V! M' [
9 ?3 F5 b3 O' k' V# `//后台设置的东西,在Action中设置request和httprequest的区别 9 V' [- _( k* l0 ^3 l- E
7 P' ~' z5 T3 g( S' ^9 f Y# g <!--
9 X9 J5 T1 _6 a% C( u1 J 后台设置的东西,在Action中设置request和httprequest的区别
7 o8 T2 H8 P0 \+ k: B* T" L 在前台通过request,session,aplication可以去得到
! P. A N' J3 [3 c 在后台设置的request全部复制到了HttpRequest中去
2 O8 Z' r, N9 ^2 X- A jsp页面中的是HttpRequest(request)% x7 x# N# R: I
-->! i: l5 X, a' w* O7 y4 o& y
<s:property value="#request.request_"/> | <%=request.getAttribute("request_") %>//前者是获得Action里面的 后者是获得request里面的(原生)
2 W7 a8 _' c9 X
8 d9 j- z1 j/ Q2 @2 o3 N* _* A1 f8 G- D0 w$ E+ i
request : //每次请求,都会创建一个新的request对象
( w% ?( b, ?) n: i7 [4 k8 ~; d5 @! c) P! z! U; g! h
session : //只要在同一个浏览器,就只创建一次,作用域是整个浏览器,关闭浏览器,session也随之消失,如果没有,就会创建,如果有,就不会创建
( }! c( u$ K. R) W0 N% O5 k
/ Q3 @$ @5 K) N9 @0 Eapplication : //只创建一次,可以跨浏览器使用,如果没有就会创建,如果有就不会创建; T2 x/ n$ t: n/ {7 ~
- T+ Q* _4 O+ i+ [; j+ J: ?$ D. h! ^7 \- j6 L& \+ k2 ]5 `
Spring:
+ `! o& D2 g' }
0 |- ~7 I' M/ }6 z7 j( i
9 H9 i8 F2 y3 \' x# ?( Y# L3 K 1 控制反转 IOC : 控制类的实例化,以及他们的调用关系
) P) d' O# m' m* U 2 动态代理 AOP : 主要是事务机制的控制+ Q: s9 M1 s0 R" m- Z3 x' ~( A
- k# j3 U; j B3 ^! C3 H 四种方式读取属性 四种读取属性的方式:0 s4 R$ z& s; U4 l
1 DOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取
, @5 ]6 v- z* t2 @0 F0 G# M0 { 2 JDOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取
. X# Z# M7 a y. i5 ^: N2 F5 d 3 DOM4J : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取
$ \ l# k3 P" W" B 4 SAX : //用IO流,一个一个读取,读取一个,放进去一个 哪里报错,报错处往后就不读取,前面读取" ~ Z# r0 }/ f5 e1 C
3 L& N4 X% b* E: L DOM : == Document Object Model : 文档对象模型+ M, M1 r% P% a$ U. ]0 ]
SAX : 基于事件和流的方式解析xml7 Y8 ^3 l$ q* b
sax,DOM : 这两种已经加入java的核心包,不再需要第三方宝9 Y: N% J7 U0 U, `9 v. U/ n0 Q" d
JDOM : 是DOM的一种增强版本4 r% a" x8 O! b6 \0 p: a
DOM4J : JDOM的一个子项目
( ]2 e: q2 i( E& _
: s0 A) u% Y% H; g& ~( R8 P//解析XML文件,解析XML文件的方式都大同小异 : # V/ s8 W" U6 u# h* n* V# t
9 o+ P& H% |! J# p7 s0 B 1 获得根节点3 }2 C' a$ a1 @( ^! h% n
2 遍历根节点里面的子节点
- y4 q: \3 P( O' d2 V# F0 y0 z p 3 获取子节点里面的属性5 W8 ]- C# T+ j; D
4 遍历节点里面的内部(子节点)节点
7 ]/ c/ _9 P- R _* O, N% J
$ F$ ]. w2 e' Z" d5 T* L, C3 X5 a" b
, L# t2 _; ~3 M; `; A& G
Hibernate:
1 e- e( }# \( j- p, X) z' G+ F3 G: F+ A. L" _
操作数据库7步骤 : 1 S8 w; M K! e2 {9 j& t
1 创建一个SessionFactory对象9 q3 j& w/ P& T
2 创建Session对象; J! i& e' ~5 x
3 开启事务Transaction : hibernate中,然后数据库操作,都必须是事务的,哪怕是查询; j7 w$ y5 m+ X
4 执行数据保存操作(必须提交,才会执行对应的操作方法) l% X; b0 X" X* p/ }
5 提交事务: J n" U$ I+ [# j; `
6 关闭Session! T- }% I4 s* x* u
session.close();
; R$ a+ {! P5 l& N. S0 w- d getCurrentSession();不需要手动关闭,opensession需要手动关闭; z2 w/ z# t7 h2 j; V
7 关闭SessionFactory对象
1 ]2 l/ Q9 D5 X. x% I//三种状态 : ' ^+ l L l9 Z% J# H5 e
& L+ n4 i9 A( b F; G 瞬时状态(临时状态)--->持久状态(保存到数据库)--->游离状态(保存完成后关闭session对象 (session.close()))
, k! R# I* x Q8 u, m# Y" V4 D; F e5 S* d
//三种状态的区分关键在于
* E) @5 k+ I) t! o/ R6 i/ a 1 有没有ID
. S% ]' D! f0 d; _8 f$ { 2 ID在数据库中有没有1 W$ E% @; V% D3 Y& f6 f5 h$ m
3 内存中有没有(session缓存)
' k; C5 _( v3 q p+ ]& c
* q0 o" ~. b; i! U- R Transient : |5 _) o8 j. V @: z
: H6 A4 ^$ n! U( o" o' ~- P( G) S Transient(瞬时状态) : 内存中一个实体类对象,没有ID,缓存中也没有/ K3 s" q# W0 S$ p/ U/ [
//实例化实体类的时候,就是瞬时状态4 \6 L- U" W' ~5 ~! M2 q- ?3 @
% P; {) K% q1 K" z6 w Persistent :
+ v: F# U6 A c5 I, {
4 R8 E6 \" e( j Persistent(持久状态) : 内存中有,缓存中有,数据库中有(ID)/ h- M+ i6 I. c& v' ]
//保存到数据库中,就是持久状态
+ k' Y2 W/ Q8 n) b J( l Y8 e8 F# q2 Q' r; C9 S5 G) o% J
Detached : 4 K( n2 J3 @' G0 S9 h& m
- \% }& @ @& A: ?: z- ^1 W& q( f
Detached(游离状态) : 内存有,缓存没有,数据库有,ID
( t1 B: y3 b9 @; A( R+ Z' c //关闭session对象之后(session.close()),就是游离状态
* ?0 |1 j+ m: k8 S$ i* I; D7 [5 ?, E8 p
9 o6 |" W3 W7 V- i( ? //这三种状态需要关注的问题是在该状态下,如果进行数据库操作会发生什么结果,比如改变属性的值会不会发出update语句" \1 z d7 N9 K
: C& C; f, t1 H6 G8 ? 瞬时状态 : 不会发出update语句4 F) I2 ]3 j' Y! _2 O5 G
持久状态 和 游离状态 都会发出update语句3 Q: S$ j1 h9 U0 O
7 ?6 p1 q( C! B; u1 l- ~( W
|
|