Tapestry 教程(一)

介绍

欢迎来到 Tapestry 的世界!

这篇教程帮助人们来创建基于 Tapestry 的 web 应用程序。你是否有过使用 Tapestry 早期版本或者其它 web 框架的经历,这一点并不重要。事实上,从某些立场来看,对于一般的 web 开发了解的越少,你就能学得更好……因为那样你要忘掉的就不太多啦!

你确实对 HTML 有着较好的理解,对 XML 也一知半解,对于基础的 Java 语言特性,包括注解(Annotation)也有一个较好的了解。

Web 开发的挑战

如果你曾经用 servlet 和 JSP,或者利用 Struts 来开发过 web 应用程序,那你应该已经很容易感到有许多的麻烦。如此多的麻烦,你甚至可能没有理解你所在的可怕处境!这里都是些没有安全网络的环境;Struts 和 Servlet API 并不能告诉你应用程序怎么构建法,或者如何把不同的块组合到一起。任何URL都可以是一个action,而任何action都可以被指向任何视图,(使用一个JSP)来向网页浏览器提供一个HTML的响应。麻烦就是你作为一个开发者需要作出的许多细小琐碎,可是又很重要的决定,(还的就这些问题同你团队的其它成员扯来扯去)。对于actionpage以及存储在HttpSession或者HttpServletRequest中的attribute,它们的命名约定是什么?在哪儿实现数据库事务、缓存和安全这些东西(还有你是不是还得复制一些Java或者XML来让什么东西能管用)?你的包是如何组织的……用户接口类该放哪儿……数据和实体对象该放哪儿?你如何将一个地方的代码共享给应用程序的其它部分?

最糟糕的是,传统的方法把你最不想碰的问题都扔给了你:多线程编程。记得面向对象编程基础课中一个对象是被定义成一堆数据以及在这些数据上所进行的操作吗?当你要构建一个传统的web应用程序时就这忘掉这一课,因为web应用程序就是多线程的。一台应用程序服务器可以处理数十或者数百个来自个人用户的请求,每一个请求都有属于它们自己的线程,而每一个都用的是相同的对象。突然之间,你就无法在一个对象(一个servlet或者一个Struts Action中)存储数据了,因为不管你为一个用户存的是什么数据,数据都会立即被另外的某个用户覆盖掉。

糟糕的是,你的每个对象都只有一个操作:doGet()或者doPost()

同时,你的绝大部分日常工作都涉及到决定如何去打包已经存在于一个特定Java对象的某些数据,还有把那些数据折腾到一个URL的查询参数中,那样如果用户点击了特定的链接,你才能写更多的代码来将其转换回去。还有就是不能忘了要编辑一对的XML文件来让servlet容器,或者Struts框架知道你的这些决定。

开发玩笑,基本上在你做出了任何修改之后,都得记得要重新构建,重新部署并重启。有什么令你感到熟悉的吗?那很可能会让你感激一个你并不怎么熟悉东西:Tapestry

Tapestry 的方式

Tapestry使用了一个非常不同的模型:一个有组织有架构的page,还有page中的组件。每样都有一个(你来指定的)特殊名称。一旦你知道了page的名称,你就知道了对应这个pageJava代码的位置,还有对应这个page的模板的位置,以及整个page的结构。Tapestry也都知道,且能让所有的东西发挥作用

如我们将会在下面的一些page中所看到的,Tapestry让你能在针对你的对象编写代码。除了几个Java注解之外,你将很少会看到任何Tapestry类。如果你要存储什么信息,就把它存储在类的属性域中,而不是HttpServletResponse或者HttpSession中。如果你想要执行什么代码,它就只会是一个简单的注解或者是以使Tapestry会在正确的时间,使用正确的数据调用到的约定来命名的方法。

Tapestry也使你能免受web应用程序开发的大多数多线程问题的困扰。Tapestry以线程安全的方式管理page和组件对象、以及page和组件的属性域的生命周期。你的page和组件对象看起来总像是简单的标准POJO

Tapestry起步于20001月,到现在它已经影响了整个Tapestry社区超过15年。Tapestrytable带来了所有有关于构建可扩展、可维护、稳定、国际化的,以及可以使用Ajax的应用程序的最佳方法,这些方面的经验。Tapestry 5基于一个(不同于Tapestry 4的)全新的代码库,在简化Tapestry编码模型的同时扩展Tapestry能力并提升其性能。

获取教程源代码

尽管你可能不会需要。这个教程的源代码都在GitHub上。

是时候开始了

好了,背景说得够多了。现在让我开始教程的学习吧:依赖,工具和插件


你可能感兴趣的:(Tapestry 教程(一))