Wt:简介

Wt(音同'witty')是一个C++库,用以开发交互性Web应用。

Wt的API以widget为中心,将桌面GUI APIs的良好测试模式引入Web开发。 Wt为开发者提供了几乎所有Web实现细节的抽象,其中包括事件处理、图像支持、 优雅降级(或渐进增强)、及良好的URL处理。

与其他诸多基于页面的开发框架相比,Wt可以创建状态化的应用,同时 实现了高度的交互性和可访问性;其交互性体现在Wt可以综合使用各种技术, 如Ajax等;其可访问性体现在Wt可以使应用在必要的时候支持纯HTML浏览器; 这些特性的获得充分利用了自动的优雅降级或渐进增强

Wt库还自带了应用服务器程序,可配置为独立的Web服务器,当然也允许 通过FastCGI连同其他Web服务器进行整合。

交互性、安全性、可访问性

基于页面的开发框架(如PHP、JSP/JSF、Ruby on Rails等)没有实现底层基础 技术的抽象,这些技术包括HTML/XHTML、JavaScript、CSS、Ajax、Forms、DHTML 、SVG/VML/Canvas等。显然,基于页面的开发框架必须要求开发者随时熟悉和掌握 这些基本技术,同时当浏览器不支持时,还要为应用的优雅降级负责。另外,如果 应用采取早期HTML页面为中心的设计模式,开发者不仅要实现控制器以告诉用户如何 从一个页面跳转到另一个页面,而且还要在采用一些高级Ajax技术时手工设计和维护 客户端与服务器端的通讯。

另一方面,就算是纯粹的Ajax框架,也要求开发者通过繁杂的JavaScript编程来 处理浏览器的怪异行为和客户端与服务器端间的安全通讯,这些处理任何人都不能 跳过去不与理会。同时,这些应用通常不能符合可访问性的原则,也不能很好被搜索 机器人索引到。

安全方面,生成HTML或填充HTML模版很容易导致安全问题,如跨站脚本(XSS) 跨站请求伪造(CSRF);XSS问题一般由(疏忽)允许嵌入JavaScript代码引起, CSRF问题一般由(相信)Cookies(可)作为认证手段引起。作为开发者, 这些安全问题将是很难避免的,因为我们有时需要允许用户插入自己的JavaScript 代码来实现某些功能,但开发框架本身却没提供给我们过滤机制。

相反,使用Wt来部署Web应用可以完全用C++来开发,Wt自动产生所必须的 HTML/XHTML、CSS、Javascript、CGI、SVG/VML/Canvas和Ajax代码;与此同时, 代码的安全性和浏览器兼容性等问题都将转交给Wt。例如,在可能的情况下, Wt将最大限度的使用JavaScript和Ajax,但在Ajax功能受限时,Wt也能保证 系统功能运行正常。其原理是Wt将先启用纯HTML/CGI应用,随后在可能的情况 下渐进增强至Ajax应用。另外,Wt提供了内置的安全性考虑。

典型应用举隅:

  • 由于Wt C++ Web应用服务器占用较小的物理空间,故而可以为嵌入式系统 提供基于Web的GUIs;
  • Wt可以为需要整合现有C++库的应用提供基于Web的GUIs, 这些 应用可能包括科学上的或工程上的应用;
  • Wt可以创建从现有C++桌面应用到Web的有效渠道;
  • Wt还可以应用于一些高性能、复杂的Web应用,这样的应用 一般具有高度定制、充分利用Ajax的特点,同时具有完全的可访问性和较高的 搜索引擎优化(SEO)需求

使用Wt的其他好处

  • 可以使用我们熟悉的桌面GUI模式开发Web应用;
  • Wt为我们提供了广阔的widgets集,这些widgets可以在环境不支持 JavaScript的情况下照常工作(当然,如果支持则效果更佳);
  • 在Wt中客户端与服务器端的验证和事件处理采用同一规范;
  • Wt允许开发者选择XHTML和CSS来进行布局和样式编辑;
  • Wt可生成标准的、兼容的HTML或XHTML代码;
  • Wt采用内联VML、内联SVG、HTML 5 画布或PNG可生成应用于Web的可移植的、 反锯齿的图像,当然这些图像还可以轻松渲染为PDF格式;
  • Wt可以避免常见的安全问题,因为Wt拥有对表示层的完全控制,并能够主动 过滤掉处于活动状态的标签和属性;Wt同时实现了业务逻辑的隐藏,并 通过状态化的设计简化了认证机制;
  • 基于Wt的应用的载入时间极短且占用带宽也很低,究其原因是Wt中这些特点 仅受限于页面显示的复杂程度,而不是应用程序自身的尺寸;Wt还实现了所有的 常用技巧和方法,以优化应用的快速反应,Wt几乎做到了针对所有浏览器的优化;
  • Wt提供了服务器端初始的事件处理,即服务器推Comet, 这部分API使用简单、稳定且在所有浏览器上均能实现;
  • Wt在服务器部署上,既可以使用内置的httpd,又可以使用FastCGI/ISAPI, 当然前者实施起来更简便易行。