该用户从未签到
|
struts2
/ d* A# i$ n/ P# ]1.了解Struts2发展史,与webwork框架关系% o7 I7 V" g# i9 N
2.Struts2体系结构
# l. T3 W' ~ V6 | C控制器:FilterDisptacher(2.0,2.1版本),StrutsPrepareAndExecuteFilter(2.1.8,2.2版本)" m9 p( C) M- _1 _3 C( O0 h
M模型:Action:用于业务处理。(可以不用必须继承父类和实现框架接口)
8 S: x! m6 |. c4 ^ 拦截器:用于封装通用业务逻辑。! \3 F/ l9 @# |* S* }5 t2 y
V视图:Result(提供了各种类型的Result组件,用于实现不同类型的响应信息)、标签+OGNL% ^% P% m/ T0 |+ T8 \; w
3.Struts2框架的配置# c* o J# ~3 a
(1) struts-default.xml(jar包中自带的默认配置)/ d" ~% v" C3 O5 y
配置了一些拦截器、Result组件的定义。6 p/ h! _; J( W, [# w- C
(2) default.properties(jar包中自带的默认配置)& C* j. Y8 {" Z
配置了框架的一些系统参数,例如请求扩展名、字符编码等。
. R# U: j% ^, o- S* O5 A (3) struts.xml(开发者创建,默认在src下创建)
1 u4 C% \( k3 x7 D) _ 用于配置Action组件、自定义拦截器组件、自定义的Result组件。, G/ e; l+ o6 g' n! r
(4) struts.properties(开发者创建,默认在src下创建)
3 S9 h2 l2 F; F/ q 用于修改default.properties中的配置参数。
. x |) j B( {2 z* E( K, I4.Struts2开发入门
4 p0 w0 `4 n9 o$ D1 l (1)创建Web工程,引入开发包$ v- Z0 I4 T9 B0 z u
struts2-core-2.1.8.jar
) D- w6 T. N$ \3 L9 p; A xwork-core-2.1.6.jar
3 L3 r v5 Q( e) j9 } freemarker-2.3.15.jar6 e2 }# @; C+ \0 t, |
ognl-2.7.3.jar4 X7 q' l0 ^* i3 H; n: \
commons-fileupload-1.2.1.jar4 l' u6 \' Q5 {+ i
(2)配置控制器,并添加struts.xml配置文件
1 O- B; M& _( k9 C (3)根据JSP请求编写Action组件% @ ~6 U1 V5 I, _
(4)编写struts.xml配置
, T) `8 r# `' W$ n1 t5.Struts2特点0 h2 f7 r z' I4 e: U, D% }# Q+ u
(1)Action摆脱了对框架API依赖,也摆脱了对ServletAPI- m! ?2 n0 l# E8 ^9 {0 ~. s' M
(2)Action可测性增强2 g6 M7 D4 m, z7 {
(3)提供了各种类型的Result,可以完成各种形式的响应1 |) |! t3 f( T! s
(4)易于扩展和整合其他技术2 F# O4 f+ [$ Q8 M: P
(5)提供了拦截器和拦截器栈机制8 I& `$ T: }; v; j
(6)Struts1中的Action使用了单例,Struts2是一个请求一个Action对象' R' l U6 t. O( l
6.如何使用Session、Request、Application等对象
& C9 b+ o3 y/ w/ X* t! L# ] (1)Struts2对原有session、request、application做了封装,可以通过Map结构使用。使用方式如下
; B( N( c( k4 o6 l! V0 P Map session = ActionContext.getContext().getSession();7 ?# x0 B: |' O6 v3 b
Map application = ActionContext.getContext().getApplication();
) j! m: N1 @: r) Q3 N5 X! y7 q Map request = (Map)ActionContext.getContext().get("request");
7 Y5 ^1 W" U3 c* _. N' k (2)封装原理. ?$ Y+ b/ F! Y* y+ p( k$ V
public class SessionMap extends AbstractMap{
; b- x6 p* k" a3 d HttpSession session;( V) \2 }5 U3 d [" Z% n/ ?
public SessionMap(HttpSession session){
* W$ V/ O% s* G% X this.session = session;8 j7 u, I! o* c
}
: U' H+ b3 M5 }
& B- Y5 ?4 T3 X: a public void put(Object key,Object value){
2 M+ S+ f) g. d$ T3 i: ? session.setAttribute(key.toString,value);
: ?4 I: C+ l+ i% W4 T, d }
$ V/ a* S# A. L4 X7 z$ T9 `, ] * e# u F1 V0 q! D
public Object get(Object key){& P6 P3 U8 R/ M1 o
return session.getAttribute(key.toString());
; t1 G* ~% F% S# H w }
( l/ U9 q# G. A. F }
- }3 ?' o/ S% l( z' O% c # G4 R0 Z$ ^, B, }5 T N
(3)如果需要使用原有Servlet API类型,可以通过ServletActionContext获取
1 K7 b( L# k, Z- d8 V, r! t. ?
/ @8 _1 c" i8 u. ? 7.Action相关配置1 z$ L( Y: h3 ?4 \7 e
(1)<package>元素的namespace属性,命名空间,默认值为/8 |. `- U. y9 U* w1 n7 J7 H
对应请求是/工程/namespace/请求名.action
; N3 m1 H, G G( s% s& O (2)<action>元素的method属性,业务方法名,默认execute: l) g4 Y1 L' ~0 q: `/ P+ i: v
可以指定Action方法名当做业务方法。1 M! e g2 N7 y$ K; T6 A
(3)<param>元素8 w8 w; y6 _" F" n/ B$ i# o1 h
可以为父元素对象指定属性值。
1 f" s4 P" U7 A' H4 J (4)通配符*的使用2 g1 F& X7 F) ], F; G3 g' S
在<action>元素的name属性中可以使用*,*表示任意字符
. D, X+ _( T* E, O8 g 在<action>元素的其他属性中可以使用{1}、{2}等引用通配符代表的值: B6 b! }6 p5 s: d, V
8.ValueStack作用及结构
) [9 j0 j/ b" x5 m" w2 {* r, x. g ValueStack存储了和请求处理相关的数据。包括session、request、action等。( M& W- Q, i* K. M2 d
ValueStack包含root区和context区
9 H. ^4 k) ^( ]3 t+ V' U! T# } root区类型为CompoundRoot继承了ArrayList(栈结构),存储于请求对应的Action对象。7 m/ Y- R- M" T3 M9 c1 N
context区类型为Map,用于存储session、request、appliation、action、parameters等变量信息.
7 I# ?9 @! q3 D5 J7 ]8 H 9.ValueStack与OGNL关系$ I1 V8 D* @' y( M# x
OGNL:Object Graphic Navigation Language,对象图导航语言。7 y, k0 \" i5 B1 n+ [! S9 a* F* H
Struts2使用OGNL访问ValueStack数据,即对属性值设置和获取。+ }& l4 f9 u7 d% M2 T* e/ ]$ f
OGNL访问ValueStack数据的方法如下:3 P) t$ t* O0 G& e
访问root区属性:表达式为"属性名"
' B9 x. ~7 k. _ J 访问context区变量:表达式为"#key",例如"#session.user"/ c& m! Y, Q8 ~. m( L- z, D
10.Struts2提供了标签+OGNL表达式,用于访问ValueStack数据
! a+ x+ |& x" G
( U! q+ E2 b" B( m3 r" Y' V4 D$ P; g( S
|
|