【不太可取】FreeBSD下如何添加新硬盘

以下方法一般很少用,有人反映此方法不可取的,这里帖出来,只供参考的

习惯了windows的人一到FreeBSD的时候,由于还没有领会到unix下的高效和工作方式,往往会觉得FreeBSD下的一些工作非常耐烦,不直 观,不高效,比如硬盘的添加就是其中一项。需要指出的是,这是一种误解,下面我将详细来说明一下FreeBSD下硬盘的准备、文件系统创建等问题。

FreeBSD下添加硬盘一般有三个步骤,即:fdisk disklabel newfs。如果不需要考虑和别的系统共用一个硬盘那么就只有两个步骤,即:disklabel newfs。同时为了先删除原来的分区,先要进行一个准备工作。下面将就每一个步骤详细说明:

注意:为了说明方便以一个设备名为ad2的硬盘为例,参数如下:
******* Working on device /dev/ad2 *******
parameters extracted from in-core disklabel are:
cylinders=3618 heads=15 sectors/track=63 (945 blks/cyl)
如果你参照这篇文章进行操作,请把ad2换成对应的设备文件

1、准备步骤
# dd if=/dev/zero of=/dev/ad2 bs=1k count=1
上面这行命令的作用是把一个大小为1k的全为0的文件写入到ad2的第一个扇区中,我们知道第一个扇区是主引导区,运行上面这个命令后就等于把原来的主引导区给删了。删除后的分区表为:

******* Working on device /dev/ad2 *******
parameters extracted from in-core disklabel are:
cylinders=3618 heads=15 sectors/track=63 (945 blks/cyl)

Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=3618 heads=15 sectors/track=63 (945 blks/cyl)

fdisk: invalid fdisk partition table found
Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
<UNUSED>
The data for partition 2 is:
<UNUSED>
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
start 63, size 3418947 (1669 Meg), flag 80 (active)
beg: cyl 0/ head 1/ sector 1;
end: cyl 545/ head 14/ sector 63

可以看到要像这个硬盘有一个分区,这个分区覆盖了整个硬盘,这是初始状态,先不用管它。这种效果和使用
# fdisk -I
的效果是一样的。(下面会说到)

2、fdisk
fdisk -I //创建一个覆盖整个硬盘的FreeBSD分区
fdisk -B //初始化引导区
-b //初始化引导区时用这个指定引导区文件,比如:fdisk -B -b /boot/boot0
fdisk -i //进行分区
fdisk -t //测试模式

在fdisk的阶阶段,一般使用
# fdisk -i ad2
进入分区状态,它会一个一个地问你关于四个主分区的设置。在这个阶段比较难的在于计算分区大小和设置分区类型(sysid):
1)计算分区大小
磁盘的总容量=cylinders * heads * sectors/track
本例中就是 3618 * 15 * 63 = 3419010

每个磁盘中的头64个扇区是引导区,因此:
实际可用容量= 总容量 - 63 //为什么不是64?因为是0 - 63
所以第一个分区要从63开始。以后的各个分区依此类推就可以了。

2)分区类型(sysid)

