该用户从未签到
|
沙发
发表于 2014-03-12 22:26:39
|只看该作者
201. 1、继承ActionSupport,再写方法validateXxx() 其他同上一样 0 e. x+ C5 J$ D" x5 `& J5 b( G
202.
* |' d- D8 Z1 m5 w! b; T- Z7 G203.第二:xml配置进行校验
: t! T' k" ~( f1 V$ p204.一、所有方法 $ V! a! t, \: {2 X
205.1.继承ActionSupport类,校验文件与action同包 命名ActionClassName-validation.xml ) f0 Y f" W2 G
206.
O" M1 h0 Q9 U5 Q3 g207.;
* j0 }: J- s9 p208.文件内容:
9 l, G% G: w. K- T, n/ t209.<?xml version="1.0" encoding="UTF-8"?>
. U5 F2 w, k$ X. {210.<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.03//EN" $ p- L- e3 P6 Z* ^3 H( ^
211.
7 K* q: P- b2 J9 r* H+ ]% M8 U6 e" s212."http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
5 A% h: L" c L* }! P8 B213.<validators>
7 {. g+ _& A1 |4 e' p; I214. <field name="username">
- V4 c9 R$ L& s215. <field-validator type="requiredstring"> % s% Y( j/ L# }4 B' z
216. <param name="trim">true</param>
i7 d& V; |+ C& d; @0 k7 w217. <message>用户名不能为空!</message> * x$ d% \( I& o
218. </field-validator> 6 k& Z' }6 `2 }+ {; S+ |: W5 [
219. <field-validator type="tringlength"> 0 z/ {9 C5 Y* G3 u. Y4 H: X
220. <param name="minLength">4</param>
5 M0 Z& Q1 n" p( `+ ^221. <param name="minLength">10</param>
/ j/ V; J2 D% }- |8 t1 @3 v222. <message><![CDATA[用户名应在4到10之间]]</message>
" Y" m) w/ F4 ~# G223. </field-validator> * y+ E7 s# d y( t
224. </field>
I$ V, Q7 v. [5 o225. <field name="mobile">
" R( Q1 x3 Q( |7 v226. <field-validator type="requiredstring">
! _% j* E) o) l8 u3 S3 Q9 K9 L- @# R227. <message>手机号不能为空!</message>
% I2 a% A& {( @228. </field-validator> . o* _6 Y: }, s! S* ]
229. <field-validator type="regex"> 5 P4 t* w2 A; ^, M; a
230. <param name="expression"><![CDATA[^1[358]\d{9}$]]/> / V# A; p" l5 V- P6 R
231. <message>手机号格式不正确</message>
0 r/ J! T/ G- y! k, W232. </field-validator> % I1 B. h" b: K R
233. </field>
$ ]: I* V# Z' g2 Q234. <field name="age"> ( a9 t& b5 m+ Y$ }5 n! G: h
235. <field-validator type="int"> + y$ K0 T, O6 C
236. <param name="min">1</param> 5 U( t! T, g" A {4 w2 f; _3 q4 z
237. <param name="max">150</param>
: Q! S+ o$ l! V) Z238. <message>年龄范围不对!</message> - w4 V* A! V/ l
239. </field-validator> ; `0 p R P: S; C
240. </field>
* z2 L; N9 C e" L8 s1 g241.</validators> ) ^0 q; h7 h7 X3 F( [0 M7 t
242. 5 i W( o h, [% X; _5 \
243.校验器的路径:com.opensymphony.xwork2.validators下的default.xml中 $ h3 F; S2 ?1 ?7 |
244.二、指定方法 6 R6 x, A# X8 r& q, j' l+ q- g
245.文件命名:类名-配置中actiono的name-validation.xml 9 E% M9 `- i- \" h* a
246. ! m* L0 x% U6 B( Z# U1 y
247.15.国际化 " w! X; r: y5 d2 `
248.全局范围、包范围、action范围
5 h( O' N k$ x9 I8 d, d249.命名格式: 9 j' g* `$ a; N6 N3 v: @8 i1 L5 ?
250.baseName_language_country.properties
6 W9 [0 B9 t: b+ n8 |0 ~5 v2 Q251.baseName_language.properties
, ]* n( }8 v3 M& t9 B252.baseName.properties
# c) w3 F* h2 ~6 b5 c253.baseName是资源文件基本名可以自定义,language和country必须支持java的语言和国家
8 e. d" ]+ ]/ N% H' ?254.中国baseName_zh_CN.properties
8 V0 U# Q+ B- n255.台湾baseName_zh_TW.properties / \# N1 O$ K; B, l& o( w1 E
256.美国baseName_en_US.properties
! u- Y7 @& T/ y6 C257.
* Y( Q0 } z; Z1 B258.在properties中MyEclipse支持自动将中文转换为Unicode编码 * f3 c; U8 x2 Z4 {4 O
259.利用jdk提供的native2ascii命令格式转: 6 r# \: B/ x1 S
260.native2ascii 源文件.properties 目标文件.properties # I$ c- ^, ^2 X3 o; V* G, G
261.
* X* G$ p2 Y- Z. h. n1 u% d262.通过在浏览器中改变语言就可以再语言间转换
/ L" u, D1 g5 e* S7 F1 |- ]263.一、全局:<constant name="struts.custom.i18n.resources" value="资源文件基本
7 e/ J" @& i4 p$ N4 F5 @264.*在jsp页面是用<s:text name=""/>标签来输出国际化信息 name为资源文件中的key
+ C7 v" R8 I' V& m( O4 W9 R265.*在action中可以继承ActionSupport 是用getTest()方法得到国际化信息名"/> 第一个参
- R) O2 W3 O/ _, a1 t6 _7 @266. * v0 [# u& n S+ Z- L
267.数为资源文件中key
/ U! A# V w1 O9 A268.*在表单标签中,通过key属性指定资源文件中的key 如:<s:textfeild name="" key=""/>
" a% z; U; {0 X; r f0 [269. + E$ L ~0 Z7 z, e; p; h
270.有占位符的表示:
4 g5 `! J6 N2 ?# C271.welcome={0},欢迎光临!{1} $ y6 |+ ~' v; i5 `3 I9 u: }
272.*在jsp页面: 2 |6 Q7 Y% W8 P5 I: ~+ w
273.<s:text name="welcome"> 2 r* V* X8 M0 ^/ e. [) L8 g' V
274. <param><s:property value="realname"/></s:param> 2 e: p& t$ Z, p; ^* u# A9 G g; l
275. <param>学习</param> 9 j) b: W) b0 X9 H. q
276.</s:text>
# o1 n1 B- y6 i; Y0 q- X) V277.*在action类中: * G: u# `4 R4 C9 P: Z/ z* K! z
278.getTest(String key,String[] args)或者是getText(String aTextName,List args)方法
w7 [ y) _8 B$ O" L( l, J279.
# Q& U$ a: J) d2 e280.二、包范围
: h# P$ o* I5 J* d' P281.在包下放置package_language_country.properties资源文件 package为固定写法 ; V% m3 ~4 i/ y- W
282.该包及子包下的action毒可以访问该资源 系统会先找包资源文件 找不到则找系统资源
- B" \5 q( A. @6 a0 u2 `283.
3 Z8 M/ }) b( k* M0 U284.中的key
/ {2 x0 ]/ m W- b285.
; `% i& B O2 q/ R% d8 F1 j. h$ m0 S; r286.三:action范围 " i- A/ w; t- `1 V+ U6 e
287.在action所在路径放置ActionClassName_language_country.properties的资源文件 * J& a/ O& @$ N. l9 _/ {6 P1 D
288. ! M$ a _1 h Q6 ]. C1 W
289.无需任何配置直接从资源文件中获取配置:利用标签 ( i( D! y8 J" _3 x$ V' q- E" z0 `
290.<s:i18n name="资源文件名"> 全局 3 F% } F- h7 ?) P, Z5 M
291. <s:text name="welcome"> ) M5 g6 j; J7 `* Y% |6 \
292. <param>小张</param>
4 y! z* N/ a- Q4 V; A+ ^293. </s:text>
/ F% P, V' i; L3 \4 ~294.</s:i18n>
* \" E+ q' q7 {0 M5 Y4 \& l: d295.<s:i18n name="路径.package">从包中 j* i1 r( A' [ {
296. <s:text name="welcome">
7 n( L* b$ Y9 P" p, ]297. <param>小张</param>
. c9 U/ t4 J9 K& @! a8 I298. </s:text>
+ I! {& _; e/ s& `5 T: v& |299.</s:i18n> 6 i1 c& z* }% t' p3 k. v- N
300.<s:i18n name="路径.ActionName">action
1 Y* f$ ^- }0 p: {301. <s:text name="welcome">
1 |3 x" E A) U, e S, a302. <param>小张</param>
& k3 H" b* q9 ]6 U* S* L303. </s:text> , ^+ y% \9 G! ?# Z
304.</s:i18n>
1 G: E; r7 Y) h; Y: V305.
% X; J8 {1 f( R! v306.16.OGNL表达式语言
2 f0 K7 ~. y; s307.类静态方法调用格式:
; n) o* u! j( M) X. f' }% z/ V308.@类名(包括路径)@方法名 1 Z. ?8 m% K: r
309.
8 r: @; \) K7 A6 `8 W& g9 a- x310.OGNL Context(ActionContext)访问上下文中的对象:session、request、application、
& ~% W2 f$ n! {; Y* z& x" Z311. 3 h b$ _% K& y) {
312.attr、parameters、OgnlValueStack 2 p9 k6 }2 |" R; {6 Q6 ^" W
313.访问对象格式:#session、#request * P1 {/ z U% E3 z ?# [" K
314.访问对象属性格式:#session.userName或者#session['userName']
- q D2 a1 s: r4 Y315.其中OgnlValueStack root变量无需#,他访问对象属性时从栈顶开始找 & \- ?( ?! T- o% W1 k! X* L
316.需配合struts2才能使用,也可以用EL表达式(只能访问值栈中的属性)直接访问对象的属性 - C, @* ~% W/ K9 K/ R
317. ! P' P& K( z, O( ?
318.17.常用标签使用 4 b$ V0 g& K/ h- y" }# Y
319.*构造list对象: $ T# u5 n* ^" G( G% y
320.<s:set var="list" value="{'1','2','3'}"/> ) X: P$ |9 D: V! ^: J/ H- P
321. 7 I; e! _+ D+ Z2 W+ H& w6 K' Z
322.*迭代list:此标签迭代时将当前对象放到栈顶 0 Y$ h# |- O9 m5 G5 i0 e- l f5 N
323.<s:iterator value="#list"> 6 r+ E3 [+ C) l+ @
324. <s:property/>
4 C, Z6 E" d% i$ Y325.</s:iterator>
: o# [/ B( B! w! m* o326.
* M, I( ]7 N1 T% [6 J8 h; a# A327.*构造map对象:
, N" F. Q' l# ]& t& o328.<s:set var="maps" value="#{'key1':90,'key2':20}"/> ' [% s1 {! x! \5 h4 p O* A
329.*迭代map:
; u7 _5 |+ R! C8 _5 k" _330.<s:iterator value="#maps" status="obj">
+ z6 A) Q4 C; q331. <s:property value="key"/>=<s:property value="value"/> ) t( n3 R3 ]& i( f; v
332.</s:iterator> 4 j( {$ Q3 x2 v- }; D2 l$ H1 V4 h
333.obj包含方法:
4 R& E- A# ?, n# [1 y. z334.int getCount();返回当前迭代了几个元素
- F @, o; Q& `! e335.int getIndex();返回当前迭代元素的索引 ; p( ^* Z3 ?8 F4 B
336.boolean isEven();返回当前使用元素索引是否为偶数 6 k d7 M7 N) z/ Y" d2 ^
337.boolean isOdd();返回当前元素的索引是否为奇数
: H. F) ]/ N& w, w% k& h8 y338.boolean isFirst();
; u: j1 k( i2 x7 ~+ m339.boolean isLast(); 3 d* f; i: T6 o, j5 J
340.
9 _! |5 `$ q. H5 @# i F; h341.*判断元素是否在集合中: ( J* I' G$ H+ _* c# i' i% @
342.<s:if test="foo" in/not in {"foo","tar"}> 9 N, X' H9 C7 l
343.在 , _) \8 J! p* u6 R+ v1 p1 `
344.</s:if>
/ w' y0 D2 f; o7 ~, K m/ h345.<s:else>
9 {4 U) J% c0 ^+ s" } m: J/ h4 V% N346.不在 & \! Q# T' y. G1 a" j
347.</s:else> 7 {! b: K) [; \! p5 N( J
348.
9 d- d+ p% d3 a. M! l5 `% ~4 E349.*投影 在大集合中过滤数据放到小集合 例:Book对象
, q' R6 L+ b" U f) `0 l350.?表示获取符合逻辑的元素
- H$ C3 B, V7 q1 d. h ?9 X+ T( W351.^获取符合逻辑的第一个元素
9 d9 q ~& e% x0 o; a352.$获取符合逻辑的最后一个元素
, r6 ^4 g% _$ W2 x353..{}表示从大集合中筛选到小集合 & g- i9 M1 i" z, B
354.<s:iterator value="books.{?#this.price>35}">
" D' S3 I2 Q: d q6 C355. <s:property value="title"/>==<s:property value="price"/>
% ?$ r4 l+ `# h356.</s:iterator> 8 L6 ^6 t5 W' Q& ]& W$ X, I
357.
& s% j4 p! p: A0 C' E5 m1 b1 d3 M358.*URL标签
4 F* M9 j: ^ Z4 D0 | l O359.<s:url action="" namespace="">
6 ]! D- v5 {. |5 }4 V5 u360. <param name="" value=""/> ' g' v$ u% ?8 ?. m# g' Y& ]
361.</s:url> 4 q j }" S% W \' T
362. , t7 `7 \. `; |
363.<s:set name="myurl" value="www.baidu.com"/>
, x9 ]1 v% E* ?3 i$ W364.<s:url id="url" action="hello"> $ ~) s2 }2 G& |
365. <s:param name="request_locale">en</s:param> $ `6 Z O3 y+ W
366.</s:url><s:a href="%{url}">English</s:a>
4 |1 q' [1 j" y7 s6 S367.如果href="#myurl" 他会把他当做字符处理 要这样: 0 I2 s s7 }" F3 Z8 S. u$ r
368.<s:a href="%{#myurl}"/>
# p6 N* I' `2 @3 a3 X; y* |369. ! u2 d5 @2 o7 |+ U) C; {+ G
370.*复选框 集合list和集合map
: P& X9 k9 D. } `- }371.集合list % s7 v5 B& {, I& h
372.<s:checkboxlist name="list" list="{'java','c#','c++'}" value="{'java','c#'}"/>
1 V9 p8 `8 l- W. `373.value属性用于指定被选择的复选框
1 N- A4 m# v7 g. ~0 Y/ d% g6 D& r374.
4 C! S8 l* \& j: v' v375.集合map
/ ?* k7 |. R; ?5 @# S8 V9 u" t376.<s:checkboxlist name="map" list="#{1:'java',2:'c#'}" listKey="key" $ l" P+ D) ?! G4 n4 w) S$ v
377. 1 w @' d3 |2 c% J1 R3 Y
378.listValue="value" value="{1,2,3}"/>
0 u7 l( u" G& j h379.
0 `& m! ?& T, a, R) C+ ?1 U6 g380.*单选框 & M; e1 {; @, i" Y
381.集合JavaBean
# q3 r2 v: F9 d7 e1 \0 m/ O! \382.<s:radio name="beans" list="#request.persons" listKey="personid" ; g% A6 z3 k( R
383. - H& o# q. l& v. v* h% M7 T' R
384.listValue="name"/>
( `7 w1 Y0 }+ ], W385.集合list & {" J( f4 `. H" [: k
386.<s:radio name="list" list="{'java','c#'}" value="java"/> ; _ y: X8 v$ F/ q l6 @
387.集合map
5 R4 O+ I" E c8 k388.<s:radio name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value"
; y! A% h5 \; F! b& ~9 b: M' w389. 5 ]' B( b$ a4 ?, B: I0 N0 x3 m
390.value="1"/>
7 Z/ N: q) E: g' a' `391.
, d7 b& N0 {7 P5 H392.*下拉列表框 8 @! M, c! ]. v0 c: {& |4 N, k" m- o
393.<s:select name="list" list="{'java','c#'}" value="java"/> 8 `. A8 m, x6 G" p4 Y* t. v% L
394.<s:select name="beans" list="#request.persons" listKey="personid" # a& p. P% X$ Z# |' V6 c& U8 Z
395. , Z" e0 @, I$ A
396.listValue="name"/> # r+ m2 ]4 \; N1 d* ^* h3 ~/ l% }& Q
397.<s:select name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value" 5 M. p6 ?; j, k3 H2 W
398. : H! L9 P1 \# N- Y: P9 ~
399.value="1"/>
2 |) Y1 {/ y( M. ?400.
$ X; }; ]) d1 ~- T401.18:防止表单重复提交
% ?/ U* n2 \0 n* v8 B& v% l402.<s:form actio="" namespace="" method="post"?
) g k7 i ~" l! _- u" C a403. <s:textfield name="name"/> 5 n# ]) K" I/ Z. i7 F: H1 k
404. <s:soken/> 3 t* J; k7 W1 T" Z, I6 ^& d/ c, y
405. <input type="submit" value="提交"/>
, G/ g4 I2 s& W406.</s:form> e% f* H4 D" P" p
407.引入拦截器 # |# P' H6 o$ ]/ o8 N) |
408.<interceptor-ref name="defaultStack"/> , o' P* T4 |* H- K
409.<interceptor-ref name="token"/>
5 F+ G6 c! @$ q% m+ f, u# p* `410.<result name="invalid.token">index.jsp</result>///发现表单重估提 |
|