习惯了微软提供的一系列Web控件,用着很方便,最近看了一种新的方式不用拖控件就能实现同样的功能,究竟拖控件好还是不拖控件好,随着以后学习的深入,答案会慢慢揭晓,希望一直关注哦!今天我们来看看一般处理程序。
1. 一般处理程序(HttpHandler)
? 引入
我们从一个网站打开的流程讲起。如下图:
流程细说:用webForm开发一个模拟的登陆页面,用户打开登陆页面,填入相应的用户信息:用户名和密码,点击【登陆】按钮,浏览器将用户名和密码发送给网站服务器,网站服务器让负责处理登陆请求的asp.net处理程序来处理这个请求,处理程序判断用户名和密码是否正确,之后将处理结果返回给浏览器。
上网的本质:上网就是从服务器向浏览器传送Html格式描述的网页,每次请求都带回来新的页面;页面中的图片、js、css在单独的请求中。
注解:我们知道像Html文件、css文件以及javascript是由浏览器进行解析的,在上面的登陆流程中,基本上可以分为三部分:向服务器发请求(请求)—服务器进行处理渲染成html(处理)—返给浏览器并且画出来给客户端(响应)。
? HttpHandler
从上面的引入我们知道浏览器与服务器请求-处理-响应的交互方式,那么HttpHandler(一般处理程序)扮演的即是服务器处理者的角色,整个操作是:
浏览器搜集用户操作向服务器发送请求——服务器处理请求并且把结果渲染成html文件——浏览器响应服务器的操作,并且把返回的结果进行解析和显示。
? 实例
第一个例子
此时如果没有挂到iis的网站的默认目录下需要手动输入地址,以及参数name和age即可
此时httphandler.ashx代码为:
<strong><span style="font-family:Microsoft YaHei;font-size:14px;">using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace handler { /// <summary> /// TestHandler 的摘要说明 /// </summary> public class TestHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { //context.Response.ContentType = "text/plain"; context.Response.ContentType = "text/html"; string action = context.Request["name"]; string isVIP=context.Request["isVIP"]; int age = Convert.ToInt32(context.Request["age"]); context.Response.Write("<font color='red'>Hello "+action+"</font>"); context.Response.Write("<font color='green'>我今年 " + age + "</font>"); } public bool IsReusable { get { return false; } } } }</span></strong>
此时效果是:
第二个例子
我们发现每次手动输入参数的时候是很容易出现错误的,所以我们可以用html表单自动提交给服务器进行处理
修改代码如下:
HTML页:
<strong><span style="font-family:Microsoft YaHei;font-size:14px;"><!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <form action="TestHandler.ashx" method="post"> 姓名:<input type="text" name="name" /><br /> 年龄:<input type="text"name="age" /><br /> <input type="checkbox"name="isVIP" /> <div name="aaaaa">哈哈哈哈</div> <textarea name="msg"></textarea> <select name="Prov"> <option value="bj">北京</option> <option value="tj">天津</option> <option value="sh">上海</option> </select> <ul> <li><input type="radio" name="gender" value="male"/>男</li> <li><input type="radio" name="gender" value="female"/>女</li> </ul> <ul> <li><input type="radio" name="national" value="han"/>汉</li> <li><input type="radio" name="national" value="man"/>满</li> </ul> <input type="submit" /> </form> </body> </html> </span></strong>
一般处理程序:同上。
操作步骤详解:
1. Html表单<form>可以自动给服务器提交参数(get是通过url,post是通过报文体),不用用户自己拼url。Action指定把表单内容提交给谁。即action和method指定了提交给哪个HttpHandler以及提交方式。
2. 浏览器向服务器端提交数据,被提交数据的表单(input、select、textarea等)放到form中,form通过action属性设定表单被提交给哪个页面,为了在服务器端取出来表项的值,需要在HTML为表单元素设定name属性。
3. 注意id是给js操作dom的,name才是提交给服务器用的。Id不能重复,name可以重复。
4. 服务器端(此处是httphandler)用context.Request[“username”]来根据表单项的name来获取提交的属性值。
特别注意:
1. 点击提交按钮时是浏览器将用户填写的文本框等空间中的值“提取”出来发送给服务器,而不是服务器来读取用户填写的信息
2. 可以被提交到服务器的标签具有以下的特性:
A、 只能为Input、textarea、select三种类型的标签。只有这些标签用户才可能修改值,<lable><p>、<font>,只是显示,没有提交到服务器的必要。当input=submit的时候,只有被点击的按钮的value才会被提交。提交的表单的内容,会提交到服务器。(此外有一种隐藏控件input=“hidden‘,是一种服务端控件,也会被提交到服务端,原因在于其在浏览器上映射成的是input控件,type="hidden"。)
B、 只有三种标签的value属性的值才会提交给服务器,input标签的title、type等属性,只是显示,用户无法修改。
C、 标签必须设定name属性,如果要将标签的value值提交到服务器,则必须为标签设定name值,提交到服务器的时候将会以“name=value”的键值对的形式提交给服务器,name是给服务里用的,id是js操作dom用的,对于radiobutton,同name为一组,选中的radiobutton的值被提交到服务器。
D、 放到form标签内,只有放到form标签内的才可能被提交到服务器。Form外的input等标签被忽略。
2. Get和post
? 区别
1. Get是通过url传递表单值的,post通过url看不到表单域的值;
2. Get传递的数据量是有限的,如果传递大数据量不能用get,比如type=”file’,<textarea>发表大段文章。Post则没有这个限制。但是post无法通过url在其他用户中还原,这样会显示不对。
3. Get方式url数据格式,服务器端文件名后跟着“?“,由于客户端可能向服务器端提交多个键值对,键值对之间用”&“进行分割,如果url存在汉字或者特殊字符,则需要对其进行编码。
? 示例显示
在ie9用F12开启网络流量捕获即可
Get请求标头中含有请求时发送的数据;请求正文为空:
Post请求时发送的数据从标头字符串中,转移到请求正文中
3. http协议以及报文请求
? 协议
1. 连接(Connection):浏览器和服务器之间传输数据的通道。一般请求完毕就关闭,http不保持连接,或称为短连接。这样的优点是可以增强服务器处理的客户端并发请求数;缺点是会降低服务器处理速度,因为建立连接的速度很慢。
2. 请求(Request):浏览器向服务器发送的请求信息,包含请求的类型、数据、浏览器(客户端)的信息(语言、浏览器版本、IP地址)等。
3. 响应(Response):服务器处理浏览器请求后返回的数据,包含请求是否成功、错误码等。
? 报文解析(请求一个页面比如csdn自己的)
请求
1、Get/HTTP/1.1表示向服务器用GET方式请求page,使用Http1.1协议。
2、Accept-Language表示浏览器支持的语言种类。User-Agent为浏览器的版本信息。
3、Referer:为(图片、js、css文件等)来源页面、所属页面。
响应
响应码:“200”OK 表示请求响应成功;
“302”:Found表示重定向,Response.Redirect()使浏览器再请求一次重定向的地址,重定向请求方式为Get。
“404”:Not Found表示未找到所请求页面。
“500”:表示服务器内部出现错误
Content-Type:text/html:表示返回数据的类型,服务器通过此属性告诉客户端响应的数据的类型,这样浏览器就根据返回数据的类型来进行不同的处理,如果是图片类型(image/gif)就显示,如果是文本类型(text/plain)就直接显示纯文本代码等等。可以自己试试比较看设成text/html和text/plain的区别。动动手吧。
4. 总结
了解了浏览器和服务器端是如何工作的,更加便于我们理解代码,之前我们一直用控件拖拽进行开发,看似很方便,其实在拖拽控件的时候,控件会给我们生成一些其他的东西。
在这里我们利用了html+httphandler实现了浏览器和服务端的交互,其实相当于web窗体,我们知道web控件都是能够提交到服务器,因为有runat=“server“,但是我们在此时利用form表单提交到handler进行处理,此时hanler相当于服务端,其好处还需要在以后的深入学习中慢慢体会,学习仍在继续,请继续关注~