该用户从未签到
|
struts2
Z# L' J s4 Z Y2 Q& v1.了解Struts2发展史,与webwork框架关系
* U/ |0 T9 _2 {# }2.Struts2体系结构6 ~" m. z3 [( R
C控制器:FilterDisptacher(2.0,2.1版本),StrutsPrepareAndExecuteFilter(2.1.8,2.2版本)
1 ^( Q$ C2 U: I' k/ v, u6 _ M模型:Action:用于业务处理。(可以不用必须继承父类和实现框架接口)
/ }1 X, \2 V h2 l) x" @8 e; J9 W 拦截器:用于封装通用业务逻辑。) A L! A. y/ A* W# c
V视图:Result(提供了各种类型的Result组件,用于实现不同类型的响应信息)、标签+OGNL
4 W9 w1 Q& f+ q. W4 A9 g- c3.Struts2框架的配置
8 z' W" q* x( F. f (1) struts-default.xml(jar包中自带的默认配置)
1 `" {+ r0 T: x 配置了一些拦截器、Result组件的定义。
# l$ B" F# j8 J4 U$ w (2) default.properties(jar包中自带的默认配置)
/ L8 z$ O2 r& S9 Z" X" Y& l 配置了框架的一些系统参数,例如请求扩展名、字符编码等。4 l+ t1 |7 Y( {( V* e, B/ B
(3) struts.xml(开发者创建,默认在src下创建)
, y; p8 L" T9 v6 s 用于配置Action组件、自定义拦截器组件、自定义的Result组件。, W- {5 i. v0 P' F6 H& k" N; j; n
(4) struts.properties(开发者创建,默认在src下创建). H8 B& B* a# y# d$ b' d
用于修改default.properties中的配置参数。, F. S1 e9 n2 H+ M5 i( a
4.Struts2开发入门8 v& C- d3 \* o* y0 w( A0 b+ q
(1)创建Web工程,引入开发包" `( p# k0 _6 u- C# Q$ R2 ?1 a. {
struts2-core-2.1.8.jar+ m% I, j; H; H: _
xwork-core-2.1.6.jar3 G" Q7 V* b; C5 V6 N
freemarker-2.3.15.jar* o, M, l, O `( {9 t' L; c
ognl-2.7.3.jar' R0 j, D8 T0 w# Q3 _( e1 V
commons-fileupload-1.2.1.jar
, n- B$ [/ h- c/ B9 D% W (2)配置控制器,并添加struts.xml配置文件: O' x5 u' k9 k3 `, Q* A9 ?* Z
(3)根据JSP请求编写Action组件. s7 I V5 h- r
(4)编写struts.xml配置
$ s8 m0 T. _0 v) w+ J# w" C5.Struts2特点4 _2 C4 l3 p `9 `6 f
(1)Action摆脱了对框架API依赖,也摆脱了对ServletAPI- Q* n" U/ ^! h8 o7 ~
(2)Action可测性增强/ o8 W/ L* y9 H: m% U! j; c
(3)提供了各种类型的Result,可以完成各种形式的响应
6 L. N9 t$ ]3 S% A _2 q! x (4)易于扩展和整合其他技术 o8 s6 v7 u$ j% x+ e$ P0 B
(5)提供了拦截器和拦截器栈机制
) Q* ]' u9 @) B! p$ x (6)Struts1中的Action使用了单例,Struts2是一个请求一个Action对象4 h$ A5 W+ ]; T: o5 t2 I* Y3 N
6.如何使用Session、Request、Application等对象
; J+ v/ t8 i' g (1)Struts2对原有session、request、application做了封装,可以通过Map结构使用。使用方式如下1 L+ d# y2 T! \
Map session = ActionContext.getContext().getSession();
: a- F5 s6 E- m+ v7 x* B4 h% J2 G Map application = ActionContext.getContext().getApplication();- | }5 r+ W8 l
Map request = (Map)ActionContext.getContext().get("request");
7 E: P1 y% f( Y- e& z5 J (2)封装原理9 H3 z1 r$ C( |5 ]4 I3 F+ s
public class SessionMap extends AbstractMap{
! b4 n ]& G f& X3 L1 _ HttpSession session;
, b- {2 f; F: ]; c5 _4 i3 Y public SessionMap(HttpSession session){
- a+ w8 s. b: r; |/ i' z$ p' M this.session = session;, e5 k G& W3 a0 ?
}
0 }! J# h2 E6 Q" }+ S2 M
( v3 _+ s" b1 e" |8 [ public void put(Object key,Object value){
/ L. E7 E3 p' x session.setAttribute(key.toString,value);9 I" Z# D' p( d9 R1 g
}' |& u- B+ O f# {/ _7 @* }- a C
+ I2 ]* }- N* W public Object get(Object key){' R% V. ]2 t4 |( _- D; s+ n8 l# m' i U, @
return session.getAttribute(key.toString());
7 D& A( ]1 F! h' { }
; v7 H( m8 k% Q+ u4 j7 X6 R0 @9 i# V) X }1 P* P7 P' a. O' X/ I
2 F2 U. o5 V2 Z' S9 x. h' K9 | (3)如果需要使用原有Servlet API类型,可以通过ServletActionContext获取+ ?$ I1 y Q3 Y
3 Q' \- D9 E/ H+ f1 B( A$ T
7.Action相关配置
3 s8 d, {# F' M7 j0 I8 p: x6 r (1)<package>元素的namespace属性,命名空间,默认值为/2 p5 x( T K) ^' V9 F
对应请求是/工程/namespace/请求名.action
& s3 e5 z1 p6 o" w/ |8 y (2)<action>元素的method属性,业务方法名,默认execute
. X0 T- A, i4 M Y, j 可以指定Action方法名当做业务方法。( [6 |1 G8 m- Y3 y I: Q2 s
(3)<param>元素2 N4 `# B; s q4 x; o) H0 J" q
可以为父元素对象指定属性值。
h' K% b2 t, ?) h# c# I (4)通配符*的使用
* l* R, G1 f& `) o% y% H* V 在<action>元素的name属性中可以使用*,*表示任意字符
+ K( ^+ A$ s* {4 c. R) ^% m 在<action>元素的其他属性中可以使用{1}、{2}等引用通配符代表的值
2 u- ^4 s$ o4 g' o% ?) R- w 8.ValueStack作用及结构, K0 y# \/ c. E. F) U
ValueStack存储了和请求处理相关的数据。包括session、request、action等。
+ ~& l7 C: C% c ValueStack包含root区和context区
6 t+ z: i, a, C/ v+ R4 ^6 B% k1 u/ f) S root区类型为CompoundRoot继承了ArrayList(栈结构),存储于请求对应的Action对象。( C. x0 Z7 N7 T
context区类型为Map,用于存储session、request、appliation、action、parameters等变量信息.
$ N4 ^5 j5 k Y3 N3 \) k 9.ValueStack与OGNL关系
3 ~: @6 t }( e! F3 i+ g OGNL:Object Graphic Navigation Language,对象图导航语言。& _0 D) @) `$ a, m8 _9 j) @
Struts2使用OGNL访问ValueStack数据,即对属性值设置和获取。
0 \9 a9 \0 S; @! o) | OGNL访问ValueStack数据的方法如下:3 E* @' m- x# a" h
访问root区属性:表达式为"属性名"& Q5 e# ?! \4 A9 e0 A
访问context区变量:表达式为"#key",例如"#session.user"- M6 j2 N6 d2 K% D. o6 a) P, B: S
10.Struts2提供了标签+OGNL表达式,用于访问ValueStack数据2 U6 A. R# k9 D" u- ^! T: ~
- x& f; S" e' B. A
: j1 o9 `7 a4 R; V, V3 `9 I |
|