十天学会ASP.Net——(3)

3.ASP.NET对象

1. Response:向用户方发信息

a) Write

b) WriteFile:直接写入文件

c) Buffer缓冲输出

d) ContentType设为img就可以吧一个网页作为一张图片显示,就是放在《img》标签里

e) Status

2. Request:获取用户请求

a) Request.QueryString取浏览器地址栏信息

b) RequestForm

3. Cookies

a) Request.Cookies[]

b) Response.Cookies.Add()

4. Global.asax

5. Session

6. Application

7. Server

3.1 Response

//缓冲设为false会慢慢出来
Response.Buffer = false;
//将文件流写给客户,客户将看到文件中的内容。
Response.WriteFile("aa.txt");
//状态正常位200,文件找不到那么就返回404代码给用户
Response.StatusCode = 404;
//下面代码将以每行10个数字输出0~1000
for (int i = 0; i < 1000; i++)
{
      Response.Write("&nbsp");
      Response.Write(i.ToString());
      if (i % 10 == 0)
      {
           Response.Write("<br/>");
       }
}
 

3.2 Request

http://www.baidu.com/s?wd=zafu&rsv_bp=0&rsv_spt=3&rsv_n=2&inputT=625

?跟随需要处理的参数(请求的信息)

Wd是关键字,Request.QueryString[“wd”]== Request.QueryString[0]==zafu

例子:

http://localhost:1645/第四章/Default.aspx?wd=zafu&rsv_bp=0&rsv_spt=3&rsv_n=2&inputT=625

string wd = Request.QueryString["wd"].ToString();
string inputT = Request.QueryString["inputT"].ToString();
Response.Write(wd);
Response.Write(inputT);
3.3网页编码:

GB2312/UTF8

ASSCI一个字节表示一个字母

GB2312:两个字节表示一个汉字

UTF8:三个字节表示一个字符

哈GB2312: %B9%FE UTF8:%E5%93%88

http://www.baidu.com/s?wd=%B9%FE&rsv_bp=0&rsv_spt=3&inputT=4344

http://www.google.com.hk/search?hl=zh-CN&source=hp&q=%E5%93%88&gbv=2&oq=%E5%93%88&aq=f&aqi=&aql=&gs_l=hp.3...2765l2765l0l2937l1l1l0l0l0l0l0l0ll0l0.frgbld.

3.4 RequestForm:

Get方式:

<form action="Default.aspx" method="get">

<input id="wd" type="text" name="wd"/>

<br />

<input id="inputT" type="text" name="inputT"/>

<br />

<input id="Submit1" type="submit" value="submit" name="submit"/>

</form>

生成地址:

http://localhost:1645/第四章/Default.aspx?wd=11&inputT=22&submit=submit

clip_image002

post方式:

再post.html页面中编辑表单的传送模式为post

<form action="doPost.aspx" method="post">

当提交的时候可以在后台检测到表单各字段的值。

doPost.aspx:

Page_Load(){
    string wd = Request.Form["wd"].ToString();
    string inputT = Request.Form["inputT"].ToString();
}

这样就可以在系统后台接收到用户在表单中所填的值,从而做下一步的处理。

clip_image004

3.5 Cookies

Cookies的目录

C:\Documents and Settings\你的用户名\Cookies

最简单的创建一个cookie:

HttpCookie myCookie = new HttpCookie("myCookie");
myCookie.Value = "hello Cookies";
//cookie保存一天
myCookie.Expires = DateTime.Now.AddDays(1);

可以从Cookies目录中找到对应的文件myCookie_localhost,其中内容就是

myCookie名

hello Cookies内容

localhost域名

还有其它一些字段的内容

1024

230724480

30215745

3822868272

30215543

 

得到一个已纯在的Cookie并读取其中的值:

if (Request.Cookies["myCookie "] == null)
Response.Write("myCookie不存在");
HttpCookie cookie2 = Request.Cookies["myCookie"];
Response.Write(myCookie.Name + “:”);
Response.Write(myCookie.Value);

