简单谈谈 SimpleFramework 系统架构

14年前
工作机理


图:基于过滤器(/后处理)的Web应用框架工作原理

Web应用中,无论服务器端采用(Java EE/.NET),客户端的请求经Web或应用服务器解析后,最终返回客户端的响应内容主体都是HTML(含Javascript/CSS等)。由此,解决问题的契机就是在响应返回客户端(/浏览器)之前,“拦截”响应,解析其中HTML,并进行“再处理”,此即“后处理”应用模式。其实现方案可有服务器端(过滤/拦截器等)和客户端(插件等)两种。在Java EE体系下,支持Servlet 2.3的各种应用服务器(Weblogic/Websphere/JBoss/Tomca等)都有“过滤器(Filter/Interceptor)”机制,恰好为本框架的实现奠定了技术基础。
  • 处理流程
         了解处理流程将有利于有效地使用本框架,其中包含如下步骤:
  1. 拦截响应中HTML。
  2. 组件XML元数据解析。
  3. 业务Handle类执行。
  4. 组件代码生成及渲染。
  5. 复合HTML生成及响应。
  • 应用加载
         基于本框架的应用可通过web.xml中定义的Filter加载(另提供一Web应用入口的继承类AbstractWebApplication,可更快捷搭建Web应用)。如下为典型配置示例:
<servlet>
    <servlet-name>startup</servlet-name>
    <servlet-class>net.simpleframework.web.SimpleWebApplication</servlet-class>
    <load-on-startup>0</load-on-startup>
</servlet>
<filter>
    <filter-name>actionFilter</filter-name>
    <filter-class<net.simpleframework.web.page.PageFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>actionFilter</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>
<listener>
    <listener-class>net.simpleframework.web.page.PageEventAdapter</listener-class>
</listener>
  • 原始请求-响应
         原始请求-响应过程,本框架并未参与,因此从理论上讲,本框架可兼容任何基于Servlet规范的框架,诸如Struts、SpringMVC等。
  • 响应拦截
         当响应(Respone)流中生成HTML文档,在还未Flush到浏览器时,本框架接管该HTML文档,并重新结合组件(XML)定义,做“后处理”。
  • 元数据解析
         解析请求中含有XML文件的元信息定义,此类信息是本框架的组件基础。
  • Handle执行
         如定义了HandleClass,本框架则调用该Handle业务类,并将结果传递给渲染器。
  • 组件渲染
          渲染器(Render)根据组件定义及Handle执行结果,生成响应的HTML、Javascript、CSS等元素。
  • 重构HTML
        最后将重新组合的HTML推到浏览器端。如含有异步请求的脚本,则重复如上步骤。

框架模式



从上图可知,基于过滤器的后处理模式,实际上是利用过滤器机制对MVC2的扩展,是两个MVC2模式的有机组合:先由“Filter”作为“Controller”,以另一MVC2作为其“虚模型”,再将此“Model”分解为一完整的MVC2,分别由原Model和作为Post-View(基于XML定义)的解析器(Parser)及逻辑处理器(HandleClass)的Post-Controller构成。

遵循标准
  1. 后端实现技术为Java ,前端实现技术为HML+Javascript+CSS,皆为业界标准;
  2. 未创建自己专有语法、标签或其他,遵循的标准就是JSP\Serverlet、Taglib等Java EE的原生或固有标准;
  3. 采用了类似XUI的XML式组件声明,但语义更加简洁;
  4. 不是“重新发明轮子”,可看做WEB过滤器的MVC扩展实现;
  5. 以独特的AJAXRequest组件对象、仿真HTTP Client以及代码自动生成技术,内置AJAX引擎(缺省为Prototype)实现无Javascript的AJAX应用;