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

原创 2003年02月25日 17:40:00

Server Page (页面内容和逻辑)

Server Page技术也可以称为服务端脚本技术。

ASP.Net的服务端脚本语言包括VB.NetC#.NetJ#.NetJScript.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部分实现。稍后会举例说明。

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

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

 

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

ASP.Net的例子

例子1。说明服务端脚本调用Page_Load()函数(ASP.Net的内嵌初始化函数)生成页面元素的例子,从.Net框架文档中摘出。

 

 

 

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

 

<%@ Register TagPrefix="Custom" Namespace="CustomWebFormsControls" Assembly="CustomControls" %>

<HTML>  

   <script language="C#" runat=server>

      private void Button_Click(Object sender, EventArgs e) {

         TextBox.BackColor = System.Drawing.Color.Green;

         TextBox.Text = "You clicked the button";

      }  

   </script>

   <body>     

      <form method="POST" action="MyButton.aspx" runat=server>

         Here is our custom button.<br>

         <Custom:MyButton id="Button"  OnClick="Button_Click"

              runat=server/>

            <br>

            <br>

         <asp:TextBox id = "TextBox" Text = "Click the button"

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

         <br>     

      </form>        

    </body>        

</HTML>

 

JSP的例子

例子1

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

 

<struts-config>

    <form-beans>

        <form-bean

            name="logonForm"

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

     </form-beans>

    <global-forwards

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

        <forward

            name="logon"

            path="/logon.jsp"

            redirect="false" />

    </global-forwards>

    <action-mappings>

        <action

            path="/logon"

            type="org.apache.struts.webapp.example.LogonAction"

            name="logonForm"

            scope="request"

            input="/logon.jsp"

            unknown="false"

            validate="true" />

    </action-mappings>

</struts-config>

 

例子2。下面的JSP例子从JSP2.0规范中摘录,说明TagLibExpression LanguageJSP中看起来是什么样子。注意,<%@ taglib prefix=”c” uri=”http://java.sun.com/jstl/core” %>,其中,JSTL表示JSP Standard Tag Library${x}${result}Expression Language的用法。

 

<%-- page.jsp --%>

<%@ taglib prefix=”c” uri=”http://java.sun.com/jstl/core” %>

<%@ taglib prefix=”my” tagdir=”/WEB-INF/tags” %>

<c:set var=”x” value=”1”/>

${x} <%-- (x == 1) --%>

<my:example var=”x”>

${x} <%-- (x == 2) --%>

${result} <%-- (result == null) --%>

<c:set var=”x” value=”3”/>

<c:set var=”result” value=”invisible”/>

</my:example>

${x} <%-- (x == 4) --%>

${result} <%-- (result == ‘invisible’) --%>

<%-- /WEB-INF/tags/example.tag --%>

<%@ attribute name=”var” required=”true” %>

<%@ variable alias=”result” name-from-attribute=”var” scope=”AT_BEGIN” %>

<%@ taglib prefix=”c” uri=”http://java.sun.com/jstl/core” %>

${x} <%-- (x == null) --%>

${result} <%-- (result == 1) --%>

<c:set var=”x” value=”ignored”/>

<c:set var=”result” value=”2”/>

<jsp:doBody/>

${x} <%-- (x == ‘ignored’) --%>

${result} <%-- (result == 3) --%>

<c:set var=”x” value=”still_ignored”/>

<c:set var=”result” value=”4”/>

 

XSP的例子

下面的例子从Apache Cocoon项目的用户文档中摘录。说明LogicSheetXSP中的使用。LogicSheetXSP的作用,相当于TagLibJSP中的作用。JSPTagLib通过Java Tag Extension Class实现,XSPTagLibLogicSheet)通过XSLT转换实现。

文件1XSP文件,greeting3.xml;文件2是LogicSheet文件,logicsheet.greeting.xsl;生成的结果是文件3greeting.xml。

 

文件1 —— greeting3.xml

 

<?xml version="1.0"?>

 

<xsp:page

  xmlns:xsp="http://apache.org/xsp"

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

 

  <greeting>

    <greeting:hello-world/>

  </greeting>

 

</xsp:page>

 

 

<?xml version="1.0"?>

<xsl:stylesheet

  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">

 

<xsl:template match="xsp:page">

 <xsl:copy>

  <xsl:apply-templates select="@*"/>

  <xsl:apply-templates/>

 </xsl:copy>

</xsl:template>

 

