首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

12.2  基础代码

Ajax小偷程序基础代码分为两部分:客户端和服务器端。客户端主要是对XMLHTTP对象的封装,这里采用前面章节中的xmlhttp.js文件,在此不再赘述。服务器端代码文件主要包括:thief.cs、tools.cs和sql.cs。下面分别对这些文件进行讲述。

12.2.1  小偷类Thief

Thief类是本章程序的核心,它用于获取远程数据。该类中分别定义了“GET”和“POST”两种获取方式。其中还定义了一个UrlEncode()私有方法,用来对URL进行编码。并且,GET方法有一种重载形式,允许选择指定的编码方式进行读取。Thief类的实现代码如下:

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Net;

using System.IO;

using System.Text;

//小偷类

public class Thief

{

     public Thief()                                  //初始化

     {

     }

     //通过post方法远程获取一个页面;web:页面的路径;postData:post的数据信息

     public static string Post(string Web, string postData)

     {

         string str = ""; //要返回的结果

         postData = postData.Replace(" ", "%20");      //替换空格

         try

         {

             //获取URL并发送字串

             HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create

             (Web);

             //定义这个Stream只是为了得到发送字串 经过编码之后得到的byte的长度

             //因为如果字符串中存在中文 使用postData.Length得到长度和编码之后的长度是不一样的

             Stream myStream = new MemoryStream();

             //用默认编码 得到Stream               

             StreamWriter myStreamWriter = new StreamWriter(myStream, Encoding.Default);
                  my Stream Writer.Write(postData);

             myStreamWriter.Flush();

             long len = myStream.Length;                //目的完成

             myStreamWriter.Close();                    //关闭流

             //请求的类型

             myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";

             myHttpWebRequest.ContentLength = len;      //长度

             myHttpWebRequest.Method = "POST";          //方式

             //得到请求数据流

             Stream newStream = myHttpWebRequest.GetRequestStream();

             //编码使用Encoding.Default ,用它得到的中文不会出现乱码,特别是把request("")
                  //得到的值写入sql
                  //数据库的时候

             myStreamWriter = new StreamWriter(newStream, Encoding.Default);

             myStreamWriter.Write(postData);

             myStreamWriter.Close();

             //获取本次的回馈,先创建接收回馈的类HTTPWEBRESPONSE

             HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.
                  GetResponse();

             //创建接收回馈的字节流类

             Stream receiveStream = myHttpWebResponse.GetResponseStream();

                                                        //得到回写的字节流

             Encoding encode = System.Text.Encoding.Default;    //默认编码

             StreamReader readStream = new StreamReader(receiveStream, encode);

             str = readStream.ReadToEnd();                  //读出返回字符串

             readStream.Close();

             myHttpWebResponse.Close();                     //关闭资源

             return str;

         }

         catch (Exception e)

         {

              throw e;

        }

     }

     //对url进行编码;url:请求的路径;enc:编码格式

     private static string UrlEncode(string url, Encoding enc)

     {

          byte[] bs = enc.GetBytes(url);                   //得到字节表示的数组

          StringBuilder sb = new StringBuilder();          //用于返回结果

          for (int i = 0; i < bs.Length; i++)

         {

             //asc码在128以下,直接添加

              if (bs[i] < 128)     

                    sb.Append((char)bs[i]);

              else

              {

                    sb.Append("%" + bs[i++].ToString("x").PadLeft(2, '0'));

                                                        //以格式化好的样式添加

                    sb.Append("%" + bs[i].ToString("x").PadLeft(2, '0'));

              }

         }

         return sb.ToString();

     }

     //通过get方法远程获取一个页面;url:要获取页面的路径;enc:编码方式

     public static string Get(string url, Encoding enc)

     {

          string tempurl = UrlEncode(url, enc);                //对url进行编码

          HttpWebRequest webr = (HttpWebRequest)WebRequest.Create(tempurl);

                                                        //创建请求

          HttpWebResponse wb = (HttpWebResponse)webr.GetResponse();

          Stream sr = wb.GetResponseStream();              //得到返回数据流

          StreamReader sr1 = new StreamReader(sr, enc);        //用于读取数据流的内容

          string zz = sr1.ReadToEnd();                     //读取完成

          sr1.Close();

          wb.Close();                                      //关闭连接

          return zz;

     }

