|
该用户从未签到
|
struts2* f$ H* k; d7 G0 W B8 s
1.了解Struts2发展史,与webwork框架关系
- L7 J' R& H2 Y; x7 m$ \2.Struts2体系结构$ V3 y9 U& {8 d+ ?1 ` `
C控制器:FilterDisptacher(2.0,2.1版本),StrutsPrepareAndExecuteFilter(2.1.8,2.2版本)
/ E1 E: ~: z7 o8 _9 c' e$ s M模型:Action:用于业务处理。(可以不用必须继承父类和实现框架接口)
; U x: @8 H/ a+ s. n 拦截器:用于封装通用业务逻辑。
' l B o6 ^9 E8 q, ^: s7 ~3 ? V视图:Result(提供了各种类型的Result组件,用于实现不同类型的响应信息)、标签+OGNL6 D/ {+ c) _: _! C2 G' D
3.Struts2框架的配置; }: U2 ?$ {$ K f
(1) struts-default.xml(jar包中自带的默认配置)
) p# d( v& L9 n6 |6 m4 D 配置了一些拦截器、Result组件的定义。
' I1 l5 v) F p. Z (2) default.properties(jar包中自带的默认配置)
4 H" [- k$ u% ~ 配置了框架的一些系统参数,例如请求扩展名、字符编码等。1 x1 }9 F4 Y4 p! _
(3) struts.xml(开发者创建,默认在src下创建). J6 G0 V0 l; }
用于配置Action组件、自定义拦截器组件、自定义的Result组件。+ D" |2 {& q: _# }$ E
(4) struts.properties(开发者创建,默认在src下创建)
- h- k1 }% m: C2 N3 B 用于修改default.properties中的配置参数。* j5 R- d2 f1 A9 s
4.Struts2开发入门
$ I% b1 S: Q8 }$ L: s- G (1)创建Web工程,引入开发包: ~+ h& U; n; {3 x& b* b
struts2-core-2.1.8.jar7 ~' R% L$ w3 D0 W6 d9 |
xwork-core-2.1.6.jar
% H2 M+ X, } }" C' \1 W& P9 c freemarker-2.3.15.jar. U3 ~+ v+ m# I0 O4 a
ognl-2.7.3.jar; x% R1 ^- m* v
commons-fileupload-1.2.1.jar
7 Y) n" T' l3 }3 f h! Z (2)配置控制器,并添加struts.xml配置文件
% P* g2 X# ^. K' k7 |; ] (3)根据JSP请求编写Action组件
$ X+ V* L, `: z (4)编写struts.xml配置 g) W; e5 {% j9 \3 g3 c/ { Z
5.Struts2特点. o: ^" m! c' {, |8 {6 _( G
(1)Action摆脱了对框架API依赖,也摆脱了对ServletAPI
$ R: ?! t, g) D4 k) c (2)Action可测性增强0 ?" U7 `5 x1 \: Z1 T
(3)提供了各种类型的Result,可以完成各种形式的响应
( B! V1 m6 v) K# |' g/ A (4)易于扩展和整合其他技术" Z, y" `! ]" @4 N( O5 X
(5)提供了拦截器和拦截器栈机制0 D- b1 M- W# [7 ]0 u- k
(6)Struts1中的Action使用了单例,Struts2是一个请求一个Action对象: F6 b7 p, N5 |% K
6.如何使用Session、Request、Application等对象" s% z; _; X- ]1 u4 @. p, U" D
(1)Struts2对原有session、request、application做了封装,可以通过Map结构使用。使用方式如下
) D6 p( x: K3 n0 Q0 F+ j Map session = ActionContext.getContext().getSession();+ |5 E4 ~& v5 i$ r' L! s
Map application = ActionContext.getContext().getApplication();
/ q. K' O& G% K" m$ n( R Map request = (Map)ActionContext.getContext().get("request");( d' w( \/ I/ r
(2)封装原理6 }2 J( s u" [ P; }, {0 B; w
public class SessionMap extends AbstractMap{, V2 X- f+ b/ o% M7 `
HttpSession session;% W0 b3 |% }" {' n+ h
public SessionMap(HttpSession session){" o. @2 A2 `$ M
this.session = session;
- G2 \/ Y K9 I M: P! O( ?# | }
& y6 D6 z, O: L9 n& o7 @ # ] F+ S) S& T% g" f- |. A) ^
public void put(Object key,Object value){7 M. {# O; M( i4 Q& J
session.setAttribute(key.toString,value);. m6 l+ ~* `* e& P# s% f( N
}
" U' }# O& O/ k 2 P: j3 R1 Z3 p+ R
public Object get(Object key){$ u; w( u$ i. k0 x( N; c
return session.getAttribute(key.toString());
* {/ q2 `" J" c1 h$ t }, ^6 R7 j2 m) `4 k4 s, s) V: I
}
. b! O+ p, `/ Q6 Q # |. i/ y5 l1 d, b
(3)如果需要使用原有Servlet API类型,可以通过ServletActionContext获取
: ~9 r% g, T4 S3 F" z1 f$ M3 ~) w
* N2 p [4 u! h5 L$ S$ z 7.Action相关配置
# ~6 X1 H. E \ (1)<package>元素的namespace属性,命名空间,默认值为/
( ~7 y! C. u! z1 ^0 l* l: b 对应请求是/工程/namespace/请求名.action
2 |$ V8 {1 P3 c (2)<action>元素的method属性,业务方法名,默认execute$ ~; X4 j; N0 }4 g
可以指定Action方法名当做业务方法。5 h; q9 ^5 b& L$ p
(3)<param>元素
G: m' U. Q1 h, n ^. t- j# X5 ] 可以为父元素对象指定属性值。7 Q7 e$ z8 @" R" A: W' u
(4)通配符*的使用3 c v" o/ q/ q' b
在<action>元素的name属性中可以使用*,*表示任意字符
+ s; R( l6 o; Q 在<action>元素的其他属性中可以使用{1}、{2}等引用通配符代表的值7 j8 L& E8 L, J8 H3 c! J. W$ ]3 f! e
8.ValueStack作用及结构2 b3 |: j. W+ A$ B
ValueStack存储了和请求处理相关的数据。包括session、request、action等。
; o6 G2 L! B- b9 S4 N5 L ValueStack包含root区和context区
: t# M- Z% Z8 X1 y' U$ q. B root区类型为CompoundRoot继承了ArrayList(栈结构),存储于请求对应的Action对象。
( e- m5 j8 ^! v: K4 W, a& Z! u' ] context区类型为Map,用于存储session、request、appliation、action、parameters等变量信息.
+ U8 o4 R) c8 Q7 U/ u# r4 ] 9.ValueStack与OGNL关系
. i5 p) f# ]5 R6 ?! P OGNL:Object Graphic Navigation Language,对象图导航语言。
* L( g6 c- A" J Struts2使用OGNL访问ValueStack数据,即对属性值设置和获取。
2 O* V( [+ G% b$ c, q( a5 V OGNL访问ValueStack数据的方法如下:
7 u: E: s* ^8 E 访问root区属性:表达式为"属性名"7 Q7 l- j4 g) ?! a0 Z
访问context区变量:表达式为"#key",例如"#session.user"
# _: P5 b/ r- @ 10.Struts2提供了标签+OGNL表达式,用于访问ValueStack数据1 { I3 } R' D& |( O) z
3 S6 u. a& Y6 k# o$ F8 S
5 s9 u& ?9 p& y* Q |
|