|
该用户从未签到
|
struts2
* p h$ ^6 Z P' y* Q1.了解Struts2发展史,与webwork框架关系
9 P/ K/ p; W" h2.Struts2体系结构3 W/ T5 P0 F: ~ u
C控制器:FilterDisptacher(2.0,2.1版本),StrutsPrepareAndExecuteFilter(2.1.8,2.2版本)# g; L0 g( }5 W" {
M模型:Action:用于业务处理。(可以不用必须继承父类和实现框架接口)
* q* R# ?4 g# ] 拦截器:用于封装通用业务逻辑。
, R* ~1 A5 b5 k4 Y V视图:Result(提供了各种类型的Result组件,用于实现不同类型的响应信息)、标签+OGNL4 q# q5 }0 P. a, E( F
3.Struts2框架的配置
# K# L2 h, x& N8 i. F6 x* n6 @! U- p (1) struts-default.xml(jar包中自带的默认配置)9 {' G F& Z. V5 K6 l0 o
配置了一些拦截器、Result组件的定义。
. T2 u2 T; s% P% m, | (2) default.properties(jar包中自带的默认配置)& g" P9 ] }( {' H4 g* h& a- E
配置了框架的一些系统参数,例如请求扩展名、字符编码等。
3 a" A* |/ g, D3 l* X9 h' h4 J (3) struts.xml(开发者创建,默认在src下创建)
S" S/ k0 H b- p1 {& c, w2 r5 K 用于配置Action组件、自定义拦截器组件、自定义的Result组件。
) ^1 J4 u2 h. _. r# F6 g (4) struts.properties(开发者创建,默认在src下创建)
$ u5 T6 a A. h 用于修改default.properties中的配置参数。
8 \6 G8 e8 [6 z; B3 u4.Struts2开发入门# a, M2 h7 [, Z# L3 V- `; m
(1)创建Web工程,引入开发包
# m9 Y: e" G9 I+ {- I2 M* {0 g struts2-core-2.1.8.jar
6 I. t5 x- G; q9 S1 S0 T! u$ c xwork-core-2.1.6.jar) U8 ?/ T# I3 T4 a2 d' G$ @" K O# j
freemarker-2.3.15.jar
% p2 L6 Z" B% @* H4 f ognl-2.7.3.jar
' ~! Y9 B5 x4 ?6 B commons-fileupload-1.2.1.jar
7 y2 A4 q( L, B$ K (2)配置控制器,并添加struts.xml配置文件% z( ]2 o! d% B9 ^1 I
(3)根据JSP请求编写Action组件
0 S; [: M" {8 |) T$ W1 O, | (4)编写struts.xml配置 R- E/ H4 B8 @4 ]- M9 W8 v5 a
5.Struts2特点
2 m9 A* v. z8 h. Q* s1 R- Z3 B (1)Action摆脱了对框架API依赖,也摆脱了对ServletAPI
0 j0 ~. h. N2 u8 B( @1 A) Y (2)Action可测性增强
, K9 M. D, [' E5 B, [3 i (3)提供了各种类型的Result,可以完成各种形式的响应& r% d2 Q. s/ m7 f3 F0 ]2 D- f
(4)易于扩展和整合其他技术
; `1 i; R/ S6 S1 M (5)提供了拦截器和拦截器栈机制" ~7 q) }. m, A
(6)Struts1中的Action使用了单例,Struts2是一个请求一个Action对象& i" o @6 F6 T
6.如何使用Session、Request、Application等对象/ U/ ?- g4 P' E% J; T3 `
(1)Struts2对原有session、request、application做了封装,可以通过Map结构使用。使用方式如下
3 c( y- [ r, r8 `& |; ^8 J Map session = ActionContext.getContext().getSession();0 W' t9 A8 c- W2 s+ |, ?
Map application = ActionContext.getContext().getApplication();2 X9 D1 O. P- e- S$ X8 k
Map request = (Map)ActionContext.getContext().get("request");
4 V( T/ J- l0 Z5 Q% b5 F (2)封装原理
4 |% H0 ]$ |$ W! e4 [ public class SessionMap extends AbstractMap{
/ N# S8 S. w) Y+ r- p- j3 c1 }; c HttpSession session;
T3 ^: `- P$ n* U3 M: Z public SessionMap(HttpSession session){
4 u% B" X: k5 c this.session = session;
$ K! O. U. ]( R; ?- N4 T }
+ g8 c6 l& K) H) g1 g( r9 s 0 I5 u& W! B' ?# l: X7 |) z {& L
public void put(Object key,Object value){$ ]1 P8 g) F4 U1 L) K) `
session.setAttribute(key.toString,value);
& f; T% h1 }9 v W }
) A' g$ b+ d, Y7 d# R, Q) k% d5 f. L
5 R# S/ a, V/ U9 a. p3 K# K. I: H public Object get(Object key){
+ b6 @- y; n v6 m0 h7 [+ p" f return session.getAttribute(key.toString());
. {. ^: \& o) I7 [) Y, i6 o }% {0 h# g- @3 l
}
3 K; G; s9 ]- o+ e / u0 q( k1 J+ p- H
(3)如果需要使用原有Servlet API类型,可以通过ServletActionContext获取
! t. N3 S' C* c( Z* u) } & d0 C! @* @2 `. b" W+ e1 S+ T' j5 k& K
7.Action相关配置
" x0 ~' T% M; J1 y) Z (1)<package>元素的namespace属性,命名空间,默认值为/
, d( H3 C0 L) g, t 对应请求是/工程/namespace/请求名.action7 T: m9 _" i# @: c& ?2 y
(2)<action>元素的method属性,业务方法名,默认execute$ V2 J* H) W# k- t- H5 L5 d5 S
可以指定Action方法名当做业务方法。
8 B$ ?7 {* T* P4 I# U (3)<param>元素% E5 P3 D6 I" [; }# z% l# ]' o; k
可以为父元素对象指定属性值。
1 f; {2 [7 E% p J1 S+ H% k7 _; ]3 Q (4)通配符*的使用/ Y* n, z+ z) i
在<action>元素的name属性中可以使用*,*表示任意字符
+ m& C) [, `: m5 b& K6 ^, z 在<action>元素的其他属性中可以使用{1}、{2}等引用通配符代表的值4 W2 U4 x. _, ]: O. N8 l+ S
8.ValueStack作用及结构4 ?( b8 g2 J, I
ValueStack存储了和请求处理相关的数据。包括session、request、action等。, o) n; [- M$ `/ B5 @* y5 e2 U
ValueStack包含root区和context区
9 m" b4 H5 r% V/ ^ root区类型为CompoundRoot继承了ArrayList(栈结构),存储于请求对应的Action对象。
8 z+ M0 Z* l4 n! F8 \' M context区类型为Map,用于存储session、request、appliation、action、parameters等变量信息.$ g+ V( ?/ C& P3 t( ~, ~" s8 X
9.ValueStack与OGNL关系
6 @* e" B, p# ?6 v3 g, c3 G' F: [ OGNL:Object Graphic Navigation Language,对象图导航语言。2 ~0 z0 b2 F9 B) ~, U* ^
Struts2使用OGNL访问ValueStack数据,即对属性值设置和获取。
, Y6 N4 o3 [3 q/ l4 n0 z: @ OGNL访问ValueStack数据的方法如下:
! d) u& z/ `. a8 E" V( N 访问root区属性:表达式为"属性名"
1 a' H) H2 }. [: X( z 访问context区变量:表达式为"#key",例如"#session.user"% h- a$ a) i6 D$ q/ ~, Q- X
10.Struts2提供了标签+OGNL表达式,用于访问ValueStack数据% q4 C0 k4 w% L3 t1 ^3 [
8 k& M0 W1 ^- a4 o L
% y. K; F- i5 M6 f' e# t
|
|