<xsl:template match="greeting:hello-world">

  <!-- more complex XSLT is possible here as well -->

  <xsp:logic>

    // this could be arbitrarily complex Java code, JDBC queries, etc.

    String msg = "Hello, world!";

  </xsp:logic>

  <xsp:expr>msg</xsp:expr>

</xsl:template>

 

<!-- This template simply copies stuff that doesn't match other -->

<!-- templates and applies templates to any children.           -->

<xsl:template match="@*|node()" priority="-1">

 <xsl:copy>

  <xsl:apply-templates select="@*|node()"/>

 </xsl:copy>

</xsl:template>

 

</xsl:stylesheet>

 

文件3 —— 结果 greeting.xml

 

<?xml version="1.0"?>

 

<greeting>Hello, world!</greeting>

 

注意,logicsheet.greeting.xsl文件,java代码嵌在<xsp:logic></xsp:logic>中间。XSP或者LogicSheet文件中的java代码中能够很自然地嵌入xml元素。而在JSP页面中,java代码和HTML元素交织在一起。

页面控件重用

正如前面所述,JSPXSP中的页面控件重用,主要通过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.netjava开源项目Echo是一个典型的例子。Echo不使用JSP,甚至不使用html,只使用ServletEcho提供了一组类似于Swing的接口,程序员可以象开发Applet程序一样写Web程序。Echo框架是事件驱动的框架。程序员书写的类Swing控件,会被Echo框架翻译成对应的html元素。用户自定义控件,只需要按照类Swing接口,生成自定义的控件类即可。

 

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

三种主流Web架构

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。...
  • zxxSsdsd
  • zxxSsdsd
  • 2016年05月13日 15:48
  • 14017

浅谈我对几个Web前端开发框架的比较

强调一下,这篇日志主要还是针对想学前端开发的新朋友写的,不是说我有什么独特见解,而是比较客观的状态,就各种框架的异同和应用场合,需要注意的地方做简单描述,不做具体深入分析,有的地方比较抽象,对于抽象之...
  • u014062870
  • u014062870
  • 2014年03月12日 17:17
  • 979

前端开发框架对比

本文选取了 Bootstrap、jQuery UI、jQuery Mobile、Sencha ExtJS、Sencha Touch、Sencha GXT、Dojo、Dojo Mobile、Mootoo...
  • dongflying
  • dongflying
  • 2016年12月27日 15:38
  • 3744

架构,框架和设计模式的区别

架构:简单的说架构就是一个蓝图,是一种设计方案,将客户的不同需求抽象成为抽象组件,并且能够描述这些抽象组件之间的通信和调用。        框架:软件框架是项目软件开发过程中提取特定领域软件的共性部...
  • u014390502
  • u014390502
  • 2016年12月11日 15:42
  • 389

浅谈mvc、mvp、mvvm框架模式

背景:随着软件工业的发展,复杂的软件没有清晰合理的架构,很难开发和维护,于是出现了MVC框架模式。 一、MVC 简介:MVC,是模型(model)-视图(view)-控制器(controlle...
  • spring5530
  • spring5530
  • 2017年03月25日 22:39
  • 410

javaWeb开发中为什么要使用框架

javaWeb开发中为什么要使用框架
  • a2229833
  • a2229833
  • 2017年05月19日 15:04
  • 530

Web开发之MVC框架

什么是MVC框架?     在这里我简要的说明一下,想要详细的了解MVC的小伙伴们可以上百度百科,或者找来相应的书籍,仔细研究和理解一下,但是要说明的的一点是,完全理解MVC并不是一件容易的事。 ...
  • u010929604
  • u010929604
  • 2015年01月16日 08:09
  • 4973

WEB开发三层架构及MVC设计模式概述

关于   三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦...
  • qq_16526497
  • qq_16526497
  • 2015年07月29日 08:33
  • 1672

前端web开发的MVC模式 - 从一个简单实例讲起

MVC是一种设计模式,它将应用划分为3个部分:数据(模型)、展现层(视图)和用户交互(控制器)。其中: M - MODEL(模型) V - VIEW(视图) C - CONTROLLER(控制器...
  • lucifer19900724
  • lucifer19900724
  • 2015年09月17日 17:04
  • 5476

【UML】——浅谈设计模式,框架,架构

一:【简介】    架构是软件系统中从整体到部分的最高层次的划分,指导了大型软件的设计;设计模式是面向对象系统中可以重用的已经得到了证明的一种简单的方法,其实就是解决问题的一种思路和方案;框架是对于特...
  • changyinling520
  • changyinling520
  • 2015年10月27日 14:54
  • 1528
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Web开发框架中的架构模式比较(二)
举报原因:
原因补充:

(最多只允许输入30个字)