Asp.ne与J2EE的比较(Asp.net 部分)

Asp.net 部分

                                            -------------------Asp.net J2ee 的比较

我们来做系统开发,特别是Web 系统开发,Asp.net j2ee 技术用得比较广泛,外面一般才用MVC三层来开发项目,它可以使程序具有更好的可扩展性、灵活性、安全性、平台无关性以及可维护性,所以 我们这论文,主要以介绍这种技术为主。

Java 中的 三层架构为:前端的 HTML,JSP, Servlet , 中间层为 JavaBeanEJB,后面为数据库服务器。

Asp.net 中的三层架构为:前端的 HTML,asp, aspx 等,中间层有 .vb, .cs等文件编译而成的 .dll,后面为 数据库服务器.

在三层架构中,数据库层通过中间层来连接以为操作,前端给中间层传递参数,并接受中间层的参数。一般情况下,主要关注的是中间层与前端的数据交互。中间层可以被称为组件,一般为dll文件。在 asp.net 中,dll文件不用考虑注册的问题,拷贝过来就可以使用。

在设计模式上,三层架构的三层分别被称为表示层、业务层和数据层.

 表示层 :

提供应用程序的用户界面.通过包括 Windows 窗体和Asp.net 的页面的使用.

 业务层 :

     业务层实现应用程序业务功能。

 数据库操作层:

提供对外部系统(如数据库)的访问。该层涉及到的主要 .NET技术是 Asp.net 数据库访问技术.

为了增加我们这篇论文的可读性, 我们同过一个Asp.net 2.0的开源程序 “TheBeerHouse” 来示例说明,而且通过借图来揭开 Asp.net 2.0 的神秘面纱.

Asp.net 2.0 网站(The Beer House) 集新闻、商诚、论坛于一体.

 

“TheBeerHouse”是一个非常优秀的网站程序, CMS & E-commerce Site 即是 内容管理系统和电子商务的站点,我们研究此要求得出的结果是怎么用 Asp.net 技术构建 一个包含新闻系统、论坛系统、商城系统、投票系统的综合性网站, 因为此系统包含模块非常多,我们下面的说明,下面的例子都以“TheBeerHouse”里面的Articles,即是新闻系统来说明..

一,             数据库分析.

我们做系统,少不了对数据操作,一个优秀的数据库的系统设计非常关键.

“TheBeerHouse” 的新闻系统模块的关系图 :

我们看到这模块的数据库设计比较简单,涉及到只有三个表 :

 

Tbh_Article (这个是新闻主体表) ,它通过 CategoryID, ArticleID,这两个字段与另外两个表相连。

Tbh_Categories(这个是新闻类别表)

Tbh_Comments(这个是新闻评论表)

 

 

“TheBeerHouse” 的新闻系统模块的存储过程 :

从新闻系统的关系图我们可以看到几有简单的只个表而已,而上面的存储过程就很多,所以看到对这几个表的操作可不少,这是因为我们是通过存储过程来返回,插入,更新,或者删除数据的,  这是我们说的三层中数据库操作层的基础,我们下面研究几个上面的几个存储过程.

比如删除新闻信息的存储过程:

 tbh_Articles_DeleteArticle

 

create PROCEDURE dbo.tbh_Articles_DeleteArticle

(

     @ArticleID int

)

AS

DELETE tbh_Articles WHERE ArticleID = @ArticleID  

通过得到一个参数ArticleID, 而达到擅长目的.

 

 

 

比如通过标题返回信息信息

 

tbh_Articles_GetArticleByID

 

create PROCEDURE dbo.tbh_Articles_GetArticleByID

(

   @ArticleID  int

)

AS

SET NOCOUNT ON

SELECT tbh_Articles.ArticleID, tbh_Articles.AddedDate, tbh_Articles.AddedBy, tbh_Articles.CategoryID, tbh_Articles.Title, tbh_Articles.Abstract, tbh_Articles.Body,

         tbh_Articles.Country, tbh_Articles.State, tbh_Articles.City, tbh_Articles.ReleaseDate, tbh_Articles.ExpireDate, tbh_Articles.Approved,

         tbh_Articles.Listed, tbh_Articles.CommentsEnabled, tbh_Articles.OnlyForMembers, tbh_Articles.ViewCount, tbh_Articles.Votes, tbh_Articles.TotalRating,

         tbh_Categories.Title AS CategoryTitle

FROM tbh_Articles INNER JOIN

      tbh_Categories ON tbh_Articles.CategoryID = tbh_Categories.CategoryID

   WHERE ArticleID = @ArticleID

通过新闻编号、类别编号返回新闻信息,比如你点击一篇新闻标题,就看到到新闻信息.

 

由于涉及到的存储过程太多,我们只是简单拿两个出来说明.其它读者可以通过程序去分析.

 

