﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Javaphua Blog</title><link>http://www.blogjava.net/Javaphua/</link><description /><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 18:59:11 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 18:59:11 GMT</pubDate><ttl>60</ttl><item><title>[转]程序员35岁之前成功12条法则</title><link>http://www.blogjava.net/Javaphua/archive/2007/08/19/137880.html</link><dc:creator>Javaphua</dc:creator><author>Javaphua</author><pubDate>Sat, 18 Aug 2007 16:36:00 GMT</pubDate><guid>http://www.blogjava.net/Javaphua/archive/2007/08/19/137880.html</guid><wfw:comment>http://www.blogjava.net/Javaphua/comments/137880.html</wfw:comment><comments>http://www.blogjava.net/Javaphua/archive/2007/08/19/137880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Javaphua/comments/commentRss/137880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Javaphua/services/trackbacks/137880.html</trackback:ping><description><![CDATA[<p style="TEXT-INDENT: 2em"><strong>一:一个目标</strong> </p>
<p style="TEXT-INDENT: 2em">一艘没有航行目标的船，任何方向的风都是逆风 </p>
<p style="TEXT-INDENT: 2em">1、你为什么是穷人，第一点就是你没有立下成为富人的目标 </p>
<p style="TEXT-INDENT: 2em">2、你的人生核心目标是什么？ </p>
<p style="TEXT-INDENT: 2em">杰出人士与平庸之辈的根本差别并不是天赋、机遇，而在于有无目标。 </p>
<p style="TEXT-INDENT: 2em">3、起跑领先一步，人生领先一大步：<a title=成功技巧 href="http://www.vipcn.com/InfoList/Catalog_213_1.html" target=_blank><u><font color=#0000ff>成功</font></u></a>从选定目标开始 </p>
<p style="TEXT-INDENT: 2em">4、贾金斯式的人永远不会成功 </p>
<p style="TEXT-INDENT: 2em">为什么大多数人没有成功？真正能完成自己计划的人只有5%，大多数人不是将自己的目标舍弃，就是沦为缺乏行动的空想 </p>
<p style="TEXT-INDENT: 2em">5、如果你想在35岁以前成功，你一定在25至30岁之间确立好你的人生目标 </p>
<p style="TEXT-INDENT: 2em">6、每日、每月、每年都要问自己：我是否达到了自己定下的目标 </p>
<p style="TEXT-INDENT: 2em"><strong>二：两个成功基点</strong> </p>
<p style="TEXT-INDENT: 2em"><a title=建站交流 href="http://www.vipcn.com/InfoList/Catalog_134_1.html" target=_blank><u><font color=#0000ff>站</font></u></a>好位置，调正心态，努力冲刺，35岁以前成功 </p>
<p style="TEXT-INDENT: 2em">(一)人生定位 </p>
<p style="TEXT-INDENT: 2em">1、人怕入错行：你的核心竞争力是什么？ </p>
<p style="TEXT-INDENT: 2em">2、成功者找方法，失败者找借口 </p>
<p style="TEXT-INDENT: 2em">3、从三百六十行中选择你的最爱 </p>
<p style="TEXT-INDENT: 2em">人人都可以创业，但却不是人人都能创业成功 </p>
<p style="TEXT-INDENT: 2em">4、寻找自己的黄金宝地 </p>
<p style="TEXT-INDENT: 2em">(二)永恒的真理：心态决定命运，35岁以前的心态决定你一生的命运 </p>
<p style="TEXT-INDENT: 2em">1、不满现状的人才能成为富翁 </p>
<p style="TEXT-INDENT: 2em">2、敢于梦想，勇于梦想，这个世界永远属于追梦的人 </p>
<p style="TEXT-INDENT: 2em">3、 35岁以前不要怕，35岁以后不要悔 </p>
<p style="TEXT-INDENT: 2em">4、出身贫民，并非一辈子是贫民，只要你永远保持那颗进取的心。中国成功人士大多来自小地方 </p>
<p style="TEXT-INDENT: 2em">5、做一个积极的思维者 </p>
<p style="TEXT-INDENT: 2em">6、不要败给悲观的自己 </p>
<p style="TEXT-INDENT: 2em">有的人比你富有一千倍，他们也会比你聪明一千倍么？不会，他们只是年轻时心气比你高一千倍。 </p>
<p style="TEXT-INDENT: 2em">人生的好多次失败，最后并不是败给别人，而是败给了悲观的自己。 </p>
<p style="TEXT-INDENT: 2em">7、成功者不过是爬起来比倒下去多一次 </p>
<p style="TEXT-INDENT: 2em">8、宁可去碰壁，也不要在家里面壁 </p>
<p style="TEXT-INDENT: 2em">克服你的失败、消极的心态 </p>
<p style="TEXT-INDENT: 2em">(1)找个地方喝点酒 </p>
<p style="TEXT-INDENT: 2em">(2)找个迪厅跳跳舞 </p>
<p style="TEXT-INDENT: 2em">(3)找帮朋友侃侃山 </p>
<p style="TEXT-INDENT: 2em">(4)积极行动起来 </p>
<p style="TEXT-INDENT: 2em"><strong>三：三大技巧</strong> </p>
<p style="TEXT-INDENT: 2em">1、管理时间：你的时间在哪里，你的成就就在哪里。 </p>
<p style="TEXT-INDENT: 2em">把一小时看成60分钟的人，比看作一小时的人多60倍 </p>
<p style="TEXT-INDENT: 2em">2、你不理财，财不理你 </p>
<p style="TEXT-INDENT: 2em">3、自我管理，游刃有余 </p>
<p style="TEXT-INDENT: 2em">(1)创业不怕本小，脑子一定要好 </p>
<p style="TEXT-INDENT: 2em">(2)可以开家特色店 </p>
<p style="TEXT-INDENT: 2em">(3)做别人不愿做的生意 </p>
<p style="TEXT-INDENT: 2em"><strong>四：四项安身立命的理念</strong> </p>
<p style="TEXT-INDENT: 2em">35岁以前一定要形成个人风格 </p>
<p style="TEXT-INDENT: 2em">1、做人优于做事 </p>
<p style="TEXT-INDENT: 2em">做事失败可以重来，做人失败却不能重来 </p>
<p style="TEXT-INDENT: 2em">(1)做人要讲义气 </p>
<p style="TEXT-INDENT: 2em">(2)永不气馁 </p>
<p style="TEXT-INDENT: 2em">2、豁达的男人有财运，豁达的女人有帮夫运 </p>
<p style="TEXT-INDENT: 2em">35岁以前搞定婚姻生活 </p>
<p style="TEXT-INDENT: 2em">3、忠诚的原则：35岁以前你还没有建立起忠诚美誉，这一缺点将要困扰你的一生</p>
<p style="TEXT-INDENT: 2em">4、把小事做细，但不要耍小聪明 </p>
<p style="TEXT-INDENT: 2em">中国人想做大事的人太多，而愿把小事做完美的人太少 </p>
<p style="TEXT-INDENT: 2em"><strong>五：五分运气</strong> </p>
<p style="TEXT-INDENT: 2em">比尔&#183;盖茨说：人生是不公平的，习惯去接受它吧 </p>
<p style="TEXT-INDENT: 2em">1、人生的确有很多运气的成人：谋事在人，成事在天：中国的古训说明各占一半 </p>
<p style="TEXT-INDENT: 2em">2、机会时常意外地降临，但属于那些不应决不放弃的人 </p>
<p style="TEXT-INDENT: 2em">3、抓住人生的每一次机会 </p>
<p style="TEXT-INDENT: 2em">机会就像一只小鸟，如果你不抓住，它就会飞得无影无踪 </p>
<p style="TEXT-INDENT: 2em">4、者早一步，愚者晚一步 </p>
<p style="TEXT-INDENT: 2em"><strong>六：六项要求</strong> </p>
<p style="TEXT-INDENT: 2em">1、智慧 </p>
<p style="TEXT-INDENT: 2em">(1)别人可你以拿走你的一切，但拿不走你的智慧 </p>
<p style="TEXT-INDENT: 2em">(2)巧妙运用自己的智慧 </p>
<p style="TEXT-INDENT: 2em">(3)智者与愚者的区别 </p>
<p style="TEXT-INDENT: 2em">2、勇气 </p>
<p style="TEXT-INDENT: 2em">(1)勇气的力量有时会让你成为&#8220;超人&#8221; </p>
<p style="TEXT-INDENT: 2em">(2)敢于放弃，敢于&#8220;舍得&#8221; </p>
<p style="TEXT-INDENT: 2em">3、培养自己的&#8220;领导才能、领袖气质&#8221; </p>
<p style="TEXT-INDENT: 2em">(1)激<a title=情感心情故事 href="http://www.vipcn.com/InfoList/Catalog_211_1.html" target=_blank><u><font color=#0000ff>情感</font></u></a>染别人 </p>
<p style="TEXT-INDENT: 2em">(2)&#8220;三&#183;七法则&#8221;实现领袖气质 </p>
<p style="TEXT-INDENT: 2em">(3)拍板决断能力 </p>
<p style="TEXT-INDENT: 2em">(4)人格魅力 </p>
<p style="TEXT-INDENT: 2em">4、创造性：不要做循规蹈矩的人 </p>
<p style="TEXT-INDENT: 2em">25-35岁是人生最有创造性的阶段，很多成功人士也都产生在这一阶段 </p>
<p style="TEXT-INDENT: 2em">5、明智 </p>
<p style="TEXT-INDENT: 2em">(1)知道自己的长处、短处，定向聚焦 </p>
<p style="TEXT-INDENT: 2em">(2)尽量在自己的熟悉的领域努力 </p>
<p style="TEXT-INDENT: 2em">6、持之以恒的行动力：在你选定行业坚持十年，你一定会成为大赢家 </p>
<p style="TEXT-INDENT: 2em"><strong>七：七分学习</strong> </p>
<p style="TEXT-INDENT: 2em">1、知识改变命运 </p>
<p style="TEXT-INDENT: 2em">2、35岁以前学会你行业中必要的一切知识 </p>
<p style="TEXT-INDENT: 2em">a)每天淘汰你自己 </p>
<p style="TEXT-INDENT: 2em">b)在商言商 </p>
<p style="TEXT-INDENT: 2em">3、太相信的书人，只能成为打工仔 </p>
<p style="TEXT-INDENT: 2em">4、思考、实践、再思考、再实践 </p>
<p style="TEXT-INDENT: 2em"><strong>八：八分交际</strong> </p>
<p style="TEXT-INDENT: 2em">朋友多了路好走 </p>
<p style="TEXT-INDENT: 2em">1、智商很重要，情商更重要：35岁以前建立起人际关系网 </p>
<p style="TEXT-INDENT: 2em">2、人脉即财脉：如何搞好人际关系 </p>
<p style="TEXT-INDENT: 2em">3、交友有原则 </p>
<p style="TEXT-INDENT: 2em">4、善于沟通：35岁以前要锻炼出自己的演讲才能 </p>
<p style="TEXT-INDENT: 2em"><strong>九：九分习惯</strong> </p>
<p style="TEXT-INDENT: 2em">习惯的力量是惊人的，35岁以前养成的习惯决定着你的成功的大小 </p>
<p style="TEXT-INDENT: 2em">1、积极思维的好习惯 </p>
<p style="TEXT-INDENT: 2em">2、养成高效工作的好习惯 </p>
<p style="TEXT-INDENT: 2em">(1)<a title="办公软件 软件下载" href="http://www.vipcn.com/SoftList/Catalog_134_SoftTime_Desc_1.html" target=_blank><u><font color=#0000ff>办公</font></u></a>室 </p>
<p style="TEXT-INDENT: 2em">(2)生活可以不拘小节，但要把工作做细 </p>
<p style="TEXT-INDENT: 2em">(3)学习聆听，不打断别人说话 </p>
<p style="TEXT-INDENT: 2em">3、养成锻炼身体的好习惯 </p>
<p style="TEXT-INDENT: 2em">4、广泛爱好的好习惯 </p>
<p style="TEXT-INDENT: 2em">5、快速行动的好习惯 </p>
<p style="TEXT-INDENT: 2em"><strong>十：十分自信</strong> </p>
<p style="TEXT-INDENT: 2em">1、自信是成功的精神支柱 </p>
<p style="TEXT-INDENT: 2em">2、自信方能赢得别人的信任 </p>
<p style="TEXT-INDENT: 2em">3、把自信建立在创造价值的基础上</p>
<p style="TEXT-INDENT: 2em">4、如何建立自信 </p>
<p style="TEXT-INDENT: 2em">(1)为自己确立目标 </p>
<p style="TEXT-INDENT: 2em">(2)发挥自己的长处 </p>
<p style="TEXT-INDENT: 2em">(3)做事要有计划 </p>
<p style="TEXT-INDENT: 2em">(4)做事不拖拉 </p>
<p style="TEXT-INDENT: 2em">(5)轻易不要放弃 </p>
<p style="TEXT-INDENT: 2em">(6)学会自我激励 </p>
<p style="TEXT-INDENT: 2em">(7)不要让自己成为别人 <strong>十一： 11个需要避开的成功陷阱</strong> </p>
<p style="TEXT-INDENT: 2em">1、只有功劳，没有苦劳 </p>
<p style="TEXT-INDENT: 2em">2、不要&#8220;怀才不遇&#8220;，而要寻找机遇 </p>
<p style="TEXT-INDENT: 2em">3、不要想发横财 </p>
<p style="TEXT-INDENT: 2em">4、不要为钱而工作，而让钱为你工作 </p>
<p style="TEXT-INDENT: 2em">5、盲目跟风，人云亦云，人做我也做 </p>
<p style="TEXT-INDENT: 2em">6、小富即安，不思进取，知足常乐 </p>
<p style="TEXT-INDENT: 2em">7、承认错误而非掩饰错误 </p>
<p style="TEXT-INDENT: 2em">8、脚踏实地而非想入非非 </p>
<p style="TEXT-INDENT: 2em">9、野心太大而不是信心十足 </p>
<p style="TEXT-INDENT: 2em">10、反复跳槽不可取 </p>
<p style="TEXT-INDENT: 2em">11、眼高手低 </p>
<p style="TEXT-INDENT: 2em">12、不择手段 </p>
<p style="TEXT-INDENT: 2em"><strong>十二：十二分努力</strong> </p>
<p style="TEXT-INDENT: 2em">没有人能随随便便成功 </p>
<p style="TEXT-INDENT: 2em">1、小不是成功，大不是成功，由小变大才是成功 </p>
<p style="TEXT-INDENT: 2em">2、中国社会进入微利时代：巧干+敢干+实干=成功 </p>
<p style="TEXT-INDENT: 2em">3、努力尝试就有成功的可能 </p>
<p style="TEXT-INDENT: 2em">4、做任何事情，尽最大努力 </p>
<p style="TEXT-INDENT: 2em">5、把事情当成事业来做 </p>
<p style="TEXT-INDENT: 2em">6、我看打工者 </p>
<p style="TEXT-INDENT: 2em">7、祝你早日掘到第一桶金来源</p>
<img src ="http://www.blogjava.net/Javaphua/aggbug/137880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Javaphua/" target="_blank">Javaphua</a> 2007-08-19 00:36 <a href="http://www.blogjava.net/Javaphua/archive/2007/08/19/137880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Ajax 基础和例子</title><link>http://www.blogjava.net/Javaphua/archive/2007/08/13/136275.html</link><dc:creator>Javaphua</dc:creator><author>Javaphua</author><pubDate>Mon, 13 Aug 2007 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/Javaphua/archive/2007/08/13/136275.html</guid><wfw:comment>http://www.blogjava.net/Javaphua/comments/136275.html</wfw:comment><comments>http://www.blogjava.net/Javaphua/archive/2007/08/13/136275.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Javaphua/comments/commentRss/136275.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Javaphua/services/trackbacks/136275.html</trackback:ping><description><![CDATA[<p class=entryTitle>Ajax 基础和例子</p>
<p class=entryContent>
<p>Ajax -- Asynchronous JavaScript and XML Ajax 使用的是JavaScript + DOM + CSS + XMLHttpRequest的技术,是目前Web2.0更加流行的技术. </p>
<p>与传统网络应用相比,Ajax具备更加直观和方便的用户交互. 为什么呢? 比如, 我们需要点击链接或按钮来激发事件,而使用Ajax只要移动鼠标或者在一个输入框输入字母已经可以触发事件. 传统的网络应用是基于page-driven的模式, 使用的是'click, wait a refresh the whole page' 模式, 而Ajax是通过data-driven的模式来提供网络页面的, 采用的是部分页面更新的模式, 页面中只更新有新数据的部分,其它的部分依然不变,所以依然可以操作. </p>
<p>Ajax就象它的名字一样, 可以异步地在浏览器和服务器之间进行交流, 当服务器端处理submit过来的数据的同时, 客户依然可以正常地处理浏览器端同一页面的其他功能.</p>
<p>那么Ajax和传统网络应用相比是怎样工作的呢?下面这张图可以让你了解清楚. </p>
<p><img src="http://developers.sun.com.cn/blog/BennyLuo/resource/ajax.JPG"></p>
<p>传统的网络应用在浏览器和服务器之间的交流是直来直去的, 而Ajax的网络应用在浏览器中有一个Ajax引擎,这个引擎实际上就是一个Javascript的对象XMLHttpRequest, 而XMLHttpRequest负责浏览器和服务器的异步交流. </p>
<p>XMLHttpRequest既然是Javascript的对象, 当然需要一些Javascript的代码来生成, 它目前支持大部分的浏览器,包括了Mozilla, Firefox等等. </p>
<p>服务器端依然可以使用传统的技术如servlet, JSP, JSF,Struts等等,但会有一些小的限制,比如客户端会发更频繁的请求,而响应这些请求的类型包括text/xml, text/plain, text/json, text/javascript. </p>
<p>整个Ajax的操作过程分为七步: </p>
<p>1.A client event occurs </p>
<p>2.An XMLHttpRequest object is created </p>
<p>3.The XMLHttpRequest object is configured </p>
<p>4.The XMLHttpRequest object makes an async. request </p>
<p>5.The ValidateServlet returns an XML document containing the result </p>
<p>6.The XMLHttpRequest object calls the callback() function and processes the result </p>
<p>7.The HTML DOM is updated </p>
<p>我们分别来看看这七个步骤是怎么做的: 1. A client event occurs, </p>
<p>&lt;input type="text"<br>size="20"<br>id="userid"<br>name="id"<br>onkeyup="validateUserId();"&gt;</p>
<p>比如我们手头上有这样一段Javascript的代码:&nbsp; 这是一个ID为userid的文本框,里面包含了一个Javascript的函数,当我们在文本框里打入一个英文字母时,会激发onkeyup的事件,从而激发validateUserId的Javascript的函数. </p>
<p>2.An XMLHttpRequest object is created </p>
<p>var req;<br>function initRequest() {<br>if (window.XMLHttpRequest) {<br>req = new XMLHttpRequest();<br>} else if (window.ActiveXObject) {<br>isIE = true;<br>req = new ActiveXObject("Microsoft.XMLHTTP");<br>}<br>}<br>function validateUserId() {<br>initRequest();<br>req.onreadystatechange = processRequest;<br>if (!target) target = document.getElementById("userid");<br>var url = "validate?id=" + escape(target.value);<br>req.open("GET", url, true);<br>req.send(null);<br>}</p>
<p>validateUserId的Javascript的函数调用initRequest函数生成XMLHttpRequest对象, 大家注意到在initRequest函数里面有两种生成XMLHttpRequest的方法,这是针对不同的浏览器的做法,对于Mozilla,我们可以直接使用"new XMLHttpRequest()&#8221;, 而对于IE,我们需要生成ActiveX对象. </p>
<p>3.The XMLHttpRequest object is configured </p>
<p>rvalidateUserId的Javascript的函数包含一句req.onreadystatechange = processRequest; 这是通过设定XMLHttpRequest对象里面的onreadystatechange特性为回调函数. </p>
<p>4.The XMLHttpRequest object makes an async. request </p>
<p>if (!target) target = document.getElementById("userid");<br>var url = "validate?id=" + escape(target.value);<br>req.open("GET", url, true);<br>req.send(null);</p>
<p>然后XMLHttpRequest调用open方法和服务器交流, open方法有三个参数, HTTP方法是Get还是Post, 服务器端的URL, 方式采取异步还是同步. </p>
<p>5.The ValidateServlet returns an XML document containing the result </p>
<p>public void doGet(HttpServletRequest request, HttpServletResponse response)<br>throws IOException, ServletException {<br>String targetId = request.getParameter("id");<br>if ((targetId != null) &amp;&amp; !accounts.containsKey(targetId.trim())) {<br>response.setContentType("text/xml ");<br>response.setHeader("Cache-Control", "no-cache");<br>response.getWriter().write("&lt;valid&gt;true&lt;/valid&gt;");<br>} else {<br>response.setContentType("text/xml ");<br>response.setHeader("Cache-Control", "no-cache");<br>response.getWriter().write("&lt;valid&gt;false&lt;/valid&gt;");<br>}<br>}</p>
<p>然后是服务器端ValidateServlet的响应,首先Content type设为text/xml, Cache-Control设为no-cache, 最后会返回true或者false的xml格式响应. </p>
<p>6.The XMLHttpRequest object calls the callback() function and processes the result </p>
<p>function processRequest() {<br>if (req.readyState == 4) {<br>if (req.status == 200) {<br>var message = ...;</p>
<p>现在控制交回给客户端, 由于我们设定了回调函数为processRequest, 那么当响应从服务器端回到客户端浏览器,就激发了processRequest函数, 我们在processRequest函数中检查XMLHttpRequest对象的readyState状态是否为4和status状态是否为200,如果两者同时成立,就代表服务器端的数据已经成功返回给客户端,那么就可以执行下面的处理.</p>
<p>&nbsp;7.The HTML DOM is updated.</p>
<p>接收完服务器端传回来的数据后,浏览器开始着手显示接收回的数据.</p>
<p>我们通过页面里面的&lt;div&gt;元素来唯一的表示一个对象给DOM的API使用. 比如确定html页面某一处的需要显示的信息文本对象,我们可以使用userIdMessage唯一的标签来做引用给DOM的API使用. 如下面这段代码:</p>
<p>23.&lt;body&gt;<br>24. &lt;div id="userIdMessage"&gt;&lt;/div&gt;<br>25.&lt;/body&gt;</p>
<p>一但你有了唯一确定的引用,你就可以使用DOM的API对其进行随心所欲的操作,如属性的修改等等,比如下面这段代码:</p>
<p>1. &lt;script type="text/javascript"&gt;<br>2. function setMessageUsingDOM(message) {<br>3. var userMessageElement = document.getElementById("userIdMessage");<br>4. var messageText;<br>5. if (message == "false") {<br>6. userMessageElement.style.color = "red";<br>7. messageText = "Invalid User Id";<br>8. } else {<br>9. userMessageElement.style.color = "green";<br>10. messageText = "Valid User Id";<br>11. }<br>12. var messageBody = document.createTextNode(messageText);<br>13. // if the messageBody element has been created simple replace it otherwise<br>14. // append the new element<br>15. if (userMessageElement.childNodes[0]) {<br>16. userMessageElement.replaceChild(messageBody,<br>17. userMessageElement.childNodes[0]);<br>18. } else {<br>19. userMessageElement.appendChild(messageBody);<br>20. }<br>21.}<br>22.&lt;/script&gt;<br>23.&lt;body&gt;<br>24. &lt;div id="userIdMessage"&gt;&lt;/div&gt;<br>25.&lt;/body&gt;</p>
<p>在这里javascript通过了getElementById方法得到了userIdMessage对象,然后对服务器端返回的数据进行对比,如果值是true,在userIdMessage里添加文本"Valid User Id", 如果值是false,则在userIdMessage里添加文本"Invalid User Id".</p>
<p>大概就是这样的一个状况,那么在Ajax里面的XMLHttpRequest还有很多方法和属性, 包括:</p>
<p>方法:</p>
<p><br>&#8226; open(&#8220;HTTP method&#8221;, &#8220;URL&#8221;, syn/asyn)<br>&gt; Assigns HTTP method, destination URL, mode<br>&#8226; send(content)<br>&gt; Sends request including string or DOM object data<br>&#8226; abort()<br>&gt; Terminates current request<br>&#8226; getAllResponseHeaders()<br>&gt; Returns headers (labels + values) as a string<br>&#8226; getResponseHeader(&#8220;header&#8221;)<br>&gt; Returns value of a given header<br>&#8226; setRequestHeader(&#8220;label&#8221;,&#8221;value&#8221;)<br>&gt; Sets Request Headers before sending</p>
<p>属性:</p>
<p>&#8226; onreadystatechange<br>&gt; Set with an JavaScript event handler that fires at each<br>change<br>&#8226; readyState &#8211; current status of request<br>&gt; 0 = uninitialized<br>&gt; 1 = loading<br>&gt; 2 = loaded<br>&gt; 3 = interactive (some data has been returned)<br>&gt; 4 = complete<br>&#8226; status<br>&gt; HTTP Status returned from server: 200 = OK</p>
<p>&#8226; responseText<br>&gt; String version of data returned from the server<br>&#8226; responseXML<br>&gt; XML document of data returned from the server<br>&#8226; statusText<br>&gt; Status text returned from server</p>
<p>&#160;</p>
<p class=entryInfo>Posted at <a href="http://developers.sun.com.cn/blog/BennyLuo/entry/200707101"><u><font color=#800080>05:22PM Jul 10, 2007</font></u></a> by Benny Luo </p>
<img src ="http://www.blogjava.net/Javaphua/aggbug/136275.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Javaphua/" target="_blank">Javaphua</a> 2007-08-13 09:31 <a href="http://www.blogjava.net/Javaphua/archive/2007/08/13/136275.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Tomcat 5.5.x 配置集锦(x表示4,5,.6,7) </title><link>http://www.blogjava.net/Javaphua/archive/2007/07/20/131509.html</link><dc:creator>Javaphua</dc:creator><author>Javaphua</author><pubDate>Fri, 20 Jul 2007 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/Javaphua/archive/2007/07/20/131509.html</guid><wfw:comment>http://www.blogjava.net/Javaphua/comments/131509.html</wfw:comment><comments>http://www.blogjava.net/Javaphua/archive/2007/07/20/131509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Javaphua/comments/commentRss/131509.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Javaphua/services/trackbacks/131509.html</trackback:ping><description><![CDATA[<div>tomcat5.5.x 配置记录。</div>
<div>&nbsp;</div>
<div>1.下载：</div>
<div><a href="http://www.eu.apache.org/dist/jakarta/tomcat-5/"><font color=#0000ff><u>http://www.eu.apache.org/dist/jakarta/tomcat-5/</u></font></a></div>
<div><a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-admin.zip"><font color=#0000ff><u>http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-admin.zip</u></font></a><br><a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-compat.zip"><font color=#0000ff><u>http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-compat.zip</u></font></a><br><a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x.zip"><font color=#0000ff><u>http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x.zip</u></font></a></div>
<div><a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-deployer.zip"><u><font color=#0000ff>http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-deployer.zip</font></u></a></div>
<div>把<u><font color=#0000ff>jakarta-tomcat-5.5.x.zip</font></u></div>
<div>和<u><font color=#0000ff>jakarta-tomcat-5.5.x-compat.zip</font></u></div>
<div>和<u><font color=#800080>jakarta-tomcat-5.5.x-admin.zip</font></u><br>(Tomcat 默认是没有内置admin模块了</div>
<div>Tomcat's administration web application is no longer installed by default. Download and install the "admin" package to use it. )</div>
<div>都解压到同一个目录下面。比如：D:\jakarta-tomcat-5.5.x\</div>
<div>(如果使用jdk1.4，才需要<u><font color=#0000ff>compat.zip</font></u>用jdk1.5就可以免了这个。) </div>
<div>&nbsp;</div>
<div>2.修改jakarta-tomcat-5.5.x\conf\tomcat-users.xml.<br>添加管理员账号lizongbo，密码为lizongbopass.<br>新xml如下：<br>&lt;?xml version='1.0' encoding='utf-8'?&gt;<br>&lt;tomcat-users&gt;<br>&nbsp; &lt;role rolename="tomcat"/&gt;<br>&nbsp; &lt;role rolename="role1"/&gt;<br>&nbsp; &lt;role rolename="manager"/&gt;<br>&nbsp; &lt;role rolename="admin"/&gt;<br>&nbsp; &lt;user username="tomcat" password="tomcat" roles="tomcat"/&gt;<br>&nbsp; &lt;user username="role1" password="tomcat" roles="role1"/&gt;<br>&nbsp; &lt;user username="both" password="tomcat" roles="tomcat,role1"/&gt;<br>&nbsp; &lt;user username="lizongbo" password="lizongbopass" roles="admin,manager"/&gt;<br>&lt;/tomcat-users&gt;</div>
<div>&nbsp;</div>
<div>3.修改jakarta-tomcat-5.5.x\conf\server.xml来解决编码问题。<br>(给Connector&nbsp;添加URIEncoding参数，参考<a href="http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx"><u><font color=#0000ff>http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx</font></u></a>)</div>
<div>(可以设置成GB18030)<br>&nbsp;&nbsp;&nbsp; &lt;Connector port="8080"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" acceptCount="200"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; compression="on" compressionMinSize="2048" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; noCompressionUserAgents="gozilla, traviata" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; compressableMimeType="text/html,text/xml"/&gt;</div>
<div>&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp; &lt;Connector port="8009" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" redirectPort="8443" protocol="AJP/1.3" URIEncoding="GBK"/&gt;</div>
<div>&nbsp;</div>
<div><br>4.启用支持gzip压缩.<br>(<a href="http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1&amp;i=81169"><u><font color=#0000ff>http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1&amp;i=81169</font></u></a>)<br>添加下列属性<br>&nbsp;compression="on" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; compressionMinSize="2048" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; noCompressionUserAgents="gozilla, traviata" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; compressableMimeType="text/html,text/xml"</div>
<div>&nbsp;</div>
<div>5.设置虚拟主机。</div>
<div>在jakarta-tomcat-5.5.x\下建立文件夹vhost\www.mydomain.com。</div>
<div>然后修改jakarta-tomcat-5.5.x\conf\server.xml</div>
<div>&nbsp;</div>
<div>&lt;Engine defaultHost="localhost" name="Catalina"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Host appBase="vhost/www.mydomain.com" name="<a href="http://www.mydomain.com/"><u><font color=#0000ff>www.mydomain.com</font></u></a>"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Host&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Host appBase="webapps" name="localhost"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Host&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Realm className="org.apache.catalina.realm.UserDatabaseRealm"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/Engine&gt;</div>
<div>&nbsp;</div>
<div>6.添加数据库驱动,更新mail.jar和actiovation.jar</div>
<div>复制mysql-connector-java-3.0.16-ga-bin.jar,pg74.215.jdbc3.jar到 jakarta-tomcat-5.5.x\common\lib\</div>
<div>还有javamail 1.3.2的mail.jar，jaf-1_0_2的 activation.jar</div>
<div>msSQl 2000 JDBC sp3，msbase.jar,msutil,jar,mssqlserver.jar</div>
<div>&nbsp;</div>
<div>&nbsp;</div>
<div>7.配置SSL</div>
<div>参考 <a href="http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html"><u><font color=#0000ff>http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html</font></u></a></div>
<div>D:\j2sdk1.4.2_06\bin&gt;%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA<br>输入keystore密码：&nbsp; lizongbossl<br>您的名字与姓氏是什么？<br>&nbsp; [tomcat5.5.x]：&nbsp; tomcat5.5.x<br>您的组织单位名称是什么？<br>&nbsp; [jakarta]：&nbsp; jakarta<br>您的组织名称是什么？<br>&nbsp; [apache]：&nbsp; apache<br>您所在的城市或区域名称是什么？<br>&nbsp; [hzcity]：&nbsp; hzcity<br>您所在的州或省份名称是什么？<br>&nbsp; [gdp]：&nbsp; gdp<br>该单位的两字母国家代码是什么<br>&nbsp; [CN]：&nbsp; CN<br>CN=tomcat5.5.x, OU=jakarta, O=apache, L=hzcity, ST=gdp, C=CN 正确吗？<br>&nbsp; [否]：&nbsp; y</div>
<div>&nbsp;</div>
<div>输入&lt;tomcat&gt;的主密码<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （如果和 keystore 密码相同，按回车）：<br></div>
<div>(必须密码一致，因此直接回车)</div>
<div>然后再把userhome(例如：C:\Documents and Settings\lizongbo\)下的.keystore复制到</div>
<div>tomcat的conf\目录下。</div>
<div>&nbsp;(例如：D:\jakarta-tomcat-5.5.x\conf\.keystore )</div>
<div>配置jakarta-tomcat-5.5.x\conf\server.xml</div>
<div>加上</div>
<div>&nbsp;&nbsp;&nbsp; &lt;Connector port="8443" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads="150" minSpareThreads="25" maxSpareThreads="75"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups="false" disableUploadTimeout="true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acceptCount="100" scheme="https" secure="true"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientAuth="false" sslProtocol="TLS" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystoreFile="conf/.keystore" <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystorePass="lizongbossl"&gt; &lt;!--与先前设置的密码一致--&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/Connector&gt;</div>
<div>8.禁止文件目录列表，</div>
<div>修改jakarta-tomcat-5.5.x\conf\web.xml，把listing设置为false</div>
<div>&nbsp;</div>
<div>&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;default&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.catalina.servlets.DefaultServlet&lt;/servlet-class&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;debug&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;0&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;listings&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;</div>
<div>&nbsp;</div>
<div>&nbsp;9.指定了自己的javaEncoding</div>
<div>(参考 <a href="http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html"><u><font color=#0000ff>http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html</font></u></a>&nbsp;)</div>
<div><br>&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.jasper.servlet.JspServlet&lt;/servlet-class&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;fork&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;false&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;javaEncoding&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;GB18030&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;xpoweredBy&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;</div>
<div>&nbsp;10.添加rar,iso等的mime-type映射 </div>
<div>避免在浏览器里直接打开。</div>
<div>&lt;mime-mapping&gt;<br>&lt;extension&gt;mht&lt;/extension&gt;<br>&lt;mime-type&gt;text/x-mht&lt;/mime-type&gt;<br>&lt;/mime-mapping&gt;</div>
<div>&lt;mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extension&gt;rar&lt;/extension&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extension&gt;iso&lt;/extension&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extension&gt;ape&lt;/extension&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extension&gt;rmvb&lt;/extension&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/mime-mapping&gt;</div>
<div>&nbsp;&nbsp;&nbsp; &lt;mime-mapping&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extension&gt;ico&lt;/extension&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mime-type&gt;image/x-icon&lt;/mime-type&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/mime-mapping&gt;</div>
<div>10.1对html静态页面设置编码</div>
<div><font color=#0000ff>&lt;!--&nbsp;&nbsp;修改下面两行以支持静态超文本的自动编码&nbsp;<br>&nbsp;&nbsp;--&gt;</font>&nbsp;<br>&nbsp;<font color=blue>&lt;mime-mapping&gt;</font><br>&nbsp;&nbsp;<font color=blue>&lt;extension&gt;</font>htm<font color=blue>&lt;/extension&gt;</font>&nbsp;<br>&nbsp;&nbsp;<font color=blue>&lt;mime-type&gt;</font>text/html;charset=gb<font color=red>2312</font><font color=blue>&lt;/mime-type&gt;</font>&nbsp;<br>&nbsp;&nbsp;<font color=blue>&lt;/mime-mapping&gt;</font><br>&nbsp;<font color=blue>&lt;mime-mapping&gt;</font><br>&nbsp;&nbsp;<font color=blue>&lt;extension&gt;</font>html<font color=blue>&lt;/extension&gt;</font>&nbsp;<br>&nbsp;&nbsp;<font color=blue>&lt;mime-type&gt;</font>text/html;charset=gb<font color=red>2312</font><font color=blue>&lt;/mime-type&gt;</font>&nbsp;<br>&nbsp;&nbsp;<font color=blue>&lt;/mime-mapping&gt;</font><br>&nbsp;&nbsp;<font color=blue>&lt;/web-app&gt;</font></div>
<div>&nbsp;</div>
<div>11.添加welcome-file-list，并调整顺序。</div>
<div>&nbsp;&lt;welcome-file-list&gt;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.html&lt;/welcome-file&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.htm&lt;/welcome-file&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/welcome-file-list&gt;<br></div>
<br>
<img src ="http://www.blogjava.net/Javaphua/aggbug/131509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Javaphua/" target="_blank">Javaphua</a> 2007-07-20 16:07 <a href="http://www.blogjava.net/Javaphua/archive/2007/07/20/131509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]java中判断字符串是否为数字的三种方法 </title><link>http://www.blogjava.net/Javaphua/archive/2007/06/05/122131.html</link><dc:creator>Javaphua</dc:creator><author>Javaphua</author><pubDate>Tue, 05 Jun 2007 06:17:00 GMT</pubDate><guid>http://www.blogjava.net/Javaphua/archive/2007/06/05/122131.html</guid><wfw:comment>http://www.blogjava.net/Javaphua/comments/122131.html</wfw:comment><comments>http://www.blogjava.net/Javaphua/archive/2007/06/05/122131.html#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://www.blogjava.net/Javaphua/comments/commentRss/122131.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Javaphua/services/trackbacks/122131.html</trackback:ping><description><![CDATA[<h2><a id=viewpost1_TitleUrl href="http://www.blogjava.net/hardson/articles/58476.html"><u><font color=#0000ff></font></u></a>&nbsp;</h2>
<div class=postTitle><a class=postTitle2 id=viewpost1_TitleUrl href="http://www.blogjava.net/willpower88/archive/2006/07/03/56361.html"></a><span style="COLOR: #0000ff">&nbsp;java中判断字符串是否为数字的三种方法</span> </div>
<div class=postTitle>1用JAVA自带的函数<br><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">&nbsp;isNumeric(String&nbsp;str){<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">str.length();</span><span style="COLOR: #000000">--i&gt;=0;</span><span style="COLOR: #000000">){&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">Character.isDigit(str.charAt(i))){<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br>&nbsp;}<br></span><br>2用正则表达式<br><span style="COLOR: #0000ff"><font color=#000000>public static boolean isNumeric(String str){ <br>&nbsp;&nbsp;&nbsp; Pattern pattern = Pattern.compile("[0-9]*"); <br>&nbsp;&nbsp;&nbsp; return pattern.matcher(str).matches();&nbsp;&nbsp;&nbsp; <br>&nbsp;} <br></font></span><span style="COLOR: #000000"><br>3用ascii码<br><br><font color=#0000ff>public static boolean</font> isNumeric(String str){<br>&nbsp;&nbsp;<font color=#0000ff>&nbsp;for</font>(<font color=#0000ff>int</font> i=str.length();--i&gt;=0;){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#0000ff>int</font> chr=str.charAt(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(chr&lt;48 || chr&gt;57)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#0000ff>return false</font>;<br>&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;<font color=#0000ff>return true</font>;<br>}</span></div>
<img src ="http://www.blogjava.net/Javaphua/aggbug/122131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Javaphua/" target="_blank">Javaphua</a> 2007-06-05 14:17 <a href="http://www.blogjava.net/Javaphua/archive/2007/06/05/122131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>增加tomcat内存</title><link>http://www.blogjava.net/Javaphua/archive/2007/05/17/118054.html</link><dc:creator>Javaphua</dc:creator><author>Javaphua</author><pubDate>Thu, 17 May 2007 04:59:00 GMT</pubDate><guid>http://www.blogjava.net/Javaphua/archive/2007/05/17/118054.html</guid><wfw:comment>http://www.blogjava.net/Javaphua/comments/118054.html</wfw:comment><comments>http://www.blogjava.net/Javaphua/archive/2007/05/17/118054.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Javaphua/comments/commentRss/118054.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Javaphua/services/trackbacks/118054.html</trackback:ping><description><![CDATA[<font face=Tahoma size=2>windows</font><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">中大家都知道，</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JAVA</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">程序启动时都会</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JVM</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">都会分配一个初始内存和最大内存给这个应用程序。这个初始内存和最大内存在一定程度都会影响程序的性能。比如说在应用程序用到最大内存的时候，</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JVM</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">是要先去做垃圾回收的动作，释放被占用的一些内存。</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> <br></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">所以想调整</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">Tomcat</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">的启动时初始内存和最大内存就需要向</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JVM</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">声明，一般的</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">JAVA</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">程序在运行都可以通过中</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">-Xms -Xmx</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">来调整应用程序的初始内存和最大内存</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">: <br></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">如：</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">java -Xms<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="64" UnitName="m">64m</st1:chmetcnv> -Xmx<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="128" UnitName="m">128m</st1:chmetcnv> a.jar. <br>tomcat</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">的启动程序是包装过的，不能直接使用</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">java -X..... tomcat.*</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">来改变内存的设置。在</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">Tomcat</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">在改变这个设置</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> <br></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">有两种方法：</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> <br>1. </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">就需要在环境变量中加上</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">TOMCAT_OPTS, CATALINA_OPTS</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">两个属性，</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> <br></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">如</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> SET CATALINA_OPTS= -Xms<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="64" UnitName="m">64m</st1:chmetcnv> -Xmx<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="512" UnitName="m">512m</st1:chmetcnv>; <br>ms</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">是最小的，</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">mx</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">是最大，</span><st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="64" UnitName="m"><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">64m</span></st1:chmetcnv><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">, <st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="512" UnitName="m">512m</st1:chmetcnv></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">分别是指内存的容量</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">. <br>2. </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">修改</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">Catalina.bat</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">文件</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> <br></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">在</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">166</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">行</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">&#8220;rem Execute Java with the applicable properties &#8221;</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">以下每行</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma"> <br>%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">中的</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">%CATALINA_OPTS% </span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">替换成</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">-Xms<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="64" UnitName="m">64m</st1:chmetcnv> -Xmx<st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="512" UnitName="m">512m</st1:chmetcnv></span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">（把四行内的</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">%CATALINA_OPTS%</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: Tahoma">都替换掉，包括两边的</span><span lang=EN-US style="FONT-SIZE: 9pt; FONT-FAMILY: Tahoma">%<br><br>3.启动%tomcat%\bin\tomcat5w.exe，在java项中设置初始化内存的大小<br><br>测试tomcat大小，jsp页面<br>&lt;%<br>Runtime lRuntime = Runtime.getRuntime();<br>out.println("*** BEGIN MEMORY STATISTICS ***&lt;br/&gt;");<br>out.println("Free&nbsp; Memory: "+lRuntime.freeMemory()+"&lt;br/&gt;");<br>out.println("Max&nbsp;&nbsp; Memory: "+lRuntime.maxMemory()+"&lt;br/&gt;");<br>out.println("Total Memory: "+lRuntime.totalMemory()+"&lt;br/&gt;");<br>out.println("Available Processors : "+lRuntime.availableProcessors()+"&lt;br/&gt;");<br>out.println("*** END MEMORY STATISTICS ***");<br>%&gt; </span>
<img src ="http://www.blogjava.net/Javaphua/aggbug/118054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Javaphua/" target="_blank">Javaphua</a> 2007-05-17 12:59 <a href="http://www.blogjava.net/Javaphua/archive/2007/05/17/118054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于oracle 10.2.0的监听问题</title><link>http://www.blogjava.net/Javaphua/archive/2007/05/10/116471.html</link><dc:creator>Javaphua</dc:creator><author>Javaphua</author><pubDate>Thu, 10 May 2007 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/Javaphua/archive/2007/05/10/116471.html</guid><wfw:comment>http://www.blogjava.net/Javaphua/comments/116471.html</wfw:comment><comments>http://www.blogjava.net/Javaphua/archive/2007/05/10/116471.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Javaphua/comments/commentRss/116471.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Javaphua/services/trackbacks/116471.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oracle 10.2.0 在不插网线安装时，网络由用户验证，安装完毕后重启机子，插网线启动oracle服务时，总是出现监听失败，这时可进行如下修改：打开oracle\product\10.2.0\db_1\NETWORK\ADMIN\listener.ora<br>将<br>SID_LIST_LISTENER =<br>&nbsp; (SID_LIST =<br>&nbsp;&nbsp;&nbsp; (SID_DESC =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (SID_NAME = PLSExtProc)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ORACLE_HOME = D:\soft\oracle\product\10.2.0\db_1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PROGRAM = extproc)<br>&nbsp;&nbsp;&nbsp; )<br>&nbsp; )</p>
<p>LISTENER =<br>&nbsp; (DESCRIPTION_LIST =<br>&nbsp;&nbsp;&nbsp; (DESCRIPTION =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ADDRESS = (PROTOCOL = TCP)(HOST = <span style="COLOR: red">localhost</span>)(PORT = 1521))<br>&nbsp;&nbsp;&nbsp; )<br>&nbsp; )<br>中红色标识的localhost改为机器名，如：mycoputer</p>
<img src ="http://www.blogjava.net/Javaphua/aggbug/116471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Javaphua/" target="_blank">Javaphua</a> 2007-05-10 14:11 <a href="http://www.blogjava.net/Javaphua/archive/2007/05/10/116471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]最新整理apache-2.0.43和tomcat-4.1.12集成 </title><link>http://www.blogjava.net/Javaphua/archive/2007/04/03/108165.html</link><dc:creator>Javaphua</dc:creator><author>Javaphua</author><pubDate>Tue, 03 Apr 2007 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/Javaphua/archive/2007/04/03/108165.html</guid><wfw:comment>http://www.blogjava.net/Javaphua/comments/108165.html</wfw:comment><comments>http://www.blogjava.net/Javaphua/archive/2007/04/03/108165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Javaphua/comments/commentRss/108165.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Javaphua/services/trackbacks/108165.html</trackback:ping><description><![CDATA[<p><a name=msg_d22783929d69e265></a>最新整理apache-2.0.43和tomcat-4.1.12集成 <br>
<p>---------------------------------------------------------------------------&shy;----- <br>作者：luyongshou 2005-02-02 15:04:45 来自：Linux先生 &nbsp;在此介绍一下我在RedHat Linux 7.2下装Apache与Tomcat4整合的过程，重点讲述mod_webapp.so的制作方法， <br>　　以及在虚拟主机环境下的配置、管理和应用，经测试已经成功。希望对各位有所帮助，如有错误也请指正。 <br>
<p>一、正确安装Tomcat4 <br>　　必要软件的安装，如下： <br>　　1、Java SDK <br>　　版本1.3.1或1.4，建议安装在/usr/java下，并做一个jdk的软链接。 <br>　　如果在装版本1.3.1的SDK出现问题，请阅读文档：<a href="http://java.sun.com/j2se/1.3/install-linux-sdk.html" target=_blank rel=nofollow><font color=#0000cc>http://java.sun.com/j2se/1.3/install-linux-sdk.html</font></a> <br>　　2、Tomcat4 <br>　　建议安装最新release版本的二进制文件安装包。当前最新的tomcat版本是4.1.12。 <br>　　下载地址： <br>　　<a href="http://jakarta.apache.org/builds/ja...t-4.1.12.tar.gz" target=_blank rel=nofollow><font color=#0000cc>http://jakarta.apache.org/builds/ja...t-4.1.12.tar.gz</font></a> <br>　 下载后接压到一个目录 "tar xvzf jakarta-tomcat-4.1.12.tar.gz" <br>本例将tomcat安装在/opt目录下，并做了个tomcat的软链接。 <br>　　设置如下环境变量并启用： <br>　　PATH=$PATH:/usr/java/jdk/bin:/usr/java/jdk/jre/bin <br>　 JAVA_HOME=/usr/java/jdk <br>　　export JAVA_HOME <br>　　CLASSPATH="./:/usr/java/jdk/lib:/usr/java/jdk/jre/lib" <br>　　export CLASSPATH <br>　　CATALINA_HOME=/opt/tomcat <br>　　export CATALINA_HOME <br>
<p>　　建议单建一个用户tomcat，将其设成/opt/tomcat以下所有目录文件的属主，并由它启动tomcat： <br>　　# useradd tomcat <br>　　# chown -R tomcat:tomcat /opt/tomcat <br>　　# su - tomcat -c "/opt/tomcat/bin/startup.sh" <br>
<p>　　访问<a href="http://localhost:8080/" target=_blank rel=nofollow><font color=#0000cc>http://localhost:8080/</font></a> 应能看到tomcat安装成功的页面。 <br>
<p>=================================================================== <br>如果想和apache集成需要修改tomcat/conf/server.xml这个文件的 <br>
<p>&lt;!-- Define an Apache-Connector Service --&gt; <br>
<p>&lt;Service name="Tomcat-Apache"&gt; <br>&lt;!-- <br>&lt;Connector className="org.apache.catalina.connector.warp.WarpConnector" <br>port="8008" minProcessors="5" maxProcessors="75" <br>enableLookups="true" appBase="webapps" <br>acceptCount="10" debug="0"/&gt; <br>
<p>&lt;Engine className="org.apache.catalina.connector.warp.WarpEngine" <br>name="Apache" debug="0"&gt; <br>
<p>&lt;Logger className="org.apache.catalina.logger.FileLogger" <br>prefix="apache_log." suffix=".txt" <br>timestamp="true"/&gt; <br>
<p>&lt;Realm className="org.apache.catalina.realm.MemoryRealm" /&gt; <br>
<p>&lt;/Engine&gt; <br>
<p>&lt;/Service&gt; <br>--&gt; <br>&lt;/Server&gt; <br>
<p>中的"&lt;!--"和"--&gt;"删掉,其实就是解除注释，因为这个网站是专门用来和apache的集成的。 <br>
<p>二、Apache与Tomcat4的整合 <br>
<p>　　1、首先安装Apache， <br>　　请注意Apache必须安装DSO模式，即在执行./configure时须加上 --enable-module=so <br>
<p>　　默认安装到/usr/local/apache目录下。本例安装的apache的版本是2.0.43系列的。 <br>
<p>　　2、制作mod_webapp.so <br>　　需要以下软件包： <br>　　jakarta-tomcat-connectors-4.x.xx-src.tar.gz <br>　　下载地址在tomcat对应版本的src目录下。例如，我安装的tomcat版本是4.1.12，则现在所需要的软件包的位置是： <br>　　<a href="http://jakarta.apache.org/builds/ja...1.12-src.tar.gz" target=_blank rel=nofollow><font color=#0000cc>http://jakarta.apache.org/builds/ja...1.12-src.tar.gz</font></a> <br>　　apr-0.9.1.tar.gz <br>　　下载地址：<a href="http://www.apache.org/dist/apr/apr-0.9.1.tar.gz" target=_blank rel=nofollow><font color=#0000cc>http://www.apache.org/dist/apr/apr-0.9.1.tar.gz</font></a> <br>　　autoconf-2.52-ximian.1.i386.rpm <br>　　下载地址：<a href="http://rpmfind.net/linux/RPM/helix/...ian.1.i386.html" target=_blank rel=nofollow><font color=#0000cc>http://rpmfind.net/linux/RPM/helix/...ian.1.i386.html</font></a> <br>　　先用rpm安装autoconf-2.52，因为下面的安装将要用到； <br>　　然后解开jakarta-tomcat-connectors-4.1.12-src.tar.gz，生成jakarta-tomcat-connectors&shy;-4.1.12-src目录， <br>　　进入jakarta-tomcat-connectors-4.1.12-src/webapp的目录里，再把apr-0.9.1.tar.gz解到这个目录下&shy;， <br>　　并把刚生成的目录apr-0.9.1的目录名改成apr。 <br>　　还是在webapp目录，运行以下命令： <br>　　# support/buildconf.sh <br>　　此时如果autoconf的版本低于2.52的话会报错退出，所以必须先安装autoconf-2.52。 <br>　　当命令成功结束后会在当前目录下生成configure文件。 <br>　　依次运行以下命令： <br>
<p>　　# ./configure --with-apxs=/usr/local/apache/bin/apxs <br>　　# make <br>　　# cp apache-2.0/mod_webapp.so /usr/local/apache/modules <br>
<p>　　现在mod_webapp.so已经制作好了，并已经拷贝到apache的modules目录下。 <br>　　编辑apache的配置文件，在最后加上如下几行： <br>　　＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>　　LoadModule webapp_module modules/mod_webapp.so <br>　　WebAppConnection Connector warp localhost:8008 <br>　　WebAppDeploy examples Connector /examples <br>　　＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>
<p>　　运行以下命令： <br>　　# /usr/local/apache/bin/apachectl configtest <br>
<p>如果出现错误说你的apache的httpd.conf有问题后面的错误是"inviad virual host" <br>
<p>就说明你的httpd.conf的ServerName没有设，把ServerName前面的"#"去掉就可以了！（这是差了好多资料才得到的答案，我也是在这&shy;儿困惑了好多天了） <br>
<p>　　只要出现&#8220;Syntax OK&#8221;就表明mod_webapp.so已经安装成功了。 <br>　　启动apache <br>　　# /usr/local/apache/bin/apachectl start <br>　　访问<a href="http://localhost/examples" target=_blank rel=nofollow><font color=#0000cc>http://localhost/examples</font></a> 就可以看到tomcat的例子程序了。 <br>
<p>注意：一定要先启动tomcat 然后再重新启动apache! <br>
<p>三、虚拟主机下的配置、管理和应用 <br>
<p>　　下面以一个例子来说明虚拟主机如何同时使用Apache与Tomcat4 <br>
<p>　　虚拟主机host1的目录结构如下所示： <br>
<p>　　/www　　　　　　　　　　　　　　　 <br>　　　|---host1　　虚拟主机host1的主目录 <br>　　　|　　|--htdocs 　普通根目录：用于显示静态页面或php程序 <br>　　　|　　|----logs　　apache访问日志 <br>　　　|　　|----webapps java应用目录（新加，与tomcat的webapps目录无任何关联） <br>　　　|　　　　　|--ROOT　jsp根目录：用于显示jsp页面程序 <br>　　　|　　　　　|----jive　一套java应用实例 <br>　　　|---host2　　　虚拟主机host2的主目录 <br>　　............ <br>
<p>　　原来的apache的配置文件是这样配置的： <br>
<p>　　＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>　　NameVirtualHost xxx.xxx.xxx.xxx <br>
<p>　　&lt; VirtualHost xxx.xxx.xxx.xxx &gt; <br>　　ServerName host1.mydomain.com <br>　　 ServerAdmin webmas<a href="http://groups.google.com/groups/unlock?msg=d22783929d69e265&amp;_done=/group/netkiller/browse_thread/thread/cea1bba548ff796f/d22783929d69e265%3Fq%3Djava%26rnum%3D8" target=_parent><font color=#0000cc>...</font></a>@mydomain.com <br>　　 DocumentRoot /www/host1/htdocs <br>　　 ErrorLog /www/host1/logs/error_log <br>　　CustomLog /www/host1/logs/access_log common <br>　　&lt; /VirtualHost &gt; <br>　　............. <br>
<p>　　＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>
<p>　　现在要让虚拟主机host1能同时使用Apache与Tomcat4，需要做如下配置： <br>
<p>　　1、编辑tomcat的配置文件server.xml，在最后的部分做如下修改： <br>
<p>　　＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>　　&lt; !-- Define an Apache-Connector Service -- &gt; <br>
<p>　　&lt; Service name="Tomcat-Apache" &gt; <br>
<p>　　&lt; Connector className="org.apache.catalina.connector.warp.WarpConnector" <br>　　port="8008" minProcessors="5" maxProcessors="75" <br>　　enableLookups="true" appBase="webapps" <br>　　acceptCount="10" debug="0"/ &gt; <br>
<p>&lt; Engine className="org.apache.catalina.connector.warp.WarpEngine" <br>　　name="Apache" debug="0" &gt; <br>
<p>　　&lt; Logger className="org.apache.catalina.logger.FileLogger" <br>　　prefix="apache_log." suffix=".txt" <br>timestamp="true"/ &gt; <br>
<p>　　&lt; Realm className="org.apache.catalina.realm.MemoryRealm" / &gt; <br>
<p>&lt; !-- 下面是新加的内容 -- &gt; <br>
<p>　　&lt; Host name="host1.mydomain.com" debug="0" appBase="/www/host1/webapps" <br>uppackWars="true" autoDeploy="true" &gt; <br>　　&lt; Context path="" docBase="ROOT" debug="0"/ &gt; <br>&lt; !-- 下面套用的是tomcat自带的管理页面，在虚拟主机下也可使用 -- &gt; <br>&lt; Context path="/manager" debug="0" privileged="true" <br>　　docBase="/opt/tomcat/server/webapps/manager"/ &gt; <br>　　&lt; Context path="/jive" docBase="jive" debug="0" <br>reloadable="true" crossContext="true"/ &gt; <br>　　&lt; Logger className="org.apache.catalina.logger.FileLogger" <br>prefix="host1_log." suffix=".txt" <br>　　timestamp="true"/ &gt; <br>　　&lt; /Host &gt; <br>
<p>&lt; !-- 新加内容结束 -- &gt; <br>
<p>&lt; /Engine &gt; <br>
<p>　　&lt; /Service &gt; <br>　　＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>　　2、编辑tomcat的管理权限文件tomcat-users.xml，在中间加一行： <br>&lt; user username="myname" password="mypasswd" roles="standard,manager"/ &gt; <br>　　3、编辑apache的配置文件，做如下修改 <br>　　＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>　　LoadModule webapp_module libexec/mod_webapp.so <br>　　AddModule mod_webapp.c <br>　　WebAppConnection warpConnection warp localhost:8008 <br>　　NameVirtualHost xxx.xxx.xxx.xxx <br>　　&lt; VirtualHost xxx.xxx.xxx.xxx &gt; <br>　　ServerName host1.mydomain.com <br>　　 ServerAdmin webmas<a href="http://groups.google.com/groups/unlock?msg=d22783929d69e265&amp;_done=/group/netkiller/browse_thread/thread/cea1bba548ff796f/d22783929d69e265%3Fq%3Djava%26rnum%3D8" target=_parent><font color=#0000cc>...</font></a>@mydomain.com <br>　　 DocumentRoot /www/host1/htdocs <br>　　 ErrorLog /www/host1/logs/error_log <br>　　 CustomLog /www/host1/logs/access_log common <br>
<p>　　 WebAppDeploy ROOT warpConnection / <br>
<p>　　#注：此行的作用是把ROOT目录作为虚拟主机URL的根，并使前面定义的根htdocs失效。 <br>　　#但如果不想整个虚拟主机都使用jsp页面程序，而想使用大量静态页面或php程序的话， <br>　　#就要使用下面这行，并把所有的静态页面和php程序放在htdocs目录下。 <br>　　# WebAppDeploy ROOT warpConnection /jsp <br>
<p>　　 WebAppDeploy manager warpConnection /manager <br>　　WebAppDeploy jive warpConnection /jive <br>　　#在server.xml里每定义一个都要在这里加一条WebAppDeploy。 <br>
<p>　　&lt; /VirtualHost &gt; <br>　　＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝ <br>
<p>　　4、将tomcat用户设成/www/host1/webapps以下所有目录文件的属主。 <br>
<p>　　要注意的是，以后如果想上传或改动该目录以下的文件，都要将其属主改成tomcat。 <br>　　（如果一直是以root身份运行tomcat，这步可以省略。） <br>
<p>　　# chown -R tomcat:tomcat /www/host1/webapps <br>　　5、重起tomcat： <br>　　# su - tomcat -c "/opt/tomcat/bin/shutdown.sh" <br>　　# su - tomcat -c "/opt/tomcat/bin/startup.sh" <br>　　6、重起apache： <br>　　/usr/local/apache/bin/apachectl restart <br>
<p>　　此时访问<a href="http://host1.mydomain.com/manager/html" target=_blank rel=nofollow><font color=#0000cc>http://host1.mydomain.com/manager/html</font></a> 会提示输入密码，在输入正确的 myname和mypasswd后，就会看到&#8220;Tomcat Web Application Manager&#8221;的页面，里面的 Application Path已经是虚拟主机里配置的信息了，并可以对其进行管理。 <br>　　到此虚拟主机下的配置和管理就全部完成，剩下的事情就是测试和应用了。在上面的例子 <br>　　里我们已经安装了jive，经测试已经可以正常运行 </p>
<img src ="http://www.blogjava.net/Javaphua/aggbug/108165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Javaphua/" target="_blank">Javaphua</a> 2007-04-03 11:42 <a href="http://www.blogjava.net/Javaphua/archive/2007/04/03/108165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Java源码分析：深入探讨Iterator模式</title><link>http://www.blogjava.net/Javaphua/archive/2007/03/21/105290.html</link><dc:creator>Javaphua</dc:creator><author>Javaphua</author><pubDate>Wed, 21 Mar 2007 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/Javaphua/archive/2007/03/21/105290.html</guid><wfw:comment>http://www.blogjava.net/Javaphua/comments/105290.html</wfw:comment><comments>http://www.blogjava.net/Javaphua/archive/2007/03/21/105290.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Javaphua/comments/commentRss/105290.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Javaphua/services/trackbacks/105290.html</trackback:ping><description><![CDATA[
		<h4>Java源码分析：深入探讨Iterator模式</h4>
		<hr color="#dfe0e3" />
		<p>作者：<a href="http://gceclub.sun.com.cn/yuanchuang/week-14/iterator.html#about">廖雪峰</a></p>
		<a name="about">
		</a>
		<h4>作者简介</h4>
		<br />
		<p>廖雪峰，软件工程师，现从事J2EE开发，您可以通过<a href="mailto:asklxf@163.com">asklxf@163.com</a>与他联系。</p>
		<h4>正文</h4>
		<br />
		<p>java.util包中包含了一系列重要的集合类。本文将从分析源码入手，深入研究一个集合类的内部结构，以及遍历集合的迭代模式的源码实现内幕。</p>
		<p>下面我们先简单讨论一个根接口Collection，然后分析一个抽象类AbstractList和它的对应Iterator接口，并仔细研究迭代子模式的实现原理。</p>
		<p>本文讨论的源代码版本是JDK 1.4.2，因为JDK 1.5在java.util中使用了很多泛型代码，为了简化问题，所以我们还是讨论1.4版本的代码。</p>
		<h4>集合类的根接口Collection</h4>
		<br />
		<p>Collection接口是所有集合类的根类型。它的一个主要的接口方法是：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    boolean add(Object c)
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>add()方法将添加一个新元素。注意这个方法会返回一个boolean，但是返回值不是表示添加成功与否。仔细阅读doc可以看到，Collection规定：如果一个集合拒绝添加这个元素，无论任何原因，都必须抛出异常。这个返回值表示的意义是add()方法执行后，集合的内容是否改变了（就是元素有无数量，位置等变化），这是由具体类实现的。即：如果方法出错，总会抛出异常；返回值仅仅表示该方法执行后这个Collection的内容有无变化。</p>
		<p>类似的还有：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    boolean addAll(Collection c);
    boolean remove(Object o);
    boolean removeAll(Collection c);
    boolean remainAll(Collection c);
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>Object[] toArray()方法很简单，把集合转换成数组返回。Object[] toArray(Object[] a)方法就有点复杂了，首先，返回的Object[]仍然是把集合的所有元素变成的数组，但是类型和参数a的类型是相同的，比如执行：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    String[] o = (String[])c.toArray(new String[0]);
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>得到的o实际类型是String[]。</p>
		<p>其次，如果参数a的大小装不下集合的所有元素，返回的将是一个新的数组。如果参数a的大小能装下集合的所有元素，则返回的还是a，但a的内容用集合的元素来填充。尤其要注意的是，如果a的大小比集合元素的个数还多，a后面的部分全部被置为null。</p>
		<p>最后一个最重要的方法是iterator()，返回一个Iterator（迭代子），用于遍历集合的所有元素。</p>
		<h4>用Iterator模式实现遍历集合</h4>
		<br />
		<p>Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来，从而避免向客户端暴露集合的内部结构。</p>
		<p>例如，如果没有使用Iterator，遍历一个数组的方法是使用索引：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    for(int i=0; i&lt;array.size(); i++) { ... get(i) ... }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>而访问一个链表（LinkedList）又必须使用while循环：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    while((e=e.next())!=null) { ... e.data() ... }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>以上两种方法客户端都必须事先知道集合的内部结构，访问代码和集合本身是紧耦合，无法将访问逻辑从集合类和客户端代码中分离出来，每一种集合对应一种遍历方法，客户端代码无法复用。</p>
		<p>更恐怖的是，如果以后需要把ArrayList更换为LinkedList，则原来的客户端代码必须全部重写。</p>
		<p>为解决以上问题，Iterator模式总是用同一种逻辑来遍历集合：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    for(Iterator it = c.iterater(); it.hasNext(); ) { ... }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>奥秘在于客户端自身不维护遍历集合的"指针"，所有的内部状态（如当前元素位置，是否有下一个元素）都由Iterator来维护，而这个Iterator由集合类通过工厂方法生成，因此，它知道如何遍历整个集合。</p>
		<p>客户端从不直接和集合类打交道，它总是控制Iterator，向它发送"向前"，"向后"，"取当前元素"的命令，就可以间接遍历整个集合。</p>
		<p>首先看看java.util.Iterator接口的定义：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    public interface Iterator {
        boolean hasNext();
        Object next();
        void remove();
    }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>依赖前两个方法就能完成遍历，典型的代码如下：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    for(Iterator it = c.iterator(); it.hasNext(); ) {
        Object o = it.next();
        // 对o的操作...
    }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在JDK1.5中，还对上面的代码在语法上作了简化：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    // Type是具体的类型，如String。
    for(Type t : c) {
        // 对t的操作...
    }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>每一种集合类返回的Iterator具体类型可能不同，Array可能返回ArrayIterator，Set可能返回SetIterator，Tree可能返回TreeIterator，但是它们都实现了Iterator接口，因此，客户端不关心到底是哪种Iterator，它只需要获得这个Iterator接口即可，这就是面向对象的威力。</p>
		<h4>Iterator源码剖析</h4>
		<br />
		<p>让我们来看看AbstracyList如何创建Iterator。首先AbstractList定义了一个内部类（inner class）：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    private class Itr implements Iterator {
        ...
    }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>而iterator()方法的定义是：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    public Iterator iterator() {
        return new Itr();
    }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>因此客户端不知道它通过Iterator it = a.iterator();所获得的Iterator的真正类型。</p>
		<p>现在我们关心的是这个申明为private的Itr类是如何实现遍历AbstractList的：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    private class Itr implements Iterator {
        int cursor = 0;
        int lastRet = -1;
        int expectedModCount = modCount;
    }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>Itr类依靠3个int变量（还有一个隐含的AbstractList的引用）来实现遍历，cursor是下一次next()调用时元素的位置，第一次调用next()将返回索引为0的元素。lastRet记录上一次游标所在位置，因此它总是比cursor少1。</p>
		<p>变量cursor和集合的元素个数决定hasNext()：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    public boolean hasNext() {
        return cursor != size();
    }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>方法next()返回的是索引为cursor的元素，然后修改cursor和lastRet的值：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    public Object next() {
        checkForComodification();
        try {
            Object next = get(cursor);
            lastRet = cursor++;
            return next;
        } catch(IndexOutOfBoundsException e) {
            checkForComodification();
            throw new NoSuchElementException();
        }
    }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>expectedModCount表示期待的modCount值，用来判断在遍历过程中集合是否被修改过。AbstractList包含一个modCount变量，它的初始值是0，当集合每被修改一次时（调用add，remove等方法），modCount加1。因此，modCount如果不变，表示集合内容未被修改。</p>
		<p>Itr初始化时用expectedModCount记录集合的modCount变量，此后在必要的地方它会检测modCount的值：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    final void checkForComodification() {
        if (modCount != expectedModCount)
            throw new ConcurrentModificationException();
    }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>如果modCount与一开始记录在expectedModeCount中的值不等，说明集合内容被修改过，此时会抛出ConcurrentModificationException。</p>
		<p>这个ConcurrentModificationException是RuntimeException，不要在客户端捕获它。如果发生此异常，说明程序代码的编写有问题，应该仔细检查代码而不是在catch中忽略它。</p>
		<p>但是调用Iterator自身的remove()方法删除当前元素是完全没有问题的，因为在这个方法中会自动同步expectedModCount和modCount的值：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    public void remove() {
        ...
        AbstractList.this.remove(lastRet);
        ...
        // 在调用了集合的remove()方法之后重新设置了expectedModCount：
        expectedModCount = modCount;
        ...
    }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>要确保遍历过程顺利完成，必须保证遍历过程中不更改集合的内容（Iterator的remove()方法除外），因此，确保遍历可靠的原则是只在一个线程中使用这个集合，或者在多线程中对遍历代码进行同步。</p>
		<p>最后给个完整的示例：</p>
		<table class="grey4" cellspacing="0" cellpadding="10" border="0">
				<tbody>
						<tr>
								<td>
										<pre>    Collection c = new ArrayList();
    c.add("abc");
    c.add("xyz");
    for(Iterator it = c.iterator(); it.hasNext(); ) {
        String s = (String)it.next();
        System.out.println(s);
    }
</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>如果你把第一行代码的ArrayList换成LinkedList或Vector，剩下的代码不用改动一行就能编译，而且功能不变，这就是针对抽象编程的原则：对具体类的依赖性最小。</p>
<img src ="http://www.blogjava.net/Javaphua/aggbug/105290.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Javaphua/" target="_blank">Javaphua</a> 2007-03-21 15:54 <a href="http://www.blogjava.net/Javaphua/archive/2007/03/21/105290.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 10g的一个小问题</title><link>http://www.blogjava.net/Javaphua/archive/2007/01/05/91948.html</link><dc:creator>Javaphua</dc:creator><author>Javaphua</author><pubDate>Fri, 05 Jan 2007 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/Javaphua/archive/2007/01/05/91948.html</guid><wfw:comment>http://www.blogjava.net/Javaphua/comments/91948.html</wfw:comment><comments>http://www.blogjava.net/Javaphua/archive/2007/01/05/91948.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/Javaphua/comments/commentRss/91948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Javaphua/services/trackbacks/91948.html</trackback:ping><description><![CDATA[        今天很郁闷，昨天刚装的orage 10g,当时启动OracleDBConsoleoradb服务没有什么问题，可是今天早上就无法启动起来，查看windows事件日志，发现启动报错，错误描述“An error occured while trying to initialize the service.”。<br />         启动N次也无法启动，重启操作系统，也是一样的错误，很恼火，拔掉网线一试，成功启动了，不知为什么，特向高手们请教？（oracle 10g是在不联网的状态下安装的，会不会跟安装有问题？）。<img src ="http://www.blogjava.net/Javaphua/aggbug/91948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Javaphua/" target="_blank">Javaphua</a> 2007-01-05 12:56 <a href="http://www.blogjava.net/Javaphua/archive/2007/01/05/91948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>［转］一个程序员的成长的六个阶段</title><link>http://www.blogjava.net/Javaphua/archive/2006/12/30/91002.html</link><dc:creator>Javaphua</dc:creator><author>Javaphua</author><pubDate>Sat, 30 Dec 2006 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/Javaphua/archive/2006/12/30/91002.html</guid><wfw:comment>http://www.blogjava.net/Javaphua/comments/91002.html</wfw:comment><comments>http://www.blogjava.net/Javaphua/archive/2006/12/30/91002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Javaphua/comments/commentRss/91002.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Javaphua/services/trackbacks/91002.html</trackback:ping><description><![CDATA[
		<div class="subtable altbg2 t_msg" style="WIDTH: auto; HEIGHT: auto">
				<b>一个程序员的成长的六个阶段</b>
				<br />
				<br />本文转自csai，挺有意思<br /><br /><br /><br />第一阶段<br /><br />此阶段主要是能熟练地使用某种语言。这就相当于练武中的套路和架式这些表面的东西。<br /><br />第二阶段<br /><br />此阶段能精通基于某种平台的接口（例如我们现在常用的Win 32的API函数）以及所对应语言的自身的库函数。到达这个阶段后，也就相当于可以进行真实散打对练了，可以真正地在实践中做些应用。<br /><br />第三阶段<br /><br />此阶段能深入地了解某个平台系统的底层，已经具有了初级的内功的能力，也就是“手中有剑，心中无剑”。<br /><br />第四阶级<br /><br />此阶段能直接在平台上进行比较深层次的开发。基本上，能达到这个层次就可以说是进入了高层次。这时进入了高级内功的修炼。比如能进行VxD或操作系统的内核的修改。<br /><br />这时已经不再有语言的束缚，语言只是一种工具，即使要用自己不会的语言进行开发，也只是简单地熟悉一下，就手到擒来，完全不像是第一阶段的时候学习语言的那种情况。一般来说，从第三阶段过渡到第四阶段是比较困难的。为什么会难呢？这就是因为很多人的思想变不过来。<br /><br />第五阶级<br /><br />此阶段就已经不再局限于简单的技术上的问题了，而是能从全局上把握和设计一个比较大的系统体系结构，从内核到外层界面。可以说是“手中无剑，心中有剑”。到了这个阶段以后，能对市面上的任何软件进行剖析，并能按自己的要求进行设计，就算是MS Word这样的大型软件，只要有充足的时间，也一定会设计出来。<br /><br />第六阶级<br /><br />此阶段也是最高的境界，达到“无招胜有招”。这时候，任何问题就纯粹变成了一个思路的问题，不是用什么代码就能表示的。也就是“手中无剑，心中也无剑”。<br /><br />此时，对于练功的人来说，他已不用再去学什么少林拳，只是在旁看一下少林拳的对战，就能把此拳拿来就用。这就是真正的大师级的人物。这时，Win 32或Linux在你眼里是没有什么差别的。<br /><br />每一个阶段再向上发展时都要按一定的方法。第一、第二个阶段通过自学就可以完成，只要多用心去研究，耐心地去学习。<br /><br />要想从第二个阶段过渡到第三个阶段，就要有一个好的学习环境。例如有一个高手带领或公司里有一个好的练手环境。经过二、三年的积累就能达到第三个阶段。但是，有些人到达第三个阶段后，常常就很难有境界上的突破了。他们这时会产生一种观念，认为软件无非如此，认为自己已无所不能。其实，这时如果遇到大的或难些的软件，他们往往还是无从下手。<br /><br />现在我们国家大部分程序员都是在第二、三级之间。他们大多都是通过自学成才的，不过这样的程序员一般在软件公司也能独当一面，完成一些软件的模块。<br /><br />但是，也还有一大堆处在第一阶段的程序员，他们一般就能玩玩VB，做程序时，去找一堆控件集成一个软件。</div>
<img src ="http://www.blogjava.net/Javaphua/aggbug/91002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Javaphua/" target="_blank">Javaphua</a> 2006-12-30 13:55 <a href="http://www.blogjava.net/Javaphua/archive/2006/12/30/91002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>