1.ASP.NET需要学习的内容.
一般处理程序HttpHandler
模板引擎
WebForm(aspx)
ASP.NET MVC
需要的基础知识: C#,ADO.NET,HTML,JavaScript。
需要的工具: 浏览器Chrome。开发工具VS2010,.Net3.5。SQL Server2005.
2.一个网站打开流程
请求、处理、响应.
3.一般处理程序
VS2010新建/项目/Visual C#/Web/ASP.NET 空Web应用程序.
解决方案/添加/新建项/Visual C#/Web/一般处理程序
如果使用Chrome浏览器调试: 项目中新建一个HTML文件,右键点击浏览方式,选择Chrome浏览器。
请求参数
(1)浏览器中使用参数 http://localhost:47937/Handler1.ashx?name=test,或者使用表单提交参数.
(2)一般处理程序中处理请求public void ProcessRequest(HttpContext context):
得到请求参数: context.Request["name"]
4.关于表单
表单中哪些标签的哪些值会被提交给服务器:
只有input、textarea、select三种标签的value属性值才会提交给服务器.
标签必须设定name属性,提交到服务器时才会以键值对的方式提交给服务器.
对于RadioButton相同name的为一组,选中的RadioButton的value被提交到服务器.
放到form标签内,只有放到form标签内的标签才会被提交到服务器.
5.Get与Post.
GET(默认值)是通过URL传递表单值,POST传递的表单是隐藏到http报文中,URL看不到.
GET传递的数据量是有限的,传递大数据量不能用GET,POST没有这个限制,但POST无法通过URL定位网页内容。
GET方式URL数据格式: 服务端文件名后跟?,键值对之间用&分割,如果URL中有汉字和特殊符号,则需要对URL进行编码.
6.Http协议
Http协议的几个概念:
连接(Connection): 浏览器和服务器之间传输数据的同道.一般请求完毕就关闭,http不保持连接。不保持连接会降低处理速度,保持连接会降低服务器处理的客户端请求数,不保持连接服务器可
以处理更多请求。
请求(Request): 浏览器向服务器发送的请求消息,包含请求的类型、请求的数据、浏览器的信息(语言、版本等).
响应(Response): 服务器对浏览器请求返回的数据,包含是否成功、错误码等。
Http协议报文:
请求
GET/HTTP/1.1 表示向服务器用GET方式请求页面,使用HTTP/1.1协议
User-Agent 浏览器的版本信息
Referer: 来源页面.
响应:
响应码: 200: OK, 404,没找到, 302 Found暂时转移,用于重定向,Response.Redirect会让浏览器再请求一次重定向的地址,重定向的请求是Get方式.
Content-Type: text/html;charset=utf-8 表示返回数据的类型.
服务器通过Content-Type告诉客户端响应的数据的类型,这样浏览器就根据返回数据的类型来进行不同的处理,如果是图片类型就显示,如果是文本类型就直接显示内容,如果是html类型就用浏
览器显示内容,常用Content-Type: text/HTML、image/GIF、image/JPEG、text/plain、text/javascript.
7.重定向(Redirect)
Redirect是向浏览器返回302,通知浏览器重新访问新网址,浏览器街道命令后访问新网址。新网址为响应头Location指定的内容。
重定向在浏览器看到的网址是有变化的.
context.Response.Redirect("http://www...");
8.模板引擎Nvelocity
有几种模板引擎: Nvelocity、StringTemplate、RazorEngine.
Nvelocity的网站
http://www.castleproject.org/download/
http://sourceforge.net/projects/nvelocity/
Nvelocity使用步骤: 编写HTML模板 -> 提供数据 -> 渲染成需要的HTML.
(1)模板文件:/templates/login.html
<html>
<head>
<title></title>
</head>
<body>
<form action="Login.ashx">
<input type="text" name="username" value="$username"/>
<input type="text" name="password" value="$password"/>
</form>
</body>
</html>
(2)一般处理程序Login.ashx
Nvelocity基本用法代码:
public class Loginashx : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
VelocityEngine vltEngine = new VelocityEngine();
vltEngine.SetProperty(RuntimeConstants.RESOURCE_LOADER,"file");
vltEngine.SetProperty(RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.Web.Hosting.HostingEnvironment.MapPath("~/templates")); //模板文件所在的文件夹
vltEngine.AddProperty("file.resource.loader.cache", true);
vltEngine.Init();
VelocityContext vltContext = new VelocityContext();
vltContext.Put("username", "test"); //设置参数,在模板中可以通过$username形式来引用
vltContext.Put("password", "123");
Template vltTemplate = vltEngine.GetTemplate("login.htm");
System.IO.StringWriter vltWriter = new System.IO.StringWriter();
vltTemplate.Merge(vltContext, vltWriter);
string html = vltWriter.GetStringBuilder().ToString();
context.Response.Write(html);
}
}
9.Nvelocity输出对象的属性.
当处理程序中使用VelocityEngine.Put(key,value)设置属性参数后,可以在模板中使用$key形式来使用数据。
给模板设置的属性如果有属性,则还可以进一步获取: $data.Person.Name.
如果对象有一个字符串索引器,则还可以"$data.索引器值"的方式通过索引器获取值。
Dictiorary<string,string> dict = new Dictiorary<string,string>()
dict["tom"] = "北京"
dict["jack"] = "上海"
dict["gym"] = "广州"
vltContext.Put("ps", dict);
模板中使用$ps.tom访问.
Nvelocity中解析jquery代码$.ajax()中的$.的时候把$理解成了Nvelocity的$特殊符号,应对方法是用jQuery代替$.
把DataTable传递给NVelocity的时候要传递DataTable.Rows
为减少每次解析模板的时间,建议启用NVelocity缓存
10.Nvelocity高级:
1.foreach语句
#foreach($element in $list)
this is $element
#end
2.条件语句
#if(condition)
#elseif(condition)
#else
#end
3.包含另一个文件
#include
#include("foot.htm"),文件内容会包含进来,不会解析其中的NVelocity元素.
#parse也可以包含另一个文件,但是会解析其中的NVelocity元素,被包含的文件继承父模板中的参数。可以实现"网站头体一致、左侧菜单"等效果。
11.封装Nvelocity的处理.
Nvelocity封装,用匿名类传模板解析的参数.
var news = new {Title="",Author="",Msg=""};
vltContext.Put("data", news);
12.数据库连接字符串
Web.config:
<configuration>
<connectionStrings>
<add name="test" connectionString="Data Source=.;Initial Catalog=test;User Id=userid;Password=password;"/>
</connectionStrings>
</configuration>
13.通过URL传递状态
两个页面之间传递数据最好、后续麻烦最少、最简单的方法就是通过URL传递.
增删改查页面
优点:简单、直接,明确知道发给谁,数据不会乱。缺点:如果多个页面或者不确定页面之间要传那么就需要每次跳转都带着,不保密。
可以通过表单的隐藏字段传递状态,但一般不建议这么做。
14.Cookie
因http是无连接的(请求响应之后即断开),所以不能保持状态。Cookie是为多次请求响应之间传递状态和数据而设计的。
Cookie保存在浏览器端的电脑中,是以键值对的形式存放。Cookie可以被清除。
Cookie是和站点相关的,浏览器会在每次向服务器请求的时候除了发送表单参数外,还会将和站点相关的所有Cookie都提交给服务器,是强制性的。然后在服务器端读取、修改。
服务器返回数据除了普通的html数据外,还会返回修改的Cookie,浏览器把拿到的Cookie值更新到本地浏览器的Cookie就可以了.
如果不设定Expires那么生命周期则是关闭浏览器则终止,否则最多到Expires的时候终止.
Cookie的缺点是不能存储过多信息,不能存储机密信息.
Cookie无法跨不同的浏览器。
服务器端控制Cookie:
设置值: context.Response.SetCookie(new HttpCookie("UserName",username));
读取值: username = context.Request.Cookies["UserName"].Value;
Cookie有效期:
HttpCookie cookie1 = new HttpCookie("Age", "30");
cookie1.Expires = DateTime.Now.AddHours(2);
context.Response.SetCookie(cookie1);
15.Session原理
由于用Cookie机制来保持状态(例如登录状态),Cookie保存在客户端,存在安全性问题,需要一种服务器端的Cookie机制即Session机制。
自己实现服务器端的Cookie机制: Cookie不能存储机密数据。如果想存储数据,可以保存一个Guid到Cookie中,然后在服务器中建立一个以Guid为Key、复杂数据为Value全局静态Dictionary,放
到Application中。这个Guid就相当于用户的一个令牌。
ASP.NET已经内置了Session机制,原理和自己实现服务器端的Cookie机制类似,普通的HttpHandler要能够操作Session.要实现IRequiresSessionState接口。
Cookie是存在客户端,Session是存在服务器端,目的是一样的: 保存和当前客户端相关的数据(当前网站的任何一个页面都能取到Session、Cookie).
Session有自动销毁机制,如果一段时间内浏览器没有和服务器发生任何的交互,则Session会定时销毁,这也是为什么一段时间不操作,系统就会自动退出。
Session实现登录。
Session的实质: 由于Web是无状态的,Session实质是借助Cookie来实现的,客户端浏览器在发出请求后,web服务器会给客户端浏览器一个唯一标识的Cookie,客户端浏览器下次再请求时,会带
上这个唯一标识的Cookie.如果在浏览器把Cookie清除,这个Session就没有了。所以实质是借助Cookie来实现Session.
//登录时保存Session
public class Login : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
string username = context.Request["username"];
string password = context.Request["password"];
context.Session["LoginUser"] = username; //验证帐号后保存Session,object类型.
context.Response.Redirect("MainPage.ashx");
}
}
//其它页面读取检查Session.
public class MainPage : IHttpHandler, IRequiresSessionState
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/html";
if (context.Session = null)
{
context.Response.Redirect("Login.ashx");
}
else
{
string loginuser = (string)context.Session["LoginUser"];
if (string.IsNullOrEmpty(loginuser))
{
context.Response.Redirect("Login.ashx");
}
else
{
context.Response.Write(loginuser);
}
}
}
}
16.AJAX(Asynchronous JavaScript and XML,异步JavaScript和XML).
AJAX是一种进行页面局部异步刷新的技术。AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
用AJAX向服务器发送请求和获得服务器返回的数据并且更新到界面中,不是整个页面刷新,而是在HTML页面中使用JavaScript创建XMLHTTPRequest对象来向服务器发出请求以及获得返回的数据,
就像JavaScript版的WebClient一样,在页面中由XMLHTTPRequest来发出http请求和获得服务器的返回数据,这样页面就不会刷新了。
XMLHTTPRequest是AJAX的核心对象。
ajax文件:js/ajax.js
function ajax(url, onsuccess)
{
var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP'); //创建XMLHTTP对象,考虑兼容性。
xmlhttp.open("POST", url, true); //准备向服务器发出Post请求(GET可能会有缓存问题),知识准备,未发出请求
//监听onreadystatechange事件,AJAX是异步的,并不是等到服务器端返回才继续执行
xmlhttp.onreadystatechange = function ()
{
if (xmlhttp.readyState == 4) //readyState: 2-请求已发送正在处理中, 3-响应中已有部分数据可用了,但是服务器还没有完成响应的生成, 4-服务器返回完成数据了
{
if (xmlhttp.status == 200) //如果Http状态码为200则是成功
{
onsuccess(xmlhttp.responseText);
}
else
{
alert("AJAX返回错误!");
}
}
}
//不要以为if (xmlhttp.readyState == 4) 在send之前执行!!!!
xmlhttp.send(); //发送请求。并不等服务器端返回。监听事件onreadystatechange会返回信息.
}
html文件内容:
<html>
<head>
<title></title>
<script type="text/javascript" src="js/ajax.js"></script>
<script type="text/javascript">
function cai()
{
ajax("ZanCai.ashx?action=Cai", function (resText)
{
document.getElementById("CaiCount").innerHTML = resText;
});
}
</script>
</head>
<body>
<video src="diaosi.mp4" autoplay controls></video>
<p><input type="button" name="Zan" value="赞" onclick="zan()" /><label id="ZanCount"></label></p>
<p><input type="button" name="Cai" value="踩" onclick="cai()" /><label id="CaiCount"></label></p>
</body>
</html>
17.Json(JavaScript Object Notation).
Json和xml一样都是一种数据交换格式,Json基于JavaScript的一个子集,采用完全独立于语言的文本格式,是一种轻量级的数据交换格式。
JSON语法规则:
JSON 语法是 JavaScript 对象表示法语法的子集。
数据在名称/值对中 "firstName" : "John"
数据由逗号分隔
花括号保存对象 {key:value,key:value,...}
方括号保存数组 ["java","javascript","vb",...]
var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },
{ "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" },
{ "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }
],
"authors": [ { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
{ "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
{ "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
],
"musicians": [ { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
{ "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
]
}
people.programmers[0].lastName;
people.authors[1].genre // Value is "fantasy"
people.musicians[3].lastName // Undefined. This refers to the fourth entry, and there isn't one
people.programmers[2].firstName // Value is "Elliotte"
people.musicians[1].lastName = "Rachmaninov";
JsonTest1.ashx
public class JsonTest1 : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
List<Person> list = new List<Person>();
list.Add(new Person { Name="yzk",Age=32,Email="[email protected]"});
list.Add(new Person { Name = "tom", Age = 12, Email = "[email protected]" });
list.Add(new Person { Name = "lily", Age = 18, Email = "[email protected]" });
JavaScriptSerializer jss = new JavaScriptSerializer();
string json = jss.Serialize(list);
//string json = jss.Serialize(new Person { Name = "lily", Age = 18, Email = "[email protected]" });
context.Response.Write(json);
}
public bool IsReusable
{
get
{
return false;
}
}
}
JsonTest1.htm
<html>
<head>
<title></title>
<script src="js/json2.js" type="text/javascript"></script>
<script src="js/ajax.js" type="text/javascript"></script>
<script type="text/javascript">
function go()
{
ajax("JsonTest1.ashx", function (resTxt)
{
var persons = JSON.parse(resTxt);
for (var i = 0; i < persons.length; i++)
{
var p = persons[i];
alert("姓名:" + p.Name + ";年龄:" + p.Age);
}
});
}
</script>
</head>
<body onload="go()">
</body>
</html>
18.ValidateRequest
ASP.NET4.0之后会对ashx检测中默认对请求的数据进行校验,如果数据中有<>等有潜在XSS攻击的字符,则会报错。对于一些CMS系统等需要提交HTML内容的地方要关闭它,修改web.config.在
<system.web>节点中加入<httpRuntime requestValidationMode="2.0" />,把验证变更为2.0模式。(aspx在页面顶部的Page中还要加入ValidateRequest="false")。
XSS跨站脚本(Cross-site scripting)
<configuration>
<system.web>
<httpRuntime requestValidationMode="2.0" />
</system.web>
</configuration>
19.可视化编辑器CKEditor
CKeditor是一个使用在网页上的所见即所得文字编辑器,由JavaScript、CSS、图片等构成。