歡迎來到 Tapestry 的世界!html
這篇教程幫助人們來建立基於 Tapestry 的 web 應用程序。你是否有過使用 Tapestry 早期版本或者其它 web 框架的經歷,這一點並不重要。事實上,從某些立場來看,對於通常的 web 開發瞭解的越少,你就能學得更好……由於那樣你要忘掉的就不太多啦!git
你確實對 HTML 有着較好的理解,對 XML 也只知其一;不知其二,對於基礎的 Java 語言特性,包括註解(Annotation)也有一個較好的瞭解。github
若是你曾經用 servlet 和 JSP,或者利用 Struts 來開發過 web 應用程序,那你應該已經很容易感到有許多的麻煩。如此多的麻煩,你甚至可能沒有理解你所在的可怕處境!這裏都是些沒有安全網絡的環境;Struts 和 Servlet API 並不能告訴你應用程序怎麼構建法,或者如何把不一樣的塊組合到一塊兒。任何URL均可以是一個action,而任何action均可以被指向任何視圖,(使用一個JSP)來向網頁瀏覽器提供一個HTML的響應。麻煩就是你做爲一個開發者須要做出的許多細小瑣碎,但是又很重要的決定,(還的就這些問題同你團隊的其它成員扯來扯去)。對於action、page以及存儲在HttpSession或者HttpServletRequest中的attribute,它們的命名約定是什麼?在哪兒實現數據庫事務、緩存和安全這些東西(還有你是否是還得複製一些Java或者XML來讓什麼東西能管用)?你的包是如何組織的……用戶接口類該放哪兒……數據和實體對象該放哪兒?你如何將一個地方的代碼共享給應用程序的其它部分?web
最糟糕的是,傳統的方法把你最不想碰的問題都扔給了你:多線程編程。記得面向對象編程基礎課中一個對象是被定義成一堆數據以及在這些數據上所進行的操做嗎?當你要構建一個傳統的web應用程序時就這忘掉這一課,由於web應用程序就是多線程的。一臺應用程序服務器能夠處理數十或者數百個來自我的用戶的請求,每個請求都有屬於它們本身的線程,而每個都用的是相同的對象。忽然之間,你就沒法在一個對象(一個servlet或者一個Struts Action中)存儲數據了,由於無論你爲一個用戶存的是什麼數據,數據都會當即被另外的某個用戶覆蓋掉。數據庫
糟糕的是,你的每一個對象都只有一個操做:doGet()或者doPost()。apache
同時,你的絕大部分平常工做都涉及到決定如何去打包已經存在於一個特定Java對象的某些數據,還有把那些數據折騰到一個URL的查詢參數中,那樣若是用戶點擊了特定的連接,你才能寫更多的代碼來將其轉換回去。還有就是不能忘了要編輯一對的XML文件來讓servlet容器,或者Struts框架知道你的這些決定。編程
開發玩笑,基本上在你作出了任何修改以後,都得記得要從新構建,從新部署並重啓。有什麼令你感到熟悉的嗎?那極可能會讓你感激一個你並不怎麼熟悉東西:Tapestry。瀏覽器
Tapestry使用了一個很是不一樣的模型:一個有組織有架構的page,還有page中的組件。每樣都有一個(你來指定的)特殊名稱。一旦你知道了page的名稱,你就知道了對應這個page的Java代碼的位置,還有對應這個page的模板的位置,以及整個page的結構。Tapestry也都知道,且能讓全部的東西發揮做用。緩存
如咱們將會在下面的一些page中所看到的,Tapestry讓你能在針對你的對象編寫代碼。除了幾個Java註解以外,你將不多會看到任何Tapestry類。若是你要存儲什麼信息,就把它存儲在類的屬性域中,而不是HttpServletResponse或者HttpSession中。若是你想要執行什麼代碼,它就只會是一個簡單的註解或者是以使Tapestry會在正確的時間,使用正確的數據調用到的約定來命名的方法。安全
Tapestry也使你能免受web應用程序開發的大多數多線程問題的困擾。Tapestry以線程安全的方式管理page和組件對象、以及page和組件的屬性域的生命週期。你的page和組件對象看起來總像是簡單的標準POJO。
Tapestry起步於2000年1月,到如今它已經影響了整個Tapestry社區超過15年。Tapestry給table帶來了全部有關於構建可擴展、可維護、穩定、國際化的,以及可使用Ajax的應用程序的最佳方法,這些方面的經驗。Tapestry 5基於一個(不一樣於Tapestry 4的)全新的代碼庫,在簡化Tapestry編碼模型的同時擴展Tapestry能力並提高其性能。
儘管你可能不會須要。這個教程的源代碼都在GitHub上。
好了,背景說得夠多了。如今讓我開始教程的學習吧:依賴,工具和插件。