若想删除这个得到的cookie2

//对cookie的过期日期减一天(刚刚我们设的是一天内Cookie有效的)
cookie2.Expires = DateTime.Now.AddDays(-1);
//再将这个过期的Cookie加入,则系统会自动清理掉过期的这个Cookie
Response.Cookies.Add(cookie2);
Response.Write(“Cookie删除成功”);

在这里要注意一点,Cookie是在客户端的,故读取Cookie用的是Request.Cookies,表示请求时用户会将Cookie服务器域名相对应的Cookie发送给服务器,服务器从Request对象中调用,而服务器需要向客户机写Cookie时显而易见用的是Response.Cookies.Add()说明是对客户机的回复,就是把这个新Cookie加入回答语句告诉客户。虽然两个对象都有Cookies属性,然而意义是不同,说明的就是Cookie在客户端存在。。。

Cookie应用:该用户是第几次登录??将下面代码放在Page_Load函数里。

if (Request.Cookies["count"] == null)
{
Response.Write("cookie  不存在");
Response.Write("d第1次访问");
HttpCookie myCookie = new HttpCookie("count");
myCookie.Value = "1";
myCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(myCookie);
return;
}
HttpCookie myCookie2 = Request.Cookies["count"];
int nowcount = Int32.Parse(myCookie2.Value) + 1;
myCookie2.Value = nowcount.ToString();
Response.Write("这是你第" + myCookie2.Value + "次登陆这个网站<br/>");
myCookie2.Expires = DateTime.Now.AddDays(1);
Response.Write("cookie过期=" + myCookie2.Expires.ToString("MM/dd/hh")+ "<br/>");
Response.Cookies.Add(myCookie2);

3.6 Session

写Session:

Session["userName"] = TextBox1.Text;

读:

if (Session["userName"] == null)
{
      Response.Write("username is null");
      return;
}
Label1.Text = Session["userName"].ToString();

销毁:

Session.Abandon();

3.5 Application

Application作为缓存机制的用法与Session类似,不做赘述,只讲下他的应用:

页面设计:

姓名<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>

内容<asp:TextBox ID="TextBox2" runat="server" Height="62px" Width="159px"></asp:TextBox>

<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="提交" />

后台代码:

