??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品乱码久久久久久按摩,色偷偷女男人的天堂亚洲网,国产亚洲免费的视频看 http://www.tkk7.com/persister/category/36746.htmlzh-cnTue, 23 Nov 2010 16:54:50 GMTTue, 23 Nov 2010 16:54:50 GMT60TPMC及其相关http://www.tkk7.com/persister/archive/2010/11/23/338809.htmlpersisterpersisterTue, 23 Nov 2010 07:47:00 GMThttp://www.tkk7.com/persister/archive/2010/11/23/338809.htmlhttp://www.tkk7.com/persister/comments/338809.htmlhttp://www.tkk7.com/persister/archive/2010/11/23/338809.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/338809.htmlhttp://www.tkk7.com/persister/services/trackbacks/338809.html
一、什么是TPC和tpmC?

  tpmC值在国内外被q?泛用于衡量计机pȝ的事务处理能力。但I竟什么是tpmC值呢?作者曾向一些用戗推销人员乃至某些国外大公司的技术h员问q这个问题,但回{的_度与tpmC值的行E度q非相称。tpmCq一度量也常被误写ؓTPM或TPMC?


  1、TPC


  TPC(Transaction Processing Performance CouncilQ事务处理性能委员?是由?0家会员公司创建的非盈利组l,总部讑֜国。该l织对全世界开放,但迄今ؓ止,l大多数会员都是、日、西Ƨ的大公司。TPC的成员主要是计算Yg厂家Q而非计算机用P它的功能是制定商务应用基准程?Benchmark)的标准规范、性能和h格度量,q管理测 试结果的发布?

  TPC的出版物是开攄Q可以通过|络获取。TPC不给出基准程序的代码Q而只l出基准E序的标准规?Standard Specification)。Q何厂家或其它试者都可以Ҏ规范Q最优地构造出自己的系l?试q_和测试程?。ؓ保证试l?果的客观性,被测试?通常是厂?必须提交lTPC一套完整的报告(Full Disclosure Report)Q包括被系l的详细配置、分cMh格和包含五年l护费用在内的Mh根{该报告必须由TPC授权的审核员核实(TPC本nq不做审?。现在全球只有几 个审核员Q全部在国?


  2、tpmC


  TPC已经推出了四套基准程序,被称为TPCQA、TPCQB、TPCQC和TPCQD。其中A和B已经q时Q不再用了。TPCQC是在U事务处?OLTP)的基准程序,TPCQD是决{支?Decision Support) 的基准程序。TPC卛_推出TPCQEQ作为大型企?Enterprise)信息服务的基准程序?


  TPCQC模拟一个批发商的货物管理环境。该批发公司有N个仓库,每个仓库供应10个地区,其中每个地区?000名顾客服务。在每个仓库中有10个终端,每一个终端用于一个地区。在q行Ӟ10×N个终端操作员向公司的数据库发?c请求。由于一个仓库中不可能存储公司所有的货物Q有一些请求必d往其它仓库Q因此,数据库在逻辑上是分布的。N是一个可变参敎ͼ试者可以随意改变NQ以获得最x试效果?

  TPCQC使用三种性能和h格度量,其中性能由TPCQC吞吐率衡量,单位是tpmC。tpm是transactions per minute的简UͼC指TPC中的C基准E序。它的定义是每分钟内pȝ处理的新订单个数?br />
tpmc作ؓ服务器一w要指标,是可以查询到的,q样可以根据估出来的tpmc去选择相应的服务器了?br />

具体计算参考如下文章:
http://blog.csdn.net/seeseasing/archive/2009/02/25/3935317.aspx



persister 2010-11-23 15:47 发表评论
]]>
Session原理和Tomcat实现分析http://www.tkk7.com/persister/archive/2010/08/24/329838.htmlpersisterpersisterTue, 24 Aug 2010 14:38:00 GMThttp://www.tkk7.com/persister/archive/2010/08/24/329838.htmlhttp://www.tkk7.com/persister/comments/329838.htmlhttp://www.tkk7.com/persister/archive/2010/08/24/329838.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/329838.htmlhttp://www.tkk7.com/persister/services/trackbacks/329838.html阅读全文

persister 2010-08-24 22:38 发表评论
]]>
web.xml里filter-mapping中的dispatcher的用?/title><link>http://www.tkk7.com/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.tkk7.com/persister/archive/2009/12/24/307162.html</guid><wfw:comment>http://www.tkk7.com/persister/comments/307162.html</wfw:comment><comments>http://www.tkk7.com/persister/archive/2009/12/24/307162.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/persister/comments/commentRss/307162.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/persister/services/trackbacks/307162.html</trackback:ping><description><![CDATA[使用了urlrewriterQ但是发现有些问题,配置如下Q?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);">   <</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">UrlRewriteFilter</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />          org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />             </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">logLevel</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />             </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">TRACE</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />         </span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />         </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">UrlRewriteFilter</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />         </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">*.do</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br />     </span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">></span></div> <br /> <br /> 2.4版本的servlet规范在部属描q符中新增加了一?lt;dispatcher>元素Q这个元素有四个可能的|即REQUEST,FORWARD,INCLUDE和ERRORQ可以在一?lt;filter-mapping>元素中加入Q意数目的<dispatcher>Q得filter会作用于直接从客户端过来的requestQ通过forwardq来的requestQ通过includeq来的request和通过<error-page>q来的request。如果没有指定Q?lt; dispatcher >元素Q默认值是REQUEST?br /> 下面几个列子说明一下它的用法:<br /> ?Q?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);"><</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">     //qo器的映射<br /> </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">Logging Filter</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">    //qo器的名字<br /> </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">/person/*</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">     //截获以person为开头的url<br /> </span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">></span></div> <br /> q种情况下,qo器将会作用于直接从客L发过来的?person/…开始的h。因里没有制定Q何的< dispatcher >元素Q默认值是REQUEST?br /> <br /> ?Q?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);"><</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">Logging Filter</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">     //qo器的名字<br /> </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">LogServlet</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">servlet-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"> //截获名字为LogServlet的servletl<br /> </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">INCLUDE</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">   <br /> </filter-mapping><br /> </span></div>  <br /> 截获以request dispatcher的includeҎ传递过来的对ProductServlet的请?br /> <br /> ?Q?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);"><</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">Logging Filter</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">/person/*</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">FORWARD</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">REQUEST</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">dispatcher</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">></span></div> <br /> 在这U情况下Q如果请求是?person/…开头的Qƈ且是通过request dispatcher的forwardҎ传递过来或者直接从客户端传递过来的Q则必须l过q个qo器?br /> <br /> <img src ="http://www.tkk7.com/persister/aggbug/307162.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/persister/" target="_blank">persister</a> 2009-12-24 15:29 <a href="http://www.tkk7.com/persister/archive/2009/12/24/307162.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多域名捆l?/title><link>http://www.tkk7.com/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.tkk7.com/persister/archive/2009/12/11/305526.html</guid><wfw:comment>http://www.tkk7.com/persister/comments/305526.html</wfw:comment><comments>http://www.tkk7.com/persister/archive/2009/12/11/305526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/persister/comments/commentRss/305526.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/persister/services/trackbacks/305526.html</trackback:ping><description><![CDATA[有两个域名,分别是food.xxx.com和play.xxx.comQ需把这两个域名都绑定到<br /> IP?19.13.34.32的服务器?br /> <br /> 1.<strong>首先需在域名供应商理面指定域名和IP的对应关p?/strong>Q我在万|配|通配W或者具体的域名Q?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 /> 然后在文件中d以下内容<br /> NameVirtualHost 219.13.34.32<br /> <VirtualHost 219.13.34.32><br /> ServerAdmin <a href="mailto:afd@dsf.com"><font color="#0000ff">xxx@xxx.com</font></a><br /> DocumentRoot /usr/local/apache/htdocs<br /> ServerName 219.13.34.32<br /> </VirtualHost><br /> #<br /> <VirtualHost 219.13.34.32><br /> ServerAdmin <a href="mailto:dsf@af.com"><font color="#0000ff">xxx@xxx.com</font></a><br /> DocumentRoot /usr/local/apache/htdocs/upload<br /> ServerName food.abc.com<br /> </VirtualHost><br /> #<br /> <VirtualHost 219.13.34.32><br /> ServerAdmin <a href="mailto:adf@fda.com"><font color="#0000ff">xxx@xxx.com</font></a><br /> DocumentRoot /usr/local/apache/htdocs/upload2<br /> ServerName play.xxx.com<br /> </VirtualHost><br /> <br /> <br /> 其中QNameVirtualHost 219.13.34.32很重要,没有q个Q虚拟主机是不可以徏立成功的?br /> 在这里,建立了两个域名ؓfood.xxx.com和play.xxx.com的虚拟主机?br /> /usr/local/apache/htdocs目录是用来直接输入IP时所讄的页面目录,其他两个Q是输入?br /> 名时所讉K的目录?br /> 重启apache服务Q在览器中输入<br /> <a target="_blank"><font color="#0000ff">http://food.xxx.com</font></a><br /> ?br /> <a target="_blank"><font color="#0000ff">http://play.xxx.com</font></a><br /> 卛_讉K对应不同的网? <img src ="http://www.tkk7.com/persister/aggbug/305526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/persister/" target="_blank">persister</a> 2009-12-11 10:52 <a href="http://www.tkk7.com/persister/archive/2009/12/11/305526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>css的字W集http://www.tkk7.com/persister/archive/2009/11/15/302396.htmlpersisterpersisterSun, 15 Nov 2009 03:59:00 GMThttp://www.tkk7.com/persister/archive/2009/11/15/302396.htmlhttp://www.tkk7.com/persister/comments/302396.htmlhttp://www.tkk7.com/persister/archive/2009/11/15/302396.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/302396.htmlhttp://www.tkk7.com/persister/services/trackbacks/302396.html @CHARSET "UTF-8";
q样实Ccss字符集选择
可以防止一些css造成的错?br />


