该用户从未签到
|
沙发
发表于 2014-03-12 22:26:39
|只看该作者
201. 1、继承ActionSupport,再写方法validateXxx() 其他同上一样 / N% I6 L. p2 x( K
202. 6 r: O. S& ? z' x4 P5 M" y
203.第二:xml配置进行校验
7 t j$ G( T* [204.一、所有方法 3 s# d0 d& @5 b! @2 p
205.1.继承ActionSupport类,校验文件与action同包 命名ActionClassName-validation.xml
, }) Q* Y0 m) e( Y/ W206.
; `# Z+ T* W- M$ J207.;
1 o- S# \. s0 _, x$ x208.文件内容:
( F6 A2 y2 p B4 J209.<?xml version="1.0" encoding="UTF-8"?> / q8 g+ s1 @0 n) O
210.<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.03//EN"
# A ^1 |- w( |3 U+ ^; G% o211.
( w3 A0 c8 h) I. k212."http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
Y# j& \8 M) j5 f: {* h213.<validators> 5 j+ ]: c1 b I# s" M! A+ F
214. <field name="username"> 9 @( ~9 g( Y; T
215. <field-validator type="requiredstring"> 5 r. O% t2 i- |5 o `! d
216. <param name="trim">true</param>
8 b$ T! M9 S1 ?, v217. <message>用户名不能为空!</message>
9 Y J1 N d9 T218. </field-validator>
& o, ]6 |. b: Q. }1 q219. <field-validator type="tringlength">
. U* D2 \, l% M2 ~1 E# V4 q% B220. <param name="minLength">4</param> 4 G( n" o1 L d) [0 b
221. <param name="minLength">10</param> + @0 Q$ b; ~8 {, }& q+ M/ e) L
222. <message><![CDATA[用户名应在4到10之间]]</message> / h7 m/ L0 y8 q" h% Q4 S8 \# X3 E
223. </field-validator>
0 h# F# ]* z b0 x224. </field>
) ]- \& S1 H/ S225. <field name="mobile">
& S b: l# ]! E8 H, A& I0 f226. <field-validator type="requiredstring"> * b2 ]+ L8 o( n, P1 D* X, M; Q
227. <message>手机号不能为空!</message>
. X# |) z8 }4 W. f5 Q228. </field-validator> / @3 l+ y) c: W1 W. X: `/ Y; i
229. <field-validator type="regex"> $ u7 o1 o2 Y. ~& t$ S( {; C4 I4 l
230. <param name="expression"><![CDATA[^1[358]\d{9}$]]/>
! P2 U$ e. N$ i1 k; [231. <message>手机号格式不正确</message> ! G% m& E$ v& L: x' u' \- b
232. </field-validator>
' a. z9 `7 I+ x% Z) u3 n233. </field>
: z m& O. z! i( [4 P5 E7 S* W234. <field name="age">
& w/ }) E$ c- L235. <field-validator type="int">
' n. o8 H! r& q$ D5 E* f3 Y236. <param name="min">1</param>
6 k o: q2 w# h) d& K W5 W237. <param name="max">150</param>
+ o; t6 `, U& Y0 s238. <message>年龄范围不对!</message> ' G8 S6 U& w# E9 u7 g9 V4 D
239. </field-validator> ( p: L1 ]. o1 m9 G
240. </field> ( y: {3 D J, `
241.</validators> & f0 o8 H; ?- K# o @! C
242. - ^# S$ r' @' |7 E- p$ L
243.校验器的路径:com.opensymphony.xwork2.validators下的default.xml中
2 E. t7 \" V/ N* n244.二、指定方法 . g: f9 G& \7 r
245.文件命名:类名-配置中actiono的name-validation.xml % r6 ~% s* q7 W
246.
' Y A" C4 Z5 E `+ x4 v247.15.国际化 ! B! Y2 i0 U" O$ K5 T! f
248.全局范围、包范围、action范围 + `3 B Q* v) O/ y
249.命名格式: 7 s( v3 z3 ?4 M) O9 d: F
250.baseName_language_country.properties & F2 Y; q' J! E
251.baseName_language.properties
6 Q2 n( G! X; p3 N z. a [5 Q252.baseName.properties / ^: a' }$ k. n5 H, c2 k2 Y I1 N% J8 K
253.baseName是资源文件基本名可以自定义,language和country必须支持java的语言和国家 ' n N4 _9 ]! ^+ @& S) s6 T
254.中国baseName_zh_CN.properties 4 C2 i$ J# L1 l& x3 j1 ^6 w
255.台湾baseName_zh_TW.properties
# J4 L! j3 D. w, x: Q/ C ~2 k256.美国baseName_en_US.properties ( \, b5 G9 g, Y* V3 [ A, r
257. # R1 N! }" u" [5 V0 o$ c! F
258.在properties中MyEclipse支持自动将中文转换为Unicode编码 ! [6 h$ A! @- F
259.利用jdk提供的native2ascii命令格式转: , _3 ~1 e$ I5 V. r% W. g2 E! S
260.native2ascii 源文件.properties 目标文件.properties
0 F: [5 R; w: K: h! Y% o, L261.
. Q& m q, C: ]262.通过在浏览器中改变语言就可以再语言间转换 * A* S* c( }: o# F, W1 L- `
263.一、全局:<constant name="struts.custom.i18n.resources" value="资源文件基本
; c8 m# Z: U5 H( ^4 e4 N( X; H264.*在jsp页面是用<s:text name=""/>标签来输出国际化信息 name为资源文件中的key
8 ?. K6 i8 A; n( D+ q265.*在action中可以继承ActionSupport 是用getTest()方法得到国际化信息名"/> 第一个参 ( j$ ^# z# P9 ]; w3 l
266.
4 K6 a) D& I: t" a: [267.数为资源文件中key - O# L* f9 Q+ Y( o& p
268.*在表单标签中,通过key属性指定资源文件中的key 如:<s:textfeild name="" key=""/>
6 h, _3 ~! |& H6 N+ H' \" L1 s269.
9 }: q) I/ d, M- J270.有占位符的表示: . E; ^% z& i; a) P
271.welcome={0},欢迎光临!{1}
! X# w D* H2 Q7 j. y& W: K+ _! r272.*在jsp页面: ! W: l1 q2 Z8 `/ n: T
273.<s:text name="welcome"> . a+ J1 R( t4 ]
274. <param><s:property value="realname"/></s:param> # a0 D3 |) m4 w. J* V: x
275. <param>学习</param>
! X4 U `3 T( _! ]: `276.</s:text> ; p9 H% W* P8 U4 h+ u3 a, u0 u
277.*在action类中:
' o7 z* F% U8 k3 N278.getTest(String key,String[] args)或者是getText(String aTextName,List args)方法 6 ^9 `# V& I Z3 l4 ~% _ o* m- X7 V
279.
9 Z Q! s. i7 Y+ H280.二、包范围 * g4 r R7 x% i# R+ z
281.在包下放置package_language_country.properties资源文件 package为固定写法
0 E* M0 X- Q+ t+ m& R282.该包及子包下的action毒可以访问该资源 系统会先找包资源文件 找不到则找系统资源 ) D2 S- m4 U" _. h: C4 Z; ]. V
283. 5 B* \2 i% C3 U# Z
284.中的key ) o! c7 O6 {0 C, A, G. j
285.
6 e7 u0 {6 m: y& s6 p; t8 V( \, ~$ A286.三:action范围 + z8 E! S M9 U; y
287.在action所在路径放置ActionClassName_language_country.properties的资源文件 5 w0 X( Y t& k V
288.
" x$ o& t* m6 E4 U289.无需任何配置直接从资源文件中获取配置:利用标签
d9 w- B/ o, X$ i2 a5 C290.<s:i18n name="资源文件名"> 全局 . f" P% j$ a6 u" L4 Z
291. <s:text name="welcome"> # K" I6 O( d, O R9 M
292. <param>小张</param> : ]8 }# Y. I, ^% H+ `$ F
293. </s:text>
& `* n W1 g2 H" h3 R294.</s:i18n>
+ s4 f* y% F4 r+ M% J& P0 d295.<s:i18n name="路径.package">从包中
7 r) x8 Z Q- o5 [296. <s:text name="welcome">
& g j) {+ A: T# T F% D: @5 q; H297. <param>小张</param> . p9 h k" e3 t3 }, O& a5 v9 r9 N
298. </s:text> + R( s, }+ @6 a% E; u9 y, c6 n
299.</s:i18n>
" P8 s. x3 v7 Q300.<s:i18n name="路径.ActionName">action
' m' i- p1 y) G4 w- D301. <s:text name="welcome"> ( H0 [8 P. ~/ ` j6 ]
302. <param>小张</param> 4 x8 _7 X% Y" }$ V( k. |. `, `" p
303. </s:text> ) f2 V* y. [2 o/ U9 F, [' k2 O
304.</s:i18n>
* f9 b4 M5 k3 }+ k305. - l5 [# l, T5 t
306.16.OGNL表达式语言
4 T- u! @8 ]0 t6 ~/ G307.类静态方法调用格式:
3 [) `8 H, v" i2 p% K: G308.@类名(包括路径)@方法名
: t0 Y. c% W/ N: x0 D; V4 t309. $ Q. O, m/ \7 \6 I# w
310.OGNL Context(ActionContext)访问上下文中的对象:session、request、application、
9 E8 e) u7 b* C( H6 t2 c311. 7 ~, j$ _5 ?; M! S! Q$ R! V% O, t
312.attr、parameters、OgnlValueStack & B" m! V f. @! x m7 y8 z
313.访问对象格式:#session、#request 9 }1 t3 T' G0 S0 _! q+ L
314.访问对象属性格式:#session.userName或者#session['userName']
! H) D# v! d$ J1 i q315.其中OgnlValueStack root变量无需#,他访问对象属性时从栈顶开始找 h' W( L: d0 Y7 q3 h0 L2 J- J
316.需配合struts2才能使用,也可以用EL表达式(只能访问值栈中的属性)直接访问对象的属性
- t% A$ z5 W+ |6 K317. # H3 W0 Y2 m% I/ y! r# ^
318.17.常用标签使用 ) f. x2 A) x9 Q6 h
319.*构造list对象: & r# x/ y" Q: T( @" a
320.<s:set var="list" value="{'1','2','3'}"/> % S6 h1 d7 d2 t5 ?
321.
' X' H2 @" [9 o( d322.*迭代list:此标签迭代时将当前对象放到栈顶 * R- N1 n9 O7 F/ ?5 j! z9 l
323.<s:iterator value="#list">
2 ^9 `/ ]9 y( z4 y% L: D0 D5 g& _3 [324. <s:property/> : @# Z* d! h. \% @ @ X
325.</s:iterator>
, t* x, \& X7 m9 X) i) D326.
- }" T; Z2 @. U) {% X327.*构造map对象:
7 d" q% X; m3 O* u328.<s:set var="maps" value="#{'key1':90,'key2':20}"/>
4 n6 q7 k( M+ |329.*迭代map:
9 F2 j+ s! D7 M2 |; k330.<s:iterator value="#maps" status="obj"> % a/ o! h, K3 t/ i H
331. <s:property value="key"/>=<s:property value="value"/> : B [1 s! D4 O5 Y3 F
332.</s:iterator> 7 ?; t$ z5 y1 A3 ?
333.obj包含方法:
9 n/ ~1 }; G9 v334.int getCount();返回当前迭代了几个元素 # W( a3 A% v! f2 T% A6 I) m
335.int getIndex();返回当前迭代元素的索引
4 j6 y3 ?+ X+ L+ _. C: C336.boolean isEven();返回当前使用元素索引是否为偶数 5 W. d( _3 ~4 ]
337.boolean isOdd();返回当前元素的索引是否为奇数 6 I- R# i/ x$ T2 l: e
338.boolean isFirst(); 7 q! N8 i7 h2 X
339.boolean isLast(); 8 b' o) Z+ `9 g" j* h: y0 D
340.
+ Y2 I$ p5 X, S: v$ A341.*判断元素是否在集合中:
7 n& h; M% ~ V* |/ r9 Y- ~342.<s:if test="foo" in/not in {"foo","tar"}> + a" \1 p/ I6 ?0 Q# B; K
343.在
: B* u/ c) l- L344.</s:if>
& r6 @% t) N0 E2 I5 M" ~345.<s:else>
& ^6 n, ~' r" M3 y4 z346.不在 ; W5 V2 s- p- H2 z G
347.</s:else>
0 L1 P R5 C v# p6 K& p348.
" M. [' f9 A$ ~8 t5 j! k: `349.*投影 在大集合中过滤数据放到小集合 例:Book对象 8 R5 {3 h9 e2 V% k( G7 t
350.?表示获取符合逻辑的元素 - N1 K, C' A, l @9 w1 B) _' g
351.^获取符合逻辑的第一个元素
5 @7 r( |! r4 H& m q% J* P2 X; I352.$获取符合逻辑的最后一个元素 ! n' W3 m& y: d1 m+ A
353..{}表示从大集合中筛选到小集合
6 g+ s& D. v$ X! q3 {354.<s:iterator value="books.{?#this.price>35}">
2 O; e) q' Y8 Z5 M& a: g. |355. <s:property value="title"/>==<s:property value="price"/>
' M+ Y: X/ Q2 K2 W x4 s% A2 w7 y356.</s:iterator> % @: t B! A" ~7 u
357. - k" ~( t4 w" j! p* M
358.*URL标签
& F3 e6 t$ |7 @- Z% }* a359.<s:url action="" namespace="">
6 K! r$ [* e6 j/ ?# ?" [# z4 {8 Q360. <param name="" value=""/> ; F2 _+ s3 s6 m
361.</s:url> 1 M3 v( ?6 L: q# i5 k$ Y
362.
( {3 C% L( G3 B9 |6 p' E363.<s:set name="myurl" value="www.baidu.com"/> 5 `; E# D+ r, |
364.<s:url id="url" action="hello"> 2 w+ }7 \) V1 ]. ]* E$ Y
365. <s:param name="request_locale">en</s:param>
2 @# W% P3 a- i& z366.</s:url><s:a href="%{url}">English</s:a>
0 s8 Q" t Z; K$ R367.如果href="#myurl" 他会把他当做字符处理 要这样: : E5 @) ^' c5 ~; M, z$ v
368.<s:a href="%{#myurl}"/>
/ ~( `! F% \4 n3 P369.
6 [- i4 H. I' E3 n" N: K5 a370.*复选框 集合list和集合map . C8 p& |/ y( I# V! D9 j
371.集合list
; P% x+ [" P6 u372.<s:checkboxlist name="list" list="{'java','c#','c++'}" value="{'java','c#'}"/>
; L& G4 Y; O, n# G, `) m373.value属性用于指定被选择的复选框 + L1 w& X0 d! {( Z" K$ _( w( s
374. % E/ w% `* G5 v% Y, o
375.集合map
' z: R; a2 `9 B5 {1 N6 h376.<s:checkboxlist name="map" list="#{1:'java',2:'c#'}" listKey="key"
% T+ E3 @) r$ f: z* j0 @* w+ j377. . |9 E. w+ s* h3 Q- ~' c
378.listValue="value" value="{1,2,3}"/>
1 e; ?$ b L7 ?" O, `$ K- V0 u379. ! Q4 u0 Z( m4 C0 S7 |( p
380.*单选框 . {' k& D" v, [) c$ Y
381.集合JavaBean * R2 m7 k# u, f/ l. z/ a
382.<s:radio name="beans" list="#request.persons" listKey="personid"
8 g2 b' U; E0 ~2 v t3 m5 W383. L+ G& M$ O! O4 m! R2 F0 i I
384.listValue="name"/> 7 R6 O/ {; x+ A' G
385.集合list
9 }2 a0 R, `2 m- b- o386.<s:radio name="list" list="{'java','c#'}" value="java"/> 7 O3 [ g# X _; B7 w: Y. q2 R
387.集合map
9 c+ V! W5 i Y, m, C388.<s:radio name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value" " m+ y$ H9 W1 q6 W# A' d
389. * v: a/ q. b( Y: m, P2 {
390.value="1"/> 9 z% ?1 F9 _& o8 N# x3 N; d
391.
% |' M8 _1 u" X3 Z392.*下拉列表框 * l4 f. Z% z; I6 k1 }* ?# h! ?: C
393.<s:select name="list" list="{'java','c#'}" value="java"/> # w9 J( l7 | m4 S$ T$ b; a, i
394.<s:select name="beans" list="#request.persons" listKey="personid"
$ H9 i$ I: \! m395. % s6 i1 ^/ t" S9 k5 H7 j# i
396.listValue="name"/>
' O( U+ m# ^+ x- S( ~397.<s:select name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value" 3 ?1 R; Z5 d3 ~6 M. M
398.
: M& Y6 b7 j& l; G9 h( u4 r7 J1 c399.value="1"/>
8 }+ T# S) h) {! j400.
" [# L# G1 G& V" }8 a401.18:防止表单重复提交 / G: c2 P) m5 D I
402.<s:form actio="" namespace="" method="post"? ; z: K4 r h; N0 I, A% S T; H
403. <s:textfield name="name"/> % J$ U' X+ ^0 \( b6 a
404. <s:soken/>
& b1 x( q* y! H, M$ G8 N) q405. <input type="submit" value="提交"/>
6 b {3 G% s3 T+ u406.</s:form> 0 v# O0 n3 W% h
407.引入拦截器
h7 u2 ~$ l0 g& U5 i408.<interceptor-ref name="defaultStack"/>
3 i! ^- k# q5 I/ j4 H* D3 F6 s9 \409.<interceptor-ref name="token"/> ! s, ?: `$ n, l9 h
410.<result name="invalid.token">index.jsp</result>///发现表单重估提 |
|