|
该用户从未签到
|
沙发
发表于 2014-03-12 22:26:39
|只看该作者
201. 1、继承ActionSupport,再写方法validateXxx() 其他同上一样
$ \6 S1 {7 ?# G0 Z: X2 J202. 4 P: _3 E1 k- v8 ~6 o4 s& D% S0 k
203.第二:xml配置进行校验 + _' X% y |: R2 v# H+ [8 Q3 T. }
204.一、所有方法 3 H( V8 b. T. @# O9 ]) h9 k
205.1.继承ActionSupport类,校验文件与action同包 命名ActionClassName-validation.xml $ a0 }9 K4 L8 u, X
206.
. L4 w( M( @4 T8 ^8 C207.; # l4 v9 `( r) o2 g. S" ^
208.文件内容: . w5 ^' h4 C* C/ i0 I* r
209.<?xml version="1.0" encoding="UTF-8"?> + B/ L! G* U& F2 W
210.<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.03//EN" ( ?0 L# D+ G8 k% f: X7 c
211.
* ~' r6 A5 y5 Q/ l! j212."http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
# |5 w. s4 |3 s, ]. w/ t. g213.<validators> 7 @9 r( I, h( ]% i( e% u1 _. i
214. <field name="username">
9 t# w2 v5 M F" d ~# m' t215. <field-validator type="requiredstring"> 8 e y3 r, u% ]( @4 r3 w, ~# F
216. <param name="trim">true</param>
0 ?1 K8 \. L5 P7 B) C7 i& @7 ], A217. <message>用户名不能为空!</message> G. v& h6 ]) Q. s" v- Y
218. </field-validator>
5 e3 v, U! r7 j8 d; {1 Z219. <field-validator type="tringlength"> " Y, M: G, p# f' Y0 w5 }
220. <param name="minLength">4</param> " j6 {5 F9 x8 \; S
221. <param name="minLength">10</param>
0 U6 G6 i; Y9 A, ]/ I) M222. <message><![CDATA[用户名应在4到10之间]]</message> 3 F$ d' X8 r, t! Z2 G% C
223. </field-validator>
: K/ r9 Q8 Y, |' m9 A2 @3 c224. </field> $ c( S2 _: `; C
225. <field name="mobile"> $ `. Y4 g$ Z3 M8 T! Q5 \
226. <field-validator type="requiredstring">
. s8 [7 x; v+ R5 k* \4 J6 R227. <message>手机号不能为空!</message>
. i7 F$ X- s+ @# L228. </field-validator> 7 ^! s R6 j2 j; Z: A' p
229. <field-validator type="regex">
& m# r# y7 V* @: w; l4 T230. <param name="expression"><![CDATA[^1[358]\d{9}$]]/>
2 \# t% J. z( V231. <message>手机号格式不正确</message> ; z5 y8 s- l1 }) Y
232. </field-validator> % a9 f/ I' t- h+ O
233. </field> 8 v; L' d% D: }; C( v
234. <field name="age">
1 i$ I0 N7 _- E; R6 A235. <field-validator type="int"> ; p. R5 {! N7 U9 P: y
236. <param name="min">1</param>
# v* x; m _5 d: y& Z6 k* q% y237. <param name="max">150</param> ) G$ {9 V1 ^+ G' F
238. <message>年龄范围不对!</message> 0 [; Y- j7 ^+ w4 A; ~& f5 p) ^
239. </field-validator> , E) f: w3 U! c0 L& K+ p. E. e
240. </field> % R5 R0 u" a% r. o; K1 @! W# B2 j, J
241.</validators>
. g9 }$ D& t; J) @: L* Q" \" H242.
0 m, W3 I- p2 g; P$ x5 _+ J* j' ?243.校验器的路径:com.opensymphony.xwork2.validators下的default.xml中
+ C1 [) X& Z- W& f244.二、指定方法 1 ]* |. e/ `( T- V- {
245.文件命名:类名-配置中actiono的name-validation.xml % l2 B: [, e6 v* i
246.
) v2 ~( }. v+ D, w' ~247.15.国际化 ( e6 S. @* P4 T. X+ Q( a9 d
248.全局范围、包范围、action范围 }7 ?% z8 b) |% C& \( K& c; m* D( u
249.命名格式: N! ^: s) ^5 r8 j3 p+ I
250.baseName_language_country.properties
$ B% H: m( b+ }/ F3 |& L251.baseName_language.properties ' i1 ~7 \1 Y$ ]9 x
252.baseName.properties
+ b& A7 X+ a5 i& \5 E" x( h; y, {253.baseName是资源文件基本名可以自定义,language和country必须支持java的语言和国家
8 ?* h) Q; j0 F( k+ G# D254.中国baseName_zh_CN.properties
! K& h- t$ w8 o0 Q255.台湾baseName_zh_TW.properties
7 |. z" Y0 k, E* S& L n3 M) M: C256.美国baseName_en_US.properties
/ p$ K3 [ y! }1 Y$ s257. 7 P+ G5 i P! V' v
258.在properties中MyEclipse支持自动将中文转换为Unicode编码 + R& @4 O2 P, _. S
259.利用jdk提供的native2ascii命令格式转:
8 [' L6 S0 A3 z1 p260.native2ascii 源文件.properties 目标文件.properties
' i% b% p1 N* E! I* S261.
5 k; F0 ?/ \2 w262.通过在浏览器中改变语言就可以再语言间转换 & C6 k0 B8 |: p" v: T
263.一、全局:<constant name="struts.custom.i18n.resources" value="资源文件基本 ! m2 s& Z" t, _ e) X6 [ L
264.*在jsp页面是用<s:text name=""/>标签来输出国际化信息 name为资源文件中的key
1 b3 `% m' J$ [+ @& F1 Q265.*在action中可以继承ActionSupport 是用getTest()方法得到国际化信息名"/> 第一个参
& b4 L: R! F2 Q266.
5 ^9 b0 B" m# b0 |; ^; A/ U267.数为资源文件中key 0 u' @5 M: g- }" T) c7 {+ b/ c
268.*在表单标签中,通过key属性指定资源文件中的key 如:<s:textfeild name="" key=""/> & [8 c. V1 G# k/ S' Y D
269.
3 ]( s% R$ T; r9 B! Q5 B270.有占位符的表示:
1 {5 \ D! g5 \; Q- O271.welcome={0},欢迎光临!{1} 5 |' X& {3 U: X5 ]% v* X8 G
272.*在jsp页面: 2 o* i( l+ D7 t! f
273.<s:text name="welcome">
. C; G( ?9 }8 U) N4 I274. <param><s:property value="realname"/></s:param>
+ f" c: y) }" ^9 U275. <param>学习</param>
# k% T9 @/ }" L; X' {) e276.</s:text> 8 f5 c/ U5 V/ w5 C/ i' S
277.*在action类中:
# t5 ^0 q: j1 H2 _! x0 X* N6 b4 F p278.getTest(String key,String[] args)或者是getText(String aTextName,List args)方法
9 v6 ?. l0 K2 W7 h279. ( b2 d) ]( @0 D, ~
280.二、包范围 9 O$ Z# |3 G" M& q- w' u4 B
281.在包下放置package_language_country.properties资源文件 package为固定写法 3 k, j0 M" M0 {! C0 K
282.该包及子包下的action毒可以访问该资源 系统会先找包资源文件 找不到则找系统资源 ; m# t) G5 U1 x: s3 o# P6 k
283. 2 v: M, X; z# t! c1 U8 X" q6 j" `
284.中的key % F5 S7 N1 o9 d/ X- ]
285.
1 f5 v% l m6 t, P! T286.三:action范围
0 r# \4 Z: s. q3 Y9 ~287.在action所在路径放置ActionClassName_language_country.properties的资源文件 " A3 Z7 U( X: c& Y+ Q
288.
4 J/ y2 F1 [* H2 a4 c8 K, J289.无需任何配置直接从资源文件中获取配置:利用标签 ; {8 k6 h7 N" j! ?+ v. C
290.<s:i18n name="资源文件名"> 全局 . D: x; v; g% T* q
291. <s:text name="welcome">
7 |# E: a8 P$ f) T292. <param>小张</param>
% D! [4 G7 [2 t, q# d+ V293. </s:text>
# H N2 V; m2 o5 m2 H; V, {294.</s:i18n> ' G% s3 [6 @9 |2 S. X6 p/ [
295.<s:i18n name="路径.package">从包中 , }; o& e2 X9 f( O ?
296. <s:text name="welcome"> - I7 ?+ x1 l' X* f. F3 P. _# A
297. <param>小张</param> 7 p2 n& f" N" q% k
298. </s:text> $ X" B. v& j# j7 W Y6 b0 X
299.</s:i18n> D2 Q: H1 U& Q' j" D# s# w! g
300.<s:i18n name="路径.ActionName">action
9 [2 F/ z: |' c" I2 `! Q301. <s:text name="welcome">
) u1 O* ?! b0 y' s1 Y& J302. <param>小张</param> + {! E4 g- i! L' Y( Z1 e9 N
303. </s:text>
. k0 N7 G4 J, R304.</s:i18n> 4 w* c: Z/ A7 G4 ?5 {
305.
1 m% _0 T% T- u" I# w% `, R306.16.OGNL表达式语言
: @$ E+ R: [- B4 v' R307.类静态方法调用格式: ' l5 t/ ^' G7 _" K( e
308.@类名(包括路径)@方法名 ) F6 C/ w$ F) i- m0 D
309. + V5 U- }. l: G' F
310.OGNL Context(ActionContext)访问上下文中的对象:session、request、application、 4 W1 u- @# z3 M$ x
311. 8 }. c- Z! G% f- P2 r
312.attr、parameters、OgnlValueStack ) U' J+ G$ `7 `1 ^
313.访问对象格式:#session、#request , \4 P# u v* A& d
314.访问对象属性格式:#session.userName或者#session['userName'] $ K' I, z7 n P( c8 X
315.其中OgnlValueStack root变量无需#,他访问对象属性时从栈顶开始找
( t( ]- f2 p! R6 Q) A1 s& X; g' y' r316.需配合struts2才能使用,也可以用EL表达式(只能访问值栈中的属性)直接访问对象的属性 , c% j) B# t# D& F
317.
, I& y: X6 x q" R: q# D318.17.常用标签使用 5 z" }# o8 p8 l$ s3 x: T# p- Y
319.*构造list对象:
) ]2 a+ D+ O6 @: e320.<s:set var="list" value="{'1','2','3'}"/> x& N0 _5 P) l* o4 E
321.
" U; {: G+ ]. {- P& C9 s322.*迭代list:此标签迭代时将当前对象放到栈顶 5 F* p* C) I A8 A4 a0 D# W
323.<s:iterator value="#list"> - ]' K/ M6 u- G: x/ I, F
324. <s:property/> 4 q. |. R% N. q% G& B+ w, e6 A
325.</s:iterator> ' Y0 I" @0 t5 y* _/ W$ j
326. ) h I- o9 f! ^
327.*构造map对象:
" t( s6 B# Z" R6 E; u; @/ _328.<s:set var="maps" value="#{'key1':90,'key2':20}"/>
4 N/ u% j1 q3 d329.*迭代map: * k7 h* v3 v' \; C1 D8 k
330.<s:iterator value="#maps" status="obj">
, o& B2 b$ g( c7 W0 F331. <s:property value="key"/>=<s:property value="value"/> |" t1 c! Q5 ^& H
332.</s:iterator> ) U& Y- @5 @( U
333.obj包含方法: 3 U7 \( x, D- v/ y8 d' q
334.int getCount();返回当前迭代了几个元素 . A B6 A- P$ n* Y2 n% S' R
335.int getIndex();返回当前迭代元素的索引
& l3 ~5 }& b. x* b# M336.boolean isEven();返回当前使用元素索引是否为偶数
. g. w9 o3 q) [+ m337.boolean isOdd();返回当前元素的索引是否为奇数 1 H4 A& y4 ?% R6 W* j! }4 v
338.boolean isFirst(); $ G' g4 e. P8 p$ X( |' D' a
339.boolean isLast();
- @; i8 ? P8 a/ G! k340. 4 w* T4 I7 u$ H& G u7 N
341.*判断元素是否在集合中:
4 E1 ]' s! x3 S+ o342.<s:if test="foo" in/not in {"foo","tar"}>
1 G9 i8 `9 ~! M, W5 z343.在
1 d, W0 `( j# L7 m2 x344.</s:if>
4 t+ x, T( }; k0 T. Z( R/ {345.<s:else>
/ c9 ]8 f4 t" k& a4 a9 Z8 P346.不在
Y' H; }* d3 l. K6 h1 _, f347.</s:else> 3 l, H5 C/ m+ z4 { W4 e" E# a
348. 6 U* c! r2 C* w6 V& P0 x
349.*投影 在大集合中过滤数据放到小集合 例:Book对象 ! V0 v' z7 a; r4 \
350.?表示获取符合逻辑的元素
0 u1 R6 C- d& g$ ]4 C# |5 e3 I351.^获取符合逻辑的第一个元素 # M0 g$ ^9 s) a0 X* _* X9 U: a& P& ^
352.$获取符合逻辑的最后一个元素
; H9 @8 a8 w' W7 A4 l4 @2 i353..{}表示从大集合中筛选到小集合 : g1 c1 E, I' B7 V) ]
354.<s:iterator value="books.{?#this.price>35}">
m" r9 U5 X1 p |5 o, d0 \$ e355. <s:property value="title"/>==<s:property value="price"/>
; j, j9 Y% p; [1 [* B+ J2 U356.</s:iterator> : `3 G( }% h" g, O* ?. S, Q
357. 9 z4 B( \9 e& v& z8 B0 I5 v
358.*URL标签
" X8 b% i7 {2 z* [359.<s:url action="" namespace="">
# r/ T7 B% z/ d; ~. N360. <param name="" value=""/>
8 n( Z- J* D. C7 ^! g: q+ E0 ]& D361.</s:url>
* S5 g' e' v- W2 r# h. q362. ( b9 N7 c& j. ~. _* t8 P+ {
363.<s:set name="myurl" value="www.baidu.com"/>
0 g8 L# G' e- z n! k) b364.<s:url id="url" action="hello"> 9 ?. b: D3 X- p2 D
365. <s:param name="request_locale">en</s:param>
! i% x. g. o5 `. h, z3 H366.</s:url><s:a href="%{url}">English</s:a> 5 l; ^8 x' T5 {
367.如果href="#myurl" 他会把他当做字符处理 要这样: # X$ o5 E, f2 S& ]2 r9 n
368.<s:a href="%{#myurl}"/> * \$ g k3 ]2 ]
369. 3 D0 ?# T$ L* o% M
370.*复选框 集合list和集合map & j3 ` t4 @$ |8 b* v: V
371.集合list % ^$ d$ Q# Z$ A* g' e
372.<s:checkboxlist name="list" list="{'java','c#','c++'}" value="{'java','c#'}"/>
$ d; k7 ^8 y5 j: D* l373.value属性用于指定被选择的复选框
0 e& j& m7 O3 D374.
: M4 @) T% R* b5 T7 a375.集合map ; @7 | u7 X6 l- ^% r1 E
376.<s:checkboxlist name="map" list="#{1:'java',2:'c#'}" listKey="key"
+ g6 i4 i; \& k, D2 ^377. ' J% K% c# g, N4 F! k
378.listValue="value" value="{1,2,3}"/>
0 |# k3 g3 d8 N3 O+ G7 B1 s- e379.
& v+ @& q) b. i" E380.*单选框 3 J# m( u: H A' E
381.集合JavaBean
. |( [, E; O2 K8 i) i% a* ]' J382.<s:radio name="beans" list="#request.persons" listKey="personid"
, P3 K9 F. b- R3 r+ F4 ]! h383. " e2 n p5 H0 m$ K7 _) D4 L& S% V
384.listValue="name"/> : p$ @4 f/ _) m7 W" r, e' r
385.集合list
/ x8 D' o' m' R$ X; g: w/ \" j386.<s:radio name="list" list="{'java','c#'}" value="java"/> 9 y( c @- i: D B9 x
387.集合map
7 v; t t% Q4 ~, A388.<s:radio name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value"
* m" j p) T# u1 ?389. / ]# `" T. E2 E/ f* i
390.value="1"/>
1 V f1 B5 y0 M" w391.
- X: l" u2 T5 ^* U7 j9 c392.*下拉列表框
/ ] N7 k- u2 a- R1 \393.<s:select name="list" list="{'java','c#'}" value="java"/> - y& w/ L3 ], I% J! }
394.<s:select name="beans" list="#request.persons" listKey="personid"
( Q2 n+ Z$ Q( P* W8 K& x395. 7 s. `( T9 U. p. s, w( L
396.listValue="name"/> 9 L) X/ S6 z* ]' b- [, h
397.<s:select name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value" 5 h: c/ U* `+ \5 e$ I, J
398. * i/ p0 b) M. w" t3 T+ k) a. e
399.value="1"/>
2 g1 ^" _4 N; ~8 A- _4 }# q400.
( K/ \% \5 ~1 X8 j( x401.18:防止表单重复提交 ' Y, q1 X$ a; G9 i
402.<s:form actio="" namespace="" method="post"? - k0 {' U" c- _4 t+ ^
403. <s:textfield name="name"/> / H1 m P- D$ C7 A2 K/ S
404. <s:soken/> ' S2 D, R3 |. H, B7 @
405. <input type="submit" value="提交"/> / B9 Q6 U# m8 Q
406.</s:form> 1 K( d9 n; F9 g& }5 h
407.引入拦截器 ! ~' V' ^; X# m3 P( }) V/ B$ C& ]( q
408.<interceptor-ref name="defaultStack"/>
) X6 }: b9 L. y _) g4 C% K* G% J409.<interceptor-ref name="token"/> & I1 Q; d: @5 ^. s# n
410.<result name="invalid.token">index.jsp</result>///发现表单重估提 |
|