查看/usr/src/sbin/fdisk/fdisk.c中的130到214行,这里也附上:
0x00 unused
0x01 Primary DOS with 12 bit FAT
0x02 XENIX / file system
0x03 XENIX /usr file system
0x04 Primary DOS with 16 bit FAT (< 32MB)
0x05 Extended DOS
0x06 Primary 'big' DOS (>= 32MB)
0x07 OS/2 HPFS, NTFS, QNX-2 (16 bit) or Advanced UNIX
0x08 AIX file system or SplitDrive
0x09 AIX boot partition or Coherent
0x0A OS/2 Boot Manager, OPUS or Coherent swap
0x0B DOS or Windows 95 with 32 bit FAT
0x0C DOS or Windows 95 with 32 bit FAT (LBA)
0x0E Primary 'big' DOS (>= 32MB, LBA)
0x0F Extended DOS (LBA)
0x10 OPUS
0x11 OS/2 BM: hidden DOS with 12-bit FAT
0x12 Compaq diagnostics
0x14 OS/2 BM: hidden DOS with 16-bit FAT (< 32MB)
0x16 OS/2 BM: hidden DOS with 16-bit FAT (>= 32MB)
0x17 OS/2 BM: hidden IFS (e.g. HPFS)
0x18 AST Windows swapfile
0x24 NEC DOS
0x3C PartitionMagic recovery
0x39 plan9
0x40 VENIX 286
0x41 Linux/MINIX (sharing disk with DRDOS)
0x42 SFS or Linux swap (sharing disk with DRDOS)
0x43 Linux native (sharing disk with DRDOS)
0x4D QNX 4.2 Primary
0x4E QNX 4.2 Secondary
0x4F QNX 4.2 Tertiary
0x50 DM (disk manager)
0x51 DM6 Aux1 (or Novell)
0x52 CP/M or Microport SysV/AT
0x53 DM6 Aux3
0x54 DM6
0x55 EZ-Drive (disk manager)
0x56 Golden Bow (disk manager)
0x5c Priam Edisk (disk manager) /* according to S. Widlake */
0x61 SpeedStor
0x63 System V/386 (such as ISC UNIX), GNU HURD or Mach
0x64 Novell Netware/286 2.xx
0x65 Novell Netware/386 3.xx
0x70 DiskSecure Multi-Boot
0x75 PCIX
0x77 QNX4.x
0x78 QNX4.x 2nd part
0x79 QNX4.x 3rd part
0x80 Minix until 1.4a
0x81 Minix since 1.4b, early Linux partition or Mitac disk manager
0x82 Linux swap or Solaris x86
0x83 Linux native
0x84 OS/2 hidden C: drive
0x85 Linux extended
0x86 NTFS volume set??
0x87 NTFS volume set??
0x93 Amoeba file system
0x94 Amoeba bad block table
0x9F BSD/OS
0xA0 Suspend to Disk
0xA5 FreeBSD/NetBSD/386BSD
0xA6 OpenBSD
0xA7 NeXTSTEP
0xA9 NetBSD
0xAC IBM JFS
0xB7 BSDI BSD/386 file system
0xB8 BSDI BSD/386 swap
0xC1 DRDOS/sec with 12-bit FAT
0xC4 DRDOS/sec with 16-bit FAT (< 32MB)
0xC6 DRDOS/sec with 16-bit FAT (>= 32MB)
0xC7 Syrinx
0xDB CP/M, Concurrent CP/M, Concurrent DOS or CTOS
0xE1 DOS access or SpeedStor with 12-bit FAT extended partition
0xE3 DOS R/O or SpeedStor
0xE4 SpeedStor with 16-bit FAT extended partition < 1024 cyl.
0xEB BeOS file system
0xEE EFI GPT
0xEF EFI System Partition
0xF1 SpeedStor
0xF2 DOS 3.3+ Secondary
0xF4 SpeedStor large partition
0xFE SpeedStor >1024 cyl. or LANstep
0xFF Xenix bad blocks table

2、disklabel
这个阶段是和windows最不一样的。其实这就是FreeBSD下的分区工具,没有什么神秘的。
这里需要搞清楚的是,fdisk的分区和disklabel的分区,fdisk分的区是磁盘的分区,而disklabel的分区是在fdisk的分区中再分出FreeBSD的分区。

在disklabel中分区,相当于在一个文件中把你要怎么分区写好,也就是所谓的“磁盘标签”。一般在两个步骤:
1)为每个fdisk分区创建disklabel
# disklabel -w ad2s1 auto
后面的auto是指磁盘的类型,如果不很少见的硬盘,就象上面一样直接指定为auto就可以了。

2)分区
# disklabel -e ad2s1
# /dev/ad2:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 3419720 0 4.2BSD 2048 16384 28552
c: 3419720 0 unused 0 0 # "raw" part, don't edit

上面就是我的ad2的disklabel,我只分了一个区。说明如下:
一个fdisk分区里只能分8个区,也就是a b c d e f g h,所以在指定分区字母的时候,不要超出这个范围。
size:不用说了,就是指分区的大小,最大不要超过c中的数值。
offset:偏移量,说白了,就是说明这个分区从什么地方开始的,这个数值是相对于这个fdisk分区来说的,是一个相对量,可认从0开始。
fstype:有四种选择
unused:一般就用在c上,不用于真正的文件系统。
4.2BSD:文件系统都需要使用这个选项。
swap:交换区
vinum:做RAID用的
后面的fsize等用默认值就可以了,如果定要知道的话man disklabel

3 newfs
这就是所谓的创建文件系统。
# newfs -U /dev/ad2s1 //加上-U是加是softupdate支持
如果要使用fat32分区
# newfs_msdos -F 32 /dev/ad2s1

ok就是这样,不难吧!!!!

FreeBSD添加硬盘,方法三

##在添加物理硬盘后操作:

/stand/sysinstall

选择configure-->进入下一级菜单

选择FDisk-->进入下一级菜单
选择要分区的硬盘;进而磁盘分片界面;
进行分片(create slice)操作;并保存W(write);
系统提示选择磁盘加载模式,选择"standard"

选择Disklabel-->进而磁盘分区界面;
C(Create)创建分区;
M (M = Mount pt.)定义分区的加载点;    #这步非常关键!
W (write);存盘                  #根据提示选择Yes,系统会调用Newfs进行分区;成功后用df -h查看可以发现新分区已经加载;
#步骤安装系统时的分区过程;要记录下磁盘设备名和加载点;

