| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1253 人关注过本帖
标题:三层结构”原理与用意“ (一)
只看楼主 加入收藏
liang_0429
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-5-9
收藏
 问题点数:0 回复次数:14 
三层结构”原理与用意“ (一)

希望能方便大家了解三层原理,看好多文章都要花分数才可以看到
现在给大家免费看哦 ~~呵呵 好的话要支持我哦!也许内容太多一个 要分几次发表大家见量啊 !
对于那些有丰富经验的Web应用程序开发人员,他们认为文章写的通俗易懂,很值得一读。可是对于asp.net初学者,特别是没有任何开发经验的人,文章阅读起来就感到非常困难,不知文章所云。甚至有些读者对“三层结构”的认识更模糊了……
  关于“多层结构”开发模式,存在这样一种争议:一部分学者认为“多层结构”与“面向对象的程序设计思想”有着非常紧密的联系。而另外一部分学者却认为二者之间并无直接联系。其行文目的是希望读者能够明白:在使用asp.net进行Web应用程序开发时,实现“多层结构”开发模式的方法、原理及用意。要顺利的阅读这篇文章,希望读者能对“面向对象的程序设计思想”有一定深度的认识,最好能懂一些“设计模式”的知识。如果你并不了解前面这些,那么这篇文章可能并不适合你现在阅读。

“三层结构”是什么?
  “三层结构”一词中的“三层”是指:“表现层”、“中间业务层”、“数据访问层”。其中:
n 表 现 层:位于最外层(最上层),离用户最近。用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。
n 中间业务层:负责处理用户输入的信息,或者是将这些信息发送给数据访问层进行保存,或者是调用数据访问层中的函数再次读出这些数据。中间业务层也可以包括一些对“商业逻辑”描述代码在里面。
n 数据访问层:仅实现对数据的保存和读取操作。数据访问,可以访问数据库系统、二进制文件、文本文档或是XML文档。

  对依赖方向的研究将是本文的重点,数值返回方向基本上是没有变化的。

为什么需要 “三层结构”?——通常的设计方式
  在一个大型的Web应用程序中,如果不分以层次,那么在将来的升级维护中会遇到很大的麻烦。但在这篇文章里我只想以一个简单的留言板程序为示例,说明通常设计方式的不足——

功能说明:
ListLWord.aspx(后台程序文件 ListLWord.aspx.cs)列表显示数据库中的每条留言。
PostLWord.aspx(后台程序文件 PostLWord.aspx.cs)发送留言到数据库。
更完整的示例代码,可以到CodePackage/TraceLWord1目录中找到。数据库中,仅含有一张数据表,其结构如下:

字段名称 数据类型 默认值 备注说明
[LWordID] INT NOT NULL IDENTITY(1, 1) 留言记录编号
[TextContent] NText N’’ 留言内容
[PostTime] DateTime GetDate() 留言发送时间,默认值为当前时间

ListLWord.aspx 页面文件(列表显示留言)

#001 <%@ Page language="c#" Codebehind="ListLWord.aspx.cs" AutoEventWireup="false"
Inherits="TraceLWord1.ListLWord" %>
#002 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
#003
#004 <html>
#005 <head>
#006 <title>ListLWord</title>
#007 <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
#008 <meta name="CODE_LANGUAGE" Content="C#">
#009 <meta name=vs_defaultClientScript content="JavaScript">
#010 <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5">
#011 </head>
#012 <body MS_POSITIONING="GridLayout">
#013
#014 <form id="__aspNetForm" method="post" runat="server">
#015
#016 <a href="PostLWord.aspx">发送新留言</a>
#017
#018 <asp:DataList ID="m_lwordListCtrl" Runat="Server">
#019 <ItemTemplate>
#020 <div>
#021 <%# DataBinder.Eval(Container.DataItem, "PostTime") %>
#022 <%# DataBinder.Eval(Container.DataItem, "TextContent") %>
#023 </div>
#024 </ItemTemplate>
#025 </asp:DataList>
#026
#027 </form>
#028
#029 </body>
#030 </html>

