请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 3766|回复: 25

我是这样编写asp程序的 [复制链接]

citywill 楼主
帖子
196
体力
690
威望
7
居住地
吉林省 长春市
发表于 2006-7-18 08:53:44 |显示全部楼层
asp程序非面向对象、代码混杂、重用率低,许多asp程序员为之所累。因此在使用asp的时候更要寻找一个适合自己的标准,使程序尽可能的合理化。这是我在最近的项目中做的一点尝试,请大家提意见。
框架是这样做的:

  1. <!--#include file="../include/config.asp" -->
  2. <!--#include file="config.asp" -->
  3. <%
  4. '页程序块
  5. title_subhead="副标题"
  6. title_page="页面标题"
  7. title_cont=""
  8. title_ie=title_cont&title_page&title_subhead&title
  9. 'config_Login("s")
  10. '浏览权限:s为学生浏览 t为教师浏览 如果没有限制去掉改行

  11. 'str_info = Trim(Request.QueryString("str_info"))
  12. '警告和提示
  13. 'action = Trim(Request.QueryString("action"))
  14. '命令

  15. %>
  16. <!--#include file="../include/header.asp" -->
  17. <!--页面内容开始 -->
  18. <div class="str_info"><%= str_info %></div>
  19. <!--页面内容结束 -->
  20. <!--#include file="../include/footer.asp" -->
复制代码


大概说说结构:

../include/config.asp:相当于asp.net中的web.config,全局变量、函数、过程(包括数据库连接)都放到里面

config.asp:相当于asp.net子目录下的web.config,对当前目录的设置。比如每个目录的二级菜单不同,那么就在config里面分别设置二级菜单的变量。

<%'页程序块%>:把本页的asp程序写在一起,尽量做到程序和页面内容分开。当然不可避免的要在内容中嵌入变量或者函数,就相当于asp.net的自定义控件了。

../include/header.asp:也许看不到这个页面里的东西你不会觉得妙,但是我可以形容一下,里面有html代码的定义和head、body标签,还有网页的logo、menu等信息。当然如果有登录状态或者是二级菜单的化也要放到里面。总之,在网页上面公用的部分都在这个页里。

网页内容:里面就是html代码了,每页不同的部分都在这里。

../include/footer.asp:这里主要包含copyright之类的东西。

然后举例简单说明怎么用(基本上就算掏底了):
../include/header.asp

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
  5. <title><%= title_ie %></title>
  6. <%= link_feed %>
  7. <link href="../style/web.css" rel="stylesheet" type="text/css" />
  8. </head>
  9. <body>
  10. <div id="header">
  11. <div id="state"><% config_loginState %></div>
  12. <div id="anav"><% =config_anav %></div>
  13. <h1><%= title %></h1>
  14. <div id="subhead"><%= title_subhead %></div>
  15. <div id="menu"><% =config_menu %></div>
  16. <div id="nav"><% =config_nav %></div>
  17. </div>
  18. <div id="main">
  19. <div class="left">
  20. <h2><%= title_page %></h2>
复制代码


这是header里面的全部代码,里面所有的asp部分都是变量或者函数。大多数在各级config里面设置,少数比如title在config设置后,可能还需要在每页写个脚本,追加一部分。比如config里面已经设置了title="citywill.net",在某一页的程序块中可以这样追加title="我这样编写asp - "&title

这就是本人的做法,在实践中发现这样做比较高效,但是仍需不断的改善。请大家多多指教。

[ 本帖最后由 citywill 于 2006-7-18 13:08 编辑 ]
西部数码顶级域名注册商39元抢注!
cjj 

阳光锈了

荣誉管理 手机认证 

帖子
5893
体力
20915
威望
117
居住地
浙江省 嘉兴市
发表于 2006-7-18 08:57:26 |显示全部楼层
代码混杂、重用率低是代码工人自身的能力问题。在正规的项目中,真正的程序员是不会写出这样的代码的。
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

一滩死水

钻石会员

帖子
1063
体力
7305
威望
0
发表于 2006-7-18 09:13:17 |显示全部楼层
正解,这样的代码,看起来也累。。。
我一直哭一直哭,哭我没鞋穿。直到有一天我看到一个人,他连脚也没有……

使用道具 举报

帖子
371
体力
1296
威望
1
发表于 2006-7-18 09:23:49 |显示全部楼层
我的理解应该是模板、类、函数、过程;表现跟代码分离。不懂后台程序的前台设计人员只要能调用模块就可以了。
交流算法思路,讨代码者滚。

使用道具 举报

look80 
帖子
302
体力
381
威望
0
发表于 2006-7-18 09:26:22 |显示全部楼层
楼主的这代码写得有问题么?我觉得对于中小型企业站点应当能胜任了

那么2楼和3楼可否介绍下相关的经验呢?

使用道具 举报

帖子
31
体力
47
威望
0
发表于 2006-7-18 09:59:09 |显示全部楼层
2,3楼,,那你们是如何写代码的呢,,他的哪里出现问题了呢

使用道具 举报

帖子
28
体力
56
威望
0
发表于 2006-7-18 10:03:20 |显示全部楼层
我也希望能在这里讨点经验,这对我来说是个很严重的问题,谢谢!

