该用户从未签到
|
沙发
发表于 2014-03-12 22:26:39
|只看该作者
201. 1、继承ActionSupport,再写方法validateXxx() 其他同上一样
' m# P2 L9 a- Y# H202.
2 T& z4 ?+ I/ ?2 L8 f: @203.第二:xml配置进行校验 . W7 K. d6 t/ ~9 M A
204.一、所有方法 ( B3 i- r) d( u2 H; ?
205.1.继承ActionSupport类,校验文件与action同包 命名ActionClassName-validation.xml
V E- K4 l C: V( m0 N" b6 {206. + p3 E3 g0 m7 Y
207.;
/ K" ]5 E* S1 Q9 N+ n208.文件内容:
3 ]2 l" Q$ w7 J" |- a: z209.<?xml version="1.0" encoding="UTF-8"?> # G. M5 [: m5 w' t5 I# f
210.<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.03//EN"
$ S# E5 T) @% K0 ~! Q& O211. 7 u2 K9 ?; k6 ]5 n+ D. L2 b9 Y
212."http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
# b( W( A( @3 I: E, B213.<validators> - r" M& ?) T; Y3 }) [
214. <field name="username"> 6 ]8 }1 D5 K" l7 \: ~6 j
215. <field-validator type="requiredstring">
( @; N, a' E$ L* y1 v216. <param name="trim">true</param> + w9 I: e, P+ d' Q% T* m! X0 e
217. <message>用户名不能为空!</message> " H8 X) p* M, {7 s
218. </field-validator> 5 |) O4 O& S: l4 ?& R
219. <field-validator type="tringlength">
2 t( x9 \/ K: L! f7 W$ ]8 F220. <param name="minLength">4</param>
) C: \, T& R* u$ v4 `221. <param name="minLength">10</param>
) c2 R @* ^$ f9 t/ d6 q222. <message><![CDATA[用户名应在4到10之间]]</message> ; v2 ^$ @* M& v v( X: @$ n: U
223. </field-validator>
8 Y* c4 D$ ~1 s! k% U; }7 O224. </field> ; U- b; S# w4 i2 ^, S( O
225. <field name="mobile"> 4 x" e' H" D. Q) f: f% [
226. <field-validator type="requiredstring">
- T( j/ Q4 Z, O9 J+ }1 G227. <message>手机号不能为空!</message> : {/ q: w" Y) p! J3 M
228. </field-validator> * J( V4 e% e5 ^6 t
229. <field-validator type="regex">
: W& M# x$ a0 f0 o, U& x/ a230. <param name="expression"><![CDATA[^1[358]\d{9}$]]/>
$ f$ k; y( M3 u231. <message>手机号格式不正确</message> 2 S }: {" T( ~8 @% N4 L7 `
232. </field-validator>
% Y, c, \; M' o% y G7 h( N233. </field> : v( i) e, ?: a4 \
234. <field name="age"> 2 W+ d! o* F$ b& @9 G( A5 |3 f
235. <field-validator type="int"> & S/ N4 n( ^2 K/ w: Y' {% O
236. <param name="min">1</param>
% h; q( C S* K% u3 S! J' V1 _& t237. <param name="max">150</param>
1 u9 k% \, C6 \$ {238. <message>年龄范围不对!</message>
! A0 ~0 a. P% _! ^9 M; }239. </field-validator>
( M, Z% D% S% a6 j; s1 k$ ^1 Y240. </field> ; ^$ `& c I- I2 Q
241.</validators>
: M( C) j3 Y k242.
( X4 O& i; t8 w9 k5 p0 L# Z243.校验器的路径:com.opensymphony.xwork2.validators下的default.xml中 $ t0 m) C! V' h! F
244.二、指定方法
. l2 m9 L4 R: O# J+ [& ?2 r' l245.文件命名:类名-配置中actiono的name-validation.xml
) o' [% t& v5 C, y- }& z1 i( c246.
% k' d9 g/ D! \247.15.国际化
7 K% K5 S4 V8 L- a! g8 n248.全局范围、包范围、action范围 ) c2 ^3 e0 {: h& x4 X! u. R
249.命名格式: 1 E$ e+ s7 l) \2 S5 d( f2 D6 P
250.baseName_language_country.properties ! l7 m s% L( t+ `/ j$ T8 x& q* u
251.baseName_language.properties
$ n$ M+ t( D6 q6 }, \9 h252.baseName.properties
: u0 P$ j8 e/ U. M" z" r253.baseName是资源文件基本名可以自定义,language和country必须支持java的语言和国家 ; Y1 Z3 B; M( F5 a
254.中国baseName_zh_CN.properties 2 }/ c& H/ j3 Q
255.台湾baseName_zh_TW.properties , g7 e d8 \9 N9 r# C- r1 i
256.美国baseName_en_US.properties
6 ]/ |( o; _9 y" n; e257. 7 U! [4 ^! P( k6 B% H2 L" r$ B: P9 {
258.在properties中MyEclipse支持自动将中文转换为Unicode编码 8 L0 b* i' Z6 n7 _# S9 f, K
259.利用jdk提供的native2ascii命令格式转:
( \ G0 _- m% I; Q6 x260.native2ascii 源文件.properties 目标文件.properties 5 h, {9 A4 E ~: O) \
261.
# D# I+ s( ^, o5 S262.通过在浏览器中改变语言就可以再语言间转换
# X# b' ~1 \8 C, k263.一、全局:<constant name="struts.custom.i18n.resources" value="资源文件基本 8 c' O1 [0 M, R4 s6 i
264.*在jsp页面是用<s:text name=""/>标签来输出国际化信息 name为资源文件中的key 6 d7 J8 Z* _( H
265.*在action中可以继承ActionSupport 是用getTest()方法得到国际化信息名"/> 第一个参 ' r& Q1 J) D U) F2 e+ G7 |8 ]( ]
266. 0 P3 D8 e6 M) P6 j0 M3 A C
267.数为资源文件中key : h5 p$ p1 l& G* Q
268.*在表单标签中,通过key属性指定资源文件中的key 如:<s:textfeild name="" key=""/> $ `; L0 u8 Z. x- b. Z
269.
D3 m& k1 [5 [270.有占位符的表示: / p" X" Q& H5 h1 K* X. [$ Z
271.welcome={0},欢迎光临!{1}
/ X, f: [$ S7 ~7 L3 M. [8 a$ Z272.*在jsp页面: 9 x1 a, {" j+ c% ^& g; r
273.<s:text name="welcome">
% I4 x# Z1 r; [+ m. O274. <param><s:property value="realname"/></s:param>
2 i+ K0 K% @! O5 ~( M275. <param>学习</param>
; w6 [ V+ d2 [ R276.</s:text> , Z8 j9 r: o8 B1 V
277.*在action类中:
' N P0 @- [- _! N7 z278.getTest(String key,String[] args)或者是getText(String aTextName,List args)方法
+ _8 i& r! `% q! G- f/ \279. & S( k O: ]4 r
280.二、包范围
) C7 e3 @! _1 a281.在包下放置package_language_country.properties资源文件 package为固定写法 3 `0 Q, h1 H# i& G
282.该包及子包下的action毒可以访问该资源 系统会先找包资源文件 找不到则找系统资源 ) [' G! n9 v6 q1 h9 M" h
283. + N8 a, R: P4 ^# z+ d( }, m
284.中的key $ U h6 j, O3 V9 O3 J0 d
285. ) U7 E+ c t" L1 p
286.三:action范围 1 v3 `2 I$ g% m
287.在action所在路径放置ActionClassName_language_country.properties的资源文件
, J& A% K6 y, u& C" K288. , L& g! E) \* g x1 N+ M4 X
289.无需任何配置直接从资源文件中获取配置:利用标签
" R: x, m" p1 k& J8 Y290.<s:i18n name="资源文件名"> 全局 2 ]( T5 A0 `9 D9 V% Q$ ^
291. <s:text name="welcome">
. e* i/ a$ b. o" R# U: H292. <param>小张</param>
' h/ R2 F- l! @* U( R& E1 A293. </s:text>
, j9 H. |) V9 t4 O' M$ B; l294.</s:i18n> ( C! o0 r# [' z& m: }- X% h
295.<s:i18n name="路径.package">从包中 5 r+ T8 L. c/ w% |3 L
296. <s:text name="welcome">
% E+ h9 x0 @8 {: L( z* u297. <param>小张</param> 8 X0 {9 l1 c- M, o7 H* M3 M8 h9 X
298. </s:text>
" D- X! g; o6 a, n299.</s:i18n>
7 S% l) ]- J: A2 r! m1 \ ~300.<s:i18n name="路径.ActionName">action
7 u i" |% }0 ^* ]301. <s:text name="welcome">
n- j/ P/ E/ e$ j1 q/ g b302. <param>小张</param> 9 y: O- {1 m9 ]* l
303. </s:text> / ^5 M0 Z1 h: [# e
304.</s:i18n>
6 J; f( J2 H$ T* ?1 B305.
+ b1 t2 z: \3 L8 T, u306.16.OGNL表达式语言 # N' u2 R6 Y* V, J" W
307.类静态方法调用格式: $ Q; E# g% d: n5 W$ d' ^
308.@类名(包括路径)@方法名
" k4 A* X; D- S8 L$ O309. ( s% t& `; U+ ]! {2 M
310.OGNL Context(ActionContext)访问上下文中的对象:session、request、application、 ; d+ l1 x; W g0 r
311. + j$ {+ b/ `. c9 N
312.attr、parameters、OgnlValueStack 6 ^* F' V* u9 I* _# }
313.访问对象格式:#session、#request
* L5 |7 U9 ^9 k) G* \ H% [314.访问对象属性格式:#session.userName或者#session['userName']
% O" u6 v: W/ J: Y; }8 H315.其中OgnlValueStack root变量无需#,他访问对象属性时从栈顶开始找 ) i2 s9 Y7 q h2 l
316.需配合struts2才能使用,也可以用EL表达式(只能访问值栈中的属性)直接访问对象的属性
) t6 D3 B& C* j! X+ R' k317. ; ~# z T5 X5 a3 W/ N( I
318.17.常用标签使用 ) }" ]: V4 n0 h3 k
319.*构造list对象:
& C# o( x9 U: r) E) {$ U) v/ g$ [4 ]320.<s:set var="list" value="{'1','2','3'}"/>
7 f. }% ~0 P/ M* q: d8 i321. 8 ?0 F8 G) F4 W W$ h) A9 P8 `
322.*迭代list:此标签迭代时将当前对象放到栈顶
6 F, {: C& V6 \# i* l; v323.<s:iterator value="#list"> % A& ] O# h& K. c' b
324. <s:property/>
: O4 k- M+ T& _" |/ r9 @5 s+ i" C325.</s:iterator>
6 M8 @) `2 S- S/ H; @326. ; I4 ]0 o9 ^' H) ?* b
327.*构造map对象: ( a* H# V! O0 j
328.<s:set var="maps" value="#{'key1':90,'key2':20}"/>
; D2 @3 y' @! u! {: c$ z ^9 ~329.*迭代map:
7 N3 B( P2 P: A8 S- ~330.<s:iterator value="#maps" status="obj"> 7 d( b" U9 t4 }# I. T8 d: `
331. <s:property value="key"/>=<s:property value="value"/> , j' e! d$ V, I$ t
332.</s:iterator> ; f* l& Z9 G; E! S( P5 C5 q$ P
333.obj包含方法: 2 Z/ r% {- W3 k
334.int getCount();返回当前迭代了几个元素
0 o+ W* `: f4 Y6 i9 @7 e* D* e9 {( k9 |335.int getIndex();返回当前迭代元素的索引 8 x" [* E* ~) u! _
336.boolean isEven();返回当前使用元素索引是否为偶数
/ O0 E( ]4 c, [% `: T0 Y337.boolean isOdd();返回当前元素的索引是否为奇数 ( c% {. J3 G, k7 j- N3 U ]5 _
338.boolean isFirst();
% m( y: d" ~4 i6 z339.boolean isLast();
& P, A- q) v4 a6 e" B340. + {; `$ z5 U: K: |
341.*判断元素是否在集合中: ' b: n5 z. u8 h4 y$ m
342.<s:if test="foo" in/not in {"foo","tar"}> ! E1 i$ P( g1 b4 ` f% v
343.在
# p: c& n% w4 ?) y; ` c344.</s:if>
9 \/ R7 O2 f2 |3 ]6 e8 ~4 @, A1 J/ \345.<s:else>
& l& n- t+ s* ^! X: L7 n' g, K- v346.不在 / Z" b" j4 p2 \
347.</s:else> ! B6 \' c- D2 B5 P. f* \
348.
/ y! t6 N3 p' a" F, k: p349.*投影 在大集合中过滤数据放到小集合 例:Book对象
- a3 G; @/ q& q- N350.?表示获取符合逻辑的元素 |( ^1 m$ G+ P! y# p$ f9 q9 [
351.^获取符合逻辑的第一个元素
]0 f+ `& p5 R A) b/ Y352.$获取符合逻辑的最后一个元素 9 |4 e; `, Q- G
353..{}表示从大集合中筛选到小集合 % z) y1 ]% H* }5 C; U) h" X: [# _ I
354.<s:iterator value="books.{?#this.price>35}"> & ]* g, @$ _% A! U# E) ]0 @
355. <s:property value="title"/>==<s:property value="price"/>
) u8 k7 O, }* Y5 U$ o" C356.</s:iterator> 7 [# u6 ^8 D! O; L( S) a: E+ y
357.
- ~# ~6 Q2 L0 k+ h! u: R- p* L4 `358.*URL标签 1 Q# G( T, E O
359.<s:url action="" namespace="">
8 |1 g% M) O; ^ K" y360. <param name="" value=""/>
2 E6 k/ @' C" d" Z9 l+ w' v7 Y361.</s:url>
$ U# \8 @/ m9 z* [; j! o8 T362. / T; L/ a. m [) Q4 T$ e9 g# m
363.<s:set name="myurl" value="www.baidu.com"/>
6 ~2 O$ M# X! O9 g" t7 M364.<s:url id="url" action="hello">
: F1 i/ ]6 }/ L# K* F0 U& T365. <s:param name="request_locale">en</s:param>
$ k7 b9 N7 N4 i/ U366.</s:url><s:a href="%{url}">English</s:a>
+ ~+ Y% Q3 k. y2 X( b! \3 E* {367.如果href="#myurl" 他会把他当做字符处理 要这样: % b. B2 x/ c# b$ S: v' b% F
368.<s:a href="%{#myurl}"/>
" D! p. z1 j7 x |0 r, O: M369. : ~( S! ]6 I+ c2 l* n8 R7 A' H
370.*复选框 集合list和集合map ! J C5 `8 N$ m0 a) N7 U5 t
371.集合list
E" K8 b6 Y0 o372.<s:checkboxlist name="list" list="{'java','c#','c++'}" value="{'java','c#'}"/> m0 v+ Y5 u- W* d
373.value属性用于指定被选择的复选框
8 w' G ?# l- n# d4 e/ q374.
; }4 M `0 ~8 W7 a7 w, q0 ~) G375.集合map * m5 h+ p& `! U3 s- w" [
376.<s:checkboxlist name="map" list="#{1:'java',2:'c#'}" listKey="key"
$ e; _7 d8 x8 G8 f# c4 ~377. ( Z) @! B* V n; w$ d; T5 ^. P
378.listValue="value" value="{1,2,3}"/>
5 G" H8 R2 `! {4 N' _ P379.
( W/ a9 f8 a8 n9 u) l) D380.*单选框 9 Y& n3 V+ a5 _; K: p+ M1 T4 A/ K
381.集合JavaBean
9 |2 X9 j4 u" V1 K3 I382.<s:radio name="beans" list="#request.persons" listKey="personid"
! m4 \5 e# [9 i. c383. 7 ~# F( A7 h9 T$ B* M% J
384.listValue="name"/> 3 v5 r) _; ^- ?: z+ y' `0 s
385.集合list
8 E! h' q' O6 U& n0 |386.<s:radio name="list" list="{'java','c#'}" value="java"/> ) a4 G' e1 W8 Y9 I n" {$ b1 D
387.集合map 6 _* ~' ^. N8 e9 k3 n
388.<s:radio name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value" $ q6 b+ }2 q7 i$ X* K: q# \. D; k" w$ k
389. 3 p! Q% c- Q5 `. \/ ^% H
390.value="1"/>
9 ` y& W' i! H6 T391.
9 p/ Y; ~' Y; j& B392.*下拉列表框 . l( |4 Z& ^) K. J, R3 T2 P
393.<s:select name="list" list="{'java','c#'}" value="java"/> : B( I7 ^; V1 Q+ c2 e9 ?
394.<s:select name="beans" list="#request.persons" listKey="personid"
) C+ ~$ W( d% e/ J4 b6 |6 N" o9 l395. 5 J8 |( J% X3 |9 x4 q! F* f( E
396.listValue="name"/> 6 k* d/ e/ e) D0 @
397.<s:select name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value" 2 w# l! s/ a" _2 G$ H
398. - M" } K( B8 F# V, A, I2 p$ l* X" ]
399.value="1"/>
! u; t, r4 S: m' M( a+ T% C400.
& E6 }& B; N" l! B8 p! a! `2 M5 w9 x401.18:防止表单重复提交 : ?# p7 i8 e# k0 b) d# L
402.<s:form actio="" namespace="" method="post"? ( e2 Z8 J l+ X9 }: [, R8 |4 e( |! y
403. <s:textfield name="name"/>
" v' c! w9 C8 k6 n \: a404. <s:soken/>
% o! J1 t7 @9 D' q405. <input type="submit" value="提交"/> - d- f5 V2 C( @: S
406.</s:form> 3 i; a1 C3 Q* a1 j- d9 _+ Y
407.引入拦截器 ! D$ m% X/ D6 E2 g3 T
408.<interceptor-ref name="defaultStack"/> ) d+ U- o8 u8 p' m1 f- ^0 n& @
409.<interceptor-ref name="token"/> " \) U+ p( |/ X- b4 R2 e9 U
410.<result name="invalid.token">index.jsp</result>///发现表单重估提 |
|