我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > 学习struts 注意事项大全
总共48087条微博

动态微博

查看: 2396|回复: 1

学习struts 注意事项大全

[复制链接]

326

主题

72

听众

999

金钱

实习版主

该用户从未签到

优秀版主

跳转到指定楼层
楼主
发表于 2014-03-12 22:26:27 |只看该作者 |倒序浏览
1.1.自从struts2.13、以后之前的FilterDispatcher标注为过时  
* b# n( E1 Y& X6 @7 e: ]0 q5 P' X2.<filter-class>  & Q, E% N+ W9 e3 }
3.    org.apache.struts.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
, A$ q/ X8 i& A+ L5 j3 M! I. b4.</filter-class>  
. _6 h* S; R( C+ |% }5.  9 w  {: m# q/ u
6.2.action中默认的method为execute()  7 D1 T) @8 Z2 e* @% r8 Z( P
7.   默认class为ActionSupport  
0 J* d5 B0 a3 f) c- T" `  P6 z8.   默认name 为success;  
9 l, T* J0 W; ?# ^- N0 B9.  
. O# S  W8 W/ d" p% D10.3.转发类型   传中文参数URLEncoder.encode("","UTF-8");  6 H5 G! _, Q$ e0 Z1 O
11.forward   $ E  P6 J1 q8 f: |1 I* ^3 e
12.  : B  ^/ l2 [: l* t' T
13.redirect 浏览器跳转  
2 W0 ~+ q, ?& s3 x" h, l/ d14.<result type="redirect">/index.jsp</param>  , U( }5 s7 q) K2 ?% z4 H
15.  
- C8 h2 T4 a2 [6 F& q  {4 t16.redirectAction(跳转到另一action)   
  X1 |9 b  H9 p9 d8 r7 S17.<result type="redirectAction">  
8 L1 u" g& s# N1 F2 D5 e. ?18.<param name="actionName">xxx</param>  
# \) d' Z' v- r$ c4 k19.<param name="namespace">/xxx/xxx</param>  
  p7 y- J3 B) X! b9 s20.</result>  4 K' J. Z/ k6 ~- f1 t# ^0 s
21.  & R( Q. q+ J& o7 f. H. {/ Q
22.plainText(返回jsp页面的源代码)  中文问题  
; M# a6 K6 S6 H* @! `/ @7 B23.<result type="plainText">  & X; r8 l. G! S
24.<param name="location">index.jsp</param>  . O2 T$ i/ S* G3 K- Z( j
25.<param name="charSet">UTF-8</param>  
/ [* X' o7 t/ H5 u2 [& B( r% \26.</result>  
) X6 w, D( i" }+ i% b27.  
& @8 z0 v2 O! X1 W  {$ P28.4.共用  
! t% H$ S0 G0 Y4 D+ A4 {29.<global-results>  3 g5 r, m: n; t3 q
30.   <result name="success">index.jsp</result>  % v" A1 Q# P# R7 g# v; N  ^
31.</global-results>  * ~" s8 |& W4 ~
32.  * g. f# [5 j( t# {
33.5.给action中的参数赋值  
( n9 [" b8 ^: a; ]34.<action ---->  ( q1 H; R' U$ j8 u: w
35.    <param name="param_name">xxx</param>  
  E% s* |7 @, s+ \$ R36.    <result>index.jsp</result>  
. m4 s0 {4 Z& M0 I* `( C: b37.</action>  
  z1 C4 F: ^; C. E% \* T$ K& Y" D38.  
+ p1 S3 x) w: d1 R39.6.常量标签  + `* r8 C' v5 {9 b: ^- L
40.<指定截取的后缀  $ n5 _7 F& B6 A4 G
41.<constant name="struts.action.extension" value="do,action"/>  
3 g# b, o* r2 l- U' D42.  
/ N5 f5 u  X0 x% N, m43.指定默认编码集 作用于HttpServletRequest的setCharacterEncoding的方法  - O* F# ?) V3 y9 N  k: u% \+ q- l
44.<constant name="struts.i18n.encoding" value="UTF-8"/>  & p/ Z" m3 V: O
45.  
8 C! c( A+ F8 T  W' {. o46.设置浏览器是否缓存静态页面 默认值为true  
9 @' h2 j) A: [* Q2 [. M47.<constant name="struts.serve.static.browserCache" value="true"/>  
/ E& x' I/ A! h* K. B48.  
, G# H' k: I# V* U9 J- h49.当struts的配置文件被修改后,系统是否自动重新加载文件 默认值为false  
" j1 q/ b6 `" I2 T2 i50.<constant name="struts.configuration.xml.reload" value="true"/>  $ B- K% w6 b  T/ ^( ^2 ^, H! m7 k
51.  % S8 w# Y6 y9 h/ z
52.打印详细错误信息  开发阶段可以打开  2 i9 f/ O5 L- p
53.<constant name="struts.devMode" value="true"/>  
+ n& n& S: B' c8 Q7 [54.  
5 _$ Z4 O1 Q; q2 n! w; ^' A55.与spring集成时,指定由spring负责的action对象创建  ; ?; V3 P; b' Q% U) w- g
56.<constant name="struts.objectFactory" value="spring"/>  
) j9 L4 V$ \) d  t1 e: V. x) m57.  
  o) [6 V* u  p3 c58.上传文件大小限制  默认大小为10701096  + W6 s! [) J9 Z- D+ b; P
59.<constant name="struts.multipartmaxSize" value="10701096"/>  1 o. y; [4 M, w* y1 [5 ?
60.  
4 Z7 k5 L/ Z: z) ]61.struts2加载常量的搜索顺序  
) ?. L1 C+ `, ~( g62.struts-default.xml->struts-plugin.xml->struts.xml->struts.properties->web.xml  + W9 i; f$ b+ f* s
63.如果在多个配置中定义了同一常量则后一文件中的常量将覆盖前面的常量  7 m  j& f- I4 H; w; `
64.  , n" z$ W$ Q& h8 {7 p5 z
65.主题  , I2 f) R9 q. n) E5 n! s; r& {% z& ?
66.<constant name="struts.ui.theme" value="simple"/>  ( h! [+ {+ H8 {, W
67.7.指定调用方法  默认是执行execute  
0 y9 O8 m; m0 z/ P& H* I7 l68.动态方法调用:  - J- p* s7 b3 u5 p! N
69.<constant name="struts.enable.DynamicMethodInvocation" value="true"/>  
( ], u4 g/ b9 }2 j9 b70.在访问路径后加!methodname   如/example/list!add.action  
1 f: u" s0 [! s' D4 S' d4 {: v3 _71.  
! E, c. H; B5 U% X. ^: Y5 }72.也可以用通配符来确认  0 K' N7 T0 f) q8 K& h  I" f
73.<action name="list_*_*" class="com.ss.action.{1}Action" method="{1}">  
. _7 c6 A9 ^7 O' h1 {74.    <result name="success">/{2}.jsp</result>  
. k! ^) G  Z) T; v3 C/ \+ K75.</action>  
# q. P( _+ _8 ]2 f76.  : `2 y, ]5 X/ o* Q" _# l
77.8.2.1.6版本 接受中文请求参数出现乱版  ' G' O7 S6 [* Z# t; d
78.新建一个过滤器filter放到struts2的filter之前,然后在doFilter()方法中添加代码  
+ J! Z4 M7 a' C: F7 T6 }79.public void doFilter(){  / c0 R+ w2 f3 n+ x7 u
80.    HttpServletRequest req=(HttpServletRequest)request;  
; D* y8 Q7 N) B  K* [7 p81.    req.setCharacterEncoding("UTF-8");  ; }2 C( |0 R! v
82.    filterchain.doFilter(request,response);  3 a$ U$ x$ k& A" z1 |3 b
83.}  
' P3 B- b1 v9 \. \9 k' `84.  
- }4 m, [5 M5 M; L/ T! R8 u# o85.9.定义类型转换器  
  K+ o# s0 D2 U, W7 J86.一、局部  * |7 P$ S8 A! p, m/ P
87.定义一个类并继承DefaultTypeConverter从写  ! v0 j% @. A% U- V' K
88.convertValue(Map<String,Object> context,Object value,Class toType){  
" j; {' z5 g" M$ g7 Q9 P/ ^89.  SimpleDateFormat date=new SimpleDateFormat("yyyymmdd");  ; E# A* B0 L9 y0 b  T
90.try{  6 R+ j7 f, i! R% P& Y7 J
91.   if(toType==Date.class){  
( u( E: t2 m3 k7 Q1 Z5 Q# ?9 w1 @92.    String[] params=(String[])value;  5 K% e3 v6 U' T* ^7 E" o2 T2 j
93.    return dateFormat.parse(params[0]);  % {' k/ b* R! ~9 y. R
94.     }else if(toType==String.class){  ; i1 B' H* [: [) U
95.    Date date=(Date)value;  
( e* d) F/ q% G/ \: A2 Y7 N8 n. h96.    return dateFormat.format(date);  ( m" Q, S/ t2 E" ]- Y7 e
97.     }  % g# t7 v- A0 T! r7 P! i# Z+ r: w
98.   }catch(ParseException e){  
8 p7 a& m8 P; {7 t! p99.    return null;  . I  L: Y* j, I2 B: @) Y8 a4 f" w
100.   }  
/ [/ y4 V4 X7 D101.}  
3 Y+ k. {: h. O- I8 N) Q% X% n' J102.注册:在Action类包下放置<ActionClassName>-conversion.properties文件  
( X2 f: v" j1 O$ h103.   属性名=包名.定义的类  
8 h  d3 p! j* L. l8 Y) D& f104.二、全局  
4 s. f7 T4 g( |: T9 H+ @/ I105.在src下(WEB-INF/class/)下   xwork-conversion.properties  
4 g0 s! n% S9 y, Q2 H106.java.util.Date=包名.类名  
  b, J, F! K) [( M107.  
  Y6 H2 ?# ]9 e8 v6 c: h3 Z9 S108.10.向request、session、application中添加属性  
" c/ m- b# Z# m3 {* b9 `109.ActionContext act=ActionContext.getCOntext();  0 V! g" R' o! W1 s6 L( }, _( \
110.act.getApplication.put("app","应用范围");  3 F+ |- S7 m) e4 ?$ g* P
111.act.getSession.put("ses","session应用范围");  
( _4 [/ D- H+ ^( h112.act.put("req","request范围")  
3 @) F$ k& W$ r' w113.  
+ F% w. @1 j1 d114.获取原生的请求对象  2 i% G  [5 B- s
115.HttpServletRequest request=ServletActionContext.getRequest();  ) ^  ^' U, V* E0 D! M8 J
116.ServletContext servlet=ServletActionContext.getServletContext();  
) X3 V+ S" i, A- I. k& E117.servletContext.getRealPath(“”);得到具体文件的绝对路径  
1 K4 s, C7 {4 I3 r) J+ T/ o118.request.getSession().setArrtibute("session","会话范围");  
( s! e7 c* ~6 j, r: F& i) O119.servletContext.setAttribut("app","应用范围");  - q0 \7 R' Q5 R. p( P2 D& o
120.request.setAttribute("req","request范围");  
/ l/ G" ]% t; R4 t; e" E121.页面访问  # g: o& q4 b* A% a' g0 m
122.${applicationScope.app}  ) x7 r8 v* E9 l& K7 a* l+ t
123.${sessionScope.ses}  
% e) w# ~; o9 x' u$ d$ l4 K124.${requestScope.req}  
- k( B, ?7 H8 Z% v7 d125.  
! T: |% k9 s! L126.11.struts2上传文件  
! [" x5 ^3 d9 V  Z# d127.第一步:放jar包 commond-fileupload-1.21.art和commons-io-1.3.2.jar  9 |8 M  C; ]2 w8 n; b- ~% x8 y
128.第二步:把form表单的enctype设置为:multipart/form-data  如  + L1 h  b/ X7 C% s  h
129.<form enctype="multipart/form-data"   1 N2 h; d, _  L6 ^, f
130.    I3 M, n. F  N) o6 f! e
131.action="${pageContext.request.contextPath/list.action}" method="">  4 ^+ |: v% L, e0 |. X2 g( d$ L  g
132.  <input type="file" name="uploadImage">  
- a& f3 S5 f7 k. P% r( l5 X133.  <input type="submit" value="upload"/>  ! U9 D2 H1 S! p4 Z2 ^; M
134.</form>  # F- K# \( x3 e
135.第三步:在action中添加以下属性  命名规则  与file的name相同  
/ Z* d2 h6 b/ e& S# X# A136.private File uploadImage;//得到上传文件  
9 l$ _* f" H  \! A- Q% v1 S" X  |137.private String uploadImageContentType;//得到上传文件的类型  ; L, y$ \* J/ _3 n2 V0 d* C
138.private String uploadImageFileName;//得到上传文件的名称  + C5 Q4 P$ a. H& A7 T
139.  
: s' r, W4 y+ I8 u% l9 {9 ]140.String realPath=ServletActionContext.getServletContext().getRealPath  0 y+ ^; n9 Q0 f1 a+ p( E$ A
141.  
' N8 B& _1 x: p  g) y5 R0 |; X% X( w142.("/images");  
5 H5 U# f$ f! |. e143.File saveFile=new File(new File(realPath),uploadImageFileName);  - q# C; V) a- Y+ H7 l( q
144.if(!savefile.getParentFile().exists())   3 L. d* o/ R+ ]) a, g/ X
145.  saveFile.getParentFile().mkdirs();  
( {/ `+ t" {2 i  J; f; `* R) e# N146.FileUtils.copyFile(uploadImage,saveFile);  
8 H5 ?% k2 v3 R% h- _147.  6 N8 i$ p5 h0 d& V/ l% {4 E
148.12.多文件上传  
% }) \5 p! F( B% ?149.  8 e$ L. P4 `9 P! j# {
150.将属性类型定义成数组活list类型  5 |9 L% W3 V5 Q0 ~
151.private File[] uploadImage;  
( {7 P% q! m) j" T8 F. Q/ h152.private String[] uploadImageContentType;  - _* c. x- ~  O: a: ?
153.private String[] uploadImageFileName;  . X8 f, m. y+ D. x
154.  4 }& m( W. m* P7 m  O
155.String realPath=ServletActionContext.getServletContext().getRealPath  - J- J# x5 f+ a( \( D& S  U
156.  
* |% D4 k$ V6 Y6 k. I. M, c157.("/images");  $ Q# [, m' J  i% ~& e* P
158.if(uploadImage!=null){  
. X7 _  c; c1 d159.File savedir=new File(new File(realPath));  8 T+ y7 R: F0 n
160.if(!savedir.exists())   
& P) O; V9 j8 \. c% n7 {3 x161.  savedir.mkdirs();  # F. U3 d. O- w3 F4 S
162.for(int index=0;index<uploadImage.length,index++){  
0 m3 s: J9 \! |  w7 F5 I/ Y163.      File saveFile=new File(savedir,uploadImageFileName[index]);  
( e8 _! a8 u& R/ S% k+ d1 A164.    if(!saveFile.getParentFile().exists())   
' U) y& R: H/ ]7 d8 e165.           saveFile.getParentFile().mkdirs();  # `: z" L: i1 c" C
166.    FileUtils.copyFile(uploadImage[index],saveFile);  / o8 A* b' ]/ N& H9 Y% @
167.}  
9 A& T$ R1 e: n0 K2 S168.  
1 D* K+ ?4 Y  V1 {8 X169.}  
4 l/ w7 F* y. C  R) ]- e170.13.自定义拦截器  
# K$ q: K3 h0 d8 f7 P171.一:类实现Interceptor接口   ; d, w2 A0 z( a' J+ j9 U: G
172.在intercept方法中进行操作,invocation.invoke();继续执行该方法  
0 L+ i' _; ?" p6 Y7 D. t173.二:注册拦截器  
& r9 @/ r8 E. j7 @0 ~0 @174.在sturts配置中定义:  
( f- Q: {% C8 a; O  G* l& a175.<interceptors>  
- p% H7 S0 B$ I( a9 `: k176.      <interceptor name="自定义拦截器名" class="类"/>  0 N# o+ A" Y# f# K, r$ U
177.   <interceptor-stack name="栈名">  
) g" v6 L4 [3 o% x* L178.       <interceptor-ref name="defaultStack"/>引用原来的拦截器  - ]& i4 E% J1 H! o
179.       <interceptor-ref name="自定义拦截器名"/>  ( o+ Z  C' B: I/ H, U5 V! a
180.   </interceptor-stack>  
, R, D3 j  N8 ~3 q181.</interceptors>  0 E# ^2 G- |$ T0 ^9 f' i
182.<action name="xxx" class="xxxx">  
/ \6 ^/ S3 e. f7 w183.    <interceptor-ref name="栈名">  
* t' ~  W% L# O2 m184.</action>  , t% f' I( v: Y" T# U6 \/ `3 {2 I  G
185.  
$ R+ u5 i  R! C+ J3 g) U) }& E186.定义一个包下的所有action都使用此拦截器  
' _% V! b! [5 E: [8 Y& g4 j$ M187.<default-interceptor-ref name="栈名"/>  
+ z7 V6 k" r3 t( z: a- s0 X* v  O188.  - `2 ^$ X; W  `3 v
189.14.struts2的校验  
1 m  s& O" W" R) S6 l1 Q3 Y9 {' n190.第一:手工代码校验  1 ^5 V5 `( v9 A( H! u" q; V
191.一:所有方法校验    f& W* B2 ?5 I- v% i
192.    1、类继承ActionSupport 再从写validate方法  
1 F) v) B7 t" n9 v/ E+ a+ w* K193.    2、在validate中写入自己的验证需要  
5 g& B) j- o+ P6 D: J" w2 r194.    3、此方法this.addFieldError("username","用户名不能为空!");用于放置错误信息  4 r' \& r0 B- j, G6 j" s( J2 O
195.  ! J5 ^; ~3 m0 A" q0 s9 J4 r
196.,正则表达式的验证:  ; d9 J4 M( c' q  r2 `  n) b
197.Pattern.compile(regex).matcher(this.mobile).matches();regex以^开始以$结尾   
) J) u- E& g) b! s- N# Y! f' ]* `) P198.  & C: B& e- @; f. y
199.fieldError包含错误信息则返回input   <s:fielderror/>显示错误信息  
" z& z( m3 o: H' D200.二:指定方法校验  9 m" |+ D$ Y; K! }7 j) ^( F
交时返回视图  
+ D2 v# R/ G$ E1 [, X" Z7 a; f1 Z1 N' i% S2 b

科帮网 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与科帮网享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、科帮网管理员和版主有权不事先通知发贴者而删除本文


JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

326

主题

72

听众

999

金钱

实习版主

该用户从未签到

优秀版主

沙发
发表于 2014-03-12 22:26:39 |只看该作者
201.    1、继承ActionSupport,再写方法validateXxx() 其他同上一样  / N% I6 L. p2 x( K
202.  6 r: O. S& ?  z' x4 P5 M" y
203.第二:xml配置进行校验  
7 t  j$ G( T* [204.一、所有方法  3 s# d0 d& @5 b! @2 p
205.1.继承ActionSupport类,校验文件与action同包  命名ActionClassName-validation.xml  
, }) Q* Y0 m) e( Y/ W206.  
; `# Z+ T* W- M$ J207.;  
1 o- S# \. s0 _, x$ x208.文件内容:   
( F6 A2 y2 p  B4 J209.<?xml version="1.0" encoding="UTF-8"?>  / q8 g+ s1 @0 n) O
210.<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.03//EN"   
# A  ^1 |- w( |3 U+ ^; G% o211.  
( w3 A0 c8 h) I. k212."http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">  
  Y# j& \8 M) j5 f: {* h213.<validators>  5 j+ ]: c1 b  I# s" M! A+ F
214. <field name="username">  9 @( ~9 g( Y; T
215.   <field-validator type="requiredstring">  5 r. O% t2 i- |5 o  `! d
216.    <param name="trim">true</param>  
8 b$ T! M9 S1 ?, v217.    <message>用户名不能为空!</message>  
9 Y  J1 N  d9 T218.   </field-validator>  
& o, ]6 |. b: Q. }1 q219.   <field-validator type="tringlength">  
. U* D2 \, l% M2 ~1 E# V4 q% B220.    <param name="minLength">4</param>  4 G( n" o1 L  d) [0 b
221.    <param name="minLength">10</param>  + @0 Q$ b; ~8 {, }& q+ M/ e) L
222.    <message><![CDATA[用户名应在4到10之间]]</message>  / h7 m/ L0 y8 q" h% Q4 S8 \# X3 E
223.   </field-validator>  
0 h# F# ]* z  b0 x224.  </field>  
) ]- \& S1 H/ S225.  <field name="mobile">  
& S  b: l# ]! E8 H, A& I0 f226.     <field-validator type="requiredstring">  * b2 ]+ L8 o( n, P1 D* X, M; Q
227.    <message>手机号不能为空!</message>  
. X# |) z8 }4 W. f5 Q228.     </field-validator>  / @3 l+ y) c: W1 W. X: `/ Y; i
229.     <field-validator type="regex">  $ u7 o1 o2 Y. ~& t$ S( {; C4 I4 l
230.    <param name="expression"><![CDATA[^1[358]\d{9}$]]/>  
! P2 U$ e. N$ i1 k; [231.    <message>手机号格式不正确</message>  ! G% m& E$ v& L: x' u' \- b
232.     </field-validator>  
' a. z9 `7 I+ x% Z) u3 n233.   </field>  
: z  m& O. z! i( [4 P5 E7 S* W234.   <field name="age">  
& w/ }) E$ c- L235.   <field-validator type="int">  
' n. o8 H! r& q$ D5 E* f3 Y236.    <param name="min">1</param>  
6 k  o: q2 w# h) d& K  W5 W237.    <param name="max">150</param>  
+ o; t6 `, U& Y0 s238.    <message>年龄范围不对!</message>  ' G8 S6 U& w# E9 u7 g9 V4 D
239.   </field-validator>  ( p: L1 ]. o1 m9 G
240.  </field>  ( y: {3 D  J, `
241.</validators>  & f0 o8 H; ?- K# o  @! C
242.  - ^# S$ r' @' |7 E- p$ L
243.校验器的路径:com.opensymphony.xwork2.validators下的default.xml中  
2 E. t7 \" V/ N* n244.二、指定方法  . g: f9 G& \7 r
245.文件命名:类名-配置中actiono的name-validation.xml  % r6 ~% s* q7 W
246.  
' Y  A" C4 Z5 E  `+ x4 v247.15.国际化  ! B! Y2 i0 U" O$ K5 T! f
248.全局范围、包范围、action范围  + `3 B  Q* v) O/ y
249.命名格式:  7 s( v3 z3 ?4 M) O9 d: F
250.baseName_language_country.properties  & F2 Y; q' J! E
251.baseName_language.properties  
6 Q2 n( G! X; p3 N  z. a  [5 Q252.baseName.properties  / ^: a' }$ k. n5 H, c2 k2 Y  I1 N% J8 K
253.baseName是资源文件基本名可以自定义,language和country必须支持java的语言和国家  ' n  N4 _9 ]! ^+ @& S) s6 T
254.中国baseName_zh_CN.properties  4 C2 i$ J# L1 l& x3 j1 ^6 w
255.台湾baseName_zh_TW.properties  
# J4 L! j3 D. w, x: Q/ C  ~2 k256.美国baseName_en_US.properties  ( \, b5 G9 g, Y* V3 [  A, r
257.  # R1 N! }" u" [5 V0 o$ c! F
258.在properties中MyEclipse支持自动将中文转换为Unicode编码  ! [6 h$ A! @- F
259.利用jdk提供的native2ascii命令格式转:  , _3 ~1 e$ I5 V. r% W. g2 E! S
260.native2ascii 源文件.properties 目标文件.properties  
0 F: [5 R; w: K: h! Y% o, L261.  
. Q& m  q, C: ]262.通过在浏览器中改变语言就可以再语言间转换  * A* S* c( }: o# F, W1 L- `
263.一、全局:<constant name="struts.custom.i18n.resources" value="资源文件基本  
; c8 m# Z: U5 H( ^4 e4 N( X; H264.*在jsp页面是用<s:text name=""/>标签来输出国际化信息  name为资源文件中的key  
8 ?. K6 i8 A; n( D+ q265.*在action中可以继承ActionSupport 是用getTest()方法得到国际化信息名"/> 第一个参  ( j$ ^# z# P9 ]; w3 l
266.  
4 K6 a) D& I: t" a: [267.数为资源文件中key  - O# L* f9 Q+ Y( o& p
268.*在表单标签中,通过key属性指定资源文件中的key 如:<s:textfeild name="" key=""/>  
6 h, _3 ~! |& H6 N+ H' \" L1 s269.  
9 }: q) I/ d, M- J270.有占位符的表示:  . E; ^% z& i; a) P
271.welcome={0},欢迎光临!{1}  
! X# w  D* H2 Q7 j. y& W: K+ _! r272.*在jsp页面:  ! W: l1 q2 Z8 `/ n: T
273.<s:text name="welcome">  . a+ J1 R( t4 ]
274.    <param><s:property value="realname"/></s:param>  # a0 D3 |) m4 w. J* V: x
275.    <param>学习</param>  
! X4 U  `3 T( _! ]: `276.</s:text>  ; p9 H% W* P8 U4 h+ u3 a, u0 u
277.*在action类中:  
' o7 z* F% U8 k3 N278.getTest(String key,String[] args)或者是getText(String aTextName,List args)方法  6 ^9 `# V& I  Z3 l4 ~% _  o* m- X7 V
279.  
9 Z  Q! s. i7 Y+ H280.二、包范围  * g4 r  R7 x% i# R+ z
281.在包下放置package_language_country.properties资源文件  package为固定写法  
0 E* M0 X- Q+ t+ m& R282.该包及子包下的action毒可以访问该资源  系统会先找包资源文件  找不到则找系统资源  ) D2 S- m4 U" _. h: C4 Z; ]. V
283.  5 B* \2 i% C3 U# Z
284.中的key  ) o! c7 O6 {0 C, A, G. j
285.  
6 e7 u0 {6 m: y& s6 p; t8 V( \, ~$ A286.三:action范围  + z8 E! S  M9 U; y
287.在action所在路径放置ActionClassName_language_country.properties的资源文件  5 w0 X( Y  t& k  V
288.  
" x$ o& t* m6 E4 U289.无需任何配置直接从资源文件中获取配置:利用标签  
  d9 w- B/ o, X$ i2 a5 C290.<s:i18n name="资源文件名"> 全局  . f" P% j$ a6 u" L4 Z
291.   <s:text name="welcome">  # K" I6 O( d, O  R9 M
292.    <param>小张</param>  : ]8 }# Y. I, ^% H+ `$ F
293.   </s:text>  
& `* n  W1 g2 H" h3 R294.</s:i18n>  
+ s4 f* y% F4 r+ M% J& P0 d295.<s:i18n name="路径.package">从包中  
7 r) x8 Z  Q- o5 [296.   <s:text name="welcome">  
& g  j) {+ A: T# T  F% D: @5 q; H297.    <param>小张</param>  . p9 h  k" e3 t3 }, O& a5 v9 r9 N
298.   </s:text>  + R( s, }+ @6 a% E; u9 y, c6 n
299.</s:i18n>  
" P8 s. x3 v7 Q300.<s:i18n name="路径.ActionName">action  
' m' i- p1 y) G4 w- D301.   <s:text name="welcome">  ( H0 [8 P. ~/ `  j6 ]
302.    <param>小张</param>  4 x8 _7 X% Y" }$ V( k. |. `, `" p
303.   </s:text>  ) f2 V* y. [2 o/ U9 F, [' k2 O
304.</s:i18n>  
* f9 b4 M5 k3 }+ k305.  - l5 [# l, T5 t
306.16.OGNL表达式语言  
4 T- u! @8 ]0 t6 ~/ G307.类静态方法调用格式:  
3 [) `8 H, v" i2 p% K: G308.@类名(包括路径)@方法名  
: t0 Y. c% W/ N: x0 D; V4 t309.  $ Q. O, m/ \7 \6 I# w
310.OGNL Context(ActionContext)访问上下文中的对象:session、request、application、  
9 E8 e) u7 b* C( H6 t2 c311.  7 ~, j$ _5 ?; M! S! Q$ R! V% O, t
312.attr、parameters、OgnlValueStack  & B" m! V  f. @! x  m7 y8 z
313.访问对象格式:#session、#request  9 }1 t3 T' G0 S0 _! q+ L
314.访问对象属性格式:#session.userName或者#session['userName']  
! H) D# v! d$ J1 i  q315.其中OgnlValueStack root变量无需#,他访问对象属性时从栈顶开始找    h' W( L: d0 Y7 q3 h0 L2 J- J
316.需配合struts2才能使用,也可以用EL表达式(只能访问值栈中的属性)直接访问对象的属性  
- t% A$ z5 W+ |6 K317.  # H3 W0 Y2 m% I/ y! r# ^
318.17.常用标签使用  ) f. x2 A) x9 Q6 h
319.*构造list对象:  & r# x/ y" Q: T( @" a
320.<s:set var="list" value="{'1','2','3'}"/>  % S6 h1 d7 d2 t5 ?
321.  
' X' H2 @" [9 o( d322.*迭代list:此标签迭代时将当前对象放到栈顶  * R- N1 n9 O7 F/ ?5 j! z9 l
323.<s:iterator value="#list">  
2 ^9 `/ ]9 y( z4 y% L: D0 D5 g& _3 [324.    <s:property/>  : @# Z* d! h. \% @  @  X
325.</s:iterator>  
, t* x, \& X7 m9 X) i) D326.  
- }" T; Z2 @. U) {% X327.*构造map对象:  
7 d" q% X; m3 O* u328.<s:set var="maps" value="#{'key1':90,'key2':20}"/>  
4 n6 q7 k( M+ |329.*迭代map:  
9 F2 j+ s! D7 M2 |; k330.<s:iterator value="#maps" status="obj">  % a/ o! h, K3 t/ i  H
331.    <s:property value="key"/>=<s:property value="value"/>  : B  [1 s! D4 O5 Y3 F
332.</s:iterator>  7 ?; t$ z5 y1 A3 ?
333.obj包含方法:  
9 n/ ~1 }; G9 v334.int getCount();返回当前迭代了几个元素  # W( a3 A% v! f2 T% A6 I) m
335.int getIndex();返回当前迭代元素的索引  
4 j6 y3 ?+ X+ L+ _. C: C336.boolean isEven();返回当前使用元素索引是否为偶数  5 W. d( _3 ~4 ]
337.boolean isOdd();返回当前元素的索引是否为奇数  6 I- R# i/ x$ T2 l: e
338.boolean isFirst();  7 q! N8 i7 h2 X
339.boolean isLast();  8 b' o) Z+ `9 g" j* h: y0 D
340.  
+ Y2 I$ p5 X, S: v$ A341.*判断元素是否在集合中:  
7 n& h; M% ~  V* |/ r9 Y- ~342.<s:if test="foo" in/not in {"foo","tar"}>  + a" \1 p/ I6 ?0 Q# B; K
343.在  
: B* u/ c) l- L344.</s:if>  
& r6 @% t) N0 E2 I5 M" ~345.<s:else>  
& ^6 n, ~' r" M3 y4 z346.不在  ; W5 V2 s- p- H2 z  G
347.</s:else>  
0 L1 P  R5 C  v# p6 K& p348.  
" M. [' f9 A$ ~8 t5 j! k: `349.*投影  在大集合中过滤数据放到小集合  例:Book对象  8 R5 {3 h9 e2 V% k( G7 t
350.?表示获取符合逻辑的元素  - N1 K, C' A, l  @9 w1 B) _' g
351.^获取符合逻辑的第一个元素  
5 @7 r( |! r4 H& m  q% J* P2 X; I352.$获取符合逻辑的最后一个元素  ! n' W3 m& y: d1 m+ A
353..{}表示从大集合中筛选到小集合  
6 g+ s& D. v$ X! q3 {354.<s:iterator value="books.{?#this.price>35}">  
2 O; e) q' Y8 Z5 M& a: g. |355.    <s:property value="title"/>==<s:property value="price"/>  
' M+ Y: X/ Q2 K2 W  x4 s% A2 w7 y356.</s:iterator>  % @: t  B! A" ~7 u
357.  - k" ~( t4 w" j! p* M
358.*URL标签  
& F3 e6 t$ |7 @- Z% }* a359.<s:url action="" namespace="">  
6 K! r$ [* e6 j/ ?# ?" [# z4 {8 Q360.   <param name="" value=""/>  ; F2 _+ s3 s6 m
361.</s:url>  1 M3 v( ?6 L: q# i5 k$ Y
362.  
( {3 C% L( G3 B9 |6 p' E363.<s:set name="myurl" value="www.baidu.com"/>  5 `; E# D+ r, |
364.<s:url id="url" action="hello">  2 w+ }7 \) V1 ]. ]* E$ Y
365.      <s:param name="request_locale">en</s:param>  
2 @# W% P3 a- i& z366.</s:url><s:a href="%{url}">English</s:a>  
0 s8 Q" t  Z; K$ R367.如果href="#myurl"  他会把他当做字符处理  要这样:  : E5 @) ^' c5 ~; M, z$ v
368.<s:a href="%{#myurl}"/>  
/ ~( `! F% \4 n3 P369.  
6 [- i4 H. I' E3 n" N: K5 a370.*复选框   集合list和集合map  . C8 p& |/ y( I# V! D9 j
371.集合list  
; P% x+ [" P6 u372.<s:checkboxlist name="list" list="{'java','c#','c++'}" value="{'java','c#'}"/>  
; L& G4 Y; O, n# G, `) m373.value属性用于指定被选择的复选框  + L1 w& X0 d! {( Z" K$ _( w( s
374.  % E/ w% `* G5 v% Y, o
375.集合map  
' z: R; a2 `9 B5 {1 N6 h376.<s:checkboxlist name="map" list="#{1:'java',2:'c#'}" listKey="key"   
% T+ E3 @) r$ f: z* j0 @* w+ j377.  . |9 E. w+ s* h3 Q- ~' c
378.listValue="value" value="{1,2,3}"/>  
1 e; ?$ b  L7 ?" O, `$ K- V0 u379.  ! Q4 u0 Z( m4 C0 S7 |( p
380.*单选框  . {' k& D" v, [) c$ Y
381.集合JavaBean  * R2 m7 k# u, f/ l. z/ a
382.<s:radio name="beans" list="#request.persons" listKey="personid"   
8 g2 b' U; E0 ~2 v  t3 m5 W383.    L+ G& M$ O! O4 m! R2 F0 i  I
384.listValue="name"/>  7 R6 O/ {; x+ A' G
385.集合list  
9 }2 a0 R, `2 m- b- o386.<s:radio name="list" list="{'java','c#'}" value="java"/>  7 O3 [  g# X  _; B7 w: Y. q2 R
387.集合map  
9 c+ V! W5 i  Y, m, C388.<s:radio name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value"   " m+ y$ H9 W1 q6 W# A' d
389.  * v: a/ q. b( Y: m, P2 {
390.value="1"/>  9 z% ?1 F9 _& o8 N# x3 N; d
391.  
% |' M8 _1 u" X3 Z392.*下拉列表框  * l4 f. Z% z; I6 k1 }* ?# h! ?: C
393.<s:select name="list" list="{'java','c#'}" value="java"/>  # w9 J( l7 |  m4 S$ T$ b; a, i
394.<s:select name="beans" list="#request.persons" listKey="personid"   
$ H9 i$ I: \! m395.  % s6 i1 ^/ t" S9 k5 H7 j# i
396.listValue="name"/>  
' O( U+ m# ^+ x- S( ~397.<s:select name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value"   3 ?1 R; Z5 d3 ~6 M. M
398.  
: M& Y6 b7 j& l; G9 h( u4 r7 J1 c399.value="1"/>  
8 }+ T# S) h) {! j400.  
" [# L# G1 G& V" }8 a401.18:防止表单重复提交  / G: c2 P) m5 D  I
402.<s:form actio="" namespace="" method="post"?  ; z: K4 r  h; N0 I, A% S  T; H
403.    <s:textfield name="name"/>  % J$ U' X+ ^0 \( b6 a
404.    <s:soken/>  
& b1 x( q* y! H, M$ G8 N) q405.    <input type="submit" value="提交"/>  
6 b  {3 G% s3 T+ u406.</s:form>  0 v# O0 n3 W% h
407.引入拦截器  
  h7 u2 ~$ l0 g& U5 i408.<interceptor-ref name="defaultStack"/>  
3 i! ^- k# q5 I/ j4 H* D3 F6 s9 \409.<interceptor-ref name="token"/>  ! s, ?: `$ n, l9 h
410.<result name="invalid.token">index.jsp</result>///发现表单重估提
回复

使用道具 举报

快速回复
您需要登录后才可以回帖 登录 | 立即注册

   

关闭

站长推荐上一条 /1 下一条

发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
快速回复 返回顶部 返回列表