﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-海鸥航际-文章分类-Java IDE  &amp; Application Server  </title><link>http://www.blogjava.net/sgsoft/category/11.html</link><description>JAVA站</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 08:49:19 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 08:49:19 GMT</pubDate><ttl>60</ttl><item><title>细述 Apache web server 的安装与配置 </title><link>http://www.blogjava.net/sgsoft/articles/2380.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Wed, 23 Mar 2005 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/2380.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/2380.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/2380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/2380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/2380.html</trackback:ping><description><![CDATA[一.、Apache web server 简介<BR><BR>Apache web server是一款开放源码的web服务器软件，由apache software foundation 开发和维护的。它是目前世界上使用最为广泛的web服务器软件，支持各种unix平台和windows平台。本文将介绍它在Red hat Linux 9中最基本的安装和配置。<BR><BR>二、软件的相关资源<BR><BR>官方网站：http://httpd.apache.org/ <BR>源码软件包：Apache 是开源的软件，可以去其官方网站http://httpd.apache.org/download.cgi下载。目前的最新稳定版本是httpd-2.0.53。<BR>帮助文档：http://httpd.apache.org/docs-project/ 有该软件比较全面的帮助文档。<BR>FAQ：http://httpd.apache.org/docs/misc/FAQ.html 回答了该软件的常见问题。<BR>三.软件的安装<BR><BR>1.安装<BR><BR>由其官方网站中下载其源码软件包httpd-2.0.53.tar.gz。接下来我将对安装过程的一些重要步骤，给出其解释：<BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>[root@localhost root]#tar xzvf httpd-2.0.53.tar.gz
[root@localhost root]#cd httpd-2.0.53
[root@localhost httpd-2.0.53]#./configure
[root@localhost httpd-2.0.53]#make
[root@localhost httpd-2.0.53]#make install</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>tar xzvf httpd-2.0.53.tar.gz 解压缩软件包。 <BR><BR>./configure 针对机器作安装的检查和设置，大部分的工作是由机器自动完成的，但是用户可以通过一些参数来完成一定的设置，其常用选项有： <BR><BR>./configure --help 察看参数设置帮助。 <BR><BR>--prefix= 指定软件安装目录（默认/usr/local/apache2）。 <BR><BR>--enable-modules= 指定需要加载的模块。 <BR><BR>--enable-v4-mapped 支持ipv6的socket处理ipv4的连接。 <BR><BR>可以设置的参数很多，可以通过 -help察看需要的，一般情况下，默认设置就可以了。 <BR><BR>默认安装建立了/usr/local/apache2目录，下面介绍一下/usr/local/apache2的几个常用组成部分： <BR><BR>/usr/local/apache2/bin 其中主要是有服务器的程序。常用的有deamon程序httpd，和控制脚本apachectl。 <BR><BR>/usr/local/apache2/conf 其中主要是服务器相关的配置文件。最主要的配置文件是httpd.conf。 <BR><BR>/usr/local/apache2/htdocs 默认的网站html文件根目录。 <BR><BR>/usr/local/apache2/cgi-bin 默认的cgi程序的存放目录。 <BR><BR>2.启动： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>[root@localhost root]# /usr/local/apache2/bin/apachectl start
[root@localhost root]# ps aux 
[root@localhost root]# netstat -an</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>如果不出什么问题，ps aux 应该可以查到httpd 的进程，或netstat -an 也可以看到80端口的服务已经起来了。如果要设置开机自启动web server，只需在/etc/rc.d/rc.local中加入一行 <BR><BR>/usr/local/apache2/bin/apachectl start <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local

/usr/local/apache2/bin/apachectl start</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR>四、软件的配置。<BR><BR>/usr/local/apache2/conf/httpd.conf 默认安装，所有的配置都有其默认值，接下来我介绍介绍一些常用的配置项：<BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE># Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, instead of the default. See also the &lt;VirtualHost&gt;
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#
#Listen 12.34.56.78:80

Listen 80</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>设定apache 的侦听地址和端口。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>#
# ServerAdmin: Your address, where problems with the server should be
# e-mailed.  This address appears on some server-generated pages, such
# as error documents.  e.g. admin@your-domain.com
#
ServerAdmin you@example.com</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>设定apache 的管理员邮件地址。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>#
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/usr/local/apache2/htdocs"</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>设定apache web server 的文档根目录，必须是绝对路径。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;Directory "/usr/local/apache2/htdocs"&gt;

#
# Possible values for the Options directive are "None", "All",
# or any combination of:
#   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important.  Please see
# http://httpd.apache.org/docs-2.0/mod/core.html#options
# for more information.
#
    Options Indexes FollowSymLinks

#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
#   Options FileInfo AuthConfig Limit
#
    AllowOverride None

#
# Controls who can get stuff from this server.
#
    Order allow,deny
    Allow from all

