2006年1月19日
我个人凭借自己的眼光和技术,创作了一个有潜在商业价值的网站,中国IDC资源导航,当然名称虽然是导 航,但我的想法是作成国内IDC行业的资源整合,主要内容包括IDC导航站、商务站、资讯站、论坛四个版 块。
导航站:是收集互联网资源,为客户导航; 商务站:是整合国内现有运营商,让运营商在此建立自己的信息平台。目标是形成国际IDC商务站; 资讯站:是国内外有关IDC的新闻资讯、技术信息;
我现在是一个人在作,目前版本是1。0只有导航站。2。0正在全面开发之中,增加商务站。生成Html页,利 于搜索引擎的收录。目前使用技术是asp+sql2000,但准备在4。0时有可能全面改版,使用技术Jsp+MySql。
目前的问题,个人精力有限,开发速度慢,思维有限,希望业界精英提供好的建议,欢迎懂技术的精英加 入。现在纯属开发阶段,但可以承诺,如果项目有发展,可以分得相应股份。
QQ:316156915 Msn:yan65919@hotmail.com E-mail:yan65919@gmail.com
目前可以看到的痕迹:www.idcdh.com
今天“百年不遇”的停电了,看了一天书。晚上搞了一下全文索引,决定把心得贴出来,我尽量写的详细,大家共同学习,欢迎指正! 1、启动 Microsoft Search 服务 开疾说?->SQL程序组-->服务管理器-->下拉筐-->Microsoft Search 服务-->启动它 2、 ..\Microsoft SQL Server\MSSQL\FTDATA\SQLServer\Config\目录里建一个非空noise.chs文件 非空noise.chs文件,也有人说是空的noise.chs文件,但我每次都往里写几个没用的字母。 3、建立环境 打开查询分析器-->执行下列脚本: -------------------------------------------- create database test ---创建test数据库 use test ---选择test数据库 create table dali (ID int not null primary key,MyImage image,FileType varchar(255),FileNmae varchar(255)) ---创建dali表 --dali表中 Id,MyImage,FileType 三列是必须的,因为要对image列索引的话,必须要有一个主键列,一个image列,一个存放文件类型的列 --我们知道在windows系统中文件类型是靠扩展名来区分的所以FileType列也就是用来放 文件的扩展名 -------------------------------------------- sp_fulltext_database 'enable' --为全文索引启用数据库 sp_fulltext_catalog 'My_FullDir', 'create' ---创建一个叫My_FullDif的全文目录 declare @Key sysname ; select @Key=c.name from syscolumns a,sysconstraints b,sysobjects c where a.id=object_id('a') and a.name='a' and a.id=b.id and b.constid=c.id and c.name like 'PK%' exec sp_fulltext_table 'dali','create','My_FullDir',@Key ----这两句是为全文索引,对表进行标记 sp_fulltext_column 'dali','MyImage','add',0x0804,'FileType' ---这句是指定MyImage列为全文索引列,FileType是类型列 ------------------------------------------------ 4、在c盘下放一个扩展名为doc的word文件,一个扩展名为xls的excel文件,一个扩展名为htm的网页文件,个扩展名为bmp的图片共4个,大家可根据实际情况放入! 5、插入数据 建立下面这个存储过程 -------------------------------------------------- CREATE PROCEDURE sp_textcopy @srvname varchar (30), @login varchar (30), @password varchar (30), @dbname varchar (30), @tbname varchar (30), @colname varchar (30), @filename varchar (30), @whereclause varchar (40), @direction char(1) AS /* 这是使用textcopy工具将文件插入到数据库中,如果有前台工具可以用前台开发工具将文件插入,这里为了演示 */ DECLARE @exec_str varchar (255) SELECT @exec_str='textcopy /S ' @srvname ' /U ' @login ' /P ' @password ' /D ' @dbname ' /T' @tbname ' /C ' @colname ' /W"' @whereclause '" /F"' @filename '" /' @direction EXEC master..xp_cmdshell @exec_str ---------------------------------------------------- insert dali values(1,0x,'doc','大力的doc') ---其中第二列是 0x 它是一个16进制数对应image列,是必须的,不要写null,第三列是文件类型,既扩展名 sp_textcopy '你的服务器名','sa','你的密码','test','dali','MyImage','c:\大力的doc.doc','where ID=1','I' -------依次参数是:实例名,用户名,密码,数据库名,表名,image列名,路径及文件名,条件(你必须保证它只选择一行),I --------------------------------------------------------------------------------------------------------------------- insert dali values(2,0x,'bmp','图片') sp_textcopy '你的服务器名','sa','你的密码','test','dali','MyImage','c:\图片.bmp','where ID=2','I' --注意条件是 ID=2 insert dali values(3,0x,'xls','Excel文件') sp_textcopy '你的服务器名','sa','你的密码','test','dali','MyImage','c:\Excel文件.xls','where ID=3','I' --注意条件是 ID=3 insert dali values(4,0x,'htm','网页') sp_textcopy '你的服务器名','sa','你的密码','test','dali','MyImage','c:\网页.htm','where ID=4','I' --注意条件是 ID=4 ----------上面的语句,要保证类型一样,路径正确,条件唯一正确应该就可以了 6、填充全文索引 sp_fulltext_table 'dali','start_full' ---第一个参数是表名,第二个参数是启动表的全文索引的完全填充 7、可以开始你的实验了 select * from dali where contains(MyImage,'J老师') select * from dali where contains(MyImage,'海老师') ------END---------- --调试环境:SQLServer2K、Windows2Kas
在SQL 企业管理器上操作步骤:
一:进入企业管理器,打开支持服务,选取全文检索,点击启动。
二:对相关的数据表建立全文索引。
三:全文索引建立向导
然后确定提交后,建立向导就基本完成。
到这里在SQL上建立全文索引已经完成!
四:补充:由于全文填充是按照调度里设定周期进行的,所以不会马上生效,如果需要的话可以点击全目录,运行填充。通常数据量大的话不建议在访问量大的时候进行。
解决在全文搜索中搜索中文字符出错补丁:点击下载
解决中文字符出错问题:
方法一: 把下载解压的文件复制到...\Microsoft SQL Server\MSSQL\FTDATA\SQLServer\Config\ 目录下(该路径为全文目录路径,可以全文目录属性中查看)
方法二: 编辑...\Microsoft SQL Server\MSSQL\FTDATA\SQLServer\Config\目录下的 noise.chs文件,清空文档,输入‘@’(其他的偏僻符号也可以)
最后,重新进行全文完全填充!
引言
微软的SQL Server数据库是一个在中低端企业应用中占有广泛市场的关系型数据库系统,它以简单、方便、易用等特性深得众多软件开发人员和数据库管理人员的钟爱。但SQL Server 7.0以前的数据库系统由于没有全文检索功能,致使无法提供像文本内容查找此类的服务,成为一个小小的遗憾。从SQL Server 7.0起,到如今的SQL Server 2000终于具备了全文检索功能,使用户可以高效地检索存储在数据库char、varchar、text、ntext、nchar、nvarchar等数据类型列中的文本数据。
建立全文索引
在进行全文检索之前,必须先建立和填充数据库全文索引。为了支持全文索引操作,SQL Server 7.0新增了一些存储过程和Transact-SQL语句。使用这些存储过程创建全文索引的具体步骤如下(括号内为调用的存储过程名称):
1. 启动数据库的全文处理功能(sp_fulltext_
database);;
2. 建立全文检索目录(sp_fulltext_catalog);
3.在全文检索目录中注册需要全文索引的表(sp_fulltext_table);
4. 指出表中需要全文检索的列名(sp_fulltext_
column);;
5. 为表创建全文索引(sp_fulltext_table);;
6. 填充全文检索目录(sp_fulltext_catalog)。
下面举例说明如何创建全文索引,在本例中,对Test数据库Book表中Title列和Notes列建立全文索引。
use test //打开数据库
//打开全文索引支持,启动SQL Server的全文搜索服务
execute sp_fulltext_database ‘enable’
//建立全文检索目录ft_test
execute sp_fulltext_catalog ‘ft_test’, ‘create’
为Title列建立全文索引数据元,pk_title为Book表中由主键所建立的唯一索引,这个参数是必需的。
execute sp_fulltext_table ‘book’,‘create’, ‘ft_test’,‘pk_title’
//设置全文索引列名
execute sp_fulltext_column ‘book’, ‘title’, ‘add’
execute sp_fulltext_column ‘book’,‘notes’, ‘add’
//建立全文索引
execute sp_fulltext_table ‘book’, ‘activate’
//填充全文索引目录
execute sp_fulltext_catalog ‘ft_test’, ‘start_full’
至此,全文索引建立完毕。
进行全文检索
SQL Server 2000提供的全文检索语句主要有CONTAINS和FREETEXT。CONTAINS语句的功能是在表的所有列或指定列中搜索:一个字或短语;一个字或短语的前缀;与一个字相近的另一个字;一个字的派生字;一个重复出现的字。
CONTAINS语句的语法格式为:
CONTAINS({column | *}), <contains_search
_condition>)
其中,column是搜索列,使用“*”时说明对表中所有全文索引列进行搜索。Contains_search_
condition 说明CONTAINS语句的搜索内容,其语法格式为:
{<simple_term>|<prefix_term>|<proximity_term>|<generation_term>|<weighted_term>}[{{AND|AND NOT|OR}<contains_search_condition>}] [...n]
下面就simple_term和prefix_term参数做简要说明:
simple_term是CONTAINS语句所搜索的单字或短语,当搜索的是一个短语时,必须使用双引号作为定界符。其格式为:
{‘word’|“ phrase”}
prefix_term说明CONTAINS语句所搜索的字或短语前缀,其格式为:
{“word*” | “phrase*”}
例如,下面语句检索Book表的Title列和Notes列中包含“database”或“computer”字符串的图书名称及其注释信息:
select title, notes
from book
where contains(tilte, ‘database’) or contains(notes,‘database’)
or contains(title,‘computer’) or contains(notes,‘computer’)
FREETEXT语句的功能是在一个表的所有列或指定列中搜索一个自由文本格式的字符串,并返回与该字符串匹配的数据行。所以,FREETEXT语句所执行的功能又称做自由式全文查询。
FREETEXT语句的语法格式为:FREETEXT({column | * },‘freetext_string’)
其中,column是被搜索列,使用“*”时说明对表中的所有全文索引列进行搜索。Freetext_string参数指出所搜索的自由文本格式字符串。
例如,下面语句使用FREETEXT语句搜索Book表中包含“Successful Life”字符串的数据行:
select title, notes
from book
where freetext(*,‘Successful Life’)
使用SQL SERVER 2000的全文检索功能 步骤: 1、 打开NorthWind数据库,右键Products表,选择“全文索引表”,“在表上定义全文索引”,为其创建全文目录。在“全文索引向导”中,选择你需要全文查询条件的列(可以是文本或图像),我们选择Productname和QuantityPerUnit列。然后下一步,输入一个新的目录proCatalog,点击下一步。在填充调度一项里,我们暂时不建立填充调度。接着“下一步”,全成全文索引向导。完成后,我们可以看到在“全文目录”里,多了一个全文目录proCatalog。右键proCatalog属性,可以看到其状态、表、调度情况。 2、 右键全文目录proCatalog, “启动完全填充”,系统会出现“全文目录填充成功启动”。 3、 这时,我们可以使用Transact-SQL进行全文检索了,我们使用CONTAINS、FREETEXT等谓词。如: 检索ProductName中,即包含b又包含c的所有列 SELECT * FROM Products WHERE CONTAINS(ProductName, '"c*" and "b*" ') 检索ProductName中,即包含chai chang tofu之一的所有列 SELECT * FROM Products WHERE FREETEXT(ProductName, 'chai chang tofu ') 我们还可以使用CONTAINSTABLE、FREETEXTTABLE等 4、 我们可以用.NET创建WEB或Form客户端,提供一个良好的全文检索界面,使自己的应用程序得到扩展 参考: 全文查询有关的系统存储过程 (1)启动数据库的全文处理功能(sp_fulltext_datebase); (2)建立全文目录(sp_fulltext_catalog); (3)在全文目录中注册需要全文索引的表(sp_fulltext_table); (4)指出表中需要全文检索的列名(sp_fulltext_column) (5)为表创建全文索引(sp_fulltext_table); (6)填充全文索引(sp_fulltext_catalog)。 全文查询支持 Microsoft® SQL Server™ 2000 在接收带全文构造的 Transact-SQL 语句时,使用全文提供程序从 Microsoft 搜索服务检索所需信息。全文构造是 CONTAINS 或 FREETEXT 谓词,或者是 CONTAINSTABLE 或 FREETEXTTABLE 行集函数。如果不知道包含搜索条件的列,全文构造可以在全文索引中引用多列。该进程的流程如下图所示。 这一进程涉及的步骤包括: 应用程序给 SQL Server 实例发送带全文构造的 Transact-SQL 语句。 SQL Server 关系引擎通过查询系统表验证全文构造,确定全文索引是否覆盖列引用。关系引擎将每个 SQL 语句简化为一系列行集操作,并使用 OLE DB 将这些操作传递给基础组件,通常是存储引擎。关系引擎通过全文提供程序而不是存储引擎,将任何全文构造转换成对行集的请求。请求的行集是满足搜索条件和等级的键集,而这个等级表示每个键的数据满足搜索条件的程度。向全文提供程序发送的行集请求命令包括全文检索条件。 全文提供程序验证请求并将搜索条件更改为由Microsoft 搜索服务的查询支持组件使用的形式。将请求发送到搜索服务。 查询支持组件使用搜索引擎组件从全文索引析取所请求的数据。然后以行集的形式将这些数据传递回全文提供程序。 全文提供程序将这个行集返回给关系引擎。 关系引擎将它从存储引擎和全文提供程序收到的所有行集进行组合,以生成发送回客户端的最终结果集。 全文目录和索引 Microsoft® SQL Server™ 2000 全文索引为在字符串数据中进行复杂的词搜索提供有效支持。全文索引存储关于重要词和这些词在特定列中的位置的信息。全文查询利用这些信息,可快速搜索包含具体某个词或一组词的行。 全文索引包含在全文目录中。每个数据库可以包含一个或多个全文目录。一个目录不能属于多个数据库,而每个目录可以包含一个或多个表的全文索引。一个表只能有一个全文索引,因此每个有全文索引的表只属于一个全文目录。 全文目录和索引不存储在它们所属的数据库中。目录和索引由 Microsoft 搜索服务分开管理。 全文索引必须在基表上定义,而不能在视图、系统表或临时表上定义。 全文索引的定义包括: 能唯一标识表中各行的列(主键或候选键),而且不允许 NULL 值。 索引所覆盖的一个或多个字符串列。 全文索引由键值填充。每个键的项提供与该键相关联的重要词(干扰词或终止词除外)、它们所在的列和它们在列中的位置等有关信息。 格式化文本字符串(如 Microsoft® Word™ 文档文件或 HTML 文件)不能存储在字符串或 Unicode 列中,因为这些文件中的许多字节包含不构成有效字符的数据结构。数据库应用程序可能仍需要访问这些数据并对其应用全文检索。因为 image 列并不要求每一字节都构成一个有效字符,所以许多站点将这类数据存储在 image 列中。SQL Server 2000 引入了对存储在 image 列中的这些类型的数据执行全文检索的能力。SQL Server 2000 提供筛选,可从 Microsoft Office™ 文件(.doc、.xls 和 .ppt 文件)、文本文件(.txt 文件)及 HTML 文件(.htm 文件)中析取文本化数据。设计表时除包括保存数据的 image 列外,还需包括绑定列来保存存储在 image 列中的数据格式的文件扩展名。可以创建引用 image 列和绑定列的全文索引,以便在存储于 image 列中的文本化信息上启用全文检索。SQL Server 2000 全文检索引擎使用绑定列中的文件扩展名信息,选择从列中析取文本化数据的合适的筛选。 全文索引是用于执行两个 Transact-SQL 谓词的组件,以便根据全文检索条件对行进行测试: CONTAINS FREETEXT Transact-SQL 还包含两个返回符合全文检索条件的行集的函数: CONTAINSTABLE FREETEXTTABLE SQL Server 在内部将搜索条件发送给 Microsoft 搜索服务。Microsoft 搜索服务查找所有符合全文检索条件的键并将它们返回给 SQL Server。SQL Server 随后使用键的列表来确定表中要处理的行。 全文索引 对 Microsoft® SQL Server™ 2000 数据的全文支持涉及两个功能:对字符数据发出查询的能力和创建及维护基础索引以简化这些查询的能力。 全文索引在许多地方与普通的 SQL 索引不同。 普通 SQL 索引 全文索引 存储时受定义它们所在的数据库的控制。 存储在文件系统中,但通过数据库管理。 每个表允许有若干个普通索引。 每个表只允许有一个全文索引。 当对作为其基础的数据进行插入、更新或删除时,它们自动更新。 将数据添加到全文索引称为填充,全文索引可通过调度或特定请求来请求,也可以在添加新数据时自动发生。 不分组。 在同一个数据库内分组为一个或多个全文目录。 使用 SQL Server 企业管理器、向导或 Transact-SQL 语句创建和除去。 使用 SQL Server 企业管理器、向导或存储过程创建、管理和除去。 这些差异使大量管理任务变得不可缺少。全文管理是在几个层次上实施的: 服务器 可以对服务器范围的某些属性(如 resource_usage)加以设置,以便增加或减少全文服务所使用的系统资源数量。 说明 全文引擎作为名为 Microsoft 搜索的服务在 Microsoft Windows NT® Server 和 Microsoft Windows® 2000 Server 上运行。对于 Microsoft SQL Server 个人版,Microsoft 搜索服务不可用。尽管这意味着 Microsoft 搜索服务既未安装在 Microsoft Windows 95/98 上,也未安装在 Windows NT 工作站或 Windows 2000 Professional 客户端上,但这些客户端在连接到 SQL Server 标准版安装或企业版实例时可以使用这项服务。 数据库 必须启用数据库才能使用全文服务。可以在已启用的数据库中创建和除去一个或多个全文目录的元数据。 全文目录 全文目录包含数据库中的全文索引。每个目录可以用于数据库内的一个或多个表的索引需求。该目录中的索引是使用这里介绍的管理功能来填充的。(全文目录必须驻留在与 SQL Server 实例相关联的本地硬盘驱动器上。不支持可移动的驱动器、软盘和网络驱动器)。在每个服务器上最多可创建 256 个全文目录。 说明 Windows NT 故障转移群集环境完全支持全文索引。有关更多信息,请参见在故障转移群集中运行全文查询。 表 首先,必须为全文支持启用表。然后,为与该表相关联的全文索引创建元数据(如表名及其全文目录)。表启用后,可以用为全文支持而启用的列中的数据填充它。如果表的全文定义被更改(例如,添加一个也将为全文检索而索引的新列),则必须重新填充相关的全文目录以使全文索引与新的全文定义同步。 列 可以从非活动的注册表中添加或除去支持全文查询的列。 在所有这些级别上,可使用工具检索元数据和状态信息。 和常规 SQL 索引一样,当在相关表中修改数据时,可自动更新全文索引。或者,也可以适当的间隔手工重新填充全文索引。这种重写可能既耗时又大量占用资源,因此,在数据库活动较少时,这通常是在后台运行的异步进程。 应将具有相同更新特性的表(如更改少的与更改多的,或在一天的特定时段内频繁更改的表)组合在一起,并分配给相同的全文目录。通过以此方法设置全文目录填充调度,使得全文索引和表保持同步,且在数据库活动较多时不对数据库服务器的资源使用产生负面影响。 为全文目录中的表安排全文索引的位置是非常重要的。在为全文目录指定表时,应该注意下列基本原则: 始终选择可用于全文唯一键的最小唯一索引。(4 个字节且基于整数的索引是最佳的。)这将显著减少文件系统中 Microsoft 搜索服务所需要的资源。如果主键很大(超过 100 字节),可以考虑选择表中其它唯一索引(或创建另一个唯一索引)作为全文唯一键。否则,如果全文唯一键的大小达到允许的上限(450 字节),全文填充将无法继续进行。 如果进行索引的表有成千上万行,请将该表指定给其自己的全文目录。 应该考虑对其进行全文索引的表中发生的更改数以及表的行数。如果要更改的总行数,加上上次全文填充期间表中出现的行数达到成千上万行,请将该表指定给其自己的全文目录。 请参见 sp_fulltext_table CONTAINS 一个谓词,用于搜索包含基于字符的数据类型的列,该列与单个词和短语,以及与另一个词一定范围之内的近似词精确或模糊(不太精确的)匹配或者加权匹配。CONTAINS 可以搜索: 词或短语。 词或短语的前缀。 另一个词附近的词。 由另一个词的词尾变化生成的词(例如,词 drive 是 drives、drove、driving 和 driven 词尾变化的词干)。 比另一个词具有更高加权的词。 语法 CONTAINS ( { column | * } , '< contains_search_condition >' FREETEXT 是个谓词,用于搜索含有基于字符的数据类型的列,其中的值符合在搜索条件中所指定文本的含义,但不符合表达方式。使用 FREETEXT 时,全文查询引擎内部将 freetext_string 拆分为若干个搜索词,并赋予每个词以不同的加权,然后查找匹配。 语法 FREETEXT ( { column | * } , 'freetext_string' CONTAINSTABLE 和 FREETEXTTABLE 函数用来指定返回每行的相对排名的全文查询。这两个函数与全文谓词 CONTAINS 和 FREETEXT 很相似,但是用法不同。 (此文部分资料来自MSDN)
JavaScript实际应用:innerHTMl和确认提示的使用
作者:Hmily 日期:2006-05-26
今天开发中涉及到对一个层的信息控制,就是控制一个层中显示什么信息,查找资料才知道使用innerHTML属性来控制层的值,这个innerHTML跟表单里面的value属性有点类似,能够控制层的显示值。 比如说我一个div层里本来没有值,我处罚一个事件后要显示值,那么就能够使用innerHTML属性了,其实innerHTML属性除了能控制层以外,还能控制窗口内容的所有元素,但是我没有测试过。 (1)对div标签的控制div标签跟span标签是不一样的,div是一个层的块,span是一行,我们下面看演示就知道区别了。先来看一段控制div的代码。 程序代码 <script language="javascript"> function chageDiv(number) { if (number == 1) { document.getElementById("div1").innerHTML = "值为1"; } if (number == 2) { document.getElementById("div1").innerHTML = "值为2"; } } </script>
DIV块测试:<div id="div1">默认值</div>
<a href="#" onClick="chageDiv(1)">改变值为1</a> <a href="#" onClick="chageDiv(2)">改变值为2</a>
演示: 运行的时候,点击“改变值为1”那么“默认值”这个内容将会被改变为“值为1”,但是注意其中的界面,就是会发现“DIV测试:”和“默认值”是两行显示的,因为DIV是按块来显示的。 (2)对span的控制与div类似,但是它是按照行来显示的,看下面的代码: 程序代码 <script language="javascript"> function chageSpan(number) { if (number == 1) { document.getElementById("span1").innerHTML = "值为1"; } if (number == 2) { document.getElementById("span1").innerHTML = "值为2"; } } </script> Span行测试: <span id="span1">默认值</span><br> <a href="#" onClick="chageSpan(1)">改变值为1</a> <a href="#" onClick="chageSpan(2)">改变值为2</a> 当点击“改变值为1”的时候,“默认值”将变为“值为1”,但是“Span行测试”和“默认值”是在同一行显示的,跟DIV不一样。 另外一个值得注意的就是,不管是div还是span,后面的名字都是以为id来定义的,不是象表单一样是使用name来定义的。 (3)confirm确认提示框的制作当我们要执行一个危险操作的时候,比如删除某个内容等,那么就应该给用户相应的提示来用户不容易犯错误。一般提示都是使用confirm()函数来处理的,给它提交一个参数作为显示的信息提示,那么访问的时候将弹出对话框,如果点击了“确定”那么将改函数返回true,点击了“取消”将放回false,我们针对这个特点来使用两种方法来控制用户是否执行某个操作。 看代码: 程序代码 <script language="javascript"> function accessNeteasy() { if(confirm('你真的要访问网易新闻 ?')) { location=' http://calendar.eyou.eyou'; } } function accessSina() { if (confirm('你确定要访问新浪新闻 ?')) { return true; } else { return false; } } </script> 访问方式一: <a href="#" onClick="accessNeteasy()">网易新闻</a><br> 访问方式二: <a href=" http://news.sina.com.cn" onClick="return accessSina()">新浪新闻</a> 我们这里建立了两个函数,一个accessNeteay,一个accessSina,就是访问网易和新浪,我们使用不同的方法,第一种就是当点了链接以后,判断如果是true的话,那么就location到指定链接,这种方法比较不具有通用型,只能针对单个的链接。第二种方法是使用返回值的形式,当确定要访问的时候返回true,不确定的时候返回false,那么这个可以针对任何链接来做,写成一个通用的信息提示,方便页面中的调用。 以上代码都经过测试通过,可以自己再这个基础上进行扩展,写出自己需要的JavaScript代码。 更多小技巧建议参考 蓝色理想的链接: http://www.blueidea.com/tech/web/2004/2379.asp
mysql的日期和时间函数
|
这里是一个使用日期函数的例子。下面的查询选择所有 date_col 值在最后 30 天内的记录。
mysql> SELECT something FROM tbl_name
WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
-
DAYOFWEEK(date)
-
返回
date 的星期索引(1 = Sunday, 2 = Monday, ... 7 = Saturday)。索引值符合 ODBC 的标准。 mysql> SELECT DAYOFWEEK('1998-02-03');
-> 3
-
WEEKDAY(date)
- 返回
date 的星期索引(0 = Monday, 1 = Tuesday, ... 6 = Sunday): mysql> SELECT WEEKDAY('1998-02-03 22:23:00');
-> 1
mysql> SELECT WEEKDAY('1997-11-05');
-> 2
-
DAYOFMONTH(date)
- 返回
date 是一月中的第几天,范围为 1 到 31 : mysql> SELECT DAYOFMONTH('1998-02-03');
-> 3
-
DAYOFYEAR(date)
- 返回
date 是一年中的第几天,范围为 1 到 366 : mysql> SELECT DAYOFYEAR('1998-02-03');
-> 34
-
MONTH(date)
- 返回
date 中的月份,范围为 1 到 12 : mysql> SELECT MONTH('1998-02-03');
-> 2
-
DAYNAME(date)
- 返回
date 的星期名: mysql> SELECT DAYNAME("1998-02-05");
-> 'Thursday'
-
MONTHNAME(date)
- 返回
date 的月份名: mysql> SELECT MONTHNAME("1998-02-05");
-> 'February'
-
QUARTER(date)
- 返回
date 在一年中的季度,范围为 1 到 4 : mysql> SELECT QUARTER('98-04-01');
-> 2
-
WEEK(date)
-
-
WEEK(date,first)
- 对于星期日是一周中的第一天的场合,如果函数只有一个参数调用,返回
date 为一年的第几周,返回值范围为 0 到 53 (是的,可能有第 53 周的开始)。两个参数形式的 WEEK() 允许你指定一周是否以星期日或星期一开始,以及返回值为 0-53 还是 1-52 。 这里的一个表显示第二个参数是如何工作的:
值 | 含义 | 0 | 一周以星期日开始,返回值范围为 0-53 | 1 | 一周以星期一开始,返回值范围为 0-53 | 2 | 一周以星期日开始,返回值范围为 1-53 | 3 | 一周以星期一开始,返回值范围为 1-53 (ISO 8601) |
mysql> SELECT WEEK('1998-02-20');
-> 7
mysql> SELECT WEEK('1998-02-20',0);
-> 7
mysql> SELECT WEEK('1998-02-20',1);
-> 8
mysql> SELECT WEEK('1998-12-31',1);
-> 53
注意,在版本 4.0 中,WEEK(#,0) 被更改为匹配 USA 历法。 注意,如果一周是上一年的最后一周,当你没有使用 2 或 3 做为可选参数时,MySQL 将返回 0: mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
-> 2000, 0
mysql> SELECT WEEK('2000-01-01',2);
-> 52
你可能会争辩说,当给定的日期值实际上是 1999 年的第 52 周的一部分时,MySQL 对 WEEK() 函数应该返回 52 。我们决定返回 0 ,是因为我们希望该函数返回“在指定年份中是第几周”。当与其它的提取日期值中的月日值的函数结合使用时,这使得 WEEK() 函数的用法可靠。 如果你更希望能得到恰当的年-周值,那么你应该使用参数 2 或 3 做为可选参数,或者使用函数 YEARWEEK() : mysql> SELECT YEARWEEK('2000-01-01');
-> 199952
mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2);
-> 52
-
YEAR(date)
- 返回
date 的年份,范围为 1000 到 9999 : mysql> SELECT YEAR('98-02-03');
-> 1998
-
YEARWEEK(date)
-
-
YEARWEEK(date,first)
- 返回一个日期值是的哪一年的哪一周。第二个参数的形式与作用完全与
WEEK() 的第二个参数一致。注意,对于给定的日期参数是一年的第一周或最后一周的,返回的年份值可能与日期参数给出的年份不一致: mysql> SELECT YEARWEEK('1987-01-01');
-> 198653
注意,对于可选参数 0 或 1,周值的返回值不同于 WEEK() 函数所返回值(0 ), WEEK() 根据给定的年语境返回周值。
-
HOUR(time)
- 返回
time 的小时值,范围为 0 到 23 : mysql> SELECT HOUR('10:05:03');
-> 10
-
MINUTE(time)
- 返回
time 的分钟值,范围为 0 到 59 : mysql> SELECT MINUTE('98-02-03 10:05:03');
-> 5
-
SECOND(time)
- 返回
time 的秒值,范围为 0 到 59 : mysql> SELECT SECOND('10:05:03');
-> 3
-
PERIOD_ADD(P,N)
- 增加
N 个月到时期 P (格式为 YYMM 或 YYYYMM )中。以 YYYYMM 格式返回值。 注意,期间参数 P 不是 一个日期值: mysql> SELECT PERIOD_ADD(9801,2);
-> 199803
-
PERIOD_DIFF(P1,P2)
- 返回时期
P1 和 P2 之间的月数。P1 和 P2 应该以 YYMM 或 YYYYMM 指定。 注意,时期参数 P1 和 P2 不是 日期值: mysql> SELECT PERIOD_DIFF(9802,199703);
-> 11
-
DATE_ADD(date,INTERVAL expr type)
-
-
DATE_SUB(date,INTERVAL expr type)
-
-
ADDDATE(date,INTERVAL expr type)
-
-
SUBDATE(date,INTERVAL expr type)
- 这些函数执行日期的算术运算。
ADDDATE() 和 SUBDATE() 分别是 DATE_ADD() 和 DATE_SUB() 的同义词。 在 MySQL 3.23 中,如果表达式的右边是一个日期值或一个日期时间型字段,你可以使用 + 和 - 代替 DATE_ADD() 和 DATE_SUB() (示例如下)。 参数 date 是一个 DATETIME 或 DATE 值,指定一个日期的开始。expr 是一个表达式,指定从开始日期上增加还是减去间隔值。expr 是一个字符串;它可以以一个 “-” 领头表示一个负的间隔值。type 是一个关键词,它标志着表达式以何格式被解释。 下表显示 type 和 expr 参数是如何关联的:
type 值 | expr 期望的格式 | SECOND | SECONDS | MINUTE | MINUTES | HOUR | HOURS | DAY | DAYS | MONTH | MONTHS | YEAR | YEARS | MINUTE_SECOND | "MINUTES:SECONDS" | HOUR_MINUTE | "HOURS:MINUTES" | DAY_HOUR | "DAYS HOURS" | YEAR_MONTH | "YEARS-MONTHS" | HOUR_SECOND | "HOURS:MINUTES:SECONDS" | DAY_MINUTE | "DAYS HOURS:MINUTES" | DAY_SECOND | "DAYS HOURS:MINUTES:SECONDS" | 在 expr 的格式中,MySQL 允许任何字符作为定界符。表中所显示的是建议的定界字符。如果 date 参数是一个 DATE 值,并且计算的间隔仅仅有 YEAR 、MONTH 和 DAY 部分(没有时间部分),那么返回值也是一个 DATE 值。否则返回值是一个 DATETIME 值: mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;
-> 1998-01-01 00:00:00
mysql> SELECT INTERVAL 1 DAY + "1997-12-31";
-> 1998-01-01
mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND;
-> 1997-12-31 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
-> INTERVAL 1 SECOND);
-> 1998-01-01 00:00:00
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
-> INTERVAL 1 DAY);
-> 1998-01-01 23:59:59
mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
-> INTERVAL "1:1" MINUTE_SECOND);
-> 1998-01-01 00:01:00
mysql> SELECT DATE_SUB("1998-01-01 00:00:00",
-> INTERVAL "1 1:1:1" DAY_SECOND);
-> 1997-12-30 22:58:59
mysql> SELECT DATE_ADD("1998-01-01 00:00:00",
-> INTERVAL "-1 10" DAY_HOUR);
-> 1997-12-30 14:00:00
mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
-> 1997-12-02
如果你指定了一个太短的间隔值(没有包括 type 关键词所期望的所有间隔部分),MySQL 假设你遗漏了间隔值的最左边部分。例如,如果指定一个 type 为 DAY_SECOND ,那么 expr 值被期望包含天、小时、分钟和秒部分。如果你象 "1:10" 样指定一个值,MySQL 假设天和小时部分被遗漏了,指定的值代表分钟和秒。换句话说,"1:10" DAY_SECOND 被解释为等价于 "1:10" MINUTE_SECOND 。这类似于 MySQL 解释 TIME 值为经过的时间而不是一天的时刻。 注意,如果依着包含一个时间部分的间隔增加或减少一个日期值,该日期值将被自动地转换到一个日期时间值: mysql> SELECT DATE_ADD("1999-01-01", INTERVAL 1 DAY);
-> 1999-01-02
mysql> SELECT DATE_ADD("1999-01-01", INTERVAL 1 HOUR);
-> 1999-01-01 01:00:00
如果你使用了确定不正确的日期,返回结果将是 NULL 。如果你增加 MONTH 、YEAR_MONTH 或 YEAR ,并且结果日期的天比新月份的最大天数还大,那么它将被调整到新月份的最大天数: mysql> SELECT DATE_ADD('1998-01-30', INTERVAL 1 MONTH);
-> 1998-02-28
注意,上面的例子中,单词 INTERVAL 和关键词 type 是不区分字母大小写的。
-
EXTRACT(type FROM date)
-
EXTRACT()
函数使用与 DATE_ADD() 或 DATE_SUB() 一致的间隔类型,但是它用于指定从日期中提取的部分,而不是进行日期算术运算。 mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");
-> 1999
mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
-> 199907
mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
-> 20102
-
TO_DAYS(date)
- 给出一个日期
date ,返回一个天数(从 0 年开始的天数): mysql> SELECT TO_DAYS(950501);
-> 728779
mysql> SELECT TO_DAYS('1997-10-07');
-> 729669
TO_DAYS() 无意于使用先于格里高里历法(即现行的阳历)(1582)出现的值,因为它不考虑当历法改变时所遗失的天数。
-
FROM_DAYS(N)
- 给出一个天数
N ,返回一个 DATE 值: mysql> SELECT FROM_DAYS(729669);
-> '1997-10-07'
FROM_DAYS() 无意于使用先于格里高里历法(1582)出现的值,因为它不考虑当历法改变时所遗失的天数。
-
DATE_FORMAT(date,format)
- 依照
format 字符串格式化 date 值。下面的修饰符可被用于 format 字符串中:
修饰符 | 含义 | %M | 月的名字 (January ..December ) | %W | 星期的名字 (Sunday ..Saturday ) | %D | 有英文后缀的某月的第几天 (0th , 1st , 2nd , 3rd , etc.) | %Y | 年份,数字的,4 位 | %y | 年份,数字的,2 位 | %X | 周值的年份,星期日是一个星期的第一天,数字的,4 位,与 '%V' 一同使用 | %x | 周值的年份,星期一是一个星期的第一天,数字的,4 位,与 '%v' 一同使用 | %a | 缩写的星期名 (Sun ..Sat ) | %d | 月份中的天数,数字的 (00 ..31 ) | %e | 月份中的天数,数字的 (0 ..31 ) | %m | 月,数字的 (00 ..12 ) | %c | 月,数字的 (0 ..12 ) | %b | 缩写的月份名 (Jan ..Dec ) | %j | 一年中的天数 (001 ..366 ) | %H | 小时 (00 ..23 ) | %k | 小时 (0 ..23 ) | %h | 小时 (01 ..12 ) | %I | 小时 (01 ..12 ) | %l | 小时 (1 ..12 ) | %i | 分钟,数字的 (00 ..59 ) | %r | 时间,12 小时 (hh:mm:ss [AP]M ) | %T | 时间,24 小时 (hh:mm:ss ) | %S | 秒 (00 ..59 ) | %s | 秒 (00 ..59 ) | %p | AM 或 PM | %w | 一周中的天数 (0 =Sunday..6 =Saturday) | %U | 星期 (00 ..53 ),星期日是一个星期的第一天 | %u | 星期 (00 ..53 ),星期一是一个星期的第一天 | %V | 星期 (01 ..53 ),星期日是一个星期的第一天。与 '%X' 一起使用 | %v | 星期 (01 ..53 ),星期一是一个星期的第一天。与 '%x' 一起使用 | %% | 一个字母 “%” | 所有其它的字符不经过解释,直接复制到结果中: mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
-> '22:23:00'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%D %y %a %d %m %b %j');
-> '4th 97 Sat 04 10 Oct 277'
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
'%H %k %I %r %T %S %w');
-> '22 22 10 10:23:00 PM 22:23:00 00 6'
mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
-> '1998 52'
在 MySQL 3.23 中,在格式修饰符前需要字符 `%'。在更早的 MySQL 版本中,`%' 是可选的。 月份与天修饰符的范围从零开始的原因是,在 MySQL 3.23 中,它允许存储不完善的日期值(例如 '2004-00-00' )。
-
TIME_FORMAT(time,format)
- 它的使用方法与上面的
DATE_FORMAT() 函数相似,但是 format 字符串只包含处理小时、分和秒的那些格式修饰符。使用其它的修饰符会产生一个 NULL 值或 0 。
-
CURDATE()
-
-
CURRENT_DATE
- 以
'YYYY-MM-DD' 或 YYYYMMDD 格式返回当前的日期值,返回的格式取决于该函数是用于字符串还是数字语境中: mysql> SELECT CURDATE();
-> '1997-12-15'
mysql> SELECT CURDATE() + 0;
-> 19971215
-
CURTIME()
-
-
CURRENT_TIME
- 以
'HH:MM:SS' 或 HHMMSS 格式返回当前的时间值,返回的格式取决于该函数是用于字符串还是数字语境中: mysql> SELECT CURTIME();
-> '23:50:26'
mysql> SELECT CURTIME() + 0;
-> 235026
-
NOW()
-
-
SYSDATE()
-
-
CURRENT_TIMESTAMP
- 以
'YYYY-MM-DD HH:MM:SS' 或 YYYYMMDDHHMMSS 格式返回当前的日期时间值,返回的格式取决于该函数是用于字符串还是数字语境中: mysql> SELECT NOW();
-> '1997-12-15 23:50:26'
mysql> SELECT NOW() + 0;
-> 19971215235026
注意,函数 NOW() 在每个查询中只计算一次,也就是在查询开始执行时。这就是说,如果在一个单独的查询中多次引用了 NOW() ,它只会给出值都是一个相同的时间。
-
UNIX_TIMESTAMP()
-
-
UNIX_TIMESTAMP(date)
- 如果调用时没有参数,以无符号的整数形式返回一个 Unix 时间戳(从
'1970-01-01 00:00:00' GMT 开始的秒数)。如果以一个参数 date 调用 UNIX_TIMESTAMP() ,它将返回该参数值从 '1970-01-01 00:00:00' GMT 开始经过的秒数值。date 可以是一个 DATE 字符串,一个 DATETIME 字符串,一个 TIMESTAMP ,或者以一个 YYMMDD 或 YYYYMMDD 显示的本地时间: mysql> SELECT UNIX_TIMESTAMP();
-> 882226357
mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
-> 875996580
当 UNIX_TIMESTAMP 被用于一个 TIMESTAMP 列时,函数直接返回一个内部的时间戳值,而不进行一个隐含地 “string-to-unix-timestamp” 转换。如果你传递一个超出范围的日期参数给 UNIX_TIMESTAMP() ,它将返回 0,但是请注意,MySQL 对其仅仅进行基本的检验(年范围 1970-2037,月份 01-12,日期 01-31)。 如果你希望减去 UNIX_TIMESTAMP() 列,你应该需要将结果强制转换为一有符号整数。查看章节 6.3.5 Cast 函数。
-
FROM_UNIXTIME(unix_timestamp [,format])
- 以
'YYYY-MM-DD HH:MM:SS' 或 YYYYMMDDHHMMSS 格式返回一个 unix_timestamp 参数值,返回值的形式取决于该函数使用于字符串还是数字语境。 如果 format 给出,返回值依 format 字符串被格式。format 可以包含与 DATE_FORMAT() 函数同样的修饰符。 mysql> SELECT FROM_UNIXTIME(875996580);
-> '1997-10-04 22:23:00'
mysql> SELECT FROM_UNIXTIME(875996580) + 0;
-> 19971004222300
mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),
'%Y %D %M %h:%i:%s %x');
-> '1997 23rd December 03:43:30 1997'
-
SEC_TO_TIME(seconds)
- 以
'HH:MM:SS' 或 HHMMSS 格式返回参数 seconds 被转换到时分秒后的值,返回值的形式取决于该函数使用于字符串还是数字语境: mysql> SELECT SEC_TO_TIME(2378);
-> '00:39:38'
mysql> SELECT SEC_TO_TIME(2378) + 0;
-> 3938
-
TIME_TO_SEC(time)
- 将参数
time 转换为秒数后返回: mysql> SELECT TIME_TO_SEC('22:23:00');
-> 80580
mysql> SELECT TIME_TO_SEC('00:39:38');
-> 2378
|
54 改变浏览器状态栏文字提示
- <script language=”JavaScript”>
window.status = “A new status message”; </script>
55 弹出确认提示框
- <script language=”JavaScript”>
- var
userChoice = window.confirm(“Click OK or Cancel”);
- if (
userChoice) { document.write(“You chose OK”);
- } else {
document.write(“You chose Cancel”);
- }
</script>
56 提示输入
- <script language=”JavaScript”>
- var
userName = window.prompt(“Please Enter Your Name”,”Enter Your Name Here”); document.write(“Your Name is “ + userName); </script>
57 打开一个新窗口
- //打开一个名称为myNewWindow的浏览器新窗口
<script language=”JavaScript”> window.open(“http://www.liu21st.com/”,”myNewWindow”); </script>
58 设置新窗口的大小
- <script language=”JavaScript”>
window.open(“http://www.liu21st.com/”,”myNewWindow”,'height=300,width=300'); </script>
59 设置新窗口的位置
- <script language=”JavaScript”>
window.open(“http://www.liu21st.com/”,”myNewWindow”,'height=300,width=300,left=200,screenX=200,top=100,screenY=100'); </script>
60 是否显示工具栏和滚动栏
- <script language=”JavaScript”>
window.open(“http:
61 是否可以缩放新窗口的大小
- <script language=”JavaScript”>
window.open('http://www.liu21st.com/' , 'myNewWindow', 'resizable=yes' );</script>
62 加载一个新的文档到当前窗口
- <a href='#' onClick='document.location = '125a.html';' >Open New Document</a>
63 设置页面的滚动位置
- <script language=”JavaScript”>
- if (
document.all) { //如果是IE浏览器则使用scrollTop属性 document.body.scrollTop = 200;
- } else {
//如果是NetScape浏览器则使用pageYOffset属性 window.pageYOffset = 200;
- }
</script>
64 在IE中打开全屏窗口
- <a href='#' onClick=”window.open('http://www.juxta.com/','newWindow','fullScreen=yes');”>Open a full-screen window</a>
65 新窗口和父窗口的操作
- <script language=”JavaScript”>
//定义新窗口 var newWindow = window.open(“128a.html”,”newWindow”); newWindow.close(); //在父窗口中关闭打开的新窗口 </script> 在新窗口中关闭父窗口
- window.opener.close()
66 往新窗口中写内容
- <script language=”JavaScript”>
- var
newWindow = window.open(“”,”newWindow”); newWindow.document.open(); newWindow.document.write(“This is a new window”); newWIndow.document.close(); </script>
67 加载页面到框架页面
- <frameset cols=”50%,*”>
- <
frame name=”frame1” src=”135a.html”>
- <
frame name=”frame2” src=”about:blank”>
- </
frameset> 在frame1中加载frame2中的页面
- parent
.frame2.document.location = “135b.html”;
68 在框架页面之间共享脚本 如果在frame1中html文件中有个脚本
- function doAlert() {
window.alert(“Frame 1 is loaded”);
- }
那么在frame2中可以如此调用该方法
- <body onLoad=”parent.frame1.doAlert();”>
This is frame 2. </body>
69 数据公用 可以在框架页面定义数据项,使得该数据可以被多个框架中的页面公用
- <script language=”JavaScript”>
- var
persistentVariable = “This is a persistent value”; </script> <frameset cols=”50%,*”>
- <frame name=”frame1” src=”138a.html”>
- <frame name=”frame2” src=”138b.html”>
- </frameset>
这样在frame1和frame2中都可以使用变量persistentVariable 70 框架代码库 根据以上的一些思路,我们可以使用一个隐藏的框架页面来作为整个框架集的代码库
- <frameset cols=”0,50%,*”>
- <
frame name=”codeFrame” src=”140code.html”>
- <
frame name=”frame1” src=”140a.html”>
- <
frame name=”frame2” src=”140b.html”>
- </
frameset>
通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天。你们大部分人大概都知道怎样把日期进行分割(年、月、日等),然后仅仅用分割出来的年、月、日等放在几个函数中计算出自己所需要的日期!在这篇文 章里,我将告诉你如何使用DATEADD和DATEDIFF函数来计算出在你的程序中可能你要用到的一些不同日期。
在使用本文中的例子之前,你必须注意以下的问题。大部分可能不是所有例子在不同的机器上执行的结果可能不一样,这完全由哪一天是一个星期的第一天这个设置决定。第一天(DATEFIRST)设定决定了你的系统使用哪一天作为一周的第一天。所有以下的例 子都是以星期天作为一周的第一天来建立,也就是第一天设置为7。假如你的第一天设置不一样,你可能需要调整这些例子,使它和不同的第一天设置相符合。你可以通过@@DATEFIRST函数来检查第一天设置。 为了理解这些例子,我们先复习一下DATEDIFF和DATEADD函数。DATEDIFF函数计算两个日期之间的小时、天、周、月、年等时间间隔总数。DATEADD函数计算一个日期通过给时间间隔加减来获得一个新的日期。要了解更多的DATEDI FF和DATEADD函数以及时间间隔可以阅读微软联机帮助。 使用DATEDIFF和DATEADD函数来计算日期,和本来从当前日期转换到你需要的日期的考虑方法有点不同。你必须从时间间隔这个方面来考虑。比如,从当前日期到你要得到的日期之间有多少时间间隔,或者,从今天到某一天(比如1900-1-1)之间有多少时间间隔,等等。理解怎样着眼于时间间隔有助于你轻松的理解我的不同的日期计算例子。 一个月的第一天 第一个例子,我将告诉你如何从当前日期去这个月的最后一天。请注意:这个例子以及这篇文章中的其他例子都将只使用DATEDIFF和DATEADD函数来计算我们想要的日期。每一个例子都将通过计算但前的时间间隔,然后进行加减来得到想要计算的日期。 这是计算一个月第一天的SQL 脚本: SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 我们把这个语句分开来看看它是如何工作的。最核心的函数是getdate(),大部分人都知道这个是返回当前的日期和时间的函数。下一个执行的函数 DATEDIFF(mm,0,getdate())是计算当前日期和“1900-01-01 00:00:00.000”这个日期之间的月数。记住:时期和时间变量和毫秒一样是从“1900-01-01 00:00:00.000”开始计算的。这就是为什么你可以在DATEDIFF函数中指定第一个时间表达式为“0”。下一个函数是DATEADD,增加当前日期到“1900-01-01”的月数。通过增加预定义的日期“1900-01-01”和当前日期的月数,我们可以获得这个月的第一天。另外,计算出来的日期的时间部分将会是“00:00:00.000”。 这个计算的技巧是先计算当前日期到“1900-01-01”的时间间隔数,然后把它加到“1900-01-01”上来获得特殊的日期,这个技巧可以用来计算很多不同的日期。下一个例子也是用这个技巧从当前日期来产生不同的日期。 本周的星期一 这里我是用周(wk)的时间间隔来计算哪一天是本周的星期一。 SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0) 一年的第一天 现在用年(yy)的时间间隔来显示这一年的第一天。 SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) 季度的第一天 假如你要计算这个季度的第一天,这个例子告诉你该如何做。 SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) 当天的半夜 曾经需要通过getdate()函数为了返回时间值截掉时间部分,就会考虑到当前日期是不是在半夜。假如这样,这个例子使用DATEDIFF和DATEADD函数来获得半夜的时间点。 SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0) 深入DATEDIFF和DATEADD函数计算 你可以明白,通过使用简单的DATEDIFF和DATEADD函数计算,你可以发现很多不同的可能有意义的日期。 目前为止的所有例子只是仅仅计算当前的时间和“1900-01-01”之间的时间间隔数量,然后把它加到“1900-01-01”的时间间隔上来计算出日期。假定你修改时间间隔的数量,或者使用不同的时间间隔来调用DATEADD函数,或者减去时间间隔而不是增加,那么通过这些小的调整你可以发现和多不同的日期。 这里有四个例子使用另外一个DATEADD函数来计算最后一天来分别替换DATEADD函数前后两个时间间隔。 上个月的最后一天 这是一个计算上个月最后一天的例子。它通过从一个月的最后一天这个例子上减去3毫秒来获得。有一点要记住,在Sql Server中时间是精确到3毫秒。这就是为什么我需要减去3毫秒来获得我要的日期和时间。 SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) 计算出来的日期的时间部分包含了一个Sql Server可以记录的一天的最后时刻(“23:59:59:997”)的时间。 去年的最后一天 连接上面的例子,为了要得到去年的最后一天,你需要在今年的第一天上减去3毫秒。 SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)) 本月的最后一天 现在,为了获得本月的最后一天,我需要稍微修改一下获得上个月的最后一天的语句。修改需要给用DATEDIFF比较当前日期和“1900-01-01” 返回的时间间隔上加1。通过加1个月,我计算出下个月的第一天,然后减去3毫秒,这样就计算出了这个月的最后一天。这是计算本月最后一天的SQL脚本。 SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0)) 本年的最后一天 你现在应该掌握这个的做法,这是计算本年最后一天脚本 SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))。 本月的第一个星期一 好了,现在是最后一个例子。这里我要计算这个月的第一个星期一。这是计算的脚本。 select DATEADD(wk, DATEDIFF(wk,0, dateadd(dd,6-datepart(day,getdate()),getdate()) ), 0) 在这个例子里,我使用了“本周的星期一”的脚本,并作了一点点修改。修改的部分是把原来脚本中“getdate()”部分替换成计算本月的第6天,在计算中用本月的第6天来替换当前日期使得计算可以获得这个月的第一个星期一。 总结 我希望这些例子可以在你用DATEADD和DATEDIFF函数计算日期时给你一点启发。通过使用这个计算日期的时间间隔的数学方法,我发现为了显示两个日期之间间隔的有用历法是有价值的。注意,这只是计算出这些日期的一种方法。要牢记,还有很多方法 可以得到相同的计算结果。假如你有其他的方法,那很不错,要是你没有,我希望这些例子可以给你一些启发,当你要用DATEADD和DATEDIFF函数计算你程序可能要用到的日期时。 附录,其他日期处理方法 1)去掉时分秒 declare @ datetime set @ = getdate() --’2003-7-1 10:00:00’ SELECT @,DATEADD(day, DATEDIFF(day,0,@), 0) 2)显示星期几 select datename(weekday,getdate()) 3)如何取得某个月的天数 declare @m int set @m=2 --月份 select datediff(day,’2003-’+cast(@m as varchar)+’-15’ ,’2003-’+cast(@m+1 as varchar)+’-15’) 另外,取得本月天数 select datediff(day,cast(month(GetDate()) as varchar)+’-’+cast(month(GetDate()) as varchar)+’-15’ ,cast(month(GetDate()) as varchar)+’-’+cast(month(GetDate())+1 as varchar)+’-15’) 或者使用计算本月的最后一天的脚本,然后用DAY函数区最后一天 SELECT Day(dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))) 4)判断是否闰年: SELECT case day(dateadd(mm, 2, dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)))) when 28 then ’平年’ else ’闰年’ end 或者 select case datediff(day,datename(year,getdate())+’-02-01’,dateadd(mm,1,datename(year,getdate())+’-02-01’)) when 28 then ’平年’ else ’闰年’ end 5)一个季度多少天 declare @m tinyint,@time smalldatetime select @m=month(getdate()) select @m=case when @m between 1 and 3 then 1 when @m between 4 and 6 then 4 when @m between 7 and 9 then 7 else 10 end select @time=datename(year,getdate())+’-’+convert(varchar(10),@m)+’-01’ select datediff(day,@time,dateadd(mm,3,@time))
Asp基本日期函数 以及 日期函数扩展类(原创) clsDateFunEx_Power by Sman & Net Fetch: 点击下载此文件
Asp基本日期函数: 函数 语法 说明 示例 Now Now() 取得系统当前的日期和时间 Date Date() 取得系统当前的日期 Time Time() 取得系统当前的时间 Year Year(Date) 取得给定日期的年份 Month Month(Date) 取得给定日期的月份 Day Day(Date) 取得给定日期是几号 Hour Hour(time) 取得给定时间是第几小时 Minute Minute(time) 取得给定时间是第几分钟 Second Second(time) 取得给守时间是第几秒 WeekDay WeekDay(Date) 取得给定日期是
星期几的整数,1表示星期日,2表示星期一,依此类推 DateDiff("Var",Var1,Var2) Var:日期或时间间隔因子,有如下参数:yyyy 年 m月 d 日 ww星期 h小时 s秒 Var1:第一个日期或时间 Var2:第二个日期或时间,比Var1晚 计算两个日期或时间的间隔
DateAdd("Var",Var1,Var2) Var:日期或时间间隔因子: Var1:日期或时间间隔倍数 Var2:日期或时间的基准 对两个日期或时间作加法 如果计算的日期是在公元 100 年之前,则会产生错误。
FormatDateTime FormatDateTime(Date,vbShortDate) 转化为短日期格式 FromatDateTime(Date(),vbLongDate) "以长日期格式显示 FormatDateTime(Date,vbLongDate) 转化为长日期格式 FormatDateTime(Date,vbShortTime) 转化为短时间格式 FormatDateTime(Date,vbLongTime) 转化为长时间格式
日期函数扩展类代码 (clsDateFunEx_Power by Sman & Net Fetch):
程序代码 <% '转发时请保留此声明信息,这段声明不并会影响你的速度! '************************** 【日期扩展类】Ver 0.1.0 ******************************** '开发人: Sman、Net Fetch '开发日期: 2005-11-11 '版本号: Ver 0.1.0 '官方网站: http://www.sman.cnhttp://www.ad0.cn'电子邮件:huihui3030@126.com、Ad0@Ad0.Cn QQ:19341293 32050450 '版权声明:版权没有,盗版不究,源码公开,欢迎盗版,欢迎你到官方网站来寻求支持。 '如有任何改进之处,麻烦转发或者反馈一份到 huihui3030@126.com、Ad0@Ad0.Cn,Thanks! '详细使用说明或范例请见下载附件或到官方站点或Email联系下载! '************************************************************************************ Class DateFunEx Private d_ Private Sub class_initialize() d_ = "" End Sub Public Property Let setDate(strDate) '传入日期参数 strDate d_ = strDate End Property Public Property Get Version Version = "Copyright © Date Function Extend Ver 0.1.0<br />" & _ "Power by <a href=' http://www.sman.cn' target='_blank'>Sman</a> " & _ " & <a href='mailto:NetFetchStudio@163.com' target='_blank'>Net Fetch</a>" End Property Sub FormatDate() On Error Resume Next If IsNumeric(d_) Then d_ = Cint(d_) If len(d_)< 3 Then d_ = "20" & right("0"&d_,2) d_ = d_ & "-1" End If d_ = cDate(d_) End Sub '------------------------------ ' 功能说明:算第几周的星期几是几号 ' 参数说明:y 年,w周,week 星期 (星期一1 星期天7) FirstDayofWeek 每周的第一天(详细设置请参照VBS手册) ' 例 2005年40周星期天 GetWeekDate(2005,40,7) '------------------------------ Public Function GetWeekDate(y, w, DayofWeek) Call FormatDate() Dim NewYearDay,FirstDayofWeek FirstDayofWeek = 2 NewYearDay = CDate(y & "-1-1") '元旦 GetWeekDate = ((NewYearDay - Weekday(NewYearDay, FirstDayofWeek)) + (w - 1) * 7 + DayofWeek) End Function '------------------------------ ' 功能说明:获得某年某月的天数 ' 参数说明:d_ 年-月-日 ' 例 2005年10月 GetMonthDayCount("2005-10-11")(日可要可不要) '------------------------------ Public Function GetMonthDayCount() Call FormatDate() GetMonthDayCount = DateDiff("d", d_, DateAdd("m", 1, d_)) End Function '------------------------------ ' 功能说明:得到某年某月的第一天 ' 相关函数:GetMonthFirstDay ' 例 本月 GetMonthFirstDay(date)(日可要可不要) 上月 GetMonthFirstDay(dateadd("m",-1,date)) 以此类推 '------------------------------ Public Function GetMonthFirstDay() Call FormatDate() GetMonthFirstDay = CDate( Year(d_) & "-" & Month(d_) & "-1") End Function '------------------------------ ' 功能说明:得到某年的某月的最后一天 ' 参数说明:d_ 年-月-日 ' 关联函数:GetMonthDayCount ' 例 本月 GetMonthLastDay(date)(日可要可不要) 上月 GetMonthLastDay(dateadd("m",-1,date)) 以此类推 '------------------------------ Public Function GetMonthLastDay() Call FormatDate() GetMonthLastDay = CDate( Year(d_) & "-"&Month(d_) & "-" & DateDiff("d", d_, DateAdd("m", 1, d_))) End Function '------------------------------ ' 功能说明:某日所在的周的第一天的日期 ' 相关函数:GetWeekDate ' 例 本周 WeekFirstDay(date) 上周 WeekFirstDay(dateadd("ww",-1,date)) 以此类推 '------------------------------ Public Function WeekFirstDay() Call FormatDate() WeekFirstDay = GetWeekDate(Year(d_), DatePart("ww", d_), 1) End Function '------------------------------ ' 功能说明:某日所在的周的第最后一天的日期 ' 相关函数:GetWeekDate ' 例 本周 WeekLastDay(date) 上周 WeekLastDay(dateadd("ww",-1,date)) 以此类推 '------------------------------ Public Function WeekLastDay() Call FormatDate() WeekLastDay = GetWeekDate(Year(d_), DatePart("ww", d_), 7) End Function End Class %>
调用代码:
程序代码 <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%> <% Option Explicit %> <!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> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>Test_clsDateFunEx</title> </head> <body> <!--#include file="clsDateFunEx.asp" --> <% Dim myDateFun,strDate strDate = "2005-6" Set myDateFun = new DateFunEx myDateFun.setDate = strDate Response.write "2005年第5周的星期天是几号:<br>" & _ String(20, " ") & myDateFun.GetWeekDate(2005,10,7) &"<br>" Response.Write "本月的天数:<br>"&_ String(20, " ") & myDateFun.GetMonthDayCount & "<br>" Response.Write "本月的第一天:<br>"&_ String(20, " ") & myDateFun.GetMonthFirstDay & "<br>" myDateFun.setDate = Now() Response.Write "本月的最后一天:<br>"&_ String(20, " ") & myDateFun.GetMonthLastDay & "<br>" Response.Write "本月所在的周的第一天的日期:<br>"&_ String(20, " ") & myDateFun.WeekFirstDay & "<br>" Response.Write "本月所在的周的第最后一天的日期:<br>" & _ String(20, " ") & myDateFun.WeekLastDay & "<br>" Response.Write "<br><br><br><div style='padding-left:200px;font-size:12px;'>" & myDateFun.Version & "</div><br>" Set myDateFun = Nothing %> </body> </html>
程序代码 '************************************* '日期转换函数 '************************************* Function DateToStr(DateTime,ShowType) Dim DateMonth,DateDay,DateHour,DateMinute,DateWeek,DateSecond Dim FullWeekday,shortWeekday,Fullmonth,Shortmonth,TimeZone1,TimeZone2 TimeZone1="+0800" TimeZone2="+08:00" FullWeekday=Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday") shortWeekday=Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat") Fullmonth=Array("January","February","March","April","May","June","July","August","September","October","November","December") Shortmonth=Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")
DateMonth=Month(DateTime) DateDay=Day(DateTime) DateHour=Hour(DateTime) DateMinute=Minute(DateTime) DateWeek=weekday(DateTime) DateSecond=Second(DateTime) If Len(DateMonth)<2 Then DateMonth="0"&DateMonth If Len(DateDay)<2 Then DateDay="0"&DateDay If Len(DateMinute)<2 Then DateMinute="0"&DateMinute Select Case ShowType Case "Y-m-d" DateToStr=Year(DateTime)&"-"&DateMonth&"-"&DateDay Case "Y-m-d H:I A" Dim DateAMPM If DateHour>12 Then DateHour=DateHour-12 DateAMPM="PM" Else DateHour=DateHour DateAMPM="AM" End If If Len(DateHour)<2 Then DateHour="0"&DateHour DateToStr=Year(DateTime)&"-"&DateMonth&"-"&DateDay&" "&DateHour&":"&DateMinute&" "&DateAMPM Case "Y-m-d H:I:S" If Len(DateHour)<2 Then DateHour="0"&DateHour If Len(DateSecond)<2 Then DateSecond="0"&DateSecond DateToStr=Year(DateTime)&"-"&DateMonth&"-"&DateDay&" "&DateHour&":"&DateMinute&":"&DateSecond Case "YmdHIS" DateSecond=Second(DateTime) If Len(DateHour)<2 Then DateHour="0"&DateHour If Len(DateSecond)<2 Then DateSecond="0"&DateSecond DateToStr=Year(DateTime)&DateMonth&DateDay&DateHour&DateMinute&DateSecond Case "ym" DateToStr=Right(Year(DateTime),2)&DateMonth Case "d" DateToStr=DateDay Case "ymd" DateToStr=Right(Year(DateTime),4)&DateMonth&DateDay Case "mdy" Dim DayEnd select Case DateDay Case 1 DayEnd="st" Case 2 DayEnd="nd" Case 3 DayEnd="rd" Case Else DayEnd="th" End Select DateToStr=Fullmonth(DateMonth-1)&" "&DateDay&DayEnd&" "&Right(Year(DateTime),4) Case "w,d m y H:I:S" DateSecond=Second(DateTime) If Len(DateHour)<2 Then DateHour="0"&DateHour If Len(DateSecond)<2 Then DateSecond="0"&DateSecond DateToStr=shortWeekday(DateWeek-1)&","&DateDay&" "& Left(Fullmonth(DateMonth-1),3) &" "&Right(Year(DateTime),4)&" "&DateHour&":"&DateMinute&":"&DateSecond&" "&TimeZone1 Case "y-m-dTH:I:S" If Len(DateHour)<2 Then DateHour="0"&DateHour If Len(DateSecond)<2 Then DateSecond="0"&DateSecond DateToStr=Year(DateTime)&"-"&DateMonth&"-"&DateDay&"T"&DateHour&":"&DateMinute&":"&DateSecond&TimeZone2 Case Else If Len(DateHour)<2 Then DateHour="0"&DateHour DateToStr=Year(DateTime)&"-"&DateMonth&"-"&DateDay&" "&DateHour&":"&DateMinute End Select End Function
网站的访问量问题,一直是网上最热门的话题之一,同样也是最难的掌握的知识之一。如果你的网站完成了,做的无论多完美,不去靠推广来提高访问量,充其量只是做给自己看的。就一些网站推广积累的经验,谈谈以下一些基本方法。 首先要说的不是如何去推广,而是关于你的网站定位问题。
如果你的网站只是介绍一些个人小资料之类的(当然,初期的个人主页都是如此),你可以先尝试在内容方面做一些规划,也就是说你没办法做全,就想办法做的更专一点或者说更有点特色。否则,网站推广以及以下的文字对你来说是毫无意义的。
比如你做文学内容的主页,光有你自己的作品是远远不够的,不妨去找一些你喜欢的内容,然后分类,这样你的主页看上去会变的更充实更专业。
其次,如果说光有内容,还是不够的,关键的问题还在于主页的美工设计,整体的框架结构是否合理,用图是否与你的主页内容相配合,整体用色是否协调等等。这些东西就是你主页的门面,如果你不仅仅是满足于开个大排挡而想做成豪华大酒楼的话,就应该去学会这些东西,不一定要你精通photoshop,但你可以选择一些上手操作容易的图象处理软件,如ULEAD等。
对于主页来说,美工方面至少有一半以上的分量,有些很不错的主页内容很少,但美工方面却做的非常出色,这同样会是一个成功的主页。
当你网页内容版面规划设计的差不多的时候,你就会有足够的信心去推广你的网站,以下谈一谈推广的一些技巧和经验。
1.登记搜索引擎
关于此方法,想必也不用多说,如何使用搜索引擎是每个网民都必须掌握的技能,登记搜索引擎是最原始也最行之有效的网站推广方法。找一些大的搜索引擎去登记吧,国内的新浪,搜狐,Goyoyo,Yahoo等一些大的搜索引擎都是你必须去登记的,辛好这一切都是免费的,简单的填写一些表格就能做到一劳永逸。当然,如果你有多个镜像地址,不妨每个都去登记下,能给你带来意想不到的效果。
2.主动宣传
通过EMAIL,聊天室,BBS等一些手段来宣传,如果你在网上浏览的时候见到聊天室就进去胡乱发几条你的主页信息,见到留言本就留言为你的主页做一些宣传,同样也可以使用一些邮件群发软件或者加入一些大的邮件列表来发布你的主页信息(使用邮件群发一定要注意文明用语,否则只会起到相反的效果)。这些办法尽管操作起来费时费力,但却是最能起直接效果的。
3.友情链接
通过友情链接增加访问量是目前个人主页普遍采取的方法,不论是文字,LOGO链接,你一定要找一些访问量比较大的网站来交换链接,并且写信给对方要求把位置放较靠前,如此才能取得比较好的效果,对于那些下拉式菜单的友情链接,不做也罢,除非对方的访问量非常大。
尤其要注意的是,建站初期你的访问量很小,这个时候不适合做友情链接,因为访问量太小人家是不会愿意跟你交换链接的,除非他的访问量跟你一样的可怜,但那样的友情链接的效果是微乎其微的,毕竟,你首页留给友情链接的空间是有限的,尽量留给那些能给你带来更多访问量的站点。尤其是logo链接一定要注意,因为大量的logo链接会让你的主页页面空间变少速度变慢。
4.网站速度
这个到底是不是属于主页推广的范畴暂时不去讨论,但网站的速度会影响到浏览量这却是千真万确的,甚至在某些方面,可以这么说,网站的访问量取决与网站的速度,当然,这个只是相对而言,设想一下,几分钟才打开一个页面的网站会有多少浏览者愿意多呆一秒呢?
甚至会在页面还没完全打开时就已经失去耐心,这样就意味着你失去了一个本来已经很不容易才得到的浏览量。所以,一定要注意,在选择免费空间的时候,一定要选择速度最快的,当然,每个地方的速度都不一样,你可以通过调查综合考虑这些因素。
5.收藏夹
毫无疑问,网站访问量的大小很大程度上取决与访问者的收藏夹,如何让你的网页添加到浏览者的收藏夹是个很值得你去花时间研究的问题。最普遍的无非是把你的网站做的更出色更吸引人,另外还能借助一些java使用弹出窗口提醒浏览者加入收藏夹,这个办法同样很有效。
6.使用HTML语言
这个办法是针对搜索引擎而言的,方法是打开主页的源文件,在〈HEAD〉与〈/HEAD〉中加入代码〈META HTTP-EQUIV=“Keywords”CONTENT=“1,2,3,……,TEXT/HTML;CHARSET=gb2312”〉其中 content后面的1,2,3,均是与主页主题内容相关的关键词(当然,你也可以选择一些热门词,即使你的主页里没有这些内容,这样总有点欺骗别人的感觉,但无论怎么说,这也是主页推广的好办法)。当一些搜索引擎工作时,您的关键词与搜索词如果相匹配,您的网址便成为搜索结果之一。所以要选择好关键词,而且越多越好,这样,你的网址就更容易被搜索到。
7.加入品网和网站排名
如今网上越来越多的品网和排名网站,你可以见一个加入一个,这样对你的访问量是大有帮助的,如果你的网站做的够出色,自然就能获得很高的回报;另外就是一些零零总总的排行榜,赶快去加入吧,尽管可能你排在最后一位,但它却同样能给你带来众多访问量。
8.交换广告
这个方法可能是最有用也最讲究技巧的方法了。你可曾想到过,你的主页本身也能给你带来访问量,我见过很多个人主页页面上空空的,何不利用这些宝贵的页面空间去带来更访问量呢?可能你还在抱怨你主页的内容太少,当然,加入免费的广告交换对与你的主页来说,不但能增加你主页的内容,而且更重要的是能给你带来更多的访问量。
很多文章在讨论主页宣传的时候,对这一点往往是很忽略的,认为广告交换效果不理想。但你可知道,一个浏览者进入你的站点开始,他不但为你创造了一个访问量,而且,更重要的是他还能为你创造广告交换最基本的东西,你可以尝试把一些点击类的广告交换(通常为文本交换,isme,太极链,七八链等)放到网页的显眼位置,这样,当浏览者浏览完你的网页,他想离开的时候,如果这些广告交换有他感兴趣的内容,他会选择点击,而这一个点击又能给你带来一个浏览量。
如此循环,你的访问量只会与日俱增。另外,显示类的广告交换也有文本和banner之分,通常文本类的广告交换能起到更好的效果,同样要取决与你的广告词用语是否够吸引人,如果不清楚该怎么做,去学一些人家的就行。
banner交换也是一样,自己做的不好不吸引人,用别人的,而且记得一定要经常更换。(使用这个方法的时候要注意千万不要放太多的交换广告,选择一些效果比较好显示速度比较快的就行了,否则会严重影响到你的主页浏览速度。)落不明
通过使用以上各种方法之后,你主页的访问量必定会有所增加,但还要注意的就是你的网站必需不断更新不断充实,哪怕是换个颜色,换几行字,这样才能在稳定访问量的基础上不断增加访问量。另外还有很多很多的技巧,需要你在不断实践中摸索,比如面对众多的广告交换,哪些才是对你最有用的,哪些的广告交换效果不理想,哪些友情链接效果好哪些不好等等,这些都是要你在不断实践中去熟悉掌握的
面目全非 1,当你转别人技术帖或其它帖时请把标题稍微改下,改成大家容易搜索的祠,这样可以提高搜索上的排名,不然一大推同样的标题,你很难排在前面。如果你懂的SEO优化可以跳过此条
乾坤大挪移 2,刚开始时,经常变换你论坛的程序,当你发现你的论坛帖子基本被搜索收录完后就转换程序,如你从DZ变为PHPWIND时,就再建几个跳转页面,页面名为forumdisplay.php和viewthread.php全部转到你的论坛主页面上,这样的用意不用我说了吧,多转几次,流量上量的很快
3,论坛功能里开启注册发送欢迎邮件(不是短消息),这样很多人注册了你的论坛,下次他忘了或没有不上的时候,他看信件的时候看到了也常会点击进来再转转看有什么东西没有的。
4,经常在论坛搞些活动,如月灌水明星,周灌水明星可以得到什么礼品之类的,礼品可以是QQ,8位数的现在不值钱,但是很多人没有却不知怎么得来,可以多搞些来送
5,如果你的论坛有足够的管理人员可以做几个垃圾动画(随便整个盗QQ,或使用国外的什么东西的教程估计都会做吧),动画必须不怎么能让你看懂,让他们到论坛来问你,可他们刚学会点东西,就是放木马,就要小心木马帖了,谁会愿意呆在不安全的地方呢`
6,坚持每天QQ加几个好友,跟他(她)们聊会,然后请他(她)们帮忙,说你有个论坛,让他(她)们帮忙宣传宣传
7,你的QQ上的哪些群千万不要退掉,全部保留着,如果你觉的麻烦,可以拒绝看到,你经常变动的话,现在QQ新版本有了同时应用到服务器上,每天在论坛选几个人气帖发到群里,标题,网址
8,在网吧上网的话随身带些打印好的广告小纸条,在网吧到处帖些,注意别让网管发现哦
9,到其它论坛拉人气,如果不想做的太绝可以发些好帖,签名处的签名设置成诱人的
10,多建些垃圾站,要多垃圾有多垃圾也可以,只要能让人家搜索进来就可以了,在垃圾站里放弹窗放广告做转向等等
11,QQ里面常改名子,当你改完后很多人不知道是谁,会问你什么的,改完名子后就设个自动回复,自动回复内容当然是你的论坛AD啦
12,文本连,现在很多这样的连注册就送多少流量,申请些二级米去注册,这也能带来不少流量的
13,网摘,如CHINABBS,QIHOO等等,常去哪推荐帖子,有时你推荐一个帖子一天能带来上万IP,你在这些地方推存的好帖子,会有很多其它的小网摘去收录去采集,到后来就更多啦
14,黄金广告位
SQL Server支持的数据类型
数据类型
|
说明
|
BIGINT
|
从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(整数)。
|
INT
|
从 -2^31 (-2,147,483,648) 到 2^31-1 (2,147,483,647) 的整型数据(整数)。
|
SMALLINT
|
从 2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据。
|
TINYINT
|
从 0 到 255 的整型数据。
|
BIT
|
非 1 即 0 的整型数据。
|
DECIMAL
|
从 -10^38 +1 到 10^38 -1 的固定精度和标度的数字数据。
|
NUMERIC
|
功能上相当于十进制数。
|
MONEY
|
从 -2^63 (-922,337,203,685,477.5808) 到 2^63 - 1 (+922,337,203,685,477.5807) 的货币型数据,精确到货币单位的万分之一。
|
SMALLMONEY
|
从 -214,748.3648 到 +214,748.3647 的货币型数据,精确到货币单位的万分之一。
|
FLOAT
|
从 -1.79E + 308 到 1.79E + 308 的浮点精度数字数据。
|
REAL
|
从 -3.40E + 38 到 3.40E + 38 的浮点精度数字数据。
|
DATETIME
|
从 1753 年 1 月 1 日到 9999 年 12 月 31 日的日期和时间数据,精确到三百分之一秒(3.33 毫秒)。
|
SMALLDATETIME
|
从 1900 年 1 月 1 日到 2079 年 6 月 6 日的日期和时间数据,精确到一分钟。
|
CHAR
|
最大长度 8000 个字符的固定长度非 Unicode 字符数据。
|
VARCHAR
|
最大长度 8000 个字符的可变长度非 Unicode 字符数据。
|
TEXT
|
最大长度 2^31 - 1 (2,147,483,647) 个字符的可变长度非 Unicode 数据。
|
NCHAR
|
最大长度 4,000 个字符的固定长度 Unicode 数据。
|
NVARCHAR
|
最大长度 4000 个字符的可变长度 Unicode 数据。sysname 是系统提供的用户定义数据类型,功能上相当于 nvarchar(128),用于引用数据库对象名称。
|
NTEXT
|
最大长度 2^31 - 1 (1,073,741,823) 个字符的可变长度 Unicode 数据。
|
BINARY
|
最大长度 8,000 个字节的固定长度二进制数据。
|
VARBINARY
|
最大长度 8,000 个字节的可变长度二进制数据。
|
IMAGE
|
最大长度 2^31 - 1 (2,147,483,647) 字节的可变长度二进制数据。
|
CURSOR
|
对光标的引用。
|
SQL_VARIANT
|
存储 SQL Server 支持的数据类型(text、ntext、timestamp 和 sql_variant 除外)值的数据类型。
|
TABLE
|
用于存储结果集合供以后处理的特殊数据类型。
|
TIMESTAMP
|
整个数据库中都唯一的一个数字,随着行的每次更新而更新。
|
UNIQUEIDENTIFIER
|
全局唯一标识符 (GUID)。
|
(1)二进制数据类型
二进制数据包括 Binary、Varbinary 和 Image Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。 Binary[(n)] 是 n 位固定的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4 个字节。 Varbinary[(n)] 是 n 位变长度的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4个字节,不是n 个字节。 在 Image 数据类型中存储的数据是以位字符串存储的,不是由 SQL Server 解释的,必须由应用程序来解释。例如,应用程序可以使用BMP、TIEF、GIF 和 JPEG 格式把数据存储在 Image 数据类型中。
(2)字符数据类型 字符数据的类型包括 Char,Varchar 和 Text 字符数据是由任何字母、符号和数字任意组合而成的数据。 Varchar 是变长字符数据,其长度不超过 8KB。Char 是定长字符数据,其长度最多为 8KB。超过 8KB 的ASCII 数据可以使用Text数据类型存储。例如,因为 Html 文档全部都是 ASCII 字符,并且在一般情况下长度超过 8KB,所以这些文档可以 Text 数据类型存储在SQL Server 中。
(3)Unicode 数据类型 Unicode 数据类型包括 Nchar,Nvarchar 和Ntext 在 Microsoft SQL Server 中,传统的非 Unicode 数据类型允许使用由特定字符集定义的字符。在 SQL Server安装过程中,允许选择一种字符集。使用 Unicode 数据类型,列中可以存储任何由Unicode 标准定义的字符。在 Unicode 标准中,包括了以各种字符集定义的全部字符。使用Unicode数据类型,所战胜的窨是使用非 Unicode 数据类型所占用的窨大小的两倍。 在 SQL Server 中,Unicode 数据以 Nchar、Nvarchar 和 Ntext 数据类型存储。使用这种字符类型存储的列可以存储多个字符集中的字符。当列的长度变化时,应该使用Nvarchar 字符类型,这时最多可以存储 4000 个字符。当列的长度固定不变时,应该使用 Nchar 字符类型,同样,这时最多可以存储4000 个字符。当使用 Ntext 数据类型时,该列可以存储多于 4000 个字符。
(4)日期和时间数据类型 日期和时间数据类型包括 Datetime 和 Smalldatetime两种类型 日期和时间数据类型由有效的日期和时间组成。例如,有效的日期和时间数据包括“4/01/98 12:15:00:00:00 PM”和“1:28:29:15:01AM 8/17/98”。前一个数据类型是日期在前,时间在后一个数据类型是霎时间在前,日期在后。在 Microsoft SQL Server中,日期和时间数据类型包括Datetime 和 Smalldatetime 两种类型时,所存储的日期范围是从 1753 年 1 月 1 日开始,到9999 年12 月 31 日结束(每一个值要求 8 个存储字节)。使用 Smalldatetime 数据类型时,所存储的日期范围是 1900年 1 月 1日 开始,到 2079 年 12 月 31 日结束(每一个值要求 4 个存储字节)。 日期的格式可以设定。设置日期格式的命令如下: Set DateFormat {format | @format _var| 其中,format | @format_var 是日期的顺序。有效的参数包括 MDY、DMY、YMD、YDM、MYD 和 DYM。在默认情况下,日期格式为MDY。 例如,当执行 Set DateFormat YMD 之后,日期的格式为年 月 日 形式;当执行 Set DateFormat DMY 之后,日期的格式为日 月有年 形式
(5)数字数据类型 数字数据只包含数字。数字数据类型包括正数和负数、小数(浮点数)和整数 整数由正整数和负整数组成,例如 39、25、0-2 和 33967。在 Micrsoft SQL Server 中,整数存储的数据类型是 Int,Smallint和 Tinyint。Int 数据类型存储数据的范围大于 Smallint 数据类型存储数据的范围,而 Smallint 据类型存储数据的范围大于Tinyint 数据类型存储数据的范围。使用 Int 数据狗昔存储数据的范围是从 -2 147 483 648 到 2 147 483 647(每一个值要求4个字节存储空间)。使用 Smallint 数据类型时,存储数据的范围从 -32 768 到 32 767(每一个值要求2个字节存储空间)。使用Tinyint 数据类型时,存储数据的范围是从0 到255(每一个值要求1个字节存储空间)。 精确小娄数据在 SQL Server 中的数据类型是 Decimal 和 Numeric。这种数据所占的存储空间根据该数据的位数后的位数来确定。 在SQL Server 中,近似小数数据的数据类型是 Float 和 Real。例如,三分之一这个分数记作。3333333,当使用近似数据类型时能准确表示。因此,从系统中检索到的数据可能与存储在该列中数据不完全一样。
(6)货币数据表示正的或者负的货币数量 。 在 Microsoft SQL Server 中,货币数据的数据类型是 Money 和 Smallmoney Money数据类型要求 8 个存储字节,Smallmoney 数据类型要求 4 个存储字节。
(7)特殊数据类型 特殊数据类型包括前面没有提过的数据类型。特殊的数据类型有3种,即 Timestamp、Bit 和 Uniqueidentifier。 Timestamp 用于表示SQL Server 活动的先后顺序,以二进投影的格式表示。Timestamp 数据与插入数据或者日期和时间没有关系。 Bit 由 1 或者 0 组成。当表示真或者假、ON 或者 OFF 时,使用 Bit 数据类型。例如,询问是否是每一次访问的客户机请求可以存储在这种数据类型的列中。 Uniqueidentifier 由 16 字节的十六进制数字组成,表示一个全局唯一的。当表的记录行要求唯一时,GUID是非常有用。例如,在客户标识号列使用这种数据类型可以区别不同的客户。
2.用户定义的数据类型 用户定义的数据类型基于在 Microsoft SQL Server 中提供的数据类型。当几个表中必须存储同一种数据类型时,并且为保证这些列有相同的数据类型、长度和可空性时,可以使用用户定义的数据类型。例如,可定义一种称为 postal_code 的数据类型,它基于 Char 数据类型。 当创建用户定义的数据类型时,必须提供三个数:数据类型的名称、所基于的系统数据类型和数据类型的可空性。
(1)创建用户定义的数据类型 创建用户定义的数据类型可以使用 Transact-SQL 语句。系统存储过程 sp_addtype 可以来创建用户定义的数据类型。其语法形式如下: sp_addtype {type},[,system_data_bype][,'null_type'] 其中,type 是用户定义的数据类型的名称。system_data_type 是系统提供的数据类型,例如 Decimal、Int、Char 等等。 null_type 表示该数据类型是如何处理空值的,必须使用单引号引起来,例如'NULL'、'NOT NULL'或者'NONULL'。 例子: Use cust Exec sp_addtype ssn,'Varchar(11)',"Not Null' 创建一个用户定义的数据类型 ssn,其基于的系统数据类型是变长为11 的字符,不允许空。 例子: Use cust Exec sp_addtype birthday,datetime,'Null' 创建一个用户定义的数据类型 birthday,其基于的系统数据类型是 DateTime,允许空。 例子: Use master Exec sp_addtype telephone,'varchar(24),'Not Null' Eexc sp_addtype fax,'varchar(24)','Null' 创建两个数据类型,即 telephone 和 fax (2)删除用户定义的数据类型 当用户定义的数据类型不需要时,可删除。删除用户定义的数据类型的命令是 sp_droptype {'type'}。 例子: Use master Exec sp_droptype 'ssn' 注意:当表中的列还正在使用用户定义的数据类型时,或者在其上面还绑定有默认或者规则时,这种用户定义的数据类型不能删除。
12、类型不匹配(一下午的教训)
Microsoft VBScript 运行时错误
错误 '800a000d'
类型不匹配
/shop/Present.asp,行 24 错误源代码如下: Session("ProductPriceList") = Trim(Request.Form("DY_price")) Session("ProductNumList") = Trim(Request.Form("PNAmount")) ProductPriceList = Session("ProductPriceList") ProductNumList = Session("ProductNumList") ProductPriceList = Split(ProductPriceList,",")'-------------产品ID数组 注意这里,此变量已经变成了数组类型,应该使用PriceListArray NumListArray = Split(ProductNumList,",")'-------------产品数量数组 Response.Write("<br>") Response.Write ProductPriceList(0) If Len(ProductPriceList) = 0 OR Len(ProductNumList) = 0 Then 原因:低级错误,变量混淆
13、没有打开数据库连接
ADODB.Recordset
错误 '800a0bb9'
参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。
/shop/Present.asp,行 45
就是没有<!--#include file="../Conn.asp" -->
14、函数内弹出窗口
'======================设置:修改付款方式(开始)========================
Sub OperateModify(TypeId) If Trim(Request("DyTypeName"))="" Or Trim(Request("Discount"))="" Or Trim(Request("OrderID"))="" Or IsNull(Request("DyTypeName"))=True Then
Response.write("<script language='javascript'>alert('不能为空');window.location='Shop_payment_manage.asp';</script>")
’使用这句就OK
'Response.Redirect("Shop_payment_manage.asp")
’关键是有时候使用的是这句,所以有时候不弹出窗口 Response.End End If End Sub
'======================设置:修改付款方式(结束)========================
15、数据类型错误
Microsoft OLE DB Provider for ODBC Drivers
错误 '80040e57'
[Microsoft][ODBC SQL Server Driver][SQL Server]将 numeric 转换为数据类型 numeric 时发生算术溢出错误。
/shop/Order.asp,行 56
16、
多步
OLE DB
操作产生错误
Microsoft OLE DB Provider for SQL Server
错误
'80040e21'
多步
OLE DB
操作产生错误。如果可能,请检查每个
OLE DB
状态值。没有工作被完成。
引起这个问题的原因简单的说就是数据库的字段类型不匹配或者字符个数超出了数据库的字段的最大限制个数。
1>
自动编号字段的就不应该指定值;
2>
限制
50
个字符的字段你就不应该提交多于
50
个字符的字符串
3>
记录没有向下移动。
OrderSql2 = "Select * From PE_OrderFormItem Where OrderFormID="&OrderFormID*1 Set OrderRs2 = Server.CreateObject("ADODB.RecordSet") OrderRs2.Open OrderSql2,Conn,1,3 Do While Not OrderRs2.Eof OrderRs2.Delete
OrderRs2.MoveNext
Loop OrderRs2.Close Set OrderRs2 = Nothing
jsp是sun在servlet基础上发展而来的一种新的web开发工具,在国外ejb+jsp/servlet+应用服务器+数据库已经已经成为电子商务站点的流行架构。如果您选用jsp平台作为internet商业站点的支持, 那么速度、价格和稳定性都是要考虑到的,作为这些resin是十分出色的。resin在linux下的安装已经有不少文章介绍过,本文介绍它在windows操作系统下的安装,相信看过本文,您将会很轻松架构起一个拥有强大功能的web站点。
首先的要求,是jdk已经正常安装。在这里我就不冗述jdk的安装了,这方面的文章比较多。
resin达到jsp解释器的目的,有两种方法, 一种是和iis集成,一种是作为standalone的httpd。具体使用那种方法,要看个人喜好和实际情况。我用的是第一种。
首先先讲解最简单得standalone法。
这种方法几乎不需要配置,将resin解压缩之后,直接运行bin\httpd.exe即可。 需要注意的是,运行httpd.exe之后会产生两个窗口, 一个是类似命令行窗口(但是只能输出,不能输入),另外一个是gui的控制窗口,这两个窗口绝对不可以用直接x的方法关闭,这样会导致resin的系统错误,正确的方法是用gui上面的quit按钮。
等到命令行窗口里面出现:
resin 2.1.6 -- mon oct 2 17:34:31 pdt 2000 listening to *:8080
这样就是启动成功了,后面的8080就是resin httpd现在所监听的端口了。这个端口是可以修改的。 修改的时候,需要改动conf\resin.conf文件,修改如下
section:xml:
<!-- the http port --> <httpd-port>8080</httpd-port>
把这里的8080修改成你想要得port即可。但是请注意不要和已经占用的端口重复,否则无法启动。这个时候,resin httpd已经在接受访问了,具有iis的基本功能,http root目录默认是resin安装目录的doc目录但是也是可以修改的,可以修改
conf\resin.conf:xml: <http-server> <app-dir>doc</app-dir> 这里是默认的情形,你也可以写上绝对路径来定义其他的目录。输入 http://localhost:8080/ 看看! 再说一下如何同iis集成。在这种模式下,resin作为iis的插件运行,只有碰到.jsp,.xtp等等文件的时候才进行解析,就好像asp.dll负责解析.asp文件,perl.dll负责解析.pl文件一样。这个配置比较复杂,而且可能会导致问题,但带来非常大的方便。
请三思而后行。
下面我要说的是手工安装的办法,个人感觉它提供的setup.exe 安装起来常常有问题,而且不可靠。
1. 安装好jdk,resin之后(这些都是废话)
2. 执行bin\setup.exe文件
填好关于resin home以及iis/pws目录之后,点击ok,他会停止iis/复制iis_run.dll/启动iis这个时候,在你的iis的inetpub\s cripts目录下面会有一个iis_run.dll文件。同时在iis配置的filter里面会多出来一个srun。
3. 这个时候resin还不能使用,还需要安装一个服务执行bin\目录下面的srun.exe -install命令。这个会给系统安装一个resin服务。
4. 配置resin.conf文件
编辑如下section:
<http-server> <app-dir>doc</app-dir>
将doc修改为你的wwwroot所在的目录,这个时候就好了!
5. 重新启动系统
这一步是必需的,若不重新启动,resin服务会无法正确运行。
6. 浏览 http://localhost/caucho-status 看看!
这样的话,大致就告一段落了。以后,iis和resin会各司其职,iis负责html和asp文件的解析,resin负责jsp文件的解析。最后要说的是,resin的功能非常强大,虚拟目录、虚拟主机、负载均衡都是可以实现的。
前言 凡是有JSP编写经验的人都有JSP调试困难的体会。由于自动化调试工具的缺乏使得在调试JSP时不得不在文件中大量的使用打印语句。这种做法对于定位JSP范围内的错误是一个简单有效的手段,但如何快速有效的定位在JSP中调用的对象的内部错误就显得有点力不从心了。因为这样将不得不频繁地编译、发布、启停服务器,给调试带来极大的不便。 传说中所见即所得的JSP调试工具,就笔者目前掌握的情况来看,并不存在。如果读者有这方面信息的希望告知,呵呵。但是JSP的调试工具却的确存在,而且它是免费的!It's lomboz。下载地址: http://www.objectlearn.com/products/download.jsp 本文从一个简单的例子出发来描述如何使用lomboz来调试JSP。本例的开发环境如下: -JDK版本:1.4.1; -JAVA IDE:Eclipse 2.1; -lomboz:适用于Eclipse2.1的插件; -JSP/Servlet容器:Tomcat 4.1.18。 lomboz简介 严格的说lomboz是Eclipse的一个J2EE的插件,它将很多Java应用服务器、J2EE组件和Web应用开发集成到Eclipse中,可以帮助Java开发者使用Eclipse建立、测试、部署J2EE应用。对于本文的重点,JSP的调试,它也有相关的支持: -支持JSP编写,包括:语法着色和语法检查; -支持JSP的调试。 对于JSP的调试,lomboz的原理是对要调试的JSP页面所产生的java代码来进行调试。整个调试过程与java应用程序的调试过程一样,这样不论是JSP本身的调试还是被JSP调用的对象的调试本无缝地联结到了一块。 在开始本文的例子之前,我们先来看看lomboz的安装,以及为能正常的使用其JSP调试功能而进行的配置。 安装和配置 lomboz的安装过程非常简单,Eclipse的插件安装过程大多都非常的简单,主要步骤如下: 1.从lomboz的下载地址( http://www.objectlearn.com/products/download.jsp )下载支持Eclipse2.1(或Eclipse的其他版本)的插件。 2.如果Eclipse已运行,那么请先关闭它。 3.把下载的文件解压到Eclipse安装目录下的plugins目录下。 4.重新启动Eclipse,打开“About Eclipse Platform Plug-ins”(Help -> About Eclipse Platform ->Plug-in Details),如果lomboz安装成功将会出现有关它的信息。如下图:
注:如果想卸掉lomboz,你只需要把plugins目录下对应lomboz的目录删除即可。 5.设置Lomboz J2EE View,打开Window -> Customize Perspective,如图设置
下来就是如何配置lomboz使之能正常的工作。与安装过程相反,配置过程可不是那么简单的,J。Lomboz的配置步骤如下: 1.配置JDK,选择“Windows -> Preferences”,选择Lomboz,进行JDK的配置。如图例:
. 定义服务器,如果你的服务器已经包含在Lomboz默认的服务器列表中,这一步可以跳过。Lomboz默认服务器列表可以通过在上一步的界面中展开Lomboz,然后选择其中的“Server Definitions”获得。以下以添加Tomcat4.1.18为例说明如何增加一个服务器。相关步骤如下: a)进入Lomboz安装目录的servers子目录,复制一个.server文件(如tomcat410.server),并将其改名为tomcat418.server。 b)打开这个文件分别改动这个文件的以下位置: - <serverDefinition ……/>,将其中的name的值改为你想要的一个名字(如Apache Tomcat v4.1.8),这个名字用来显示在“Server Definitions”界面的服务器列表部分; - <property id="serverRootDirectory" ….../>,其中default的值改为你机器上Tomcat所在的目录,如D:/Program Files/Java/tomcat-4.1.18; - <property id="classPathVariableName" ……/>,其中default的值改为任意名字(如TOMCAT418),这个名字用于代表Lomboz工程的缺省的ClassPath的变量名; - <property id="classPath" ……/>,其中default的值改为你机器上Tomcat所在的目录,如D:/Program Files/Java/tomcat-4.1.18; c) 添加jasper-runtime.jar。在默认情况下TomcatX.server文件中只包含2个jar文件:servlet.jar和bootstrap.jar,但缺少jasper-runtime.jar。而这个jar文件在JSP的调试过程中起到了非常重要的作用,因此请加上它。给一个server添加jar有两种做法: 方法1: 在刚才编辑的.server文件中的<serverClassPath>部分添加一行:<jar type="variable">${classPathVariableName}/common/lib/jasper-runtime.jar</jar>; 方法2:使用“Server Definitions”界面,在此不再赘述。 配置好的服务器会在“Server Definitions”窗体中显示,如下图:
注:对于Tomcat4.x的服务器需要打上补丁才能使Lomboz正常工作,补丁的下载地址: http://www.sysdeo.com/ 至此,Lomboz的安装和配置已经全部完毕,那么让我们来创建一个“Hello World!”的例子来体会一下Lomboz调试JSP的过程吧。 调试JSP 创建工程 要想使用Lomboz调试JSP,首先必须创建一个Lomboz工程。步骤如下: 1.打开File->New->Lomboz J2EE Project,创建一个名为debugJsp的项目; 2.选择“Next”进入Lomboz工程属性选择页面,添加Web模块和所使用的服务器。由于我们的主要任务是调试JSP,因此EJB模块可以为空。如下图:
3.选择Finish,Lomboz工程即创建完毕。此时,Lomboz生成的文件结构如下图.
接下来,我们就可以创建自己所需要的JSP文件了。在本例中我直接使用默认的index.jsp,将它的内容改为: <!-- Copyright (c) 2002 by ObjectLearn. All Rights Reserved. --> <html> <head> <title>Welcome</title> </head> <body> <center><%= "Hello World!"%></center> </body> </html> 当目前为止,我们调试JSP的准备工作大致都完成了,但是对使用Tomcat4.x的人员还需要多余的步骤(这些步骤主要也是由tomcat4.x本身引起的): 1.在Tomcat的config目录下的server.xml文件中添加以下行(具体位置请参见server.xml相关的文献): <Context path="/TestJsp" docBase="D:\DebugJsp\debugJsp" workDir="D:\DebugJsp\j2src\org\apache\jsp"> 其中,path表示Web应用的URL名字;docBase表示web应用的物理位置;workDir表示jsp所对应的java文件产生的位置,必须创建org\apache\jsp这样的目录结构和名称。 2.根据org\apache\jsp在对应的j2src目录下创建相对应的子目录结构,同时把j2src设置为工程的source目录。 语法检查 现在,让我们开始享受调试JSP的过程吧。在调试之前,JSP应该是没有语法错误的。Lomboz提供了JSP语法检查的功能,具体操作是: 1.选择要进行语法检查的JSP文件,单击鼠标右键; 2. 选择Lomboz j2ee… -> Check Jsp Syntax 调试 解决完语法错误之后,接下来就是解决逻辑错误的时候了。对于这种错误就只能通过调试来解决了。使用Lomboz调试JSP的过程与普通JAVA应用程序的调试非常类似,因为它的原理就是先利用服务器生成JSP对应的JAVA文件,然后对他们进行调试。 调试JSP的步骤如下: 1.打开Lomboz J2EE View,选择服务器,单击鼠标右键选择“debug server”。如图:
如果.server文件定义正确,Tomcat将会启动。如果没有象预想的那样启动Tomcat,那么请从这两个方面排错:Tomcat环境变量和Lomboz的server文件。 2.打开浏览器,如IE,在地址栏中输入: http://127.0.0.1:8080/debugJsp/index.jsp 。如果JSP文件语法没有错误,将会在工程的j2src\org\apache\jsp目录下生成这个JSP文件对应的JAVA文件。重新刷新工程,即可看到这些文件。如图
这一步主要是触发服务器根据jsp产生可供调试的java文件,不必太在意结果是否正确。因为一旦java文件生成,那么这些错误都可通过调试排除。 3.打开这个java文件,在其中设置断点,然后在IE的地址栏再次输入这个URL,此时Eclipse的调试功能即被激活。至此就可有针对性地对JSP进行调试了,这时的情形如图: 至于JSP所调用对象的调试,在完成上述步骤后,然后在对象对应的java
文件中设置断点即可。 结束语 虽然目前JSP的调试尚未方便到如同普通的java文件调试般方便,但是Lomboz这类工具的出现至少结束了手动调试JSP的阶段。从此java的web应用开发者不必因为一些错误而时不时地停下程序来手工添加打印语句来观察变量的值,相反他们完全可以如调试普通JAVA应用一样在程序运行的同时来观察这些值的变化。这大大地方便了基于WEB应用的开发,减少了以前为调试所浪费的时间。
Sysdeo Tomcat插件可以让我们在Eclipse中对Tomcat的启动与停止进行控制,方便了我们的开发工作。本文中我们主要描述了如何在Eclipse中配置它,并通过一个简单的例子来说明该插件的使用方法,因此在这里对Eclipse和Tomcat的使用方法没做过多的描述,如果读者有兴趣的话可以查阅相关的资料。
关键词:Eclipse Sysdeo Tomcat Plugin
软件需求:
软件名称 下载地址 安装目录
Tomcat
http://jakarta.apache.org
C:\tomcat5
Sysdeo Tomcat plug-in
http://www.sysdeo.com/eclipse/Tomcatplugin
-
Eclipse
http://www.eclipse.org
C:\eclipse
n 前言
Sysdeo Tomcat插件可以让我们在Eclipse中对Tomcat的启动与停止进行控制,方便了我们的开发工作,它有以下特点:
1. 启动、停止或者重新启动Tomcat 4.x,5.0.x,3.3;
2. 在Eclipse调试器中注册Tomcat进程;
3. 创建一个WAR项目(向导可以自动更新server.xml文件);
4. 把Java项目添加到Tomcat的类路径中;
5. 设置Tomcat JVM参数,类路径和启动类路径;
6. 将Tomcat项目导出到WAR文件中;
7. 选择Tomcat配置文件;
8. Capability to use a special Tomcat classloader to have classes in several java projects loaded at the same classloader level than classes in a Tomcat project
n Sysdeo Tomcat插件的安装与配置
1. 将下载的插件释放到临时文件夹,这里我们得到一个新的文件夹com.sysdeo.eclipse.tomcat_3.1.0.beta,将这个文件夹剪贴到C:\eclipse\plugins目录下。
2. 启动Eclipse,点击Window→Customize Perspective,确认新添加的插件被激活,如下图:
在工具栏中,你会发现多了3个Tomcat的图标,它们分别代表启动、停止和重新启动Tomcat。
3. 在进行完上述步骤后,我们需要对安装的插件进行设置,让它和我们安装的Tomcat联系起来。点击Window→Perferences,选择Tomcat节点,选择我们使用的Tomcat版本和设置Tomcat的安装目录,请参考下图:
n 利用Sysdeo Tomcat插件进行JSP开发
在安装配置好Sysdeo Tomcat插件后,我们将通过一个简单的例子来说明该插件的使用方法。首先,点击File→New→Project,在弹出的新建向导中选择Java→Tomcat Project,然后点击Next,参考如下图片:
在接下来的项目设置对话框中,我们输入项目的名称test,然后直接点击Finish按钮完成项目的创建工作。
接下来,我们新建一个JSP文件,并命名为hello.jsp。选中我们创建的test项目,右键单击,在弹出的菜单中选择New→File,然后在出现的对话框的文件名称中输入我们想要的文件名hello.jsp并点击Finish按钮完成创建工作,参考如下: 对于JSP文件的内容,读者可以根据自己的喜好来进行编写,在这里我们仅给出一个简单的例子供参考,源码如下:
例子 hello.jsp
<HTML>
<HEAD> <TITLE>A Web Page</TITLE> </HEAD> <BODY> <H1>Using JSP</H1> <% out.println("Using a Tomcat plug-in..."); %> </BODY>
</HTML>
保存文件后,点击工具栏中启动Tomcat的按钮,你会发现Tomcat的启动信息出现在Eclipse的终端中,根据这些信息检查一下启动是否成功。
启动成功后,打开一个IE窗口,在地址栏中输入http://localhost:8080/test/hello.jsp,你会发现出现下面的问题:
初次使用这个插件的朋友很多都会遇到这个问题,出现这个问题的原因是Eclipse启动Tomcat时使用的是系统自带的JRE,我们只需要修改它,让它指向我们自己安装的JDK就可以了,具体操作如下: 点击Window→Perferences,在左边的菜单栏中选择Java→Installed JREs,然后点击右面窗口中的Add按钮。
在弹出的Add JRE窗口中,输入JRE的名称,这里我们根据安装的JDK的版本命名为JDK1.4,点击Browse按钮选择JDK的安装目录,然后点击OK按钮完成添加工作。
添加完JRE后,点击OK关闭Preferences窗口。再次点击Window→Perferences打开Preferences窗口,在左边的菜单中选择Tomcat→JVM Settings,在右边的窗口中将JRE选择为我们刚刚添加的JDK1.4,然后点击OK按钮。
重新打开一个IE浏览器输入http://localhost:8080/test/hello.jsp,如果出现了下面的页面,那么恭喜你,你成功了
对于Eclipse的新版本(3.1)与Lomboz的配合在Tomcat环境下编写动态网页的教程在网上好像很少。(反正我是没找到)。这里我把我今天的实践过程中遇到的一些问题记录下来,一来是为了备案,二来是为了让大家少费些事,入门更容易一点。 好了,不废话了。 我采用的软件版本以及下载地址如下: Eclipse 3.1 相关网页: http://www.eclipse.org/downloads/index.phpLomboz 3.1RC1 相关网页: http://lomboz.objectweb.org/downloads/drops/S-3.1RC1-200507222345/Tomcat 5.5.9 相关网页: http://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgi实践过程的主要参照是文章WTP Tutorials - Building a School Schedule Web Application。这篇文章中的过程绝大部分还是好用的。我主要将对应文章的结构,对在实践中与文章中不一致的地方说一说。我的建议是主要参照上面的文章,如果能瞧得上在下,顺便看看我写的不同之处。文章的结构如下: 教程的预先要求 在这里先说说一些软件设置方面的问题吧. 1.我使用的是JDK1.50_04,好像Tomcat5.5要求使用jdk1.5吧,起码是支持,呵呵。另外,最开始我使用的是Tomcat4.1.31。这个版本的Tomcat好像和JDK1.5不相容。我在Eclipse里添加了好几遍服务器都没成功,换成Tomcat5.5.9后就好使了。(JDK我一直没换,一直是1.5) 2.我觉得在安装Tomcat时,如果不是用来实际部署的话,就不要在安装过程中选择将Tomcat作为Windows服务,那样会给后来的调试带来不便。 在Eclipse中安装Tomcat运行时环境 1.在没看这个文章之前,我一直没有重视这个问题,寻思着Eclipse能跑起来应该就没什么问题了。现在看来不是这样。还是有必要制定JDK的,我想是因为里面有很多库是JRE中没有的缘故吧。 2.Eclipse3.1+Lomboz3.1的界面和文章中的有点区别,不过在这一段的实践过程中不涉及。 创建一个J2EE工程 1.此时界面的不同起到作用了。在实际界面中,针对此段第一步,应该选择Dynamic Web Projects,如下图所示。 创建班级和课程表容器 这一段没什么区别,唯一可选的区别是在实现Scheduler是列表可以使用ArrayList<SchoolClass>方式,毕竟是JDK1.5了么。呵呵。如果出现错误,八成是说参数化的集合不支持,只要更改源代码级别就行了。更改的地方是Window->Preference->Java->Compiler,选择右方Compiler compliance level为5.0 还有一点就是别把班级和类搞混了,都对应一个Class,不过我相信大家的E文水平都是很高的了。 将班级加入课程表 界面的差别又有显现了。对于第一步,应该是右击WebContent,选择new->JSP。是有点进步了,呵呵。其余基本一致。 提交Action 这里的区别也主要是界面方面,不过这次好像与文件的管理联系起来了。新版的Lomboz声称的一个Dynamic Web Project的典型结构如下图所示: 此时应该选择右击servlet->new->servlet的方式来生成新的Servlet,在生成过程中还捎带着可以设定Servlet Mapping。省得后来再用代码级文本方式的设置了。从上图中可以看到,新版Lomboz在工程中没有包含文章中提到的Deployment Descriptor选项 另外在文章此段的第十步时设置的表单action属性时的“/SchoolSchedule/”部分,应该用你生成的项目名称替换(前提是在生成项目时,你是按照系统默认的选项来的)。 显示时间表 这段没有太多可说的,应该注意的一点就是在将两个jar文件放到WEB-INF/lib目录中后,Eclipse开始回在目录条目前显示一个十字标记,但是点击后,除了标记消失以外没有任何效果。显示不出任何目录中的文件。这可能是Eclipse3.1的一个bug吧。不过使用还是正常的。 运行并检验课程表Web应用程序 总结 这两段没有什么可说的 好了,祝你好运。
|
|
CALENDER
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 |
|
常用链接
留言簿(1)
随笔档案
文章档案
搜索
最新评论
阅读排行榜
评论排行榜
Powered By: 博客园 模板提供:沪江博客
|