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部分实现。稍后会举例说明。
<?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页面现在确实好看了许多,更加结构化,更加清晰。但在我看来,不过是拿另一种脚本语言(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机制能够把页面的内容和逻辑从物理上分离开,分成几个不同的文件。稍后会举例说明。
例子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>
例子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规范中摘录,说明TagLib和Expression Language在JSP中看起来是什么样子。注意,<%@ 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”/>
下面的例子从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
<?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元素交织在一起。
正如前面所述,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声明的格式,写在页面文件中:<%@ Register TagPrefix= "myNameSpace" TagName="myUserControl" Src="userControl1.ascx" %>
分享到:
相关推荐
通过对J2EE多层架构的研究,本文提出了一种基于五层架构的Web开发框架,该框架在传统的四层架构基础上增加了数据持久层,并且集成了Hibernate等对象持久化技术,有效地解决了传统架构中的一些问题。此外,通过使用...
在实际开发过程中,理解并熟练运用"伍华聪2.0Web开发框架"的各项功能,将有助于构建高效、稳定、易维护的Web应用。开发者可以根据项目需求,结合框架的API和最佳实践,进行定制化开发,充分发挥框架的优势。同时,...
总之,基于ASP.NET的Web开发框架结合了三层架构和权限管理,为企业级Web应用提供了一个强大的基础。通过解压并研究这些文件,开发者可以深入理解框架的工作原理,并在此基础上快速开发出满足特定需求的业务功能。...
这个过程将涵盖多个关键知识点,让我们逐步深入了解Java Web开发的核心技术,并了解如何将它们整合成一个高效、灵活的框架。 1. **Servlet基础**:Java Web框架的基础是Servlet,它是Java EE规范的一部分,用于处理...
**基于MVC框架的Java Web开发** 在Java Web开发领域,Model-View-Controller(MVC)模式是一种广泛采用的设计模式,它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller),以实现业务...
例如,在Web开发中,Model-View-Controller (MVC) 是一种常见的架构模式,而Spring MVC、Struts等则是实现这种架构的具体框架。 - **区别**:框架更加具体和技术化,侧重于实现细节。相反,架构关注的是更为宏观的...
在经典的J2EE四层体系结构的基础上增加数据持久层,提出了基于J2EE五层体系结构的Web开发框架;分析了基于Struts框架的J2EE架构中实现对象持久性的局限性,从中分离出对象持久层,并将Hibernate这个面向对象的轻量级...
书中的源码提供了实际的编程实践,使读者能够亲身体验到JavaWeb框架的实现过程,从而加深对Web开发原理的理解。 在描述中提到的“迅雷下载后是一个404HTML页面”,可能是指读者在尝试获取书中的源码时遇到了问题,...
在IT行业中,SSH(Struts2 + Spring + Hibernate)是一个非常经典的Java Web开发框架,用于构建高效、可扩展的企业级应用程序。这个“WEB开发-SSH三层框架”项目涵盖了这三个核心组件,以及相关的数据库文件和工程...
1、基于ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout的架构设计开发 2、采用MVC的框架模式,具有耦合性低、重用性高、生命周期成本低、可维护性高、有利软件工程化管理等优点 3、采用WebAPI,客户端完全摆脱了代理...
尽管如此,JFinal依然是Java Web开发领域中一个值得推荐的开发框架,特别是在追求快速开发和简单配置的项目中具有很大优势。 从文章中提供的内容来看,JFinal框架的确能够满足当前快速发展的技术和Web需求,且在...
Java Web开发领域中,Struts、Hibernate和Spring是三个非常重要的框架,它们组合起来形成了经典的“SSH”架构,被广泛应用于构建企业级Web应用程序。这个架构模式为开发者提供了强大的功能和灵活性,使得复杂的业务...
这种架构模式有利于提升系统的可伸缩性、可维护性和可部署性。因此,后端API采用了微服务设计,意味着各个功能模块被拆分成独立的服务,降低了系统复杂度,便于团队协作和独立部署。 “pcWeb(vue)”指的是用于PC端...
MVC(Model-View-Controller)设计模式是软件工程中一种广泛应用于Web应用开发的架构模式,尤其在J2EE环境中,它有效地分离了应用程序的不同部分,提高了代码的可维护性和可扩展性。MVC模式的核心思想是将应用分为三...
基于.NetCore3.1搭建webapi框架。涉及知识有: 1.swagger API接口文档生成 2.多层(包含接口调用方式)高性能数据处理结构 3.数据仓储模式的实现 4.JWT token身份授权验证 5.appsetting.json文件集成读取配置
《架构探险:从零开始写JavaWeb框架》这本书是一本深度探索JavaWeb开发技术的著作,旨在引导读者从零开始构建自己的Web框架,从而深入理解框架背后的设计原理和实现机制。书中涵盖了从基础到高级的各种JavaWeb开发...
在C++领域,开发Web服务框架,特别是HTTP Web框架,是一项技术性强且具有挑战性的任务。本主题将探讨如何利用Microsoft的Visual Studio 2015集成开发环境(IDE)以及Boost库来设计和实现这样的框架。Boost库是C++...