﻿<?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-贤仁居 George Gong-随笔分类-JAVA&amp;&amp;J2EE</title><link>http://www.blogjava.net/gentoo1439/category/24056.html</link><description>It's never too late to learn</description><language>zh-cn</language><lastBuildDate>Thu, 21 Nov 2013 12:18:32 GMT</lastBuildDate><pubDate>Thu, 21 Nov 2013 12:18:32 GMT</pubDate><ttl>60</ttl><item><title>tomcat下用Log4j 按文件大小，生成catalina.out日志文件(转)</title><link>http://www.blogjava.net/gentoo1439/archive/2013/11/21/406634.html</link><dc:creator>George Gong</dc:creator><author>George Gong</author><pubDate>Thu, 21 Nov 2013 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/gentoo1439/archive/2013/11/21/406634.html</guid><wfw:comment>http://www.blogjava.net/gentoo1439/comments/406634.html</wfw:comment><comments>http://www.blogjava.net/gentoo1439/archive/2013/11/21/406634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gentoo1439/comments/commentRss/406634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gentoo1439/services/trackbacks/406634.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/function413/article/details/8485822">http://blog.csdn.net/function413/article/details/8485822<br /><br /></a><h2><span style="font-family: Cambria;">一、</span>下载所需类包 （可在<a href="http://download.csdn.net/detail/function413/4977751" style="color: #336699; text-decoration: none;">http://download.csdn.net/detail/function413/4977751</a>中下载tomcat log4j.rar 里面包含以下JAR包）</h2><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; text-indent: -18pt; margin: 0cm 0cm 0pt 39pt;"><span style="font-family: Calibri;">1、</span>下载<span style="font-family: Calibri;">log4j</span>下载<span style="font-family: Calibri;">1.2</span>以后的版本</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; margin: 0cm 0cm 0pt 39pt;">下载地址：<span style="font-family: Calibri;">http://logging.apache.org/log4j/1.2/download.html</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; text-indent: -18pt; margin: 0cm 0cm 0pt 39pt;"><span style="font-family: Calibri;">2、</span>下载<span style="font-family: Calibri;">tomcat-juli.jar</span>，<span style="font-family: Calibri;">tomcat-juli-adapters.jar</span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; margin: 0cm 0cm 0pt 21pt;">使用<span style="font-family: Calibri;">LOG4J</span>来接管<span style="font-family: Calibri;">tomcat6.0.18</span>的日志文件必须要下载两个文件：<span style="font-family: Calibri;">tomcat-juli.jar</span>，<span style="font-family: Calibri;">tomcat-juli-adapters.jar</span>。</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; margin: 0cm 0cm 0pt 21pt;">下载地址为：<a href="http://www.apache.org/dist/tomcat/tomcat-6/v6.0.18/bin/extras/" rel="nofollow" style="color: #336699; text-decoration: none;"><span style="font-family: Calibri;">http://www.apache.org/dist/tomcat/tomcat-6/v6.0.18/bin/extras/</span></a><span style="font-family: Calibri;">&nbsp;(</span>如果<span style="font-family: Calibri;">tomcat</span>为其他版本，请下载对应版本的类包<span style="font-family: Calibri;">)</span></p><h2><a name="t1" style="color: rgb(51, 102, 153);"></a><span style="font-family: Cambria;">二、</span>修改相关配置文件</h2><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; text-indent: -18pt; margin: 0cm 0cm 0pt 39pt;"><span style="font-family: Calibri;">1、</span><span style="font-size: 7pt; line-height: normal; font-family: 'Times New Roman';"></span><span style="color: #ff0000;">修改<span style="font-family: Calibri;">${catalina.home}/conf/context.xml</span></span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; margin: 0cm 0cm 0pt 39pt;"><span style="background-color: #999999;"><span style="background-color: #ccffff;"><span style="color: #ff0000;">修改：&lt;Context &gt;为&lt;Context swallowOutput="true" &gt;只有这样才能完全的把tomcat的stdout给接管过来。<strong>这一步很关键 在官网及<strong>网上</strong>找了许多资料都没有提及。</strong></span></span></span></p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; text-indent: -18pt; margin: 0cm 0cm 0pt 39pt;"><span style="font-family: Calibri;">2、</span>复制<span style="font-family: Calibri;">log4j.jar</span>到<span style="font-family: Calibri;">${catalina.home}/lib</span>下</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; text-indent: -18pt; margin: 0cm 0cm 0pt 39pt;"><span style="font-family: Calibri;">3、</span>复制<span style="font-family: Calibri;">tomcat-juli-adapters.jar</span>到<span style="font-family: Calibri;">${catalina.home}/lib</span>下</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; text-indent: -18pt; margin: 0cm 0cm 0pt 39pt;"><span style="font-family: Calibri;">4、</span>复制<span style="font-family: Calibri;">tomcat-juli.jar</span>到<span style="font-family: Calibri;">${catalina.home}/bin</span>下，在该目录会存在该文件，覆盖 即可</p><p style="color: #333333; font-family: Arial; line-height: 26px; background-color: #ffffff; text-indent: -18pt; margin: 0cm 0cm 0pt 39pt;"><span style="font-family: Calibri;">5、</span>建立<span style="font-family: Calibri;">log4j.properties,</span>并把其放到<span style="font-family: Calibri;">${catalina.home}/lib</span>下</p><img src ="http://www.blogjava.net/gentoo1439/aggbug/406634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gentoo1439/" target="_blank">George Gong</a> 2013-11-21 14:43 <a href="http://www.blogjava.net/gentoo1439/archive/2013/11/21/406634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>maven builder :auto build 恶心的东西</title><link>http://www.blogjava.net/gentoo1439/archive/2010/04/30/319770.html</link><dc:creator>George Gong</dc:creator><author>George Gong</author><pubDate>Fri, 30 Apr 2010 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/gentoo1439/archive/2010/04/30/319770.html</guid><wfw:comment>http://www.blogjava.net/gentoo1439/comments/319770.html</wfw:comment><comments>http://www.blogjava.net/gentoo1439/archive/2010/04/30/319770.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/gentoo1439/comments/commentRss/319770.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gentoo1439/services/trackbacks/319770.html</trackback:ping><description><![CDATA[最近开始用eclipse3.5，下载了maven插件m2eclipse，使用后才发现每次project clean的时候这个maven builder都会自动执行，这个很恶心。google了半天也没找到解决办法，恶心。
<img src ="http://www.blogjava.net/gentoo1439/aggbug/319770.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gentoo1439/" target="_blank">George Gong</a> 2010-04-30 11:24 <a href="http://www.blogjava.net/gentoo1439/archive/2010/04/30/319770.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ANT脚本将Maven Dependencies的jar包copy到WEB-INF下</title><link>http://www.blogjava.net/gentoo1439/archive/2010/04/30/319745.html</link><dc:creator>George Gong</dc:creator><author>George Gong</author><pubDate>Thu, 29 Apr 2010 16:12:00 GMT</pubDate><guid>http://www.blogjava.net/gentoo1439/archive/2010/04/30/319745.html</guid><wfw:comment>http://www.blogjava.net/gentoo1439/comments/319745.html</wfw:comment><comments>http://www.blogjava.net/gentoo1439/archive/2010/04/30/319745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gentoo1439/comments/commentRss/319745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gentoo1439/services/trackbacks/319745.html</trackback:ping><description><![CDATA[<p>系统之前一直用的是maven-artifact-ant-2.0.4-dep.jar，但最近对一些jar包支持不好，运行ant脚本出现以下问题：</p>
[artifact:dependencies] [WARNING] POM for 'ch.qos.logback:logback-classic:pom:0.9.9' is invalid. It will be ignored for artifact resolution. Reason: The POM expression: ${parent.version} could not be evaluated. Reason: ch.qos.logback:logback-classic:jar:${parent.version} references itself.<br />
<br />
这样的话这个忽略的jar包就得手动copy了，这样你还得找这个jar包依赖的其他jar包是不是存在。后来在网上google了一下，发现现在都用maven-ant-tasks-2.1.0.jar，然后对build.xml稍作改动，如下即可：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">project&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="hehe"</span><span style="color: #ff0000">&nbsp;default</span><span style="color: #0000ff">="maven-jar"</span><span style="color: #ff0000">&nbsp;xmlns:artifact</span><span style="color: #0000ff">="urn:maven-artifact-ant"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">file</span><span style="color: #0000ff">="build.properties"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">target&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="maven-jar"</span><span style="color: #ff0000">&nbsp;description</span><span style="color: #0000ff">="Use&nbsp;Maven2&nbsp;to&nbsp;manage&nbsp;jars'&nbsp;dependencies"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">echo&nbsp;</span><span style="color: #ff0000">message</span><span style="color: #0000ff">="deleting&nbsp;old&nbsp;jar&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />..&nbsp;"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">delete&nbsp;</span><span style="color: #ff0000">dir</span><span style="color: #0000ff">="${web.dir}/WEB-INF/lib"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">copy&nbsp;</span><span style="color: #ff0000">todir</span><span style="color: #0000ff">="${web.dir}/WEB-INF/lib"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">fileset&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="runtimeFiles"</span><span style="color: #ff0000">&nbsp;dir</span><span style="color: #0000ff">="lib/mylib"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">include&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="**/*.jar"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">fileset</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">mapper&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="flatten"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">copy</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">echo&nbsp;</span><span style="color: #ff0000">message</span><span style="color: #0000ff">="Use&nbsp;Maven2&nbsp;to&nbsp;manage&nbsp;jar<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />."</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">typedef&nbsp;</span><span style="color: #ff0000">resource</span><span style="color: #0000ff">="org/apache/maven/artifact/ant/antlib.xml"</span><span style="color: #ff0000">&nbsp;uri</span><span style="color: #0000ff">="urn:maven-artifact-ant"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">classpath</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">pathelement&nbsp;</span><span style="color: #ff0000">location</span><span style="color: #0000ff">="lib/maven-ant-tasks-2.1.0.jar"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">classpath</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">typedef</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">artifact:pom&nbsp;</span><span style="color: #ff0000">file</span><span style="color: #0000ff">="pom.xml"</span><span style="color: #ff0000">&nbsp;id</span><span style="color: #0000ff">="my.pom"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">artifact:dependencies&nbsp;</span><span style="color: #ff0000">pathId</span><span style="color: #0000ff">="dependency.classpath"</span><span style="color: #ff0000">&nbsp;filesetId</span><span style="color: #0000ff">="dependency.fileset"</span><span style="color: #ff0000">&nbsp;usescope</span><span style="color: #0000ff">="runtime"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">pom&nbsp;</span><span style="color: #ff0000">refid</span><span style="color: #0000ff">="my.pom"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">artifact:dependencies</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">copy&nbsp;</span><span style="color: #ff0000">todir</span><span style="color: #0000ff">="${web.dir}/WEB-INF/lib"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">fileset&nbsp;</span><span style="color: #ff0000">refid</span><span style="color: #0000ff">="dependency.fileset"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">mapper&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="flatten"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">copy</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">target</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">project</span><span style="color: #0000ff">&gt;</span></div>
这样就OK了<br />
&nbsp;
<img src ="http://www.blogjava.net/gentoo1439/aggbug/319745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gentoo1439/" target="_blank">George Gong</a> 2010-04-30 00:12 <a href="http://www.blogjava.net/gentoo1439/archive/2010/04/30/319745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat与nginx &amp; apache 在windows server 2003 （64位） 下的集群</title><link>http://www.blogjava.net/gentoo1439/archive/2010/01/15/309657.html</link><dc:creator>George Gong</dc:creator><author>George Gong</author><pubDate>Fri, 15 Jan 2010 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/gentoo1439/archive/2010/01/15/309657.html</guid><wfw:comment>http://www.blogjava.net/gentoo1439/comments/309657.html</wfw:comment><comments>http://www.blogjava.net/gentoo1439/archive/2010/01/15/309657.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/gentoo1439/comments/commentRss/309657.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gentoo1439/services/trackbacks/309657.html</trackback:ping><description><![CDATA[<p>由于项目中的小文件太多，都是几K的小文件，有100多G，所以必须要提升静态文件的访问速度。一开始用Nginx 与 Tomcat做集群，Nginx负责静态资源的响应。Nginx在Linux下跑的很爽，到Windows下就不太好了。Nginx前段时间推出了Windows版，拿来一试，感觉不太稳定。在一个刀片机下作测试很好，但弄到正式环境下就不行了，ext tree显示不出来，而且要等很久，最后页面提示：ext无法显示。最后跟同事商量，觉得还是apache+tomcat在windows下比较稳定，转手弄apache+tomcat。<br />
<br />
apache官方没有提供win64版本，就找了一个外国哥们在Vistual Studio 2005 下自己编译的win64 apache，在测试机上安装很轻松，然后布了2个tomcat，又在apache的mem cache中设置了3G的内存做缓存，测试一切OK。接着弄正式服务器，第一台正式服务器很顺利，几分钟就搞定了。第二台服务器就出了问题，apache无法启动，提示：&#8220;由于应用程序配置不正确 应用程序未能启动。重新安装应用程序可能会纠正这个问题&#8221;。然后查看这两台服务器有何差异，最后发现第一台上有.net framework 2,3,3.5，第二台上一个.net framework 都没有。接着装.net framework 2.0 service,还是不行。有文章说要安装 vc redistribute 包，到微软官方下载安装，还是不行，郁闷。最后没办法，又下载安装.ner framework 3.0，还是不行，靠！这时候我都不报希望了，又下载安装.net framework 3.5，然后发现apache 可以了！最后一分钟搞定第二台服务器的apache+tomcat。<br />
<br />
我的apache+tomcat用的是ajp proxy通信方式，设置session sticky。<br />
<br />
好了，接下来观察几天看看效果如何</p>
<img src ="http://www.blogjava.net/gentoo1439/aggbug/309657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gentoo1439/" target="_blank">George Gong</a> 2010-01-15 11:28 <a href="http://www.blogjava.net/gentoo1439/archive/2010/01/15/309657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>64位的Windows2003 Server上添加Tomcat服务</title><link>http://www.blogjava.net/gentoo1439/archive/2009/03/31/263191.html</link><dc:creator>George Gong</dc:creator><author>George Gong</author><pubDate>Tue, 31 Mar 2009 09:32:00 GMT</pubDate><guid>http://www.blogjava.net/gentoo1439/archive/2009/03/31/263191.html</guid><wfw:comment>http://www.blogjava.net/gentoo1439/comments/263191.html</wfw:comment><comments>http://www.blogjava.net/gentoo1439/archive/2009/03/31/263191.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/gentoo1439/comments/commentRss/263191.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gentoo1439/services/trackbacks/263191.html</trackback:ping><description><![CDATA[<p>由于项目中用到，特在此做一笔记：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.Tomcat为6.0.14，解压版。首先说明一点:Tomcat本身是32位的，所以64位操作系统的话要覆盖两个文件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到<a href="http://svn.apache.org/viewvc/tomcat/tc6.0.x/tags/TOMCAT_6_0_14/res/procrun/amd64/">http://svn.apache.org/viewvc/tomcat/tc6.0.x/tags/TOMCAT_6_0_14/res/procrun/amd64/</a>&nbsp; 下载tomcat6.exe和tomcat6w.exe两个文件。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.将上面下载的两个文件覆盖$TOMCAT_HOME/bin下对应的文件。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.命令行到$TOMCAT_HOME/bin下，运行service install命令。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.修改服务为自启动，OK。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PS:<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里有点小问题，系统中用的Java为Oracle jrockit，所以安装后的路径同SUN的Java有所不同。而$TOMCAT_HOME/bin下的service.bat显然是为SUN的Java准备的，如下：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 14pt; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">rem&nbsp;Set&nbsp;the&nbsp;server&nbsp;jvm&nbsp;from&nbsp;JAVA_HOME<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: red">set&nbsp;PR_JVM=%JAVA_HOME%\jre\bin\server\jvm.dll</span><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />if&nbsp;exist&nbsp;"%PR_JVM%"&nbsp;goto&nbsp;foundJvm<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />rem&nbsp;Set&nbsp;the&nbsp;client&nbsp;jvm&nbsp;from&nbsp;JAVA_HOME<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />set&nbsp;PR_JVM=%JAVA_HOME%\jre\bin\client\jvm.dll<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />if&nbsp;exist&nbsp;"%PR_JVM%"&nbsp;goto&nbsp;foundJvm<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />set&nbsp;PR_JVM=auto<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />:foundJvm<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />echo&nbsp;Using&nbsp;JVM:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%PR_JVM%</span></div>
<br />
&nbsp;&nbsp;&nbsp; 标红的是Sun Java的安装路径，而Jrockit为<span style="color: #ff0000">%JAVA_HOME%\jre\bin\jrockit\jvm.dll</span>。<br />
<br />
<br />
&nbsp;&nbsp;&nbsp; 还有一点是：有的帖子说覆盖文件前要先运行tomcat6w.exe记录下各参数，其实完全没必要。运行server install命令后参数会自动添入。 
<img src ="http://www.blogjava.net/gentoo1439/aggbug/263191.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gentoo1439/" target="_blank">George Gong</a> 2009-03-31 17:32 <a href="http://www.blogjava.net/gentoo1439/archive/2009/03/31/263191.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Introduction to the Spring Framework 2.5</title><link>http://www.blogjava.net/gentoo1439/archive/2007/10/31/157103.html</link><dc:creator>George Gong</dc:creator><author>George Gong</author><pubDate>Wed, 31 Oct 2007 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/gentoo1439/archive/2007/10/31/157103.html</guid><wfw:comment>http://www.blogjava.net/gentoo1439/comments/157103.html</wfw:comment><comments>http://www.blogjava.net/gentoo1439/archive/2007/10/31/157103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gentoo1439/comments/commentRss/157103.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gentoo1439/services/trackbacks/157103.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://www.theserverside.com/tt/articles/article.tss?l=IntrotoSpring25October 2007&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/gentoo1439/archive/2007/10/31/157103.html'>阅读全文</a><img src ="http://www.blogjava.net/gentoo1439/aggbug/157103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gentoo1439/" target="_blank">George Gong</a> 2007-10-31 09:23 <a href="http://www.blogjava.net/gentoo1439/archive/2007/10/31/157103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>介绍一篇关于session的好文章,写的很详细(转)</title><link>http://www.blogjava.net/gentoo1439/archive/2007/10/29/156652.html</link><dc:creator>George Gong</dc:creator><author>George Gong</author><pubDate>Mon, 29 Oct 2007 05:15:00 GMT</pubDate><guid>http://www.blogjava.net/gentoo1439/archive/2007/10/29/156652.html</guid><wfw:comment>http://www.blogjava.net/gentoo1439/comments/156652.html</wfw:comment><comments>http://www.blogjava.net/gentoo1439/archive/2007/10/29/156652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gentoo1439/comments/commentRss/156652.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gentoo1439/services/trackbacks/156652.html</trackback:ping><description><![CDATA[<div class="contant">
<p>http://hmily.blueidea.com/archives/2007/4508.shtml<br />
<br />
目录：<br />
一、术语session<br />
二、HTTP协议与状态保持<br />
三、理解cookie机制<br />
四、理解session机制<br />
五、理解javax.servlet.http.HttpSession<br />
六、HttpSession常见问题<br />
七、跨应用程序的session共享<br />
八、总结<br />
参考文档</p>
<p>一、术语session<br />
在我的经验里，session这个词被滥用的程度大概仅次于transaction，更加有趣的是transaction与session在某些语境下的含义是相同的。</p>
<p>session，中文经常翻译为会话，其本来的含义是指有始有终的一系列动作/消息，比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。有时候我们可以看到这样的话&#8220;在一个浏览器会话期间，...&#8221;，这里的会话一词用的就是其本义，是指从一个浏览器窗口打开到关闭这个期间 ①。最混乱的是&#8220;用户（客户端）在一次会话期间&#8221;这样一句话，它可能指用户的一系列动作（一般情况下是同某个具体目的相关的一系列动作，比如从登录到选购商品到结账登出这样一个网上购物的过程，有时候也被称为一个transaction），然而有时候也可能仅仅是指一次连接，也有可能是指含义①，其中的差别只能靠上下文来推断②。</p>
<p>然而当session一词与网络协议相关联时，它又往往隐含了&#8220;面向连接&#8221;和/或&#8220;保持状态&#8221;这样两个含义， &#8220;面向连接&#8221;指的是在通信双方在通信之前要先建立一个通信的渠道，比如打电话，直到对方接了电话通信才能开始，与此相对的是写信，在你把信发出去的时候你并不能确认对方的地址是否正确，通信渠道不一定能建立，但对发信人来说，通信已经开始了。&#8220;保持状态&#8221;则是指通信的一方能够把一系列的消息关联起来，使得消息之间可以互相依赖，比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有&#8220;一个TCP session&#8221;或者 &#8220;一个POP3 session&#8221;③。</p>
<p>而到了web服务器蓬勃发展的时代，session在web开发语境下的语义又有了新的扩展，它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。有时候session也用来指这种解决方案的存储结构，如&#8220;把xxx保存在session 里&#8221;⑤。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持，所以在某种特定语言的语境下，session也被用来指代该语言的解决方案，比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。</p>
<p>鉴于这种混乱已不可改变，本文中session一词的运用也会根据上下文有不同的含义，请大家注意分辨。<br />
在本文中，使用中文&#8220;浏览器会话期间&#8221;来表达含义①，使用&#8220;session机制&#8221;来表达含义④，使用&#8220;session&#8221;表达含义⑤，使用具体的&#8220;HttpSession&#8221;来表达含义⑥</p>
<p>二、HTTP协议与状态保持<br />
HTTP 协议本身是无状态的，这与HTTP协议本来的目的是相符的，客户端只需要简单的向服务器请求下载某些文件，无论是客户端还是服务器都没有必要纪录彼此过去的行为，每一次请求之间都是独立的，好比一个顾客和一个自动售货机或者一个普通的（非会员制）大卖场之间的关系一样。</p>
<p>然而聪明（或者贪心？）的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用，就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为，另一方面在服务器端则出现了CGI规范以响应客户端的动态请求，作为传输载体的HTTP协议也添加了文件上载、 cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。</p>
<p>让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠，然而一次性消费5杯咖啡的机会微乎其微，这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案：<br />
1、该店的店员很厉害，能记住每位顾客的消费数量，只要顾客一走进咖啡店，店员就知道该怎么对待了。这种做法就是协议本身支持状态。<br />
2、发给顾客一张卡片，上面记录着消费的数量，一般还有个有效期限。每次消费时，如果顾客出示这张卡片，则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。<br />
3、发给顾客一张会员卡，除了卡号之外什么信息也不纪录，每次消费时，如果顾客出示该卡片，则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。</p>
<p>由于HTTP协议是无状态的，而出于种种考虑也不希望使之成为有状态的，因此，后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案，而session机制采用的是在服务器端保持状态的方案。同时我们也看到，由于采用服务器端保持状态的方案在客户端也需要保存一个标识，所以session机制可能需要借助于cookie机制来达到保存标识的目的，但实际上它还有其他选择。</p>
<p>三、理解cookie机制 <br />
cookie机制的基本原理就如上面的例子一样简单，但是还有几个问题需要解决：&#8220;会员卡&#8221;如何分发；&#8220;会员卡&#8221;的内容；以及客户如何使用&#8220;会员卡&#8221;。</p>
<p>正统的cookie分发是通过扩展HTTP协议来实现的，服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。</p>
<p>而cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie，如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置，则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示，如果某家分店还发行了自己的会员卡，那么进这家店的时候除了要出示麦当劳的会员卡，还要出示这家店的会员卡。</p>
<p>cookie的内容主要包括：名字，值，过期时间，路径和域。<br />
其中域可以指定某一个域比如.google.com，相当于总店招牌，比如宝洁公司，也可以指定一个域下的具体某台机器比如<a href="http://www.google.com/">www.google.com</a>或者froogle.google.com，可以用飘柔来做比。<br />
路径就是跟在域名后面的URL路径，比如/或者/foo等等，可以用某飘柔专柜做比。<br />
路径与域合在一起就构成了cookie的作用范围。<br />
如果不设置过期时间，则表示这个cookie的生命期为浏览器会话期间，只要关闭浏览器窗口，cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里，当然这种行为并不是规范规定的。如果设置了过期时间，浏览器就会把cookie保存到硬盘上，关闭后再次打开浏览器，这些cookie仍然有效直到超过设定的过期时间。</p>
<p>存储在硬盘上的cookie 可以在不同的浏览器进程间共享，比如两个IE窗口。而对于保存在内存里的cookie，不同的浏览器有不同的处理方式。对于IE，在一个打开的窗口上按 Ctrl-N（或者从文件菜单）打开的窗口可以与原窗口共享，而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie；对于 Mozilla Firefox0.8，所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。</p>
<p>下面就是一个goolge设置cookie的响应头的例子<br />
HTTP/1.1 302 Found<br />
Location: <a href="http://www.google.com/intl/zh-CN/">http://www.google.com/intl/zh-CN/</a><br />
Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com<br />
Content-Type: text/html</p>
<p>这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分</p>
<p>浏览器在再次访问goolge的资源时自动向外发送cookie</p>
<p>使用Firefox可以很容易的观察现有的cookie的值<br />
使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理。</p>
<p>IE也可以设置在接受cookie前询问</p>
<p>这是一个询问接受cookie的对话框。</p>
<p>四、理解session机制<br />
session机制是一种服务器端的机制，服务器使用一种类似于散列表的结构（也可能就是使用散列表）来保存信息。</p>
<p>当程序需要为某个客户端的请求创建一个session的时候，服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id，如果已包含一个session id则说明以前已经为此客户端创建过session，服务器就按照session id把这个 session检索出来使用（如果检索不到，可能会新建一个），如果客户端请求不包含session id，则为此客户端创建一个session并且生成一个与此session相关联的session id，session id的值应该是一个既不会重复，又不容易被找到规律以仿造的字符串，这个 session id将被在本次响应中返回给客户端保存。</p>
<p>保存这个session id的方式可以采用cookie，这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID，而。比如weblogic对于web应用程序生成的cookie，JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764，它的名字就是 JSESSIONID。</p>
<p>由于cookie可以被人为的禁止，必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写，就是把session id直接附加在URL路径的后面，附加方式也有两种，一种是作为URL路径的附加信息，表现形式为<a href="http://...../xxx;jsessionid">http://...../xxx;jsessionid</a>= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764<br />
另一种是作为查询字符串附加在URL后面，表现形式为<a href="http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764</a><br />
这两种方式对于用户来说是没有区别的，只是服务器在解析的时候处理的方式不同，采用第一种方式也有利于把session id的信息和正常程序参数区分开来。<br />
为了在整个交互过程中始终保持状态，就必须在每个客户端可能请求的路径后面都包含这个session id。</p>
<p>另一种技术叫做表单隐藏字段。就是服务器会自动修改表单，添加一个隐藏字段，以便在表单提交时能够把session id传递回服务器。比如下面的表单<br />
&lt;form name="testform" action="/xxx"&gt;<br />
&lt;input type="text"&gt;<br />
&lt;/form&gt;<br />
在被传递给客户端之前将被改写成<br />
&lt;form name="testform" action="/xxx"&gt;<br />
&lt;input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764"&gt;<br />
&lt;input type="text"&gt;<br />
&lt;/form&gt;<br />
这种技术现在已较少应用，笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。<br />
实际上这种技术可以简单的用对action应用URL重写来代替。</p>
<p>在谈论session机制的时候，常常听到这样一种误解&#8220;只要关闭浏览器，session就消失了&#8221;。其实可以想象一下会员卡的例子，除非顾客主动对店家提出销卡，否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的，除非程序通知服务器删除一个session，否则服务器会一直保留，程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭，因此服务器根本不会有机会知道浏览器已经关闭，之所以会有这种错觉，是大部分session机制都使用会话cookie来保存session id，而关闭浏览器后这个 session id就消失了，再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上，或者使用某种手段改写浏览器发出的HTTP请求头，把原来的session id发送给服务器，则再次打开浏览器仍然能够找到原来的session。</p>
<p>恰恰是由于关闭浏览器不会导致session被删除，迫使服务器为seesion设置了一个失效时间，当距离客户端上一次使用session的时间超过这个失效时间时，服务器就可以认为客户端已经停止了活动，才会把session删除以节省存储空间。</p>
<p>五、理解javax.servlet.http.HttpSession<br />
HttpSession是Java平台对session机制的实现规范，因为它仅仅是个接口，具体到每个web应用服务器的提供商，除了对规范支持之外，仍然会有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic Server8.1作为例子来演示。</p>
<p>首先，Weblogic Server提供了一系列的参数来控制它的HttpSession的实现，包括使用cookie的开关选项，使用URL重写的开关选项，session持久化的设置，session失效时间的设置，以及针对cookie的各种设置，比如设置cookie的名字、路径、域， cookie的生存时间等。</p>
<p>一般情况下，session都是存储在内存里，当服务器进程被停止或者重启的时候，内存里的session也会被清空，如果设置了session的持久化特性，服务器就会把session保存到硬盘上，当服务器进程重新启动或这些信息将能够被再次使用， Weblogic Server支持的持久性方式包括文件、数据库、客户端cookie保存和复制。</p>
<p>复制严格说来不算持久化保存，因为session实际上还是保存在内存里，不过同样的信息被复制到各个cluster内的服务器进程中，这样即使某个服务器进程停止工作也仍然可以从其他进程中取得session。</p>
<p>cookie生存时间的设置则会影响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解。</p>
<p>cookie的路径对于web应用程序来说是一个非常重要的选项，Weblogic Server对这个选项的默认处理方式使得它与其他服务器有明显的区别。后面我们会专题讨论。</p>
<p>关于session的设置参考[5] <a href="http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869">http://e-docs.bea.com/wls/docs70/webapp/weblogic_xml.html#1036869</a></p>
<p>六、HttpSession常见问题<br />
（在本小节中session的含义为⑤和⑥的混合）</p>
<p><br />
1、session在何时被创建<br />
一个常见的误解是以为session在有客户端访问时就被创建，然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建，注意如果JSP没有显示的使用 &lt;% @page session="false"%&gt; 关闭session，则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。</p>
<p>由于session会消耗内存资源，因此，如果不打算使用session，应该在所有的JSP中关闭它。</p>
<p>2、session何时被删除<br />
综合前面的讨论，session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止（非持久session）</p>
<p>3、如何做到在浏览器关闭时删除session<br />
严格的讲，做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作，然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。</p>
<p>4、有个HttpSessionListener是怎么回事<br />
你可以创建这样的listener去监控session的创建和销毁事件，使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和销毁动作触发listener，而不是相反。类似的与HttpSession有关的listener还有 HttpSessionBindingListener，HttpSessionActivationListener和 HttpSessionAttributeListener。</p>
<p>5、存放在session中的对象必须是可序列化的吗<br />
不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果 session中有不可序列化的对象，在session销毁时会有一个Exception，很奇怪。</p>
<p>6、如何才能正确的应付客户端禁止cookie的可能性<br />
对所有的URL使用URL重写，包括超链接，form的action，和重定向的URL，具体做法参见[6]<br />
<a href="http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770">http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770</a></p>
<p>7、开两个浏览器窗口访问应用程序会使用同一个session还是不同的session<br />
参见第三小节对cookie的讨论，对session来说是只认id不认人，因此不同的浏览器，不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。</p>
<p>8、如何防止用户打开两个浏览器窗口操作导致的session混乱<br />
这个问题与防止表单多次提交是类似的，可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端，同时保存在session里，客户端提交表单时必须把这个id也返回服务器，程序首先比较返回的id与保存在session里的值是否一致，如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascript window.open打开的窗口，一般不设置这个id，或者使用单独的id，以防主窗口无法操作，建议不要再window.open打开的窗口里做修改操作，这样就可以不用设置。</p>
<p>9、为什么在Weblogic Server中改变session的值后要重新调用一次session.setValue<br />
做这个动作主要是为了在集群环境中提示Weblogic Server session中的值发生了改变，需要向其他服务器进程复制新的session值。</p>
<p>10、为什么session不见了<br />
排除session正常失效的因素之外，服务器本身的可能性应该是微乎其微的，虽然笔者在iPlanet6SP1加若干补丁的Solaris版本上倒也遇到过；浏览器插件的可能性次之，笔者也遇到过3721插件造成的问题；理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题。<br />
出现这一问题的大部分原因都是程序的错误，最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨论这个问题。</p>
<p>七、跨应用程序的session共享</p>
<p>常常有这样的情况，一个大项目被分割成若干小项目开发，为了能够互不干扰，要求每个小项目作为一个单独的web应用程序开发，可是到了最后突然发现某几个小项目之间需要共享一些信息，或者想使用session来实现SSO(single sign on)，在session中保存login的用户信息，最自然的要求是应用程序间能够访问彼此的session。</p>
<p>然而按照Servlet规范，session的作用范围应该仅仅限于当前应用程序下，不同的应用程序之间是不能够互相访问对方的session的。各个应用服务器从实际效果上都遵守了这一规范，但是实现的细节却可能各有不同，因此解决跨应用程序session共享的方法也各不相同。</p>
<p>首先来看一下Tomcat是如何实现web应用程序之间session的隔离的，从 Tomcat设置的cookie路径来看，它对不同的应用程序设置的cookie路径是不同的，这样不同的应用程序所用的session id是不同的，因此即使在同一个浏览器窗口里访问不同的应用程序，发送给服务器的session id也可以是不同的。</p>
<p>根据这个特性，我们可以推测Tomcat中session的内存结构大致如下。</p>
<p>笔者以前用过的iPlanet也采用的是同样的方式，估计SunONE与iPlanet之间不会有太大的差别。对于这种方式的服务器，解决的思路很简单，实际实行起来也不难。要么让所有的应用程序共享一个session id，要么让应用程序能够获得其他应用程序的session id。</p>
<p>iPlanet中有一种很简单的方法来实现共享一个session id，那就是把各个应用程序的cookie路径都设为/（实际上应该是/NASApp，对于应用程序来讲它的作用相当于根）。<br />
&lt;session-info&gt;<br />
&lt;path&gt;/NASApp&lt;/path&gt;<br />
&lt;/session-info&gt;</p>
<p>需要注意的是，操作共享的session应该遵循一些编程约定，比如在session attribute名字的前面加上应用程序的前缀，使得 setAttribute("name", "neo")变成setAttribute("app1.name", "neo")，以防止命名空间冲突，导致互相覆盖。</p>
<p><br />
在Tomcat中则没有这么方便的选择。在Tomcat版本3上，我们还可以有一些手段来共享session。对于版本4以上的Tomcat，目前笔者尚未发现简单的办法。只能借助于第三方的力量，比如使用文件、数据库、JMS或者客户端cookie，URL参数或者隐藏字段等手段。</p>
<p>我们再看一下Weblogic Server是如何处理session的。&nbsp; </p>
<p>从截屏画面上可以看到Weblogic Server对所有的应用程序设置的cookie的路径都是/，这是不是意味着在Weblogic Server中默认的就可以共享session了呢？然而一个小实验即可证明即使不同的应用程序使用的是同一个session，各个应用程序仍然只能访问自己所设置的那些属性。这说明Weblogic Server中的session的内存结构可能如下</p>
<p>对于这样一种结构，在 session机制本身上来解决session共享的问题应该是不可能的了。除了借助于第三方的力量，比如使用文件、数据库、JMS或者客户端 cookie，URL参数或者隐藏字段等手段，还有一种较为方便的做法，就是把一个应用程序的session放到ServletContext中，这样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下，</p>
<p>应用程序A<br />
context.setAttribute("appA", session); </p>
<p>应用程序B<br />
contextA = context.getContext("/appA");<br />
HttpSession sessionA = (HttpSession)contextA.getAttribute("appA"); </p>
<p>值得注意的是这种用法不可移植，因为根据ServletContext的JavaDoc，应用服务器可以处于安全的原因对于context.getContext("/appA");返回空值，以上做法在Weblogic Server 8.1中通过。</p>
<p>那么Weblogic Server为什么要把所有的应用程序的cookie路径都设为/呢？原来是为了SSO，凡是共享这个session的应用程序都可以共享认证的信息。一个简单的实验就可以证明这一点，修改首先登录的那个应用程序的描述符weblogic.xml，把cookie路径修改为/appA 访问另外一个应用程序会重新要求登录，即使是反过来，先访问cookie路径为/的应用程序，再访问修改过路径的这个，虽然不再提示登录，但是登录的用户信息也会丢失。注意做这个实验时认证方式应该使用FORM，因为浏览器和web服务器对basic认证方式有其他的处理方式，第二次请求的认证不是通过 session来实现的。具体请参看[7] secion 14.8 Authorization，你可以修改所附的示例程序来做这些试验。</p>
<p>八、总结<br />
session机制本身并不复杂，然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器，服务器的经验当作普遍适用的经验，而是始终需要具体情况具体分析。<br />
摘要：虽然session机制在web应用程序中被采用已经很长时间了，但是仍然有很多人不清楚session机制的本质，以至不能正确的应用这一技术。本文将详细讨论session的工作机制并且对在Java web application中应用session机制时常见的问题作出解答。</p>
<p>&nbsp;</p>
</div>
<img src ="http://www.blogjava.net/gentoo1439/aggbug/156652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gentoo1439/" target="_blank">George Gong</a> 2007-10-29 13:15 <a href="http://www.blogjava.net/gentoo1439/archive/2007/10/29/156652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dwr的json回调详解 (转)</title><link>http://www.blogjava.net/gentoo1439/archive/2007/10/26/156035.html</link><dc:creator>George Gong</dc:creator><author>George Gong</author><pubDate>Fri, 26 Oct 2007 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/gentoo1439/archive/2007/10/26/156035.html</guid><wfw:comment>http://www.blogjava.net/gentoo1439/comments/156035.html</wfw:comment><comments>http://www.blogjava.net/gentoo1439/archive/2007/10/26/156035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gentoo1439/comments/commentRss/156035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gentoo1439/services/trackbacks/156035.html</trackback:ping><description><![CDATA[<p><font face="Arial">http://llying.javaeye.com/blog/129897<br />
<br />
function sendMessage()<br />
{<br />
&nbsp;//获取name文本框的值<br />
&nbsp;var name = document.getElementById("name").value;<br />
&nbsp;//使用json格式调用远程java方法<br />
&nbsp;hello.hello(name,<br />
&nbsp;{<br />
&nbsp;&nbsp;//指定回调函数<br />
&nbsp;&nbsp;callback:cb,</font></p>
<p><font face="Arial">&nbsp;&nbsp;//指定超时时间<br />
&nbsp;&nbsp;timeout:5000,</font></p>
<p><font face="Arial">&nbsp;&nbsp;//指定错误处理函数，对于dwr1.x，如果服务端发生异常，该函数被激发；从dwr2.0开始，服务端异常激发exceptionHandler函数。<br />
&nbsp;&nbsp;errorHandler:function(message){alert("Oops: " + message);},<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//当因为浏览器bug引起的问题激发此函数，该选项只有dwr2.0才支持。<br />
&nbsp;&nbsp;warningHandler:function(message){alert("Oops: " + message);},</font></p>
<p><font face="Arial">&nbsp;&nbsp;//当服务器响应不是正确的text/html页时，激发该函数。通常，超时也会激发该函数。<br />
&nbsp;&nbsp;textHtmlHandler:function(message){alert("Oops: " + message);},</font></p>
<p><font face="Arial">&nbsp;&nbsp;//远程调用失败后激发该函数。通常服务器端处理异常或者数据转换异常时会激发该函数。<br />
&nbsp;&nbsp;exceptionHandler:function(message){alert("Oops: " + message);},</font></p>
<p><font face="Arial">&nbsp;&nbsp;//指定发送请求的方法，分别是GET请求和POST请求。<br />
&nbsp;&nbsp;httpMethod:'POST',</font></p>
<p><font face="Arial">&nbsp;&nbsp;//指定是否发送异步请求。默认值true，即使用异步请求。通常建议不使用同步请求。<br />
&nbsp;&nbsp;async:true,</font></p>
<p><font face="Arial">&nbsp;&nbsp;//指定远程调用方式，三个值DWREngine.XMLHttpRequest,DWREngine.Iframe,DWREngine.ScriptTag,分别使用XMLHttpRequest，Iframe，ScriptTag，默认为XMLHttpRequest方式<br />
&nbsp;&nbsp;rpcType:DWREngine.XMLHttpRequest,<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//指定一个Hook函数，该函数在远程调用之前被激发。<br />
&nbsp;&nbsp;preHook:function(){alert('远程调用之前.....')},</font></p>
<p><font face="Arial">&nbsp;&nbsp;//指定一个Hook函数，该函数在远程调用之后被激发。<br />
&nbsp;&nbsp;postHook:function(){alert('远程调用之后.....')}<br />
&nbsp;});<br />
//回调函数<br />
function cb(data)<br />
{<br />
&nbsp;document.getElementById("show").innerHTML = data;<br />
}</font></p>
<p><font face="Arial">DWREngine.setOrdered(boolean)方法：true,严格限制响应顺序，默认false；<br />
DWREngine.setTimeout(5000)方法：设置全局响应时间<br />
DWREngine.setPreHook(preFun);<br />
DWREngine.setPostHook(postFun);</font></p>
<img src ="http://www.blogjava.net/gentoo1439/aggbug/156035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gentoo1439/" target="_blank">George Gong</a> 2007-10-26 10:14 <a href="http://www.blogjava.net/gentoo1439/archive/2007/10/26/156035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CXF2.0 小试 。。。</title><link>http://www.blogjava.net/gentoo1439/archive/2007/09/21/147135.html</link><dc:creator>George Gong</dc:creator><author>George Gong</author><pubDate>Fri, 21 Sep 2007 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/gentoo1439/archive/2007/09/21/147135.html</guid><wfw:comment>http://www.blogjava.net/gentoo1439/comments/147135.html</wfw:comment><comments>http://www.blogjava.net/gentoo1439/archive/2007/09/21/147135.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/gentoo1439/comments/commentRss/147135.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gentoo1439/services/trackbacks/147135.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于项目需要用到Web Service，就采用了越来越火的CXF2.0。总得感觉是CXF2.0毕竟还是在Apache的孵化器中孕育，还没有成熟，有很多不完善的地方。项目中采用CXF与Spring合用，比较简单，CXF本身的配置文件就是Spring配置文件，所以集成起来比较方便。CXF也提供了很多Sample。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在开发中还是出现了一些问题，其中CXF用到了geronimo-javamail_1.4_spec-1.0-M1.jar (or Sun's JavaMail jar)<br />
，官方说可以用JavaMail.jar替换，但是根本不行，因为geronimo-javamail_1.4_spec-1.0-M1.jar不仅仅是Mail相关的Class，还有别的Class。不仅如此，此jar还与JavaMail1.4.jar冲突，由于我们项目中采用JavaMail-1.4.jar发邮件，项目中同时引用了这两个jar，在junit中测试OK，但在Tomcat启动后就出现错误了，仔细跟踪，发现两种方式中发短信分别用到了这两个jar，在junit中用的是javamail-1.4.jar，没有问题。在tomcat中发邮件是用到的是geronimo-javamail_1.4_spec-1.0-M1.jar ，二两者实现的不同，根本不像CXF所说的可以替换，而且geronimo-javamail_1.4_spec-1.0-M1.jar 中实现发邮件的机制跟javamail还有不同，仔细跟踪，发现问题出现在Session中，<br />
geronimo的javax.mail.Session中用到了属性文件，它会把用户设置的发短信的host改为localhost，这样就会出现connect异常。最后把geronimo中的javax.mail中的所有class删掉，测试发现发邮件和CXF Web Service 都OK。<br />
另外，Web Service 的安全采用了密钥公钥机制，用keytool制作了钥匙，在CXF Web Service 以及远程访问的Client中分别放置了jks文件。<br />
</p>
<img src ="http://www.blogjava.net/gentoo1439/aggbug/147135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gentoo1439/" target="_blank">George Gong</a> 2007-09-21 15:55 <a href="http://www.blogjava.net/gentoo1439/archive/2007/09/21/147135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse中使用svn(subclipse插件)出现错误：subversion1.4.4与subclipse1.2.4在一起发生冲突</title><link>http://www.blogjava.net/gentoo1439/archive/2007/09/04/142674.html</link><dc:creator>George Gong</dc:creator><author>George Gong</author><pubDate>Tue, 04 Sep 2007 08:43:00 GMT</pubDate><guid>http://www.blogjava.net/gentoo1439/archive/2007/09/04/142674.html</guid><wfw:comment>http://www.blogjava.net/gentoo1439/comments/142674.html</wfw:comment><comments>http://www.blogjava.net/gentoo1439/archive/2007/09/04/142674.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/gentoo1439/comments/commentRss/142674.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gentoo1439/services/trackbacks/142674.html</trackback:ping><description><![CDATA[<p>在跟svn资源库连接是eclipse非法关闭，JDK是BEA JRockit(R) R27.3.1-1-85830-1.5.0_11-20070716-1248-windows-ia32。日志如下：<br />
</p>
<p>===== BEGIN DUMP =============================================================<br />
JRockit dump produced after 0 days, 00:01:14 on Tue Sep 04 15:48:05 2007</p>
<p>Additional information is available in:<br />
&nbsp; I:\eclipse\jrockit.3124.dump<br />
&nbsp; I:\eclipse\jrockit.3124.mdmp<br />
If you see this dump, please open a support case with BEA and<br />
supply as much information as you can on your system setup and<br />
the program you were running. You can also search for solutions<br />
to your problem at http://forums.bea.com in<br />
the forum jrockit.developer.interest.general.</p>
<p>Error Message: Illegal memory access. [54]<br />
Exception Rec: EXCEPTION_ACCESS_VIOLATION (c0000005) at 0x066A7C0C - memory at 0x00000000 could not be read.<br />
Minidump&nbsp;&nbsp;&nbsp;&nbsp; : Wrote mdmp. Size is 183MB<br />
SafeDllMode&nbsp; : -1<br />
Version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : BEA JRockit(R) R27.3.1-1-85830-1.5.0_11-20070716-1248-windows-ia32<br />
GC Strategy&nbsp; : Mode: throughput. Currently using strategy: genparpar<br />
GC Status&nbsp;&nbsp;&nbsp; : OC is not running. Last finished OC was OC#1.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : YC is not running. Last finished YC was YC#2.<br />
OC History&nbsp;&nbsp; : Strategy genparpar was used for OC#1.<br />
YC History&nbsp;&nbsp; : Ran 2 YCs before OC#1.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Ran 0 YCs since last OC.<br />
Heap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 0x10100000 - 0x14100000<br />
Compaction&nbsp;&nbsp; : 0x13D00000 - 0x14100000<br />
NurseryList&nbsp; : 0x10106158 - 0x12706A28<br />
KeepArea&nbsp;&nbsp;&nbsp;&nbsp; : 0x110FFFF0 - 0x118FFFE8<br />
NurseryMarker: [ 0x118FFFE8,&nbsp; 0x11DF6FD0 ]<br />
CompRefs&nbsp;&nbsp;&nbsp;&nbsp; : References are 32-bit.<br />
CPU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Intel Pentium 4 (HT) SSE SSE2 SSE3 NetBurst EM64T<br />
Number CPUs&nbsp; : 2<br />
Tot Phys Mem : 1006047232 (959 MB)<br />
OS version&nbsp;&nbsp; : Microsoft Windows Server 2003 version 5.2 Service Pack 1 (Build 3790) (32-bit)<br />
Thread System: Windows Threads<br />
State&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : JVM is running<br />
Command Line : -Xmx512M <br />
java.home&nbsp;&nbsp;&nbsp; : C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre<br />
j.class.path : I:\eclipse\plugins\org.eclipse.equinox.launcher_1.0.0.v20070606.jar<br />
j.lib.path&nbsp;&nbsp; : I:\eclipse;.;C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\bin\..\jre\bin\jrockit;C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\bin\..\jre\bin;C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\bin;D:\oracle\ora92\bin;C:\Program Files\Oracle\jre\1.3.1\bin;C:\Program Files\Oracle\jre\1.1.8\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;C:\apache-ant-1.7.0\bin;C:\maven-2.0.7\bin;D:\maven-1.0.2\bin;C:\svn-win32-1.4.4\bin;C:\Program Files\QuickTime\QTSystem\<br />
JAVA_HOME&nbsp;&nbsp;&nbsp; : C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11<br />
_JAVA_OPTIONS: &lt;not set&gt;<br />
PATH&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\bin\..\jre\bin\jrockit;C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\bin\..\jre\bin;C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\bin;D:\oracle\ora92\bin;C:\Program Files\Oracle\jre\1.3.1\bin;C:\Program Files\Oracle\jre\1.1.8\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Microsoft SQL Server\80\Tools\BINN;C:\apache-ant-1.7.0\bin;C:\maven-2.0.7\bin;D:\maven-1.0.2\bin;C:\svn-win32-1.4.4\bin;C:\Program Files\QuickTime\QTSystem\<br />
C Heap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : Good; no memory allocations have failed<br />
StackOverFlow: 0 StackOverFlowErrors have occured<br />
OutOfMemory&nbsp; : 0 OutOfMemoryErrors have occured</p>
<p>Registers (from ThreadContext: 0x066872B0 / OS context: 0x06687AB8):<br />
&nbsp;&nbsp; eax = 0207f508&nbsp;&nbsp;&nbsp; ecx = 00000000&nbsp;&nbsp;&nbsp; edx = 00000000&nbsp;&nbsp;&nbsp; ebx = 00000000 <br />
&nbsp;&nbsp; esp = 06687d84&nbsp;&nbsp;&nbsp; ebp = 06687d90&nbsp;&nbsp;&nbsp; esi = 008fc980&nbsp;&nbsp;&nbsp; edi = 00000000 <br />
&nbsp;&nbsp;&nbsp; es = 00000023&nbsp;&nbsp;&nbsp;&nbsp; cs = 0000001b&nbsp;&nbsp;&nbsp;&nbsp; ss = 00000023&nbsp;&nbsp;&nbsp;&nbsp; ds = 00000023 <br />
&nbsp;&nbsp;&nbsp; fs = 0000003b&nbsp;&nbsp;&nbsp;&nbsp; gs = 00000000 <br />
&nbsp;&nbsp; eip = 066a7c0c eflags = 00010246 </p>
<p>Stack:<br />
(* marks the word pointed to by the stack pointer)<br />
06687d84: 00000000* 008fc980&nbsp; 0207f508&nbsp; 06689dbc&nbsp; 06691f32&nbsp; 06689db8&nbsp; <br />
06687d9c: 0207f508&nbsp; 00000000&nbsp; 00000000&nbsp; 00000000&nbsp; 008fc980&nbsp; 0207f508&nbsp; <br />
06687db4: 00000000&nbsp; 0207f508&nbsp; 00000000&nbsp; 0207f508&nbsp; 0207f5a8&nbsp; 6eec84f1&nbsp; <br />
06687dcc: 0207f508&nbsp; 00000010&nbsp; 6ee40000&nbsp; 6eec11f2&nbsp; 0207f508&nbsp; 0207f5a8&nbsp; </p>
<p>Code:<br />
(* marks the word pointed to by the instruction pointer)<br />
066a7bdc: 850c458b&nbsp; 8b0b75c0&nbsp; 6bd6e80d&nbsp; 0c4d8906&nbsp; 4d8bc18b&nbsp; 75c98510&nbsp; <br />
066a7bf4: 74c0850a&nbsp; 20508b06&nbsp; 53105589&nbsp; 56145d8b&nbsp; 75db8557&nbsp; 18588b03&nbsp; <br />
066a7c0c: 01bf038b* 3b000000&nbsp; 19820fc7&nbsp; 8b000001&nbsp; c0850c43&nbsp; e8500674&nbsp; <br />
066a7c24: fffff168&nbsp; 8b18738b&nbsp; 18438d0b&nbsp; f685d78b&nbsp; d13b0f75&nbsp; 708b0b73&nbsp; </p>
<p>Loaded modules:<br />
(* denotes the module causing the exception)<br />
00400000-0040cfff&nbsp; I:\eclipse\eclipse.exe<br />
7c930000-7c9fffff&nbsp; C:\WINDOWS\system32\ntdll.dll<br />
7c800000-7c92afff&nbsp; C:\WINDOWS\system32\kernel32.dll<br />
77e10000-77ea0fff&nbsp; C:\WINDOWS\system32\USER32.dll<br />
77bd0000-77c18fff&nbsp; C:\WINDOWS\system32\GDI32.dll<br />
77f30000-77fdbfff&nbsp; C:\WINDOWS\system32\ADVAPI32.dll<br />
77c20000-77cbefff&nbsp; C:\WINDOWS\system32\RPCRT4.dll<br />
77370000-77406fff&nbsp; C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_5.82.3790.2778_x-ww_497C098C\COMCTL32.dll<br />
77b70000-77bc9fff&nbsp; C:\WINDOWS\system32\MSVCRT.dll<br />
76180000-7619cfff&nbsp; C:\WINDOWS\system32\IMM32.DLL<br />
63090000-63098fff&nbsp; C:\WINDOWS\system32\LPK.DLL<br />
74ae0000-74b40fff&nbsp; C:\WINDOWS\system32\USP10.dll<br />
10000000-10010fff&nbsp; I:\eclipse\plugins\org.eclipse.equinox.launcher.win32.win32.x86_1.0.0.v20070523\eclipse_1017a.dll<br />
77b60000-77b67fff&nbsp; C:\WINDOWS\system32\VERSION.dll<br />
71ad0000-71b04fff&nbsp; C:\WINDOWS\system32\uxtheme.dll<br />
4b210000-4b260fff&nbsp; C:\WINDOWS\system32\MSCTF.dll<br />
75d60000-75d86fff&nbsp; C:\WINDOWS\system32\apphelp.dll<br />
4c510000-4c53dfff&nbsp; C:\WINDOWS\system32\msctfime.ime<br />
774b0000-775e3fff&nbsp; C:\WINDOWS\system32\ole32.dll<br />
00b00000-00d91fff&nbsp; C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\jrockit\jvm.dll<br />
769e0000-76a09fff&nbsp; C:\WINDOWS\system32\WINMM.dll<br />
71b60000-71b76fff&nbsp; C:\WINDOWS\system32\WS2_32.dll<br />
71b50000-71b57fff&nbsp; C:\WINDOWS\system32\WS2HELP.dll<br />
7c340000-7c395fff&nbsp; C:\WINDOWS\system32\MSVCR71.dll<br />
76eb0000-76ec2fff&nbsp; C:\WINDOWS\system32\Secur32.dll<br />
6d710000-6d71bfff&nbsp; C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\verify.dll<br />
6d380000-6d39cfff&nbsp; C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\java.dll<br />
6d300000-6d307fff&nbsp; C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\hpi.dll<br />
6d730000-6d73efff&nbsp; C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\zip.dll<br />
6d540000-6d552fff&nbsp; C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\net.dll<br />
71a80000-71abffff&nbsp; C:\WINDOWS\system32\mswsock.dll<br />
69660000-696b5fff&nbsp; C:\WINDOWS\system32\hnetcfg.dll<br />
71a40000-71a47fff&nbsp; C:\WINDOWS\System32\wshtcpip.dll<br />
6d560000-6d568fff&nbsp; C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\nio.dll<br />
76ab0000-76abafff&nbsp; C:\WINDOWS\system32\psapi.dll<br />
02d60000-02daefff&nbsp; I:\eclipse\configuration\org.eclipse.osgi\bundles\13\1\.cp\swt-win32-3346.dll<br />
77cd0000-77dd2fff&nbsp; C:\WINDOWS\WinSxS\X86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.3790.2778_x-ww_A8F04F11\COMCTL32.dll<br />
77eb0000-77f01fff&nbsp; C:\WINDOWS\system32\SHLWAPI.dll<br />
761a0000-761e7fff&nbsp; C:\WINDOWS\system32\comdlg32.dll<br />
02dc0000-035a0fff&nbsp; C:\WINDOWS\system32\SHELL32.dll<br />
775f0000-7767bfff&nbsp; C:\WINDOWS\system32\OLEAUT32.dll<br />
779e0000-77a83fff&nbsp; C:\WINDOWS\system32\WININET.dll<br />
035b0000-03640fff&nbsp; C:\WINDOWS\system32\CRYPT32.dll<br />
03650000-03661fff&nbsp; C:\WINDOWS\system32\MSASN1.dll<br />
749c0000-749eefff&nbsp; C:\WINDOWS\system32\oleacc.dll<br />
780c0000-78120fff&nbsp; C:\WINDOWS\system32\MSVCP60.dll<br />
04cf0000-04d03fff&nbsp; I:\eclipse\configuration\org.eclipse.osgi\bundles\13\1\.cp\swt-gdip-win32-3346.dll<br />
4c620000-4c7c6fff&nbsp; C:\WINDOWS\WinSxS\x86_Microsoft.Windows.GdiPlus_6595b64144ccf1df_1.0.3790.1830_x-ww_24C40C58\gdiplus.dll<br />
04fc0000-05508fff&nbsp; C:\WINDOWS\system32\xpsp2res.dll<br />
003d0000-003d4fff&nbsp; C:\WINDOWS\system32\msimg32.dll<br />
6eec0000-6eee0fff&nbsp; I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\libapr.dll<br />
6ee50000-6ee58fff&nbsp; I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\libapriconv.dll<br />
05b10000-05c17fff&nbsp; I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\libeay32.dll<br />
01c60000-01c6afff&nbsp; C:\WINDOWS\system32\WSOCK32.dll<br />
05c20000-05ce3fff&nbsp; I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\libdb44.dll<br />
05cf0000-05d20fff&nbsp; I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\ssleay32.dll<br />
6ee60000-6ee88fff&nbsp; I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\libaprutil.dll<br />
03a80000-03a91fff&nbsp; I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\intl3_svn.dll<br />
05d30000-05e38fff&nbsp; I:\eclipse\plugins\org.tigris.subversion.javahl.win32_1.2.4\libsvnjavahl-1.dll<br />
76610000-76618fff&nbsp; C:\WINDOWS\system32\SHFOLDER.dll<br />
05e70000-0603ffff&nbsp; C:\WINDOWS\system32\UNISPIM5.IME<br />
<span style="color: red">6ee40000-6ee44fff&nbsp; C:\svn-win32-1.4.4\iconv\_tbl_simple.so<br />
06690000-06698fff&nbsp; C:\svn-win32-1.4.4\bin\libapriconv-1.dll<br />
066a0000-066bffff *C:\svn-win32-1.4.4\bin\libapr-1.dll<br />
</span>066c0000-067d2fff&nbsp; C:\Program Files\Java\jrockit-R27.3.1-jdk1.5.0_11\jre\bin\dbghelp.dll</p>
<p><br />
"ModalContext" id=23 idx=0x58 tid=2184 lastJavaFrame=0x0668EAC4</p>
<p>Stack 0: start=0x06590000, end=0x06690000, guards=0x06593000 (ok), forbidden=0x06591000<br />
Thread Stack Trace:<br />
&nbsp;&nbsp;&nbsp; at _apr_pool_create_ex@16+60()@0x066A7C0C<br />
&nbsp;&nbsp;&nbsp; at apr_iconv_mod_load+434()@0x06691F32<br />
&nbsp;&nbsp;&nbsp; at apr_iconv_mod_load+36()@0x06691DA4<br />
&nbsp;&nbsp;&nbsp; at apr_iconv_mod_load+316()@0x6EE51EFC<br />
&nbsp;&nbsp;&nbsp; -- Java stack --<br />
&nbsp;&nbsp;&nbsp; at org/tigris/subversion/javahl/SVNClient.info2(Ljava/lang/String;Lorg/tigris/subversion/javahl/Revision;Lorg/tigris/subversion/javahl/Revision;Z)[Lorg/tigris/subversion/javahl/Info2;(Native Method)<br />
&nbsp;&nbsp;&nbsp; at org/tigris/subversion/svnclientadapter/javahl/AbstractJhlClientAdapter.getInfo(AbstractJhlClientAdapter.java:1513)<br />
&nbsp;&nbsp;&nbsp; at org/tigris/subversion/svnclientadapter/AbstractClientAdapter.getInfo(AbstractClientAdapter.java:225)<br />
&nbsp;&nbsp;&nbsp; at org/tigris/subversion/subclipse/core/repo/SVNRepositoryLocation.validateConnection(SVNRepositoryLocation.java:407)<br />
&nbsp;&nbsp;&nbsp; at org/tigris/subversion/subclipse/ui/wizards/NewLocationWizard$1.run(NewLocationWizard.java:83)<br />
&nbsp;&nbsp;&nbsp; at org/eclipse/jface/operation/ModalContext$ModalContextThread.run(ModalContext.java:113)<br />
&nbsp;&nbsp;&nbsp; at jrockit/vm/RNI.c2java(IIIII)V(Native Method)<br />
&nbsp;&nbsp;&nbsp; -- end of trace</p>
<p>Additional information is available in:<br />
&nbsp; I:\eclipse\jrockit.3124.dump<br />
&nbsp; I:\eclipse\jrockit.3124.mdmp<br />
If you see this dump, please open a support case with BEA and<br />
supply as much information as you can on your system setup and<br />
the program you were running. You can also search for solutions<br />
to your problem at http://forums.bea.com in<br />
the forum jrockit.developer.interest.general.<br />
===== END DUMP ===============================================================</p>
<p>由上面的红色字可以看出，eclipse的subclipse插件在运行时调用了C盘下的subversion中的dll文件，故产生内容溢出的问题。这个现象不太容易出现，因为SVN服务器一般都在别的机器上。但发生这种情况还是很诡异，难道SVN的开发者没有出现过类似问题么？SVN版本为1.4.4，subclipse插件为1.2.4，不记得以前的版本是否也存在这样的冲突。<br />
&nbsp;</p>
<p><br />
&nbsp;</p>
 <img src ="http://www.blogjava.net/gentoo1439/aggbug/142674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gentoo1439/" target="_blank">George Gong</a> 2007-09-04 16:43 <a href="http://www.blogjava.net/gentoo1439/archive/2007/09/04/142674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Setting Up a Maven Repository  (转)</title><link>http://www.blogjava.net/gentoo1439/archive/2007/08/25/139208.html</link><dc:creator>George Gong</dc:creator><author>George Gong</author><pubDate>Fri, 24 Aug 2007 17:28:00 GMT</pubDate><guid>http://www.blogjava.net/gentoo1439/archive/2007/08/25/139208.html</guid><wfw:comment>http://www.blogjava.net/gentoo1439/comments/139208.html</wfw:comment><comments>http://www.blogjava.net/gentoo1439/archive/2007/08/25/139208.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gentoo1439/comments/commentRss/139208.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gentoo1439/services/trackbacks/139208.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://www.theserverside.com/tt/articles/article.tss?l=SettingUpMavenRepository 1. IntroductionMaven is a popular build tool available for java developers. One of the benefits of maven is that hel...&nbsp;&nbsp;<a href='http://www.blogjava.net/gentoo1439/archive/2007/08/25/139208.html'>阅读全文</a><img src ="http://www.blogjava.net/gentoo1439/aggbug/139208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gentoo1439/" target="_blank">George Gong</a> 2007-08-25 01:28 <a href="http://www.blogjava.net/gentoo1439/archive/2007/08/25/139208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jfreechart 柱型图应用</title><link>http://www.blogjava.net/gentoo1439/archive/2007/07/23/131823.html</link><dc:creator>George Gong</dc:creator><author>George Gong</author><pubDate>Mon, 23 Jul 2007 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/gentoo1439/archive/2007/07/23/131823.html</guid><wfw:comment>http://www.blogjava.net/gentoo1439/comments/131823.html</wfw:comment><comments>http://www.blogjava.net/gentoo1439/archive/2007/07/23/131823.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/gentoo1439/comments/commentRss/131823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gentoo1439/services/trackbacks/131823.html</trackback:ping><description><![CDATA[<p>以下代码用到了大多数方法（附有注释）：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id=Codehighlighter1_127_5031_Open_Image onclick="this.style.display='none'; Codehighlighter1_127_5031_Open_Text.style.display='none'; Codehighlighter1_127_5031_Closed_Image.style.display='inline'; Codehighlighter1_127_5031_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_127_5031_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_127_5031_Closed_Text.style.display='none'; Codehighlighter1_127_5031_Open_Image.style.display='inline'; Codehighlighter1_127_5031_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;String&nbsp;createBarChart(String[]&nbsp;series,String[]&nbsp;categories,</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">[][]&nbsp;data,HttpSession&nbsp;session,PrintWriter&nbsp;printWriter)</span><span id=Codehighlighter1_127_5031_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_127_5031_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CategoryDataset&nbsp;dataset&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DatasetUtilities.createCategoryDataset(series,&nbsp;categories,&nbsp;data);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;JFreeChart&nbsp;chart&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ChartFactory.createBarChart3D(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">预算统计图</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">预算科目</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">实际执行额</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataset,PlotOrientation.VERTICAL,</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chart.setBackgroundPaint(Color.WHITE);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设定背景色为白色</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CategoryPlot&nbsp;categoryPlot&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;chart.getCategoryPlot();&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">获得&nbsp;plot：CategoryPlot！！</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryPlot.setBackgroundPaint(Color.lightGray);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设定图表数据显示部分背景色</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryPlot.setDomainGridlinePaint(Color.white);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">横坐标网格线白色</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryPlot.setDomainGridlinesVisible(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">可见</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryPlot.setRangeGridlinePaint(Color.white);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">纵坐标网格线白色</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CategoryAxis&nbsp;domainAxis&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;categoryPlot.getDomainAxis();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置&nbsp;categoryAxis&nbsp;垂直显示</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;domainAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(</span><span style="COLOR: #000000">0.4</span><span style="COLOR: #000000">));<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置哼坐标轴的标题字体,此处是&#8220;预算科目&#8221;</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;domainAxis.setLabelFont(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Font(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SansSerif</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,Font.PLAIN,</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">));<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置距离图片左端距离,参数为图片的百分比</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;domainAxis.setLowerMargin(</span><span style="COLOR: #000000">0.05</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置距离图片右端距离</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;domainAxis.setUpperMargin(</span><span style="COLOR: #000000">0.05</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置横坐标的坐标值的字体</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;domainAxis.setTickLabelFont(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Font(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SansSerif</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,Font.PLAIN,</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">));<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryPlot.setDomainAxis(domainAxis);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValueAxis&nbsp;rangeAxis&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;categoryPlot.getRangeAxis();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置最高的一个柱与图片顶端的距离</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rangeAxis.setUpperMargin(</span><span style="COLOR: #000000">0.05</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置最低的一个柱与图片底端的距离</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rangeAxis.setLowerMargin(</span><span style="COLOR: #000000">0.05</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryPlot.setRangeAxis(rangeAxis);&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置竖坐标标签的旋转角度</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rangeAxis.setLabelAngle(</span><span style="COLOR: #000000">0.05</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置竖坐标轴的坐标值字体<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rangeAxis.setTickLabelFont(new&nbsp;Font("SansSerif",Font.PLAIN,12));</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BarRenderer3D&nbsp;renderer</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(BarRenderer3D)&nbsp;categoryPlot.getRenderer();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setBaseOutlinePaint(Color.GREEN);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置&nbsp;Wall&nbsp;的颜色</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setWallPaint(Color.PINK);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置每个柱的颜色&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GradientPaint&nbsp;gradientpaint&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;GradientPaint(</span><span style="COLOR: #000000">0.0F</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0.0F</span><span style="COLOR: #000000">,&nbsp;Color.blue,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0.0F</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0.0F</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Color(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">64</span><span style="COLOR: #000000">));&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设定特定颜色</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;GradientPaint&nbsp;gradientpaint1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;GradientPaint(</span><span style="COLOR: #000000">0.0F</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0.0F</span><span style="COLOR: #000000">,&nbsp;Color.green,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0.0F</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0.0F</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Color(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">64</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">));<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setSeriesPaint(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;gradientpaint);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setSeriesPaint(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;gradientpaint1);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置柱的&nbsp;Outline&nbsp;颜色</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setSeriesOutlinePaint(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;Color.BLACK);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setSeriesOutlinePaint(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;Color.BLACK);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置每个category所包含的平行柱的之间距离</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setItemMargin(</span><span style="COLOR: #000000">0.1</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">显示每个柱的数值，并修改该数值的字体属性</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setItemLabelGenerator(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;StandardCategoryItemLabelGenerator());<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置柱子上数值的字体</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setItemLabelFont(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Font(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SansSerif</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,Font.PLAIN,</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">));&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setItemLabelsVisible(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置柱子上数据的颜色</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setItemLabelPaint(Color.RED);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置bar的最小宽度，以保证能显示数值</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setMinimumBarLength(</span><span style="COLOR: #000000">0.02</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">最大宽度</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setMaximumBarWidth(</span><span style="COLOR: #000000">0.07</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置柱子上显示的数据旋转90度,最后一个参数为旋转的角度值/3.14</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemLabelPosition&nbsp;itemLabelPosition</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ItemLabelPosition(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemLabelAnchor.INSIDE12,TextAnchor.CENTER_RIGHT,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextAnchor.CENTER_RIGHT,</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1.57D</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置不能在柱子上正常显示的那些数值的显示方式，将这些数值显示在柱子外面</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemLabelPosition&nbsp;itemLabelPositionFallback</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ItemLabelPosition(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemLabelAnchor.OUTSIDE12,TextAnchor.BASELINE_LEFT,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextAnchor.HALF_ASCENT_LEFT,</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1.57D</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置正常显示的柱子label的position</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setPositiveItemLabelPosition(itemLabelPosition);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setNegativeItemLabelPosition(itemLabelPosition);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置不能正常显示的柱子label的position</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setPositiveItemLabelPositionFallback(itemLabelPositionFallback);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderer.setNegativeItemLabelPositionFallback(itemLabelPositionFallback);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryPlot.setRenderer(renderer);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置柱子的透明度</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryPlot.setForegroundAlpha(</span><span style="COLOR: #000000">0.8f</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置地区、销量的显示位置<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryPlot.setDomainAxisLocation(AxisLocation.TOP_OR_RIGHT);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;categoryPlot.setRangeAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);&nbsp;</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StandardEntityCollection&nbsp;sec&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;StandardEntityCollection();&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ChartRenderingInfo&nbsp;info&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ChartRenderingInfo(sec);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_4461_4813_Open_Image onclick="this.style.display='none'; Codehighlighter1_4461_4813_Open_Text.style.display='none'; Codehighlighter1_4461_4813_Closed_Image.style.display='inline'; Codehighlighter1_4461_4813_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_4461_4813_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4461_4813_Closed_Text.style.display='none'; Codehighlighter1_4461_4813_Open_Image.style.display='inline'; Codehighlighter1_4461_4813_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_4461_4813_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_4461_4813_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletUtilities.setTempFilePrefix(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">zcz</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletUtilities.setTempOneTimeFilePrefix(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">zcz-onetime</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filename&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ServletUtilities.saveChartAsPNG(chart,&nbsp;</span><span style="COLOR: #000000">926</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">555</span><span style="COLOR: #000000">,&nbsp;info,&nbsp;session);&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chartName</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">filename;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">图片的临时保存路径：</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">System.getProperty(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">java.io.tmpdir</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img id=Codehighlighter1_4838_4880_Open_Image onclick="this.style.display='none'; Codehighlighter1_4838_4880_Open_Text.style.display='none'; Codehighlighter1_4838_4880_Closed_Image.style.display='inline'; Codehighlighter1_4838_4880_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_4838_4880_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_4838_4880_Closed_Text.style.display='none'; Codehighlighter1_4838_4880_Open_Image.style.display='inline'; Codehighlighter1_4838_4880_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(IOException&nbsp;ex)&nbsp;</span><span id=Codehighlighter1_4838_4880_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_4838_4880_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;myMap</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">ChartUtilities.getImageMap(filename,&nbsp;info);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printWriter.println(myMap);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;filename;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<img src ="http://www.blogjava.net/gentoo1439/aggbug/131823.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gentoo1439/" target="_blank">George Gong</a> 2007-07-23 10:47 <a href="http://www.blogjava.net/gentoo1439/archive/2007/07/23/131823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache+Tomcat关于Session Sticky的负载均衡</title><link>http://www.blogjava.net/gentoo1439/archive/2007/07/11/129527.html</link><dc:creator>George Gong</dc:creator><author>George Gong</author><pubDate>Wed, 11 Jul 2007 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/gentoo1439/archive/2007/07/11/129527.html</guid><wfw:comment>http://www.blogjava.net/gentoo1439/comments/129527.html</wfw:comment><comments>http://www.blogjava.net/gentoo1439/archive/2007/07/11/129527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gentoo1439/comments/commentRss/129527.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gentoo1439/services/trackbacks/129527.html</trackback:ping><description><![CDATA[<p>选取Apache HTTP Server作为前端的负载服务器，后端选取两个Tomcat作集群，此次选择的配置方式为Session Sticky（粘性Session），这种方式将同一用户的请求转发到特定的Tomcat服务器上，避免了集群中Session的复制，缺点是用户只跟一种的一台服务器通信，如果此服务器down掉，那就废了。<br>采用的model为mod_proxy_ajp.so，整个配置在tomcat的配置文件中都有相关的注释，只需作相应修改就OK。<br>我们选取的是Apache HTTP Server2.2.4，Tomcat5.5.16。<br>首先安装Apache HTTP Server，然后修改其配置文件http.conf，首先load三个model，代码如下：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">LoadModule&nbsp;proxy_module&nbsp;modules</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">mod_proxy.so<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>LoadModule&nbsp;proxy_ajp_module&nbsp;modules</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">mod_proxy_ajp.so<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>LoadModule&nbsp;proxy_balancer_module&nbsp;modules</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">mod_proxy_balancer.so</span></div>
然后在此配置文件末端加入以下代码：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>ProxyPass&nbsp;/&nbsp;balancer://tomcatcluster/&nbsp;lbmethod=byrequests&nbsp;stickysession=JSESSIONID&nbsp;nofailover=Off&nbsp;timeout=5&nbsp;maxattempts=3&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>ProxyPassReverse&nbsp;/&nbsp;balancer://tomcatcluster/&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&lt;Proxy&nbsp;<span>balancer://tomcatcluster&gt;</span>&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>BalancerMember&nbsp;ajp://localhost:8009&nbsp;route=a&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>BalancerMember&nbsp;ajp://localhost:9009&nbsp;route=b<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&lt;/Proxy&gt;&nbsp;</div>
<br>以上代码配置了Proxy的相关参数，&lt;Proxy&gt;模块定义了均衡负载的配置，其中两个Tomcat Server都配置在同一台服务器上，端口分别为8009、9009，并配置各自的route，这样Apache Server就能根据route将请求转发给特定的Tomcat。<br>接下来修改Tomcat的server.xml文件，如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;Define&nbsp;an&nbsp;AJP&nbsp;1.3&nbsp;Connector&nbsp;on&nbsp;port&nbsp;8009&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">Connector&nbsp;</span><span style="COLOR: #ff0000">port</span><span style="COLOR: #0000ff">="8009"</span><span style="COLOR: #ff0000">&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enableLookups</span><span style="COLOR: #0000ff">="false"</span><span style="COLOR: #ff0000">&nbsp;redirectPort</span><span style="COLOR: #0000ff">="8443"</span><span style="COLOR: #ff0000">&nbsp;protocol</span><span style="COLOR: #0000ff">="AJP/1.3"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span></div>
其中的port为前面&lt;Proxy&gt;中设定的端口，还要配置其route，代码如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;Define&nbsp;the&nbsp;top&nbsp;level&nbsp;container&nbsp;in&nbsp;our&nbsp;container&nbsp;hierarchy&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">Engine&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="Catalina"</span><span style="COLOR: #ff0000">&nbsp;defaultHost</span><span style="COLOR: #0000ff">="localhost"</span><span style="COLOR: #ff0000">&nbsp;jvmRoute</span><span style="COLOR: #0000ff">="a"</span><span style="COLOR: #0000ff">&gt;</span></div>
jvmRoute也须同前面的设置一样。 <br><br>下面用JMeter对配置后的负载均衡做一测试，首先先启动两个Tomcat Server，随后启动Apache Server，在JMeter中新建测试计划，在两个Tomcat Server中的jsp-examples下新建test.jsp（此jsp自己随便写两句就成），然后进行测试，以下是部分取样器结果：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>HTTP&nbsp;response&nbsp;headers:<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>HTTP/1.1&nbsp;200&nbsp;OK<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Date:&nbsp;Wed,&nbsp;11&nbsp;Jul&nbsp;2007&nbsp;02:17:55&nbsp;GMT<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Set-Cookie:&nbsp;<span style="COLOR: #ff0000">JSESSIONID=AC7EF1CAA8C6B0FEB68E77D7D375E2AF.b</span><span>;&nbsp;</span>Path=/jsp-examples<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Content-Type:&nbsp;text/html;charset=ISO-8859-1<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Content-Length:&nbsp;3<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Keep-Alive:&nbsp;timeout=5,&nbsp;max=79<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>Connection:&nbsp;Keep-Alive</div>
以上红色代码表示用户的http请求中的JSESSIONID中已经附带了route后缀，.b表示此请求将转发到route为b的Tomcat Server上，你将会发现其中的一部分请求的JSESSIONID后缀为.a，也就是转发给route为a的Tomcat Server上。 
<img src ="http://www.blogjava.net/gentoo1439/aggbug/129527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gentoo1439/" target="_blank">George Gong</a> 2007-07-11 10:08 <a href="http://www.blogjava.net/gentoo1439/archive/2007/07/11/129527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>