以最普通的设计方式制作留言板,效率很高。
这些代码可以在Visual Studio.NET 2003开发环境的设计视图中快速建立。
ListLWord.aspx 后台程序文件 ListLWord.aspx.cs

#001 using System;
#002 using System.Collections;
#003 using System.ComponentModel;
#004 using System.Data;
#005 using System.Data.OleDb; // 需要操作 Access 数据库
#006 using System.Drawing;
#007 using System.Web;
#008 using System.Web.SessionState;
#009 using System.Web.UI;
#010 using System.Web.UI.WebControls;
#011 using System.Web.UI.HtmlControls;
#012
#013 namespace TraceLWord1
#014 {
#015 /// <summary>
#016 /// ListLWord 列表留言板信息
#017 /// </summary>
#018 public class ListLWord : System.Web.UI.Page
#019 {
#020 // 留言列表控件
#021 protected System.Web.UI.WebControls.DataList m_lwordListCtrl;
#022
#023 /// <summary>
#024 /// ListLWord.aspx 页面加载函数
#025 /// </summary>
#026 private void Page_Load(object sender, System.EventArgs e)
#027 {
#028 LWord_DataBind();
#029 }
#030
#031 #region Web 窗体设计器生成的代码
#032 override protected void OnInit(EventArgs e)
#033 {
#034 InitializeComponent();
#035 base.OnInit(e);
#036 }
#037
#038 private void InitializeComponent()
#039 {
#040 this.Load+=new System.EventHandler(this.Page_Load);
#041 }
#042 #endregion
#043

#044 /// <summary>
#045 /// 绑定留言信息列表
#046 /// </summary>
#047 private void LWord_DataBind()
#048 {
#049 string mdbConn=@"PROVIDER=Microsoft.Jet.OLEDB.4.0;
DATA Source=C:\DbFs\TraceLWordDb.mdb";
#050 string cmdText=@"SELECT * FROM [LWord] ORDER BY [LWordID] DESC";
#051
#052 OleDbConnection dbConn=new OleDbConnection(mdbConn);
#053 OleDbDataAdapter dbAdp=new OleDbDataAdapter(cmdText, dbConn);
#054
#055 DataSet ds=new DataSet();
#056 dbAdp.Fill(ds, @"LWordTable");
#057
#058 m_lwordListCtrl.DataSource=ds.Tables[@"LWordTable"].DefaultView;
#059 m_lwordListCtrl.DataBind();
#060 }
#061 }
#062 }

PostLWord.aspx页面文件(发送留言到数据库)

#001 <%@ Page language="c#" Codebehind="PostLWord.aspx.cs" AutoEventWireup="false"
Inherits="TraceLWord1.PostLWord" %>
#002 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
#003
#004 <html>
#005 <head>
#006 <title>PostLWord</title>
#007 <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
#008 <meta name="CODE_LANGUAGE" Content="C#">
#009 <meta name=vs_defaultClientScript content="JavaScript">
#010 <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5">
#011 </head>
#012 <body MS_POSITIONING="GridLayout">
#013
#014 <form id="__aspNetForm" method="post" runat="server">
#015
#016 <textarea id="m_txtContent" runat="Server" rows=8 cols=48></textarea>
#017 <input type="Button" id="m_btnPost" runat="Server" value="发送留言" />
#018
#019 </form>
#020
#021 </body>
#022 </html>

PostLWord.aspx后台程序文件PostLWord.aspx.cs