使用道具 举报

好帅的爸爸

高级会员 手机认证 

帖子
360
体力
1348
威望
2
居住地
湖北省 武汉市
发表于 2006-7-18 10:34:28 |显示全部楼层
模块化,显示层和数据层分离!

使用道具 举报

好帅的爸爸

高级会员 手机认证 

帖子
360
体力
1348
威望
2
居住地
湖北省 武汉市
发表于 2006-7-18 10:36:02 |显示全部楼层
多加注释也是有必要的!!方便维护修改!!

使用道具 举报

cjj 

阳光锈了

荣誉管理 手机认证 

帖子
5893
体力
20915
威望
117
居住地
浙江省 嘉兴市
发表于 2006-7-18 10:52:59 |显示全部楼层

这是维护的自己的类库、函数库的一部分代码

作为程序员,相信每个人都有自己的函数库及类库。在做项目时,从库里面提取想要的函数及类。这样可以提高开发效率。

CJJ专用ASP类库中的某个class
  1.   '----******************** TConnString *****************************----
  2.   '数据库连接字符串结构体
  3.   Class TConnString
  4.       Public DBName,DBPath,DBServer,DBUser,DBPass,DBType
  5.   End Class
  6.   '----******************** TConnString *****************************----

  7.   '----********************* TDBOperate *****************************----
  8.   '通用数据库操作类
  9.   Class TDBOperate
  10.       Private cls_oConn,cls_oRS '类私有Connection对象、RecordSet对象
  11.       Private cls_sErrInfo,cls_sConn,cls_sSQL,cls_sURL,cls_sFormAction
  12.       Private cls_iPageSize '分页数
  13.       Private cls_lTotalPage,cls_lTotalRecord,cls_lPageNo

  14.       '类初始化
  15.       Private Sub Class_Initialize()
  16.       End Sub

  17.       '*****************************************
  18.           ' 类型:    属性
  19.       ' 目的:    根据获取的Connection String,创建数据库连接
  20.       ' 输入:    a_sConn:数据类型字符串
  21.       ' 返回:    无
  22.       '*****************************************
  23.       Public Property Let SetConn(a_sConn)
  24.           Dim sObjType


  25.           sObjType = LCase(TypeName(a_sConn))
  26.           If sObjType <> "string" Then
  27.               cls_sErrInfo = cls_sErrInfo & "<li>SetConn:非法的字符串参数</li>" & Chr(10)
  28.               Exit Property
  29.           End If

  30.           Set cls_oConn = CreateObject("Adodb.Connection")
  31.           On Error Resume Next
  32.           cls_oConn.Open a_sConn
  33.            If Err Then
  34.               Err.Clear
  35.               Set cls_oConn = Nothing
  36.               On error goto 0
  37.               cls_sErrInfo = cls_sErrInfo & "<li>数据库连接出错</li>" & Chr(10)
  38.           End If
  39.           On Error Goto 0
  40.           End Property
  41.       
  42.       '*****************************************
  43.           ' 类型:    属性
  44.       ' 目的:    根据获取的Connection对象,创建数据库连接
  45.       ' 输入:    a_oConn:数据类型字符串
  46.       ' 返回:    无
  47.       '*****************************************
  48.       Public Property Set SetConn(a_oConn)
  49.           Dim sObjType,sConn
  50.           Dim oConnStr
  51.       
  52.           sObjType = LCase(TypeName(a_oConn))
  53.    
  54.           Select Case sObjType
  55.           Case "connection"
  56.               '设置Connection对象
  57.               Set cls_oConn = a_oConn
  58.           Case "tconnstring"
  59.              sConn = ""
  60.              Set oConnStr = a_oConn
  61.              Select Case (oConnStr.DBType)
  62.                      Case gbl_iDB_Access
  63.                   sConn = "Provider = micorsoft.jet.oledb.4.0; User ID = " & oConnStr.DBUser & "; Password = " & Replace(oConnStr.DBPass, Chr(0), "") & ";Initial Catalog = " & oConnStr.DBName & "; Data Source = " & SqlLocalName & ";"
  64.                       Case gbl_iDB_MsSQL
  65.                   sConn = "Provider = Sqloledb; User ID = " & oConnStr.DBUser & "; Password = " & Replace(oConnStr.DBPass, Chr(0), "") & ";Initial Catalog = " & oConnStr.DBName & "; Data Source = " & oConnStr.DBServer & ";"
  66.                       End Select
  67.    
  68.               If sConn = "" Then
  69.                   cls_sErrInfo = cls_sErrInfo & "<li>数据库连接对象出错,无法创建Connection对象</li>" & Chr(10)
  70.                   Exit Property
  71.               End If

  72.              '设置Connection连接串值,供ConnStr属性返回
  73.               cls_sConn = sConn
  74.       
  75.               Set cls_oConn = CreateObject("Adodb.Connection")
  76.               On Error Resume Next
  77.               cls_oConn.Open sConn
  78.                If Err Then
  79.                   Err.Clear
  80.                   Set cls_oConn = Nothing
  81.                   cls_sErrInfo = cls_sErrInfo & "<li>数据库连接出错</li>" & Chr(10)
  82.               End If
  83.               On Error Goto 0
  84.           Case Else
  85.               cls_sErrInfo = cls_sErrInfo & "<li>SetConn:非法的对象参数</li>" & Chr(10)
  86.               Exit Property
  87.           End Select
  88.       End Property

  89.       '*****************************************
  90.           ' 类型:    属性
  91.       ' 目的:    设置RecordSet对象
  92.       ' 输入:    a_sSQL:   SQL语句。
  93.       ' 返回:    无。
  94.       '*****************************************
  95.           Public Property Let SetRS(a_sSQL)
  96.           If LCase(TypeName(cls_oConn)) <> "connection" Then
  97.               cls_sErrInfo = cls_sErrInfo & "<li>非法的Connection对象,无法创建RecordSet对象</li>" & Chr(10)
  98.               Exit Property
  99.           End If
  100.   
  101.                   cls_sSQL = a_sSQL

  102.           '创建RecordSet对象
  103.               Set cls_oRS = CreateObject("Adodb.RecordSet")


  104. '          On Error Resume Next
  105.                   cls_oRS.Open cls_sSQL,cls_oConn,1,1
  106. '          On Error Goto 0
  107.           End Property

  108.       '*****************************************
  109.       ' 类型:    属性
  110.       ' 目的:    设置RecordSet对象
  111.       ' 输入:    a_oRS:   RecordSet对象
  112.       ' 返回:    无。
  113.       '*****************************************
  114.       Public Property Set SetRS(a_oRS)
  115.           If LCase(TypeName(a_oRS))<>"recordset" Then
  116.               cls_sErrInfo = cls_sErrInfo & "<li>非法的RecordSet对象</li>" & Chr(10)
  117.               Exit Property
  118.           End If

  119.           '设置RecordSet对象
  120.           Set cls_oRS = a_oRS
  121.       End Property

  122.       '*****************************************
  123.       ' 类型:    属性
  124.       ' 目的:    设置RecordSet对象
  125.       ' 输入:    a_oRS:   RecordSet对象
  126.       ' 返回:   返回一RecordSet对象
  127.       '*****************************************
  128.       Public Property Get GetRS()
  129.           Set GetRS = cls_oRS
  130.       End Property

  131.       '获取Connection对象
  132.       Public Property Get GetConn()
  133.           If cls_sErrInfo <> "" Then
  134.               Call ShowError()
  135.           End If
  136.    
  137.           If LCase(TypeName(cls_oConn))<>"connection" Then
  138.               cls_sErrInfo = cls_sErrInfo & "<li>Connection对象获取失败</li>"
  139. '              Exit Property              
  140.           End If
  141.    
  142.           Set GetConn = cls_oConn
  143.       End Property

  144.       '返回数据库连接字符串
  145.       Public Property Get ConnStr
  146.           ConnStr = cls_sConn
  147.       End Property
  148.   
  149.       '设置第个页面显示的数据数
  150.       Public Property Let PageSize(a_iPageSize)
  151.           If Not IsNumeric(a_iPageSize) Then
  152.               cls_sErrInfo = cls_sErrInfo & "<li>无效的分页记录数参数</li>" & Chr(10)
  153.               Exit Property
  154.           End If
  155.   
  156.           cls_iPageSize = a_iPageSize
  157.       End Property
  158.       
  159.       '设置SQL语句,用于建立RecordSet对象
  160.       Public Property Let SQL(a_sSQL)
  161.            If IsNone(a_sSQL) Then
  162.               cls_sErrInfo = cls_sErrInfo & "<li>没有设置SQL,无法创建RecordSet对象</li>" & Chr(10)
  163.               Exit Property
  164.           End If

  165.           cls_sSQL = Trim(a_sSQL)
  166.       End Property

  167.       '执行数据操作
  168.       Public Sub Execute()
  169.           If cls_sErrInfo <> "" Then
  170.               ShowError("<ul>" & Chr(10) & cls_sErrInfo & "</ul>" & Chr(10))
  171.               Exit Sub
  172.           End If

  173.           If LCase(TypeName(cls_oConn))="connection" Then
  174.               If IsNumeric(cls_iPageSize) Then
  175.                   Set cls_oRS =  CreateObject("Adodb.RecordSet")
  176.                   cls_oRS.Open cls_sSQL,cls_oConn,1,1
  177.               Else
  178.               End If
  179.           Else
  180.               cls_sErrInfo = cls_sErrInfo & "<li>非法的Connection对象</li>" & Chr(10)
  181.           End If
  182.       End Sub

  183.       '*****************************************
  184.           ' 类型:    属性
  185.       ' 目的:    设定或显示URL。
  186.       ' 输入:    a_sURL:   需要分页的文件地址。
  187.       ' 返回:    无
  188.       '*****************************************
  189.           Public Property Let URL(ByVal a_sURL)
  190.           cls_sURL = a_sURL
  191.           End Property

  192.           '*****************************************
  193.           ' 类型:    过程
  194.       ' 目的:    统计总记录数、计算总页数
  195.       ' 输入:    无
  196.       ' 返回:    无
  197.       '*****************************************
  198.           Private Sub Pagination(ByVal a_sStr)
  199.           Dim iPosition,cls_sErrInfo,i,oRS_Temp,lTotalRecord

  200.           If cls_sErrInfo <> "" Then
  201.                          Call ShowErrors()
  202.                          Exit Sub
  203.           End If

  204.                   If cls_oRS.Eof And cls_oRS.Bof Then
  205.              cls_sErrInfo = cls_sErrInfo & "<li>库中无任何记录</li>"
  206.           End If

  207.                   '计算总计录数
  208.           Select Case LCase(TypeName(a_sStr))
  209.           Case "string"
  210.                Set oRS_Temp = cls_oConn.Execute(a_sStr)
  211.                lTotalRecord = CLng(oRS_Temp(0).Value)
  212.           Case "integer"
  213.               Select Case (Int(Trim(a_sStr)))
  214.               Case gbl_iPagination_UseRcdCount '使的RecordCount方法进行分页
  215.                   lTotalRecord = cls_oRS.RecordCount
  216.               Case gbl_iPagination_UsePgCount  '使用PageCount方法进行分页
  217.                   lTotalRecord = cls_oRS.PageCount * cls_iPageSize
  218.               End Select
  219.           End Select
  220.   
  221.                   cls_lTotalRecord = lTotalRecord
  222.           If (cls_lTotalRecord<=2147483647 AND cls_lTotalRecord>=-2147483648) Then
  223.               cls_lTotalRecord = CLng(cls_lTotalRecord)
  224.           Else
  225.               cls_lTotalRecord = 2147483647
  226.                   End If

  227.           If cls_lTotalRecord <0 Then
  228.               cls_lTotalRecord = 0
  229.           End If

  230.                   '计算总页数
  231.           If cls_lTotalRecord Mod cls_iPageSize = 0 Then
  232.                       cls_lTotalPage = CLng(cls_lTotalRecord \ cls_iPageSize * -1)*-1
  233.           Else
  234.                           cls_lTotalPage = CLng(cls_lTotalRecord \ cls_iPageSize * -1)*-1 + 1
  235.           End If

  236.                   '获取当前页参数
  237.                   cls_lPageNo = Trim(Request.QueryString("Page"))
  238.                   If cls_lPageNo = "" Then
  239.               cls_lPageNo = Trim(Request.Form("Page"))
  240.                          If cls_lPageNo = "" Then
  241.                  cls_lPageNo = 1
  242.               End If
  243.           End If
  244.    
  245.           '如果没有选择第几页,则默认显示第一页
  246.           If cls_lPageNo <> "" And IsNumeric(cls_lPageNo) Then
  247.               If (cls_lPageNo <= 2147483647 And cls_lPageNo>=-2147483648) Then
  248.                   cls_lPageNo = CLng(cls_lPageNo)
  249.               Else
  250.                   cls_lPageNo = 2147483647
  251.                             End If
  252.                           If (cls_lPageNo<=0) Then
  253.                   cls_lPageNo = 1
  254.               End If
  255.           Else '当前页参数为空或者非数字,默认将转到第1页
  256.               cls_lPageNo=1
  257.               End If

  258.                   If (cls_lPageNo > cls_lTotalPage AND cls_lTotalPage<>0) Then
  259.               cls_lPageNo = cls_lTotalPage
  260.           End If

  261.           cls_oRS.PageSize     = cls_iPageSize
  262.               cls_oRS.AbsolutePage = cls_lPageNo

  263.                   iPosition = InstrRev(cls_sURL,"?")
  264.               cls_sFormAction = cls_sURL
  265.               If iPosition > 0 Then
  266.                   cls_sURL = cls_sURL & "&Page="
  267.           Else
  268.                   cls_sURL = cls_sURL & "?Page="
  269.               End If
  270.          End Sub
  271.       
  272.       '*****************************************
  273.       ' 类型:    过程
  274.       ' 目的:    显示分页信息
  275.       ' 输入:    无
  276.       ' 返回:    无
  277.       '*****************************************
  278.       Public Sub Pages(ByVal a_sStr)
  279.           Dim strPages,k,intTemp,intTemp1
  280.           Dim sResult

  281.           If Not IsNone(cls_sErrInfo) Then
  282.               Call ShowErrors()
  283.           End If
  284.         
  285.           '计算总页数及总记录数
  286.           Call Pagination(a_sStr)

  287.           If cls_lTotalPage = 1 Then Exit Sub
  288.           sResult = sResult & "<table class=""clsShowPage"">" & Chr(10)
  289.           sResult = sResult & "  <tr>" & Chr(10) & "    <td>" & Chr(10)
  290.           sResult = sResult & "      <table width=""100%"">" & Chr(10)
  291.           sResult = sResult & "         <tr>" & Chr(10) & "           <td class=""PageText"">" & Chr(10)

  292.           If cls_lTotalPage >= 1 Then

  293.                   If cls_lPageNo <= 1 Then
  294.                       sResult = sResult & "首页 前页 <a href=""" & cls_sURL & cls_lPageNo+1 & """>后页</a> <a href=""" & cls_sURL & cls_lTotalPage & """>末页</a>" & Chr(10)
  295.                       Else
  296.                               If cls_lPageNo >= cls_lTotalPage Then
  297.                           sResult = sResult & "<a href=""" & cls_sURL & "1"">首页</a>  <a href=""" & cls_sURL  & cls_lPageNo -1 & """>前页</a>  " & "后页  末页" & Chr(10)
  298.                       Else
  299.                           sResult = sResult & "<a href=""" & cls_sURL & "1"">首页</a> <a href=""" & cls_sURL  & cls_lPageNo -1 & """>前页</a> " & "<a href=""" & cls_sURL  & cls_lPageNo+1 & """>后页</a> <a href=""" & cls_sURL  & cls_lTotalPage & """>末页</a>" & Chr(10)
  300.                           End If
  301.                       End If
  302.                       sResult = sResult & " 页次:<strong>" & cls_lPageNo & "</strong>/" & cls_lTotalPage & "页 共<strong>" & cls_lTotalRecord & "</strong>条记录 <strong>" & cls_iPageSize & "</strong>条/页</td>" & Chr(10)
  303.                   sResult = sResult & "      <form name=""gopage"" action=""" & cls_sFormAction & """ method=""post"">" & Chr(10)
  304.                   sResult = sResult & "      <td> 第"
  305.                               sResult = sResult & "    <input type=""text"" name=""pageno"" class=""InputPage"" title=""请输入页号,然后回车"">页 " & Chr(10)
  306.                   sResult = sResult & "<input type=""submit"" class=""GotoPage"" value=""GO""></td></form></tr>" & Chr(10)
  307.                   End If
  308.           sResult = sResult & "      </table>" & Chr(10) & "    </td>" & Chr(10) & "  </tr>" & Chr(10) & "</table>" & Chr(10)

  309.           '输出分页信息
  310.           Response.Write("result:" & sResult)
  311.       End Sub

  312.       '类销毁
  313.       Private Sub Class_Terminate()     
  314.           If LCase(TypeName(cls_oConn))<>"nothing" Then
  315.               cls_oConn.Close
  316.               Set cls_oConn = Nothing
  317.           End If
  318.   
  319.           If LCase(TypeName(cls_oRS))<>"nothing" Then
  320.        '       cls_oRS.Close
  321.               Set cls_oRS = Nothing
  322.           End If
  323.       End Sub


  324.           '*****************************************
  325.           ' 类型:    过程
  326.       ' 目的:    显示分页类中出现的错误信息
  327.       ' 输入:    无
  328.       ' 返回:    无
  329.       '*****************************************
  330.           Private Sub ShowErrors()
  331.               If cls_cls_sErrInfo <> "" Then
  332.               cls_cls_sErrInfo = "<ul>" & Chr(10) & cls_sErrInfo & "</ul>" & Chr(10)
  333.               Response.Write(cls_cls_sErrInfo)
  334.                       Response.End
  335.                   End If
  336.           End Sub
  337.   End Class
  338.   '----********************* TDBOperate *****************************----
复制代码


我自己的函数库中的某两个函数的代码
  1.   '**********************************************
  2.   ' 类型:函数
  3.   ' 目的:判断E-MAIL地址是否正确
  4.   ' 参数:a_sEmail,待检测的E-Mail地址
  5.   ' 返回: ture或false
  6.   ' 作者:cjj
  7.   ' 时间:2006-6-14
  8.   ' 版本:v1.0
  9.   ' 备注:(记录过程或函数的修改说明)
  10.   '**********************************************
  11.   Function isEmail(ByVal a_sEmail)
  12.       Dim sEmail
  13.       Dim iPos,i

  14.       ' 函数默认返回值
  15.       isEmail = false
  16.       sEmail = Trim(a_sEmail)
  17.   
  18.       If Instr(sEmail,"@") <1 Or Instr(sEmail,".") <1 Then
  19.           Exit Function
  20.       End If

  21.       iPos = Instr(sEmail,"@")

  22.       If iPos>=Instr(iPos+1,sEmail,".") Then
  23.           Exit Function
  24.       End If

  25.        '函数返回值
  26.        isEmail=true
  27.   End Function

  28.   '**********************************************
  29.   ' 类型:函数
  30.   ' 目的:显示服务器端信息
  31.   ' 参数:无
  32.   ' 返回:往客户端输出服务器端信息table
  33.   ' 作者:cjj
  34.   ' 时间:2006-6-14
  35.   ' 版本:v1.0
  36.   ' 备注:(记录过程或函数的修改说明)
  37.   '**********************************************
  38.   Sub ViewServerInfo()
  39.       Dim sName,sHtml
  40.   
  41.       sHtml = "<Table border=1 bordercolor=lightblue CELLSPACING=0>" & Chr(10)

  42.       For Each sName In Request.ServerVariables
  43.           sHtml = sHtml & "  <tr>" & Chr(10)
  44.           sHtml = sHtml & "    <td>" & sName & "</td>" & Chr(10)
  45.           sHtml = sHtml & "    <td>" & Request.ServerVariables(sName) & "</td>" & Chr(10)
  46.           sHtml = sHtml & "  </tr>" & Chr(10)
  47.       Next

  48.       sHtml = sHtml & "</table>" & Chr(10)

  49.       '往客户端输出信息
  50.       Response.Write(sHtml)
  51.   End Sub
复制代码

使用道具 举报

cjj 

阳光锈了

荣誉管理 手机认证 

帖子
5893
体力
20915
威望
117
居住地
浙江省 嘉兴市
发表于 2006-7-18 11:24:56 |显示全部楼层

稍提一个编码风格

个人觉得代码混排是个鸡肋,混排的可读性差,所以我一般都只是少量混排,尽量将代码和HTML分离。
  1. <!--#include file="pubdb.asp"-->
  2. <%  
  3.   '*****************************************
  4.   '类型:函数
  5.   '目的:报错
  6.   '参数:
  7.   'a_num:报错信息参数
  8.   '*****************************************
  9.   Private Function ShowError(a_Num)
  10.       Dim sErrInfo

  11.       sErrInfo = ""
  12.       Response.Write("<p>Error Number:era_" & a_Num & "</p>")
  13.       Select Case a_Num
  14.       Case "1000"
  15.           sErrInfo = "参数类型不正确,请检查"
  16.       Case "1100"
  17.               sErrInfo = "无法打开数据库连接"
  18.       Case Else
  19.           sErrInfo = "发现未知错误,请与管理员联系"
  20.       End Select
  21.       sErrInfo = "<p>Error Description:" & sErrInfo & "</p>"
  22.       Response.Write(sErrInfo)
  23.       Response.End
  24.   End Function

  25.   Dim oRS,sHtml

  26.   Call OpenDB()
  27.   Set oRS = oConn.OpenSchema(20)
  28.   sHtml=""
  29.   oRS.MoveFirst

  30.   '循环读取数据库中的表名
  31.   Do While Not oRS.EOF
  32.           If UCase(oRS(3))="TABLE" Then
  33.           sTemp = Trim(oRS(2))
  34.           If sTBName = sTemp Then
  35.               sHtml= sHtml & Space(2) & "<option value=""" & sTemp & """ selected=""selected"">" & sTemp & "</option>" & Chr(10)
  36.           Else
  37.               sHtml= sHtml & Space(2) & "<option value=""" & sTemp & """>" & sTemp & "</option>" & Chr(10)
  38.           End If
  39.       End If
  40.       oRS.MoveNext
  41.   Loop
  42.   Call CloseDB()
  43. %>

  44. <html>
  45. <head>
  46. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
  47. <title>数据库名</title>
  48. <script type="text/javascript">
  49. <!--
  50.     var sDstID="";
  51.     function serverResult(a_sUrl,a_sSrcID,a_sDstID) {
  52.        var sValue = document.getElementById(a_sSrcID).value;
  53.        sDstID=a_sDstID;
  54.        if ((sValue == null) || (sValue == "")) return;
  55.    
  56.        var sUrl = a_sUrl+sValue;
  57.        oXml.open("GET", sUrl,true);
  58.        oXml.onreadystatechange = updateData;
  59.        oXml.send(null);  
  60.     }

  61.     function updateData() {

  62.         var aElmnts = sDstID.split(',');
  63.         var oElmnt = null;
  64.         var aTags=null;
  65.         var oXmlData=null;

  66.         if ((oXml.readyState == 4) && (oXml.status == 200)) {
  67.             aTags = oXml.responseXML.documentElement.getElementsByTagName("cjjitem");
  68.             if (aTags.length!=aElmnts.length) {
  69.                 alert('获取的服务器端的数据错误!');
  70.                 return null;
  71.             }
  72.    
  73.             for (var i=0;i<aElmnts.length ;i++ ) {
  74.                 oElmnt = document.getElementById(aElmnts[i]);
  75.                 oElmnt.innerHTML=aTags[i].firstChild.data;
  76.             }
  77.         }
  78.         return true;
  79.     }

  80.     var oXml = false;
  81.     if (window.ActiveXObject) {
  82.         oXml = new ActiveXObject("Microsoft.XMLHTTP");
  83.     } else if (window.XMLHttpRequest) {
  84.         oXml=new XMLHttpRequest();
  85.     }
  86. //-->
  87. </script>
  88. </head>
  89. <body>
  90. <form method="POST" name="form1" action="addFormData.asp">
  91.         <p> </p>
  92.         <p>数据库名:<input type="text" name="txtDBName" size="7" value="work"> 数据库用户名:<input type="text" name="DBUserName" size="8" value="sa">数据库密码:<input type="password" name="DBUserPassWord" size="10" value=""> 数据库服务器路径:<input type="text" name="DBServerPath" size="20" value="127.0.0.1"></p>
  93.         <p>数据表名:<select size="1" id="sltTBName" name="sltTBName" onchange="serverResult('getFieldList.asp?n=','sltTBName','fieldcount,tblFields');">
  94.         <option selected="selected">请选择一个表</option>
  95.         <%=sHtml%>
  96.         </select></p>

  97. <div id="fieldcount">表字段个数:<input type="text" id="txtFldCount" name="txtFldCount" value="0" /></div>
  98.   <table id="tblFields" border="1" width="91%">
  99.     <thead>
  100.                 <tr>
  101.                         <td align="center" width="94">字段名</td>
  102.                         <td align="center" width="113">字段类型</td>
  103.                         <td width="27" align="center">使用</td>
  104.                         <td width="18" align="center">只读</td>
  105.                         <td align="center" width="80">表单项类型</td>
  106.                         <td align="center" width="100">表单项名称</td>
  107.                         <td align="center" width="92">表单项描述</td>
  108.                         <td align="center" width="87">表单项验证</td>
  109.                         <td align="center">表单项默认值</td>
  110.                 </tr>
  111.      </thead>
  112.      <tbody>
  113.      </tbody>
  114.         </table>
  115.         <p align="left">需要生成的动态ASP网页类型:<select size="1" name="sltAspType">
  116.         <option value="0">数据添加</option>
  117.         <option value="1">数据编辑</option>
  118.         <option value="2">数据删除</option>
  119.         <option value="3">数据管理</option>
  120.         <option value="4">数据列表</option>
  121.         </select> 文件名:<input type="text" name="txtFileName" size="17" value="">
  122.         文件类型:<select size="1" name="sltFileType">
  123.         <option value="ASP">ASP</option>
  124.         <option value="PHP">PHP</option>
  125.         <option value="JSP">JSP</option>
  126.         <option value="PERL">PERL</option>
  127.         <option value="VB.NET">VB.NET</option>
  128.         <option value="C#">C#</option>
  129.         </select>
  130.         <input type="submit" value="生成文件" name="action"></p>
  131. </form>
  132. </body>
  133. </html>
复制代码


编程我们要明确自己要达到什么目的,分几步走,想清楚了再开始写,不然直接信手写下去,这个程序十有八、九要重构过。明确目的后,大致构思一些实现的思路,然后按造这个思路去解决。

写代码时需要注意养成一种良好的编码风格,这样写出来的代码可读性比较强。我稍微提一个变量命名风格,变量类型+变量名。我比较懒,所以我一般都通过一个小写字母来标识变量的类型,Integer型用小写i,如iCount;String型用小写s,如sStr等等。碰上一些第一个字母相同,则常用的类型用每一个字段,不常用的类型除了取每一个字母外再加紧跟的第二个字段,如Boolean和Binary,那我就用b表示布尔型用bi表示二进制,依此类推。如果是全局型变量我就给它加gbl前缀,如果是class级给它加上cls前缀。如:iTemp,cls_iTemp(class级变量),gbl_iTemp(全局变量)。变量名一定要表达清楚意思,哪种名称比较常,这样不会给其它阅读的人造成困扰,不需要花太多时间去研究你的代码。
变量名中第一位小写字母简写说明
   a  : Array
   b  : Boolean
   bi : Binary
   by : Byte
   c  : Const
   ch : Char
   d  : DateTime
   i  : Integer
   l  : Long
   o  : Object
   s  : String
   v  : Variant
变量名前缀说明
   a   : 函数或过程中的参数,如 a_sName
   cls : CLASS级变量,如 cls_sUser
   gbl : 全局变量,如 gbl_sSiteName

[ 本帖最后由 cjj 于 2006-7-18 11:26 编辑 ]

使用道具 举报

5do8 

老农

荣誉管理 手机认证 

帖子
3861
体力
5998
威望
105
发表于 2006-7-18 13:02:37 |显示全部楼层
1:楼主的代码习惯还是初级水平的。按照您提到的习惯,如使用php等中的模板就解决你的问题了,其实,不然,真正高效 的程序是在处理业务的流程上,就是先经过大脑深思熟虑过,加上代码经验,写出来的代码没有差的。别被表面的一下东西迷惑,只有写了n多的项目以后你才能体会到的。

2:cjj提供的那个函数不错,copy下来先。



----》编辑

cjjer--》cjj,我写惯了,就把用户名些错了,31别介意,呵呵。

[ 本帖最后由 5do8 于 2006-7-18 13:42 编辑 ]
死党开的运动户外专营店,买的时候说blueidea的,打折!哈

使用道具 举报

娃哈哈.COM

荣誉管理

帖子
14172
体力
34824
威望
62
居住地
天津市 南开区
发表于 2006-7-18 13:36:18 |显示全部楼层
asp这东西没办法,不混排的话,看着好香模块化了,但是你要是改界面就麻烦了……东一块西一块的。
哇嘎嘎……
毛绒玩具的卖~~~

使用道具 举报

citywill 楼主
帖子
196
体力
690
威望
7
居住地
吉林省 长春市
发表于 2006-7-18 13:37:33 |显示全部楼层
感谢朋友们的回复,看后得到了很多启发。特别感谢cjjer,很荣幸能够抛砖引玉。而且发现,我和cjjer在分页的处理上十分的相似。

但是要说明下:

1.我所展示的代码,实际是系统的“前台”,我所考虑的也只是如何高效的衔接前后台(也就是静态和动态分离)。类和函数我当然也要用,都在<!--#include file="../include/config.asp" -->里面。

2.关于前后台的衔接,asp.net和php环境都有很好的用模板解决的方案,但是asp没有(可以说asp匮乏的可怜)。大家也都知道用include,我只是提供了一个用include的技巧而已。

3.如果你是一个纯粹的程序员,从来不用考虑前台的话,那么模块化也就没有什么意义了,大可以把工作重心放在类和函数上(可是asp又不面向对象)。

4.asp是个古老的语言了,但是看样子还没到消失的时候;)。

[ 本帖最后由 citywill 于 2006-7-18 13:41 编辑 ]

使用道具 举报

cjj 

阳光锈了

荣誉管理 手机认证 

帖子
5893
体力
20915
威望
117
居住地
浙江省 嘉兴市
发表于 2006-7-18 14:37:10 |显示全部楼层
小雨说的界面问题,不仅仅是ASP,PHP也同样存在。关于模版PHP中有个SMARTY,ASP中也完全可以照样写一个。界面交给CSS就行了。改界面的话,只要改CSS文件,不涉及到程序,楼主的代码中也是这样做的。

ASP中用ADODB.STREAM,可以实现按需INCLUDE。

ASP中可以用python或javascript实现面向对象的编程。所以说ASP不支持面向对象是错误的说法。

[ 本帖最后由 cjj 于 2006-7-18 14:43 编辑 ]

使用道具 举报

帖子
286
体力
1177
威望
0
发表于 2006-7-18 15:06:54 |显示全部楼层
楼主,抓紧时间学习ASP.NET,不要再在研究ASP上浪费时间了。

使用道具 举报

mmfy 

迷失

钻石会员

帖子
1467
体力
5247
威望
0
发表于 2006-7-18 15:56:40 |显示全部楼层
9494,asp先天不足很难在开发模式上取得突破,不过小型的站点建议还是用asp来的简单,嘿嘿,不要听别人说asp怎么样怎么样,他既然还存在就有他存在的理由

使用道具 举报

晓风寒月

银牌会员 手机认证 

帖子
497
体力
2375
威望
1
居住地
四川省 成都市
发表于 2006-7-18 18:10:06 |显示全部楼层
学习学习。

现在准备学习.net   自学 所以中间有些东西不是很清楚。
半壺水 響叮噹

涓涓細流 長流不息

使用道具 举报

帖子
28
体力
62
威望
0
发表于 2006-7-18 21:27:25 |显示全部楼层
很不错啊,我支持,我也喜欢ASP,我通常把可以重复使用的称为模块,然后尽量减少重复写代码的辛苦,同时结构也更清晰!
寻找属于我的答案!

使用道具 举报

asp910 

蓝色尘埃

银牌会员

帖子
710
体力
1983
威望
7
居住地
湖南省 长沙市
发表于 2006-7-19 11:23:04 |显示全部楼层
个人感觉还是Java的MVC三层架构做的好,代码跟HTML都分离开了,在辅用
一些Struts等等什么的框架,这样就更好了
不足的一点就是现在很多编辑器对Struts的编辑视图不怎么支持,看不到效果
曾经沧海难为水,除却巫山不是云.

使用道具 举报

帖子
390
体力
1121
威望
0
发表于 2006-7-19 15:17:20 |显示全部楼层

唉~~~

有钱了,什么都一样。程序员又怎样呢?一样是“民工”。
http://www.fo128.com/blog/

使用道具 举报

wgh001 
帖子
373
体力
752
威望
1
居住地
福建省 厦门市
发表于 2006-7-20 13:15:51 |显示全部楼层
市场的今天,不是往日了

使用道具 举报

citywill 楼主
帖子
196
体力
690
威望
7
居住地
吉林省 长春市
发表于 2006-7-20 13:46:17 |显示全部楼层
呵呵,越扯越远了。
我也正在学习.net。
php .net java 毋庸置疑要比asp强大易用。但是这里讨论的是在asp的框架下,如何能做到最接近.net。或者说让代码工人获得更大的解放。

使用道具 举报

帖子
81
体力
194
威望
0
居住地
陕西省 西安市
发表于 2006-7-20 14:07:52 |显示全部楼层
写代码到了最后就是一个构架的问题,思想没跟上,再好的语言也没用,严重支持这样的介绍经验的帖子!

使用道具 举报

cjj 

阳光锈了

荣誉管理 手机认证 

帖子
5893
体力
20915
威望
117
居住地
浙江省 嘉兴市
发表于 2006-8-21 15:18:12 |显示全部楼层
同意楼上的话,写代码到最后讲究的是设计了,一个项目设计得好的话,开发方便,日后的维护简单,省时省力。语言不重要了,到一定的能力,花个把小时就可以上手新的语言了。

使用道具 举报

帖子
921
体力
3168
威望
0
居住地
天津市 南开区
发表于 2006-8-21 15:29:27 |显示全部楼层
似乎用JS来写那写常用函数更好一些..比如把prototype.js放到SERVER端都可以用...也更面向对象一些...
桃花运啊桃花劫...

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 09:28 , Processed in 0.162490 second(s), 10 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部