该用户从未签到
|
struts2* H" n0 ?& [$ H8 Q: |, |
1.了解Struts2发展史,与webwork框架关系
# _( h7 @/ E1 S, G/ ~1 J& t2.Struts2体系结构
* ~! ^% t5 T# `& m. Q C控制器:FilterDisptacher(2.0,2.1版本),StrutsPrepareAndExecuteFilter(2.1.8,2.2版本)% l' c- U; T8 O9 k) i3 H8 m% q$ |: D
M模型:Action:用于业务处理。(可以不用必须继承父类和实现框架接口). A) {) k5 M- Z8 w# O
拦截器:用于封装通用业务逻辑。
1 p. F7 z' d" h- O V视图:Result(提供了各种类型的Result组件,用于实现不同类型的响应信息)、标签+OGNL
( P/ `: @3 P9 X* o+ z) n; I3.Struts2框架的配置
, `) T; ^0 y9 g, ~( V (1) struts-default.xml(jar包中自带的默认配置)
6 r6 W0 y3 `8 u 配置了一些拦截器、Result组件的定义。1 [& C" m y4 K) H9 w
(2) default.properties(jar包中自带的默认配置)$ A% Z- w6 s) R7 Q, J
配置了框架的一些系统参数,例如请求扩展名、字符编码等。/ B4 d1 W2 b7 o
(3) struts.xml(开发者创建,默认在src下创建)
1 L! @! y( V2 c9 q2 a, w 用于配置Action组件、自定义拦截器组件、自定义的Result组件。0 h1 o9 d% u/ a, a
(4) struts.properties(开发者创建,默认在src下创建). n* i: {7 p5 w8 u8 w6 V( D
用于修改default.properties中的配置参数。
; L* N7 f- B& W' s7 e: {4.Struts2开发入门
9 d$ @) w8 K* G8 T& n) f) Y; a (1)创建Web工程,引入开发包
% b- g/ ^9 f5 |, a C n struts2-core-2.1.8.jar
: K4 y- T$ b( q t3 B' } xwork-core-2.1.6.jar! k/ p+ ^* G9 z5 f# G4 P/ I
freemarker-2.3.15.jar
" c; J3 P$ x0 Q ognl-2.7.3.jar
9 @& E) K- b: c; R7 n; o Z6 s commons-fileupload-1.2.1.jar0 k7 l# @$ K7 l) {6 `/ n5 M
(2)配置控制器,并添加struts.xml配置文件
. _% S l- O( I" c: { (3)根据JSP请求编写Action组件) d+ ^' W2 h- c/ W
(4)编写struts.xml配置
9 @ d: ?- Y/ u; @. s* O; C5.Struts2特点3 j" H, k- t2 D4 O% \ P
(1)Action摆脱了对框架API依赖,也摆脱了对ServletAPI, ~+ ?: H& t2 @# y; b5 [
(2)Action可测性增强
2 W2 U& O* B0 E) `/ V (3)提供了各种类型的Result,可以完成各种形式的响应
7 c9 R6 w4 N" b" W2 L5 E- n (4)易于扩展和整合其他技术2 t- y8 p" N; P- W6 J
(5)提供了拦截器和拦截器栈机制1 ]/ M7 M# `% Q! A" I' a5 B
(6)Struts1中的Action使用了单例,Struts2是一个请求一个Action对象9 K. {, a$ p; i( J! M- w
6.如何使用Session、Request、Application等对象
5 J) k+ M& F Y" c0 f% | i0 U9 d" A (1)Struts2对原有session、request、application做了封装,可以通过Map结构使用。使用方式如下
. }7 n. ^5 ?* M8 R8 F; o H7 x! P Map session = ActionContext.getContext().getSession();
^& Y! P; K- R Map application = ActionContext.getContext().getApplication();9 [7 h0 _8 ?+ E2 H& C- N. L$ E, Y
Map request = (Map)ActionContext.getContext().get("request");* X! S( G$ v x' U9 A
(2)封装原理+ e% y# C& ^/ s1 G3 d1 A
public class SessionMap extends AbstractMap{# f! c# @2 {% Y9 y* D! s$ k/ Q
HttpSession session;
% g3 L0 I2 F$ Y public SessionMap(HttpSession session){
t. X/ q1 g( W' n: A this.session = session;
1 n! w9 P' J1 _5 [" S! c/ a- V2 L2 _ }
4 {% g) A! C* v2 K- q$ r4 K
% `4 o5 |6 C* M, O; S# n public void put(Object key,Object value){
4 g* E, S- d* q* l% u9 E( ]- N9 s session.setAttribute(key.toString,value);% m I! ~1 ^5 |1 t
}
: b# k( [7 W3 y) o# f {8 X , S( S1 p# B K& P5 Q- M, j
public Object get(Object key){: M7 z8 t2 ]' F0 g5 n5 G- n
return session.getAttribute(key.toString());- u& x$ v" u; }
}
( i K6 e& v! g6 ~( w9 H& \: j9 D+ Z }; S: k$ n9 X+ b8 }1 H' {
/ w7 c, m2 `+ n, K (3)如果需要使用原有Servlet API类型,可以通过ServletActionContext获取
" X1 C6 e4 O8 A y# m- G+ e
1 b% }: ?' P/ b5 m& p 7.Action相关配置
3 j6 G) e+ X- d R4 |+ ] (1)<package>元素的namespace属性,命名空间,默认值为/. k5 d; ]$ X4 z' s
对应请求是/工程/namespace/请求名.action4 y) r E0 q6 r1 a1 _8 s, X
(2)<action>元素的method属性,业务方法名,默认execute/ l, U% _) [8 z8 D" H! b1 w2 s
可以指定Action方法名当做业务方法。
$ b6 t+ l1 D2 N8 | F2 n (3)<param>元素: e" V1 m& J# J" b3 T
可以为父元素对象指定属性值。
q+ v% b$ }- M! o5 o5 n/ n (4)通配符*的使用
, j+ ?. o7 T) d! j* F 在<action>元素的name属性中可以使用*,*表示任意字符
& d! Z. m( O* I& y3 G* K 在<action>元素的其他属性中可以使用{1}、{2}等引用通配符代表的值: `- E6 H# R- _/ [* e# q
8.ValueStack作用及结构
. s. S% y5 s2 Y/ I+ u ValueStack存储了和请求处理相关的数据。包括session、request、action等。
8 Z, ?5 w! A$ c" ]1 o) f5 }& Q ValueStack包含root区和context区
" u2 ` @1 v0 S9 R root区类型为CompoundRoot继承了ArrayList(栈结构),存储于请求对应的Action对象。8 t- e# Z6 p4 N0 E. K; k
context区类型为Map,用于存储session、request、appliation、action、parameters等变量信息.
, X2 [, t7 b) J3 G 9.ValueStack与OGNL关系
F, H7 C6 v2 }/ z# d" g OGNL:Object Graphic Navigation Language,对象图导航语言。
' {- b4 b' q- d( D4 ^* L t Struts2使用OGNL访问ValueStack数据,即对属性值设置和获取。& [4 @, y- |- {% J! l0 |7 r
OGNL访问ValueStack数据的方法如下:7 z% H" s% w& b. i6 H- [" w! A2 n
访问root区属性:表达式为"属性名": D# Z. A0 I9 k# r4 A @9 O; K
访问context区变量:表达式为"#key",例如"#session.user"( |# E6 X. w% s8 \
10.Struts2提供了标签+OGNL表达式,用于访问ValueStack数据
6 W5 ?# u2 R1 Q8 S1 i/ k1 p& a : F7 \8 j/ O# c
9 v% \; [: J- D: x) f |
|