# 注意:如果你的系统以前有一个分区为/opt/data,现在要加载一个分区为/opt/data1,在此步骤操作中,系统界面mount项只会显示 /dev/ad1s1e   /opt/data;故此,定义分区的加载点的步骤是否关键,容易使管理员在视觉上混淆概念;

更改分区表文件
vi /etc/fstab
# See the fstab(5) manual page for important information on automatic mounts
# of network filesystems before modifying this file.
#
# Device                 Mountpoint       FStype   Options          Dump     Pass#
/dev/ad0s1b              none             swap     sw               0        0
/dev/ad0s1a              /                ufs      rw               1        1
/dev/ad0s1h              /opt             ufs      rw               2        2
/dev/ad0s1d              /opt/data                ufs      rw               2        2
/dev/ad0s1g              /tmp             ufs      rw               2        2
/dev/ad0s1e              /usr             ufs      rw               2        2
/dev/ad0s1f              /var             ufs      rw               2        2
/dev/acd0c               /cdrom           cd9660   ro,noauto        0        0
proc                     /proc            procfs   rw               0        0
#添加如下这条,输入磁盘设备名,加载点,文件类型,读写权限,启动级别等;
/dev/ad1s1e              /opt/data1       ufs      rw               3        3

FreeBSD下如何添加新硬盘(多方法)

使用 sysinstall

在使用 sysinstall 来设定新的硬盘之前,请先确定您是以 root 身份执行。接下来,您就可以依照下列步骤来新增硬盘:

进入 sysinstall

进入 sysinstall 的主选单后,首先请选择 [Configure],进入后,再选择 [Fdisk] 项目以进入 Fdisk 选单。第一次进入 Fdisk 时,sysinstall 会要求您选择所要设定的硬盘,请选择 ad1。

使用 Fdisk

相信您对于 Fdisk 的画面应该很熟悉,我们在安装 FreeBSD 时就使用过它。如果您要让 FreeBSD 使用整个硬盘,请按 [A],接下来请按 [W] 以将设定写入硬盘。在按了 [W] 后,会出现一个确认的窗口,选 [Yes] 即可。最后会出现要您选择所要使用的 Boot Manager,因为这一个硬盘不是要用来开机用的,所以我们选 [None]。写入后,请按 [Q] 离开 Fdisk 的画面,并回到 Configure 画面。接着请离开 sysinstall,再重新执行 sysinstall 以让 sysinstall 重新侦测硬盘设定。

使用 Disk Label Editor

重新执行 sysinstall 后,请选择 [Configure] -> [Label] 以进入 Disk Label Editor。Disk Label Editor 会帮我们在 Slice 下切割 Partition 并格式化硬盘。在 Disk Label Editor 中,我最多可以建八个分割区 (Partition),编号从 a 到 h。不过有的代号有特殊用途。例如,分割区 a 通常会保留给根目录使用,所以我们开机时所使用的分割区代号会是 a。而代号 b 表示是 swap partition,我们可以在多个硬盘中都有 swap partition。代号 c 是用来表示整个硬盘或是整个 Slice。所以最后 d-h 才是一般我们会使用到的分割区代号。

我们要让 FreeBSD 使用整个硬盘,所以必须将整个 Slice 切成一个 Partition。所以一进入 Disk Label Editor 后,请按 [C],在画面上会显示整个 Slice 的大小,直接按 Enter 即可建立一个分割区。接下来,我们必须选择所要挂入本分割区的目录,请选择 FS 后,再输入您所要挂入的目录,例如 /volume1。如果是在安装 FreeBSD 时,我们所设定的挂入点会被写到 /etc/fstab 中,开机后就会自动将磁盘挂入该目录。但是我们这里所指定的挂入点并不会被写入 /etc/fstab 中,最后我们还是必须再设定 /etc/fstab。

最后请按 [W]以进行分割及格式化。完成后,系统会将该才所建立的磁盘挂入您所指定的目录下。接着请离开 sysinstall 回到命令列。

设定 /etc/fstab

为了让系统在开机时可以自动将此分割区挂入,我们必须再设定 /etc/fstab。请在 /etc/fstab 中增加下列数据:

# Device Mountpoint FStype Options Dump Pass#
/dev/ad1s1d /volume1 ufs rw 2 2

6.4.2 使用命令列

您不一定要使用 sysinstall 来分割及格式化硬盘,sysinstall 只是提供一个比较容易使用的界面,最后还是会呼叫命令列的指令以完成硬盘的设定。使用命令列的方式比较复杂,而且较容易出错,但却可以让您有更灵活的应 用。看了如何从命令列新增一个硬盘可以让您对 sysinstall 所做的事更了解。

我们一样假设要新增的硬盘为 ad1,并且将整个硬盘切成一个扇区给 FreeBSD 使用。第一步要做的就是先使用 dd 这个指令来清除硬盘上旧的设定:

