??xml version="1.0" encoding="utf-8" standalone="yes"?>
一艘没有航行目标的船,M方向的风都是逆风
1、你Z么是IhQ第一点就是你没有立下成ؓ富h的目?
2、你的h生核心目标是什么?
杰出人士与^怹辈的Ҏ差别q不是天赋、机遇,而在于有无目标?
3、v跑领先一步,人生领先一大步Q?a title=成功技? target=_blank>成功从选定目标开?
4、贾金斯式的人永q不会成?
Z么大多数人没有成功?真正能完成自p划的人只?%Q大多数Z是将自己的目标舍弃,是沦ؓ~Z行动的空?
5、如果你惛_35岁以前成功,你一定在25?0岁之间确立好你的人生目标
6、每日、每月、每q都要问自己Q我是否辑ֈ了自己定下的目标
二:两个成功基点
?/font>好位|,调正心态,努力冲刺Q?5岁以前成?
(一)人生定位
1、h怕入错行Q你的核心竞争力是什么?
2、成功者找ҎQ失败者找借口
3、从三百六十行中选择你的最?
Zh都可以创业,但却不是Zh都能创业成功
4、寻找自q黄金宝地
(?永恒的真理:心态决定命q,35岁以前的心态决定你一生的命运
1、不满现状的人才能成为富?
2、敢于梦惻I勇于梦想Q这个世界永q属于追梦的?
3?35岁以前不要怕,35岁以后不要悔
4、出w民,q一辈子是民,只要你永q保持那颗进取的心。中国成功h士大多来自小地方
5、做一个积极的思维?
6、不要|l悲观的自己
有的人比你富有一千倍,他们也会比你聪明一千倍么Q不会,他们只是q轻时心气比你高一千倍?
人生的好多次p|Q最后ƈ不是败给别hQ而是败给了悲观的自己?
7、成功者不q是爬v来比倒下d一?
8、宁可去壁Q也不要在家里面?
克服你的p|、消极的心?
(1)找个地方喝点?
(2)找个q厅跌?
(3)扑ָ朋友侃侃?
(4)U极行动h
三:三大技?/strong>
1、管理时_你的旉在哪里,你的成就在哪里?
把一时看成60分钟的hQ比看作一时的h?0?
2、你不理财,财不理你
3、自我管理,游刃有余
(1)创业不怕本,脑子一定要?
(2)可以开家特色店
(3)做别Z愿做的生?
四:四项安n立命的理?/strong>
35岁以前一定要形成个h风格
1、做Z于做?
做事p|可以重来Q做人失败却不能重来
(1)做h要讲义气
(2)怸气馁
2、豁辄男h有胦q,豁达的女人有帮夫q?
35岁以前搞定婚ȝz?
3、忠诚的原则Q?5岁以前你q没有徏立v忠诚誉Q这一~点要困扰你的一?/p>
4、把事做细Q但不要耍小聪明
中国人想做大事的人太多,而愿把小事做完美的h太少
五:五分q气
比尔·盖茨_人生是不公^的,习惯L受它?
1、h生的有很多q气的成人:谋事在hQ成事在天:中国的古训说明各占一?
2、机会时常意外地降Q但属于那些不应决不攑ּ的h
3、抓住h生的每一ơ机?
Z像一只小鸟,如果你不抓住Q它׃飞得无媄无踪
4、者早一步,愚者晚一?
六:六项要求
1、智?
(1)别h可你以拿C的一切,但拿不走你的智慧
(2)巧妙q用自己的智?
(3)与愚者的区别
2、勇?
(1)勇气的力量有时会让你成ؓ“h”
(2)敢于攑ּQ敢?#8220;舍得”
3、培养自q“领导才能、领袖气?#8221;
(1)Ȁ情感染别?
(2)“?#183;七法?#8221;实现领袖气质
(3)拍板x能力
(4)人格力
4、创造性:不要做@规蹈矩的?
25-35岁是人生最有创造性的阶段Q很多成功h士也都生在q一阶段
5、明?
(1)知道自己的长处、短处,定向聚焦
(2)量在自q熟悉的领域努?
6、持之以恒的行动力:在你选定行业坚持十年Q你一定会成ؓ大赢?
七:七分学习
1、知识改变命q?
2?5岁以前学会你行业中必要的一切知?
a)每天淘汰你自?
b)在商a?
3、太怿的书人,只能成ؓ打工?
4、思考、实c再思考、再实践
八:八分交际
朋友多了路好?
1、智商很重要Q情商更重要Q?5岁以前徏立v人际关系|?
2、h脉即财脉Q如何搞好h际关p?
3、交友有原则
4、善于沟通:35岁以前要ȝq演讲才能
九:九分习惯
习惯的力量是惊h的,35岁以前养成的习惯军_着你的成功的大?
1、积极思维的好习惯
2、养成高效工作的好习?
(1)办公?
(2)生活可以不拘节Q但要把工作做细
(3)学习聆听Q不打断别h说话
3、养成锻Dn体的好习?
4、广泛爱好的好习?
5、快速行动的好习?
十:十分自信
1、自信是成功的精支?
2、自信方能赢得别人的信Q
3、把自信建立在创造h值的基础?/p>
4、如何徏立自?
(1)q立目?
(2)发挥自己的长?
(3)做事要有计划
(4)做事不拖?
(5)L不要攑ּ
(6)学会自我Ȁ?
(7)不要让自己成为别?十一Q?11个需要避开的成功陷?/strong>
1、只有功劻I没有苦劳
2、不?#8220;怀才不?#8220;Q而要L机遇
3、不要想发横?
4、不要ؓp工作,而让׃ؓ你工?
5、盲目跟风,Z亦云Qh做我也做
6、小富即安,不思进取,知怹
7、承认错误而非掩饰错误
8、脚t实地而非惛_非非
9、野心太大而不是信心十?
10、反复蟩槽不可取
11、眼高手?
12、不择手D?
十二Q十二分努力
没有随随便便成功
1、小不是成功Q大不是成功Q由变大才是成?
2、中国社会进入微利时代:巧干+敢干+实干=成功
3、努力尝试就有成功的可能
4、做M事情Q尽最大努?
5、把事情当成事业来做
6、我看打工?
7、祝你早日掘到第一桉来源
Ajax -- Asynchronous JavaScript and XML Ajax 使用的是JavaScript + DOM + CSS + XMLHttpRequest的技?是目前Web2.0更加行的技?
与传l网l应用相?Ajax具备更加直观和方便的用户交互. Z么呢? 比如, 我们需要点击链接或按钮来激发事?而用Ajax只要Ud鼠标或者在一个输入框输入字母已经可以触发事g. 传统的网l应用是Zpage-driven的模? 使用的是'click, wait a refresh the whole page' 模式, 而Ajax是通过data-driven的模式来提供|络面? 采用的是部分面更新的模? 面中只更新有新数据的部?其它的部分依然不?所以依然可以操?
Ajaxp它的名字一? 可以异步地在览器和服务器之间进行交? 当服务器端处理submitq来的数据的同时, 客户依然可以正常地处理浏览器端同一面的其他功?
那么Ajax和传l网l应用相比是怎样工作的呢?下面q张囑֏以让你了解清?
传统的网l应用在览器和服务器之间的交流是直来直ȝ, 而Ajax的网l应用在览器中有一个Ajax引擎,q个引擎实际上就是一个Javascript的对象XMLHttpRequest, 而XMLHttpRequest负责览器和服务器的异步交流.
XMLHttpRequest既然是Javascript的对? 当然需要一些Javascript的代码来生成, 它目前支持大部分的浏览器,包括了Mozilla, Firefox{等.
服务器端依然可以使用传统的技术如servlet, JSP, JSF,Struts{等,但会有一些小的限?比如客户端会发更频繁的请?而响应这些请求的cd包括text/xml, text/plain, text/json, text/javascript.
整个Ajax的操作过E分Z?
1.A client event occurs
2.An XMLHttpRequest object is created
3.The XMLHttpRequest object is configured
4.The XMLHttpRequest object makes an async. request
5.The ValidateServlet returns an XML document containing the result
6.The XMLHttpRequest object calls the callback() function and processes the result
7.The HTML DOM is updated
我们分别来看看这七个步骤是怎么做的: 1. A client event occurs,
<input type="text"
size="20"
id="userid"
name="id"
onkeyup="validateUserId();">
比如我们手头上有q样一DJavascript的代? q是一个ID为userid的文本框,里面包含了一个Javascript的函?当我们在文本框里打入一个英文字母时,会激发onkeyup的事?从而激发validateUserId的Javascript的函?
2.An XMLHttpRequest object is created
var req;
function initRequest() {
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
} else if (window.ActiveXObject) {
isIE = true;
req = new ActiveXObject("Microsoft.XMLHTTP");
}
}
function validateUserId() {
initRequest();
req.onreadystatechange = processRequest;
if (!target) target = document.getElementById("userid");
var url = "validate?id=" + escape(target.value);
req.open("GET", url, true);
req.send(null);
}
validateUserId的Javascript的函数调用initRequest函数生成XMLHttpRequest对象, 大家注意到在initRequest函数里面有两U生成XMLHttpRequest的方?q是针对不同的浏览器的做?对于Mozilla,我们可以直接使用"new XMLHttpRequest()”, 而对于IE,我们需要生成ActiveX对象.
3.The XMLHttpRequest object is configured
rvalidateUserId的Javascript的函数包含一句req.onreadystatechange = processRequest; q是通过讑֮XMLHttpRequest对象里面的onreadystatechangeҎؓ回调函数.
4.The XMLHttpRequest object makes an async. request
if (!target) target = document.getElementById("userid");
var url = "validate?id=" + escape(target.value);
req.open("GET", url, true);
req.send(null);
然后XMLHttpRequest调用openҎ和服务器交流, openҎ有三个参? HTTPҎ是Getq是Post, 服务器端的URL, 方式采取异步q是同步.
5.The ValidateServlet returns an XML document containing the result
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
String targetId = request.getParameter("id");
if ((targetId != null) && !accounts.containsKey(targetId.trim())) {
response.setContentType("text/xml ");
response.setHeader("Cache-Control", "no-cache");
response.getWriter().write("<valid>true</valid>");
} else {
response.setContentType("text/xml ");
response.setHeader("Cache-Control", "no-cache");
response.getWriter().write("<valid>false</valid>");
}
}
然后是服务器端ValidateServlet的响?首先Content type设ؓtext/xml, Cache-Control设ؓno-cache, 最后会q回true或者false的xml格式响应.
6.The XMLHttpRequest object calls the callback() function and processes the result
function processRequest() {
if (req.readyState == 4) {
if (req.status == 200) {
var message = ...;
现在控制交回l客L, ׃我们讑֮了回调函CؓprocessRequest, 那么当响应从服务器端回到客户端浏览器,激发了processRequest函数, 我们在processRequest函数中检查XMLHttpRequest对象的readyState状态是否ؓ4和status状态是否ؓ200,如果两者同时成?׃表服务器端的数据已经成功q回l客L,那么可以执行下面的处理.
7.The HTML DOM is updated.
接收完服务器端传回来的数据后,览器开始着手显C接收回的数?
我们通过面里面?lt;div>元素来唯一的表CZ个对象给DOM的API使用. 比如定html面某一处的需要显C的信息文本对象,我们可以使用userIdMessage唯一的标{来做引用给DOM的API使用. 如下面这D代?
23.<body>
24. <div id="userIdMessage"></div>
25.</body>
一但你有了唯一定的引?你就可以使用DOM的API对其q行随心所Ʋ的操作,如属性的修改{等,比如下面q段代码:
1. <script type="text/javascript">
2. function setMessageUsingDOM(message) {
3. var userMessageElement = document.getElementById("userIdMessage");
4. var messageText;
5. if (message == "false") {
6. userMessageElement.style.color = "red";
7. messageText = "Invalid User Id";
8. } else {
9. userMessageElement.style.color = "green";
10. messageText = "Valid User Id";
11. }
12. var messageBody = document.createTextNode(messageText);
13. // if the messageBody element has been created simple replace it otherwise
14. // append the new element
15. if (userMessageElement.childNodes[0]) {
16. userMessageElement.replaceChild(messageBody,
17. userMessageElement.childNodes[0]);
18. } else {
19. userMessageElement.appendChild(messageBody);
20. }
21.}
22.</script>
23.<body>
24. <div id="userIdMessage"></div>
25.</body>
在这里javascript通过了getElementByIdҎ得到了userIdMessage对象,然后Ҏ务器端返回的数据q行Ҏ,如果值是true,在userIdMessage里添加文?Valid User Id", 如果值是false,则在userIdMessage里添加文?Invalid User Id".
大概是q样的一个状?那么在Ajax里面的XMLHttpRequestq有很多Ҏ和属? 包括:
Ҏ:
• open(“HTTP method”, “URL”, syn/asyn)
> Assigns HTTP method, destination URL, mode
• send(content)
> Sends request including string or DOM object data
• abort()
> Terminates current request
• getAllResponseHeaders()
> Returns headers (labels + values) as a string
• getResponseHeader(“header”)
> Returns value of a given header
• setRequestHeader(“label”,”value”)
> Sets Request Headers before sending
属?
• onreadystatechange
> Set with an JavaScript event handler that fires at each
change
• readyState – current status of request
> 0 = uninitialized
> 1 = loading
> 2 = loaded
> 3 = interactive (some data has been returned)
> 4 = complete
• status
> HTTP Status returned from server: 200 = OK
• responseText
> String version of data returned from the server
• responseXML
> XML document of data returned from the server
• statusText
> Status text returned from server
Posted at 05:22PM Jul 10, 2007 by Benny Luo
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
中红色标识的localhost改ؓ机器名,如:mycoputer
--------------------------------------------------------------------------------
作者:luyongshou 2005-02-02 15:04:45 来自QLinux先生 在此介绍一下我在RedHat Linux 7.2下装Apache与Tomcat4整合的过E,重点讲述mod_webapp.so的制作方法,
以及在虚拟主机环境下的配|、管理和应用Q经试已经成功。希望对各位有所帮助Q如有错误也h正?
一、正安装Tomcat4
必要软g的安装,如下Q?
1、Java SDK
版本1.3.1?.4Q徏议安装在/usr/java下,q做一个jdk的Y链接?
如果在装版本1.3.1的SDK出现问题Q请阅读文档Q?a target=_blank rel=nofollow>http://java.sun.com/j2se/1.3/install-linux-sdk.html
2、Tomcat4
安装最新release版本的二q制文g安装包。当前最新的tomcat版本?.1.12?
下蝲地址Q?
http://jakarta.apache.org/builds/ja...t-4.1.12.tar.gz
下蝲后接压到一个目?"tar xvzf jakarta-tomcat-4.1.12.tar.gz"
本例tomcat安装?opt目录下,q做了个tomcat的Y链接?
讄如下环境变量q启用:
PATH=$PATH:/usr/java/jdk/bin:/usr/java/jdk/jre/bin
JAVA_HOME=/usr/java/jdk
export JAVA_HOME
CLASSPATH="./:/usr/java/jdk/lib:/usr/java/jdk/jre/lib"
export CLASSPATH
CATALINA_HOME=/opt/tomcat
export CATALINA_HOME
单徏一个用户tomcatQ将其设?opt/tomcat以下所有目录文件的属主Qƈ由它启动tomcatQ?
# useradd tomcat
# chown -R tomcat:tomcat /opt/tomcat
# su - tomcat -c "/opt/tomcat/bin/startup.sh"
讉Khttp://localhost:8080/ 应能看到tomcat安装成功的页面?
===================================================================
如果惛_apache集成需要修改tomcat/conf/server.xmlq个文g?
<!-- Define an Apache-Connector Service -->
<Service name="Tomcat-Apache">
<!--
<Connector className="org.apache.catalina.connector.warp.WarpConnector"
port="8008" minProcessors="5" maxProcessors="75"
enableLookups="true" appBase="webapps"
acceptCount="10" debug="0"/>
<Engine className="org.apache.catalina.connector.warp.WarpEngine"
name="Apache" debug="0">
<Logger className="org.apache.catalina.logger.FileLogger"
prefix="apache_log." suffix=".txt"
timestamp="true"/>
<Realm className="org.apache.catalina.realm.MemoryRealm" />
</Engine>
</Service>
-->
</Server>
中的"<!--"?-->"删掉,其实是解除注释Q因个网站是专门用来和apache的集成的?
二、Apache与Tomcat4的整?
1、首先安装ApacheQ?
h意Apache必须安装DSO模式Q即在执?/configure旉加上 --enable-module=so
默认安装?usr/local/apache目录下。本例安装的apache的版本是2.0.43pd的?
2、制作mod_webapp.so
需要以下Y件包Q?
jakarta-tomcat-connectors-4.x.xx-src.tar.gz
下蝲地址在tomcat对应版本的src目录下。例如,我安装的tomcat版本?.1.12Q则现在所需要的软g包的位置是:
http://jakarta.apache.org/builds/ja...1.12-src.tar.gz
apr-0.9.1.tar.gz
下蝲地址Q?a target=_blank rel=nofollow>http://www.apache.org/dist/apr/apr-0.9.1.tar.gz
autoconf-2.52-ximian.1.i386.rpm
下蝲地址Q?a target=_blank rel=nofollow>http://rpmfind.net/linux/RPM/helix/...ian.1.i386.html
先用rpm安装autoconf-2.52Q因Z面的安装要用到Q?
然后解开jakarta-tomcat-connectors-4.1.12-src.tar.gzQ生成jakarta-tomcat-connectors-4.1.12-src目录Q?
q入jakarta-tomcat-connectors-4.1.12-src/webapp的目录里Q再把apr-0.9.1.tar.gz解到q个目录?shy;Q?
q把刚生成的目录apr-0.9.1的目录名Ҏapr?
q是在webapp目录Q运行以下命令:
# support/buildconf.sh
此时如果autoconf的版本低?.52的话会报错退出,所以必d安装autoconf-2.52?
当命令成功结束后会在当前目录下生成configure文g?
依次q行以下命oQ?
# ./configure --with-apxs=/usr/local/apache/bin/apxs
# make
# cp apache-2.0/mod_webapp.so /usr/local/apache/modules
现在mod_webapp.so已经制作好了Qƈ已经拯到apache的modules目录下?
~辑apache的配|文Ӟ在最后加上如下几行:
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=
LoadModule webapp_module modules/mod_webapp.so
WebAppConnection Connector warp localhost:8008
WebAppDeploy examples Connector /examples
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=
q行以下命oQ?
# /usr/local/apache/bin/apachectl configtest
如果出现错误说你的apache的httpd.conf有问题后面的错误?inviad virual host"
p明你的httpd.conf的ServerName没有设,把ServerName前面?#"L可以了Q(q是差了好多资料才得到的{案Q我也是在这儿困惑了好多天了Q?
只要出现“Syntax OK”p明mod_webapp.so已经安装成功了?
启动apache
# /usr/local/apache/bin/apachectl start
讉Khttp://localhost/examples 可以看到tomcat的例子程序了?
注意Q一定要先启动tomcat 然后再重新启动apache!
三、虚拟主Z的配|、管理和应用
下面以一个例子来说明虚拟L如何同时使用Apache与Tomcat4
虚拟Lhost1的目录结构如下所C:
/www
|---host1 虚拟Lhost1的主目录
| |--htdocs 普通根目录Q用于显C静态页面或phpE序
| |----logs apache讉K日志
| |----webapps java应用目录Q新加,与tomcat的webapps目录无Q何关联)
| |--ROOT jsp根目录:用于昄jsp面E序
| |----jive 一套java应用实例
|---host2 虚拟Lhost2的主目录
............
原来的apache的配|文件是q样配置的:
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?
NameVirtualHost xxx.xxx.xxx.xxx
< VirtualHost xxx.xxx.xxx.xxx >
ServerName host1.mydomain.com
ServerAdmin webmas...@mydomain.com
DocumentRoot /www/host1/htdocs
ErrorLog /www/host1/logs/error_log
CustomLog /www/host1/logs/access_log common
< /VirtualHost >
.............
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?
现在要让虚拟Lhost1能同时用Apache与Tomcat4Q需要做如下配置Q?
1、编辑tomcat的配|文件server.xmlQ在最后的部分做如下修改:
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?
< !-- Define an Apache-Connector Service -- >
< Service name="Tomcat-Apache" >
< Connector className="org.apache.catalina.connector.warp.WarpConnector"
port="8008" minProcessors="5" maxProcessors="75"
enableLookups="true" appBase="webapps"
acceptCount="10" debug="0"/ >
< Engine className="org.apache.catalina.connector.warp.WarpEngine"
name="Apache" debug="0" >
< Logger className="org.apache.catalina.logger.FileLogger"
prefix="apache_log." suffix=".txt"
timestamp="true"/ >
< Realm className="org.apache.catalina.realm.MemoryRealm" / >
< !-- 下面是新加的内容 -- >
< Host name="host1.mydomain.com" debug="0" appBase="/www/host1/webapps"
uppackWars="true" autoDeploy="true" >
< Context path="" docBase="ROOT" debug="0"/ >
< !-- 下面套用的是tomcat自带的管理页面,在虚拟主Z也可使用 -- >
< Context path="/manager" debug="0" privileged="true"
docBase="/opt/tomcat/server/webapps/manager"/ >
< Context path="/jive" docBase="jive" debug="0"
reloadable="true" crossContext="true"/ >
< Logger className="org.apache.catalina.logger.FileLogger"
prefix="host1_log." suffix=".txt"
timestamp="true"/ >
< /Host >
< !-- 新加内容l束 -- >
< /Engine >
< /Service >
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?
2、编辑tomcat的管理权限文件tomcat-users.xmlQ在中间加一行:
< user username="myname" password="mypasswd" roles="standard,manager"/ >
3、编辑apache的配|文Ӟ做如下修?
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?
LoadModule webapp_module libexec/mod_webapp.so
AddModule mod_webapp.c
WebAppConnection warpConnection warp localhost:8008
NameVirtualHost xxx.xxx.xxx.xxx
< VirtualHost xxx.xxx.xxx.xxx >
ServerName host1.mydomain.com
ServerAdmin webmas...@mydomain.com
DocumentRoot /www/host1/htdocs
ErrorLog /www/host1/logs/error_log
CustomLog /www/host1/logs/access_log common
WebAppDeploy ROOT warpConnection /
#注:此行的作用是把ROOT目录作ؓ虚拟LURL的根Qƈ使前面定义的根htdocs失效?
#但如果不x个虚拟主机都使用jsp面E序Q而想使用大量静态页面或phpE序的话Q?
#p使用下面q行Qƈ把所有的静态页面和phpE序攑֜htdocs目录下?
# WebAppDeploy ROOT warpConnection /jsp
WebAppDeploy manager warpConnection /manager
WebAppDeploy jive warpConnection /jive
#在server.xml里每定义一个都要在q里加一条WebAppDeploy?
< /VirtualHost >
Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q=Q?
4、将tomcat用户设成/www/host1/webapps以下所有目录文件的属主?
要注意的是,以后如果想上传或改动该目录以下的文gQ都要将其属L成tomcat?
Q如果一直是以rootw䆾q行tomcatQ这步可以省略。)
# chown -R tomcat:tomcat /www/host1/webapps
5、重起tomcatQ?
# su - tomcat -c "/opt/tomcat/bin/shutdown.sh"
# su - tomcat -c "/opt/tomcat/bin/startup.sh"
6、重起apacheQ?
/usr/local/apache/bin/apachectl restart
此时讉Khttp://host1.mydomain.com/manager/html 会提C入密码,在输入正的 myname和mypasswd后,׃看到“Tomcat Web Application Manager”的页面,里面?Application Path已经是虚拟主机里配置的信息了Qƈ可以对其q行理?
到此虚拟L下的配置和管理就全部完成Q剩下的事情是试和应用了。在上面的例?
里我们已l安装了jiveQ经试已经可以正常q行
作者:廖雪?/a>
廖雪峎ͼ软g工程师,C事J2EE开发,您可以通过asklxf@163.com与他联系?/p>
java.util包中包含了一pd重要的集合类。本文将从分析源码入手,深入研究一个集合类的内部结构,以及遍历集合的P代模式的源码实现内幕?/p>
下面我们先简单讨Z个根接口CollectionQ然后分析一个抽象类AbstractList和它的对应Iterator接口Qƈ仔细研究q代子模式的实现原理?/p>
本文讨论的源代码版本是JDK 1.4.2Q因为JDK 1.5在java.util中用了很多泛型代码Qؓ了简化问题,所以我们还是讨?.4版本的代码?/p>
Collection接口是所有集合类的根cd。它的一个主要的接口Ҏ是:
boolean add(Object c) |
add()Ҏ添加一个新元素。注意这个方法会q回一个booleanQ但是返回g是表C添加成功与否。仔l阅读doc可以看到QCollection规定Q如果一个集合拒l添加这个元素,无论M原因Q都必须抛出异常。这个返回DC的意义是add()Ҏ执行后,集合的内Ҏ否改变了Q就是元素有无数量,位置{变化)Q这是由具体cd现的。即Q如果方法出错,M抛出异常Q返回g仅表CҎ执行后这个Collection的内Ҏ无变化?/p>
cM的还有:
boolean addAll(Collection c); boolean remove(Object o); boolean removeAll(Collection c); boolean remainAll(Collection c); |
Object[] toArray()Ҏ很简单,把集合{换成数组q回。Object[] toArray(Object[] a)Ҏ有点复杂了Q首先,q回的Object[]仍然是把集合的所有元素变成的数组Q但是类型和参数a的类型是相同的,比如执行Q?/p>
String[] o = (String[])c.toArray(new String[0]); |
得到的o实际cd是String[]?/p>
其次Q如果参数a的大装不下集合的所有元素,q回的将是一个新的数l。如果参数a的大能装下集合的所有元素,则返回的q是aQ但a的内容用集合的元素来填充。尤其要注意的是Q如果a的大比集合元素的个数还多,a后面的部分全部被|ؓnull?/p>
最后一个最重要的方法是iterator()Q返回一个IteratorQP代子Q,用于遍历集合的所有元素?/p>
Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合cM抽象出来Q从而避免向客户端暴露集合的内部l构?/p>
例如Q如果没有用IteratorQ遍历一个数l的Ҏ是用烦引:
for(int i=0; i<array.size(); i++) { ... get(i) ... } |
而访问一个链表(LinkedListQ又必须使用while循环Q?/p>
while((e=e.next())!=null) { ... e.data() ... } |
以上两种Ҏ客户端都必须事先知道集合的内部结构,讉K代码和集合本w是紧耦合Q无法将讉K逻辑从集合类和客L代码中分d来,每一U集合对应一U遍历方法,客户端代码无法复用?/p>
更恐怖的是,如果以后需要把ArrayList更换为LinkedListQ则原来的客L代码必须全部重写?/p>
决以上问题,Iterator模式L用同一U逻辑来遍历集合:
for(Iterator it = c.iterater(); it.hasNext(); ) { ... } |
奥秘在于客户端自w不l护遍历集合?指针"Q所有的内部状态(如当前元素位|,是否有下一个元素)都由Iterator来维护,而这个Iterator由集合类通过工厂Ҏ生成Q因此,它知道如何遍历整个集合?/p>
客户端从不直接和集合cL交道Q它L控制IteratorQ向它发?向前"Q?向后"Q?取当前元?的命令,可以间接遍历整个集合?/p>
首先看看java.util.Iterator接口的定义:
public interface Iterator { boolean hasNext(); Object next(); void remove(); } |
依赖前两个方法就能完成遍历,典型的代码如下:
for(Iterator it = c.iterator(); it.hasNext(); ) { Object o = it.next(); // 对o的操?.. } |
在JDK1.5中,q对上面的代码在语法上作了简化:
// Type是具体的cdQ如String? for(Type t : c) { // 对t的操?.. } |
每一U集合类q回的Iterator具体cd可能不同QArray可能q回ArrayIteratorQSet可能q回SetIteratorQTree可能q回TreeIteratorQ但是它们都实现了Iterator接口Q因此,客户端不兛_到底是哪UIteratorQ它只需要获得这个Iterator接口卛_Q这是面向对象的威力?/p>
让我们来看看AbstracyList如何创徏Iterator。首先AbstractList定义了一个内部类Qinner classQ:
private class Itr implements Iterator { ... } |
而iterator()Ҏ的定义是Q?/p>
public Iterator iterator() { return new Itr(); } |
因此客户端不知道它通过Iterator it = a.iterator();所获得的Iterator的真正类型?/p>
现在我们兛_的是q个x为private的ItrcL如何实现遍历AbstractList的:
private class Itr implements Iterator { int cursor = 0; int lastRet = -1; int expectedModCount = modCount; } |
ItrcM?个int变量Q还有一个隐含的AbstractList的引用)来实现遍历,cursor是下一ơnext()调用时元素的位置Q第一ơ调用next()返回烦引ؓ0的元素。lastRet记录上一ơ游标所在位|,因此它L比cursor??/p>
变量cursor和集合的元素个数军_hasNext()Q?/p>
public boolean hasNext() { return cursor != size(); } |
Ҏnext()q回的是索引为cursor的元素,然后修改cursor和lastRet的|
public Object next() { checkForComodification(); try { Object next = get(cursor); lastRet = cursor++; return next; } catch(IndexOutOfBoundsException e) { checkForComodification(); throw new NoSuchElementException(); } } |
expectedModCount表示期待的modCount|用来判断在遍历过E中集合是否被修改过。AbstractList包含一个modCount变量Q它的初始值是0Q当集合每被修改一ơ时Q调用addQremove{方法)QmodCount?。因此,modCount如果不变Q表C集合内Ҏ被修攏V?/p>
Itr初始化时用expectedModCount记录集合的modCount变量Q此后在必要的地方它会检modCount的|
final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } |
如果modCount与一开始记录在expectedModeCount中的g{,说明集合内容被修改过Q此时会抛出ConcurrentModificationException?/p>
q个ConcurrentModificationException是RuntimeExceptionQ不要在客户端捕获它。如果发生此异常Q说明程序代码的~写有问题,应该仔细查代码而不是在catch中忽略它?/p>
但是调用Iterator自n的remove()Ҏ删除当前元素是完全没有问题的Q因为在q个Ҏ中会自动同步expectedModCount和modCount的|
public void remove() { ... AbstractList.this.remove(lastRet); ... // 在调用了集合的remove()Ҏ之后重新讄了expectedModCountQ? expectedModCount = modCount; ... } |
要确保遍历过E顺利完成,必须保证遍历q程中不更改集合的内容(Iterator的remove()Ҏ除外Q,因此Q确保遍历可靠的原则是只在一个线E中使用q个集合Q或者在多线E中寚w历代码进行同步?/p>
最后给个完整的CZQ?/p>
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); } |
如果你把W一行代码的ArrayList换成LinkedList或VectorQ剩下的代码不用改动一行就能编译,而且功能不变Q这是针对抽象~程的原则:对具体类的依赖性最?/p>