构件是提升软件复用度,进而提升软件开发效率最主要的手段。但令人遗憾的是,在B/S架构的开发模式下,并没有一种标准的且获得业界广泛认可的构件技术。
回顾C/S架构下的UI编程,我们获得的最主要的经验是:
1) 基于构件(也叫控件、组件)来构建UI。以Swing为例,一个GUI界面,父容器可能是个JFrame,其中包含一个JPanel,JPanel里面又有JButton、JTextField等等。
2) 构件构成的UI接受用户的操作,并产生事件,在事件响应中调用业务逻辑。还是以Swing为例,一个JButton,可能会增加一个ActionListener,并在ActionListener中调用后台的业务逻辑。
但在B/S架构下,情况就不一样了,究其原因:
1) 页面是基于HTML的,而HTML诞生的最初目的是“信息的发布媒介”,缺乏种种丰富的UI构件。如:缺乏HTML树、MenuBar、日期选择框等构件。
2) 客户端与服务器端之间的通讯依赖的是无状态的HTTP协议,客户端事件无法有效的传递到服务器端。
换言之,多年来C/S架构下UI的开发经验,无法有效的在B/S架构下继承并发扬光大。于是,传统的B/S架构的开发主要是基于流的开发模式。
以Servlet为例,你在程序中通过HttpServletResponse获得ServletOutputStream,而你所做的最主要的工作是:out.println("<html><body>...");。
很快,人们发觉这种模式的开发效率低下,于是,出现了JSP,允许在页面中嵌入<%%>代码片断,但实际上,JSP所做的最主要的工作无非是简化了out.println的写法而已。
综上所述,无论是JSP还是Servlet,其本质并没有变,那就是:基于流的编程。多年积累下来的C/S架构的开发经验,并没有有效传递到B/S架构的开发上。
而OperaMasks所要做的则是:充分吸纳C/S架构的开发经验,以提升B/S架构的开发效率,主要体现在:
1) UI(Web页面)不再是基于流的拼凑,而是基于构件来构建。这里的构件,在OperaMasks中称之为“Rich Component”。
2) 构件构成的UI依然可以接受用户的操作并产生事件,并能够在事件响应中调用后台的业务逻辑。
当然,OperaMasks并不试图完全的模拟C/S架构,毕竟B/S架构与C/S架构还是有很大的区别,以事件为例,B/S架构的事件是客户端事件,也就是说,是需要通过JavaScript来响应的事件,在OperaMasks中,你依然可以通过JavaScript来响应事件,也可以通过<ajax:action>将客户端事件转换为服务器端事件,来调用后台的业务逻辑。
当然,OperaMasks所包含的技术特性很多,但本章节主要强调:在OperaMasks中的Web页面,是基于构件编程的。