# dd if=/dev/zero of=/dev/ad1 bs=1k count=1
上述指令的意思是从 /dev/zero 这个装置读出数据写到 /dev/ad1 中,每次写入的 block size (bs) 为 1KB,做一次写入的动作即可 (count)。我们知道 FreeBSD 各动硬件装置当做档案来看待,/dev/zero 这个档案其实是一个虚拟的档案,我们从这个档案读出来的数据都是 0。上述指令的动作的目的就是要将硬盘 ad1 的开头 1024KB 清成 0,而硬盘开头的部份存放的就是一些分割区设定的数据 (Partition Table)。

接下来呢我们就必须使用 fdisk 这个指令来切割 slice 了:

# fdisk -BI ad1
******* Working on device /dev/ad1 *******
fdisk: invalid fdisk partition table found

上述 fdisk 指令表示我们要将 ad1 切割成一个 slice (参数 -I),并清除放开机信息的第 0 个 sector。您可以忽略「invalid fdisk partition table found」的警告,因为我们一开始并没有任何分割区。接下来我们就可以使用下列 bsdlabel 指令来建立预设的 partition label,再使用 bsdlabel 加参数 e 以修改建立的 lable:

# bsdlabel -B -w ad1s1 auto
# bsdlabel -e ad1s1

接着会使用您预设的文书编辑软件跳出一个窗口,请将 a: 改成 d: 后存档离开,因为我们新增加的分割区不是要给根目录使用,所以不用代号 a,而是使用第一个不具特别意义的代号 d。

# /dev/ad1s1:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
d: 78156146 16 unused 0 0
c: 78156162 0 unused 0 0 # "raw" part, don't edit

将 a: 改成 d: 后,存档离开即可。接下来我们就可以格式化这一个分割区了。FreeBSD 中用来格式化 UFS 档案系统的指令为 newfs:

# newfs /dev/ad1s1d
以上即为新增一颗硬盘所要做的事。请注意,bsdlabel 这个指令是 FreeBSD 5.1 以后才有的,在 5.1 以前,请使用 disklabel。

接下来您就可以将新的硬盘挂入了,假设您要挂入的目录是 /volume1,则请使用下列指令:

# mkdir /volume1
# mount /dev/ad1s1d /volume1
最后,如果您希望一开机就将此分割区挂入,请修改 /etc/fstab,并加入此分割区的设定。

指导:手工实现FreeBSD添加新硬盘(命令行方法)

基础知识

FreeBSD分区描述符为从"a"到"h"的8个字母。根据惯例,分区"c"被保留用作描述整个磁盘,"a"用作标识根分区,"b"用作标识交换分区。对于新添加的硬盘,我们常常只建立一个分区,标识为"e"。
IDE硬盘标记为ad,而SCSI硬盘标记为da,从0开始计数,因此,我们新添加的IDE硬盘将作为ad1出现在系统中。

一般步骤

把新的IDE硬盘接入系统,并确认开机以后系统找到了新添加的硬盘。可以通过检查/var/run/dmesg.boot来确认系统是否找到新添加的硬盘。
准备

vms# dd if=/dev/zero of=/dev/rad1 bs=1k count=1
1+0 records in
1+0 records out
1024 bytes transferred in 0.000822 secs (1245640 bytes/sec)
vms#

初始化磁盘

vms# fdisk -BI ad1
******* Working on device /dev/ad1 *******
fdisk: invalid fdisk partition table found
vms#

建立FreeBSD分区

vms# disklabel -B -w -r ad1s1 auto
vms# Feb 23 14:01:40 /kernel: ad1: cannot find label (no disk label)
Feb 23 14:01:40 /kernel: ad1s1: cannot find label (no disk label)
Feb 23 14:01:40 /kernel: ad1: cannot find label (no disk label)
Feb 23 14:01:40 /kernel: ad1s1: cannot find label (no disk label)
vms#

建立逻辑分区

vms# disklabel -e ad1s1

type: unknown
disk: amnesiac
label:
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 18931
sectors/unit: 19083393
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # milliseconds
track-to-track seek: 0 # milliseconds
drivedata: 0

8 partitions:
# size offset fstype [fsize bsize bps/cpg]
c: 19083393 0 unused 0 0 # (Cyl. 0 - 18931*)
e: 19083393 0 4.2BSD 4096 8192 16 # (Cyl. 0 - 18931*)

格式化分区,创建文件系统

