该用户从未签到
|
沙发
发表于 2014-03-12 22:26:39
|只看该作者
201. 1、继承ActionSupport,再写方法validateXxx() 其他同上一样 : `$ i) Z9 I/ P
202. ! w* N) S- m: x' ?' ^+ y% { X4 f
203.第二:xml配置进行校验
0 `2 v3 d3 g. k& ?* _$ w204.一、所有方法 $ S8 u }4 r$ I
205.1.继承ActionSupport类,校验文件与action同包 命名ActionClassName-validation.xml % x+ }& Q: l! I2 r1 o0 J
206.
/ [( t3 O' g5 `( a: d207.; c* l5 [; i. U' t/ V0 ~! W- _
208.文件内容: . n0 E: g9 G% B. W' f+ z4 b1 r% y
209.<?xml version="1.0" encoding="UTF-8"?>
: {' i5 W N5 R1 y' d0 X1 w$ N% H210.<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.03//EN" 0 j+ i6 T* s: D, A4 e
211. . y2 P% \: U! g; v0 v' l
212."http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> 0 e$ Y4 O; @* P" D' K+ }7 D
213.<validators>
& g3 p& Z7 `7 w9 L: d6 R) i0 ^2 J214. <field name="username"> % ~) K4 M9 \2 S
215. <field-validator type="requiredstring"> ( ~$ R4 z1 @6 C& R& v: ^1 V6 e1 R
216. <param name="trim">true</param>
3 c' M7 p T3 J8 H+ f, C217. <message>用户名不能为空!</message>
9 ?- n6 o% c) t8 Y/ L% q( T* i218. </field-validator> : P& _& v/ S3 ^! {" c
219. <field-validator type="tringlength">
; r, @: C% v2 I8 M2 `- R220. <param name="minLength">4</param>
5 f, n2 ^* t$ E! ~221. <param name="minLength">10</param> . z* U8 E! M8 {1 x8 N- R% o: a$ m) L
222. <message><![CDATA[用户名应在4到10之间]]</message>
7 l. @. g3 O! ^, h223. </field-validator> 8 g4 o" t: [2 v8 V; o
224. </field> 2 d( `3 ]! P0 u" f
225. <field name="mobile"> / W, N3 c% }0 B7 F; z
226. <field-validator type="requiredstring"> ; p2 H% R3 S/ N0 f" f* n# E0 Q
227. <message>手机号不能为空!</message>
4 K! d* J4 v/ w/ X/ t* r6 h228. </field-validator> : W* G' p) V( K( j5 z
229. <field-validator type="regex">
& S: {% Y- y R- k: u1 W230. <param name="expression"><![CDATA[^1[358]\d{9}$]]/>
4 @& Z! i3 w# q231. <message>手机号格式不正确</message>
0 x6 ^% ^1 Z" M7 [, i! S; }232. </field-validator>
; D6 R* e5 r8 o" ]233. </field> 7 w3 M8 c: L# e( k+ ?% _3 I6 s; P
234. <field name="age"> 0 x, h+ L3 P0 n0 T( N* o) b
235. <field-validator type="int"> - `% o/ L& V- s; n2 }) h
236. <param name="min">1</param> 7 `+ H7 }8 T# u5 \. d3 ?% Q. t
237. <param name="max">150</param>
- r# A% S: }. b' \& S. L238. <message>年龄范围不对!</message>
9 k0 c* a" o1 _239. </field-validator>
8 B. L: n$ {1 |: O" R! x! \; O240. </field>
; g1 ~8 M& o/ p% a* b" O- S) q241.</validators>
+ h* ^' P2 f) ~9 }3 l& ?- }242. + B) X6 h7 z# ?. v7 H
243.校验器的路径:com.opensymphony.xwork2.validators下的default.xml中
5 ]6 ^! W5 C" t1 x/ W/ g( X244.二、指定方法 9 f5 \' r8 y1 Z; z
245.文件命名:类名-配置中actiono的name-validation.xml
& n! ^2 C+ P# y% a& {246.
9 D" @! q* h" A; p8 n, ^& D9 B247.15.国际化 6 d7 Z, O- k- h' m( K x: B4 v' e% e
248.全局范围、包范围、action范围 . o2 [' D3 T# H. [$ X4 v
249.命名格式:
7 X: [6 ]1 \2 {0 d/ o- J5 B250.baseName_language_country.properties
$ i$ o& w2 r$ B0 R9 t0 G251.baseName_language.properties
. S+ c! L$ y! ~ U& o2 O9 H1 g5 P252.baseName.properties
1 [7 `( d( ]( h; `! e8 N8 m253.baseName是资源文件基本名可以自定义,language和country必须支持java的语言和国家 ! T/ c9 W, `& z# {8 z5 w- M
254.中国baseName_zh_CN.properties % ~! t* P# X3 j! u( Y& z. D
255.台湾baseName_zh_TW.properties & R% X, g. }! | l. @% d) ^/ _) m' \: P
256.美国baseName_en_US.properties + {7 t. `, r: f
257.
6 ^+ T, p( U- e3 W+ R% N. ]258.在properties中MyEclipse支持自动将中文转换为Unicode编码
I; w5 x/ ]1 p! q$ N( E0 V259.利用jdk提供的native2ascii命令格式转: ( T4 T# m7 U( h( p, _
260.native2ascii 源文件.properties 目标文件.properties
" Y2 W2 @: B' B9 ^ V261.
' |& u% G. c7 a' W, x* ]262.通过在浏览器中改变语言就可以再语言间转换
+ H( \( n- h2 a2 c* i, ]8 j263.一、全局:<constant name="struts.custom.i18n.resources" value="资源文件基本
' p7 Y, {; z) o* ^# w" z! T% U264.*在jsp页面是用<s:text name=""/>标签来输出国际化信息 name为资源文件中的key : k7 |6 V7 R9 ^
265.*在action中可以继承ActionSupport 是用getTest()方法得到国际化信息名"/> 第一个参
$ d- h/ l9 S1 e* c4 M5 q4 k266. 7 L2 Q7 {, l) v
267.数为资源文件中key
. [/ c4 t5 _" b- d- ]4 P268.*在表单标签中,通过key属性指定资源文件中的key 如:<s:textfeild name="" key=""/> % E9 }" U. t. H+ ? v* Z6 s
269.
6 v1 t4 }' u, v( h3 q% Q270.有占位符的表示:
; R* V! s. W3 m a4 V271.welcome={0},欢迎光临!{1} ) Z- C9 C+ N1 W5 x# M/ r' k) s
272.*在jsp页面:
6 D* {9 A: Z% b273.<s:text name="welcome">
" X5 ^6 g, H% S6 y) ]274. <param><s:property value="realname"/></s:param> 9 X. s7 s& T/ N# q- Y
275. <param>学习</param> $ N9 \* M `6 J. ? }5 {! `
276.</s:text> 4 j5 i* A6 G: u K0 q
277.*在action类中: ! H& `& M* ?( h# R! l: y
278.getTest(String key,String[] args)或者是getText(String aTextName,List args)方法
$ L5 ^( j5 F) ?0 [4 l2 ?279.
; X5 w/ h6 s" q( T& U$ L280.二、包范围 # Y: g. m) U' Z
281.在包下放置package_language_country.properties资源文件 package为固定写法 3 M- y3 }; W, m* T
282.该包及子包下的action毒可以访问该资源 系统会先找包资源文件 找不到则找系统资源 & p- l2 V- d' m0 b# t
283.
) C8 v0 @0 f" @! P/ c. t2 B284.中的key
& j8 z- H) N( a: A8 X285.
# H+ w9 f+ S2 `) j: s9 L286.三:action范围
6 a9 d: c! O, z8 W3 O287.在action所在路径放置ActionClassName_language_country.properties的资源文件
4 L k0 C& O, \" J3 h; _' W/ F288.
& B. w( l& n6 F2 R/ t289.无需任何配置直接从资源文件中获取配置:利用标签
2 w" Y8 q& ]& \5 q290.<s:i18n name="资源文件名"> 全局 - S! F' v- ?3 W7 m* y5 `4 f
291. <s:text name="welcome"> " U7 C, B/ E6 }' M- q* w+ U; l
292. <param>小张</param> : d$ \7 P9 D v
293. </s:text>
~3 ?2 p( Y# ~3 C \294.</s:i18n> , ], M! u4 O6 M: }) [
295.<s:i18n name="路径.package">从包中
/ ^9 n) F* `: B2 Z& ?296. <s:text name="welcome">
1 p% a* x, r8 x" T" ]: Z! h- r297. <param>小张</param> 7 J% d' O: b1 m4 s8 J! E: X
298. </s:text> / q8 m3 Y% b$ v. e
299.</s:i18n>
: s. m/ D" i6 t9 g+ r300.<s:i18n name="路径.ActionName">action
0 [. T' d# Z' X4 L- I2 U Z9 N; \301. <s:text name="welcome">
+ t$ S5 y ]! i% B302. <param>小张</param>
! A: v% y, Z D303. </s:text> 5 p/ T' Z+ a2 Z# U& ]
304.</s:i18n> / P4 _" z8 R& V: p4 R e4 }
305.
) S* P2 u7 X& h9 k5 `306.16.OGNL表达式语言 2 x9 [$ S7 Y. ~3 {- V
307.类静态方法调用格式:
. K2 _- {' Z f/ k$ ~+ U' ?308.@类名(包括路径)@方法名
; b) H3 C: c. b, J A' F309.
: E% _: }$ ~" f8 n/ }310.OGNL Context(ActionContext)访问上下文中的对象:session、request、application、
8 J7 E! h0 U6 B311. 2 l3 u1 t# J( ~9 O2 C- Z
312.attr、parameters、OgnlValueStack ( E3 {% u% J2 B# {3 g5 {2 g$ [7 {
313.访问对象格式:#session、#request
; O7 C8 }6 ?. g: M, F5 L, Y1 L314.访问对象属性格式:#session.userName或者#session['userName'] ' P+ {8 l, w9 \3 g7 e# h
315.其中OgnlValueStack root变量无需#,他访问对象属性时从栈顶开始找 ; m2 ^7 l, C! U+ u; }% }8 o& z
316.需配合struts2才能使用,也可以用EL表达式(只能访问值栈中的属性)直接访问对象的属性 + \" H/ s, X/ N. R% e7 h9 h$ }
317.
* x; d N$ o0 m4 J318.17.常用标签使用
* Y4 m- P e1 v319.*构造list对象: - l+ b+ Z( `" _- ]
320.<s:set var="list" value="{'1','2','3'}"/>
- f" a- q, P; V: }- |: I# K8 h321.
: C: M& g% P/ c9 k2 V322.*迭代list:此标签迭代时将当前对象放到栈顶
9 a- I" H% O! B$ O- A# O1 _" z5 [323.<s:iterator value="#list"> 9 V" g. i; x/ k. w3 ^
324. <s:property/> : P3 E. ^8 I6 L& N+ T& S- s
325.</s:iterator>
2 [, t$ ]% e% R0 K- H8 f326.
# q' o( B$ p: x! l3 Y M4 B327.*构造map对象:
1 j; y& g @7 J% [. v1 l328.<s:set var="maps" value="#{'key1':90,'key2':20}"/>
3 m @ n% S9 @% Q3 J) B: _329.*迭代map:
) l- q' M- M6 w5 T330.<s:iterator value="#maps" status="obj">
- A% o- H2 [9 r9 Y331. <s:property value="key"/>=<s:property value="value"/>
; j- _6 |. X7 J( U& A- \4 L332.</s:iterator>
; ]$ |' S& e6 @2 p6 w333.obj包含方法: 3 J) D0 U# @7 z
334.int getCount();返回当前迭代了几个元素 : F3 V5 F+ M# e! G6 b$ z* ?
335.int getIndex();返回当前迭代元素的索引
& g$ [* i) I0 F. K8 b8 B2 |336.boolean isEven();返回当前使用元素索引是否为偶数
, |6 \1 i( p/ [$ H337.boolean isOdd();返回当前元素的索引是否为奇数 2 A! i9 k0 j/ u- _ }) q2 n9 |" T
338.boolean isFirst();
3 z2 D3 C9 {1 d, |0 G5 f4 p8 R339.boolean isLast(); 0 y Z6 {4 M. J4 i# k
340. 4 i# U3 @' G) u
341.*判断元素是否在集合中:
2 J( ~, P% b5 S' d! F# h X* I) m342.<s:if test="foo" in/not in {"foo","tar"}>
/ s0 ~9 j* i' _* A7 i7 J8 M343.在
& K3 P+ @5 B( q) Z" ]344.</s:if>
8 p! k2 {+ p! `2 c; y* A0 J: j' N. Z3 T345.<s:else> 5 L+ Z" y9 k3 y( A( j$ \3 [/ K
346.不在
& b4 s) _' ~+ G+ e/ e7 W+ a347.</s:else> 3 {1 H% i$ x( R$ q! R% \
348.
$ @! f& [# D( u, h3 }349.*投影 在大集合中过滤数据放到小集合 例:Book对象
( O$ Y3 k; _# S6 b; E350.?表示获取符合逻辑的元素
, [/ X6 ]3 T6 A351.^获取符合逻辑的第一个元素 1 {( X) m7 a4 J6 Z% `
352.$获取符合逻辑的最后一个元素 % F1 x6 R& J8 ?1 W* P
353..{}表示从大集合中筛选到小集合
5 {) G+ h ^6 B# H, `# s3 Y354.<s:iterator value="books.{?#this.price>35}">
7 o3 L6 \5 H4 k2 y: I \ C5 n$ T1 F355. <s:property value="title"/>==<s:property value="price"/>
$ E) [6 S$ n" v7 m356.</s:iterator>
. V- T" z$ P/ e$ j% |2 x357.
! W6 b) E. [, U/ ~" U# G ~1 H358.*URL标签 ( g7 N" A: Z3 ]
359.<s:url action="" namespace="">
& f u! n g+ W8 \3 [360. <param name="" value=""/>
7 m( }5 {% j& v/ @9 j. c361.</s:url> * Q- P5 c4 `- Y8 y0 w1 i+ w2 `
362. : A5 q/ [3 @- @
363.<s:set name="myurl" value="www.baidu.com"/> , c! O# m a; n2 M
364.<s:url id="url" action="hello">
& D. F' S! ~: I; G8 i2 f365. <s:param name="request_locale">en</s:param>
. Y9 d' k: Z- r4 D8 i% y366.</s:url><s:a href="%{url}">English</s:a> & p4 W; @+ ]4 F* d* |- I. q
367.如果href="#myurl" 他会把他当做字符处理 要这样: - T6 l. `& B5 P* v3 L( g& ?# X
368.<s:a href="%{#myurl}"/> 0 o# ]7 O" i& K' B
369. 7 t& }4 W& }& j. X1 P/ a
370.*复选框 集合list和集合map
* z. B. s/ A6 \7 O x371.集合list 4 g% L q6 _9 _( l$ l
372.<s:checkboxlist name="list" list="{'java','c#','c++'}" value="{'java','c#'}"/>
2 D" `9 k; ]2 ^2 }373.value属性用于指定被选择的复选框
: T. t% z) Y7 d4 v4 p374. 7 l7 b. w: h- R
375.集合map * \- ^2 k; n, x) s2 R$ e: h
376.<s:checkboxlist name="map" list="#{1:'java',2:'c#'}" listKey="key" ' Y+ Z2 }# i3 w
377.
- e$ _8 q4 H, A2 i1 N9 q' P7 U+ l378.listValue="value" value="{1,2,3}"/> - \ W& \0 ]- v. L' M/ ?! S0 X
379.
/ l7 y- n+ ` g380.*单选框
5 N9 U' l4 D' B; ?* e8 m, |& U381.集合JavaBean 4 C `2 ^/ K. M! j, D" m+ w' D8 V4 r
382.<s:radio name="beans" list="#request.persons" listKey="personid"
: N* u% _% A3 E; @& r383. * z3 }+ T4 G/ P, M+ [5 f O$ V
384.listValue="name"/>
: R' F( R/ L/ ?6 G7 Q385.集合list ! ~. h& m7 o; l5 _2 K8 u: b5 P
386.<s:radio name="list" list="{'java','c#'}" value="java"/> % s. K" F O/ R: V" C( o/ a5 A
387.集合map $ U! B: n2 r& W) c' X
388.<s:radio name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value"
" @* Q _3 s6 h/ A7 d1 s; t389.
" E: k% z+ L ]* [390.value="1"/> $ t" Z1 D0 ^/ W4 r4 e* Q
391.
9 [7 D7 i) x( e b, r392.*下拉列表框 % u. s* G& R! R2 b9 {/ q9 Q3 P
393.<s:select name="list" list="{'java','c#'}" value="java"/> * R6 M- [- w( }1 i( s H* s3 J$ K
394.<s:select name="beans" list="#request.persons" listKey="personid"
6 p# s0 G; v, H( [/ e395.
4 Z# W9 f% U& O# E" V' k! D/ i396.listValue="name"/> ; P2 n6 N. Q8 t
397.<s:select name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value" : Y+ {, }- n% ^: l3 j7 h
398. / f7 v: n- t7 `% q
399.value="1"/>
/ d. ^8 n! N8 C7 L: k9 r1 t: e400.
7 z: P! ]1 P7 u; q( l/ C/ T) ?401.18:防止表单重复提交 " X/ i- b3 H$ R) n; s; I P) V4 }
402.<s:form actio="" namespace="" method="post"? 2 o/ n. O1 b8 X: v. P" ]
403. <s:textfield name="name"/> % b) d; F% [* ^3 l
404. <s:soken/> / n3 Y. m' B# |9 p x6 G5 ^: l9 k
405. <input type="submit" value="提交"/> . r: L: f) C* ^: a. `
406.</s:form> " j; U: ^ q6 l8 k; C
407.引入拦截器 # M# W# T7 _- D4 i% F4 d x+ h
408.<interceptor-ref name="defaultStack"/> & a& C$ Q5 m; O( f9 }9 o, j( F
409.<interceptor-ref name="token"/> 8 Z; [. g, O4 u; b
410.<result name="invalid.token">index.jsp</result>///发现表单重估提 |
|