============
= StrutsCX =
============
StrutsCX是一个Struts框架的插件,属于源代码开放的产品,植根于纯XML和XSLT技术,支持多种语言。有了StrutsCX,我们可以方便地用标准的XML和XSL技术生成HTML、XML、PDF等多种输出格式,而Struts则是执行这类XSLT转换的理想的支持技术。
StrutsCX允许我们以不同的语言和编码方式保存、输出内容,用StrutsCX可以方便地处理中文、英文、德文、法文、西班牙文以及朝鲜文、阿拉伯文、俄文等各种语言文字。
一、简单回顾Struts
Struts鼓励按照Model 2方式构建应用的体系。Model 2是MVC基本设计模式的一种变体。MVC设计模式的优点是,它使得Model、View和Controller各个部分之间相对独立。Struts在一个中心位置装配ActionServlet、ActionMapping和各种Action类,处理所有传入的HttpServletRequest。ActionServlet把各个传入的HttpServletRequest分发给Action类,而ActionMapping对象可通过Struts-config.xml配置文件控制,它告诉ActionServlet如何分发请求。
Controller的功能:在客户端、View和Model之间起协调、仲裁的作用。只有Controller才会与Model和View联系,在这中间它就象是一个交换机,而Model和View之间不会直接通信,这样,Model、View和Controller就被分隔开来。这是成功运用Struts的关键所在。
说明一下:所有Controller的逻辑应当放入Action类,与应用的其他层的通信可以在这里进行。虽然我们可以把业务逻辑也放入Controller,但一般而言最好不要这么做。应当改用Model部分的组件,因为这些组件才是真正处理数据的地方。把数据保存到数据库也应当是Model的功能之一。
当Controller处理好一个HttpServletRequest,它把请求转发给View。View的唯一任务是表现数据,在Struts中,View一般使用JSP技术。
在Struts中,Controller和View之间的所有通信都通过HttpServletRequest、HttpSession和ServletContext间接完成,对于这些操作来说,首选的技术莫过于Servlet,Struts直接把HttpServletRequest传递给Servlet——或者是JSP,不过Servlet容器会自动把JSP转换成Servlet。
二、Struts和JSP的局限
作为一个开放的框架,Struts允许使用JSP之外的技术构造View。在考虑改进Struts应用中的View技术时,人们首先想到的往往是用其他Servlet技术替代JSP,例如用XSLT或在Servlet管理之下的XSLT。
图二描述了在Struts框架中应用JSP的情况。View由JSP定制标记库和JSP页面共同构造,其中ActionForm类是一种类似JavaBean的ValueObject对象,带有set和get方法,用来保存客户的状态。按照Struts的MVC概念,ActionForm位于View和Controller之间的中间地带。Struts提供了一组完备的专用标记,用来从JSP访问ActionForm里面的数据。
三、XSLT的优势
作为一种W3C的正式标准,XSLT提供了一种把XML数据转换成纯文本、PDF、HTML/XHTML、WML、VoiceXML等任意XML格式的灵活、强大的工具。XSLT处理器,例如Xalan和Saxon,通过XSL样式执行转换,XSL样式本身实际上也是一种XML文档。
XSL样式定义了转换XML数据的规则,XSLT处理器按照这些规则实施转换。在XSL样式中,我们可以利用XPath表达式以一种紧凑而高效的形式选取XML文档的一部分进行处理。 XSLT/XPath的基本理念是分离XML数据内容和它的表现形式,以便把同一份数据方便地以不同的形式(或格式)输出,满足各种不同显示设备的需要。也就是说,在不改动输入的XML文档的条件下,对于每一种不同的输出格式,只需定义相应的XSL样式。对于Struts应用来说,这意味着:
·在单一XML文档中存储(描述)所有的数据。
·在XSL样式的帮助下,把该XML文档转换成任意数据格式。
当然,XML文档可以在内存中生成,不一定要有保存在磁盘上的文件。例如,以Java对象的形式创建XML文档,然后直接用XSLT处理器加以处理,从而极大地提高处理速度。
四、StrutsCX:加上了XSLT的Struts
StrutsCX把Struts和XSLT的优势结合到了一起,它用XSLT来替换生成View的JSP,但原封不动地保留Struts的Controller和Model部分。
在View中,StrutsCX传递的目标不再是JSP,而是一个Servlet,由Servlet组织、构造XML文档,并利用XSL样式转换XML文档。如果有ActionForm Bean,Action对象把它复制到HttpServletRequest,然后也被加入到XML输出文档。类似于Struts,StrutsCX动作的功能也是协调Web应用或J2EE应用的表现层和其他各个层,例如业务层等。
StrutsCX与Struts的不同表现在下面几个方面:
·在View中,StrutsCX使用的是XSLT而不是JSP。
·应用的国际化不再通过Java资源捆绑技术实现,而是通过纯XML技术实现。
·StrutsCX不需要为了输出错误信息而使用任何标记库,它使用XML和XSLT/XPath之类的W3C标准技术。
尽管StrutsCX和Struts有着许多不同,我们还是可以结合运用StrutsCX和现有的Struts应用。实际上,StrutsCX只不过是放弃了某些标准的Struts技术,代之以XML、XSLT和XPath。
五、StrutsCXServlet转换原理
在StrutsCX中,XSLT转换由StrutsCXServlet和它的几个辅助类完成,包括StrutsCXDocumentBuilder和StrutsCXTransformer。StrutsCXServlet通过如下方式控制转换工作:
·在StrutsCXDocumentBuilder的帮助下,构造一个XML文档。
·把该文档传递给StrutsCXTransformer,执行转换。
StrutsCXDocumentBuilder通过HttpServletRequest、HttpSession和ServletContext获得创建XML输出文档所需要的信息,所有这些工作通过一个唯一的公用方法createDocument完成。Struts的Action在HttpServletRequest、HttpSession或ServletContext中检查所需信息,具体依赖于哪儿才是保存这些信息的最佳位置。StrutsCXDocumentBuilder创建的XML输出文档包含如下信息:
·整合层(Integration Tier)的数据:可能包括数据库数据、来自EJB的数据、或直接来自其他XML文件的数据。
·一个(可选的)ActionForm Bean,其中保存了客户端的状态信息。
·一个(可选的)ActionErrors对象,包含Struts的错误信息。
·StrutsCX的资源属性,在StrutsCX下它用来替代Java资源捆绑信息。
·HttpServletRequest的数据。
·HttpSession的数据。