自学Web开发第七天-基于VB和ASP.NET:初学ASP.NET开发,从基础开始。ASP.NET基础和七大对象

ASP.NET的运行原理和运行机制

运行原理

1、客户端与服务器建立连接
2、向服务器发送请求
3、请求被IIS接收
4、IIS检查客户端请求的页面类型,并为其加载相应的DLL文件
5、过程处理:将这条请求发送给能够处理这个请求的模块进行处理
6、处理完后发回IIS
7、IIS发回相应,在响应中包含状态码和所需要的文件。
8、客户端与服务器断开连接
要注意的是HTTP是无状态的,客户端和服务器没进行一次HTTP操作,就建立一次连接,任务结束就中断。但是HTTP中断不等同于访问中断,即HTTP断开可能是暂时不需要传输数据,是在浏览页面,所以在ASP.NET中,会话等还在继续。

运行机制

第一条运行线

1、初次向服务器发送Request请求
2、经过页面管理,到达目标ASP.NET页。
3、通过ASPX指令,找到页面背后的类,并实例化。在此过程中触发一些事件,其中一部分事件经过对象中的方法进行处理。
4、服务器将处理后的页面移交给Response对象,并发送回客户端。

第二条运行线

1、用户在第一条线后响应返回的页面上重新提交信息,继续向服务器发送请求。
2、因为会话已经建立,同时对应的对象已经建立并实例化,所以不再经过初始化页面的工作,所以直接交给相应类对象进行处理。
3、经过类对象的处理后,移交给Response返回客户端。

第三条运行线

第三条线和第二条线基本一直,不同点是在处理请求时,如果涉及ASP缓存,则从缓存里提取信息,再交由Response返回客户端。

第四条运行线

第四条线是当用户刷新页面时,服务器接收到HTTP请求,发现请求已经处理过,并已经将结果存储到缓存中,则直接从缓存中提取信息并返回结果。


ASP.NET基础

页面

页面分为静态页面和动态页面,静态页面就是普通的HTML页面,即直接显示的前台页面。动态页面是包含了页面指令(即可执行代码)的页面。

页面指令

