﻿<?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-黑咖啡</title><link>http://www.blogjava.net/kyleYang/</link><description>孩儿立志出乡关，学不成名誓不还。
风华正茂乾坤地，人生无处不青山。
光阴如同流水去，珍惜时光最宝贵。
鹏程万里靠自己，飞黄腾达青少年。
</description><language>zh-cn</language><lastBuildDate>Sat, 18 Apr 2026 17:57:19 GMT</lastBuildDate><pubDate>Sat, 18 Apr 2026 17:57:19 GMT</pubDate><ttl>60</ttl><item><title>Android离线地图</title><link>http://www.blogjava.net/kyleYang/archive/2013/08/25/403295.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Sun, 25 Aug 2013 13:35:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2013/08/25/403295.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/403295.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2013/08/25/403295.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/403295.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/403295.html</trackback:ping><description><![CDATA[本人有Android离线地图的sdk和图层（国内任何城市的图，共18层），有意者可以联系我。离线地图可以做到完全离线，不需要和互联网进行交互，可以适用于特殊行业的android终端开发。
QQ：270404588<img src ="http://www.blogjava.net/kyleYang/aggbug/403295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2013-08-25 21:35 <a href="http://www.blogjava.net/kyleYang/archive/2013/08/25/403295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache负载均衡+Tomcat集群</title><link>http://www.blogjava.net/kyleYang/archive/2010/08/18/329287.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Wed, 18 Aug 2010 15:24:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/08/18/329287.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/329287.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/08/18/329287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/329287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/329287.html</trackback:ping><description><![CDATA[
		<dd>
				<div class="Description">核心提示：第一步： 在http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.6 下载mod_jk_1.2.6_2.0.50.dll文件，将其改名为mod_jk.so后放到apache2/modules目录中。 第二步： workers.properties： workers.tomcat_home=D:\My_Work\Tomcat\ </div>
				<p class="ArticleContent">第一步： 在http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32/jk-1.2.6 <br />                            下载mod_jk_1.2.6_2.0.50.dll文件，将其改名为mod_jk.so后放到apache2/modules目录中。 <br />第二步： workers.properties：<br />workers.tomcat_home=D:\My_Work\Tomcat\apache-tomcat-6.0.14 <br />workers.java_home=D:\Program Files\Java\jdk1.5.0_07 <br />ps=\ <br />worker.list=ajp13 <br />worker.ajp13.port=8009 <br />worker.ajp13.host=localhost <br />worker.ajp13.type=ajp13 <br />worker.ajp13.lbfactor=1 <br /><br />第三步：用记事本打开apache/conf/httpd.conf文件末尾，添加下面一段： <br />     <br />LoadModule jk_module modules/mod_jk.so <br />JkWorkersFile "D:\Program Files\Apache Software Foundation\Apache2.2\modules\workers.properties" <br />#ServerAdmin wangguiwei@gmail.com    <br />#ServerName localhost <br />DirectoryIndex index.html index.htm index.jsp <br />JkMount /* ajp13    <br />JkAutoAlias "D:\My_Work\Tomcat\apache-tomcat-6.0.14\webapps"   <br />Options Indexes FollowSymLinks <br />#allow from all <br />     <br />保存，停止apache服务，在启动，就可以将新配置应用了。 <br />****************************** <br />一．Apache与Tomcat介绍 <br /><br />    Apache是当前使用最为广泛的WWW服务器软件，具有相当强大的静态HTML处理的能力。 <br /><br />     Tomcat服务器是一个免费的开放源代码的Web应用服务器，它是Apache软件基金会（Apache Software Foundation）的Jakarta项目中的一个核心项目，由Apache、Sun和   其他一些公司及个人共同开发而成。由于有了Sun的参与和支持，最新的Servlet和JSP   规范总是能在Tomcat中得到体现，Tomcat5支持最新的Servlet 2.4和JSP 2.0规范。因为Tomcat技术先进、性能稳定，而且免费，因而深受Java爱好者的喜爱并得到了部分软件开发商的认可，成为目前比较流行的Web应用服务器。 <br /><br />Tomcat和IIS、Apache等Web服务器一样，具有处理HTML页面的功能，另外它还是一个Servlet和JSP容器，独立的Servlet容器是Tomcat的默认模式。<br />二．为什么需要整合 <br /><br />整合的最主要原因是为了在现有的硬件条件下提供最大的负载。 <br /><br />如果单独使用Tomcat做JSP服务器，在工作效率上会存在问题,Tomcat处理静态HTML的能力不如Apache，并且所能承受的最大并发连接数也有一定的限制； <br /><br />在测试中，当并发连接较多时，Tomcat就会处于“僵死”状态，对后继的请求连接失去响应。所以现在提出一个“整合”解决方案：将html与 jsp的功能部分进行明确分工，让tomcat只处理jsp部分，其它的由apache这个web server处理。Apache与Tomcat各司其职，那么服务器的整体效率就能够得到提升。 <br />三．整合的基本原理 <br /><br />作为Apache下面的子项目，Tomcat 与 Apache之间有着天然的联系。在实际操作中，主要是Apache作为主服务器运行，当监听到有jsp或者servlet的请求时，将请求转发给 tomcat服务器，由tomcat服务器进行解析后，发回apache，再由apache发回用户。 <br /><br />在tomcat中有两个监听的端口，一个是8080用于提供web服务,一个是8009用于监听来自于apache的请求。当apache收到 jsp或者servlet请求时，就向tomcat 的8009端口发送请求，交由tomcat处理后，再返回给apache，由apache返回给客户。 <br />四．安装Apache与Tomcat服务器 <br /><br />   操作系统环境：Windows xp home <br /><br />   安装文件：apache-tomcat-6.0.14.exe apache_2.2.6-win32-x86-openssl-0.9.8e.msi mod_jk-apache-2.2.4.so <br />　 到apache 与tomcat 的官方网站上面下载apache 与tomcat，安装apache与tomcat <br /><br />     到http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/win32下载 mod_jk-apache-2.2.4.so <br /><br />     将mod_jk-apache-2.2.4.so拷贝到apache安装目录下面的modules目录中。 <br /><br />五．修改Tomcat设置 <br /><br />     在tomcat的conf目录下建一个workers.properties的文本文件，添加如下配置 <br /><br />     workers.tomcat_home="tomcat安装目录" <br /><br />     #让mod_jk模块知道Tomcat的安装路径 <br /><br />     workers.java_home="java安装目录" <br /><br />     #让mod_jk模块知道jdk路径 <br /><br />     ps=" <br /><br />     worker.list=ajp13 <br /><br />     #这里是关键，名字要和httpd.conf的一致。如果这里改了httpd.conf也要改。 <br /><br />     worker.ajp13.port=8009 <br /><br />     #工作端口,tomcat的jk监听端口，可以查看Server.xml中有port="8009"            <br /><br />     worker.ajp13.host=localhost <br /><br />     #Tomcat所在机器，如果安装在与apache不同的机器则需要设置IP <br /><br />     worker.ajp13.type=ajp13 <br /><br />     #类型，好像不能改，会出问题 <br /><br />     worker.ajp13.lbfactor=1 <br /><br />     #负载平衡因子    <br /><br />六．修改Apache设置 <br /><br />修改apache安装目录下conf目录下的httpd.conf,增加如下配置 <br /><br />　　LoadModule jk_module modules/mod_jk-apache-2.2.4.so <br /><br />       JkWorkersFile "tomcat安装目录/conf/workers.properties" <br /><br />   　JkLogFile "apache安装目录/logs/mod_jk.log" <br /><br />      JkMount /*.jsp ajp13 <br /><br />      JkMount /*.do ajp13 <br /><br />七．整合操作说明<br />　 mod_jk-apache-2.2.4.so相当于是apache与tomcat之间的桥梁一样，所以在apache的配置文件下面加上LoadModule jk_module modules/mod_jk-apache-2.2.4.so　将此模块载入。 <br /><br />JkWorkersFile "tomcat安装目录/conf/workers.properties"　说明了mod_jk-apache-2.2.4.so 如何工作，当出现要转发时，将请求发送到那里进行处理，代表了一系列的工作参数。<br />      JkLogFile "apache安装目录/logs/mod_jk.log"　设定日志的地址。 <br /><br />JkMount　说明了将什么样的URL进行发送到tomcat进行处理。JkMount /*.jsp ajp13　说明了要将jsp请求发到tomcat,JkMount /*.do ajp13说明了要将.do型的servlet发到tomcat进行处理。在实际的分发中，如果servlet命名不带后缀的话，将无法被识别，也就无法进行处理。<br />  <br /> 八．结束语 <br />       在查阅了不少文章之后，我仔细的了解了下这两者进行整合的过程，网上很多文章讲的整合应该不算是真正意义上面的整合，希望此文章能够为正为这些问题苦恼的同行们解决一点小困难……。</p>
		</dd>