     //以指定GB2312编码的方式,通过get方法远程获取一个页面;url:要获取页面的路径

     public static string Get(string url)

     {

           Encoding enc = Encoding.GetEncoding("gb2312");

           return Get(UrlEncode(url, enc), enc);

     }

}

12.2.2  工具类Tools

小偷程序和正则表达式应用密切相关。Tools类利用正则表达式过滤掉一些特定标记,如超链接、控制符等。其中,它还包括一个方法getpost(),用于获取POST过来的参数。Tools.cs的代码如下:

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.HtmlControls;

using System.Text.RegularExpressions;

using System.Text;

// 工具类

public class Tools

{

     public Tools()

     {

     }

     //删除控制符

     public static string delOption(string str)

     {

         eturn Regex.Replace(str, @"(\n)|(\t)|(\r)|(\v)|(\f)", "");

     }

     //删除超链接

     public static string DelLink(string str)

     {

          if (str != null && str.Trim() != "")

                 return Regex.Replace(str, "(<a[^>]+>)|(</a *>)", "");

          return str;

     }

     // 得到Post的数据

     public static string getpost()

     {

          HttpRequest req = HttpContext.Current.Request;//当前请求

          StringBuilder sb = new StringBuilder();

          string[] keyall = req.Form.AllKeys;          //表格的内容

          foreach (string str in keyall)               //添加每个参数

          {

               sb.AppendFormat("{0}={1}&", str, req.Form[str]);

          }

          if (sb.ToString().EndsWith("&"))             //如果以&结尾,删除这个字符

          {

                sb.Remove(sb.Length - 1, 1);

          }

          return sb.ToString();

     }

     // 删除标记;str:输入字符串;tag:标记名称;isContent:是否清除内容

     public static string delTag(string str, string tag, bool isContent)

     {

          if (tag == null || tag == "")                //没有指定标记

          {

                 return str;

          }

          if (isContent)                                   //要求清除内容

          {

                 return Regex.Replace(str, string.Format(@"<({0})[^>]*>(.*?)<\/\1>",
                      tag), "", RegexOptions.IgnoreCase);

          }

          //清除标记

          return Regex.Replace(str, string.Format(@"(<{0}[^>]*(>)?)|(</{0}[^>]*>)|",
               tag), "", RegexOptions.IgnoreCase);

     }

}

12.2.3  数据库操作类Sql

Sql类负责数据库操作。它主要由两个方法组成:GetDS()和ExecuteSql(),分别用来实现数据查询和非查询语句的执行。代码如下所示:

using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

using System.Data.SqlClient;

//数据库操作类

public class Sql

{

     private string str;                                 //数据库连接字符串

     public SqlConnection Con;                           //数据库连接

     public Sql()

     {

          str = GetConn();                                 //得到数据库连接字符串

          Con = new SqlConnection(str);                    //数据库连接对象

     }

     public static string GetConn()

     {

          //数据库的路径

          string path=System.Web.HttpContext.Current.Server.MapPath(System.Web.
               HttpContext. Current.Request.ApplicationPath);

          //数据库连接字符串

          return "Data Source=.\\SQLEXPRESS;AttachDbFilename=\"" + path + "\\App_ Data\\tv.mdf\";Integrated Security=True;User Instance=True";

     }

     // 输入查询字符串,返回dataset

     public DataSet GetDS(string sql)

     {

          SqlCommand command = new SqlCommand(sql, Con);   //初始化命令对象

          command.CommandText = sql;                       //赋予语句

          DataSet dt = new DataSet();

          SqlDataAdapter da = new SqlDataAdapter(command); //适配器

          Con.Open();

          da.Fill(dt);                                     //获得数据

          command.Connection.Close();                      //关闭连接

          return dt;

     }

     // 是否关闭数据库连接  可以选择;sql。语句;closeConnection:是否关闭连接

     public void ExecuteSql(string sql, bool closeConnection)

     {

          if (Con.State != ConnectionState.Open)       //如果连接未打开,则打开连接

                Con.Open();

          SqlCommand Com = new SqlCommand(sql, Con);        //命令

          Com.ExecuteNonQuery();                       //执行

          if (closeConnection) Con.Close();                //如果需要关闭,则关闭

     }

}

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论