vms# newfs /dev/ad1s1e
Warning: Block size and bytes per inode restrict cylinders per group to 67.
Warning: 3968 sector(s) in last cylinder unallocated
/dev/ad1s1e: 19083392 sectors in 4660 cylinders of 1 tracks, 4096 sectors
9318.1MB in 70 cyl groups (67 c/g, 134.00MB/g, 8512 i/g)
super-block backups (for fsck -b #) at:
32, 274464, 548896, 823328, 1097760, 1372192, 1646624, 1921056, 2195488, 2469920, 2744352, 3018784, 3293216, 3567648,
3842080, 4116512, 4390944, 4665376, ...

加载分区

vms# mkdir -p /disk1
vms# mount -t ufs /dev/ad1s1e /disk1

Got error 134 from storage engine

今天将原网站数据导入新系统的时候,发现用户表是空的,程序前几天很正常的,并没有做任何修改,于是将程序的高度模式打开,发现得到错误提示:"Got error 134 from storage engine",进到mysql里执行select * from tbl_member limit 100,我没有发现错误的,不过将语句若修改为select * from tbl_member limit 100,10时,又出现了这个错误提示信息,怀疑是mysql表损坏,由于备份的时候,mysql处于运行使用状态,并没有停止服务的,所以才产生了这个错误的
于是用 repair table tablename命令修复了次用户表,再次执行上述命令,ok,显示执行成功

ajax处理过程,ajax入门,XMLHttpRequest对象

XMLHttpRequest对象是当今所有AJAX和Web 2.0应用程序的技术基础。尽管软件经销商和开源社团现在都在提供各种AJAX框架以进一步简化XMLHttpRequest对象的使用;但是,我们仍然很有必要理解这个对象的详细工作机制。

一、 引言

异步JavaScript与XML(AJAX)是一个专用术语,用于实现在客户端脚本与服务器之间的数据交互过程。这一技术的优点在于,它向开发者提 供了一种从Web服务器检索数据而不必把用户当前正在观察的页面回馈给服务器。与现代浏览器的通过存取浏览器DOM结构的编程代码 (JavaScript)动态地改变被显示内容的支持相配合,AJAX让开发者在浏览器端更新被显示的HTML内容而不必刷新页面。换句话说,AJAX可 以使基于浏览器的应用程序更具交互性而且更类似传统型桌面应用程序。

Google的Gmail和Outlook Express就是两个使用AJAX技术的我们所熟悉的例子。而且,AJAX可以用于任何客户端脚本语言中,这包括JavaScript,Jscript和VBScript。

AJAX利用一个构建到所有现代浏览器内部的对象-XMLHttpRequest-来实现发送和接收HTTP请求与响应信息。一个经由 XMLHttpRequest对象发送的HTTP请求并不要求页面中拥有或回寄一个<form>元素。AJAX中的"A"代表了"异步",这意味着 XMLHttpRequest对象的send()方法可以立即返回,从而让Web页面上的其它HTML/JavaScript继续其浏览器端处理而由服务 器处理HTTP请求并发送响应。尽管缺省情况下请求是异步进行的,但是,你可以选择发送同步请求,这将会暂停其它Web页面的处理,直到该页面接收到服务 器的响应为止。

微软在其Internet Explorer(IE) 5中作为一个ActiveX对象形式引入了XMLHttpRequest对象。其他的认识到这一对象重要性的浏览器制造商也都纷纷在他们的浏览器内实现了 XMLHttpRequest对象,但是作为一个本地JavaScript对象而不是作为一个ActiveX对象实现。而如今,在认识到实现这一类型的价 值及安全性特征之后,微软已经在其IE 7中把XMLHttpRequest实现为一个窗口对象属性。幸运的是,尽管其实现(因而也影响到调用方式)细节不同,但是,所有的浏览器实现都具有类似 的功能,并且实质上是相同方法。目前,W3C组织正在努力进行XMLHttpRequest对象的标准化,并且已经发行了有关该W3C规范的一个草案。

本文将对XMLHttpRequest对象API进行详细讨论,并将解释其所有的属性和方法。

二、 XMLHttpRequest对象的属性和事件

XMLHttpRequest对象暴露各种属性、方法和事件以便于脚本处理和控制HTTP请求与响应。下面,我们将对此展开详细的讨论。
readyState属性

当XMLHttpRequest对象把一个HTTP请求发送到服务器时将经历若干种状态:一直等待直到请求被处理;然后,它才接收一个响应。这样以 来,脚本才正确响应各种状态-XMLHttpRequest对象暴露一个描述对象的当前状态的readyState属性,如表格1所示。

表格1.XMLHttpRequest对象的ReadyState属性值列表。

ReadyState取值 描述
0
描述一种"未初始化"状态;此时,已经创建一个XMLHttpRequest对象,但是还没有初始化。
1
描述一种"发送"状态;此时,代码已经调用了XMLHttpRequest open()方法并且XMLHttpRequest已经准备好把一个请求发送到服务器。
2
描述一种"发送"状态;此时,已经通过send()方法把一个请求发送到服务器端,但是还没有收到一个响应。
3
描述一种"正在接收"状态;此时,已经接收到HTTP响应头部信息,但是消息体部分还没有完全接收结束。
4
描述一种"已加载"状态;此时,响应已经被完全接收。

onreadystatechange事件

无论readyState值何时发生改变,XMLHttpRequest对象都会激发一个readystatechange事件。其 中,onreadystatechange属性接收一个EventListener值-向该方法指示无论readyState值何时发生改变,该对象都将 激活。

responseText属性

这个responseText属性包含客户端接收到的HTTP响应的文本内容。当readyState值为0、1或2时,responseText包 含一个空字符串。当readyState值为3(正在接收)时,响应中包含客户端还未完成的响应信息。当readyState为4(已加载)时,该 responseText包含完整的响应信息。

responseXML属性

此responseXML属性用于当接收到完整的HTTP响应时(readyState为4)描述XML响应;此时,Content-Type头部指 定MIME(媒体)类型为text/xml,application/xml或以+xml结尾。如果Content-Type头部并不包含这些媒体类型之 一,那么responseXML的值为null。无论何时,只要readyState值不为4,那么该responseXML的值也为null。

其实,这个responseXML属性值是一个文档接口类型的对象,用来描述被分析的文档。如果文档不能被分析(例如,如果文档不是良构的或不支持文档相应的字符编码),那么responseXML的值将为null。

status属性

这个status属性描述了HTTP状态代码,而且其类型为short。而且,仅当readyState值为3(正在接收中)或4(已加载)时,这个status属性才可用。当readyState的值小于3时试图存取status的值将引发一个异常。

statusText属性

这个statusText属性描述了HTTP状态代码文本;并且仅当readyState值为3或4才可用。当readyState为其它值时试图存取statusText属性将引发一个异常。

三、 XMLHttpRequest对象的方法

XMLHttpRequest对象提供了各种方法用于初始化和处理HTTP请求,下列将逐个展开详细讨论。

abort()方法

你可以使用这个abort()方法来暂停与一个XMLHttpRequest对象相联系的HTTP请求,从而把该对象复位到未初始化状态。

open()方法

你需要调用open(DOMString method,DOMString uri,boolean async,DOMString username,DOMString password)方法初始化一个XMLHttpRequest对象。其中,method参数是必须提供的-用于指定你想用来发送请求的HTTP方法 (GET,POST,PUT,DELETE或HEAD)。为了把数据发送到服务器,应该使用POST方法;为了从服务器端检索数据,应该使用GET方法。 另外,uri参数用于指定XMLHttpRequest对象把请求发送到的服务器相应的URI。借助于window.document.baseURI属 性,该uri被解析为一个绝对的URI-换句话说,你可以使用相对的URI-它将使用与浏览器解析相对的URI一样的方式被解析。async参数指定是否 请求是异步的-缺省值为true。为了发送一个同步请求,需要把这个参数设置为false。对于要求认证的服务器,你可以提供可选的用户名和口令参数。在 调用open()方法后,XMLHttpRequest对象把它的readyState属性设置为1(打开)并且把responseText、 responseXML、status和statusText属性复位到它们的初始值。另外,它还复位请求头部。注意,如果你调用open()方法并且此 时readyState为4,则XMLHttpRequest对象将复位这些值。

send()方法

在通过调用open()方法准备好一个请求之后,你需要把该请求发送到服务器。仅当readyState值为1时,你才可以调用send()方法;否 则的话,XMLHttpRequest对象将引发一个异常。该请求被使用提供给open()方法的参数发送到服务器。当async参数为true 时,send()方法立即返回,从而允许其它客户端脚本处理继续。在调用send()方法后,XMLHttpRequest对象把readyState的 值设置为2(发送)。当服务器响应时,在接收消息体之前,如果存在任何消息体的话,XMLHttpRequest对象将把readyState设置为 3(正在接收中)。当请求完成加载时,它把readyState设置为4(已加载)。对于一个HEAD类型的请求,它将在把readyState值设置为 3后再立即把它设置为4。

send()方法使用一个可选的参数-该参数可以包含可变类型的数据。典型地,你使用它并通过POST方法把数据发送到服务器。另外,你可以显式地使 用null参数调用send()方法,这与不用参数调用它一样。对于大多数其它的数据类型,在调用send()方法之前,应该使用 setRequestHeader()方法(见后面的解释)先设置Content-Type头部。如果在send(data)方法中的data参数的类型 为DOMString,那么,数据将被编码为UTF-8。如果数据是Document类型,那么将使用由data.xmlEncoding指定的编码串行 化该数据。

setRequestHeader()方法

该setRequestHeader(DOMString header,DOMString value)方法用来设置请求的头部信息。当readyState值为1时,你可以在调用open()方法后调用这个方法;否则,你将得到一个异常。

getResponseHeader()方法

getResponseHeader(DOMString header,value)方法用于检索响应的头部值。仅当readyState值是3或4(换句话说,在响应头部可用以后)时,才可以调用这个方法;否则,该方法返回一个空字符串。

getAllResponseHeaders()方法

该getAllResponseHeaders()方法以一个字符串形式返回所有的响应头部(每一个头部占单独的一行)。如果readyState的值不是3或4,则该方法返回null。

四、 发送请求

在AJAX中,许多使用XMLHttpRequest的请求都是从一个HTML事件(例如一个调用JavaScript函数的按钮 点击(onclick)或一个按键(onkeypress))中被初始化的。AJAX支持包括表单校验在内的各种应用程序。有时,在填充表单的其它内容之 前要求校验一个唯一的表单域。例如要求使用一个唯一的UserID来注册表单。如果不是使用AJAX技术来校验这个UserID域,那么整个表单都必须被 填充和提交。如果该UserID不是有效的,这个表单必须被重新提交。例如,一个相应于一个要求必须在服务器端进行校验的Catalog ID的表单域可能按下列形式指定:

<form name="validationForm" action="validateForm" method="post">
<table>
<tr><td>Catalog Id:</td>
<td>
<input type="text" size="20" id="catalogId" name="catalogId" autocomplete="off" onkeyup="sendRequest()">
</td>
<td><div id="validationMessage"></div></td>
</tr>
</table></form>

前面的HTML使用validationMessage div来显示相应于这个输入域Catalog Id的一个校验消息。onkeyup事件调用一个JavaScript sendRequest()函数。这个sendRequest()函数创建一个XMLHttpRequest对象。创建一个XMLHttpRequest 对象的过程因浏览器实现的不同而有所区别。如果浏览器支持XMLHttpRequest对象作为一个窗口属性(所有普通的浏览器都是这样的,除了IE 5和IE 6之外),那么,代码可以调用XMLHttpRequest的构造器。如果浏览器把XMLHttpRequest对象实现为一个 ActiveXObject对象(就象在IE 5和IE 6中一样),那么,代码可以使用ActiveXObject的构造器。下面的函数将调用一个init()函数,它负责检查并决定要使用的适当的创建方法- 在创建和返回对象之前。

<script type="text/javascript">
function sendRequest(){
var xmlHttpReq=init();
function init(){
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
}
else if (window.ActiveXObject) {
return new ActiveXObject("Microsoft.XMLHTTP");
}
}
</script>

接下来,你需要使用Open()方法初始化XMLHttpRequest对象-指定HTTP方法和要使用的服务器URL。

var catalogId=encodeURIComponent(document.getElementById("catalogId").value);
xmlHttpReq.open("GET", "validateForm?catalogId=" + catalogId, true);

默认情况下,使用XMLHttpRequest发送的HTTP请求是异步进行的,但是你可以显式地把async参数设置为true,如上面所展示的。
在这种情况下,对URL validateForm的调用将激活服务器端的一个servlet,但是你应该能够注意到服务器端技术不是根本性的;实际上,该URL可能是一个 ASP,ASP.NET或PHP页面或一个Web服务-这无关紧要,只要该页面能够返回一个响应-指示CatalogID值是否是有效的-即可。因为你在 作一个异步调用,所以你需要注册一个XMLHttpRequest对象将调用的回调事件处理器-当它的readyState值改变时调用。记 住,readyState值的改变将会激发一个readystatechange事件。你可以使用onreadystatechange属性来注册该回调 事件处理器。

xmlHttpReq.onreadystatechange=processRequest;

然后,我们需要使用send()方法发送该请求。因为这个请求使用的是HTTP GET方法,所以,你可以在不指定参数或使用null参数的情况下调用send()方法。

xmlHttpReq.send(null);

五、 处理请求

在这个示例中,因为HTTP方法是GET,所以在服务器端的接收servlet将调用一个doGet()方法,该方法将检索在URL中指定的catalogId参数值,并且从一个数据库中检查它的有效性。

本文示例中的这个servlet需要构造一个发送到客户端的响应;而且,这个示例返回的是XML类型,因此,它把响应的HTTP内容类型设置为 text/xml并且把Cache-Control头部设置为no-cache。设置Cache-Control头部可以阻止浏览器简单地从缓存中重载页 面。

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
...
...
response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-cache");
}

