Tapestry的面向组件的开发方式 -gthought
导航:上一页|ASP | PHP | JSP | HTML | CSS | XHTML | aJAX | Ruby | JAVA | XML | Python | ColdFusion
什么是面向组件开发方式[ ]
Tapestry最大的特点是其颠覆性的开发方式。所谓颠覆,是指Tapestry的开发方式不光与传统的开发方式截然不同,而且还是在逐渐取代传统的开发方式。在Web表现层框架中有两大开发方式,一种是传统的面向元素开发方式,这种开发方式也是最早出现的开发方式。
绝大多数框架都是使用面向元素开发方式,比如Structs,WebWork,SpringMVC等。在面向组件开发方式出现的原因正是为了弥补面向元素开发方式中种种不足之处。因此,我们可以认为面向组件的开发方式比面向元素的开发方式更加先进。目前,面向组件的Web表现层框架有三种:Tapestry,JSF,Wicket。
传统的面向元素开发方式[ ]
在Java语言中,我们都是使用Java Servlet API来创建Web应用程序。Java Servlet API是SUN公司制定的标准。Servlet是一个Java类,它的作用是接收客户端发送过来的请求,然后返回一个响应,最后通过客户端浏览器显示出一个HTML页面。Java Servlet API为Servlet定义了一些基础类,例如 HttpServletRequest,该对象装载了客户端发送过来的请求,并允许Servlet获取URL中携带的质询参数。
Servlet在Servlet容器中运行,Servlet容器是HTTP协议与Java Servlet API 之间的桥梁。Servlet容器负责创建Servlet实例并对其进行初始化。很多软件都提供了Servlet容器,其中有些软件的全部功能只是为了提供Servlet容器,例如,Apache Tomcat,Resin,Jetty等,而在有些软件中,Servlet容器可能只是一个庞大应用程序服务器中的一部分,例如,BEA WebLogic,IBM WebSphere 或开源的JBoss应用程序服务器。
Servlet容器根据URL来选择合适的Servlet响应请求,一个简单的Web应用程序可能包含许多Servlet。那么在Web应用程序的部署描述文件(应用程序中的一个XML文件通常命名为web.xml,放置在应用程序中的WEB/WEB-INF/目录下)中,我们就必须对每一个Servlet的名称和Java类全路经进行配置,并且配置URL和Servlet的映射关系。例如:
<servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>MyServlet</servlet-name> <servlet-class>com.wanjin.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/servlet/MyServlet</url-pattern> </servlet-mapping>
那么当客户端请求URL中包含“/servlet/MyServlet”字符串的时候,Servlet容器将会查找名称为“myServlet”的Servlet,然后根据名称为“myServlet”的Servlet的Java类群路径“com.wanjin.MyServlet”创建Servlet实例,并对其进行初始化。MyServlet类在接受到客户端返回相应。相应的结果以一个HTML,页面的形式在客户端浏览器出现,该叶面向是勒我们希望客户端得到的应用程序业务信息。
整个过程是很简单的。但是当我们面对一个庞大Web应用程序的时候,该用程序就可能包含大量的Servlet。这就意味着我们必须定义大量的URL与Servlet映射关系。那么,应用程序的URL结构将变得越来越复杂,也越来越容易发生混淆。于是,在应用程序开发阶段,我们不得不将绝大部分精力用于处理数量众多且易于混淆的URL。
在传统的开放方式中,例如,JavaServer Page (JSP),SpringMVC,Struts,WebWork中,我们必须关注叶面中每一个<a>元素的href属性,以及form元素的action属性,因为这些属性装载了向服务器发送请求的URL.大多数情况下,我们对这些HTML元素属性的关注甚至超过了我们对应用程序业务逻辑的关注。我们将这种开发方式称为面向元素(标签)开发方式。
Tapestry 的面向组件开发方式[ ]
Tapestry面向组件的开发方式是传统开发方式的变革。什么是面向组件呢?这就像搭积木一样。Tapestry将一个应用程序分成很多个页面,而一个页面又是由若干组件组成的,我们不需要去关心任何Servlet细节,也不需要关心如何生成URL和URL的结构,Tapestry会为我们自动生成合适的URL跳转叶面或者传递参数。
在Tapestry框架中,页面有HTML模板,页面规范和页面类组成,而组件由HTML模板,组件规范和组件类组成。叶面的HTML模板和组件的HTML模板都是在原始的HTML静态页面中嵌入少量的jwcid属性标签构成,页面类和组件类都是抽象或非抽象的Java类,并最终继承于Tapestry的org..apache.tapestry.AbstractComponent类。因此,页面对于Tapestry来说,是一种特殊的组件。那么一个使用Tapestry框架的Web应用程序,实际上就是一堆Tapestry组件的集合。
页面的所有业务逻辑都放在页面类中,页面与页面的关系是Java对象之间的关系。叶面类的逻辑不会影响到组件类的逻辑,页面与组件通过组件参数联系在一起,组件参数是页面向组件或者组件向页面传递数据的媒介。组件的所有逻辑都放在组件类中。因此,组件的逻辑实现完全脱离页面的束缚。
Tapestry组件是一个“黑盒子”,用于相应HTTP请求,并表现响应。在调用Tapestry组件的时候,我们根本就不需要去关心这个组件是如何实现的。我们面对的是组件的参数,只要向组件传递合适的数据,那么组件就会实现我们预期的功能。 页面类和组件类都是Java类,实现页面逻辑或者组件逻辑的过程不会影响到页面或组件的HTML模板。因此,Java程序员能够和美工人员实现完全独立的分工。
使用Tapestry框架来开发应用程序,就如同我们组装一台电脑。我们只是关心CPU的性能如何,内存多大。却不会关心CPU是怎样制造的,内存芯片之间如何通信等。如果我们嫌这台电脑运算内存不够,加根内存条就可以了,并不会影响CPU硬盘等已有硬件的工作。同样,从小型的应用程序到各种大型团队开发的几百个页面的大型应用程序,对于Tapestry来说,只不过是页面和组件使用多少的差别。使用Tapestry来开发各种大小应用程序,都能够保持一个协调一致的结构。这种结构一致的特性使得不同开发者在类似的问题上会找到类似的解决办法。我们创建的Tapestry组件能够跨项目使用,那么随着我们开发的应用程序的增多,积累的Tapesty组件就会越多,开发应用程序的效率就会越快。
Tapestry框架带来了真正的Java Web 应用程序OOP编程。
面向元素VS面向组件——思维方式的变革[ ]
在面向元素的开发方式中,我们的思维是线性的。我们无法将精力集中在应用程序的整体功能实现上。当一个超链接或者一个表单按钮没有达到我们预期目的的时候,我们首先考虑的不是应用程序业务逻辑是否正确实现,而是超链接或表单发送的URL的结构是否正确,并成功映射到指定的Servlet。特别当我们在页面中大量使用JavaScript脚本语言构造URL,或者修改页面中form表单的action属性的时候,分析和维护这样的页面是一场非常可怕的噩梦。
在面向元素的应用程序中,我们关心URL传递参数所携带的数据,关心Servlet的任何细节,甚至在高并发状态下,我们还必须担心Servlet是否正确地接收URL中传递的数据。
由于国内Struts框架使用相当广泛,而JSP又是我们学习Web应用程序开发的起步技术。因此,面向元素的开发方式是我们最习惯和最容易实现的开发方式。虽然面向元素开发方式实现起来最容易,但这并不意味着这种开发方式效率最高。由于我们不等不关心很多Servlet底层实现,于是我们不得不重复地编写这些底层代码,当一个页面中有多个action或者Servlet涉及高并发的时候,我们还得非常仔细地分析这些易让人混淆的底层代码。
Tapestry框架的面向组件思维颠覆了我们的习惯性思维。在面向组件的开发方式中我们不再关注Servlet底层实现,也不再过问URL的结构。我们通过创建页面来构成应用程序,通过在页面中调用组件来实现页面功能。我们不关心页面如何通过URL跳转到另外一个页面,也不关心form表单如何通过URL将数据包装在请求中提交到服务器端。
在面向组件的开发方式中,我们的思维是块状的,面向对象的思维方式。我们关心如何将用户在登录时输入的用户名和密码。我们关心在用户登录失败时向客户端返回什么样的错误提示信息,却不关心如何将这些错误信息打印到客户端浏览器。
面向组件的开发方式使我们将注意力集中在页面逻辑实现上,这样就提高了工作效率。对于那些重复而又容易发生错误的底层Servlet代码,Tapestry框架能够很好地进行处理,使我们得以解脱。