persister 2009-11-15 11:59 发表评论
]]>
在jsp中怎么实现d后,自动跌{到登录前正浏览的面http://www.tkk7.com/persister/archive/2009/10/19/298839.htmlpersisterpersisterMon, 19 Oct 2009 05:58:00 GMThttp://www.tkk7.com/persister/archive/2009/10/19/298839.htmlhttp://www.tkk7.com/persister/comments/298839.htmlhttp://www.tkk7.com/persister/archive/2009/10/19/298839.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/298839.htmlhttp://www.tkk7.com/persister/services/trackbacks/298839.html在jsp中怎么实现d后,自动跌{到登录前正浏览的面Q就像csdn的一P
不管你从哪能个页面登录,成功d后会自动跌{回那个页面?br /> 解决Ҏ一Q?br /> d处理后,q回如下内容Q?nbsp; 
 2 PrintWriter out = response.getWriter();
 3 
 4 out.println("<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN"">");
 7 
 8 out.println("<HTML>");
 9
11 
12 out.println("  <BODY>");
13 
16 out.println("<script>history.go(-1);history.go(0);</script>");
19 
20 out.println("  </BODY>");
21 
22 out.println("</HTML>");
23 
24 out.flush();
25 
26 out.close();
27 
28 return null
29 
解决Ҏ二:    

1
 String referer = req.getHeader("Referer");
2 resp.sendRedirect(referer);
3 return;
4 
5 
上面两种Ҏ不可取是因ؓQ如果用L录失败,再次d的话׃出现d后返回到d的错误?br />

W三U:把你要在跌{旉要保存的信息存放在session变量中,d后清除这个session。可行?br /> 需要登录操作的面上面dQ?br />
1 <%
2     if(session.getAttribute("party")== null){
3         if(null != request.getQueryString())
4             session.setAttribute("redirectUrl", request.getRequestURL().append("?").append(request.getQueryString()).toString());
5         else
6             session.setAttribute("redirectUrl", request.getRequestURL().toString());
7         response.sendRedirect(request.getContextPath() +  "/loginto");
8     }
9 %>
在登录处理页面:

1 String redirectUrl = (String)req.getSession().getAttribute("redirectUrl");
2         if(StringUtils.isValid(redirectUrl)){
3             req.getSession().removeAttribute("redirectUrl");
4             resp.sendRedirect(redirectUrl);
5         }
W四U方法:写一个servlet会话判断c,如果在线ql执行,不在U则提示d。所有的需要在U操作的
servlet都集成此c,q样׃需要上面那么在每个面写上q些代码了,可以集中控制。这U方式比较完整?br />

HttpSession session = request.getSession();

if (session.getAttribute("person"== null
{
    
if (null != request.getQueryString())
                session.setAttribute(
"redirectUrl", request.getRequestURL().append("?").append(request.getQueryString()).toString());
    
else
                session.setAttribute(
"redirectUrl", request.getRequestURL()
                        .toString());
     response.sendRedirect(request.getContextPath() 
+ "/login.jsp");
    
return null;
 }

return process(config, request, response);





















persister 2009-10-19 13:58 发表评论
]]>
apache+tomcat 负蝲均衡安装配置http://www.tkk7.com/persister/archive/2009/10/14/298279.htmlpersisterpersisterWed, 14 Oct 2009 12:28:00 GMThttp://www.tkk7.com/persister/archive/2009/10/14/298279.htmlhttp://www.tkk7.com/persister/comments/298279.htmlhttp://www.tkk7.com/persister/archive/2009/10/14/298279.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/298279.htmlhttp://www.tkk7.com/persister/services/trackbacks/298279.html RedHat Linux
2.        所需软g
Apache 2.2.14  下蝲地址
http://apache.freelamp.com/httpd/httpd-2.2.14.tar.gz
Tomcat5.5.28    下蝲地址
http://tomcat.apache.org/download-55.cgi
JK  下蝲地址
http://apache.etoak.com/tomcat/tomcat-connectors
 文gQtomcat-connectors-1.2.28-src.tar.gz

Jdk 1_5_0_04   下蝲地址
    http://java.sun.com/j2se/1.5.0/download.jsp

备注Q下载时所需软g包文件保存在/opt目录?
3.        安装步骤

A 安装JDK
# cd /opt/
# chmod +x jdk-1_5_0_04-linux-i586-rpm.bin
# ./jdk-1.5.0_04-linux-i586-rpm.bin
# cd /usr/java/
# ln -s /usr/java/jdk-1_5_0_04 /opt/java
# vi /etc/profile

           #d如下内容

export JAVA_HOME=/opt/java/
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=.:$JAVA_HOME/bin:$PATH


B 安装Apache

# cd /opt/
# tar xvfz httpd-2.0.54.tar.gz
# cd httpd-2.0.54
#./configure --prefix=/opt/apache --enable-module=so
# make
# make install
# cd /opt/apache/conf
# vi ./httpd.conf

Listen 80 修改为Listen <Your IP>:80 IP到时候就是自己机器的IP地址Q否?br /> 其他机器没法讉K你?br />
ServerName 修改为ServerName <HOST-NAME> Q这个地方直?27.0.0.1卛_。集的时候会读httpd-vhost.conf

下面是一个配|有关的问题Q?br />
修改serverNameQ重装apache后问题依旧,最后发现host配置不正,

httpd.conf 中serverName 为www.zudar.com

host ?127.0.0.1 www.zudar.com

改ؓ 192.168.100.38  www.zudar.com

后正启?br />
问题是由?ip 地址 ?域名没有正确匚w引v

也就是说host中一点要配置好ip与serverName

hostname?etc/hosts的关p?br />
很过Z提到更改hostname首先想C?etc/hosts文gQ认为hostname的配|文件就?etc/hosts。其实不是的?br />
hosts文g的作用相当如DNSQ提供IP地址到hostname的对应。早期的互联|计机,单机hosts文g里够存放所有联|计机。不q随着互联|的发展Q这pq不够了。于是就出现了分布式的DNSpȝ。由DNS服务器来提供cM的IP地址到域名的对应。具体可以man hosts?br />
Linuxpȝ在向DNS服务器发出域名解析请求之前会查询/etc/hosts文gQ如果里面有相应的记录,׃使用hosts里面的记录?etc/hosts文g通常里面包含q一条记?br /> 127.0.0.1    localhost.localdomain   localhost

hosts文g格式是一行一条记录,分别是IP地址 hostname aliasesQ三者用I白字符分隔Qaliases可选?br />
127.0.0.1到localhostq一条徏议不要修改,因ؓ很多应用E序会用到这个,比如sendmailQ修改之后这些程序可能就无法正常q行?br />
修改hostname后,如果惌在本Z用newhostname来访问,必d/etc/hosts文g里添加一条newhostname的记录。比如我的eth0的IP?92.168.1.61Q我hosts文g修改如下Q?br /> #hostname blog.infernor.net
# cat /etc/hosts
127.0.0.1  localhost.localdomain localhost
192.168.1.61    blog.infernor.net       blog

q样Q我可以通过blog或者blog.infernor.net来访问本机?br />



在DirectoryIndex中添?index.jsp

         # cd /opt/apache/bin/

# ./apachectl configtest

若显CSyntax ok则表明安装成?

#./apachectl start

启动apache服务Q访问本?0端口Q查看端口是否正?

# ./apachectl stop

关闭服务

备注Qprefix定义apache的安装\?

C 安装Tomcat

         # cd /opt/
         # tar xvfz jakarta-tomcat-5.5.9.tar.gz
         # ln –s /opt/jakarta-tomcat-5.5.9 /opt/tomcat
         # vi /opt/tomcat/bin/catalina.sh

      JAVA_HOME=/opt/java

        启动服务后,讉K本机8080端口Q查看端口是否正?

# /opt/tomcat/bin/startup.sh /startup.bat      

         关闭服务

# /opt/tomcat/bin/shutdown.sh /shutdown.bat

修改各个tomcat的端口(如果两台机器是在不同的主ZQ端口可以不动,昄Q?br /> tomcat1/conf/server.xml
<Server port="8005" shutdown="SHUTDOWN" debug="0">改ؓ
<Server port="11001" shutdown="SHUTDOWN" debug="0">

<Connector port="8080"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000"
               disableUploadTimeout="true" URIEncoding="UTF-8"/>改ؓ
<Connector port="11002"
......

作loadbalance的话Q上面connector可以注释掉?br />
<Connector port="8009"
               enableLookups="false" redirectPort="8443" debug="0"
               protocol="AJP/1.3" />改ؓ
<Connector port="11003"
......

              
tomcat2/conf/server.xml
<Server port="8005" shutdown="SHUTDOWN" debug="0">改ؓ
<Server port="12001" shutdown="SHUTDOWN" debug="0">

<Connector port="8080"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               debug="0" connectionTimeout="20000"
               disableUploadTimeout="true" URIEncoding="UTF-8"/>改ؓ
<Connector port="12002"
......
上面q个connector同样也注释掉?br />
<Connector port="8009"
               enableLookups="false" redirectPort="8443" debug="0"
               protocol="AJP/1.3" />改ؓ
<Connector port="12003"



D 安装JK

#cd /usr/local/
# tar xzvf jakarta-tomcat-connectors-1.2.14-src.tar.gz
#cd jakarta-tomcat-connectors-1.2.14-src/native
#./buildconf.sh
#./configure --with-apxs=/usr/local/apache/bin/apxs
#make
#make install
#cd /opt/jakarta-tomcat-connectors- jk1.2.14-src/jk/native/apache-2.0/
#cp mod_jk.so /opt/apache/modules/




E pȝ整合

#vi /opt/apache/conf/httpd.conf

           在文件最末尾加上如下语句

include conf/mod_jk.conf


# Configure mod_jk.conf

在conf目录下创建mod_jk.conf文gQ内容如下:

--------------------------mod_jk.conf--------------------------
# Load mod_jk module
LoadModule jk_module modules/mod_jk.so


# Where to find workers.properties
JkWorkersFile conf/workers.properties

# Where to put jk logs
JkLogFile logs/mod_jk.log

# Set the jk log level [debug/error/info]
JkLogLevel info

# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"

#指定那些h交给tomcat处理,"controller"为在workers.propertise里指定的负蝲分配控制?br /> JkMount /*.jsp loadbalancerQ这个loadbalancer是下面worker.list最后一个|

如果q要指定*.do也进行分就再加一?br /> JkMount /*.do loadbalancer

如果你想Ҏ有的hq行分流只需要写?br /> JkMount /* loadbalancer


--------------------------mod_jk.conf--------------------------

~辑workers.properties
#vi /opt/apache/conf/workers.properties

#
# workers.properties
#

# list the workers by name

worker.list=tomcat1, tomcat2, loadbalancer

# ------------------------

# First tomcat server

# ------------------------

worker.tomcat1.port=11003
worker.tomcat1.host=127.0.0.1
worker.tomcat1.type=ajp13

# Specify the size of the open connection cache.

#worker.tomcat1.cachesize
#
# Specifies the load balance factor when used with

# a load balancing worker.

# Note:

# ----> lbfactor must be > 0

# ----> Low lbfactor means less work done by the worker.

worker.tomcat1.lbfactor=100

# ------------------------
# Second tomcat server
# ------------------------

worker.tomcat2.port=12003
worker.tomcat2.host=127.0.0.1
worker.tomcat2.type=ajp13

# Specify the size of the open connection cache.
#worker.tomcat2.cachesize
#

# Specifies the load balance factor when used with
# a load balancing worker.
# Note:

# ----> lbfactor must be > 0
# ----> Low lbfactor means less work done by the worker.
worker.tomcat2.lbfactor=100

# ------------------------

# Load Balancer worker

# ------------------------

# The loadbalancer (type lb) worker performs weighted round-robin

# load balancing with sticky sessions.

# Note:

# ----> If a worker dies, the load balancer will check its state

# once in a while. Until then all work is redirected to peer

# worker.
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1, tomcat2

#
# END workers.properties
#


cluster配置Q如果不配置cluster只是做loadbalance不需?br /> 修改server.xml中的engine
#vi /opt/tomcat/conf/server.xml

?20行左右修改原来的, djvmRoute="tomcat1"

<Engine name="Standalone" defaultHost="localhost" jvmRoute="tomcat1">

若第二台tomcatQ添加jvmRoute的修改ؓtomcat2


xQ系l已l整个完?nbsp; 启动apache和tomcat服务 如果不放心可以编写一个测?br />
在其中一个tomcat的webapps中徏立一个目录TestClusterQ里面新Z个test.jsp,内容?br />

<%
System.out.println("===========================");
%>

把TestCluster攑ֈtomcat1,tomcat2的webapps?br />
启动apache,tomcat1,tomcat2,q行试
通过 http://localhost/TestCluster/test.jsp 讉KQ多h几次面Q查看Tomcat1和Tomcat2 logs目录下面的catalina.out
文gQ你可以看到打C一行行"==========================="Qƈ且从l计上来_
大约在tomcat2打印的数量和在Tomcat1中一P
如果lbfactor不一L话,可以看到h会被tomcat1,tomcat2按照不同的权重分处?实现了负载均衡?


自动重启
    
    如下内Ҏ加至/etc/rc.d/rc.local文g末尾Q以便系l启动后开启apache,tomcat服务

/usr/local/tomcat1/bin/startup.sh
/usr/local/tomcat2/bin/startup.sh
/opt/apache/bin/apachectl start


q样做是不是够呢Q比如说一个浏览器讉K的时候开始被分发lA severQ然后又分发lB serverQ那?br /> session里面的数据就不一致了或不正确了。两个问题,一个是apahce已经实现了,对于同一个浏览器通过来的h会绑定到同一个serverQ那没有问题。但是通过下面的测试发C是的?br />
  <%@ page contentType="text/html; charset=GBK" %>
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() 
+ " : " + request.getLocalPort()+"<br>");%>
<%
  out.println(
"<br> ID " + session.getId()+"<br>");
  
// 如果有新?nbsp;Session 属性设|?br />   String dataName = request.getParameter("dataName");
  
if (dataName != null && dataName.length() > 0) {
     
String dataValue = request.getParameter("dataValue");
     session.setAttribute(dataName, dataValue);
  }
  out.print(
"<b>Session 列表</b>");
  Enumeration e 
= session.getAttributeNames();
  
while (e.hasMoreElements()) {
     
String name = (String)e.nextElement();
     
String value = session.getAttribute(name).toString();
     out.println( name 
+ " = " + value+"<br>");
         System.out.println( name 
+ " = " + value);
   }
%>
  
<form action="index.jsp" method="POST">
    名称:
<input type=text size=20 name="dataName">
     
<br>
    ?
<input type=text size=20 name="dataValue">
     
<br>
    
<input type=submit>
   
</form>
</body>
</html>

是需要其他配|还是?另一个方法就是session的复Ӟ及集功能?br /> 配置集群的方法参?#8220;链接”中的一文章就可以了?br />
apache和tomcat虚拟|:
1Q在apache?注销DocumentRootQServerNameQDirectory {行QDirectory包括的也

是)?br /> 2Q把conf文g中的Include conf/extra/httpd-vhosts.conf的注销LQ这个文件专

门用于配|虚拟主机?br /> 3Q设|conf文g的listen Z的ip
4Q假设apache的项目在usr/webapps下,目的域名ؓwww.mydomain.com,q在isp做好

了域名解析指向当前服务器的IP
5Q打开conf/extra/httpd-vhosts.conf ,d如下内容
NameVirtualHost *:80

<VirtualHost *:80>
ServerAdmin admin@yazhouly.cn
ServerName www.mydomain.com
DocumentRoot "/usr/webapps/test"
<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>
<Directory "/usr/webapps/test">
    Options Indexes FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

JkMount /* loadbalancer
</VirtualHost>
其中最后四行表C关于jsp的内定w转交ltomcat处理Q虽然我们在配置q接器的时?br />
Q已l配|了Q但是在虚拟|后Q还是要单独加上q几句,其中work是

mod_jk.conf中配|的代理名?br /> 打开tomcat目录conf下面的server.xml
dL信息
 <Host name="localhost"  appBase="/usr/webapps/test"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">
<Context path="" docBase="/usr/webapps/test" debug="0" reloadable="true"

crossContext="true"/>
      </Host>
保存 重新启动apache
在地址栏中输入
www.mydomain.com
׃出现你的首页

遇到的问?/font>
1Q启动时产生 Error receiving mcast package
l测试发玎ͼ我用的ADSL,如果我联|,则会报这个异常,如果断网则不会生。看来那?
tcpListenAddress="192.168.0.1"
需要用外|的IP地址才可以?
2Q启动异常,一般是端口被占?/strong>
请仔l看各个server.xml配置文gQ各个端口不能相?br />
3)如果不能做cluster只做load balance那么jvm="tomcat1"和jvm="tomcat2"q两部分内容必须保留Q?br /> cluster保持注释状态,<distributable/>不需要?br />


persister 2009-10-14 20:28 发表评论
]]>
JspSmart之uploadlg源码http://www.tkk7.com/persister/archive/2009/10/13/298084.htmlpersisterpersisterTue, 13 Oct 2009 09:08:00 GMThttp://www.tkk7.com/persister/archive/2009/10/13/298084.htmlhttp://www.tkk7.com/persister/comments/298084.htmlhttp://www.tkk7.com/persister/archive/2009/10/13/298084.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/298084.htmlhttp://www.tkk7.com/persister/services/trackbacks/298084.html   1 File.java    2     3 import&n...  阅读全文

persister 2009-10-13 17:08 发表评论
]]>
JMeter试http://www.tkk7.com/persister/archive/2009/10/10/297674.htmlpersisterpersisterSat, 10 Oct 2009 06:29:00 GMThttp://www.tkk7.com/persister/archive/2009/10/10/297674.htmlhttp://www.tkk7.com/persister/comments/297674.htmlhttp://www.tkk7.com/persister/archive/2009/10/10/297674.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/297674.htmlhttp://www.tkk7.com/persister/services/trackbacks/297674.html

JMeter是apache的jakarta上面的项目,用于软g? 压力试QLoad TestQ,不但可以对HTTPQ也可以Ҏ据库Q通过JDBCQ、FTP、Web Service、Java 对象{等q行压力试。最q,在我们的目中用到了它。我们的目是基于BEA Weblogic的一个J2EE目Q在一个Domain中部|了3个J2EE应用Q这样在客户使用的过E中出现了WebLogic内存垃圾回收的问题。于是我们配|了WebLogic集群Qƈ其中的某些应用分开部vQƈ使用了JMeterq行了性能试。从而ؓ应用E序的性能诊断提供了必要的依据?

    基本概念

  JMeter的测试计划(Test PlanQ呈树状l构Q树里面有多U元素类型,树状l构的元素之间有的是有承关pȝQ其原理有点cMlog4jQ。下面简qC下元素类型:

    1、ThreadGroup
֐思义是U程l,试必须有一个ThreadGroup元素作ؓ基础Q否则就没有试U程在跑了)Q这个元素可以配|跑多少个线E、每个线E@环多次Q所有线E数的d动时_Ramp-up periodQ等{?/p>

    2、Controller
包括Logical Controller和SamplerQ前者用来作一些逻辑上的控制Q例如轮换、条件、@环等{。Sampler是真正“q活”?#8220;取样?#8221;Q例?#8220;HTTP Request”Q就是拿来执行一个HTTPh的?/p>

    3、Listener
Listener对请求过E进行监听,可以单理解ؓ获取l果的东东。例如Simple Data WriterQ可以把l果写到一个文本文仉Q其实所有Listener都可以写数据到文仉Q,q有View Results in TableQ就是把l果昄在表格里?/p>

    4?Timer
用来控制执行程中的旉延迟{功能?/p>

    5?Assertion
断言Q加到Sampler里面可以对返回的l果q行判断Q例如判断HTTPq回l果里面是否含有某个字符丌Ӏ如果断a为真QJMeter会标记请求ؓ成功Q否则标Cؓp|?/p>

    6?Configuration Element
配置用的元素Q很有用。由于测试计划是树状和有l承关系的,可以在高层次指定一个Configuration ElementQ低层次的相关Sampler如果没有昑ּ地指定配|,q扉K层次的配|信息。(跟log4j很像吧?Q?/p>

    7?Pre-Processor/Post-Processor Elements
用来在Samplerq行前和q行后作一些预处理和后处理工作的。例如动态修改请求的参数Q预处理Q,从返回信息里面提取信息(后处理){等?/p>


要提醒一下的是jmeterҎ当前pȝ的locale昄菜单的语aQؓ了方便想讄回英文的话,可以修改jmeter.properties文gQ设|language=en

    JMeter的?/p>


    #启动

  大家可以到通过http://apache.linuxforum.net/dist/jakarta/jmeter/binaries/jakarta-jmeter-1.9.1.zip? 载JMeter的release版本Q然后将下蝲?zip文g解压~到C:/JMeterQ后面的文章中将使用%JMeter%来引用这个目录)目录 下。现在,请?JMeter%/bin下面的jmeter.bat批处理文件来启动JMeter的可视化界面Q下面的工作都将在这个可视化界面界面? q行操作。下面的囄是JMeter的可视化界面?a target="_blank" style="color: rgb(0, 0, 0);" title="屏幕">屏幕截图?/p>

     

    图一Q?JMeter打开时的屏幕截图?

    # 建立试计划QTest PlanQ?/p>

试计划描述了执行测试过E中JMeter的执行过E和步骤Q一个完整的试计划包括一个或者多个线E组(Thread Groups)、逻辑控制QLogic ControllerQ、实例生控制器QSample Generating ControllersQ、侦听器(Listener)、定时器QTimerQ、比较(AssertionsQ、配|元素(Config ElementsQ。打开JMeterӞ它已l徏立一个默认的试计划,一个JMeter应用的实例只能徏立或者打开一个测试计划。现在我们开始填充一 个测试计划的内容Q这个测试计划向一个jsp文g和一个servlet发出hQ我们需要JMeter模拟五个h者(也就是五个线E)Q每个请求者连l? h两次Q下面的章节介绍了详l的操作步骤?/p>

    # 增加负蝲信息讄

  q一步,我们向试计划中增加相兌载设|?是Jmeter知道我们需要模拟五个请求者,每个h者在试q程中连l请求两ơ。详l步骤如下:

    1. 选中可视化界面中左边树的Test Plan节点Q单d键,选择Add'Thread GroupQ界面右边将会出C的设|信息框?/p>

    2. Thread Group有三个和负蝲信息相关的参敎ͼ

    Number of ThreadsQ?讄发送请求的用户数目

    Ramp-up periodQ?每个h发生的L间间隔,单位是秒。比如你的请求数目是5Q而这个参数是10Q那么每个请求之间的间隔是10Q?Q也是2U?/p>

    Loop CountQ?h发生的重复次敎ͼ如果选择后面的foreverQ默认)Q那?h一直l,如果不选择foreverQ而在输入框中输入数字Q那么请求将重复 指定的次敎ͼ如果输入0Q那么请求将执行一ơ?/p>

  Ҏ我们演示例子的设计,我们应该Number of Threads讄?QRamp-up period讄?Q也是同时q发hQ,不选中foreverQ在Loop Count后面的输入框中输?Q设|后的屏q截囑֦下:

     

    图二Q设|好参数的Thread Group?/p>

    # 增加默认Http属性(可选)

  实际的测试工作往往是针对同一?a target="_blank" style="color: rgb(0, 0, 0);" title="服务?>服务?/a>上Web应用展开?所以Jmeter提供了这样一U设|? 在默认Http属性设|需要被试屏幕截图如下Q?/p>

    

    图三Q设|好的jsp试h

     

    囑֛Q设|好的Servlet试hQ带参数Q?

    # 增加Listener

增加listener是ؓ了记录测试信息ƈ且可以用Jmeter提供的可视化界面查看试l果Q里面有好几U结果分析方式可供选择Q你可以Ҏ自己? 惯的分析方式选择不同的结果显C方式,我们q里使用表格的Ş式来查看和分析测试结果。你可以通过下面的步骤来增加listenerQ?/p>

    1. 选中可视化界面中左边树的Test Plan节点Q单d键,选择Add'listener'view result in tableQ界面右边将会出C的设|信息和l果昄框?/p>

    2. 你可以设|界面上面的filename属性设|将试l果保存到某个文件中界面下面用表格显C测试结果,表格的第一列sampleno昄h执行? 序和编Purl昄  h发送的目标QsampleQms列显C个请求完成耗费的时_最后的success列显C改h是否成功执行。界面的最 下面你还可以看到一些统计信息,最兛_的应该是Average吧,也就是相应的q_旉?

    # 开始执行测试计?/p>

  现在你可以通过单击菜单栏run -> Start开始执行测试计划了。下面是该测试计划的l果?

     

    图五Q结果显C?/p> JMeter用于q行供能或者性能试Q通过使用JMeter提供的供能,我们可以可视化的制定试计划Q包括规定用什么样的负载、测试什么内宏V传入的参数Q同Ӟ他提供了好多U图形化的测试结果显C方式,使我们能够简单的开始测试工作和分析试l果?br />


persister 2009-10-10 14:29 发表评论
]]>
Cookie~程问题及Base64中文~码问题http://www.tkk7.com/persister/archive/2009/10/02/297103.htmlpersisterpersisterFri, 02 Oct 2009 08:14:00 GMThttp://www.tkk7.com/persister/archive/2009/10/02/297103.htmlhttp://www.tkk7.com/persister/comments/297103.htmlhttp://www.tkk7.com/persister/archive/2009/10/02/297103.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/297103.htmlhttp://www.tkk7.com/persister/services/trackbacks/297103.html
Cookie cookie = new Cookie(name,value);

调用下面的方法时出现一个问?br /> response.addCookie(cookie)Q?/cookie 是一个Cookie实例

问题报错Qjava.lang.IllegalArgumentException: Control character in cookie value, consider BASE64 encoding your value

很显然Cookie之中存在了非法参敎ͼl过试发现cookie之中包含""r"n"?"n"时就会出现这个异常?br />
因ؓcookie中部分值是通过文本框录入的Q在<textarea/>标签中键入回车键后,valueg加入了""r"n"Q?br /> 把这LDlcookieQ执行response.addCookie(cookie)Q时则出现异常?br />
解决办法Q用StringcȝreplaceQ)Ҏ?br /> Java代码

1 str = str.replace(""r"n", "<br>");            
2 str = str.replace(""n", "<br>");
3 
4 Cookie cookie = new Cookie('cookName',str);
5 //怹有效
6 cookie.setMaxAge(60*60*24*365);
7 response.addCookie(cookie)Q?/span>

刚才看到Base64错误Q通常不将数据直接保存在cookie中,而要q行Base64~码

String cookieValueBase64 = new String(Base64.encode(cookieValue.getBytes("UTF-8"))); //讄UTF-8否则会ؕ?/span>
Debug.log("Ba64:"+ cookieValueBase64, module);
cookieValueBase64 
= cookieValueBase64.replace(""r"n""");              
cookieValueBase64 
= cookieValueBase64.replace(""n""");
Cookie cookie = new Cookie(key, cookieValueBase64);
cookie.setMaxAge(time);
cookie.setPath(
"/");// 讄適用路经
res.addCookie(cookie);// cookied到response对象中。由response对象q回l户?nbsp; 


取得时?new String(Base64.decode(ck.getValue()),"UTF-8");       

q样做就行了吗?发现q是不够Q出C么问题呢Q?br /> 原来如果cookieg出现{号Q那么取出来的值只取等号前面的|{号及等号后面的g被忽?br />
Base64~码难保不出现等P怎么解决呢?采用UrlEncoder和UrlDecoderQ存的时候:

String cookieValueBase64 = new String(Base64.encode(cookieValue.getBytes("UTF-8")));
cookieValueBase64 
= cookieValueBase64.replace(""r"n""");              
cookieValueBase64 
= cookieValueBase64.replace(""n""");     
String cookieValueUrlEncode = URLEncoder.encode(cookieValueBase64, "UTF-8");

取的时候:

new String(Base64.decode(URLDecoder.decode(ck.getValue(), "UTF-8")),"UTF-8");

q样很多Ҏ字符可以了?br />


persister 2009-10-02 16:14 发表评论
]]>
html中的Image标签及Servlet获取囄http://www.tkk7.com/persister/archive/2009/10/02/297101.htmlpersisterpersisterFri, 02 Oct 2009 06:12:00 GMThttp://www.tkk7.com/persister/archive/2009/10/02/297101.htmlhttp://www.tkk7.com/persister/comments/297101.htmlhttp://www.tkk7.com/persister/archive/2009/10/02/297101.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/297101.htmlhttp://www.tkk7.com/persister/services/trackbacks/297101.html 如在web.xml配置Q?br />
  <servlet>
    <servlet-name>GenerateImageServlet</servlet-name>
    <servlet-class>org.bruce.util.GenerateImageServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GenerateImageServlet</servlet-name>
    <url-pattern>/getImage</url-pattern>
  </servlet-mapping>

然后在jsp文g中:

<img src="getImage" title="女">

q样可以得到图片了。这里就l动态获取图片提供了一U途径?br /> 比如可以通过src="getImage?id=1000"可以得?000号图片?br />
q可以采用JavaScript onclickҎh囄Q网上参考资料采用如下方法:

<img src="valid" onclick="regenerate(this)" title="女">
<script>
function regenerate(this){
    this.src="getImage";
}
</script>

试后,发现q种Ҏ无效Q由于\径没变,览器不会重新发赯求。这里我采用另外一U技巧:

    <script type="text/javascript">
        function regenerate(obj){var date=new Dat();
            obj.src="getImage?time=" + date.getSeconds();
        }
    </script>

q样׃路径发生了变化,重新发赯求,L实现点击更新囄内容?br /> 在生成验证码的时候这个方法很用Q因为当面昄的验证码看不清时Q应该提供方法重新获取一张?br />


persister 2009-10-02 14:12 发表评论
]]>
一例ؕ码的问题http://www.tkk7.com/persister/archive/2009/09/20/295759.htmlpersisterpersisterSun, 20 Sep 2009 09:33:00 GMThttp://www.tkk7.com/persister/archive/2009/09/20/295759.htmlhttp://www.tkk7.com/persister/comments/295759.htmlhttp://www.tkk7.com/persister/archive/2009/09/20/295759.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/295759.htmlhttp://www.tkk7.com/persister/services/trackbacks/295759.html
<html>
    
<head>
        
<title>SiteMesh Sample Site</title>
    
</head>
    
<body>

        
<p>Welcome to the SiteMesh sample</p>

        
<h3>Samples</h3>

        
<ul>
            
<li><href="inline.jsp">中国</a></li>
        
</ul>

    
</body>
</html>

l果出现了ؕ码,后来Ҏ了jsp面
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<html>
    
<head>
        
<title>SiteMesh Sample Site</title>
    
</head>
    
<body>

        
<p>Welcome to the SiteMesh sample</p>

        
<h3>Samples</h3>

        
<ul>
            
<li><href="inline.jsp">中国</a></li>
        
</ul>

    
</body>
</html>

q问题p决了?br />



persister 2009-09-20 17:33 发表评论
]]>
OFBiz的中文ؕ码解x?/title><link>http://www.tkk7.com/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.tkk7.com/persister/archive/2009/08/10/290568.html</guid><wfw:comment>http://www.tkk7.com/persister/comments/290568.html</wfw:comment><comments>http://www.tkk7.com/persister/archive/2009/08/10/290568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/persister/comments/commentRss/290568.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/persister/services/trackbacks/290568.html</trackback:ping><description><![CDATA[<p>OFBiz开发时遇到q的问题,MySQL数据库插入中文数据时出现了一个问题,报告中文错误Qincorrect string value Q.Q.Q?/p> <p>1.q时׃字符~码不一致导致的Q应该将数据库对应的表或coloumҎuft-8Q所以如果在CustomerExtraq表中存储中文的话,需要将<br />   此表另外q有operationlog表的charsetҎutf-8</p> <p>2.Servlet中字W显CZؓ证券的中文,而且表也讄为utf-8Q但是数据库和页面还是ؕ码,怎么回事Q?br />   q里需要修改jdbc url的参敎ͼ如将jdbc:mysql://localhost/ccbportal?zeroDateTimeBehavior=convertToNull<br />   ҎQjdbc:mysql://localhost/ccbportal?zeroDateTimeBehavior=convertToNull&amp;useUnicode=true&amp;characterEncoding=UTF-8</p> <p>3.前台输入的是中文Q到后台变成了qQ怎么回事Q?br />   无论何种表单提交都可以在后台的java文g中通过String des = new String(s.getBytes("iso8859-1"),"UTF-8");<br />   来{换成你想要的UTFQ?~码方式。但如果每处都加词句太麻烦,故分post和get两种方式区分提交?br />   写一个Filter卛_解决问题Q?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);"> 1</span> <span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 0, 0);"> import java.io.IOException;<br /> </span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);"> import javax.servlet.ServletException;<br /> </span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);"> import javax.servlet.Filter;<br /> </span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 0, 0);"> import javax.servlet.FilterChain;<br /> </span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);"> import javax.servlet.FilterConfig;<br /> </span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 0, 0);"> <br /> </span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 0, 0);"> import javax.servlet.ServletRequest;<br /> </span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 0, 0);"> import javax.servlet.ServletResponse;<br /> </span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 0, 0);"> <br /> </span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 0, 0);"> public class SetCharacterEncodingFilter implements Filter {<br /> </span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 0, 0);"> <br /> </span><span style="color: rgb(0, 128, 128);">13</span> <span style="color: rgb(0, 0, 0);">  protected String encoding = "GBK";<br /> </span><span style="color: rgb(0, 128, 128);">14</span> <span style="color: rgb(0, 0, 0);"> <br /> </span><span style="color: rgb(0, 128, 128);">15</span> <span style="color: rgb(0, 0, 0);">  protected FilterConfig filterConfig = null;<br /> </span><span style="color: rgb(0, 128, 128);">16</span> <span style="color: rgb(0, 0, 0);"> <br /> </span><span style="color: rgb(0, 128, 128);">17</span> <span style="color: rgb(0, 0, 0);">  protected boolean ignore = true;<br /> </span><span style="color: rgb(0, 128, 128);">18</span> <span style="color: rgb(0, 0, 0);"> <br /> </span><span style="color: rgb(0, 128, 128);">19</span> <span style="color: rgb(0, 0, 0);">  public void init(FilterConfig filterConfig) throws ServletException {<br /> </span><span style="color: rgb(0, 128, 128);">20</span> <span style="color: rgb(0, 0, 0);">   this.filterConfig = filterConfig;<br /> </span><span style="color: rgb(0, 128, 128);">21</span> <span style="color: rgb(0, 0, 0);">   this.encoding = filterConfig.getInitParameter("encoding");<br /> </span><span style="color: rgb(0, 128, 128);">22</span> <span style="color: rgb(0, 0, 0);">   String value = filterConfig.getInitParameter("ignore");<br /> </span><span style="color: rgb(0, 128, 128);">23</span> <span style="color: rgb(0, 0, 0);">   if (value == null)<br /> </span><span style="color: rgb(0, 128, 128);">24</span> <span style="color: rgb(0, 0, 0);">    this.ignore = true;<br /> </span><span style="color: rgb(0, 128, 128);">25</span> <span style="color: rgb(0, 0, 0);">   else if (value.equalsIgnoreCase("true"))<br /> </span><span style="color: rgb(0, 128, 128);">26</span> <span style="color: rgb(0, 0, 0);">    this.ignore = true;<br /> </span><span style="color: rgb(0, 128, 128);">27</span> <span style="color: rgb(0, 0, 0);">   else if (value.equalsIgnoreCase("yes"))<br /> </span><span style="color: rgb(0, 128, 128);">28</span> <span style="color: rgb(0, 0, 0);">    this.ignore = true;<br /> </span><span style="color: rgb(0, 128, 128);">29</span> <span style="color: rgb(0, 0, 0);">   else<br /> </span><span style="color: rgb(0, 128, 128);">30</span> <span style="color: rgb(0, 0, 0);">    this.ignore = false;<br /> </span><span style="color: rgb(0, 128, 128);">31</span> <span style="color: rgb(0, 0, 0);">  }<br /> </span><span style="color: rgb(0, 128, 128);">32</span> <span style="color: rgb(0, 0, 0);"> <br /> </span><span style="color: rgb(0, 128, 128);">33</span> <span style="color: rgb(0, 0, 0);">  public void doFilter(ServletRequest request, ServletResponse response,<br /> </span><span style="color: rgb(0, 128, 128);">34</span> <span style="color: rgb(0, 0, 0);">    FilterChain chain) throws IOException, ServletException {<br /> </span><span style="color: rgb(0, 128, 128);">35</span> <span style="color: rgb(0, 0, 0);">   // Conditionally select and set the character encoding to be used<br /> </span><span style="color: rgb(0, 128, 128);">36</span> <span style="color: rgb(0, 0, 0);">   if (ignore || (request.getCharacterEncoding() == null)) {<br /> </span><span style="color: rgb(0, 128, 128);">37</span> <span style="color: rgb(0, 0, 0);">    String encoding = selectEncoding(request);<br /> </span><span style="color: rgb(0, 128, 128);">38</span> <span style="color: rgb(0, 0, 0);">    if (encoding != null) {<br /> </span><span style="color: rgb(0, 128, 128);">39</span> <span style="color: rgb(0, 0, 0);">     request.setCharacterEncoding(encoding);<br /> </span><span style="color: rgb(0, 128, 128);">40</span> <span style="color: rgb(0, 0, 0);">    }<br /> </span><span style="color: rgb(0, 128, 128);">41</span> <span style="color: rgb(0, 0, 0);"> <br /> </span><span style="color: rgb(0, 128, 128);">42</span> <span style="color: rgb(0, 0, 0);">   }<br /> </span><span style="color: rgb(0, 128, 128);">43</span> <span style="color: rgb(0, 0, 0);">   // Pass control on to the next filter<br /> </span><span style="color: rgb(0, 128, 128);">44</span> <span style="color: rgb(0, 0, 0);">   chain.doFilter(request, response);<br /> </span><span style="color: rgb(0, 128, 128);">45</span> <span style="color: rgb(0, 0, 0);">  }<br /> </span><span style="color: rgb(0, 128, 128);">46</span> <span style="color: rgb(0, 0, 0);"> <br /> </span><span style="color: rgb(0, 128, 128);">47</span> <span style="color: rgb(0, 0, 0);">  protected String selectEncoding(ServletRequest request) {<br /> </span><span style="color: rgb(0, 128, 128);">48</span> <span style="color: rgb(0, 0, 0);">   return (this.encoding);<br /> </span><span style="color: rgb(0, 128, 128);">49</span> <span style="color: rgb(0, 0, 0);">  }<br /> </span><span style="color: rgb(0, 128, 128);">50</span> <span style="color: rgb(0, 0, 0);"> <br /> </span><span style="color: rgb(0, 128, 128);">51</span> <span style="color: rgb(0, 0, 0);">  public void destroy() {<br /> </span><span style="color: rgb(0, 128, 128);">52</span> <span style="color: rgb(0, 0, 0);">   this.encoding = null;<br /> </span><span style="color: rgb(0, 128, 128);">53</span> <span style="color: rgb(0, 0, 0);">   this.filterConfig = null;<br /> </span><span style="color: rgb(0, 128, 128);">54</span> <span style="color: rgb(0, 0, 0);">  }<br /> </span><span style="color: rgb(0, 128, 128);">55</span> <span style="color: rgb(0, 0, 0);"> }<br /> </span><span style="color: rgb(0, 128, 128);">56</span> <span style="color: rgb(0, 0, 0);">  <br /> </span></div> <p><br /> web.xmld此FilterQ?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);"> 1</span> <span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);"> 2</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">encodeFilter</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);"> 3</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"> com.aicent.ccb.filter.SetCharacterEncodingFilter</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-class</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);"> 4</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);"> 5</span> <span style="color: rgb(0, 0, 0);">   </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">encoding</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);"> 6</span> <span style="color: rgb(0, 0, 0);">   </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">GBK</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);"> 7</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);"> 8</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);"> 9</span> <span style="color: rgb(0, 0, 0);">   </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">ignore</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">param-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);">10</span> <span style="color: rgb(0, 0, 0);">   </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">true</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">param-value</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);">11</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">init-param</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);">12</span> <span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);">13</span> <span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);">14</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">encodeFilter</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-name</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);">15</span> <span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 255);"><</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">/control/*</span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">url-pattern</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);"><br /> </span><span style="color: rgb(0, 128, 128);">16</span> <span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);"></</span><span style="color: rgb(128, 0, 0);">filter-mapping</span><span style="color: rgb(0, 0, 255);">></span><span style="color: rgb(0, 0, 0);">  <br /> </span></div> <p> </p> <img src ="http://www.tkk7.com/persister/aggbug/290568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/persister/" target="_blank">persister</a> 2009-08-10 16:58 <a href="http://www.tkk7.com/persister/archive/2009/08/10/290568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Http 协议头基http://www.tkk7.com/persister/archive/2009/08/03/289664.htmlpersisterpersisterMon, 03 Aug 2009 13:35:00 GMThttp://www.tkk7.com/persister/archive/2009/08/03/289664.htmlhttp://www.tkk7.com/persister/comments/289664.htmlhttp://www.tkk7.com/persister/archive/2009/08/03/289664.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/289664.htmlhttp://www.tkk7.com/persister/services/trackbacks/289664.html HTTPQHyperTextTransferProtocolQ是文本传输协议的~写Q它用于传送WWW方式的数据,关于HTTP协议的详l内容请?考RFC2616。HTTP协议采用了请?响应模型。客L向服务器发送一个请求,h头包含请求的Ҏ、URI、协议版本、以及包含请求修饰符、客?信息和内容的cM于MIME的消息结构。服务器以一个状态行作ؓ响应Q相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息?及可能的实体内容?br /> 通常HTTP消息包括客户机向服务器的h消息和服务器向客h的响应消息。这两种cd的消息由一个v始行Q一个或者多个头域,一个只是头域结束的I和可选的消息体组成?strong>HTTP的头域包括通用_h_响应头和实体头四个部?/strong>?font color="#0033ff">每个头域׃个域名,冒号Q?Q和域g部分l成?/font>域名是大写无关的,域值前可以dM数量的空格符Q头域可以被扩展为多行,在每行开始处Q用至一个空格或制表W?br /> 1、通用头域
通用头域包含h和响应消息都支持的头域,通用头域包含Cache-Control、Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via?/font>寚w用头域的扩展要求通讯双方都支持此扩展Q如果存在不支持的通用头域Q一般将会作为实体头域处理。下面简单介l几个在UPnP消息中用的通用头域?br /> Cache-Control头域
Cache-Control指定h和响应遵循的~存机制?/font>?h消息或响应消息中讄Cache-Controlq不会修改另一个消息处理过E中的缓存处理过E。请求时的缓存指令包括no-cache、no- store、max-age、max-stale、min-fresh、only-if-cachedQ响应消息中的指令包括public?private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate?max-age。各个消息中的指令含义如下:
Public指示响应可被M~存区缓存?br /> Private指示对于单个用户的整个或部分响应消息Q不能被׃n~存处理。这允许服务器仅仅描q当用户的部分响应消息,此响应消息对于其他用Lh无效?br /> no-cache指示h或响应消息不能缓?br /> no-store用于防止重要的信息被无意的发布。在h消息中发送将使得h和响应消息都不用缓存?br /> max-age指示客户机可以接收生存期不大于指定时_以秒为单位)的响应?br /> min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应?br /> max-stale指示客户机可以接收超时期间的响应消息。如果指定max-stale消息的|那么客户机可以接收超时期指定g内的响应消息?br /> Date头域
Date头域表示消息发送的旉Q时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表CZ界标准时Q换成本地旉Q需要知道用h在的时区?br /> Pragma头域
Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache?/font>在HTTP/1.1协议中,它的含义和Cache-Control:no-cache相同?br /> 2、请求消?/strong>
h消息的第一行ؓ下面的格式:
Method SP Request-URI SP HTTP-Version CRLF 
Method表示对于Request-URI完成的方?/strong>Q这个字D|大小写敏感的Q?font color="#0000ff">包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE?/font>ҎGET和HEAD应该被所有的通用WEB服务器支持,其他所有方法的实现是可选的?font color="#0000ff">GETҎ取回由Request-URI标识的信息?/font>HEADҎ也是取回由Request-URI标识的信息,只是可以在响应时Q不q回消息体?font color="#0033ff">POSTҎ可以h服务器接收包含在h中的实体信息Q可以用于提交表单,向新ȝ、BBS、邮件群l和数据库发送消息?/font>
SP表示I格?br /> Request-URI遵@URI格式Q在此字Dؓ星号Q?Q时Q说明请求ƈ不用于某个特定的资源地址Q而是用于服务器本w?br /> HTTP-Version表示支持的HTTP版本Q例如ؓHTTP/1.1?br /> CRLF表示换行回RW?/strong>
?求头域允许客L向服务器传递关于请求或者关于客h的附加信息。请求头域可能包含下列字DAccept、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>对请求头域的扩展要求通讯双方都支持,如果存在不支持的h头域Q一般将会作为实体头域处理?br /> 典型的请求消息:
GEThttp://class/download.microtool.de:80/somedata.exe
Host:download.microtool.de
Accept:*/*
Pragma:no-cache
Cache-Control:no-cache
Referer:http://class/download.microtool.de/
User-Agent:Mozilla/4.04[en](Win95;I;Nav)
Range:bytes=554554-
上例W一行表CHTTP客户端(可能是浏览器、下载程序)通过GETҎ获得指定URL下的文g。棕色的部分表示h头域的信息,l色的部分表C通用头部分?br /> Host头域
Host头域指定h资源的IntenetL和端口号Q必表C求url的原始服务器或网关的位置。HTTP/1.1h必须包含L头域Q否则系l会?00状态码q回?br /> Referer头域
Referer头域允许客户端指定请求uri的源资源地址Q这可以允许服务器生成回退链表Q可用来登陆、优化cache{。他也允许废除的或错误的q接׃l护的目的被q踪。如果请求的uri没有自己的uri地址QReferer不能被发送。如果指定的是部分uri地址Q则此地址应该是一个相对地址?br /> Range头域
Range头域可以h实体的一个或者多个子范围。例如,
表示?00个字节:bytes=0-499
表示W二?00字节Qbytes=500-999
表示最?00个字节:bytes=-500
表示500字节以后的范_bytes=500-
W一个和最后一个字节:bytes=0-0,-1
同时指定几个范围Qbytes=500-600,601-999
但是服务器可以忽略此h_如果无条件GET包含Rangeh_响应会以状态码206QPartialContentQ返回而不是以200QOKQ?br /> User-Agent头域
User-Agent头域的内容包含发求的用户信息?br />
3、响应消?br /> 响应消息的第一行ؓ下面的格式:
HTTP-Version SP Status-Code SP Reason-Phrase CRLF
HTTP-Version表示支持的HTTP版本Q例如ؓHTTP/1.1?br /> Status-Code是一个三个数字的l果代码?br /> Reason-PhraselStatus-Code提供一个简单的文本描述。Status-Code主要用于机器自动识别QReason-Phrase主要用于帮助用户理解?font color="#0000ff">Status-Code的第一个数字定义响应的cdQ后两个数字没有分类的作?/font>。第一个数字可能取5个不同的|
1xx:信息响应c,表示接收到请求ƈ且l处?br /> 2xx:处理成功响应c,表示动作被成功接收、理解和接受
3xx:重定向响应类Qؓ了完成指定的动作Q必L受进一步处?br /> 4xx:客户端错误,客户h包含语法错误或者是不能正确执行
5xx:服务端错误,服务器不能正执行一个正的h
?应头域允许服务器传递不能放在状态行的附加信息,q些域主要描q服务器的信息和Request-URIq一步的信息。响应头域包含Age?Location、Proxy-Authenticate、Public、Retry-After、Server、Vary、Warning、WWW- Authenticate?/font>对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域Q一般将会作为实体头域处理?br /> 典型的响应消息:
HTTP/1.0200OK
Date:Mon,31Dec200104:25:57GMT
Server:Apache/1.3.14(Unix)
Content-type:text/html
Last-modified:Tue,17Apr200106:46:28GMT
Etag:"a030f020ac7c01:1e9f"
Content-length:39725426
Content-range:bytes554554-40279979/40279980
上例W一行表CHTTP服务端响应一个GETҎ。棕色的部分表示响应头域的信息,l色的部分表C通用头部分,U色的部分表C实体头域的信息?br /> Location响应?/strong>
Location响应头用于重定向接收者到一个新URI地址?/font>
Server响应?/strong>
Server响应头包含处理请求的原始服务器的软g信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序?br /> 4、实体信?/strong>
h消息和响应消息都可以包含实体信息Q?strong>实体信息一般由实体头域和实体组成?/strong>?体头域包含关于实体的原信息,实体头包括Allow、Content-Base、Content-Encoding、Content-Language?Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type?Etag、Expires、Last-Modified、extension-header。extension-header允许客户端定义新的实体头Q但是这些域可能无法未接受方识别?font color="#0000ff">实体可以是一个经q编码的字节,它的~码方式由Content-Encoding或Content-Type定义Q它的长度由Content-Length或Content-Range定义?/font>
Content-Type实体?/strong>
Content-Type 实体头用于向接收ҎC实体的介质cdQ指定HEADҎ送到接收方的实体介质cdQ或GETҎ发送的h介质cdContent-Range实体?br /> Content-Range实体?/strong>
用于指定整个实体中的一部分的插入位|,他也指示了整个实体的长度。在服务器向客户q回一个部分响应,它必Lq响应覆盖的范围和整个实体长度。一般格式:
Content-Range:bytes-unit SP first-byte-pos - last-byte-pos/entity-legth
?如,传送头500个字节次字段的Ş式:Content-Range:bytes0-499/1234如果一个http消息包含此节Q例如,对范围请求的?应或对一pd范围的重叠请求)QContent-Range表示传送的范围QContent-Length表示实际传送的字节数?br /> Last-modified实体?/strong>
Last-modified实体头指定服务器上保存内容的最后修订时间?/font>
5?HTTP 头参考(microsoftQ?/strong>
HTTP h?HTTP 响应都用头发送有?HTTP 消息的信息。头׃pd行组成,每行都包含名Uͼ然后依次是冒受空根{倹{字D可按Q何顺序排列。某些头字段既能用于h头也能用于响应头Q而另一些头字段只能用于其中之一?
?多请求头字段都允许客L在值部分指定多个可接受的选项Q有时甚臛_以对q些选项的首选项q行排名。多个项以逗号分隔。例如,客户端可以发送包?“Content-Encoding: gzip, compress,”的请求头Q表C可以接受各U压~类型。如果服务器的响应正文?gzip ~码Q其响应头中包?#8220;Content-Encoding: gzip”?br /> 有些字段可以在单个头中出现多ơ。例如,头可以有多个“Warning”字段?br /> ?表列Z HTTP 1.1 头字Dc注意:有些头字D| MIME 字段。MIME 字段?Internet Engineering Task Force (IETF) 文档 RFC 2045 中进行了定义Q但也可用于 HTTP 1.1 协议。有?MIME ?HTTP 1.1 规范的详l信息,请参?IEIF c?br /> 一般头字段
一般头字段可用于请求消息和响应消息?/font>
 名称          CZ?
Cache-Control
  "max-age=10"
Connection    "close"
Date          "Tue, 11 Jul 2000 18:23:51 GMT"
Pragma        "no-cache"
Trailer         "Date"
Transfer-Encoding "chunked"
Upgrade       "SHTTP/1.3"
Via            "HTTP/1.1 Proxy1, HTTP/1.1 Proxy2"
Warning       "112 Disconnected Operation"
h头字D?/strong>
h头字D仅用于h消息?/font>
   名称             CZ?/strong>
Accept           "text/html, image/*"
Accept-Charset   "iso8859-5"
Accept-Encoding  "gzip, compress"
Accept-Language "en, fr"
Authorization     [credentials]
Content-Encoding "gzip"
Expect           "100-continue"
From            "user@microsoft.com"
Host            "www.microsoft.com"
If-Match         "entity_tag001"
If-Modified-Since "Tue, 11 Jul 2000 18:23:51 GMT"
If-None-Match    "entity_tag001"
If-Range         "entity_tag001" or "Tue, 11 Jul 2000 18:23:51 GMT"
If-Unmodified-Since "Tue, 11 Jul 2000 18:23:51 GMT"
Max-Forwards    "3"
Proxy-Authorization [credentials]
Range       "bytes=100-599"
Referer      "http://www.microsoft.com/resources.asp"
TE          "trailers"
User-Agent   "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)"

>>h头字D늚具体含义
AcceptQ浏览器可接受的MIMEcd?
Accept-CharsetQ?/strong>览器可接受的字W集?
Accept-EncodingQ?/strong>览器能够进行解码的数据~码方式Q比如gzip?br /> Accept-LanguageQ?/strong>览器所希望的语aU类Q当服务器能够提供一U以上的语言版本时要用到?
AuthorizationQ授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中?
ConnectionQ?/strong>?C是否需要持久连接。如果Servlet看到q里的gؓ“Keep-Alive”Q或者看到请求用的是HTTP 1.1QHTTP 1.1默认q行持久q接Q,它就可以利用持久q接的优点,当页面包含多个元素时Q例如AppletQ图片)Q显著地减少下蝲所需要的旉。要实现q一点, Servlet需要在应答中发送一个Content-Length_最单的实现Ҏ是:先把内容写入ByteArrayOutputStreamQ然 后在正式写出内容之前计算它的大小?br /> Content-LengthQ表C求消息正文的长度?
CookieQ设|cookie,q是最重要的请求头信息之一
FromQ?/strong>h发送者的email地址Q由一些特D的Web客户E序使用Q浏览器不会用到它?
HostQ?/strong>初始URL中的L和端口?
If-Modified-SinceQ只有当所h的内容在指定的日期之后又l过修改才返回它Q否则返?04“Not Modified”应答?
PragmaQ?/strong>指定“no-cache”DC服务器必须q回一个刷新后的文,即它是代理服务器而且已经有了面的本地拷贝?
RefererQ?/strong>包含一个URLQ用户从该URL代表的页面出发访问当前请求的面?
User-AgentQ?/strong>览器类型,如果Servletq回的内容与览器类型有兛_该值非常有用?br /> UA-PixelsQUA-ColorQUA-OSQUA-CPUQ?/strong>由某些版本的IE览器所发送的非标准的h_表示屏幕大小、颜色深度、操作系l和CPUcd?
响应头字D?/strong>
响应头字D仅用于响应消息?/font>
  名称          CZ?/strong>
Accept-Ranges  "none"
Age            "2147483648(2^31)"
ETag           "b38b9-17dd-367c5dcd"
Last-Modified    "Tue, 11 Jul 2000 18:23:51 GMT"
Location        "http://localhost/redirecttarget.asp"
Proxy-Authenticate [challenge]
Retry-After      "Tue, 11 Jul 2000 18:23:51 GMT" or "60"
Server         "Microsoft-IIS/5.0"
Vary            "Date"
WWW-Authenticate [challenge]
实体头字D?/strong>
实体头字D可以用于请求消息或响应消息。实体头字段中包含消息实体正文的有关信息Q如使用的编码格式?/font>
名称            CZ?
Allow              "GET, HEAD"
Content-Encoding   "gzip"
Content-Language  "en"
Content-Length     "8445"
Content-Location   "http://localhost/page.asp"
Content-MD5       [md5-digest]
Content-Range     "bytes 2543-4532/7898"
Content-Type      "text/html"
Expires           "Tue, 11 Jul 2000 18:23:51 GMT"
Last-Modified      "Tue, 11 Jul 2000 18:23:51 GMT"
>>实体头字D늚具体含义
Allow 服务器支持哪些请求方法(如GET、POST{)?br /> Content-Encoding 文档的编码(EncodeQ方法。只有在解码之后才可以得到Content-Type头指定的内容cd。利用gzip压羃文能够显著地减HTML文档 的下载时间。Java的GZIPOutputStream可以很方便地q行gzip压羃Q但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它?br /> Content-Length 表示内容长度。只有当览器用持久HTTPq接时才需要这个数据?br /> Content-Type 表示后面的文属于什么MIMEcd。Servlet默认为text/plainQ但通常需要显式地指定为text/html?br /> Date 当前的GMT旉。你可以用setDateHeader来设|这个头以避免{换时间格式的ȝ?
Expires 应该在什么时候认为文已l过期,从而不再缓存它Q?
Last-Modified 文的最后改动时间。客户可以通过If-Modified-Sinceh头提供一个日期,该请求将被视Z个条件GETQ只有改动时间迟于指定时间的文档才会q回Q否则返回一?04QNot ModifiedQ状态?br /> Location 表示客户应当到哪里去提取文。Location通常不是直接讄的,而是通过HttpServletResponse的sendRedirectҎQ该Ҏ同时讄状态代码ؓ302?
Refresh 表示览器应该在多少旉之后h文Q以U计。除了刷新当前文之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器d指定的页面?
?意这U功能通常是通过讄HTML面HEAD区的QMETA HTTP-EQUIV="Refresh" CQ实玎ͼq是因ؓQ自动刷新或重定向对于那些不能用CGI或Servlet的HTML~写者十分重要。但是,对于Servlet来说Q直接设|?Refresh头更加方ѝ?
注意Refresh的意义是“NU之后刷新本面或访问指定页?#8221;Q而不?#8220;每隔NU刷新本面或访问指定页?”。因此,q箋h要求每次都发送一个Refresh_而发?04状态代码则可以L览器l刷斎ͼ不管是用Refresh头还是<META HTTP-EQUIV="Refresh" ...Q?
注意Refresh头不属于HTTP 1.1正式规范的一部分Q而是一个扩展,但Netscape和IE都支持它?
h头示?/strong>
以下?HTTP h的简单示例?br /> GET /articles/news/today.asp HTTP/1.1
Accept: */*
Accept-Language: en-us
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/links.asp
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Accept-Encoding: gzip, deflate
该请求具有请求行Q其中包括方?(GET)、资源\?(/articles/news/today.asp) ?HTTP 版本 (HTTP/1.1)。由于该h没有正文Q故所有请求行后面的内定w是头的一部分。紧接着头之后是一个空行,表示头已l束?br /> 响应头示?/strong>
Web 服务器可以通过多种方式响应前一个请求。假设文件是可以讉K的,q且用户h查看该文件的权限Q则响应cM于:
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Thu, 13 Jul 2000 05:46:53 GMT
Content-Length: 2291
Content-Type: text/html
Set-Cookie: ASPSESSIONIDQQGGGNCG=LKLDFFKCINFLDMFHCBCBMFLJ; path=/
Cache-control: private
...
响应的第一行称为状态行。它包含响应所用的 HTTP 版本、状态编?(200) 和原因短语。示例中包含一个头Q其中具有五个字D,接着是一个空行(回R和换行符Q,然后是响应正文的头两行?

persister 2009-08-03 21:35 发表评论
]]>
html中的meta信息http://www.tkk7.com/persister/archive/2009/07/06/285653.htmlpersisterpersisterMon, 06 Jul 2009 03:14:00 GMThttp://www.tkk7.com/persister/archive/2009/07/06/285653.htmlhttp://www.tkk7.com/persister/comments/285653.htmlhttp://www.tkk7.com/persister/archive/2009/07/06/285653.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/285653.htmlhttp://www.tkk7.com/persister/services/trackbacks/285653.html常见形式Q?lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312">

<meta http-equiv="Refresh" content="n;url">
n -- 隔nU钟
url -- 转此地址

例如:
<META HTTP-EQUIV="refresh" content="2;URL=http://www.baidu.com/">
2U钟后刷?-转百度的首页.

persister 2009-07-06 11:14 发表评论
]]>
Tomcat处理h程的源代码研究http://www.tkk7.com/persister/archive/2009/06/26/284275.htmlpersisterpersisterFri, 26 Jun 2009 06:48:00 GMThttp://www.tkk7.com/persister/archive/2009/06/26/284275.htmlhttp://www.tkk7.com/persister/comments/284275.htmlhttp://www.tkk7.com/persister/archive/2009/06/26/284275.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/284275.htmlhttp://www.tkk7.com/persister/services/trackbacks/284275.html阅读全文

persister 2009-06-26 14:48 发表评论
]]>
portal相关资料http://www.tkk7.com/persister/archive/2009/06/21/283429.htmlpersisterpersisterSun, 21 Jun 2009 00:40:00 GMThttp://www.tkk7.com/persister/archive/2009/06/21/283429.htmlhttp://www.tkk7.com/persister/comments/283429.htmlhttp://www.tkk7.com/persister/archive/2009/06/21/283429.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/283429.htmlhttp://www.tkk7.com/persister/services/trackbacks/283429.html
2.http://blog.csdn.net/daigua245/archive/2009/05/13/4178182.aspx  全面介绍liferay的安装和定制

3.http://www.kuailan.com/

4.http://www.yaawa.com/

5.http://www.google.cn/

6.http://www.netvibes.com/ q个功能很强?br />  
7.http://www.javaeye.com/topic/7005 单介lportal原理

8.http://www.ibm.com/developerworks/cn/java/j-pluto/      Apache Pluto 构徏和测?JSR 168 兼容?portlets

9.http://www.tkk7.com/patrick/archive/2006/02/23/32098.html portal比较

persister 2009-06-21 08:40 发表评论
]]>
Tomcat启动源代码分?/title><link>http://www.tkk7.com/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.tkk7.com/persister/archive/2009/06/17/282875.html</guid><wfw:comment>http://www.tkk7.com/persister/comments/282875.html</wfw:comment><comments>http://www.tkk7.com/persister/archive/2009/06/17/282875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/persister/comments/commentRss/282875.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/persister/services/trackbacks/282875.html</trackback:ping><description><![CDATA[Tomcat的源码研L么说都是一件恐怖的事情Q代码太多!不过中HvQ也可偶ؓ之。谁让我好读书,不求甚解呢。前面对嵌入式TomcatQTomcat 4.0Q进行了一个简单的分析Q见<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.javaQTomcat的启动程序是Bootstrap.java。OFBiz的Start.java做的事情最主要的就是加载相应的lib库和启动tomcat及其component。Tomcat的Bootstrap也是加蝲相应的lib库和启动Catalina<br /> 的processҎ。Lib库放|在commonQserver和share目录中?br /> <br /> 2、Catalina.java。这个类主要研究startҎQ核心代码如下:<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;"> 1</span> <span style="color: #000000;"> Digester digester </span><span style="color: #000000;">=</span><span style="color: #000000;"> createStartDigester();<br /> </span><span style="color: #008080;"> 2</span> <span style="color: #000000;">        File file </span><span style="color: #000000;">=</span><span style="color: #000000;"> configFile();<br /> </span><span style="color: #008080;"> 3</span> <span style="color: #000000;">        </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br /> </span><span style="color: #008080;"> 4</span> <span style="color: #000000;">            InputSource is </span><span style="color: #000000;">=</span><span style="color: #000000;"><br /> </span><span style="color: #008080;"> 5</span> <span style="color: #000000;">                </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> InputSource(</span><span style="color: #000000;">"</span><span style="color: #000000;">file://</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> file.getAbsolutePath());<br /> </span><span style="color: #008080;"> 6</span> <span style="color: #000000;">            FileInputStream fis </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> FileInputStream(file);<br /> </span><span style="color: #008080;"> 7</span> <span style="color: #000000;">            is.setByteStream(fis);<br /> </span><span style="color: #008080;"> 8</span> <span style="color: #000000;">            digester.push(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br /> </span><span style="color: #008080;"> 9</span> <span style="color: #000000;">            digester.parse(is);<br /> </span><span style="color: #008080;">10</span> <span style="color: #000000;">            fis.close();<br /> </span><span style="color: #008080;">11</span> <span style="color: #000000;">        } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {<br /> </span><span style="color: #008080;">12</span> <span style="color: #000000;">            System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Catalina.start using </span><span style="color: #000000;">"</span><span style="color: #000000;"><br /> </span><span style="color: #008080;">13</span> <span style="color: #000000;">                               </span><span style="color: #000000;">+</span><span style="color: #000000;"> configFile() </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> e);<br /> </span><span style="color: #008080;">14</span> <span style="color: #000000;">            e.printStackTrace(System.out);<br /> </span><span style="color: #008080;">15</span> <span style="color: #000000;">            System.exit(</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br /> </span><span style="color: #008080;">16</span> <span style="color: #000000;">        }</span></div> <br /> 主要是解析server.xml文gQ采用的<a >Digester</a>Q非常著名的xml解析器。通过解析的源代码分析QTomcatEngineQHost和Context当成ContainerQ这是一个虚拟的概念Q具体的容器都实CContainer, Lifecycle接口。所以Service不是直接引用一个EngineQ而是一个Container?a id="viewpost1_TitleUrl" href="../../persister/archive/2009/03/28/262533.html">在应用中使用嵌入式Tomcat</a>的tomcat实现l构图中都是盔R层次之间都是双向引用的,如Service引用上面的Serverq有下的Connector和Container。大致类囑֦下:<br /> <br /> <img alt="" src="http://www.tkk7.com/images/blogjava_net/persister/container1.JPG" width="661" height="417" /><br /> Digester解析server.xml是这些实例初始化q且配置好相互的引用关系。Connector通过Container的invokeҎ接受到了请求交lContainer最高层Engine处理Q?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, response);</span></div> <br /> <br /> 接下来就是初始化q启动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;">        </span><span style="color: #008000;">//</span><span style="color: #008000;"> Start the new server</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (server </span><span style="color: #0000ff;">instanceof</span><span style="color: #000000;"> Lifecycle) {<br />             </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br />                 server.initialize();<br />                 ((Lifecycle) server).start();<br />                 </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br />                     </span><span style="color: #008000;">//</span><span style="color: #008000;"> Register shutdown hook</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">                    Runtime.getRuntime().addShutdownHook(shutdownHook);<br />                 } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Throwable t) {<br />                     </span><span style="color: #008000;">//</span><span style="color: #008000;"> This will fail on JDK 1.2. Ignoring, as Tomcat can run<br />                     </span><span style="color: #008000;">//</span><span style="color: #008000;"> fine without the shutdown hook.</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">                }<br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> Wait for the server to be told to shut down</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">                server.await();<br />             } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (LifecycleException e) {<br />                 System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Catalina.start: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> e);<br />                 e.printStackTrace(System.out);<br />                 </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (e.getThrowable() </span><span style="color: #000000;">!=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">) {<br />                     System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">----- Root Cause -----</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />                     e.getThrowable().printStackTrace(System.out);<br />                 }<br />             }<br />         }</span></div> <br /> server的初始化最l就是将connectorq行初始化:<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 />     </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />      * Initialize this connector (create ServerSocket here!)<br />      </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> initialize()<br />         </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> LifecycleException {<br /> <br />         </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (initialized)<br />             </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> LifecycleException<br />                 (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 />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.initialized </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br /> <br />         </span><span style="color: #0000ff;">if</span><span style="color: #000000;">( oname </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">&&</span><span style="color: #000000;"> (container </span><span style="color: #0000ff;">instanceof</span><span style="color: #000000;"> StandardEngine)) {<br />             </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> we are loaded directly, via API - and no name was given to us</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">                StandardEngine cb</span><span style="color: #000000;">=</span><span style="color: #000000;">(StandardEngine)container;<br />                 oname </span><span style="color: #000000;">=</span><span style="color: #000000;"> createObjectName(cb.getName(), </span><span style="color: #000000;">"</span><span style="color: #000000;">Connector</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />                 Registry.getRegistry(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">, </span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />                     .registerComponent(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">, oname, </span><span style="color: #0000ff;">null</span><span style="color: #000000;">);<br />             } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {<br />                 log (</span><span style="color: #000000;">"</span><span style="color: #000000;">Error registering connector </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> e.toString());<br />             }<br />             </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(debug </span><span style="color: #000000;">></span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">)<br />                 log(</span><span style="color: #000000;">"</span><span style="color: #000000;">Creating name for connector </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> oname);<br />         }<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> Initialize adapter</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        adapter </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> CoyoteAdapter(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br /> <br />         protocolHandler.setAdapter(adapter);<br /> <br />         IntrospectionUtils.setProperty(protocolHandler, </span><span style="color: #000000;">"</span><span style="color: #000000;">jkHome</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />                                        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 />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> Configure secure socket factory</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (factory </span><span style="color: #0000ff;">instanceof</span><span style="color: #000000;"> CoyoteServerSocketFactory) {<br />             IntrospectionUtils.setProperty(protocolHandler, </span><span style="color: #000000;">"</span><span style="color: #000000;">secure</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />                                            </span><span style="color: #000000;">""</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />             CoyoteServerSocketFactory ssf </span><span style="color: #000000;">=</span><span style="color: #000000;"><br />                 (CoyoteServerSocketFactory) factory;<br />             IntrospectionUtils.setProperty(protocolHandler, </span><span style="color: #000000;">"</span><span style="color: #000000;">algorithm</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />                                            ssf.getAlgorithm());<br />             IntrospectionUtils.setProperty(protocolHandler, </span><span style="color: #000000;">"</span><span style="color: #000000;">ciphers</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />                                            ssf.getCiphers());<br />             IntrospectionUtils.setProperty(protocolHandler, </span><span style="color: #000000;">"</span><span style="color: #000000;">clientauth</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />                                            ssf.getClientAuth());<br />             IntrospectionUtils.setProperty(protocolHandler, </span><span style="color: #000000;">"</span><span style="color: #000000;">keystore</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />                                            ssf.getKeystoreFile());<br />             IntrospectionUtils.setProperty(protocolHandler, </span><span style="color: #000000;">"</span><span style="color: #000000;">randomfile</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />                                            ssf.getRandomFile());<br />             IntrospectionUtils.setProperty(protocolHandler, </span><span style="color: #000000;">"</span><span style="color: #000000;">rootfile</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />                                            ssf.getRootFile());<br /> <br />             IntrospectionUtils.setProperty(protocolHandler, </span><span style="color: #000000;">"</span><span style="color: #000000;">keypass</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />                                            ssf.getKeystorePass());<br />             IntrospectionUtils.setProperty(protocolHandler, </span><span style="color: #000000;">"</span><span style="color: #000000;">keytype</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />                                            ssf.getKeystoreType());<br />             IntrospectionUtils.setProperty(protocolHandler, </span><span style="color: #000000;">"</span><span style="color: #000000;">protocol</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />                                            ssf.getProtocol());<br />             IntrospectionUtils.setProperty(protocolHandler,<br />                                            </span><span style="color: #000000;">"</span><span style="color: #000000;">sSLImplementation</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br />                                            ssf.getSSLImplementation());<br />         }<br /> <br />         </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br />             protocolHandler.init();<br />         } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {<br />             </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> LifecycleException<br />                 (sm.getString<br />                  (</span><span style="color: #000000;">"</span><span style="color: #000000;">coyoteConnector.protocolHandlerInitializationFailed</span><span style="color: #000000;">"</span><span style="color: #000000;">, e));<br />         }<br />     }</span></div> <br /> Protocol Handler初始化会初始化PoolTcpEndPointQ这个时候就会启动Tomcat的端口了Q?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;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> initEndpoint() </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> IOException, InstantiationException {<br />         </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br />             </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 />                 factory</span><span style="color: #000000;">=</span><span style="color: #000000;">ServerSocketFactory.getDefault();<br />             </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;">) {<br />                 </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br />                     </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (inet </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">) {<br />                         serverSocket </span><span style="color: #000000;">=</span><span style="color: #000000;"> factory.createSocket(port, backlog);<br />                     } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {<br />                         serverSocket </span><span style="color: #000000;">=</span><span style="color: #000000;"> factory.createSocket(port, backlog, inet);<br />                     }<br />                 } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> ( BindException be ) {<br />                     </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> BindException(be.getMessage() </span><span style="color: #000000;">+</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">:</span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> port);<br />                 }<br />             }<br />             </span><span style="color: #0000ff;">if</span><span style="color: #000000;">( serverTimeout </span><span style="color: #000000;">>=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;"> )<br />                 serverSocket.setSoTimeout( serverTimeout );<br />         } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;">( IOException ex ) {<br />             </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> ex;<br />         } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;">( InstantiationException ex1 ) {<br />             </span><span style="color: #0000ff;">throw</span><span style="color: #000000;"> ex1;<br />         }<br />         initialized </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />     }</span></div> <br /> 初始化后整个tomcat做好准备启动,q时q不能处理客L的请求,必须启动相关容器。与初始化相比,启动的时候同时启动Container和Connector。Container的启动会Engine,Host和Conext都启动v来?br /> <br /> Connector启动的时候就会启动PoolTcpEndPointQ看看它的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;">    </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />      * The background thread that listens for incoming TCP/IP connections and<br />      * hands them off to an appropriate processor.<br />      </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> Loop until we receive a shutdown command</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (running) {<br /> <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> Loop if endpoint is paused</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">            </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (paused) {<br />                 </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br />                     Thread.sleep(</span><span style="color: #000000;">1000</span><span style="color: #000000;">);<br />                 } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) {<br />                     </span><span style="color: #008000;">//</span><span style="color: #008000;"> Ignore</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">                }<br />             }<br /> <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> Allocate a new worker thread</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">            MasterSlaveWorkerThread workerThread </span><span style="color: #000000;">=</span><span style="color: #000000;"> createWorkerThread();<br />             </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (workerThread </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;">) {<br />                 </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br />                     </span><span style="color: #008000;">//</span><span style="color: #008000;"> Wait a little for load to go down: as a result, <br />                     </span><span style="color: #008000;">//</span><span style="color: #008000;"> no accept will be made until the concurrency is<br />                     </span><span style="color: #008000;">//</span><span style="color: #008000;"> lower than the specified maxThreads, and current<br />                     </span><span style="color: #008000;">//</span><span style="color: #008000;"> connections will wait for a little bit instead of<br />                     </span><span style="color: #008000;">//</span><span style="color: #008000;"> failing right away.</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">                    Thread.sleep(</span><span style="color: #000000;">100</span><span style="color: #000000;">);<br />                 } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) {<br />                     </span><span style="color: #008000;">//</span><span style="color: #008000;"> Ignore</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">                }<br />                 </span><span style="color: #0000ff;">continue</span><span style="color: #000000;">;<br />             }<br />             <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> Accept the next incoming connection from the server socket</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">            Socket socket </span><span style="color: #000000;">=</span><span style="color: #000000;"> acceptSocket();<br /> <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> Hand this socket off to an appropriate processor</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">            workerThread.assign(socket);<br /> <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> The processor will recycle itself when it finishes</span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br />         }<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> Notify the threadStop() method that we have shut ourselves down</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        </span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;"> (threadSync) {<br />             threadSync.notifyAll();<br />         }<br /> <br />     }</span></div> <br /> <span style="color: #000000;">MasterSlaveWorkerThread默认最大线E数?0QTomcat优化时可以设|此U程敎ͼ?/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 PatternQ如果有新的Socket分配Q那么进行处理,available作ؓ警戒条gQ?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;">    </span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> assign(Socket socket) {<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> Wait for the Processor to get the previous Socket</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (available) {<br />             </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br />                 wait();<br />             } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) {<br />             }<br />         }<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> Store the newly available Socket and notify our thread</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.socket </span><span style="color: #000000;">=</span><span style="color: #000000;"> socket;<br />         available </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br />         notifyAll();<br /> <br />     }<br /> <br />     <br />     </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />      * Await a newly assigned Socket from our Connector, or <code>null</code><br />      * if we are supposed to shut down.<br />      </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;"> Socket await() {<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> Wait for the Connector to provide a new Socket</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (</span><span style="color: #000000;">!</span><span style="color: #000000;">available) {<br />             </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br />                 wait();<br />             } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (InterruptedException e) {<br />             }<br />         }<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> Notify the Connector that we have received this Socket</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        Socket socket </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.socket;<br />         available </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br />         notifyAll();<br /> <br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> (socket);<br /> <br />     }<br /> <br /> </span>    public void run() {<br /> <br />         // Process requests until we receive a shutdown signal<br />         while (!stopped) {<br /> <br />             // Wait for the next socket to be assigned<br />             Socket socket = await();<br />             if (socket == null)<br />                 continue;<br /> <br />             // Process the request from this socket<br />             endpoint.processSocket(socket, con, threadData);<br /> <br />             // Finish up this request<br />             endpoint.recycleWorkerThread(this);<br /> <br />         }<br /> <br />         // Tell threadStop() we have shut ourselves down successfully<br />         synchronized (threadSync) {<br />             threadSync.notifyAll();<br />         }<br /> <br />     }<br /> <br /> </div> <br /> <br /> 下面一q图有助理解QTomcath客户端情늚具体分析后面再分析?br /> <br /> <img alt="" src="http://www.tkk7.com/images/blogjava_net/persister/tcphandler.JPG" width="509" height="370" /><br /> <br /> <br /> <br /> <br /> <img src ="http://www.tkk7.com/persister/aggbug/282875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/persister/" target="_blank">persister</a> 2009-06-17 16:54 <a href="http://www.tkk7.com/persister/archive/2009/06/17/282875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FreeMarker的培训及projecthttp://www.tkk7.com/persister/archive/2009/06/16/282642.htmlpersisterpersisterTue, 16 Jun 2009 09:21:00 GMThttp://www.tkk7.com/persister/archive/2009/06/16/282642.htmlhttp://www.tkk7.com/persister/comments/282642.htmlhttp://www.tkk7.com/persister/archive/2009/06/16/282642.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/282642.htmlhttp://www.tkk7.com/persister/services/trackbacks/282642.html
http://www.tkk7.com/Files/persister/FreeMarker.rar


persister 2009-06-16 17:21 发表评论
]]>
在应用中使用嵌入式Tomcathttp://www.tkk7.com/persister/archive/2009/03/28/262533.htmlpersisterpersisterFri, 27 Mar 2009 16:38:00 GMThttp://www.tkk7.com/persister/archive/2009/03/28/262533.htmlhttp://www.tkk7.com/persister/comments/262533.htmlhttp://www.tkk7.com/persister/archive/2009/03/28/262533.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/262533.htmlhttp://www.tkk7.com/persister/services/trackbacks/262533.htmlTomcat5中的Embeded版本Qؓ应用中集成完整的Web服务提供了尽可能大的I间Q不仅开发者容易获得对标准HTTP的处理,q有SSL的通讯处理Q开发者很Ҏ可以对原有非Webpȝq行扩展以支持瘦客户端应用,通向Web大门的钥匙已l放在这里,剩下的就是看你怎样来发挥了?/font>

Tomcat严格意义上不是一个真正的AppServerQ只是支持运行Servlet和Jsp的Web容器Q此外扩展了一些AppServer的功能,如数据库q接池,JNDI{,如何提炼Q或者说把Tomcat整理成一个最的集合成ؓTomcat嵌入版本的关键,从Tomcat5.0开始提供和支持Embeded版本Q即最化Tomcat ServerQ下面就针对Tomcat Server的Embeded版本q行介绍Q怎样把Tomcat集成到Java应用中?/font>

首先可以?a >http://apache.mirrors.versehost.com/jakarta/tomcat-5/v5.0.28/bin/jakarta-tomcat-5.0.28-embed.tar.gz下蝲Tomcat的Embeded版本Q下载解压后把最里层的jakarta-tomcat-5.0.28-embed目录copy到容易查扄目录Qؓ易需要更名ؓtomcat-embedQ作为嵌入Tomcat的工作目录?/font>

首先我们需要了解Tomcat在工作时的层ơ情况,它按照:

上面是Tomcat实现的内部工作结构:

一个Server含有几个ConnectorQ比?/font>non-SSL HTTP/1.1 Connector on port 8080QSSL HTTP/1.1 Connector on port 8443和AJP 1.3 Connector on port 8009。连接器是接受客户端情늄后封装成request和response对象交给容器处理?/p>

通常是一个EngineQ其中Engine里含?个HostQ?个Host 内可以含有多个ContextQContext代表Web应用Q即1个Host里可以包含多个Web应用Qtomcat的webapps目录里面防止的就是一个个web应用。Engine接收Service发过来的hQ通过ConnectorQ,交给相应的Hostq行处理Q然后Host交给具体的Context?/font>

下面是非常简单的创徏Embeded tomcat的例子,C意其?br />

把tomcat-embed目录下的lib内的所有jar包引入到目的环境中Q即完成了项目的环境搭徏。在应用里开发嵌入式TomcatQ需要根据以下步骤:
1Q创建org.apache.catalina.startup.Embedded实例Q其代表嵌入式Tomcat Server的实例;
2Q创建org.apache.catalina.Engine 实例Q代表上面XMLl构CZ中的EngineQ作为容器用来包含Host节点Q?br /> 3Q创建org.apache.catalina.Host实例Q代表虚拟主机服务,把它加入?Q中产生的EngineQ?br /> 4Q创Z个或多个org.apache.catalina.Context实例Q代表Web应用Q每个Web应用都需要加入到3Q生的Host中;
5Q最后创建org.apache.catalina.Connector实例Q把它加?Q创建的tomcat实例中,它用来接收客户发出的h?/font>

具体和完整的代码如下Q?br /> import java.io.File;
import java.net.InetAddress;
import java.net.UnknownHostException;

import org.apache.catalina.Context;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
import org.apache.catalina.Logger;
import org.apache.catalina.startup.Embedded;


public class TomcatService {
public static void main(String[] args) {
   //讄Tomcat的工作目录,q启动Tomcat Server
   String path = "/usr/local/tomcat-embed";
   Embedded tc = createTomcat(path);
   try {
    tc.start();
    System.out.println("---------- Tomcat Server start over. ------------");
   } catch (Exception e) {
    e.printStackTrace();
   }  
}

private static Embedded createTomcat(String path) {
     //创徏嵌入式Tomcat Server的实?br />    Embedded tomcat = new Embedded();
        //讄Tomcat的工作目?br />    tomcat.setCatalinaHome(path);
        //产生Tomcat引擎
   Engine engine = tomcat.createEngine();
   engine.setName("EmbededServer");
   //创徏HostQ设|Host的工作目?br />    Host host = tomcat.createHost("localhost", tomcat.getCatalinaHome()
     + "/webapps");
        //把Host加入Engine
   engine.addChild(host);
   engine.setDefaultHost(host.getName());
  
   String path = host.getAppBase() + "/instance1";
   if (!new File(path).exists()) {
    System.err.println("h查instance1应用的目录以及相兌源是否存?");
    return null;
   }
   //创徏instance1的ContextQƈ加入Host?br />    Context ctxt = tomcat.createContext("/instance1", path);
   host.addChild(ctxt);
  
   tomcat.addEngine(engine);
   tomcat.setDebug(Logger.WARNING);
   try {
      //Tomcat加入ConnectorQ监听本圎ͼ127.0.0.1Q的讉K
    tomcat.addConnector(tomcat.createConnector(InetAddress
      .getByName("127.0.0.1"), 8080, false));
   } catch (UnknownHostException e) {
    System.err.println("l定Tomcat Server?27.0.0.1:8080p|Q请查端口是否被占用.");
    e.printStackTrace();
    tomcat = null;
   }
   return tomcat;
}
}

在这里需要注意,׃嵌入式版本Tomcat没有common/lib目录Q一些需要的Jar包可以复制到JDK?jre/lib/endorsed目录下进行用?/font>


在OFBiz中默认用的embeded tomcatQ具体的可以参考里面对于嵌入式启动相关的内宏V?/font>

persister 2009-03-28 00:38 发表评论
]]>
apache的安装和perl试http://www.tkk7.com/persister/archive/2009/03/16/259958.htmlpersisterpersisterMon, 16 Mar 2009 02:54:00 GMThttp://www.tkk7.com/persister/archive/2009/03/16/259958.htmlhttp://www.tkk7.com/persister/comments/259958.htmlhttp://www.tkk7.com/persister/archive/2009/03/16/259958.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/259958.htmlhttp://www.tkk7.com/persister/services/trackbacks/259958.html 2. 下蝲后的文g形式是httpd-2.2.11.tar.gz.
    1)利用命otar xvfz *.tar.gzapache解压.
    2)cd httpd-2.2.11    3)利用./configure --help查看帮助信息,看看需要配|哪些选项.׃我要装mysql和php,所以选择了以?br />         几个选项:./configure --prefix=/usr/local/apache2 --enable-rewrite   --with-mpm=worker  --enable-so
        最后一个很重要,如果要装php,一定要?前面两个不是必需?<如果不明白选项的含?去google.>
    4)make
    5)make install
3. 启动ApacheQ?br />     #cd /usr/local/apache2/bin
    #./apachectl start

   停掉apache?br />     #cd /usr/local/apache2/bin
    #./apachectl stop
4.试安装是否成功Q浏览器输入http://localhost, 面昄it worksQ表明apache安装成功.
5.试perl.文g为cgitest.pl,攑֜/usr/local/apache2/cgi-bin目录中,q且chmod a+x cgitest.pl使其可执?br /> Q?/p>     #!/usr/bin/perl -w

    use CGI;
    {
        my $q = new CGI;
        print $q->header(),
        $q->start_html("hello,perl"),
        $q->h1('hello perl'),
        $q->end_html();
    }
6.在浏览器中输入:http://localhost/cgi-bin/cgitest.pl 卛_看到hello perl?br />
7.自定义文件存放位|:
    # ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
    # ScriptAlias /cgi/ "/usr/local/www/"
      ScriptAlias / "/usr/local/www/"
 
  #<Directory "/usr/local/apache2/cgi-bin">
  <Directory "/usr/local/www">
q样可以将|页文g存放?usr/local/www目录
讉K的时候:http://localhost/cgitest.pl 卛_?nbsp;

persister 2009-03-16 10:54 发表评论
]]>
Tomcat优化Ҏhttp://www.tkk7.com/persister/archive/2008/12/20/247497.htmlpersisterpersisterSat, 20 Dec 2008 09:02:00 GMThttp://www.tkk7.com/persister/archive/2008/12/20/247497.htmlhttp://www.tkk7.com/persister/comments/247497.htmlhttp://www.tkk7.com/persister/archive/2008/12/20/247497.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/247497.htmlhttp://www.tkk7.com/persister/services/trackbacks/247497.html
1、JDK内存优化
Tomcat默认可以使用的内存ؓ128MB
Unix配置位置
{tomcat_home}/bin/catalina.sh
JAVA_OPTS='-Xms[初始化内存大] -Xmx[可以使用的最大内存]
{tomcat_home}/bin/startup.sh
JAVA_OPTS='-Xms128m -Xmx1256m -Djava.awt.headless=true'; export JAVA_OPTS
vi /etc/profile
export JAVA_OPTS=”$JAVA_OPTS -Xms[初始化内存大] -Xmx[可以使用的最大内存]”
讄|
一般说来,你应该用物理内存的 80% 作ؓ堆大?br /> 如果本机上有Apache服务器,可以先折Apache需要的内存Q然后修改堆大小。徏议设|ؓ70Q;
讄[[初始化内存大]{于[可以使用的最大内存]Q这样可以减^凡分配堆而降低性能?br />
2、精应用和配|文?/strong>
删除不需要的理应用和帮助应用,提高tomcat安全性?br /> 删除webapps下所有文?br /> rm –fr $CATALINA_HOME/webapps/*
删除server/webapps下所有文?br /> rm –fr $CATALINA_HOME/server/webapps/*
_sever.xml配置文g
使用tomcat发布版本中的最配|文Ӟ提高性能Q如果有功能上的需求,在逐个的加入功能配|?br /> 备䆾 mv server.xml server_default.xml
复制 cp server-minimal.xml server.xml

3、连接器优化
?CATALINA_HOME/conf/server.xml配置文g中的Connetctor节点Q和q接数相关的参数配置和优化?br /> maxThreads
Tomcat使用U程来处理接收的每个h。这个DCTomcat可创建的最大的U程数。默认?00?可以Ҏ机器的时期性能和内存大调_一般可以在400-500。最大可以在800左右?br /> acceptCount
指定当所有可以用的处理h的线E数都被使用Ӟ可以攑ֈ处理队列中的h敎ͼ过q个数的h不予处理。默认?0?
minSpareThreads
Tomcat初始化时创徏的线E数。默认??
maxSpareThreads
一旦创建的U程过q个|Tomcat׃关闭不再需要的socketU程。默认?0?
enableLookups
是否反查域名Q默认gؓtrue。ؓ了提高处理能力,应设|ؓfalse
connnectionTimeout
|络q接时Q默认?0000Q单位:毫秒。设|ؓ0表示怸时Q这栯|有隐患的。通常可设|ؓ30000毫秒?br /> maxKeepAliveRequests
保持h数量Q默认?00?
bufferSize
输入缓冲大,默认?048 bytes?
compression
压羃传输Q取值on/off/forceQ默认值off?br /> 其中和最大连接数相关的参CؓmaxThreads和acceptCount。如果要加大q发q接敎ͼ应同时加大这两个参数。web server允许的最大连接数q受制于操作pȝ的内核参数设|,通常Windows?000个左叻ILinux?000个左叟?

4、启用Tomcat压羃(HTTP压羃)功能
HTTP 压羃可以大大提高览|站的速度Q现在流行的览器都是支持的Q包?IE、FireFox、Opera {?br /> 压羃对象
寚w态对象:相对于普通的览q程HTML ,CSS,Javascript , Text Q它可以节省40%左右的流量。更为重要的是对动态生成的Q包括CGI、PHP , JSP , ASP , Servlet,SHTML{输出的|页也能q行压羃Q压~效率惊人?br />
<Connector port="80" maxHttpHeaderSize="8192"   maxThreads="150" minSpareThreads="25"
 maxSpareThreads
="75" enableLookups="false" redirectPort="8443" acceptCount="100"  connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="utf-8" compression="on"  compressionMinSize="2048"      noCompressionUserAgents="gozilla, traviata" 
compressableMimeType
="text/html,text/xml,text/javascript,text/css,text/plain"  />       
  
1) compression="on" 打开压羃功能 2) compressionMinSize="2048" 启用压羃的输出内容大,q里面默认ؓ2KB 3) noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器Q不启用压羃 4) compressableMimeType="text/html,text/xml" 压羃cd


persister 2008-12-20 17:02 发表评论
]]>
Webwork源代码学?/title><link>http://www.tkk7.com/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.tkk7.com/persister/archive/2008/12/18/247169.html</guid><wfw:comment>http://www.tkk7.com/persister/comments/247169.html</wfw:comment><comments>http://www.tkk7.com/persister/archive/2008/12/18/247169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/persister/comments/commentRss/247169.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/persister/services/trackbacks/247169.html</trackback:ping><description><![CDATA[q几天研I了一下Webwork的源代码Q具体的代码׃贴了Q基本就是研IServletDispatcher及其相关cR相对于Struts1.3Q?a href="http://www.tkk7.com/persister/archive/2007/09/26/148379.html">见前面的源代码研I?/a>Q。Webwork有几点做得非怸错,具体如下Q?br /> <br /> 1、Struts采用DTO模式Q需要配|大量的formQ这个非常的不方便,而Webwork的Action驱动模式Model-Driven或者Property-Driven显得非常的方便Q减了配置Q理解v来也更加单?br /> <br /> 2、Action的不同。Struts中Action是直接获取request和response对象Q将Servlet API和Action紧密的耦合在一P然而Webworkservlet里面的东襉K过map装hQ放在map里面传进传去Q方便^C间的ULQ而且很显Ӟ单元试更加方便了。Struts中实现的Action必须l承Struts的Actionc,而Webwork只需要实现Action接口。Struts中只实例化一个Action实例处理所有的hQ需要考虑thread safe问题Q而WebworkҎ个请求实例化一个Actionq行处理Q不必担心线E安全的问题?br /> <br /> 3、WebworkFilter的用发挥到了极致。我们开发Struts应用是也l常使用一些FilterQ比如进行字W{换或者权限管理等Q通过路径配置使其h都经qFilter的处理。而WebworkFilter的地位提升到了和Action一LCQ基于每一个Action都可以采用默认的Filter或者自定义配置Filter或Filter StackQ通过Filter完成部分框架的功能?br /> <br /> 4、丰富的View层。相对于Struts1.3只用JSP相比QWebwork的灵zL大得多Q通过result-type的配|,Webwork的展现层可以使用FreeMarkerQVelocity,XSLT{?br /> <br /> 上面的这些设计思想非常值得借鉴?br /> <br /> <img src ="http://www.tkk7.com/persister/aggbug/247169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/persister/" target="_blank">persister</a> 2008-12-18 17:12 <a href="http://www.tkk7.com/persister/archive/2008/12/18/247169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts1.3源代码学习ȝhttp://www.tkk7.com/persister/archive/2007/09/26/148379.htmlpersisterpersisterWed, 26 Sep 2007 08:59:00 GMThttp://www.tkk7.com/persister/archive/2007/09/26/148379.htmlhttp://www.tkk7.com/persister/comments/148379.htmlhttp://www.tkk7.com/persister/archive/2007/09/26/148379.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/148379.htmlhttp://www.tkk7.com/persister/services/trackbacks/148379.html阅读全文

persister 2007-09-26 16:59 发表评论
]]>
JSTL标签用法ȝhttp://www.tkk7.com/persister/archive/2007/07/31/133532.htmlpersisterpersisterTue, 31 Jul 2007 03:26:00 GMThttp://www.tkk7.com/persister/archive/2007/07/31/133532.htmlhttp://www.tkk7.com/persister/comments/133532.htmlhttp://www.tkk7.com/persister/archive/2007/07/31/133532.html#Feedback0http://www.tkk7.com/persister/comments/commentRss/133532.htmlhttp://www.tkk7.com/persister/services/trackbacks/133532.htmlJSP 标准标记库( Standard Tag Library Q?JSTL) 是一l以标准化格式实现许多通用?Web 站点功能的定制标记?/p>

JSP 技术的优势之一在于其定制标记库工具。除了核?JSP 标记Q如 jsp:include 之外Q定制标记库工具使您能够创徏唯一的标记来描述以站Ҏ应用E序为导向的操作。一旦您创徏了定制标记库 ( U?taglib) Q当您扩展项目或转向另一个项目时您可以重复用这些标记?/p>

JSTL 的目标是Z?JSP 面的设计。对于页面设计h员来_使用脚本语言Q默认值是 JAVA 语言Q操作动态数据是比较困难的,而采用标{֒表达式语a相对Ҏ一些, JSTL 的用ؓ面设计人员和程序开发h员的分工协作提供了便利?/p>

一Q?strong> 配置 JSTL

包括两个 JAR 文gQ?jstl.jar ?standard.jar 。原文引入:

<%@ taglib prefix="c" uri="

<%@ taglib prefix="sql" uri="

<%@ taglib prefix="fmt" uri="

二. Core 标签?/strong>

Core 标签库主要包括了一般用途的标签、条件标{、P代标{֒ URL 相关的标{。在 JSP 面使用 Core 标签Q要使用 taglig 指oQ指定引用的标签库,如下Q?/p>

<%@ taglib rui=”http://java.sun.com/jsp/jstl/core” prefix=”c” %>

一般用途的标签?<c:out> ?<c:set> ?<c:remove> ?<c:cath>

1.<c:out>

用于计算一个表辑ּq将l果输出。类g JSP ?<%=%> 表达式,或者是 EL ?$ ${el-expression} ?/p>

2.<c:set>

用于讄范围变量的值或?javabean 对象的属性?/p>

看个实际例子Q?/p>

<c:set var=”username” value=”lisi” scope=”session”/>

q样q当于讄?session ?/p>

3.<c:remove>

相对 <c:set> 其作用是U除范围变量。比如: <c:remove var=”nusername” scope=”session”/>

4.<c:catch>

用于捕获在其中嵌套的操作所抛出的异常对象,q将异常信息保存到变量中?/p>

我们有可能抛出异常的代码放|到开始标{?:<c:catch> 和结束标{?:</c:catch> 之间。如果其中代码出现异常,异常对象被捕获Q保存在 var 声明的变量中Q该变量L?page 范围。如果没有发生异常,?var 所标识的范围变量将被移除?/p>

如果没有指定 var 属性,异常只是单的被捕P异常信息q不会被保存?/p>

Eg Q?/strong>

<c:catch var=”exception”>

<%

       int i = 5;

       int j = 0;

       int k=i/j;

%>

</c:catch>

<c:out value=”${exception}” /><br>

<c:out value=”${exception.massage}”/>

后一句相当于Q?exception.getMessage()

条g标签包括 <c:if><c:choose><c:when><c:otherwise>

1.<c:if>

用于实现 java 中的 if 语句功能?/p>

<c:if test=”${user.visitCount==1}”>

       This is your first visit .

</c:if>

若ؓ true Q会打印中间部分。也可以声明 var Q方便下一步判断?/p>

<c:if test=”${param.name==’admin’}” value=”result”/>

<c:out value=”${result}” />

2.<c:choose>

<c:choose> ?<c:when> ?<c:otherwise> 一起实C斥条件执行,cM?java 中的 if else.

<c:choose> 一般作?<c:when> ?<c:otherwise> 的父标签?/p>

eg Q?/p>

<c:choose>

       <c:when test="${row.v_money<10000}">

              初学下v

       </c:when>

       <c:when test="${row.v_money>=10000&&row.v_money<20000}">

              w手试

       </c:when>

       <c:otherwise>

              商业能手

       </c:otherwise>

</c:choose>

q代标签

q代标签?font color="#ff0000"> <c:forEach> ?</c:forEach>

// 遍历记录?/p>

<c:forEach items="${finalResult.rows}" var="row">       

<tr class="<%=tdClass[(rank+1)%2]%>">

<td align="center"><span><%=rank%> </span></td>

<td align="center"><span ><c:out value="${row.player_name}"/></span> </td>

<td align="center"><span > K?<c:out value="${row.money}"/></span></td>

</tr>

<%rank++;%>     

</c:forEach>

也可以设定固定次数?/p>

<c:forEach var =”i” begin=”100 “ end= “110”>

       ${i}

</c:forEach>

如果再加?step= “ 2 ”那么每次增长?2 ?/p>

三. sql 标签

讄数据源:

<sql:setDataSource dataSource="proxool.breadTycoon" />

// 数据库某查询的l果声明Z个变?/p>

<sql:query var="finalResult" >

    select player_name,money from tb_player order by money DESC LIMIT 10   

</sql:query>

       然后可以Q?/p>

<c:forEach items="${ finalResult.rows}" var="row" varStatus="s">

        advCosts[${s.index}]=${row.adv_cost};

   </c:forEach>

       数据更新标签Q?/p>

<sql:update>  

                call proc_set_role_salespro(?,?,?,?,?);

                <sql:param value="30"/>

                <sql:param value="39"/>

                <sql:param value="<%=spID%>"/>

                <sql:param value="<%=productID%>"/>

                <sql:param value="1"/>               

            </sql:update>

<sql:query var="queryAllChannelCount">

SELECT COUNT(*) as total FROM tb_channel WHERE game_id=? AND begin_round<func_cur_round(?) AND player_id=? AND channel_flag=0

<sql:param value="${gameID}"/>

<sql:param value="${gameID}"/>

<sql:param value="${playerID}"/>

</sql:query>

<c:forEach items="${queryAllChannelCount.rowsByIndex}" var="channelCN">

       <c:set value="${channelCN[0]}" var="channelTotal"/>

</c:forEach>

调用存储q程更新数据库:

<c:if test="${param.changsubmit!=null}" >

<c:forEach items="${paramValues.pro_id}" var="getpro_id" varStatus="getparamsta">

<sql:update>

call proc_set_role_product(?,?,?,?,?,?,?,?);

<sql:param value="${gameID}"/>

<sql:param value="${playerID}"/>

<sql:param value="${getpro_id}"/>

<sql:param value="${getpro_id}"/>

<sql:param value="${paramValues.pro_sort[getparamsta.index]}"/>

<sql:param value="${paramValues.price[getparamsta.index]}"/>

<sql:param value="${paramValues.output[getparamsta.index]}"/>

<sql:param value="0"/>

</sql:update>

</c:forEach>

</c:if>

四. 格式化标{?/p>

<fmt: formatNumber value =”12.3” pattern=”.000”/>

输?12.300. 应用样式 ”.000”, 格式化后的小数部分有 3 位。不?3 位将?0 补齐?

       <fmt:formatDate value=”<%=new java.util.Date() %>” type=”date” />

       格式化的l果是: 2007-5-27 .

<fmt:formatDate value=”<%=new java.util.Date() %>” type=”time” />

格式化的l果是: 9:25:11

<fmt:formatDate value=”<%=new java.util.Date() %>” type=”both” />

格式化的l果是: 2007-5-27 9:25:11

补充知识点:

1. 替换 request.getParameter("test"):

<c:if test="${param.test!=null}" >

<c:out value="${param.test}" />

</c:if>

2. <c:redirect url="a.jsp">

3.<c:redirect url="/max.jsp" context="/ch16">

<c:param name="name1" value="665"/>

<c:param name="name3" value=" 斯蒂?"/>

</c:redirect>

4.<c:forTokens items="zhangsan:lisi:as" delims=":" var="name">

${name}

</c:forTokens>



persister 2007-07-31 11:26 发表评论
]]>
DIV的功?/title><link>http://www.tkk7.com/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.tkk7.com/persister/archive/2007/07/03/127773.html</guid><wfw:comment>http://www.tkk7.com/persister/comments/127773.html</wfw:comment><comments>http://www.tkk7.com/persister/archive/2007/07/03/127773.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/persister/comments/commentRss/127773.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/persister/services/trackbacks/127773.html</trackback:ping><description><![CDATA[<p><strong><html></strong></p> <p><strong><head><br /> <style><br /> .gb { overflow:auto; white-space:normal; height:60px; width:60px; padding:3px;}<br /> </style></strong></p> <strong> </strong> <p><strong><br /> </head></strong></p> <p><strong><body><br />  <div class="gb"> <br />     <br />   有良好的书面与口头表达能力,沟通协调能力强Q?<br />   有良好的团队合作意识Q?<br />   U极乐观?</strong></p> <p><strong> </div><br /> <input type="file" class="xxx"><br /> </table><br /> </body><br /> </html><br /> <br /> 实现?63邮箱中自定义的文件夹如果q长可以拉动的效果QDIV太强大了Q抽I得好好学学</strong></p> <img src ="http://www.tkk7.com/persister/aggbug/127773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/persister/" target="_blank">persister</a> 2007-07-03 11:01 <a href="http://www.tkk7.com/persister/archive/2007/07/03/127773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://youketech.com" target="_blank">ѺܻڵƵëƬ</a>| <a href="http://xawsfkaisuo.com" target="_blank">ɫ͵ר</a>| <a href="http://ddm88888.com" target="_blank">Ұ߹ۿ</a>| <a href="http://flowsns.com" target="_blank">AëƬ</a>| <a href="http://6878vip.com" target="_blank">㽶һ</a>| <a href="http://jx-dirui.com" target="_blank">ò߹ۿ</a>| <a href="http://86trader.com" target="_blank">99reƵƷ</a>| <a href="http://yutuzb.com" target="_blank">ձѹۿ</a>| <a href="http://zgfxshop.com" target="_blank">þ99ȾƷѹۿ </a>| <a href="http://grjeans.com" target="_blank">˳77777ɫ</a>| <a href="http://www998xe.com" target="_blank">þþþ޾Ʒþþþþþ </a>| <a href="http://2121065.com" target="_blank">ŷƵѹ</a>| <a href="http://zaideqin.com" target="_blank">ɫƨƨ߹ۿƵ</a>| <a href="http://s4lm0x.com" target="_blank">ˬִֻ̼վ</a>| <a href="http://0967c.com" target="_blank">лиëƬѿ </a>| <a href="http://aicbbs.com" target="_blank">ձƵ߹ۿ</a>| <a href="http://yinyinai155.com" target="_blank">һëƬ</a>| <a href="http://www-7479.com" target="_blank">޹ƷþþžŴƬ</a>| <a href="http://wwwkckc.com" target="_blank">޵һۺר</a>| <a href="http://www-2236444.com" target="_blank">ŷۺһ</a>| <a href="http://ebuy668.com" target="_blank">ɫwwwƵ߹ۿ</a>| <a href="http://snbbearing.com" target="_blank">eeussӰԺ</a>| <a href="http://zbsensor.com" target="_blank">þĻƵ</a>| <a href="http://5g5t.com" target="_blank">ŮѹۿˬˬˬƵ</a>| <a href="http://367316.com" target="_blank">ѹۿ</a>| <a href="http://czshenyue.com" target="_blank">۲ӰԺƷַ</a>| <a href="http://dxj588.com" target="_blank">Ļһva</a>| <a href="http://sijep.com" target="_blank">޸AVľƷԭ</a>| <a href="http://686kp.com" target="_blank">91޹˾þþƷվ</a>| <a href="http://1314a.com" target="_blank">13ֽˮ</a>| <a href="http://7788xxx.com" target="_blank">Ʒרһ</a>| <a href="http://554ka.com" target="_blank">jizzѹۿ</a>| <a href="http://4husese.com" target="_blank">91ڹӰ</a>| <a href="http://cpsc-test.com" target="_blank">Ļav޿</a>| <a href="http://9898vip.com" target="_blank">ɫƷƵ</a>| <a href="http://wwwks2424.com" target="_blank">ղϵ</a>| <a href="http://www998xe.com" target="_blank">ŷ޾Ʒ</a>| <a href="http://fjwkjx.com" target="_blank">޹ƷþþþϼС </a>| <a href="http://www-9970.com" target="_blank">޾Ʒþþþ </a>| <a href="http://quxx28.com" target="_blank">Ѷ</a>| <a href="http://600c28.com" target="_blank">ɫվ߿</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>