来自于服务器端的响应是一个XML DOM对象,此对象将创建一个XML字符串-其中包含要在客户端进行处理的指令。另外,该XML字符串必须有一个根元素。

out.println("<catalogId>valid</catalogId>");

【注意】XMLHttpRequest对象的设计目的是为了处理由普通文本或XML组成的响应;但是,一个响应也可能是另外一种类型,如果用户代理(UA)支持这种内容类型的话。

当请求状态改变时,XMLHttpRequest对象调用使用onreadystatechange注册的事件处理器。因此,在处理该响应之前,你的 事件处理器应该首先检查readyState的值和HTTP状态。当请求完成加载(readyState值为4)并且响应已经完成(HTTP状态 为"OK")时,你就可以调用一个JavaScript函数来处理该响应内容。下列脚本负责在响应完成时检查相应的值并调用一个 processResponse()方法。

function processRequest(){
if(xmlHttpReq.readyState==4){
if(xmlHttpReq.status==200){
processResponse();
}
}
}

该processResponse()方法使用XMLHttpRequest对象的responseXML和responseText属性来检索 HTTP响应。如上面所解释的,仅当在响应的媒体类型是text/xml,application/xml或以+xml结尾时,这个 responseXML才可用。这个responseText属性将以普通文本形式返回响应。对于一个XML响应,你将按如下方式检索内容:

