该用户从未签到
|
; p! _+ D/ Z% h6 c/ j/ J. q, O! k
% @/ O, @3 U; b6 Q- tSSH分别是指:struts,spring,hibernate
1 @2 F8 Y. z5 Y- k$ {3 |1 l1 [
{' R0 s4 ` ~, @& v: m3 J# B下面是SSH三部分简单主要的知识点:) j! s- t) b2 @4 J% I/ o: ]
0 f' k% R( w$ i0 ?2 j0 ZSturts:
" L A" J/ N3 Q# \( `% F8 T& u' ]/ w* M2 t5 Y! K
execute :
& L; \* D' @9 ~' L3 R execute()方法相当于main()方法,有三种创建模式 : + F, @6 T9 P" u6 ~# U
! W7 ?) h& C* Y" t
1 自定义类,类里面不能写main()方法,写个execute方法,返回值为一个字符串,和struts.xml里面的<result name="字符串">对应就行
! ?' g0 s: s5 j: ~ public String execute() {
- T1 N& O% C! O6 q1 L7 B& u return "success";2 M" u! v! {- h
}
0 Z8 c& T4 ^$ [1 |7 P4 V$ z$ l6 s0 a; n# U6 s
2 实现Action这个接口,并实现execute方法,这里的返回值可以是action接口里面的预定义的常量,当然,如果struts.xml里面的<result name="字符串">这里设置不是预定义里面的,这里就不能写常量,因为这几个常量是底层实现了的,别的还是要自己写字符串,和xml对应上- R# y I' y9 ?, G2 V& I+ ^0 `
public String execute() throws Exception {
1 C( G9 V/ @ x+ s, z' i return SUCCESS;//写成 SUCCESS常量也可以& }# Z9 q8 s. [' O7 b* N$ S
}2 o. U# F4 A W! f$ b
- v* ]+ t5 o5 V! z( S' z- @ 3 推荐 : 继承ActionSupport这个类,并覆写execute方法,和第一种的写法一样,但是推荐使用这个,因为这个类写了很多方法,方便我们使用
3 E3 a$ V4 c$ h: M2 n( {8 f public String execute() throws Exception {* C" ]7 U, r' S: ^1 n
return "success";) P- s0 r! E5 n1 U! \% o6 y" _/ P; `
}! v" S$ ^$ j P' a
3 C! E" Y0 e4 z9 ^! h& c# V
//充血 贫血 模型 :0 z8 x; N& ]8 T
把增删改查的方法写在实体类里面,就是充血模型
& L1 D- R& W4 p9 ^ 不写在这里面,就是贫血模型
; x5 V S- s. i3 R! Q pojo:就是一个实体类& F! `3 I) L+ O+ K( h. d# n3 t% k
) E% Y& X* n9 F" x$ @ U% S$ j6 b; `% W/ P) a
% \& B* o# K1 H. g" l! F! }5 _# v/ X) L2 |
//拦截器调用 : 调用拦截器
/ X0 A. Z4 N$ W" E9 S8 K
/ g6 I9 p! X: l' s2 h0 v 先从最近的模块找 模块(包:com.jaovo...xx).xml ---> struts.xml ---> default.xml ---> web.xml;2 G. O# G6 V3 \, `
一直到找到,都找不到就报错$ n. Z/ ~% j8 k
. t; y. J# H" T5 K3 q; Q//后台设置的东西,在Action中设置request和httprequest的区别 * E# @8 i7 w( Y7 V' V# A O
3 ~/ N, I4 I4 m1 a3 d. Y/ b
<!--
3 T# ?3 i9 P, y$ |% k 后台设置的东西,在Action中设置request和httprequest的区别1 N+ a% W: L. ~% e, B; f
在前台通过request,session,aplication可以去得到
" g( D' C9 w$ ] 在后台设置的request全部复制到了HttpRequest中去' {, O' _/ F: M- I; ~
jsp页面中的是HttpRequest(request), O, R: j1 ?' ^' P' p! m
-->$ Q7 m3 _2 I% r7 _7 U4 ^% q9 L# w
<s:property value="#request.request_"/> | <%=request.getAttribute("request_") %>//前者是获得Action里面的 后者是获得request里面的(原生)
r$ F7 \7 o6 W+ x3 O) q5 s/ e* S+ p
* K; Z, y$ G3 i: }- q* k4 b) ]1 t- X/ Q4 o9 K1 g' s' ^3 \1 }: w
request : //每次请求,都会创建一个新的request对象
. ~! g3 P* F; b, h6 O' c# O2 [0 u& D9 O I) U: c# X5 W2 `
session : //只要在同一个浏览器,就只创建一次,作用域是整个浏览器,关闭浏览器,session也随之消失,如果没有,就会创建,如果有,就不会创建7 P. U1 N4 A" t4 {2 g
2 v" |; J0 n0 M* H3 u
application : //只创建一次,可以跨浏览器使用,如果没有就会创建,如果有就不会创建
% ]7 u+ H0 U* G3 F* C" B7 a0 d2 q+ g! q$ f' K# Q2 p% x
/ D/ ~4 U3 Y1 e) v! kSpring:
( Z! i. g6 ]; H
* ?# j( Y3 E5 A6 f. Y0 p
; X( b* k* Z) N( P( i% A& h 1 控制反转 IOC : 控制类的实例化,以及他们的调用关系5 e8 B( U7 K5 i: ~1 j
2 动态代理 AOP : 主要是事务机制的控制
4 @6 Z0 a# y* Q6 ^: Q. K0 M' k; N: e- {- Z/ t
四种方式读取属性 四种读取属性的方式:" u9 y/ a+ I7 R2 u3 `
1 DOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取$ M4 e) b4 u1 H0 N
2 JDOM : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取5 K. O8 n* K/ F) X* v
3 DOM4J : //把所有属性都弄到文档对象中,全部读取 一个报错,全部不读取4 f% h+ y% j+ Y2 }/ ~3 z' Q! B
4 SAX : //用IO流,一个一个读取,读取一个,放进去一个 哪里报错,报错处往后就不读取,前面读取
+ c0 {- a9 y4 s- o x9 N1 Y7 O7 j- P4 W Q2 I1 I
DOM : == Document Object Model : 文档对象模型6 \, V. [3 U! }
SAX : 基于事件和流的方式解析xml. m! a- l1 ~9 [
sax,DOM : 这两种已经加入java的核心包,不再需要第三方宝9 e, U1 d* R0 F5 v3 c( R
JDOM : 是DOM的一种增强版本
6 n; C& Y7 @3 [! G DOM4J : JDOM的一个子项目2 c3 s4 q4 ^& S: v& c9 @+ O
! }- ^4 ~6 v4 P//解析XML文件,解析XML文件的方式都大同小异 : $ u v& }7 }. o; j+ P" @- ]7 j3 o
- U& ?6 H: u) L2 [ W: ~/ J: `6 ~1 P, L
1 获得根节点
. a6 `% k5 T$ X2 A2 R) {6 j 2 遍历根节点里面的子节点) T- u; }& Z! [ K0 o3 j
3 获取子节点里面的属性; i+ ]) j$ Z" W4 s- N' p
4 遍历节点里面的内部(子节点)节点
* o9 Q% j$ ~7 Y# p1 x
) _( b8 H7 z4 S1 Q! S) c
/ J( Q0 l, r' N6 {6 X. p1 L
: n' p6 N1 H; G2 s! Y3 o- @: cHibernate:
3 ]. Y" }5 z: V( ~ T8 f% @1 O
. v W- Y' Q& @' w/ [操作数据库7步骤 : & O7 W. c& |1 Z/ M4 K
1 创建一个SessionFactory对象
6 L) d) _3 k) }& |7 F 2 创建Session对象" [, X" @8 N; `" P% U: o" r
3 开启事务Transaction : hibernate中,然后数据库操作,都必须是事务的,哪怕是查询, ^5 o% f0 L' e% ?: T( R3 ?/ g
4 执行数据保存操作(必须提交,才会执行对应的操作方法)
, n; h. ^0 v# W! P+ g2 f3 S2 a 5 提交事务/ i4 W. |9 J+ r& Y
6 关闭Session
8 J5 E3 q7 Z5 {4 \* n; W# H" t$ \% M session.close();
8 M# }% _! k/ ]) Q( M7 n$ }- ?7 J getCurrentSession();不需要手动关闭,opensession需要手动关闭
" I0 B' |+ z1 X; o1 o+ O 7 关闭SessionFactory对象
6 b4 J ]( N% z7 _//三种状态 :
; l% T, x9 C1 L0 s
9 a1 K$ C ?0 U/ @5 T2 ^3 k+ F 瞬时状态(临时状态)--->持久状态(保存到数据库)--->游离状态(保存完成后关闭session对象 (session.close()))
; \, F$ u- o( `4 h& r2 B
l0 ]; v2 t2 G" A //三种状态的区分关键在于
5 a4 _6 i5 n. U7 d4 S 1 有没有ID
5 A5 a( L, z( w p+ N 2 ID在数据库中有没有( n. `6 ?$ H7 n7 ?
3 内存中有没有(session缓存)
1 X- \& ?) _- c2 ?( _0 z% T0 O( i) N. M7 ]
Transient :
! ], ]8 n+ u0 ^& r2 a4 _0 X, e* g$ o1 Q# a7 b* `0 ^
Transient(瞬时状态) : 内存中一个实体类对象,没有ID,缓存中也没有' A4 {' p/ V& L. L8 |# u( z; w5 h: T
//实例化实体类的时候,就是瞬时状态* X% _6 `" t& z0 s1 W1 g
- \3 n8 C/ T& O" X' I" M: l
Persistent :
- q/ n4 z m0 ^/ B% _+ i0 m F1 R& G1 p# t3 X
Persistent(持久状态) : 内存中有,缓存中有,数据库中有(ID)
' u% i! ?# [* y //保存到数据库中,就是持久状态
; p. n8 _+ P! d6 o" L6 v- t; }, } r8 k4 I- h" g, s
Detached : % m5 `" q( R, H& c3 c
# ^& f- r" s9 `( m( ~ q9 D
Detached(游离状态) : 内存有,缓存没有,数据库有,ID
% D: D# L4 C0 B- F, Q //关闭session对象之后(session.close()),就是游离状态
; F2 w1 B/ B P! R: z; G- v7 O
: R% Q! [7 ]9 H; p: b" x' a# q8 J //这三种状态需要关注的问题是在该状态下,如果进行数据库操作会发生什么结果,比如改变属性的值会不会发出update语句
) \0 w/ f5 p. [; w4 Z# q, S5 k5 g
! V* U0 j7 k4 y1 R8 a1 u9 a9 N 瞬时状态 : 不会发出update语句! ]; j8 {8 m6 c# V. H
持久状态 和 游离状态 都会发出update语句
2 ?; K* \& l! J3 L) ^4 e! W
( A* ^3 `+ @) K |
|