&lt;/Directory&gt;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>设定文档根目录的权限控制，必须和DocumentRoot "/usr/local/apache2/htdocs" 中指定的目录一致。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>#
# The index.html.var file (a type-map) is used to deliver content-
# negotiated documents.  The MultiViews Option can be used for the
# same purpose, but it is much slower.
#
DirectoryIndex index.html</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>指定该目录下的索引文档， <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>映射cgi-bin的根目录，必须是绝对路径。 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>&lt;Directory "/usr/local/apache2/cgi-bin"&gt;
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
&lt;/Directory&gt;</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>设定cgi-bin目录的读写权限，该目录项必须和上一条的设置一致。 <BR><BR>五.安装使用的一些经验： <BR><BR>1.apache 进程的有效用户id默认为nobody。 <BR><BR>出于安全方面的考虑，apache 服务器进程的默认有效 id 被设置为nobody，这就意味着该进程只拥有nobody的权限，所以必须确保nobody对设置的DocumentRoot 有足够权限。或者可以配置apache进程的有效id，但是推荐不要这样做。 <BR><BR>2.如果网站的访问量不是很大可以考虑用xinetd超级进程来启动apache <BR><BR>(1)打开/usr/local/apache2/conf/httpd.conf，修改 <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>ServerType inetd</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>(2)创建/etc/xinetd.d/apache,内容： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE># default: on
# description: The Apache HTTP connections.
service http
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/httpd
port = 80
# log_on_success += DURATION USERID
# log_on_failure += USERID
# nice = 10
}</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>(3)重新启动xinetd： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>#/etc/rc.d/init.d/xinetd restart</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>3.对IPV6的支持 <BR><BR>随着计算机网络的不断发展和扩大，IPV6已经越来越为人们所接受，apache自2.0之后的版本开始支持IPV6，下面我就简单介绍一下apache针对ipv6的配置： <BR><BR>默认情况下，apache 使用映射到IPv4的IPv6地址，即安装配置时，默认./configure -enable-v4-map ，并且在配置文件http.conf中将是： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>Listen 80</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>要使apache 区别对待IPV4与IPV6的连接，安装配置时，使用 ./configure -disable-v4-map , 对应配置文件中http.conf ： <BR><BR>
<CENTER><CCID_NOBR>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1>
<TBODY>
<TR>
<TD class=code style="FONT-SIZE: 9pt" bgColor=#e6e6e6><PRE><CCID_CODE>Listen [::]:80</CCID_CODE></PRE></TD></TR></TBODY></TABLE></CCID_NOBR></CENTER><BR><BR>这样 apache 就可以区别对待 IPV4 与IPV6的连接了。 <BR><img src ="http://www.blogjava.net/sgsoft/aggbug/2380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-03-23 17:28 <a href="http://www.blogjava.net/sgsoft/articles/2380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebLogic Server主题</title><link>http://www.blogjava.net/sgsoft/articles/541.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Fri, 21 Jan 2005 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/541.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/541.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/541.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/541.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/541.html</trackback:ping><description><![CDATA[WebLogic Server主题导航：<BR><BR>0、在看下面帖子的时候请优先查看BEA客户支持服务部的“常见技术问题（FAQs）”专栏<BR>&nbsp;&nbsp; <A class=embed_link href="http://www.bea.com.cn/services/custsupp/techresor/faq/index.jsp" target=_blank>http://www.bea.com.cn/services/custsupp/techresor/faq/index.jsp</A><BR><BR>&nbsp;&nbsp; WebLogic Server 管理最佳实践 <BR>&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/techdoc/webser/200408231.html" target=_blank>http://dev2dev.bea.com.cn/techdoc/webser/200408231.html</A><BR><BR><BR>1、 WebLogic Server安装主题<BR>&nbsp;&nbsp;&nbsp; 如何安装BEA WebLogic Server<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/school/guide/webser/20040178.html" target=_blank>http://dev2dev.bea.com.cn/bbs/school/guide/webser/20040178.html</A> <BR><BR>&nbsp;&nbsp;&nbsp; 如何启动WebLogic Server<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/school/guide/webser/20040179.html" target=_blank>http://dev2dev.bea.com.cn/bbs/school/guide/webser/20040179.html</A><BR><BR>&nbsp;&nbsp;&nbsp; 如何启动example Server<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/school/guide/webser/20040180.html" target=_blank>http://dev2dev.bea.com.cn/bbs/school/guide/webser/20040180.html</A><BR><BR>&nbsp;&nbsp;&nbsp; 如何在solaris环境下设置WLS的自启动：<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=8560" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=8560</A><BR><BR>&nbsp;&nbsp;&nbsp; Oracle和WebLogic在Linux下面的自动启动与停止<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=8839" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=8839</A><BR><BR><BR>2、 WebLogic Server配置主题<BR>&nbsp;&nbsp;&nbsp; weblogic 配置出来的各种域有什么区别？ <BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://211.144.153.5/bbs/thread.jspa?forumID=81&amp;threadID=9188" target=_blank>http://211.144.153.5/bbs/thread.jspa?forumID=81&amp;threadID=9188</A><BR><BR>&nbsp;&nbsp;&nbsp; 在WLS 8.1 上配置群集的基本步骤是什么？<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://support.bea.com/askbea_soln/attachments/S-20763/WLS81_Cluster_Configuration_One_Machine_viewlet_swf.html" target=_blank>http://support.bea.com/askbea_soln/attachments/S-20763/WLS81_Cluster_Configuration_One_Machine_viewlet_swf.html</A><BR><BR>&nbsp;&nbsp;&nbsp; 如何配置WebLogic Server的集群<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/school/guide/webser/20040181.html" target=_blank>http://dev2dev.bea.com.cn/bbs/school/guide/webser/20040181.html</A><BR><BR>&nbsp;&nbsp;&nbsp; weblogic 8.1节点管理器的配置：<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/school/guide/webser/20030730.html" target=_blank>http://dev2dev.bea.com.cn/bbs/school/guide/webser/20030730.html</A><BR><BR>&nbsp;&nbsp;&nbsp; 如何部署集群环境下的proxy Server<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/school/guide/webser/20040182.html" target=_blank>http://dev2dev.bea.com.cn/bbs/school/guide/webser/20040182.html</A> <BR><BR>&nbsp;&nbsp;&nbsp; 大系统部置，10台P4前置机，4台HPN4000机子，布集群各位有何建议<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=7732&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=7732&amp;tstart=0</A><BR><BR>&nbsp;&nbsp;&nbsp; 请用过集群的帮忙回答下，好吗，谢谢，在线等，急！<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=4800&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=4800&amp;tstart=0</A><BR><BR>&nbsp;&nbsp;&nbsp; Apache 2.x与WLS8.1集成-Linux篇 <BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/school/guide/webser/20031270.html" target=_blank>http://dev2dev.bea.com.cn/bbs/school/guide/webser/20031270.html</A><BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; Apache plug-in配置代理请求实战<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/techdoc/webser/200402121.html" target=_blank>http://dev2dev.bea.com.cn/techdoc/webser/200402121.html</A><BR><BR>&nbsp;&nbsp;&nbsp; WebLogic Server 8.1虚拟主机配置最佳实践 <BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/yuanch/ArticleShow.jsp?Id=19" target=_blank>http://dev2dev.bea.com.cn/bbs/yuanch/ArticleShow.jsp?Id=19</A><BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 关于web application&nbsp; （virtual host的配置）<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=9776&amp;messageID=49217" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=9776&amp;messageID=49217</A><BR><BR><BR>3、配置SSL<BR>&nbsp;&nbsp; WebLogic支持密钥的长度限制<BR>&nbsp;&nbsp;&nbsp;&nbsp; WebLogic 8.1 SP3之前的版本，默认的 License是SSL/Export，最多只能到512位密钥，如果想产生大于512位的密钥，需要安装SSL/Domestic的License。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 自WebLogic 8.1 SP3后，默认情况下已经启用了SSL/Domestic，即支持1024位的数字证书。<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; 【推荐】WebLogic Server 8.1 配置Keystores 和 SSL的步骤 <BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=8362&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=8362&amp;tstart=0</A><BR><BR><BR>4、hung&amp;core&amp;Performance tuning<BR>&nbsp;&nbsp; 【精华－WLS调优集锦】weblogic+sqlserver速度极慢的问题（使用了集群） <BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=4525&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=4525&amp;tstart=0</A><BR><BR>&nbsp;&nbsp;&nbsp; 队列长度一直很高，吞吐量不大，访问很慢是怎么回事？ <BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=7770&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=7770&amp;tstart=0</A><BR><BR>&nbsp;&nbsp;&nbsp; 'StackOverFlow' Issues in BEA WebLogic Server <BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://www.sys-con.com/WebLogic/articleprint.cfm?id=440" target=_blank>http://www.sys-con.com/WebLogic/articleprint.cfm?id=440</A><BR><BR>&nbsp;&nbsp;&nbsp; 推荐好文-Looking at Thread-Dumps <BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=9288&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=9288&amp;tstart=0</A><BR><BR>&nbsp;&nbsp;&nbsp; JVM的垃圾回收参数怎么设置？<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=6931" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=6931</A><BR><BR>&nbsp;&nbsp;&nbsp; 如果没有适当的JVM调优，应用系统中容易出现java.lang.OutOfMemoryError的错误thread dump&nbsp; 请大家分析分析，谢谢！<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=9779&amp;messageID=49254" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=9779&amp;messageID=49254</A><BR><BR>&nbsp;&nbsp;&nbsp; 高手帮忙分析一下我们在AIX上的Weblogic危机！<BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=9514&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=9514&amp;tstart=0</A><BR><BR>&nbsp;&nbsp;&nbsp; 最近weblogic用的起来老是数据库连接池被耗尽 <BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&amp;threadID=9121&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&amp;threadID=9121&amp;tstart=0</A><BR><BR>&nbsp;&nbsp;&nbsp; 问：指定的网络名不存在？ <BR>&nbsp;&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=9393&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=9393&amp;tstart=0</A><BR><BR><BR>5、其它：<BR>&nbsp;&nbsp; win2000下apache2+weblogic7实现基于同一个ip地址的多个虚拟主机访问多个weblogic站点 <BR>&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=6326&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=6326&amp;tstart=0</A><BR><BR>&nbsp;&nbsp; 控制台左边的树结构不见了，请大侠指点一下！ <BR>&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=5233&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=5233&amp;tstart=0</A><BR><BR>&nbsp;&nbsp; BEA 8.1最新管理方面的认证：BEA 8.1 Certified Administrator <BR>&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=7564&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=7564&amp;tstart=0</A><BR><BR>&nbsp;&nbsp; 求救：如何远程启动WEBLOGIC服务<BR>&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=7709&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=7709&amp;tstart=0</A> <BR><BR>&nbsp;&nbsp; WebLogic Platform 8.1 永不过期的开发版license<BR>&nbsp;&nbsp; <A class=embed_link href="http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=8992&amp;tstart=0" target=_blank>http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=81&amp;threadID=8992&amp;tstart=0</A><BR><BR><img src ="http://www.blogjava.net/sgsoft/aggbug/541.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-01-21 15:26 <a href="http://www.blogjava.net/sgsoft/articles/541.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat配置技巧Top 10</title><link>http://www.blogjava.net/sgsoft/articles/398.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 17 Jan 2005 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/398.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/398.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/398.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/398.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/398.html</trackback:ping><description><![CDATA[<h3 style="FONT-SIZE: 16px">Tomcat配置技巧Top 10</h3> <p><i>2004-01-09 17:19:25</i></p> <div style="LINE-HEIGHT: 16px">作者：Jason Brittain &amp; Ian F. Darwin<br />出处：http://www.orielly.com<br />译者：陈光<br />2003-12-31<br /><br />编者按：现在开发Java Web应用，建立和部署Web内容是一件很简单的工作。使用Jakarta Tomcat作为Servlet和JSP容器的人已经遍及全世界。Tomcat具有免费、跨平台等诸多特性，并且更新得很快，现在非常的流行。<br /><br />你所需要做的就是：按照你的需求配置Tomcat，只要你正确配置，Tomcat一般都能适合你的要求。下面是一系列关于Tomcat的配置技巧，这些技巧源自于我的书：《Tomcat权威指南》，希望对你有所帮助。—— Jason Brittain<br /><br />1． 配置系统管理（Admin Web Application）<br />大多数商业化的J2EE服务器都提供一个功能强大的管理界面，且大都采用易于理解的Web应用界面。Tomcat按照自己的方式，同样提供一个成熟的管理工具，并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现，当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数，user、group、role的多种数据库管理等。在后续的版本中，这些功能将得到很大的扩展，但现有的功能已经非常实用了。<br /><br />Admin Web Application被定义在自动部署文件：CATALINA_BASE/webapps/admin.xml 。<br />（译者注：CATALINA_BASE即tomcat安装目录下的server目录）<br /><br />你必须编辑这个文件，以确定Context中的docBase参数是绝对路径。也就是说，CATALINA_BASE/webapps/admin.xml 的路径是绝对路径。作为另外一种选择，你也可以删除这个自动部署文件，而在server.xml文件中建立一个Admin Web Application的context，效果是一样的。你不能管理Admin Web Application这个应用，换而言之，除了删除CATALINA_BASE/webapps/admin.xml ，你可能什么都做不了。<br /><br />如果你使用UserDatabaseRealm（默认），你将需要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你编辑这个文件，添加一个名叫“admin”的role 到该文件中，如下：<br /><br />&lt;role name="admin"/&gt;<br /><br />你同样需要有一个用户，并且这个用户的角色是“admin”。象存在的用户那样，添加一个用户（改变密码使其更加安全）：<br /><br />&lt;user name="admin" password="deep_dark_secret" roles="admin"/&gt;<br /><br />当你完成这些步骤后，请重新启动Tomcat，访问http://localhost:8080/admin，你将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制，并采用了Jakarta Struts框架。一旦你作为“admin”角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。<br /><br />2．配置应用管理（Manager Web Application）<br />Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面，执行一些简单的Web应用任务。<br /><br />Manager Web Application被被定义在一个自动部署文件中：<br /><br />CATALINA_BASE/webapps/manager.xml 。<br /><br />你必须编辑这个文件，以确保context的docBase参数是绝对路径，也就是说CATALINA_HOME/server/webapps/manager的绝对路径。<br />（译者注：CATALINA_HOME即tomcat安装目录）<br /><br />如果你使用的是UserDatabaseRealm，那么你需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来，编辑这个文件，添加一个名为“manager”的角色到该文件中：<br /><br />&lt;role name=”manager”&gt;<br /><br />你同样需要有一个角色为“manager”的用户。像已经存在的用户那样，添加一个新用户（改变密码使其更加安全）：<br /><br />&lt;user name="manager" password="deep_dark_secret" roles="manager"/&gt;<br /><br />然后重新启动Tomcat，访问http://localhost/manager/list，将看到一个很朴素的文本型管理界面，或者访问http://localhost/manager/html/list，将看到一个HMTL的管理界面。不管是哪种方式都说明你的Manager Web Application现在已经启动了。<br /><br />Manager application让你可以在没有系统管理特权的基础上，安装新的Web应用，以用于测试。如果我们有一个新的web应用位于/home/user/hello下在，并且想把它安装到 /hello下，为了测试这个应用，我们可以这么做，在第一个文件框中输入“/hello”（作为访问时的path），在第二个文本框中输入“file:/home/user/hello”（作为Config URL）。<br /><br />Manager application还允许你停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问，当有用户尝试访问这个被停止的应用时，将看到一个503的错误——“503 - This application is not currently available”。<br /><br />移除一个web应用，只是指从Tomcat的运行拷贝中删除了该应用，如果你重新启动Tomcat，被删除的应用将再次出现（也就是说，移除并不是指从硬盘上删除）。<br /><br />3．部署一个web应用<br />有两个办法可以在系统中部署web服务。<br />1&gt; 拷贝你的WAR文件或者你的web应用文件夹（包括该web的所有内容）到$CATALINA_BASE/webapps目录下。<br />2&gt; 为你的web服务建立一个只包括context内容的XML片断文件，并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。<br /><br />如果你有一个WAR文件，你若想部署它，则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可，文件必须以“.war”作为扩展名。一旦Tomcat监听到这个文件，它将（缺省的）解开该文件包作为一个子目录，并以WAR文件的文件名作为子目录的名字。接下来，Tomcat将在内存中建立一个context，就好象你在server.xml文件里建立一样。当然，其他必需的内容，将从server.xml中的DefaultContext获得。<br /><br />部署web应用的另一种方式是写一个Context XML片断文件，然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件，而只是一个context元素，以及对该应用的相应描述。这种片断文件就像是从server.xml中切取出来的context元素一样，所以这种片断被命名为“context片断”。<br /><br />举个例子，如果我们想部署一个名叫MyWebApp.war的应用，该应用使用realm作为访问控制方式，我们可以使用下面这个片断：<br /><br />&lt;!-- &nbsp;<br />&nbsp;Context fragment for deploying MyWebApp.war &nbsp;<br />--&gt;<br />&lt;Context path="/demo" docBase="webapps/MyWebApp.war" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug="0" privileged="true"&gt;<br />&nbsp;&lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resourceName="UserDatabase"/&gt; <br />&lt;/Context&gt;<br /><br />把该片断命名为“MyWebApp.xml”，然后拷贝到CATALINA_BASE/webapps目录下。<br /><br />这种context片断提供了一种便利的方法来部署web应用，你不需要编辑server.xml，除非你想改变缺省的部署特性，安装一个新的web应用时不需要重启动Tomcat。<br /><br /><br />4．配置虚拟主机（Virtual Hosts）<br />关于server.xml中“Host”这个元素，只有在你设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制，对每个域名而言，都好象独享了整个主机。实际上，大多数的小型商务网站都是采用虚拟主机实现的，这主要是因为虚拟主机能直接连接到Internet并提供相应的带宽，以保障合理的访问响应速度，另外虚拟主机还能提供一个稳定的固定IP。<br /><br />基于名字的虚拟主机可以被建立在任何web服务器上，建立的方法就是通过在域名服务器（DNS）上建立IP地址的别名，并且告诉web服务器把去往不同域名的请求分发到相应的网页目录。因为这篇文章主要是讲Tomcat，我们不准备介绍在各种操作系统上设置DNS的方法，如果你在这方面需要帮助，请参考《DNS and Bind》一书，作者是Paul Albitz and Cricket Liu (O'Reilly)。为了示范方便，我将使用一个静态的主机文件，因为这是测试别名最简单的方法。<br />在Tomcat中使用虚拟主机，你需要设置DNS或主机数据。为了测试，为本地IP设置一个IP别名就足够了，接下来，你需要在server.xml中添加几行内容，如下：<br /><br />&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt;<br />&nbsp;&lt;Service name="Tomcat-Standalone"&gt;<br />&nbsp;&nbsp;&nbsp;&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector"<br />port="8080" minProcessors="5" maxProcessors="75"<br />enableLookups="true" redirectPort="8443"/&gt;<br />&nbsp;&nbsp;&nbsp;&lt;Connector className="org.apache.coyote.tomcat4.CoyoteConnector"<br />port="8443" minProcessors="5" maxProcessors="75"<br />acceptCount="10" debug="0" scheme="https" secure="true"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory"<br />clientAuth="false" protocol="TLS" /&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/Connector&gt;<br />&nbsp;&nbsp;&nbsp;&lt;Engine name="Standalone" defaultHost="localhost" debug="0"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- This Host is the default Host --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Host name="localhost" debug="0" appBase="webapps"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unpackWARs="true" autoDeploy="true"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Context path="" docBase="ROOT" debug="0"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Context path="/orders" docBase="/home/ian/orders" debug="0"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reloadable="true" crossContext="true"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Context&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Host&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- This Host is the first "Virtual Host": www.example.com --&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Host name="www.example.com" appBase="/home/example/webapp"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;Context path="" docBase="."/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Host&gt;<br /><br />&nbsp;&nbsp;&nbsp;&lt;/Engine&gt;<br />&nbsp;&lt;/Service&gt;<br />&lt;/Server&gt;<br /><br />Tomcat的server.xml文件，在初始状态下，只包括一个虚拟主机，但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的server.xml版本，其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素，所包含的context元素中必须有一个是默认的context，这个默认的context的显示路径应该为空（例如，path=””）。<br /><br />5．配置基础验证（Basic Authentication）<br />容器管理验证方法控制着当用户访问受保护的web应用资源时，如何进行用户的身份鉴别。当一个web应用使用了Basic Authentication（BASIC参数在web.xml文件中auto-method元素中设置），而有用户访问受保护的web应用时，Tomcat将通过HTTP Basic Authentication方式，弹出一个对话框，要求用户输入用户名和密码。在这种验证方法中，所有密码将被以64位的编码方式在网络上传输。<br /><br />注意：使用Basic Authentication通过被认为是不安全的，因为它没有强健的加密方法，除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式（比如，在一个虚拟私人网络中）。若没有额外的加密方法，网络管理员将能够截获（或滥用）用户的密码。但是，如果你是刚开始使用Tomcat，或者你想在你的web应用中测试一下基于容器的安全管理，Basic Authentication还是非常易于设置和使用的。只需要添加&lt;security-constraint&gt;和&lt;login-config&gt;两个元素到你的web应用的web.xml文件中，并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加适当的&lt;role&gt;和&lt;user&gt;即可，然后重新启动Tomcat。<br /><br />下面例子中的web.xml摘自一个俱乐部会员网站系统，该系统中只有member目录被保护起来，并使用Basic Authentication进行身份验证。请注意，这种方式将有效的代替Apache web服务器中的.htaccess文件。<br /><br />&lt;!--<br />&nbsp;Define the Members-only area, by defining<br />&nbsp;a "Security Constraint" on this Application, and<br />&nbsp;mapping it to the subdirectory (URL) that we want<br />&nbsp;to restrict.<br />--&gt;<br />&lt;security-constraint&gt;<br />&nbsp;&lt;web-resource-collection&gt;<br />&nbsp;&nbsp;&nbsp;&lt;web-resource-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Entire Application<br />&nbsp;&nbsp;&nbsp;&lt;/web-resource-name&gt;<br />&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/members/*&lt;/url-pattern&gt;<br />&nbsp;&lt;/web-resource-collection&gt;<br />&nbsp;&lt;auth-constraint&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;role-name&gt;member&lt;/role-name&gt;<br />&nbsp;&lt;/auth-constraint&gt;<br />&lt;/security-constraint&gt;<br />&lt;!-- Define the Login Configuration for this Application --&gt;<br />&lt;login-config&gt;<br />&nbsp;&lt;auth-method&gt;BASIC&lt;/auth-method&gt;<br />&nbsp;&lt;realm-name&gt;My Club Members-only Area&lt;/realm-name&gt;<br />&lt;/login-config&gt;<br /><br />6．配置单点登录（Single Sign-On）<br />一旦你设置了realm和验证的方法，你就需要进行实际的用户登录处理。一般说来，对用户而言登录系统是一件很麻烦的事情，你必须尽量减少用户登录验证的次数。作为缺省的情况，当用户第一次请求受保护的资源时，每一个web应用都会要求用户登录。如果你运行了多个web应用，并且每个应用都需要进行单独的用户验证，那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统，所有他们也就不知道他们需要访问多少个不同的应用，只是很迷惑，为什么总要不停的登录。<br /><br />Tomcat 4的“single sign-on”特性允许用户在访问同一虚拟主机下所有web应用时，只需登录一次。为了使用这个功能，你只需要在Host上添加一个SingleSignOn Valve元素即可，如下所示：<br /><br />&lt;Valve className="org.apache.catalina.authenticator.SingleSignOn"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;debug="0"/&gt;<br /><br />在Tomcat初始安装后，server.xml的注释里面包括SingleSignOn Valve配置的例子，你只需要去掉注释，即可使用。那么，任何用户只要登录过一个应用，则对于同一虚拟主机下的所有应用同样有效。<br /><br />使用single sign-on valve有一些重要的限制：<br />1&gt; value必须被配置和嵌套在相同的Host元素里，并且所有需要进行单点验证的web应用（必须通过context元素定义）都位于该Host下。<br />2&gt; 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。<br />3&gt; 不能被context中的realm覆盖。<br />4&gt; 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式（被定义在web.xml中的&lt;auth-method&gt;中），这比自定义的验证方式强，Tomcat内置的的验证方式包括basic、digest、form和client-cert。<br />5&gt; 如果你使用单点登录，还希望集成一个第三方的web应用到你的网站中来，并且这个新的web应用使用它自己的验证方式，而不使用容器管理安全，那你基本上就没招了。你的用户每次登录原来所有应用时需要登录一次，并且在请求新的第三方应用时还得再登录一次。当然，如果你拥有这个第三方web应用的源码，而你又是一个程序员，你可以修改它，但那恐怕也不容易做。<br />6&gt; 单点登录需要使用cookies。<br /><br />7．配置用户定制目录（Customized User Directores）<br />一些站点允许个别用户在服务器上发布网页。例如，一所大学的学院可能想给每一位学生一个公共区域，或者是一个ISP希望给一些web空间给他的客户，但这又不是虚拟主机。在这种情况下，一个典型的方法就是在用户名前面加一个特殊字符（~），作为每位用户的网站，比如：<br /><br />http://www.cs.myuniversity.edu/~username<br />http://members.mybigisp.com/~username<br /><br />Tomcat提供两种方法在主机上映射这些个人网站，主要使用一对特殊的Listener元素。Listener的className属性应该是org.apache.catalina.startup.UserConfig，userClass属性应该是几个映射类之一。如果你的系统是Unix，它将有一个标准的/etc/passwd文件，该文件中的帐号能够被运行中的Tomcat很容易的读取，该文件指定了用户的主目录，使用PasswdUserDatabase 映射类。<br /><br />&lt;Listener className="org.apache.catalina.startup.UserConfig" <br />directoryName="public_html" <br />userClass="org.apache.catalina.startup.PasswdUserDatabase"/&gt;<br /><br />web文件需要放置在像/home/users/ian/public_html 或者 /users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。<br /><br />实际上，这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件，但你又想把一个用户名映射到公共的像/home一样目录的子目录里面，则可以使用HomesUserDatabase类。<br /><br />&lt;Listener className="org.apache.catalina.startup.UserConfig" <br />directoryName="public_html" homeBase="/home" <br />userClass="org.apache.catalina.startup.HomesUserDatabase"/&gt;<br /><br />这样一来，web文件就可以位于像/home/ian/public_html 或者 /home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利，你可以使用一个像c:\home这样的目录。<br /><br />这些Listener元素，如果出现，则必须在Host元素里面，而不能在context元素里面，因为它们都用应用于Host本身。<br /><br /><br />8．在Tomcat中使用CGI脚本<br />Tomcat主要是作为Servlet/JSP容器，但它也有许多传统web服务器的性能。支持通用网关接口（Common Gateway Interface，即CGI）就是其中之一，CGI提供一组方法在响应浏览器请求时运行一些扩展程序。CGI之所以被称为通用，是因为它能在大多数程序或脚本中被调用，包括：Perl，Python，awk，Unix shell scripting等，甚至包括Java。当然，你大概不会把一个Java应用程序当作CGI来运行，毕竟这样太过原始。一般而言，开发Servlet总要比CGI具有更好的效率，因为当用户点击一个链接或一个按钮时，你不需要从操作系统层开始进行处理。<br /><br />Tomcat包括一个可选的CGI Servlet，允许你运行遗留下来的CGI脚本。<br /><br />为了使Tomcat能够运行CGI，你必须做如下几件事：<br />1. 把servlets-cgi.renametojar （在CATALINA_HOME/server/lib/目录下）改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。<br />2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中，把关于&lt;servlet-name&gt; CGI的那段的注释去掉（默认情况下，该段位于第241行）。<br />3. 同样，在Tomcat的CATALINA_BASE/conf/web.xml文件中，把关于对CGI进行映射的那段的注释去掉（默认情况下，该段位于第299行）。注意，这段内容指定了HTML链接到CGI脚本的访问方式。<br />4. 你可以把CGI脚本放置在WEB-INF/cgi 目录下（注意，WEB-INF是一个安全的地方，你可以把一些不想被用户看见或基于安全考虑不想暴露的文件放在此处），或者你也可以把CGI脚本放置在context下的其他目录下，并为CGI Servlet调整cgiPathPrefix初始化参数。这就指定的CGI Servlet的实际位置，且不能与上一步指定的URL重名。<br />5. 重新启动Tomcat，你的CGI就可以运行了。<br /><br />在Tomcat中，CGI程序缺省放置在WEB-INF/cgi目录下，正如前面所提示的那样，WEB-INF目录受保护的，通过客户端的浏览器无法窥探到其中内容，所以对于放置含有密码或其他敏感信息的CGI脚本而言，这是一个非常好的地方。为了兼容其他服务器，尽管你也可以把CGI脚本保存在传统的/cgi-bin目录，但要知道，在这些目录中的文件有可能被网上好奇的冲浪者看到。另外，在Unix中，请确定运行Tomcat的用户有执行CGI脚本的权限。<br /><br />9．改变Tomcat中的JSP编译器（JSP Compiler）<br />在Tomcat 4.1（或更高版本，大概），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的，因为你只需要在&lt;init-param&gt; 元素中定义一个名字叫“compiler”，并且在value中有一个支持编译的编译器名字，示例如下：<br /><br />&lt;servlet&gt;<br />&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br />&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.jasper.servlet.JspServlet<br />&nbsp;&nbsp;&nbsp;&lt;/servlet-class&gt;<br />&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;logVerbosityLevel&lt;/param-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;WARNING&lt;/param-value&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br />&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;compiler&lt;/param-name&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;jikes&lt;/param-value&gt;<br />&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br />&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br />&lt;/servlet&gt;<br /><br />当然，给出的编译器必须已经安装在你的系统中，并且CLASSPATH可能需要设置，那处决于你选择的是何种编译器。<br /><br />10．限制特定主机访问（Restricting Access to Specific Hosts）<br />有时，你可能想限制对Tomcat web应用的访问，比如，你希望只有你指定的主机或IP地址可以访问你的应用。这样一来，就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效果，Tomcat提供了两个参数供你配置：RemoteHostValve 和RemoteAddrValve。<br /><br />通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。<br />例如你可以把Admin Web application设置成只允许本地访问，设置如下：<br /><br />&lt;Context path="/path/to/secret_files" ...&gt;<br />&nbsp;&lt;Valve className="org.apache.catalina.valves.RemoteAddrValve"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allow="127.0.0.1" deny=""/&gt;<br />&lt;/Context&gt;<br /><br />如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。<br /><br />--------------------------------------<br /><br />作者简介：<br />Jason Brittain是CollabNet公司的一名资深软件工程师，主要负责软件底层架构的开发。他已经为Apache Jakarta项目做了很多贡献，多年以来，他一直是一名积极的开源软件开发者。<br /><br />Ian F. Darwin已经在计算机行业工作了30年：从1980年开始使用Unix，从1995年开始使用Java，从1998年开始使用OpenBSD。他是两本Oreilly图书的作者：Checking C Programs with lint 和 Java Cookbook，还与Jason Brittain合著了Tomcat: The Definitive Guide。<br /><br />译者简介：<br />陈光（Holen Chen），J2EE项目经理，熟悉知识管理及电子政务，致力于Apache Jakarta项目在国广的推广及深层次应用，可通过 holen@263.net与作者联系。</div><img src ="http://www.blogjava.net/sgsoft/aggbug/398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-01-17 15:54 <a href="http://www.blogjava.net/sgsoft/articles/398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Eclipse中使用JUnit(翻译)</title><link>http://www.blogjava.net/sgsoft/articles/261.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Thu, 13 Jan 2005 01:26:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/261.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/261.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/261.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/261.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/261.html</trackback:ping><description><![CDATA[<table width="92%" border="0"> <tbody> <tr> <td align="middle" colspan="3"> <h2>在Eclipse中使用JUnit(翻译)</h2></td></tr> <tr> <td width="30%">发布日期：2004-11-01</td> <td align="middle" width="30%">作者： rosen 的 Blog</td> <td align="right">阅读人次：2013</td></tr> <tr> <td colspan="3" height="15">&nbsp;</td></tr> <tr> <td align="left" colspan="3">这篇文章将向你介绍Junit，一个用来在项目中进行测试和调试的工具。在介绍完TDD（以测试驱动开发）理论后，将进一步讲解怎样在流行的Eclipse中建立你自己的JUnit测试。向你展示如何测试Hello&nbsp;World这样简单的程序。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;许多书上都讨论了自动测试，但是只有很少的著作注意到这么一个问题，那就是怎样把这些测试组织起来。随着测试的增加，放置和调用这些测试却变得更加麻烦。这将成为一个重要问题，以至于出现了TDD，极限编程（XP）使TDD得以普及。另外，你可以这样理解TDD：通过测试来开发。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;TDD的主要规范&nbsp;:<br />&nbsp;&nbsp;&nbsp;&nbsp;在编写程序代码之前，与之对应的自动测试必须被写好。甚至程序代码并不存在，那也要看见一个失败的测试结果。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;在测试通过后，副本代码必须被丢弃。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;有一个具体步骤（可能指的是《Extreme&nbsp;Programming》）可以被任何一个程序员来参考，而不需要特殊的其他方法。在我们开始写测试之前，这些步骤（章节）应该被首先阅读——怎样组织自动测试。<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;讲解一下不同种类的测试：<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;单元测试：检测模块（也就是类）的正确性。如果对象需要访问外部的数据资源，例如数据库，就需要模拟一个mock&nbsp;objects，但在实际中真实数据与测试环境是不同的。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;客户测试：这是功能性、系统、和验收测试。用来测试整体的系统特性。在XP中，这些测试由用户编写。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;综合测试：介于用户测试和单元测试之间的桥梁。综合测试帮助测试应用程序的交互性。一般情况下，mock&nbsp;objects不被用于综合测试，它会增加测试时间。同样，综合测试经常依赖特殊的测试环境，例如数据库送来的测试数据。综合测试也需要用到外部类库。例如为J2EE应用程序进行综合测试的类库Cactus。解释这些测试超出了本文的范围，需要更加详细的信息请参考http://jakarta.apache.org/cactus/。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;开发人员测试：这是用来让开发人员检验自己代码或新函数的。对于每一个开发人员，只要有可能，就需要有更多的测试来检验代码。组织这些测试和组织程序代码一样重要。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;在以下章节，只要提到“测试”，那就指的是开发人员测试。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;我们几乎准备好开始建立测试了，先应该为我们的测试选择名字。你也许会说，“这不是问题：把‘Test’这个字放在类名前面，就好了！”不会这么快！让我来说一下这个步骤存在的问题：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;在TDD中，被测试的类或者方法还不存在。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;一个测试能够覆盖多个方法，甚至多个类，这是可能的。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;以上只是一些普遍问题；还存在更多的问题。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;让我来提一个建议，在测试命名时：测试类的名字应该让人一眼就知道这是一个测试类，且能说明它要测试什么，注意是否和其他类重名。按照以上建议做，就很简单了，也不用担心名字太长或难听。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;即将在Eclipse中用JUnit工具创建我们第一个测试了。假设你已经下载了一个最新的Eclipse版本。如果还没有，你应该去官方站点http://www.eclipse.org下载。还需要JUnit，也可以从http://www.junit.org/下载。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;运行Eclipse。新建一个workplace项目，点击文件-&gt;新建-&gt;项目，选择Java项目，点击下一步。起一个项目名称，例如ProjectWithJUnit。点击完成。这样就完成新项目的建立了。再来配置一下Eclipse，在构建路径中添加JUnit类库。在工具条上点击项目-&gt;属性，选择Java构建路径，库，选择添加外部JAR，浏览Junit被存储的目录，选择junit.jar，点击打开。你将会看见JUnit出现在库的列表中。点击确定，让Eclipse重建路径。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;现在开发我们的“Hello&nbsp;World”例子。按照TDD的规则，应该在代码建立以前先把测试写好。为了能够在某出开始，我们假设未来的类名是HelloWorld，并且有一个方法Say()，这个方法返回String的值（例如“Hello&nbsp;World!”）。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;建立测试，在ProjectWithJUnit的标题上面点击右键，选择新建-&gt;其他，展开“Java”选项，选择JUnit。在右边的栏目对话框中选择测试案例，然后下一步。参考图1。<br /><a href="http://www.onjava.com/onjava/2004/02/04/graphics/juie1ss.gif" target="_blank"><img title="open in new window" alt="" src="http://www.onjava.com/onjava/2004/02/04/graphics/juie1ss.gif" border="0" /></a><br />图1.&nbsp;在Eclipse中建立JUnit测试<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;在测试类这一栏中，写上将要被测试的类名HelloWorld。选择一个测试案例的名字，例如TestThatWeGetHelloWorldPrompt（是的，看上去很长，但是很清楚它的行为。）点击完成。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;TestThatWeGetHelloWorldPrompt的代码如下：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;import&nbsp;junit.framework.TestCase;<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;TestThatWeGetHelloWorldPrompt<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;extends&nbsp;TestCase&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;TestThatWeGetHelloWorldPrompt(<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(name);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;testSay()&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HelloWorld&nbsp;hi&nbsp;=&nbsp;new&nbsp;HelloWorld();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(\"Hello&nbsp;World!\",&nbsp;hi.say());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;junit.textui.TestRunner.run(<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestThatWeGetHelloWorldPrompt.class);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;代码并不复杂；只是有点与众不同。然而，让我们考察一下细节。我们继承了JUnit的TestCase类，它在JUnit的javadocs定义为“运行众多测试的夹具。”JUnit也有TestSuite类，它是一组测试案例的集合，但在本文中不做讨论。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;建立测试案例的步骤如下：<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;1、建立一个junit.framework.TestCase的实例。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;2、定义一些以“test”开头的无返回方法（例如testWasTransactionSuccessful()，testShow()，等等）。<br /><br />&nbsp;&nbsp;&nbsp;TestThatWeGetHelloWorldPrompt.java包含这些：TestCase的子类和一个叫做testSay()的方法。这个方法调用了assertEquals()函数，它用来比较我们预期的值和由say()返回的值。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;main()方法用来运行测试和显示输出的。JUnit的TestRunner处理测试，提供基于图像和文本的输出表现形式。我们使用基于文本的版本，因为Eclipse支持它，且也适合我们。当开始运行后，基于文本的版本测试会以文本形式输出，Eclipse会把这些输出自动变成图像界面的输出。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;按照TDD规范，首次运行测试，应该故意让它失败。点击运行-&gt;运行为-&gt;Junit测试（记住TestThatWeGetHelloWorldPrompt.java应该被突出的显示在包资源管理器中）。在左边窗口，应该看见JUnit窗口而不是包资源管理器，它显示一个红条，一次失败的测试，具体的失败原因参看图2。如果没有自动显示这些内容，点击JUnit标签（在底部的左边）。<br /><br /><a href="http://www.onjava.com/onjava/2004/02/04/graphics/juie2ss.gif" target="_blank"><img title="open in new window" alt="" src="http://www.onjava.com/onjava/2004/02/04/graphics/juie2ss.gif" border="0" /></a><br />图2.&nbsp;JUnit中失败的测试<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;很好！的却失败了。现在我们来建立被测试代码：在包资源管理器窗口的ProjectWithJUnit标题上右击，选择新建-&gt;类。选择类名，我们已经假设了它叫HelloWorld，然后直接点击完成。为HelloWorld.java填入下列代码：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;class&nbsp;HelloWorld&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;String&nbsp;say()&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(\"Hello&nbsp;World!\");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;这段代码很简单，甚至不需要注解，我们再来看看结果。按照上面描述过的方式，在JUnit的窗口中显示了一个绿条，参看图3。绿条证明测试成功。<br /><br /><a href="http://www.onjava.com/onjava/2004/02/04/graphics/juie3ss.gif" target="_blank"><img title="open in new window" alt="" src="http://www.onjava.com/onjava/2004/02/04/graphics/juie3ss.gif" border="0" /></a><br />图3.&nbsp;JUnit中成功的测试<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;现在，我们想再让测试失败一次，但原因不同。这有助于展示JUnit测试中不同的报错信息。修改assertEquals()代码，把“Hello&nbsp;World!”变成“Hello&nbsp;Me!”。当再次运行JUnit时，结果变成了红条，在JUnit窗口的底部输出了失败原因，参看图4。<br /><a href="http://www.onjava.com/onjava/2004/02/04/graphics/juie4ss.gif" target="_blank"><img title="open in new window" alt="" src="http://www.onjava.com/onjava/2004/02/04/graphics/juie4ss.gif" border="0" /></a><br />图4.&nbsp;JUnit中的ComparisonError<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;最后，我想说一下关于测试是开发过程中的必要部分的话题。测试代码一直是开发中的重要部分。经过近几年的发展，已得到了很大的提高，这要归功于强大的理论研究（比如“expectations-based&nbsp;development”等等），和快速发展的测试工具包，还有测试过程的改进。如果你对这篇文章感兴趣，那请你花一些时间来正式的学习一下测试理论吧，这对你的工作很有用。<br />&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;关于作者：<br />&nbsp;&nbsp;&nbsp;&nbsp;Alexander&nbsp;Prohorenko&nbsp;一名UNIX系统管理员、网络安全管理员。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Olexiy&nbsp;Prohorenko&nbsp;&nbsp;&nbsp;&nbsp;一名Java开发者居住在乌克兰的Dniepropetrovsk</td></tr></tbody></table><img src ="http://www.blogjava.net/sgsoft/aggbug/261.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-01-13 09:26 <a href="http://www.blogjava.net/sgsoft/articles/261.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Tomcat里发布自己的程序</title><link>http://www.blogjava.net/sgsoft/articles/188.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Mon, 10 Jan 2005 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/188.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/188.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/188.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/188.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/188.html</trackback:ping><description><![CDATA[<span id="ArticleContent1_ArticleContent1_lblContent"><font color="#000080"><font face="Courier New" size="2">找到%tomcathome%\conf\server.xml文件,在&lt;host&gt;标签中加入: <br /><br />&lt;Context path="/虚拟目录名" docBase="本地路径" debug="0" <br />reloadable="true" crossContext="true"&gt; <br />&lt;/Context&gt; <br />这样将你的jsp文件放到"本地路径"下,然后在浏览器中输入http://127.0.0.1:8080/虚拟目录名/xxx.jsp即可执行. <br />注意!!!还没有完!!这时候你的这个虚拟目录还没有执行servlet的能力(当然如果你不用servlet那就令当别论了). <br />下面是一个范例: <br /><br />&lt;Context path="/bbs" docBase="work" debug="0" <br />reloadable="true" crossContext="true"&gt; <br />&lt;/Context&gt; <br />你要建一个名叫work的目录在webapps\下 <br />要使这个work目录可以执行servlet,要有一个配置文件--web.xml,内容为: <br /><br />&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt; <br />&lt;!DOCTYPE web-app <br />PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" <br />"http://java.sun.com/dtd/web-app_2_3.dtd"&gt; <br />&lt;web-app&gt; <br />&lt;display-name&gt;MyWEB&lt;/display-name&gt; <br />&lt;servlet-mapping&gt; <br />&lt;servlet-name&gt;invoker&lt;/servlet-name&gt; <br />&lt;url-pattern&gt;/servlet/*&lt;/url-pattern&gt; <br />&lt;/servlet-mapping&gt; <br />&lt;/web-app&gt; <br /><br />这个使最小配置,仅仅是指明servlet的位置.要把这个文件放到webapps\work\WEB-INF\下,你自己的servlet放到webapps\work\WEB-INF\classes\下.</font></font></span><img height="1" src="http://www.cnblogs.com/SGSoft/aggbug/89586.html" width="1" /><img src ="http://www.blogjava.net/sgsoft/aggbug/188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-01-10 17:41 <a href="http://www.blogjava.net/sgsoft/articles/188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclips使用秘技</title><link>http://www.blogjava.net/sgsoft/articles/191.html</link><dc:creator>海天一鸥</dc:creator><author>海天一鸥</author><pubDate>Sat, 08 Jan 2005 14:31:00 GMT</pubDate><guid>http://www.blogjava.net/sgsoft/articles/191.html</guid><wfw:comment>http://www.blogjava.net/sgsoft/comments/191.html</wfw:comment><comments>http://www.blogjava.net/sgsoft/articles/191.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/sgsoft/comments/commentRss/191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sgsoft/services/trackbacks/191.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; Author：sungo 前言： 本来我都是使用JBuilderX当主力IDE、但使用了Eclipse后 发现...Eclipse原来也这么好用...渐渐的就爱上了它...... Eclipse优点：免费、程序代码排版功能、有中文化包、可增 设许多功能强大的外挂、支持多种操作系统(Windows、 Linux、Solaris、Mac OSX)..等等。 开此篇讨论串的目的，是希望能将...&nbsp;&nbsp;<a href='http://www.blogjava.net/sgsoft/articles/191.html'>阅读全文</a><img src ="http://www.blogjava.net/sgsoft/aggbug/191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sgsoft/" target="_blank">海天一鸥</a> 2005-01-08 22:31 <a href="http://www.blogjava.net/sgsoft/articles/191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>