struts 重點總結

1.1.自從Struts2.13、以後之前的FilterDispatcher標註爲過時  
2.<filter-class>  
3.    org.apache.struts.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter  
4.</filter-class>  
5.  
6.2.action中默認的method爲execute()  
7.   默認class爲ActionSupport  
8.   默認name 爲success;  
9.  
10.3.轉發類型   傳中文參數URLEncoder.encode("","UTF-8");  
11.forward   
12.  
13.redirect 瀏覽器跳轉  
14.<result type="redirect">/index.jsp</param>  
15.  
16.redirectAction(跳轉到另一action)   
17.<result type="redirectAction">  
18.<param name="actionName">xxx</param>  
19.<param name="namespace">/xxx/xxx</param>  
20.</result>  
21.  
22.plainText(返回jsp頁面的源代碼)  中文問題  
23.<result type="plainText">  
24.<param name="location">index.jsp</param>  
25.<param name="charSet">UTF-8</param>  
26.</result>  
27.  
28.4.共用  
29.<global-results>  
30.   <result name="success">index.jsp</result>  
31.</global-results>  
32.  
33.5.給action中的參數賦值  
34.<action ---->  
35.    <param name="param_name">xxx</param>  
36.    <result>index.jsp</result>  
37.</action>  
38.  
39.6.常量標籤  
40.<指定截取的後綴  
41.<constant name="struts.action.extension" value="do,action"/>  
42.  
43.指定默認編碼集 作用於HttpServletRequest的setCharacterEncoding的方法  
44.<constant name="struts.i18n.encoding" value="UTF-8"/>  
45.  
46.設置瀏覽器是否緩存靜態頁面 默認值爲true  
47.<constant name="struts.serve.static.browserCache" value="true"/>  
48.  
49.當struts的配置文件被修改後,系統是否自動重新加載文件 默認值爲false  
50.<constant name="struts.configuration.xml.reload" value="true"/>  
51.  
52.打印詳細錯誤信息  開發階段可以打開  
53.<constant name="struts.devMode" value="true"/>  
54.  
55.與spring集成時,指定由spring負責的action對象創建  
56.<constant name="struts.objectFactory" value="spring"/>  
57.  
58.上傳文件大小限制  默認大小爲10701096  
59.<constant name="struts.multipartmaxSize" value="10701096"/>  
60.  
61.struts2加載常量的搜索順序  
62.struts-default.xml->struts-plugin.xml->struts.xml->struts.properties->web.xml  
63.如果在多個配置中定義了同一常量則後一文件中的常量將覆蓋前面的常量  
64.  
65.主題  
66.<constant name="struts.ui.theme" value="simple"/>  
67.7.指定調用方法  默認是執行execute  
68.動態方法調用:  
69.<constant name="struts.enable.DynamicMethodInvocation" value="true"/>  
70.在訪問路徑後加!methodname   如/example/list!add.action  
71.  
72.也可以用通配符來確認  
73.<action name="list_*_*" class="com.ss.action.{1}Action" method="{1}">  
74.    <result name="success">/{2}.jsp</result>  
75.</action>  
76.  
77.8.2.1.6版本 接受中文請求參數出現亂版  
78.新建一個過濾器filter放到struts2的filter之前,然後在doFilter()方法中添加代碼  
79.public void doFilter(){  
80.    HttpServletRequest req=(HttpServletRequest)request;  
81.    req.setCharacterEncoding("UTF-8");  
82.    filterchain.doFilter(request,response);  
83.}  
84.  
85.9.定義類型轉換器  
86.一、局部  
87.定義一個類並繼承DefaultTypeConverter從寫  
88.convertValue(Map<String,Object> context,Object value,Class toType){  
89.  SimpleDateFormat date=new SimpleDateFormat("yyyymmdd");  
90.try{  
91.   if(toType==Date.class){  
92.    String[] params=(String[])value;  
93.    return dateFormat.parse(params[0]);  
94.     }else if(toType==String.class){  
95.    Date date=(Date)value;  
96.    return dateFormat.format(date);  
97.     }  
98.   }catch(ParseException e){  
99.    return null;  
100.   }  
101.}  
102.註冊:在Action類包下放置<ActionClassName>-conversion.properties文件  
103.   屬性名=包名.定義的類  
104.二、全局  
105.在src下(WEB-INF/class/)下   xwork-conversion.properties  
106.java.util.Date=包名.類名  
107.  
108.10.向request、session、application中添加屬性  
109.ActionContext act=ActionContext.getCOntext();  
110.act.getApplication.put("app","應用範圍");  
111.act.getSession.put("ses","session應用範圍");  
112.act.put("req","request範圍")  
113.  
114.獲取原生的請求對象  
115.HttpServletRequest request=ServletActionContext.getRequest();  
116.ServletContext servlet=ServletActionContext.getServletContext();  
117.servletContext.getRealPath(“”);得到具體文件的絕對路徑  
118.request.getSession().setArrtibute("session","會話範圍");  
119.servletContext.setAttribut("app","應用範圍");  
120.request.setAttribute("req","request範圍");  
121.頁面訪問  
122.${applicationScope.app}  
123.${sessionScope.ses}  
124.${requestScope.req}  
125.  
126.11.struts2上傳文件  
127.第一步:放jar包 commond-fileupload-1.21.art和commons-io-1.3.2.jar  
128.第二步:把form表單的enctype設置爲:multipart/form-data  如  
129.<form enctype="multipart/form-data"   
130.  
131.action="${pageContext.request.contextPath/list.action}" method="">  
132.  <input type="file" name="uploadImage">  
133.  <input type="submit" value="upload"/>  
134.</form>  
135.第三步:在action中添加以下屬性  命名規則  與file的name相同  
136.private File uploadImage;//得到上傳文件  
137.private String uploadImageContentType;//得到上傳文件的類型  
138.private String uploadImageFileName;//得到上傳文件的名稱  
139.  
140.String realPath=ServletActionContext.getServletContext().getRealPath  
141.  
142.("/images");  
143.File saveFile=new File(new File(realPath),uploadImageFileName);  
144.if(!savefile.getParentFile().exists())   
145.  saveFile.getParentFile().mkdirs();  
146.FileUtils.copyFile(uploadImage,saveFile);  
147.  
148.12.多文件上傳  
149.  
150.將屬性類型定義成數組活list類型  
151.private File[] uploadImage;  
152.private String[] uploadImageContentType;  
153.private String[] uploadImageFileName;  
154.  
155.String realPath=ServletActionContext.getServletContext().getRealPath  
156.  
157.("/images");  
158.if(uploadImage!=null){  
159.File savedir=new File(new File(realPath));  
160.if(!savedir.exists())   
161.  savedir.mkdirs();  
162.for(int index=0;index<uploadImage.length,index++){  
163.      File saveFile=new File(savedir,uploadImageFileName[index]);  
164.    if(!saveFile.getParentFile().exists())   
165.           saveFile.getParentFile().mkdirs();  
166.    FileUtils.copyFile(uploadImage[index],saveFile);  
167.}  
168.  
169.}  
170.13.自定義攔截器  
171.一:類實現Interceptor接口   
172.在intercept方法中進行操作,invocation.invoke();繼續執行該方法  
173.二:註冊攔截器  
174.在sturts配置中定義:  
175.<interceptors>  
176.      <interceptor name="自定義攔截器名" class="類"/>  
177.   <interceptor-stack name="棧名">  
178.       <interceptor-ref name="defaultStack"/>引用原來的攔截器  
179.       <interceptor-ref name="自定義攔截器名"/>  
180.   </interceptor-stack>  
181.</interceptors>  
182.<action name="xxx" class="xxxx">  
183.    <interceptor-ref name="棧名">  
184.</action>  
185.  
186.定義一個包下的所有action都使用此攔截器  
187.<default-interceptor-ref name="棧名"/>  
188.  
189.14.struts2的校驗  
190.第一:手工代碼校驗  
191.一:所有方法校驗  
192.    1、類繼承ActionSupport 再從寫validate方法  
193.    2、在validate中寫入自己的驗證需要  
194.    3、此方法this.addFieldError("username","用戶名不能爲空!");用於放置錯誤信息  
195.  
196.,正則表達式的驗證:  
197.Pattern.compile(regex).matcher(this.mobile).matches();regex以^開始以$結尾    
198.  
199.fieldError包含錯誤信息則返回input   <s:fielderror/>顯示錯誤信息  
200.二:指定方法校驗  
201.    1、繼承ActionSupport,再寫方法validateXxx() 其他同上一樣  
202.  
203.第二:xml配置進行校驗  
204.一、所有方法  
205.1.繼承ActionSupport類,校驗文件與action同包  命名ActionClassName-validation.xml  
206.  
207.;  
208.文件內容:   
209.<?xml version="1.0" encoding="UTF-8"?>  
210.<!DOCTYPE validators PUBLIC"-//OpenSymphony Group//XWork Validator 1.03//EN"   
211.  
212."http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">  
213.<validators>  
214. <field name="username">  
215.   <field-validator type="requiredstring">  
216.    <param name="trim">true</param>  
217.    <message>用戶名不能爲空!</message>  
218.   </field-validator>  
219.   <field-validator type="tringlength">  
220.    <param name="minLength">4</param>  
221.    <param name="minLength">10</param>  
222.    <message><![CDATA[用戶名應在4到10之間]]</message>  
223.   </field-validator>  
224.  </field>  
225.  <field name="mobile">  
226.     <field-validator type="requiredstring">  
227.    <message>手機號不能爲空!</message>  
228.     </field-validator>  
229.     <field-validator type="regex">  
230.    <param name="expression"><![CDATA[^1[358]\d{9}$]]/>  
231.    <message>手機號格式不正確</message>  
232.     </field-validator>  
233.   </field>  
234.   <field name="age">  
235.   <field-validator type="int">  
236.    <param name="min">1</param>  
237.    <param name="max">150</param>  
238.    <message>年齡範圍不對!</message>  
239.   </field-validator>  
240.  </field>  
241.</validators>  
242.  
243.校驗器的路徑:com.opensymphony.xwork2.validators下的default.xml中  
244.二、指定方法  
245.文件命名:類名-配置中actiono的name-validation.xml  
246.  
247.15.國際化  
248.全局範圍、包範圍、action範圍  
249.命名格式:  
250.baseName_language_country.properties  
251.baseName_language.properties  
252.baseName.properties  
253.baseName是資源文件基本名可以自定義,language和country必須支持java的語言和國家  
254.中國baseName_zh_CN.properties  
255.臺灣baseName_zh_TW.properties  
256.美國baseName_en_US.properties  
257.  
258.在properties中MyEclipse支持自動將中文轉換爲Unicode編碼  
259.利用jdk提供的native2ascii命令格式轉:  
260.native2ascii 源文件.properties 目標文件.properties  
261.  
262.通過在瀏覽器中改變語言就可以再語言間轉換  
263.一、全局:<constant name="struts.custom.i18n.resources" value="資源文件基本  
264.*在jsp頁面是用<s:text name=""/>標籤來輸出國際化信息  name爲資源文件中的key  
265.*在action中可以繼承ActionSupport 是用getTest()方法得到國際化信息名"/> 第一個參  
266.  
267.數爲資源文件中key  
268.*在表單標籤中,通過key屬性指定資源文件中的key 如:<s:textfeild name="" key=""/>  
269.  
270.有佔位符的表示:  
271.welcome={0},歡迎光臨!{1}  
272.*在jsp頁面:  
273.<s:text name="welcome">  
274.    <param><s:property value="realname"/></s:param>  
275.    <param>學習</param>  
276.</s:text>  
277.*在action類中:  
278.getTest(String key,String[] args)或者是getText(String aTextName,List args)方法  
279.  
280.二、包範圍  
281.在包下放置package_language_country.properties資源文件  package爲固定寫法  
282.該包及子包下的action毒可以訪問該資源  系統會先找包資源文件  找不到則找系統資源  
283.  
284.中的key  
285.  
286.三:action範圍  
287.在action所在路徑放置ActionClassName_language_country.properties的資源文件  
288.  
289.無需任何配置直接從資源文件中獲取配置:利用標籤  
290.<s:i18n name="資源文件名"> 全局  
291.   <s:text name="welcome">  
292.    <param>小張</param>  
293.   </s:text>  
294.</s:i18n>  
295.<s:i18n name="路徑.package">從包中  
296.   <s:text name="welcome">  
297.    <param>小張</param>  
298.   </s:text>  
299.</s:i18n>  
300.<s:i18n name="路徑.ActionName">action  
301.   <s:text name="welcome">  
302.    <param>小張</param>  
303.   </s:text>  
304.</s:i18n>  
305.  
306.16.OGNL表達式語言  
307.類靜態方法調用格式:  
308.@類名(包括路徑)@方法名  
309.  
310.OGNL Context(ActionContext)訪問上下文中的對象:session、request、application、  
311.  
312.attr、parameters、OgnlValueStack  
313.訪問對象格式:#session、#request  
314.訪問對象屬性格式:#session.userName或者#session['userName']  
315.其中OgnlValueStack root變量無需#,他訪問對象屬性時從棧頂開始找  
316.需配合struts2才能使用,也可以用EL表達式(只能訪問值棧中的屬性)直接訪問對象的屬性  
317.  
318.17.常用標籤使用  
319.*構造list對象:  
320.<s:set var="list" value="{'1','2','3'}"/>  
321.  
322.*迭代list:此標籤迭代時將當前對象放到棧頂  
323.<s:iterator value="#list">  
324.    <s:property/>  
325.</s:iterator>  
326.  
327.*構造map對象:  
328.<s:set var="maps" value="#{'key1':90,'key2':20}"/>  
329.*迭代map:  
330.<s:iterator value="#maps" status="obj">  
331.    <s:property value="key"/>=<s:property value="value"/>  
332.</s:iterator>  
333.obj包含方法:  
334.int getCount();返回當前迭代了幾個元素  
335.int getIndex();返回當前迭代元素的索引  
336.boolean isEven();返回當前使用元素索引是否爲偶數  
337.boolean isOdd();返回當前元素的索引是否爲奇數  
338.boolean isFirst();  
339.boolean isLast();  
340.  
341.*判斷元素是否在集合中:  
342.<s:if test="foo" in/not in {"foo","tar"}>  
343.在  
344.</s:if>  
345.<s:else>  
346.不在  
347.</s:else>  
348.  
349.*投影  在大集合中過濾數據放到小集合  例:Book對象  
350.?表示獲取符合邏輯的元素  
351.^獲取符合邏輯的第一個元素  
352.$獲取符合邏輯的最後一個元素  
353..{}表示從大集合中篩選到小集合  
354.<s:iterator value="books.{?#this.price>35}">  
355.    <s:property value="title"/>==<s:property value="price"/>  
356.</s:iterator>  
357.  
358.*URL標籤  
359.<s:url action="" namespace="">  
360.   <param name="" value=""/>  
361.</s:url>  
362.  
363.<s:set name="myurl" value="www.baidu.com"/>  
364.<s:url id="url" action="hello">  
365.      <s:param name="request_locale">en</s:param>  
366.</s:url><s:a href="%{url}">English</s:a>  
367.如果href="#myurl"  他會把他當做字符處理  要這樣:  
368.<s:a href="%{#myurl}"/>  
369.  
370.*複選框   集合list和集合map  
371.集合list  
372.<s:checkboxlist name="list" list="{'java','c#','c++'}" value="{'java','c#'}"/>  
373.value屬性用於指定被選擇的複選框  
374.  
375.集合map  
376.<s:checkboxlist name="map" list="#{1:'java',2:'c#'}" listKey="key"   
377.  
378.listValue="value" value="{1,2,3}"/>  
379.  
380.*單選框  
381.集合JavaBean  
382.<s:radio name="beans" list="#request.persons" listKey="personid"   
383.  
384.listValue="name"/>  
385.集合list  
386.<s:radio name="list" list="{'java','c#'}" value="java"/>  
387.集合map  
388.<s:radio name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value"   
389.  
390.value="1"/>  
391.  
392.*下拉列表框  
393.<s:select name="list" list="{'java','c#'}" value="java"/>  
394.<s:select name="beans" list="#request.persons" listKey="personid"   
395.  
396.listValue="name"/>  
397.<s:select name="map" list="#{1:'java',2:'c#'}" listKey="key" listValue="value"   
398.  
399.value="1"/>  
400.  
401.18:防止表單重複提交  
402.<s:form actio="" namespace="" method="post"?  
403.    <s:textfield name="name"/>  
404.    <s:soken/>  
405.    <input type="submit" value="提交"/>  
406.</s:form>  
407.引入攔截器  
408.<interceptor-ref name="defaultStack"/>  
409.<interceptor-ref name="token"/>  
410.<result name="invalid.token">index.jsp</result>///發現表單重估提交時返回視圖  
詳細參照:http://yangzhibin-java.iteye.com/blog/440811 
http://blog.csdn.net/yaosan109901/archive/2009/08/25/4481375.aspx


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章