该用户从未签到
|
struts2* D& F9 q/ R0 K% c- n
1.了解Struts2发展史,与webwork框架关系
! [- u( I; e# B; {) O6 s2.Struts2体系结构% u) P3 U; J2 R/ {, E
C控制器:FilterDisptacher(2.0,2.1版本),StrutsPrepareAndExecuteFilter(2.1.8,2.2版本)
" l. m! U+ Z& Q! b' e$ ~ M模型:Action:用于业务处理。(可以不用必须继承父类和实现框架接口)) E1 [% m! _- ^3 _6 o# \
拦截器:用于封装通用业务逻辑。2 T( |; M- N/ y: w
V视图:Result(提供了各种类型的Result组件,用于实现不同类型的响应信息)、标签+OGNL% [, }9 I) S0 \7 T
3.Struts2框架的配置
; Z& ]: i C. x4 P3 A* } (1) struts-default.xml(jar包中自带的默认配置)
- I" e7 @/ M& c& B 配置了一些拦截器、Result组件的定义。- m4 y' f1 Y" {. I% S. N: |
(2) default.properties(jar包中自带的默认配置)) \7 A, ]6 ?% H0 c) v( j& B# y
配置了框架的一些系统参数,例如请求扩展名、字符编码等。
9 o0 }# T/ l6 |. G' v. ~9 f ^ (3) struts.xml(开发者创建,默认在src下创建)
& b8 `: \! O F' T 用于配置Action组件、自定义拦截器组件、自定义的Result组件。; h, I) e$ L! B' L1 j' S
(4) struts.properties(开发者创建,默认在src下创建)
% i+ X9 _0 J5 J$ o6 g 用于修改default.properties中的配置参数。7 p& Y! u8 ]$ g* M: @
4.Struts2开发入门
. g8 u9 G# e$ R/ M9 {& S* F (1)创建Web工程,引入开发包) ?6 v) I1 ?/ _- x. j& Y
struts2-core-2.1.8.jar
; O( B1 {" H$ Q1 z" u xwork-core-2.1.6.jar
1 d" D1 H* i8 u) G, J freemarker-2.3.15.jar
) }% c9 w8 b+ i& o3 i$ d& T2 M8 |/ u; P, a ognl-2.7.3.jar% [: v" f6 a, t* Q2 ^7 _, ?4 q
commons-fileupload-1.2.1.jar
) u# [! b3 _0 R8 C" W: m2 \ (2)配置控制器,并添加struts.xml配置文件# i" m$ f5 H6 ^# O
(3)根据JSP请求编写Action组件
" Z; u: g+ h- z7 V (4)编写struts.xml配置9 |6 D. t6 R$ O+ @
5.Struts2特点
) i; Y/ w. D, {2 j (1)Action摆脱了对框架API依赖,也摆脱了对ServletAPI8 J0 a7 m( u) e- `* S5 G
(2)Action可测性增强9 x% V- U! P3 A, E5 }
(3)提供了各种类型的Result,可以完成各种形式的响应$ p! W, E+ h. ^- q7 J
(4)易于扩展和整合其他技术" k$ L& D% u0 l0 B1 w9 S
(5)提供了拦截器和拦截器栈机制
: C5 J$ ] d4 v+ J- r (6)Struts1中的Action使用了单例,Struts2是一个请求一个Action对象2 O8 \, h# U& d& C* n _3 l) m& x
6.如何使用Session、Request、Application等对象 a1 a) Z c2 D1 f9 P# X4 s6 S H
(1)Struts2对原有session、request、application做了封装,可以通过Map结构使用。使用方式如下
5 @; ]$ L, L; {* M$ I8 x Map session = ActionContext.getContext().getSession();' ?7 x7 S$ g/ P8 Z% n
Map application = ActionContext.getContext().getApplication();
/ F' k% Z2 v0 N* u Map request = (Map)ActionContext.getContext().get("request");
9 r; }: m) o r- o2 X2 ]" M& H- { (2)封装原理
' E! q( l( _' z8 R* j public class SessionMap extends AbstractMap{
2 z* U4 j% H% h) J0 V, W HttpSession session;
2 y, j* X, ]# ?/ D- x' K7 p public SessionMap(HttpSession session){) F9 @" \: a$ p W
this.session = session;
; S4 J6 J" X5 c- x9 ~9 c; F }
8 X7 F& \ X; C3 u4 I$ t
' s# n# E8 X5 M4 w: I$ o3 ~ public void put(Object key,Object value){; T& x: K& d9 E' H
session.setAttribute(key.toString,value);
% l( c1 B1 G6 Q G6 @" U6 t! X }
& |8 f9 x. c- L* X$ r. R1 }$ r 3 Z0 j2 a) x9 e3 k! y# _3 O5 j* k
public Object get(Object key){* d/ ^0 D' _9 ~8 r/ U4 ]) X
return session.getAttribute(key.toString()); H Y0 S* E* d+ j6 T" K3 Y. }$ b
}2 `, S$ u5 I+ V% Q% O v/ q4 s# _
}" R% W- v2 E6 E, G2 N7 c/ a
+ ^$ A3 v( s, V. t; u- s# j
(3)如果需要使用原有Servlet API类型,可以通过ServletActionContext获取
/ M/ i7 Y, Q$ F- j% G
( y4 e* {7 D, Z 7.Action相关配置
5 [' y/ z+ V# P Y, X5 c (1)<package>元素的namespace属性,命名空间,默认值为/
6 F' o/ Q2 g% F: [5 E5 L 对应请求是/工程/namespace/请求名.action T9 p/ S& x' z3 y9 M! f
(2)<action>元素的method属性,业务方法名,默认execute
8 n3 d3 |" y2 {8 E, \. i 可以指定Action方法名当做业务方法。: T2 ]: L2 _ O1 M/ S& k( Z6 k
(3)<param>元素3 A6 U" y2 k, ?9 J( a& M9 d
可以为父元素对象指定属性值。3 v+ F0 i0 S/ k2 s2 D
(4)通配符*的使用
7 l/ ?/ P/ ?$ b. |# j/ p# S9 ~ 在<action>元素的name属性中可以使用*,*表示任意字符
: O4 i1 N2 X! y, _: W2 K6 A 在<action>元素的其他属性中可以使用{1}、{2}等引用通配符代表的值
/ C7 U2 e* d6 q: F/ {0 a 8.ValueStack作用及结构9 W0 X2 J9 W, i
ValueStack存储了和请求处理相关的数据。包括session、request、action等。. D! E3 A- B7 F3 K! B7 D0 e
ValueStack包含root区和context区
. p8 W) }' c, b) x* K root区类型为CompoundRoot继承了ArrayList(栈结构),存储于请求对应的Action对象。
; Z( U& l1 r5 B- o9 x" o context区类型为Map,用于存储session、request、appliation、action、parameters等变量信息.
0 V) G; O/ @3 X8 Q; T7 Q. m( L9 v 9.ValueStack与OGNL关系- |2 r. E" U( {, M
OGNL:Object Graphic Navigation Language,对象图导航语言。& }9 n2 Q' O P; }) Y
Struts2使用OGNL访问ValueStack数据,即对属性值设置和获取。4 c# P% s H( S; a" J4 K G
OGNL访问ValueStack数据的方法如下:
$ \; Q9 T5 U$ X. V' V 访问root区属性:表达式为"属性名"
z8 m, S8 T7 Q# t6 _ 访问context区变量:表达式为"#key",例如"#session.user"
) R+ e& ?4 o# Y _' c& ] 10.Struts2提供了标签+OGNL表达式,用于访问ValueStack数据4 ?" v( d$ e$ V, g6 y; {( O2 a
. V3 m0 O, `8 R! h
& M0 l8 z; j* V& ~- T0 ]6 u+ P1 H
|
|