#001 using System;
#002 using System.Collections;
#003 using System.ComponentModel;
#004 using System.Data;
#005 using System.Data.OleDb; // 需要操作 Access 数据库
#006 using System.Drawing;
#007 using System.Web;
#008 using System.Web.SessionState;
#009 using System.Web.UI;
#010 using System.Web.UI.WebControls;
#011 using System.Web.UI.HtmlControls;
#012
#013 namespace TraceLWord1
#014 {
#015 /// <summary>
#016 /// PostLWord 发送留言到数据库
#017 /// </summary>
#018 public class PostLWord : System.Web.UI.Page
#019 {
#020 // 留言内容编辑框
#021 protected System.Web.UI.HtmlControls.HtmlTextArea m_txtContent;
#022 // 提交按钮
#023 protected System.Web.UI.HtmlControls.HtmlInputButton m_btnPost;
#024
#025 /// <summary>
#026 /// PostLWord.aspx 页面加载函数
#027 /// </summary>
#028 private void Page_Load(object sender, System.EventArgs e)
#029 {
#030 }
#031
#032 #region Web 窗体设计器生成的代码
#033 override protected void OnInit(EventArgs e)
#034 {
#035 InitializeComponent();
#036 base.OnInit(e);
#037 }
#038
#039 private void InitializeComponent()
#040 {
#041 this.Load+=new System.EventHandler(this.Page_Load);
#042 this.m_btnPost.ServerClick+=new EventHandler(Post_ServerClick);
#043 }
#044 #endregion
#046 /// <summary>
#047 /// 发送留言信息到数据库
#048 /// </summary>
#049 private void Post_ServerClick(object sender, EventArgs e)
#050 {
#051 // 获取留言内容
#052 string textContent=this.m_txtContent.Value;
#053
#054 // 留言内容不能为空
#055 if(textContent=="")
#056 throw new Exception("留言内容为空");
#057
#058 string mdbConn=@"PROVIDER=Microsoft.Jet.OLEDB.4.0; DATA Source=C:\DbFs\TraceLWordDb.mdb";
#059 string cmdText="INSERT INTO [LWord]([TextContent]) VALUES(@TextContent)";
#060
#061 OleDbConnection dbConn=new OleDbConnection(mdbConn);
#062 OleDbCommand dbCmd=new OleDbCommand(cmdText, dbConn);
#063
#064 // 设置留言内容
#065 dbCmd.Parameters.Add(new OleDbParameter("@TextContent",
OleDbType.LongVarWChar));
#066 dbCmd.Parameters["@TextContent"].Value=textContent;
#067
#068 try
#069 {
#070 dbConn.Open();
#071 dbCmd.ExecuteNonQuery();
#072 }
#073 catch
#074 {
#075 throw;
#076 }
#077 finally
#078 {
#079 dbConn.Close();
#080 }
#081
#082 // 跳转到留言显示页面
#083 Response.Redirect("ListLWord.aspx", true);
#084 }
#085 }
#086 }

仅仅通过两个页面,就完成了一个基于Access数据库的留言功能。
程序并不算复杂,非常简单清楚。但是随后你会意识到其存在着不灵活性!

为什么需要“三层结构”?——数据库升迁、应用程序变化所带来的问题
留言板正式投入使用!但没过多久,我准备把这个留言板程序的数据库升迁到Microsoft SQL Server 2000服务器上去!除了要把数据导入到SQL Server 2000中,还得修改相应的.aspx.cs程序文件。也就是说需要把调用OleDbConnection的地方修改成SqlConnection,还要把调用OleDbAdapter的地方,修改成SqlAdapter。虽然这并不是一件很困难的事情,因为整个站点非常小,仅仅只有两个程序文件,所以修改起来并不费劲。但是,如果对于一个大型的商业网站,访问数据库的页面有很多很多,如果以此方法一个页面一个页面地进行修改,那么费时又费力!只是修改了一下数据库,却可能要修改上千张网页。一动百动,这也许就是程序的一种不灵活性……
再假如,我想给留言板加一个限制:
n 每天上午09时之后到11时之前可以留言,下午则是13时之后到17时之前可以留言
n 如果当天留言个数小于 40,则可以继续留言
那么就需要把相应的代码,添加到PostLWord.aspx.cs程序文件中。但是过了一段时间,我又希望去除这个限制,那么还要修改PostLWord.aspx.cs文件。但是,对于一个大型的商业网站,类似于这样的限制,或者称为“商业规则”,复杂又繁琐。而且这些规则很容易随着商家的意志为转移。如果这些规则限制被分散到各个页面中,那么规则一旦变化,就要修改很多的页面!只是修改了一下规则限制,却又可能要修改上千张网页。一动百动,这也许又是程序的一种不灵活性……
  最后,留言板使用过一段时间之后,出于某种目的,我希望把它修改成可以在本地运行的Windows程序,而放弃原来的Web型式。那么对于这个留言板,可以说是“灭顶之灾”。所有代码都要重新写……当然这个例子比较极端,在现实中,这样的情况还是很少会发生的——

