数据库设计
数据库的基本设计步骤
收集信息 标识对象
标识每个对象需要存储的详细信息 标识对象之间的关系
实体关系图
矩形表示实体集 椭圆表示属性
菱形表示关系集
直线用来连接属性和实体集,也用来连接实体集和关系集
规范设计
第一范式
第一范式的目标是确保每列的原子性,如果每列(或者每个属性值)都是不可在分的最小数据单元,则满足第一范式(1NF)。 第二范式
第二范式在第一范式的基础上,更近一层,其目标是确保表中的每列都和主键相关,如果一个关系满足1NF,并且除了主键以外的其他列,都依赖于该主键,则满足第二范式(2NF)。 第三范式
第三范式在第二范式的基础上,更进一层,第三范式的目标是确保每列都和主键列之间相关,而不是间接相关。
T-SQL 1、添加数据
INSERT [INTO] 表名(字段1,字段2, 字段3, …) VALUES (值1, 值2,…)
第 1 页 共 69 页
2、修改数据
UPDATE 表名 SET 字段1=值1,字段2=值2, … WHERE (条件)
3、查询数据
SELECT 字段1, 字段2,字段3 … FROM 表名 WHERE (条件) ORDER BY 字段名
4、删除数据
DELETE FROM 表名 WHERE (条件)
创建数据库 T-SQL创建数据库
CREATE DATABASE 数据库名 )
[LOG ON] (
<日志文件参数> )
ON [PRIMARY]
(
<数据文件参数>[<文件组参数>]
文件的具体参数:
([NAME=逻辑文件名,] FILENAME=物理文件名, [SIZE=大小]
[MAXSIZE=最大容量] [FILEGROWTH=增长量] )
参数涵义说明:
数据库名:数据库的名称,最长为128个字符 PRIMARY:指定主文件组中的文件
第 2 页 共 69 页
LOG ON:指明事物日志文件的明确定义
NAME:指定数据库的逻辑名称
FILENAME:指定数据库所在文件的操作系统文件名称和路径 SIZE:指定数据库的初始容量大小
MAXSIZE:指定操作系统文件可以增长到的最大尺寸 FILEGROWTH:指定文件每次增加容量的大小
删除数据库
DROP DATABASE 数据库名
SQL Server将数据库的清单放在master系统数据库的sysdatabases表中,在此表中即可检测是否存在数据库
例:IF EXISTS (SELECT * FROM sysdatabases WHERE name=数据库名)
DROP DATABASE 数据库名
说明:EXISTS 检测某个查询是否存在,如果查询的语句返回的记录结果不为空,则表示存在
创建表
CREATE TABLE 表名 (
字段1 数据类型 列的特征, 字段2 数据类型 列的特征 )
删除表
DROP TABLE 表名
添加约束
--添加主键约束 USE student
ALTER TABLE stuInfo
ADD CONSTRAINT pk_Id PRIMARY KEY (id) --删除主键约束 USE student
ALTER TABLE stuInfo DROP CONSTRAINT pk_Id --添加唯一约束 USE student
ALTER TABLE stuInfo
第 3 页 共 69 页
ADD CONSTRAINT uq_name UNIQUE(name) --删除唯一约束 ALTER TABLE stuInfo DROP uq_name --创建默认约束 USE student
ALTER TABLE stuInfo
ADD CONSTRAINT df_sex DEFAULT('男') FOR sex --删除默认约束 ALTER TABLE stuInfo DROP CONSTRAINT df_sex --添加检查约束 USE student
ALTER TABLE stuInfo
ADD CONSTRAINT ck_age CHECK(age>'1990-1-1'AND age<'2010-1-1') --删除检查约束
ALTER TABLE stuInfo
DROP CONSTRAINT ck_age --添加外键约束 USE student ALTER TABLE score
ADD CONSTRAINT fk_stuId FOREIGN KEY(stuId) REFERENCES stuInfo(id) --删除外键约束
ALTER TABLE score
DROP CONSTRAINT fk_stuId 说明:
主键约束:要求主键列数据唯一,且不允许空
唯一约束:要求该列唯一,允许空,但只能出现一个空值 检查约束:某列取值范围、格式等 默认约束:某列默认值
外间约束:用于在两表之间建立关系,需要制定引用主表的哪一列
创建登陆账户
添加Windows登陆账户需要调用SQL Server内置的系统存储过程sp_grantlogin 例:EXEC sp_grantlogin „windows 域名/域账户‟
添加SQL登陆账户需要调用系统存储过程sp_addlogin 例:EXEC sp_addlogin „账户名‟,‟密码‟
创建数据库用户
创建数据库用户需要调用系统存储过程sp_grantdbaccess 例:EXEC sp_grantdbaccess „登录账户‟,‟数据库用户‟
第 4 页 共 69 页
其中,“数据酷用户”为可选参数,默认为登陆账户,即数据库用户默认和登陆账户同名。 注:SQL Server中的dbo用户是具有在数据库执行所有活动的权限的用户,表示数据库的所有者(owner),一般来说,如果创建了某个数据库,就是该数据的所有者,即dbo用户,dbo用户是一个比较特殊的用户,无法删除,且此用户始终出现在每一个数据库中。
数据库用户授权
GRANT 权限 [ ON 表名 ] TO 数据库用户
例:GRANT SELECT ,INSERT ,UPDATE , ON 表名 TO 用户
T-SQL编程
局部变量(自定义变量)
变量声明:
DECLARE @变量名 数据类型 变量赋值:
SET @变量名=值
SELECT @变量名=字段名FROM 表名
注:
SET赋值语句一般用于赋给变量指定的数据常量
SELECT赋值语句一般用于从表中查询数据,然后再赋值给变量。SELECT语句需要确保筛选的记录不多于一条,如果查询的记录多于一条,将把最后一条记录的值赋给变量。
全局变量(系统变量)
变量 @@ERROR @@IDENTITY 含义 最后一个T-SQL错误的错误号 最后一次插入的标识值 当前使用的语言的名称 @@LANGUAGE @@MAX_CONNECTIONS 可以创建的同时连接的最大数目 @@ROWCOUNT @@SERVERNAME @@TRANSCOUNT 受上一个SQL语句影响的行数 本地服务器的名称 当前连接打开的事物数 IF-ELSE条件语句
IF(条件)
BEGIN
语句或语句块 END
第 5 页 共 69 页
ELSE
BEGIN
语句或语句块 END
WHILE循环语句
WHLIE(条件)
BEGIN
语句或语句块
[BREAK] END
BREAK关键字从最内层的WHLIE循环中退出。
CASE多分支语句
CASE WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2 WHEN 条件3 THEN 结果3 [ELSE 其他结果]
END
批处理
一般将一些逻辑相关的业务操作语句,放置在同一批中,批处理是一条或多条SQL语句的集合,SQL Server将批处理语句编译成一个可执行单元,次单元成为执行计划。
高级查询 子查询
SELECT … FROM 表1 WHERE 字段1 >(子查询)
注:将子查询和比较运算符结合使用,必须保证子查询返回的值不能多于一个。
EXISTS子查询
例:IF EXISTS (SELECT * FROM sysDatabases WHERE name=‟stuDB‟)
DROP DATABASE stuDB CREATE DATABASE stuDB
第 6 页 共 69 页
EXISTS 可以作为WHERE语句的子查询,但一般用于IF语句的存在检测,如果子查询的结果非空,则EXISTS返回真(true),否则返回假(false)
事务
事务是指一个工作单元,该单元可以包含多个步骤来完成所需的任务,一个事务作为一个整体,要么成功,要么失败。如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有的数据更改均被清除。
事务是一种机制、一个操作序列,它包含一组数据库操作命令,并且所有的命令作为一个整体一起想系统提交或撤销操作请求。
事务具有:原子性、一致性、隔离性、持久性。
创建事务
开始事务:BEGIN TRANSACTION 提交事务:COMMIT TRANSACTION 回滚事务:ROLLBACK TRANSACTION
事务分类
显式事务:用BEGIN TRANSACTION明确指定事务的开始
隐式事务:通过设置SET IMPLICIT_TRANSACTIONS ON语句,将隐式事务模式设置为打开。当以隐式事务操作时,SQL Server将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需提交或回滚每个事务。
自动提交事务:这是SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事物,如果成功执行,则自动提交,如果错误,则自动回滚。 例:
USE MyBank GO PRINT '查看转账事务前的余额' SELECT * FROM Accounts GO BEGIN TRANSACTION DECLARE @sumError INT SET @sumError=0 UPDATE Accounts SET Balance=Balance-500 WHERE CustomerId='user' SET @sumError=@sumError+@@ERROR UPDATE Accounts SET Balance=Balance+500 WHERE CustomerId='jingjing' SET @sumError=@sumError+@@ERROR 第 7 页 共 69 页
PRINT '查看转账事务过程中的余额' SELECT * FROM Accounts IF @sumError<>0 --有错误 BEGIN PRINT '交易失败,事务回滚' ROLLBACK TRANSACTION END BEGIN PRINT '交易成功' ELSE COMMIT TRANSACTION END GO PRINT '查看转账事务后的余额' SELECT * FROM Accounts GO 索引 索引的作用
SQL Server中的数据是按页(4K)存放的
索引是SQL Server编排数据的内部方法。它为SQL Server提供一种方法来编排查询数据 索引页:数据库中存储索引的数据页;索引页类似于汉语字(词)典中按拼音或笔画排序的目录页。
索引的作用:通过使用索引,可以大大提高数据库的检索速度
索引的类型
唯一索引:不允许两行具有相同的索引值 如果现有数据中存在重复的键值,则一般情况下大多数数据库不允许创建唯一索引,当新数据使表中的键值重复时,数据库页拒绝接受此数据。例:如果在stuInfo表中的学员身份证号(stuID)列上创建了唯一索引,则所有学员的身份证号不能重复。
主键索引:在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值时唯一的,当在查询中使用主键索引时,还允许快速访问数据。主键索引要求主键中的每个值是唯一的,并且不能为空。
聚集索引:表中各行的物理顺序与键值的逻辑(索引)顺序相同,没个表中只能有一个。 非聚集索引:非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个。 UNIQUE指定唯一索引
CLUSTERED、NONCLUSTERED指定是聚集索引还是飞聚集索引。 FILLFACTOR表示填充因子,指定一个1——100的值,该值指示索引页填满的空间所占的百分比。
第 8 页 共 69 页
创建索引
CREATE NONCLUSTERED INDEX IX_Accounts_CustomerId ON Accounts(CustomerId) WITH FILLFACTOR =30 GO 使用索引查询
CREATE NONCLUSTERED INDEX IX_Accounts_CustomerId ON Accounts(CustomerId) WITH FILLFACTOR =30 GO SELECT * FROM Accounts WITH (INDEX=IX_Accounts_CustomerId) WHERE CustomerId LIKE '%e%' GO 视图
视图是一种虚拟表,通常是作为来自一个或多个表的行或列的子集创建的。可以包含全部的行和列,但是视图并不是数据库中存储的数据值的集合。它的行和列来自查询中引用的表。在执行时,直接显示来自表中的数据。定义视图的查询可以基于一个或多个表、也可以基于其他视图、当前数据库或其他数据库。
创建视图
CREATE VIEW view_Custom AS SELECT CustomerId AS 用户名,CustomerPassword AS 账户密码,Balance AS 余额FROM Accounts SELECT * FROM VIEW_CUSTOM 存储过程 概念
存储过程类似于Java中的方法,他是SQL语句和控制流语句的预编译集合。存储过程可包含逻辑控制语句和数据操作语句,也可以接受参数、输出参数、返回单个或多个结果集以及返
第 9 页 共 69 页
回值。
存储过程的优点
允许模块化程序设计 执行速度快 减少网络流量 提高系统安全性
常用的系统存储过程
可以猜任何数据库中运行系统存储过程,但执行结果会反映在当前数据库中 系统存储过程 说明 sp_databases sp_helpdb sp_renamedb sp_tables sp_columns sp_help sp_helpconstraint sp_helpindex sp_stored_procedures sp_password sp_helptext sp_spaceused sp_helpuser sp_helpserver sp_helptrigger 服务器上所有数据库 报告有关指定数据库或所有数据库的信息 更改数据库的名称 返回当前环境下可查询的对象列表 返回某个表列的信息 查看某个表的所有信息 查看某个表的约束 查看某个表的索引 列出当前环境中的多有存储过程 添加或修改登录账户的密码 显示默认值、未加密的存储过程、用户定义的存储过程、触发器或试图的实际文本 查看当前数据库的大小等信息 查看挡前数据库服务器上所有的用户 查看单签可用数据库服务器及相关信息 查看触发器的相关信息 例:
EXEC sp_databases --列出当前系统中的数据库 EXEC sp_renamedb 'MyBank1','MyBank' --改变数据库名称 USE MyBank EXEC sp_tables --当前数据库中可查询对象列表 EXEC sp_columns Accounts --返回Accounts表列的信息 EXEC sp_help Accounts --返回Accounts表的所有信息 EXEC sp_helpconstraint Accounts --查看Accounts表的约束 EXEC sp_helpindex Accounts --查看Accounts表的索引 EXEC sp_helptext 'ck_balance' --查看ck_balance视图的语句文本 EXEC sp_stored_procedures --返回当前数据库的存储过程列表 第 10 页 共 69 页
扩展存储过程
xp_cmdshell:完成DOS命令下的操作,诸如创建文件夹、列出文件列表等。 例:
EXEC xp_cmdshell 'mkdir d:\\123', no_output EXEC xp_cmdshell 'dir d:\\' 用户自定义存储过程
CREATE PROCEDURE,所有的存储过程都创建在当前数据库中,可以使用alter,drop更改或删除一个存储过程。
存储过程的调用:EXEC 存储过程名
可以再调用时向存储过程传递参数
如果希望返回值,则可使用输出参数,输出参数后面有“OUTPUT”标记,调用时在要接收输出值的变量后面也必须加“OUTPUT”标记
3、若需调用的存储过程有两个或两个以上的参数,在调用时,传递到存储过程的参数从第一个开始一次匹配,或只给部分参数传递值,而其他参数使用默认值时,必须指明参数,并用“=”传递值。
临时存储过程
临时存储过程是指以:#(局部临时存储过程)或##(全局临时存储过程)为前缀的存储过程(即存储过程名称前加#或##),这类存储过程的一个显著特点就是当关闭SQL Server后,这些存储过程将不再存在。
处理错误信息
在存储过程中可以用PRINT语句显示用户定义的错误信息。但是,这些信息是临时的,且只能显示给用户看,RAISERROR返回用户定义的错误信息时,可指定严重级别,设置系统变量记录发生的错误。
用户定义的严重级别为0~18级,19~25级是sysadmin固定角色的成员预留的,并且需要指定WITH LOG选项。20~25级错误被认为是致命错误。 存储过程例子:
--创建存储过程——产生随即卡号 drop procedure proc_randCardID create procedure proc_randCardID @randCardID char(19) output as begin declare @a numeric(15,8) declare @temp char(10) 第 11 页 共 69 页
select @a=rand((datepart(mm,getdate())*100000)+(datepart(ss,getdate())*1000)+datepart(ms,getdate()))--产生随即数 set @temp=convert(char(10),@a) set @randcardID='1010 3576'+' '+substring(@temp,3,4)+' '+substring(@temp,7,4) end go --测试随即数 declare @cardID char(19) exec proc_randCardID @cardID output print @cardID 触发器 定义
触发器相当于面向对象模型中的事件,触发器于特定的SQL Server对象(如数据表)想关联,并且在与之相关联的变动出现时,由SQL Server数据库服务器自动执行该触发器。 触发器实际上就是存储过程,只不过他是一种不带有任何输入输出接口参数的存储过程(显然在设计存储过程时不能使用return语句)。当数据库中发生与之绑定的查询或维护操作时,他们将被自动地执行。 例:
--插入操作触发器 create trigger tr_userInfo_insert on userInfo for insert as declare @PID char(18) select @PID=PID from inserted print '身份证号:'+convert(char(18),@PID) go --删除操作触发器 create trigger tr_transInfo_delete on transInfo for delete as declare @cardID char(18) select @cardID=cardID from deleted print @cardID go --更新操作触发器 create trigger tr_cardInfo_update 第 12 页 共 69 页
on cardInfo for update as declare @beforeUpdate money declare @afterUpdate money select @beforeUpdate=balance from deleted select @afterUpdate=balance from inserted if((@afterUpdate-@afterUpdate)>2000)--支取金额查过两千元 begin raiserror ('支取金额超过两千元',16,1) rollback tran end go --删除触发器 drop trigger tr_userInfo_delete drop trigger tr_cardInfo_update deleted表和inserted表
数据库的更新操作实际上是先删除表中原有的记录,然后再插入新的记录,在删除的过程中,会产生临时表deleted,在插入过程中差生临时表inserted,这两张临时表会在插入成功后自动消失。
深入.NET平台和C#编程
NET概述
1、.NET框架提高软件的可复用性、可扩展性、可维护性、灵活性。
2、.NET框架具有的组要组件:公共语言运行时和框架类库。公共语言运行时是.NET框架的基础。框架类库是一个综合性的面相对象的可重用类型的集合。 3、公共语言运行时(CLR):是所有的.NET应用程序运行时环境。 4、CLR包括:CLS(公共语言规范)和CTS(通用类型系统)。
5、为了实现跨语言和跨平台的战略目标,.NET所有编写的应用都不是编译为本地代码,二十先编译成微软中间代码MSIL,它将由JIT编译器转换成机器代码。
.net框架类库
框架类库中的核心部分包括以下几点:
基础数据的类库,如String类、集合、泛型等。
第 13 页 共 69 页
I/O访问,主要用于文件的操作。
安全机制,为.NET安全机制提供一系列的功能。 数据访问,利用ADO.NET开发数据库的应用程序。
XML是用于描述数据的一种文件格式,它是.NET框架中很重要的一部分。
C#简述 C#语言的特点
完全的面相对象设计
C#2.0之后对泛型提供了更完整的支持 C#语言与Web应用程序开发紧密结合 提供强大的类库
框架类库中的命名空间
命名空间 System System.Collections System.Collections.Generic 主要功能 包含用于定义常用值和引用数据类型、事件和事件处理程序、接口、属性和处理异常的基础类和基类 包含定义各种对象集合(如Arrayshe HashTable)的接口和类 包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类集合更好的类型安全性和性能 提供可以以编程方式访问.NET框架配置设置和处理配置文件(.config)中的错误的类和接口 由构成ADO.NET的类组成,提供.NET中的数据访问功能 包含由.NET数据提供程序共享的类 封装SQL Server .NET数据提供程序 提供对GDI+基本图形功能的访问 包含允许对数据流和文件进行同步和异步读写的类型 为当前网络采用的多种协议提供简单的编程接口 包含提供已加载类型、方法和字段的托管视图的类和接口,并具有动态创建和调用类型的能力 CLR的安全系统功能 包含表示ASCII、Unicode、UTF-7和UTF-8字符编码类 提供Web编程支持 对处理XML提供支持 包含用于创建基于Windows的应用程序的类,以充分利用Microsoft Windows操作系统中提供的丰富的用户界面功能 System.Configuration System.Data System.Data.Common System.Data.SqlClient System.Drawing System.IO System.NET System.Reflection System.Security System.Text System.web System.XML System.Windows.Forms 第 14 页 共 69 页
C#面向对象 概念
具有对象共同特性的类型在面向对象中称为“类”
类描述了一组相似对象的共同特性,是具有相同特性和共同行为的一组对象的集合 类有属性和方法,他们是一组相似对象状态和行为的抽象 对象所拥有的特征,在类中表示时称为类的属性 对象执行的操作称为类的方法 总结:
1、由对象归纳为类,是归纳对象共性的过程
2、在类的基础上,将状态和行为实例化为对象的过程称为实例化
类的成员
字段:类中用于操作的变量,表示与类和对象相关联的数据,一般用private修饰 属性:用来表示类的状态 方法:用来表示类的行为
构造方法:用来创建对象,在创建实例时对对象进行初始化 析构方法:释放对象
索引器:与数组类似,可以使用索引访问,也可以自定义访问方式
静态类
静态类不能被继承 静态类没有索引器
静态类中所有成员都是静态的 静态类使用时不能new,直接访问
属性(封装)
在C#中,通常不直接访问类中的字段,而是通过get和set访问器来访问,这种实现方式称为属性。 例:
private String name;//姓名 public String Name { get { return name; } set { name = value; } } 第 15 页 共 69 页
private String sex;//性别 public String Sex { get { return sex; } set { if (sex != \"男\" || sex != \"女\") { sex = \"男\"; } else { sex = value; } } } 注: 只读属性:只包含get访问器 只写属性:只包含set访问器 读写属性:包含set和get访问器 封装:
避免使用非法数据赋值 保证数据的完整性
避免类内部发生修改时,导致整个程序的修改
方法
用来表示类和对象的行为
方法的返回值
方法的返回值可以是基本数据类型,也可以是对象类型object,还可以使void(无返回值) 方法的参数
为方法传递参数有两种方式
值传递:在方法中对参数值的更改在调用后不能保留
引用传递(ref方式传递):可以将参数值的更改保留
注:ref和out方式的参数都可以将更改保留,但是ref侧重于修改,out则侧重于输出。 例:
static void Main(string[] args) { int result; int i=55; AddScore(ref i,out result); Console.WriteLine(\"加分后成绩:\"+result); } 第 16 页 共 69 页
private static void AddScore(ref int score,out int scoreResult) { if (score > 50 && score < 60) { Console.WriteLine(\"可以加分\"); score = 60; } scoreResult = score; } 注:在具有out参数的方法中,必须对out参数进行赋值,而ref则不需要,在方法中没有给out参数赋值之前,是不能使用这个参数进行运算的。
静态方法
通过类名调用
不能直接访问实例方法
实例方法可以直接访问静态方法 静态构造方法不能加访问修饰符
方法重载
例: using System; using System.Collections.Generic; using System.Text; namespace Test1 { class Add { //两个整数相加 public int sum(int para1, int para2) { return para1 + para2; } //三个整数相加 public int sum(int para1, int para2, int para3) { return para1 + para2 + para3; } //l两个小数相加 public double sum(double para1, double para2) { 第 17 页 共 69 页
return para1 + para2; } } } 上例,如果要计算int、double型的数据时,无需判断数据类型,只需将两个数创如sum()方法,系统将会自动识别;类中两个以上的方法,取得名字相同,只要使用的参数类型或者参数个数不同,称为方法的重载。
静态方法与实例方法的区别
静态方法 static关键字 类名调用 可以访问静态成员 不可以直接访问实例成员 不能直接调用实例方法 调用前初始化 实例方法 不需要static关键字 实例对象调用 可以直接访问静态成员 可以直接访问实例成员 可以直接调用实例方法和静态方法 实例化对象时初始化 构造方法
例:
class Student { private string name; private int age; Student() { } public Student(string name, int age) { this.name = name; this.age = age; } } 说明:
每个类都有构造函数,即使我们没有声明,编译器也会自动提供一个默认的没有参数的构造函数,在访问一个类时,系统将最先执行构造函数中的语句;构造函数用于在创建对象实例对对象进行实例化。
一个类的构造函数名与类名相同 构造函数没有返回值
一般情况下,构造函数总是public类型的
在构造函数中不要对类的实例做初始化以外的事情,不要尝试显示调用构造函数也就是直接去调用
第 18 页 共 69 页
this关键字
this关键字代表的是当前的对象,在类的内部,可以使用this关键字类访问它的成员。
常量的定义
在变量前面使用关键字const,就可以把一个变量定义为常量
例:const int MAX=100;
常量在程序的使用过程中是不会发生变化的变量。如果强行修改它的值,就会发生错误。
只读变量的定义
例:public readonly string sex;
只读变量在构造函数中赋值或在定义时赋值,并且只可以赋值一次。
枚举类型
使用关键字enum定义一个枚举类型,表示一组有些的值,对可能的值进行约束 例: class Program { static void Main(string[] args) { Sex sex1 = Sex.boy; Genders sex2 = Genders.man; } public enum Genders { man, woman } } public enum Sex { boy, girl } 注:
泛型可定义在类中,或者单独定义在命名空间中
sex1与sex2的类型为枚举类型,在赋值时只能使用枚举类型 把枚举类型转换为其他类型,可以强制类型转换
第 19 页 共 69 页
枚举的主体中,不能定义属性和方法 其他类型转换为枚举类型,例:
Genders sex3 = (Genders)(Enum.Parse(typeof(Genders), \"man\")); 结构
结构中可以有字段,也可以有方法,也可以有构造方法结构与类非常形似,在使用结构时可以不使用new ,直接定义就可以了,但是必须给结构的成员赋初值,直接使用结构的名字访问成员就可以了
如果不用new,则必须通过字段为结构的成员赋初值,而且不可以使用结构的方法 使用new后,就可以通过属性赋值,也可以使用结构的方法 struct Student { string name; int age; public void say() { } } 结构与类的区别
类 引用类型 可以被继承 不同点 可以有默认的构造函数 可以添加无惨的构造函数 创建对象必须用new 类中可以给字段赋值 相同点 都可以包含字段、方法 都可以实现接口 都可以实例化 结构 值类型 不能被继承 不可以有默认构造函数 可以添加构造函数,但必须带参数 可以不用new 结构中不可以给字段赋值 值类型和引用类型
值类型的变量总是直接包含着自身的变量,将一个值类型变量赋给另一个值类型变量时,将复制包含的值
引用类型源于System.Object家族,它存储的是对值的引用
在方法中,通过值传递,在方法中执行完操作后将不保留更改,但是引用传递将保留更改
第 20 页 共 69 页
装箱和拆箱
把值类型转换成引用类型的过程称为装箱,反过来由引用类型转换为值类型称为拆箱。
索引器
定义索引器的时候要使用this关键字,而get和set访问器也类似于属性。索引器和数组属性类似,但数组只能通过下标(索引)访问,而索引器可以重载,自定义访问方式。 例: class Students { private Student[] students = new Student[2]; public Students() { students[0] = new Student(\"Scofield\", Genders.Male, 28, \"越狱狱\"); students[1] = new Student(\"张靓靓\", Genders.Female, 20, \"唱歌歌\"); } //基本索引器根据数组下标查找学员 public Student this[int index] { get { return students[index]; } } //与Java 中的getter 方法类比证明方法可以返回一个类型 //public Student GetStudent(int index) //{ // return students[index]; //} //重载的索引器根据姓名查找学员 public Student this[string name] { get { int i; bool found = false; for (i = 0; i < students.Length; i++) { if (students[i].Name == name) { found = true; break; } } if (found) 第 21 页 共 69 页
{ return students[i]; } else { return null; } } } } 集合、泛型集合
数组:是一组具有相同类型和名称的变量的集合,并且可以通过索引访问数组中的元素,但是一旦数组元素完成初始化工作,要在程序中动态添加和删除某个元素是非常困难的。 集合:如ArrayList、HashTable,他们在处理动态元素添加、删除时非常方便。
ArrayList
ArrayList非常相似于数组,也称为数组列表,ArrayList的容量可以根据需要自动扩充,索引会根据扩展而重新进行分配和调整。ArrayList可以根据类提供的方法,进行访问、新增、删除元素的操作,实现对集合的动态访问。
ArrayList类来自于System.Collections命名空间,在使用前腰引入此命名空间,ArrayList是可动态维护的,所以在定义时可以不指定容量。 例:
//建立班级学员集合 ArrayList students = new ArrayList(); Student zhang = new Student(\"张靓颖\", 22); Student jay = new Student(\"周杰伦\", 23); //向ArrayList中添加元素 students.Add(zhang); students.Add(jay); //输出集合元素个数 Console.WriteLine(students.Count.ToString()); //存取单个元素 Student s1 = (Student)students[0]; s1.say(); //删除第一个元素 //students.RemoveAt(0); Console.WriteLine(students.Count.ToString()); //遍历元素 foreach (object var in students) 第 22 页 共 69 页
{ Student stu = (Student)var; Console.WriteLine(stu.Name); } HashTable
通常称为哈希表,哈希表的数据是通过键(KEY)和值(VALUE)组织的。在哈希表中,每个元素都是一个键/值对,而且是一一对应的,通过键便可以找到相应的值。 Hashtable students = new Hashtable(); Student zhang = new Student(\"张靓颖\", 22); Student jay = new Student(\"周杰伦\", 23); //添加元素 students.Add(\"张靓颖\", zhang); students.Add(\"周杰伦\", jay); //元素个数 Console.WriteLine(students.Count.ToString()); //获取单个元素 Student stu = (Student)students[\"张靓颖\"]; stu.say(); //删除元素 students.Remove(\"张靓颖\"); //遍历元素 foreach (object var in students.Values) { Student stud = (Student)var; stud.say(); } 泛型与泛型集合
通过泛型可以定义类型安全的数据类型,它的显著应用就是创建集合类,可以约束类内的元素类型,典型的泛型是List 泛型的主要应用之一是泛型集合,它有很多传统集合没有的特性,与传统集合相比,它的类型更为安全,无须装箱、拆箱的操作,泛型集合的操作方式直观,容易上手,泛型的重要性体现在以下几点: 解决了很多繁琐的操作问题,例如传统集合中获取元素需要大量的类型转化,ArrayList添加元素是都是Object类型,如果添加一个值类型,就需要先将值类型转换为引用类型,而取出时在讲引用类型转换为值类型,需要不断的装箱拆箱操作,不易控制程序的异常,而泛型集合物须这些类型的转化,是变成更便捷。 提供了更好的类型安全性,泛型对于类型的约束十分严格,它可以控制我们在集合中对于不同类型的对象的胡乱使用,从而保证程序类型的安全。 CLR可以支持泛型,这样使得整个.NET平台都能够使用泛型。 第 23 页 共 69 页 List List List List 不同点 List Dictionary Dictionary Dictionary 不同点 Dictionary 文件读写的基本步骤 创建一个文件流 创建阅读器或者写入器 执行读写操作 关闭阅读器或者写入器 关闭文件流 例: //创建文件流 FileStream fs = new FileStream(Path, FileMode.Create); //创建写入流 StreamWriter sw = new StreamWriter(fs); //将录入的内容写入文件 sw.Write(\"test\"); //关闭写入器 sw.Close(); //关闭文件流 fs.Close(); 文件流 流是一个用于数据传输的对象。文件流FileStream类,主要用于读写文件中的数据,在创建一个文件流时,需要在它的构造函数中指定参数。 FileStream(String FilePath,FileMode),FilePath用于指定要操作的文件,FileMode指定如何打开文件的模式,是一个枚举类型。 Create:用指定的名称新建一个文件,如果文件存在,则改写旧文件。 CreateNew:新建一个文件,如果文件存在就会发生异常,指示文件已经存在, Open:打开一个文件,使用这个枚举时,指定的文件必须存在,否则会发生异常。 OpenOrCreate:OpenOrCreate与Open成员类似,只是如果文件不存在,则用指定名称新建一 第 25 页 共 69 页 个文件并打开它。 StreamWriter写入器 StreamWriter类称为写入器,用于将数据写入文件流,写入器的主要方法: StreamWriter.Writer():用于写入流,这个流是之前定义好的流。 StreamWriter.WriterLine():用于写入一行数据,写入某些数据后跟换行符。 StreamWriter.Close():用于关闭写入流。 StreamReader读取器 StreamReader称为读取器,用于读取流中的数据,读取器的主要方法: StreamReader.ReadLine():读取文件流中的一行数据,并返回字符串。 StreamReader.ReadToEnd():从当前位置读到末尾,返回字符串。 StreamReader.Close():关闭读取器。 文件和目录操作 File类的方法: 方法 Exists(string path) Copy(string SourceFilePath,stringDesFilePath) Move(string FilePath,string DestFilePath) Delete(string Path) Directory类的方法: 方法 Exists(string Path) Move(string DestDirName) Delete(string,bool) 说明 用于检查指定文件夹在磁盘上是否存在 SourceDirName,string 用于将文件或目录及其内容移到新位置 删除指定目录,如果bool职位true,则删除子目录中的所有目录内容 说明 检查指定文件是否存在,方法返回布尔值 将指定路径的源文件中的内容复制到指定目录文件中,如果目标文件不存在,则在指定路径中新建一个文件 将指定文件移动到一个新的路径 删除指定的文件,如果指定文件不存在,则引发异常 XML XML概述 XML称为可扩展标记性语言,是.NET框架中非常重要的以部分。用于描述数据。 第 26 页 共 69 页 例: XML中的每对标记通常称为节点,他们是成对出现的,用来描述这个节点存储的内容。 XML的使用 XmlDocument对象可表示整个XML文档,它使用Load()方法将指定的XML文件读入XmlDocument对象,属性DocumentElement用于获取XML文件的根节点,XmlNode对象表示一个XML中的节点,ChildNodes属性用于获得该节点下的所有子节点。 总结: 对象 XmlDocument 属性和方法 DocumentElement ChildNodes Load()方法 InnerNext属性 XmlNode Name属性 ChildNodes 说明 获取根节点 获取所有子节点 读取整个XML的结构 当前节点的值 当前节点的名字 当前节点的所有子节点 遍历XML 例: foreach (XmlNode node in node.ChildNodes) { switch (node.Name) { case \"title\": //具体操作 break; default: break; } 第 27 页 共 69 页 } foreach (XmlNode node in ele.ChildNodes) { switch (node.Name.ToLower()) { case \"name\": //创建树节点 TreeNode tn = new TreeNode(); tn.Text = node.InnerText; treeView1.Nodes.Add(tn); break; default: TreeNode tnchild = new TreeNode(); tnchild.Text = node.InnerText; treeView1.Nodes[treeView1.Nodes.Count-1].Nodes .Add(tnchild); break; } } 继承 概述 继承是面向对象编程中的非常重要的特性,在有继承关系的两个类中,子类不仅具有自己独有的成员,还具有父类的成员。 被继承的类称为父类或基类,继承其他类的类称为子类或派生类。 例: class Student : Person { static void Main(string[] args) { } } 在C#中继承的关键字为“:”,在派生类中,可以使用this关键字访问父类中的成员变量。 base关键字,表示的是父类,可以用于访问父类的成员, base关键字可以调用父类的构造函数初始化对象,例: public Student(string name, int age) : base(name) { 第 28 页 共 69 页 this.Age = age; } 继承具有传递性,如果classA:B;classB:C,则A也可以访问C的成员。 继承具有单根性,一个类不能同时继承多个父类。 被sealed关键字修饰的类称为密封类,密封类不能被继承。 在子类中,如果不使用base关键字来显示调用基类构造函数,则将隐式调用默认的构造函数。 如果重载的构造函数有一个没有使用base关键字来指明调用父类哪个构造函数,则父类必须提供一个默认的构造函数。 继承的价值 继承模拟了显示世界的关系 继承实现了代码的重用 继承使得程序结构清晰,子类和父类的层次结构清晰。最终的目的是使子类值关注子类的相关行为和状态,无须关注父类的行为与状态。 多态 程序举例: //Person类 abstract public class Person { private string name; public string Name { get { return name; } set { name = value; } } private int age; public int Age { get { return age; } set { age = value; } } //抽象方法 public abstract void sayHi(); //构造方法 public Person() { } public Person(string name, int age) 第 29 页 共 69 页 { this.Age = age; this.Name = name; } } //Teacher类 public class Teacher : Person { public Teacher(string name, int age) : base(name, age) { } //实现sayHi()方法 public override void sayHi() { Console.WriteLine(\"大家好,我是\"+this.Name+\"老师,今年\"+this.Age+\"岁了\"); } } //Student类 public class Student : Person { public Student(string name, int age) : base(name, age) { } //实现sayHi()方法 public override void sayHi() { Console.WriteLine(\"大家好,我是\"+this.Name+\"同学,今年\"+this.Age+\"岁了\"); } } class Program { static void Main(string[] args) { List person[i].sayHi(); } } } 输出结果: 大家好,我是张靓颖同学,今年23岁了 大家好,我是成龙老师,今年55岁了 概念 多态是指:两个或多个属于不同类的对象,对于同一个消息(方法调用)做出不同的响应方式。上例中,Person对象在调用sayHi()方式时,Student和Teacher对象对这一方法的理解也不同,因此,多态也可以说是同一个类在不同场合下表现出不同的行为特征。一个显著变化就是在调用sayHi()方法是无须判断类型。多态性可以让我们不用关心某个对象到底是什么具体类型。就可以使用给对象的某些方法。 当学员和老师调用SayHi()方法时,也就是同一个方法的调用,他们的响应时不同的,也就是说学员和老师具有多态性。在基类Person中添加一个sayHi()的抽象方法,让它约束的子类必须实现各自不同的sayHi(),从而实现多态。 里氏替换原则(LSP) 子类对象是可以赋给父类对象的,也可以说子类可以替换父类并且出现在父类能够出项的任何地方。但是反过来,父类对象不能替代子类,成这种特性为里氏替换原则。 is操作符 “is”操作符用于检查对象是否与给定的类型相同,如: if(obj is string) { } 使用“is”操作符在进行类型判断时,如果所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则is表达式的返回值为true。 as操作符 用于两个对象之间的类型转换。例: for (int i = 0; i < Student.Count; i++) { Student stu=new Student[i] as Student; Console.WriteLine(stu.Name); } 第 31 页 共 69 页 as预算符类似于强制转换,所不同的是,当转换失败时,运算符将产生空,而不是引发异常。 as运算符只用于引用类型的转换。 抽象类、抽象方法 抽象方法是一个没有实现的方法,通过关键字abstract声明。 含有抽象方法的类必然是抽象类。 抽象类中的方法并不一定都是抽象方法;抽象类也可以容纳有具体实现的方法,或者称为具体方法。但是,含有抽想方法的类必然是抽象类。 抽象类不能被实例化,只能通过它的子类类实现该类的方法。除非他的子类也是一个抽象方法。 抽象类不能是密封或静态的,若给抽象类增加密封类的访问修饰符sealed或static,抽象类如果不能被子类继承并实现它的抽象方法,便没有实际意义。 在子类中实现一个抽象方法是使用override关键字来重写抽象方法。 抽象父类中提供的抽象方法,要在子类中实现。即:父类提供一个功能或者规定,约束子类的行为。 虚方法 用virtual关键字修饰的方法称为虚方法,虚方法既可以具体实现,还可以被重写。 例: //父类中定义sayHi()虚方法 public virtual void sayHi() { Console.WriteLine(\"大家好!\"); } //子类中重写sayHi()方法 public override void sayHi() { base.sayHi();//调用父类中的sayHi()方法 Console.WriteLine(\"大家好,我是一名学生\"); } 虚方法与抽象方法的比较 虚方法 用virtual修饰 要有方法体,哪怕一个分号 可以被子类用override重写 除了密封类外都可以写 抽象方法 用abstract修饰 不允许有方法体 必须被子类用override重写 只能在抽象类中写 第 32 页 共 69 页 面向对象的三大特征 封装:保证对象自身数据的完整性、安全性。 继承:建立类之间的关系,实现代码的重用,方便系统的扩展。 多态:相同的方法调用可以实现不同的实现方式。 简单工厂设计模式 例: /// if (this.rbCar.Checked) { type = \"car\"; } if (this.rbTruck.Checked) { type = \"truck\"; load=int.Parse(this.txtLoad.Text.Trim()); } //加入工厂 Vehicle veh = VehicleFactory.CreateVehicle(licenseNo, name, color, yearOfService, dailyRent, load, type); vehicles.Add(veh.LicenseNO, veh); MessageBox.Show(\"车辆 \"+licenseNo+\" 已入库!\"); } catch (Exception) { MessageBox.Show(\"车辆入库失败!\"); } 注: 返回类型时父类。 方法中根据情况的不同创建不同类型的子类对象,利用里氏替换原则,将子类对象用父类保存,然后返回父类。 接口 定义 接口使用关键字interface定义,接口与抽象类相似,要实现接口,就必须实现接口中的全部方法。例: //定义接口 public interface ISayHi { void sayHi(); } //实现接口 class Program:ISayHi { public void sayHi() { } static void Main(string[] args) { 第 34 页 共 69 页 } } 注: 定义一个接口的名称时,通常都是以“I”开头。 习惯的说法是实现一个接口,继承一个类。 实现一个接口的语法与继承类似,用“:”冒号实现。 接口总结 接口是对继承单根性的扩展,一个类不能实现多重继承,但是一个类可以实现多个接口,通过实现多个接口可以变相的实现类的多重继承。 一个接口是一种规范和标准,一个类如果实现了一个接口,意味着这个类遵循了某种规范和约定,其他类可以通过这些规范和约定月它通信。 接口屏蔽了实现的细节,接口可以让接口的使用者不必关心接口的实现者是如何实现接口的。 接口的使用方便团队协作开发 泛型接口 例: //定义泛型接口 public interface ISayHi 第 35 页 共 69 页 接口与抽象类的比较 抽象类 用abstract定义 只能继承一个类 非抽象派生类必须实现抽象方法 需要override实现抽象方法 不能实例化 相同点 包含为实现的方法 派生类必须实现为实现的方法 接口:是某种行为或功能的抽象,是一种规范或者标准,或者说是一种契约。 抽象类:对具体对象的最高抽象,这个对象拥有自己的最基本特征。从整体上来讲,抽象类和接口本质上都是系统的最高抽象,从实际上来看,二者抽象的对象不一样。 接口 用interface定义 可以实现多个接口 实现接口的类必须实现所有的成员 直接实现 不同点 序列化和反射 序列化 将对象的状态存储到特定存储介质中的过程。也可以说是将对象的状态转换为可保持或传输的格式的过程。 序列化是需导入:System.Runtime.Serialization.Formatters.Binary 在需要序列化的类和他的子类前加[Serializable];告诉系统,下面的类时刻序列化的。 [Serializable]对应的类是SerializableAttractive。 特性:为目标元素(可以是数据集、模块、类、属性、方法、甚至函数参数等)加入附加信息。 例:序列化保存信息 FileStream fs = new FileStream(\"TicketsInfo.bin\BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs,SoldTickets); fs.Close(); 反序列化 从特定的存储介质中将数据重新构建的过程。 例:反序列化读取信息 FileStream fs = new FileStream(\"TicketsInfo.bin\BinaryFormatter bf = new BinaryFormatter(); this.SoldTickets=(List 程序集和反射 程序集 程序集是.NET框架应用程序的生成块,它包含编译好的代码逻辑单元。 程序集由描述它的程序集清单、类型元数据、MSIL代码、和资源组成。 在创建一个Visual Studio项目时,会自动生成源文件AssemblyInfo.cs,在这个文件中,可以查看程序集。 程序集属性列表 属性 AssemblyCompany AssemblyTitle AssemblyDescription AssemblyConfiguration AssemblyProduct AssemblyCopyright AssemblyVersion 说明 指定公司名 程序集的描述性名称 描述程序集或产品 指定建立信息,如零售或调试信息 指定程序集所属产品的名称 包含版权和商标信息 程序集的版本号 internal访问修饰符 成员在同一个程序集中都可以访问。 反射 用于在运行时通过编程方式获得类型信息。可以用ILDasm反编译工具浏览一个dll或exe的构成。 数据库的三层开发 概念 表示层:位于最外层(最上层),例用户最近,用于显示数据和接受用户输入的数据,为用户提供一种交互式操作界面,表示层一般为Windows应用程序和Web应用程序。 业务逻辑层:表示层和数据访问层之间通信的桥梁,主要负责数据的传递和处理,如:数据有效性检验、业务逻辑描述等相关功能。业务逻辑层通常为类库。 数据访问层:主要实现对数据的保存和读取操作,数据访问可以访问关系数据库、文本文件 第 37 页 共 69 页 或是XML文档等。数据访问层通常为类库。 注: 表示层依赖于业务逻辑层,业务逻辑层依赖于数据访问层。 表示层只允许应用业务逻辑层,不允许直接饮用数据访问层。 各层项目间不允许循环饮用。 搭建三层结构基本框架的步骤 搭建表示层 搭建业务逻辑层 搭建数据访问层 添加各层之间的相互依赖 数据访问层使用的类 SqlConnection类:实现数据库连接 SqlCommand类:执行SQL命令 SqlDataReader类:读取数据 SqlDataAdapter类:执行SQL命令,返回DataSet DataSet类:封装用户请求数据 创建DataSet 方法一、通过DataAdapter(数据适配器)的Fill方法将数据直接填充到DataSet中。 方法二、通过手动编码自定义DataTable(数据表)、DataColumn(数据列)、DataRow(数据行),然后将数据表添加到DataSet中。 注:一个DataSet是由多个DataTable组成,一个DataTable又是由多个DataColumn和多个DataRow组成。 DataTable DataTable是内存中的一个关系数据表,可以创建使用,也可以作为DataSet的一个成员使用。 例: DataSet dsClass = new DataSet(); DataTable dtClass = new DataTable(\"Class\"); dsClass.Tables.Add(dtClass); 注:如果没有指定DataTable名称时,把DataTable添加到DataSet中,该表会得到一个从“0”开始递增的默认表名(如:Table0、Table1等)。 指定表名时一定要避免表名重复,如果提供的表名在DataSet中已经存在,就会发生异常。 第 38 页 共 69 页 DataColumn DataColumn是创建DataTable的基础,通过向DataTable中添加一个或多个DataColumn对象类定义DataTable的结构。DataColumn有一些常用属性用于对输入数据的,如:数据类型、数据长度、默认值等。 DataColumn的常用属性 属性 AllowDBNull ColumnName DataType MaxLength DefaultValue Table Unique 说明 是否允许空值 DataColumn的名称 存储的数据类型 获取或设置文本列的最大长度 默认值 所属的DataTable的名称 DataColumn的值是否唯一 定义DataColumn 方法一、 DataColumn className = new DataColumn(); className.ColumnName = \"ClassName\"; className.DataType = System.Type.GetType(\"System.String\"); className.MaxLength = 50; 方法二、 DataColumn className = new DataColumn(\"ClassName\", typeof(string)); className.MaxLength = 50; DataRow DataRow表示DataTable中包含的实际数据,可以通过DataRow将数据添加到用DataColumn定义好的DataTable中。 例: DataRow drClass = new DataRow(); drClass[\"className\"] = this.txtClassName.Text; 自定义DataSet的步骤 创建DataSet对象。 创建DataTable对象。 第 39 页 共 69 页 创建DataColumn对象,构建表结构。 将创建好的表结构添加到表中。 创建DataRow对象新增数据。 将数据插入到表中。 将表添加到DataSet中 例: //创建一个新的空班级DataSet DataSet dsClass = new DataSet(); //创建班级表 DataTable dtClass = new DataTable(\"Class\"); //创建班级名称列 DataColumn className = new DataColumn(\"ClassName\", typeof(string)); className.MaxLength = 50; //创建年级ID列 DataColumn gradeID = new DataColumn(\"GradeID\", typeof(int)); //将定义好的列添加到班级表中 dtClass.Columns.Add(className); dtClass.Columns.Add(gradeID); //创建一个新的数据行 DataRow drClass = dtClass.NewRow(); drClass[\"className\"] = this.txtClassName.Text.Trim(); drClass[\"gradeID\"] = objGrade.GetGradeIDByGradeName(this.cboGrade.Text.Trim()); //将新的数据行插入班级表中 dtClass.Rows.Add(drClass); //将班级表添加到DataSet中 dsClass.Tables.Add(dtClass); 获取DataSet中的数据 方式一、通过制定DataSet中的具体DataTable的某行某列来获取数据。 通过表名,从DataSet中获取指定的DataTable 通过索引,从DataTable中获取制定的DataRow 通过列名,从DataRow中获取制定列的数据 例: dsClass.Tables[\"Class\"].Rows[0][\"ClassName\"]; dsClass.Tables[\"Class\"].Rows[0][\"GradeID\"]; 方式二、将DataSet中的数据直接绑定到数据展示空间上,如DataGridView中。 DataView DataView提供DataTable的动态视图,并可以对动态生成的视图中的数据进行排序、筛选等操作。与数据库中的视图类似,唯一不同的是它无法提供关联DataTable的视图,不能排除 第 40 页 共 69 页 原表中存在的列,也不能向原表中追加不存在的列。 一个DataSet中可以有多个DataTable,一个DataTable可以动态生成多个DataView。 例: DataSet dsStudent = new DataSet(); DataView dvStudent = new DataView(); dvStudent.Table = dsStudent.Tables[\"studentTable\"]; dvStudent.RowFilter = \"UserState='活动'\"; dvStudent.Sort = \"StudentName DESC\"; DataView常用的属性 属性 Table Sort RowFilter 说明 用于获取或设置源DataTable 获取或设置DataView的一个或多个排序列以及排列顺序 获取或设置用于筛选在DataView中查看哪些行的表达式 在应用RowFilter后,获取DataView中的行数 Count 注:开发中如需要多DataGridView展示的数据进行动态筛选或排序时,最好使用DataTable的DefaultView(默认视图)属性来得到DataTable的视图,例: DataTable dtStudent = (DataTable)dataGridView.DataSource; dtStudent.Tables[\"studentTable\"].DefaultView.RowFilter = \"UserState='活动'\"; 实体类 实体类:描述一个业务实体的类,业务实体是存储应用系统信息的数据表、将每一个数据表中的字段定义成属性,并将这些属性用一个类封装。这个类就成为实体类。 表示层、业务逻辑层、数据访问层都依赖于业务实体。各层之间数据的传递主要是实体对象。 编写实体类的注意点 表中的每一个字段,对应于实体类的一个protected类型的字段和一个public类型的属性。 表中字段的类型要与属性的类型相匹配。 在编写好的实体类前面一般要加上序列化属性[Serializable],它会对实体类中的所有字段、属性进行序列化处理,序列化的主要目的是为了提高数据传输中的性能与安全性。 using using作为语句,允许用户定义个范围,并在此范围末尾自动释放对象。例: using(SqlConnection conn=new SqlConnection()){ } 当执行到using语句末尾处时,将自动释放此数据库连接对象。 第 41 页 共 69 页 异常处理 导致异常的原因 代码错误,包括语法错误、逻辑错误。 资源不可用,由于系统访问了未经授权的资源而引起的错误。 公共语言运行库,有CLR内部引起的错误。 Exception类是所有异常的基类,出现错误时,系统或当前执行的应用程序通过引发包含有关该错误信息的异常来报告异常。 常见异常类型 Exception类 SystemException ArgumentException ArithmeticException DataException FormatException IOException IndexOutOfRangerException ArgumentNullException DivideByZeroException OverFlowException ApplicationException TargetException 说明 提供系统异常和应用程序异常之间的区别 提供的任意一个参数无效时,引发此异常 由算数运算导致的异常 使用ADO.NET组件时引发的异常 参数格式不符合被调用方法参数时,引发此异常 出现I/O错误时,引发此异常 数组越界 空引用传递异常 除零异常 数据溢出 应用程序定义异常 调用无效目标 异常类常用属性 属性 Message Source StackTrace InnerException 说明 引起异常的详细信息 导致异常发生的应用程序或对象名称 在堆栈上锁调用的方法的详细信息,首先显示最近调用的方法 对内部异常的引用,如果此异常基于前一个异常,则内部异常指最初发生的异常 设计模式 模式:在某一环境下某个问题的一种解决方案。 第 42 页 共 69 页 设计模式:设计模式是经验的总结与传承。 设计模式分类: 创建型模式 1、 ABSTRACT FACTORY(抽象工厂模式)——对象创建型模式 2、 FACTORY METHOD(工厂方法)——对象创建型模式 3、 SINGLETON(单件)——对象创建型模式 4、 BUILDER(生成器)——对象创建型模式 5、 PROTOTYPE(原型)——对象创建型模式 结构型模式 1、 ADAPTER(适配器)——对象结构型模式 2、 COMPOSITE(组成)——对象结构型模式 3、 BRIDGE(桥接)——对象结构型模式 4、 DECORATOR(装饰)——对象结构型模式 5、 FACADE(外观)——对象结构型模式 6、 FLYWEIGHT(享元)——对象结构型模式 7、 PROXY(代理)——对象结构型模式 行为型模式 1、 CHAIN OF RESPONSIBILITY(职责链)——对象行为模式 2、 COMMAND(命令)——对象行为模式 3、 INTERPRETER(解释器)——对象行为模式 4、 ITERATOR(迭代器)——对象行为模式 5、 MEDIATOR(中介者)——对象行为模式 6、 MEMENTO(备忘录)——对象行为模式 7、 OBSERVER(观察者)——对象行为模式 8、 STATE(状态)——对象行为模式 9、 STRATEGY(策略)——对象行为模式 10、TEMPLATE METHOD(模板方法)——对象行为模式 11、 VISITOR(访问者)——对象行为模式 第 43 页 共 69 页 抽象工厂设计模式 抽象工厂 客户 抽象产品A 实体工厂1 实体工厂2 实体产品A2 实体产品A1 抽象产品B 实体产品B2 实体产品B1 从结构可以看出,工厂依赖与所有的子类产品,客户只需知道父类产品和工厂即可。工厂是整个模式的核心,以不变应万变。 模式中参与的对象 抽象工厂,生产抽象产品。 抽象产品,提供实体产品访问接口。 实体工厂,生产实体产品。 实体产品,实现自己的功能。 抽象工厂设计模式使用思路 提供一系列相互依赖对象的创建 封装对象的常规创建方法(NEW)。 提供统一调用数据访问方法的方式。 避免调用数据访问方法和具体对象创建工作的紧耦合 抽象工厂设计模式的概念 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。 第 44 页 共 69 页 使用抽象工厂的情况 一个系统要于它产品的创建、组合和表示时。 一个系统要由多个产品系列中的一个来配置时。 实例: //创建工厂的选择应该用反射实现 public static AbstractDALFactory ChooseFactory() { AbstractDALFactory factory = null; string type = ConfigurationManager.AppSettings[\"type\"].ToString(); switch (type.ToLower()) { case \"access\": factory = new AccessDALFactory(); break; case \"sql\": factory = new SqlDALFactory(); break; } return factory; } /// } } /// //业务逻辑层使用工厂 //选择工厂 private static AbstractDALFactory factory = AbstractDALFactory.ChooseFactory(); //创建业务逻辑层对象 private ITeacherService teacherService = factory.CreateTeacherService(); JavaScript JavaScript概述 JavaScript即使一种描述性语言,也是一种基于对象和事件驱动,并具有安全性能的脚本语言。使用JavaScript的目的是与HTML超文本标记语言一起实现一个Web页面中链接多个对象,与Web客户实现交互。无论客户端还是服务器端,JavaScript应用程序都要下载到浏览器的客户端执行,减轻服务器端的负担。 JavaScript脚本的基本结构 JavaScript代码是用 Language表示编写脚本使用的脚本语言,脚本语言是浏览器解释脚本的语言。 表示注释标记。 document.write()方法类似于Java中的print()函数 注:可以将JavaScript语句放置在HTML文档中的任何位置,但是将核心脚本语句放在标签 客户端脚本的好处 含脚本的页面只要下载一次即可,减少了不必要的网络通信。 脚本程序有浏览器客户端执行,减轻服务器端的压力。 第 47 页 共 69 页 脚本的执行原理 JavaScript的基本语法 变量的声明与赋值 JavaScript是一种弱类型语言,也就是说,在声明变量时,不需要指定变量的类型,变量的类型有赋给变量的值确定。在JavaScript中,变量使用关键字var声明;可以再声明变量的同时给变量赋值,即变量的初始化,也可以在稍后的脚本中为变量赋值。 例: var count=5; var x,y; x=10; JavaScript中允许不声明变量而直接使用,系统将会自动声明该变量。 例: z=12; 运算符号 与Java语言的运算符相同 逻辑控制语句 if(表达式) { JavaScript语句 } 第 48 页 共 69 页 for(初始化,条件,增量或减量) { JavaScript语句 } 初始化参数告诉循环的开始值,必须赋予变量初值;条件是用于判断循环终止时的条件,若满足条件,则继续执行循环体重的语句,否则跳出循环;增量或减量是定义循环控制变量在每次循环时怎么变化。while循环与java中的循环类似。 switch(表达式) { case 常量值1:JavaScript语句1; } 在执行switch语句时,表达式的值将从上往下与每个case语句后的常量做比较,如果相等则执行该case语句后的JavaScript语句;如果没有一个case语句的常量与表达式的值相等,则执行default语句。 注释 单行注释以“//”开始;多行注释以“/*”开始,以“*/”结束。 类型转换 JavaScript中提供两种数据类型的转换,一种是基本数据类型的转换,与Java中的数据类型转换相似;另一种是从一个值中提取另一中数据类型的值,并完成转换工作。完成转换的方法中两种:parseInt()和parseFloat(),将字符串类型的值转换为响应的数据类型。 定义函数 function 函数名 (参数列表) { JavaScript语句; } Function是关键字。 调用函数 onClick=\"函数名()\" 调用函数常用的方式就是单击某个按钮。此例表示鼠标单击按钮式,调用函数。 注:调用时传递参数使用单引号,在函数中单引号和双引号都可以。 第 49 页 共 69 页 获取表单数据 document.表单名.表单元素名.value DOM编程 DOM涵义 DOM:即Document Object Model,是以层次结构组织的节点或信息片段的集合。这个层次结果允许在书中导航寻找特定信息。 HTML文档的树状结构 HTML文档的每个节点都是对象,每个对象都由属性、方法和事件组成。 浏览器的分层结构 浏览器对象是一个分层结构,也称为文档对象模型。 地址对象location和历史对象history对应于IE中的前进和后退按钮。 第 50 页 共 69 页 Window对象常用的属性、方法与事件 常用属性 属性 status screen history location document 说明 浏览器状态栏中显示的临时信息 客户端的屏幕和显示性能的信息 访问过的URL信息 当前URL信息 浏览器窗口中的HTML文档 常用方法 方法 alert(“提示信息”) confirm(“提示信息”) open(“URL”,”name”) close() showModalDialog() 说明 显示一个带有提示信息和确定按钮的对话框 显示一个带有提示信息、确定和取消按钮的对话框 打开具有指定名称的新窗口,并加载给定URL所指定的文档,若没有提供URL,则打开空白文档 关闭当前窗口 在模式窗口中显示指定HTML文档 常用事件 常用的window对象事件有onload()事件,表示在窗口或框架完成文档加载时触发。 第 51 页 共 69 页 窗口的特征属性 属性 height width toolbars scrollbars menubar location status resizable 例: open(\"register.html\注册窗口\说明: 打开网页register.html,窗口名称:注册窗口,toolbars=0表示无工具栏,location=0表示无地址栏,statusbars=0表示无状态栏,menubars=0表示无菜单栏,打开窗口宽为700,高为500像素,scrollbars=1表示显示滚动条。 说明 窗口高度 窗口宽度 浏览器工具条,是否显示工具栏,yes为显示 是否显示滚动条 表示是菜单栏 是否显示地址栏,yes或1显示 是否显示状态栏内的信息 是否允许改变窗口的大小,yes或1为是 对话框的特征属性 例: window.showModalDialog(“打开对话框的url”,”对话框名”,”对话框特征”); 属性 height width toolbars scrollbars menubar location status statusbars resizable 说明 对话框的高度 对话框的宽度 浏览器工具条,yes为显示 是否显示滚动条 菜单栏 是否显示地址栏 是否显示状态栏内的信息,yes或1为允许 设置浏览器状态栏是否可见 是否允许改变窗口的大小 Date 对象 Date对象是内置对象,包含日期和时间两个信息。Date对象没有任何属性。但有用于设置、获取和操作日期的方法。Date对象将日期存储为子1970年1月1日00:00:00为起点以来的毫秒数。 第 52 页 共 69 页 Get分组的方法 方法 getDate() getDay() getHours() getMinutes getSeconds() getMonth() getFullYear() getTime() 说明 返回一个月中的每一天,1~31 星期中的每一天,0~6 返回小时数,0~23 返回分钟数0~59 返回秒数0~59 返回月份0~11 返回年份,4位数 返回自1970年1月1日00:00:00的毫秒数 Set分组的方法 方法 setDate() setDay() setHours() setMinutes setSeconds() setMonth() setFullYear() 说明 设置一个月中的每一天,1~31 星期中的每一天,0~6 设置小时数,0~23 设置分钟数0~59 设置秒数0~59 设置月份0~11 设置年份,4位数 setTimeOut()方法 表示每隔多少时间,循环执行某个函数。 例: function openw(){ var now=new Date(); } document.form.time.value=now.getHours()+\":\"+now.getMinutes()+\":\"+now.getSeconds(); setTimeout(\"openw()\history 和 location 对象 history对象是通过JavaScript运行时引擎自动创建的,有一系列的URLs组成。这些URLs是用户在一个浏览器中已访问过的URLs,history的back()方法相当于“后退”按钮,forward()方法相当于“前进”按钮。go(num)方法是浏览器前进(num为正)或后退(num为负)的页面数。 第 53 页 共 69 页 history对象的方法 名称 back() forward() go(“URL” 或num) 说明 加载history列表中上一个URL 加载history列表中的下一个URL 加载指定URL或页面数 location对象的属性 属性 host hostname href 说明 设置或返回URL的主机名和端口号 设置或返回URL的主机名部分 设置或返回完整的URL字符串 location对象的方法 方法 assign(“URL”) reload() replace(“URL”) 说明 加载URL指定的新的HTML文档 重新加载当前页 加载URL指定的文档替换当前文档 document对象 document对象表示给定浏览器窗口中的HTML文档。Document的bgcolor属性可以改变页面的背景色, document对象的方法 方法 getElementId() getElementByName() 说明 根据HTML元素指定的Id,获得唯一的一个HTML元素 根据HTML元素指定的name,获得相同名称的一组元素 JavaScript中数组的使用 第一种形式: var cityList = new Array( ); cityList[0]=['成都', '绵阳', '德阳', '自贡', … '泸州']; cityList[1]=['济南', '青岛', „… '日照']; 第 页 共 69 页 第二种形式: var cityList = new Array( ); cityList['四川省']=['成都', '绵阳', '德阳', '自贡', … '泸州']; cityList['山东省'] =['济南', '青岛', '淄博', '枣庄', '东营'']; 注意: JavaScript中没有二维数组,但是可以间接实现二维数组的功能,即将一维数组的成员定义为一个数组。 CSS样式 概述 添加CSS样式有4中方法:行内样式、内嵌样式(嵌入样式表)、链接外部样式表和导入外部样式表。 样式表类型有3种:行内样式表、内嵌样式表(嵌入样式表)、外部样式表。 三种样式表 1、行内样式表 混合在HTML标签中使用。 例: 2、内嵌样式表 内嵌样式表也成为嵌入样式表,放置在 border-width:1px; border-style:solid; border-color:#00F; } #aa{ } border-width:1px; border-style:solid; border-color:#00F; 3、外部样式表 外部样式表是一个的文件。 样式表的使用 ID样式的使用 例: 类样式的使用 外部样式的使用 链接外部样式表 导入外部样式表 第 56 页 共 69 页 常用的样式 常用文本样式 名称 font-size font-family font-style color text-align 说明 字体大小 字体类型 字体样式 设置回检索文本的颜色 文本对齐 常用背景样式 名称 background-color background-image background-repeat 说明 背景颜色 背景图像 图像重复 常用组合属性样式 名称 说明 a{ color:#00F; text-decoration:none; 不带下划线的超链接样式 } a:hover{ color:#F00; } .boxBorder{ border-width:1px; border-style:solid; } .picButton{ background-image:url(images/019.jpg); border:0px; margin:0px; padding:0px; height:96px; width:96px; font-size:24px; 第 57 页 共 69 页 细边框样式 图片按钮样式 } 鼠标悬停改变字体大小 免费注册 注: 1、 border:边框,margin:边界,padding:填充 2、 在CSS中,属性background-image、border-color中都有短横线,他们对应的Style对象的属 性backgroundImage、borderColor都去掉了横线。 JAVA面向对象 封装、继承、多态 封装的实现 1、 修改属性的可见性来对属性的访问 2、 为每个属性创建一对赋值(setter)方法和取值(getter) 方法,用于对这些属性的访问 3、 在setter和getter方法中,加入对属性的存取 例: private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { if (age < 0 || age > 120) { } this.age = 22; } else { } this.age = age; 第 58 页 共 69 页 方法的重载: 方法名相同,参数不同的方法 例: public int add(int a,int b){ } public double add(double a,double b){ return a+b; } return a+b; 继承的实现 Java语言中使用extends关键字实现继承 例: class Person{ } class Teacher extends Person{ } 方法的重写:子类和父类的方法具有相同的名称、参数列表、返回类型 在子类中通过super调用父类中的成员 多态的实现 多态是具有表现多种形态的能力的特征 例: public class test1 { static void speek(ToSay s) { s.say(); } } interface ToSay { public void say(); } 第 59 页 共 69 页 public static void main(String[] args) { } Teacher t = new Teacher(); Student s = new Student(); speek(t); speek(s); class Teacher implements ToSay { public void say() { System.out.println(\"我是教师\"); } } class Student implements ToSay { public void say() { } System.out.println(\"我是学生\"); } 接口 定义 接口就是一些方法特征的集合,方法没有是想,接口是一种规范,接口中方法在不同的地方是想,所以具有不同的行为。 面向接口编程 开发系统时,主体架构使用接口,接口构成系统的骨架,这样就可以通过更改接口的实现类来更改系统的实现 集合框架 Collection接口 Collection接口是最基本的集合接口,一个Collection代表一组元素。 List接口 List接口继承自Collection接口,List是有序集合,允许有相同的元素 List接口的实现类 有ArrayList和LinkedList,都可以容纳所有类型的对象,包括null,并且都保证元素的存储顺序。 ArrayList实现了可变大小的数组,有点在于遍历元素和随机访问元素的效率比较高。 LinkedList提供了额外的AddFirst()、addLast()、removeLast()等方法,可以在LinkedList的首 第 60 页 共 69 页 部或尾部进行插入或者删除操作。 例: import java.util.*; public class CollectionTest { } public static void main(String[] args) { } List 返回类型 boolean int Object void boolean boolean 方法 add(Object o) size() get(int index) add(int index,Object o) containst(Object o) remove(Object o) 说明 在列表末尾顺序添加元素,其实索引0 列表中元素个数 返回制定索引位置的元素 在索引位置添加元素 判断列表中是否存在指定元素 从列表中删除元素 LinkedList的一些特殊方法 返回类型 void void Object Object Object Object 方法 addFirst(Object o) addLast(Object o) getFirst() getLast() removeFirst() removeLast(0 说明 在列表的首部添加元素 在列表的末尾添加元素 返回列表中第一个元素 返回列表中的最后一个元素 删除第一个元素 删除最后一个元素 第 61 页 共 69 页 Map接口 Map接口提供key(键)到value(值)的映射,一个Map中不能包含相同的key,每个key只能映射一个value。 Map接口的实现类 HashMap实现一个键到值的映射的哈希表。 例: import java.util.*; public class CollectionTest { } public static void main(String[] args) { } Map 返回值 Object Set Collection boolean Object Object 方法 put(Object key,Object value) keySet() values() containsKey(Object key) get(Object key) remove(Object key) 说明 以“键-值”的方式存储 返回键的集合 返回值的集合 如果存在指定的“键-值”对,返回true 根据键返回关联的值,不存在则返回null 删除指定键映射的“键-值”对 JDBC JDBC是Java数据库连接(Java DataBase Connectivity)技术的简称。 Java应用程序可以使用集成在JDK中的java.sql和javax.sql包中的JDBC API连接和操作数据库。 第 62 页 共 69 页 JDBC API JDBC API有SUN提供了Java应用程序与各种不同数据库交互的标准接口。如:Connection(连接)接口、Statement接口、PreparedStatement接口、ResultSet(结果集)接口等 JDBC Driver Manager 管理各种不同的JDBC驱动 JDBC驱动 由各数据库厂商提供,负责连接各种不同的数据库,各种不同的数据库驱动均实现了JDBC API中定义的各种接口。 JDBC API功能 1、 与数据库建立连接 2、 发送SQL语句 3、 处理结果 JDBC API工作的环节 1、 DriverManager类:依据数据库的不同,管理JDBC驱动 2、 Connection接口:负责连接数据库并担任传送数据的任务 3、 Statement接口:由Connection产生,负责执行SQL语句 4、 ResultSet接口:负责保存Statement执行后所产生的查询结果 例: Class.forName(\"com.microsoft.sqlserver.jdbc.SQLServerDriver\");// 注册驱动 Connection conn = DriverManager.getConnection(\"jdbc:sqlserver://localhost:1433;databaseName=Manager\", \"sa\",\"\");// 连接数据库 Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(\"select * from Admin\");// 发送SQL语句 while (rs.next()) {//遍历返回数据 } System.out.println(rs.getString(\"name\") + \"\\"+ rs.getString(\"sex\")); Statement语句 Statement实例由Connection对象生成,执行SQL命令有如下三种常用方法。 第 63 页 共 69 页 1、 ResultSet executeQuery(String sql):执行SQL查询并获取到ResultSet对象 2、 int executeUpdate(String sql):执行插入、删除、跟新操作,返回受影响的行数 3、 boolean execute(String sql):一般的执行方法,可执行任意SQL语句,返回值表示是否能 返回ResultSet ConnectionManager类 ConnectionManager类有4个静态方法: 1、 getConnection():创建数据库连接,采用纯Java驱动 2、 closeStatement():关闭Statement对象 3、 closeConnection():关闭数据库连接 4、 closeResultSet():关闭结果集 PreparedStatement接口 PreparedStatement接口继承自Statement接口,PreparedStatement比普通Statement对象使用更方便灵活,更有效率。 PreparedStatement实例包含已编译的SQL语句,SQL语句可具有一个或多个输入参数,SQL语句中用“?”作为占位符。 例: String sql=\"insert into Admin values (?,?)\"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, \"王五\"); stmt.setString(2, \"男\"); int r=stmt.executeUpdate(); JSP开发WEB应用系统 WEB项目的目录结构 Web项目要求按特定目录结构组织文件,主要目录有以下几个: 1、 src目录:用来存放Java源文件 2、 WebRoot目录:是这个Web应用的顶层目录,也称为文档根目录,由以下部分组成: a) MEYA-INF目录:系统自动生成,存放系统描述信息。 b) 静态文件:包括所有的HTML网页、CSS文件、图像文件等。一般按功能以文件夹 形式分类。 c) JSP文件:利用JSP可以很方便的在页面中生成动态的内容。 3、 WEB-INF目录:给目录存在于文档更目录下,但是该目录不能被引用也就是说,在目录 下存放的文件无法对外发布,WEB-INF目录由以下几部分组成: 第 页 共 69 页 a) lib目录:包含Web应用所需的.jar或者.zip文件。 b) web.xml:Web应用的初始化配置文件,非常重要,不要随意修改或删除。 URL 定义 Uniform Resource Location的缩写,译为“统一资源定位符”,通常称为网址,URL是唯一能够识别到Internet上具体的计算机、目录或文件位置的命名约定。 组成: 第一部分是协议; 第二部分是主机IP地址(有时也包括端口号); 第三部分是主机资源的具体地址,如目录和文件名等。 Web程序开发步骤 1、 创建一个Web项目 2、 设计Web项目的目录结构 3、 编写Web项目的代码 4、 部署Web项目 5、 运行Web项目 JSP基础 JSP脚本标记指令 JSP脚本标记指令主要包括:page(页面)指令、include(包含)指令和tablig(标记库)指令。 1、 include指令: include指令用于在JSP中包含另一个文件,可以是HTML文件也可以是JSP文件。 例:<%@ include file=\"top.jsp\" %> 2、 page指令: page指令用于定义JSP程序中的全局属性 page指令的属性: 2.1、Language属性用于生命页面使用的脚本语言种,默认是Java。 2.2、contentType属性用于设置JSP页面的MIME类型。默认类型为:text/html,默认的charset值为ISO-8859-1。 2.3、import属性用于导入JSP页面需要用到的Java包的列表。 第 65 页 共 69 页 2.4、isErrorPage属性用于设置此页是否为出错页面,如果设置为true,则表示此页面为程序出项异常时显示的页面。在被设置为错误也米娜的JSP页面中可以捕获相应的异常并使用exception内建对象对异常惊醒处理。 2.5、session属性用于设置客户是否需要HTTP Session。 2.6、errorPage属性用于设置处理异常事件的JSP页面,如果设置为true,当程序运行出项异常时会自动跳转到指定的页面。 2.7、buffer属性用于设置缓冲区,被out对象用于处理执行后的JSP程序对客户端浏览器的输出,默认8KB。 2.8、autoFlush属性用于设置缓冲区溢出时,是否需要自动刷新缓冲区。当把buffer属性设置为none时,就不能把autoFlush属性设置为false。 2.9、isThreadSage属性用于设置当前的JSP页面能否使用多线程,即是否是线程安全。默认值时true,这时JSP页面能够一次处理多个用户请求,如果设置为false,当前的JSP页面只能一次处理一个请求。 2.10、info属性用于设置文本内容在JSP执行时是不是被逐字加入JSP页面中,此属性的值能够被Servlet类的getServletInfo()方法返回。 2.11、extends属性用于标明JSP页面编译时需要加入的Java Class的全称类名。 例:<%@ page autoFlush=\"true\" isThreadSafe=\"true\"%> <%@ page language=\"java\" contentType=\"text/html; charset=utf-8\"%> <%@ page import=\"java.util.*\" isErrorPage=\"false\" %> <%@ page session=\"true\" errorPage=\"error.jsp\" buffer=\"8kb\"%> <%@ page info=\"test\" extends=\"java.lang.Double\" %> 3、 tablig指令: taglib标记库指令描述了要使用的JSP标记库。 例: <%@ taglib prefix=\"p\" tagdir=\"\" uri=\"http://java.sun.com/jsf/html\"%> Cookie Cookie可以保存网页的表单信息,如:可以保存登录时用户输入的信息,到用户再次登录时不必输入用户名和密码就可以登录。 Cookie类的方法及其说明 方法 void setComment(String purpose) String getComment() void setDomain(String Pattern) String getDomain() void setMaxAge(int expity) int getMaxAge() void setPath(String uri) String getPath() void setSecure(Boolean flag) 说明 设置、返回Cookie中的注释,如果没有注释则返回空值 设置、返回Cookie中Cookie使用的域名 设置、返回Cookie过期的最大时间,以秒为单位 设置、返回Cookie路径 设置安全协议,HTTPS或SSL 第 66 页 共 69 页 boolean getSecure() String getName() void setValue(String newValue) String getValue() int getVersion() void setVersion(int v) 浏览器通过安全协议发送Cookies返回true 返回Cookie的名字 设置、返回Cookie的值 返回、设置Cookie的协议版本 JSP的内置对象 JSP包括9中内建对象,分别是:request、response、out、session、application、config、pageContext、page和exception。 内置对象就是由Web容器加载的一组类的实例,它不像一般的Java对象那样用new去获取实例,而是可以直接在JSP页面使用的对象。 request对象 request对象是javax.servlet.http.HttpServletRequest类的实例,该对象封装了客户端提交的信息,通过调用该对象相应的方法可以获取封装的信息。 request对象的常用方法和说明 方法 object getAttribute(String name) Enumeration getAttributeNames() String getParameter(String name) String[] getParameterValues(String name) 功能说明 返回指定属性的属性值 返回request对象的所有属性名称的集合 根据页面组件名称获取页面提交的数据 获取页面表单组件对应多个值的请求数据 void setCharacterEncoding(String charset) 指定每个请求的编码 该对request.getRequestDispatcher(String path) 返回一个javax.servlet.RequestDispatcher对象,象的forward方法用于转发请求 Cookie[] getCookie() 返回客户端所有的Cookie的数组 response对象的常用方法和说明 response对象是javax.servlet.http.HttpServletResponse类的实例,用于响应客户请求并向客户输出信息。 方法 sendRedirect(URL) void addCookie(Cookie cookie) 说明 重定向到另一页面 添加一个Cookie对象,保存客户信息 void setCharacterEncoding(String charset) 设置相应使用的字符编码格式 第 67 页 共 69 页 自动刷新页面方法 1、 response.setIntHeader(“Refresh”,等待刷新页面时间); 2、 response(“Refresh”,等待刷新时间,URL=要加载新页面的路径); out输出对象 out对象用于把结果输出到网页上,它是javax.servlet.jsp.JspWriter的一个实例 方法 什么 void print(数据类型) void flush() 将指定的类型的数据输出到Http流 输出缓冲区里面的数据 pageContext页面上下文对象 pageContext对象存储JSP页面相关信息,它是javax.servlet.jsp.PageContext类的一个实例,如session、application、config、out等对象属性,范围是page。 void setAttribute(String name,Object value, int scope) 在指定的共享范围内设置属性 Object getAttribute(String name , int scope) void forward(String url) 取得指定共享范围内name属性值 将页面导航到指定URL session会话对象 session对象表示目前个别用户的回话状态,用来识别每个用户。它在第一个JSP页面被装载时自动创建,完成会话期管理。 从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,称为一个会话。 当一个客户首次访问服务器上的一个JSP页面时,JSP引擎会产生一个session对象,同时分配一个String类型的ID号,JSP引擎同时将这个ID号发送到客户端,存放在Cookie中,这样session对象和客户之间就建立了一一对应的关系。当客户在访问连接该服务器的其他页面时,不在分配给客户新的session对象。 方法 Object getAttribute() Enumeration getAttributeNames() void invalidate() void setAttribute(String name, String value) void setMaxInactiveInterval(int interval) 说明 获取与指定名字关联的session的属性值 取得session内所有属性的集合 销毁这个session对象 设置指定名称的session属性值 设置session的有效期 application应用程序对象 application对象可以在同一个Web应用的不同Servlet和JSP页面享信息,即application对象 第 68 页 共 69 页 中存储的信息不是对具体用户而言的,是对同一个Web应用都有效的信息。开始于服务器的启动,知道服务器的关闭,在此期间此对象一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作都将影响到其他用户对此的访问。在JSP服务器运行时仅有一个application对象,由服务器创建也由服务器清除。 方法 Object getAttribute(String name) Enumeration getAttributes() void removeAttribute(String name) void setAttribute(String name,Object value) 说明 返回由name指定的application属性 返回所有的application属性 移除指定名称的application属性 设定指定application属性的值 第 69 页 共 69 页 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- ovod.cn 版权所有 湘ICP备2023023988号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务