该用户从未签到
|
struts2% E; d4 S/ A9 ?: A2 \
1.了解Struts2发展史,与webwork框架关系1 V( U4 @2 ~3 \4 }) L& \
2.Struts2体系结构
' J. v' m. h9 @$ W+ Y+ S9 l C控制器:FilterDisptacher(2.0,2.1版本),StrutsPrepareAndExecuteFilter(2.1.8,2.2版本) t5 q7 y, |$ e6 d1 h" F" g. v, [
M模型:Action:用于业务处理。(可以不用必须继承父类和实现框架接口)/ v" O$ c& j; b( a% w, u. `
拦截器:用于封装通用业务逻辑。8 v2 H9 x ]$ V0 c7 J9 I. `
V视图:Result(提供了各种类型的Result组件,用于实现不同类型的响应信息)、标签+OGNL
- M! Q2 `2 G/ q1 d {, J3 X3.Struts2框架的配置
Z9 i: ?) l1 I# Z (1) struts-default.xml(jar包中自带的默认配置)
$ Z4 A9 a) n# A8 p9 g3 c8 [ 配置了一些拦截器、Result组件的定义。
3 ]( w! F5 B8 s; f% d* Q* v (2) default.properties(jar包中自带的默认配置)% {! j" K5 o& ], r( v
配置了框架的一些系统参数,例如请求扩展名、字符编码等。
( I! L) b6 S! \7 Y7 z (3) struts.xml(开发者创建,默认在src下创建)
6 M% L4 D& y) K5 D% i* k# T( m 用于配置Action组件、自定义拦截器组件、自定义的Result组件。
7 e/ K7 F1 G& j3 E: F (4) struts.properties(开发者创建,默认在src下创建)
3 o1 A+ ?6 C4 I9 d8 w8 G# p 用于修改default.properties中的配置参数。# X' o2 o6 f/ B, a" v& L( K& w
4.Struts2开发入门% G2 ^: k. e/ _4 G: `
(1)创建Web工程,引入开发包
r8 k+ E' V4 L( { struts2-core-2.1.8.jar
, d3 P* h' F0 } xwork-core-2.1.6.jar% u. V0 \6 A* z& ^2 ?/ G, `
freemarker-2.3.15.jar2 U8 F1 E2 x1 P* i9 |4 x8 W
ognl-2.7.3.jar3 T$ I6 g( ~; Y2 }: m
commons-fileupload-1.2.1.jar! k7 S! v3 B1 ]3 V
(2)配置控制器,并添加struts.xml配置文件# {, r- l* v4 {% s+ K5 \5 B9 q4 i/ z
(3)根据JSP请求编写Action组件
/ h# \, U( P( j+ D# U. d( j (4)编写struts.xml配置
5 P5 L. g* \4 x( r% l& ?. n: g1 k5.Struts2特点( m0 ^+ ?, I# C) ?
(1)Action摆脱了对框架API依赖,也摆脱了对ServletAPI
+ t1 e, J$ Z* ^ (2)Action可测性增强
- t. N+ N% R" k J6 G5 M (3)提供了各种类型的Result,可以完成各种形式的响应& | U9 M# w3 {! f) E" `% P* b
(4)易于扩展和整合其他技术
/ I3 } c% t! M+ s6 K# K (5)提供了拦截器和拦截器栈机制
- f6 x8 n6 _/ {0 ] k* ^4 i# a) b (6)Struts1中的Action使用了单例,Struts2是一个请求一个Action对象% E4 |; K9 q, W0 K
6.如何使用Session、Request、Application等对象6 i2 f4 U. @( x3 G& B: A5 v
(1)Struts2对原有session、request、application做了封装,可以通过Map结构使用。使用方式如下
& s/ }+ h. B3 d" w Map session = ActionContext.getContext().getSession();
, ^7 ]. H+ S2 m5 @. O! I Map application = ActionContext.getContext().getApplication();$ {8 O+ K' M$ G/ ^1 Z/ b! o. W
Map request = (Map)ActionContext.getContext().get("request");
' F, n/ t q- y' f (2)封装原理
1 \3 o9 y2 c! e' v" C public class SessionMap extends AbstractMap{
, Y( T6 S+ ]) @, t HttpSession session;
, m; C0 S; y' m; ] public SessionMap(HttpSession session){
: B" |% e% U: k- K this.session = session; d4 ~6 H- k# d; Q' ^- f
}
2 `+ a! s$ }3 _0 u. j " k1 ]) o0 U5 \2 X6 _" S, L1 ]
public void put(Object key,Object value){
. M! o& \5 w/ {; }. W2 k session.setAttribute(key.toString,value);% H# e; L ?' m, q
}, d. D6 x0 y; s0 o1 k
) z. \( ^% F3 u, Z* U public Object get(Object key){
% x2 R) ]/ c* K9 K( A g return session.getAttribute(key.toString());, L( d' o* a1 t& ~9 m9 X5 b4 u
}2 H" X+ L* D1 L% P& b# i! V
}
6 a6 e/ m5 O9 T+ ?
3 q7 c( {6 _2 H. Y1 ?! c (3)如果需要使用原有Servlet API类型,可以通过ServletActionContext获取: W3 _0 e. D: M$ ^- P8 }
( A3 \: [) t0 h2 {0 ]* d% D
7.Action相关配置# H; Y- F* N* A" L) i+ T
(1)<package>元素的namespace属性,命名空间,默认值为/
4 F: D+ U: Z! _' A- ~8 [1 R ~ 对应请求是/工程/namespace/请求名.action% k7 v; M* S1 W, y0 I8 i2 I
(2)<action>元素的method属性,业务方法名,默认execute4 ^- d1 g) p) O! {/ h
可以指定Action方法名当做业务方法。4 s) c/ }6 `7 t" W! l8 a$ Q
(3)<param>元素
7 g' ~& ]6 N- z/ y3 O+ r7 ? 可以为父元素对象指定属性值。: @1 z2 J+ m5 K% h$ J5 Z' N5 U
(4)通配符*的使用4 E9 Y" L+ c X' G$ O/ ?: H
在<action>元素的name属性中可以使用*,*表示任意字符+ V+ \- H) c6 o# x9 U! }4 c
在<action>元素的其他属性中可以使用{1}、{2}等引用通配符代表的值$ q; s" s8 i; V" x: E& p7 i3 X
8.ValueStack作用及结构- y3 \2 {, f; l: |$ }) x
ValueStack存储了和请求处理相关的数据。包括session、request、action等。6 o) N1 L, V. N4 Z5 {% |; @
ValueStack包含root区和context区
5 h. |3 D* w; w1 x4 s root区类型为CompoundRoot继承了ArrayList(栈结构),存储于请求对应的Action对象。
( M L4 A2 M3 @7 G7 O context区类型为Map,用于存储session、request、appliation、action、parameters等变量信息.
# x1 E m0 W' i6 a9 W 9.ValueStack与OGNL关系
. |! l; [) F7 C9 c2 l& L: I$ o OGNL:Object Graphic Navigation Language,对象图导航语言。
1 h2 P( f# k- A8 @ Struts2使用OGNL访问ValueStack数据,即对属性值设置和获取。
~% V3 Y" ~* [6 \4 u1 Q4 C1 t) A OGNL访问ValueStack数据的方法如下:
c" y0 F9 D2 j 访问root区属性:表达式为"属性名"
1 c& D# x# |1 W- i9 q9 N 访问context区变量:表达式为"#key",例如"#session.user"
% h+ } W. K& {0 h% z1 T 10.Struts2提供了标签+OGNL表达式,用于访问ValueStack数据7 O x% T$ G/ d8 J
7 B: s: e7 |6 V P* X$ _
$ [7 J& J; `- Y- P5 K% U |
|