﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Java天空 任我翱翔-随笔分类-Web or Servers</title><link>http://www.blogjava.net/persister/category/36746.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 23 Nov 2010 16:54:50 GMT</lastBuildDate><pubDate>Tue, 23 Nov 2010 16:54:50 GMT</pubDate><ttl>60</ttl><item><title>TPMC及其相关</title><link>http://www.blogjava.net/persister/archive/2010/11/23/338809.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Tue, 23 Nov 2010 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2010/11/23/338809.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/338809.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2010/11/23/338809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/338809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/338809.html</trackback:ping><description><![CDATA[今天看开发商的方案建议书里面有提到服务器性能估算的公式，挺感兴趣的，就到网上找了几篇文章，综合了一下，以供以后参考。<br />
<br />
一、什么是TPC和tpmC? <br />
<p><font face="Verdana">　　tpmC值在国内外被广 泛用于衡量计算机系统的事务处理能力。但究竟什么是tpmC值呢?作者曾向一些用户、推销人员乃至某些国外大公司的技术人员问过这个问题，但回答的精确度与tpmC值的流行程度远非相称。tpmC这一度量也常被误写为TPM或TPMC。 </font></p>
<br />
<p><font face="Verdana"><strong>　　1、TPC</strong> </font></p>
<br />
<p><font face="Verdana">　　TPC(Transaction Processing Performance Council，事务处理性能委员会)是由数10家会员公司创建的非盈利组织，总部设在美国。该组织对全世界开放，但迄今为止，绝大多数会员都是美、日、西欧的大公司。TPC的成员主要是计算机软硬件厂家，而非计算机用户，它的功能是制定商务应用基准程序(Benchmark)的标准规范、性能和价格度量，并管理测 试结果的发布。 <br />
</font><font face="Verdana"><br />
　　TPC的出版物是开放的，可以通过网络获取。TPC不给出基准程序的代码，而只给出基准程序的标准规范(Standard Specification)。任何厂家或其它测试者都可以根据规范，最优地构造出自己的系统(测试平台和测试程序)。为保证测试结 果的客观性，被测试者(通常是厂家)必须提交给TPC一套完整的报告(Full Disclosure Report)，包括被测系统的详细配置、分类价格和包含五年维护费用在内的总价格。该报告必须由TPC授权的审核员核实(TPC本身并不做审计)。现在全球只有几 个审核员，全部在美国。 </font></p>
<br />
<p><font face="Verdana"><strong>　　2、tpmC</strong> </font></p>
<br />
<p><font face="Verdana">　　TPC已经推出了四套基准程序，被称为TPC－A、TPC－B、TPC－C和TPC－D。其中A和B已经过时，不再使用了。TPC－C是在线事务处理(OLTP)的基准程序，TPC－D是决策支持(Decision Support) 的基准程序。TPC即将推出TPC－E，作为大型企业(Enterprise)信息服务的基准程序。 </font></p>
<br />
<p><font face="Verdana">　　TPC－C模拟一个批发商的货物管理环境。该批发公司有N个仓库，每个仓库供应10个地区，其中每个地区为3000名顾客服务。在每个仓库中有10个终端，每一个终端用于一个地区。在运行时，10&#215;N个终端操作员向公司的数据库发出5类请求。由于一个仓库中不可能存储公司所有的货物，有一些请求必须发往其它仓库，因此，数据库在逻辑上是分布的。N是一个可变参数，测试者可以随意改变N，以获得最佳测试效果。 <br />
<br />
　　TPC－C使用三种性能和价格度量，其中性能由TPC－C吞吐率衡量，单位是tpmC。tpm是transactions per minute的简称；C指TPC中的C基准程序。它的定义是每分钟内系统处理的新订单个数。<br />
<br />
tpmc作为服务器一项重要指标，是可以查询到的，这样就可以根据估算出来的tpmc去选择相应的服务器了。<br />
<br />
<br />
具体计算参考如下文章：<br />
http://blog.csdn.net/seeseasing/archive/2009/02/25/3935317.aspx<br />
</font></p>
<img src ="http://www.blogjava.net/persister/aggbug/338809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2010-11-23 15:47 <a href="http://www.blogjava.net/persister/archive/2010/11/23/338809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Session原理和Tomcat实现分析</title><link>http://www.blogjava.net/persister/archive/2010/08/24/329838.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Tue, 24 Aug 2010 14:38:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2010/08/24/329838.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/329838.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2010/08/24/329838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/329838.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/329838.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这篇文章挖掘Session的原理和tomcat实现机制。 &nbsp;&nbsp; 由于HTTP是无状态的协议，客户程序每次都去web页面，都打开到web服务器的单独的连接，并且不维护客户的上下文信息。如果需要维护上下文信息，比如用户登录系统后，每次都能够知道操作的是此登录用户，而不是其他用户。对于这个问题，存在三种解决方案：cookie，url重写和隐藏表单域。1、cookie&...&nbsp;&nbsp;<a href='http://www.blogjava.net/persister/archive/2010/08/24/329838.html'>阅读全文</a><img src ="http://www.blogjava.net/persister/aggbug/329838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2010-08-24 22:38 <a href="http://www.blogjava.net/persister/archive/2010/08/24/329838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>web.xml里filter-mapping中的dispatcher的用途</title><link>http://www.blogjava.net/persister/archive/2009/12/24/307162.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Thu, 24 Dec 2009 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/12/24/307162.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/307162.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/12/24/307162.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/307162.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/307162.html</trackback:ping><description><![CDATA[使用了urlrewriter，但是发现有些问题，配置如下：<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&nbsp;&nbsp; &lt;</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">UrlRewriteFilter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">logLevel</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">TRACE</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">UrlRewriteFilter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">*.do</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<br />
<br />
2.4版本的servlet规范在部属描述符中新增加了一个&lt;dispatcher&gt;元素，这个元素有四个可能的值：即REQUEST,FORWARD,INCLUDE和ERROR，可以在一个&lt;filter-mapping&gt;元素中加入任意数目的&lt;dispatcher&gt;，使得filter将会作用于直接从客户端过来的request，通过forward过来的request，通过include过来的request和通过&lt;error-page&gt;过来的request。如果没有指定任何&lt; dispatcher &gt;元素，默认值是REQUEST。<br />
下面几个列子说明一下它的用法：<br />
例1：<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//过滤器的映射<br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">Logging&nbsp;Filter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;//过滤器的名字<br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">/person/*</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//截获以person为开头的url<br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<br />
这种情况下，过滤器将会作用于直接从客户端发过来的以/person/&#8230;开始的请求。因为这里没有制定任何的&lt; dispatcher &gt;元素，默认值是REQUEST。<br />
<br />
例2：<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">Logging&nbsp;Filter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//过滤器的名字<br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">LogServlet</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;//截获名字为LogServlet的servletl<br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">INCLUDE</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp; <br />
&lt;/filter-mapping&gt;<br />
</span></div>
&nbsp;<br />
截获以request dispatcher的include方法传递过来的对ProductServlet的请求<br />
<br />
例3：<br />
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">Logging&nbsp;Filter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">/person/*</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">FORWARD</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">REQUEST</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<br />
在这种情况下，如果请求是以/person/&#8230;开头的，并且是通过request dispatcher的forward方法传递过来或者直接从客户端传递过来的，则必须经过这个过滤器。<br />
<br />
<img src ="http://www.blogjava.net/persister/aggbug/307162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-12-24 15:29 <a href="http://www.blogjava.net/persister/archive/2009/12/24/307162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多域名捆绑</title><link>http://www.blogjava.net/persister/archive/2009/12/11/305526.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Fri, 11 Dec 2009 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/12/11/305526.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/305526.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/12/11/305526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/305526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/305526.html</trackback:ping><description><![CDATA[有两个域名，分别是food.xxx.com和play.xxx.com，需把这两个域名都绑定到<br />
IP是219.13.34.32的服务器上<br />
<br />
1.<strong>首先需在域名供应商管理页面指定域名和IP的对应关系</strong>（我在万网配置通配符或者具体的域名）<br />
<br />
2.WEB服务器配置好LAMP环境<br />
<br />
3.把对应的源码分别放到/usr/local/apache/htdocs目录下，分别命名为upload和upload2<br />
<br />
4.配置apache<br />
#vi httpd.conf<br />
更改成<br />
ServerName 219.13.34.32:80<br />
然后在文件中添加以下内容<br />
NameVirtualHost 219.13.34.32<br />
&lt;VirtualHost 219.13.34.32&gt;<br />
ServerAdmin <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#97;&#102;&#100;&#64;&#100;&#115;&#102;&#46;&#99;&#111;&#109;"><font color="#0000ff">xxx@xxx.com</font></a><br />
DocumentRoot /usr/local/apache/htdocs<br />
ServerName 219.13.34.32<br />
&lt;/VirtualHost&gt;<br />
#<br />
&lt;VirtualHost 219.13.34.32&gt;<br />
ServerAdmin <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#100;&#115;&#102;&#64;&#97;&#102;&#46;&#99;&#111;&#109;"><font color="#0000ff">xxx@xxx.com</font></a><br />
DocumentRoot /usr/local/apache/htdocs/upload<br />
ServerName food.abc.com<br />
&lt;/VirtualHost&gt;<br />
#<br />
&lt;VirtualHost 219.13.34.32&gt;<br />
ServerAdmin <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#97;&#100;&#102;&#64;&#102;&#100;&#97;&#46;&#99;&#111;&#109;"><font color="#0000ff">xxx@xxx.com</font></a><br />
DocumentRoot /usr/local/apache/htdocs/upload2<br />
ServerName play.xxx.com<br />
&lt;/VirtualHost&gt;<br />
<br />
<br />
其中：NameVirtualHost 219.13.34.32很重要，没有这个，虚拟主机是不可以建立成功的。<br />
在这里，建立了两个域名为food.xxx.com和play.xxx.com的虚拟主机。<br />
/usr/local/apache/htdocs目录是用来直接输入IP时所设置的页面目录，其他两个，是输入域<br />
名时所访问的目录。<br />
重启apache服务，在浏览器中输入<br />
<a href="http://hello.abc.com/" target="_blank"><font color="#0000ff">http://food.xxx.com</font></a><br />
和<br />
<a href="http://play.abc.com/" target="_blank"><font color="#0000ff">http://play.xxx.com</font></a><br />
即可访问对应不同的网站
<img src ="http://www.blogjava.net/persister/aggbug/305526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-12-11 10:52 <a href="http://www.blogjava.net/persister/archive/2009/12/11/305526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>css的字符集</title><link>http://www.blogjava.net/persister/archive/2009/11/15/302396.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Sun, 15 Nov 2009 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/11/15/302396.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/302396.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/11/15/302396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/302396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/302396.html</trackback:ping><description><![CDATA[在css文件的第一行加上<br />
@CHARSET "UTF-8";<br />
这样就实现了css字符集选择<br />
可以防止一些css造成的错误<br />
<br />
<img src ="http://www.blogjava.net/persister/aggbug/302396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-11-15 11:59 <a href="http://www.blogjava.net/persister/archive/2009/11/15/302396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在jsp中怎么实现登录后，自动跳转到登录前正浏览的页面</title><link>http://www.blogjava.net/persister/archive/2009/10/19/298839.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Mon, 19 Oct 2009 05:58:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/10/19/298839.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/298839.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/10/19/298839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/298839.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/298839.html</trackback:ping><description><![CDATA[<pre>在jsp中怎么实现登录后，自动跳转到登录前正浏览的页面？就像csdn的一样，<br />
不管你从哪能个页面登录，成功登录后会自动跳转回那个页面。<br />
解决方法一：<br />
登录处理后，返回如下内容：&nbsp;&nbsp; <br />
</pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #000000;">
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">PrintWriter&nbsp;out&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;response.getWriter();<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">out</span><span style="color: #000000;">.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;!DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN</span><span style="color: #000000;">""</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;HTML&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">&nbsp;9</span> <span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&lt;BODY&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;script&gt;history.go(-1);history.go(0);&lt;/script&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;&lt;/BODY&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;/HTML&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">out.flush();<br />
</span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;">out.close();<br />
</span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">28</span>&nbsp;<span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;&nbsp;<br />
</span><span style="color: #008080;">29</span>&nbsp;</div>
<pre>解决方法二：&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008080;"><br />
<br />
1</span>&nbsp;<span style="color: #000000;">String&nbsp;referer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;req.getHeader(</span><span style="color: #000000;">"</span><span style="color: #000000;">Referer</span><span style="color: #000000;">"</span>);<br />
</pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #000000;">
</span><span style="color: #008080;">2</span> <span style="color: #000000;">resp.sendRedirect(referer);<br />
</span><span style="color: #008080;">3</span> <span style="color: #0000ff;">return</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">5</span>&nbsp;</div>
<pre>上面两种方法不可取是因为，如果用户登录失败，再次登录的话就会出现登录后返回到登录的错误。<br />
<br />
第三种：把你要在跳转时需要保存的信息存放在session变量中，登录后清除这个session。可行。<br />
需要登录操作的页面上面添加：<br />
</pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">&lt;%</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(session.getAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">party</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: #0000ff;">null</span><span style="color: #000000;">){<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;request.getQueryString())<br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">redirectUrl</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;request.getRequestURL().append(</span><span style="color: #000000;">"</span><span style="color: #000000;">?</span><span style="color: #000000;">"</span><span style="color: #000000;">).append(request.getQueryString()).toString());<br />
</span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">redirectUrl</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;request.getRequestURL().toString());<br />
</span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.sendRedirect(request.getContextPath()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/loginto</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080;">9</span>&nbsp;<span style="color: #000000;">%&gt;</span></div>
<pre>在登录处理页面：<br />
<br />
</pre>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">String&nbsp;redirectUrl&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(String)req.getSession().getAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">redirectUrl</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(StringUtils.isValid(redirectUrl)){<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;req.getSession().removeAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">redirectUrl</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp.sendRedirect(redirectUrl);<br />
</span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<pre>
第四种方法：写一个servlet会话判断类，如果在线就继续执行，不在线则提示登录。所有的需要在线操作的
servlet都集成此类，这样就不需要上面那么在每个页面写上这些代码了，可以集中控制。这种方式比较完整。<br />
<br />
</pre>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">HttpSession&nbsp;session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;request.getSession();<br />
<br />
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(session.getAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">person</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;request.getQueryString())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">redirectUrl</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;request.getRequestURL().append(</span><span style="color: #000000;">"</span><span style="color: #000000;">?</span><span style="color: #000000;">"</span><span style="color: #000000;">).append(request.getQueryString()).toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">redirectUrl</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;request.getRequestURL()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp; response.sendRedirect(request.getContextPath()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/login.jsp</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;}<br />
<br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;process(config,&nbsp;request,&nbsp;response);</span></div>
<pre><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</pre>
<img src ="http://www.blogjava.net/persister/aggbug/298839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-10-19 13:58 <a href="http://www.blogjava.net/persister/archive/2009/10/19/298839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache+tomcat 负载均衡安装配置</title><link>http://www.blogjava.net/persister/archive/2009/10/14/298279.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Wed, 14 Oct 2009 12:28:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/10/14/298279.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/298279.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/10/14/298279.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/298279.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/298279.html</trackback:ping><description><![CDATA[1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 操作系统 <br />
RedHat Linux<br />
2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所需软件 <br />
Apache 2.2.14&nbsp; 下载地址 <br />
http://apache.freelamp.com/httpd/httpd-2.2.14.tar.gz<br />
Tomcat5.5.28&nbsp;&nbsp;&nbsp; 下载地址 <br />
http://tomcat.apache.org/download-55.cgi<br />
JK&nbsp; 下载地址<br />
http://apache.etoak.com/tomcat/tomcat-connectors<br />
&nbsp;文件：tomcat-connectors-1.2.28-src.tar.gz<br />
<br />
Jdk 1_5_0_04&nbsp;&nbsp; 下载地址 <br />
&nbsp;&nbsp;&nbsp; http://java.sun.com/j2se/1.5.0/download.jsp <br />
<br />
备注：下载时将所需软件包文件保存在/opt目录下 <br />
3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安装步骤 <br />
<br />
A 安装JDK<br />
# cd /opt/<br />
# chmod +x jdk-1_5_0_04-linux-i586-rpm.bin<br />
# ./jdk-1.5.0_04-linux-i586-rpm.bin<br />
# cd /usr/java/<br />
# ln -s /usr/java/jdk-1_5_0_04 /opt/java<br />
# vi /etc/profile<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #添加如下内容 <br />
<br />
export JAVA_HOME=/opt/java/<br />
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar<br />
export PATH=.:$JAVA_HOME/bin:$PATH<br />
<br />
<br />
B 安装Apache<br />
<br />
# cd /opt/<br />
# tar xvfz httpd-2.0.54.tar.gz<br />
# cd httpd-2.0.54<br />
#./configure --prefix=/opt/apache --enable-module=so<br />
# make<br />
# make install<br />
# cd /opt/apache/conf<br />
# vi ./httpd.conf<br />
<br />
将Listen 80 修改为Listen &lt;Your IP&gt;:80 IP到时候就是自己机器的IP地址，否则<br />
其他机器没法访问你。<br />
<br />
将ServerName 修改为ServerName &lt;HOST-NAME&gt; ，这个地方直接127.0.0.1即可。集群的时候会读httpd-vhost.conf<br />
<br />
下面是一个配置有关的问题：<br />
<br />
修改serverName，重装apache后问题依旧，最后发现host配置不正确，<br />
<br />
httpd.conf 中serverName 为www.zudar.com<br />
<br />
host 中 127.0.0.1 www.zudar.com<br />
<br />
改为 192.168.100.38&nbsp; www.zudar.com<br />
<br />
后正确启动<br />
<br />
问题是由于 ip 地址 与 域名没有正确匹配引起<br />
<br />
也就是说host中一点要配置好ip与serverName<br />
<br />
hostname与/etc/hosts的关系<br />
<br />
很过人一提到更改hostname首先就想到修改/etc/hosts文件，认为hostname的配置文件就是/etc/hosts。其实不是的。<br />
<br />
hosts文件的作用相当如DNS，提供IP地址到hostname的对应。早期的互联网计算机少，单机hosts文件里足够存放所有联网计算机。不过随着互联网的发展，这就远远不够了。于是就出现了分布式的DNS系统。由DNS服务器来提供类似的IP地址到域名的对应。具体可以man hosts。<br />
<br />
Linux系统在向DNS服务器发出域名解析请求之前会查询/etc/hosts文件，如果里面有相应的记录，就会使用hosts里面的记录。/etc/hosts文件通常里面包含这一条记录<br />
127.0.0.1&nbsp;&nbsp;&nbsp; localhost.localdomain&nbsp;&nbsp; localhost<br />
<br />
hosts文件格式是一行一条记录，分别是IP地址 hostname aliases，三者用空白字符分隔，aliases可选。<br />
<br />
127.0.0.1到localhost这一条建议不要修改，因为很多应用程序会用到这个，比如sendmail，修改之后这些程序可能就无法正常运行。<br />
<br />
修改hostname后，如果想要在本机上用newhostname来访问，就必须在/etc/hosts文件里添加一条newhostname的记录。比如我的eth0的IP是192.168.1.61，我将hosts文件修改如下：<br />
#hostname blog.infernor.net<br />
# cat /etc/hosts<br />
127.0.0.1&nbsp; localhost.localdomain localhost<br />
192.168.1.61&nbsp;&nbsp;&nbsp; blog.infernor.net&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blog<br />
<br />
这样，我就可以通过blog或者blog.infernor.net来访问本机。<br />
<br />
<br />
<br />
<br />
在DirectoryIndex中添加 index.jsp<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # cd /opt/apache/bin/<br />
<br />
# ./apachectl configtest<br />
<br />
若显示Syntax ok则表明安装成功 <br />
<br />
#./apachectl start<br />
<br />
启动apache服务，访问本机80端口，查看端口是否正常 <br />
<br />
# ./apachectl stop<br />
<br />
关闭服务 <br />
<br />
备注：prefix定义apache的安装路径 <br />
<br />
C 安装Tomcat<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # cd /opt/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # tar xvfz jakarta-tomcat-5.5.9.tar.gz<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # ln &#8211;s /opt/jakarta-tomcat-5.5.9　/opt/tomcat<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # vi /opt/tomcat/bin/catalina.sh<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAVA_HOME=/opt/java <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 启动服务后，访问本机8080端口，查看端口是否正常 <br />
<br />
# /opt/tomcat/bin/startup.sh /startup.bat&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关闭服务 <br />
<br />
# /opt/tomcat/bin/shutdown.sh /shutdown.bat<br />
<br />
修改各个tomcat的端口（如果两台机器是在不同的主机上，端口可以不动，显然）<br />
tomcat1/conf/server.xml<br />
&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt;改为<br />
&lt;Server port="11001" shutdown="SHUTDOWN" debug="0"&gt;<br />
<br />
&lt;Connector port="8080"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" acceptCount="100"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; debug="0" connectionTimeout="20000"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disableUploadTimeout="true" URIEncoding="UTF-8"/&gt;改为<br />
&lt;Connector port="11002"<br />
......<br />
<br />
作loadbalance的话，上面connector可以注释掉。<br />
<br />
&lt;Connector port="8009"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" debug="0"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protocol="AJP/1.3" /&gt;改为<br />
&lt;Connector port="11003"<br />
......<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
tomcat2/conf/server.xml<br />
&lt;Server port="8005" shutdown="SHUTDOWN" debug="0"&gt;改为<br />
&lt;Server port="12001" shutdown="SHUTDOWN" debug="0"&gt;<br />
<br />
&lt;Connector port="8080"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" acceptCount="100"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; debug="0" connectionTimeout="20000"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; disableUploadTimeout="true" URIEncoding="UTF-8"/&gt;改为<br />
&lt;Connector port="12002"<br />
......<br />
上面这个connector同样也注释掉。<br />
<br />
&lt;Connector port="8009"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" debug="0"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protocol="AJP/1.3" /&gt;改为<br />
&lt;Connector port="12003" <br />
<br />
<br />
<br />
D 安装JK<br />
<br />
#cd /usr/local/<br />
# tar xzvf jakarta-tomcat-connectors-1.2.14-src.tar.gz<br />
#cd jakarta-tomcat-connectors-1.2.14-src/native<br />
#./buildconf.sh<br />
#./configure --with-apxs=/usr/local/apache/bin/apxs<br />
#make<br />
#make install<br />
#cd /opt/jakarta-tomcat-connectors- jk1.2.14-src/jk/native/apache-2.0/<br />
#cp mod_jk.so /opt/apache/modules/<br />
<br />
<br />
<br />
<br />
E 系统整合 <br />
<br />
#vi /opt/apache/conf/httpd.conf<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在文件最末尾加上如下语句 <br />
<br />
include conf/mod_jk.conf <br />
<br />
<br />
# Configure mod_jk.conf<br />
<br />
在conf目录下创建mod_jk.conf文件，内容如下：<br />
<br />
--------------------------mod_jk.conf--------------------------<br />
# Load mod_jk module<br />
LoadModule jk_module modules/mod_jk.so<br />
<br />
<br />
# Where to find workers.properties<br />
JkWorkersFile conf/workers.properties<br />
<br />
# Where to put jk logs<br />
JkLogFile logs/mod_jk.log<br />
<br />
# Set the jk log level [debug/error/info]<br />
JkLogLevel info<br />
<br />
# Select the log format<br />
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "<br />
<br />
# JkRequestLogFormat set the request format<br />
JkRequestLogFormat "%w %V %T"<br />
<br />
#指定那些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器<br />
JkMount /*.jsp loadbalancer（这个loadbalancer是下面worker.list最后一个值）<br />
<br />
如果还要指定*.do也进行分流就再加一行<br />
JkMount /*.do loadbalancer<br />
<br />
如果你想对所有的请求进行分流只需要写成<br />
JkMount /* loadbalancer<br />
<br />
<br />
--------------------------mod_jk.conf--------------------------<br />
<br />
编辑workers.properties<br />
#vi /opt/apache/conf/workers.properties <br />
<br />
#<br />
# workers.properties<br />
#<br />
<br />
# list the workers by name<br />
<br />
worker.list=tomcat1, tomcat2, loadbalancer<br />
<br />
# ------------------------<br />
<br />
# First tomcat server<br />
<br />
# ------------------------<br />
<br />
worker.tomcat1.port=11003<br />
worker.tomcat1.host=127.0.0.1<br />
worker.tomcat1.type=ajp13<br />
<br />
# Specify the size of the open connection cache.<br />
<br />
#worker.tomcat1.cachesize<br />
#<br />
# Specifies the load balance factor when used with<br />
<br />
# a load balancing worker.<br />
<br />
# Note:<br />
<br />
# ----&gt; lbfactor must be &gt; 0<br />
<br />
# ----&gt; Low lbfactor means less work done by the worker.<br />
<br />
worker.tomcat1.lbfactor=100<br />
<br />
# ------------------------<br />
# Second tomcat server<br />
# ------------------------<br />
<br />
worker.tomcat2.port=12003<br />
worker.tomcat2.host=127.0.0.1<br />
worker.tomcat2.type=ajp13<br />
<br />
# Specify the size of the open connection cache.<br />
#worker.tomcat2.cachesize<br />
#<br />
<br />
# Specifies the load balance factor when used with<br />
# a load balancing worker.<br />
# Note:<br />
<br />
# ----&gt; lbfactor must be &gt; 0<br />
# ----&gt; Low lbfactor means less work done by the worker.<br />
worker.tomcat2.lbfactor=100<br />
<br />
# ------------------------<br />
<br />
# Load Balancer worker<br />
<br />
# ------------------------<br />
<br />
# The loadbalancer (type lb) worker performs weighted round-robin<br />
<br />
# load balancing with sticky sessions.<br />
<br />
# Note:<br />
<br />
# ----&gt; If a worker dies, the load balancer will check its state<br />
<br />
# once in a while. Until then all work is redirected to peer<br />
<br />
# worker.<br />
worker.loadbalancer.type=lb<br />
worker.loadbalancer.balanced_workers=tomcat1, tomcat2<br />
<br />
#<br />
# END workers.properties<br />
#<br />
<br />
<br />
cluster配置，如果不配置cluster只是做loadbalance不需要<br />
修改server.xml中的engine<br />
#vi /opt/tomcat/conf/server.xml <br />
<br />
在120行左右修改原来的, 添加jvmRoute="tomcat1"<br />
<br />
&lt;Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1"&gt;<br />
<br />
若第二台tomcat，添加jvmRoute的修改为tomcat2 <br />
<br />
<br />
至此，系统已经整个完毕&nbsp; 启动apache和tomcat服务 如果不放心可以编写一个测试<br />
<br />
在其中一个tomcat的webapps中建立一个目录TestCluster，里面新建一个test.jsp,内容为<br />
<br />
<br />
&lt;%<br />
System.out.println("===========================");<br />
%&gt;<br />
<br />
把TestCluster放到tomcat1,tomcat2的webapps下<br />
<br />
启动apache,tomcat1,tomcat2,进行测试<br />
通过 http://localhost/TestCluster/test.jsp 访问，多刷新几次页面，查看Tomcat1和Tomcat2 logs目录下面的catalina.out<br />
文件，你将可以看到打印了一行行"==========================="，并且从统计上来说，<br />
大约在tomcat2打印的数量和在Tomcat1中一样，<br />
如果lbfactor不一样的话，可以看到请求会被tomcat1,tomcat2按照不同的权重分流处理,实现了负载均衡。 <br />
<br />
<br />
自动重启<br />
&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp; 将如下内容添加至/etc/rc.d/rc.local文件末尾，以便系统启动后开启apache,tomcat服务 <br />
<br />
/usr/local/tomcat1/bin/startup.sh<br />
/usr/local/tomcat2/bin/startup.sh<br />
/opt/apache/bin/apachectl start <br />
<br />
<br />
这样做是不是够呢，比如说一个浏览器访问的时候开始被分发给A sever，然后又分发给B server，那么<br />
session里面的数据就不一致了或不正确了。两个问题，一个是apahce已经实现了，对于同一个浏览器通过来的请求会绑定到同一个server，那就没有问题。但是通过下面的测试发现不是的。<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">&lt;%</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">@&nbsp;page&nbsp;contentType</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">text/html;&nbsp;charset=GBK</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">%&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">&lt;%</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">@&nbsp;page&nbsp;import</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">java.util.*</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">%&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">html</span><span style="color: rgb(0, 0, 255);">&gt;&lt;</span><span style="color: rgb(128, 0, 0);">head</span><span style="color: rgb(0, 0, 255);">&gt;&lt;</span><span style="color: rgb(128, 0, 0);">title</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">Cluster&nbsp;App&nbsp;Test</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">title</span><span style="color: rgb(0, 0, 255);">&gt;&lt;/</span><span style="color: rgb(128, 0, 0);">head</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">body</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
Server&nbsp;Info:<br />
</span><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">&lt;%</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);"><br />
out.println(request.getLocalAddr()&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;:&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;request.getLocalPort()</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&lt;br&gt;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">);</span><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">%&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">&lt;%</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;out.println(</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&lt;br&gt;&nbsp;ID&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;session.getId()</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&lt;br&gt;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">//</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;如果有新的&nbsp;Session&nbsp;属性设置<br />
&nbsp;&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">String</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;dataName&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;request.getParameter(</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">dataName</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">if</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;(dataName&nbsp;!</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">null</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&amp;&amp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;dataName.length()&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&gt;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">0</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">String</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;dataValue&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;request.getParameter(</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">dataValue</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute(dataName,&nbsp;dataValue);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;out.print(</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&lt;b&gt;Session&nbsp;列表&lt;/b&gt;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;Enumeration&nbsp;e&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;session.getAttributeNames();<br />
&nbsp;&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">while</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;(e.hasMoreElements())&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">String</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;name&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;(</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">String</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">)e.nextElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 255);">String</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;value&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">=</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;session.getAttribute(name).toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(&nbsp;name&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;=&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;value</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&lt;br&gt;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;name&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;=&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">"</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">+</span><span style="background-color: rgb(245, 245, 245); color: rgb(0, 0, 0);">&nbsp;value);<br />
&nbsp;&nbsp;&nbsp;}<br />
</span><span style="background-color: rgb(255, 255, 0); color: rgb(0, 0, 0);">%&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">form&nbsp;</span><span style="color: rgb(255, 0, 0);">action</span><span style="color: rgb(0, 0, 255);">="index.jsp"</span><span style="color: rgb(255, 0, 0);">&nbsp;method</span><span style="color: rgb(0, 0, 255);">="POST"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;名称:</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">input&nbsp;</span><span style="color: rgb(255, 0, 0);">type</span><span style="color: rgb(0, 0, 255);">=text&nbsp;</span><span style="color: rgb(255, 0, 0);">size</span><span style="color: rgb(0, 0, 255);">=20&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="dataName"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">br</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;值:</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">input&nbsp;</span><span style="color: rgb(255, 0, 0);">type</span><span style="color: rgb(0, 0, 255);">=text&nbsp;</span><span style="color: rgb(255, 0, 0);">size</span><span style="color: rgb(0, 0, 255);">=20&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="dataValue"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">br</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">input&nbsp;</span><span style="color: rgb(255, 0, 0);">type</span><span style="color: rgb(0, 0, 255);">=submit</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">form</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">body</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">html</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<br />
是需要其他配置还是？另一个方法就是session的复制，及集群功能。<br />
配置集群的方法参考&#8220;链接&#8221;中的一篇文章就可以了。<br />
<br />
apache和tomcat虚拟机设置：<br />
1，在apache中 注销DocumentRoot，ServerName，Directory 等行（Directory包括的也<br />
<br />
是）。<br />
2，把conf文件中的Include conf/extra/httpd-vhosts.conf的注销去掉，这个文件专<br />
<br />
门用于配置虚拟主机。<br />
3，设置conf文件的listen 为你的ip<br />
4，假设apache的项目在usr/webapps下，项目的域名为www.mydomain.com,并在isp做好<br />
<br />
了域名解析指向当前服务器的IP<br />
5，打开conf/extra/httpd-vhosts.conf ,添加如下内容<br />
NameVirtualHost *:80<br />
<br />
&lt;VirtualHost *:80&gt;<br />
ServerAdmin admin@yazhouly.cn<br />
ServerName www.mydomain.com<br />
DocumentRoot "/usr/webapps/test"<br />
&lt;Directory /&gt;<br />
&nbsp;&nbsp;&nbsp; Options FollowSymLinks<br />
&nbsp;&nbsp;&nbsp; AllowOverride None<br />
&nbsp;&nbsp;&nbsp; Order deny,allow<br />
&nbsp;&nbsp;&nbsp; Deny from all<br />
&lt;/Directory&gt;<br />
&lt;Directory "/usr/webapps/test"&gt;<br />
&nbsp;&nbsp;&nbsp; Options Indexes FollowSymLinks<br />
&nbsp;&nbsp;&nbsp; AllowOverride None<br />
&nbsp;&nbsp;&nbsp; Order allow,deny<br />
&nbsp;&nbsp;&nbsp; Allow from all<br />
&lt;/Directory&gt;<br />
<br />
JkMount /* loadbalancer<br />
&lt;/VirtualHost&gt;<br />
其中最后四行表示关于jsp的内容都转交给tomcat处理，虽然我们在配置连接器的时候<br />
<br />
，已经配置了，但是在虚拟机设置后，还是要单独加上这几句，其中work就是<br />
<br />
mod_jk.conf中配置的代理名。<br />
打开tomcat目录conf下面的server.xml<br />
添加主机信息<br />
&nbsp;&lt;Host name="localhost"&nbsp; appBase="/usr/webapps/test"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unpackWARs="true" autoDeploy="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xmlValidation="false" xmlNamespaceAware="false"&gt;<br />
&lt;Context path="" docBase="/usr/webapps/test" debug="0" reloadable="true" <br />
<br />
crossContext="true"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Host&gt;<br />
保存 重新启动apache<br />
在地址栏中输入<br />
www.mydomain.com<br />
就会出现你的首页<br />
<br />
<strong><font size="4">遇到的问题</font></strong> <br />
<strong>1）启动时产生 Error receiving mcast package</strong> <br />
经测试发现，我用的ADSL,如果我联网，则会报这个异常，如果断网则不会产生。看来那个 <br />
tcpListenAddress="192.168.0.1" <br />
需要使用外网的IP地址才可以。 <br />
<strong>2）启动异常，一般是端口被占用</strong> <br />
请仔细看各个server.xml配置文件，各个端口不能相同<br />
<br />
3)如果不能做cluster只做load balance那么jvm="tomcat1"和jvm="tomcat2"这两部分内容必须保留，<br />
cluster保持注释状态，&lt;distributable/&gt;不需要。<br />
<br />
<img src ="http://www.blogjava.net/persister/aggbug/298279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-10-14 20:28 <a href="http://www.blogjava.net/persister/archive/2009/10/14/298279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JspSmart之upload组件源码</title><link>http://www.blogjava.net/persister/archive/2009/10/13/298084.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Tue, 13 Oct 2009 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/10/13/298084.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/298084.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/10/13/298084.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/298084.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/298084.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->&nbsp;&nbsp;&nbsp;1&nbsp;File.java&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;import&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/persister/archive/2009/10/13/298084.html'>阅读全文</a><img src ="http://www.blogjava.net/persister/aggbug/298084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-10-13 17:08 <a href="http://www.blogjava.net/persister/archive/2009/10/13/298084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMeter测试</title><link>http://www.blogjava.net/persister/archive/2009/10/10/297674.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Sat, 10 Oct 2009 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/10/10/297674.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/297674.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/10/10/297674.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/297674.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/297674.html</trackback:ping><description><![CDATA[转载于：http://tech.it168.com/a2008/1229/261/000000261559.shtml<br />
<br />
<br />
JMeter是apache的jakarta上面的项目，用于<a href="http://software.it168.com/" target="_blank" style="color: rgb(0, 0, 0);" title="软件">软件</a>的
压力测试（Load Test），不但可以对HTTP，也可以对数据库（通过JDBC）、FTP、Web Service、Java
对象等等进行压力测试。最近，在我们的项目中使用到了它。我们的项目是基于BEA
Weblogic的一个J2EE项目，在一个Domain中部署了3个J2EE应用，这样在客户使用的过程中出现了WebLogic<a href="http://product.it168.com/list/b/0205_1.shtml" target="_blank" style="color: rgb(0, 0, 0);" title="内存">内存</a>垃圾回收的问题。于是我们配置了WebLogic集群，并将其中的某些应用分开部署，并使用了JMeter进行了性能测试。从而为应用程序的性能诊断提供了必要的依据。
<p>&nbsp;&nbsp;&nbsp; 基本概念</p>
<p>　　JMeter的测试计划（Test Plan）呈树状结构，树里面有多种元素类型，树状结构的元素之间有的是有继承关系的（其原理有点类似log4j）。下面简述一下元素类型：</p>
<p>&nbsp;&nbsp;&nbsp; 1、ThreadGroup<br />
顾名思义就是线程组，测试必须有一个ThreadGroup元素作为基础（否则就没有测试线程在跑了），这个元素可以配置跑多少个线程、每个线程循环多少次，所有线程数的总启动时间（Ramp-up period）等等。</p>
<p>&nbsp;&nbsp;&nbsp; 2、Controller<br />
包括Logical Controller和Sampler，前者用来作一些逻辑上的控制，例如轮换、条件、循环等等。Sampler就是真正&#8220;干活&#8221;的&#8220;取样器&#8221;，例如&#8220;HTTP Request&#8221;，就是拿来执行一个HTTP请求的。</p>
<p>&nbsp;&nbsp;&nbsp; 3、Listener<br />
Listener对请求过程进行监听，可以简单理解为获取结果的东东。例如Simple Data
Writer，可以把结果写到一个文本文件里（其实所有Listener都可以写数据到文件里），还有View Results in
Table，就是把结果显示在表格里。</p>
<p>&nbsp;&nbsp;&nbsp; 4、 Timer<br />
用来控制执行流程中的时间延迟等功能。</p>
<p>&nbsp;&nbsp;&nbsp; 5、 Assertion<br />
断言，加到Sampler里面可以对返回的结果进行判断，例如判断HTTP返回结果里面是否含有某个字符串。如果断言为真，JMeter会标记请求为成功，否则标记为失败。</p>
<p>&nbsp;&nbsp;&nbsp; 6、 Configuration Element<br />
配置用的元素，很有用。由于测试计划是树状和有继承关系的，可以在高层次指定一个Configuration Element，低层次的相关Sampler如果没有显式地指定配置，就继承高层次的配置信息。（跟log4j很像吧？）</p>
<p>&nbsp;&nbsp;&nbsp; 7、 Pre-Processor/Post-Processor Elements <br />
用来在Sampler运行前和运行后作一些预处理和后处理工作的。例如动态修改请求的参数（预处理），从返回信息里面提取信息（后处理）等等。</p>
<p><br />
要提醒一下的是jmeter根据当前系统的locale显示菜单的语言，为了方便想设置回英文的话，可以修改jmeter.properties文件，设置language=en</p>
<p>&nbsp;&nbsp;&nbsp; JMeter的使用</p>
<p><br />
&nbsp;&nbsp;&nbsp; #启动</p>
<p>　　大家可以到通过<a href="http://apache.linuxforum.net/dist/jakarta/jmeter/binaries/jakarta-jmeter-1.9.1.zip">http://apache.linuxforum.net/dist/jakarta/jmeter/binaries/jakarta-jmeter-1.9.1.zip</a>下
载JMeter的release版本，然后将下载的.zip文件解压缩到C:/JMeter（后面的文章中将使用%JMeter%来引用这个目录）目录
下。现在，请使用%JMeter%/bin下面的jmeter.bat批处理文件来启动JMeter的可视化界面，下面的工作都将在这个可视化界面界面上
进行操作。下面的图片是JMeter的可视化界面的<a href="http://product.it168.com/list/b/0107_1.shtml" target="_blank" style="color: rgb(0, 0, 0);" title="屏幕">屏幕</a>截图。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://image3.it168.com//2008/12/29/d8b01e37-6b04-4cdb-b804-7c2a480c6f38.jpg" border="0" />&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 图一： JMeter打开时的屏幕截图?</p>
<p>&nbsp;&nbsp;&nbsp; # 建立测试计划（Test Plan）</p>
<p>
测试计划描述了执行测试过程中JMeter的执行过程和步骤，一个完整的测试计划包括一个或者多个线程组(Thread
Groups)、逻辑控制（Logic Controller）、实例产生控制器（Sample Generating
Controllers）、侦听器(Listener)、定时器（Timer）、比较（Assertions）、配置元素（Config
Elements）。打开JMeter时，它已经建立一个默认的测试计划,一个JMeter应用的实例只能建立或者打开一个测试计划。现在我们开始填充一
个测试计划的内容，这个测试计划向一个jsp文件和一个servlet发出请求，我们需要JMeter模拟五个请求者（也就是五个线程），每个请求者连续
请求两次，下面的章节介绍了详细的操作步骤。</p>
<p>&nbsp;&nbsp;&nbsp; # 增加负载信息设置</p>
<p>　　这一步，我们将向测试计划中增加相关负载设置,是Jmeter知道我们需要模拟五个请求者，每个请求者在测试过程中连续请求两次。详细步骤如下：</p>
<p>&nbsp;&nbsp;&nbsp; 1. 选中可视化界面中左边树的Test Plan节点，单击右键，选择Add'Thread Group，界面右边将会出现他的设置信息框。</p>
<p>&nbsp;&nbsp;&nbsp; 2. Thread Group有三个和负载信息相关的参数：</p>
<p>&nbsp;&nbsp;&nbsp; Number of Threads： 设置发送请求的用户数目</p>
<p>&nbsp;&nbsp;&nbsp; Ramp-up period： 每个请求发生的总时间间隔，单位是秒。比如你的请求数目是5，而这个参数是10，那么每个请求之间的间隔就是10／5，也就是2秒</p>
<p>&nbsp;&nbsp;&nbsp; Loop Count： 请求发生的重复次数，如果选择后面的forever（默认），那么 请求将一直继续，如果不选择forever，而在输入框中输入数字，那么请求将重复 指定的次数，如果输入0，那么请求将执行一次。</p>
<p>　　根据我们演示例子的设计，我们应该将Number of Threads设置为5，Ramp-up period设置为0（也就是同时并发请求），不选中forever，在Loop Count后面的输入框中输入2，设置后的屏幕截图如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://image3.it168.com//2008/12/29/be8a63cb-36a7-49d6-8e36-943b57040ae0.jpg" border="0" />&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 图二：设置好参数的Thread Group。</p>
<p>&nbsp;&nbsp;&nbsp; # 增加默认Http属性（可选）</p>
<p>　　实际的测试工作往往是针对同一个<a href="http://server.it168.com/" target="_blank" style="color: rgb(0, 0, 0);" title="服务器">服务器</a>上Web应用展开的,所以Jmeter提供了这样一种设置, 在默认Http属性设置需要被测试<a href="http://product.it168.com/files/0402search.shtml" target="_blank" style="color: rgb(0, 0, 0);" title="服务器">服务器</a>的相关属性，以后的http请求设置中就可以忽略这些相同参数的设置,减少设置参数录入的时间。我们这里将采用这种属性。你可以通过下面的步骤来设置默认http属性：</p>
<p>&nbsp;&nbsp;&nbsp; 1. 选中可视化界面中左边树的Test Plan节点，单击右键，选择Add'config element'http request defaults，界面右边将会出现他的设置信息框。</p>
<p>&nbsp;&nbsp;&nbsp; 2. 默认http属性的主要参数说明如下：</p>
<p>&nbsp;&nbsp;&nbsp; protocal：发送测试请求时使用的协议</p>
<p>&nbsp;&nbsp;&nbsp; server name or ip：被测试服务器的ip地址或者名字</p>
<p>&nbsp;&nbsp;&nbsp; path： 默认的起始位置。比如将path设置为／jmeter，那么所有的http请求的url中都将增加／jmeter路径。</p>
<p>&nbsp;&nbsp;&nbsp; port number： 服务器提供服务的端口号</p>
我们的测试计划将针对本机的Web服务器上的Web应用进行测试，所以protocal应该是http，ip使用localhost，因为这个web应
用发布的context路径是／jmeter，所以这里的path设置为／jmeter，因为使用Tomcat服务器，所以port
number是8080。<br />
<br />
# ?增加Http请求
<p>　　现在我们需要增加http请求了，他也是我们测试的内容主体部分。你可以通过下面的步骤来增加性的http请求：</p>
<p>&nbsp;&nbsp;&nbsp; 1. 选中可视化界面中左边树的Thread Group节点，单击右键，选择Add'sampler'http request，界面右边将会出现他的设置信息框。</p>
<p>&nbsp;&nbsp;&nbsp; 2. 他的参数和2.5中介绍的http属性差不多，增加的属性中有发送http时方法的选择，你可以选择为get或者post。</p>
<p>　　我们现在增加两个http 请求，因为我们设置了默认的http属性，所以和默认http属性中相同的属性不再重复设置。设置后的<a href="http://product.it168.com/list/b/0107_1.shtml" target="_blank" style="color: rgb(0, 0, 0);" title="屏幕">屏幕</a>截图如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://image3.it168.com//2008/12/29/8a9ce510-e194-4d0c-ae73-a32f0bbfebbd.jpg" border="0" /></p>
<p>&nbsp;&nbsp;&nbsp; 图三：设置好的jsp测试请求</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://image3.it168.com//2008/12/29/7e53743c-819d-4efa-b7d7-9bdbbb2a2bf4.jpg" border="0" />&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 图四：设置好的Servlet测试请求（带参数）?</p>
<p>&nbsp;&nbsp;&nbsp; # 增加Listener</p>
<p>
增加listener是为了记录测试信息并且可以使用Jmeter提供的可视化界面查看测试结果，里面有好几种结果分析方式可供选择，你可以根据自己习
惯的分析方式选择不同的结果显示方式，我们这里使用表格的形式来查看和分析测试结果。你可以通过下面的步骤来增加listener：</p>
<p>&nbsp;&nbsp;&nbsp; 1. 选中可视化界面中左边树的Test Plan节点，单击右键，选择Add'listener'view result in table，界面右边将会出现他的设置信息和结果显示框。</p>
<p>&nbsp;&nbsp;&nbsp;
2.
你可以设置界面上面的filename属性设置将测试结果保存到某个文件中界面下面将使用表格显示测试结果，表格的第一列sampleno显示请求执行的
顺序和编号，url显示　　请求发送的目标，sample－ms列显示这个请求完成耗费的时间，最后的success列显示改请求是否成功执行。界面的最
下面你还可以看到一些统计信息，最关心的应该是Average吧，也就是相应的平均时间。?</p>
<p>&nbsp;&nbsp;&nbsp; # 开始执行测试计划</p>
<p>　　现在你可以通过单击菜单栏run -&gt; Start开始执行测试计划了。下面是该测试计划的结果图:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://image3.it168.com//2008/12/29/7b8c9731-bad2-4368-ba3f-7a41b2df2047.jpg" border="0" /></p>
<p>&nbsp;&nbsp;&nbsp; 图五：结果显示</p>
JMeter用于进行供能或者性能测试，通过使用JMeter提供的供能，我们可以可视化的制定测试计划：包括规定使用什么样的负载、测试什么内容、传入的参数，同时，他提供了好多种图形化的测试结果显示方式，使我们能够简单的开始测试工作和分析测试结果。<br />
<br />
<img src ="http://www.blogjava.net/persister/aggbug/297674.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-10-10 14:29 <a href="http://www.blogjava.net/persister/archive/2009/10/10/297674.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cookie编程问题及Base64中文编码问题</title><link>http://www.blogjava.net/persister/archive/2009/10/02/297103.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Fri, 02 Oct 2009 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/10/02/297103.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/297103.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/10/02/297103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/297103.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/297103.html</trackback:ping><description><![CDATA[调用Cookie对象的构造函数可以创建Cookie。Cookie对象的构造函数有两个字符串参数：Cookie名字和Cookie值。<br />
<br />
Cookie cookie = new Cookie(name,value);<br />
<br />
调用下面的方法时出现一个问题<br />
response.addCookie(cookie)；//cookie 是一个Cookie实例<br />
<br />
问题报错：java.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value<br />
<br />
很显然Cookie之中存在了非法参数，经过测试发现cookie之中包含""r"n"、""n"时就会出现这个异常。<br />
<br />
因为cookie中部分值是通过文本框录入的，在&lt;textarea/&gt;标签中键入回车键后，value值中就加入了""r"n"，<br />
把这样的值赋给cookie，执行response.addCookie(cookie)；时则出现异常。<br />
<br />
解决办法：使用String类的replace（）方法。<br />
Java代码<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080;">1</span>&nbsp;<span style="color: #000000;">str&nbsp;=&nbsp;str.replace(""r"n",&nbsp;"</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">br</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080;">2</span>&nbsp;<span style="color: #000000;">str&nbsp;=&nbsp;str.replace(""n",&nbsp;"</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">br</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">");<br />
</span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;"><br />
</span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">Cookie&nbsp;cookie&nbsp;=&nbsp;new&nbsp;Cookie('cookName',str);<br />
</span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">//永久有效<br />
</span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">cookie.setMaxAge(60*60*24*365);<br />
</span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">response.addCookie(cookie)；</span></div>
<br />
刚才看到Base64错误，通常不将数据直接保存在cookie中，而要进行Base64编码<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">String&nbsp;cookieValueBase64&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String(Base64.encode(cookieValue.getBytes(</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;">)));&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">设置UTF-8否则会乱码</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">Debug.log(</span><span style="color: #000000;">"</span><span style="color: #000000;">Ba64:</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;cookieValueBase64,&nbsp;module);<br />
cookieValueBase64&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cookieValueBase64.replace(</span><span style="color: #000000;">""</span><span style="color: #000000;">r</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
cookieValueBase64&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cookieValueBase64.replace(</span><span style="color: #000000;">""</span><span style="color: #000000;">n</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;"><br />
</span><span style="color: #000000;">Cookie&nbsp;cookie&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Cookie(key,&nbsp;cookieValueBase64);<br />
cookie.setMaxAge(time);<br />
cookie.setPath(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;设置適用路经</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">res.addCookie(cookie);</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;将cookie添加到response对象中。由response对象返回给户端&nbsp;&nbsp; <br />
</span></div>
<br />
<br />
取得时候:new String(Base64.decode(ck.getValue()),"UTF-8");&nbsp;&nbsp;&nbsp;&nbsp; 　　<br />
<br />
这样做就行了吗？发现还是不够，出现什么问题呢？<br />
原来如果cookie值中出现等号，那么取出来的值只取等号前面的值，等号及等号后面的值会被忽略<br />
<br />
Base64编码难保不出现等号，怎么解决呢？采用UrlEncoder和UrlDecoder，存的时候：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">String&nbsp;cookieValueBase64&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String(Base64.encode(cookieValue.getBytes(</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;">)));<br />
cookieValueBase64&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cookieValueBase64.replace(</span><span style="color: #000000;">""</span><span style="color: #000000;">r</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
cookieValueBase64&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cookieValueBase64.replace(</span><span style="color: #000000;">""</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">String&nbsp;cookieValueUrlEncode&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;URLEncoder.encode(cookieValueBase64,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
<br />
取的时候：<br />
<br />
new String(Base64.decode(URLDecoder.decode(ck.getValue(), "UTF-8")),"UTF-8");<br />
<br />
这样很多特殊字符就可以了。<br />
<br />
<img src ="http://www.blogjava.net/persister/aggbug/297103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-10-02 16:14 <a href="http://www.blogjava.net/persister/archive/2009/10/02/297103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>html中的Image标签及Servlet获取图片</title><link>http://www.blogjava.net/persister/archive/2009/10/02/297101.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Fri, 02 Oct 2009 06:12:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/10/02/297101.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/297101.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/10/02/297101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/297101.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/297101.html</trackback:ping><description><![CDATA[Image属性src是可以设置servlet的路径的，即从servlet获取图片<br />
如在web.xml配置：<br />
<br />
&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;servlet-name&gt;GenerateImageServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;servlet-class&gt;org.bruce.util.GenerateImageServlet&lt;/servlet-class&gt;<br />
&nbsp; &lt;/servlet&gt;<br />
&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;servlet-name&gt;GenerateImageServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;/getImage&lt;/url-pattern&gt;<br />
&nbsp; &lt;/servlet-mapping&gt;<br />
<br />
然后在jsp文件中：<br />
<br />
&lt;img src="getImage" title="美女"&gt;<br />
<br />
这样就可以得到图片了。这里就给动态获取图片提供了一种途径。<br />
比如可以通过src="getImage?id=1000"就可以得到1000号图片。<br />
<br />
还可以采用JavaScript onclick方法刷新图片，网上参考资料采用如下方法：<br />
<br />
&lt;img src="valid" onclick="regenerate(this)" title="美女"&gt;<br />
&lt;script&gt;<br />
function regenerate(this){<br />
&nbsp;&nbsp; &nbsp;this.src="getImage";<br />
}<br />
&lt;/script&gt;<br />
<br />
尝试后，发现这种方法无效，由于路径没变，浏览器不会重新发起请求。这里我采用另外一种技巧：<br />
<br />
&nbsp;&nbsp; &nbsp;&lt;script type="text/javascript"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;function regenerate(obj){var date=new Dat();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj.src="getImage?time=" + date.getSeconds();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;&lt;/script&gt;<br />
<br />
这样由于路径发生了变化，就重新发起请求，轻松实现点击更新图片内容。<br />
在生成验证码的时候这个方法很管用，因为当页面显示的验证码看不清时，应该提供方法重新获取一张。<br />
<br />
<img src ="http://www.blogjava.net/persister/aggbug/297101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-10-02 14:12 <a href="http://www.blogjava.net/persister/archive/2009/10/02/297101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一例乱码的问题</title><link>http://www.blogjava.net/persister/archive/2009/09/20/295759.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Sun, 20 Sep 2009 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/09/20/295759.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/295759.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/09/20/295759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/295759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/295759.html</trackback:ping><description><![CDATA[页面布局采用了sitemesh。其中有一个静态页面a.htm：<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">SiteMesh&nbsp;Sample&nbsp;Site</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Welcome&nbsp;to&nbsp;the&nbsp;SiteMesh&nbsp;sample<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h3</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Samples</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h3</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ul</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">li</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">a&nbsp;</span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="inline.jsp"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">中国</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">li</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ul</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span></div>
<br />
结果出现了乱码，后来改成了jsp页面<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="background-color: #ffff00; color: #000000;">&lt;%</span><span style="background-color: #f5f5f5; color: #000000;">@&nbsp;page&nbsp;contentType</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">text/html;&nbsp;charset=utf-8</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;pageEncoding</span><span style="background-color: #f5f5f5; color: #000000;">=</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">utf-8</span><span style="background-color: #f5f5f5; color: #000000;">"</span><span style="background-color: #f5f5f5; color: #000000;">&nbsp;</span><span style="background-color: #ffff00; color: #000000;">%&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">SiteMesh&nbsp;Sample&nbsp;Site</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Welcome&nbsp;to&nbsp;the&nbsp;SiteMesh&nbsp;sample<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h3</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Samples</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h3</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ul</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">li</span><span style="color: #0000ff;">&gt;&lt;</span><span style="color: #800000;">a&nbsp;</span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="inline.jsp"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">中国</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">a</span><span style="color: #0000ff;">&gt;&lt;/</span><span style="color: #800000;">li</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ul</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span></div>
<br />
乱码问题就解决了。<br />
<br />
<br />
<img src ="http://www.blogjava.net/persister/aggbug/295759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-09-20 17:33 <a href="http://www.blogjava.net/persister/archive/2009/09/20/295759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OFBiz的中文乱码解决方案</title><link>http://www.blogjava.net/persister/archive/2009/08/10/290568.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Mon, 10 Aug 2009 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/08/10/290568.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/290568.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/08/10/290568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/290568.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/290568.html</trackback:ping><description><![CDATA[<p>OFBiz开发时遇到乱码的问题，MySQL数据库插入中文数据时出现了一个问题，报告中文错误：incorrect string value ．．．．．</p>
<p>1.这时由于字符编码不一致导致的，应该将数据库对应的表或coloum改成uft-8，所以如果在CustomerExtra这表中存储中文的话，需要将<br />
&nbsp; 此表另外还有operationlog表的charset改成utf-8</p>
<p>2.Servlet中字符显示为证券的中文，而且表也设置为utf-8，但是数据库和页面还是乱码，怎么回事？<br />
&nbsp; 这里需要修改jdbc url的参数，如将jdbc:mysql://localhost/ccbportal?zeroDateTimeBehavior=convertToNull<br />
&nbsp; 改成：jdbc:mysql://localhost/ccbportal?zeroDateTimeBehavior=convertToNull&amp;amp;useUnicode=true&amp;amp;characterEncoding=UTF-8</p>
<p>3.前台输入的是中文，到后台就变成了乱码，怎么回事？<br />
&nbsp; 无论何种表单提交都可以在后台的java文件中通过String des = new String(s.getBytes("iso8859-1"),"UTF-8");<br />
&nbsp; 来转换成你想要的UTF－8编码方式。但如果每处都加词句太麻烦，故分post和get两种方式区分提交。<br />
&nbsp; 写一个Filter即可解决问题：<br />
&nbsp;
</p>
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;java.io.IOException;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;javax.servlet.ServletException;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;javax.servlet.Filter;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;javax.servlet.FilterChain;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;javax.servlet.FilterConfig;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;javax.servlet.ServletRequest;<br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;import&nbsp;javax.servlet.ServletResponse;<br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;public&nbsp;class&nbsp;SetCharacterEncodingFilter&nbsp;implements&nbsp;Filter&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;protected&nbsp;String&nbsp;encoding&nbsp;=&nbsp;"GBK";<br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;protected&nbsp;FilterConfig&nbsp;filterConfig&nbsp;=&nbsp;null;<br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">17</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;protected&nbsp;boolean&nbsp;ignore&nbsp;=&nbsp;true;<br />
</span><span style="color: rgb(0, 128, 128);">18</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">19</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;public&nbsp;void&nbsp;init(FilterConfig&nbsp;filterConfig)&nbsp;throws&nbsp;ServletException&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">20</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;this.filterConfig&nbsp;=&nbsp;filterConfig;<br />
</span><span style="color: rgb(0, 128, 128);">21</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;this.encoding&nbsp;=&nbsp;filterConfig.getInitParameter("encoding");<br />
</span><span style="color: rgb(0, 128, 128);">22</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;filterConfig.getInitParameter("ignore");<br />
</span><span style="color: rgb(0, 128, 128);">23</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;if&nbsp;(value&nbsp;==&nbsp;null)<br />
</span><span style="color: rgb(0, 128, 128);">24</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;this.ignore&nbsp;=&nbsp;true;<br />
</span><span style="color: rgb(0, 128, 128);">25</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(value.equalsIgnoreCase("true"))<br />
</span><span style="color: rgb(0, 128, 128);">26</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;this.ignore&nbsp;=&nbsp;true;<br />
</span><span style="color: rgb(0, 128, 128);">27</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;(value.equalsIgnoreCase("yes"))<br />
</span><span style="color: rgb(0, 128, 128);">28</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;this.ignore&nbsp;=&nbsp;true;<br />
</span><span style="color: rgb(0, 128, 128);">29</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;else<br />
</span><span style="color: rgb(0, 128, 128);">30</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;this.ignore&nbsp;=&nbsp;false;<br />
</span><span style="color: rgb(0, 128, 128);">31</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">32</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">33</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;public&nbsp;void&nbsp;doFilter(ServletRequest&nbsp;request,&nbsp;ServletResponse&nbsp;response,<br />
</span><span style="color: rgb(0, 128, 128);">34</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;FilterChain&nbsp;chain)&nbsp;throws&nbsp;IOException,&nbsp;ServletException&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">35</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;//&nbsp;Conditionally&nbsp;select&nbsp;and&nbsp;set&nbsp;the&nbsp;character&nbsp;encoding&nbsp;to&nbsp;be&nbsp;used<br />
</span><span style="color: rgb(0, 128, 128);">36</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;if&nbsp;(ignore&nbsp;||&nbsp;(request.getCharacterEncoding()&nbsp;==&nbsp;null))&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">37</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;encoding&nbsp;=&nbsp;selectEncoding(request);<br />
</span><span style="color: rgb(0, 128, 128);">38</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(encoding&nbsp;!=&nbsp;null)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">39</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setCharacterEncoding(encoding);<br />
</span><span style="color: rgb(0, 128, 128);">40</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">41</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">42</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">43</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;//&nbsp;Pass&nbsp;control&nbsp;on&nbsp;to&nbsp;the&nbsp;next&nbsp;filter<br />
</span><span style="color: rgb(0, 128, 128);">44</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;chain.doFilter(request,&nbsp;response);<br />
</span><span style="color: rgb(0, 128, 128);">45</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">46</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">47</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;protected&nbsp;String&nbsp;selectEncoding(ServletRequest&nbsp;request)&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">48</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;return&nbsp;(this.encoding);<br />
</span><span style="color: rgb(0, 128, 128);">49</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">50</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;<br />
</span><span style="color: rgb(0, 128, 128);">51</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;public&nbsp;void&nbsp;destroy()&nbsp;{<br />
</span><span style="color: rgb(0, 128, 128);">52</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;this.encoding&nbsp;=&nbsp;null;<br />
</span><span style="color: rgb(0, 128, 128);">53</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;this.filterConfig&nbsp;=&nbsp;null;<br />
</span><span style="color: rgb(0, 128, 128);">54</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">55</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;}<br />
</span><span style="color: rgb(0, 128, 128);">56</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp; <br />
</span></div>
<p><br />
web.xml添加此Filter：<br />
</p>
<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 128, 128);">&nbsp;1</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;2</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">encodeFilter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;3</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;com.aicent.ccb.filter.SetCharacterEncodingFilter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;4</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;5</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">encoding</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;6</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">GBK</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;7</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;8</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">&nbsp;9</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">ignore</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">10</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">true</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">11</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">12</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">13</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">14</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">encodeFilter</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">15</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">/control/*</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 128, 128);">16</span>&nbsp;<span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp; <br />
</span></div>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/persister/aggbug/290568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-08-10 16:58 <a href="http://www.blogjava.net/persister/archive/2009/08/10/290568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Http 协议头基础</title><link>http://www.blogjava.net/persister/archive/2009/08/03/289664.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Mon, 03 Aug 2009 13:35:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/08/03/289664.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/289664.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/08/03/289664.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/289664.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/289664.html</trackback:ping><description><![CDATA[基础篇<br />
HTTP（HyperTextTransferProtocol）是超文本传输协议的缩写，它用于传送WWW方式的数据，关于HTTP协议的详细内容请参 考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求，请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户 信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应，相应的内容包括消息协议的版本，成功或者错误编码加上包含服务器信息、实体元信息以 及可能的实体内容。<br />
通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行，一个或者多个头域，一个只是头域结束的空行和可选的消息体组成。<strong>HTTP的头域包括通用头，请求头，响应头和实体头四个部分</strong>。<font color="#0033ff">每个头域由一个域名，冒号（:）和域值三部分组成。</font>域名是大小写无关的，域值前可以添加任何数量的空格符，头域可以被扩展为多行，在每行开始处，使用至少一个空格或制表符。<br />
<strong>1、通用头域</strong><br />
<font color="#0000ff">通用头域包含请求和响应消息都支持的头域，通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。</font>对通用头域的扩展要求通讯双方都支持此扩展，如果存在不支持的通用头域，一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。<br />
<strong>Cache-Control头域</strong><br />
<font color="#0000ff">Cache-Control指定请求和响应遵循的缓存机制。</font>在 请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no- store、max-age、max-stale、min-fresh、only-if-cached，响应消息中的指令包括public、 private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、 max-age。各个消息中的指令含义如下：<br />
<strong>Public</strong>指示响应可被任何缓存区缓存。<br />
<strong>Private</strong>指示对于单个用户的整个或部分响应消息，不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息，此响应消息对于其他用户的请求无效。<br />
<strong>no-cache</strong>指示请求或响应消息不能缓存<br />
<strong>no-store</strong>用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。<br />
<strong>max-age</strong>指示客户机可以接收生存期不大于指定时间（以秒为单位）的响应。<br />
<strong>min-fresh</strong>指示客户机可以接收响应时间小于当前时间加上指定时间的响应。<br />
<strong>max-stale</strong>指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值，那么客户机可以接收超出超时期指定值之内的响应消息。<br />
<strong>Date头域</strong><br />
<font color="#0000ff">Date头域表示消息发送的时间</font>，时间的描述格式由rfc822定义。例如，Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时，换算成本地时间，需要知道用户所在的时区。<br />
<strong>Pragma头域</strong><br />
<font color="#0000ff">Pragma头域用来包含实现特定的指令，最常用的是Pragma:no-cache。</font>在HTTP/1.1协议中，它的含义和Cache-Control:no-cache相同。<br />
<strong>2、请求消息</strong><br />
请求消息的第一行为下面的格式：<br />
<strong><font color="#0033ff">Method　SP　Request-URI　SP　HTTP-Version　CRLF</font></strong>　<br />
<strong>Method表示对于Request-URI完成的方法</strong>，这个字段是大小写敏感的，<font color="#0000ff">包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE。</font>方法GET和HEAD应该被所有的通用WEB服务器支持，其他所有方法的实现是可选的。<font color="#0000ff"><strong>GET方法</strong>取回由Request-URI标识的信息。</font>HEAD方法也是取回由Request-URI标识的信息，只是可以在响应时，不返回消息体。<font color="#0033ff"><strong>POST方法</strong>可以请求服务器接收包含在请求中的实体信息，可以用于提交表单，向新闻组、BBS、邮件群组和数据库发送消息。</font><br />
<strong>SP表示空格</strong>。<br />
<strong>Request-URI遵循URI格式</strong>，在此字段为星号（*）时，说明请求并不用于某个特定的资源地址，而是用于服务器本身。<br />
<strong>HTTP-Version表示支持的HTTP版本</strong>，例如为HTTP/1.1。<br />
<strong>CRLF表示换行回车符。</strong><br />
<font color="#0000ff">请 求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列字段Accept、Accept-Charset、Accept- Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If- Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、 Proxy-Authorization、Range、Referer、User-Agent。</font>对请求头域的扩展要求通讯双方都支持，如果存在不支持的请求头域，一般将会作为实体头域处理。<br />
典型的请求消息：<br />
GET<a href="http://class/download.microtool.de:80/somedata.exe" target="_blank"><font color="#003366">http://class/download.microtool.de:80/somedata.exe</font></a><br />
Host:download.microtool.de<br />
Accept:*/*<br />
Pragma:no-cache<br />
Cache-Control:no-cache<br />
Referer:<a href="http://class/download.microtool.de/" target="_blank"><font color="#003366">http://class/download.microtool.de/</font></a><br />
User-Agent:Mozilla/4.04[en](Win95;I;Nav)<br />
Range:bytes=554554-<br />
上例第一行表示HTTP客户端（可能是浏览器、下载程序）通过GET方法获得指定URL下的文件。棕色的部分表示请求头域的信息，绿色的部分表示通用头部分。<br />
<strong>Host头域</strong><br />
<font color="#0000ff">Host头域指定请求资源的Intenet主机和端口号，必须表示请求url的原始服务器或网关的位置</font>。HTTP/1.1请求必须包含主机头域，否则系统会以400状态码返回。<br />
<strong>Referer头域</strong><br />
<font color="#0033ff">Referer头域允许客户端指定请求uri的源资源地址，这可以允许服务器生成回退链表</font>，可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址，Referer不能被发送。如果指定的是部分uri地址，则此地址应该是一个相对地址。<br />
<strong>Range头域</strong><br />
<font color="#0033ff">Range头域可以请求实体的一个或者多个子范围</font>。例如，<br />
表示头500个字节：bytes=0-499<br />
表示第二个500字节：bytes=500-999<br />
表示最后500个字节：bytes=-500<br />
表示500字节以后的范围：bytes=500-<br />
第一个和最后一个字节：bytes=0-0,-1<br />
同时指定几个范围：bytes=500-600,601-999<br />
但是服务器可以忽略此请求头，如果无条件GET包含Range请求头，响应会以状态码206（PartialContent）返回而不是以200（OK）。<br />
<strong>User-Agent头域</strong><br />
User-Agent头域的内容包含发出请求的用户信息。<br />
<br />
<strong>3、响应消息<br />
</strong>响应消息的第一行为下面的格式：<br />
<strong><font color="#0000ff">HTTP-Version　SP　Status-Code　SP　Reason-Phrase　CRLF</font></strong><br />
<strong>HTTP-Version表示支持的HTTP版本</strong>，例如为HTTP/1.1。<br />
<strong>Status-Code是一个三个数字的结果代码</strong>。<br />
<strong>Reason-Phrase给Status-Code提供一个简单的文本描述</strong>。Status-Code主要用于机器自动识别，Reason-Phrase主要用于帮助用户理解。<font color="#0000ff">Status-Code的第一个数字定义响应的类别，后两个数字没有分类的作用</font>。第一个数字可能取5个不同的值：<br />
1xx:信息响应类，表示接收到请求并且继续处理<br />
2xx:处理成功响应类，表示动作被成功接收、理解和接受<br />
3xx:重定向响应类，为了完成指定的动作，必须接受进一步处理<br />
4xx:客户端错误，客户请求包含语法错误或者是不能正确执行<br />
5xx:服务端错误，服务器不能正确执行一个正确的请求<br />
<font color="#0000ff">响 应头域允许服务器传递不能放在状态行的附加信息，这些域主要描述服务器的信息和Request-URI进一步的信息。响应头域包含Age、 Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW- Authenticate。</font>对响应头域的扩展要求通讯双方都支持，如果存在不支持的响应头域，一般将会作为实体头域处理。<br />
典型的响应消息：<br />
HTTP/1.0200OK<br />
Date:Mon,31Dec200104:25:57GMT<br />
Server:Apache/1.3.14(Unix)<br />
Content-type:text/html<br />
Last-modified:Tue,17Apr200106:46:28GMT<br />
Etag:"a030f020ac7c01:1e9f"<br />
Content-length:39725426<br />
Content-range:bytes554554-40279979/40279980<br />
上例第一行表示HTTP服务端响应一个GET方法。棕色的部分表示响应头域的信息，绿色的部分表示通用头部分，红色的部分表示实体头域的信息。<br />
<strong>Location响应头</strong><br />
<font color="#0000ff">Location响应头用于重定向接收者到一个新URI地址。</font><br />
<strong>Server响应头</strong><br />
<font color="#0000ff">Server响应头包含处理请求的原始服务器的软件信息</font>。此域能包含多个产品标识和注释，产品标识一般按照重要性排序。<br />
<strong>4、实体信息</strong><br />
请求消息和响应消息都可以包含实体信息，<strong>实体信息一般由实体头域和实体组成。</strong><font color="#0000ff">实 体头域包含关于实体的原信息，实体头包括Allow、Content-Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header</font>。extension-header允许客户端定义新的实体头，但是这些域可能无法未接受方识别。<font color="#0000ff">实体可以是一个经过编码的字节流，它的编码方式由Content-Encoding或Content-Type定义，它的长度由Content-Length或Content-Range定义。</font><br />
<strong>Content-Type实体头</strong><br />
<font color="#0000ff"><strong>Content-Type</strong> 实体头用于向接收方指示实体的介质类型</font>，指定HEAD方法送到接收方的实体介质类型，或GET方法发送的请求介质类型Content-Range实体头<br />
<strong>Content-Range实体头</strong><br />
<font color="#0000ff">用于指定整个实体中的一部分的插入位置，他也指示了整个实体的长度</font>。在服务器向客户返回一个部分响应，它必须描述响应覆盖的范围和整个实体长度。一般格式：<br />
<strong>Content-Range:bytes-unit　SP　first-byte-pos - last-byte-pos/entity-legth</strong><br />
例 如，传送头500个字节次字段的形式：Content-Range:bytes0-499/1234如果一个http消息包含此节（例如，对范围请求的响 应或对一系列范围的重叠请求），Content-Range表示传送的范围，Content-Length表示实际传送的字节数。<br />
<strong>Last-modified实体头</strong><br />
<font color="#0033ff">Last-modified实体头指定服务器上保存内容的最后修订时间。</font><br />
<strong>5、 HTTP 头参考（microsoft）</strong><br />
HTTP 请求和 HTTP 响应都使用头发送有关 HTTP 消息的信息。头由一系列行组成，每行都包含名称，然后依次是冒号、空格、值。字段可按任何顺序排列。某些头字段既能用于请求头也能用于响应头，而另一些头字段只能用于其中之一。 <br />
许 多请求头字段都允许客户端在值部分指定多个可接受的选项，有时甚至可以对这些选项的首选项进行排名。多个项以逗号分隔。例如，客户端可以发送包含 &#8220;Content-Encoding: gzip, compress,&#8221;的请求头，表示可以接受各种压缩类型。如果服务器的响应正文使用 gzip 编码，其响应头中将包含&#8220;Content-Encoding: gzip&#8221;。<br />
有些字段可以在单个头中出现多次。例如，头可以有多个&#8220;Warning&#8221;字段。<br />
下 表列出了 HTTP 1.1 头字段。注意：有些头字段是 MIME 字段。MIME 字段在 Internet Engineering Task Force (IETF) 文档 RFC 2045 中进行了定义，但也可用于 HTTP 1.1 协议。有关 MIME 和 HTTP 1.1 规范的详细信息，请参阅 IEIF 页。<br />
<strong>一般头字段</strong><br />
<font color="#0033ff">一般头字段可用于请求消息和响应消息。</font><br />
<strong>　名称　　　　　　　　　　示例值 <br />
Cache-Control</strong>　 "max-age=10" <br />
<strong>Connection</strong>　　　　"close" <br />
<strong>Date</strong>　　　　　　　　　　"Tue, 11 Jul 2000 18:23:51 GMT" <br />
<strong>Pragma</strong>　　　　　　　 "no-cache" <br />
<strong>Trailer</strong>　　　　　　　　 "Date" <br />
<strong>Transfer-Encoding</strong> "chunked" <br />
<strong>Upgrade</strong>　　　　　　 "SHTTP/1.3" <br />
<strong>Via</strong>　　　　　　　　　　　 "HTTP/1.1 Proxy1, HTTP/1.1 Proxy2" <br />
<strong>Warning</strong>　　　　　　　"112 Disconnected Operation" <br />
<strong>请求头字段</strong> <br />
<font color="#0000ff">请求头字段仅用于请求消息。</font><br />
<strong>　　 名称　　　　　　　　　　　　 示例值</strong> <br />
<strong>Accept</strong>　　　　　　　　　　 "text/html, image/*" <br />
<strong>Accept-Charset</strong>　　　"iso8859-5" <br />
<strong>Accept-Encoding </strong>　"gzip, compress" <br />
<strong>Accept-Language</strong>　"en, fr" <br />
<strong>Authorization</strong>　　　　 [credentials] <br />
<strong>Content-Encoding</strong>　"gzip" <br />
<strong>Expect</strong>　　　　　　　　　　 "100-continue" <br />
<strong>From</strong>　　　　　　　　　　　 "<a href="http://www.zhihere.com/bbs/mailtuser@microsoft.com" target="_blank"><font color="#003366">user@microsoft.com</font></a>" <br />
<strong>Host</strong>　　　　　　　　　　　　"<a href="http://www.microsoft.com/" target="_blank"><font color="#003366">www.microsoft.com</font></a>" <br />
<strong>If-Match</strong>　　　　　　　　　"entity_tag001" <br />
<strong>If-Modified-Since </strong>"Tue, 11 Jul 2000 18:23:51 GMT" <br />
<strong>If-None-Match</strong>　　　 "entity_tag001" <br />
<strong>If-Range</strong>　　　　　　　　 "entity_tag001" or "Tue, 11 Jul 2000 18:23:51 GMT" <br />
<strong>If-Unmodified-Since</strong> "Tue, 11 Jul 2000 18:23:51 GMT" <br />
<strong>Max-Forwards</strong>　　　　"3" <br />
<strong>Proxy-Authorization</strong> [credentials] <br />
<strong>Range</strong>　　　　　　 "bytes=100-599" <br />
<strong>Referer</strong>　　　　　 "<a href="http://www.microsoft.com/resources.asp" target="_blank"><font color="#003366">http://www.microsoft.com/resources.asp</font></a>" <br />
<strong>TE</strong>　　　　　　　　　　"trailers" <br />
<strong>User-Agent</strong>　　 "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)" <br />
<br />
&gt;&gt;请求头字段的具体含义<br />
Accept：浏览器可接受的MIME类型。 <br />
<strong>Accept-Charset：</strong>浏览器可接受的字符集。 <br />
<strong>Accept-Encoding：</strong>浏览器能够进行解码的数据编码方式，比如gzip。<br />
<strong>Accept-Language：</strong>浏览器所希望的语言种类，当服务器能够提供一种以上的语言版本时要用到。 <br />
<strong>Authorization</strong>：授权信息，通常出现在对服务器发送的WWW-Authenticate头的应答中。 <br />
<strong>Connection：</strong>表 示是否需要持久连接。如果Servlet看到这里的值为&#8220;Keep-Alive&#8221;，或者看到请求使用的是HTTP 1.1（HTTP 1.1默认进行持久连接），它就可以利用持久连接的优点，当页面包含多个元素时（例如Applet，图片），显著地减少下载所需要的时间。要实现这一点， Servlet需要在应答中发送一个Content-Length头，最简单的实现方法是：先把内容写入ByteArrayOutputStream，然 后在正式写出内容之前计算它的大小。<br />
<strong>Content-Length</strong>：表示请求消息正文的长度。 <br />
<strong>Cookie</strong>：设置cookie,这是最重要的请求头信息之一<br />
<strong>From：</strong>请求发送者的email地址，由一些特殊的Web客户程序使用，浏览器不会用到它。 <br />
<strong>Host：</strong>初始URL中的主机和端口。 <br />
<strong>If-Modified-Since</strong>：只有当所请求的内容在指定的日期之后又经过修改才返回它，否则返回304&#8220;Not Modified&#8221;应答。 <br />
<strong>Pragma：</strong>指定&#8220;no-cache&#8221;值表示服务器必须返回一个刷新后的文档，即使它是代理服务器而且已经有了页面的本地拷贝。 <br />
<strong>Referer：</strong>包含一个URL，用户从该URL代表的页面出发访问当前请求的页面。 <br />
<strong>User-Agent：</strong>浏览器类型，如果Servlet返回的内容与浏览器类型有关则该值非常有用。<br />
<strong>UA-Pixels，UA-Color，UA-OS，UA-CPU：</strong>由某些版本的IE浏览器所发送的非标准的请求头，表示屏幕大小、颜色深度、操作系统和CPU类型。 <br />
<strong>响应头字段</strong> <br />
<font color="#0000ff">响应头字段仅用于响应消息。</font><br />
<strong>　 名称　　　　　　　　　 示例值</strong> <br />
<strong>Accept-Ranges</strong>　　"none" <br />
<strong>Age</strong>　　　　　　　　　　　　"2147483648(2^31)" <br />
<strong>ETag</strong>　　　　　　　　　　　"b38b9-17dd-367c5dcd" <br />
<strong>Last-Modified</strong>　　　 "Tue, 11 Jul 2000 18:23:51 GMT" <br />
<strong>Location</strong>　　　　　　　　"<a href="http://localhost/redirecttarget.asp" target="_blank"><font color="#003366">http://localhost/redirecttarget.asp</font></a>" <br />
<strong>Proxy-Authenticate</strong> [challenge] <br />
<strong>Retry-After</strong>　　　　　 "Tue, 11 Jul 2000 18:23:51 GMT" or "60" <br />
<strong>Server</strong>　　　　　　　　　"Microsoft-IIS/5.0" <br />
<strong>Vary</strong>　　　　　　　　　　　 "Date" <br />
<strong>WWW-Authenticate</strong> [challenge] <br />
<strong>实体头字段</strong> <br />
<font color="#0000ff">实体头字段可以用于请求消息或响应消息。实体头字段中包含消息实体正文的有关信息，如使用的编码格式。</font><br />
名称　　　　　　　　　　　 示例值 <br />
<strong>Allow</strong>　　　　　　　　　　　　　　"GET, HEAD" <br />
<strong>Content-Encoding</strong>　　 "gzip" <br />
<strong>Content-Language</strong>　　"en" <br />
<strong>Content-Length</strong>　　　　 "8445" <br />
<strong>Content-Location</strong>　　　"<a href="http://localhost/page.asp" target="_blank"><font color="#003366">http://localhost/page.asp</font></a>" <br />
<strong>Content-MD5</strong>　　　　　　 [md5-digest] <br />
<strong>Content-Range</strong>　　　　 "bytes 2543-4532/7898" <br />
<strong>Content-Type</strong>　　　　　　"text/html" <br />
<strong>Expires</strong>　　　　　　　　　　　"Tue, 11 Jul 2000 18:23:51 GMT" <br />
<strong>Last-Modified</strong>　　　　　 "Tue, 11 Jul 2000 18:23:51 GMT" <br />
<strong><font color="#0033ff">&gt;&gt;实体头字段的具体含义</font></strong><br />
<strong>Allow </strong>服务器支持哪些请求方法（如GET、POST等）。<br />
<strong>Content-Encoding</strong> 文档的编码（Encode）方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档 的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩，但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。<br />
<strong>Content-Length</strong> 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。<br />
<strong>Content-Type</strong> 表示后面的文档属于什么MIME类型。Servlet默认为text/plain，但通常需要显式地指定为text/html。<br />
<strong>Date</strong> 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。 <br />
<strong>Expires</strong> 应该在什么时候认为文档已经过期，从而不再缓存它？ <br />
<strong>Last-Modified</strong> 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期，该请求将被视为一个条件GET，只有改动时间迟于指定时间的文档才会返回，否则返回一个304（Not Modified）状态。<br />
<strong>Location</strong> 表示客户应当到哪里去提取文档。Location通常不是直接设置的，而是通过HttpServletResponse的sendRedirect方法，该方法同时设置状态代码为302。 <br />
<strong>Refresh </strong>表示浏览器应该在多少时间之后刷新文档，以秒计。除了刷新当前文档之外，你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。 <br />
注 意这种功能通常是通过设置HTML页面HEAD区的＜META HTTP-EQUIV="Refresh" C＞实现，这是因为，自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是，对于Servlet来说，直接设置 Refresh头更加方便。 <br />
注意Refresh的意义是&#8220;N秒之后刷新本页面或访问指定页面&#8221;，而不是&#8220;每隔N秒刷新本页面或访问指定页面 &#8221;。因此，连续刷新要求每次都发送一个Refresh头，而发送204状态代码则可以阻止浏览器继续刷新，不管是使用Refresh头还是＜META HTTP-EQUIV="Refresh" ...＞。 <br />
注意Refresh头不属于HTTP 1.1正式规范的一部分，而是一个扩展，但Netscape和IE都支持它。 <br />
<strong>请求头示例</strong><br />
以下是 HTTP 请求的简单示例。<br />
GET /articles/news/today.asp HTTP/1.1<br />
Accept: */*<br />
Accept-Language: en-us<br />
Connection: Keep-Alive<br />
Host: localhost<br />
Referer: <a href="http://localhost/links.asp" target="_blank"><font color="#003366">http://localhost/links.asp</font></a><br />
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)<br />
Accept-Encoding: gzip, deflate<br />
该请求具有请求行，其中包括方法 (GET)、资源路径 (/articles/news/today.asp) 和 HTTP 版本 (HTTP/1.1)。由于该请求没有正文，故所有请求行后面的内容都是头的一部分。紧接着头之后是一个空行，表示头已结束。<br />
<strong>响应头示例</strong><br />
Web 服务器可以通过多种方式响应前一个请求。假设文件是可以访问的，并且用户具有查看该文件的权限，则响应类似于：<br />
HTTP/1.1 200 OK<br />
Server: Microsoft-IIS/5.0<br />
Date: Thu, 13 Jul 2000 05:46:53 GMT<br />
Content-Length: 2291<br />
Content-Type: text/html<br />
Set-Cookie: ASPSESSIONIDQQGGGNCG=LKLDFFKCINFLDMFHCBCBMFLJ; path=/<br />
Cache-control: private<br />
...<br />
响应的第一行称为状态行。它包含响应所用的 HTTP 版本、状态编码 (200) 和原因短语。示例中包含一个头，其中具有五个字段，接着是一个空行（回车和换行符），然后是响应正文的头两行。
<img src ="http://www.blogjava.net/persister/aggbug/289664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-08-03 21:35 <a href="http://www.blogjava.net/persister/archive/2009/08/03/289664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>html中的meta信息</title><link>http://www.blogjava.net/persister/archive/2009/07/06/285653.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Mon, 06 Jul 2009 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/07/06/285653.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/285653.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/07/06/285653.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/285653.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/285653.html</trackback:ping><description><![CDATA[<div id="blog_text">常见形式：&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt; <br />
<br />
&lt;meta http-equiv="Refresh" content="n;url"&gt; <br />
n -- 隔n秒钟 <br />
url -- 转此地址 <br />
<br />
例如: <br />
&lt;META HTTP-EQUIV="refresh" content="2;URL=<a href="http://www.baidu.com/" target="_blank">http://www.baidu.com/</a>"&gt; <br />
2秒钟后刷新--转百度的首页.</div>
<img src ="http://www.blogjava.net/persister/aggbug/285653.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-07-06 11:14 <a href="http://www.blogjava.net/persister/archive/2009/07/06/285653.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat处理请求流程的源代码研究</title><link>http://www.blogjava.net/persister/archive/2009/06/26/284275.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Fri, 26 Jun 2009 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/06/26/284275.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/284275.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/06/26/284275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/284275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/284275.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前面分析了tomcat启动，见Tomcat启动源代码分析。启动分析的后面已经涉及到了对客户端连接进来的socket的处理的，那么今天的文章就沿着上面的文章写下去吧。一、Connector处理请求MasterSlaveWorkerThread调用PoolTcpEndpoint进行处理：// Process the request from this socketendpoin...&nbsp;&nbsp;<a href='http://www.blogjava.net/persister/archive/2009/06/26/284275.html'>阅读全文</a><img src ="http://www.blogjava.net/persister/aggbug/284275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-06-26 14:48 <a href="http://www.blogjava.net/persister/archive/2009/06/26/284275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>portal相关资料</title><link>http://www.blogjava.net/persister/archive/2009/06/21/283429.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Sun, 21 Jun 2009 00:40:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/06/21/283429.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/283429.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/06/21/283429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/283429.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/283429.html</trackback:ping><description><![CDATA[1.http://blog.csdn.net/Pointer_v/category/470991.aspx <br />
<br />
2.<a href="http://blog.csdn.net/daigua245/archive/2009/05/13/4178182.aspx">http://blog.csdn.net/daigua245/archive/2009/05/13/4178182.aspx</a>&nbsp; 全面介绍liferay的安装和定制<br />
<br />
3.http://www.kuailan.com/<br />
<br />
4.http://www.yaawa.com/<br />
<br />
5.http://www.google.cn/ <br />
<br />
6.http://www.netvibes.com/ 这个功能很强大<br />
&nbsp;<br />
7.http://www.javaeye.com/topic/7005 简单介绍portal原理 <br />
<br />
8.http://www.ibm.com/developerworks/cn/java/j-pluto/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Apache Pluto 构建和测试 JSR 168 兼容的 portlets <br />
<br />
9.http://www.blogjava.net/patrick/archive/2006/02/23/32098.html portal比较
<img src ="http://www.blogjava.net/persister/aggbug/283429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-06-21 08:40 <a href="http://www.blogjava.net/persister/archive/2009/06/21/283429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat启动源代码分析</title><link>http://www.blogjava.net/persister/archive/2009/06/17/282875.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Wed, 17 Jun 2009 08:54:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/06/17/282875.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/282875.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/06/17/282875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/282875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/282875.html</trackback:ping><description><![CDATA[Tomcat的源码研读怎么说都是一件恐怖的事情，代码太多！不过管中窥豹，也可偶尔为之。谁让我好读书，不求甚解呢。前面对嵌入式Tomcat（Tomcat 4.0）进行了一个简单的分析，见<a id="viewpost1_TitleUrl" href="../../persister/archive/2009/03/28/262533.html">在应用中使用嵌入式Tomcat。</a><br />
<br />
今天的这篇文章对Tomcat的源码进行了一些分析，主要是Tomcat启动。<br />
<br />
1、Bootstrap.java。正如OFBiz的启动程序时Start.java，Tomcat的启动程序是Bootstrap.java。OFBiz的Start.java做的事情最主要的就是加载相应的lib库和启动tomcat及其component。Tomcat的Bootstrap也是加载相应的lib库和启动Catalina<br />
的process方法。Lib库放置在common，server和share目录中。<br />
<br />
2、Catalina.java。这个类主要研究start方法，核心代码如下：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">&nbsp;Digester&nbsp;digester&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;createStartDigester();<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;configFile();<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputSource&nbsp;is&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;InputSource(</span><span style="color: #000000;">"</span><span style="color: #000000;">file://</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;file.getAbsolutePath());<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputStream&nbsp;fis&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileInputStream(file);<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;is.setByteStream(fis);<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digester.push(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;digester.parse(is);<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fis.close();<br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Catalina.start&nbsp;using&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;configFile()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e);<br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(System.out);<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
主要是解析server.xml文件，采用的<a href="http://commons.apache.org/digester/">Digester</a>，非常著名的xml解析器。通过解析的源代码分析，Tomcat将Engine，Host和Context当成Container，这是一个虚拟的概念，具体的容器都实现了Container, Lifecycle接口。所以Service不是直接引用一个Engine，而是一个Container。<a id="viewpost1_TitleUrl" href="../../persister/archive/2009/03/28/262533.html">在应用中使用嵌入式Tomcat</a>的tomcat实现结构图中都是相邻层次之间都是双向引用的，如Service引用上面的Server还有下级的Connector和Container。大致类图如下：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/persister/container1.JPG" width="661" height="417" /><br />
Digester解析server.xml就是将这些实例初始化并且配置好相互的引用关系。Connector通过Container的invoke方法将接受到了请求交给Container最高层Engine处理：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">CoyoteAdapter.java<br />
<br />
connector.getContainer().invoke(request,&nbsp;response);</span></div>
<br />
<br />
接下来就是初始化并启动server:<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Start&nbsp;the&nbsp;new&nbsp;server</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(server&nbsp;</span><span style="color: #0000ff;">instanceof</span><span style="color: #000000;">&nbsp;Lifecycle)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.initialize();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((Lifecycle)&nbsp;server).start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Register&nbsp;shutdown&nbsp;hook</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Runtime.getRuntime().addShutdownHook(shutdownHook);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Throwable&nbsp;t)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;This&nbsp;will&nbsp;fail&nbsp;on&nbsp;JDK&nbsp;1.2.&nbsp;Ignoring,&nbsp;as&nbsp;Tomcat&nbsp;can&nbsp;run<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;fine&nbsp;without&nbsp;the&nbsp;shutdown&nbsp;hook.</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Wait&nbsp;for&nbsp;the&nbsp;server&nbsp;to&nbsp;be&nbsp;told&nbsp;to&nbsp;shut&nbsp;down</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server.await();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(LifecycleException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Catalina.start:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(System.out);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(e.getThrowable()&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">-----&nbsp;Root&nbsp;Cause&nbsp;-----</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.getThrowable().printStackTrace(System.out);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
server的初始化最终就是将connector进行初始化：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">CoyoteConnector.java<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Initialize&nbsp;this&nbsp;connector&nbsp;(create&nbsp;ServerSocket&nbsp;here!)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;initialize()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;LifecycleException&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(initialized)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;LifecycleException<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(sm.getString(</span><span style="color: #000000;">"</span><span style="color: #000000;">coyoteConnector.alreadyInitialized</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.initialized&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;oname&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;(container&nbsp;</span><span style="color: #0000ff;">instanceof</span><span style="color: #000000;">&nbsp;StandardEngine))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;we&nbsp;are&nbsp;loaded&nbsp;directly,&nbsp;via&nbsp;API&nbsp;-&nbsp;and&nbsp;no&nbsp;name&nbsp;was&nbsp;given&nbsp;to&nbsp;us</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StandardEngine&nbsp;cb</span><span style="color: #000000;">=</span><span style="color: #000000;">(StandardEngine)container;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oname&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;createObjectName(cb.getName(),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Connector</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Registry.getRegistry(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.registerComponent(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">,&nbsp;oname,&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log&nbsp;(</span><span style="color: #000000;">"</span><span style="color: #000000;">Error&nbsp;registering&nbsp;connector&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(debug&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log(</span><span style="color: #000000;">"</span><span style="color: #000000;">Creating&nbsp;name&nbsp;for&nbsp;connector&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;oname);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Initialize&nbsp;adapter</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adapter&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;CoyoteAdapter(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protocolHandler.setAdapter(adapter);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntrospectionUtils.setProperty(protocolHandler,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">jkHome</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.getProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">catalina.base</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Configure&nbsp;secure&nbsp;socket&nbsp;factory</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(factory&nbsp;</span><span style="color: #0000ff;">instanceof</span><span style="color: #000000;">&nbsp;CoyoteServerSocketFactory)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntrospectionUtils.setProperty(protocolHandler,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">secure</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CoyoteServerSocketFactory&nbsp;ssf&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(CoyoteServerSocketFactory)&nbsp;factory;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntrospectionUtils.setProperty(protocolHandler,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">algorithm</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssf.getAlgorithm());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntrospectionUtils.setProperty(protocolHandler,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">ciphers</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssf.getCiphers());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntrospectionUtils.setProperty(protocolHandler,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">clientauth</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssf.getClientAuth());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntrospectionUtils.setProperty(protocolHandler,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">keystore</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssf.getKeystoreFile());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntrospectionUtils.setProperty(protocolHandler,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">randomfile</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssf.getRandomFile());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntrospectionUtils.setProperty(protocolHandler,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">rootfile</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssf.getRootFile());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntrospectionUtils.setProperty(protocolHandler,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">keypass</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssf.getKeystorePass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntrospectionUtils.setProperty(protocolHandler,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">keytype</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssf.getKeystoreType());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntrospectionUtils.setProperty(protocolHandler,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">protocol</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssf.getProtocol());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IntrospectionUtils.setProperty(protocolHandler,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">sSLImplementation</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssf.getSSLImplementation());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;protocolHandler.init();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;LifecycleException<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(sm.getString<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000;">"</span><span style="color: #000000;">coyoteConnector.protocolHandlerInitializationFailed</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;e));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
Protocol Handler初始化会初始化PoolTcpEndPoint，这个时候就会启动Tomcat的端口了：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;initEndpoint()&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;IOException,&nbsp;InstantiationException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(factory</span><span style="color: #000000;">==</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory</span><span style="color: #000000;">=</span><span style="color: #000000;">ServerSocketFactory.getDefault();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(serverSocket</span><span style="color: #000000;">==</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(inet&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serverSocket&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;factory.createSocket(port,&nbsp;backlog);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serverSocket&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;factory.createSocket(port,&nbsp;backlog,&nbsp;inet);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(&nbsp;BindException&nbsp;be&nbsp;)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;BindException(be.getMessage()&nbsp;</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;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;port);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;serverTimeout&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;serverSocket.setSoTimeout(&nbsp;serverTimeout&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(&nbsp;IOException&nbsp;ex&nbsp;)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;ex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">(&nbsp;InstantiationException&nbsp;ex1&nbsp;)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;ex1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initialized&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
初始化后整个tomcat就做好准备启动，这时还不能处理客户端的请求，必须启动相关容器。与初始化相比，启动的时候同时启动Container和Connector。Container的启动会将Engine,Host和Conext都启动起来。<br />
<br />
Connector启动的时候就会启动PoolTcpEndPoint，看看它的run方法就大概知道怎么回事了：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;background&nbsp;thread&nbsp;that&nbsp;listens&nbsp;for&nbsp;incoming&nbsp;TCP/IP&nbsp;connections&nbsp;and<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;hands&nbsp;them&nbsp;off&nbsp;to&nbsp;an&nbsp;appropriate&nbsp;processor.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;run()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Loop&nbsp;until&nbsp;we&nbsp;receive&nbsp;a&nbsp;shutdown&nbsp;command</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(running)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Loop&nbsp;if&nbsp;endpoint&nbsp;is&nbsp;paused</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(paused)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000;">1000</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Ignore</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Allocate&nbsp;a&nbsp;new&nbsp;worker&nbsp;thread</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MasterSlaveWorkerThread&nbsp;workerThread&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;createWorkerThread();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(workerThread&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Wait&nbsp;a&nbsp;little&nbsp;for&nbsp;load&nbsp;to&nbsp;go&nbsp;down:&nbsp;as&nbsp;a&nbsp;result,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;no&nbsp;accept&nbsp;will&nbsp;be&nbsp;made&nbsp;until&nbsp;the&nbsp;concurrency&nbsp;is<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;lower&nbsp;than&nbsp;the&nbsp;specified&nbsp;maxThreads,&nbsp;and&nbsp;current<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;connections&nbsp;will&nbsp;wait&nbsp;for&nbsp;a&nbsp;little&nbsp;bit&nbsp;instead&nbsp;of<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;failing&nbsp;right&nbsp;away.</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000;">100</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Ignore</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Accept&nbsp;the&nbsp;next&nbsp;incoming&nbsp;connection&nbsp;from&nbsp;the&nbsp;server&nbsp;socket</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;acceptSocket();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Hand&nbsp;this&nbsp;socket&nbsp;off&nbsp;to&nbsp;an&nbsp;appropriate&nbsp;processor</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;workerThread.assign(socket);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;The&nbsp;processor&nbsp;will&nbsp;recycle&nbsp;itself&nbsp;when&nbsp;it&nbsp;finishes</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Notify&nbsp;the&nbsp;threadStop()&nbsp;method&nbsp;that&nbsp;we&nbsp;have&nbsp;shut&nbsp;ourselves&nbsp;down</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;">&nbsp;(threadSync)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threadSync.notifyAll();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
<span style="color: #000000;">MasterSlaveWorkerThread默认最大线程数是20，Tomcat优化时可以设置此线程数，见</span><a id="Editor_Results_rprSelectionList_ctl07_LinkTitle" class="titlelink" href="../../persister/archive/2008/12/20/247497.html">Tomcat优化方案</a><span style="color: #000000;">。<br />
</span><span style="color: #000000;">MasterSlaveWorkerThread</span>使用的是Guarded Suspension Pattern，如果有新的Socket分配，那么进行处理，available作为警戒条件：<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;assign(Socket&nbsp;socket)&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Wait&nbsp;for&nbsp;the&nbsp;Processor&nbsp;to&nbsp;get&nbsp;the&nbsp;previous&nbsp;Socket</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(available)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Store&nbsp;the&nbsp;newly&nbsp;available&nbsp;Socket&nbsp;and&nbsp;notify&nbsp;our&nbsp;thread</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.socket&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;socket;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;available&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notifyAll();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Await&nbsp;a&nbsp;newly&nbsp;assigned&nbsp;Socket&nbsp;from&nbsp;our&nbsp;Connector,&nbsp;or&nbsp;&lt;code&gt;null&lt;/code&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;if&nbsp;we&nbsp;are&nbsp;supposed&nbsp;to&nbsp;shut&nbsp;down.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;">&nbsp;Socket&nbsp;await()&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Wait&nbsp;for&nbsp;the&nbsp;Connector&nbsp;to&nbsp;provide&nbsp;a&nbsp;new&nbsp;Socket</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">available)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Notify&nbsp;the&nbsp;Connector&nbsp;that&nbsp;we&nbsp;have&nbsp;received&nbsp;this&nbsp;Socket</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.socket;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;available&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notifyAll();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;(socket);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
</span>&nbsp;&nbsp;&nbsp; public void run() {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Process requests until we receive a shutdown signal<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (!stopped) {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Wait for the next socket to be assigned<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Socket socket = await();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (socket == null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Process the request from this socket<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endpoint.processSocket(socket, con, threadData);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Finish up this request<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endpoint.recycleWorkerThread(this);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Tell threadStop() we have shut ourselves down successfully<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized (threadSync) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; threadSync.notifyAll();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
</div>
<br />
<br />
下面一幅图有助理解，Tomcat请求客户端情况的具体分析后面再分析。<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/persister/tcphandler.JPG" width="509" height="370" /><br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/persister/aggbug/282875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-06-17 16:54 <a href="http://www.blogjava.net/persister/archive/2009/06/17/282875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeMarker的培训及project</title><link>http://www.blogjava.net/persister/archive/2009/06/16/282642.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Tue, 16 Jun 2009 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/06/16/282642.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/282642.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/06/16/282642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/282642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/282642.html</trackback:ping><description><![CDATA[前段时间给team做了一个FreeMarker的技术培训，并决定将此页面技术用在邮件模板等方面。<br />
<br />
<a href="/Files/persister/FreeMarker.rar">http://www.blogjava.net/Files/persister/FreeMarker.rar</a><br />
<img src ="http://www.blogjava.net/persister/aggbug/282642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-06-16 17:21 <a href="http://www.blogjava.net/persister/archive/2009/06/16/282642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在应用中使用嵌入式Tomcat</title><link>http://www.blogjava.net/persister/archive/2009/03/28/262533.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Fri, 27 Mar 2009 16:38:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/03/28/262533.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/262533.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/03/28/262533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/262533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/262533.html</trackback:ping><description><![CDATA[<p><font color="#000000">Tomcat5中的Embeded版本，为应用中集成完整的Web服务提供了尽可能大的空间，不仅使开发者容易获得对标准HTTP的处理，还有SSL的通讯处理，使开发者很容易就可以对原有非Web系统进行扩展以支持瘦客户端应用，通向Web大门的钥匙已经放在这里，剩下的就是看你怎样来发挥了。</font></p>
<p><font color="#000000">Tomcat严格意义上不是一个真正的AppServer，只是支持运行Servlet和Jsp的Web容器，此外扩展了一些AppServer的功能，如数据库连接池，JNDI等，如何提炼，或者说把Tomcat整理成一个最小的集合成为Tomcat嵌入版本的关键，从Tomcat5.0开始提供和支持Embeded版本，即最简化Tomcat Server，下面就针对Tomcat Server的Embeded版本进行介绍，怎样把Tomcat集成到Java应用中。</font></p>
<p><font color="#000000">首先可以在<a href="http://apache.mirrors.versehost.com/jakarta/tomcat-5/v5.0.28/bin/jakarta-tomcat-5.0.28-embed.tar.gz"><font color="#000000">http://apache.mirrors.versehost.com/jakarta/tomcat-5/v5.0.28/bin/jakarta-tomcat-5.0.28-embed.tar.gz</font></a>下载Tomcat的Embeded版本，下载解压后把最里层的jakarta-tomcat-5.0.28-embed目录copy到容易查找的目录，为简易需要更名为tomcat-embed，作为嵌入Tomcat的工作目录。</font></p>
<p><font color="#000000">首先我们需要了解Tomcat在工作时的层次情况，它按照：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/persister/tomcat.JPG" width="368" height="353" /><br />
上面是Tomcat实现的内部工作结构：</font></p>
<p><font color="#000000">一个Server含有几个Connector，比如</font>non-SSL HTTP/1.1 Connector on port 8080，SSL HTTP/1.1 Connector on port 8443和AJP 1.3 Connector on port 8009。连接器就是接受客户端情况然后封装成request和response对象交给容器处理。</p>
<p><font color="#000000">通常是一个Engine，其中Engine里含有1个Host，1个Host 内可以含有多个Context，Context代表Web应用，即1个Host里可以包含多个Web应用，tomcat的webapps目录里面防止的就是一个个web应用。Engine接收Service发过来的请求（通过Connector），交给相应的Host进行处理，然后Host交给具体的Context。</font></p>
<p><font color="#000000">下面是非常简单的创建Embeded tomcat的例子，示意其使用<br />
</font></p>
<p><font color="#000000">把tomcat-embed目录下的lib内的所有jar包引入到项目的环境中，即完成了项目的环境搭建。在应用里开发嵌入式Tomcat，需要根据以下步骤：<br />
1）创建org.apache.catalina.startup.Embedded实例，其代表嵌入式Tomcat Server的实例；<br />
2）创建org.apache.catalina.Engine 实例，代表上面XML结构示例中的Engine，作为容器用来包含Host节点；<br />
3）创建org.apache.catalina.Host实例，代表虚拟主机服务，把它加入到2）中产生的Engine；<br />
4）创建一个或多个org.apache.catalina.Context实例，代表Web应用，每个Web应用都需要加入到3）产生的Host中；<br />
5）最后创建org.apache.catalina.Connector实例，把它加入1）创建的tomcat实例中，它用来接收客户发出的请求。</font></p>
<p><font color="#000000">具体和完整的代码如下：<br />
import java.io.File;<br />
import java.net.InetAddress;<br />
import java.net.UnknownHostException;</font></p>
<p><font color="#000000">import org.apache.catalina.Context;<br />
import org.apache.catalina.Engine;<br />
import org.apache.catalina.Host;<br />
import org.apache.catalina.Logger;<br />
import org.apache.catalina.startup.Embedded;</font></p>
<p><font color="#000000"><br />
public class TomcatService {<br />
public static void main(String[] args) {<br />
&nbsp;&nbsp; //设置Tomcat的工作目录，并启动Tomcat Server<br />
&nbsp;&nbsp; String path = "/usr/local/tomcat-embed";<br />
&nbsp;&nbsp; Embedded tc = createTomcat(path);<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; tc.start();<br />
&nbsp;&nbsp;&nbsp; System.out.println("---------- Tomcat Server start over. ------------");<br />
&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp; }&nbsp;&nbsp;<br />
}<br />
<br />
private static Embedded createTomcat(String path) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; //创建嵌入式Tomcat Server的实例<br />
&nbsp;&nbsp; Embedded tomcat = new Embedded();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置Tomcat的工作目录<br />
&nbsp;&nbsp; tomcat.setCatalinaHome(path);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //产生Tomcat引擎<br />
&nbsp;&nbsp; Engine engine = tomcat.createEngine();<br />
&nbsp;&nbsp; engine.setName("EmbededServer");<br />
&nbsp;&nbsp; //创建Host，设置Host的工作目录<br />
&nbsp;&nbsp; Host host = tomcat.createHost("localhost", tomcat.getCatalinaHome()<br />
&nbsp;&nbsp;&nbsp;&nbsp; + "/webapps");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //把Host加入Engine<br />
&nbsp;&nbsp; engine.addChild(host);<br />
&nbsp;&nbsp; engine.setDefaultHost(host.getName());<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; String path = host.getAppBase() + "/instance1";<br />
&nbsp;&nbsp; if (!new File(path).exists()) {<br />
&nbsp;&nbsp;&nbsp; System.err.println("请检查instance1应用的目录以及相关资源是否存在.");<br />
&nbsp;&nbsp;&nbsp; return null;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; //创建instance1的Context，并加入Host中<br />
&nbsp;&nbsp; Context ctxt = tomcat.createContext("/instance1", path);<br />
&nbsp;&nbsp; host.addChild(ctxt);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; tomcat.addEngine(engine);<br />
&nbsp;&nbsp; tomcat.setDebug(Logger.WARNING);<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Tomcat加入Connector，监听本地（127.0.0.1）的访问<br />
&nbsp;&nbsp;&nbsp; tomcat.addConnector(tomcat.createConnector(InetAddress<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getByName("127.0.0.1"), 8080, false));<br />
&nbsp;&nbsp; } catch (UnknownHostException e) {<br />
&nbsp;&nbsp;&nbsp; System.err.println("绑定Tomcat Server到127.0.0.1:8080失败，请检查端口是否被占用.");<br />
&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; tomcat = null;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; return tomcat;<br />
}<br />
}</font></p>
<font color="#000000">在这里需要注意，由于嵌入式版本Tomcat没有common/lib目录，一些需要的Jar包可以复制到JDK的/jre/lib/endorsed目录下进行使用。</font>
<p><br />
</p>
<font color="#000000">在OFBiz中默认使用的embeded tomcat，具体的可以参考里面对于嵌入式启动相关的内容。</font>
<img src ="http://www.blogjava.net/persister/aggbug/262533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-03-28 00:38 <a href="http://www.blogjava.net/persister/archive/2009/03/28/262533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache的安装和perl测试</title><link>http://www.blogjava.net/persister/archive/2009/03/16/259958.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Mon, 16 Mar 2009 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2009/03/16/259958.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/259958.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2009/03/16/259958.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/259958.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/259958.html</trackback:ping><description><![CDATA[1.到官方网站下载最新apache<br />
2. 下载后的文件形式是httpd-2.2.11.tar.gz.<br />
&nbsp;&nbsp;&nbsp;&nbsp;1)利用命令tar xvfz *.tar.gz将apache解压.<br />
&nbsp;&nbsp;&nbsp;&nbsp;2)cd httpd-2.2.11&nbsp;&nbsp;&nbsp;&nbsp;3)利用./configure --help查看帮助信息,看看需要配置哪些选项.由于我要装mysql和php,所以选择了以下<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;几个选项:./configure --prefix=/usr/local/apache2 --enable-rewrite&nbsp;&nbsp; --with-mpm=worker&nbsp; --enable-so<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后一个很重要,如果要装php,一定要写,前面两个不是必需的.&lt;如果不明白选项的含义,去google.&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;4)make<br />
&nbsp;&nbsp;&nbsp;&nbsp;5)make install<br />
3. 启动Apache：<br />
&nbsp;&nbsp;&nbsp;&nbsp;#cd /usr/local/apache2/bin<br />
&nbsp;&nbsp;&nbsp;&nbsp;#./apachectl start
<p>&nbsp;&nbsp;&nbsp;停掉apache是<br />
&nbsp;&nbsp;&nbsp;&nbsp;#cd /usr/local/apache2/bin<br />
&nbsp;&nbsp;&nbsp;&nbsp;#./apachectl stop<br />
4.测试安装是否成功，浏览器输入<a href="http://localhost/">http://localhost</a>, 页面显示it works，表明apache安装成功.<br />
5.测试perl.文件为cgitest.pl,放在/usr/local/apache2/cgi-bin目录中，并且chmod a+x cgitest.pl使其可执行<br />
：</p>
&nbsp;&nbsp;&nbsp;&nbsp;#!/usr/bin/perl -w<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;use CGI;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my $q = new CGI;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print $q-&gt;header(),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $q-&gt;start_html("hello,perl"),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $q-&gt;h1('hello perl'),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $q-&gt;end_html();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
6.在浏览器中输入：<a href="http://localhost/cgi-bin/cgitest.pl">http://localhost/cgi-bin/cgitest.pl</a>&nbsp;即可看到hello perl。<br />
<br />
7.自定义文件存放位置：<br />
&nbsp;&nbsp;&nbsp; # ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"<br />
&nbsp;&nbsp;&nbsp; # ScriptAlias /cgi/ "/usr/local/www/"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ScriptAlias / "/usr/local/www/"<br />
&nbsp; <br />
&nbsp; #&lt;Directory "/usr/local/apache2/cgi-bin"&gt;<br />
&nbsp; &lt;Directory "/usr/local/www"&gt;<br />
这样就可以将网页文件存放在/usr/local/www目录<br />
访问的时候：<a href="http://localhost/cgi-bin/cgitest.pl">http://localhost/cgitest.pl</a>&nbsp;即可。&nbsp;
<img src ="http://www.blogjava.net/persister/aggbug/259958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2009-03-16 10:54 <a href="http://www.blogjava.net/persister/archive/2009/03/16/259958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat优化方案</title><link>http://www.blogjava.net/persister/archive/2008/12/20/247497.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Sat, 20 Dec 2008 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2008/12/20/247497.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/247497.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2008/12/20/247497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/247497.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/247497.html</trackback:ping><description><![CDATA[系统上线之前研究了一下tomcat的优化方案，主要包括一下几个方面：<br />
<br />
<strong>1、JDK内存优化</strong><br />
Tomcat默认可以使用的内存为128MB<br />
Unix配置位置<br />
{tomcat_home}/bin/catalina.sh<br />
JAVA_OPTS='-Xms[初始化内存大小] -Xmx[可以使用的最大内存]<br />
{tomcat_home}/bin/startup.sh<br />
JAVA_OPTS='-Xms128m -Xmx1256m -Djava.awt.headless=true'; export JAVA_OPTS<br />
vi /etc/profile<br />
export JAVA_OPTS=&#8221;$JAVA_OPTS -Xms[初始化内存大小] -Xmx[可以使用的最大内存]&#8221;<br />
设置值：<br />
一般说来，你应该使用物理内存的 80% 作为堆大小。<br />
如果本机上有Apache服务器，可以先折算Apache需要的内存，然后修改堆大小。建议设置为70％；<br />
建议设置[[初始化内存大小]等于[可以使用的最大内存]，这样可以减少平凡分配堆而降低性能。<br />
<br />
<strong>2、精简应用和配置文件</strong><br />
删除不需要的管理应用和帮助应用，提高tomcat安全性。<br />
删除webapps下所有文件<br />
rm &#8211;fr $CATALINA_HOME/webapps/*<br />
删除server/webapps下所有文件<br />
rm &#8211;fr $CATALINA_HOME/server/webapps/*<br />
精简sever.xml配置文件<br />
使用tomcat发布版本中的最小配置文件，提高性能，如果有功能上的需求，在逐个的加入功能配置。<br />
备份 mv server.xml server_default.xml<br />
复制 cp server-minimal.xml server.xml<br />
<br />
3、连接器优化<br />
在$CATALINA_HOME/conf/server.xml配置文件中的Connetctor节点，和连接数相关的参数配置和优化。<br />
maxThreads<br />
Tomcat使用线程来处理接收的每个请求。这个值表示Tomcat可创建的最大的线程数。默认值200。 可以根据机器的时期性能和内存大小调整，一般可以在400-500。最大可以在800左右。<br />
acceptCount<br />
指定当所有可以使用的处理请求的线程数都被使用时，可以放到处理队列中的请求数，超过这个数的请求将不予处理。默认值10。 <br />
minSpareThreads<br />
Tomcat初始化时创建的线程数。默认值4。 <br />
maxSpareThreads<br />
一旦创建的线程超过这个值，Tomcat就会关闭不再需要的socket线程。默认值50。 <br />
enableLookups <br />
是否反查域名，默认值为true。为了提高处理能力，应设置为false <br />
connnectionTimeout<br />
网络连接超时，默认值20000，单位：毫秒。设置为0表示永不超时，这样设置有隐患的。通常可设置为30000毫秒。<br />
maxKeepAliveRequests <br />
保持请求数量，默认值100。 <br />
bufferSize<br />
输入流缓冲大小，默认值2048 bytes。 <br />
compression<br />
压缩传输，取值on/off/force，默认值off。<br />
其中和最大连接数相关的参数为maxThreads和acceptCount。如果要加大并发连接数，应同时加大这两个参数。web server允许的最大连接数还受制于操作系统的内核参数设置，通常Windows是2000个左右，Linux是1000个左右。 <br />
<br />
4、启用Tomcat压缩(HTTP压缩)功能<br />
HTTP 压缩可以大大提高浏览网站的速度，现在流行的浏览器都是支持的，包括 IE、FireFox、Opera 等。<br />
压缩对象<br />
对静态对象：相对于普通的浏览过程HTML ,CSS,Javascript , Text
，它可以节省40%左右的流量。更为重要的是对动态生成的，包括CGI、PHP , JSP , ASP ,
Servlet,SHTML等输出的网页也能进行压缩，压缩效率惊人。<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">Connector&nbsp;</span><span style="color: #ff0000;">port</span><span style="color: #0000ff;">="80"</span><span style="color: #ff0000;">&nbsp;maxHttpHeaderSize</span><span style="color: #0000ff;">="8192"</span><span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;maxThreads</span><span style="color: #0000ff;">="150"</span><span style="color: #ff0000;">&nbsp;minSpareThreads</span><span style="color: #0000ff;">="25"</span><span style="color: #ff0000;"> <br />
&nbsp;maxSpareThreads</span><span style="color: #0000ff;">="75"</span><span style="color: #ff0000;">&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;acceptCount</span><span style="color: #0000ff;">="100"</span><span style="color: #ff0000;">&nbsp;connectionTimeout</span><span style="color: #0000ff;">="20000"</span><span style="color: #ff0000;">&nbsp;disableUploadTimeout</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;URIEncoding</span><span style="color: #0000ff;">="utf-8"</span><span style="color: #ff0000;">compression</span><span style="color: #0000ff;">="on"</span><span style="color: #ff0000;">&nbsp;compressionMinSize</span><span style="color: #0000ff;">="2048"</span><span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;noCompressionUserAgents</span><span style="color: #0000ff;">="gozilla,&nbsp;traviata"</span><span style="color: #ff0000;">&nbsp; <br />
compressableMimeType</span><span style="color: #0000ff;">="text/html,text/xml,text/javascript,text/css,text/plain"</span><span style="color: #ff0000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;"><br />
</span></div>
&nbsp;&nbsp; <br />
1) compression="on" 打开压缩功能 2) compressionMinSize="2048"
启用压缩的输出内容大小，这里面默认为2KB 3) noCompressionUserAgents="gozilla, traviata"
对于以下的浏览器，不启用压缩 4) compressableMimeType="text/html,text/xml"　压缩类型 <br />
<img src ="http://www.blogjava.net/persister/aggbug/247497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2008-12-20 17:02 <a href="http://www.blogjava.net/persister/archive/2008/12/20/247497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Webwork源代码学习</title><link>http://www.blogjava.net/persister/archive/2008/12/18/247169.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Thu, 18 Dec 2008 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2008/12/18/247169.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/247169.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2008/12/18/247169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/247169.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/247169.html</trackback:ping><description><![CDATA[这几天研究了一下Webwork的源代码，具体的代码就不贴了，基本就是研究ServletDispatcher及其相关类。相对于Struts1.3（<a href="http://www.blogjava.net/persister/archive/2007/09/26/148379.html">见前面的源代码研究</a>）。Webwork有几点做得非常不错，具体如下：<br />
<br />
1、Struts采用DTO模式，需要配置大量的form，这个非常的不方便，而Webwork的Action驱动模式Model-Driven或者Property-Driven就显得非常的方便，减少了配置，理解起来也更加简单。<br />
<br />
2、Action的不同。Struts中Action是直接获取request和response对象，将Servlet API和Action紧密的耦合在一起，然而Webwork将servlet里面的东西通过map封装起来，放在map里面传进传去，方便平台之间的移植，而且很显然，单元测试更加方便了。Struts中实现的Action必须继承Struts的Action类，而Webwork只需要实现Action接口。Struts中只实例化一个Action实例处理所有的请求，需要考虑thread safe问题，而Webwork对每个请求实例化一个Action进行处理，不必担心线程安全的问题。<br />
<br />
3、Webwork将Filter的使用发挥到了极致。我们开发Struts应用是也经常使用一些Filter，比如进行字符转换或者权限管理等，通过路径配置使其请求都经过Filter的处理。而Webwork将Filter的地位提升到了和Action一样的地位，基于每一个Action都可以采用默认的Filter或者自定义配置Filter或Filter Stack，通过Filter完成部分框架的功能。<br />
<br />
4、丰富的View层。相对于Struts1.3只使用JSP相比，Webwork的灵活性大得多，通过result-type的配置，Webwork的展现层可以使用FreeMarker，Velocity,XSLT等。<br />
<br />
上面的这些设计思想非常值得借鉴。<br />
<br />
<img src ="http://www.blogjava.net/persister/aggbug/247169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2008-12-18 17:12 <a href="http://www.blogjava.net/persister/archive/2008/12/18/247169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts1.3源代码学习总结</title><link>http://www.blogjava.net/persister/archive/2007/09/26/148379.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Wed, 26 Sep 2007 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2007/09/26/148379.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/148379.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2007/09/26/148379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/148379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/148379.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Struts相对来说是一个比较简单的MVC框架，实现的Service to Worker模式。研究Struts源代码从ActionServlet开始，因为它是统一的入口处理类，通常配置如下：&nbsp;1&nbsp;&nbsp;&nbsp;&lt;servlet&gt;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;ac...&nbsp;&nbsp;<a href='http://www.blogjava.net/persister/archive/2007/09/26/148379.html'>阅读全文</a><img src ="http://www.blogjava.net/persister/aggbug/148379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2007-09-26 16:59 <a href="http://www.blogjava.net/persister/archive/2007/09/26/148379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSTL标签用法总结</title><link>http://www.blogjava.net/persister/archive/2007/07/31/133532.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Tue, 31 Jul 2007 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2007/07/31/133532.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/133532.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2007/07/31/133532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/133532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/133532.html</trackback:ping><description><![CDATA[<p>JSP 标准标记库（ Standard Tag Library ， JSTL) 是一组以标准化格式实现许多通用的 Web 站点功能的定制标记。</p>
<p>JSP 技术的优势之一在于其定制标记库工具。除了核心 JSP 标记，如 jsp:include
之外，定制标记库工具使您能够创建唯一的标记来描述以站点或应用程序为导向的操作。一旦您创建了定制标记库 ( 简称 taglib)
，当您扩展项目或转向另一个项目时您可以重复使用这些标记。</p>
<p> JSTL 的目标是为了简化 JSP 页面的设计。对于页面设计人员来说，使用脚本语言（默认值是 JAVA 语言）操作动态数据是比较困难的，而采用标签和表达式语言相对容易一些， JSTL 的使用为页面设计人员和程序开发人员的分工协作提供了便利。</p>
<p>一．<strong> 配置 JSTL</strong></p>
<p>包括两个 JAR 文件， jstl.jar 和 standard.jar 。原文引入：</p>
<p>&lt;%@ taglib prefix="c" uri="<a href="http://java.sun.com/jsp/jstl/core">http://java.sun.com/jsp/jstl/core</a>" %&gt;</p>
<p>&lt;%@ taglib prefix="sql" uri="<a href="http://java.sun.com/jsp/jstl/sql">http://java.sun.com/jsp/jstl/sql</a>" %&gt;</p>
<p>&lt;%@ taglib prefix="fmt" uri="<a href="http://java.sun.com/jsp/jstl/fmt">http://java.sun.com/jsp/jstl/fmt</a>" %&gt;</p>
<p>二． <strong>Core 标签库</strong></p>
<p>Core 标签库主要包括了一般用途的标签、条件标签、迭代标签和 URL 相关的标签。在 JSP 页面使用 Core 标签，要使用 taglig 指令，指定引用的标签库，如下：</p>
<p>&lt;%@ taglib rui=&#8221;http://java.sun.com/jsp/jstl/core&#8221; prefix=&#8221;c&#8221; %&gt;</p>
<p>一般用途的标签有 &lt;c:out&gt; 、 &lt;c:set&gt; 、 &lt;c:remove&gt; 、 &lt;c:cath&gt;</p>
<p>1<font color="#ff0000">.&lt;c:out&gt;</font></p>
<p>用于计算一个表达式并将结果输出。类似于 JSP 中 &lt;%=%&gt; 表达式，或者是 EL 中 $ ${el-expression} 。</p>
<p>2<font color="#ff0000">.&lt;c:set&gt;</font></p>
<p>用于设置范围变量的值或者 javabean 对象的属性。</p>
<p>看个实际例子：</p>
<p>&lt;c:set var=&#8221;username&#8221; value=&#8221;lisi&#8221; scope=&#8221;session&#8221;/&gt;</p>
<p>这样就相当于设置了 session 。</p>
<p>3<font color="#ff0000">.&lt;c:remove&gt;</font></p>
<p>相对 &lt;c:set&gt; 其作用是移除范围变量。比如： &lt;c:remove var=&#8221;nusername&#8221; scope=&#8221;session&#8221;/&gt;</p>
<p>4<font color="#ff0000">.&lt;c:catch&gt;</font></p>
<p>用于捕获在其中嵌套的操作所抛出的异常对象，并将异常信息保存到变量中。</p>
<p>我们将有可能抛出异常的代码放置到开始标签 :&lt;c:catch&gt; 和结束标签 :&lt;/c:catch&gt;
之间。如果其中代码出现异常，异常对象将被捕获，保存在 var 声明的变量中，该变量总是有 page 范围。如果没有发生异常，而 var
所标识的范围变量将被移除。</p>
<p>如果没有指定 var 属性，异常只是简单的被捕获，异常信息并不会被保存。</p>
<p><font color="#333300"><strong>Eg ：</strong></font></p>
<p>&lt;c:catch var=&#8221;exception&#8221;&gt;</p>
<p>&lt;%</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 5;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int j = 0;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int k=i/j;</p>
<p>%&gt;</p>
<p>&lt;/c:catch&gt;</p>
<p>&lt;c:out value=&#8221;${exception}&#8221; /&gt;&lt;br&gt;</p>
<p>&lt;c:out value=&#8221;${exception.massage}&#8221;/&gt;</p>
<p>后一句相当于： exception.getMessage()</p>
<p>条件标签包括 &lt;c:if&gt;&lt;c:choose&gt;&lt;c:when&gt;&lt;c:otherwise&gt;</p>
<p>1<font color="#ff0000">.&lt;c:if&gt;</font></p>
<p>用于实现 java 中的 if 语句功能。</p>
<p>&lt;c:if test=&#8221;${user.visitCount==1}&#8221;&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This is your first visit .</p>
<p>&lt;/c:if&gt;</p>
<p>若为 true ，会打印中间部分。也可以声明 var ，方便下一步判断。</p>
<p>&lt;c:if test=&#8221;${param.name==&#8217;admin&#8217;}&#8221; value=&#8221;result&#8221;/&gt;</p>
<p>&lt;c:out value=&#8221;${result}&#8221; /&gt;</p>
<p>2<font color="#ff0000">.&lt;c:choose&gt;</font></p>
<p>&lt;c:choose&gt; 和 &lt;c:when&gt; 、 &lt;c:otherwise&gt; 一起实现互斥条件执行，类似于 java 中的 if else.</p>
<p>&lt;c:choose&gt; 一般作为 &lt;c:when&gt; 、 &lt;c:otherwise&gt; 的父标签。</p>
<p>eg ：</p>
<p>&lt;c:choose&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:when test="${row.v_money&lt;10000}"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 初学下海</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/c:when&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:when test="${row.v_money&gt;=10000&amp;&amp;row.v_money&lt;20000}"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 身手小试</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/c:when&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:otherwise&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 商业能手</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/c:otherwise&gt;</p>
<p>&lt;/c:choose&gt;</p>
<p>迭代标签</p>
<p>迭代标签有<font color="#ff0000"> &lt;c:forEach&gt;</font> 和 &lt;/c:forEach&gt;</p>
<p>// 遍历记录集</p>
<p>&lt;c:forEach items="${finalResult.rows}" var="row"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&lt;tr class="&lt;%=tdClass[(rank+1)%2]%&gt;"&gt;</p>
<p>&lt;td align="center"&gt;&lt;span&gt;&lt;%=rank%&gt; &lt;/span&gt;&lt;/td&gt;</p>
<p>&lt;td align="center"&gt;&lt;span &gt;&lt;c:out value="${row.player_name}"/&gt;&lt;/span&gt; &lt;/td&gt;</p>
<p>&lt;td align="center"&gt;&lt;span &gt; ￥ &lt;c:out value="${row.money}"/&gt;&lt;/span&gt;&lt;/td&gt;</p>
<p>&lt;/tr&gt;</p>
<p>&lt;%rank++;%&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&lt;/c:forEach&gt;</p>
<p>也可以设定固定次数。</p>
<p>&lt;c:forEach var =&#8221;i&#8221; begin=&#8221;100 &#8220; end= &#8220;110&#8221;&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ${i}</p>
<p>&lt;/c:forEach&gt;</p>
<p>如果再加个 step= &#8220; 2 &#8221;那么每次增长为 2 。</p>
<p>三．<strong> sql 标签</strong></p>
<p>设置数据源：</p>
<p>&lt;sql:setDataSource dataSource="proxool.breadTycoon" /&gt;</p>
<p>// 将数据库某查询的结果声明为一个变量</p>
<p>&lt;sql:query var="finalResult" &gt;</p>
<p>&nbsp;&nbsp;&nbsp; select player_name,money from tb_player order by money DESC LIMIT 10&nbsp;&nbsp;&nbsp;</p>
<p>&lt;/sql:query&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后可以：</p>
<p>&lt;c:forEach items="${ finalResult.rows}" var="row" varStatus="s"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; advCosts[${s.index}]=${row.adv_cost};</p>
<p>&nbsp;&nbsp; &lt;/c:forEach&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据更新标签：</p>
<p>&lt;sql:update&gt;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; call proc_set_role_salespro(?,?,?,?,?);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sql:param value="30"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sql:param value="39"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sql:param value="&lt;%=spID%&gt;"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sql:param value="&lt;%=productID%&gt;"/&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sql:param value="1"/&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/sql:update&gt;</p>
<p>&lt;sql:query var="queryAllChannelCount"&gt;</p>
<p>SELECT COUNT(*) as total FROM tb_channel WHERE game_id=? AND begin_round&lt;func_cur_round(?) AND player_id=? AND channel_flag=0</p>
<p>&lt;sql:param value="${gameID}"/&gt;</p>
<p>&lt;sql:param value="${gameID}"/&gt;</p>
<p>&lt;sql:param value="${playerID}"/&gt;</p>
<p>&lt;/sql:query&gt;</p>
<p>&lt;c:forEach items="${queryAllChannelCount.rowsByIndex}" var="channelCN"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;c:set value="${channelCN[0]}" var="channelTotal"/&gt;</p>
<p>&lt;/c:forEach&gt;</p>
<p>调用存储过程更新数据库：</p>
<p>&lt;c:if test="${param.changsubmit!=null}" &gt;</p>
<p>&lt;c:forEach items="${paramValues.pro_id}" var="getpro_id" varStatus="getparamsta"&gt;</p>
<p>&lt;sql:update&gt;</p>
<p>call proc_set_role_product(?,?,?,?,?,?,?,?);</p>
<p>&lt;sql:param value="${gameID}"/&gt;</p>
<p>&lt;sql:param value="${playerID}"/&gt;</p>
<p>&lt;sql:param value="${getpro_id}"/&gt;</p>
<p>&lt;sql:param value="${getpro_id}"/&gt;</p>
<p>&lt;sql:param value="${paramValues.pro_sort[getparamsta.index]}"/&gt;</p>
<p>&lt;sql:param value="${paramValues.price[getparamsta.index]}"/&gt;</p>
<p>&lt;sql:param value="${paramValues.output[getparamsta.index]}"/&gt;</p>
<p>&lt;sql:param value="0"/&gt;</p>
<p>&lt;/sql:update&gt;</p>
<p>&lt;/c:forEach&gt;</p>
<p>&lt;/c:if&gt;</p>
<p>四． 格式化标签</p>
<p>&lt;fmt: formatNumber value =&#8221;12.3&#8221; pattern=&#8221;.000&#8221;/&gt;</p>
<p>将输出 12.300. 应用样式 &#8221;.000&#8221;, 将使格式化后的小数部分有 3 位。不足 3 位将以 0 补齐。 <br />
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fmt:formatDate value=&#8221;&lt;%=new java.util.Date() %&gt;&#8221; type=&#8221;date&#8221; /&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 格式化的结果是： 2007-5-27 .</p>
<p>&lt;fmt:formatDate value=&#8221;&lt;%=new java.util.Date() %&gt;&#8221; type=&#8221;time&#8221; /&gt;</p>
<p>格式化的结果是： 9:25:11</p>
<p>&lt;fmt:formatDate value=&#8221;&lt;%=new java.util.Date() %&gt;&#8221; type=&#8221;both&#8221; /&gt;</p>
<p>格式化的结果是： 2007-5-27 9:25:11</p>
<p>补充知识点：</p>
<p>1. 替换 request.getParameter("test"):</p>
<p>&lt;c:if test="${param.test!=null}" &gt;</p>
<p>&lt;c:out value="${param.test}" /&gt;</p>
<p>&lt;/c:if&gt;</p>
<p>2. &lt;c:redirect url="a.jsp"&gt;</p>
<p>3.&lt;c:redirect url="/max.jsp" context="/ch16"&gt;</p>
<p>&lt;c:param name="name1" value="665"/&gt;</p>
<p>&lt;c:param name="name3" value=" 斯蒂芬 "/&gt;</p>
<p>&lt;/c:redirect&gt;</p>
<p>4.&lt;c:forTokens items="zhangsan:lisi:as" delims=":" var="name"&gt;</p>
<p>${name}</p>
<p>&lt;/c:forTokens&gt;</p>
<img src ="http://www.blogjava.net/persister/aggbug/133532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2007-07-31 11:26 <a href="http://www.blogjava.net/persister/archive/2007/07/31/133532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DIV的功能</title><link>http://www.blogjava.net/persister/archive/2007/07/03/127773.html</link><dc:creator>persister</dc:creator><author>persister</author><pubDate>Tue, 03 Jul 2007 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/persister/archive/2007/07/03/127773.html</guid><wfw:comment>http://www.blogjava.net/persister/comments/127773.html</wfw:comment><comments>http://www.blogjava.net/persister/archive/2007/07/03/127773.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/persister/comments/commentRss/127773.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/persister/services/trackbacks/127773.html</trackback:ping><description><![CDATA[<p><strong>&lt;html&gt;</strong></p>
<p><strong>&lt;head&gt;<br />
&lt;style&gt;<br />
.gb { overflow:auto; white-space:normal; height:60px; width:60px; padding:3px;}<br />
&lt;/style&gt;</strong></p>
<strong>
</strong>
<p><strong><br />
&lt;/head&gt;</strong></p>
<p><strong>&lt;body&gt;<br />
&nbsp;&lt;div class="gb"&gt;  <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;有良好的书面与口头表达能力，沟通协调能力强； <br />
&nbsp;&nbsp;有良好的团队合作意识； <br />
&nbsp;&nbsp;积极乐观。 </strong></p>
<p><strong>&nbsp;&lt;/div&gt;<br />
&lt;input type="file" class="xxx"&gt;<br />
&lt;/table&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
<br />
实现了163邮箱中自定义的文件夹如果过长就可以拉动的效果，DIV太强大了，抽空得好好学学</strong></p>
<img src ="http://www.blogjava.net/persister/aggbug/127773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/persister/" target="_blank">persister</a> 2007-07-03 11:01 <a href="http://www.blogjava.net/persister/archive/2007/07/03/127773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>