|
该用户从未签到
|
struts2
7 I! W4 Z" J& X1 y0 `' \. L1.了解Struts2发展史,与webwork框架关系2 U* F* `+ y/ X3 P
2.Struts2体系结构
4 d9 V0 u, t' c0 M C控制器:FilterDisptacher(2.0,2.1版本),StrutsPrepareAndExecuteFilter(2.1.8,2.2版本)
) J4 i( h. [) l S4 a. Q* s [ M模型:Action:用于业务处理。(可以不用必须继承父类和实现框架接口)
/ e) H) F+ o! H; n2 S) D6 y2 Y! v& v5 v' { 拦截器:用于封装通用业务逻辑。
) w( U1 L* V5 o4 o V视图:Result(提供了各种类型的Result组件,用于实现不同类型的响应信息)、标签+OGNL
9 E1 A0 }0 W* n# l" B3.Struts2框架的配置% G9 M$ V% i6 Y6 H! m5 a8 [
(1) struts-default.xml(jar包中自带的默认配置)" \0 J& H1 ?, m/ t
配置了一些拦截器、Result组件的定义。3 w+ J9 K) P6 o% R5 l; y2 g A
(2) default.properties(jar包中自带的默认配置)6 l# i5 R: {' C, w! b
配置了框架的一些系统参数,例如请求扩展名、字符编码等。2 E) e+ |3 O1 ]5 P9 K: F1 [
(3) struts.xml(开发者创建,默认在src下创建). U; e- n8 V+ G- X. d: X+ ?' _
用于配置Action组件、自定义拦截器组件、自定义的Result组件。! s2 c3 S* B/ t# h$ p% _ z2 Q
(4) struts.properties(开发者创建,默认在src下创建)4 u# U3 G' ^2 a& [
用于修改default.properties中的配置参数。7 N; x5 b& g- m. _/ T5 o1 A: ~
4.Struts2开发入门
" ?% G+ ^6 U, c7 h5 ?$ A (1)创建Web工程,引入开发包
& @0 ^, A4 @' k1 [. H- X struts2-core-2.1.8.jar, c9 O4 [# v5 ~% Y
xwork-core-2.1.6.jar
1 d; x4 z% i' p" Z freemarker-2.3.15.jar) F0 H% |8 s1 K& @& a: k8 p d5 F W
ognl-2.7.3.jar' ^( }/ I3 g5 }% ^0 F* X8 y
commons-fileupload-1.2.1.jar9 L5 n1 s6 F6 r4 w$ `# W
(2)配置控制器,并添加struts.xml配置文件
# j; b' t) h% f, j O (3)根据JSP请求编写Action组件8 D/ f/ ^! Y6 e3 a* g
(4)编写struts.xml配置
7 _2 A' k9 u& u. K7 Y5.Struts2特点
. o% B, A/ O" D (1)Action摆脱了对框架API依赖,也摆脱了对ServletAPI
: S) k7 |5 ?, F3 O (2)Action可测性增强6 A; t% R$ G+ z0 r( M0 G, n
(3)提供了各种类型的Result,可以完成各种形式的响应( z" j+ J& b# s6 ^6 G8 ]% Q$ @2 t
(4)易于扩展和整合其他技术' ^3 g8 }. H/ t2 E
(5)提供了拦截器和拦截器栈机制: R5 G) ^$ r+ N. Z3 U4 M
(6)Struts1中的Action使用了单例,Struts2是一个请求一个Action对象
4 n8 J* w& h+ C( k G0 o6.如何使用Session、Request、Application等对象
0 {' L/ |( r" H1 d2 J (1)Struts2对原有session、request、application做了封装,可以通过Map结构使用。使用方式如下7 E5 ^5 ~8 H5 T' G. M( p: g
Map session = ActionContext.getContext().getSession();$ N6 `1 f4 X9 W& i7 g
Map application = ActionContext.getContext().getApplication();( a3 Z& h! {: \, J+ H
Map request = (Map)ActionContext.getContext().get("request");* t; u8 F' S5 E7 k& q6 P/ _
(2)封装原理3 y8 [6 O8 q7 M
public class SessionMap extends AbstractMap{
) @! j4 A0 [5 E H$ t HttpSession session;
% u4 O' `4 s: ? public SessionMap(HttpSession session){
' ^4 f. u) h2 p D! J this.session = session;$ A( A, R* P5 V
}
- I, C' l* w) k2 k; c- _ + f9 z% [8 m8 R/ i4 j5 X
public void put(Object key,Object value){
3 S! A7 N6 r' t session.setAttribute(key.toString,value);
9 A' H6 U* |" ` }
# v$ d$ g2 L% b: u' b $ F4 L& j; ~# ]" l3 E8 @+ L9 V' P" M
public Object get(Object key){. E6 D7 R9 [! h: H+ m8 l
return session.getAttribute(key.toString());
" G0 j" M0 v& E$ L" h5 @ }. S8 ]& y1 _* I
}
/ @& U1 a5 G6 h! _
+ ~0 ]' d& p. m$ ] (3)如果需要使用原有Servlet API类型,可以通过ServletActionContext获取4 ~% f# p( u% h5 r
: Z% d* X1 b1 m* T8 k
7.Action相关配置
4 a; ?8 y' A# |! Q (1)<package>元素的namespace属性,命名空间,默认值为/+ L# _+ U& `& w4 W1 a) @3 c& n
对应请求是/工程/namespace/请求名.action9 G+ [6 z; h y( F9 |
(2)<action>元素的method属性,业务方法名,默认execute
( H$ @1 Q8 c/ z3 i' x 可以指定Action方法名当做业务方法。
" Y3 [. }! m6 J0 X$ O (3)<param>元素
. I* L; l- c4 } 可以为父元素对象指定属性值。6 }) |' b& d/ E; L Q( q" [+ _$ G, R0 c
(4)通配符*的使用
; ~4 i% ^8 }! `4 H 在<action>元素的name属性中可以使用*,*表示任意字符
1 P5 s L; C* c8 n 在<action>元素的其他属性中可以使用{1}、{2}等引用通配符代表的值
3 Q! U6 _) r4 b9 L0 l 8.ValueStack作用及结构
3 f2 T+ V& P! M% `+ f' ` ValueStack存储了和请求处理相关的数据。包括session、request、action等。
5 V' ?3 Z; W3 Y$ Q) U- N) o4 q ValueStack包含root区和context区6 ^2 J' `: ^) Y. }% ?- J
root区类型为CompoundRoot继承了ArrayList(栈结构),存储于请求对应的Action对象。$ @+ M( _& B$ p( l
context区类型为Map,用于存储session、request、appliation、action、parameters等变量信息.
8 f# }! V) o7 I, }7 `" s0 H9 c 9.ValueStack与OGNL关系
, O& A) f. x# u% T OGNL:Object Graphic Navigation Language,对象图导航语言。
% j, s! E9 b, l# O& L$ U- { Struts2使用OGNL访问ValueStack数据,即对属性值设置和获取。
* F9 U9 I; [$ C) C OGNL访问ValueStack数据的方法如下:
) P2 I4 |6 W7 v 访问root区属性:表达式为"属性名"
& G; H4 D {- B: [8 V# u 访问context区变量:表达式为"#key",例如"#session.user"9 Q% r1 {7 F" Y o3 N" U* V
10.Struts2提供了标签+OGNL表达式,用于访问ValueStack数据
k) ^! H6 S" V- V8 o
8 l5 T; M0 y5 z1 u# s4 J0 M; p0 R! ]& g2 a
|
|