ASP代码
1.委托的异步调用 { (1)解决窗体假死 (2)多播委托不能异步调用 (3) //异步调用 DelTest del = Test; //异步调用 async 异步 sync同步 IAsyncResult res = del.BeginInvoke(Callback, null); (4) //如果执行的时候没有结束 做相应的提示 while (!res.IsCompleted) { this.Text += "*"; System.Threading.Thread.Sleep(500); } (5) //endinvoke的返回值 就是委托指向的方法的返回值 //获取异步委托执行的结果 //endinvoke等待begininvoke的返回值,又回到同步 string s = del.EndInvoke(res); MessageBox.Show(s); (6) //异步委托的回调函数 void Callback(IAsyncResult res) { //判断异步执行是否结束 if (res.IsCompleted) { MessageBox.Show("异步委托执行完毕"); } } } 2.文件流复习 { using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
using System.IO; namespace _03_文件流 { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
//写文件 private void btnWrite_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "文本文件|*.txt"; if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { txtPath.Text = sfd.FileName; using (FileStream fs = new FileStream(txtPath.Text, FileMode.Create)) { //读取和写入时候使用的编码应该一致,否则会出现乱码的问题 byte[] buffer = Encoding.UTF8.GetBytes(txtWrite.Text); //把字节数组,放到缓冲区中(内容) fs.Write(buffer, 0, buffer.Length);
//把缓冲区中的内容写入到文件 //fs.Flush(); //调用了flush 并关闭流 //fs.Close(); } } } //读取 private void btnRead_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Filter = "文本文件|*.txt"; if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { txtPath.Text = ofd.FileName;
using (FileStream fs = new FileStream(txtPath.Text,FileMode.Open)) { byte[] buffer = new byte[1024*1024];
//把流中的内容读取到字节数组中 //第二个参数是把流中的内容放到字节数组中的第几个位置, //第三个参数,是读取流中多少内容
//n 实际读到的字节个数 int n = fs.Read(buffer, 0, buffer.Length); if (n != 0) { txtRead.Text = Encoding.UTF8.GetString(buffer); } } }
} } }
} 3.简易摇奖机 { using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading;
namespace 摇奖机 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } Thread th; private void btn_Click(object sender, EventArgs e) { if (btn.Text == "开始") { isStart = true; th = new Thread(Award); th.IsBackground = true; th.Start(); btn.Text = "结束"; } else { isStart = false; btn.Text = "开始"; } } bool isStart = false; void Award() { Random r = new Random(); while (isStart) { label1.Text = r.Next(1, 10).ToString(); label2.Text = r.Next(1, 10).ToString(); label3.Text = r.Next(1, 10).ToString(); label4.Text = r.Next(1, 10).ToString(); label5.Text = r.Next(1, 10).ToString(); label6.Text = r.Next(1, 10).ToString(); Thread.Sleep(50); } }
private void Form1_FormClosed(object sender, FormClosedEventArgs e) { if (th != null) { th.Abort(); } } } }
} 4.Chat聊天室 { (1)服务器端 { using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Threading; using System.IO;
namespace SocketChat { public partial class 服务器端 : Form { //存储通信用的字典 string为IP和端口,scoket为对应的socket对象 Dictionary<string, Socket> dic = new Dictionary<string, Socket>(); int count = 0;//用于限制用户的数量 string fileName;//获取文件名
public 服务器端() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; }
/// <summary> /// 创建监听用的socket /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnStart_Click(object sender, EventArgs e) { //IP地址 IPAddress ip = IPAddress.Parse(txtServer.Text);
//IP和端口号 IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text));
//监听用的socket Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 //绑定IP和端口 socket.Bind(point); //监听窗口 10的当前时间的排队序列的最大数 socket.Listen(10); //设置监听按钮不可用 btnStart.Enabled = false; ShowMsg("开始监听"); //监听端口,如果有客户端连接,创建通信用的socket //创建线程,防止窗体阻塞 Thread th = new Thread(Listen); //设为后台线程 th.IsBackground = true; th.Start(socket);
}
/// <summary> /// 监听的方法 /// </summary> /// <param name="o"></param> void Listen(object o) { Socket socket = o as Socket; //设为死循环,来不停的执行Accept方法 while (count < 100) { count++; //监听端口,如果有客户端连接,创建通信用的socket Socket connSocket = socket.Accept(); //显示连接成功的客户端的ip地址和端口号 string ipport = connSocket.RemoteEndPoint.ToString(); //显示ip和端口号 ShowMsg(ipport); //给当前的下拉框添加ip和端口号 cboUsers.Items.Add(ipport); //给字典添加数据 dic.Add(ipport, connSocket); //本机的ip地址和端口 connSocket,LocalEndPoint Thread th = new Thread(RecMsg); th.IsBackground = true; th.Start(connSocket); } }
/// <summary> /// 接收消息 /// </summary> /// <param name="o"></param> void RecMsg(object o) { Socket connSocket = o as Socket; //这里为死循环是可以多次发送消息,保证不停的执行Receive while (true) { //接收数据 byte[] buffer = new byte[1024 * 1024]; //num为实际接收到的长度,接收数据,放入buffer int num = -1; try { num = connSocket.Receive(buffer); //假如num为0的时候表示talnet已经关闭了,这时候关闭socket if (num == 0) { //显示该IP的已经退出 ShowMsg(connSocket.RemoteEndPoint.ToString() + ":退出了"); //关闭socket的接收功能 connSocket.Shutdown(SocketShutdown.Receive); //关闭socket connSocket.Close(); //退出循环 break; } //显示接收的内容 string str = Encoding.UTF8.GetString(buffer, 0, num); ShowMsg(connSocket.RemoteEndPoint.ToString() + ":" + str); } catch (Exception ex) { //显示异常信息并且跳出循环 ShowMsg(ex.Message); break; } } }
/// <summary> /// 在log文本框内显示消息 /// </summary> /// <param name="msg"></param> void ShowMsg(string msg) { txtLog.AppendText(msg + "\r\n"); }
/// <summary> /// 发送消息 协议首位为0 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSend_Click(object sender, EventArgs e) { string key = cboUsers.Text.Trim(); if (!string.IsNullOrEmpty(key)) { byte[] buffer = Encoding.UTF8.GetBytes(txtMsg.Text.Trim()); List<byte> list = new List<byte>(); list.Add(0); list.AddRange(buffer); dic[key].Send(list.ToArray()); } else { ShowMsg("请选择客户端"); } }
/// <summary> /// 选择文件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSelect_Click(object sender, EventArgs e) { //选择文件 OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) { txtPath.Text = ofd.FileName; } } /// <summary> /// 发送文件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSendFile_Click(object sender, EventArgs e) { //获取下拉框中的客户端的ip和端口 string key = cboUsers.Text.Trim(); if (!string.IsNullOrEmpty(key)) { using (FileStream fs = new FileStream(txtPath.Text, FileMode.Open)) { //定义字节数组,长度为文件流中字节数组的长度 byte[] buffer = new byte[fs.Length]; //num为实际读取的字节个数 int num = fs.Read(buffer, 0, buffer.Length);
//添加协议 List<byte> list = new List<byte>(); list.Add(1);//协议位第一位 1 文件 2 消息 //获取文件名名 fileName = Path.GetFileName(txtPath.Text); //获取文件名的字节数组 byte[] bFilter = Encoding.UTF8.GetBytes(fileName); //获取文件名的字节数组长度的字节数组 int length = bFilter.Length; //长度添加进集合 list.Add((byte)length); //文件名字节数组添加进协议位 list.AddRange(bFilter); //文件数组添加进集合 list.AddRange(buffer); //发送 dic[key].Send(list.ToArray()); } } else { MessageBox.Show("请选择客户端"); } } /// <summary> /// 震动 协议首位为0 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnZD_Click(object sender, EventArgs e) { string key = cboUsers.Text.Trim(); if (!string.IsNullOrEmpty(key)) { List<byte> list = new List<byte>(); list.Add(2); dic[key].Send(list.ToArray()); } else { MessageBox.Show("请选择客户端"); } } } } } (2)客户端 { using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading; using System.IO;
namespace SocketChatClient { public partial class 客户端 : Form { public 客户端() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; }
Socket socket; /// <summary> /// 连接服务器 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnStart_Click(object sender, EventArgs e) { //客户端连接服务器的ip地址 IPAddress ip = IPAddress.Parse(txtServer.Text); //端口 IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text)); //创建socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { //设定连接 socket.Connect(point); ShowMsg("连接成功");
//接收消息 Thread th = new Thread(RecMsg); th.IsBackground = true; th.Start(); } catch (Exception ex) {
ShowMsg(ex.Message); } }
/// <summary> /// txtLog文本框显示 /// </summary> /// <param name="msg"></param> void ShowMsg(string msg) { txtLog.AppendText(msg + "\r\n"); } /// <summary> /// 接收消息 /// </summary> void RecMsg() { while (true) { byte[] buffer = new byte[1024 * 1024]; try { int num = socket.Receive(buffer); //接收消息,消息中的第一个字节是协议 //读取协议 0 文字 1文件 2震动 int first = buffer[0]; if (first == 0) { string str = Encoding.UTF8.GetString(buffer, 1, num - 1); ShowMsg(socket.RemoteEndPoint.ToString() + ":" + str); } else if (first == 1) //文件 { //读取文件名的长度 int length = buffer[1]; //读取文件名 string fileName = Encoding.UTF8.GetString(buffer, 2, length); //保存文件 SaveFileDialog sfd = new SaveFileDialog(); //获取文件名 sfd.FileName = Path.GetFileNameWithoutExtension(fileName); //获取后缀名 sfd.Filter = "|*" + Path.GetExtension(fileName); if (sfd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK) { using (FileStream fs = new FileStream(sfd.FileName, FileMode.Create)) { fs.Write(buffer, 2 + length, num - length - 2); } } } else if (first == 2) { Shake(); } } catch (Exception ex) {
ShowMsg(ex.Message); break; } } } /// <summary> /// 发送消息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSend_Click(object sender, EventArgs e) { //socket==null 说明没有连接服务器 if (socket != null) { //发送数据 byte[] bs = Encoding.UTF8.GetBytes(txtMsg.Text.Trim()); socket.Send(bs); } else { ShowMsg("请先连接"); } } int n = -1; void Shake() { for (int i = 0; i < 10; i++) { n = -n; this.Location = new Point(this.Location.X + 5 * n, this.Location.Y + 5 * n); System.Threading.Thread.Sleep(50); } } } }
} } 5.Web服务器 { 1、Form1.cs { using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using System.Threading;
namespace WebServer { public partial class Form1 : Form { public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } /// <summary> /// 开启监听socket,创建多线程 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnStart_Click(object sender, EventArgs e) { //ip地址 IPAddress ip = IPAddress.Parse(txtIp.Text.Trim()); //ip和端口号 IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text.Trim())); //创建socket Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { socket.Bind(point); //监听 socket.Listen(10); ShowMsg("开始运行"); //接收消息 Thread th = new Thread(Listen); th.IsBackground = true; th.Start(socket); } catch (Exception ex) { ShowMsg(ex.Message); } } /// <summary> /// txtLog.text显示的信息 /// </summary> /// <param name="msg"></param> void ShowMsg(string msg) { txtLog.AppendText(msg + "\r\n"); } /// <summary> /// 创建连接用socket,多线程 /// </summary> /// <param name="o">监听socket</param> void Listen(object o) { Socket socket = o as Socket; while (true) { //创建通信用socket Socket connSocket = socket.Accept(); ShowMsg(connSocket.RemoteEndPoint.ToString() + ":连接成功");
//通过dataconnection的类接收http请求和发送http响应 //构造方法传入通信socket和委托,这个委托有显示的方法 DataConnection dc = new DataConnection(connSocket, ShowMsg); } } } }
} 2、DataConnection.cs { using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.IO;
namespace WebServer { //创建委托,参数为显示信息的方法 delegate void DelSetTxt(string msg); /// <summary> /// 1 接收游览器发送的请求 /// 2向游览器发送响应 /// </summary> class DataConnection { private Socket connSocket; //实例化委托,要指向窗体中给文本框赋值的方法 private DelSetTxt del;
/// <summary> /// 构造方法中把通信用的socket还有委托传递过来 /// </summary> /// <param name="connSocket">通信用的socket </param> /// <param name="del">实例化类的时候将showMsg方法直接指向委托</param> public DataConnection(Socket connSocket, DelSetTxt del) { this.connSocket = connSocket; this.del = del;//(del=ShowMsg()) //1. msg为接收的请求报文 string msg = RecMsg(); del(msg); //ShowMsg(msg),显示请求报文
//2 Request类是用来分析http请求报文的 Request req = new Request(msg);
//3.根据请求的路径 判断是静态页面还是动态页面 Judge(req.Url); }
/// <summary> /// 判断是静态页面还是动态页面 /// </summary> /// <param name="url">文件的路径</param> void Judge(string url) { //获得url的后缀名,去除. string ext = Path.GetExtension(url).TrimStart('.'); switch (ext) { case "htm": case "html": case "css": case "jpg": case "js": case "gif": case "png": //处理静态页面 并做出响应 ProcessStaticPage(url); break; case "aspx": //处理动态页面 ProcessDyPage(url); break; default: break; } }
/// <summary> /// 接收通信用的socket收到的字节信息,转为字符串 /// </summary> /// <returns></returns> string RecMsg() { //接收消息 byte[] buffer = new byte[1024 * 1024]; //实际接收的字节个数 int num = connSocket.Receive(buffer); string str = Encoding.UTF8.GetString(buffer, 0, num); return str; }
/// <summary> /// 处理静态页面,生成响应头并做出http响应 /// </summary> /// <param name="url">Request方法得到的url</param> void ProcessStaticPage(string url) { //1.跟据相对路径生成绝对路径
//获取exe所在文件夹的路径 //AppDomain.CurrentDomain.BaseDirectory表示当前程序域的基路径 string exePath = AppDomain.CurrentDomain.BaseDirectory; //组合生成请求文件的绝对路径 string path = exePath + "web" + url;
//2.判断文件是否存在,然后读取静态页面 if (File.Exists(path))//File.Exists判断文件是否存在 { using (FileStream fs = new FileStream(path, FileMode.Open)) { byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); try { //生成响应头 Response response = new Response(200, buffer.Length, url); //发送响应头 connSocket.Send(response.GetResponseHeaders()); //发送响应题 connSocket.Send(buffer); //关闭连接 connSocket.Close(); del("关闭连接"); //send发送数据的时候会等待一个非常短的时间, //假如再有send,就把这几个send的数据一起发生数据, //所有2个send其实是一个 } catch (Exception ex) {
del(ex.Message); } } } } /// <summary> /// 处理动态页面 /// </summary> /// <param name="url">Request方法得到的url</param> void ProcessDyPage(string url) { //通过反射创建请求类的对象 //根据字符串(类的全名称 命名空间.类名)创建对应类的对象
//获得文件名 string fileName = Path.GetFileNameWithoutExtension(url);
//获取当前方法所在的类的命名空间 MethodBase指的是当前的方法 //GetCurrentMethod 返回当前执行的方法的对象 //DeclaringType 获得当前方法所在的类 //Namespace 获得这个类的命名空间 string nameSpace = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Namespace;
//类的全名称 string fullName = nameSpace + "." + fileName;
//GetExecutingAssembly获取当前执行的程序集 //使用CreateInstance方法创建fullname的对象 //反射创建fullname的对象,并且存储到接口中 IHttpHandler handler = System.Reflection.Assembly.GetExecutingAssembly().CreateInstance(fullName, true) as IHttpHandler; //假如接口不为空 if (handler != null) { //生成响应体 byte[] buffer = handler.ProcessRequest(); //生成响应头 Response res = new Response(200, buffer.Length, url);
//发送动态页面 connSocket.Send(res.GetResponseHeaders()); connSocket.Send(buffer); connSocket.Close(); del("关闭连接"); } else { del("404 文件不存在"); } } } }
} 3、Request.cs { using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace WebServer { /// <summary> /// 解析请求报文中的url /// </summary> class Request { /// <summary> /// 解析msg中的url /// </summary> /// <param name="msg">请求报文</param> public Request(string msg) { try { //因为http协议严谨按照 不同元素之间有空格,隔行直接由转行,所有用split方法得到元素
//得到隔行的数组元素 string[] arrMsg = msg.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); //第一行是我们需要的 string firstLine = arrMsg[0]; //分割第一行 string[] arr = firstLine.Split(' '); //第一行的第二个元素就是url //这里url是属性 url = arr[1]; } catch (Exception ex) { //发生错误,指定一个错误的页面去,上面显示404,请求的页面不存在 url = ""; } } private string url; /// <summary> /// 请求行中的路径 /// </summary> public string Url { get { return url; } set { url = value; } } } }
} 4、Response.cs { using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO;
namespace WebServer { /// <summary> /// 准备响应头 /// </summary> public class Response { //字典中键是状态,值是对应的显示的提示 private Dictionary<int, string> dic = new Dictionary<int, string>(); //状态码,200为正常情况下的状态码 private int statusCode = 200; //html页面里面内容的长度 private int contentLength; //html页面里面内容的类型 private string contentType;
/// <summary> /// 构造方法 /// </summary> /// <param name="statusCode">状态码</param> /// <param name="contentLength">html页面里面内容的长度</param> /// <param name="url">html页面里面内容的url路径</param> public Response(int statusCode, int contentLength, string url) { //填充字典 状态码和状态码的描述 FillDic(); this.statusCode = statusCode; this.contentLength = contentLength; GetContentType(url); }
/// <summary> /// 生成响应头 /// </summary> /// <returns>响应头的字节数组</returns> public byte[] GetResponseHeaders() { //准备拼接响应头的sb StringBuilder sb = new StringBuilder(); //(Status-Line) HTTP/1.1 200 OK 状态行拼接 sb.AppendLine("HTTP/1.1 " + statusCode + " " + dic[statusCode]); //Content-Length 3989 内容的长度 sb.AppendLine("Content-Length: " + contentLength); //Content-Type text/html;charset=gbk 内容的类型 sb.AppendLine("Content-Type: " + contentType + ";charset=utf-8\r\n"); //返回拼接好的字符串的字节数组 return Encoding.UTF8.GetBytes(sb.ToString()); }
/// <summary> /// 根据url给contentType(响应类型)赋值 /// </summary> /// <param name="url"></param> void GetContentType(string url) { //获得url的后缀 string ext = Path.GetExtension(url); switch (ext) { case ".htm": case ".html": contentType = "text/html"; break; case ".css": contentType = "text/css"; break; case ".js": contentType = "text/javascript"; break; case ".jpg": contentType = "image/jpeg"; break; default: contentType = "text/html"; break; } }
/// <summary> /// 填充字典,得到状态码和文字描述 /// </summary> void FillDic() { dic.Add(200, "OK"); dic.Add(404, "Not Found"); } } }
} 5、IHttpHandler接口 { using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace WebServer { /// <summary> /// 让实现了接口的类 能够处理浏览器的请求 /// </summary> interface IHttpHandler { //处理请求并作出响应 byte[] ProcessRequest(); } }
} 6、NewsDetails动态页面 { using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace WebServer { //继承至接口 class NewsDetails:IHttpHandler { /// <summary> /// 返回字节数组的动态页面 /// </summary> /// <returns></returns> public byte[] ProcessRequest() { StringBuilder sb = new StringBuilder(); sb.AppendLine("<html>"); sb.AppendLine("<head><title>新闻详细页面</title>"); sb.AppendLine("</head>"); sb.AppendLine("<body>"); sb.AppendLine("<center>"); sb.AppendLine("<h3>新闻详细页面。。。。"); sb.AppendLine("</h3>"); sb.AppendLine("<div>我是新闻详细页面" + DateTime.Now.ToString() + "</div>"); sb.AppendLine("</center>"); sb.AppendLine("</body>"); sb.AppendLine("</html>");
return Encoding.UTF8.GetBytes(sb.ToString()); } } }
} } 6.加法计算器 { (1)HTML模板 } 7.Ajax无刷新登录 { 1.HTML页面 { <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <script src="Scripts/jquery-1.7.1.js"></script> <script type="text/ecmascript"> //窗体加载的时候 $(function () { $("#btn").click(function () { //获得文本框内的值 var name = $("#txtName").val(); var pwd = $("#txtPwd").val(); var code = $("#txtCode").val(); //组装成json数据 var data = { "name": name, "pwd": pwd, "code": code }; //通过Ajax的post方式,到一般处理程序区处理 $.post("01-Login.ashx", data, function (msg) { //在回调方法内给予提示,局部刷新span标签 //1 登录成功 2用户名不存在 3密码错误 4 验证码错误 if (msg == 1) { window.location.href = "03-PhotoList.aspx"; } if (msg == 2) { $("#msg").text("用户名不存在"); } if (msg == 3) { $("#msg").text("密码错误"); } if (msg == 4) { $("#msg").text("验证码错误"); } if (msg == 5) { $("#msg").text("未知错误"); } //每次点击事件结束时,调用刷新验证码的方法 ChangeCode(); }) }) }) //刷新验证码的方法 function ChangeCode() { $("#i1").attr("src","02-ValidateCode.ashx?r="+Math.random()); } </script> </head> <body> 用户名:<input type="text" id="txtName" /><br /> 密码:<input type="password" id="txtPwd" /><br /> 验证码:<input type="text" id="txtCode" /><img src="02-ValidateCode.ashx" id="i1" alt="点击改变验证码" onclick="ChangeCode()" style="cursor:pointer"/><br /> <input type="button" value="登录" id="btn" /><br /> <span id="msg" style="color:red"></span> </body> </html>
} 2.ashx页面 { <%@ WebHandler Language="C#" class="_01_Login" %>
using System; using System.Web; using System.Web.SessionState; using MyPhotos.BLL; using MyPhotos.Model;
public class _01_Login : IHttpHandler,IRequiresSessionState { public void ProcessRequest (HttpContext context) { context.Response.ContentType = "text/plain"; //定义一个msg 1 登录成功 2用户名不存在 3密码错误 4 验证码错误 int msg = -1; //获得post过来的数据 string name = context.Request.Form["name"]; string pwd = context.Request.Form["pwd"]; string code = context.Request.Form["code"]; //判断验证码是否正确 if (context.Session["code"] != null && code.ToLower() == context.Session["code"].ToString().ToLower()) { User user; UserBLL bll = new UserBLL(); //判断是否登录 if (bll.GetUserByUName(name, pwd, out msg, out user)) { //session方式保持用户对象 context.Session["user"] = user; } } else { msg = 4; } context.Response.Write(msg); } public bool IsReusable { get { return false; } }
} } } 8.Ajax无刷新显示照片列表 { 1.ASPX { <%@ Page Language="C#" AutoEventWireup="true" CodeFile="03-PhotoList.aspx.cs" Inherits="_02_PhotoList" %>
<!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"> </style> <script src="Scripts/jquery-1.7.1.js"></script> <script type="text/javascript">
// 将序列化成json格式的日期(毫秒数)转成日期格式 function ChangeDataeFormat(cellval) { var date = new Date(parseInt(cellval.replace("/Date(", "").replace(")/", ""), 10)); var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1; var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate(); return date.getFullYear() + "-" + month + "-" + currentDate; } $(function () { //div里照片列表没有加载完成显示的内容 $("#holder").text("正在加载数据...."); //去一半处理程序去获得json数据 ,加随机数防止读取缓存 $.getJSON("03-PhotoList.ashx?r=" + Math.random(), function (json) { //清空DIV $("#holder").text(""); //动态创建table var $table = $("<table id='photos' cellspacing='opx'></table>"); //把table添加到div中 $("#holder").append($table); //表头 var $tr = $("<tr><th>序号</th><th>标题</th><th>图片</th><th>点击次数</th><th>支持</th><th>反对</th><th>时间</th><th>操作</th></tr>");
$table.append($tr);
//遍历数组 for (var i = 0; i < json.length; i++) { $tr = $("<tr></tr>"); $table.append($tr); //序号 var $td = $("<td>" + (i + 1) + "</td>"); $tr.append($td); //标题 $td = $("<td><a href='06-PhotoDetail.aspx?pid=" + json[i].PId + "'>" + json[i].PTitle + "</a></td>"); $tr.append($td); //图片 $td = $("<td><a href='06-PhotoDetail.aspx?pid=" + json[i].PId + "'><img src='09-CreateMiniPhoto.ashx?url="+json[i].PUrl+"'></a></td>"); $tr.append($td); //点击次数 $td = $("<td>" + json[i].PClicks + "</td>"); $tr.append($td); //支持,自定义属性PId,保存pid的值 $td = $("<td><a pid='" + json[i].PId + "' href='javascript:void(0)'><img src='85.gif' border='0px'/><span>" + json[i].PUp + "</span></a></td>");
//给支持按钮注册事件 $("a", $td).click(function () { //获得pid var pid = $(this).attr("pid"); //当前点击的a标签 var $link = $(this); //get方式去处理顶的操作,返回字符串 $.get("04-UpClick.ashx?pid=" + pid + "&_=" + Math.random(), function (msg) { // -1失败 -2请求错误 if (msg != -1 && msg != -2) { //支持成功 //获取点击次数 //获取a标签中的span标签 var $span = $("span", $link); //将数据库读取的数据显示 $span.text(msg);
} else { alert("支持失败"); } }); //取消a标签后续操作 return false; }) $tr.append($td);
//反对 $td = $("<td><a pid='" + json[i].PId + "' href='javascript:void(0)'><img src='86.gif' border='0px' /><span>" + json[i].PDown + "</span></a></td>"); //给反对按钮注册事件 $("a", $td).click(function () { var pid = $(this).attr("pid"); //当前点击的a标签 var $link = $(this);
$.get("05-DownClick.ashx?pid=" + pid + "&_=" + Math.random(), function (msg) { // -1失败 -2请求错误 if (msg != -1 && msg != -2) { //支持成功 //获取点击次数 //获取a标签中的span标签 var $span = $("span", $link); $span.text(msg);
} else { alert("反对失败"); } }); return false; }) $tr.append($td); //时间,调用ChangeDataeFormat方法 $td = $("<td>" + ChangeDataeFormat(json[i].PTime) + "</td>"); $tr.append($td); //操作 $td = $("<td>编辑 <a pid='" + json[i].PId + "' href='javascript:void(0)'>删除</a></td>"); //给删除标签注册事件 $("a", $td).click(function () { var pid = $(this).attr("pid"); $.get("10-DeletePhoto.ashx?pid=" + pid, function (msg) { if (msg == 1) { alert("删除成功"); location.href = "03-PhotoList.aspx"; } else { alert(msg); } }) }) $tr.append($td);
} }) })
</script> </head> <body> <form id="form1" runat="server"> <center> <h3>照片列表</h3>
<div id="holder"></div> </center> </form> </body> </html>
} 2.ashx { <%@ WebHandler Language="C#" class="_03_PhotoList" %>
using System; using System.Web; using System.Web.Script.Serialization; using MyPhotos.BLL; using MyPhotos.Model; using System.Collections.Generic;
public class _03_PhotoList : IHttpHandler { public void ProcessRequest (HttpContext context) { context.Response.ContentType = "application/json";
PhotosBLL bll = new PhotosBLL(); List<Photos> list = bll.GetAllPhotos();
JavaScriptSerializer jss = new JavaScriptSerializer(); string json =jss.Serialize(list); context.Response.Write(json); } public bool IsReusable { get { return false; } }
} } } 9.无刷新评论 { 1.添加评论 { //窗体加载事件 $(function () { //加载评论列表 loadComments(); //给评论按钮注册事件 $("#btnSend").click(function () { //获得隐藏域的pid 和评论内容 var pid = $("#hdPid").val(); var text = $("#txtReply").val(); //组装成json对象 var data = { "pid": pid, "text": text }; //发给增加评论的一般处理程序 $.post("08-AddComments.ashx", data, function (msg) { if (msg == "1") { //加载评论列表 loadComments(); } else { alert("评论失败"); } });
}) }) } 2.评论列表 { //加载评论列表 function loadComments() { //清空之前的评论 $("#reply").empty(); //根据详细表中的隐藏域的值得到pid var pid = $("#hdPid").val(); $.getJSON("07-GetComments.ashx?pid=" + pid + "&_=" + Math.random(), function (json) { for (var i = 0; i < json.length; i++) { var $table = $("<table class='re'></table>"); $("#reply").prepend($table);
var $tr = $("<tr><td>" + json[i].CText + "</td></tr>"); $table.append($tr);
$tr = $("<tr><td>" + ChangeDateFormat(json[i].CTime) + "</td></tr>"); $table.append($tr);
$tr = $("<tr></tr>"); //支持 $td = $("<td><a pid='" + json[i].PId + "' href='javascript:void(0)'><img src='85.gif' border='0px'/><span>" + json[i].PUp + "</span></a></td>");
//给支持按钮注册事件 $("a", $td).click(function () { var pid = $(this).attr("pid"); //当前点击的a标签 var $link = $(this);
$.get("04-UpClick.ashx?pid=" + pid + "&_=" + Math.random(), function (msg) { // -1失败 -2请求错误 if (msg != -1 && msg != -2) { //支持成功 //获取点击次数 //获取a标签中的span标签 var $span = $("span", $link); $span.text(msg);
} else { alert("支持失败"); } }); return false; }) $tr.append($td); $table.append($tr); } }); } } } 10.无刷新支持和反对 { { //支持,自定义属性PId,保存pid的值 $td = $("<td><a pid='" + json[i].PId + "' href='javascript:void(0)'><img src='85.gif' border='0px'/><span>" + json[i].PUp + "</span></a></td>");
//给支持按钮注册事件 $("a", $td).click(function () { //获得pid var pid = $(this).attr("pid"); //当前点击的a标签 var $link = $(this); //get方式去处理顶的操作,返回字符串 $.get("04-UpClick.ashx?pid=" + pid + "&_=" + Math.random(), function (msg) { // -1失败 -2请求错误 if (msg != -1 && msg != -2) { //支持成功 //获取点击次数 //获取a标签中的span标签 var $span = $("span", $link); //将数据库读取的数据显示 $span.text(msg);
} else { alert("支持失败"); } }); //取消a标签后续操作 return false; }) $tr.append($td); }
//一般处理程序 { <%@ WebHandler Language="C#" class="_04_UpClick" %>
using System; using System.Web; using MyPhotos.BLL; using MyPhotos.Model;
public class _04_UpClick : IHttpHandler { // -1失败 -2请求错误 public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; PhotosBLL pBLL = new PhotosBLL();
string s = context.Request.QueryString["pid"]; int pid; if (int.TryParse(s, out pid)) { if (pBLL.UpdateUpClick(pid)) { Photos p = pBLL.GetPhotoByPid(pid); if (p != null) { context.Response.Write(p.PUp.ToString()); } } else { context.Response.Write("-1"); } } else { context.Response.Write("-2"); } }
public bool IsReusable { get { return false; } }
} } } 11.无刷新分页 { (1)分页存储过程 { --分页存储过程 create proc usp_MyPagedPhotos @pageSize int, --每页几条数据 @pageIndex int, --当前页码 @pageCount int output --总页数 as --总数据条数 declare @count int select @count = count(*) from TblArea set @pageCount = ceiling(@count*1.0/@pageSize) select * from (select *,row_number() over(order by AreaId desc) as num from TblArea) as t where num between @pageSize*(@pageIndex-1) + 1 and @pageSize*@pageIndex order by AreaId desc } (2)DAL { /// <summary> /// 获取分页数据 /// </summary> /// <param name="pageSize"></param> /// <param name="pageIndex"></param> /// <param name="pageCount"></param> /// <returns></returns> public List<Photos> GetPaged(int pageSize,int pageIndex,out int pageCount) { SqlParameter[] param = { new SqlParameter("@pageSize", SqlDbType.Int), new SqlParameter("@pageIndex",SqlDbType.Int), new SqlParameter("@pageCount",SqlDbType.Int) }; //设置输入参数 param[0].Value = pageSize; param[1].Value = pageIndex; //设置输出参数 param[2].Direction = ParameterDirection.Output;
//执行存储过程 DataTable dt = SQLHelper.GetTable("usp_MyPagedPhotos", CommandType.StoredProcedure, param); //获得输出参数 pageCount = Convert.ToInt32(param[2].Value);
List<Photos> photos = new List<Photos>(); foreach (DataRow dr in dt.Rows) { Photos p = RowToPhoto(dr); photos.Add(p); } return photos; } //行转化成照片对象 private Photos RowToPhoto(DataRow dr) { Photos p = new Photos(); p.PClicks = Convert.ToInt32(dr["PClicks"]); p.PDes = dr["PDes"].ToString(); p.PDown = Convert.ToInt32(dr["PDown"]); p.PId = Convert.ToInt32(dr["PId"]); p.PTime = Convert.ToDateTime(dr["PTime"]); p.PTitle = dr["PTitle"].ToString(); p.PTypeId = Convert.ToInt32(dr["PTypeId"]); p.PUp = Convert.ToInt32(dr["PUp"]); p.PUrl = dr["purl"].ToString(); p.PUserId = Convert.ToInt32(dr["PUserId"]); return p; } } (3)BLL { PhotoDAL dal = new PhotoDAL(); /// <summary> /// 获取分页数据 /// </summary> /// <param name="pageSize"></param> /// <param name="pageIndex"></param> /// <param name="pageCount"></param> /// <returns></returns> public List<Photos> GetPaged(int pageSize, int pageIndex, out int pageCount) { return dal.GetPaged(pageSize, pageIndex, out pageCount); } } (4)UI { public partial class _02_PhotoPaged : System.Web.UI.Page { int pageIndex = 1; //页码 int pageSize = 3; //页容量 int pageCount; //总页数 protected string table = ""; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //获取url上的页码 string s = Request.QueryString["page"]; if (int.TryParse(s, out pageIndex)) { } else { pageIndex = 1; } table = CreateTable(); } } string CreateTable() { //读取当前页码的照片(获取分页数据) PhotoBLL bll = new PhotoBLL(); List<Photos> list = bll.GetPaged(pageSize, pageIndex, out pageCount); //拼table StringBuilder sb = new StringBuilder(); sb.AppendLine("<a href='04-AddPhoto.ashx'>添加</a>"); sb.AppendLine("<table id='photos' cellspacing='0px'>"); sb.AppendLine("<tr><th>序号</th><th>标题</th><th>图片</th><th>点击次数</th><th>支持 </th><th>反对</th><th>时间</th><th>操作</th></tr>"); //遍历所有照片,生成tr for (int i = 0; i < list.Count; i++) { Photos p = list[i]; sb.AppendLine("<tr>"); sb.AppendLine("<td>" + (i + 1) + "</td>"); sb.AppendLine("<td><a href='02-PhotoDetails.ashx?pid=" + p.PId + "'>" + p.PTitle + "</a></td>"); sb.AppendLine("<td><img src='07-createThumbnail.ashx?url=" + p.PUrl + "' /></td>"); sb.AppendLine("<td>" + p.PClicks + "</td>"); sb.AppendLine("<td>" + p.PUp + "</td>"); sb.AppendLine("<td>" + p.PDown + "</td>"); sb.AppendLine("<td>" + p.PTime.Value.ToString("yyyy-MM-dd hh:mm:ss") + "</td>"); sb.AppendLine("<td><a href='05-UpdatePhoto.ashx?pid=" + p.PId + "'>编辑</a> <a href='03-DeletePhoto.ashx?pid=" + p.PId + "' onclick='if(!confirm(\"确定删除\")){return false;}'>删除</a></td>"); sb.AppendLine("</tr>"); }
sb.AppendLine("</table>"); //页码条 sb.AppendLine(CreatePagedBar()); return sb.ToString(); } /// <summary> /// 生成页码条 /// </summary> /// <returns></returns> string CreatePagedBar() { string str = "<a href='02-PhotoPaged.aspx?page=1'>首页</a> "; int n = 1; if (pageIndex > 1) { n = pageIndex - 1; } //上一页 str += "<a href='02-PhotoPaged.aspx?page="+n+"'>上一页</a> "; int m = pageCount; if (pageIndex < pageCount) { m = pageIndex + 1; } //下一页 str += "<a href='02-PhotoPaged.aspx?page="+m+"'>下一页</a> "; str += "<a href='02-PhotoPaged.aspx?page="+ pageCount +"'>尾页</a>"; return str; } } } }