发布新日志

  • apache修改端口号

    2009-07-03 10:37:47

    再安装目录中找到apache的配置文件httpd.conf,代开这个文件,找到listen 80代码,把80改为你自己想设置的端口号。 最后要重启apache。

    注意,配置好了以后一定要重启,不然无效!

  • 启动apache的命令

    2009-07-03 10:29:17

    你可以通过命令行开关来控制Apache服务。要启动一个已经安装的Apache服务,可以使用:
    httpd -k start
    要停止一个已经安装的Apache服务,可以使用:
    httpd -k stop

    httpd -k shutdown
    要重启一个运行中的Apache服务,强制它重新读取配置文件,可以使用:
    httpd -k restart
  • 在MAC机中配置ant

    2009-07-02 11:10:32

    http://ant.apache.org/bindownload.cgi 下载ant,不用担心是不是mac版的,这个是windows和mac机中都可用。

    解压后到底放到哪里呢?usr/bin下的ant链接到了哪里(用命令ls -l sr/bin/ant)。

    localhost:bin root# ls -l /usr/bin/ant
    lrwxr-xr-x  1 root  wheel  22 Feb  6  2009 /usr/bin/ant -> /usr/share/ant/bin/ant

    可以看到原来在mac中ant装在了/usr/share/ant/.  所以可以直接把要用的ant放到这个目录下就可以了。反正我也用不着它的旧的,干脆替换吧。cp -R apache-ant-1.7.1  /usr/share/ant/  (注意:必须是root用户才能有权限的。)好了,查看一下版本吧:ant  -version  你会看到显示的版本信息就是刚才解压的那个。

    其实也可以不用放到/usr/share/ant/下,只要把usr/bin/ant链接到你的ant下就可以了。
  • 巧用Hosts文件封杀IE弹出窗口

    2009-06-30 13:46:03

    近来,好多朋友上网的时候总是会有恶意网页弹出来,用黄山、兔子等工具修复无效,有的甚至重装IE或是重装系统,头疼之极。

    这种情况下可以用下面的办法解决:

    在c:\windows文件夹下(这是Windows 9x系统中,若Windows 2000以上系统则是在“c:\windows\system32\drivers=etc”)或用“查找”功能找到hosts文件,用记事本或写字板打开,添入以下一行,注意IP和域名之间用一个空格间隔开:

    0.0.0.0   (这里填上恶意网站的网址 )

    或者是:

    127.0.0.1 (这里填上恶意网站的网址)

    如:0.0.0.0 
    www.down.com/hosts.asp 或是:127.0.0.1 www.-down.com/hosts.asp

    填好后保存即可。

    这个方法是利用了Hosts文件优先于DNS查询的原则,把该恶意网站的域名指向一个可能不存在的IP地址0.0.0.0或是本机的IP地址127.0.0.1,避开该网站,自然也就不会遇到这个可恶的弹出窗口了。

    如果有多个这样的需屏蔽的网站,可以依据上述方法将其域名与一虚假的IP地址或局域网内的任一IP相连,就可以解决问题。

    Hosts文件是Windows系统中一个负责IP地址与域名快递解析的文件,以ASCII格式保存。计算机在键入域名(比如www.baidu. com)的时候,首先会去看看Hosts文件汇总有没有关于此域名IP地址的记录。如果有,就直接登录该网站;如果没有再查询DNS服务器。Hosts在 Windows 98中是hosts.sam文件,在Windows 2000/XP中则就是Hosts文件,没有扩展名。   

    当然,如果遇到某网站打不开,也可以看看这里,是不是恶意程序把这里改了,把你要看的网站加入到这里了,特别是杀毒软件不能升级,有好多就是这个原因。
  • hosts文件的作用

    2009-06-30 11:39:30

     一. Hosts文件的位置
    很多用户都知道在Window系统中有个Hosts文件(没有后缀名),在Windows 98系统下该文件在Windows文件夹。
    在Windows 2000/XP/Vista系统中位于\%Systemroot%\System32\Drivers\Etc 文件夹中,其中,%Systemroot%指系统安装路径。例如,Windows XP 安装在C:\WINDOWS,那么Hosts文件就在C:\WINDOWS\system32\drivers\etc中。
    你也可以用windows自带的查找功能搜索找到hosts文件。
    该文件其实是一个纯文本的文件,用普通的文本编辑软件如记事本等都能打开和编辑。

    二. Hosts文件的基本内容和语法
    用记事本打开hosts文件,就可以看见了微软对这个文件的说明。Hosts文件文一般有如下面的基本内容

    # Copyright (c) 1993-1999 Microsoft Corp.
    #
    # This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
    #
    # This file contains the mappings of IP addresses to host names. Each
    # entry should be kept on an individual line. The IP address should
    # be placed in the first column followed by the corresponding host name.
    # The IP address and the host name should be separated by at least one
    # space.
    #
    # Additionally, comments (such as these) may be inserted on individual
    # lines or following the machine name denoted by a '#' symbol.
    #
    # For example:
    #
    # 102.54.94.97 rhino.acme.com # source server
    # 38.25.63.10 x.acme.com # x client host

    127.0.0.1 localhost


    这个文件是根据TCP/IP for Windows 的标准来工作的。它的作用是定义IP地址和
    Host name(主机名)的映射关系,是一个映射IP地址和Host name (主机名) 的规定。这个规定中,要求每段只能包括一个映射关系,也就是一个IP地址和一个与之有映射关系的主机名。 IP地址要放在每段的最前面,映射的Host name(主机名)在IP后面,中间用空格分隔。对于这段的映射说明,用“#”分割后用文字说明。

    三. Hosts文件的工作方式
    现在让我们来看看Hosts在Windows中是怎么工作的。
    我们知道在网络上访问网站,要首先通过DNS服务器把要访问的网络域名(XXXX.com)解析成XXX.XXX.XXX.XXX的IP地址后,计算机才能对这个网络域名作访问。
    要是对于每个域名请求我们都要等待域名服务器解析后返回IP信息,这样访问网络的效率就会降低,因为DNS做域名解析和返回IP都需要时间。
    为了提高对经常访问的网络域名的解析效率,可以通过利用Hosts文件中建立域名和IP的映射关系来达到目的。根据Windows系统规定,在进行DNS请求以前,Windows系统会先检查自己的Hosts文件中是否有这个网络域名映射关系。如果有则,调用这个IP地址映射,如果没有,再向已知的DNS服务器提出域名解析。也就是说Hosts的请求级别比DNS高。

    四. Hosts文件的工作方式和具体作用
    现在来看一下Hosts文件的工作方式以及它在具体使用中起哪些作用。

    1、加快域名解析

    对于要经常访问的网站,我们可以通过在Hosts中配置域名和IP的映射关系,提高域名解析速度。由于有了映射关系,当我们输入域名计算机就能很快解析出IP,而不用请求网络上的DNS服务器。

    2、方便局域网用户

    在很多单位的局域网中,会有服务器提供给用户使用。但由于局域网中一般很少架设DNS服务器,访问这些服务器时,要输入难记的IP地址。这对不少人来说相当麻烦。现在可以分别给这些服务器取个容易记住的名字,然后在Hosts中建立IP映射,这样以后访问的时候,只要输入这个服务器的名字就行了。

    3、屏蔽网站

    现在有很多网站不经过用户同意就将各种各样的插件安装到你的计算机中,其中有些说不定就是木马或病毒。对于这些网站我们可以利用Hosts把该网站的域名映射到错误的IP或本地计算机的IP,这样就不用访问了。在WINDOWSX系统中,约定127.0.0.1为本地计算机的IP地址, 0.0.0.0是错误的IP地址。
    如果,我们在Hosts中,写入以下内容:

    127.0.0.1 # 要屏蔽的网站 A

    0.0.0.0 # 要屏蔽的网站 B

    这样,计算机解析域名 A和 B时,就解析到本机IP或错误的IP,达到了屏蔽网站A 和B的目的。

    4、顺利连接系统

    对于Lotus的服务器和一些数据库服务器,在访问时如果直接输入IP地址那是不能访问的,只能输入服务器名才能访问。那么我们配置好Hosts文件,这样输入服务器名就能顺利连接了。

    五. 屏蔽不想访问的网站的例子
    这里给出一些收集到的利用Hosts文件对一些网址屏蔽的例子,共大家学习使用Hosts文件时参考。

    例1.
    在 hosts文件中加入如下内容就可以屏蔽文件中定义的对应的网址。
    127.0.0.1 localhost
    127.0.0.1 download.3721.com
    127.0.0.1 3721.com #3721网络实名
    127.0.0.1 3721.net #3721网络实名
    127.0.0.1 cnsmin.3721.com #3721网络实名
    127.0.0.1 cnsmin.3721.net #3721网络实名
    127.0.0.1 download.3721.com #3721网络实名
    127.0.0.1 download.3721.net #3721网络实名
    127.0.0.1
    www.3721.com #3721网络实名
    127.0.0.1
    www.3721.net #3721网络实名

    例2.
    在 hosts文件中加入如下内容就可以屏蔽文件中定义的对应的网址。
    127.0.0.1 localhost
    127.0.0.1 bar.baidu.com #百度IE搜索伴侣
    127.0.0.1
    www.baidu.com #百度IE搜索伴侣
    127.0.0.1 baidu.com #百度IE搜索伴侣
    例3.
    免疫一些病毒(实际上是屏蔽网站,禁止访问有毒网站从而达到免疫一些已知有毒网站上的病毒)

    # *********免疫机器狗木马病毒******************
    127.0.0.1 yu.8s7.net
    127.0.0.1 1.jopanqc.com
    127.0.0.1 2.joppnqq.com
    127.0.0.1 wg.47255.com
    127.0.0.1 1.joppnqq.com
    127.0.0.1 xxx.m111.biz
    127.0.0.1 1.jopenqc.com
    127.0.0.1 1.jopenkk.com
    127.0.0.1 xxx.vh7.biz
    127.0.0.1 xxx.j41m.com
    127.0.0.1 3.joppnqq.com
    127.0.0.1 d.93se.com
    127.0.0.1
    www.868wg.com
    127.0.0.1 xxx.mmma.biz
    127.0.0.1 ilove.com
    127.0.0.1 tp.shpzhan.cn
    127.0.0.1
    www.tomwg.com
    127.0.0.1 www.cike007.cn
    127.0.0.1 www.22aaa.com
    127.0.0.1 xx.exiao01.com
    127.0.0.1
    www.exiao01.com
    127.0.0.1 www.exiao01.com
    127.0.0.1 new.749571.com
    127.0.0.1 xtx.kv8.info
    127.0.0.1 cao.kv8.info
    127.0.0.1 1.jopmmqq.com
    127.0.0.1 171817.171817.com
    127.0.0.1 d2.llsging.com
    127.0.0.1 down.malasc.cn
    127.0.0.1 llboss.com
    127.0.0.1 nx.51ylb.cn
    127.0.0.1 my.531jx.cn
    127.0.0.1 qqq.dzydhx.com
    127.0.0.1 qqq.hao1658.com
    127.0.0.1
    www.333292.com
    127.0.0.1 down.18dd.net
    127.0.0.1 up.22x44.com
    127.0.0.1 aaa.faba01.com
    127.0.0.1 bad.tqdlt.cn
    127.0.0.1 1.chsipo.com
    127.0.0.1 c3.aishangai.net
    127.0.0.1 c2.aishangai.net
    127.0.0.1 xxx.188dm.com
    127.0.0.1 x2.1a2b3c1.com
    127.0.0.1 d1.163500.net
    127.0.0.1 down.google-serv.cn
    # *********结束******************
    # *********免疫磁碟机dummycom病毒******************
    127.0.0.1 gxgxy.net 127.0.0.1 c0mo.com
    # *********免疫磁碟机dummycom结束******************

    最后要指出的是,Hosts文件配置的映射是静态的,如果网络上的计算机更改了请及时更新IP地址,否则将不能访问。

    妙用您的hosts文档过滤插件和广告

    简述和原理
      在您用IE浏览网页的时候,是否碰到过这样的情况。有的网站会出现自动弹出的广告窗口,而且不止一个,占用了带宽,又很烦人。更有的网站进入时需要为浏览器安装插件的对话框,比如最常见3721网络实名和现在网上恶评如潮的淘宝网弹出广告。这些东西最讨厌,机器慢的时候,为了等待这个对话框弹出,要等很长时间,甚至有时候会让人以为机器死机,而且每次上都会弹出,十分讨厌。有些人提出能够用Maxthon gosurf等利用IE内核的多窗口浏览器来代替IE,这个方法是不错,但是IE的兼容性是最好的,而且IE普及率在90%以上,用的人还是最多的。更有些人提出能够通过修改注册表来解决,但是这种方法难度大,一般人不太懂,而且存在危险性,万一没改好,会给系统稳定造成很大影响。其实,只要改变一个名叫hosts的文档,就能够轻松过滤这些烦人的垃圾,而且方便又安全。

      在修改之前,我们先了解一下访问网站的原理。
      用IE浏览器访问网站时,首先通过网络上的DNS(域名解析服务)服务器把网络域名,也就是通常所说的网址(比如www.sian.com.cn)解析成61.172.201.227的IP地址,然后浏览器才能访问他。对于每个域名请求我们都要等待域名服务器解析后返回IP信息才能访问网站,这样访问网络的效率是比较低的。而根据Windows系统规定,在浏览器进行DNS请求以前,Windows系统会先检查自己的本地硬盘上的hosts文档中是否有这个网址映射关系,假如有就先调用这个IP地址映射,假如没有再向已知的DNS服务器提出域名解析。也就是说Hosts的请求级别比DNS高。Hosts文档中存在这个网址的IP地址映射的话,浏览器就是直接访问这个IP地址,而不去请求DNS解析了。

      动手实战
      搞清楚原理之后,我们就能够动手修改了。
      在Windows 98和me系统下,hosts文档在Windows目录,在Windows 2000/XP系统中位于WinntSystem32DriversEtc目录中。Hosts文档没有后缀名,但是用记事本就能打开。右键单击hosts文档,在“打开方式”中,选择用记事本打开。一般没有修改过的hosts文档,样子如下图。
      
      里面只做了一个映射,将localhost映射到127.0.0.1,也就是本机的IP地址。前面有#号的是说明,不起作用的。现在我们要做的事情,就是将这些插件和广告的网址映射到本机IP地址,这样就不会出现弹出窗口了。

      屏蔽插件
      首先去除3721的安装插件的提示对话框,将3721的网址都映射为127.0.0.1。
      假如您已安装了3721网络实名,先卸载掉。然后再hosts文档中输入以下内容:
      127.0.0.1 www.3721.com
      127.0.0.1 cnsmin.3721.com
      127.0.0.1 download.3721.com
      127.0.0.1 union.3721.com
      127.0.0.1 3721.net
      127.0.0.1 address.3721.com
      127.0.0.1 assistant.3721.com

      这里要注意,IP地址输入完毕,至少输入一个空格后再输入网址,空格多一点没有关系。更有,每行只能输入一个IP地址和网址。格式看下图。

      


      修改完毕后,保存一下。好,现在3721的插件提示窗口已被屏蔽了。我们顺手也把百度的“IE搜索伴侣插件”屏蔽掉吧。在hosts文档中输入以下内容,要注意格式和上面相同,输入完毕要保存一下。
      127.0.0.1 bar.baidu.com
      127.0.0.1 www.baidu.com
      127.0.0.1 baidu.com


      屏蔽图片广告和不良网站
      一般来说,大型的网站,设有专门的广告服务器用来发布广告,有些通过网络盈利的网站,还通过专业的广告发布商来发布,比如世界知名的DoubleClick网络广告。这个时候,我们只要将这些广告服务器的网址映射为本机地址,讨厌的广告就不会弹出来了,而新闻中的图片还是能够正常显示的,不会受到影响。
      下面我们以广告比较多的新浪网为例,在hosts文档中输入以下内容:

      127.0.0.1 ad.sina.com.cn
      127.0.0.1 ad2.sina.com.cn
      127.0.0.1 ad3.sina.com.cn
      127.0.0.1 ad.4sina.com.cn

      保存后再上sina看看,讨厌的广告是不是没有了。

      更有很多网站和门户网站合作,在他们的网页中放置了这些门户网站的图片,都是些交友,短信等讨厌信息。我们也能够屏蔽掉。

      127.0.0.1 sms.sina.com.cn
      127.0.0.1 sms.sohu.com
      127.0.0.1 sms.163.com
      127.0.0.1 sms.tom.com
      127.0.0.1 1www.unionsky.cn
       通过以上配置就能够过滤新浪、搜狐、汤姆和淘宝网的广告,假如您使用的Maxthon浏览器的话,那么过滤淘宝网的广告还要简单,只需在Maxthon里面的“弹出窗口过滤”和“网页内容过滤”里面同时添*unionsky*的过滤条目就能够完全阻止的淘宝广告了。
      家长们通过这个方法还能够屏蔽不良网站,在hosts文档中先输入本机IP地址,也就是127.0.0.1,再输入空格,然后再输入不良网站的网址,以后访问这些不良网站就会自动转回到本机,达到了阻止孩子访问这些不良网站的目的,使他们免受有害信息的侵袭。

      比较特别的flash广告
      很多网站还会有弹出flash广告,更有网页文章中加一块很大flash广告,严重影响打开网页的速度。这个时候靠屏蔽服务器的方法就没有用了。教大家使用一招简单的方法,输入以下内容,输入完毕后保存。
      
      127.0.0.1 http://*.swf

       这样一来,网页中任何的flash都被屏蔽掉了。假如您要上闪客帝国之类的flash网站看flash动画的话,那么能够暂时在这项前面加一个#号,当然,您能够能够通过察看网页的源代码,找出flash广告的地址去屏蔽,但是这样做太耗费时间,不如上面的方法来的方便。

      
       小贴士两则
      1)加快浏览速度的
       修改hosts文档,不但能够屏蔽插件和广告,其实也能够加快打开网页的速度。因为在浏览器进行DNS请求以前,Windows系统会先检查自己的本地硬盘上的hosts文档中是否有这个网址映射关系,假如有就不用请求DNS去解析这个网址了。那么我们将经常上的网站的IP地址在hosts文档中映射一下,以后再浏览该网站的时候,就能够不用请求DNS解析,从而加快了访问速度。
       我以it世界为例,首先要获得网站的IP地址,win98和me在开始菜单—〉运行中输入command,2000/xp输入cmd,打开命令提示符窗口,输入 ping www.it.com.cn


      白色框内的就是it世界网站的IP地址,然后在hosts文档中输入以下内容

      61.145.121.108 www.it.com.cn

      输入完毕后保存,以后再访问it世界网站时,浏览器不会请求DNS解析而是直接调用hosts文档,这样就加快了访问速度。其他网站也能够按照这个方法操作。

      2)安全问题
      针对windows调用hosts文档的机制,有些病毒会采取修改hosts文档来达到某些目的。因此要注意hosts文档的安全性。除了安装杀毒软件之外,在修改和保存hosts文档后,要给hosts文档加上只读属性,防止病毒修改。
      右键单击hosts文档,选择“属性”,弹出属性窗口,在“只读”前面打上勾,按“确定”退出。

      
      寓教于乐,其乐无穷
      其实,现在有不少广告去除软件能够达到去除广告的功能。但是软件只能针对定制的网站进行屏蔽,而且使用起来有诸多不便。有些网站,比如大学的网站,弹出的窗口不是广告,而是通知之类的信息,但是广告去除软件也会一概屏蔽。而使用上面的方法,能够灵活的针对自己的需求进行屏蔽。在使用电脑的过程中,不断学习新知识,能够更好的利用电脑带给我们的便利,当您学会相同新东西,付诸和实践并获得成功,是不是也会有一种成就感呢。在娱乐中学知识,是个学习的好途径。既能放松,又有收获,一举两得。所谓寓教于乐,其乐无穷,也就是这个道理。
  • nfo格式文件介绍

    2009-06-27 18:18:38

    网上流传的d版软件包中,会有一些扩展名为nfo的文件,一般还有一个名叫file_id.diz的文件。那么这些文件有什么用?怎样打开?

    在这些nfo文件中,有一个(通常是体积最大的那个)最重要,它记录了该软件的简单介绍、破解信息、安装说明、以及破解组织自己的一些信息。其余 的nfo文件中所包含的信息要少得多,基本可以忽略。所有这些信息都是英文。“nfo”来自于单词“information”的第2到第4个字母。nfo 文件的作用现在很清楚了,基本就是这些。

    名叫file_id.diz的文件记录了该软件包的全名。这个文件在互联网发展的早期曾发挥过一定的作用,现在已经基本让位于nfo文件,保留它完全是出于一种习惯,或者说保持向前兼容吧。

    nfo文件和file_id.diz的格式是一样的,都是纯文本文件。要查看他们的内容,用写字板之类的文本编辑器就可以了。不过,多数情况下大家用写字板打开nfo文件的时候,都会看到很多乱码,这是什么原因呢?

    要回答这个问题,必须对扩展ASCII有所了解。扩展ASCII共有256个字符,其中0到7f包括了大部分我们常用的字符,如字母、符号等。而 80及以上的字符并不常用到,其中的一部分被用作制表符。通常情况下,中文系统用2个ASCII字符合起来表示一个汉字。但为了不和常用字符冲突,中文系 统用的是80及以上的字符。但问题在于这些字符也包括了制表符等。所以 以前的汉字系统经常有汉字识别的问题。NFO里不仅用到了7f以下的字符, 还大量用到了制表符和非标准换行符。所以如果我们打开一个NFO,经常可以看到所谓的乱码,就是这个原因!这种现象在非英文的操作系统里尤其普遍。


    那么为了正常查看nfo文件的内容,我们需要专用的nfo查看工具。其实现有的nfo查看工具和普通的文本编辑器并没有很多本质上的不同,只是它 们使用标准英文字体来显示文件!借助于它们我们可以正确地看到NFO文件的内容,但是如果nfo文件中有汉字,我们看到的将是乱码。


    如果只想看到nfo文件中的文字信息,用任何一种文本编辑器打开它都可以。 如果想看到nfo文件的真面目,最好用专门的工具。这样的工具现在有很多,网上随便搜一下都可以搜除很多种。这里我们推荐一种:
    DAMN_NFO_Viewer_v2.10.0031_Setup.exe
    在网上可以找到。如果你经常使用Total Commander这个工具,那么可以在网上搜索它的一个插件nfoviewer,这样用起来会更方便一些。 如果实在找不到或不愿意去寻找专门的工具,也还有一个办法。那就是使用dos或windows系统自带的文本编辑工具edit。在dos命令提示符下输入 edit即可。
  • 404错误

    2009-06-27 13:44:35

    注:没有404自主管理的网站很垃圾。只有当你的空间支持自主管理404.htm页面时才可以自定义,否则就是空间商占用了你的404页面来为他做广告了!那么搜索引擎会在你的网站上不断的得到空间商的广告的!

    更多信息

    日志文件的位置

      在默认状态下,IIS把它的日志文件放在%WINDIR\System32\Logfiles文件夹中。

      每个万维网(WWW)站点和FTP站点在该目录下都有一个单独的目录。在默认状态下,每天都会在这些目录下创建日志文件,并用日期给日志文件命名(例如,exYYMMDD.log)。

    HTTP

    1xx-信息提示

      这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx响应。

    100-继续。

    101-切换协议。

    2xx-成功

    这类状态代码表明服务器成功地接受了客户端请求。

    200-确定。客户端请求已成功。

    201-已创建。

    202-已接受。

    203-非权威性信息。

    204-无内容。

    205-重置内容。

    206-部分内容。

    3xx-重定向(通过这个页面可实现强奸搜索引擎)

      客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。

    301-对象已永久移走,即永久重定向。

    302-对象已临时移动。

    304-未修改。

    307-临时重定向。

    4xx-客户端错误

      发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。400-错误的请求。

    401-访问被拒绝。IIS定义了许多不同的401错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在IIS日志中显示:

    401.1-登录失败。

    401.2-服务器配置导致登录失败。

    401.3-由于ACL对资源的限制而未获得授权。

    401.4-筛选器授权失败。

    401.5-ISAPI/CGI应用程序授权失败。

    401.7–访问被Web服务器上的URL授权策略拒绝。这个错误代码为IIS6.0所专用。

    403-禁止访问:IIS定义了许多不同的403错误,它们指明更为具体的错误原因:

    403.1-执行访问被禁止。

    403.2-读访问被禁止。

    403.3-写访问被禁止。

    403.4-要求SSL。

    403.5-要求SSL128。

    403.6-IP地址被拒绝。

    403.7-要求客户端证书。

    403.8-站点访问被拒绝。

    403.9-用户数过多。

    403.10-配置无效。

    403.11-密码更改。

    403.12-拒绝访问映射表。

    403.13-客户端证书被吊销。

    403.14-拒绝目录列表。

    403.15-超出客户端访问许可。

    403.16-客户端证书不受信任或无效。

    403.17-客户端证书已过期或尚未生效。

    403.18-在当前的应用程序池中不能执行所请求的URL。这个错误代码为IIS6.0所专用。

    403.19-不能为这个应用程序池中的客户端执行CGI。这个错误代码为IIS6.0所专用。

    403.20-Passport登录失败。这个错误代码为IIS6.0所专用。

    404-未找到。

    (此页面对于搜索引擎优化非常重要。当搜索引擎在你的网站找不到某个页面时,系统自动对搜索引擎的蜘蛛显示此页面。让搜索引擎的蜘蛛重新回新的页面查找内容。对于搜索引擎优化非常重要)

    404.0-(无)–没有找到文件或目录。

    404.1-无法在所请求的端口上访问Web站点。

    404.2-Web服务扩展锁定策略阻止本请求。

    404.3-MIME映射策略阻止本请求。

    405-用来访问本页面的HTTP谓词不被允许(方法不被允许)

    406-客户端浏览器不接受所请求页面的MIME类型。

    407-要求进行代理身份验证。

    412-前提条件失败。

    413–请求实体太大。

    414-请求URI太长。

    415–不支持的媒体类型。

    416–所请求的范围无法满足。

    417–执行失败。

    423–锁定的错误。

    5xx-服务器错误

    服务器由于遇到错误而不能完成该请求。

    500-内部服务器错误。

    500.12-应用程序正忙于在Web服务器上重新启动。

    500.13-Web服务器太忙。

    500.15-不允许直接请求Global.asa。

    500.16–UNC授权凭据不正确。这个错误代码为IIS6.0所专用。

    500.18–URL授权存储不能打开。这个错误代码为IIS6.0所专用。

    500.100-内部ASP错误。

    501-页眉值指定了未实现的配置。

    502-Web服务器用作网关或代理服务器时收到了无效响应。

    502.1-CGI应用程序超时。

    502.2-CGI应用程序出错。application.

    503-服务不可用。这个错误代码为IIS6.0所专用。

    504-网关超时。

    505-HTTP版本不受支持。

    FTP

    1xx-肯定的初步答复

    这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。

    110重新启动标记答复。

    120服务已就绪,在nnn分钟后开始。

    125数据连接已打开,正在开始传输。

    150文件状态正常,准备打开数据连接。

    2xx-肯定的完成答复

    一项操作已经成功完成。客户端可以执行新命令。200命令确定。

    202未执行命令,站点上的命令过多。

    211系统状态,或系统帮助答复。

    212目录状态。

    213文件状态。

    214帮助消息。

    215NAME系统类型,其中,NAME是AssignedNumbers文档中所列的正式系统名称。

    220服务就绪,可以执行新用户的请求。

    221服务关闭控制连接。如果适当,请注销。

    225数据连接打开,没有进行中的传输。

    226关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。

    227进入被动模式(h1,h2,h3,h4,p1,p2)。

    230用户已登录,继续进行。

    250请求的文件操作正确,已完成。

    257已创建“PATHNAME”。

    3xx-肯定的中间答复

      该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。331用户名正确,需要密码。

    332需要登录帐户。

    350请求的文件操作正在等待进一步的信息。

    4xx-瞬态否定的完成答复

      该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。

    421服务不可用,正在关闭控制连接。如果服务确定它必须关闭,将向任何命令发送这一应答。

    425无法打开数据连接。

    426Connectionclosed;transferaborted.

    450未执行请求的文件操作。文件不可用(例如,文件繁忙)。

    451请求的操作异常终止:正在处理本地错误。

    452未执行请求的操作。系统存储空间不够。

    5xx-永久性否定的完成答复

    该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。500语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。

    501在参数中有语法错误。

    502未执行命令。

    503错误的命令序列。

    504未执行该参数的命令。

    530未登录。

    532存储文件需要帐户。

    550未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。

    551请求的操作异常终止:未知的页面类型。

    552请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。

    553未执行请求的操作。不允许的文件名。

    常见的FTP状态代码及其原因

    150-FTP使用两个端口:21用于发送命令,20用于发送数据。状态代码150表示服务器准备在端口20上打开新连接,发送一些数据。

    226-命令在端口20上打开数据连接以执行操作,如传输文件。该操作成功完成,数据连接已关闭。

    230-客户端发送正确的密码后,显示该状态代码。它表示用户已成功登录。

    331-客户端发送用户名后,显示该状态代码。无论所提供的用户名是否为系统中的有效帐户,都将显示该状态代码。

    426-命令打开数据连接以执行操作,但该操作已被取消,数据连接已关闭。

    530-该状态代码表示用户无法登录,因为用户名和密码组合无效。如果使用某个用户帐户登录,可能键入错误的用户名或密码,也可能选择只允许匿名访问。如果使用匿名帐户登录,IIS的配置可能拒绝匿名访问。

    550-命令未被执行,因为指定的文件不可用。例如,要GET的文件并不存在,或试图将文件PUT到您没有写入权限的目录。

  • Tomcate使用

    2009-06-26 23:15:05

     
    简介

      Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,目前最新版本是6.0.20(截止到2009-03-20)。
      Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5 支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
      Tomcat 很受广大程序员的喜欢,因为它运行时占用的系统资源小,扩展性好,支持负载平衡与邮件服务等开发应用系统常用的功能;而且它还在不断的改进和完善中,任何一个感兴趣的程序员都可以更改它或在其中加入新的功能。
      Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应对HTML 页面的访问请求。实际上Tomcat 部分是Apache 服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
      这里的诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS、Apache等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。

     
    最新版本与规范的对照

      Servlet/JSP_ 规范版本 Apache Tomcat 版本
      ---------------------------------------------
      2.5/2.1____ 6.0.18
      2.4/2.0____ 5.5.25
      2.3/1.2____ 4.1.36
      2.2/1.1____ 3.3.2

     
    常用功能的配置方法
      

      1 启动内存参数的配置
      tomcat/bin/catalina.bat 如果是linux 就是 catalina.sh
      在rem 的后面增加如下参数
      set JAVA_OPTS= -Xms256m -Xmx256m -XX:MaxPermSize=64m
      2 修改Tomcat的JDK目录
      打开tomcat/bin/catalina.bat
      在最后一个rem后面增加
      set JAVA_HOME=C:\Program Files\Java\jdk1.6.0
      3 增加虚拟目录
      /tomcat/conf/server.xml
      第一行是以前默认存在的,第二行是新增的
      <Context path="" docBase="ROOT" debug="0" reloadable="true"></Context>
      <Context path="/jsp/a" reloadable="true" docBase="E:\workplace\www.java2000.net\WebContent" />
      4 GET方式URL乱码问题解决
      打开 tomcat/conf/server.xml
      查找下面这部分,在最后增加一段代码就可以了。
      <Connector port="80" maxHttpHeaderSize="8192"
      .................
      URIEncoding="UTF-8" useBodyEncodingForURI="true"
      ...............
      />
      其中的UTF-8 请根据你的需要自己修改,比如GBK
      5 虚拟主机配置文件
      tomcat/conf/server.xml
      <!-- 默认的主机 -->
      <Host name="localhost" appBase="webapps"
      unpackWARs="true" autoDeploy="true"
      xmlValidation="false" xmlNamespaceAware="false">
      <Context path="" docBase="ROOT" debug="0" reloadable="true"></Context>
      ...
      </host>
      <!-- 以下是新增的虚拟主机 -->
      <Host name="www.java2000.net" appBase="webapps"
      unpackWARs="true" autoDeploy="true"
      xmlValidation="false" xmlNamespaceAware="false">
      <Context path="" docBase="d:/www.java2000.net" debug="0" reloadable="true"></Context>
      <!-- 虚拟目录 -->
      <Context path="/count" docBase="d:/counter.java2000.net" debug="0" reloadable="true"></Context>
      </Host>
      <Host name="java2000.net" appBase="webapps"
      unpackWARs="true" autoDeploy="true"
      xmlValidation="false" xmlNamespaceAware="false">
      <Context path="" docBase="d:/www.java2000.net" debug="0" reloadable="true"></Context>
      <Context path="/count" docBase="d:/counter.java2000.net" debug="0" reloadable="true"></Context>
      </Host>
      6 数据源配置
      比较复杂,各个版本都有所不同,请直接查看 http://java2000.net/p1906,包括tomcat5.0,tomcat5.5x,tomcat6.0的各个版本的配置方法。
      更多关于Tomcat的使用,请看参考资料

     
    Tomcat配置的10个技巧

      1. 配置系统管理(Admin Web Application)
      大多数商业化的J2EE服务器都提供一个功能强大的管理界面,且大都采用易于理解的Web应用界面。Tomcat按照自己的方式,同样提供一个成熟的管理 工具,并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现,当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数,user、group、role的多种数据库管理等。在后续的版本中,这些功能将得 到很大的扩展,但现有的功能已经非常实用了。
      Admin Web Application被定义在自动部署文件:CATALINA_BASE/webapps/admin.xml 。
      必须编辑这个文件,以确定Context中的docBase参数是绝对路径。也就是说, CATALINA_BASE/webapps/admin.xml 的路径是绝对路径。作为另外一种选择,也可以删除这个自动部署文件,而在server.xml文件中建立一个Admin Web Application的context,效果是一样的。不能管理Admin Web Application这个应用,换而言之,除了删除CATALINA_BASE/webapps/admin.xml ,可能什么都做不了。
      如果使用UserDatabaseRealm(默认),将需要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你编辑这个文件,添加一个名叫“admin”的role 到该文件中,如下:
      <role name=“admin”/>
      同样需要有一个用户,并且这个用户的角色是“admin”。象存在的用户那样,添加一个用户(改变密码使其更加安全):
      <user name=“admin” password=“deep_dark_secret” roles=“admin”/>
      当完成这些步骤后,请重新启动Tomcat,访问http://localhost:8080/admin,将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制,并采用了Jakarta Struts框架。一旦作为“admin”角色的用户登录管理界面,将能够使用这个管理界面配置Tomcat。
      2.配置应用管理(Manager Web Application)
      Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面,执行一些简单的Web应用任务。
      Manager Web Application被被定义在一个自动部署文件中:
      CATALINA_BASE/webapps/manager.xml 。
      必须编辑这个文件,以确保context的docBase参数是绝对路径,也就是说CATALINA_HOME/server/webapps/manager的绝对路径。
      如果使用的是UserDatabaseRealm,那么需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来,编辑这个文件,添加一个名为“manager”的角色到该文件中:
      <role name=“manager”>
      同样需要有一个角色为“manager”的用户。像已经存在的用户那样,添加一个新用户(改变密码使其更加安全):
      <user name=“manager” password=“deep_dark_secret” roles=“manager”/>
      然后重新启动Tomcat,访问http://localhost/manager/list,将看到一个很朴素的文本型管理界面,或者访问http: //localhost/manager/html/list,将看到一个HMTL的管理界面。不管是哪种方式都说明你的Manager Web Application现在已经启动了。
      Manager application可以在没有系统管理特权的基础上,安装新的Web应用,以用于测试。如果我们有一个新的web应用位于 /home/user/hello下在,并且想把它安装到 /hello下,为了测试这个应用,可以这么做,在第一个文件框中输入“/hello”(作为访问时的path),在第二个文本框中输入“file: /home/user/hello”(作为Config URL)。
      Manager application还允许停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问,当有用户尝试访问这个被停止的应用时,将 看到一个503的错误——“503 - This application is not currently available”。
      移除一个web应用,只是指从Tomcat的运行拷贝中删除了该应用,如果重新启动Tomcat,被删除的应用将再次出现(也就是说,移除并不是指从硬盘上删除)。
      3.部署一个web应用
      有两个办法可以在系统中部署web服务。
      1> 拷贝WAR文件或者web应用文件夹(包括该web的所有内容)到$CATALINA_BASE/webapps目录下。
      2> 为web服务建立一个只包括context内容的XML片断文件,并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。
      如果有一个WAR文件,想部署它,则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可,文件必须以“。war”作 为扩展名。一旦Tomcat监听到这个文件,它将(缺省的)解开该文件包作为一个子目录,并以WAR文件的文件名作为子目录的名字。接下来,Tomcat 将在内存中建立一个context,就好象在server.xml文件里建立一样。当然,其他必需的内容,将从server.xml中的 DefaultContext获得。
      部署web应用的另一种方式是写一个Context XML片断文件,然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件,而只是一个 context元素,以及对该应用的相应描述。这种片断文件就像是从server.xml中切取出来的context元素一样,所以这种片断被命名为 “context片断”。
      举个例子,如果我们想部署一个名叫MyWebApp.war的应用,该应用使用realm作为访问控制方式,我们可以使用下面这个片断:
      <!--
      Context fragment for deploying MyWebApp.war
      -->
      <Context path=“/demo” docBase=“webapps/MyWebApp.war”
      debug=“0” privileged=“true”>
      <Realm className=“org.apache.catalina.realm.UserDatabaseRealm”
      resourceName=“UserDatabase”/>
      </Context>
      把该片断命名为“MyWebApp.xml”,然后拷贝到CATALINA_BASE/webapps目录下。
      这种context片断提供了一种便利的方法来部署web应用,不需要编辑server.xml,除非想改变缺省的部署特性,安装一个新的web应用时不需要重启动Tomcat。
      4.配置虚拟主机(Virtual Hosts)
      关于server.xml中“Host”这个元素,只有在设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制,对每个域 名而言,都好象独享了整个主机。实际上,大多数的小型商务网站都是采用虚拟主机实现的,这主要是因为虚拟主机能直接连接到Internet并提供相应的带 宽,以保障合理的访问响应速度,另外虚拟主机还能提供一个稳定的固定IP。
      基于名字的虚拟主机可以被建立在任何web服务器上,建立的方法就是通过在域名服务器(DNS)上建立IP地址的别名,并且告诉web服务器把去往不同域 名的请求分发到相应的网页目录。
      在Tomcat中使用虚拟主机,需要设置DNS或主机数据。为了测试,为本地IP设置一个IP别名就足够了,接下来,你需要在server.xml中添加几行内容,如下:
      <Server port=“8005” shutdown=“SHUTDOWN” debug=“0”>
      <Service name=“Tomcat-Standalone”>
      <Connector className=“org.apache.coyote.tomcat4.CoyoteConnector”
      port=“8080” minProcessors=“5” maxProcessors=“75”
      enableLookups=“true” redirectPort=“8443”/>
      <Connector className=“org.apache.coyote.tomcat4.CoyoteConnector”
      port=“8443” minProcessors=“5” maxProcessors=“75”
      acceptCount=“10” debug=“0” scheme=“https” secure=“true”/>
      <Factory className=“org.apache.coyote.tomcat4.CoyoteServerSocketFactory”
      clientAuth=“false” protocol=“TLS” />
      </Connector>
      <Engine name=“Standalone” defaultHost=“localhost” debug=“0”>
      <!-- This Host is the default Host -->
      <Host name=“localhost” debug=“0” appBase=“webapps”
      unpackWARs=“true” autoDeploy=“true”>
      <Context path=“” docBase=“ROOT” debug=“0”/>
      <Context path=“/orders” docBase=“/home/ian/orders” debug=“0”
      reloadable=“true” crossContext=“true”>
      </Context>
      </Host>
      <!-- This Host is the first “Virtual Host”: www.example.com -->
      <Host name=“www.example.com” appBase=“/home/example/webapp”>
      <Context path=“” docBase=“.”/>
      </Host>
      </Engine>
      </Service>
      </Server>
      Tomcat的server.xml文件,在初始状态下,只包括一个虚拟主机,但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的 server.xml版本,其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素,所包含的context元 素中必须有一个是默认的context,这个默认的context的显示路径应该为空(例如,path=“”)。
      5.配置基础验证(Basic Authentication)
      容器管理验证方法控制着当用户访问受保护的web应用资源时,如何进行用户的身份鉴别。当一个web应用使用了Basic Authentication(BASIC参数在web.xml文件中auto-method元素中设置),而有用户访问受保护的web应用时, Tomcat将通过HTTP Basic Authentication方式,弹出一个对话框,要求用户输入用户名和密码。在这种验证方法中,所有密码将被以64位的编码方式在网络上传输。
      注意:使用Basic Authentication通过被认为是不安全的,因为它没有强健的加密方法,除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式(比如, 在一个虚拟私人网络中)。若没有额外的加密方法,网络管理员将能够截获(或滥用)用户的密码。但是,如果是刚开始使用Tomcat,或者你想在你的 web应用中测试一下基于容器的安全管理,Basic Authentication还是非常易于设置和使用的。只需要添加<security-constraint>和<login- config>两个元素到web应用的web.xml文件中,并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加适当的<role>和<user>即可,然后重新启动Tomcat。
      6.配置单点登录(Single Sign-On)
      一旦设置了realm和验证的方法,就需要进行实际的用户登录处理。一般说来,对用户而言登录系统是一件很麻烦的事情,必须尽量减少用户登录验证的 次数。作为缺省的情况,当用户第一次请求受保护的资源时,每一个web应用都会要求用户登录。如果运行了多个web应用,并且每个应用都需要进行单独的 用户验证,那这看起来就有点像在用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统,所有用户也就不知道他们需要访问多少个不 同的应用,只是很迷惑,为什么总要不停的登录。
      Tomcat 4的“single sign-on”特性允许用户在访问同一虚拟主机下所有web应用时,只需登录一次。为了使用这个功能,只需要在Host上添加一个SingleSignOn Valve元素即可,如下所示:
      <Valve className=“org.apache.catalina.authenticator.SingleSignOn”
      debug=“0”/>
      在Tomcat初始安装后,server.xml的注释里面包括SingleSignOn Valve配置的例子,只需要去掉注释,即可使用。那么,任何用户只要登录过一个应用,则对于同一虚拟主机下的所有应用同样有效。
      使用single sign-on valve有一些重要的限制:
      1> value必须被配置和嵌套在相同的Host元素里,并且所有需要进行单点验证的web应用(必须通过context元素定义)都位于该Host下。
      2> 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。
      3> 不能被context中的realm覆盖。
      4> 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式(被定义在web.xml中的<auth-method>中),这比自定 义的验证方式强,Tomcat内置的的验证方式包括basic、digest、form和client-cert。
      5> 如果你使用单点登录,还希望集成一个第三方的web应用到你的网站中来,并且这个新的web应用使用它自己的验证方式,而不使用容器管理安全,那你基本上 就没招了。用户每次登录原来所有应用时需要登录一次,并且在请求新的第三方应用时还得再登录一次。
      6> 单点登录需要使用cookies。
      7.配置用户定制目录(Customized User Directores)
      一些站点允许个别用户在服务器上发布网页。例如,一所大学的学院可能想给每一位学生一个公共区域,或者是一个ISP希望给一些web空间给他的客户,但这又不是虚拟主机。在这种情况下,一个典型的方法就是在用户名前面加一个特殊字符(~),作为每位用户的网站,比如:
      http://www.cs.myuniversity.edu/~username提供两种方法在主机上映射这些个人网站,主要使用一对特殊的Listener元素。Listener的className属性应该是 org.apache.catalina.startup.UserConfig,userClass属性应该是几个映射类之一。如果电脑系统是 Unix,它将有一个标准的/etc/passwd文件,该文件中的帐号能够被运行中的Tomcat很容易的读取,该文件指定了用户的主目录,使用 PasswdUserDatabase 映射类。
      http://members.mybigisp.com/~username
      Tomcat
      <Listener className=“org.apache.catalina.startup.UserConfig”
      directoryName=“public_html”
      userClass=“org.apache.catalina.startup.PasswdUserDatabase”/>
      web文件需要放置在像/home/users/ian/public_html 或者 /users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。
      实际上,这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件,但你又想把一个用户名映射到公共的像/home一样目录的子目录里面,则可以使用HomesUserDatabase类。
      <Listener className=“org.apache.catalina.startup.UserConfig”
      directoryName=“public_html” homeBase=“/home”
      userClass=“org.apache.catalina.startup.HomesUserDatabase”/>
      这样一来,web文件就可以位于像/home/ian/public_html 或者 /home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利,你可以使用一个像c:\home这样的目录。
      这些Listener元素,如果出现,则必须在Host元素里面,而不能在context元素里面,因为它们都用应用于Host本身。
      8.在Tomcat中使用CGI脚本
      Tomcat主要是作为Servlet/JSP容器,但它也有许多传统web服务器的性能。支持通用网关接口(Common Gateway Interface,即CGI)就是其中之一,CGI提供一组方法在响应浏览器请求时运行一些扩展程序。CGI之所以被称为通用,是因为它能在大多数程序 或脚本中被调用,包括:Perl,Python,awk,Unix shell scripting等,甚至包括Java。不会把一个Java应用程序当作CGI来运行,毕竟这样太过原始。一般而言,开发Servlet总 要比CGI具有更好的效率,因为当用户点击一个链接或一个按钮时,不需要从操作系统层开始进行处理。
      Tomcat包括一个可选的CGI Servlet,允许你运行遗留下来的CGI脚本。
      为了使Tomcat能够运行CGI,必须做的几件事:
      1. 把servlets-cgi.renametojar (在CATALINA_HOME/server/lib/目录下)改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。
      2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中,把关于<servlet-name> CGI的那段的注释去掉(默认情况下,该段位于第241行)。
      3. 同样,在Tomcat的CATALINA_BASE/conf/web.xml文件中,把关于对CGI进行映射的那段的注释去掉(默认情况下,该段位于第299行)。注意,这段内容指定了HTML链接到CGI脚本的访问方式。
      4. 可以把CGI脚本放置在WEB-INF/cgi 目录下(注意,WEB-INF是一个安全的地方,你可以把一些不想被用户看见或基于安全考虑不想暴露的文件放在此处),或者也可以把CGI脚本放置在 context下的其他目录下,并为CGI Servlet调整cgiPathPrefix初始化参数。这就指定的CGI Servlet的实际位置,且不能与上一步指定的URL重名。
      5. 重新启动Tomcat,你的CGI就可以运行了。
      在Tomcat中,CGI程序缺省放置在WEB-INF/cgi目录下,正如前面所提示的那样,WEB-INF目录受保护的,通过客户端的浏览器无法窥探 到其中内容,所以对于放置含有密码或其他敏感信息的CGI脚本而言,这是一个非常好的地方。为了兼容其他服务器,尽管你也可以把CGI脚本保存在传统的 /cgi-bin目录,但要知道,在这些目录中的文件有可能被网上好奇的冲浪者看到。另外,在Unix中,请确定运行Tomcat的用户有执行CGI脚本 的权限。
       9.改变Tomcat中的JSP编译器(JSP Compiler)
      在Tomcat 4.1(或更高版本,大概),JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪,但这正是Ant有意为之的一部 分,有一个API文档指导开发者在没有启动一个新的JVM的情况下,使用Ant。这是使用Ant进行Java开发的一大优势。另外,这也意味着你现在能够 在Ant中使用任何javac支持的编译方式,这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的,因为你只需要在<init-param> 元素中定义一个名字叫“compiler”,并且在value中有一个支持编译的编译器名字,示例如下:
      <servlet>
      <servlet-name>jsp</servlet-name>
      <servlet-class>
      org.apache.jasper.servlet.JspServlet
      </servlet-class>
      <init-param>
      <param-name>logVerbosityLevel</param-name>
      <param-value>WARNING</param-value>
      </init-param>
      <init-param>
      <param-name>compiler</param-name>
      <param-value>jikes</param-value>
      </init-param>
      <load-on-startup>3</load-on-startup>
      </servlet>
      当然,给出的编译器必须已经安装在你的系统中,并且CLASSPATH可能需要设置,那处决于你选择的是何种编译器。
      10.限制特定主机访问(Restricting Access to Specific Hosts)
      有时,可能想限制对Tomcat web应用的访问,比如,希望只有指定的主机或IP地址可以访问应用。这样一来,就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效 果,Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve。
      通过配置这两个参数,可以让你过滤来自请求的主机或IP地址,并允许或拒绝哪些主机/IP。与之类似的,在Apache的httpd文件里有对每个目录的允许/拒绝指定。
      可以把Admin Web application设置成只允许本地访问,设置如下:
      <Context path=“/path/to/secret_files” …>
      <Valve className=“org.apache.catalina.valves.RemoteAddrValve”
      allow=“127.0.0.1” deny=“”/>
      </Context>
      如果没有给出允许主机的指定,那么与拒绝主机匹配的主机就会被拒绝,除此之外的都是允许的。与之类似,如果没有给出拒绝主机的指定,那么与允许主机匹配的主机就会被允许,除此之外的都是拒绝的。
  • Java Applet与Java Application的区别

    2009-06-25 11:53:25

    在Java语言中,能够独立运行的程序称为Java应用程序(Application)。Java语言还有另外一种程序——Applet程序。Applet程序(也称Java小程序)是运行于各种网页文件中,用于增强网页的人机交互、动画显示、声音播放等功能的程序。

         Java Applet和Java Application在结构方面的主要区别表现在:

         (1)运行方式不同。Java Applet程序不能单独运行,它必须依附于一个用HTML语言编写的网页并嵌入其中,通过与Java兼容的浏览器来控制执行。Java Application是完整的程序,可以独立运行,只要有支持Java的虚拟机,它就可以独立运行而不需要其他文件的支持。

         (2)运行工具不同。运行Java Applet程序的解释器不是独立的软件,而是嵌在浏览器中作为浏览器软件的一部分。Java Application程序被编译以后,用普通的Java解释器就可以使其边解释边执行,而Java Applet必须通过网络浏览器或者Applet观察器才能执行。

         (3)程序结构不同。每个Java Application程序必定含有一个并且只有一个main方法,程序执行时,首先寻找main方法,并以此为入口点开始运行。含有main方法的那个类,常被称为主类,也就是说,Java Application程序都含有一个主类。而Applet程序则没有含main方法的主类,这也正是Applet程序不能独立运行的原因。尽管Applet没有含main方法的主类,但Applet一定有一个从 java.applet.Applet派生的类,它是由Java系统提供的。

         (4)Java Applet程序可以直接利用浏览器或AppletViewer提供的图形用户界面,而Java Application程序则必须另外书写专用代码来营建自己的图形界面。

        (5)受到的限制不同Java Application程序可以设计成能进行各种操作的程序,包括读/写文件的操作,但是 Java Applet 对站点的磁盘文件既不能进行读操作,也不能进行写 操作。然而,由于 Applet的引入,使Web页面具有动态多媒体效果和可交互性能,这使由名为超文本、实为纯文本的HTML语言编写成的Web页面真正具有了超文本功能,不但可以显示文本信息,而且还可以有各种图片效果和动态图形效果,从而使页面显得生动美丽;另外,Applet使Web页面增加了按钮等功能,从而增加了交互性。

         Java Applet和Java Application在执行方面的主要区别表现在:Java Application一般是在本地机上运行,而Java Applet一般放在服务器上,它是根据本地机的请求被下载到本地机,然后才在本地机上运行。

  • Java control panel 的打开方法

    2009-06-24 16:55:49

    一、如何打开Java控制台

    方法一:通过控制面板

       打开控制面板-->双击java图标,即可打开Java控制面板(Java control panel)。

    方法二:用命令

       1.在“开始”菜单中选择“运行”-->输入cmd,这样就打开了终端。

       2.用cd命令进入到jre安装目录里,如:cd C:\Program Files\Java\jre6

       3.然后进入到bin目录下:cd bin

       4.在bin目录下就可以直接执行命令打开了:javacpl

       这样就打开了java control panel。

     

    [2] How to show Console in Solaris and Linux:

    1) Go to <Java _Install_Folder>/bin
    2) ./ControlPannel
    3) Java Control Pannel will show up
    4) Go to Advance Tab --> Java Console --> Show console

  • keytool用法

    2009-06-23 10:08:44

    http: //java.sun.com/j2se/1.5.0/docs/tooldocs/solaris/keytool.html

    例子:

    keytool -genkey -dname "cn=BeanSoft Studio, u=Java Software, o=BeanSoft Studio, c=China" -alias beansoft -keypass beansoft -storepass beansoft -validity 365 -keystore .\beansoft

    其中:

    CN=commonName
    U=organizationUnit
    O=organizationName
    L=localityName
    S=stateName
    C=country

    ? OU(Organization Unit - 组织单位名称)
    ? O(Organization - 组织名称)
    ? L(Locality - 城市或区域名称)
    ? ST(State - 州或省份名称)
    ? C(Country - 国家名称)

     

  • 如何给jar包进行数字签名

    2009-06-23 09:32:37

    目的:
             为了使Applet或者Java Web Start程序能够访问客户端本地资源,需要对Applet或者JWS程序jar包进行数字签名,之后客户端打开Applet或者JWS程序的时候会提示是否允许该程序访问本地资源,用户如果要用你的程序,当然只能选择OK了。这样你的程序就能按照某种访问权限来访问客户机的本地资源了。

    签名步骤:
             1.将程序打成jar包。
                 这个我就不多说了,用eclipse,netbeans等开发工具很方便就能打包的。

             2.用keytool命令生成.store文件。
                 在任意文件夹下建立一个keytool.bat文件,输入
         
                   keytool -genkey -keystore xxx.keystore -alias xxx -validity 3650

                 保存,双击执行。将在当前目录下生成一个xxx.keystore文件, -alias后接的是别名,-validity后面接的是该证书有效天数,这里3650表示10年。(用这个证书签名的程序10年内有效)。

             3.用jarsigner程序对jar包进行签名。
                新建jarsinger.bat文件,输入

                 jarsigner -keystore xxx.keystore helloworld.jar xxx

                 这样helloworld.jar就被签名了。 

    applet应用程序的数字签名应用实战

       最近在研究applet,打算使用applet来开发一个上传文件上传控件,之前因为一直觉得applet的沙箱控制导致applet不能主动的访问客户端的资源,所以也曾因此而放弃.不过最近在研究applet的签名后,有了点收获,可以通过签名jar文档来达到这样的控制策略,下面是我在实际实验过程中的一些心得和体会,跟大家一起分享下.(注:如果转载此文,请注明出处和作者,尊重作者的劳动成果,谢谢)

    一、压缩你的class类文件为jar包
    1.假设你的需要压缩的类文件存在的包为:cn.mbq.test1和cn.mbq.test2
    2.进入你的classes目录,在DOS窗口中执行命令:jar cf mytest.jar cn.mbq.test1 cn.mbq.test2
    3.执行命令后你会在当前目录中找到mytest.jar文件,这个就是刚才生成的档案文件。你可以修改它的后缀为rar,然后使用winrar压缩程序打开它查看看是否正确。


    二、使用keytool工具生成密匙库
    1.keytool工具位于${java_home}/bin目录下;
    2.在DOS窗口中执行命令:keytool -genkey -keystore mytest.store -alias mbq
      注意:mytest.store 是你的密匙库的名称,可以随意修改,后缀请不要修改!
            mbq 为别名,这个也可以改成自己的名称
    3.执行上述命令后,DOS窗口中会提示你输入keystore的密码、你的姓名、组织单位等等信息。这里要注意的是输入密码请记住,后面要用到的。在最后,我们输入y确认信息。然后再直接回车设置mbq的主密码和store密码一致即可!


    三、使用keytool工具导出签名时用到的证书
    1.在DOS窗口中执行命令:keytool -export -keystore mytest.store -alias mbq -file mbq.cert
      注意:mytest.store 就是第二步生成的密匙库名称
            mbq 也是在第二步中我们指定的别名
            mbq.cert 为我们生成的证书的名称,可以自己修改名称,注意后缀不要改
    2.命令执行成功,我们会在当前目录下找到一个mbq.cert文件,这个就是我们刚才生成的证书。


    四、使用jarsigner工具签名jar压缩文档
    1.jarsigner工具位于${java_home}/bin目录下;
    2.在当前DOS窗口中执行命令:jarsigner -keystore mytest.store mytest.jar mbq
      注意:mytest.store 就是我们在第二步中生成的密匙库名称
            mytest.jar 就是我们这第一步压缩的jar文档
            mbq 是提供者的名称,我们这里设置为我们的别名


    五、创建mytest.policy文件
    1.在当前目录下创建一个mytest.policy文件,其内容如下:
    keystore"file:mytest.store","JKS";
    grantsignedBy"mbq"
    {
    permission java.io.FilePermission"<<ALLFILES>>","read";
    };
    2.这个文件的意思就是说让所有由mbq签名的applet都可以对本地的所有文件进行读操作。


    六、归档文件
        通过上述的五个操作后,我们会在当前目录中找到如下几个文件:mytest.jar-签名后的jar文档、mytest.store-密匙库、mbq.cert-证书、mytest.policy-访问策略文件。如果没有这些文件,那么你的applet数字签名过程就没有正确的完成,请检查上述的操作。以后,如果对打包的java文件做了修改,那么就需要重新签名一次才可以!


    七、在网页中运行applet
    1.假设你的applet中的主启动类为:cn.test.TestApplet.class;整个前面生成的档案文件、证书啊存储在目录:d:\test\myapplet下;
    2.建立一applet_test.html文件存放在任何目录下都可以,然后内容如下:

    Java代码 复制代码
    1. 1 <HTML>...</HTML><HTML>    
    2. 2 <BODY>...</BODY><BODY>    
    3. 3 <APPLET CODEBASE="d:\test\myapplet" CODE="cn.test.TestApplet.class" ARCHIVE="mytest.jar" WIDTH=200 HEIGHT=100 name="myapp">    
    4. 4 </APPLET>    
    5. 5 </BODY>    
    6. 6 </HTML>  



        注意:其中的CODEBASE就是你的类的基础目录,CODE也就是你的APPLET的启动主类,ARCHIVE也就是签名后的JAR文档。
    2.然后在IE中打开该html文件,那么会看到IE提示你是否信任该插件,也就是说我们的证书起作用了,然后确定运行后,就可以在页面上看到applet的运行效果了。

        但是由于SUN和MS的问题,目前IE并不支持最新的JRE,而是使用MS自己开发的JRE,所以这个也是影响APPLET发展壮大的一个原因。而且正是由于这个原因,SUN的java-plugin技术才会出现。使用SUN的java-plugin技术我们就可以在applet中使用最新的JAVA类库了。由于IE在遇到APPLET标签的时候会调用自己的JRE,但是如果客户机器上安装的JRE不是我们想要的版本,那么就会出错了。所谓java-plugin技术就是利用IE的插件机制来制定我们想要的JRE,我们可以在IE中使用OBJECT标签来调用APPLET,这样就不会引用MS的JRE了,从而达到我们想要的效果,而且java-plugin技术不仅仅支持IE,还支持Navigator等浏览器。不过我们需要编写比较复杂的HTML代码了,但是这一且SUN已经帮我们做到了,呵呵,在JDK1.4或更高的版本中SUN提供了一个HtmlConverter.exe工具来帮助将包含applet标签的html转换成包含OBJECT和EMBED标签的html代码,该工具位于${java_home}/bin目录下,对于1.4以前的版本该工具则是单独提供的,不过现在几乎都是1.4或1.5甚至更高版本的JDK了吧,呵呵。

        该工具很简单,是图形化的工具,我们直接运行即可。比如我将上面的包含applet的html转换后(比如我选择只支持IE的),其代码变成了如下:

    Java代码 复制代码
    1. 01 <HTML>...</HTML><HTML>    
    2. 02 <BODY>...</BODY><BODY>    
    3. 03 <!--"CONVERTED_APPLET"-->    
    4. 04 <!-- HTML CONVERTER -->    
    5. 05 <object    
    6. 06     classid = "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"    
    7. 07     codebase = "http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=5,0,0,3"    
    8. 08     WIDTH = 200 HEIGHT = 100 NAME = "myapp" >    
    9. 09     <PARAM NAME = CODE VALUE = "cn.test.TestApplet.class" >    
    10. 10     <PARAM NAME = CODEBASE VALUE = "d:\test\myapplet" >    
    11. 11     <PARAM NAME = ARCHIVE VALUE = "mytest.jar" >    
    12. 12     <PARAM NAME = NAME VALUE = "myapp" >    
    13. 13     <param name = "type" value = "application/x-java-applet;version=1.5">    
    14. 14     <param name = "scriptable" value = "false">    
    15. 15 </object>    
    16. 16 <!--    
    17. 17 <APPLET CODEBASE="d:\test\myapplet" CODE="cn.test.TestApplet.class" ARCHIVE="mytest.jar"    
    18. 18 WIDTH=200 HEIGHT=100 name="myapp">    
    19. 19 </APPLET>    
    20. 20 -->    
    21. 21 <!--"END_CONVERTED_APPLET"-->    
    22. 22 </BODY>    
    23. 23 </HTML>  



        注意其中的OBJECT标签,可以看到APPLET标签已经被注释掉了。其中PARAM NAME=NAME这一行中的myapp就是我们applet应用程序的名称,在IE提示的确认运行中显示的就是这个名称了,我们可以改为自己的公司或组织的名称。然后提示的提供者也就是我们在签名时用到的名称了。

        另外,还要特别注意的就是这个包含OBJECT标签的html页面必须和你的mytest.jar压缩文档放在同一个目录下,这样才可以正确的加载,否则会一直报ClassNotFound的异常的,即使我们在OBJECT标签中指定了CODEBASE也不行,这个是我在测试的时候遇到的问题!


    八、在Internet上应用签名的applet
        如果要把applet部署在网络上,那么最好是采用OBJECT标签的形式,同时也要兼顾采用EMBED标签来支持诸如FF等浏览器。我们把已签名了的mytest.jar和我们的网页放在同一个目录下,至于其他的如mytest.store和mbq.cert可以不用放在一起,至少我在测试的过程中没有放到一起也不会出错,而且在不同的机器上运行的也非常好,可以读取客户端机器的资源!另外,也发现mytest.policy其实也没什么用处,因为这是参考网络上的,而且他们的版本都是1.3左右,所以估计是版本低的缘故吧!


        到此,我们就已经完成了applet的签名到部署,以及到实际的网络应用中了。这样我们使用applet来开发控件时就不会因为无法读取客户端资源而放弃了,呵呵~~

  • 查看电脑配置

    2009-06-19 10:12:38

    <开始> --> <运行> ,输入 dxdiag. 显示的信息比较全。 
  • javaFX 相关软件下载

    2009-06-16 18:14:00

    http://java.sun.com/javafx/downloads/
    这个是官方网站,相关的NetBeans IDE for JavaFx、JavaFX SDK、JavaFX Production Suite 都可以在这下载到。
  • JavaFX Script 编程语言

    2009-06-16 17:49:29

    http://developers.sun.com.cn/javafx/1/tutorials/core/index.html
    在这个网址是javafx script的教程,学习javafx的好地方。
  • jdk下载网站

    2009-06-16 17:32:41

    各种操作系统下的jdk下载地址:

    http://developers.sun.com.cn/download/java_se.html

    sun的中文官方网站是:

    http://developers.sun.com.cn/

    有关java的一些资源可以从这个官方网站找到的。
  • java入门系列视频

    2009-06-15 11:52:14

    Java入门培训系列 - 1
    本集是第一讲,介绍Java开发环境JDK的安装配置,以及第一个简单的Hello程序的编写、编译和运行,希望大家喜欢!
    =====================================
    在线观看: http://www.boobooke.com/v/bbk2667
    =====================================


    Java入门培训系列 - 2
    本集是第2讲,介绍J2SE面向对象编程,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2693
    =======================================


    Java入门培训系列 - 3
    本集是第3讲,继续介绍J2SE面向对象编程,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2703
    =======================================


    Java入门培训系列 - 4
    本集是第4讲,继续介绍J2SE面向对象编程,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2704
    =======================================


    Java入门培训系列 - 5
    本集是第5讲,继续介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2731
    =======================================


    Java入门培训系列 - 6
    本集是第6讲,介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2770
    =======================================


    Java入门培训系列 - 7
    本集是第7讲,继续介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2771
    =======================================


    Java入门培训系列 - 8
    本集是第8讲,继续介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2782
    =======================================


    Java入门培训系列 - 9
    本集是第9讲,继续介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2783
    =======================================


    Java入门培训系列 - 10
    本集是第10讲,继续介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2846
    =======================================


    Java入门培训系列 - 11
    本集是第11讲,继续介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2847
    =======================================


    Java入门培训系列 - 12
    本集是第12讲,继续介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2848
    =======================================


    Java入门培训系列 - 13
    本集是第13讲,继续介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2849
    =======================================


    Java入门培训系列 - 14
    本集是第14讲,继续介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2855
    =======================================


    Java入门培训系列 - 15
    本集是第15讲,继续介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2857
    =======================================


    Java入门培训系列 - 16
    本集是第16讲,继续介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2858
    =======================================


    Java入门培训系列 - 17
    本集是第17讲,继续介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2859
    =======================================


    Java入门培训系列 - 18
    本集是第18讲,继续介绍J2SE基本语法,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2879
    =======================================


    Java入门培训系列 - 19
    本集是第19讲,介绍J2SE流程控制,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2891
    =======================================


    Java入门培训系列 - 20
    本集是第20讲,继续介绍J2SE流程控制,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2892
    =======================================

    Java入门培训系列 - 21
    本集是第21讲,介绍J2SE中的数组,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2916
    =======================================


    Java入门培训系列 - 22
    本集是第22讲,介绍Uavase数组,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2920
    =======================================


    Java入门培训系列 - 23
    本集是第23讲,介绍Uavase数组,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2921
    =======================================

    Java入门培训系列 - 24
    本集是第24讲,介绍Java中的继承,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2927
    =======================================


    Java入门培训系列 - 25
    本集是第25讲,继续介绍Java中的继承,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2928
    =======================================


    Java入门培训系列 - 26
    本集是第26讲,继续介绍Java中的继承,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk2929
    =======================================


    Java入门培训系列 - 27
    本集是第27讲,介绍Java中的方法重载,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk3001
    =======================================

    Java入门培训系列 - 28
    本集是第28讲,介绍Java中的Static与Final,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk3002
    =======================================



    Java入门培训系列 - 29
    本集是第29讲,介绍Java中的Single ,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk3003
    =======================================


    Java入门培训系列 - 30
    本集是第30讲,介绍Java中的枚举  ,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk3048
    =======================================


    Java入门培训系列 - 31
    本集是第31讲,介绍Java中的抽象类 ,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk3049
    =======================================


    Java入门培训系列 - 32
    本集是第32讲,介绍Java中的接口  ,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk3070
    =======================================


    Java入门培训系列 - 33
    本集是第33讲,介绍Java中的异常,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk3057
    =======================================


    Java入门培训系列 - 34
    本集是第34讲,继续介绍Java中的异常,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk3058
    =======================================


    Java入门培训系列 - 35
    这是小生老师的Java系列培训视频,本集是第35讲,介绍Java中的Object,希望大家喜欢!
    =======================================
    在线观看: http://www.boobooke.com/v/bbk3093
    =======================================



  • 开发和测试学习网站汇总

    2009-06-15 09:44:39

    1. 测试和开发网站:http://www.boobooke.com/
    2. 测试网站:http://www.51testing.com
    3. 测试中国论坛:http://www.testingcn.com/
     
     
    5. 豆豆网:http://www.ddvip.com/
  • java exception

    2009-06-12 15:10:11

    关于异常处理的一个问题就是要对何时(when)和如何(how)使用它们做到了然于心。在本文中我将介绍一些关于异常处理的最佳实践,同时我也会涉及到最近争论十分激烈的checked Exception的使用问题。

    作为开发员,我们都希望能写出解决问题并且是高质量的代码。不幸的是,一些副作用(side effects)伴随着异常在我们的代码中慢慢滋生。无庸置疑,没有人喜欢副作用(side effects),所以我们很快就用我们自己的方式来避免它,我曾经看到一些聪明的程序员用下面的方式来处理异常:

    public void consumeAndForgetAllExceptions(){
    try {
    ...some code that throws exceptions
    } catch (Exception ex){
    ex.printStacktrace();
    }
    }

    上边的代码有什么问题么?

    在回答以前让我们想想怎样才是正确的?是的,一旦程序碰到异常,它就该挂起程序而"做"点什么。那么上边的代码是这样子的么?看吧,它隐瞒了什么?它把所有的"苦水"往肚里咽(在控制台打印出异常信息),然后一切继续,从表面上看就像什么都没有发生过一样......,很显然,上边代码达到的效果并不是我们所期望的。

    后来又怎样?

    public void someMethod() throws Exception{
    }

    上边的代码又有什么问题?

    很明显,上边的方法体是空的,它不实现任何的功能(没有一句代码),试问一个空方法体能抛出什么异常?当然Java并不阻止你这么干。最近,我也遇到类似的情景,方法声明会抛出异常,但是代码中并没有任何"机会"来"展示"异常。当我问开发员为什么要这样做的时候,他回答我说"我知道,它确实有点那个,但我以前就是这么干的并且它确实能为我工作。"

    在C++社区曾经花了数年实践来实践如何使用异常,关于此类的争论在 java社区才刚刚开始。我曾经看到许多Java程序员针对使用异常的问题进行争论。如果对于异常处理不当的话,异常可以大大减慢应用程序的执行速度,因为它将消耗内存和CPU来创建、抛出并捕获异常。如果过分的依赖异常处理,代码对易读和易使用这两方面产生影响,以至于会让我们写出上边两处"糟糕"代码。

    异常原理

    大体上说,有三种不同的"情景"会导致异常的抛出:

    l 编程错误导致异常(Exception due Programming errors): 这种情景下,异常往往处于编程错误(如:NullPointerException 或者 IllegalArgumentException),这时异常一旦抛出,客户端将变得无能为力。

    l 客户端代码错误导致异常(Exception due client code errors): 说白点就是客户端试图调用API不允许的操作。

    l 资源失败导致异常(Exception due to resource failures): 如内存不足或网络连接失败导致出现异常等。这些异常的出现客户端可以采取相应的措施来恢复应用程序的继续运行。

    Java中异常的类型

    Java 中定义了两类异常:

    l Checked exception: 这类异常都是Exception的子类

    l Unchecked exception: 这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是特殊的,它们不能通过client code来试图解决,所以称为Unchecked exception

    举个例子,下图为NullPointerException的继承关系:

     

    图中,NullPointerException继承自RuntimeException,所以它是Unchecked exception.

    以往我都是应用checked exception多于Unchecked exception,最近,在java社区激起了一场关于checked exception和使用它们的价值的争论。这场争论起源于JAVA是第一个拥有Checked exception的主流OO语言这样一个事实,而C++和C#都是根本没有Checked exception,它们所有的异常都是unchecked。

    一个checked exception强迫它的客户端可以抛出并捕获它,一旦客户端不能有效地处理这些被抛出的异常就会给程序的执行带来不期望的负担。
    Checked exception还可能带来封装泄漏,看下面的代码:

    public List getAllAccounts() throws
    FileNotFoundException, SQLException{
    ...
    }

    上边的方法抛出两个异常。客户端必须显示的对这两种异常进行捕获和处理即使是在完全不知道这种异常到底是因为文件还是数据库操作引起的情况下。因此,此时的异常处理将导致一种方法和调用之间不合适的耦合。



    接下来我会给出几种设计异常的最佳实践 (Best Practises for Designing the API)

    1. 当要决定是采用checked exception还是Unchecked exception的时候,你要问自己一个问题,"如果这种异常一旦抛出,客户端会做怎样的补救?"
    如果客户端可以通过其他的方法恢复异常,那么这种异常就是checked exception;如果客户端对出现的这种异常无能为力,那么这种异常就是Unchecked exception;从使用上讲,当异常出现的时候要做一些试图恢复它的动作而不要仅仅的打印它的信息,总来的来说,看下表:

    Client's reaction when exception happens
    Exception type

    Client code cannot do anything
    Make it an unchecked exception

    Client code will take some useful recovery action based on information in exception
    Make it a checked exception


    此外,尽量使用unchecked exception来处理编程错误:因为unchecked exception不用使客户端代码显示的处理它们,它们自己会在出现的地方挂起程序并打印出异常信息。Java API中提供了丰富的unchecked excetpion,譬如:NullPointerException , IllegalArgumentException 和 IllegalStateException等,因此我一般使用这些标准的异常类而不愿亲自创建新的异常类,这样使我的代码易于理解并避免的过多的消耗内存。

    2. 保护封装性(Preserve encapsulation)

    不要让你要抛出的checked exception升级到较高的层次。例如,不要让SQLException延伸到业务层。业务层并不需要(不关心?)SQLException。你有两种方法来解决这种问题:

    l 转变SQLException为另外一个checked exception,如果客户端并不需要恢复这种异常的话;

    l 转变SQLException为一个unchecked exception,如果客户端对这种异常无能为力的话;

    多数情况下,客户端代码都是对SQLException无能为力的,因此你要毫不犹豫的把它转变为一个unchecked exception,看看下边的代码:
    public void dataAccessCode(){
    try{
    ..some code that throws SQLException
    }catch(SQLException ex){
    ex.printStacktrace();
    }
    }


    上边的catch块紧紧打印异常信息而没有任何的直接操作,这是情有可原的,因为对于SQLException你还奢望客户端做些什么呢?(但是显然这种就象什么事情都没发生一样的做法是不可取的)那么有没有另外一种更加可行的方法呢?

    public void dataAccessCode(){
    try{
    ..some code that throws SQLException
    }catch(SQLException ex){
    throw new RuntimeException(ex);
    }
    }

    上边的做法是把SQLException转换为RuntimeException,一旦SQLException被抛出,那么程序将抛出RuntimeException,此时程序被挂起并返回客户端异常信息。

    如果你有足够的信心恢复它当SQLException被抛出的时候,那么你也可以把它转换为一个有意义的checked exception, 但是我发现在大多时候抛出RuntimeException已经足够用了。

    3. 不要创建没有意义的异常(Try not to create new custom exceptions if they do not have useful information for client code.)

    看看下面的代码有什么问题?

    public class DuplicateUsernameException
    extends Exception {}


    它除了有一个"意义明确"的名字以外没有任何有用的信息了。不要忘记Exception跟其他的Java类一样,客户端可以调用其中的方法来得到更多的信息。

    我们可以为其添加一些必要的方法,如下:

    public class DuplicateUsernameException
    extends Exception {
    public DuplicateUsernameException 
    (String username){....}
    public String requestedUsername(){...}
    public String[] availableNames(){...}
    }



    在新的代码中有两个有用的方法:reqeuestedUsername(),客户但可以通过它得到请求的名称;availableNames(),客户端可以通过它得到一组有用的usernames。这样客户端在得到其返回的信息来明确自己的操作失败的原因。但是如果你不想添加更多的信息,那么你可以抛出一个标准的Exception:

    throw new Exception("Username already taken");
    更甚的情况,如果你认为客户端并不想用过多的操作而仅仅想看到异常信息,你可以抛出一个unchecked exception:

    throw new RuntimeException("Username already taken");

    另外,你可以提供一个方法来验证该username是否被占用。

    很有必要再重申一下,checked exception应该让客户端从中得到丰富的信息。要想让你的代码更加易读,请倾向于用unchecked excetpion来处理程序中的错误(Prefer unchecked exceptions for all programmatic errors)。

    4. Document exceptions.

    你可以通过Javadoc's @throws 标签来说明(document)你的API中要抛出checked exception或者unchecked exception。然而,我更倾向于使用来单元测试来说明(document)异常。不管你采用哪中方式,你要让客户端代码知道你的API中所要抛出的异常。这里有一个用单元测试来测试IndexOutOfBoundsException的例子:

    public void testIndexOutOfBoundsException() {
    ArrayList blankList = new ArrayList();
    try {
    blankList.get(10);
    fail("Should raise an IndexOutOfBoundsException");
    } catch (IndexOutOfBoundsException success) {}
    }



    上边的代码在请求blankList.get(10)的时候会抛出IndexOutOfBoundsException,如果没有被抛出,将fail ("Should raise an IndexOutOfBoundsException")显示说明该测试失败。通过书写测试异常的单元测试,你不但可以看到异常是怎样的工作的,而且你可以让你的代码变得越来越健壮。


    下面作者将介绍界中使用异常的最佳实践(Best Practices for Using Exceptions)
    1. 总是要做一些清理工作(Always clean up after yourself)

    如果你使用一些资源例如数据库连接或者网络连接,请记住要做一些清理工作(如关闭数据库连接或者网络连接),如果你的API抛出Unchecked exception,那么你要用try-finally来做必要的清理工作:

    java 代码
    1. public   void  dataAccessCode(){   
    2. Connection conn =  null ;   
    3. try {   
    4. conn = getConnection();   
    5. ..some code that  throws  SQLException   
    6. } catch (SQLException ex){   
    7. ex.printStacktrace();   
    8.  finally {   
    9. DBUtil.closeConnection(conn);   
    10. }   
    11. }   
    12.   
    13. class  DBUtil{   
    14. public   static   void  closeConnection   
    15. (Connection conn){   
    16. try {   
    17. conn.close();   
    18.  catch (SQLException ex){   
    19. logger.error( "Cannot close connection" );   
    20. throw   new  RuntimeException(ex);   
    21. }   
    22. }   
    23. }   

    DBUtil是一个工具类来关闭Connection.有必要的说的使用的finally的重要性是不管程序是否碰到异常,它都会被执行。在上边的例子中,finally中关闭连接,如果在关闭连接的时候出现错误就抛出RuntimeException.



    2. 不要使用异常来控制流程(Never use exceptions for flow control)

    下边代码中,MaximumCountReachedException被用于控制流程:

    java 代码
    1. public   void  useExceptionsForFlowControl() {   
    2. try  {   
    3. while  ( true ) {   
    4. increaseCount();   
    5. }   
    6.  catch  (MaximumCountReachedException ex) {   
    7. }   
    8. //Continue execution   
    9. }   
    10.   
    11. public   void  increaseCount()   
    12. throws  MaximumCountReachedException {   
    13. if  (count >=  5000 )   
    14. throw   new  MaximumCountReachedException();   
    15. }    

    上边的useExceptionsForFlowControl()用一个无限循环来增加count直到抛出异常,这种做法并没有说让代码不易读,但是它是程序执行效率降低。

    记住,只在要会抛出异常的地方进行异常处理。



    3. 不要忽略异常

    当有异常被抛出的时候,如果你不想恢复它,那么你要毫不犹豫的将其转换为unchecked exception,而不是用一个空的catch块或者什么也不做来忽略它,以至于从表面来看象是什么也没有发生一样。



    4. 不要捕获顶层的Exception

    unchecked exception都是RuntimeException的子类,RuntimeException又继承Exception,因此,如果单纯的捕获Exception,那么你同样也捕获了RuntimeException,如下代码:

    try{
    ..
    }catch(Exception ex){
    }
    一旦你写出了上边的代码(注意catch块是空的),它将忽略所有的异常,包括unchecked exception.

    5. Log exceptions just once

    Logging the same exception stack trace more than once can confuse the programmer examining the stack trace about the original source of exception. So just log it once.

  • java exception

    2009-06-12 14:50:02

    本文重在Java中异常机制的一些概念。写本文的目的在于方便我很长时间后若是忘了这些东西可以通过这片文章迅速回忆起来。 
    1. 异常机制
    1.1
    异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。
    1.2
    传统的处理异常的办法是,函数返回一个特殊的结果来表示出现异常(通常这个特殊结果是大家约定俗称的),调用该函数的程序负责检查并分析函数返回的结果。这样做有如下的弊端:例如函数返回-1代表出现异常,但是如果函数确实要返回-1这个正确的值时就会出现混淆;可读性降低,将程序代码与处理异常的代码混爹在一起;由调用函数的程序来分析错误,这就要求客户程序员对库函数有很深的了解。
    1.3 异常处理的流程
    1.3.1 遇到错误,方法立即结束,并不返回一个值;同时,抛出一个异常对象
    1.3.2 调用该方法的程序也不会继续执行下去,而是搜索一个可以处理该异常的异常处理器,并执行其中的代码

    2 异常的分类
    2.1 异常的分类
    2.1.1
    异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,具体的RuntimeException继承RuntimeException。
    2.1.2
    Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。
    2.2 每个类型的异常的特点
    2.2.1 Error体系
    Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在进行程序设计时,应该更关注Exception体系。
    2.2.2 Exception体系
    Exception体系包括RuntimeException体系和其他非RuntimeException的体系
    2.2.2.1 RuntimeException
    RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现RuntimeException,那么一定是程序员的错误。例如,可以通过检查数组下标和数组边界来避免数组越界访问异常。
    2.2.2.2 其他(IOException等等)
    这类异常一般是外部错误,例如试图从文件尾后读取数据等,这并不是程序本身的错误,而是在应用环境中出现的外部错误。
    2.3 与C++异常分类的不同
    2.3.1
    其实,Java中RuntimeException这个类名起的并不恰当,因为任何异常都是运行时出现的。(在编译时出现的错误并不是异常,换句话说,异常就是为了解决程序运行时出现的的错误)。
    2.3.2
    C++中logic_error与Java中的RuntimeException是等价的,而runtime_error与Java中非RuntimeException类型的异常是等价的。
    3 异常的使用方法

    3.1 声明方法抛出异常
    3.1.1 语法:throws(略)
    3.1.2 为什么要声明方法抛出异常?
    方法是否抛出异常与方法返回值的类型一样重要。假设方法抛出异常确没有声明该方法将抛出异常,那么客户程序员可以调用这个方法而且不用编写处理异常的代码。那么,一旦出现异常,那么这个异常就没有合适的异常控制器来解决。
    3.1.3 为什么抛出的异常一定是已检查异常?
    RuntimeException与Error可以在任何代码中产生,它们不需要由程序员显示的抛出,一旦出现错误,那么相应的异常会被自动抛出。而已检查异常是由程序员抛出的,这分为两种情况:客户程序员调用会抛出异常的库函数(库函数的异常由库程序员抛出);客户程序员自己使用throw语句抛出异常。遇到Error,程序员一般是无能为力的;遇到RuntimeException,那么一定是程序存在逻辑错误,要对程序进行修改(相当于调试的一种方法);只有已检查异常才是程序员所关心的,程序应该且仅应该抛出或处理已检查异常。
    3.1.4
    注意:覆盖父类某方法的子类方法不能抛出比父类方法更多的异常,所以,有时设计父类的方法时会声明抛出异常,但实际的实现方法的代码却并不抛出异常,这样做的目的就是为了方便子类方法覆盖父类方法时可以抛出异常。
    3.2 如何抛出异常
    3.2.1 语法:throw(略)
    3.2.2 抛出什么异常?
    对于一个异常对象,真正有用的信息时异常的对象类型,而异常对象本身毫无意义。比如一个异常对象的类型是ClassCastException,那么这个类名就是唯一有用的信息。所以,在选择抛出什么异常时,最关键的就是选择异常的类名能够明确说明异常情况的类。
    3.2.3
    异常对象通常有两种构造函数:一种是无参数的构造函数;另一种是带一个字符串的构造函数,这个字符串将作为这个异常对象除了类型名以外的额外说明。
    3.2.4
    创建自己的异常:当Java内置的异常都不能明确的说明异常情况的时候,需要创建自己的异常。需要注意的是,唯一有用的就是类型名这个信息,所以不要在异常类的设计上花费精力。
    3.3 捕获异常
    如果一个异常没有被处理,那么,对于一个非图形界面的程序而言,该程序会被中止并输出异常信息;对于一个图形界面程序,也会输出异常的信息,但是程序并不中止,而是返回用Ы缑娲硌分小?BR> 3.3.1 语法:try、catch和finally(略)
    控制器模块必须紧接在try块后面。若掷出一个异常,异常控制机制会搜寻参数与异常类型相符的第一个控制器随后它会进入那个catch
    从句,并认为异常已得到控制。一旦catch 从句结束对控制器的搜索也会停止。
    3.3.1.1 捕获多个异常(注意语法与捕获的顺序)(略)
    3.3.1.2 finally的用法与异常处理流程(略)
    3.3.2 异常处理做什么?
    对于Java来说,由于有了垃圾收集,所以异常处理并不需要回收内存。但是依然有一些资源需要程序员来收集,比如文件、网络连接和图片等资源。
    3.3.3 应该声明方法抛出异常还是在方法中捕获异常?
    原则:捕捉并处理哪些知道如何处理的异常,而传递哪些不知道如何处理的异常
    3.3.4 再次抛出异常
    3.3.4.1 为什么要再次抛出异常?
    在本级中,只能处理一部分内容,有些处理需要在更高一级的环境中完成,所以应该再次抛出异常。这样可以使每级的异常处理器处理它能够处理的异常。
    3.3.4.2 异常处理流程
    对应与同一try块的catch块将被忽略,抛出的异常将进入更高的一级。
    4 关于异常的其他问题
    4.1 过度使用异常
    首先,使用异常很方便,所以程序员一般不再愿意编写处理错误的代码,而仅仅是简简单单的抛出一个异常。这样做是不对的,对于完全已知的错误,应该编写处理这种错误的代码,增加程序的鲁棒性。另外,异常机制的效率很差。
    4.2 将异常与普通错误区分开
    对于普通的完全一致的错误,应该编写处理这种错误的代码,增加程序的鲁棒性。只有外部的不能确定和预知的运行时错误才需要使用异常。
    4.3 异常对象中包含的信息
    一般情况下,异常对象唯一有用的信息就是类型信息。但使用异常带字符串的构造函数时,这个字符串还可以作为额外的信息。调用异常对象的getMessage()、toString()或者printStackTrace()方法可以分别得到异常对象的额外信息、类名和调用堆栈的信息。并且后一种包含的信息是前一种的超集。
762/4<1234>
Open Toolbar