页面使用HTML编写。涉及指令时,使用<% … %>来写,通过<%-- … --%>在除了<Script>内部外任何部分嵌入注释(<!-- … --> 是HTML的注释方法,<!-- … //–>则是在<Script>块内部使用注释 )。


ASP.NET的七大对象

Web开发必须了解的六大对象,分别是Page页面,Request请求,Response响应,Session会话,Application应用,Server服务器,ViewState视图状态,Cookie(找不到中文正式该怎么叫)

Page页面

.aspx文件在运行时被编译为Page对象,并缓存在服务器内存中。经常使用的是其事件:

Page_PreInit,页面初始化开始前发生,是网页执行时第一个被触发的事件
Page_Init,页面初始化时触发
Page_InitComplate,页面初始化完成时触发
Page_PreLoad,在页面加载前触发,一般用于信息写入客户端前
Page_Load,页面被加载时触发
Page_LoadComplate,页面加载完成时触发
Page_PreRender,页面呈现前触发
Page_Unload,页面卸载(页面加载完成后,HTTP断开时触发,并不是浏览器的窗口关闭时触发。这个和窗口程序有很大区别)
以上几个事件的触发顺序如其排序

Request请求

Request对象用于检索客户端浏览器发给服务器的请求信息,提供对当前页请求的访问。很多方法也用来获取客户端的状态。例如:

Request.Browser.Type,获取发送请求页面的客户端浏览器类型
Request.Url.Host,获取发送请求页面的地址的访问主机
Request.Url.AbsolutePath,获取发送请求页面的绝对路径
Request.Url.AbsoluteUri,获取发送请求页面的绝对网址
Request.UserHostAddress,获取远程客户端IP地址
Request.MapPath(Request.Url.AbsolutePath),获取发送请求的页面的绝对路径,并将其转化为客户端上的路径(相对的Server.MapPath() 方法是转换为服务器的路径)
Request.PhysicalApplicationPath,获取请求页面的物理路径(不包括页面本身)
Request.CurrentExecutionFilePath,获取当前页。例如页面之中进行登录后,返回的页面不是首页而是当前页,具体代码为:

Reponse.Redirect(Request.CurrentExecutionFilePath)

Request对象可以通过Params属性和QueryString属性获取页面间传送的值。
如果是带参数的页面,例如Response.Redirect(“~/welcome.aspx?name=linda&sex=female”)跳转的页面,或用<form>标签method=“get”所跳转的页面

<form action="welcome.aspx" method="get">
	<div><input type="text" name="name" /></div>
	<div><input type="submit" /></div>
</form>

可以被Params属性和QueryString属性和获得。以下三种方法效果相同:

Response.Write("姓名:" + Request("name"))
Response.Write("姓名:" + Request.Params("name"))
Response.Write("姓名:" + Request.QueryString("name"))

Response响应

该对象将HTTP响应数据发送到客户端,并包含有关该响应的信息。教常用的方法:

Response.Write(string As String),数据输出到客户端
Response.WriteFile(filename As String),将指定的文件直接写入HTTP内容输出流。例如输出一个txt文件,结果是文件内的文本内容。也可以用来嵌套HTML页面,但是必须是静态HTML。
Response.Redirect(Url As String),将页面重定向到另一个页面。例:

Response.Redirect("~/welcome.aspx")  '直接跳转到页面
Response.Redirect("~/welcome.aspx?name=linda")	'使用 "?" 分隔页面的链接地址和参数。
Response.Redirect("~/welcome.aspx?name=linda&sex=female")	'有多个参数时,使用“&”分隔

Session会话

Session是保存在本地客户端的一个键值对组,用于存储在多个页面调用之间特定用户的信息。Session对象只针对单一网站使用者。客户端从登录Web(客户端发送请求,服务器对请求进行响应。如果Cookie有Session信息就创建Session并加载,如果没有则根据服务器使用的容器的规则进行建立)到退出(客户端离线)的一个过程就是一个Session会话周期。

另需注意的是,Session保存在服务器端,所以用户关闭浏览器也不会结束Session一般结束Session的方式有两种:1、使用代码结束。2、 等待超时结束。

1、使用代码结束Session
Session.Abandon(),丢弃Session(Abandon 方法被调用时,将按序删除当前的 Session 对象,不过在当前页中所有脚本命令都处理完后,对象才会被真正删除。 这就是说,在调用 Abandon 时,可以在当前页上访问存储在 Session 对象中的变量,在随后的Web上使用的是新的Session。它会触发Session_End事件和Session_Strat事件)

2、 设置超时时间:
Session.TimeOut(Minutes As Int),默认Session的超时时间(即接下来新建Session的超时时间),默认值20分钟
Session.SetMaxInactiveInterval(Seconds As Int),当前Session的超时时间

其他一些有用的方法:
Session.RemoveAttribute,删除Session里的某项属性(键、对象)
Session.Clear(),清空Session里的所有值
Session.RemoveAll,同Clear
Session.Remove,删除Session某项属性(键、对象)中的值
Session.SessionID,获取登录的Session用户ID

可以自定义键值对,例如:

Session("name") = "张三"

就是增加了名为"name"的键值对,其值为"张三"。如果不用了,可以用Session.Remove("name")进行删除。键值对的值的类型可以是任何类型。

Application应用

Application对象用于共享应用程序级信息,即多个用户共享一个Application对象。在收到第一个用户请求时启动应用程序并创建Application对象。被创建后可以共享和管理整个应用程序的信息。在关闭前将一直存在。其存储的是整个应用程序在运行期间(应用程序运行周期就是由IIS加载运行开始到IIS停止)的全局数据和一些必须由全局处理的方法或函数。
Application其定义的键值变量为全局变量。例如

Application.Lock()
Application("name") = "linda"
Application.UnLock()
Response.Write(Application("name").ToString)

Application.Lock()Application.UnLock(),这一组操作用于多用户对服务器共用资源的抢占操作上。例如对数据库的修改等。在次例中,由于应用程序中的所有页面都可以访问应用程序变量,所以为了确保数据一致性,必须加锁。
再例,在一个全局应用程序类(Global.asax)里:

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' 应用程序启动时激发
        Application("count") = 0
    End Sub
    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' 会话启动时激发
        Application.Lock()
        Application("count") = Int(Application("count")) + 1
        Application.UnLock()
    End Sub

上面这个例子可以统计访问人数。如果在Session_End事件中进行 -1 ,则可以统计在线人数。

Application对象的一个典型应用就是聊天室

Global.asax进行数据初始化

    Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)     ' 会话启动时激发
        Dim user As String = ""     '建立用户列表
        Application("user") = user
        Application("userNum") = 0  '用户数
        Dim chats As String = ""        '建立聊天记录
        Application("chats") = chats
        Application("current") = 0        '当前聊天记录数
    End Sub

