该用户从未签到
|
沙发
发表于 2014-03-12 22:26:39
|只看该作者
201. 1、继承ActionSupport,再写方法validateXxx() 其他同上一样
* F+ x: x2 V3 z) t3 l# N2 A- g202. 3 ?+ k3 x9 u9 m6 W7 \
203.第二:xml配置进行校验 ( g4 H6 ?, L6 X Z$ J& c
204.一、所有方法 7 d$ F j8 a$ |$ ?" `
205.1.继承ActionSupport类,校验文件与action同包 命名ActionClassName-validation.xml
9 [ y5 b, m4 Y* r O, S1 _: i206. ) j5 K. D) U2 ]- z* D0 j; S0 p B
207.; : P( G, l) Y1 r, ~; `3 P
208.文件内容:
* z5 @' k- u8 W4 L209.<?xml version="1.0" encoding="UTF-8"?> 9 x+ k! S. w4 b5 }& G- U
210.<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.03//EN"
" @8 y/ N8 X0 q% z211. 5 H0 o! J# x# o- }% D6 o
212."http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
3 q r6 }* T4 i213.<validators>
! T* d& L2 p) x o+ t' D214. <field name="username">
( }. a' u1 G- M, r6 Z' ]- \215. <field-validator type="requiredstring"> : r3 R( d2 Q7 J' L. P. `0 \
216. <param name="trim">true</param> 7 S: x7 f3 p3 [5 K! U9 j+ a% Q
217. <message>用户名不能为空!</message> 9 [* S# f' a4 ]2 c/ h
218. </field-validator> - c4 U# h1 j# z: d6 W
219. <field-validator type="tringlength">
8 w; F0 N8 Z, D, x5 B220. <param name="minLength">4</param> 4 G7 K. i/ t! |; w
221. <param name="minLength">10</param> 1 R+ I" `- j) X
222. <message><![CDATA[用户名应在4到10之间]]</message> 5 z5 b4 p% B0 ?2 J, b
223. </field-validator> : b* [" a4 U& f
224. </field> % n; N' B( x" Z5 }
225. <field name="mobile"> / a$ T( K% G! \8 F S# e
226. <field-validator type="requiredstring"> a2 L* e; _0 k3 {3 Y2 r
227. <message>手机号不能为空!</message>
: U) V% T& h* |% }' q, p2 e228. </field-validator>
. G6 `: X9 I P$ W229. <field-validator type="regex"> $ C L: U1 T9 Q) L' {: t! _: i8 p$ \; _
230. <param name="expression"><![CDATA[^1[358]\d{9}$]]/>
9 d! u9 l5 G$ W) n @" c) I" g231. <message>手机号格式不正确</message>
4 a1 R. x0 g# s+ k232. </field-validator>
- A! r7 t! s, o233. </field>
# v9 l0 Y+ g, } Y! s234. <field name="age"> ! n( g- Z; N O+ j, F' m3 S
235. <field-validator type="int">
9 N5 h! f8 w3 Y! J236. <param name="min">1</param>
: {& \/ w! l4 ~4 O8 H1 K- `237. <param name="max">150</param>
4 N- S5 [2 R( w" u238. <message>年龄范围不对!</message> 0 M0 G3 h! }" i+ c% h3 a
239. </field-validator> . q) K6 y" C* ]/ d. T. T+ m: v
240. </field>
6 z k4 d, B- }241.</validators> $ j0 P! D, ~& ^# @; Q x
242. / k; |; R6 N2 }8 ]
243.校验器的路径:com.opensymphony.xwork2.validators下的default.xml中 6 s4 S3 L, G7 ~5 v4 |
244.二、指定方法
1 m4 H1 `1 @) {' s7 \245.文件命名:类名-配置中actiono的name-validation.xml
2 h. N* U: P! {% T2 E3 k246.
4 C, q4 s% u9 N3 i/ J B. N( O' Q/ g247.15.国际化 # d: R; q$ t6 t$ z; h [
248.全局范围、包范围、action范围
5 ~) n' W3 v8 h' _( `# V0 D249.命名格式: / n9 i: @6 K. ?$ W2 M8 F
250.baseName_language_country.properties
( u' o! S0 u2 k% `251.baseName_language.properties 3 x0 {' O5 Y' }( e: m0 C% `
252.baseName.properties
) @' U1 R/ w' K253.baseName是资源文件基本名可以自定义,language和country必须支持java的语言和国家
. e$ j3 ]+ d+ k, ]) b# d7 v254.中国baseName_zh_CN.properties
# Q( y! z) s; v! q3 P9 Q255.台湾baseName_zh_TW.properties 9 q) K9 {' E8 m0 }
256.美国baseName_en_US.properties 6 C* C2 Y; W, R
257. + A- G4 K8 w8 `" G5 O
258.在properties中MyEclipse支持自动将中文转换为Unicode编码
8 c. p; B# N/ x5 W: C2 } i259.利用jdk提供的native2ascii命令格式转: / O- d2 I6 w% p0 h- K9 |9 M
260.native2ascii 源文件.properties 目标文件.properties ! ?- r/ a/ x, h+ _9 r7 O2 `
261. , J& p. X4 Z( }" a
262.通过在浏览器中改变语言就可以再语言间转换 ) a. n5 N' e3 d% Q4 L. j
263.一、全局:<constant name="struts.custom.i18n.resources" value="资源文件基本 5 A( f/ p! Q8 R
264.*在jsp页面是用<s:text name=""/>标签来输出国际化信息 name为资源文件中的key 0 C+ _( \' ^+ ~& _) K
265.*在action中可以继承ActionSupport 是用getTest()方法得到国际化信息名"/> 第一个参
8 `+ n& A6 B; {) r266. 2 S$ i4 P8 W$ M' G9 t( Z8 K8 n
267.数为资源文件中key & b- [/ A( n# ^7 Z3 @0 ^
268.*在表单标签中,通过key属性指定资源文件中的key 如:<s:textfeild name="" key=""/> ; n6 S5 E4 j2 @, u J ~( \1 @. {. b
269.
5 M" N0 v1 a( r3 Q( @& C270.有占位符的表示:
( ^1 H) u" B. U271.welcome={0},欢迎光临!{1} , v3 W( s/ ] W0 i
272.*在jsp页面:
. ^. U, x2 x$ r ^; n6 c) O273.<s:text name="welcome">
. |* j5 j& F' F. @" h4 D i274. <param><s:property value="realname"/></s:param>
5 n! f! a K, U3 u" m; P% Z+ J275. <param>学习</param> / t5 s' z8 d `8 u7 z
276.</s:text> . H) q' Q9 { V7 o
277.*在action类中: ' H+ s$ ~+ \* Y2 b r& h2 H8 J1 k
278.getTest(String key,String[] args)或者是getText(String aTextName,List args)方法 & ~* ^- _7 k/ C2 z" G
279. & L9 l( r4 P0 C2 u
280.二、包范围
- }/ X: t/ J. ? l281.在包下放置package_language_country.properties资源文件 package为固定写法
5 l- m* m2 K% y* z282.该包及子包下的action毒可以访问该资源 系统会先找包资源文件 找不到则找系统资源
; q! t( i4 P/ Z+ ?+ B7 p" ~283.
5 ?. K/ w# Z: c' g# _2 Z284.中的key 7 S }+ \5 a0 W% b, `% S
285.
; z% X: Z& [. T% [0 U9 K" R$ ^+ c286.三:action范围 $ v* s* G3 X, `* D
287.在action所在路径放置ActionClassName_language_country.properties的资源文件 ) P$ X* I8 r1 S- U8 f2 F
288. 4 E) @% ?, A% q3 `: d/ D) [
289.无需任何配置直接从资源文件中获取配置:利用标签 6 D5 x. F5 M, t ?
290.<s:i18n name="资源文件名"> 全局
$ q! S' W7 [+ m0 L% o$ F; ~291. <s:text name="welcome">
, C- Y0 I& T$ p" z6 x% y3 k& d292. <param>小张</param>
! F; b, `% y, ?/ Z7 u' M+ J293. </s:text>
, s; ]7 C* k' G r3 v% d( T9 `294.</s:i18n> & f9 r3 z* Z, P' b+ }, |( |) i) A
295.<s:i18n name="路径.package">从包中
8 z" L6 R* |- e4 O% _! \0 o6 a! M296. <s:text name="welcome">
/ Q \5 l6 ]" S, u- T6 f" R297. <param>小张</param>
: ^5 u- j g3 y; O298. </s:text>
+ y; g4 g) x5 S299.</s:i18n>
9 ^ M+ _4 {, U: ^, d9 U$ q300.<s:i18n name="路径.ActionName">action $ ~& v3 E2 t# k% F: M+ k9 Y
301. <s:text name="welcome"> 6 t- K4 _( {0 w1 J7 ]1 l
302. <param>小张</param>
* N& D1 Y' y" |9 n' |303. </s:text>
9 N0 Z( s+ t8 [$ ~- J304.</s:i18n>
6 A2 `9 L1 o$ E- Q! X305.
" [4 W, k1 L' x! b- u5 d/ G306.16.OGNL表达式语言 ( |* J2 b6 g. ]0 v; ]
307.类静态方法调用格式:
# J; ]; {; j" C( M% r- ]/ C308.@类名(包括路径)@方法名 , g7 e1 W2 M. y* @4 m. {
309.
5 g. _) L9 q1 A% b. ?! ?310.OGNL Context(ActionContext)访问上下文中的对象:session、request、application、
# e6 E: }' A6 P: b311. * Z% s G3 W7 F
312.attr、parameters、OgnlValueStack 6 F& Y" M' v, k$ R
313.访问对象格式:#session、#request 7 u5 V/ q8 O2 C8 j3 X
314.访问对象属性格式:#session.userName或者#session['userName'] 3 X; t* ]" b Q+ T, e
315.其中OgnlValueStack root变量无需#,他访问对象属性时从栈顶开始找
/ \# v- a* f- v! I) S3 c. q316.需配合struts2才能使用,也可以用EL表达式(只能访问值栈中的属性)直接访问对象的属性 - _. p) Y- E$ x7 G d; ` s
317. . k8 ]' f# m8 t% N$ j( |: a; a4 J
318.17.常用标签使用 5 | o# _. B4 ]% e
319.*构造list对象: : q' q3 |8 G w* B& s$ s6 B
320.<s:set var="list" value="{'1','2','3'}"/> 6 O/ K9 z" v' B; F
321. # H1 v$ O" Z* V' F- A
322.*迭代list:此标签迭代时将当前对象放到栈顶 ! M# {8 {1 j7 a1 [
323.<s:iterator value="#list"> " a2 i# }% B% E+ \" D
324. <s:property/> " `" A& g2 c i1 J
325.</s:iterator> : @& C; X+ G- \* u: ]4 C4 n. O
326. ) K" f3 K, B% S3 [" |# M* P% i
327.*构造map对象: }$ b6 |* s! y" p# b) k5 Y8 O
328.<s:set var="maps" value="#{'key1':90,'key2':20}"/>
1 I# [# h5 ~) O) a329.*迭代map: ! X$ k: j9 U! P- D6 U! y* b5 q
330.<s:iterator value="#maps" status="obj"> ; e5 R/ x5 W F! }
331. <s:property value="key"/>=<s:property value="value"/> ( W+ {6 k1 m3 T3 q( i$ l1 _
332.</s:iterator>
M# G+ N2 ]- l( Q2 H& W333.obj包含方法:
0 D; F- _4 u. r: g5 ?5 r9 i& G334.int getCount();返回当前迭代了几个元素
6 P4 p) a- X- v335.int getIndex();返回当前迭代元素的索引 ( i0 g1 C0 j5 }' ]
336.boolean isEven();返回当前使用元素索引是否为偶数
( _# I* u1 T5 m9 A8 a! D( C337.boolean isOdd();返回当前元素的索引是否为奇数
I" ^& T! K7 w6 B7 T3 G338.boolean isFirst(); - K6 `2 l7 L% l: p) h3 T
339.boolean isLast();
) h7 n) A8 D! n& n4 P6 N, D4 j340.
, J3 ]4 ]8 V! q+ N- ?" t% S' K4 n341.*判断元素是否在集合中:
9 l) c, S& L" K342.<s:if test="foo" in/not in {"foo","tar"}>
: N9 t9 {" y! ]' a343.在 $ s/ l9 ^" k( i2 j. d; D
344.</s:if>
/ k, ~) q" }6 c345.<s:else>
- I0 T7 l; p3 _346.不在
; t( \5 j4 g# W: H0 b- o347.</s:else>
, T$ V6 R+ t0 |# y2 n0 a& S348.
( i. y, t! U+ [: ~! Q/ V349.*投影 在大集合中过滤数据放到小集合 例:Book对象 i, r, ]8 h6 i0 Z
350.?表示获取符合逻辑的元素 8 H7 ^6 \$ N% b( Q
351.^获取符合逻辑的第一个元素
g3 f8 l* ?; ~6 o352.$获取符合逻辑的最后一个元素
# a l9 w0 W9 K: W5 T353..{}表示从大集合中筛选到小集合 4 s6 S6 _' a9 T
354.<s:iterator value="books.{?#this.price>35}">
7 S* c* U' K" |7 e ~355. <s:property value="title"/>==<s:property value="price"/> ( s" _& Y) H; i' i0 t
356.</s:iterator> . U; `1 j z: B, v' F
357.
# ~- _7 [& P! e/ H+ o" X5 z9 L# r/ J# n358.*URL标签 & V% L+ y1 k3 _$ c4 q2 a4 O5 y$ i
359.<s:url action="" namespace=""> 5 R0 `3 t3 R m( y% g* b. J
360. <param name="" value=""/> 1 k( b9 e" e: y h" d) ~
361.</s:url>
, l2 m% H* v) L362. " u' L& J7 [) a/ Y9 ~! |+ v
363.<s:set name="myurl" value="www.baidu.com"/>
7 S: u9 {9 m, G& l9 F364.<s:url id="url" action="hello">
( [: R7 |; C7 k( N1 I2 U& k365. <s:param name="request_locale">en</s:param> & e& x- A. k# m: \5 x5 G" q
366.</s:url><s:a href="%{url}">English</s:a>
! s, ^% A* Y% Y367.如果href="#myurl" 他会把他当做字符处理 要这样:
& F( u2 D7 ^2 s P- s* y368.<s:a href="%{#myurl}"/> & H: ?9 S p3 o8 y! _9 p" [/ r3 [/ c
369. 3 \6 |. f' C1 g' _3 e
370.*复选框 集合list和集合map . o% t a# t3 a9 a
371.集合list
6 M* ]. U z$ C0 I372.<s:checkboxlist name="list" list="{'java','c#','c++'}" value="{'java','c#'}"/>
. j6 W a7 `- i6 Y373.value属性用于指定被选择的复选框 # R0 M* G; A, t1 W. M
374. . H3 q2 O1 F+ U) B& p
375.集合map : o4 ~; o! s- y3 r: W
376.<s:checkboxlist name="map" list="#{1:'java',2:'c#'}" listKey="key"
9 A x$ k# N9 Q& j377.
" n' ]- b! ]6 V& d- F4 s8 s378.listValue="value" value="{1,2,3}"/>
, @ q s$ ]; R7 i3 P+ L5 n: I379. 4 z6 \6 C( f% O- |5 T; G: r
380.*单选框
" k7 Z# [/ J3 A A3 m381.集合JavaBean 5 W5 y A7 ^5 ?4 g' T5 H$ R
382.<s:radio name="beans" list="#request.persons" listKey="personid"
7 n* R0 l, z! f$ R383. " w3 Q; L! N( b* b8 P* H) {
384.listValue="name"/> ! L& \9 M, }$ P- Z8 A# F
385.集合list 2 U+ d1 `$ e' l2 t
386.<s:radio name="list" list="{'java','c#'}" value="java"/>
1 \1 g" M* p8 u0 x l! C' |; Z387.集合map
9 k+ d+ _( c. H) n5 f388.<s:radio name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value" 1 F; r! [+ R9 R0 ~( f
389.
' a9 W* n& D+ h390.value="1"/>
$ i+ I7 O" m+ ]% Z% |' z7 C% n& z391. " b5 o/ R9 Z: Q h4 c$ E
392.*下拉列表框 1 X1 `/ w f9 s
393.<s:select name="list" list="{'java','c#'}" value="java"/> ) q# n R) u/ O9 T. n
394.<s:select name="beans" list="#request.persons" listKey="personid"
' A2 A) C- {( y2 {: ~; n395.
3 @2 e$ n8 j/ }) Y396.listValue="name"/>
. K/ Y- ~ P2 a+ y+ }# w) P) ]397.<s:select name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value" * p! f3 X; V+ \8 x5 u9 C# M
398.
\. N {/ K9 L399.value="1"/>
x+ i: Z9 @/ \$ k2 a400.
! \) k4 B6 ~0 z; j1 x6 i401.18:防止表单重复提交 : ^5 s$ U1 K" S8 w# C
402.<s:form actio="" namespace="" method="post"?
: p( {. Y8 a; T5 f403. <s:textfield name="name"/> 8 v n4 L j- k( ^. C
404. <s:soken/> , W% u# G: U2 m' d P
405. <input type="submit" value="提交"/> : e: E+ F9 d4 i( f
406.</s:form> 4 U# Y0 A1 w2 H3 a" s- L9 n
407.引入拦截器
4 \ n4 t# O2 Z408.<interceptor-ref name="defaultStack"/> % F. [( n, o- L% X ~
409.<interceptor-ref name="token"/> & B: J( [' n& t
410.<result name="invalid.token">index.jsp</result>///发现表单重估提 |
|