• [导入]从ASP的极限思维到ASP.net(第一部份)


    第一部份:传统的ASP技术

    一、ASP响应用户请求

           传统的ASP页面一般是在用户请求某个页面的时候,通过程序向用户返回一些HTML内容。例如:

    Exam-001.asp

    <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>

    <%

    Response.Write("这是<b>ASP</b>页面返回的信息!现在服务器的时间是:"&Now()&"<br>")

    %>

    这是<b>HTML</b>的信息!

    当用户请求Exam_001.asp后,得到的HTML内容为:

    这是<b>ASP</b>页面返回的信息!现在服务器的时间是:2005-2-6 23:33:34<br>

    这是<b>HTML</b>的信息!

    这是最简单的方法,就是当用户请求一个页面的时候,就用这个页面来完成某个事情,然后把事情的处理结果告诉请求者。而本例子则是把请求时的服务器时间返回给请求者。于是在传统的ASP网站中,往往就是一个ASP文件完成一件事情。这样一来感觉上事情清晰明了。如我们常常可以看到一些网站的ASP程序如下:reg.aspedit_data.aspsave_data.aspdelete_data.asp等。明显的可能就是一个用户注册,资料编辑,资料保存和一个资料删除程序。当然,如果一个网站功能不是很多,像这样的完成一些事情也还过得去。但如果事务多起来的时候,就明显的ASP文件会很多。但每一个文件可能只有几K到几十K,因为根据事情来决定ASP程序的长度!

    一般有三种方法来请求一个页面。一是直接输入这个文件的名,如:http://server_name/exam_001.asp 第二种方法就是通过链接到这个文件,其实这与直接输入文件名的效果是一样的!但我们可以在链接后加一些参数(在后面将详细说明如何取得用户参数)。第三种方法是通过HTMLform标签的action属性指定到这个文件,同时也可以传递一些参数。其中我们对第三种情况举一个例子:

    Exam-002.asp

    <form name="form1" method="post" action="exam-001.asp">

      点击到exam-001.asp

      <input type="submit" name="Submit" value="点击">

    </form>

           当用户点击“点击”按钮的时候就会请求到Exam-001.asp文件。最后会得到Exam-001.asp文件所返回的信息。我们可以在同一个form内添加多个submit按钮,但不管点击哪个,都将会返回formaction所指示的页面内容。但这为我们打开了一个思路,我们可不可以用同一个form来得到不同的页面呢?显然是可以的,而我们一般采用的是DHTML方法,也就是动态的改变formaction内容。例:

    Exam-003.asp

    <form name="form1" method="post" action="">

           This page exam-003.asp<br>

      <input type="submit" name="Submit2" value="exam-001.asp"

      onClick="change_action('exam-001.asp')">

      <input type="submit" name="Submit3" value="exam-002.asp"

      onClick="change_action('exam-002.asp')">

      <input type="submit" name="Submit" value="This page"

      onClick="change_action('exam-003.asp')">

    </form>

    <script language="JavaScript">

    <!--

           function change_action(m_actions){

           //     alert(m_actions);

                  form1.action=m_actions;

           }

    -->

    </script>

           这样,当我们点击不同的按钮的时候,就可以到不同的页面上去了!而这每个按钮都是submit的属性。同是要说一下的是,如果formaction属性没有赋值的时候就会是向当前页面发送请求,同时也会返回当前页面的内容。

    ASP.net的读者注意了:很多ASP.net的读者不明白,为什么ASP.net页面里经常会有很多的submit按钮,它们不会混淆吗?看了这个例子就应该明白,只要我们自己控制好每个submit的属性,它们是不会混淆的。而好在ASP.net里不用我们自己去管理这些submit是怎样协调工作的,我们只用知道,一个form里是可以有多个submit的,而且每个submit的事情也是可以不一样的。

     

    二、取得用户参数

           ASP的成功之处就是可以方便快捷的与用户进行交互!我们一般用以下几种方法取得用户提供给程序的一些参数。一是通过在文件请求的后面加上变量名和参数,如:http://setver_name/exam-004.asp?m_name=张三&m_age=19 这样用户就将两个变量m_namem_ageget方法传递给了程序exam-004.asp。但程序用不用还是另外一回事,一般我们采用Request.QueryString()来取得变量!例如:

    Exam-004.asp

    <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>

    <%

           s_name   =Request.QueryString("m_name")

           s_age      =Request.QueryString("m_age")

           Response.Write("<font color=red>"&s_name&"</font>("&s_age&")您好!")

    %>

    http://server_name/exam-004.asp?m_name=张三&m_age=25来请求页面的时候可以得到以下HTML内容:

    <font color=red>张三</font>(25)您好!

    第二种方法是通过form来传递参数!我们用Request.Form()来取得变量。例如:

    exam-005.asp

    <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>

    <%

           s_name   =Request.Form("m_name")

           s_age      =Request.Form("m_age")

           Response.Write("<font color=red>"&s_name&"</font>("&s_age&")您好!<br>")

    %>

    <form name="form1" method="post" action="">

      姓名:

      <input name="m_name" type="text" id="m_name" size="10">

      年龄:

      <input name="m_age" type="text" size="10">

      <input type="submit" name="Submit" value="提交">

    </form>

           这个例子用自己来处理用户提交的参数!一般用form传递数据的方法都是post

    POSTGET的区别:很多人不明白,这两种参数传递到底有什么区别。GET方法一般传递的数据较少!变量名及一些值会在请求文件的后面跟出来。其实就是第一种方法传递参数。而POST则传递的数据内容多一些,而且不会在文件名后面跟出来。所以GET不能用Request.Form()来取得参数。应该用什么?读者可以自己想想。那么POST方法是不是比GET方法安全一些呢?因为它的变量及值不给在文件名后面跟出来。其实不然,POSTGET方法的安全性几乎是一样的,只是POST一般看不见而已。是采用POST还是GET,根据需要来决定。另外GET方法一般在ISAPI中用的很多,也就是一些服务器的底层服务。如一些搜索引擎,都是用的GET方法。

           HTMLL里有一个看不见的标签,就是type属性为hiddeninput标签。这个标签在传递一些非常变量的时候很有用,可以用它在好几个页面中传递数据。虽然可以用cookieSession来保存一些用户信息,但在单个页面里保存一些信息的时候,这个方法还是很好用的!后面我们将用到它的一些有意思的用法。最后要说明一下的是,在ASP.net中,与用户交流取得用户变量的方法也是采用这样的传统方法。还有一个问题就是很多人不明白怎样与客户端JavaScript脚本的变量进行交互。其实理解JavaScript的工作原理就行了!

           JavaScript脚本进行变量交互。看这样的一个例子:

    Exam-006.asp

    <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>

    <form name="form1" method="post" action="">

      <input name="m_name" type="text" id="m_name" size="20">

      <input type="submit" name="Submit" value="提交">

      <input type="button" name="Submit2" value="JavaScript" onClick="m_alert()">

    </form>

    <%

           s_name=Request.Form("m_name")

           Response.Write("<script language='JavaScript'>"&chr(13))

           Response.Write("<!--"&chr(13))

           Response.Write("function m_alert(){"&chr(13))

           Response.Write("    alert('"&s_name&"您好!"&"');"&chr(13))

           Response.Write("}"&chr(13))

           Response.Write("-->"&chr(13))

           Response.Write("</script>"&chr(13))  

    %>

           当我们输入“张三”提交后可以得到这样的HTML代码:

    <form name="form1" method="post" action="">

      <input name="m_name" type="text" id="m_name" size="20">

      <input type="submit" name="Submit" value="提交">

      <input type="button" name="Submit2" value="JavaScript" onClick="m_alert()">

    </form>

    <script language='JavaScript'>

    <!--

    function m_alert(){

           alert('张三您好!');

    }

    -->

    </script>

           其实也就是用ASP生成JavaScript代码。因为ASP是在服务器上运行的,它的任务就是处理一些事务,然后以文本的形式向客户端返回一些信息。而ASP所返回的信息再由客户端的浏览器来解释。所以可以很简单的把ASP的变量s_name的值赋给JavaScript里去。当然JavaScript是不能共用一个变量的,因为它们运行的地方都不一样,怎么可以共用变量呢?但如果可以把值传过来的话,就已经可以解决所有的事务了!

           那么反过来,JavaScript怎样向ASP传递变量呢?其实这个在exam-003.asp里已经完成了!读者可以自己分析一下,更复杂的变量传递应该怎样做!

    注意:JavaScript是与用户交互的一个重要手段,在ASP.net仍然保留了这一做法。但并不是所有的浏览器都支持JavaScript,所以我们要注意,使用JavaScript时,不要太相信你的所有JavaScript语句都会被执行。好在ASP.net里可以自动生成JavaScript,而且可以根据不同的浏览器生成它可以支持的代码。这为我们省去了不少的麻烦!

     

    三、返回处理信息

           ASP的信息返回基本上就是用Response.Write()来返回一些文本信息。当然也可以用一些组件将信息写入数据库及文件。再就是再HTML中直接的插入一些ASP变量的值,如:<%=s_name%> 就会在HTML中插入s_name这个变量的值。

           显然这些信息返回的方法是有限的。特别是当一个HTML页面的内容比较多的时候,还用这些方法,就会出现反应时间长,或者HTML页面与ASP代码混乱的局面。这里我就不举例了,在讨论传统的ASP方法的最后,我会给出一个服务器文件操作及管理的例子。可以看到,它的ASP代码与HTML几乎是不能分开的。因此在ASP.net中,一方面仍然保留了这两种信息返回的方法,同时还添加了很多其它的方法。特别是面向对象的程序设计思维的改变,它的信息返回方式可以说是千变万化了!

     

    四、与服务器上COM组件一同工作

           ASP的功能是十分的有限的,但它与COM一起工作时,威力可以说是成百上千倍的增加了!

           其实COM组件就是一个应用程序,也就是二进制文件。它与一般的EXE程序不同之处就是它不能独立的运行,必须在一个容器内运行(所以它的扩展名是DLL)。而我们ASP的运行环境就是一个COM容器。所以它可以加载COM组件。COM组件具体的做什么事,完全该写这个COM组件的程序员来决定。因此我们一般都只能使用这些组件,也就是这些组件提供给我们的一些方法或接口。而一个相对麻烦的问题就是,这个DLL文件不能在运行时加载,只能是事先在服务器上注册过的。如果我们不能操作服务器的话,那么这个COM组件我们就用不成了!当然,由于ASP的发展确实很快,目前国内很多ASP服务器提供商都安装了一些常用的组件,如JMailFSOOLEDB等。

           由于COM组件的特殊性,很多人都想知道COM组件里到底是什么?为什么在ASP里可以很轻松的引用它?而在ASP.net中为什么又没有用COM组件了呢?

    ASP.net读者注意:ASP.net已经不能用COM组件了,但为了使程序开发出来的一些很好用的组件不至于浪费,在ASP.net中增加了一个RCWRuntime Callable Wrapper),位于代码和COM组件之间的特殊的.net代理类。由于.net类的托管,使得程序必须依赖于.net类库才能运行,而COM组件不是托管的,所以不能在.net环境中使用。因此用RCW进行一个过度。

           其实COM组件的神秘之处就是它的封装性,使得一般人很难看到COM内部是如何工作的。因此很多人在写ASP程序之后,都会想给程序加密。为什么会想这样呢?无非不想让自己的心血白白的浪费。而所有的加密系统都是可以解密的,因此没什么特别的了!于是在ASP.net中,直接给源程序进行编译,使之成为二进制文件!于是有人不理解,为什么可以直接请求服务器里的二进制文件。其实也没什么,如果写过CGI程序或是ISAPI程序就会知道,其实我们在请求服务的时候,服务器先执行的还是一些二进制的文件。如:当我们请求ASP文件的时候,服务器会让ASP文件映射到asp.dll这个二进制文件上,然后对ASP文件进行解释执行,最后返回结果。如果我们把其它文件(如HTML文件)也映射到asp.dll上,那么其它文件里也可以写入ASP代码。而这些工作都是由服务器自己完成的。那么ASP.net的运行环境可以说是开放式的,我们不但可以自己定义一些映射关系,还可以自己写一些过滤器,使得在返回用户信息之前先对用户的一些信息进行处理(如网站文件访问统计)。

           既然是让我们用户自己来处理一些底层的事情,那自然也得让我们可以自己写二进制文件了。所以很自然的,我们在ASP.net里,可以自己写一些DLL文件。而这些文件则是由服务器自己加载的!注意:ASP.net的访问目录必须是一个应用程序,否则不能执行ASP.net的程序。

           ASP.net中虽然不能用COM组件,但它的另一个功能很强大。那就是用户自定义组件的使用。这与传统的COM组件有些类似,也是提供一些方法和接口供用户使用,而且也是经过编译的。它不用注册,可以直接被ASP.net运行环境所加载。因此这一功能远远的超过了传统的COM组件。可惜目前还没有太多的第三方组件可用,至少不象COM那样的多。因此ASP.net中也自带了一些COM组件(我是这样认为的,因为确实ASP.net里的有些类是以前的COM组件,所以我称为这些是ASP.net自带的COM组件)。但请注意,这些自定义的组件与传统的COM组件是有本质的区别的!

     

    五、一个传统的ASP例子

           最后给出一个ASP实用的例子,源代码较长,这里只给出大概的工作原理,源程序可以在我的网站上下载。给出这个例子的目的是让大家思考一下,对于一个中大型的网站系统,一般都要在一个ASP文件里完成多个功能,以便来减少服务器上的文件数目,也便于管理。试想,一个网站文件管理系统一般会有多少个文件呢?我们可以充分发挥ASP的潜能,让它在一个文件里完成文件()显示,复制,删除,文本文件的编辑等各种工作。

    Exam-007.asp(一个网站文件管理系统)

    当第一次请求这个文件时,列出所在的目录里的所有文件及文件夹,并提供对文本文件的修改按钮,对其它文件()提供复制和删除的按钮,还提供在当前目录创建文件及文件夹的按钮。全部用JavaScript来响应这些事件。大概的源文件:

           base_path              =Request.ServerVariables("APPL_PHYSICAL_PATH")       '网站物理路径

           base_path              =Lcase(base_path)

           URL                      =Request.ServerVariables("HTTP_HOST")

           URL                      ="http://"&URL&"/"

           base_file         =Request.ServerVariables("PATH_TRANSLATED")            '文件物理路径

           current_path   =Request.Form("m_current_path")                                   '当前目录

           if current_path="" then

                  current_path=base_path

           end if

           if right(current_path,1)<>"/" then

                  current_path=current_path&"/"

           end if

           m_type    =Request.Form("m_type")     '当前操作,由JavaScript响应用户操作来动态赋值

    <% if m_type="" or m_type="list_file" then%>

    在这里列出当前目录的所以文件及文件夹!并提供一些相关的操作。

    <%end if%>

    <%if m_type="其它操作"%>

    在这里执行一些其它的操作

    <%end if%>

    一些相关的JavaScript函数:

      <script language="javascript">

           <!--

                  function create_obj(m_file){//用于响应创建文件或文件夹的事件

                                if(form1.m_obj_name.value==""){

                                       对象名为空时……

                                }

                                if(confirm("创建"+form1.m_obj_name.value+"吗?")){

                                       确认创建文件或文件夹

                         }

                  }

                  function delete_file(m_obj){

                         if(confirm("删除文件"+m_obj+"吗?")){

                                确认删除文件

                         }

                  }

                  function edit_file(m_file){

                         if(confirm("编辑文件"+m_file+"吗?")){

                                确认编辑文件

                         }

                  }

                  function delete_folder(m_folder){

                         if(confirm("删除文件夹"+m_folder+"吗?")){

                                确认删除文件夹

                         }

                  }

    完整代码请从网上下载!

    一些相关ASP代码:

           if m_type="delete_folder" then

                  m_delete_folder      =Request.Form("m_delete_obj")

                  Set fs = CreateObject("Scripting.FileSystemObject")

                         if fs.FolderExists(m_delete_folder) then

                                fs.DeleteFolder m_delete_folder,true

                                msg_box_f("文件夹已经删除!请返回后刷新!")

                         else

                                msg_box_f("目标文件夹不存在,无法删除!")

                         end if

                  set fs=nothing

           end if            

           if m_type="create_obj" then   '新建文件

                  m_delete_file=Request.Form("m_delete_obj")

                  Set fs = CreateObject("Scripting.FileSystemObject")

                  if Request.Form("m_obj_type")="0" then

                         Set a = fs.CreateTextFile(m_delete_file, True)

                         a.Close()

                         set a=nothing

                         set fs=nothing

                         msg_box_f("对象已经创建!请返回后刷新!")

                  end if

                  if Request.Form("m_obj_type")="1" then

                         fs.CreateFolder(m_delete_file)

                         set fs=nothing

                         msg_box_f("对象已经创建!请返回后刷新!")

                  end if            

           end if

           if m_type="save_file" then

                  m_delete_file=Request.Form("m_delete_obj")

                  m_file_resume=Request.Form("m_file_resume")

                  Set fs = CreateObject("Scripting.FileSystemObject")

                  Set a = fs.CreateTextFile(m_delete_file, True)

                  a.write(m_file_resume)

                  a.Close()

                  set a=nothing

                  set fs=nothing

                  msg_box_f("文件已保存!请返回后刷新!")

           end if

           '复制文件

           if m_type="copy_file" then

                  m_old_name=Request.Form("m_delete_obj")

                  m_new_name=Request.Form("m_id")

                  'response.write(m_old_name&"->"&m_new_name)

                  'response.end()

                  Set fs = CreateObject("Scripting.FileSystemObject")

                  if fs.FileExists(m_old_name) then

                         if fs.FileExists(m_new_name) then

                                msg_box_f("目标文件已经存在!复制错误!")

                         else

                                fs.CopyFile m_old_name,m_new_name,false

                                msg_box_f("文件名复制成功!请返回后刷新!")

                         end if

                  else

                         msg_box_f("源文件不存在无法复制!")

                  end if

                  set fs=nothing       

           end if

    运行时的一些图片:

           好了,这个例子就只说这么多,完整的代码读者可以从网上下载。要说明的是,在一个ASP文件里是可以完成很多工作的,而唯一的缺点就是文件太大,不好管理。而ASP.net程序就不一样了,虽然也是在一个文件里,但工作原理就大不相同了。显然我们在ASP.net出现以前就想过要这么做,而且看的出来,这样做让我们付出了很多的心血来写一些基础的程序代码。可以看的出来ASP.net就是应这样的要求而产生的。

     


    文章来源:http://computer.mblogger.cn/wucountry/posts/28279.aspx
    ================================
      /\_/\                        
     (=^o^=)  Wu.Country@侠缘      
     (~)@(~)  一辈子,用心做一件事!
    --------------------------------
      学而不思则罔,思而不学则怠!  
    ================================
  • 相关阅读:
    Ubuntu 或 UbuntuKyLin14.04 Unity桌面側边栏和顶层菜单条显示异常解决方法
    关于程序猿的几个阶段!
    独立开发人员低成本推广APP的18条技巧
    Effective C++ 条款27
    OpensStack instance debug
    OpenStackCLI调试及术语识记
    OpenStack术语名词及问题调试
    apacheOfbiz
    obiz
    How to run OFBiz as a Service on linux
  • 原文地址:https://www.cnblogs.com/WuCountry/p/305755.html
Copyright © 2020-2023  润新知