该用户从未签到
|
struts25 Y. X- s( g. |' e% f
1.了解Struts2发展史,与webwork框架关系8 R. y" {$ e b. e0 E
2.Struts2体系结构
5 R- C. A3 N- n" w C控制器:FilterDisptacher(2.0,2.1版本),StrutsPrepareAndExecuteFilter(2.1.8,2.2版本)
# t7 ~. I- Y: S( D' _ C6 R M模型:Action:用于业务处理。(可以不用必须继承父类和实现框架接口)( L( G) |! p# m
拦截器:用于封装通用业务逻辑。
, }) T4 X) `/ ?$ W- N& l3 d V视图:Result(提供了各种类型的Result组件,用于实现不同类型的响应信息)、标签+OGNL
) j$ G- | d3 Y* c: Y3.Struts2框架的配置- Q5 q! @: Y& \* V8 K
(1) struts-default.xml(jar包中自带的默认配置)7 V, S9 U Z, H
配置了一些拦截器、Result组件的定义。# h1 d3 b/ a. I. v
(2) default.properties(jar包中自带的默认配置)
7 v7 b% P6 T* Z( y! y 配置了框架的一些系统参数,例如请求扩展名、字符编码等。8 C1 S( g# o; P7 ^/ k
(3) struts.xml(开发者创建,默认在src下创建). h0 I! a8 w! F! @+ {9 |5 e* g
用于配置Action组件、自定义拦截器组件、自定义的Result组件。( a' U' Z& o/ M1 x/ B- A6 { y, {
(4) struts.properties(开发者创建,默认在src下创建)! v3 x+ J/ A$ d1 S* L: V
用于修改default.properties中的配置参数。$ A% ?9 N" J) M
4.Struts2开发入门& v4 |& M* y0 _
(1)创建Web工程,引入开发包
& P. j3 f* n7 F6 O: g R" K- L struts2-core-2.1.8.jar- B" O K8 y; W+ P) N$ L
xwork-core-2.1.6.jar
0 ~( L" D3 r! A( |# A" k( f freemarker-2.3.15.jar
. \. P/ w3 q$ { E! W ognl-2.7.3.jar
; q4 @; q- l) t commons-fileupload-1.2.1.jar
1 a$ y3 G1 ?! S (2)配置控制器,并添加struts.xml配置文件$ F, c% K5 X9 x1 Y
(3)根据JSP请求编写Action组件" V2 I, e; ~* t+ Q- ?/ i
(4)编写struts.xml配置% f. M8 Z5 p. g& W0 p" a' p" H
5.Struts2特点9 o! D# i; D$ D8 [9 h2 m# l
(1)Action摆脱了对框架API依赖,也摆脱了对ServletAPI" K2 J( s) r) Y; y$ R; m0 Q! V
(2)Action可测性增强
; T9 Y' {1 U$ Q7 v& N2 f) A (3)提供了各种类型的Result,可以完成各种形式的响应
+ i/ c, [! p/ g3 ]) C (4)易于扩展和整合其他技术6 l: j/ a3 z; `: w, |
(5)提供了拦截器和拦截器栈机制
. t \# E5 s2 }: \8 } ]4 M% Y (6)Struts1中的Action使用了单例,Struts2是一个请求一个Action对象$ B7 L8 S0 @! c3 f& M
6.如何使用Session、Request、Application等对象& d4 Y' X9 k- v
(1)Struts2对原有session、request、application做了封装,可以通过Map结构使用。使用方式如下! Y" U" d# K- z
Map session = ActionContext.getContext().getSession();/ P8 o! m4 C }9 d; I L
Map application = ActionContext.getContext().getApplication();
' K& ^' u8 l1 T4 t! | Map request = (Map)ActionContext.getContext().get("request");
2 l$ N( Q+ [+ |! Q- W& Z (2)封装原理
J8 f2 ^8 X1 B4 \& V6 |3 O public class SessionMap extends AbstractMap{ h2 f. Q$ O. |8 c
HttpSession session;
0 ]- w8 }" Z7 c, K public SessionMap(HttpSession session){
8 {5 b4 S: C) P& g this.session = session; I+ [2 U: t2 V! y
}
8 F2 r- q+ m0 l% U% D( ~* c8 y $ @4 F6 t& ?: d- V7 P. Z
public void put(Object key,Object value){. b! T; {* b# x; ?
session.setAttribute(key.toString,value);. N6 G$ r9 Q8 C: j* ?" Q
} Q5 ^+ L7 y0 [7 ^
, V1 E$ D, R5 L! J! n; C2 a/ e
public Object get(Object key){
5 l2 Q/ \1 o& }; t1 M' G8 | return session.getAttribute(key.toString());
; C- b7 T4 K2 U$ w }+ P& K! k1 K3 t& Y
}
H- b8 P% a4 |+ G ) W+ q" e+ o. V9 y) [( l: y
(3)如果需要使用原有Servlet API类型,可以通过ServletActionContext获取
7 _2 [! g0 }! U
) q# b. A& [) n% D3 a 7.Action相关配置( y4 V/ k+ t6 {7 Q
(1)<package>元素的namespace属性,命名空间,默认值为/5 | E$ h; |. a9 s/ T# a
对应请求是/工程/namespace/请求名.action
# ^" D/ |6 H/ z8 ]0 d9 d# D7 E (2)<action>元素的method属性,业务方法名,默认execute, [/ U' `3 U8 U- q% O
可以指定Action方法名当做业务方法。; O, n) v# l, ]: t) I( e
(3)<param>元素
% i) F; W* P, c$ S/ m 可以为父元素对象指定属性值。
' y" g6 g2 X; E/ z2 c8 d" I (4)通配符*的使用
g. ?" [8 l! l 在<action>元素的name属性中可以使用*,*表示任意字符. I U+ y! q1 A- v- y B9 _
在<action>元素的其他属性中可以使用{1}、{2}等引用通配符代表的值0 U7 h: l! `( B9 k6 X
8.ValueStack作用及结构5 H. Z5 j/ ^+ X" P+ R2 V/ S8 X
ValueStack存储了和请求处理相关的数据。包括session、request、action等。! X; S. Y( y9 `6 A7 [+ C
ValueStack包含root区和context区
/ o$ {" I' C4 ~3 O2 a root区类型为CompoundRoot继承了ArrayList(栈结构),存储于请求对应的Action对象。5 i' c9 @/ X4 _# s
context区类型为Map,用于存储session、request、appliation、action、parameters等变量信息.
2 A* |1 V' K; d( m! P$ d 9.ValueStack与OGNL关系
0 B4 r( i0 A b9 ` E OGNL:Object Graphic Navigation Language,对象图导航语言。
+ o+ ~6 \4 ]9 {8 @1 m3 I Struts2使用OGNL访问ValueStack数据,即对属性值设置和获取。
" a6 Q' R, y- @: c OGNL访问ValueStack数据的方法如下:
) V7 s' s/ {% }# |" } 访问root区属性:表达式为"属性名"
b5 q: v: T; p- w/ ]! C! M 访问context区变量:表达式为"#key",例如"#session.user"/ N7 n: q8 O. Y! f `& S, ]
10.Struts2提供了标签+OGNL表达式,用于访问ValueStack数据
7 m5 {. S/ J4 k' J' J/ W , ?- }2 \: D/ \1 s8 I9 B7 S ^! B" L
) ^) o3 W, x2 |3 Q9 v0 e( \
|
|