var msg=xmlHttpReq.responseXML;

借助于存储在msg变量中的XML,你可以使用DOM方法getElementsByTagName()来检索该元素的值:

var catalogId=msg.getElementsByTagName("catalogId")[0].firstChild.nodeValue;

最后,通过更新Web页面的validationMessage div中的HTML内容并借助于innerHTML属性,你可以测试该元素值以创建一个要显示的消息:

if(catalogId=="valid"){
var validationMessage = document.getElementById("validationMessage");
validationMessage.innerHTML = "Catalog Id is Valid";
}
else
{
var validationMessage = document.getElementById("validationMessage");
validationMessage.innerHTML = "Catalog Id is not Valid";
}

六、 小结

上面就是XMLHttpRequest对象使用的所有细节实现。通过不必把Web页面寄送到服务器而实现数据传送,XMLHttpRequest对象 为客户端与服务器之间提供了一种动态的交互能力。你可以使用JavaScript启动一个请求并处理相应的返回值,然后使用浏览器的DOM方法更新页面中 的数据。

服务器托管一般性设置

本文讲述的是针对BSD系统作为生产系统托管到IDC中时进行的一般性安全、性能方面的设置。希望对那些喜欢使用BSD的朋友有所帮助。限于篇幅的原因,文中没有就具体问题展开的太多,有需要更深了解相关内容的朋友请自行查找相关的资料。限于本人知识的局限错误之处在所难免,希望大家批评指正。作者:LLZQQ
联系:LLZQQ@126.COM
适用:普通用户
来源:WWW.CHINAUNIX.NET

