`
k_lb
  • 浏览: 796390 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

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

 
阅读更多

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框架文档中摘出。

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<HTML>
<script runat="server">
 void Page_Load(Object sender, EventArgs e) 

{
 DataTable dt = new DataTable();
 DataRow dr;
 dt.Columns.Add(new DataColumn("IntegerValue", typeof(Int32)));
 dt.Columns.Add(new DataColumn("StringValue", typeof(string)));
 dt.Columns.Add(new DataColumn("DateTimeValue", typeof(DateTime)));
 dt.Columns.Add(new DataColumn("BoolValue", typeof(bool)));
 dt.Columns.Add(new DataColumn("CurrencyValue", typeof(double)));
 for (int i = 0; i < 9; i++) 
{
 dr = dt.NewRow();
 dr[0] = i;
 dr[1] = "Item " + i.ToString();
 dr[2] = DateTime.Now;
 dr[3] = (i % 2 != 0) ? true : false;
 dr[4] = 1.23 * (i+1);
 dt.Rows.Add(dr);
 }
 MyRepeater.DataSource=new DataView(dt);
 MyRepeater.DataBind();
 }
</script>

<body>
 <h3>Data Binding with the HtmlAnchor</h3>
 <p>
 <form runat=server>
 <asp:Repeater id="MyRepeater" runat="server">
 <ItemTemplate>
 Link for
 <a href='<%# DataBinder.Eval(Container,
 "DataItem.StringValue",
 "detailspage.aspx?id={0}") %>' 
runat="server">
 <%# DataBinder.Eval(Container, "DataItem.StringValue") %>
 </a>
 <p>
 </ItemTemplate>
 </asp:Repeater>
 </form>
</body>
</HTML>

例子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>

文件2 —— logicsheet.greeting.xsl

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

分享到:
评论

相关推荐

    论文研究-基于J2EE多层架构的Web开发框架研究.pdf

    在经典的J2EE四层体系结构的基础上增加数据持久层,提出了基于J2EE五层体系结构的Web开发框架;分析了基于Struts框架的J2EE架构中实现对象持久性的局限性,从中分离出对象持久层,并将Hibernate这个面向对象的轻量级...

    ASP.NET WebAPI+mvc4.0+EasyUI快速开发框架+通用权限管理系统源码

    1、基于ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout的架构设计开发 2、采用MVC的框架模式,具有耦合性低、重用性高、生命周期成本低、可维护性高、有利软件工程化管理等优点 3、采用WebAPI,客户端完全摆脱了代理...

    Java Web开发实例大全

    全书分为7篇23章,包括流行组件应用、数据库应用、图表统计、Ajax框架应用、流行框架、网站安全与架构模式、综合应用等。重点内容有操作XML文件、发送与接收邮件、数据库操作技术、SQL语句应用技术、复杂查询技术、...

    基于MVC框架的java web开发

    很好的一个关于java web中的mvc模式开发。。真的很好。值得一看哈。 特别适合想了解mvc模式开发的人。

    java web开发实战1200例 第二卷 源码

    《Java Web开发实战1200例(第2卷)》以开发人员在项目开发中经常遇到的问题和必须掌握的技术为核心,介绍了应用Java Web进行程序开发的各个方面的知识和技巧,主要内容包括流行组件应用、数据库应用、图表统计、Ajax...

    ASP.NET三层架构

    Web开发大部分还是围绕着数据操作,建立数据库存储数据,编写代码访问和修改数据,设计界面采集和呈现数据。走过Asp.net学习入门阶段后,真正开始着手开发一个Web项目时,才发现错综复杂的数据与关联根本就不是...

    Java Web开发实例大全(基础卷) 完整pdf扫描版[179MB]

    全书分为7篇23章,包括流行组件应用、数据库应用、图表统计、Ajax框架应用、流行框架、网站安全与架构模式、综合应用等。重点内容有操作XML文件、发送与接收邮件、数据库操作技术、SQL语句应用技术、复杂查询技术、...

    本博客的数据库与模型非Django自动生成,采用Python的web开发框架(Django)和Mysql数据库.rar

    以前用web.py(另外一款轻量级web开发框架)做一个监控管理平台,没有做特别的记录就不好拾起来。最近做一个日志聚合系统,使用的是django,这次就记下来,方便查询。 Django是一个高效的web开发框架,上手容易,便于...

    后台管理(微服务模式框架)+ pcWeb(vue) + appWeb(vue)

    这是一套可以运行的框架 后台api才用的是微服务架构 pc才用的是 webpack+vue+elementui app 采用的是 webpack+vue + vant 用问题可以一起探讨

    基于J2EE的Web应用的MVC架构实现_尹汉东

    设计模式在当前的工程应用中越来越广泛 ,MVC 是软件开发中 的一种重 要的设计 模式 , J2EE 则是... 并构建了一个简 单、实用的 Web 应用框架 , 达到了视图 、控制 、模型的分层 , 成功实现了 J2EE 平台上的 MVC 架构 。

    一款基于python语言的Web开发框架+源代码+文档说明

    XWEB框架是一款基于Python语言的Web开发框架 ##Why Python? 我曾经使用过Java、PHP、Ruby和Python来开发Web应用,至于为什么使用Python作为XWEB的语言,其实最主要的原因: 1. Ruby不再需要新的WEB开发框架,...

    ASP.NET Web API 2 框架揭秘(完整带目录、源码版

    《ASP.NET Web API 2框架揭秘》一本注重实证的书,功能各异、多达120个可供下载的示例,大量最佳实践与实用性扩展,可直接用于解决实际开发问题。全新的学习方法,通过完整论证来实现彻底的融会贯通。本书可以作为讲...

    51编程-C#敏捷开发框架源码

    51编程-C#敏捷开发框架源码特点 1.基本多层抽象工厂模式架构设计, 2.支持Access、Sql Server、Oracle、Sqlite、MySql等多种常见数据库 3.动态生成系统菜单 4.动态反射打开Winform窗体 5.可扩展支持Remoting、Web ...

    基于Vue.js框架的Web前端开发工具的设计与实现

    伴随Web开发技术的不断发展,前后端分离开发逐渐成为主流的开发模式,前端开发在整个开发流程中越来越重要,前端开发工作早已不是编写几个简单的静态页面就可以完成的,前端除了需要展示美观的页面,还需要实现...

    ERP系统开发框架(Webform+Sqlserver)

    本系统是强大构建系统,可建立多个系统同在一个管理器里,然后直接分配权限给人员,人员可以单点登入多... 该源码作者会持续改进,同时支持二次开发 基础功能介绍: 工作管理: 工作台 修改密码 公告 内部消息 功能管

    Web前端框架应用:第7章 Vue开发环境-环境变量及模式.pptx

    在一个项目的开发过程中,一般都会经历本地开发、代码测试、开发自测、测试环境、预上线环境,最后才能发布线上正式版本。在这个过程中,每个环境可能都会有所差异,如服务器地址、接口地址等,在各个环境之间切换时...

    基于MVC的Struts框架在Web中的研究与实现

    正是MVC模式在交互系统开发所体现的强大优势,被开发人员逐步引入J2EE体系之中,成为J2EE进行交互式应用开发时,特别是WEB应用开发时一个非常重要的设计模式。 基于上述理论,本文重点讨论了基于MVC模式的Struts框架...

    基于Python的Flask WEB框架实现后台权限管理系统.rar

    一款 Python 语言基于Flask、Vue2.x、ElementUI、MySQL等框架精心打造的一款高性能的前后端分离架构敏捷开发框架,可快速搭建前后端分离后台管理系统,本着简化开发、提升开发效率的初衷,框架自研了一套个性化的...

    《PHP高级程序设计_模式、框架与测试》中文版PDF

    同时,为适应目前web开发的新趋势,作者还全面探讨了mvc架构和zend framework,以及ajax、json、soap等web 2.0技术。书中穿插的大量软件开发实战经验和对php编程思想的感悟,将大大提升你的内在功力。

Global site tag (gtag.js) - Google Analytics