ChatRoom.aspx聊天室主页面

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="ChatRoom.aspx.vb" Inherits="聊天室.ChatRoom" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <style type="text/css">
        .auto-style1 {
            width:60%;
        }
        .auto-style2 {
            width: 40%;
        }
        .auto-style3 {
            width: 10%;
        }
        .auto-style4{
            width:30%;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <table border ="1" width="60%" style="margin:auto" >
                <tr style="text-align:center;background-color:darkblue;color:snow;width:100%" >
                    <td style="text-align:center;font-size:50px;"  colspan="5" >
                        聊天室
                    </td>
                </tr>
                <tr >
                    <td colspan="4" class="auto-style1" style="height:700px;" >
                        <iframe src="ChatInfo.aspx" style="height:100%;width:100%"></iframe>
                    </td>
                    <td class="auto-style2">

                    </td>
                </tr>
                <tr>
                    <td class="auto-style3"> 大家好! </td>
                    <td class="auto-style4"><asp:TextBox ID="TextBox1" runat="server" Width ="100%"></asp:TextBox></td>
                    <td class="auto-style3"><asp:Button ID="Button1" runat="server" Text ="发送" Width="100%" /></td>
                    <td class="auto-style3"><asp:Button ID="Button2" runat="server" Text ="退出" Width="100%" /></td>
                    <td>发言人用户名: <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox></td>
                </tr>
            </table>
        </div>
    </form>
</body>
</html>

ChatRoom.aspx.vb聊天室主页面代码

    Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim username As String = TextBox2.Text   '设置发言人用户名
        Session("username") = username
        If TextBox1.Text = "" Then Exit Sub     '不发言
        Dim P_current As Int16 = Int(Application("current"))    '聊天记录数
        Application.Lock()
        If P_current = 0 Or P_current > 20 Then		'超过20条,或没有,则直接发言
            P_current = 0		
            Application("chats") = Session("username").ToString + "说:" + TextBox1.Text + "(" + DateTime.Now.ToString + ")"      
        Else		 '没超过20条,则带上历史消息
            Application("chats") = Application("chats").ToString + "," + Session("username").ToString + "说:" + TextBox1.Text + "(" + DateTime.Now.ToString + ")"       
        End If
        P_current = P_current + 1   '消息记录+1
        Application("current") = P_current
        Application.UnLock()
    End Sub

ChatInfo.aspx.vb聊天记录页面

	<asp:TextBox ID="TextBox1" runat="server" Width="100%" Height="100%" TextMode="MultiLine"></asp:TextBox>

ChatInfo.aspx.vb聊天记录页面代码:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim P_current As Int16 = Int(Application("current"))    '调取记录数  
        Application.Lock()
        Dim P_chats As String = Application("chats")  '调取历史记录
        Dim P_chat() As String = P_chats.Split(",")         '历史记录拆分成数组
        For i As Int16 = P_chat.Length - 1 To 0 Step -1    '加入每条记录
            If P_current = 0 Then
                TextBox1.Text = P_chat(i).ToString
            Else
                TextBox1.Text = TextBox1.Text + Environment.NewLine + P_chat(i).ToString
            End If
        Next
        Application.UnLock()
    End Sub

上面这个聊天室实例中要注意的有:
1、 这个实例是将聊天记录页面ChatInfo.aspxChatRoom.aspx分开了,由ChatRoom.aspx嵌套了ChatInfo.aspx。页面间嵌套可以使用Response.WriteFile(filename As String),但是嵌套的页面必须是静态页面。所以这里使用了<iframe>标签。
2、 聊天内容输出是放在一个TEXTBOX控件里的,必须加参数TextMode=“MultiLine”让其能够显示多行文本。另TEXTBOX控件里换行不支持“\n”,所以使用了Environment.NewLine方法。

Server服务器

Server对象定义了一个于Web服务器相关的类,提供对服务器上的方法和属性的访问。主要用于访问服务器上的资源。

Server.Execute,在当前请求的上下文中执行指定资源的处理程序,然后将控制返回该处理程序
Server.Transfer,终止当前页的执行,并为当前请求开始执行新页
Server.MapPath(),获取在服务器上的指定虚拟路径对应的物理路径
Server.MachineName,获取服务器的计算机名
Server.CreateObject(),将COM+组件实例化
Server.UrlEncode(string),将字符串编码
Server.UrlDecode(string),将编码内容解码成字符串
Server.GetLastError,获得前一个错误,可以使用该方法访问错误信息

一些常用的使用方法:

一、使用Server.Execute方法和Server.Transfer方法重定向页面
Execute方法用于将执行从当前页面转移到另一个页面,并将执行返回到当前页面。执行所转移的页面在同一浏览器窗口执行,然后原始页面继续执行。故执行Execute方法后,原始页面保留控制权。Transfer方法用于将执行完全转移到指定页面。与Execute方法不同的是,将失去控制权。即后台程序执行到Execute后,前台页面不变的情况下,跳转到指定页面执行指令,执行完后还在本页面执行接下来的指令。如果执行到Transfer后,则跳转到指定页面执行指令,但是执行完后在跳转后的页面执行之前页面接下来的指令。

二、使用Server.UrlEncodeServer.UrlDecode对字符串进行编码解码

Response.Write(Server.UrlEncode("http://Default.aspx")

结果输出“http%3a%2f%2fDefaule.aspx”

Response.Write(Server.UrlDecode("http%3a%2f%2fDefaule.aspx"))

输出就是“http://Defaule.aspx”

其编码规则为:

  • 空格将被“+”代替
  • 字段不被编码
  • 字段名将被指定为关联的字段值
  • 非ASCII字符将被转义码所替代

Response.Redirect方法跳转的页面,如果传递值中使用的有汉字,会丢失字或乱码。这时候可以先进行编码再传递,然后再解码解决。

Dim name as String = Server.UrlEncode("直接传递汉字会丢失或乱码")
Response.Redirect("Other.aspx?name=" + name)

接收页面:

Dim name as String = Server.UrlDecode(Request.QueryString("name"))

相应的还有Server.HtmlEncode方法和Server.HtmlDecode方法,是对HTML里不能直接使用的字符等进行编码解码。

Cookie

Cookie对象用于保存客户端浏览器请求的服务器页面,也可以存放非敏感性的用户信息。保存周期只对具体目标有效,默认为至客户端关闭,可以根据用户的需要进行设置。并非所有浏览器支持Cookie,并且数据信息是以文本方式存放在客户端。因为信息存放在客户端本地,在早先时期因为网速较慢的原因,为了加快访问速度就使用Cookie,调用信息时在本地处理,而不用再访问服务端。

可使用Response.Cookies.()相关操作,直接在客户端本地处理Cookie信息。

一些常用属性和方法:
Response.Cookies().Expires,设定某个Cookie项的有效时间,若设为0则实时删除
Response/Request.Cookies().Path,获取或设置Cookie适用的URL
Response/Request.Cookies().Equals(),确定指定Cookie是否等于当前Cookie

这里需注意的是:
1、使用Request获取Cookie的值,使用Response设置Cookie。即Requset是客户端发给服务器,用于给变量赋值;Response是服务器返回客户端,用于给Cookie赋值。
2、由于Cookie是以文本形式存在本地,为了避免用户信息被他人窃取,通常需要进行加密:

Response.Cookies("CookieName") = FormsAuthentication.HashPasswordForStoringInConfigFile(data as string,"md5")
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值