自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

代码如何写

不想引用名人格言,因为,我要有自己的性格。

  • 博客(26)
  • 资源 (17)
  • 收藏
  • 关注

转载 P2P 之 UDP穿透NAT的原理与实现

论坛上经常有对P2P原理的讨论,但是讨论归讨论,很少有实质的东西产生(源代码)。呵呵,在这里我就用自己实现的一个源代码来说明UDP穿越NAT的原理。首先先介绍一些基本概念:    NAT(Network Address Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的,它的主要目的就是为了能够地址重用。NAT分为两大类,基本的NAT和NAPT(Networ

2009-01-21 09:38:00 336

原创 某个婚恋网---Web上邮件收发的DB设计

       噢!为什么好日子总是那么快就过去了,我的命真苦啊!!!!。接下来,又要开始新任务了郁闷!话不多说。开始今天的正题。Web上邮件收发的DB设计,这是某个婚恋网上DB设计上的一部分,由于是第一次建Blog,也是第一次发贴,确实有点紧张,希望各位看官多提意见。       总的说来。这个邮件收发,其实就是消息的相互传递,并不那种E-Mail。但是功能与些类似,说穿了,一个是读写邮件服务

2009-01-17 09:28:00 1356 3

转载 如何学好日语五十音图?

如何学好日语五十音图?          日语的字母称为假名(かな),有平假名(ひらがな)和片假名(かたかな)两种。平假名和片假名是对应的,有多少平假名就有多少片假名。记假名的时候,只需把平假名记住就可以了。片假名以后学单词的时候再记。也就是学一个单词,有几个片假名就记住几个。如アメリカ(美国)是4个片假名,那么就记住这4个就可以了。随着单词量的增加,片假名就全认识了。  

2009-06-26 13:11:00 734

原创 如何记忆日语单词

如何记忆日语单词? 学习日语的人常感记词困难。日语词确实难记,因为难寻规律。学习印欧语系诸语,可用词素分析法将词分解为词干和词缀,加以整理,即便利于记住。日语词不是这样由词干和词缀构成的,词素分析法用不上。日语词的来源不一,构成方式复杂。有和语词,有汉语词,有混合词,有派生词;此就其来源而论。在读音方面,有音读,有训读,有音训混读;同为音读,尚可分为汉音,吴音、唐音等等

2009-06-26 13:10:00 465

原创 如何快速有效地记忆日语单词

 如何快速有效地记忆日语单词“不积跬步无以至千里,不汇小流无以成江海。”外语的学习也同样,都是先从最为枯燥的单词积累开始。单词如同贝壳,语法则是粘合剂,加之你的联想和创意,便可创作出一件件巧夺天工的工艺品。而许多外语学习者谈到,记单词是最令他们头痛的。其实单词记忆并不难,主要还是记忆方法的问题,方法得当,便可事半功倍。下面结合自身体会浅谈几点日语单词的记忆方法,希望能对

2009-06-26 13:08:00 715

翻译 提高日语听力的有效方法

 提高日语听力的有效方法首先,您必须学过日语,并且掌握了大约1000个单词,这是前提条件。我这里所说的“掌握了”,是指,我单独说出一个单词,比如“さくら”,你就能听出来哦,是“さくら”,中文意思是“樱花”,但是把这个词放在一个长句子中,你就听不出来了,因为你的听力(ヒヤリング)比较差。  随后,你必须从今天开始,坚持每天晚上8点钟,收听中国国际广播电台(CRI)的日

2009-06-26 13:07:00 399

原创 教你如何轻松背单词

教你如何轻松背单词日语小技巧(1)  学习日语的人常感记词困难。日语词确实难记,因为难寻规律。学习印欧语系诸语,可用词素分析法将词分解为词干和词缀,加以整理,即便利于记住。日语词不是这样由词干和词缀构成的,词素分析法用不上。日语词的来源不一,构成方式复杂。有和语词,有汉语词,有混合词,有派生词;此就其来源而论。在读音方面,有音读,有训读,有音训混读;同为音读,尚可分为汉音,

2009-06-26 13:05:00 682

转载 国内网页设计网站网址大全

一、网页设计类 蓝色理想 http://www.blueidea.com 网页设计师联盟 http://www.68design.net 网页设计大本营 http://www.code-123.com 我爱设计网 http://www.52design.com 视觉中国 http://www.chinavisual.com 设计在线 http://www.dolcn.com 网易

2009-03-25 13:31:00 401

转载 String 类型

String 类型公开了以下方法。方法    名称 说明     Clone 返回对此 String 实例的引用。      Compare 已重载。 比较两个指定的 String 对象。      CompareOrdinal 已重载。 通过计算每个字符串中相应 Char 对象的数值来比较两个 String 对象。     CompareTo 已重载。 将此实例与指定的对象或 String

2009-03-05 11:33:00 304

原创 充分利用ASP.NET的三种缓存提高站点性能

 [简介]  ASP.NET提供三种主要形式的缓存:页面级输出缓存、用户控件级输出缓存(或称为片段缓存)和缓存API。输出缓存和片段缓存的优点是非常易于实现,在大多数情况下,使用这两种缓存就足够了。 而缓存API则提供了额外的灵活性(实际上是相当大的灵活性),可用于在应用程序的每一层利用缓存。本文全面介绍了这三种缓存技术在系统各层中的应用。   在ASP.NET提供的许多特性中,缓存支持无

2009-02-12 09:28:00 245

转载 通过Web Services上传和下载文件

随着Internet技术的发展和跨平台需求的日益增加,Web Services的应用越来越广,我们不但需要通过Web Services传递字符串信息,而且需要传递二进制文件信息。下面,我就分别介绍如何通过Web Services从服务器下载文件到客户端和从客户端通过Web Services上载文件到服务器。  一:通过Web Services显示和下载文件  我们这里建立的Web Serv

2009-02-12 09:23:00 232

转载 Asp.net动态生成html页面

  此功能适用于后台数据库功能不强的web站点,即大部分文本不是存放在数据库的记录中,而是放在html文件或者xml文件中,仅仅把索引放到数据库中,如文章标题、类别、查询关键字等。这样适合于后台没有诸如MS Sql Server这样的数据库支持的Web站点。   适用于新闻发布系统,比如sina、163等都是采用动态生成html页面的。   适用于需动态定制页面的程序。比如论坛、聊天室等。可以加载

2009-02-12 09:20:00 425

转载 如何在上传的图片上加上版权文字

很多时候需要在用户上传的图片上加上版权或者一些其他的附加文字信息,如何实现这样的功能,下面帖个简单实现的例子,起到抛砖引玉的作用。      void UploadBtn_Click(Object sender, EventArgs e) {        String filename;        String filename1;        String[] filename2;   

2009-02-12 09:19:00 697

转载 Asp.Net上传文件示例(保存文件路径到数据库)

把下面的代码保存为Upload.aspx即可运行(事先在同目录下建立一个Upload文件夹保存上传的文件,再建立一个数据库、表Upload,字段ID:自动编号,FilePath:文本型):  Sub UploadFile()Sub UploadFile(sender As Object, e As EventArgs)    Dim FileExt    FileExt = LCase(R

2009-02-12 09:16:00 1178

转载 ASP.NET如何生成图片验证码(简单)

 新建一个页面image.aspx,添加命名空间:using System.Drawing.Imaging;using System.IO;  然后在Page_load事件拷入如下代码:   //生成4位的验证码   string tmp = RndNum(4);   HttpCookie a = new HttpCookie("ImageV",tmp);      Response.

2009-02-12 09:15:00 386

转载 如何显示在线人数和所在位置

  一、原理在.net中的global.asax中有Application_AuthenticateRequest事件和Application_BeginRequest事件是在每次访问aspx文件都会触发。但是Application_BeginRequest中不能对已经经过FROMS身份验证的身份ticket票进行识别。所以只能放到Application_AuthenticateRequest中去

2009-02-12 09:13:00 340

转载 ASP.NET如何跨站抓取页面

导 读: 在这里用到了好几个类:WebRequestFactory、HttpWebRequest、HTTPWEBRESPONSE 和 STREAMREADER。前三个用来建立一个HTTP连接,然后通过此连接建立一个STREAMREADER对象,最后将得到的数据赋值给一个字符变量,在页面上显示。 该文中几个类的使用是值得注意的地方。  豆腐在以前的文章中 讲过 如何用 PHp 和 Asp 跨站抓取别

2009-02-12 09:12:00 371

转载 ASP.NET中文件上传下载方法集合

文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括:   1、如何解决文件上传大小的限制   2、以文件形式保存到服务器   3、转换成二进制字节流保存到数据库以及下载方法   4、上传Internet上的资源   第一部分:   首先我们来说一下如何解决ASP.net中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制

2009-02-12 09:11:00 286

转载 ASP.NET页面下载程序

在网站的制作中经常需要开发下载文件的功能,下面三种下载文件的办法:    1、asp实现下载的代码    <%    filename = Request.QueryString("FileName")    if filename = "" then    Response.Write "请输入filename参数,指定下载的文件名"    else    Response.ContentTyp

2009-02-12 09:09:00 414

原创 JavaScript中confirm,alert,prompt的用法

 window.confirm 参数就只有一个。显示提示框的信息。按确定,返回true;按取消返回false。                var bln = window.confirm("确定吗?");      alert(bln)              window.alert参数,只有一个,显示警告框的信息;无返回值。                wind

2009-02-12 09:05:00 334

转载 Document对象详解

document 文挡对象 - JavaScript脚本语言描述---------------------------------------------------------------------注:页面上元素name属性和JavaScript引用的名称必须一致包括大小写   否则会提示你一个错误信息 "引用的元素为空或者不是对象"------------------------------

2009-02-12 09:04:00 458

转载 基于ASP.NET与XML的网络硬盘开发(2)

 2、创建文件夹及设置访问权限         在当前路径下输入新文件夹名称来创建新文件夹,通过调用.net的IO名字空间中的类库 Directory方法来实现该操作:Directory.CreateDirectory(string directory),字符串directory表示新建文件夹的完整路径,该方法默认向所有用户开放新文件夹的完全读写访问权限。对于网络硬盘共享根文 件夹可手动进行创建,

2009-02-11 15:11:00 296

转载 Asp.net与Xml开发网络硬盘技术1

 文件传送常用的三种方式FTP、Email及“网上邻居”都在一定程度上实现了文件数据的交流,但它们都主要面向“点对点”的传送,无法实现“一块空间,资源互见”的应用需求,这种基于“点对多”的共享模式需要寻求另外的传输途径,网络硬盘就是一种很好的解决方式。常用传输方式及其在特定环境下面临的困难我们经常有这样的应用需求:通过网络交换公共数据文件以实现资源共享,同时保护私有数据不被非法访问,并使用简单、直

2009-02-11 15:08:00 329

转载 用ASP.NET实现在线用户统计

一、用户显示页面的使用   首先,我们来看看怎样现实当前网站的访问用户数量,程序代码如下:       <%@ Page Language="c#" debug="true" %>   <html>   <head>   <SCRIPT LANGUAGE="c#" RUNAT="server">   private void Page_Load(object sender, Syste

2009-02-11 15:06:00 323

原创 在网页中插入视频播放代码全集

1。avi格式 代码片断如下: classid="clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA"> showcontrols="1" autostart="1" autorewind="0" playcount="0" moviewindowheight="240" moviewindowwidth="320" filename="/Mb

2009-01-23 11:03:00 2057

原创 今天又走了好多人

今天又有很多同事回家了.公司越来越冷清了.

2009-01-19 09:22:00 326

很不错的仿VS开发环境的窗口停靠控件

本资源绝对良心。是开发窗口编辑器的神级资源。窗口可灵活在左边、右边、上边、下边。即可全部多窗口合并,也可分开。

2019-12-06

C#不美观实例用的线条控件

亲测可用的直线控件,优点,除条条外,控件全部透明。在线条相交时,有理想的效果。可配置线条宽度、颜色、锯齿消除等属性

2019-12-06

C# winform DesignSurface界面设计类。功能强大

C# .net framework 画面设计类,包括designsurfaceext_release.zip designsurfaceext_tinyformdesigner_sourcecode.zip pDesigner_designsurfaceext2_release.zip pFDesigner_sourcecode_and_demo.zip 篇文章描述一个增加了设计功能(TabOrder, UndoEngine,对齐线/网格对齐)的.net 2.0 中DesignSurface扩展类。这个类托管在DLL程序集中并准备在.net解决方案中使用。

2018-12-05

Spring Boot实战

真的很清楚,不是早期扫描版本,就是真正的电子书,欢迎java爱好者下载

2018-09-17

360手机助手Demo-14.2.6

项目名称:[精仿]360手机助手-14.2.6更新(CSkin Demo) 界面库版本号:14.2.6 最新版本 下载内容: 精仿360手机助手源码一份, 可引用至工具箱最新版CSkin.dll一份 实现功能: 1.发光标题。 2.直角边框和阴影。 3.360手机助手主界面模仿。 4.多系统支持,不需要win8系统,即可实现win8风格的360手机助手。 5.自定义控件的美化使用。 界面库更新文档: CC2014-2.6 1.修复拖动好友出现的负值BUG和拖动后有机率会消失的问题。 2.好友列表DoubleClickSubItem事件添加回调参数MouseEventArgs,用于判断鼠标操作的一些参数,如:左键双击还是右键双击判断。 3.对SkinDataGridView属性进行部分重构,颜色美化属性增加。 4.窗体加入绘制模式边框颜色属性BorderColor和InnerBorderColor 5.解决SkinTabControl left和right绘制模式下tab标签悬浮样式不变化问题。 6.所有控件采用最高质量模式绘制文字,防止字体模糊以及锯齿。 CC2013-12.8 1.优化SkinTabControl的效率,不再呢么闪烁,360D

2018-05-21

Android 新手开发教程

Android 新手开发教程 不用多讲了,从基础开始。

2013-06-04

JAVA开发实战经典

目 录 第1部分 Java基础程序设计 第1章 Java概述及开发环境搭建 2 视频讲解:35分钟 1.1 认识Java 2 1.1.1 什么是Java 2 1.1.2 Java语言的特点 3 1.1.3 Java程序的运行机制和Java 虚拟机 5 1.2 Java开发环境搭建 6 1.2.1 JDK的安装与配置 7 1.2.2 编写第1个Java程序 8 1.2.3 classpath属性的作用 9 1.3 本章要点 10 1.4 习题 10 第2章 简单的Java程序 11 视频讲解:20分钟 2.1 一个简单的Java范例 11 2.2 Java程序的注释 13 2.3 Java中的标识符 13 2.4 Java中的关键字 14 2.5 变量和常量 14 2.6 本章要点 15 2.7 习题 15 第3章 Java基础程序设计 16 视频讲解:2小时09分钟 3.1 数据类型划分 16 3.2 基本数据类型 17 3.2.1 整数类型 17 3.2.2 数据的溢出 18 3.2.3 字符类型 19 3.2.4 浮点数类型与双精度浮 点数类型 21 3.2.5 布尔类型 22 3.2.6 基本数据类型的默认值 22 3.3 数据类型的转换 23 3.3.1 数据类型的自动转换 23 3.3.2 数据类型的强制转换 25 3.4 运算符、表达式与语句 26 3.4.1 运算符 26 3.4.2 简洁表达式 41 3.5 选择与循环语句 43 3.5.1 程序的结构 43 3.5.2 选择结构 45 3.5.3 循环结构 51 3.5.4 循环的中断 56 3.6 本章要点 58 3.7 习题 59 第4章 数组与方法 60 视频讲解:1小时48分钟 4.1 数组的定义及使用 60 4.1.1 一维数组 60 4.1.2 数组中元素的表示方法 62 4.1.3 数组的静态初始化 65 4.1.4 数组应用范例 66 4.1.5 二维数组 68 4.1.6 多维数组 71 4.2 方法的声明及使用 72 4.2.1 方法的定义 72 4.2.2 方法的重载 74 4.2.3 使用return结束一个方法 76 4.2.4 方法的递归调用 76 4.3 数组的引用传递 77 4.3.1 传递及返回数组 77 4.3.2 范例——数组排序 79 4.3.3 范例——数组复制 81 4.4 Java新特性对数组的支持 82 4.4.1 Java新特性——可变参数 82 4.4.2 Java新特性——foreach 输出 83 4.5 本章要点 84 4.6 习题 84 第2部分 Java面向对象程序设计 第5章 面向对象(基础篇) 88 视频讲解:6小时34分钟 5.1 面向对象的基本概念 88 5.2 类与对象 90 5.2.1 类与对象的关系 90 5.2.2 类的定义 91 5.2.3 对象的创建及使用 92 5.2.4 创建多个对象 94 5.3 封装性 98 5.4 构造方法 102 5.5 匿名对象 106 5.6 实例讲解——类设计分析 107 5.7 String 111 5.7.1 实例化String对象 111 5.7.2 String的内容比较 112 5.7.3 String两种实例化方式的 区别 114 5.7.4 字符串的内容不可改变 116 5.7.5 String类中常用方法 117 5.8 引用传递及基本应用 123 5.8.1 引用传递 123 5.8.2 接收本类的引用 126 5.8.3 范例——一对一关系 127 5.8.4 范例——进一步深入 一对一关系 129 5.9 this关键字 131 5.9.1 使用this调用本类中的 属性 131 5.9.2 使用this调用构造方法 134 5.9.3 this表示当前对象 136 5.10 static关键字 140 5.10.1 使用static声明属性 140 5.10.2 使用static声明方法 143 5.10.3 static的相关应用 145 5.10.4 理解main方法 146 5.11 代码块 148 5.11.1 普通代码块 148 5.11.2 构造块 148 5.11.3 静态代码块 149 5.12 构造方法私有化 151 5.12.1 问题的引出 151 5.12.2 问题的解决 152 5.12.3 程序的意义 153 5.13 对象数组 154 5.14 内部类 156 5.14.1 内部类的基本定义 156 5.14.2 使用static定义内部类 157 5.14.3 在外部访问内部类 158 5.14.4 在方法中定义内部类 159 5.15 实例讲解 160 5.15.1 系统登录 160 5.15.2 单向链表实现(1) 163 5.15.3 单向链表实现(2) 165 5.16 本章要点 168 5.17 习题 168 第6章 面向对象(高级篇) 170 视频讲解:4小时20分钟 6.1 继承的基本概念 170 6.2 继承的进一步研究 176 6.2.1 子类对象的实例化过程 176 6.2.2 方法的覆写 178 6.2.3 super关键字的作用 182 6.3 范例——继承的应用 183 6.4 final关键字 186 6.5 抽象类的基本概念 187 6.6 接口的基本概念 192 6.7 对象的多态性 197 6.8 instanceof关键字 202 6.9 抽象类与接口的应用 204 6.9.1 为抽象类与接口实例化 204 6.9.2 抽象类的实际应用——模板 设计 206 6.9.3 接口的实际应用——制定 标准 208 6.9.4 设计模式——工厂设计 209 6.9.5 设计模式——代理设计 213 6.9.6 设计模式——适配器设计 214 6.9.7 内部类的扩展 216 6.9.8 抽象类与接口之间的关系 217 6.10 实例分析:宠物商店 218 6.11 Object类 224 6.11.1 基本作用 224 6.11.2 主要方法 224 6.11.3 接收任意引用类型的对象 227 6.12 包装类 228 6.12.1 包装类介绍 228 6.12.2 装箱与拆箱 229 6.12.3 包装类应用 230 6.13 匿名内部类 231 6.14 本章要点 233 6.15 习题 234 第7章 异常的捕获及处理 235 视频讲解:1小时18分钟 7.1 异常的基本概念 235 7.1.1 为什么需要异常处理 235 7.1.2 在程序中使用异常处理 236 7.1.3 异常类的继承结构 241 7.1.4 Java的异常处理机制 242 7.2 throws与throw关键字 245 7.2.1 throws关键字 245 7.2.2 throw关键字 246 7.2.3 范例——throw与throws的 应用 247 7.3 Exception类与Runtime Exception类 248 7.4 自定义异常类 249 7.5 断言 250 7.6 本章要点 251 7.7 习题 251 第8章 包及访问控制权限 252 视频讲解:55分钟 8.1 包的概念及使用 252 8.1.1 包的基本概念 252 8.1.2 import语句 254 8.1.3 系统常见包 257 8.1.4 Java新特性——静态 导入 258 8.2 jar命令的使用 259 8.3 访问控制权限 261 8.4 Java命名规范 263 8.5 本章要点 263 8.6 习题 263 第3部分 Java应用程序设计 第9章 多线程 266 视频讲解:2小时36分钟 9.1 进程与线程 266 9.2 Java中线程的实现 267 9.2.1 继承Thread类 267 9.2.2 实现Runnable接口 271 9.2.3 Thread类和Runnable接口 273 9.3 线程的状态 276 9.4 线程操作的相关方法 277 9.4.1 取得和设置线程名称 277 9.4.2 判断线程是否启动 280 9.4.3 线程的强制运行 281 9.4.4 线程的休眠 282 9.4.5 中断线程 282 9.4.6 后台线程 283 9.4.7 线程的优先级 284 9.4.8 线程的礼让 286 9.5 线程操作范例 287 9.5.1 实现一——继承Thread类 287 9.5.2 实现二——实现Runnable 接口 288 9.6 同步与死锁 289 9.6.1 问题的引出 289 9.6.2 使用同步解决问题 291 9.6.3 死锁 293 9.7 线程操作案例——生产者及 消费者 296 9.7.1 程序的基本实现 296 9.7.2 问题解决1——加入同步 299 9.7.3 Object类对线程的支持——等 待与唤醒 301 9.7.4 问题解决2——加入等待 与唤醒 302 9.8 线程的生命周期 303 9.9 本章要点 305 9.10 习题 306 第10章 泛型 307 视频讲解:1小时52分钟 10.1 为什么要使用泛型 307 10.2 泛型应用 310 10.2.1 泛型的基本应用 310 10.2.2 使用泛型修改代码 313 10.2.3 泛型应用中的构造方法 314 10.2.4 指定多个泛型类型 315 10.3 泛型的安全警告 316 10.4 通配符 318 10.4.1 匹配任意类型的通配符 318 10.4.2 受限泛型 320 10.5 泛型与子类继承的限制 323 10.6 泛型接口 324 10.6.1 定义泛型接口 324 10.6.2 泛型接口的两种实现方式 325 10.7 泛型方法 326 10.7.1 定义泛型方法 327 10.7.2 通过泛型方法返回泛型类 实例 327 10.7.3 使用泛型统一传入的参数 类型 328 10.8 泛型数组 329 10.9 泛型的嵌套设置 330 10.10 范例——泛型应用 331 10.11 本章要点 335 10.12 习题 335 第11章 Java常用类库 336 视频讲解:5小时38分钟 11.1 StringBuffer类 336 11.1.1 认识StringBuffer类 336 11.1.2 StringBuffer类的应用 341 11.2 Runtime类 342 11.2.1 认识Runtime类 342 11.2.2 得到JVM的内存空间信息 343 11.2.3 Runtime类与Process类 344 11.3 国际化程序 345 11.3.1 国际化程序的实现思路 345 11.3.2 Locale类 346 11.3.3 ResourceBundle类 347 11.3.4 Java国际化程序实现 348 11.3.5 处理动态文本 349 11.3.6 使用类代替资源文件 352 11.4 System类 353 11.4.1 认识System类 353 11.4.2 垃圾对象的回收 356 11.4.3 对象的生命周期 358 11.5 日期操作类 358 11.5.1 Date类 358 11.5.2 Calendar类 359 11.5.3 DateFormat类 360 11.5.4 SimpleDateFormat类 362 11.5.5 实例操作——取得完整 日期 364 11.6 Math类 367 11.7 Random类 368 11.8 NumberFormat类 369 11.8.1 NumberFormat类的基本 使用 369 11.8.2 DecimalFormat类 370 11.9 BigInteger类 371 11.10 BigDecimal类 373 11.11 对象克隆技术 374 11.12 Arrays类 375 11.13 Comparable接口 377 11.13.1 比较器的基本应用 377 11.13.2 分析比较器的排序原理 379 11.14 另一种比较器Comparator 381 11.15 观察者设计模式 384 11.15.1 什么叫观察者 384 11.15.2 观察者模式实现 384 11.16 正则表达式 386 11.16.1 认识正则表达式 386 11.16.2 Pattern类和Matcher类 387 11.16.3 String类对正则表达式的 支持 390 11.17 定时调度 392 11.17.1 Timer类 392 11.17.2 TimerTask类 393 11.17.3 范例——定时操作 394 11.18 本章要点 395 11.19 习题 395 第12章 Java IO 397 视频讲解:7小时52分钟 12.1 操作文件的类——File 397 12.1.1 File类的基本介绍 397 12.1.2 使用File类操作文件 398 12.1.3 范例——列出指定目录 的全部内容 404 12.2 RandomAccessFile类 405 12.2.1 使用RandomAccessFile 类写入数据 406 12.2.2 使用RandomAccessFile 类读取数据 407 12.3 字节流与字符流基本操作 408 12.3.1 字节流 409 12.3.2 字符流 417 12.3.3 字节流与字符流的区别 422 12.3.4 范例——文件复制 425 12.4 转换流——OutputStreamWriter 类与InputStreamReader类 427 12.5 内存操作流 429 12.6 管道流 431 12.7 打印流 433 12.7.1 打印流的基本操作 433 12.7.2 使用打印流进行格式化 434 12.8 System类对IO的支持 435 12.8.1 System.out 436 12.8.2 System.err 437 12.8.3 System.in 438 12.8.4 输入/输出重定向 440 12.9 BufferedReader类 443 12.9.1 键盘输入数据的标准格式 444 12.9.2 相关操作实例 445 12.10 Scanner类 452 12.10.1 Scanner类简介 452 12.10.2 使用Scanner类输入数据 453 12.11 数据操作流 456 12.11.1 DataOutputStream类 457 12.11.2 DataInputStream类 458 12.12 合并流 460 12.13 压缩流 461 12.13.1 ZIP压缩输入/输出流简介 461 12.13.2 ZipOutputStream类 462 12.13.3 ZipFile类 466 12.13.4 ZipInputStream类 468 12.14 回退流 470 12.15 字符编码 472 12.15.1 Java常见编码简介 472 12.15.2 得到本机的编码显示 473 12.15.3 乱码产生 473 12.16 对象序列化 474 12.16.1 基本概念与Serializable 接口 474 12.16.2 对象输出流 ObjectOutputStream 475 12.16.3 对象输入流 ObjectInputStream 477 12.16.4 Externalizable接口 478 12.16.5 transient关键字 480 12.16.6 序列化一组对象 482 12.17 实例操作——单人信息管理 程序 483 12.18 本章要点 487 12.19 习题 488 第13章 Java类集 491 视频讲解:3小时50分钟 13.1 认识类集 491 13.1.1 基本概念 491 13.1.2 类集框架主要接口 492 13.2 Collection接口 493 13.2.1 Collection接口的定义 493 13.2.2 Collection子接口的定义 494 13.3 List接口 494 13.3.1 List接口的定义 494 13.3.2 List接口的常用子类 495 13.4 Set接口 504 13.4.1 Set接口的定义 504 13.4.2 Set接口的常用子类 505 13.5 SortedSet接口 512 13.6 集合的输出 513 13.6.1 迭代输出:Iterator 513 13.6.2 双向迭代输出:ListIterator 516 13.6.3 Java新支持:foreach 519 13.6.4 废弃的接口:Enumeration 520 13.7 Map接口 521 13.7.1 Map接口简介 521 13.7.2 Map.Entry接口简介 522 13.7.3 Map接口的常用子类 522 13.7.4 Map接口的使用注意事项 529 13.7.5 key可以重复的Map集合: IdentityHashMap 535 13.8 SortedMap接口 537 13.9 集合工具类:Collections 539 13.9.1 Collections简介 539 13.9.2 Collections操作实例 540 13.10 其他集合类 545 13.10.1 Stack类 545 13.10.2 属性类:Properties 546 13.11 范例 551 13.11.1 范例——一对多关系 551 13.11.2 范例——多对多关系 553 13.12 本章要点 557 13.13 习题 558 第14章 枚举 559 视频讲解:55分钟 14.1 枚举类型简介 559 14.2 使用简单程序完成枚举的 功能 559 14.3 定义一个枚举类型 561 14.4 Enum 563 14.4.1 取得枚举的信息 564 14.4.2 为每一个枚举对象属性 赋值 565 14.4.3 使用比较器 567 14.5 类集对枚举的支持—— EnumMap、EnumSet 568 14.5.1 EnumMap 568 14.5.2 EnumSet 569 14.6 让枚举类实现一个接口 573 14.7 在枚举类中定义抽象方法 574 14.8 本章要点 575 14.9 习题 576 第15章 Java反射机制 577 视频讲解:2小时24分钟 15.1 认识Class类 577 15.2 Class类的使用 580 15.2.1 通过无参构造实例化对象 580 15.2.2 调用有参构造实例化对象 582 15.3 反射的应用——取得类的 结构 585 15.3.1 取得所实现的全部接口 586 15.3.2 取得父类 587 15.3.3 取得全部构造方法 587 15.3.4 取得全部方法 590 15.3.5 取得全部属性 592 15.4 Java反射机制的深入应用 594 15.4.1 通过反射调用类中的方法 594 15.4.2 调用setter及getter方法 596 15.4.3 通过反射操作属性 598 15.4.4 通过反射操作数组 599 15.5 动态代理 602 15.6 类的生命周期 604 15.7 工厂设计模式 605 15.7.1 将反射应用在工厂模式上 605 15.7.2 结合属性文件的工厂模式 606 15.8 本章要点 608 15.9 习题 608 第16章 Annotation 609 视频讲解:1小时19分钟 16.1 Annotation简介 609 16.2 系统内建的Annotation 609 16.2.1 @Override 610 16.2.2 @Deprecated 612 16.2.3 @SuppressWarnings 613 16.3 自定义Annotation 615 16.3.1 Annotation的定义格式 615 16.3.2 Retention和 RetentionPolicy 619 16.4 通过反射取得Annotation 620 16.4.1 范例——取得全部的 Annotation 620 16.4.2 范例——取得指定的 Annotation中的内容 621 16.5 @Target注释 623 16.6 @Documented注释 625 16.7 @Inherited注释 627 16.8 本章要点 628 16.9 习题 629 第17章 Java数据库编程 630 视频讲解:4小时15分钟 17.1 JDBC概述 630 17.1.1 JDBC简介 630 17.1.2 JDBC驱动分类 630 17.1.3 JDBC的主要操作类及 接口 631 17.2 MySQL数据库 632 17.2.1 MySQL简介 632 17.2.2 MySQL安装及配置 633 17.2.3 MySQL常用命令 634 17.3 SQL语法基础 636 17.3.1 MySQL中的数据类型 638 17.3.2 增加数据 639 17.3.3 删除数据 639 17.3.4 更新数据 640 17.3.5 查询数据 640 17.4 JDBC操作步骤 642 17.5 连接数据库 642 17.5.1 配置MySQL数据库的 驱动程序 642 17.5.2 加载驱动程序 643 17.5.3 连接及关闭数据库 644 17.6 执行数据库的更新操作 646 17.6.1 实例操作一——执行 数据库插入操作 647 17.6.2 实例操作二——执行 数据库修改 649 17.6.3 实例操作三——执行数 据库删除操作 650 17.7 ResultSet接口 651 17.8 PreparedStatement接口 654 17.8.1 PreparedStatement简介 654 17.8.2 使用PreparedStatement 执行数据库操作 655 17.9 处理大数据对象 659 17.9.1 处理CLOB数据 660 17.9.2 处理BLOB数据 665 17.10 CallableStatement接口 669 17.11 JDBC 2.0操作 671 17.11.1 可滚动的结果集 672 17.11.2 使用结果集插入数据 675 17.11.3 使用结果集更新数据 676 17.11.4 使用结果集删除数据 678 17.11.5 批处理 679 17.12 事务处理 680 17.12.1 MySQL对事务的支持 681 17.12.2 执行JDBC的事务处理 682 17.13 使用元数据分析数据库 686 17.13.1 DatabaseMetaData 686 17.13.2 ResultSetMetaData 688 17.14 使用JDBC连接Oracle数 据库 689 17.15 本章要点 691 17.16 习题 692 第18章 图形界面 693 视频讲解:6小时15分钟 18.1 AWT简介 693 18.1.1 组件 694 18.1.2 容器 695 18.1.3 布局管理器 695 18.2 Swing简介 695 18.3 基本容器:JFrame 696 18.4 标签组件:JLabel 699 18.4.1 认识JLabel 699 18.4.2 更改JLabel的文字样式 700 18.4.3 在JLabel中设置图片 702 18.5 按钮组件:JButton 704 18.6 布局管理器 706 18.6.1 FlowLayout 706 18.6.2 BorderLayout 707 18.6.3 GridLayout 708 18.6.4 CardLayout 710 18.6.5 绝对定位 711 18.7 其他容器 712 18.7.1 JPanel 712 18.7.2 JSplitPane 713 18.7.3 JTabbedPane 715 18.7.4 JScrollPane 717 18.7.5 JDesktopPane与 JInternalFrame 718 18.8 不弹起的按钮组件: JToggleButton 720 18.9 文本组件: JTextComponent 721 18.9.1 单行文本输入组件: JTextField 722 18.9.2 密文输入组件: JPasswordField 724 18.9.3 多行文本输入组件: JTextArea 725 18.10 事件处理 727 18.10.1 事件和监听器 727 18.10.2 窗体事件 728 18.10.3 监听适配器 730 18.10.4 动作事件及监听处理 731 18.10.5 键盘事件及监听处理 737 18.10.6 鼠标事件及监听处理 740 18.10.7 鼠标拖拽事件及监听处理 743 18.11 单选按钮:JRadioButton 745 18.11.1 认识JRadioButton 745 18.11.2 JRadioButton事件处理 747 18.12 复选框:JCheckBox 749 18.12.1 认识JCheckBox 749 18.12.2 JCheckBox事件处理 751 18.13 列表框:JList 753 18.13.1 认识JList 753 18.13.2 使用ListModel构造 JList 755 18.13.3 JList事件处理 757 18.14 下拉列表框:JComboBox 759 18.14.1 认识JComboBox 759 18.14.2 使用ComboBoxModel 构造JComboBox 761 18.14.3 JComboBox事件处理 763 18.15 菜单组件 765 18.15.1 JMenu与JMenuBar 765 18.15.2 JMenuItem 767 18.15.3 事件处理 769 18.16 文件选择框:JFileChooser 772 18.17 表格 776 18.17.1 JTable 776 18.17.2 使用TableModel构建 表格 777 18.18 本章要点 783 18.19 习题 784 第19章 Java网络编程 785 视频讲解:1小时08分钟 19.1 IP(Internet Protocol)与 InetAddress 785 19.1.1 IP地址(Internet Protocol) 简介 785 19.1.2 InetAddress 786 19.2 URL与URLConnection 787 19.2.1 URL 787 19.2.2 URLConnection 788 19.3 URLEncoder与 URLDecoder 789 19.4 TCP程序设计 790 19.4.1 ServerSocket类与 Socket类 790 19.4.2 第一个TCP程序 791 19.4.3 案例:Echo程序 793 19.4.4 在服务器上应用多线程 796 19.5 UDP程序设计 797 19.5.1 UDP简介 797 19.5.2 UDP程序实现 798 19.6 本章要点 800 19.7 习题 800 第20章 Java新IO 801 视频讲解:1小时33分钟 20.1 Java新IO简介 801 20.2 缓冲区与Buffer 802 20.2.1 Buffer的基本操作 802 20.2.2 深入缓冲区操作 804 20.2.3 创建子缓冲区 805 20.2.4 创建只读缓冲区 806 20.2.5 创建直接缓冲区 807 20.3 通道 808 20.3.1 FileChannel 808 20.3.2 内存映射 810 20.4 文件锁:FileLock 812 20.5 字符集:Charset 813 20.6 Selector 816 20.7 本章要点 819 第21章 Eclipse开发工具 821 视频讲解:1小时35分钟 21.1 Eclipse简介 821 21.2 使用Eclipse 822 21.3 开发Java程序 823 21.4 JUnit测试工具 825 21.5 CVS客户端的配置 828 21.5.1 CVS服务器端配置 828 21.5.2 在Eclipse中连接CVS 830 21.6 本章要点 831

2013-06-04

Android开发揭秘

《Android开发揭秘》揭秘Android的体系结构和开发环境,实例丰富,是目前Android编程的绝佳指南。

2013-04-16

ASP.NET的网页代码模型及生命周期

第4章 ASP.NET的网页代码模型及生命周期 从本章开始,就进入了ASP.NET应用程序开发的世界。在了解了C#的结构,以及面向对象的概念后,就可以从面向对象的思想开发ASP.NET应用程序。在ASP.NET中,能够使用面向对象的思想和软件开发中的一些思想,例如封装、派生、继承以及高级的设计模式等。本章首先介绍ASP.NET中最重要的概念---网页代码模型。 4.1 ASP.NET的网页代码模型 在ASP.NET应用程序开发中,微软提供了大量的控件,这些控件能够方便用户的开发以及维护。这些控件具有很强的扩展能力,在开发过程中无需自己手动编写。不仅如此,用户还能够创建自定义控件进行应用程序开发以扩展现有的服务器控件的功能。 4.1.1 创建ASP.NET网站 在ASP.NET中,可以创建ASP.NET网站和ASP.NET应用程序,ASP.NET网站的网页元素包含可视元素和页面逻辑元素,并不包含designer.cs文件。而ASP.NET应用程序包含designer.cs文件。创建ASP.NET网站,首先需要创建网站,单击【文件】按钮,在下拉菜单中选择【新建网站】选项,单击后会弹出对话框用于ASP.NET网站的创建,如图4-1所示。 图4-1 新建ASP.NET网站 在【位置】选项中,旁边的【下拉菜单】可以按照开发的需求来写,一般选择文件系统,地址为本机的本地地址。语言为.NET网站中使用的语言,如果选择Visual C#,则默认的开发语言为C#,否则为Visual Basic。创建了ASP.NET网站后,系统会自动创建一个代码隐藏页模型页面Default.aspx。ASP.NET网页一般由三部分组成,这三个部分如下所示。 q 可视元素:包括HTML,标记,服务器空间。 q 页面逻辑元素:包括事件处理程序和代码。 q designer.cs页文件:用来为页面的控件做初始化工作,一般只有ASP.NET应用程序(Web Application)才有。 ASP.NET页面中包含两种代码模型,一种是单文件页模型,另一种是代码隐藏页模型。这两个模型的功能完全一样,都支持控件的拖拽,以及智能的代码生成。 4.1.2 单文件页模型 单文件页模型中的所有代码,包括控件代码、事物处理代码以及HTML代码全都包含在.aspx文件中。编程代码在script标签,并使用runat=“server”属性标记。创建一个单文件页模型,在【文件】按钮中选择【新建文件】选项,在弹出对话框中选择【Web窗体】或在右击当前项目,在下拉菜单中选择【添加新建项】选项即可创建一个.aspx页面,如图4-2所示。 图4-2 创建单文件页模型 在创建时,去掉【将代码放在单独的文件中】复选框的选择即可创建单文件页模型的ASP.NET文件。创建后文件会自动创建相应的HTML代码以便页面的初始化,示例代码如下所示。 <%@ Page Language=“C#” %> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <script runat=“server”> </script> <html xmlns=“http://www.w3.org/1999/xhtml”> <head runat=“server”> <title>无标题页</title> </head> <body> <form id=“form1” runat=“server”> <div> </div> </form> </body> </html> 编译并运行,即可看到一个空白的页面被运行了。ASP.NET单文件页模型在创建并生成时,开发人员编写的类将编译成程序集,并将该程序集加载到应用程序域,并对该页的类进行实例化后输出到浏览器。可以说,.aspx页面的代码也即将会生成一个类,并包含内部逻辑。在浏览器浏览该页面时,.aspx页面的类实例化并输出到浏览器,反馈给浏览者。ASP.NET单文件页模型运行示例图如图4-3所示。 图4-3 单文件页模型 4.1.3 代码隐藏页模型 代码隐藏页模型与单文件页模型不同的是,代码隐藏页模型将事物处理代码都存放在cs文件中,当ASP.NET网页运行的时候,ASP.NET类生成时会先处理cs文件中的代码,再处理.aspx页面中的代码。这种过程被成为代码分离。 代码分离有一种好处,就是在.aspx页面中,开发人员可以将页面直接作为样式来设计,即美工人员也可以设计.aspx页面,而.cs文件由程序员来完成事务处理。同时,将ASP.NET中的页面样式代码和逻辑处理代码分离能够让维护变得简单,同时代码看上去也非常的优雅。在.aspx页面中,代码隐藏页模型的.aspx页面代码基本上和单文件页模型的代码相同,不同的是在script标记中的单文件页模型的代码默认被放在了同名的.cs文件中,.aspx文件示例代码如下所示。 <%@ Page Language=“C#” AutoEventWireup=“true” CodeFile=“Default.aspx.cs” Inherits=“_Default” %> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> <html xmlns=“http://www.w3.org/1999/xhtml”> <head runat=“server”> <title>无标题页</title> </head> <body> <form id=“form1” runat=“server”> <div> </div> </form> </body> </html> 从上述代码中可以看出,在头部声明的时候,单文件页模型只包含Language=“C#”,而代码隐藏页模型包含了CodeFile=“Default.aspx.cs”,说明被分离出去处理事物的代码被定义在Default.aspx.cs中,示例代码如下所示。 using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; //使用HtmlControls using System.Web.UI.WebControls; //使用WebControls using System.Web.UI.WebControls.WebParts; //使用WebParts public partial class _Default : System.Web.UI.Page //继承自System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } } 上述代码为Default.apx.cs页面代码。从上述代码可以看出,其格式与类库、编写类的格式相同,这也说明了.aspx页面允许使用面向对象的特性,如多态、继承等。但是ASP.NET代码隐藏页模型的运行过程比单文件页模型要复杂,运行示例图如图4-4所示。 图4-4 代码隐藏页模型 上述描述了代码隐藏类模型的页面生成模型。当页面被呈现之前,ASP.NET应用程序会解释并编译相应的cs文件中的代码,与此同时,ASP.NET应用程序还会将.aspx页面进行编译并生成.aspx页面对应的类。生成.aspx页面对应的类后会将该类与cs文件中的类进行协调生成新的类,该类会通过IIS在用户浏览页面时呈现在用户的浏览器中。 4.1.4 创建ASP.NET Web Application ASP.NET网站有一种好处,就是在编译后,编译器将整个网站编译成一个DLL(动态链接库),在更新的时候,只需要更新编译后的DLL(动态链接库)文件即可。但是ASP.NET网站却有一个缺点,编译速度慢,并且类的检查不彻底。 相比之下,ASP.NET Web Application不仅加快了速度,只生成一个程序集,而且可以拆分成多个项目进行管理。创建Application,首先需要新建项目用于开发Web Application,单击菜单栏上的【文件】按钮,在下拉菜单中选择【新建项目】选项,在弹出窗口中选择【ASP.NET应用程序】选项,如图4-5所示。 图4-5 创建ASP.NET应用程序 在创建了ASP.NET应用程序后,系统同样会默认创建一个Default.aspx页面,不同的是,多出了一个Default.aspx.designer.cs,用来初始化页面控件,一般不需要修改。 4.1.5 ASP.NET网站和ASP.NET应用程序的区别 在ASP.NET中,可以创建ASP.NET网站和ASP.NET应用程序,但是ASP.NET网站和ASP.NET应用程序开发过程和编译过程是有区别的。ASP.NET应用程序主要有以下特点: q 可以将ASP.NET应用程序拆分成多个项目以方便开发,管理和维护。 q 可以从项目中和源代码管理中排除一个文件或项目。 q 支持VSTS的Team Build方便每日构建。 q 可以对编译前后的名称,程序集等进行自定义。 q 对App_GlobalResources 的Resource强类支持。 ASP.NET WebSite编程模型具有以下特点: q 动态编译该页面,而不用编译整个站点。 q 当一部分页面出现错误不会影响到其他的页面或功能。 q 不需要项目文件,可以把一个目录当作一个Web应用来处理。 总体来说,ASP.NET网站适用于较小的网站开发,因为其动态编译的特点,无需整站编译。而ASP.NET应用程序适应大型的网站开发、维护等。 4.2 代码隐藏页模型的解释过程 在ASP.NET的代码隐藏页模型中,一个完整的.aspx页面包含两个页面,分别是以.aspx和.cs文件为后缀的文件,这两个文件在形成了整个Web窗体。在编译的过程中都被编译成由项目生成的动态链接库(.DLL),同时,.aspx页面同样也会编译。但是与.cs页面编译过程不同的是,当浏览者第一次浏览到.aspx页面时,ASP.NET自动生成该页的.NET类文件,并将其编译成另一个.DLL文件。 当浏览者再一次浏览该页面的时候,生成的.DLL就会在服务器上运行,并响应用户在该页面上的请求或响应,ASP.NET应用程序的解释过程图如4-6所示。 图4-6 代码隐藏页模型页面的执行过程 在客户端浏览器访问该页面时,浏览器会给IIS发送请求消息,IIS则会开始执行ASP.NET编译过程,如果不存在编译过后的DLL文件,则加载编译的类并创建对象。当创建对象完成,生成创建对象后的代码并生成一个ASPX页面代码,该页面代码反馈给IIS,IIS再反馈成HTML页面的形式给客户端。 4.3 代码隐藏页模型的事件驱动处理 在传统的ASP开发中,ASP的事件都是按照网页的顺序来处理的,一般情况下,ASP页面的事件都是从上到下处理事件,可以说ASP的开发是一个线性的处理模型。在用户的浏览操作中,每一次用户的操作都会导致页面重新被发送到服务器。因此,重复的操作必然导致客户端和服务器的往返过程,服务器必须重新创建页面,当创建页面后,服务器再按照原来的从上到下的顺序进行事件处理。 在ASP.NET中,通过使用模拟事件驱动模型的行为代替了ASP的线性处理模型。ASP.NET页框架模型隐式的为用户建立了事件和事件处理程序的关联。ASP.NET让用户可以为从浏览器传递的事件在服务器代码中设置相应的处理程序。假设某个用户正在浏览网站并与页面之间产生了某种交互,用户的操作就会引发事件,事件通过HTTP被传输到服务器。在服务器中,ASP.NET框架解释信息,并触发事件与之对应的处理程序。该程序可以是.aspx页面中的处理程序,也可以是开发者自定义的类库,或者COM组件等。事件驱动处理如图4-7所示。 图4-7 页面框架的事件驱动处理模型 上图则说明了当一个浏览者通过浏览器触发ASPX页面时,浏览器、服务器和服务器返回页的过程。 4.4 ASP.NET客户端状态 Web开发不像软件开发,Web应用实际上是没有状态的,这就说明Web应用程序不自动指示序列中的请求是否来自相同的浏览器或客户端,也无法判断浏览器是否一直在浏览一个页面或者一个站点,也无法判断用户执行了哪个操作并统计用户的喜好。 4.4.1 视图状态 从上面的章节中可以知道,当服务器每次的往返过程,都将销毁页面并重新创建新的页面。如果一个页面中的信息超出了页面的生命周期,那么这个页面中的相关信息就不存在了。如果注销了页面的信息,那么用户的一些信息可能就不存在了。 在ASP.NET中,网页包含视图状态来保存用户的信息,视图状态在页面发回到自身时,跨页过程存储和用户自己的页面的特定值,视图状态的优点如下所示。 q 不需要任何服务器资源。 q 在默认情况下,对控件启用状态的数据进行维护,不会被破坏。 q 视图状态的值经过哈希运算和压缩保护,安全性更高。 视图状态同样有一些缺点,缺点如下所示。 q 视图状态会影响性能,如果页面存储较大较多的值,则性能会有较大的影响。 q 在手机,移动终端上,可能无法保存视图状态中使用的值。 q 视图状态虽然安全性较高,但是还是有风险,如果直接查看页面代码,可以看到相应代码。 4.4.2 控件状态 ASP.NET中还提供了控件状态属性作为在服务器往返过程中存储自定义控件中的数据的方法。在页面控件中,如果有多个自定义控件使用多个不同的控件来显示不同的数据结构,为了让这些页面控件能够在在页面上协调的工作,则需要使用控件状态来保护控件,同时,控件状态是不能被关闭的。同样,控件状态也有它的优点,优点如下所示。 q 与视图状态相同的是,不需要任何服务器资源。 q 控件状态是不能被关闭的,提供了控件管理的更加可靠的方法。 q 控件状态具有通用性。 4.4.3 隐藏域 在ASP中,通常使用隐藏域保存页面的信息。在ASP.NET中,同样具有隐藏域来保存页面的信息,作为维护页面状态的一种形式,但是隐藏域的安全性并不高,最好不要在隐藏域保存过多的信息。隐藏域具有以下优点。 q 不需要任何服务器资源。 q 支持广泛,任何客户端都支持隐藏域。 q 实现简单,隐藏域属于HTML控件,无需像服务器控件那样有需要编程知识。 而隐藏域具有一些不足,如下所示。 q 具有较高的安全隐患。 q 存储结构简单。 q 同样,如果存储了较多的较大的值,则会导致性能问题。 q 如果隐藏域过多,则在某些客户端中被禁止。 q 隐藏域将数据存储在服务器上,而不存储在客户端。 注意:如果开发中,页面的隐藏域过多,这些隐藏域被存储在服务器。当客户端浏览页面的时候,会有一些防火墙扫描页面,以保证操作系统的安全,如果页面的隐藏域过多,那么这些防火墙可能会禁止页面的某些功能。 4.4.4 Cookie Cookie在客户端用户保存网站的少量的用户信息,服务器可以通过编程的方法获取用户信息,Cookie信息和页面请求通常一起发送到服务器,服务器对客户端传递过来的Cookie信息做处理。通常Cookie保存用户的登录状态、用户名等基本信息等等,在后面的章节会详细介绍使用ASP.NET操作Cookies。 4.4.5 客户端状态维护 虽然使用某些客户端状态并不使用服务器资源,但是这些状态都具有潜在的安全隐患,如Cookie。非法用户可以使用Cookie欺骗来攻击网站进行用户信息的获取,不过使用客户端状态能够使用客户端的资源从而提高服务器性能。使用客户端状态,虽然有安全隐患,但是具有良好的编程能力,以及基本的安全知识,能够较好的解决安全问题,同时也能够提高服务器性能。下面小结了一些客户端状态的优缺点。 q 视图状态:推荐当存储少量挥发到自身的页面的信息时使用。 q 控件状态:不需要任何服务器资源,控件状态是不能被关闭的,提供了控件管理的更加可靠和更通用的方法。 q 隐藏域:实现简单,但是在应用程序中会造成一些安全隐患。 q Cookie:实现简单,同样也能够简单的获取用户的信息,但是Cookie有大小的限制,不适宜存储大量的代码。 4.5 ASP.NET页面生命周期 ASP.NET页面运行时,也同类的对象一样,有自己的生命周期。ASP.NET页面运行时,ASP.NET页面将经历一个生命周期,在生命周期内,该页面将执行一系列的步骤,包括控件的初始化,控件的实例化,还原状态和维护状态等,以及通过IIS反馈给用户呈现成HTML。 ASP.NET页面生命周期是ASP.NET中非常重要的概念,了解ASP.NET页面的生命周期,就能够在合适的生命周期内编写代码,执行事务。同样,熟练掌握ASP.NET页面的生命周期,可以开发高效的自定义控件。ASP.NET生命周期通常情况下需要经历几个阶段,这几个阶段如下所示。 q 页请求:页请求发生在页生命周期开始之前。当用户请求一个页面,ASP.NET将确定是否需要分析或者编译该页面,或者是否可以在不运行页的情况下直接请求缓存响应客户端。 q 开始:发生了请求后,页面就进入了开始阶段。在该阶段,页面将确定请求是发回请求还是新的客户端请求,并设置IsPostBack属性。 q 初始化:在页面开始后,进入了初始化阶段。初始化期间,页面可以使用服务器控件,并为每个服务器控件进行初始化。 q 加载:页面加载控件。 q 验证:调用所有的验证程序控件的Vailidate方法,来设置各个验证程序控件和页的属性。 q 回发事件:如果是回发请求,则调用所有事件处理的程序。 q 呈现:在呈现期间,视图状态被保存并呈现到页。 q 卸载:完全呈现页面后,将页面发送到客户端并准备丢弃时,将调用卸载。 4.6 ASP.NET生命周期中的事件 在页面周期的每个阶段,页面将引发可运行用户代码进行处理事件。对于控件产生的事件,通过声明的方式执行代码,并将事件处理程序绑定到事件。不仅如此,事件还支持自动事件连接,最常用的就是Page_Load事件了,除了Page_Load事件以外,还有Page_Init等其他事件,本节将会介绍此类事件。 4.6.1 页面加载事件(Page_PreInit) 每当页面被发送到服务器时,页面就会重新被加载,启动Page_PreInit事件,执行Page_PreInit事件代码块。当需要对页面中的控件进行初始化时,则需要使用此类事件,示例代码如下所示。 protected void Page_PreInit(object sender, EventArgs e) //Page_PreInit事件 { Label1.Text = “OK”; //标签赋值 } 在上述代码中,当触发了Page_PreInit事件时,就会执行该事件的代码,上述代码将Lable1的初始文本值设置为“OK”。Page_PreInit事件能够让用户在页面处理中,能够让服务器加载时只执行一次而当网页被返回给客户端时不被执行。在Page_PreInit中可以使用IsPostBack来实现,当网页第一次加载时IsPostBack属性为false,当页面再次被加载时,IsPostBack属性将会被设置为true。IsPostBack属性的使用能够影响到应用程序的性能。 4.6.2 页面加载事件(Page_Init) Page_Init事件与Page_PreInit事件基本相同,区别在于Page_Init并不能保证完全加载各个控件。虽然在Page_Init事件中,依旧可以访问页面中的各个空间,但是当页面回送时,Page_Init依然执行所有的代码并且不能通过IsPostBack来执行某些代码,示例代码如下所示。 protected void Page_Init(object sender, EventArgs e) //Page_Init事件 { if (!IsPostBack) //判断是否第一次加载 { Label1.Text = “OK”; //将成功信息赋值给标签 } else { Label1.Text = “IsPostBack”; //将回传的值赋值给标签 } } 4.6.3 页面载入事件(Page_Load) 大多数初学者会认为Page_Load事件是当页面第一次访问触发的事件,其实不然,在ASP.NET页生命周期内,Page_Load远远不是第一次触发的事件,通常情况下,ASP.NET事件顺序如下所示。 q 1. Page_Init()。 q 2. Load ViewState。 q 3. Load Postback data。 q 4. Page_Load()。 q 5. Handle control events。 q 6. Page_PreRender()。 q 7. Page_Render()。 q 8. Unload event。 q 9. Dispose method called。 Page_Load事件是在网页加载的时候一定会被执行的事件。在Page_Load事件中,一般都需要使用IsPostBack来判断用户是否进行了操作,因为IsPostBack指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问,示例代码如下所示。 protected void Page_Load(object sender, EventArgs e) //Page_Load事件 { if (!IsPostBack) { Label1.Text = “OK”; //第一次执行的代码块 } else { Label1.Text = “IsPostBack”; //如果用户提交表单等 } } 上述代码使用了Page_Load事件,在页面被创建时,系统会自动在代码隐藏页模型的页面中增加此方法。当用户执行了操作,页面响应了客户端回发,则IsPostBack为true,于是执行else中的操作。 4.6.4 页面卸载事件(Page_Unload) 在页面被执行完毕后,可以通过Page_Unload事件用来执行页面卸载时的清除工作,当页面被卸载时,执行此事件。以下情况会触发Page_Unload事件。 q 页面被关闭。 q 数据库连接被关闭。 q 对象被关闭。 q 完成日志记录或者其他的程序请求。 4.6.5 页面指令 页面指令用来通知编译器在编译页面时做出的特殊处理。当编译器处理ASP.NET应用程序时,可以通过这些特殊指令要求编译器做特殊处理,例如缓存、使用命名空间等。当需要执行页面指令时,通常的做法是将页面指令包括在文件的头部,示例代码如下所示。 <%@ Page Language=“C#” AutoEventWireup=“true” CodeBehind=“Default.aspx.cs” Inherits=“MyWeb._Default” %> <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> 上述代码中,就使用了@Page页面指令来定义ASP.NET页面分析器和编译器使用的特定页的属性。当代码隐藏页模型的页面被创建时,系统会自动增加@Page页面指令。 ASP.NET页面支持多个页面指令,常用的页面指令如下所示。 q @ Page:定义ASP.NET页分析器和编译器使用的页特定(.aspx文件)属性,可以编写为<%@ Page attribute=“value” [attribute=“value”…]%>。 q @ Control:定义ASP.NET页分析器和编译器使用的用户控件(.ascx文件)特定的属性。该指令只能为用户控件配置。可以编写为<%@ Control attribute=“value” [attribute=“value”…]%>。 q @ Import:将命名空间显示导入到页中,使所导入的命名空间的所有类和接口可用户该页。导入的命名空间可以是.NET Framework类库或用户定义的命名空间的一部分。可以编写为<%@ Import namespace=“value” %>。 q @ Implements:提示当前页或用户控件实现制定的.NET Framework接口。可以编写为<%@ Implements interface=“ValidInterfaceName” %>。 q @ Reference:以声明的方式指示,应该根据在其中声明此指令的页对另一个用户控件或页源文件进行动态编译和链接。可以编写为<%@ Reference page | control=“pathtofile” %>。 q @ Output Cache:以声明的方式空间ASP.NET页或页中包含的用户控件的输出缓存策略。可以编写为<%@ Output Cache Duration=“#ofseconds” Location=“Any | Client | Downstream | Server | None” Shared=“True |False” VaryByControl=“controlname” VaryByCustom=“browser | customstring” VaryByHeader=“headers” VaryByParam=“parametername” %> q @ Assembly:在编译过程中将程序集链接到当前页,以使程序集的所有类和接口都可用在该页上。可以编写为<%@ Assembly Name=“assemblyname” %>或<%@ Assembly Src=“pathname” %>的方式。 q @ Register:将别名与命名空间以及类名关联起来,以便在自定义服务器控件语法中使用简明的表示法。可以编写为<%@ Register tagprefix=“ tagprefix” Namespace=“namepace” Assembly=“assembly” %>或<%@ Register tagprefix=“ tagprefix” Tagname=“tagname” Src=“pathname” %>的方式。 4.7 ASP.NET网站文件类型 在ASP.NET中包含诸多的文件类型,这些类型的文件由ASP.NET支持和管理,而除了这些文件以外,其他的文件都由IIS托管。使用VS2008能够创建大部分可以使用ASP.NET托管运行的程序。同时,使用应用程序映射可以将文件类型映射到应用程序。当需要伪静态时,很可能需要将.html后缀托管到IIS中的应用扩展,因为默认情况下ASP.NET不会处理HTML的操作。 技巧:现在的网站构架中,生成静态是一种降低网站压力的一种很好的解决方案。在某些情况下,服务器可能需要伪静态支持,就是将.aspx页面后缀显式成.html后缀,让搜索引擎能够更好的搜录。 1.ASP.NET管理的文件类型 ASP.NET管理的文件类型能够在ASP.NET应用程序中被ASP.NET应用程序的不同模块进行访问和调用,这些文件可能是用户能够直接访问的,也有可能是用户无法直接访问的。ASP.NET管理的文件类型如表4-1所示。 表4-1 ASP.NET管理的文件类型 文件类型 保存位置 描述 .asax 根目录。 Global.asax 文件。包含 HttpApplication 对象的派生代码,用于重新展示 Application 对象。 .ascx 根目录或子目录。 可重用的自定义 Web 控件。 .ashx 根目录或子目录。 处理器文件。包含实现 IHttpHandler 接口的代码,用于处理输入请求。 .asmx 根目录或子目录。 XML Web Services 文件。包含由 SOAP 提供给其他 Web 应用的类对象和功能。 .aspx 根目录或子目录。 ASP.NET Web 窗体。包含 Web 控件和其他业务逻辑。 .axd 根目录。 跟踪视图文件。通常是 Trace.axd。 .browser App_Browsers 目录。 浏览器定义文件。用于识别客户端浏览器的可用特征。 .cd 根目录或子目录。 类图文件。 .compile Bin 目录。 定位于适当汇编集中的预编译文件。可执行文件(.aspx,.ascx,.master,theme)预编译后放在 Bin 目录。 .config 根目录或子目录。 Web.config 配置文件。包含用于配置 ASP.NET 若干特征的 XML 元素集。 .cs,.jsl,vb App_Code 目录。有些是 ASP.NET 的代码分离文件,位于与 Web 页面相同的目录。 运行时被编译的类对象源代码。类对象可以是 HTTP 模块,HTTP 处理器,或 ASP.NET 页面的代码分离文件。 .csproj,vbproj,vjsproj Visual Studio 工程目录。 Visual Studio 客户工程文件。 .disco,.vsdisco App_WebReferences 目录。 XML Web Services Discovery 文件。用于定位可用 Web Services。 .dsdgm,dsprototype 根目录或子目录。 分布式服务图表(DSD)文件。可添加到 Visual Studio 方案中,为反向引擎提供消耗 Web Services 时的交互性图表。 .dll Bin 目录。 已编译类库文件。作为替代,可将类对象源代码保存到 App_Code 目录。 .licx,.webinfo 根目录或子目录。 许可协议文件。许可协议有助于保护控件开发者的知识产权,并对控件用户的使用权进行验证。 .master 根目录或子目录。 模板文件定义 Web 页面的统一布局,并在其他页面中得到引用。 .mdb,.ldb App_Data 目录。 Access 数据库文件。 .mdf App_Data 目录。 SQLServer 数据库文件。 .msgx,.svc 根目录或子目录。 Indigo Messaging Framework(MFx)服务文件。 .rem 根目录或子目录。 远程处理器文件。 .resources App_GlobalResources 或 App_LocalResources 目录。 资源文件。包含图像,本地化文本,或其他数据的资源引用串。 .resx App_GlobalResources 或 App_LocalResources 目录。 资源文件。包含图像,本地化文本,或其他数据的资源引用串。 .sdm,.sdmDocument 根目录或子目录。 系统定义模型(SDM)文件。 .sitemap 根目录。 网站地图文件。包含网站的结构。ASP.NET 通过默认的网站地图提供者,简化导航控件对网站地图文件的使用。 .skin App_Themes 目录。 皮肤定义文件。用于确定显示格式。 .sln Visual Web Developer 工程目录。 Visual Web Developer 工程的项目文件。 .soap 根目录或子目录。 SOAP 扩展文件。 注意:ASP.NET 管理的文件类型映射到 IIS 的 Aspnet_isapi.dll。 2.IIS 管理的文件类型 在ASP.NET应用程序中,有些动态的文件如asp文件就不被ASP.NET应用程序框架管理,这些文件由IIS进行管理,由IIS管理的文件类型如表4-2所示。 表4-2 IIS管理的文件类型 文件类型 保存位置 描述 .asa 根目录。 Global.asa 文件。包含 ASP 会话对象或应用程序对象生命周期中的各种事件处理。 .asp 根目录或子目录. ASP Web 页面。包含 @ 指令和使用 ASP 内建对象的脚本代码。 .cdx App_Data 目录. Visual FoxPro 的混合索引文件。 .cer 根目录或子目录。 证明文件。用于对网站的授权。 .idc 根目录或子目录。 Internet Database Connector(IDC)文件。被映射到 httpodbc.dll。 注意:由于无法为数据库连接提供足够的安全性,IDC 将不再被继续使用。IIS 6.0 是最后一个支持 IDC 的版本。 .shtm,.shtml,.stm 根目录或子目录。 包含文件。被映射到 ssinc.dll。 注意:IIS管理的文件类型被映射到IIS的asp.dll 3.静态文件类型 IIS仅提供已注册MIME类型的静态文件服务,注册信息保存在Mime Map IIS元数据库中。如果某种文件类型已经映射到指定应用程序,在不需要作为静态文件的情况之下,无需再在MIME类型列表中进行包含。默认的静态文件类型如表4-3所示。 表4-3 静态文件类型 文件类型 保存位置 描述 .css 根目录或子目录,以及 App_Themes 目录。 样式表文件。用于确定 HTML 元素的显示格式。 .htm,.html 根目录或子目录。 静态网页文件。由 HTML 代码编写。 注意:虽然ASP.NET的代码页面也能够手动添加到MIME类型列表中,但是这样操作浏览者就能够看到页面源代码,从而暴露ASP.NET页面源代码,相对于服务器而言是非常不安全的。 4.8 小结 本章介绍了ASP.NET页面生命周期,以及ASP.NET页面的几种模型。ASP.NET页面生命周期是ASP.NET中非常重要的概念,熟练掌握ASP.NET生命周期能对ASP.NET开发,自定义控件开发起到促进作用。本章还介绍了: q 代码隐藏页模型的解释过程。 q 代码隐藏页模型的事件驱动处理。 q ASP.NET网页的客户端状态。 q ASP.NET页面生命周期。 q ASP.NET生命周期中的事件。 q ASP.NET 网站文件类型。 上面的章节都分开的讲解了ASP.NET运行中的一些基本机制,在了解了这些基本运行机制后,就能够在.NET框架下做ASP.NET开发了。虽然这些都是基本概念,但是在今后的开发中,会起到非常重要的作用。

2009-07-28

SP.NET\ASP.NET 3.5

第2章 C# 3.0程序设计基础 在第一章里,了解了ASP.NET 3.5的特性和一些基本的.NET Framework知识,不过如果要深入到ASP.NET 3.5应用程序开发,需要对开发语言有更加深入的了解。而在.NET平台上,微软主推的编程语言就是C#,本章将会从C#的语法、结构和特性来讲解,以便读者能够深入的了解C#程序设计。 2.1 C#程序

2009-07-28

ASP.NET 3.5 (2)

第1章 ASP.NET 3.5与开发工具 从本章开始,读者将能够系统的学习ASP.NET 3.5技术,相对于ASP.NET 2.0而言,在3.5版本的ASP.NET中并没有太多的变化,而更多的变化则在于C#编程语言中。而作为微软主推的编程语言,ASP.NET 3.5能够使用C#的最新特性进行高效的开发,本章从基础讲解什么是ASP.NET,以及开发工具的使用。

2009-07-28

ASP.NET 3.5 (1)

前 言 随着互联网的不断发展和平台的多样性,越来越多的Web开发技巧呈现在用户面前,也是由于互联网的不断发展,越来越多的普通用户进入了互联网的范围开始了网络生活,这些网络生活随时随地的伴随着我们的生活,当我们使用银行的取款机进行取款时,我们就在与互联网打着交到,当我们收发电子邮件,在互联网上聊QQ,同样也是在与互联网打着交到。在这些有趣的应用中,通常是通过一些Web编程语言进行实现的,这些语言包括ASP.NET、ASP、PHP等。Web开发技巧不断的完善,更多更加丰富的应用程序也随之诞生,ASP.NET使用.NET平台进行Web应用程序的开发有着先天性的优势,开发人员能够快速的使用ASP.NET提供的控件和开发方法进行复杂的应用程序开发,同时ASP.NET还为未来的云计算、多核化和多平台提供了基础,也为移动设配应用程序编程提供了保障。 为了方便广大读者学习,作者花费半年时间编制这本书,本书全面地介绍了ASP.NET技术,并介绍了能够与ASP.NET进行融合和跨平台的Web Server、WCF、WPF等,本书还附带大量的实例以及详细的注释,方便初学者进行深入学习。在学习完本书之后,读者能够具备基本的ASP.NET应用程序开发基础。

2009-07-28

模仿QQ写的程序,功能很强大

模仿QQ写的程序,功能很强大!!模仿QQ写的程序,功能很强大!!

2009-06-26

新语音聊天系统源代码C# ASP

从论谈花钱下载的 语音聊天系统源代码 是C#写的。只要大家两分。

2009-06-26

.net 反编译工具Reflector 最新版

.net 反编译工具Reflector 最新版

2009-04-14

Thinking in Java第三版+第四版.rar

Java学习资料.Thinking in Java第三版+第四版.rar

2009-04-14

抽象工厂模式 源代码

此资源出自下面的作者,我只是转载,非常实用的设计方法,如果您想成位出色的设计师,那就再复习复习吧!如果您想成为软件设计师,通过学习,您将会站另一个高度看待软件设计. 原始地址:http://terrylee.cnblogs.com/archive/2005/12/13/295965.html ========================================= 抽象工厂模式(Abstract Factory) ——探索设计模式系列之三 Terrylee,2005年12月12日 概述 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时由于需求的变化,往往存在着更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象的创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?这就是我们要说的抽象工厂模式。 意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 模型图 逻辑模型: 物理模型: 生活中的例子 抽象工厂的目的是要提供一个创建一系列相关或相互依赖对象的接口,而不需要指定它们具体的类。这种模式可以汽车制造厂所使用的金属冲压设备中找到。这种冲压设备可以制造汽车车身部件。同样的机械用于冲压不同的车型的右边车门、左边车门、右前挡泥板、左前挡泥板和引擎罩等等。通过使用转轮来改变冲压盘,这个机械产生的具体类可以在三分钟内改变。 抽象工厂之新解 虚拟案例 中国企业需要一项简单的财务计算:每月月底,财务人员要计算员工的工资。 员工的工资 = (基本工资 + 奖金 - 个人所得税)。这是一个放之四海皆准的运算法则。 为了简化系统,我们假设员工基本工资总是4000美金。 中国企业奖金和个人所得税的计算规则是: 奖金 = 基本工资(4000) * 10% 个人所得税 = (基本工资 + 奖金) * 40% 我们现在要为此构建一个软件系统(代号叫Softo),满足中国企业的需求。 案例分析 奖金(Bonus)、个人所得税(Tax)的计算是Softo系统的业务规则(Service)。 工资的计算(Calculator)则调用业务规则(Service)来计算员工的实际工资。 工资的计算作为业务规则的前端(或者客户端Client)将提供给最终使用该系统的用户(财务人员)使用。 针对中国企业为系统建模 根据上面的分析,为Softo系统建模如下: 则业务规则Service类的代码如下: ......

2008-10-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除