|
该用户从未签到
|
沙发
发表于 2014-03-12 22:26:39
|只看该作者
201. 1、继承ActionSupport,再写方法validateXxx() 其他同上一样
9 u8 |, F+ {" K: Y8 U202.
+ g! O% e5 R P+ w6 ]: u203.第二:xml配置进行校验
* K9 ^% W' V* P* c0 R( L) b204.一、所有方法 , y0 A5 l. B3 T
205.1.继承ActionSupport类,校验文件与action同包 命名ActionClassName-validation.xml 2 Y [' p2 |9 E: m4 Q0 [
206. . Y; n5 @& Q& N9 o/ |, d9 L8 `5 ~
207.;
* L4 f! [, V; l+ d3 }208.文件内容:
- C7 @# ?% W4 c+ S3 Y' i; Z209.<?xml version="1.0" encoding="UTF-8"?> ' n/ H# U% n( {7 t
210.<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.03//EN" , w4 \! z8 I6 A9 n6 E- C
211.
. |3 q, H9 D0 E3 b1 K( i212."http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"> * h3 N0 I% H% \+ |$ Y
213.<validators> 9 _4 ~6 |5 v, X' T
214. <field name="username">
6 }( ?* L% P: Z/ S; g1 j215. <field-validator type="requiredstring"> " r/ ^4 u+ Y1 M% c% h; E+ S
216. <param name="trim">true</param> 2 f/ x, d$ a$ i4 H% ^9 L# i* A
217. <message>用户名不能为空!</message>
: H* h" q3 E& R" W4 K# k218. </field-validator> 6 R" k e2 y* c
219. <field-validator type="tringlength">
! f3 ^1 Q% f) H. B, y' c+ G220. <param name="minLength">4</param> $ |# r, F% P/ T _6 H0 h1 a4 C; L
221. <param name="minLength">10</param> # Y( ^( A4 [/ Y8 Z
222. <message><![CDATA[用户名应在4到10之间]]</message>
" k" s- q1 S: w3 @0 W% ]. a223. </field-validator>
% R0 a5 Y5 x5 y m- n224. </field> ! [5 U, {# `) G- C" w
225. <field name="mobile"> " M5 U0 _" ]. u5 F. Z
226. <field-validator type="requiredstring"> 2 `( w/ e: O4 u/ ]' d; @
227. <message>手机号不能为空!</message>
& H% x% k- N9 Z7 d& |5 {228. </field-validator> 7 Z/ F; m Y. M5 [' y
229. <field-validator type="regex">
: E% S3 x1 i+ S9 q- q8 } j& M230. <param name="expression"><![CDATA[^1[358]\d{9}$]]/> 8 T0 ^8 a* {$ b3 H6 R S
231. <message>手机号格式不正确</message>
. t' @6 V3 _1 X232. </field-validator> z! E g2 B1 s" {& a3 q4 u. l
233. </field>
/ C* x: I: c, o$ t234. <field name="age"> * }( U d/ b( a7 F2 S- l
235. <field-validator type="int"> ( x5 ^5 r$ r/ |9 f+ G) L
236. <param name="min">1</param>
6 l/ D3 @, k ?9 a0 t* p7 O237. <param name="max">150</param> 9 k# i( D R1 ~2 m9 ?3 W
238. <message>年龄范围不对!</message>
3 A/ F6 m; D4 Y7 Y- ?! { b7 L239. </field-validator>
0 V3 p M9 J! R7 A0 F Q240. </field> * X" p3 w: A8 s. J
241.</validators>
- B9 @7 y# D5 F' ] A. q242. , B" F$ {5 z% _0 G
243.校验器的路径:com.opensymphony.xwork2.validators下的default.xml中
* i( R( w! x& D2 {2 S8 e244.二、指定方法
9 B! P9 ` d0 k3 v" t9 t/ M245.文件命名:类名-配置中actiono的name-validation.xml 7 h3 X! l: z r; T2 P& \ X$ `
246. 1 H: W% a* h% ~. A7 j
247.15.国际化 ; w" X, q" ?% `) [! U
248.全局范围、包范围、action范围
& d7 J, ~% N K) o249.命名格式: ( G; U# W1 d: Y2 s: k; @
250.baseName_language_country.properties
. `4 f% \5 g, K251.baseName_language.properties ) f @9 O( v) Z$ s- P4 Y
252.baseName.properties % W' w2 t' q9 D1 s+ F8 ]
253.baseName是资源文件基本名可以自定义,language和country必须支持java的语言和国家 * p5 x: y8 v( G7 Q( V' s4 R
254.中国baseName_zh_CN.properties
( s4 R" I0 g) f T( |' w, p255.台湾baseName_zh_TW.properties
" T# Q# E9 M# P2 l9 U256.美国baseName_en_US.properties
! p. ~9 |$ e8 W5 {; o257. ( s4 k( ~5 ~) Z7 o* J2 w
258.在properties中MyEclipse支持自动将中文转换为Unicode编码 * @! f& {$ p1 q5 t
259.利用jdk提供的native2ascii命令格式转: ! z5 x- q" l8 Y# w
260.native2ascii 源文件.properties 目标文件.properties : k$ c; u0 H% e* N& D9 z2 t
261.
3 L+ Q* h$ N! j% s7 S( W% G262.通过在浏览器中改变语言就可以再语言间转换 - K* Z! V _4 W! B
263.一、全局:<constant name="struts.custom.i18n.resources" value="资源文件基本
( b8 W! a1 G4 k3 u264.*在jsp页面是用<s:text name=""/>标签来输出国际化信息 name为资源文件中的key " I" i6 }* L" a# W1 c
265.*在action中可以继承ActionSupport 是用getTest()方法得到国际化信息名"/> 第一个参
) |: \7 e% d$ W9 c5 d3 T3 U266.
& i3 w8 |5 a4 C$ D t' L& \- u267.数为资源文件中key
. {* _' [( S, Z268.*在表单标签中,通过key属性指定资源文件中的key 如:<s:textfeild name="" key=""/>
4 O! L' x. _% z3 \; U269.
% M' V- X, p" n: `270.有占位符的表示: + n. ]+ H: c0 u, {
271.welcome={0},欢迎光临!{1} 6 V( q) L$ S8 }0 ~# j2 g
272.*在jsp页面: 9 j+ S9 e/ e% W# O1 W# o0 F. y' y
273.<s:text name="welcome"> 0 A9 |$ \' \; Z4 F& Z0 E
274. <param><s:property value="realname"/></s:param>
2 B( x( P! r8 ^+ m275. <param>学习</param>
/ C. P8 D0 ~) s( Z& p9 b' E276.</s:text> * U! }, ]6 F7 }# Z, ^
277.*在action类中:
7 @* i: L* R9 ]0 ]* V* j4 U278.getTest(String key,String[] args)或者是getText(String aTextName,List args)方法
" [4 k2 z c. w! S" y: W [4 L279.
- H0 i, l9 N0 H* P" n3 B- ?: g3 U280.二、包范围
y: {1 x0 q' Q; ?6 y1 m4 p+ N w281.在包下放置package_language_country.properties资源文件 package为固定写法 ; N; v( F, Q9 `4 W( x1 C) T" b1 O- M9 c
282.该包及子包下的action毒可以访问该资源 系统会先找包资源文件 找不到则找系统资源
9 N, F# [, ^5 o) s# k' Z283.
+ m& W& }7 F4 D' x" h- Y9 o' c284.中的key 5 ^7 d+ t4 B/ w2 N: \) u- L3 P; D
285. ! ~/ Z9 B" Q) H9 b3 o- I
286.三:action范围
' f6 j3 p) a6 c( J- H" m+ M287.在action所在路径放置ActionClassName_language_country.properties的资源文件
% A4 w4 T6 [; v; l$ z, c288.
& i* h" s, b9 X) J- y289.无需任何配置直接从资源文件中获取配置:利用标签
! ^$ ^* Y$ ?) w( `2 t290.<s:i18n name="资源文件名"> 全局 ; x% Q7 t! g7 i9 A( x2 k
291. <s:text name="welcome"> |5 v. U; d7 u: g+ t
292. <param>小张</param> + b9 A1 \% D2 A7 m/ o+ o/ P0 |
293. </s:text> 5 I7 j3 h4 s( I: S
294.</s:i18n>
J& }1 y- B4 `) m% g" Z5 N2 A295.<s:i18n name="路径.package">从包中
. {5 R0 b; R8 ?- m4 R0 s) V296. <s:text name="welcome">
: S% X% N2 g8 }" g' D6 r297. <param>小张</param> , U. g8 Z% s; i9 B) o; _
298. </s:text> 2 D& {* \1 s8 U4 x$ E8 x4 F. S
299.</s:i18n>
( Y$ y5 G; G I1 u$ H' S' R) R6 e* b" U300.<s:i18n name="路径.ActionName">action ' k$ C' c. V8 }7 s" d
301. <s:text name="welcome">
9 [9 I% t3 `0 P# g8 @5 \302. <param>小张</param> ( g; u. k6 m1 b0 \5 a8 w+ T
303. </s:text> 6 K2 M$ `- b, \8 w ~3 F+ M& T
304.</s:i18n> 9 h+ |5 N2 S- e7 M ^1 b% M7 {
305.
, l. N4 J/ p0 E6 W1 q$ n306.16.OGNL表达式语言
7 j9 Q! i: Z& p y Q# J307.类静态方法调用格式:
6 P5 ^- `9 M \; [$ Q- P7 f308.@类名(包括路径)@方法名
! z% ?; x% p& g! t. }8 u$ ]309. ( ^* t1 B8 ?# |) H+ C& @
310.OGNL Context(ActionContext)访问上下文中的对象:session、request、application、
7 {1 V7 x! E* Z/ t$ T8 ?0 M311. 2 Y% [5 z- n# m& u
312.attr、parameters、OgnlValueStack - Z/ o3 h1 n2 m
313.访问对象格式:#session、#request
! b+ q) ~0 a+ `- W7 z+ R* w/ J314.访问对象属性格式:#session.userName或者#session['userName']
0 ?, b! Y# _1 V8 ]+ _8 M315.其中OgnlValueStack root变量无需#,他访问对象属性时从栈顶开始找 : K0 y' e7 F8 O2 }
316.需配合struts2才能使用,也可以用EL表达式(只能访问值栈中的属性)直接访问对象的属性 c! A* l! L3 n4 m" O+ s) b
317. . t! L" ?. v$ ~0 D/ S
318.17.常用标签使用
% ^2 q' K9 C O0 b4 j q. C% `/ ?9 b319.*构造list对象:
& e7 c3 { l: l. w. |320.<s:set var="list" value="{'1','2','3'}"/>
; Y+ Y7 R* N! x% A- a5 U) N321. 0 Y' n R* \! }8 `1 T4 }6 U d
322.*迭代list:此标签迭代时将当前对象放到栈顶
# A, U- ~0 J9 A- z4 |6 J& d% t323.<s:iterator value="#list"> ) O; x# `+ `' M% N- n. ?
324. <s:property/> \0 y2 ^/ `# |% h$ T
325.</s:iterator> 1 `2 A/ C# k8 g) x8 o
326. / b$ ~3 k" C: u) }% q, r
327.*构造map对象:
/ @ @; I& z& M328.<s:set var="maps" value="#{'key1':90,'key2':20}"/> " _( G& L, e, S" ^
329.*迭代map:
6 k2 a2 ^# x0 @330.<s:iterator value="#maps" status="obj">
5 N4 L4 D4 N& D/ q331. <s:property value="key"/>=<s:property value="value"/> ( i5 R6 V3 `0 O& B! w
332.</s:iterator> ) E5 D$ y# Q# l8 o' Z n C% T5 M
333.obj包含方法: / q$ |5 {/ R- Y( V4 [
334.int getCount();返回当前迭代了几个元素 ; g6 h# A' h; O/ @
335.int getIndex();返回当前迭代元素的索引
: E' F. V, c; L6 s5 V336.boolean isEven();返回当前使用元素索引是否为偶数 7 t; q: x p9 V, j, n
337.boolean isOdd();返回当前元素的索引是否为奇数
( N4 b$ u7 m( X, @, m( P j7 m338.boolean isFirst(); 3 E. B3 N7 X; a9 a+ q8 H1 |% ~! {
339.boolean isLast();
4 h9 A" D% Z Z. z4 m% s1 e$ C340.
0 _6 e: K' R4 O1 V! e341.*判断元素是否在集合中:
n3 c. J: D" G" Z& Y( g. S342.<s:if test="foo" in/not in {"foo","tar"}> ( {+ G1 i7 A8 P% b
343.在 1 U' n0 b0 V0 j. Y6 m: J! k
344.</s:if>
; Y% `0 R/ R# w1 c- v: G/ w% G345.<s:else> 7 }$ q4 N5 l) G) [8 x
346.不在
' f$ w' @2 f8 D$ K& {( o% B: s347.</s:else> 5 l* q+ Y0 I4 }- N
348. $ ]1 I3 ?" Z; A
349.*投影 在大集合中过滤数据放到小集合 例:Book对象 # K" I. W p9 Y6 u: C: B
350.?表示获取符合逻辑的元素
! M9 b2 E8 P& J# m351.^获取符合逻辑的第一个元素 , U/ J9 B. l# I; N
352.$获取符合逻辑的最后一个元素 ! S# K0 d6 f3 @6 o6 ]
353..{}表示从大集合中筛选到小集合
( O$ k9 k7 I% X7 T u7 a354.<s:iterator value="books.{?#this.price>35}">
7 g! {5 s6 ?# W355. <s:property value="title"/>==<s:property value="price"/> 0 D! h3 w- b* @* ]" w
356.</s:iterator> 7 w' _8 G8 ^! f
357. 4 j; [" F. i7 F4 C1 h! M3 u
358.*URL标签 ! t0 `" w$ E' o) ~" ~9 i# {
359.<s:url action="" namespace="">
9 V0 u) f8 Y/ a360. <param name="" value=""/>
3 \) W7 M# k, t, a9 r; F361.</s:url>
: r" F3 ~+ O) n- J362. 5 `* {+ |! V& y! h+ F+ ^9 C7 p) O
363.<s:set name="myurl" value="www.baidu.com"/>
' o3 [) y1 R5 Y/ b' Q364.<s:url id="url" action="hello"> . I7 j6 L8 m# ?6 A+ c' o6 x: T
365. <s:param name="request_locale">en</s:param> ! L* A9 m+ H/ s. C$ {5 u {$ t
366.</s:url><s:a href="%{url}">English</s:a>
5 @3 x0 f; ~0 P3 Z" q367.如果href="#myurl" 他会把他当做字符处理 要这样:
( D9 g) [) p9 W3 [; V368.<s:a href="%{#myurl}"/>
* n1 a7 P. ]8 o2 q$ m369.
3 V. L, m; Y ^" {+ R" r! ]) A. W370.*复选框 集合list和集合map
# f: c# ^( ^, s2 `( W6 e6 e9 n371.集合list
1 u' A7 R/ _2 x; B$ @% g372.<s:checkboxlist name="list" list="{'java','c#','c++'}" value="{'java','c#'}"/>
& s n/ b! ?& x& _ W- y* |8 \373.value属性用于指定被选择的复选框 1 j! y5 p) P5 P2 [$ C; K p
374. , ]: e' {: {+ L0 ?
375.集合map + z" _* ?7 V' b+ `0 H$ u7 Q
376.<s:checkboxlist name="map" list="#{1:'java',2:'c#'}" listKey="key"
6 O& }- x9 v7 S2 b& s377. * k2 e n! r' h, z
378.listValue="value" value="{1,2,3}"/>
- h* H- B3 [# m1 q0 R% C/ d5 v# v, {379. 5 t" v: W2 ]8 q& G3 a
380.*单选框 # z4 Y* m% Y* V, v |& W
381.集合JavaBean I/ o: Q5 d$ Q4 x5 `
382.<s:radio name="beans" list="#request.persons" listKey="personid" ) d. R/ k3 {/ ], M
383.
: M; K: i0 t' W. W, P! Z384.listValue="name"/> 0 R, ~4 S" `& r' g4 B/ t
385.集合list
1 t6 ~$ }) ~1 I$ I# b386.<s:radio name="list" list="{'java','c#'}" value="java"/> + k- [6 I! R5 G9 H* @# q8 d& D
387.集合map
+ i1 C" ^% r2 ]* }4 H388.<s:radio name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value"
2 h9 _$ |6 O# ^8 q) q2 s389. ; e" ]; P! @* l+ y2 w6 H
390.value="1"/>
, X; ~& C, H& f: E391. 0 [7 h# V/ o1 v1 V W2 @
392.*下拉列表框
- p/ W: S0 D; |393.<s:select name="list" list="{'java','c#'}" value="java"/>
, E S6 m/ o6 L$ k3 F0 D' k% S394.<s:select name="beans" list="#request.persons" listKey="personid"
/ |/ j0 ~0 c, d' F' E2 l) Z395. $ s9 G' O* z! h) m* G
396.listValue="name"/>
# X6 N8 ` d" ^% e8 m) q397.<s:select name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value" J3 H9 ~. s& Z( |, R, P
398. 9 w! I- m, Y$ ]
399.value="1"/> & b$ }/ I: f/ m7 u# {" L% t- {% d
400. / [2 L) M% T$ e; l( z' Y
401.18:防止表单重复提交
! S* m9 y6 g$ X$ [* [ J402.<s:form actio="" namespace="" method="post"?
7 g* N7 z+ T3 b/ \403. <s:textfield name="name"/> . k, y2 w! E/ o) @ E9 f
404. <s:soken/>
~% V4 j5 f, b405. <input type="submit" value="提交"/>
3 r2 d& |# W2 c @% ~2 }406.</s:form>
- m, x1 q: N' t: R( C0 Q407.引入拦截器
' B" A3 j3 S0 F# C6 S, [408.<interceptor-ref name="defaultStack"/>
. f& u a# d2 ^6 u6 I% n& ~* W409.<interceptor-ref name="token"/> # ^. V" u+ a* B- |$ r
410.<result name="invalid.token">index.jsp</result>///发现表单重估提 |
|