Struts 2 中不想要要在在處理和HTTP相關的操作,自需要使用框架的接口即可。
在Strut 2 中不再會涉及到諸如 HttpServletRequest, HttpServletResponse, HttpSession等Http相關的Servlet接口類,取而代之的是Struts 2 的接口,例如RequestAware,SessionAware等。
Struts 2 的標簽基于 CSS,標簽可以提供自己需要的HTML支持。
Struts 2 的標簽利用了CSS和模板,使用起來會非常方便,在Struts 1.x中我們需要使用Table來組織表單,但是在Struts 2中所有的標簽自帶了Table內容,可以方便的處理格式。例如<s:textfield> 標簽自動添加了 <tr> <td> 等標簽。
有狀態(tài)的Checkbox,可以以一種統(tǒng)一的方式記錄checkbox狀態(tài)的變化。
在Struts 2中即使沒有被選中的checkbox其內容仍然存在于Struts 2 框架中,不必像在Struts 1.x中那樣需要做特殊的存在性判斷。
靈活的取消按鈕,在取消按鈕點擊的時候可以指向一個不同的action。
@TODO
可以在制定Form的action的同時,制定cancel按鈕的action,當點擊submit和cancel的時候出現完全按不同的功能。
第一等級的AJAX的支持,在普通struts 標簽的基礎上,使用AJAX增加了交互性和靈活性。
Struts 2 的標簽內置了Ajax的支持。Struts 2 的標簽使用了Dojotoolkit Ajax框架,不但能夠使用Ajax特性,而且能夠使用非常豐富和強大的瀏覽器小控件,例如日期選擇控件
見到那集成Spring框架,非常簡單的使用Spring框架提供的依賴注入功能。
可以方便的使用Spring管理Struts 2 的action的創(chuàng)建,通過使用Spring可以充分的利用Spring的依賴諸如功能,并且能夠很好的集成其他的框架,例如Hibernate,iBatis等。
更多的返回形式,除了JSP還支持,JasperReports,JFreeChart, Action鏈,文件下載等。
除了支持JSP的表現形式,還支持JasperResports報表, JFreechart圖標,Action鏈,文件下載等。
POJO表單,不再需要ActionForms,使用Javabean獲得客戶的收入或者將屬性表示出來,
完全消除了ActionForm組建,可以使用任意合適的類型來接受頁面?zhèn)鱽淼臄祿蛘邔祿憩F出來。ActionFrom可以使用POJO的 JavaBean來替代,JavaBean中的屬性可以使用String,也可以使用具體的類型,例如Date,Int等。
POJO Action,使用任意的類作為Action類,甚至可以使用接口。
任何類都可以作為Action類,只要接口滿足一些簡單的定義,不需要在使用Action類似的基類,你可以完全自由的發(fā)揮。
部署
插件結構,使用jar文件擴展框架功能,不需要在做手動的配置,內置了JavaServer Faces, JasperResports, JFreeChart, Tiles等插件。
擴展一個功能只需要添加一個插件,插件甚至可以熱插拔,在你的應用不停止的情況下追加新的功能。
集成了分析功能,可以方便的找到程序性能的問題點。
可以不借助外力發(fā)現程序的熱點,找到問題的所在,
準確的報告錯誤,可以非常準確的指出程序的問題點。
準確的報告運行時的錯誤,方便解決問題。
維護
Action容易測試,直接測試Struts 2的Action,不需要使用Mock Http對象來測試。
Action是普通的類,不需要特殊的環(huán)境,所以Struts 2 的Action 特別容易測試。
聰明的默認值,不需要配置不必要的配置,大部分的框架配置元素的都有非常合適的默認值,基本上你不需要在做任何配置。
Struts 2 有很多的配置項,但是每一個都有默認值,基本額上不需要更改默認的選項即可保證最佳
容易定制的控制器,可以定制每一個Action的處理過程。
可以使用Intercepter來過濾每一個Action,在Action執(zhí)行前后追加自定義的操作。
集成了Debugging,可以使用內容之的debugging工具找到問題。
靈活的標簽庫,可以通過修改FreeMarker模板來定制標簽的輸出,不需要在操作像天書異樣的JSP Taglib API,模板語言支持,Freemarker和Velocity
可以自定義模板庫,或者修改已有模板的內容來定制頁面的顯示。
Struts 2 中使用的模式
Command
Chain of responsibility
Struts2 處理流程概要
上圖來源于Struts2官方站點,是Struts 2 的整體結構。
一個請求在Struts2框架中的處理大概分為以下幾個步驟
1 客戶端初始化一個指向Servlet容器(例如Tomcat)的請求
2 這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對于Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin)
3 接著FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否需要調用某個Action
4 如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy
5 ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類
6 ActionProxy創(chuàng)建一個ActionInvocation的實例。
7 ActionInvocation實例使用命名模式來調用,在調用Action的過程前后,涉及到相關攔截器(Intercepter)的調用。
8 一旦Action執(zhí)行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標簽。在這個過程中需要涉及到ActionMapper
在上述過程中所有的對象(Action,Results,Interceptors,等)都是通過ObjectFactory來創(chuàng)建的。
MyEclipse 快捷鍵
(1)Ctrl+M切換窗口的大小
(2)Ctrl+Q跳到最后一次的編輯處
(3)F2當鼠標放在一個標記處出現Tooltip時候按F2則把鼠標移開時Tooltip還會顯示即Show Tooltip Description。
F3跳到聲明或定義的地方。
F5單步調試進入函數內部。
F6單步調試不進入函數內部,如果裝了金山詞霸2006則要把“取詞開關”的快捷鍵改成其他的。
F7由函數內部返回到調用處。
F8一直執(zhí)行到下一個斷點。
(4)Ctrl+Pg~對于XML文件是切換代碼和圖示窗口
(5)Ctrl+Alt+I看Java文件中變量的相關信息
(6)Ctrl+PgUp對于代碼窗口是打開“Show List”下拉框,在此下拉框里顯示有最近曾打開的文件
(7)Ctrl+/ 在代碼窗口中是這種//~注釋。
Ctrl+Shift+/ 在代碼窗口中是這種/*~*/注釋,在JSP文件窗口中是<!--~-->。
(8)Alt+Shift+O(或點擊工具欄中的Toggle Mark Occurrences按鈕) 當點擊某個標記時可使本頁面中其他地方的此標記黃色凸顯,并且窗口的右邊框會出現白色的方塊,點擊此方塊會跳到此標記處。
(9)右擊窗口的左邊框即加斷點的地方選Show Line Numbers可以加行號。
(10)Ctrl+I格式化激活的元素Format Active Elements。
Ctrl+Shift+F格式化文件Format Document。
(11)Ctrl+S保存當前文件。
Ctrl+Shift+S保存所有未保存的文件。
(12)Ctrl+Shift+M(先把光標放在需導入包的類名上) 作用是加Import語句。
Ctrl+Shift+O作用是缺少的Import語句被加入,多余的Import語句被刪除。
(13)Ctrl+Space提示鍵入內容即Content Assist,此時要將輸入法中Chinese(Simplified)IME-Ime/Nonlme Toggle的快捷鍵(用于切換英文和其他文字)改成其他的。
Ctrl+Shift+Space提示信息即Context Information。
(14)雙擊窗口的左邊框可以加斷點。
(15)Ctrl+D刪除當前行。
---待續(xù)
[以下為轉載]
Eclipse快捷鍵大全
Ctrl+1 快速修復(最經典的快捷鍵,就不用多說了)
Ctrl+D: 刪除當前行
Ctrl+Alt+↓ 復制當前行到下一行(復制增加)
Ctrl+Alt+↑ 復制當前行到上一行(復制增加)
Alt+↓ 當前行和下面一行交互位置(特別實用,可以省去先剪切,再粘貼了)
Alt+↑ 當前行和上面一行交互位置(同上)
Alt+← 前一個編輯的頁面
Alt+→ 下一個編輯的頁面(當然是針對上面那條來說了)
Alt+Enter 顯示當前選擇資源(工程,or 文件 or文件)的屬性
Shift+Enter 在當前行的下一行插入空行(這時鼠標可以在當前行的任一位置,不一定是最后)
Shift+Ctrl+Enter 在當前行插入空行(原理同上條)
Ctrl+Q 定位到最后編輯的地方
Ctrl+L 定位在某行 (對于程序超過100的人就有福音了)
Ctrl+M 最大化當前的Edit或View (再按則反之)
Ctrl+/ 注釋當前行,再按則取消注釋
Ctrl+O 快速顯示 OutLine
Ctrl+T 快速顯示當前類的繼承結構
Ctrl+W 關閉當前Editer
Ctrl+K 參照選中的Word快速定位到下一個
Ctrl+E 快速顯示當前Editer的下拉列表(如果當前頁面沒有顯示的用黑體表示)
Ctrl+/(小鍵盤) 折疊當前類中的所有代碼
Ctrl+×(小鍵盤) 展開當前類中的所有代碼
Ctrl+Space 代碼助手完成一些代碼的插入(但一般和輸入法有沖突,可以修改輸入法的熱鍵,也可以暫用Alt+/來代替)
Ctrl+Shift+E 顯示管理當前打開的所有的View的管理器(可以選擇關閉,激活等操作)
Ctrl+J 正向增量查找(按下Ctrl+J后,你所輸入的每個字母編輯器都提供快速匹配定位到某個單詞,如果沒有,則在stutes line中顯示沒有找到了,查一個單詞時,特別實用,這個功能Idea兩年前就有了)
Ctrl+Shift+J 反向增量查找(和上條相同,只不過是從后往前查)
Ctrl+Shift+F4 關閉所有打開的Editer
Ctrl+Shift+X 把當前選中的文本全部變味小寫
Ctrl+Shift+Y 把當前選中的文本全部變?yōu)樾?/p>
Ctrl+Shift+F 格式化當前代碼
Ctrl+Shift+P 定位到對于的匹配符(譬如{}) (從前面定位后面時,光標要在匹配符里面,后面到前面,則反之)
下面的快捷鍵是重構里面常用的,本人就自己喜歡且常用的整理一下(注:一般重構的快捷鍵都是Alt+Shift開頭的了)
Alt+Shift+R 重命名 (是我自己最愛用的一個了,尤其是變量和類的Rename,比手工方法能節(jié)省很多勞動力)
Alt+Shift+M 抽取方法 (這是重構里面最常用的方法之一了,尤其是對一大堆泥團代碼有用)
Alt+Shift+C 修改函數結構(比較實用,有N個函數調用了這個方法,修改一次搞定)
Alt+Shift+L 抽取本地變量( 可以直接把一些魔法數字和字符串抽取成一個變量,尤其是多處調用的時候)
Alt+Shift+F 把Class中的local變量變?yōu)閒ield變量 (比較實用的功能)
Alt+Shift+I 合并變量(可能這樣說有點不妥Inline)
Alt+Shift+V 移動函數和變量(不怎么常用)
Alt+Shift+Z 重構的后悔藥(Undo)
1.250定律
拉德認為:每一位顧客身后,大體有250名親朋好友。如果您贏得了一位顧客的好感,就意味著贏得了250個人的好感;反之,如果你得罪了一名顧客,也就意味著得罪了250 名顧客。 在你的網站訪客中,一個訪客可能可以帶來一群訪客,任何網站都有起步和發(fā)展的過程,這個過程中此定律尤其重要。
2.達維多定律
達維多認為,一個企業(yè)要想在市場上總是占據主導地位,那么就要做到第一個開發(fā)出新產品,又第一個淘汰自己的老產品。 國內網站跟風太嚴重,比如前段時間的格子網,乞討網,博客網,一個成功了,大家一擁而上。但實際效果是,第一個出名的往往最成功,所以在網站的定位上,要動自己的腦筋,不是去撿人家剩下的客戶。同理,買人家出售的數據來建站效果是很糟糕的。
3.木桶定律
水桶定律是指,一只水桶能裝多少水,完全取決于它最短的那塊木板。這就是說任何一個組織都可能面臨的一個共同問題,即構成組織的各個部分往往決定了整個組織的水平。 注意審視自己的網站,是速度最糟糕?美工最糟糕?宣傳最糟糕?你首先要做的,不是改進你最強的,而應該是你最薄弱的。
4.馬太效應
《新約》中有這樣一個故事,一個國王遠行前,交給三個仆人每人一錠銀子,吩咐他們:“你們去做生意,等我回來時,再來見我。”國王回來時,第一個仆人說: “主人,你交給我們的一錠銀子,我已賺了10錠。”于是國王獎勵他10座城邑。第二個仆人報告說:“主人,你給我的一錠銀子,我已賺了5錠。”于是國王例獎勵了他5座城邑。第三個仆人報告說:“主人,你給我的一錠銀子,我一直包在手巾里存著,我怕丟失,一直沒有拿出來。”于是國王命令將第三個仆人的一錠銀子也賞給第一個仆人,并且說:“凡是少的,就連他所有的也要奪過來。凡是多的,還要給他,叫他多多益善。”這就是馬太效應。 在同類網站中,馬太效應是很明顯的。一個出名的社區(qū),比一個新建的社區(qū),更容易吸引到新客戶。啟示是,如果你無法把網站做大,那么你要做專。作專之后再做大就更容易。
5.手表定理
手表定理是指一個人有一只表時,可以知道現在是幾點鐘,而當他同時擁有兩只表時卻無法確定。
一個網站,你只需要關注你特定的用戶群需求。不要在意不相干人的看法。
6.不值得定律
不值得定律:不值得做的事情,就不值得做好 不要過度seo,如果你不是想只做垃圾站。不要把時間浪費在美化再美化頁面,優(yōu)化再優(yōu)化程序,在你網站能盈利后,這些事情可以交給技術人員完成。
7.彼得原理
勞倫斯.彼得認為:在各種組織中,由于習慣于對在某個等級上稱職的人員進行晉升提拔,因而雇員總是趨向于晉升到其不稱職的地位。
不要輕易改變自己網站的定位。如博客網想變門戶,盛大想做娛樂,大家拭目以待吧。
8.零和游戲原理
當你看到兩位對弈者時,你就可以說他們正在玩“零和游戲”。因為在大多數情況下, 總會有一個贏,一個輸,如果我們把獲勝計算為得1分,而輸棋為-1分,那么,這兩人得分之和就是:1+(-1)=0 不要把目光一直盯在你的競爭網站上,不要花太多時間搶它的訪客。我們把這些時間用來尋找互補的合作網站,挖掘新訪客。
9.華盛頓合作規(guī)律
華盛頓合作規(guī)律說的是: 一個人敷衍了事,兩個人互相推諉, 三個人則永無成事之日。
如果你看準一個方向,你自己干,缺人手就招。不要輕易找同伴一起搞網站,否則你會發(fā)現,日子似乎越過越快了,事情越做越慢了。
10.邦尼人力定律
一個人一分鐘可以挖一個洞,六十個人一秒種卻挖不了一個洞。合作是一個問題,如何合作也是一個問題。你需要有計劃。
11.牛蛙效應
把一只牛蛙放在開水鍋里,牛蛙會很快跳出來;但當你把它放在冷水里,它不會跳出來,然后慢慢加熱,起初牛蛙出于懶惰,不會有什么動作,當水溫高到它無法忍受的時候,想出來,但已經沒有了力氣。 如果你是soho,注意關注你的財務。不要等到沒錢了再想怎么掙,你會發(fā)現那時候掙錢更難。
12.蘑菇管理
蘑菇管理是許多組織對待初出茅廬者的一種管理方法,初學者被置于陰暗的角落(不受重視的部門,或打雜跑腿的工作),澆上一頭大糞(無端的批評、指責、代人受過),任其自生自滅(得不到必要的指導和提攜)。
做網站畢竟要遭遇這樣的階段,搜索引擎不理你,友情鏈接找不到,訪客不上門。這是磨練。
13.奧卡姆剃刀定律
如無必要,勿增實體。
把網站做得簡單,再簡單,簡單到非常實用,而不是花俏。google的首頁為什么比雅虎好?
14.巴萊多定律(Paredo 也叫二八定律)
你所完成的工作里80%的成果,來自于你20%的付出;而80%的付出,只換來20%的成果。
隨時衡量你所做的工作,哪些是最有效果的。
1.馬蠅效應
林肯少年時和他的兄弟在肯塔基老家的一個農場里犁玉米地,林肯吆馬,他兄弟扶犁,而那匹馬很懶,慢慢騰騰,走走停停。可是有一段時間馬走得飛快。林肯感到奇怪,到了地頭,他發(fā)現有一只很大的馬蠅叮在馬身上,他就把馬蠅打落了。看到馬蠅被打落了,他兄弟就抱怨說:”哎呀,你為什么要打掉它,正是那家伙使馬跑起來的嘛!” 在你心滿意足的時候,去尋找你的馬蠅。沒有firefox,不會有ie7,firefox就是微軟的馬蠅之一。馬蠅不可怕,怕的是會一口吃掉你的東西,像ie當初對網景干的那樣。
2.最高氣溫效應
每天最熱總是下午2 時左右,我們總認為這個時候太陽最厲害,其實這時的太陽早已偏西,不再是供給最大熱量的時候了。此時氣溫之所以最高,不過是源于此前的熱量積累。
你今天的網站流量,是你一個星期或更長時間前所做的事帶來的。
3.超限效應(溢出效應)
刺激過多、過強和作用時間過久而引起心理極不耐煩或反抗的心理現象,稱之為“超限效應”。 別到別人論壇里發(fā)太多廣告。別在自己網站上放太多廣告。別在自己的論壇里太多地太明顯地誘導話題。
4.懶螞蟻效應
生物學家研究發(fā)現,成群的螞蟻中,大部分螞蟻很勤勞,尋找、搬運食物爭先恐后,少數螞蟻卻東張西望不干活。當食物來源斷絕或蟻窩被破壞時,那些勤快的螞蟻一籌莫展。“懶螞蟻”則“挺身而出”,帶領眾伙伴向它早已偵察到的新的食物源轉移。 不要把注意力僅僅放在一個網站上,即使這個網站現在為你帶來一切。你要給自己一些時間尋找新的可行的方向,以備萬一。
5.長尾理論
ChrisAnderson認為,只要存儲和流通的渠道足夠大,需求不旺或銷量不佳的產品共同占據的市場份額就可以和那些數量不多的熱賣品所占據的市場份額相匹敵甚至更大。 對于搜索引擎,未必你需要一個熱門詞排在第一位,如果有一千個冷門詞排在第一位,效果不但一樣,還會更穩(wěn)定更長遠。
6.破窗理論
棟建筑上的一塊玻璃,又沒有及時修好,別人就可能受到某些暗示性的縱容,去打碎更多的玻璃。 管理論壇時,如果你發(fā)現第一個垃圾貼,趕緊刪掉他吧。想想:落伍現在為什么那么多××貼?現在控制比最初控制難多了。
7.“羊群效應”,又稱復制原則(Copy Strategy)
一個羊群(集體)是一個很散亂的組織,平時大家在一起盲目地左沖右撞。如果一頭羊發(fā)現了一片肥沃的綠草地,并在那里吃到了新鮮的青草,后來的羊群就會一哄而上,爭搶那里的青草,全然不顧旁邊虎視眈眈的狼,或者看不到其它地方還有更好的青草。
不要輕易跟風,保持自己思考的能力。
8.墨菲定律
如果壞事情有可能發(fā)生,不管這種可能性多么小,它總會發(fā)生,并引起最大可能的損失。
除非垃圾站,否則不要作弊,對搜索引擎不要,對廣告也不要。
9.光環(huán)效應
人們對人的某種品質或特點有清晰的知覺,印象比較深刻、突出, 這種強烈的知覺, 就像月暈形式的光環(huán)一樣,向周圍彌漫、擴散,掩蓋了對這個人的其他品質或特點的認識。
不要輕易崇拜一個人或者公司、一個概念、一種做法。
10.蝴蝶效應
一只亞馬遜河流域熱帶雨林中的蝴蝶,偶爾扇動幾下翅膀,兩周后,可能在美國德克薩斯州引起一場龍卷風。
不管你做什么,網站或者其他,你都應該關注新聞。機遇或者災難可能就在那。
11.阿爾巴德定理
一個企業(yè)經營成功與否,全靠對顧客的要求了解到什么程度。 我贊同別人的點評:看到了別人的需要,你就成功了一半;滿足了別人的需求,你就成功了全部。尤其是做網站。
12.史密斯原則
如果你不能戰(zhàn)勝他們,你就加入到他們之中去。
不要試圖做孤膽英雄。如果潮流擋不住,至少,你要去思考為什么。
1.Hashtable是Dictionary的子類,HashMap是Map接口的一個實現類;
2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情況下是非同步的。即是說,在多線程應用程序中,不用專門的操作就安全地可以使用Hashtable了;而對于HashMap,則需要額外的同步機制。但HashMap的同步問題可通過Collections的一個靜態(tài)方法得到解決:
Map Collections.synchronizedMap(Map m)
這個方法返回一個同步的Map,這個Map封裝了底層的HashMap的所有方法,使得底層的HashMap即使是在多線程的環(huán)境中也是安全的。
3.在HashMap中,null可以作為鍵,這樣的鍵只有一個;可以有一個或多個鍵所對應的值為null。當get()方法返回null值時,即可以表示HashMap中沒有該鍵,也可以表示該鍵所對應的值為null。因此,在HashMap中不能由get()方法來判斷HashMap中是否存在某個鍵,而應該用containsKey()方法來判斷。
4.HashTable使用Enumeration,HashMap使用Iterator。
以上只是表面的不同,它們的實現也有很大的不同。
5.HashTable中hash數組默認大小是11,增加的方式是 old*2+1。HashMap中hash數組的默認大小是16,而且一定是2的指數。
6.哈希值的使用不同,HashTable直接使用對象的hashCode,代碼是這樣的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新計算hash值,而且用與代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);
static int hash(Object x) {
int h = x.hashCode();
h += ~(h << 9);
h ^= (h >>> 14);
h += (h << 4);
h ^= (h >>> 10);
return h;
}
static int indexFor(int h, int length) {
return h & (length-1);
}