请关注三层结构”原理与用意“ (二)


忘能帮助大家 祝君成功!

搜索更多相关主题的帖子: 用意 原理 结构 
2007-05-09 23:57
zhjesse
Rank: 1
来 自:西藏拉萨
等 级:新手上路
帖 子:205
专家分:0
注 册:2007-4-3
收藏
得分:0 
好东西
支持一下

楼主辛苦了......................

想了解西藏的天葬文化、藏北比如骷髅墙吗?[url=http://www.]【雪域藏北论坛】[/url]给你诠释!
2007-05-10 08:55
tukzer
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2007-3-30
收藏
得分:0 

非常感谢,这些资料真的很难得,
现在网上介绍的真是很少,希望楼主有机会也介绍下三层结构的设计过程!!

2007-05-10 10:23
飙马
Rank: 5Rank: 5
来 自:马里亚纳
等 级:贵宾
威 望:15
帖 子:779
专家分:280
注 册:2007-3-28
收藏
得分:0 
宝贵的资料!宝贵的人格!

IT精英如同彩票:平凡的人像5块也中不到一样普遍,努力一点你中了5元保了个本。奖金越高,机率也就越小,付出的也越多,盖茨如同500万一样稀有。虽然每天忙碌而平凡,但我努力成为精英,做梦中了500万。
2007-05-10 16:59
liang_0429
Rank: 1
等 级:新手上路
帖 子:18
专家分:0
注 册:2007-5-9
收藏
得分:0 

对于这些东东 确实是麻烦 好多的代码 看着都会晕
可是没有代码 空讲实在是说不出什么来 大家也不会得到什么
只是了解了以下三层的 概括介绍 如果想真正用上三层让它再我们的工程中
发挥它的优势 现在花一点时间也是值得的 是不是 呵呵 !

2007-05-15 19:32
ying0216
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-5-16
收藏
得分:0 
好东西!
2007-05-20 00:21
欢天喜地
Rank: 2
等 级:论坛游民
威 望:2
帖 子:83
专家分:20
注 册:2007-5-13
收藏
得分:0 
说的好,我现在正在进行三层结构的练习,
支持!
2007-06-13 16:00
fqbnet2008
Rank: 2
等 级:新手上路
威 望:4
帖 子:1020
专家分:0
注 册:2007-1-4
收藏
得分:0 
不错,支持一下 。

雄关漫道真如铁,而今迈步从头越,从头越,苍山如海,残阳如血㊣♀★
2007-06-14 09:44
梦在远方
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-6-13
收藏
得分:0 
回复:(fqbnet2008)不错,支持一下 。
如果想在ACCESS中存超过255个字的留言内容应该如何处理呢?

我就是传说中的那位 \"游戏使者\".......
2007-06-14 18:32
枫飘天涯
Rank: 2
来 自:北京
等 级:新手上路
威 望:4
帖 子:251
专家分:0
注 册:2006-10-13
收藏
得分:0 
谢谢分 享   看了  

*、還⒋聼媽媽德話吧 晩點再戀愛吧
2007-06-14 18:53
快速回复:三层结构”原理与用意“ (一)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050348 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved