陈峰
MVC是一种目前广泛流行的软件设计模式,它的全称是Model-View-Controller,即把一个应用的输入、处理、输出流程按照Model(模型层)、View(视图层)、Controller(控制层)的方式进行分离。MVC model 2是一种联合JSP与servlets来实现动态内容服务的方法。Struts是一个基于MVC model 2的很好框架。而StrutsCX是MVC model 2x的极好实现。它基于Struts框架,完全摒弃JSP,采用纯XML和XSLT技术,并支持多种语言。通过它,开发人员可以方便地用标准的XML和XSL技术生成HTML、XML、PDF等多种输出格式。笔者提出一种全新的基于StrutsCX框架的信息发布技术路线,并在此基础上实现一个信息发布平台,具有信息添加、删除、修改等功能。
Struts继承MVC的各项特性,并根据J2EE的特点,做了相应的变化与扩展。Struts用它自定义的标签库和JSP页面处理视图层(View),用Action Form Bean表示和保存数据,用自己提供的ActionServlet实现控制层(Controller)。如图1所示,Struts首先将Request上的参数组装成Action Form bean,然后将Action Form bean传给某个具体的Action类进行处理,将处理后的结果保存在一个bean中,通过自定义标签库将结果bean中的信息显示成HTML输出。其中struts-config.xml为Struts的配置文件,用于建立Controller和Model之间的关系。
Struts联合JSP和servlets的优点。比较Struts和传统的JSP技术,可得出Struts有以下几个优势。
1)Struts不存在从JSP到Service层的直接调用,简化了JSP页面,清晰了程序员和页面制作人员的分工。
2)Struts具有组件化的优点,整个逻辑流在一个分等级的文本文件中,易于实现对大规模系统的开发和维护。
图1 Struts流程图
3)Struts配置文件struts-config.xml提供了操作、表单和屏幕的集中映射,让开发人员更易于理解整个应用程序,特别是在应用程序很大的情况下。
但Struts也有其不足,如复杂性和层都有所增加,美工人员需要学习全新的Tag Lib。而且View层仍采用JSP,开发人员还是可以在其中写逻辑代码。由于JSP对XML的支持不佳,用户想要获得各种格式的文档并非易事。
将Struts中的View层用XML/XSLT技术替换掉,这就是Model 2x模式。它极大程度地发挥了XSLT的优势。作为一种W3C的正式标准,XSLT提供了一种把XML数据转换成纯文本、PDF、HTML/XHTML、WML、VoiceXML等任意XML格式的灵活、强大的工具[1]。XSLT是高度可定制和可扩展的,并且已经获得广泛的支持(已经存在包括Xalan在内的20多种XSLT处理器)。StrutsCX即基于MVC model 2x的一个极好实现。
1)StrutsCX工作原理。StrutsCX把Struts和XSLT的优势结合到一起,很好地实现Model 2x模式。其具体流程如图2所示。比较图1和图2可得,StrutsCX在Struts的基础上修改View层的内容。它的核心是Struts CX Servlet类。StrutsCXServlet功能包括生成XML文档,读取struts-config.xml得到相应的XSL文件,并通过XSLT输出最终结果。
StrutsCX的配置也由XML文件实现。其中strutsconfig.xml是标准的Struts配置文件,功能和Struts中的相同,只是把其中指定View层的参数由原来的JSP文件名改为Struts CX Servlet。Strutscx-config.xml是StrutsCX专有的配置文件,它让StrutsCX获知到哪里去寻找StrutsCX资源属性文件,例如语言、环境、XSL文件等配置。
图2 StrutsCX的工作流程
2)StrutsCX的技术优势。在实际应用中同基于Struts框架的信息发布平台相比较,笔者得出StrutsCX的以下几点优势:①StrutsCX完全不采用JSP,而通过StrutsCX把XML格式的文件经过XSLT转换最后输出,从而使整个Web应用避免使用JSP和标记库,省略大量的声明,开发人员不用再学习Struts提供的不太标准的自定义标签库;②不采用JSP的同时也避免开发人员将逻辑代码写在JSP中,真正明晰地划分业务逻辑层和表现层的界限;③StrutsCX充分发挥XSLT的优势,利用XSLT可以方便地获得各种输出格式,如HTML、PDF和其他各种XML格式,而不再像JSP那样以HTML为中心。StrutsCX采用i18n实现国际化,它允许以不同的语言和编码方式保存、输出内容。
采用StrutsCX结构编程,通过searchnews.jar调用xmlutil和infopublish软件包中的方法从数据库中读取数据表Content中的数据,并通过StrutsCX采用XSLT转换成为HTML格式显示出结果。
TestAction.java:用户Action类,处理Request请求,调用相应的EJB方法,将输出结果表示为XML文档形式。
test.xsl:XSL样式文件。
searchnews.jar:session bean,用来读取数据库中Content数据表中的数据。
db.xml:定义系统使用的数据表结构。数据表Content相应的XML配置文件放在jboss目录下。
xmlutil.jar:session bean,用来连接数据库,并将取出的数据封装为XML文档对象。
InfoPublish.jar:Java Bean,定义基本数据类型。
在struts-config.xml中设置forward的path参数为“/StrutsCXServlet/”,在strutscx-config.xml中设置输出格式为HTML,则相应的XSL样式文件test.xsl的路径为“/WEB-INF/xsl/html/test.xsl”。
StrutsCX提供的调试变量主要有debugxml和encoding。设置encoding变量为gb2312。 设置debugxml变量为true,则输出XML格式的文档(如图3所示)。值得注意的是,此时除了用户信息文件(图中XML DATA部分),还会一起输出由StrutsCX自己生产的XML文档,包括RESSOURCEN PROPERTIES、ERROR PARAMETERS、REQUEST PARAMETERS和SESSION PARAMETERS。由于篇幅限制,这里没有在图中显示。
debugxml的缺省值为false,此时输出用户指定格式的文档,本例中设为HTML格式。最后输出如图4所示。
图3 xml格式的输出
图4 HTML格式的输出
本文给出基于StrutsCX框架的网络信息发布的方法。实际应用表明,采用该方法的信息发布平台分层结构清晰,输出格式灵活,并且便于管理和二次开发。完善的信息发布平台功能还包括对信息的查询、修改、增加等,由于篇幅限制,这里未能具体讨论。同StrutsCX类似的另一种框架为Struts+Cocoon,关于2种方法的优缺点比较还有待深入研究。
[1]Woehrlin B. Generate Web Output in Multiple Formats and Languages with StrutsCX[EB/OL].http://www.devx.com/Java/Article/11381
[2]StrutsCX-Struts with XSLT[EB/OL].http://it.cappuccinonet.com