<img src ="http://www.blogjava.net/kyleYang/aggbug/329287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-08-18 23:24 <a href="http://www.blogjava.net/kyleYang/archive/2010/08/18/329287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache HTTP Server 与 Tomcat 的三种连接方式介绍</title><link>http://www.blogjava.net/kyleYang/archive/2010/08/18/329286.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Wed, 18 Aug 2010 15:17:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/08/18/329286.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/329286.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/08/18/329286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/329286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/329286.html</trackback:ping><description><![CDATA[
		<blockquote>整合 Apache Http Server 和 Tomcat 可以提升对静态文件的处理性能、利用 Web 服务器来做负载均衡以及容错、无缝的升级应用程序。本文介绍了三种整合 Apache 和 Tomcat 的方式。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接。事实上 Tomcat 本身已经提供了 HTTP 服务，该服务默认的端口是 8080，装好 tomcat 后通过 8080 端口可以直接使用 Tomcat 所运行的应用程序，你也可以将该端口改为 80。</p>
		<p>既然 Tomcat 本身已经可以提供这样的服务，我们为什么还要引入 Apache 或者其他的一些专门的 HTTP 服务器呢？原因有下面几个：</p>
		<p>1. 提升对静态文件的处理性能</p>
		<p>2. 利用 Web 服务器来做负载均衡以及容错</p>
		<p>3. 无缝的升级应用程序</p>
		<p>这三点对一个 web 网站来说是非常之重要的，我们希望我们的网站不仅是速度快，而且要稳定，不能因为某个 Tomcat 宕机或者是升级程序导致用户访问不了，而能完成这几个功能的、最好的 HTTP 服务器也就只有 apache 的 http server 了，它跟 tomcat 的结合是最紧密和可靠的。</p>
		<p>接下来我们介绍三种方法将 apache 和 tomcat 整合在一起。</p>
		<p>
				<a name="N10058">
						<span class="atitle">JK</span>
				</a>
		</p>
		<p>这是最常见的方式，你可以在网上找到很多关于配置JK的网页，当然最全的还是其官方所提供的文档。JK 本身有两个版本分别是 1 和 2，目前 1 最新的版本是 1.2.19，而版本 2 早已经废弃了，以后不再有新版本的推出了，所以建议你采用版本 1。</p>
		<p>JK 是通过 AJP 协议与 Tomcat 服务器进行通讯的，Tomcat 默认的 AJP Connector 的端口是 8009。JK 本身提供了一个监控以及管理的页面 jkstatus，通过 jkstatus 可以监控 JK 目前的工作状态以及对到 tomcat 的连接进行设置，如下图所示：</p>
		<br />
		<a name="N10066">
				<b>图 1：监控以及管理的页面 jkstatus</b>
		</a>
		<br />
		<img height="228" alt="图 1：监控以及管理的页面 jkstatus" src="http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/images/image002.jpg" width="554" border="0" />
		<br />
		<p>在这个图中我们可以看到当前JK配了两个连接分别到 8109 和 8209 端口上，目前 s2 这个连接是停止状态，而 s1 这个连接自上次重启后已经处理了 47 万多个请求，流量达到 6.2 个 G，最大的并发数有 13 等等。我们也可以利用 jkstatus 的管理功能来切换 JK 到不同的 Tomcat 上，例如将 s2 启用，并停用 s1，这个在更新应用程序的时候非常有用，而且整个切换过程对用户来说是透明的，也就达到了无缝升级的目的。关于 JK 的配置文章网上已经非常多了，这里我们不再详细的介绍整个配置过程，但我要讲一下配置的思路，只要明白了配置的思路，JK 就是一个非常灵活的组件。</p>
		<p>JK 的配置最关键的有三个文件，分别是 </p>
		<p>
				<b>httpd.conf </b>
				<br />Apache 服务器的配置文件，用来加载 JK 模块以及指定 JK 配置文件信息</p>
		<p>
				<b>workers.properties</b>
				<br />到 Tomcat 服务器的连接定义文件</p>
		<p>
				<b>uriworkermap.properties</b>
				<br />URI 映射文件，用来指定哪些 URL 由 Tomcat 处理，你也可以直接在 httpd.conf 中配置这些 URI，但是独立这些配置的好处是 JK 模块会定期更新该文件的内容，使得我们修改配置的时候无需重新启动 Apache 服务器。</p>
		<p>其中第二、三个配置文件名都可以自定义。下面是一个典型的 httpd.conf 对 JK 的配置</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode"># (httpd.conf)
# 加载 mod_jk 模块
LoadModule jk_module modules/mod_jk.so

#
# Configure mod_jk
#

