技术文章 > Web开发框架中的架构模式比较(二)

Web开发框架中的架构模式比较(二)

2018-10-21 12:38

文档管理软件,文档管理系统,知识管理系统,档案管理系统的技术资料:
Server Page (页面内容和逻辑)
Server Page技术也可以称为服务端脚本技术。
ASP.Net的服务端脚本语言包括VB.Net,C#.Net,J#.Net,JScript.Net。微软的IIS Web Server支持多种服务端脚本语言,是微软的战略决策之一。当然,既然这些Web服务程序的脚本只能运行在IIS Web Server中,那么也就只能运行在Windows平台上。这里有一点很值得注意,ASP.Net的服务端脚本的用法和JSP(还有后面提到的XSP)大不一样。ASP.Net的服务端脚本和页面元素之间的交互,如同客户端JavaScript一般。难怪,JScript.Net也被包括到服务端脚本之列。这种方式的优越性显而易见,ASP.Net程序员在处理一般的Web界面交互事件时,不用考虑很多HTTP Request – Response Cycle,而JSP(或XSP)程序员必须时时刻刻把这一点记在脑子里。JSP(或XSP)一般只用来动态生成网页,不进行事件处理。Java Web框架通常采取MVC (Model – View - Control)结构,页面交互转换的事件机制在Control部分实现。稍后会举例说明。

JSP的服务端脚本语言包括Java。根据最新推出的JSP2.0规范(可从java.sun.com站点下载),可以看出,JSP力图向XML规范靠拢,并引入Expression Language和大量的TagLib,试图尽量把Java语言代码从JSP页面中清除出去,以解决JSP页面固有的Java Code Pollution问题。JSP页面现在确实好看了许多,更加结构化,更加清晰。但在我看来,不过是拿另一种脚本语言(TagLib和Expression Language)来取代Java Code中的一部分功能罢了,副作用就是要求页面设计或编程人员多掌握一门语言。而且,在实际应用的要求中,要想使这门新语言达到java语言的灵活和强大,不是一件容易的事情,而且可能会令TagLib和Expression Language越来越庞大复杂,难以掌握。稍后会举例说明。

基于java的另一种Server Page技术是Apache Cocoon项目中的XSP技术。(如果需要进一步了解Apache Cocoon和XSP,请访问xml.apache.org站点)。Apache Cocoon项目大量使用SAX/XSLT技术。XSP用来为后续的转换处理管道Pipeline提供XML内容,而且XSP页面本身的生成,也要经过不少XSLT转换。XSP技术中也包括TagLib的概念,称为LogicSheet,表现形式也和JSP中相似,但实现原理完全不同。JSP的TagLib通过Java Tag Extension Class实现,XSP的TagLib(LogicSheet)通过XSLT转换实现。XSP技术的LogicSheet机制能够把页面的内容和逻辑从物理上分离开,分成几个不同的文件。稍后会举例说明。
ASP.Net的例子
例子1。说明服务端脚本调用Page_Load()函数(ASP.Net的内嵌初始化函数)生成页面元素的例子,从.Net框架文档中摘出。

例子2。说明web界面中的事件响应机制。并说明了如何在Web 窗体页中注册和声明自定义服务器控件。该控件的标记前缀是 Custom,它创建的类出现在 CustomWebFormsControls 命名空间中。它是使用 Custom:MyButton 标记在页的正文中声明的。我们可以看到TagLib的影子。



Here is our custom button.

runat=server/>




Width = "200" BackColor "Cyan" runat=server/>




JSP的例子
例子1。
下面的文件是Apache Struts项目的struts-config.xml配置文件例子,从struts用户文档中摘录。Apache Struts采用MVC (Model – View - Control)结构。struts-config.xml是重要的Control部分的配置文件,定义页面之间的交互,相当于用户界面的事件机制。


name="logonForm"
type="org.apache.struts.webapp.example.LogonForm" />

type="org.apache.struts.action.ActionForward" />

name="logon"
path="/logon.jsp"
redirect="false" />


path="/logon"
type="org.apache.struts.webapp.example.LogonAction"
name="logonForm"
scope="request"
input="/logon.jsp"
unknown="false"
validate="true" />


例子2。下面的JSP例子从JSP2.0规范中摘录,说明TagLib和Expression Language在JSP中看起来是什么样子。注意,,其中,JSTL表示JSP Standard Tag Library。${x}和${result}是Expression Language的用法。



${x}

${x}
${result}


${x}
${result}


${x}
${result}


${x}
${result}


XSP的例子
下面的例子从Apache Cocoon项目的用户文档中摘录。说明LogicSheet在XSP中的使用。LogicSheet在XSP的作用,相当于TagLib在JSP中的作用。JSP的TagLib通过Java Tag Extension Class实现,XSP的TagLib(LogicSheet)通过XSLT转换实现。
文件1是XSP文件,greeting3.xml;文件2是LogicSheet文件,logicsheet.greeting.xsl;生成的结果是文件3,greeting.xml。

文件1 —— greeting3.xml


xmlns:xsp="http://apache.org/xsp"
xmlns:greeting="http://duke.edu/tutorial/greeting">




文件2 —— logicsheet.greeting.xsl


xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsp="http://apache.org/xsp"
xmlns:greeting="http://duke.edu/tutorial/greeting"
version="1.0">






// this could be arbitrarily complex Java code, JDBC queries, etc.
String msg = "Hello, world!";

msg






文件3 —— 结果 greeting.xml


Hello, world!

注意,logicsheet.greeting.xsl文件,java代码嵌在和中间。XSP或者LogicSheet文件中的java代码中能够很自然地嵌入xml元素。而在JSP页面中,java代码和HTML元素交织在一起。
页面控件重用
正如前面所述,JSP和XSP中的页面控件重用,主要通过TagLib机制对html元素进行封装,实现页面控件的重用。。比如,Struts重定义了几乎所有html元素标签;Sun公司提出了SP Standard Tag Lib标准;Apache Jakarta Taglibs项目提供了括JSTL在内的多类TagLib的实现。Apache Cocoon项目提供了一些内嵌的LogicSheet —— Request, Form等。用户自定义控件,需要继承实现Java Tag Extension Class ——javax.servlet.jsp.tagext.TagSupport 。

有些java web框架走向另一个方向。SourceForge.net的java开源项目Echo是一个典型的例子。Echo不使用JSP,甚至不使用html,只使用Servlet。Echo提供了一组类似于Swing的接口,程序员可以象开发Applet程序一样写Web程序。Echo框架是事件驱动的框架。程序员书写的类Swing控件,会被Echo框架翻译成对应的html元素。用户自定义控件,只需要按照类Swing接口,生成自定义的控件类即可。

ASP.Net的页面控件重用方式和TagLib机制类似。同时,ASP.Net又是事件驱动的框架,这一点和Echo框架类似。ASP.Net似乎找到了一个比较好的平衡点。ASP.Net定义了两组服务器控件 —— HTML服务器控件,和Web服务器控件。HTML服务器控件封装了简单的html页面元素,比如,form,button,input等;Web服务器控件封装了更为复杂多样的页面控件,比如,asp:Calendar,asp:CheckBoxList等。HTML服务器控件在页面中的书写方法不带前缀,几乎和普通html页面元素一样,只是扩展了一些属性。Web服务器控件带有asp前缀。可以把HTML服务器控件类比为基本的TagLib,可以把Web服务器控件类比为扩展的TagLib。用户自定义控件需要继承System.Web.UI.WebControls.WebControl或者System.Web.UI. Control。并按照类似于TagLib声明的格式,写在页面文件中: