[转载]Jquery+Ajax+phpmailer类库实现自动向指定邮箱发送邮件

mikel阅读(1401)

[转载]Jquery+Ajax+phpmailer类库实现自动向指定邮箱发送邮件 – 八戒Done – 博客园.

最近闲的无聊,写了个小不道德的整人的暗恋测试网站,实现我向友人发送带我邮箱的测试网址,朋友的测试结果自动发送到我的邮箱!(当然啦,你们也可以加上自己的邮箱去整好友)

不知道各位听懂否?不懂的就直接去试试吧~~哈,小弟邮箱肯定又要多很多测试结果的邮件了。

带我的邮箱的测试地址:http://www.arqi.cc/demo/love/love.html?em=arqicc@126.com

申请你们自己的测试地址:http://www.arqi.cc/demo/love/result.html(阿奇arqi.cc关注web,关注前端开发)

实现方式:

通过访问网址获得邮箱地址,然后利用JQuery的ajax方法传输数据到PHP邮箱服务器(此处上网下了个phpmailer类库实现)

网站源码全部公开,大家感兴趣可以访问阿奇arqi.cc复制粘贴相关源码!(love.html+result.html+JQuery库+PHPMailer类库)

<script language="javascript">
function sendemail(n1,n2,n3,n4){
    var mY_url = window.location.search;
    mY_url = mY_url.substr(1,(mY_url.length-1));
    var arr_url = mY_url.split("=");
    if(arr_url==""){
        //假如别人发现网址中含有你的邮箱,去掉了邮箱访问,就认为整人失败!
        alert("测试失败!整蛊失败!纯属娱乐,切莫较真!");
        window.location.href="http://www.arqi.cc/demo/love/result.html";
    }else{
        var emailstr=arr_url[1];
        var titlestr="你的好友"+n1+"的暗恋测试结果!";
        var contentstr="你的好友"+n1+"的暗恋对象是:"+n2+""+n3+""+n4+"!快去逗逗TA吧!暗恋测试网址:www.arqi.cc/demo/love/result.html";
        $.ajax({
                 type:"POST",
                 url:"sendemail.php", 
                 data:"email="+emailstr+"&title="+titlestr+"&content="+contentstr,
                 success:function(data){
                             alert(data);
                            alert("你被骗啦!你的暗恋对象已经发送给你的好友!"+emailstr+"!\n整蛊成功!纯属娱乐,切莫较真!");
                            window.location.href="http://www.arqi.cc/demo/love/result.html";
                     }
        });
        
    }
}
</script>
    <div id="main">
        <form id="form" method="post" onsubmit="return toResult()">
            <h2>您的姓名:</h2>
            <input type="text" id="name_self" name="name_self" class="textbox" />
            <h2>暗恋的TA的姓名:<span>(输入三个你暗恋的人的姓名,顺序越前表示越喜欢)</span></h2>
            <input type="text" id="name_lover1" name="name_lover1" class="textbox" />
            <input type="text" id="name_lover2" name="name_lover2" class="textbox" />
            <input type="text" id="name_lover3" name="name_lover3" class="textbox" />
            <div id="btnbox">
                <input type="submit" name="submit" value="马上开始暗恋配对测试吧!" class="btn" />
                <span>(点击“马上开始”表示您同意<a href="javascript:void(0);" onclick="view()">免责声明</a>)</span>
            </div>
        </form>
    </div>

PHPMailer类库的配置:当然咯还能配置附件等等功能,此处不需要,有需要的可以百度下,搜索相关文章。

PHPMailer下载(百度一下下个也行)

<?php  
    header('Content-Type: text/html; charset=utf-8');  
     require("class.phpmailer.php");   
     error_reporting(E_ERROR);  
     function smtp_mail ( $sendto_email, $subject, $body ) {  
        $mail = new PHPMailer();   
        $mail->IsSMTP();            
        $mail->Host = "smtp.126.com"; //发送邮件的SMTP服务器  
        $mail->Username = "arqicc@126.com";//发送邮件的邮箱用户名   
        $mail->Password = "arqicc";//发送邮件的邮箱密码          
        $mail->FromName =  "www.arqi.cc";//发送邮件的发件人昵称   
        $mail->SMTPAuth = true;            
        $mail->From = $mail->Username;  
        $mail->CharSet = "utf-8"; //设定邮件编码,默认ISO-8859-1,如果发中文此项必须设置,否则乱码            
        $mail->Encoding = "base64";   
        $mail->AddAddress($sendto_email); //收件人地址   
        $mail->IsHTML(true);   
        $mail->Subject = $subject;  //邮件标题
        $mail->Body = $body;  //邮件内容
        $mail->AltBody ="text/html";   
        if(!$mail->Send()) {   
             return "ERROR";   
        }
        else{  
             return "SUCCESS!";   
        }  
    }
/////获取前途传输过来的收件人地址、邮件标题、邮件内容///////////
    $email=$_POST['email'];
    $title=$_POST['title'];
    $content=$_POST['content'];
    $str=smtp_mail($email,$title,$content); //执行函数
    echo $str;//输出返回值    
?>

文章转载请注明:八戒Done–阿奇arqi.cc

[转载]SQL截取字符串(substring与patindex的使用)

mikel阅读(1353)

[转载]SQL截取字符串(substring与patindex的使用) – 爱与决择 – 博客园.

首先学习两个函数

1.substring 返回字符、binary、text 或 image 表达式的一部分。
基本语法:SUBSTRING ( expression , start , length )
expression:字符串、二进制字符串、text、image、列或包含列的表达式
start:整数,指定子串的开始位置      注:SQL中”1″表示字符串中的第一个字符,而.NET中”0″表示第一个字符
length:整数,指定子串的长度(要返回的字符数或字节数)

2.patindex 返回指定表达式中某模式第一次出现的起始位置;如果在全部有效的文本和字符数据类型中没有找到该模式,则返回零。
基本语法:PATINDEX ( ‘%pattern%‘ , expression )
pattern:字符串。可以使用通配符,但 pattern 之前和之后必须有 % 字符(搜索第一个和最后一个字符时除外)。pattern 是短字符数据类型类别的表达式
expression:表达式,通常为要在其中搜索指定模式的列,expression 为字符串数据类型类别

下面结合上面的两个函数,截取字符串中指定的字符

declare @a varchar(50)
set @a=2009年7月15日星期五
select substring(@a,1,4) 获取年份2009
declare @b int
set @b=patindex(%日%,@a) 获取’日’这个字符在字符串中的位置,即10
select substring(@a,6,@b5) 获取日期’7月15日’

[转载]WinRAR(WinZip)压缩与解压实现(C#版Window平台)

mikel阅读(849)

[转载]WinRAR(WinZip)压缩与解压实现(C#版Window平台) – Stone_W – 博客园.

本文的原理是借助Windows平台安装的WinRAR(WinZip)实现C#程序的调用(注:WinRAR压缩解压WinZip同样适用)。

先来看WinRAR(WinZip)自身的支持调用命令:

压缩命令:a {0} {1} -r 【{0}:压缩后文件名|{1}:待压缩的文件物理路径】

ex:”a 你妹.rar f:\\MM -r” (含义为将f盘下MM的文件夹压缩为”你妹.rar”文件)

解压命令:x {0} {1} -y 【{0}:待解压文件名称|{1}:待解压文件物理路径】

ex:”x 幺妹.rar f:\\幺妹 -y”(待压缩文件物理路径:”f:\\幺妹\\幺妹.rar”)

参数说明

参数

含义

a

添加文件到压缩包

x

以完整路径从压缩包解开压缩

WinZip(WinRAR)调用通用类

using System;
using System.Collections.Generic;
using System.Text;

//--------------using
using System.Diagnostics;
using Microsoft.Win32;
using System.IO;


/// <summary>
/// Name:Stone
/// DateTime: 2011/12/31 16:39:26
/// Description:WinRAR压缩
/// </summary>
public class WinRARCSharp
{
    // WinRAR安装注册表key
    private const string WinRAR_KEY = @"WinRAR.ZIP\shell\open\command";

    /// <summary>
    /// 利用 WinRAR 进行压缩
    /// </summary>
    /// <param name="path">将要被压缩的文件夹(绝对路径)</param>
    /// <param name="rarPath">压缩后的 .rar 的存放目录(绝对路径)</param>
    /// <param name="rarName">压缩文件的名称(包括后缀)</param>
    /// <returns>true 或 false。压缩成功返回 true,反之,false。</returns>
    public bool RAR(string path, string rarPath, string rarName)
    {
        bool flag = false;
        string rarexe;       //WinRAR.exe 的完整路径
        RegistryKey regkey;  //注册表键
        Object regvalue;     //键值
        string cmd;          //WinRAR 命令参数
        ProcessStartInfo startinfo;
        Process process;
        try
        {
            regkey = Registry.ClassesRoot.OpenSubKey(WinRAR_KEY);
            regvalue = regkey.GetValue("");  // 键值为 "d:\Program Files\WinRAR\WinRAR.exe" "%1"
            rarexe = regvalue.ToString();
            regkey.Close();
            rarexe = rarexe.Substring(1, rarexe.Length - 7);  // d:\Program Files\WinRAR\WinRAR.exe

            Directory.CreateDirectory(path);
            //压缩命令,相当于在要压缩的文件夹(path)上点右键->WinRAR->添加到压缩文件->输入压缩文件名(rarName)
            cmd = string.Format("a {0} {1} -r",
                                rarName,
                                path);
            startinfo = new ProcessStartInfo();
            startinfo.FileName = rarexe;
            startinfo.Arguments = cmd;                          //设置命令参数
            startinfo.WindowStyle = ProcessWindowStyle.Hidden;  //隐藏 WinRAR 窗口

            startinfo.WorkingDirectory = rarPath;
            process = new Process();
            process.StartInfo = startinfo;
            process.Start();
            process.WaitForExit(); //无限期等待进程 winrar.exe 退出
            if (process.HasExited)
            {
                flag = true;
            }
            process.Close();
        }
        catch (Exception e)
        {
            throw e;
        }
        return flag;
    }
    /// <summary>
    /// 利用 WinRAR 进行解压缩
    /// </summary>
    /// <param name="path">文件解压路径(绝对)</param>
    /// <param name="rarPath">将要解压缩的 .rar 文件的存放目录(绝对路径)</param>
    /// <param name="rarName">将要解压缩的 .rar 文件名(包括后缀)</param>
    /// <returns>true 或 false。解压缩成功返回 true,反之,false。</returns>
    public bool UnRAR(string path, string rarPath, string rarName)
    {
        bool flag = false;
        string rarexe;
        RegistryKey regkey;
        Object regvalue;
        string cmd;
        ProcessStartInfo startinfo;
        Process process;
        try
        {
            regkey = Registry.ClassesRoot.OpenSubKey(WinRAR_KEY);
            regvalue = regkey.GetValue("");
            rarexe = regvalue.ToString();
            regkey.Close();
            rarexe = rarexe.Substring(1, rarexe.Length - 7);

            Directory.CreateDirectory(path);
            //解压缩命令,相当于在要压缩文件(rarName)上点右键->WinRAR->解压到当前文件夹
            cmd = string.Format("x {0} {1} -y",
                                rarName,
                                path);
            startinfo = new ProcessStartInfo();
            startinfo.FileName = rarexe;
            startinfo.Arguments = cmd;
            startinfo.WindowStyle = ProcessWindowStyle.Hidden;

            startinfo.WorkingDirectory = rarPath;
            process = new Process();
            process.StartInfo = startinfo;
            process.Start();
            process.WaitForExit();
            if (process.HasExited)
            {
                flag = true;
            }
            process.Close();
        }
        catch (Exception e)
        {
            throw e;
        }
        return flag;
    }
}

调用方法

WinRARCSharp win = new WinRARCSharp();

win.RAR("F:\\aaa\\", "f:\\", "a.rar"); // 压缩(将“f:\\aaa\\”目录文件压缩到“f:\\a.rar”)

win.UnRAR("f:\\呦M.zip", "f:\\MM", "GG"); // 解压(将“f:\\呦M.zip”解压到“f:\\MM\\GG”目录下)

7z压缩通用类:

using System;
using System.Collections.Generic;
using System.Text;

using Microsoft.Win32;
using System.Diagnostics;
using System.IO;


/// <summary>
/// Name:Stone
/// DateTime: 2012/1/4 16:26:08
/// Description:7Z解压管理类
/// </summary>
public class _7zRAR
{

    // 7z.exe 安装地址
    private const string _7zEXE = @"D:\Program Files (x86)\7-Zip\7z.exe";

    /// <summary>
    /// 利用 7zExE 进行压缩
    /// </summary>
    /// <param name="_7zPath">将要被压缩的文件夹(物理路径)</param>
    /// <param name="filePath">压缩后的的存放目录(物理路径)</param>
    /// <returns>true 或 false。压缩成功返回 true,反之,false。</returns>
    public static bool Un7zRAR(string _7zPath, string filePath)
    {
        bool flag = false;

        string cmd;
        ProcessStartInfo startinfo;
        Process process;
        try
        {
            cmd = String.Format(@"x {0} -o{1} -y",
                _7zPath, filePath);
            startinfo = new ProcessStartInfo();
            startinfo.FileName = _7zEXE;
            startinfo.Arguments = cmd;
            startinfo.WindowStyle = ProcessWindowStyle.Hidden;

            process = new Process();
            process.StartInfo = startinfo;
            process.Start();
            process.WaitForExit();
            if (process.HasExited)
            {
                flag = true;
            }
            process.Close();
        }
        catch (Exception e)
        {
            throw e;
        }
        return flag;
    }
}


[转载]三步搞定android应用图片缓存

mikel阅读(757)

[转载]三步搞定android应用图片缓存 – 框架溜达 – 博客园.

目前很多商业应用都会涉及到从网络上读取图片数据的问题,为了节约用户流量,应用一般会将图片缓存起来。图片缓存一般分为内存缓存和外存缓存。内存缓存运 用java的缓存机制,在程序完全退出后,缓存所在的内存空间可能被其它应用程序占用从而丢失。外存缓存一般放在程序特有的访问空间或者sd卡中,在sd 卡中存放的资源为公有资源,其它程序也可以访问,且对用户来讲没有一个强制清除缓存的规范机制。综合以上,本文采用将缓存图片放置在程序的特有空间中, 其它应用程序无法访问,且用户可以在应用程序管理中的”清除数据”选项中清除缓存。

本文提供三种缓存策略:(1)LRU算法,固定缓存图片数量(max_num),当图片数量超出max_num时,将缓存中最近用的最少的图片删除。 (2)FTU算法,固定每张图片的缓存时限,以最后一次使用算起,超过时限后删除。(3)FMU算法,在存储器中固定一定大小的存储空间,超过固定空间后 将缓存中占用最大尺寸的图片删除。使用时只需要向方法体中传递图片的URL即可。

使用方法:

1.导入jar;

2. 获取服务;

3.提交url,交给程序去判断是否下载。

public class ImagecachetacticsdemoActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.item);

/*FMU*/
imageCacheManager = ImageCacheManager.getImageCacheService(this,
ImageCacheManager.MODE_FIXED_MEMORY_USED, “memory”);
imageCacheManager.setMax_Memory(1024 * 1024);

/*FTU*/
// imageCacheManager = ImageCacheManager.getImageCacheService(this,
// ImageCacheManager.MODE_FIXED_TIMED_USED, “time”);
// imageCacheManager.setDelay_millisecond(3 * 60 * 1000);

/*LRU*/
// imageCacheManager = ImageCacheManager.getImageCacheService(this,
// ImageCacheManager.MODE_LEAST_RECENTLY_USED, “num”);
// imageCacheManager.setMax_num(5);

// imageCacheManager = ImageCacheManager.getImageCacheService(this,
// ImageCacheManager.MODE_NO_CACHE_USED, “nocache”);

mImageView = (ImageView) findViewById(R.id.imageView);
new DownloadTask()
.execute(“http://www.touxiang99.com/uploads/allimg/110417/1_110417112640_2.jpg”);
}

private class DownloadTask extends AsyncTask<String, Void, Bitmap> {

@Override
protected Bitmap doInBackground(String… params) {
try {
return imageCacheManager.downlaodImage(new URL(params[0]));
catch (IOException e) {
e.printStackTrace();
}
return null;
}

@Override
protected void onPostExecute(Bitmap result) {

mImageView.setImageBitmap(result);
super.onPostExecute(result);
}

@Override
protected void onPreExecute() {
mImageView.setImageResource(R.drawable.ic_launcher);
super.onPreExecute();
}

}

private ImageView mImageView;
private ImageCacheManager imageCacheManager;

}

demo(内有jar包)

[转载]C#项目如何打包,或者叫生成安装文件

mikel阅读(910)

[转载]C#项目如何打包,或者叫生成安装文件 – 码农熊 – 博客园.

C#项目打包,安装部署

开发好的网站或程序如何打包呢?或者是叫如何生成安装文件呢?
其实这个很简单,只需要在解决方案中添加部署项目就可以了,如果是 WinForm程序的话,一般都会生成.msi为后缀的自动安装文件,当你把生成完毕的安装包发给别人安装的时候,别人只需像安装QQ那样,一步一步点击 就OK,但是这个过程中也会遇到问题,就是数字签名,如果没有数字签名,杀毒软件会有危险警告,这样别人在安装的时候就会受阻,具体的这个问题怎么解决我 在这篇文章里面就暂不描述了,先说说怎样把程序打包吧!

第一步:建立空白解决方案

第二步:添加现有项目或现有网站

这个部分就看你的需求了,你要是想发布网站的话,就选择现有网站;
在解决方案上右键,点击添加现有项目,

在打开对话框里面选择要发布的项目,点击确定

第三步:添加安装部署项目

在解决方案上右键,点击添加,添加新项目,然后选择其他项目类型,选择安装和部署,在右边选择安装项目,点击确定 

第四步:设置项目输出

在setup1上点击右键,点击添加,项目输入,在弹出的对话框中选择你要生成部署的项目,点击确定。

第五步:生成安装文件

在setup1上点击右键,点击生成,然后打开你刚才保存解决方案的那个文件夹,然后找到Setup1文件夹,然后选择Debuge文件夹,里面有两个文件,就是你想要的了,呵呵

原创:http://www.wanghaiyu.com/2011/05/c%e9%a1%b9%e7%9b%ae%e5%a6%82%e4%bd%95%e6%89%93%e5%8c%85-%e7%94%9f%e6%88%90%e5%ae%89%e8%a3%85%e6%96%87%e4%bb%b6-%e7%94%9f%e6%88%90exe-msi/

[转载]Android的UI布局总览

mikel阅读(894)

[转载]Android的UI布局总览 – 亚卓 – 博客园.

Android布局的目的是为了实现不同屏幕比例适配而设计的,有五种布局类:FrameLayout、LinearLayout、 AbsoluteLayout、RelativeLayout和TableLayout。五大布局类的继承关系如下(以FrameLayout为例):

java.lang.Object
android.view.View
android.view.ViewGroup
Android.widget.FrameLayout

。FrameLayout简介

FrameLayout框架布局,在此布局下的所有对象都固定在屏幕的做上角显示,不能指定位置。最大的特点是可以添加多个子类通过Android:layout_gravity来指定子类视图的位置。同一位置的子类视图处于层叠状,最上面的子类视图是最后添加的子类视图。

继承关系如下

java.lang.Object
android.view.View
android.view.ViewGroup
android.widget.FrameLayout

它的子类:

Known Direct Subclasses

AppWidgetHostView, CalendarView, DatePicker, GestureOverlayView, HorizontalScrollView, MediaController, ScrollView, TabHost, TimePicker, ViewAnimator

Known Indirect Subclasses

ImageSwitcher, TextSwitcher, ViewFlipper, ViewSwitcher

二。RelativeLayout简介

RelativeLayout相对布局,允许子元素指定他们相对于其他元素或者父元素的位置(通过ID指定),可以左右对齐,上下对齐,指定屏幕位置等形式来排列元素。

继承关系如下

java.lang.Object
android.view.View
android.view.ViewGroup
android.widget.RelativeLayout

常用属性介绍:

android:layout_above
Positions the bottom edge of this view above the given anchor view ID.

android:layout_alignBaseline
Positions the baseline of this view on the baseline of the given anchor view ID.

android:layout_alignBottom
Makes the bottom edge of this view match the bottom edge of the given anchor view ID.

android:layout_alignLeft
Makes the left edge of this view match the left edge of the given anchor view ID.

android:layout_alignParentBottom
If true, makes the bottom edge of this view match the bottom edge of the parent.

android:layout_alignParentLeft
If true, makes the left edge of this view match the left edge of the parent.

android:layout_alignParentRight
If true, makes the right edge of this view match the right edge of the parent.

android:layout_alignParentTop
If true, makes the top edge of this view match the top edge of the parent.

android:layout_alignRight
Makes the right edge of this view match the right edge of the given anchor view ID.

android:layout_alignTop
Makes the top edge of this view match the top edge of the given anchor view ID.

android:layout_alignWithParentIfMissing
If set to true, the parent will be used as the anchor when the anchor cannot be be found for layout_toLeftOf, layout_toRightOf, etc.

android:layout_below
Positions the top edge of this view below the given anchor view ID.

android:layout_centerHorizontal
If true, centers this child horizontally within its parent.

android:layout_centerInParent
If true, centers this child horizontally and vertically within its parent.

android:layout_centerVertical
If true, centers this child vertically within its parent.

android:layout_toLeftOf
Positions the right edge of this view to the left of the given anchor view ID.

android:layout_toRightOf
Positions the left edge of this view to the right of the given anchor view ID.

LinearLayout简介

LinearLayout线性布局,线性布局是所有布局中最常用的,他可以让其中的子元素按垂直或水平的方式排列(通过排列的方向设置),通常复杂的布局都是在LinearLayout布局中嵌套而成的

继承关系如下

java.lang.Object

android.view.View

android.view.ViewGroup

android.widget.LinearLayout

他的子类有:

Known Direct Subclasses

NumberPicker, RadioGroup, SearchView, TabWidget, TableLayout, TableRow, ZoomControls

四。AbsoluteLayout简介

AbsoluteLayout绝对布局。指定了子元素的x/y坐标值,并显示在屏幕上。该布局没有屏幕边框,允许元素之间互相重叠,在实际中不提倡使用这种布局,因为固定了位置,所以在屏幕旋转式会有不完整。

java.lang.Object

继承关系如下
android.view.View
android.view.ViewGroup
android.widget.AbsoluteLayout

他的子类有:

Known Direct Subclasses

WebView

*************This class is deprecated.
Use FrameLayout, RelativeLayoutor a custom layout instead.

五。TableLayout简介

TableLayout表格布局。将子元素的位置分配到行或列中,TableLayout布局有许多TableRow(行)组成,但没有列的概念,列是又 行中的控件数目来决定的,TableLayout也是常有布局。TableLayout不会显示行、列、单元格的边框线。

继承关系如下

java.lang.Object
android.view.View
android.view.ViewGroup
android.widget.LinearLayout
android.widget.TableLayout

他的子类有:

android:collapseColumns
setColumnCollapsed(int,boolean)
The zero-based index of the columns to collapse.

android:shrinkColumns
setShrinkAllColumns(boolean)
The zero-based index of the columns to shrink.

android:stretchColumns
setStretchAllColumns(boolean)
The zero-based index of the columns to stretch.

[转载]ASP.NET 页生命周期和页面事件处理管道

mikel阅读(1134)

[转载]ASP.NET 页生命周期和页面事件处理管道 – DebugLZQ – 博客园.

ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤。这些步骤包括 初始化、实例化控件、还原和维护状态、运行事件处理程序代码以及进行呈现。了解页生命周期非常重要,因为这样做您就能在生命周期的合适阶段编写代码,以达 到预期效果。此外,如果您要开发自定义控件,就必须熟悉页生命周期,以便正确进行控件初始化,使用视图状态数据填充控件属性以及运行任何控件行为代码。 (控件的生命周期基于页的生命周期,但是页引发的控件事件比单独的 ASP.NET 页中可用的事件多。)

一般来说,页要经历下表概述的各个阶段。除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于页。(有关更多信息,请参见 MSDN:ASP.NET 应用程序生命周期概述。)

我们知道最终我们在服务器上创建的页面对象是通过Page的一个派生类来创建的,这个类通常情况下是看不到的,包括类的名字也不是我们直接指定的。这个类是由ASP.NET服务器根据我们的页面模板文件aspx创建出来的,页面对象的ProcessRequest方法将会启动页面的生成过程。这个过程是通过页面的处理管道来完成的。

下表列出了最常用的页生命周期事件。除了列出的事件外还有其他事件;不过,大多数页处理方案不使用这些事件。而是主要由 ASP.NET 网页上的服务器控件使用,以初始化和呈现它们本身。如果要编写自己的 ASP.NET 服务器控件,则需要详细了解这些阶段。(有关创建自定义控件的信息,请参见MDDN:开发自定义 ASP.NET 服务器控件。 )

注意事项(来自MSDN):

各个 ASP.NET 服务器控件都有自己的生命周期,该生命周期与页生命周期类似。例如,控件的 InitLoad 事件在相应的页事件期间发生。

虽然 InitLoad 都在每个控件上以递归方式发生,但它们的发生顺序相反。每个子控件的 Init 事件(还有 Unload 事件)在为其容器引发相应的事件之前发生(由下到上)。但是,容器的 Load 事件是在其子控件的 Load 事件之前发生(由上到下)。

可以通过处理控件的事件(如 Button 控件的 Click 事件和 ListBox 控件的 SelectedIndexChanged 事件)来自定义控件的外观或内容。在某些情况下,可能也需处理控件的 DataBindingDataBound 事件。有关更多信息,请参见各个控件的类参考主题以及开发自定义 ASP.NET 服务器控件

当从 Page 类继承类时,除了可以处理由页引发的事件以外,还可以重写页的基类中的方法。例如,可以重写页的 InitializeCulture 方法,以便动态设置区域性信息。注意,在使用 Page_事件语法创建事件处理程序时,将隐式调用基实现,因此无需在方法中调用它。例如,无论是否创建 Page_Load 方法,始终都会调用页基类的 OnLoad 方法。但是,如果使用 override 关键字(在 Visual Basic 中为 Overrides)重写页的 OnLoad 方法,则必须显式调用基方法。例如,如果在页中重写 OnLoad 方法,则必须调用 base.Load(在 Visual Basic 中为 MyBase.Load)以运行基实现。

行文至此,希望能对各位博友有点帮助~(DebugLZQ恳请:不喜勿喷~)

[转载]分析腾讯网页登陆的加密机制

mikel阅读(1169)

[转载]分析腾讯网页登陆的加密机制 – DebugLZQ – 博客园.

问题的引入:前些天,几乎是再同时,CSDN等几大门户网站用户密码被外泄了,我没有感到很惊讶。因为现在很多大型的网站对用户信息,特别是,想用户名、 密码这样的信息保护不够完善!造成这种问题的原因是多种多样的,很多小网站本来建站的成本很低,随便找几个在校的计算机系大学生来花个几千RMB,网站就 算搭建起来了。大学生的水平是参差不齐的,特别是再计算机系(关于这一点,我绝对深信不疑,DebugLZQ对自己的老本行还是略知一二的)。这样子建立 起来的网站会有很多很多问题,当然包括安全问题(不是DebugLZQ装X啊,DebugLZQ看待这个问题也痛心疾首,DebugLZQ只是想陈述现 实,而现实往往是残酷的!)。好吧,放下小网站不说,腾讯大家都熟悉吧!就连腾讯也不是密不透风!!!下面首先分析下腾讯网页登陆的加密机制:

先介绍一下有关加密的信息:

1、打开http://xiaoyou.qq.com/

2、开启fiddler监听HTTP包

3、登录QQ,我这里就随手写了个QQ:123456密码123456验证码efta

U代表QQ号

P代表加密后的密码

verifycode代表验证码

其余都是固定的,不叙述了

要登录农场,必须要模拟发送以上数据来登录校友,而密码必须加密成如上才能通过验证。

现在讲解一下如何把明文的1234加密成09967317CCFC266ADA83C9B1BEA30825(这么恶心的密码)

这个是腾讯加密的JavaScript脚本 密码加密JavaScript。 初步看了一下觉得相当之恶心,所以在网上搜索了半天找到的一点线索就是  3次MD5加密后转换大些 + 验证码转换大写,再次MD5加密可是我按照这方法试了得到的结果却不是正确的。百思不得其解,求助了园子里认识的朋友,他给我发了段C#的代码,确实可以 得到正确的。代码如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.Text.RegularExpressions;
using System.Collections;

namespace QQ校友助手
{
    class QQPassword
    {
        public static string binl2hex(byte[] buffer)
        {
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < buffer.Length; i++)
            {
                builder.Append(buffer[i].ToString("x2"));
            }
            return builder.ToString();
        }
        public static string md5_3(string input)
        {
            MD5 md = MD5.Create();
            byte[] buffer = md.ComputeHash(Encoding.Default.GetBytes(input));
            buffer = md.ComputeHash(buffer);
            buffer = md.ComputeHash(buffer);
            return binl2hex(buffer);
        }

        public static string md5(string input)
        {
            byte[] buffer = MD5.Create().ComputeHash(Encoding.Default.GetBytes(input));
            return binl2hex(buffer);
        }

        public static string getPassword(string password, string verifycode)
        {
            return md5(md5_3(password).ToUpper() + verifycode.ToUpper()).ToUpper();
        }

    }
}

Encoding.Default.GetBytes(input)获取的是字符串的ASCII码。用VS跟踪调试了好久,发现问题出在 C#的computehash是初级hash,得到的并不是16进制的MD5字符串,需要经过binl2hex才能转换成MD5字符串。也就是说初级hash了3次,才合并大写验证码进行最后一次MD5加密

知道了原理后,我参考了Lojon的Delphi源码:

function Tfrm2.getKey: string;
var
  hash: T4x4LongWordRecord;
  hashstr: string;
begin
  SetLength(hashstr, 16);
  with TIdHashMessageDigest5.Create do
  begin
    hash := HashValue(edt2.Text);    //edt2.Text为QQ密码
    Move(hash, hashstr[1], 16);
    hash := HashValue(hashstr);
    Move(hash, hashstr[1], 16);
    hashstr := AsHex(HashValue(hashstr));
    Result := hashstr;
    Free;
  end;
end;

以上代码可以得到09967317CCFC266ADA83C9B1BEA30825这加密后的字符串。

看来腾讯也没有做的很好,也许就不存在绝对的安全!

以此为契机,DebugLZQ将分析制作在江苏大学教学行政区的上网帮助工具,和在已知校内上网账号(学号)的前提下,破解密码的工具!请期待DebugLZQ的下两篇博文。

[转载]Delphi编译/链接过程

mikel阅读(1066)

[转载]Delphi编译/链接过程 – 瓢虫Monster – 博客园.

下面展示了Delphi是怎样编译源文件,并且把它们链接起来,最终形成可执行文件。

0061

当Delphi编译项目(Project)时,将编译项目源文件、窗体单元和其他相关单元,在这个过程中将会发生好几件事情:

首 先,Object Pascal编译器把项目单元编译为二进制对象文件,然后资源编辑器将把诸如程序图标、窗体文件等资源编译成二进制资源文件,接着链接开始起作用;链接器 根据编译器产生的二进制文件,依项目需要增加一些库文件,并把这些文件综合在一起产生最终的可执行文件。

编译、创建和链接

每当点击Run按钮时,Delphi都会编译和链接程序,但它只编译改动过的单元。Delphi能知道哪个个文件已改动,哪个文件没有改到。

绝大部分时间中,我们都想看一看改变后的程序运行结果,在这种情况下,就需要点击Run按钮,程序将被编译、链接和执行。但有时候可能不想运行程序,比如只想编译程序,看一看有没有什么错误。

当默认创建一个Application时(工程文件名DRP默认为Project1),在Delphi的主菜单Project下,则有以下几个菜单选项:

0075

1、Syntax check Project1 选项, 它能让Delphi编译工程,并且报出任何错误和警告,这时检查代码错误最快的方法,Delphi只编译工程,而不执行链接,Syntax check选项的目的就是尽快检查代码的语法错误,因为链接阶段需要占额外的时间,Syntax check忽略了这一步。界面如下:

0076

2、Compile Project1 选项,就像Syntax check一样,它用来编译从最近一次编译后改动过的任何单元。它需要执行链接,因此比Syntax check 选项所占的时间稍长一点,当需要只编译和链接程序而不运行时就可以用Compile 选项。界面如下:

0077

默认情况下,该Compile选项不会显示编译状态对话框,通过主菜单【Tools | Environment Option】对话框中打开“Preferences”选项卡,在Compiling and running组合框中勾选“Show compiler progress”选项即可打开编译状态对话框,如下:

0079

Delphi编译工程的速度非常快,故一般不需要编译状态对话框,实际上,编译状态对话框增加了编译时间,因为编译状态对话框中显示信息是占用时间的。

3、Build project1 选项,占的时间最长,这个选项编译工程中的每一个单元,不管这个单元是否有改动,当编译完所有单元后,Delphi链接整个工程,并生成Project1.exe可执行文件。

不 管选择哪种方式编译工程,如果发现了错误,Code Editor 将会出现在顶级窗口,并且Code Editor 底部的信息窗口将会显示错误和警告清单。Code Editor 会把第一处出错的代码行加亮,当成功进行语法检查、编译、链接和创建后,就可以通过选择Run按钮来运行程序。

编译并建立其他Delphi程序

在Delphi中,大部分情况都是编写基于VCL的应用程序。但有时也要编写其他类型的应用程序。点击主菜单【File | New | Other..】可以看到Delphi支持的其他类型应用程序,如下:

0080

DLL Wizard,将创建动态链接库(DLL)

Console Application,Win32控制台应用程序是一种32位程序,它在Windows的DOS模式下运行。任何不需要图形接口的应用程序基本上都适合控制台应用程序。

[转载]Java网页数据采集器实例教程[中篇-数据存储]

mikel阅读(990)

[转载]Java网页数据采集器实例教程[中篇-数据存储] – SoFlash – 博客园.

简介:

作为全球运用最广泛的语言,Java 凭借它的高效性,可移植性(跨平台),代码的健壮性以及可强大的可扩展性,深受广大应用程序开发者的喜爱. 作为一门强大的开发语言,正则表达式在其中的应用当然是必不可少的,而且正则表达式的掌握能力也是那些高级程序员的开发功底之体现,做一名合格的网站开发 的程序员(尤其是做前端开发),正则表达式是必备的.

最近,由于一些需要,用到了java和正则,做了个的足球网站的 数据采集程序,由于是第一次做关于java的html页面数据采集,必然在网上查找了很多资料,但是发现运用如此广泛的java在使用正则做html采集 方面的(中文)文章是少之又少,都是简单的谈了下java正则的概念,没有真正用在实际网页html采集,所以实例教程更是寥寥无几(虽然java有它自 己的Html Parser,而且十分强大),但个人觉得作为如此深入人心的正则表达式,理应有其相关的java实例教程,而且应该很多很全.于是在完成java版的 html数据采集程序之后,本人便打算写个关于正则表达式在java上的html页面采集,以便有相关兴趣的读者更好的学习.

本期概述:

上期我们讲到了html页面的数据采集,为了方便我们今后来调用收集到的数据,这期我们要讲讲如何做数据存储(MySQL数据库).

数据采集页面 http://www.footballresults.org/league.php?all=1&league=EngPrem

关于Java操作MySQL

在使用java 操作MySql数据库之前 我们需要在项目文件中导入 一个jar包(mysql-connector-java-5.1.18-bin)

可以在MySql官网下载 http://www.mysql.com/downloads/connector/j/

如何在java项目中导入jar包?

请看这个 http://blog.csdn.net/justinavril/article/details/2783182

关于MySql数据库

如果是初学者 想使用MySql数据库的话 可以去这里 http://www.apachefriends.org/zh_cn/xampp.html 下载 XAMPP 套装

XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建 XAMPP 软件站集成软件包, 而且一键式安装, 无需修改配置文件,非常好用.

好了 需要准备的事宜都完成了 我们开始写代码

打开MySql数据库 创建数据库 和表 (拷贝如下代码 到mysql里直接执行即可)

创建MySql数据库

创建好后 我们来看看数据库结构


数据库弄好了 我们开始实施java代码

这里简单介绍下各个类以及类所包含的方法

DataStorage类 以及包含的 dataStore()方法 用于数据收集和存储

DataStorage类

  1 import java.io.BufferedReader;
  2 import java.io.IOException;
  3 import java.io.InputStreamReader;
  4 import java.net.URL;
  5 
  6 public class DataStorage {
  7 
  8     public void dataStore() {
  9         // 首先用一个字符串 来装载网页链接
 10         String strUrl = "http://www.footballresults.org/league.php?all=1&league=EngPrem";
 11         
 12         String sqlLeagues = "";
 13         try {
 14             // 创建一个url对象来指向 该网站链接 括号里()装载的是该网站链接的路径
 15             // 更多可以看看 http://wenku.baidu.com/view/8186caf4f61fb7360b4c6547.html
 16             URL url = new URL(strUrl);
 17             // InputStreamReader 是一个输入流读取器 用于将读取的字节转换成字符
 18             // 更多可以看看 http://blog.sina.com.cn/s/blog_44a05959010004il.html
 19             InputStreamReader isr = new InputStreamReader(url.openStream(),
 20                     "utf-8"); // 统一使用utf-8 编码模式
 21             // 使用 BufferedReader 来读取 InputStreamReader 转换成的字符
 22             BufferedReader br = new BufferedReader(isr);
 23             String strRead = ""; // new 一个字符串来装载 BufferedReader 读取到的内容
 24 
 25             // 定义3个正则 用于获取我们需要的数据
 26             String regularDate = "(\\d{1,2}\\.\\d{1,2}\\.\\d{4})";
 27             String regularTwoTeam = ">[^<>]*</a>";
 28             String regularResult = ">(\\d{1,2}-\\d{1,2})</TD>";
 29 
 30             //创建 GroupMethod类的对象 gMethod 方便后期调用其类里的 regularGroup方法
 31             GroupMethod gMethod = new GroupMethod();
 32             //创建DataStructure数据结构 类的对象   用于数据下面的数据存储
 33             DataStructure ds = new DataStructure();
 34             //创建MySql类的对象 用于执行MySql语句
 35             MySql ms = new MySql();
 36             int i = 0; // 定义一个i来记录循环次数 即收集到的球队比赛结果数
 37             int index = 0; // 定义一个索引 用于获取分离 2个球队的数据 因为2个球队正则是相同的
 38             // 开始读取数据 如果读到的数据不为空 则往里面读
 39             while ((strRead = br.readLine()) != null) {
 40                 /**
 41                  * 用于捕获日期数据
 42                  */
 43                 String strGet = gMethod.regularGroup(regularDate, strRead);
 44                 // 如果捕获到了符合条件的 日期数据 则打印出来
 45                 
 46                 if (!strGet.equals("")) {
 47                     //System.out.println("Date:" + strGet);
 48                     //将收集到的日期存在数据结构里
 49                     ds.date = strGet;
 50                     // 这里索引+1 是用于获取后期的球队数据
 51                     ++index; // 因为在html页面里 源代码里 球队数据是在刚好在日期之后
 52                 }
 53                 /**
 54                  * 用于获取2个球队的数据
 55                  */
 56                 strGet = gMethod.regularGroup(regularTwoTeam, strRead);
 57                 if (!strGet.equals("") && index == 1) { // 索引为1的是主队数据
 58                     // 通过subtring方法 分离出 主队数据
 59                     strGet = strGet.substring(1, strGet.indexOf("</a>"));
 60                     //System.out.println("HomeTeam:" + strGet); // 打印出主队
 61                     //将收集到的主队名称 存到 数据结构里
 62                     ds.homeTeam = strGet;
 63                     index++; // 索引+1之后 为2了
 64                  // 通过subtring方法 分离出 客队
 65                 } else if (!strGet.equals("") && index == 2) { // 这里索引为2的是客队数据
 66                     strGet = strGet.substring(1, strGet.indexOf("</a>"));
 67                     //System.out.println("AwayTeam:" + strGet); // 打印出客队
 68                     //将收集到的客队名称 存到数据结构里
 69                     ds.awayTeam = strGet;
 70                     index = 0;  //收集完客队名称后 需要将索引还原 用于收集下一条数据的主队名称
 71                 }
 72                 /**
 73                  * 用于获取比赛结果
 74                  */
 75                 strGet = gMethod.regularGroup(regularResult, strRead);
 76                 if (!strGet.equals("")) {
 77                     // 这里同样用到了substring方法 来剔除'<' 和 "</TD>" 标签 来获取我们想要的比赛结果
 78                     strGet = strGet.substring(1, strGet.indexOf("</TD>"));
 79                     //System.out.println("Result:" + strGet);
 80                     ds.result = strGet; //将收集到的比赛结果存到数据结构里
 81                     //System.out.println();
 82                     
 83                     //MySql插入语句
 84                     sqlLeagues = "INSERT INTO Premiership values(\""
 85                             + ds.date + "\"," + "\"" + ds.homeTeam
 86                             + "\"," + "\"" + ds.awayTeam + "\","+ "\"" + ds.result + "\")";
 87                     //调用MySql类的datatoMySql()方法 来执行 MySql插入语句
 88                     ms.datatoMySql(sqlLeagues);
 89                     i++; //每插入完一条记录 i+1;
 90                     System.out.println("第"+i+"条数据插入成功");
 91                 }
 92             }
 93             // 当读完数据后 记得关闭 BufferReader
 94             br.close();
 95             //System.out.println("共收集到" + i + "条比赛记录");// 打印出循环次数
 96             //当数据存储完成后 打印出 收集球队记录数
 97             System.out.println("数据存储完毕,共插入数据库"+i+"条记录");
 98         } catch (IOException e) {
 99             // 如果出错 抛出异常
100             e.printStackTrace();
101         }
102     }
103 }

DataStructure类 以及包含的 DataStructure()方法 简单的数据结构 用于数据临时性的存储

DataStructure类

 1 //创建一个数据结构类来 装载收集到的数据
 2 // DataStructure为构造函数 可以直接调用类 对象来使用其中的数据字段
 3 public class DataStructure { 
 4     //定义数据字段
 5     public String homeTeam;
 6     public String awayTeam;
 7     public String date;
 8     public String result;
 9     //空方法 用于 在DataStorage类里 来调用其数据字段
10     public DataStructure(){}
11     
12 }

GroupMethod类 以及包含的  regularGroup()方法 用于正则匹配html 源代码上的数据

GroupMethod类

 1 import java.util.regex.Matcher;
 2 import java.util.regex.Pattern;
 3 
 4 public class GroupMethod {
 5     // 传入2个字符串参数 一个是pattern(我们使用的正则) 另一个matcher是html源代码
 6     public String regularGroup(String pattern, String matcher) {
 7         Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
 8         Matcher m = p.matcher(matcher);
 9         if (m.find()) { // 如果读到
10             return m.group();// 返回捕获的数据
11         } else {
12             return ""; // 否则返回一个空值
13         }
14     }
15 }

MySql类 以及包含的 datatoMySql() 方法 用于执行SQL插入语句 将临时存储在数据结构里的数据 插入到MySql数据库中

MySql类

 1 import java.sql.Connection;
 2 import java.sql.DriverManager;
 3 import java.sql.SQLException;
 4 import java.sql.Statement;
 5 
 6 /**
 7  * @MySql类用于实施MySql查询语句
 8  */
 9 public class MySql {
10   
11     //定义MySql驱动,数据库地址,数据库用户名 密码, 执行语句和数据库连接  
12     public String driver = "com.mysql.jdbc.Driver";
13     public String url = "jdbc:mysql://127.0.0.1:3306/htmldatacollection";
14     public String user = "root";
15     public String password = "root";
16     public Statement stmt = null;
17     public Connection conn = null;
18     
19     //创建一个插入数据的方法
20     public void datatoMySql(String insertSQl) {
21 
22         try {
23             try {
24                 Class.forName(driver).newInstance();
25             } catch (Exception e) {
26                 System.out.println("Unable to find the local driver");
27                 e.printStackTrace();
28             }
29             //创建连接
30             conn = DriverManager.getConnection(url, user, password);
31             //创建一个 Statement 对象来将 SQL 语句发送到数据库
32             stmt = conn.createStatement();
33         } catch (SQLException e) {
34             e.printStackTrace();
35         }
36         try {
37             //执行SQL 插入语句
38             stmt.executeUpdate(insertSQl);
39         } catch (SQLException e) {
40             e.printStackTrace();
41         }
42         try {
43             //执行完 停止执行语句
44             stmt.close();
45             //执行完关闭数据库连接
46             conn.close();
47         } catch (SQLException e) {
48             e.printStackTrace();
49         }
50     }
51 }

Main 主函数 用于数据输出

Main主函数

1 public class Main {
2     public static void main(String[] args) {
3          //在主函数里调用DataStorage类里的dataStore()方法
4         DataStorage ds = new DataStorage();
5         ds.dataStore();
6     }
7 }

好了 下面我们来执行下 看看结果

数据采集页面 http://www.footballresults.org/league.php?all=1&league=EngPrem

Html页面截图-初始阶段

MySql数据库截图-初始阶段

Html页面截图-结束阶段

MySql数据库截图-结束阶段

一共收集到 189条记录

MySql数据库显示 189 行数据


附上源代码下载

http://files.cnblogs.com/longwu/htmlDataStorage.zip