JkWorkersFile conf/workers.properties
JkMountFile conf/uriworkermap.properties
JkLogFile logs/mod_jk.log
JkLogLevel warn
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>接下来我们在 Apache 的 conf 目录下新建两个文件分别是 workers.properties、uriworkermap.properties。这两个文件的内容大概如下</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">#
# workers.properties
#


# list the workers by name

worker.list=DLOG4J, status

# localhost server 1
# ------------------------
worker.s1.port=8109
worker.s1.host=localhost
worker.s1.type=ajp13

# localhost server 2
# ------------------------
worker.s2.port=8209
worker.s2.host=localhost
worker.s2.type=ajp13
worker.s2.stopped=1

worker.DLOG4J.type=lb
worker.retries=3
worker.DLOG4J.balanced_workers=s1, s2
worker.DLOG4J.sticky_session=1

worker.status.type=status
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>以上的 workers.properties 配置就是我们前面那个屏幕抓图的页面所用的配置。首先我们配置了两个类型为 ajp13 的 worker 分别是 s1 和 s2，它们指向同一台服务器上运行在两个不同端口 8109 和 8209 的 Tomcat 上。接下来我们配置了一个类型为 lb（也就是负载均衡的意思）的 worker，它的名字是 DLOG4J，这是一个逻辑的 worker，它用来管理前面配置的两个物理连接 s1 和 s2。最后还配置了一个类型为 status 的 worker，这是用来监控 JK 本身的模块。有了这三个 worker 还不够，我们还需要告诉 JK，哪些 worker 是可用的，所以就有 <b>worker.list = DLOG4J, status</b> 这行配置。</p>
		<p>接下来便是 URI 的映射配置了，我们需要指定哪些链接是由 Tomcat 处理的，哪些是由 Apache 直接处理的，看看下面这个文件你就能明白其中配置的意义</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">/*=DLOG4J
/jkstatus=status

