1. 什么是面向组件开发方式
Tapestry最大的特点是其颠覆性的开发方式。所谓颠覆,是指Tapestry的开发方式不光与传统的开发方式截然不同,而且还是在逐渐取代传统的开发方式。在web表现层框架中有两大开发方式,一种是传统的面向元素开发方式,这种开发方式也是最早出现的开发方式。绝大多数框架都是使用面向元素开发方式,比如 Structs,WebWork,SpringMVC等。在面向组件开发方式出现的原因正是为了弥补面向元素开发方式中种种不足之处。因此,我们可以认为面向组件的开发方式比面向元素的开发方式更加先进。目前,面向组件的Web表现层框架有三种:Tapestry,JSF,Wicket。
2.传统的面向元素开发方式
在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元素属性的关注甚至超过了我们对应用程序业务逻辑的关注。我们将这种开发方式称为面向元素(标签)开发方式。