下面我们来分析三层里面的数据访问层(Data Access Layer,以下简称为DAL

先看它在asp.net 里面的结构:

 

数据访问层(Data Access Layer,以下简称为DAL)清晰地将表示逻辑与数据访问逻辑区分开了。

对每一部分的数据访问封装在一个类文件里面,每一个类是由若干个方法组成.,下面我们同过SqlArticlesProvider.cs这个类是怎么样调用存储过程,来进行对数据库操作的。

SqlArticlesProvider.cs,这个类封装的是新闻系统模块的数据库访问.

大家可以看到上面这个类,里面包含很多方法,很多都是和存储过程影射的.

比如GetArticleByID() 这个方法:

      public override ArticleDetails GetArticleByID(int articleID)

      {

         using (SqlConnection cn = new SqlConnection(this.ConnectionString))

         {

            SqlCommand cmd = new SqlCommand("tbh_Articles_GetArticleByID", cn);

            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add("@ArticleID", SqlDbType.Int).Value = articleID;

            cn.Open();

            IDataReader reader = ExecuteReader(cmd, CommandBehavior.SingleRow);

            if (reader.Read())

               return GetArticleFromReader(reader, true);

            else

               return null;

         }

      }

调用的就是上面我们提到的tbh_Articles_GetArticleByID这个存储过程。

SqlConnection 这个对象是建立数据库连接,

SqlCommand 对象是执行存储过程,或者Sql语句,我们这里是执行存储过程,因为在存储过程里面有月个参数@ArticleID ,所以我们要 赋值,使它等于GetArticleByID()这个方法的变量int articleID,定义为整型.

后面用一个读对象,通过来说就是读数器来存储数据,把SqlCommand对象执行的结果放到reader 里面.

通过这个存储方法,我们就通过文章编号,而获得新闻信息了。

 

我们简单的分析DAL里面的一个类的一个方法,其它就不必要累赘,有兴趣的读者可以,自己来分析源程序,.

下面我们来说三层里面的业务逻辑层Business Logic Layer,以下简称BLL.

上面所描述的数据访问层(DAL)已经清晰地将表示逻辑与数据访问逻辑区分开了。不过,即使DAL将数据访问的细节从表示层中分离出来了,可它却不能处理任何的业务规则。比如说,我们可能不希望产品表中那些被标记为“停用”的产品的“分类编号”“供应商编号”被更新;我们还可能需要应用一些资历规则,比如说我们都不希望被比自己的资历还要浅的人管理。另外一个比较常见的情况就是授权,比如说只有那些具有特殊权限的用户可以删除产品或是更改单价。

我们其实可以将业务逻辑层(Business Logic Layer,以下简称BLL)看作是在数据访问层和表示层之间进行数据交换的桥梁,我们将讨论一下如何将这些业务规则集成到一个BLL中。BLL都是以类库(Class Library)的形式来实现的,我们把这些类都防在App_Code文件夹中的一系列的类。下面图向我们展示了表示层、BLL以及DAL三者之间的结构关系。

现在来看看我们这个系统里面的 数据业务层(BLL)

可以看到都是以类文件封转业务逻辑的,每一个模块包含一个文件夹,文件夹里面都是对这个模块的业务逻辑操作,我们下面来分析 Articles模块里面的业务逻辑,里面包含Article.cs, BaseArticle.cs, Category.cs, Comment.cs四个类,分别对文章,对文章,或者对评价封装了业务逻辑,.

Article.cs :

public class Article : BaseArticle

   {

      private int _categoryID = 0;

      public int CategoryID

      {

         get { return _categoryID; }

         set { _categoryID = value; }

      }

 

      private string _categoryTitle = "";

      public string CategoryTitle

      {

         get { return _categoryTitle; }

         private set { _categoryTitle = value; }

      }

刚开始是定义变量,因为比较多,我只粘贴了两个变量,其它省余.

 

然后看业务逻辑方法:

 通过编号返回文章:

 public static Article GetArticleByID(int articleID)

      {

         Article article = null;

         string key = "Articles_Article_" + articleID.ToString();

 

         if (BaseArticle.Settings.EnableCaching && BizObject.Cache[key] != null)

         {

            article = (Article)BizObject.Cache[key];

         }

         else

         {

            article = GetArticleFromArticleDetails(SiteProvider.Articles.GetArticleByID(articleID));

            BaseArticle.CacheData(key, article);

         }

         return article;

      }

插入文章时的业务判断:

      public static bool UpdateArticle(int id, int categoryID, string title,

         string Abstract, string body, string country, string state, string city,

            DateTime releaseDate, DateTime expireDate, bool approved, bool listed,

            bool commentsEnabled, bool onlyForMembers)

      {

         title = BizObject.ConvertNullToEmptyString(title);

         Abstract = BizObject.ConvertNullToEmptyString(Abstract);

         body = BizObject.ConvertNullToEmptyString(body);

         country = BizObject.ConvertNullToEmptyString(country);

         state = BizObject.ConvertNullToEmptyString(state);

         city = BizObject.ConvertNullToEmptyString(city);

 

         if (releaseDate == DateTime.MinValue)

            releaseDate = DateTime.Now;

         if (expireDate == DateTime.MinValue)

            expireDate = DateTime.MaxValue;

 

         ArticleDetails record = new ArticleDetails(id, DateTime.Now, "", categoryID,

            "", title, Abstract, body, country, state, city, releaseDate, expireDate,

            approved, listed, commentsEnabled, onlyForMembers, 0, 0, 0);

         bool ret = SiteProvider.Articles.UpdateArticle(record);

 

         BizObject.PurgeCacheItems("articles_article_" + id.ToString());

         BizObject.PurgeCacheItems("articles_articles");

         return ret;

      }

我们可以看到上面两个就是业务逻辑层Article.cs类的两个方法,用这两个方法,我们设置条件,比如出现什么样的情况,我们该怎么样处理数据,等等,..

 

上面两层说完,下面我们转到表示层,用户交互界面..

posted @ 2007-07-09 21:41  My name is chenyu  阅读(1269)  评论(9编辑  收藏  举报