!/*.gif=DLOG4J
!/*.jpg=DLOG4J
!/*.png=DLOG4J
!/*.css=DLOG4J
!/*.js=DLOG4J
!/*.htm=DLOG4J
!/*.html=DLOG4J
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>相信你已经明白了一大半了：所有的请求都由 DLOG4J 这个 worker 进行处理，但是有几个例外，/jkstatus 请求由 status 这个 worker 处理。另外这个配置中每一行数据前面的感叹号是什么意思呢？感叹号表示接下来的 URI 不要由 JK 进行处理，也就是 Apache 直接处理所有的图片、css 文件、js 文件以及静态 html 文本文件。</p>
		<p>通过对 workers.properties 和 uriworkermap.properties 的配置，可以有各种各样的组合来满足我们前面提出对一个 web 网站的要求。您不妨动手试试！</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center"> </td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/#main">
																				<b> </b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100C4">
						<span class="atitle">http_proxy</span>
				</a>
		</p>
		<p>这是利用 Apache 自带的 mod_proxy 模块使用代理技术来连接 Tomcat。在配置之前请确保是否使用的是 2.2.x 版本的 Apache 服务器。因为 2.2.x 版本对这个模块进行了重写，大大的增强了其功能和稳定性。</p>
		<p>http_proxy 模式是基于 HTTP 协议的代理，因此它要求 Tomcat 必须提供 HTTP 服务，也就是说必须启用 Tomcat 的 HTTP Connector。一个最简单的配置如下</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / http://localhost:8080/
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在这个配置中，我们把所有 http://localhost 的请求代理到 http://localhost:8080/ ，这也就是 Tomcat 的访问地址，除了 images、css、js 几个目录除外。我们同样可以利用 mod_proxy 来做负载均衡，再看看下面这个配置</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">ProxyPass /images !
ProxyPass /css ! 
ProxyPass /js !

ProxyPass / balancer://example/
&lt;Proxy balancer://example/&gt;
BalancerMember http://server1:8080/
BalancerMember http://server2:8080/
BalancerMember http://server3:8080/
&lt;/Proxy&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>配置比 JK 简单多了，而且它也可以通过一个页面来监控集群运行的状态，并做一些简单的维护设置。</p>
		<br />
		<a name="N100EA">
				<b>图 2：监控集群运行状态</b>
		</a>
		<br />
		<img height="427" alt="图 2：监控集群运行状态" src="http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/images/image004.gif" width="553" border="0" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center"> <br /></td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/#main">
																				<b> </b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N100FA">
						<span class="atitle">ajp_proxy</span>
				</a>
		</p>
		<p>ajp_proxy 连接方式其实跟 http_proxy 方式一样，都是由 mod_proxy 所提供的功能。配置也是一样，只需要把 http:// 换成 ajp:// ，同时连接的是 Tomcat 的 AJP Connector 所在的端口。上面例子的配置可以改为：</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td class="code-outline">
										<pre class="displaycode">ProxyPass /images !
ProxyPass /css ! 
ProxyPass /js !

ProxyPass / balancer://example/
&lt;Proxy balancer://example/&gt;
BalancerMember ajp://server1:8080/
BalancerMember ajp://server2:8080/
BalancerMember ajp://server3:8080/
&lt;/Proxy&gt;
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>采用 proxy 的连接方式，需要在 Apache 上加载所需的模块，mod_proxy 相关的模块有 mod_proxy.so、mod_proxy_connect.so、mod_proxy_http.so、mod_proxy_ftp.so、mod_proxy_ajp.so， 其中 mod_proxy_ajp.so 只在 Apache 2.2.x 中才有。如果是采用 http_proxy 方式则需要加载 mod_proxy.so 和 mod_proxy_http.so；如果是 ajp_proxy 则需要加载 mod_proxy.so 和 mod_proxy_ajp.so这两个模块。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/#main">
																				<b>
																						<font color="#5c81a7">回页首</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<br />
		<p>
				<a name="N1010F">
						<span class="atitle">三者比较</span>
				</a>
		</p>
		<p>相对于 JK 的连接方式，后两种在配置上是比较简单的，灵活性方面也一点都不逊色。但就稳定性而言就不像 JK 这样久经考验，毕竟 Apache 2.2.3 推出的时间并不长，采用这种连接方式的网站还不多，因此，如果是应用于关键的互联网网站，还是建议采用 JK 的连接方式。</p>
		<br />
		<br />
		<p>
				<a name="resources">
						<span class="atitle">参考资料 </span>
				</a>
		</p>
		<ul>
				<li>获得 <a href="http://httpd.apache.org/"><font color="#996699">Apache Http Server</font></a>。 <br /><br /></li>
				<li>获得 <a href="http://tomcat.apache.org/"><font color="#5c81a7">Apache Tomcat</font></a>。 <br /><br /></li>
				<li>
						<a href="http://tomcat.apache.org/connectors-doc/">
								<font color="#5c81a7">JK 文档</font>
						</a>。 </li>
		</ul>
<img src ="http://www.blogjava.net/kyleYang/aggbug/329286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-08-18 23:17 <a href="http://www.blogjava.net/kyleYang/archive/2010/08/18/329286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解析Java对象的equals()和hashCode()的使用</title><link>http://www.blogjava.net/kyleYang/archive/2010/08/11/328469.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Wed, 11 Aug 2010 00:44:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/08/11/328469.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/328469.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/08/11/328469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/328469.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/328469.html</trackback:ping><description><![CDATA[
		<div class="Content-body" id="logcontent_82" style="TABLE-LAYOUT: fixed">
				<strong>前言</strong>
				<br />
				<p>在Java语言中，equals()和hashCode()两个函数的使用是紧密配合的，你要是自己设计其中一个，就要设计另外一个。在多数情况 下，这两个函数是不用考虑的，直接使用它们的默认设计就可以了。但是在一些情况下，这两个函数最好是自己设计，才能确保整个程序的正常运行。最常见的是当 一个对象被加入收集对象（collection object）时，这两个函数必须自己设计。更细化的定义是：如果你想将一个对象A放入另一个收集对象B里，或者使用这个对象A为查找一个元对象在收集对 象B里位置的钥匙，并支持是否容纳，删除收集对象B里的元对象这样的操作，那么，equals()和hashCode()函数必须开发者自己定义。其他情 况下，这两个函数是不需要定义的。</p>
				<strong>equals():</strong>
				<p>它是用于进行两个对象的比较的，是对象内容的比较，当然也能用于进行对象参阅值的比较。什么是对象参阅值的比较？就是两个参阅变量的值得比较，我们 都知道参阅变量的值其实就是一个数字，这个数字可以看成是鉴别不同对象的代号。两个对象参阅值的比较，就是两个数字的比较，两个代号的比较。这种比较是默 认的对象比较方式，在Object这个对象中，这种方式就已经设计好了。所以你也不用自己来重写，浪费不必要的时间。</p>对象内容的比较才是设计equals()的真正目的，Java语言对equals()的要求如下，这些要求是必须遵循的。否则，你就不该浪费时间： 
<ul><li>对称性：如果x.equals(y)返回是“true”，那么y.equals(x)也应该返回是“true”。 
</li><li>反射性：x.equals(x)必须返回是“true”。 
</li><li>类推性：如果x.equals(y)返回是“true”，而且y.equals(z)返回是“true”，那么z.equals(x)也应该返回是“true”。 
</li><li>还有一致性：如果x.equals(y)返回是“true”，只要x和y内容一直不变，不管你重复x.equals(y)多少次，返回都是“true”。 
</li><li>任何情况下，x.equals(null)，永远返回是“false”；x.equals(和x不同类型的对象)永远返回是“false”。</li></ul><strong>hashCode():<br /></strong>这 个函数返回的就是一个用来进行赫希操作的整型代号，请不要把这个代号和前面所说的参阅变量所代表的代号弄混了。后者不仅仅是个代号还具有在内存中才查找对 象的位置的功能。hashCode()所返回的值是用来分类对象在一些特定的收集对象中的位置。这些对象是HashMap, Hashtable, HashSet，等等。这个函数和上面的equals()函数必须自己设计，用来协助HashMap, Hashtable, HashSet，等等对自己所收集的大量对象进行搜寻和定位。<br /><br />这些收集对象究竟如何工作的，想象每个元对象hashCode是一个箱子的 编码，按照编码，每个元对象就是根据hashCode()提供的代号归入相应的箱子里。所有的箱子加起来就是一个HashSet，HashMap，或 Hashtable对象，我们需要寻找一个元对象时，先看它的代码，就是hashCode()返回的整型值，这样我们找到它所在的箱子，然后在箱子里，每 个元对象都拿出来一个个和我们要找的对象进行对比，如果两个对象的内容相等，我们的搜寻也就结束。这种操作需要两个重要的信息，一是对象的 hashCode()，还有一个是对象内容对比的结果。<br /><br />hashCode()的返回值和equals()的关系如下：<br /><ul><li>如果x.equals(y)返回“true”，那么x和y的hashCode()必须相等。 
</li><li>如果x.equals(y)返回“false”，那么x和y的hashCode()有可能相等，也有可能不等。</li></ul><p><br />为什么这两个规则是这样的，原因其实很简单，拿HashSet来说吧，HashSet可以拥有一个或更多的箱子，在同一个箱子中可以有一个 或更多的独特元对象（HashSet所容纳的必须是独特的元对象）。这个例子说明一个元对象可以和其他不同的元对象拥有相同的hashCode。但是一个 元对象只能和拥有同样内容的元对象相等。所以这两个规则必须成立。<br /><br /><strong>设计这两个函数所要注意到的：</strong><br />如果你设计的对象类型并不使用于收集性对象，那么没有必要自己再设计这两个函数的处理方式。这是正确的面向对象设计方法，任何用户一时用不到的功能，就先不要设计，以免给日后功能扩展带来麻烦。</p><p>如果你在设计时想别出心裁，不遵守以上的两套规则，那么劝你还是不要做这样想入非非的事。我还没有遇到过哪一个开发者和我说设计这两个函数要违背前面说的两个规则，我碰到这些违反规则的情况时，都是作为设计错误处理。</p><p>当一个对象类型作为收集型对象的元对象时，这个对象应该拥有自己处理equals()，和/或处理hashCode()的设计，而且要遵守前面所说 的两种原则。equals()先要查null和是否是同一类型。查同一类型是为了避免出现ClassCastException这样的异常给丢出来。查 null是为了避免出现NullPointerException这样的异常给丢出来。</p>如果你的对象里面容纳的数据过多，那么这两个函数 equals()和hashCode()将会变得效率低。如果对象中拥有无法serialized的数据，equals()有可能在操作中出现错误。想象 一个对象x，它的一个整型数据是transient型（不能被serialize成二进制数据流）。然而equals()和hashCode()都有依靠 这个整型数据，那么，这个对象在serialization之前和之后，是否一样？答案是不一样。因为serialization之前的整型数据是有效的 数据，在serialization之后，这个整型数据的值并没有存储下来，再重新由二进制数据流转换成对象后，两者（对象在serialization 之前和之后）的状态已经不同了。这也是要注意的。<br /><br /><span style="FONT-WEIGHT: bold">知道以上这些能够帮助你：</span><br />1. 进行更好的设计和开发。<br />2. 进行更好的测试案例开发。<br />3. 在面试过程中让面试者对你的学识渊博感到满意。 </div>
		<div class="Content-body">
				<img style="MARGIN: 0px 2px -4px 0px" alt="" src="http://tmsoft.lsxy.com/images/icon_trackback.gif" />
				<strong>引用通告地址:</strong>
				<span id="tbURL" title="点击复制到剪贴板" style="CURSOR: pointer" onclick="CopyText(document.all.tbURL)">
						<a href="http://tmsoft.lsxy.com/trackback.php?tbID=82&amp;extra=9aff4c">http://tmsoft.lsxy.com/trackback.php?tbID=82&amp;extra=9aff4c</a>
				</span>
		</div>
<img src ="http://www.blogjava.net/kyleYang/aggbug/328469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-08-11 08:44 <a href="http://www.blogjava.net/kyleYang/archive/2010/08/11/328469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript跨浏览器的添加删除事件绑定函数</title><link>http://www.blogjava.net/kyleYang/archive/2010/08/11/328466.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Wed, 11 Aug 2010 00:30:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/08/11/328466.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/328466.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/08/11/328466.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/328466.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/328466.html</trackback:ping><description><![CDATA[
		<h3>javascript跨浏览器添加事件绑定 bind()</h3>
		<p sizset="17" sizcache="4">IE 的<strong>事件绑定</strong>函数是<strong> attachEvent</strong>；而 <a title="Firefox" href="http://www.js8.in/tag/firefox"><font color="#2f63b3">Firefox</font></a>, Safari 是 <strong>addEventListener</strong>；Opera 则两种都支持。使用jQuery就可以使用简单的bind()，或者$().click()之类的函数解决，而如果不使用<a title="JavaScript" href="http://www.js8.in/category/%e7%bd%91%e7%bb%9c%e6%8a%80%e6%9c%af/javascript-%e7%bd%91%e7%bb%9c%e6%8a%80%e6%9c%af"><font color="#2f63b3">JavaScript</font></a>框架的时候，大家可是使用下面的封装bind()函数。        <br /><span style="COLOR: #006600; FONT-STYLE: italic">/************************************<br />* 添加事件绑定<br />* @param obj   : 要绑定事件的元素<br />* @param type : 事件名称。不加 "on". 如 : "click" 而不是 "onclick".<br />* @param fn    : 事件处理函数<br />************************************/</span><br /><span style="FONT-WEIGHT: bold; COLOR: #003366">function</span> bind<span style="COLOR: #009900">(</span> obj<span style="COLOR: #339933">,</span> type<span style="COLOR: #339933">,</span> fn <span style="COLOR: #009900">)</span><span style="COLOR: #009900">{</span><span style="FONT-WEIGHT: bold; COLOR: #000066">if</span><span style="COLOR: #009900">(</span> obj.<span style="COLOR: #660066">attachEvent</span><span style="COLOR: #009900">)</span><span style="COLOR: #009900">{</span><br />        obj<span style="COLOR: #009900">[</span><span style="COLOR: #3366cc">'e'</span><span style="COLOR: #339933">+</span>type<span style="COLOR: #339933">+</span>fn<span style="COLOR: #009900">]</span><span style="COLOR: #339933">=</span> fn<span style="COLOR: #339933">;</span><br />        obj<span style="COLOR: #009900">[</span>type<span style="COLOR: #339933">+</span>fn<span style="COLOR: #009900">]</span><span style="COLOR: #339933">=</span><span style="FONT-WEIGHT: bold; COLOR: #003366">function</span><span style="COLOR: #009900">(</span><span style="COLOR: #009900">)</span><span style="COLOR: #009900">{</span>obj<span style="COLOR: #009900">[</span><span style="COLOR: #3366cc">'e'</span><span style="COLOR: #339933">+</span>type<span style="COLOR: #339933">+</span>fn<span style="COLOR: #009900">]</span><span style="COLOR: #009900">(</span> window.<span style="COLOR: #660066">event</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span><span style="COLOR: #009900">}</span><br />        obj.<span style="COLOR: #660066">attachEvent</span><span style="COLOR: #009900">(</span><span style="COLOR: #3366cc">'on'</span><span style="COLOR: #339933">+</span>type<span style="COLOR: #339933">,</span> obj<span style="COLOR: #009900">[</span>type<span style="COLOR: #339933">+</span>fn<span style="COLOR: #009900">]</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span><span style="COLOR: #009900">}</span><span style="FONT-WEIGHT: bold; COLOR: #000066">else</span><br />        obj.<span style="COLOR: #660066">addEventListener</span><span style="COLOR: #009900">(</span> type<span style="COLOR: #339933">,</span> fn<span style="COLOR: #339933">,</span><span style="FONT-WEIGHT: bold; COLOR: #003366">false</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span><span style="COLOR: #009900">}</span></p>
		<p>
				<span id="more-408">
				</span>例如给document添加一个点击事件      	<br /><span style="FONT-WEIGHT: bold; COLOR: #003366">var</span> fn<span style="COLOR: #339933">=</span><span style="FONT-WEIGHT: bold; COLOR: #003366">function</span><span style="COLOR: #009900">(</span><span style="COLOR: #009900">)</span><span style="COLOR: #009900">{</span><span style="COLOR: #000066">alert</span><span style="COLOR: #009900">(</span><span style="COLOR: #3366cc">"Hello, World!!"</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span><span style="COLOR: #009900">}</span><span style="COLOR: #339933">;</span><br />bind<span style="COLOR: #009900">(</span>document<span style="COLOR: #339933">,</span><span style="COLOR: #3366cc">"click"</span><span style="COLOR: #339933">,</span> fn<span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span></p>
		<h3>删除事件绑定 unbind()</h3>
		<p>unbind()对于上面的bind()函数      	<br /><span style="COLOR: #006600; FONT-STYLE: italic">/************************************<br /> * 删除事件绑定<br /> * @param obj : 要删除事件的元素<br /> * @param type : 事件名称。不加 "on". 如 : "click" 而不是 "onclick"<br /> * @param fn : 事件处理函数<br /> ************************************/</span><br /><span style="FONT-WEIGHT: bold; COLOR: #003366">function</span> unbind<span style="COLOR: #009900">(</span> obj<span style="COLOR: #339933">,</span> type<span style="COLOR: #339933">,</span> fn <span style="COLOR: #009900">)</span><span style="COLOR: #009900">{</span><span style="FONT-WEIGHT: bold; COLOR: #000066">if</span><span style="COLOR: #009900">(</span> obj.<span style="COLOR: #660066">detachEvent</span><span style="COLOR: #009900">)</span><span style="COLOR: #009900">{</span><br />        obj.<span style="COLOR: #660066">detachEvent</span><span style="COLOR: #009900">(</span><span style="COLOR: #3366cc">'on'</span><span style="COLOR: #339933">+</span>type<span style="COLOR: #339933">,</span> obj<span style="COLOR: #009900">[</span>type<span style="COLOR: #339933">+</span>fn<span style="COLOR: #009900">]</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span><br />        obj<span style="COLOR: #009900">[</span>type<span style="COLOR: #339933">+</span>fn<span style="COLOR: #009900">]</span><span style="COLOR: #339933">=</span><span style="FONT-WEIGHT: bold; COLOR: #003366">null</span><span style="COLOR: #339933">;</span><span style="COLOR: #009900">}</span><span style="FONT-WEIGHT: bold; COLOR: #000066">else</span><br />        obj.<span style="COLOR: #660066">removeEventListener</span><span style="COLOR: #009900">(</span> type<span style="COLOR: #339933">,</span> fn<span style="COLOR: #339933">,</span><span style="FONT-WEIGHT: bold; COLOR: #003366">false</span><span style="COLOR: #009900">)</span><span style="COLOR: #339933">;</span><span style="COLOR: #009900">}</span></p>
		<p>例如删除第一个绑定的document点击事件：<br />unbind<span style="COLOR: #009900">(</span>document<span style="COLOR: #339933">,</span><span style="COLOR: #3366cc">"click"</span><span style="COLOR: #339933">,</span>fn<span style="COLOR: #009900">)</span><span style="COLOR: #339933">;<br />摘自：<a href="http://www.js8.in/408.html">http://www.js8.in/408.html</a></span></p>
<img src ="http://www.blogjava.net/kyleYang/aggbug/328466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-08-11 08:30 <a href="http://www.blogjava.net/kyleYang/archive/2010/08/11/328466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实现JavaScript跨浏览器</title><link>http://www.blogjava.net/kyleYang/archive/2010/08/11/328465.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Wed, 11 Aug 2010 00:28:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/08/11/328465.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/328465.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/08/11/328465.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/328465.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/328465.html</trackback:ping><description><![CDATA[
		<p>开发跨浏览器的JavaScript，并不是一件很容易的事，下面是一些经验总结。</p>
		<p>一、动态向表中添加行</p>
		<ul>
				<li>问题：IE中，不能将行增加到表table。 
</li>
				<li>解决方法：将行增加到表体tbody。 
</li>
				<li>示例：<a href="http://www.riafan.com/ajax/javascript/addrow.html">点击查看</a></li>
		</ul>
		<p>二、动态设置元素style属性</p>
		<ul>
				<li>问题：IE下支持object.style.cssText="style:value"，Firefox下使用object.setAttribute("style", value) 
</li>
				<li>解决方法：统一用object.style.属性＝值。 
</li>
				<li>示例：<a href="http://www.riafan.com/ajax/javascript/setstyle.html">点击查看</a></li>
		</ul>
		<p>三、动态设置元素的Class属性</p>
		<ul>
				<li>问题：IE下使用object.setAttribute("className", value)，Firefox下使用object.setAttribute("class", value)。 
</li>
				<li>解决方法：统一用object.className=value。 
</li>
				<li>示例：<a href="http://www.riafan.com/ajax/javascript/setclass.html">点击查看</a></li>
		</ul>
		<p>四、动态创建Input元素</p>
		<ul>
				<li>问题：IE中先添加元素，后设置的属性不起作用。 
</li>
				<li>解决方法：先添加属性，再添加元素。 
</li>
				<li>示例：<a href="http://www.riafan.com/ajax/javascript/addinput.html">点击查看</a></li>
		</ul>
		<p>五、动态设置标签内容</p>
		<ul>
				<li>问题：IE中用innerText属性，相反地，Firefox下用textContent属性。 
</li>
				<li>解决方法：先判断浏览器类型，再分别设置，当然也可以同时设置。还有一种方法就是用innerHTML来替换。 
</li>
				<li>示例：<a href="http://www.riafan.com/ajax/javascript/text.html">点击查看</a></li>
		</ul>
		<p>六、增加和删除Option</p>
		<ul>
				<li>问题：增加Option时，Firefox下不支持object.add方法。删除Option时，Firefox下不支持object.options .remove方法。 
</li>
				<li>解决方法：增加Option时，使用object.options.add方法。删除Option时，使用object.remove方法。另外也可以用DOM的AppendChild和removeChild方法。 
</li>
				<li>示例：<a href="http://www.riafan.com/ajax/javascript/option.html">点击查看</a>  </li>
		</ul>
		<p>七、动态创建单选按钮</p>
		<ul>
				<li>问题：IE不能用setAttribute方法添加name属性，相反地，Firefox下不能用createElement(htmlStr)来添加name属性。 
</li>
				<li>解决方法：先判断浏览器类型，再分别设置。当然也可以同时设置。 
</li>
				<li>示例：<a href="http://www.riafan.com/ajax/javascript/addradio.html">点击查看</a></li>
		</ul>
		<p>八、document.formName.item("itemName")</p>
		<ul>
				<li>问题：IE下，可以使用 document.formName.item("itemName") 或 document.formName.elements ["elementName"]；Firefox下，只能使用document.formName.elements["elementName"]。 
</li>
				<li>解决方法：统一使用document.formName.elements["elementName"]。 </li>
		</ul>
		<p>九、动态创建单选按钮</p>
		<ul>
				<li>问题：IE下，可以使用()或[]获取集合类对象；Firefox下，只能使用 []获取集合类对象。 
</li>
				<li>解决方法：统一使用[]获取集合类对象。 </li>
		</ul>
		<p>十、自定义属性</p>
		<ul>
				<li>问题：IE下，可以使用获取常规属性的方法来获取自定义属性，也可以使用 getAttribute() 获取自定义属性；Firefox下，只能使用 getAttribute() 获取自定义属性 
</li>
				<li>解决方法：统一通过 getAttribute() 获取自定义属性。 </li>
		</ul>
		<p>十一、eval("idName")</p>
		<ul>
				<li>问题：IE下，可以使用 eval("idName") 或 getElementById("idName") 来取得 id 为 idName 的HTML对象；Firefox下，只能使用 getElementById("idName") 来取得 id 为 idName 的HTML对象。 
</li>
				<li>解决方法：统一用 getElementById("idName") 来取得 id 为 idName 的HTML对象。 </li>
		</ul>
		<p>十二、event.srcElement</p>
		<ul>
				<li>问题：IE下，even对象有srcElement属性，但是没有target属性；Firefox下，even对象有target属性，但是没有srcElement属性。 
</li>
				<li>解决方法：使用srcObj = event.srcElement ? event.srcElement : event.target; </li>
		</ul>
		<p>十三、访问的父元素</p>
		<ul>
				<li>问题：在IE下，使用obj.parentElement或obj.parentNode访问obj的父结点；在firefox下，使用obj.parentNode访问obj的父结点。 
</li>
				<li>解决方法：因为firefox与IE都支持DOM，因此统一使用obj.parentNode 来访问obj的父结点。 </li>
		</ul>
		<p>十四、innerText</p>
		<ul>
				<li>问题：innerText在IE中能正常工作，但是innerText在FireFox中却不行。 
</li>
				<li>解决方法：在非IE浏览器中使用textContent代替innerText。 </li>
		</ul>
		<p>十五、模态和非模态窗口问题</p>
		<ul>
				<li>问题：IE下，可以通过showModalDialog和showModelessDialog打开模态和非模态窗口；Firefox下则不能。 
</li>
				<li>解决方法：直接使用 window.open(pageURL,name,parameters) 方式打开新窗口。如果需要将子窗口中的参数传递回父窗口，可以在子窗口中使用window.opener来访问父窗口。如果需要父窗口控制子窗口的话，使用var subWindow = window.open(pageURL,name,parameters); 来获得新开的窗口对象。 </li>
		</ul>
		<p>十六、frame和iframe问题</p>
		<ul>
				<li>问题：要访问frame对象，IE下使用window.frameId或者window.frameName来访问这个frame对象；Firefox下使用window.frameName来访问这个frame对象； 
</li>
				<li>解决方法：统一使用 window.document.getElementById("frameId") 来访问这个frame对象。在IE和Firefox中都可以使用window.document.getElementById("frameId").src 或window.frameName.location来切换frame的内容；如果需要将frame中的参数传回父窗口，可以在frame中使用parent关键字来访问父窗口。</li>
		</ul>
<img src ="http://www.blogjava.net/kyleYang/aggbug/328465.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-08-11 08:28 <a href="http://www.blogjava.net/kyleYang/archive/2010/08/11/328465.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle中显式游标和隐式游标比较</title><link>http://www.blogjava.net/kyleYang/archive/2010/08/10/328420.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Tue, 10 Aug 2010 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/08/10/328420.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/328420.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/08/10/328420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/328420.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/328420.html</trackback:ping><description><![CDATA[
		<div>
				<font style="FONT-SIZE: 12px" face="宋体" color="#000080" size="3">   在数据库中，游标是一个十分重要的概念，游标提供了一种灵活手段，可以对表中检索出的数据进行操作。就本质而言，游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。<br />   游标由结果集和结果集中指向特定记录的游标位置组成，游标充当指针的作用。尽管游标能够遍历查询结果中的所有行，但它一次只能指向一行。<br />   使用数据游标可以选择一组数据，可以在记录集上滚动游标，并检查游标指向的每一行数据。可以用局部变量和游标的组合来分别检查每个记录，并在转移到下一个记录之前，进行所需的任何外部操作。游标的另一个常见用途是保存查询结果，以便以后使用。游标的结果集是由select语句产生，如果处理过程需要重复使用一个记录集，那么创建一次游标而重复使用若干次，比重复查询数据库要快得多。<br />    显式游标</font>
		</div>
		<div>
				<font style="FONT-SIZE: 12px" face="宋体" color="#000080" size="3">    在大多数时候我们在设计程序的时候都遵循下面的步骤:<br />　　　1、打开游标<br />　　　2、开始循环<br />　　　3、从游标中取值<br />　　  4、检查那一行被返回<br />　　  5、处理<br />　　  6、关闭循环<br />　　  7、关闭游标<br />但还有一种游标与这种不相同，这就是FOR循环，用于FOR循环的游标按照正常的声明方式声明，它的优点在于不需要显式的打开、关闭、取数据，测试数据的存在、定义存放数据的变量等等。</font>
		</div>
<img src ="http://www.blogjava.net/kyleYang/aggbug/328420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-08-10 15:29 <a href="http://www.blogjava.net/kyleYang/archive/2010/08/10/328420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle Exception</title><link>http://www.blogjava.net/kyleYang/archive/2010/08/03/327806.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Tue, 03 Aug 2010 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/08/03/327806.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/327806.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/08/03/327806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/327806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/327806.html</trackback:ping><description><![CDATA[1) 基本结构<br />  BEGIN<br />    ... --语句<br />  EXCEPTION -- 例外处理 <br />    WHEN ...<br />    ...<br />    WHEN OTHERS<br />      ...<br />  END;
<p>  2) 常用预定义例外<br />  EXCEPTION <br />    WHEN CURSOR_ALREADY_OPEN THEN -- ORA-06511 SQLCODE = -6511 游标已经打开<br />      ...<br />    WHEN DUP_VAL_ON_INDEX THEN -- ORA-00001 SQLCODE = -1 向唯一索引中插入重复数据<br />      ...<br />    WHEN INVALID_CURSOR THEN -- ORA-01001 SQLCODE = -1001 非法游标操作<br />      ...<br />    WHEN INVALID_NUMBER THEN -- ORA-01722 SQLCODE = -1722 字符向数字转换失败<br />      ...<br />    WHEN LOGIN_DENIED THEN -- ORA-01017 SQLCODE = -1017 <br />      ...<br />    WHEN NO_DATA_FOUND THEN -- ORA-01403 SQLCODE = +100 没有找到数据<br />      ...<br />    WHEN NOT_LOGGED_ON THEN -- ORA-01012 SQLCODE = -1012 <br />      ...<br />    WHEN PROGRAM_ERROR THEN -- ORA-06501 SQLCODE = -6501 程序错误<br />      ...<br />    WHEN STORAGE_ERROR THEN -- ORA-06500 SQLCODE = -6500 <br />      ...<br />    WHEN TIMEOUT_ON_RESOURCE THEN -- ORA-00051 SQLCODE = -51<br />      ...<br />    WHEN TOO_MANY_ROWS THEN -- ORA-01422 SQLCODE = -1422 返回多行<br />      ...<br />    WHEN TRANSACTION_BACKED_OUT THEN -- ORA-00061 SQLCODE = -61<br />      ...<br />    WHEN VALUE_ERROR THEN -- ORA-06502 SQLCODE = -6502 数值转换错误<br />      ...<br />    WHEN ZERO_DIVIDE THEN -- ORA-01476 SQLCODE = -1476 被零除<br />      ...<br />    WHEN OTHERS THEN -- 其它任何错误的处理<br />      ...<br />  END;</p><p>  3) 用户定义的例外<br />  DECLARE<br />    FIND_DATA_EMP    EXCEPTION;<br />  BEGIN<br />    IF ... THEN<br />      RAISE FIND_DATA_EMP;<br />    END IF;<br />  EXCEPTION<br />    WHEN LOB_NO_LOCKED THEN<br />      ...<br />  END;<br />  4) EXCEPTION_INIT的使用<br />  PRAGMA EXCEPTION_INIT(例外名, ORACLE错误号);<br />  注：PRAGMA 是一个编译器命令，可以认为是对编译器的一个注释。<br />  例：<br />  DECLARE<br />    ZERO_DIVIDE1    EXCEPTION;<br />    PRAGMA EXCEPTION_INIT(ZERO_DIVIDE1, -1476);<br />  BEGIN<br />    ...<br />  EXCEPTION<br />    WHEN ZERO_DIVIDE1 THEN<br />      ...<br />  END;</p><img src ="http://www.blogjava.net/kyleYang/aggbug/327806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-08-03 11:32 <a href="http://www.blogjava.net/kyleYang/archive/2010/08/03/327806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2递归查询</title><link>http://www.blogjava.net/kyleYang/archive/2010/07/30/327585.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Fri, 30 Jul 2010 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/07/30/327585.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/327585.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/07/30/327585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/327585.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/327585.html</trackback:ping><description><![CDATA[
		<p>db2中的递归查询使用with来实现，也称为公共表达式，公共表达式在select语句的开始部分采用with子句的形式，在使用公共表达式的查询中可以多次使用它，并且公共表达式还可以通过取别名来连接到他本身，这样的话就可以达到循环的目的。<br />递归查询通常有3个部分需要定义：<br />一：一个公共表达式形式的虚拟表。<br />二：一个初始化表。<br />三：一个与虚拟表进行完全内连接的辅助表。<br />需要使用UNION all合并上边3个查询，然后用select从递归输出中得到最终的结果。<br />大体上如下形式<br />with XX(x1,x2,x3) as  <a href="mailto:-------@0">-------@0</a><br />(<br /> select a.s,a.s1 from a  <a href="mailto:----@1">----@1</a><br /> union all  <a href="mailto:----@2">----@2</a><br /> select * from a,xx where a.s=xx.x1 <a href="mailto:------@3">------@3</a><br />)<br />select ... from xx where .... <a href="mailto:-------@4">-------@4</a><br />@0:为with体，即虚拟表<br />@1:为初始化表，这里需要定义初始化的一些行，也就是你递归的出发点，或者说父行，这部分逻辑只执行一次，它的结果作为虚拟表递归的初始化内容。<br />@2:这里必须用UNION all<br />@3:这里需要定义递归的条件（辅助表），这里定义递归的逻辑，需要注意的是父行和子行进行连接的时候逻辑一定要清楚父子关系，不然很容易变成死循环的，这里首先将初始化表的结果作为条件进行查询，在把执行的结果添加到虚拟表中，只要这里能查询出来记录，那么就会进行下一步递归循环。<br />@4:这里就是对虚拟表的查询语句。<br /><br />例子：<br />WITH ROOT AS <br />(<br /> SELECT a.id, a.areaname<br /> FROM AREATB a<br /> WHERE a.id = #id#<br /> UNION ALL<br /> SELECT a.id, a.areaname<br /> FROM AREATB a, ROOT r<br /> WHERE a.id = r.id<br />)</p>
		<p>SELECT id, areaname<br />FROM ROOT</p>
<img src ="http://www.blogjava.net/kyleYang/aggbug/327585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-07-30 16:36 <a href="http://www.blogjava.net/kyleYang/archive/2010/07/30/327585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle索引的5种使用模式</title><link>http://www.blogjava.net/kyleYang/archive/2010/07/26/327107.html</link><dc:creator>飞熊</dc:creator><author>飞熊</author><pubDate>Sun, 25 Jul 2010 16:28:00 GMT</pubDate><guid>http://www.blogjava.net/kyleYang/archive/2010/07/26/327107.html</guid><wfw:comment>http://www.blogjava.net/kyleYang/comments/327107.html</wfw:comment><comments>http://www.blogjava.net/kyleYang/archive/2010/07/26/327107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kyleYang/comments/commentRss/327107.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kyleYang/services/trackbacks/327107.html</trackback:ping><description><![CDATA[索引的使用对数据库的性能有巨大的影响。 <br />共有五类不同的使用模式。 <br /><br />1。INDEX UNIQUE SCAN    效率最高，主键或唯一索引 <br />2。INDEX FULL SCAN      有顺序的输出，不能并行读索引 <br />3。INDEX FAST FULL SCAN  读的最块，可以并行访问索引，但输出不按顺序 <br />4。INDEX RANGE SCAN      给定的区间查询 <br />5。INDEX SKIP SCAN       联合索引，不同值越少的列，越要放在前面 <br /><br />--实验后的总论。 <br />能用唯一索引，一定用唯一索引 <br />能加非空，就加非空约束 <br />一定要统计表的信息，索引的信息，柱状图的信息。 <br />联合索引的顺序不同，影响索引的选择，尽量将值少的放在前面 <br />只有做到以上四点，数据库才会正确的选择执行计划。 <br />conn system/manager <br />grant select any dictionary to scott; <br /><br />conn scott/tiger <br />drop table t1 purge; <br />create table t1 as select * from dba_objects; <br />analyze table t1 compute statistics; <br />create index it1 on t1(object_type); <br />set autot traceonly <br /><br />select distinct object_type from t1; <br />将是全表扫描，为什么不使用索引呢？因为索引中不能含有null值， <br />如果使用索引就可能产生不正确的结果。 <br /><br />--增加非空约束 <br />alter table t1 modify (object_type not null); <br />select distinct object_type from t1  ; <br />使用INDEX FAST FULL SCAN方式查找数据 <br /><br />-- <br />select  object_type from t1; <br />使用INDEX FAST FULL SCAN，因为不需要排序 <br /><br />select  object_type from t1 order by 1; <br />使用INDEX FULL SCAN,因为要按照顺序输出 <br /><br />select  object_type from t1 where object_type='TABLE'; <br />使用INDEX RANGE SCAN <br /><br />--使用非唯一索引 <br />create index i2t1 on t1(object_id); <br />select * from t1 where object_id=3762; <br />使用INDEX RANGE SCAN,因为数据库不知道是否唯一 <br /><br />--使用唯一索引 <br />drop index i2t1; <br />create unique index i2t1 on t1(object_id); <br />使用INDEX UNIQUE SCAN,因为数据库知道是唯一的 <br /><br />--跳跃的扫描索引 <br />create index i3t1 on t1(object_type,object_name); <br />select * from t1 where object_name='EMP'; <br />select object_name from t1 where object_name='EMP'; <br />使用INDEX SKIP SCAN，因为数据库知道可以跳过object_type,虽然object_name在第二个列。 <br /><br />--联合索引的顺序不同，影响索引的选择，尽量将值少的放在前面 <br />drop index i3t1; <br />drop index it1; <br />create index i3t1 on t1(object_name,object_type); <br />select * from t1 where object_type='TABLE'; <br />计划为全表扫描。 <img src ="http://www.blogjava.net/kyleYang/aggbug/327107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kyleYang/" target="_blank">飞熊</a> 2010-07-26 00:28 <a href="http://www.blogjava.net/kyleYang/archive/2010/07/26/327107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>