文档目录:

1. 硬件平台选择
2. 系统与版本选择
3. 软件版本选择

Continue reading

FreeBSD7.1-RELEAES提前发布了

官网还没有正式发布新闻,不过在其主FTP站点上已经可以下载光盘映像了,ftp://ftp.freebsd.org/pub/FreeBSD/ISO-IMAGES-amd64/7.1/算是新年的礼物啊。

详细改进及声明: http://www.freebsd.org/releases/7.1R/relnotes.html官方下载同样是3CD或1DVD.当然对于做服务器来说第一张盘就足够了。
这里还有附图啊!喜不喜欢这样的红色小魔鬼呢?

FreeBSD 7.0 安装Nginx

来源:http://bbs.chinaunix.net/viewthread.php?tid=1039563&extra=&page=1

#/usr/ports/www/nginx
#make config
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
x                     Options for nginx 0.5.34                       x
x lqqqqq^(-)qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x
x x [X] HTTP_ADDITION_MODULE  Enable http_addition module          x x
x x [X] HTTP_DAV_MODULE       Enable http_webdav module            x x
x x [X] HTTP_FLV_MODULE       Enable http_flv module               x x
x x [X] HTTP_PERL_MODULE      Enable http_perl module              x x
x x [X] HTTP_REALIP_MODULE    Enable http_realip module            x x
x x [X] HTTP_REWRITE_MODULE   Enable http_rewrite module           x x
x x [X] HTTP_SSL_MODULE       Enable http_ssl module               x x
x x [X] HTTP_STATUS_MODULE    Enable http_stub_status module       x x
x x [X] HTTP_SUB_MODULE       Enable http_sub module               x x
x x [ ] MAIL_MODULE           Enable IMAP4/POP3/SMTP proxy module  x x
x x [ ] MAIL_IMAP_MODULE      Enable IMAP4 proxy module            x x
x x [ ] MAIL_POP3_MODULE      Enable POP3 proxy module             x x
x x [ ] MAIL_SMTP_MODULE      Enable SMTP proxy module             x x
x x [ ] MAIL_SSL_MODULE       Enable mail_ssl module               x x
x x [X] WWW                   Enable html sample files             x x
tqmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqjqu
x                       [  OK  ]       Cancel                        x
mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj

#make install clean