protected void Page_Load(object sender, EventArgs e)
{
	//注:Page. IsPostBack为true表示是页面的第一次访问
	// IsPostBack为false就是由于点了其它页面中的按钮而触发重新载入页面的情况
        if (!Page.IsPostBack)
        {
            Response.Write("页面初始化成功!");
            if (Application["count"] == null)
            {
                Application["count"] = 0;
            }
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        Resume();
        Response.Write("姓名:" + TextBox1.Text + "<br/>");
        string str1 = "姓名" + Int32.Parse(Application["count"].ToString());
        Application.Add(str1, TextBox1.Text);
        Response.Write("留言内容:" + TextBox2.Text + "<br/>");
        string str2 = "留言内容" + Int32.Parse(Application["count"].ToString());
        Application.Add(str2, TextBox2.Text);
        Response.Write("留言时间:" + DateTime.Now + "<br/>");
        string str3 = "留言时间" + Int32.Parse(Application["count"].ToString());
        Application.Add(str3, DateTime.Now);
        Response.Write("<hr/>");
        Application["count"] = Int32.Parse(Application["count"].ToString())+1;
    }

    private void Resume()
    {
        for (int i = 0; i < Int32.Parse(Application["count"].ToString()); i++)
        {
            string str1 = "姓名" + i;
            Response.Write("姓名:" + Application[str1].ToString() + "<br/>");
            string str2 = "留言内容" + i;
            Response.Write("留言内容:" + Application[str2].ToString() + "<br/>");
            string str3 = "留言时间" + i;
            Response.Write("留言时间:" + Application[str3].ToString() + "<br/>");
            Response.Write("<hr/>");
        }
    }

备注:新留覆盖换旧留言的错误,老师上课实现通过了页面上加个Label然后每加入一条就对Label.Text += 新留言 来实现,我这里采用另一种方法就是Application缓存。

3.6 Session_Application应用Global.asax实现站点有多少个用户的即时统计

void Application_Start(object sender, EventArgs e) {
        //在应用程序启动时运行的代码
        Application["online"] = 0;
        Application["IP"] = new ArrayList();
}
/* 老实说Application_End只会在服务器关机之前调用,而Application_Start在服务器启动时调用,大家别把服务器理解成了一台机器,服务器是一个服务程序,比如IIS等等*/
    void Application_End(object sender, EventArgs e) {
        //在应用程序关闭时运行的代码
}
// Application_Error用来供管理员排错。不会对用户抛出.
    void Application_Error(object sender, EventArgs e) { 
        //在出现未处理的错误时运行的代码
    }
    void Session_Start(object sender, EventArgs e) {
        //在新会话启动时运行的代码
        int i = Int32.Parse(Application["online"].ToString());
        i++;
        Application.Lock();
        Application["online"] = i;
        Application.UnLock();
        string userIP = Request.UserHostAddress;
        ((ArrayList)Application["IP"]).Add(userIP);
    }
    void Session_End(object sender, EventArgs e) 
    {
        //在会话结束时运行的代码。 
        // 注意: 只有在 Web.config 文件中的 sessionstate 模式设置为
        // InProc 时,才会引发 Session_End 事件。如果会话模式 
        //设置为 StateServer 或 SQLServer,则不会引发该事件。
        int i = Int32.Parse(Application["online"].ToString());
        i--;
        Application.Lock();
        Application["online"] = i;
        Application.UnLock();
}

按要求配置web.config让Session_End起作用

<configuration>

<sessionState mode="InProc" cookieless="false" timeout="1"/>

</configuration>

//输出在线的人数
Response.Write("在线人数:" + Application["online"].ToString() +"<br/>");
ArrayList myArray = (ArrayList)Application["IP"];
foreach (string a in myArray)
{
	  //依次输出在线的用户IP地址。
      Response.Write(a +"<br/>");
}

老师的解释:单个用户访问网站,Session_Start执行,所以session只对单用户有效,Application作用范围大,针对所有的用户。所以可以利用这些函数来统计在线人数:

当服务器开机,则调用Application_start,令在线人数变量为0,当用户访问网站,Session_Start执行,则令在线人数加1. Session_End则在线人数减1,这样就可以统计在线的有多少人。

3.7 Serve

1) Server.MapPath()方法

这个方法主要针对文件上传FileUpload控件,它的用途是路径映射。因为文件上传通常需要用到绝对路径,它能把一个相对路径映射为绝对的,就比如在我的电脑上

Server.MapPath("~/Files/");这条语句执行的结果是:

C:\Users\Daniel\Documents\Visual Studio 2010\WebSites\动态网页制作\Server对象\Files\

为什么呢?~代表网站根目录,那么files就~/Files/表示网站根下的File,这为我们提供了很多遍历,如果我们的页面已经深入了网站的许多层,压根不知道在网站的第几层了,用../已经不知道要用几次,但是我们又想要将文件放到根下的某些文件夹里,那Server.MapPath()方法就非常有用咯。

注意:

clip_image002[4]

clip_image004[4]

这样说大家应该很清楚了。。。

2) Server. HtmlEncode

clip_image006

Html编码会将左右尖括号去掉,因为它们是HTML标记中将用与标识元素的标识,如果用户输入的文本中出现这些标识,然后网站设计者直接将他们插入页面,可能会引起页面的异常,或者出现错误和其它安全问题。

clip_image008

3) Server. HtmlDecode

4) Server. UrlEncode

clip_image010

UrlEncode是编码成UML形式的,中文三个字节,只有ASCII被编码成一个字节

作用:

简单加密

不同语种之间相互转换(信息不会丢失);

主要是使功能字符不丢失:

clip_image012

5) Server. UrlDecode

posted @ 2012-05-21 00:41  Ю詺菛╀時代  阅读(370)  评论(1编辑  收藏  举报