您的位置:寻梦网首页编程乐园ASP编程>ASP实例学编程
打造自己的留言板
作者:天啦

    
        ASP+ 是MS公司推出的一种全新Web编程方式,很多人以为ASP+ 就是简单的ASP的升级,或者是ASP4.0。实际上,两种是绝然不同的东西,ASP只是一种利用脚本语言进行WEB开发的工具,很多情况下是面向结构,而ASP+ 是一种完全的编程语言,其最大的特点就是面向对象,它具有面向对象语言的一切特性:类、封装、继承、多态性等等,接受这门语言对传统的ASP程序员来说,最重要的就是转变编程思想,传统的ASP编程是ASP代码和HTML混合使用,这样虽然灵活性有所提高,但是程序显得杂乱无章,而且可复用性很差,本文将利用ASP+ 和ASP制作一个简单的留言板来做一个比较,从而找出两者之间的不同之处和优缺点。先来分析留言板的结构:
     这个留言板主要有三个功能模块:
       (1)列出留言列表
       (2)列出具体某个留言的内容
       (3)添加留言
     先介绍留言板的表结构:
     表:notepage
    
     Table1
    
     我们分别来介绍两种实现方式:
    
     Asp制作留言板的实现方式:在HTML中嵌入ASP代码或者用ASP写出HTML代码,各个模块分别用ASP来实现。
    
     ASP+ 制作留言板的实现方式:先构造一个留言板对象,然后把留言板的可能使用到的属性和方法封装在这个类中,用WEBForm的方式做表现层,利用CodeBehind用对应的CS 来做业务逻辑层,同时利用一个Conn的Class封装了对数据库的访问,形成数据层,从而实现严格的三层结构。
     数据库部分:
     由于只是要比较两种开发方式的不同,所以数据库方面我们使用了相同的存储过程和表结构,但是在数据库连接方面两者还是有所不同的。
     Asp实现的方法:在一个包含文件中包含数据库连接文件,在里面定义了两个函数:myConnOpen和myConnClose分别用来打开和关闭数据库。
    
     MyconnOpen.asp:
     <%
     Set conn = Server.CreateObject("ADODB.CONNECTION")
     Sub MyConnOpen()
       conn.open "Driver = {sql server};Server = mygod;Database = note;uid=sa;pwd=; "
     End Sub
     Sub MyConnClose()
       Conn.close
       set Conn = nothing
     End Sub
     %>
    
     Asp+实现的方法:用一个Class来定义数据库连接。
    
     Conn.cs
     namespace notpage
     { using System;
       using System.Data.SQL ;
       /// <SUMMARY>
       ///    Summary description for myconnOpen.
       /// </SUMMARY>
       Public class myconn:System.Data.SQL.SQLConnection
       { public myconnOpen()
         { this.Database = "back" ;
           this.DataSource = "LUOCHANG" ;
           this.UserID = "sa" ;
           this.Password = "" ; }}
     }
    
     其它页面表现部分:
     ASP的实现方法:各个部分使用各个不同的ASP实现。
     列出留言列表:List.asp
    
     <!--#include  virtual = "conn.asp"-->
     <%
     sql = "'n_GetTopicList'"
     MyconnOpen()
     set Rs=Server.CreateObject("ADODB.RECORDSET")
     set rs = conn.execute(sql)
     If not rs.eof and not rs.BOF then
       Response.Write "<TABLE WIDTH=90% HEIGHT=1 BORDER=0 CELLSPACING=2 CELLPADDING=2><TR>"
       Response.Write "<TD>主题</TD><TD>留言人</TD><TD>留言时间</TD>"
       Do while not rs.EOF
         Response.Write "<tr><td><a href = Content.asp?id="&rs(0)&">" &rs("title")& "</a></td>"<br>         Response.Write "<td>" & rs("author") &"</td>"
         Response.Write "<td>" & rs("adddate")&" </td></tr>"
       Next
     Else
       Response.Write "对不起,还没有留言"
     End if
     MyconnClose()%>
    
     察看留言的详细信息:根据传递的ID号在数据库中找的详细信息,然后列出来。
    
     <!--#include  virtual = "conn.asp"-->
     <%
     intID = Request.Form("id")
     sql = "'n_GetTopicInfo','"&intID&"'"
     Myconn()
     set Rs=Server.CreateObject("ADODB.RECORDSET")
     set rs = conn.execute(sql)
     If not rs.eof and not rs.BOF then
        str = "<p align=center><font color=red><b>察看留言</b></font></p><br>" &_
        "<p align=left><font color=blue>留言主题:"&Rs("Title")&"<br>"&_
        "留言时间:"&Rs("adddate")&"<br></font><font color=blue>留言人:"&Rs("Author")&"</font></p>"&_
        "留言内容:"&Rs("Content")
        Response.Write Str
     Else
        Response.Write "数据没有找到"
     End if
     MyconnClose()%>
    
     添加留言:利用一个Form中填入信息,然后Post到另一个ASP文件中处理。
     填充页面(略):
    
     ……
    
     处理的程序:addTopic.asp
     <!--#include  virtual = "conn.asp"-->
     <%Dim Title
     Dim Content
     Dim Author
     Title = Request.Form("Title")
     Cotent = Request.Form("Content")
     Author = Request.Form("Author")
     sql = "'n_addtopic','"&Title&"','"&Author&"','"&Content&"'"
     MyconnOpen()
     conn.execute(sql)
     Response.Write "成功添加留言!"
     Myconnclose()
     %>
    
     而在ASP+中处理方式就完全不同了,开始已经提到了,我们将把功能模块封装到Class中,然后在其他webForm中使用。
     先介绍这个Class(由于篇幅限制这里只列出一部分代码)
    
     namespace notpage
     {  using System;
        using System.Data.SQL ;
        using System.Data ;
        using System.Collections ;
        public class notepage
        {  //私有变量
           private int  n_intID;  //ID编号
           private string n_strTitle;  //主题
           private string n_strAuthor;  //留言人
           private string n_strContent;  //留言内容
           private DateTime n_dateTime;  //留言时间
           ......................(此处定义属性)
           //构造函数,将留言的属性放置在其中
           public notepage()
           {  this.n_intID = 0 ;
              this.n_strTitle = "" ;
              this.n_strAuthor = "" ;
              this.n_strContent = "" ;
              this.n_dateTime = System.DateTime.Now;}
              /// <SUMMARY>
              /// 目的:取得留言的内容
              ///</SUMMARY>
              /// 留言的ID号
             public notepage GetTopic(int a_intID)
             {  //读取数据库
                myconn myConn = new myconnOpen();
                SQLCommand myCommand = new SQLCommand() ;
                myCommand.ActiveConnection = myConn ;
                myCommand.CommandText = "n_GetTopicInfo" ;  //调用存储过程
                myCommand.CommandType = CommandType.StoredProcedure ;
                myCommand.Parameters.Add(new SQLParameter("@a_intTopicID" , SQLDataType.Int)) ;
                myCommand.Parameters["@a_intTopicID"].Value = a_intID ;
                notepage objNp = new notepage();
                myConn.Open() ;
                SQLDataReader myReader ;
                myCommand.Execute(out myReader) ;
                if (myReader.Read())
                {  objNp.ID = (int)myReader["ID"] ;
                   objNp.Title = (string)myReader["Title"] ;
                   objNp.Author  = (string)myReader["Author"] ;
                   objNp.Content = (string)myReader["Content"];
                   objNp.adddate = (DateTime)myReader["adddate"];}
                //清场
                myReader.Close();
                myConn.Close() ;
                /// <SUMMARY>
                /// /// 目的:将留言的内容入库
                /// /// 利用构造函数来传递信息
                /// </SUMMARY>
                /// 一个留言的对像
                public bool AddTopic(notepage n_Topic)
                {  //读取数据库
                   myconn myConn = new myconnOpen();
                   SQLCommand myCommand = new SQLCommand() ;
                   myCommand.ActiveConnection = myConn ;
                   myCommand.CommandText = "n_addTopic" ;  //调用存储过程
                   myCommand.CommandType = CommandType.StoredProcedure ;
                   myCommand.Parameters.Add(new SQLParameter("@a_strTitle" , SQLDataType.VarChar,100)) ;
                   myCommand.Parameters["@a_strTitle"].Value = n_Topic.Title ;
                   myCommand.Parameters.Add(new SQLParameter("@a_strAuthor" , SQLDataType.VarChar,50)) ;
                   myCommand.Parameters["@a_strAuthor"].Value = n_Topic.Author ;
                   myCommand.Parameters.Add(new SQLParameter("@a_strContent" , SQLDataType.VarChar,2000)) ;
                   myCommand.Parameters["@a_strContent"].Value = n_Topic.Content ;
                   myConn.Open() ;
                   myCommand.ExecuteNonQuery() ;
                   //清场
                   myConn.Close() ;
                   return true; }
                /// <SUMMARY>
                /// 取的贴子列表
                /// </SUMMARY>
                ///
                /// 返回一个Topic数组
                ///

                public ArrayList GetTopicList()
                {  //定义一个forum数组做为返回值
                   ArrayList arrForumList =new ArrayList() ;
                   //从数据库中读取留言列表
                   myconn myConn = new myconnOpen();
                   SQLCommand myCommand = new SQLCommand() ;
                   myCommand.ActiveConnection = myConn ;
                   myCommand.CommandText = "n_GetTopicList" ;  //调用存储过程
                   myCommand.CommandType = CommandType.StoredProcedure ;
                   myConn.Open() ;
                   SQLDataReader myReader ;
                   myCommand.Execute(out myReader) ;
                   for (int i = 0 ; myReader.Read() ; i++)
                   {  notepage objItem = new notepage() ;
                      objItem.ID = myReader["ID"].ToString().ToInt32() ;
                      objItem.Title = myReader["Title"].ToString() ;
                      objItem.Author = myReader["Author"].ToString() ;
                      objItem.adddate = myReader["adddate"].ToString().ToDateTime();
                      objItem.Content = myReader["Content"].ToString();
                      arrForumList.Add(objItem) ;}
                   myReader.Close();
                   myConn.Close() ;
                   Return arrForumList ;}}}
     }
    
     这个类建立起来后,我们要实现的功能也就都封装在里面了,我们现在要做的是在WEBForm中引用类的方法属性来实现相应的功能。限于篇幅,这里仅仅介绍实现其中一个功能模块的做法——列出留言的详细内容。
     首先,我们定义一个webForm做为表现层,把数据的表现定义好。
     模块二:显示留言的详细内容:showTopic.aspx
    
     <%@ Page language="c#" Codebehind="showTopic.cs" AutoEventWireup="false" Inherits="notpage.showTopic" %>
     <FORM method=post runat="server">
     <P align=center><FONT color=red><B>察看留言</B></FONT></P><BR>
     <P align=left><FONT color=blue>留言主题:<ASP:LABEL id=n_tdtitle runat="Server" forecolor="Black"></ASP:LABEL>
     <BR>留言时间:<ASP:LABEL id=n_tdAdddate runat="Server" forecolor="Black"></ASP:LABEL><BR></FONT><FONT color=blue>留言人:
     <ASP:LABEL
     id=n_tdAuthor runat="server" forecolor="Black"></ASP:LABEL><BR>留言内容:<ASP:LABEL id=n_tdContent
     runat="Server" forecolor="Black"></ASP:LABEL> </FONT></P></FORM>
    
     接着,在它的CodeBehind中有一个相同名称的CS文件:showTopic.cs来处理其中的业务逻辑,也就是业务逻辑层。
     对应的CS——showTopic.cs
    
     namespace notpage
     {(...............此处引用一些常用的类)
       /// <SUMMARY>
       ///    Summary description for showTopic.
       /// </SUMMARY>
       public class showTopic : System.Web.UI.Page
       {  protected System.Web.UI.WebControls.Label n_tdAuthor;
          protected System.Web.UI.WebControls.Label td;
          protected System.Web.UI.WebControls.Label n_tdContent;
          protected System.Web.UI.WebControls.Label n_tdAdddate;
          protected System.Web.UI.WebControls.Label n_tdtitle;
          protected System.Web.UI.WebControls.Label n_ttitle;
          public showTopic()
          {  Page.Init += new System.EventHandler(Page_Init); }
          protected void Page_Init(object sender, EventArgs e)
          {  int int_ID;
             int_ID = Request.QueryString["ID"].ToInt32();
             notepage np = new notepage();
             notepage objNp = np.GetTopic(int_ID);
             n_tdtitle.Text = objNp.Title.ToString();
             n_tdContent.Text = objNp.Content.ToString();
             n_tdAuthor.Text = objNp.Author.ToString();
             n_tdAdddate.Text = objNp.adddate.ToString();
             InitializeComponent(); }
          /// <SUMMARY>
          ///    Required method for Designer support - do not modify
          ///    the contents of this method with the code editor.
          /// </SUMMARY>
          private void InitializeComponent()
          {  this.Load += new System.EventHandler (this.Page_Load);}}}
    
     这样显示留言详细信息的功能就完成了,读者应该注意到,这里取得留言的详细信息的功能是利用前面定义的Class的方法GetTopic来实现的。
     通过比较我们可以很清楚的看到:ASP+ 制作一个简单的留言板,也许它在实现上没有用ASP来得简单方便,但是它确实完完全全的面向对象编程。随着互联网的飞速发展的,面向对象的语言和方法将起到越来越重要的作用,所以掌握面向对象的思想对WEB程序员是十分重要的,在以后我的系列中,将会加重对ASP+的介绍,希望能对读者有所启迪,也希望大家能Email给我您的建议,希望和大家一起进步。
    
     责任编辑:敖剑