|
该用户从未签到
|
沙发
发表于 2014-03-12 22:26:39
|只看该作者
201. 1、继承ActionSupport,再写方法validateXxx() 其他同上一样
* u" l8 b% P" f4 H202.
+ x" f$ E6 y ^8 h. E6 `- ~203.第二:xml配置进行校验
0 c) Q) ^) t% R) Z" v204.一、所有方法
- ^4 x7 l' R8 r, \3 {0 g205.1.继承ActionSupport类,校验文件与action同包 命名ActionClassName-validation.xml ! O6 _) a2 i( J( I
206.
3 f9 E' n2 ]# c+ n# a" U0 y207.; : X4 B# X& Q" G$ u$ T
208.文件内容:
0 e, h* h& p. n. s- z: Y$ D9 }209.<?xml version="1.0" encoding="UTF-8"?> 4 r0 X7 \3 r3 S# `; s$ z
210.<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.03//EN"
* {( V0 u- H* x! b6 T3 f3 w* ^211.
. w( B4 ]! B; O7 L8 ]212."http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> 9 M+ P% J1 Z* ?9 a* b
213.<validators>
, Q5 [5 \. Y7 P7 U( v214. <field name="username">
3 n* D1 B* I# e2 O: @' E6 h7 j215. <field-validator type="requiredstring"> + W% D! b: Z9 M0 W( ?/ p0 d% R, u
216. <param name="trim">true</param>
2 V! Y. F' J' D: O2 v4 i/ C# U5 K217. <message>用户名不能为空!</message>
4 b) n- e C; S* K4 {2 A& D' c2 r218. </field-validator> - |8 A$ {, s) x
219. <field-validator type="tringlength">
! D# i0 o1 t* v$ c! U0 z. V8 m220. <param name="minLength">4</param>
" I' o' h" E* o8 e( A# p7 u221. <param name="minLength">10</param> 1 [. c {1 e( A! i) i
222. <message><![CDATA[用户名应在4到10之间]]</message> 9 z, I- H- n. t. j+ U
223. </field-validator>
/ [9 T% h; k0 C6 P- k224. </field>
# d. h x+ T) c7 ~/ G- B225. <field name="mobile">
- e9 s6 [8 A: q* o7 N226. <field-validator type="requiredstring">
6 F& H! I) C) ^3 |, T3 I227. <message>手机号不能为空!</message>
. |' t' U. W' }8 C2 R& M228. </field-validator>
8 Z) T! j. }/ S229. <field-validator type="regex"> ! Q, u7 X3 s, A* [% Z
230. <param name="expression"><![CDATA[^1[358]\d{9}$]]/>
5 D7 W+ k) h1 S2 {4 S3 c+ A231. <message>手机号格式不正确</message> 3 F5 B) i; q2 k+ }2 t9 G
232. </field-validator> 3 F p! ~: p$ Y7 \
233. </field> 5 |% M( S8 m y2 j! }8 p- F- M
234. <field name="age"> , u: H5 v- Q! s5 _: K$ R( u
235. <field-validator type="int"> 4 g( X# _( l, S. g
236. <param name="min">1</param>
; Y/ N. _# f/ L2 V4 G237. <param name="max">150</param>
% V. E+ y) X6 ^3 W* e' H' ~, ~238. <message>年龄范围不对!</message> 6 B! ]/ s: _6 n! F$ E
239. </field-validator>
9 _5 c- `* _ W" w) o3 x; D( a240. </field> ) }" U& o$ c. l) _+ X u3 q- ~8 f9 \
241.</validators> & [6 @+ U* h: n% B8 S, k; a
242.
A4 s$ ]; s) p0 g+ l243.校验器的路径:com.opensymphony.xwork2.validators下的default.xml中 " J5 T' K' a) w
244.二、指定方法 . d( F# q" l7 b2 h
245.文件命名:类名-配置中actiono的name-validation.xml 9 ?' q, |" U' T& ]/ O
246. , P& v1 ?: D5 j v3 | L
247.15.国际化 ; s) ?5 I$ ] Z3 Z" h
248.全局范围、包范围、action范围 " ?$ P9 h3 V% V+ ^6 q$ v$ R
249.命名格式: : ?# k" Y0 @% o" J7 K* ~
250.baseName_language_country.properties
9 I: }- O8 E/ a, f7 T2 f+ V251.baseName_language.properties
1 {( U5 X J4 K4 K252.baseName.properties 4 b4 _/ a" X# R& b
253.baseName是资源文件基本名可以自定义,language和country必须支持java的语言和国家
: O4 j: i2 ^ f( F4 e254.中国baseName_zh_CN.properties
1 G! }) L. [1 L) K7 {# Z- O255.台湾baseName_zh_TW.properties
; b& P9 X# ^0 m W, S256.美国baseName_en_US.properties
* Q8 k) F* M( {257.
% D/ A4 `0 _5 z) _4 r, S258.在properties中MyEclipse支持自动将中文转换为Unicode编码 ' T! J0 h+ e) t! e2 U ]: B
259.利用jdk提供的native2ascii命令格式转:
: X. D- r3 f0 {+ ?3 M260.native2ascii 源文件.properties 目标文件.properties & O6 y: t6 U2 L- \8 a& I6 X9 m; H
261. $ Q! I" e; ]3 G* e
262.通过在浏览器中改变语言就可以再语言间转换
; n! z1 Z) S1 Z) b263.一、全局:<constant name="struts.custom.i18n.resources" value="资源文件基本
a- I9 \8 C, v5 R+ j& i264.*在jsp页面是用<s:text name=""/>标签来输出国际化信息 name为资源文件中的key
( f: M6 k4 ?5 W$ m$ y265.*在action中可以继承ActionSupport 是用getTest()方法得到国际化信息名"/> 第一个参 0 H9 @) j" D+ m) Q" ~5 f! B- x3 ]
266. ; G/ j7 [; W8 |5 O, V$ A" S3 D
267.数为资源文件中key 9 C+ a' K [9 Y% ~3 E) o
268.*在表单标签中,通过key属性指定资源文件中的key 如:<s:textfeild name="" key=""/> - v4 A, M1 q! m- X: N; Q* F$ q& u
269. " v8 B K+ a" Z" G: y8 L" i
270.有占位符的表示: J/ h) B* w" M. R' D6 }
271.welcome={0},欢迎光临!{1}
4 E/ \/ o" o8 L! s272.*在jsp页面:
9 x5 N! z9 E; K/ |& n" z; t273.<s:text name="welcome"> ; x, [- f0 C( @8 \
274. <param><s:property value="realname"/></s:param>
; F+ F; ~& D2 D+ n- o8 b7 k9 ?' O275. <param>学习</param>
) N& s" f4 ~( w* k$ V# V6 `276.</s:text>
: u+ E5 P% X' g) {- ^277.*在action类中: 9 R/ {7 {1 s5 x# }/ A& ^% W( h" }1 z* q& F
278.getTest(String key,String[] args)或者是getText(String aTextName,List args)方法
' j7 Y/ s) h3 H279. 9 e% Y2 b: s3 w6 E6 o, b5 W" ]
280.二、包范围
8 d n( H7 J& U; P0 T. s; ^281.在包下放置package_language_country.properties资源文件 package为固定写法
_% w B2 }* j' g6 d1 Z282.该包及子包下的action毒可以访问该资源 系统会先找包资源文件 找不到则找系统资源 ! z A# z: u! k: a5 j' _* b
283.
9 D/ f# W( @) u& ~* b' e7 S* ^284.中的key 1 y |( W5 u' r) l3 A8 j/ `
285. 0 g7 | W- t @- P8 J) u( C Q
286.三:action范围
! a( a. f4 u: T287.在action所在路径放置ActionClassName_language_country.properties的资源文件 : `+ k L- m; L6 E9 N8 w3 N
288. & }+ C/ T6 p1 d8 ?
289.无需任何配置直接从资源文件中获取配置:利用标签
4 S6 [: q7 h0 `- l! G9 u3 U, P/ P: ~290.<s:i18n name="资源文件名"> 全局 ) N9 k3 G2 d x0 {
291. <s:text name="welcome"> / Z- X* ?1 V, h& \2 z6 P
292. <param>小张</param> 4 b$ E$ L$ r: L+ T7 n: P
293. </s:text>
% c Q# Y2 N" z) d294.</s:i18n>
. U1 o" G$ ^& @0 L295.<s:i18n name="路径.package">从包中 2 H5 `. ?( Q8 N4 Y& j0 x
296. <s:text name="welcome">
; F* {5 Z$ D; [: P! c297. <param>小张</param> & Y. _! W7 t* I0 V, y
298. </s:text> . k/ ]& b+ q+ Y" D
299.</s:i18n> 4 O7 h7 M9 |/ u
300.<s:i18n name="路径.ActionName">action 3 i8 k" r9 R+ L' O4 u
301. <s:text name="welcome"> : |# l5 B7 k: e
302. <param>小张</param>
3 N% L8 E2 N2 ^/ [: A303. </s:text> / n" P3 Z, t3 f+ O* H
304.</s:i18n> u0 q4 I8 j0 O. O+ c5 Q& N
305. 4 T/ O7 z) b- i i+ _
306.16.OGNL表达式语言 # I1 S( Q9 X, H& \/ a1 j9 N5 @" K
307.类静态方法调用格式: 1 ]; P" x \& y1 K% c# T [: F
308.@类名(包括路径)@方法名 8 }% v% v$ `7 D1 ~7 a
309. 1 H1 l5 g1 _9 S
310.OGNL Context(ActionContext)访问上下文中的对象:session、request、application、 3 @5 L; s( H/ h
311. 4 P7 H4 s6 ?- b4 {+ h. l. j. i3 I
312.attr、parameters、OgnlValueStack
, p+ V5 o, w ^( w! l$ U313.访问对象格式:#session、#request 1 `$ [: Q5 C$ a+ P4 E% B
314.访问对象属性格式:#session.userName或者#session['userName'] ' p; p7 J- O* M6 Z* M% q
315.其中OgnlValueStack root变量无需#,他访问对象属性时从栈顶开始找
) V$ w! ]1 ]: e) N5 D% I316.需配合struts2才能使用,也可以用EL表达式(只能访问值栈中的属性)直接访问对象的属性
% q/ y6 C7 Y8 o317.
+ @+ K5 `. {6 W1 W: \! d318.17.常用标签使用
6 y7 i. M& Z0 |, M. k7 o319.*构造list对象:
7 U: Y( L8 Z" T320.<s:set var="list" value="{'1','2','3'}"/> $ \" V* ]& r4 U- h; ^
321. ! Z- e. f" B, D4 l4 s
322.*迭代list:此标签迭代时将当前对象放到栈顶 . }0 r1 n( T1 R2 C6 }2 x5 e
323.<s:iterator value="#list">
2 Z' S& j8 H# R, F1 S324. <s:property/> 9 |, ^1 z* {& Y4 x% C
325.</s:iterator> 7 ?, F# v$ e& ~
326.
6 h; D! w3 X8 s327.*构造map对象:
& c+ G \. I8 D) S6 |3 b! O5 n328.<s:set var="maps" value="#{'key1':90,'key2':20}"/>
$ C% L, ~* Y: _9 q+ ^0 g) R$ F329.*迭代map:
0 _1 y0 L1 W! s( O; M% }& e3 U' s9 H330.<s:iterator value="#maps" status="obj">
) G p3 B7 X9 K' g0 ]9 U% s331. <s:property value="key"/>=<s:property value="value"/> t0 O5 W8 H. f7 X6 C6 e, B. N& M
332.</s:iterator> + w# u* g6 t( I
333.obj包含方法: 2 | n) M, S& T
334.int getCount();返回当前迭代了几个元素 $ [/ X$ I4 n$ z7 ^ o( f3 l- ^$ E
335.int getIndex();返回当前迭代元素的索引
; S, U4 ~! F9 Z6 r336.boolean isEven();返回当前使用元素索引是否为偶数
, J) a; i' m+ i; s" X4 I337.boolean isOdd();返回当前元素的索引是否为奇数 * i0 H* l; i3 R7 b/ y u
338.boolean isFirst(); ( c1 R6 Z7 H& q
339.boolean isLast();
9 V( z. i4 h% G7 ^# U1 n7 a& j340. # _9 a, G9 ^7 Q8 S }
341.*判断元素是否在集合中: 2 w- J, T: s2 d% Z
342.<s:if test="foo" in/not in {"foo","tar"}>
5 X2 T$ ], |$ A343.在 5 _1 @2 E) ]2 w# j" N
344.</s:if>
+ u L) `( W+ x/ |+ B345.<s:else>
" E- s. S: C) Q3 `1 N346.不在 ~+ ?: x) v2 y; x
347.</s:else>
0 t5 S. b6 w6 g4 n/ Q+ y348.
C0 p$ A% u3 M/ Z2 m349.*投影 在大集合中过滤数据放到小集合 例:Book对象 ( } o4 V; X, }5 i8 [4 |8 d
350.?表示获取符合逻辑的元素 3 Q5 e5 l! S, w1 A M
351.^获取符合逻辑的第一个元素
1 ]8 B8 M* ]! J# o352.$获取符合逻辑的最后一个元素
" A4 M e0 R& p353..{}表示从大集合中筛选到小集合
3 m, ^/ q9 P2 u354.<s:iterator value="books.{?#this.price>35}">
% q: o# u2 `3 r+ A3 o$ c. a; v355. <s:property value="title"/>==<s:property value="price"/>
?3 p$ r0 }! B0 i9 P356.</s:iterator>
4 N. T6 {) ^/ \* Z, ^ N357.
/ _! T& L$ M& D1 G6 n( X. l358.*URL标签 # X) u1 B8 Z1 }
359.<s:url action="" namespace=""> ! e) J- q' l$ ?! c# a
360. <param name="" value=""/>
7 {, V, `# o$ R361.</s:url>
& p v: p, m) D1 O" }& X) {362. 7 a5 Y4 R$ T6 z
363.<s:set name="myurl" value="www.baidu.com"/>
5 o& @, @7 S: h* ?364.<s:url id="url" action="hello">
4 k! p$ O- m9 _/ u* P365. <s:param name="request_locale">en</s:param>
. \: _& @* n& m: }1 w$ [/ u* D* H- ?366.</s:url><s:a href="%{url}">English</s:a> ; y y; s a) G' O( @
367.如果href="#myurl" 他会把他当做字符处理 要这样:
0 g& q5 K# y$ H8 i6 t( E0 y368.<s:a href="%{#myurl}"/>
# q" b, g% a$ `' \* f369. , @* w7 p: D/ W3 j" N
370.*复选框 集合list和集合map ( s& e$ o# o C+ t4 Y1 l3 u8 o
371.集合list
) G& i. ~2 t, {; L& ~372.<s:checkboxlist name="list" list="{'java','c#','c++'}" value="{'java','c#'}"/>
$ m, \; k2 r4 a373.value属性用于指定被选择的复选框
: o2 s* x% h2 w374. ! W2 s \3 B; \5 @2 I: ?6 k8 S
375.集合map
) Q J( s$ B, L/ [+ l376.<s:checkboxlist name="map" list="#{1:'java',2:'c#'}" listKey="key"
3 q3 u% M$ W, d# \377.
( \6 k& p9 O& n6 H% Q' O378.listValue="value" value="{1,2,3}"/> + l& [) [! ^" i% y: x
379.
4 W- w) L F# {: k) I4 h380.*单选框 0 Y, K; d6 Q. q b/ Y7 z
381.集合JavaBean
! {% K& q( ^! J4 H) x382.<s:radio name="beans" list="#request.persons" listKey="personid" 6 M' N- K# n% e3 R; E+ k- e
383.
6 {. \+ }) I5 @, K+ H& o384.listValue="name"/> , j# d+ i/ ]5 U& A# z* K: K. X. j
385.集合list " \( h3 h/ f- [/ U- S% b
386.<s:radio name="list" list="{'java','c#'}" value="java"/> % W0 b; f+ p3 |9 L; k7 [
387.集合map + B" A3 p% s* k6 y7 \; Y3 o
388.<s:radio name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value"
1 s: }/ H* F0 _0 b( G2 W: U& w! o389. ( k7 v" @" I. B. u1 O G8 Q" W, I9 [5 v
390.value="1"/> " l, Y' G, a7 V; v: b
391.
5 O# f1 L! h" ]3 \3 I" a* a392.*下拉列表框
. P9 x% L; o) j& z( v5 u393.<s:select name="list" list="{'java','c#'}" value="java"/>
/ u. a q6 m# ?0 _! Y- {8 g- h7 N394.<s:select name="beans" list="#request.persons" listKey="personid" " A, z {( X- I: Y5 s2 }# N+ j" d( I
395.
7 v$ R' N r9 Q* F4 L: ~) S* H396.listValue="name"/>
6 [& @1 P: d8 b, X397.<s:select name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value"
/ q( o' V+ E. y) v% N4 h) `/ o398.
7 \/ j' E) O5 D& A \; A2 v+ L" p399.value="1"/> 3 Y5 T' G7 r! y8 p. A5 g) q
400. % y9 _9 F# k1 v ~
401.18:防止表单重复提交 : T# W) y# _+ J+ ]0 y6 t" c
402.<s:form actio="" namespace="" method="post"? " Q* z) l1 r3 f0 W1 D4 t
403. <s:textfield name="name"/>
; D- q* U% y/ V3 G+ h6 c: u404. <s:soken/>
: `9 H8 }% G e405. <input type="submit" value="提交"/>
* d4 L7 |9 f& i" N. b( T) J Q4 T0 \3 ~406.</s:form>
$ a6 v4 @7 t( e; R- h _407.引入拦截器 1 _, U8 Z! \. ]% A: E
408.<interceptor-ref name="defaultStack"/> ; U* |8 J1 a3 V8 X0 @ w
409.<interceptor-ref name="token"/>
; p- K3 _; Z0 X2 W410.<result name="invalid.token">index.jsp</result>///发现表单重估提 |
|