<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[咖啡杯里游泳 - 程序乐园]]></title>
<link>http://www.itweb2.com/</link>
<description><![CDATA[把你的影子加点盐/腌起来/风乾/等老的时候/下酒]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[lc1209@163.com(Journey)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>咖啡杯里游泳</title>
	<url>http://www.itweb2.com/images/logos.gif</url>
	<link>http://www.itweb2.com/</link>
	<description>咖啡杯里游泳</description>
</image>

			<item>
			<link>http://www.itweb2.com/article/java/537.htm</link>
			<title><![CDATA[ISBN号转换及纠错程序]]></title>
			<author>lc1209@163.com(journey)</author>
			<category><![CDATA[程序乐园]]></category>
			<pubDate>Thu,17 Sep 2009 15:54:37 +0800</pubDate>
			<guid>http://www.itweb2.com/default.asp?id=537</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;由于需要，最近写了一个ISBN号转换及纠错的小程序，尽实现了工作所需的功能，可自动识别10位及时雨3位ISBN号，并纠正ISBN号的最后一位校验位，现在发布出来，有需要和兴趣的朋友可以下载使用或进一步完善。<br/><br/><div id="mdown_se25gpiqtc"></div><br /><script language="javascript" type="text/javascript" defer>check('Action.asp?action=type1&mainurl=attachments%2Fmonth%5F0909%2F3200991715517%2Erar&main=%E7%82%B9%E5%87%BB%E4%B8%8B%E8%BD%BD%E6%AD%A4%E7%A8%8B%E5%BA%8F','mdown_se25gpiqtc','mdown_se25gpiqtc');</script><br/><div id="mdown_eufuc4udop"></div><br /><script language="javascript" type="text/javascript" defer>check('Action.asp?action=type1&mainurl=attachments%2Fmonth%5F0909%2Fv2009917155359%2Erar&main=%E7%82%B9%E5%87%BB%E4%B8%8B%E8%BD%BD%E7%A8%8B%E5%BA%8F%E6%BA%90%E7%A0%81','mdown_eufuc4udop','mdown_eufuc4udop');</script><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.itweb2.com/article/java/489.htm</link>
			<title><![CDATA[Eclipse 3.3.X 汉化方法]]></title>
			<author>lc1209@163.com(journey)</author>
			<category><![CDATA[程序乐园]]></category>
			<pubDate>Tue,04 Nov 2008 09:30:21 +0800</pubDate>
			<guid>http://www.itweb2.com/default.asp?id=489</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Eclipse 是一款很好的IDE环境，功能完整而成熟。它使用 Java 语言开发，而且属于开源项目，网上充足的插件，保证了其强大的可扩展性。<br/>&nbsp;&nbsp;&nbsp;&nbsp;Eclipse 的语言包也是以插件的形式来提供的。很可惜的是，从3.3版本开始，Eclipse 官方不再提供语言包下载。<br/>&nbsp;&nbsp;&nbsp;&nbsp;无意中发现了 Eclipse 的一个开源项目：Babel，它依靠全球开源爱好者的力量，来翻译 Eclipse 及其插件。<br/><br/>使用方法：<br/>&nbsp;&nbsp;&nbsp;&nbsp;打开 Eclipse ，依次点击菜单【Help】-【Software Up&#100;ates】-【Find and install…】，在弹出的对话框中选择第二个，Search for new features to install，即“搜索要安装的新功能部件”，进入新的对话框后点击右面第一个按钮，New Remote Site ，即增加新的远程站点，在URL一栏中填写 <a href="http://download.eclipse.org/technology/babel/up" target="_blank" rel="external">http://download.eclipse.org/technology/babel/up</a>&#100;ate-site/ganymede. (随着Eclipse版本的更新，这个地址可能会发生改变，请到<a target="_blank" href="http://www.eclipse.org/babel/" rel="external"> 这里 </a>获取最新的地址），弹出协议后点同意，选择简体中文语言包，即可下载安装。安装完毕重新启动 Eclipse ，就可以看到中文的界面了。<br/><br/>选择下载服务器:<br/><div align="center"><img src="http://www.itweb2.com/attachments/month_0811/r20081149272.jpg" border="0" alt=""/></div><br/><br/>在这里只要选择中文语言包即可：<br/><div align="center"><img src="http://www.itweb2.com/attachments/month_0811/t200811493725.JPG" border="0" alt=""/></div><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个语言包包含了一些插件的语言翻译，因此也并不是所有的界面都会被汉化。另外，Eclipse 的帮助文档并没有被汉化。 <br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;如果安装了语言包，还想使用英文版，可以在Eclipse的快捷方式里，添加参数，如下图：<br/><br/><div align="center"><img src="http://www.itweb2.com/attachments/month_0811/h200811492958.jpg" border="0" alt=""/></div>]]></description>
		</item>
		
			<item>
			<link>http://www.itweb2.com/article/java/488.htm</link>
			<title><![CDATA[myeclipse 6.5 blue 注册机]]></title>
			<author>lc1209@163.com(journey)</author>
			<category><![CDATA[程序乐园]]></category>
			<pubDate>Mon,03 Nov 2008 21:07:32 +0800</pubDate>
			<guid>http://www.itweb2.com/default.asp?id=488</guid>
		<description><![CDATA[注册如此简单：<br/>按照说明文件修改<br/>subscriber:id<br/>license num is:99<br/>然后执行run.bat即可得到自己的注册码了。<br/><br/><div id="mdown_qzcf8n7fxl"></div><br /><script language="javascript" type="text/javascript" defer>check('Action.asp?action=type1&mainurl=attachments%2Fmonth%5F0811%2Fn20081132151%2Erar&main=%E7%82%B9%E5%87%BB%E4%B8%8B%E8%BD%BD%E6%AD%A4%E6%96%87%E4%BB%B6','mdown_qzcf8n7fxl','mdown_qzcf8n7fxl');</script><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.itweb2.com/article/java/369.htm</link>
			<title><![CDATA[Java学习之路：不走弯路，就是捷径(转)]]></title>
			<author>lc1209@163.com(journey)</author>
			<category><![CDATA[程序乐园]]></category>
			<pubDate>Tue,03 Jul 2007 22:59:09 +0800</pubDate>
			<guid>http://www.itweb2.com/default.asp?id=369</guid>
		<description><![CDATA[0．引言 <br/>&nbsp;&nbsp;&nbsp;&nbsp;软件开发之路是充满荆棘与挑战之路,也是充满希望之路。Java学习也是如此，没有捷径可走。梦想像《天龙八部》中虚竹一样被无崖子醍醐灌顶而轻松获得一甲子功力，是很不现实的。每天仰天大叫&#34;天神啊，请赐给我一本葵花宝典吧&#34;，殊不知即使你获得了葵花宝典，除了受自宫其身之苦外，你也不一定成得了&#34;东方不败&#34;，倒是成&#34;西方失败&#34;的几率高一点。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#34;不走弯路，就是捷径&#34;，佛经说的不无道理。 <br/><br/>1．如何学习程序设计？ <br/>&nbsp;&nbsp;&nbsp;&nbsp;Java是一种平台，也是一种程序设计语言，如何学好程序设计不仅仅适用于Java，对C++等其他程序设计语言也一样管用。有编程高手认为，Java也好C也好没什么分别，拿来就用。为什么他们能达到如此境界？我想是因为编程语言之间有共通之处，领会了编程的精髓，自然能够做到一通百通。如何学习程序设计理所当然也有许多共通的地方。<br/> <br/>1.1 培养兴趣 <br/>&nbsp;&nbsp;&nbsp;&nbsp;兴趣是能够让你坚持下去的动力。如果只是把写程序作为谋生的手段的话，你会活的很累，也太对不起自己了。多关心一些行业趣事，多想想盖茨。不是提倡天天做白日梦，但人要是没有了梦想，你觉得有味道吗？可能像许多深圳本地农民一样，打打麻将，喝喝功夫茶，拜拜财神爷；每个月就有几万十几万甚至更多的进帐，凭空多出个&#34;食利阶层&#34;。你认为，这样有味道吗？有空多到一些程序员论坛转转，你会发现，他们其实很乐观幽默，时不时会冒出智慧的火花。<br/> <br/>1.2 慎选程序设计语言 <br/>&nbsp;&nbsp;&nbsp;&nbsp;男怕入错行，女怕嫁错郎。初学者选择程序设计语言需要谨慎对待。软件开发不仅仅是掌握一门编程语言了事，它还需要其他很多方面的背景知识。软件开发也不仅仅局限于某几个领域，而是已经渗透到了各行各业几乎每一个角落。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;如果你对硬件比较感兴趣，你可以学习C语言/汇编语言，进入硬件开发领域。如果你对电信的行业知识及网络比较熟悉，你可以在C/C++等之上多花时间，以期进入电信软件开发领域。如果你对操作系统比较熟悉，你可以学习C/Linux等等,为Linux内核开发/驱动程序开发/嵌入式开发打基础。 <br/>如果你想介入到应用范围最广泛的应用软件开发（包括电子商务电子政务系统）的话，你可以选择J2EE或.NET，甚至LAMP组合。每个领域要求的背景知识不一样。做应用软件需要对数据库等很熟悉。总之，你需要根据自己的特点来选择合适你的编程语言。 <br/><br/>1.3 要脚踏实地,快餐式的学习不可取 <br/>&nbsp;&nbsp;&nbsp;&nbsp;先分享一个故事。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;有一个小朋友，他很喜欢研究生物学，很想知道那些蝴蝶如何从蛹壳里出来，变成蝴蝶便会飞。有一次，他走到草原上面看见一个蛹，便取了回家，然后看着，过了几天以后，这个蛹出了一条裂痕，看见里面的蝴蝶开始挣扎，想抓破蛹壳飞出来。 这个过程达数小时之久，蝴蝶在蛹里面很辛苦地拼命挣扎，怎么也没法子走出来。这个小孩看着看着不忍心，就想不如让我帮帮它吧，便随手拿起剪刀在蛹上剪开，使蝴蝶破蛹而出。 但蝴蝶出来以后，因为翅膀不够力，变得很臃肿，飞不起来。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;这个故事给我们的启示是：欲速则不达。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;浮躁是现代人最普遍的心态，能怪谁？也许是贫穷落后了这么多年的缘故，就像当年的大跃进一样，都想大步跨入***主义社会。现在的软件公司、客户、政府、学校、培训机构等等到处弥漫着浮躁之气。就拿我比较熟悉的大连大工IT职业培训来说吧，居然打广告宣称&#34;20多年的计算机职业教育，辽宁省十佳学校&#34;，殊不知中国计算机发展才几年，软件发展才几年，居然去报名的学生不少，简直是藐视天下程序员。培训出来的“程序员”大多不知道OO,OP为何物？社会环境如是，我们不能改变，只能改变自己,闹市中的安宁，弥足珍贵。许多初学者C++/Java没开始学，立马使用VC/JBuilder,会使用VC/JBuilder开发一个Hello World程序，就忙不迭的向世界宣告，&#34;我会软件开发了&#34;，简历上也大言不惭地写上&#34;精通VC/Java&#34;。结果到软件公司面试时要么被三两下打发走了，要么被驳的体无完肤，无地自容。到处碰壁之后才知道捧起《C++编程思想》《Java编程思想》仔细钻研，早知如此何必当初呀。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#34;你现在讲究简单方便，你以后的路就长了&#34;，好象也是佛经中的劝戒。 <br/><br/>1.4 多实践,快实践 <br/>&nbsp;&nbsp;&nbsp;&nbsp;彭端淑的《为学一首示子侄》中有穷和尚与富和尚的故事。 <br/>从前，四川边境有两个和尚，一个贫穷，一个有钱。一天，穷和尚对富和尚说：&#34;我打算去南海朝圣，你看怎么样？&#34;富和尚说：&#34;这里离南海有几千里远，你靠什么去呢？&#34;穷和尚说：&#34;我只要一个水钵，一个饭碗就够了。&#34;富和尚为难地说：&#34;几年前我就打算买条船去南海，可至今没去成，你还是别去吧！&#34; 一年以后，富和尚还在为租赁船只筹钱，穷和尚却已经从南海朝圣回来了。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;这个故事可解读为：任何事情，一旦考虑好了，就要马上上路，不要等到准备周全之后，再去干事情。假如事情准备考虑周全了再上路的话，别人恐怕捷足先登了。软件开发是一门工程学科，注重的就是实践，&#34;君子动口不动手&#34;对软件开发人员来讲根本就是错误的，他们提倡&#34;动手至上&#34;，但别害怕，他们大多温文尔雅，没有暴力倾向，虽然有时候蓬头垢面的一副&#34;比尔盖茨&#34;样。有前辈高人认为，学习编程的秘诀是：编程、编程、再编程，笔者深表赞同。不仅要多实践，而且要快实践。我们在看书的时候，不要等到你完全理解了才动手敲代码，而是应该在看书的同时敲代码，程序运行的各种情况可以让你更快更牢固的掌握知识点。 <br/><br/>1.5 多参考程序代码 <br/>&nbsp;&nbsp;&nbsp;&nbsp;程序代码是软件开发最重要的成果之一，其中渗透了程序员的思想与灵魂。许多人被《仙剑奇侠传》中凄美的爱情故事感动,悲剧的结局更有一种缺憾美。为什么要以悲剧结尾？据说是因为写《仙剑奇侠传》的程序员失恋而安排了这样的结局，他把自己的感觉融入到游戏中，却让众多的仙剑迷扼腕叹息。 <br/>多多参考代码例子，对Java而言有参考文献[4.3],有API类的源代码(JDK安装目录下的src.zip文件)，也可以研究一些开源的软件或框架。 <br/><br/>1.6 加强英文阅读能力 <br/>&nbsp;&nbsp;&nbsp;&nbsp;对学习编程来说，不要求英语, 但不能一点不会,。最起码像Java API文档(参考文献[4.4])这些东西还是要能看懂的,连猜带懵都可以；旁边再开启一个&#34;金山词霸&#34;。看多了就会越来越熟练。在学Java的同时学习英文，一箭双雕多好。另外好多软件需要到英文网站下载，你要能够找到它们，这些是最基本的要求。英语好对你学习有很大的帮助。口语好的话更有机会进入管理层，进而可以成为剥削程序员的&#34;周扒皮&#34;。 <br/><br/>1.7 万不得已才请教别人 <br/>&nbsp;&nbsp;&nbsp;&nbsp;笔者在Martix与Java论坛的在线辅导系统中解决学生问题时发现，大部分的问题学生稍做思考就可以解决。请教别人之前，你应该先回答如下几个问题。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;你是否在google中搜索了问题的解决办法？ <br/>&nbsp;&nbsp;&nbsp;&nbsp;你是否查看了Java API文档？ <br/>&nbsp;&nbsp;&nbsp;&nbsp;你是否查找过相关书籍？ <br/>&nbsp;&nbsp;&nbsp;&nbsp;你是否写代码测试过？ <br/>&nbsp;&nbsp;&nbsp;&nbsp;如果回答都是&#34;是&#34;的话，而且还没有找到解决办法，再问别人不迟。要知道独立思考的能力对你很重要。要知道程序员的时间是很宝贵的。 <br/><br/>1.8 多读好书 <br/>&nbsp;&nbsp;&nbsp;&nbsp;书中自有颜如玉。比尔盖茨是一个饱读群书的人。虽然没有读完大学，但九岁的时候比尔盖茨就已经读完了所有的百科全书，所以他精通天文、历史、地理等等各类学科，可以说比尔?茨不仅是当今世界上金钱的首富，而且也可以称得上是知识的巨富。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;笔者在给学生上课的时候经常会给他们推荐书籍，到后来学生实在忍无可忍开始抱怨，&#34;天呐，这么多书到什么时候才能看完了&#34;，&#34;学软件开发，感觉上了贼船&#34;。这时候，我的回答一般是，&#34;别着急，什么时候带你们去看看我的书房，到现在每月花在技术书籍上的钱400元，这在软件开发人员之中还只能够算是中等的&#34;，学生当场晕倒。（注：这一部分学生是刚学软件开发的） <br/><br/>1.9 使用合适的工具 <br/>&nbsp;&nbsp;&nbsp;&nbsp;工欲善其事必先利其器。软件开发包含各种各样的活动，需求收集分析、建立用例模型、建立分析设计模型、编程实现、调试程序、自动化测试、持续集成等等，没有工具帮忙可以说是寸步难行。工具可以提高开发效率，使软件的质量更高BUG更少。组合称手的武器。到飞花摘叶皆可伤人的境界就很高了，无招胜有招，手中无剑心中有剑这样的境界几乎不可企及。 <br/><br/>2．软件开发学习路线 <br/>&nbsp;&nbsp;&nbsp;&nbsp;两千多年的儒家思想孔孟之道，中庸的思想透入骨髓，既不冒进也不保守并非中庸之道，而是找寻学习软件开发的正确路线与规律。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;从软件开发人员的生涯规划来讲，我们可以大致分为三个阶段，软件工程师→软件设计师→架构设计师或项目管理师。不想当元帅的士兵不是好士兵，不想当架构设计师或项目管理师的程序员也不是好的程序员。我们应该努力往上走。让我们先整理一下开发应用软件需要学习的主要技术。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;A．基础理论知识，如操作系统、编译原理、数据结构与算法、计算机原理等，它们并非不重要。如不想成为计算机科学家的话，可以采取&#34;用到的时候再来学&#34;的原则。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;B．一门编程语言，现在基本上都是面向对象的语言，Java/C++/C#等等。如果做WEB开发的话还要学习HTML/javascript等等。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;C．一种方法学或者说思想，现在基本都是面向对象思想（OOA/OOD/设计模式）。由此而衍生的基于组件开发CBD/面向方面编程AOP等等。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;D．一种关系型数据库，ORACLE/SqlServer/DB2/MySQL等等 <br/>&nbsp;&nbsp;&nbsp;&nbsp;E．一种提高生产率的IDE集成开发环境JBuilder/Eclipse/VS.NET等。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;F．一种UML建模工具，用ROSE/VISIO/钢笔进行建模。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;G．一种软件过程，RUP/XP/CMM等等，通过软件过程来组织软件开发的众多活动，使开发流程专业化规范化。当然还有其他的一些软件工程知识。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;H．项目管理、体系结构、框架知识。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;正确的路线应该是：B→C→E→F→G→H。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;还需要补充几点： <br/>&nbsp;&nbsp;&nbsp;&nbsp;1）．对于A与C要补充的是，我们应该在实践中逐步领悟编程理论与编程思想。新技术虽然不断涌现，更新速度令人眼花燎乱雾里看花；但万变不离其宗，编程理论与编程思想的变化却很慢。掌握了编程理论与编程思想你就会有拨云见日之感。面向对象的思想在目前来讲是相当关键的，是强势技术之一，在上面需要多投入时间，给你的回报也会让你惊喜。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;2）．对于数据库来说是独立学习的，这个时机就由你来决定吧。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;3）．编程语言作为学习软件开发的主线，而其余的作为辅线。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;4）．软件工程师着重于B、C、E、D；软件设计师着重于B、C、E、D、F；架构设计师着重于C、F、H。 <br/><br/>3．如何学习Java? <br/>3.1 Java学习路线 <br/>3.1.1 基础语法及Java原理 <br/>&nbsp;&nbsp;&nbsp;&nbsp;基础语法和Java原理是地基，地基不牢靠，犹如沙地上建摩天大厦，是相当危险的。学习Java也是如此，必须要有扎实的基础，你才能在J2EE、J2ME领域游刃有余。参加SCJP（SUN公司认证的Java程序员）考试不失为一个好方法，原因之一是为了对得起你交的1200大洋考试费，你会更努力学习，原因之二是SCJP考试能够让你把基础打得很牢靠，它要求你跟JDK一样熟悉Java基础知识；但是你千万不要认为考过了SCJP就有多了不起，就能够获得软件公司的青睐，就能够获取高薪，这样的想法也是很危险的。获得&#34;真正&#34;的SCJP只能证明你的基础还过得去，但离实际开发还有很长的一段路要走。 <br/><br/>3.1.2 OO思想的领悟 <br/>&nbsp;&nbsp;&nbsp;&nbsp;掌握了基础语法和Java程序运行原理后，我们就可以用Java语言实现面向对象的思想了。面向对象，是一种方法学;是独立于语言之外的编程思想;是CBD基于组件开发的基础;属于强势技术之一。当以后因工作需要转到别的面向对象语言的时候，你会感到特别的熟悉亲切，学起来像喝凉水这么简单。 <br/>使用面向对象的思想进行开发的基本过程是： <br/>●调查收集需求。 <br/>●建立用例模型。 <br/>●从用例模型中识别分析类及类与类之间的静态动态关系，从而建立分析模型。 <br/>●细化分析模型到设计模型。 <br/>●用具体的技术去实现。 <br/>●测试、部署、总结。 <br/><br/>3.1.3 基本API的学习 <br/>&nbsp;&nbsp;&nbsp;&nbsp;进行软件开发的时候，并不是什么功能都需要我们去实现，也就是经典名言所说的&#34;不需要重新发明轮子&#34;。我们可以利用现成的类、组件、框架来搭建我们的应用，如SUN公司编写好了众多类实现一些底层功能，以及我们下载过来的JAR文件中包含的类,我们可以调用类中的方法来完成某些功能或继承它。那么这些类中究竟提供了哪些方法给我们使用？方法的参数个数及类型是？类的构造器需不需要参数？总不可能SUN公司的工程师打国际长途甚至飘洋过海来告诉你他编写的类该如何使用吧。他们只能提供文档给我们查看，Java DOC文档（参考文献4.4）就是这样的文档，它可以说是程序员与程序员交流的文档。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;基本API指的是实现了一些底层功能的类，通用性较强的API，如字符串处理/输入输出等等。我们又把它成为类库。熟悉API的方法一是多查Java DOC文档（参考文献4.4），二是使用JBuilder/Eclipse等IDE的代码提示功能。 <br/><br/>3.1.4 特定API的学习 <br/>&nbsp;&nbsp;&nbsp;&nbsp;Java介入的领域很广泛，不同的领域有不同的API，没有人熟悉所有的API，对一般人而言只是熟悉工作中要用到的API。如果你做界面开发，那么你需要学习Swing/AWT/SWT等API；如果你进行网络游戏开发，你需要深入了解网络API/多媒体API/2D3D等；如果你做WEB开发，就需要熟悉Servlet等API啦。总之，需要根据工作的需要或你的兴趣发展方向去选择学习特定的API。 <br/><br/>3.1.5 开发工具的用法 <br/>&nbsp;&nbsp;&nbsp;&nbsp;在学习基础语法与基本的面向对象概念时，从锻炼语言熟练程度的角度考虑，我们推荐使用的工具是Editplus/JCreator+JDK,这时候不要急于上手JBuilder/Eclipse等集成开发环境，以免过于关注IDE的强大功能而分散对Java技术本身的注意力。过了这一阶段你就可以开始熟悉IDE了。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;程序员日常工作包括很多活动，编辑、编译及构建、调试、单元测试、版本控制、维持模型与代码同步、文档的更新等等，几乎每一项活动都有专门的工具，如果独立使用这些工具的话，你将会很痛苦，你需要在堆满工具的任务栏上不断的切换，效率很低下，也很容易出错。在JBuilder、Eclipse等IDE中已经自动集成编辑器、编译器、调试器、单元测试工具JUnit、自动构建工具ANT、版本控制工具CVS、DOC文档生成与更新等等，甚至可以把UML建模工具也集成进去，又提供了丰富的向导帮助生成框架代码，让我们的开发变得更轻松。应该说IDE发展的趋势就是集成软件开发中要用到的几乎所有工具。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;从开发效率的角度考虑，使用IDE是必经之路，也是从一个学生到一个职业程序员转变的里程碑。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;Java开发使用的IDE主要有Eclipse、JBuilder、JDeveloper、NetBeans等几种；而Eclipse、JBuilder占有的市场份额是最大的。JBuilder在近几年来一直是Java集成开发环境中的霸主，它是由备受程序员尊敬的Borland公司开发，在硝烟弥漫的Java IDE大战中,以其快速的版本更新击败IBM的Visual Age for Java等而成就一番伟业。IBM在Visual Age for Java上已经无利可图之下，干脆将之贡献给开源社区，成为Eclipse的前身，真所谓&#34;柳暗花明又一村&#34;。浴火重生的Eclipse以其开放式的插件扩展机制、免费开源获得广大程序员（包括几乎所有的骨灰级程序员）的青睐，极具发展潜力。 <br/><br/>3.1.6 学习软件工程 <br/>&nbsp;&nbsp;&nbsp;&nbsp;对小型项目而言，你可能认为软件工程没太大的必要。随着项目的复杂性越来越高，软件工程的必要性才会体现出来。参见&#34;软件开发学习路线&#34;小节。 <br/><br/>3.2学习要点 <br/>&nbsp;&nbsp;&nbsp;&nbsp;确立的学习路线之后，我们还需要总结一下Java的学习要点，这些要点在前文多多少少提到过，只是笔者觉得这些地方特别要注意才对它们进行汇总，不要嫌我婆婆妈妈啊。 <br/><br/>3.2.1勤查API文档 <br/>&nbsp;&nbsp;&nbsp;&nbsp;当程序员编写好某些类，觉得很有成就感,想把它贡献给各位苦难的同行。这时候你要使用&#34;Javadoc&#34;工具（包含在JDK中）生成标准的Java DOC文档,供同行使用。J2SE/J2EE/J2ME的DOC文档是程序员与程序员交流的工具，几乎人手一份，除了菜鸟之外。J2SE DOC文档官方下载地址：<a href="http://Java.sun.com/j2se/1.5.0/download.jsp" target="_blank" rel="external">http://Java.sun.com/j2se/1.5.0/download.jsp</a>，你可以到google搜索CHM版本下载。也可以在线查看：<a href="http://Java.sun.com/j2se/1.5.0/docs/api/index.html" target="_blank" rel="external">http://Java.sun.com/j2se/1.5.0/docs/api/index.html</a>。 <br/>对待DOC文档要像毛主席语录，早上起床念一遍，吃饭睡觉前念一遍。 <br/>当需要某项功能的时候，你应该先查相应的DOC文档看看有没有现成的实现，有的话就不必劳神费心了直接用就可以了，找不到的时候才考虑自己实现。使用步骤一般如下： <br/>●找特定的包，包一般根据功能组织。 <br/>●找需要使用类，类命名规范的话我们由类的名字可猜出一二。 <br/>●选择构造器，大多数使用类的方式是创建对象。 <br/>●选择你需要的方法。 <br/><br/>3.2.2 查书/google-&gt;写代码测试-&gt;查看源代码-&gt;请教别人 <br/>&nbsp;&nbsp;&nbsp;&nbsp;当我们遇到问题的时候该如何解决？ <br/>&nbsp;&nbsp;&nbsp;&nbsp;这时候不要急着问别人，太简单的问题，没经过思考的问题，别人会因此而瞧不起你。可以先找找书，到google中搜一下看看，绝大部分问题基本就解决了。而像&#34;某些类/方法如何使用的问题&#34;，DOC文档就是答案。对某些知识点有疑惑是，写代码测试一下，会给你留下深刻的印象。而有的问题，你可能需要直接看API的源代码验证你的想法。万不得已才去请教别人。 <br/><br/>3.2.3学习开源软件的设计思想 <br/>&nbsp;&nbsp;&nbsp;&nbsp;Java领域有许多源代码开放的工具、组件、框架，JUnit、ANT、Tomcat、Struts、Spring、Jive论坛、PetStore宠物店等等多如牛毛。这些可是前辈给我们留下的瑰宝呀。入宝山而空手归，你心甘吗？对这些工具、框架进行分析，领会其中的设计思想，有朝一日说不定你也能写一个XXX框架什么的，风光一把。分析开源软件其实是你提高技术、提高实战能力的便捷方法。 <br/><br/>3.2.4 规范的重要性 <br/>&nbsp;&nbsp;&nbsp;&nbsp;没有规矩，不成方圆。这里的规范有两层含义。第一层含义是技术规范，多到<a href="http://www.jcp.org" target="_blank" rel="external">http://www.jcp.org</a>下载JSRXXX规范，多读规范，这是最权威准确最新的教材。第二层含义是编程规范，如果你使用了大量的独特算法，富有个性的变量及方法的命名方式；同时，没给程序作注释，以显示你的编程功底是多么的深厚。这样的代码别人看起来像天书，要理解谈何容易，更不用说维护了，必然会被无情地扫入垃圾堆。Java编码规范到此查看或下载<a href="http://Java.sun.com/docs/codeconv/" target="_blank" rel="external">http://Java.sun.com/docs/codeconv/</a>，中文的也有，啊，还要问我在哪，请参考3.2.2节。 <br/><br/>3.2.5 不局限于Java <br/>&nbsp;&nbsp;&nbsp;&nbsp; 很不幸，很幸运，要学习的东西还有很多。不幸的是因为要学的东西太多且多变，没时间陪老婆家人或女朋友，导致身心疲惫，严重者甚至导致抑郁症。幸运的是别人要抢你饭碗绝非易事，他们或她们需要付出很多才能达成心愿。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;Java不要孤立地去学习，需要综合学习数据结构、OOP、软件工程、UML、网络编程、数据库技术等知识，用横向纵向的比较联想的方式去学习会更有效。如学习Java集合的时候找数据结构的书看看；学JDBC的时候复习数据库技术；采取的依然是&#34;需要的时候再学&#34;的原则。 <br/><br/>4．结束语 <br/>&nbsp;&nbsp;&nbsp;&nbsp;需要强调的是，学习软件开发确实有一定的难度，也很辛苦，需要付出很多努力，但千万不要半途而废。本文如果能对一直徘徊在Java神殿之外的朋友有所帮助的话，笔者也欣慰了。哈哈，怎么听起来老气横秋呀？没办法，在电脑的长期辐射之下，都快变成小老头了。最后奉劝各位程序员尤其是MM程序员，完成工作后赶快远离电脑，据《胡播乱报》报道，电脑辐射会在白皙的皮肤上面点缀一些小黑点，看起来鲜艳无比…… (文章提到的大连大工IT培训。本人没有任何攻击的意思)<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.itweb2.com/article/java/360.htm</link>
			<title><![CDATA[功能完善的Java连接池调用实例]]></title>
			<author>lc1209@163.com(journey)</author>
			<category><![CDATA[程序乐园]]></category>
			<pubDate>Fri,01 Jun 2007 13:05:56 +0800</pubDate>
			<guid>http://www.itweb2.com/default.asp?id=360</guid>
		<description><![CDATA[ConnectPool.java <br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.itweb2.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>import java.io.*; <br/>import java.sql.*; <br/>import java.util.*; <br/>import java.util.Date; <br/><br/>/** <br/>* 管理类DBConnectionManager支持对一个或多个由属性文件定义的数据库连接 <br/>* 池的访问.客户程序可以调用getInstance()方法访问本类的唯一实例. <br/>*/ <br/>public class ConnectPool { <br/>static public ConnectPool instance; // 唯一实例 <br/>static public int clients; <br/>public Vector drivers = new Vector(); //驱动 <br/>public PrintWriter log; <br/>public Hashtable pools = new Hashtable(); //连接 <br/><br/>/** <br/>* 返回唯一实例.如果是第一次调用此方法,则创建实例 <br/>* <br/>* @return DBConnectionManager 唯一实例 <br/>*/ <br/>static synchronized public ConnectPool getInstance() <br/>{ <br/>if (instance == null) <br/>{ <br/>instance = new ConnectPool(); <br/>} <br/><br/>clients++; <br/><br/>return instance; <br/>} <br/><br/>/** <br/>* 建构函数私有以防止其它对象创建本类实例 <br/>*/ <br/>public ConnectPool() { <br/>init(); <br/>} <br/><br/>/** <br/>* 将连接对象返回给由名字指定的连接池 <br/>* <br/>* @param name 在属性文件中定义的连接池名字 <br/>* @param con 连接对象 <br/>*/ <br/>public void freeConnection(String name, Connection con) <br/>{ <br/>DBConnectionPool pool = (DBConnectionPool) pools.get(name); <br/>if (pool != null) <br/>{ <br/>pool.freeConnection(con); <br/>} <br/>else <br/>{ <br/>System.out.println(&#34;pool ==null&#34;); <br/>} <br/>clients--; <br/>} <br/><br/>/** <br/>* 获得一个可用的(空闲的)连接.如果没有可用连接,且已有连接数小于最大连接数 <br/>* 限制,则创建并返回新连接 <br/>* <br/>* @param name 在属性文件中定义的连接池名字 <br/>* @return Connection 可用连接或null <br/>*/ <br/>public Connection getConnection(String name) <br/>{ <br/>DBConnectionPool pool = (DBConnectionPool) pools.get(name); <br/>if (pool != null) <br/>{ <br/>//return pool.getConnection(); <br/>return pool.returnConnection(); <br/>} <br/>return null; <br/>} <br/><br/>/** <br/>* 获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制, <br/>* 则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接. <br/>* <br/>* @param name 连接池名字 <br/>* @param time 以毫秒计的等待时间 <br/>* @return Connection 可用连接或null <br/>*/ <br/>public Connection getConnection(String name, long time) <br/>{ <br/>DBConnectionPool pool = (DBConnectionPool) pools.get(name); <br/>if (pool != null) <br/>{ <br/>return pool.getConnection(time); <br/>} <br/>return null; <br/>} <br/><br/>/** <br/>* 关闭所有连接,撤销驱动程序的注册 <br/>*/ <br/>public synchronized void release() <br/>{ <br/>// 等待直到最后一个客户程序调用 <br/>if (--clients != 0) <br/>{ <br/>return; <br/>} <br/><br/>Enumeration allPools = pools.elements(); <br/>while (allPools.hasMoreElements()) <br/>{ <br/>DBConnectionPool pool = (DBConnectionPool) allPools.nextElement(); <br/>pool.release(); <br/>} <br/>Enumeration allDrivers = drivers.elements(); <br/>while (allDrivers.hasMoreElements()) <br/>{ <br/>Driver driver = (Driver) allDrivers.nextElement(); <br/>try { <br/>DriverManager.deregisterDriver(driver); <br/><br/>log(&#34;撤销JDBC驱动程序 &#34; + driver.getClass().getName()+&#34;的注册&#34;); <br/>} <br/>catch (SQLException e) <br/>{ <br/>log(e, &#34;无法撤销下列JDBC驱动程序的注册: &#34; + driver.getClass().getName()); <br/>} <br/>} <br/>} <br/><br/>/** <br/>* 根据指定属性创建连接池实例. <br/>* <br/>* @param props 连接池属性 <br/>*/ <br/>private void cr&#101;atePools(Properties props) <br/>{ <br/>Enumeration propNames = props.propertyNames(); <br/>while (propNames.hasMoreElements()) <br/>{ <br/>String name = (String) propNames.nextElement(); <br/>if (name.endsWith(&#34;.url&#34;)) { <br/>String poolName = name.substring(0, name.lastIndexOf(&#34;.&#34;)); <br/>String url = props.getProperty(poolName + &#34;.url&#34;); <br/>if (url == null) { <br/>log(&#34;没有为连接池&#34; + poolName + &#34;指定URL&#34;); <br/>continue; <br/>} <br/>String user = props.getProperty(poolName + &#34;.user&#34;); <br/>String password = props.getProperty(poolName + &#34;.password&#34;); <br/>String maxconn = props.getProperty(poolName + &#34;.maxconn&#34;, &#34;0&#34;); <br/>int max; <br/>try{ <br/>max = Integer.valueOf(maxconn).intValue(); <br/>} <br/>catch (NumberFormatException e) <br/>{ <br/>log(&#34;错误的最大连接数限制: &#34; + maxconn + &#34; .连接池: &#34; + poolName); <br/>max = 0; <br/>} <br/>DBConnectionPool pool = new DBConnectionPool(poolName, url, user, password, max); <br/>pools.put(poolName, pool); <br/>log(&#34;成功创建连接池&#34; + poolName); <br/>} <br/>} <br/>} <br/><br/>/** <br/>* 读取属性完成初始化 <br/>*/ <br/>private void init() <br/>{ <br/>try <br/>{ <br/>Properties p = new Properties(); <br/>String configs = System.getProperty(&#34;user.dir&#34;)+&#34;\conf\db.properties&#34;; <br/><br/>System.out.println(&#34;configs file local at &#34;+configs); <br/>FileInputStream is = new FileInputStream(configs); <br/>Properties dbProps = new Properties(); <br/>try <br/>{ <br/>dbProps.load(is); <br/>} <br/>catch (Exception e) <br/>{ <br/>System.err.println(&#34;不能读取属性文件. &#34; +&#34;请确保db.properties在CLASSPATH指定的路径中&#34;); <br/>return; <br/>} <br/>String logFile = dbProps.getProperty(&#34;logfile&#34;, &#34;DBConnectionManager.log&#34;); <br/>try{ <br/><br/>log = new PrintWriter(new FileWriter(logFile, true), true); <br/>} <br/>catch (IOException e) <br/>{ <br/>System.err.println(&#34;无法打开日志文件: &#34; + logFile); <br/>log = new PrintWriter(System.err); <br/>} <br/>loadDrivers(dbProps); <br/>cr&#101;atePools(dbProps); }catch(Exception e){} <br/>} <br/><br/>/** <br/>171 * 装载和注册所有JDBC驱动程序 <br/>172 * <br/>173 * @param props 属性 <br/>174 */ <br/>private void loadDrivers(Properties props) <br/>{ <br/>String driverClasses = props.getProperty(&#34;drivers&#34;); <br/>StringTokenizer st = new StringTokenizer(driverClasses); <br/>while (st.hasMoreElements()) <br/>{ <br/>String driverClassName = st.nextToken().trim(); <br/>try{ <br/>Driver driver = (Driver) <br/>Class.forName(driverClassName).newInstance(); <br/>DriverManager.registerDriver(driver); <br/>drivers.addElement(driver); <br/>System.out.println(driverClassName); <br/>log(&#34;成功注册JDBC驱动程序&#34; + driverClassName); <br/>} <br/>catch (Exception e) <br/>{ <br/>log(&#34;无法注册JDBC驱动程序: &#34; + <br/>driverClassName + &#34;, 错误: &#34; + e); <br/>} <br/>} <br/>} <br/><br/>/** <br/>* 将文本信息写入日志文件 <br/>*/ <br/>private void log(String msg) <br/>{ <br/>log.println(new Date() + &#34;: &#34; + msg); <br/>} <br/><br/>/** <br/>* 将文本信息与异常写入日志文件 <br/>*/ <br/>private void log(Throwable e, String msg) <br/>{ <br/>log.println(new Date() + &#34;: &#34; + msg); <br/>e.printStackTrace(log); <br/>} <br/><br/>/** <br/>* 此内部类定义了一个连接池.它能够根据要求创建新连接,直到预定的最 <br/>* 大连接数为止.在返回连接给客户程序之前,它能够验证连接的有效性. <br/>*/ <br/><br/>class DBConnectionPool <br/>{ <br/>//private int checkedOut; <br/>private Vector freeConnections = new Vector(); <br/>private int maxConn; <br/>private String name; <br/>private String password; <br/>private String URL; <br/>private String user; <br/><br/>/** <br/>* 创建新的连接池 <br/>* <br/>* @param name 连接池名字 <br/>* @param URL 数据库的JDBC URL <br/>* @param user 数据库帐号,或 null <br/>* @param password 密码,或 null <br/>* @param maxConn 此连接池允许建立的最大连接数 <br/>*/ <br/>public DBConnectionPool(String name, String URL, String user, String password,int maxConn) <br/>{ <br/>this.name = name; <br/>this.URL = URL; <br/>this.user = user; <br/>this.password = password; <br/>this.maxConn = maxConn; <br/>} <br/>/** <br/>* 将不再使用的连接返回给连接池 <br/>* <br/>* @param con 客户程序释放的连接 <br/>*/ <br/>public synchronized void freeConnection(Connection con) { <br/>// 将指定连接加入到向量末尾 <br/>try <br/>{ <br/>if(con.isClosed()){System.out.println(&#34;before freeConnection con is closed&#34;);} <br/>freeConnections.addElement(con); <br/>Connection contest = (Connection) freeConnections.lastElement(); <br/>if(contest.isClosed()){System.out.println(&#34;after freeConnection contest is closed&#34;);} <br/>notifyAll(); <br/>}catch(SQLException e){System.out.println(e);} <br/>} <br/><br/>/** <br/>* 从连接池获得一个可用连接.如没有空闲的连接且当前连接数小于最大连接 <br/>* 数限制,则创建新连接.如原来登记为可用的连接不再有效,则从向量删除之, <br/>* 然后递归调用自己以尝试新的可用连接. <br/>*/ <br/>public synchronized Connection getConnection() <br/>{ <br/>Connection con = null; <br/>if (freeConnections.size() &gt; 0) <br/>{ <br/>// 获取向量中第一个可用连接 <br/>con = (Connection) freeConnections.firstElement(); <br/>freeConnections.removeElementAt(0); <br/>try { <br/>if (con.isClosed()) <br/>{ <br/>log(&#34;从连接池&#34; + name+&#34;删除一个无效连接&#34;); <br/>System.out.println(&#34;从连接池&#34; + name+&#34;删除一个无效连接&#34;); <br/>// 递归调用自己,尝试再次获取可用连接 <br/>con = getConnection(); <br/>} <br/>} <br/>catch (SQLException e) <br/>{ <br/>log(&#34;从连接池&#34; + name+&#34;删除一个无效连接时错误&#34;); <br/>System.out.println(&#34;从连接池&#34; + name+&#34;删除一个无效连接出错&#34;); <br/>// 递归调用自己,尝试再次获取可用连接 <br/>con = getConnection(); <br/>} <br/>if(freeConnections.size()&gt;maxConn) <br/>{ System.out.println(&#34; 删除一个溢出连接 &#34;); <br/>releaseOne(); <br/>} <br/>} <br/><br/><br/>else if((maxConn == 0)||(freeConnections.size()&lt;maxConn)) <br/>{ <br/>con = newConnection(); <br/>} <br/><br/>return con; <br/>} <br/><br/>public synchronized Connection returnConnection() <br/>{ <br/>Connection con = null; <br/>//如果闲置小于最大连接,返回一个新连接 <br/>if(freeConnections.size()&lt;maxConn) <br/>{ <br/>con = newConnection(); <br/>} <br/>//如果闲置大于最大连接，返回一个可用的旧连接 <br/>else if(freeConnections.size()&gt;=maxConn) <br/>{ <br/><br/>con = (Connection) freeConnections.firstElement(); <br/>System.out.println(&#34; [a 连接池可用连接数 ] : &#34;+&#34;[ &#34;+freeConnections.size()+&#34; ]&#34;); <br/>freeConnections.removeElementAt(0); <br/>System.out.println(&#34; [b 连接池可用连接数 ] : &#34;+&#34;[ &#34;+freeConnections.size()+&#34; ]&#34;); <br/>try <br/>{ <br/>if (con.isClosed()) <br/>{ <br/>log(&#34;从连接池&#34; + name+&#34;删除一个无效连接&#34;); <br/>System.out.println(&#34;从连接池&#34; + name+&#34;删除一个无效连接&#34;); <br/>returnConnection(); <br/>} <br/>}catch (SQLException e) <br/>{ <br/>log(&#34;从连接池&#34; + name+&#34;删除一个无效连接时错误&#34;); <br/>System.out.println(&#34;从连接池&#34; + name+&#34;删除一个无效连接出错&#34;); <br/>returnConnection(); <br/>} <br/>} <br/>return con; <br/>} <br/><br/>/** <br/>* 从连接池获取可用连接.可以指定客户程序能够等待的最长时间 <br/>* 参见前一个getConnection()方法. <br/>* <br/>* @param timeout 以毫秒计的等待时间限制 <br/>*/ <br/>public synchronized Connection getConnection(long timeout) <br/>{ <br/>long startTime = new Date().getTime(); <br/>Connection con; <br/>while ((con = getConnection()) == null) <br/>{ <br/>try <br/>{ <br/>wait(timeout); <br/>} <br/>catch (InterruptedException e) {} <br/>if ((new Date().getTime() - startTime) &gt;= timeout) { <br/>// wait()返回的原因是超时 <br/>return null; <br/>} <br/>} <br/>return con; <br/>} <br/><br/>/** <br/>* 关闭所有连接 <br/>*/ <br/>public synchronized void release() <br/>{ <br/>Enumeration allConnections = freeConnections.elements(); <br/>while (allConnections.hasMoreElements()) <br/>{ <br/>Connection con = (Connection) allConnections.nextElement(); <br/>try { <br/>con.close(); <br/>log(&#34;关闭连接池&#34; + name+&#34;中的一个连接&#34;); <br/>} <br/>catch (SQLException e) <br/>{ <br/>log(e, &#34;无法关闭连接池&#34; + name+&#34;中的连接&#34;); <br/>} <br/>} <br/>freeConnections.removeAllElements(); <br/>} <br/>/** <br/>* 关闭一个连接 <br/>*/ <br/>public synchronized void releaseOne() <br/>{ <br/>if(freeConnections.firstElement()!=null) <br/>{ Connection con = (Connection) freeConnections.firstElement(); <br/>try { <br/>con.close(); <br/>System.out.println(&#34;关闭连接池&#34; + name+&#34;中的一个连接&#34;); <br/>log(&#34;关闭连接池&#34; + name+&#34;中的一个连接&#34;); <br/>} <br/>catch (SQLException e) <br/>{ <br/><br/>System.out.println(&#34;无法关闭连接池&#34; + name+&#34;中的一个连接&#34;); <br/>log(e, &#34;无法关闭连接池&#34; + name+&#34;中的连接&#34;); <br/>} <br/>} <br/>else <br/>{ <br/>System.out.println(&#34;releaseOne() bug.......................................................&#34;); <br/><br/>} <br/>} <br/><br/>/** <br/>* 创建新的连接 <br/>*/ <br/>private Connection newConnection() <br/>{ <br/>Connection con = null; <br/>try <br/>{ <br/>if (user == null) { <br/>con = DriverManager.getConnection(URL); <br/>} <br/>else{ <br/>con = DriverManager.getConnection(URL, user, password); <br/>} <br/>log(&#34;连接池&#34; + name+&#34;创建一个新的连接&#34;); <br/><br/>} <br/>catch (SQLException e) { <br/>log(e, &#34;无法创建下列URL的连接: &#34; + URL); <br/>return null; <br/>} <br/>return con; <br/>} <br/>} <br/>}<br/></div></div><br/><br/>PoolMan <br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.itweb2.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>import java.io.*; <br/>import com.sjky.pool.*; <br/>import java.sql.*; <br/>import java.util.*; <br/>import java.util.Date; <br/>import java.net.*; <br/><br/>public class PoolMan extends ConnectPool { <br/><br/>private ConnectPool connMgr; <br/>private Statement stmt; <br/>private Connection con ; <br/>private ResultSet rst; <br/><br/>/** <br/>*对象连接初始化 <br/>* */ <br/><br/>public Connection getPool(String name) throws Exception <br/>{ <br/>try{ <br/>connMgr = ConnectPool.getInstance(); <br/>con = connMgr.getConnection(name); <br/>}catch(Exception e) <br/>{ <br/>System.err.println(&#34;不能创建连接!请尝试重启应用服务器&#34;); <br/><br/>} <br/>return con; <br/>} <br/><br/>/** <br/>*同以上方法,加入连接空闲等待时间 <br/>*待用方法 <br/>* */ <br/><br/>public Connection getPool_t(String name, long time) throws Exception <br/>{ <br/>try{ <br/>connMgr = ConnectPool.getInstance(); <br/>con = connMgr.getConnection(name,time); <br/>}catch(Exception e) <br/>{ <br/>System.err.println(&#34;不能创建连接!&#34;); <br/><br/>} <br/>return con; <br/>} <br/>/** <br/>*执行查询方法1 <br/>* */ <br/>public ResultSet executeQuery(String SqlStr) throws Exception <br/>{ <br/>ResultSet result = null; <br/>try <br/>{ <br/>stmt = con.cr&#101;ateStatement(); <br/>result = stmt.executeQuery(SqlStr); <br/>// here add one line by jnma 12.11 <br/>con.commit(); <br/>} <br/>catch(java.sql.SQLException e) <br/>{ <br/>throw new Exception(&#34;执行查询语句出错&#34;); <br/>} <br/>return result; <br/>} <br/>/** <br/>*执行查询方法2 <br/>* */ <br/>public ResultSet getRst(String SqlStr) throws Exception <br/>{ <br/>// ResultSet result = null; <br/>try <br/>{ <br/>stmt = con.cr&#101;ateStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br/>rst = stmt.executeQuery(SqlStr); <br/>// here add one line by jnma 12.11 <br/>con.commit(); <br/>} <br/>catch(java.sql.SQLException e) <br/>{ <br/>throw new Exception(&#34;执行查询语句出错&#34;); <br/>} <br/>return rst; <br/>} <br/>/** <br/>*执行更新 <br/>* */ <br/>public int Up&#100;ate(String SqlStr) throws Exception <br/>{ <br/>int result = -1; <br/>try <br/>{ <br/>stmt = con.cr&#101;ateStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); <br/>result = stmt.executeUp&#100;ate(SqlStr); <br/>// here add one line by jnma 12.11 <br/>con.commit(); <br/>if(result==0) <br/>System.out.println(&#34;执行del&#101;te,up&#100;ate,ins&#101;rt SQL出错&#34;); <br/>} <br/>catch(java.sql.SQLException e) <br/>{ <br/>System.err.println(&#34;执行del&#101;te,up&#100;ate,ins&#101;rt SQL出错&#34;); <br/>} <br/>return result; <br/>} <br/><br/>/** <br/>*执行事务处理 <br/>* */ <br/>public boolean handleTransaction(Vector SqlArray) throws Exception <br/>{ <br/>boolean result = false; <br/>int ArraySize = SqlArray.size(); <br/>try <br/>{ <br/>stmt = con.cr&#101;ateStatement(); <br/>con.setAutoCommit(false); <br/>System.out.println(&#34;ArraySize is&#34; +ArraySize); <br/>for(int i=0;i&lt;ArraySize;i++) <br/>{ <br/>System.out.println(&#34; 开始执行语句&#34;+(String)SqlArray.elementAt(i)); <br/>stmt.executeUp&#100;ate((String)SqlArray.elementAt(i)); <br/>System.out.println(&#34; 执行成功&#34;); <br/>} <br/>con.commit(); <br/>con.setAutoCommit(true) ;//必须 <br/>System.out.println(&#34;事务执行成功&#34;); <br/>result = true; <br/>} <br/>catch(java.sql.SQLException e) <br/>{ <br/>try <br/>{ <br/>System.out.println(e.toString()); <br/>System.out.println(&#34;数据库操作失败&#34;); <br/>con.rollback(); <br/>} <br/>catch(java.sql.SQLException Te) <br/>{ <br/>System.err.println(&#34;事务出错回滚异常&#34;); <br/>} <br/>} <br/>try <br/>{ <br/>con.setAutoCommit(true); <br/>} <br/>catch(java.sql.SQLException e) <br/>{ <br/>System.err.println(&#34;设置自动提交失败&#34;); <br/>} <br/>return result; <br/>} <br/><br/>/** <br/>*释放连接 <br/>* */ <br/>public void close(String name) throws Exception <br/>{ <br/>try <br/>{ <br/>if(stmt!=null) <br/>stmt.close(); <br/>if(con!=null) <br/>{ <br/>connMgr.freeConnection(name,con); <br/><br/>System.out.println(&#34; [c 正在释放一个连接 ] &#34;); <br/><br/>} <br/>} <br/>catch(java.sql.SQLException e) <br/>{ <br/>System.err.println(&#34;释放连接出错&#34;); <br/>} <br/>} <br/>}<br/></div></div><br/><br/>属性文件db.properties放在conf下<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.itweb2.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>#drivers=com.inet.tds.TdsDriver <br/>#logfile=c:\resin\DBConnectPool-log.txt <br/>#test.maxconn=1000 <br/>#test.url=jdbc:inetdae:SERVER:1433?sql7=true <br/>#test.user=sa <br/>#test.password=test <br/><br/>drivers=com.microsoft.jdbc.sqlserver.SQLServerDriver <br/>logfile=F:\resin\DBConnectPool-log.txt <br/>test.maxconn=20 <br/>test.url=jdbc:microsoft:sqlserver://202.197.127.207:1433;DatabaseName=test <br/>test.user=sa <br/>test.password=test <br/><br/><br/>#drivers=oracle.jdbc.driver.OracleDriver <br/>#logfile=c:\resin\DBConnectPool-log.txt <br/>#test.maxconn=100 <br/>#test.url=jdbc:oracle:thin:@202.197.127.207:1521:myhome <br/>#test.user=system <br/>#test.password=manager <br/>#mysql端3306 <br/><br/>#drivers=org.gjt.mm.mysql.Driver <br/>#logfile=c:\resin\DBConnectPool-log.txt <br/>#test.maxconn=100 <br/>#test.url=jdbc:mysql://202.197.127.207:3306/my_test <br/>#test.user=root <br/>#test.password=system<br/></div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.itweb2.com/article/java/319.htm</link>
			<title><![CDATA[Tomcat 配置集锦]]></title>
			<author>lc1209@163.com(journey)</author>
			<category><![CDATA[程序乐园]]></category>
			<pubDate>Mon,12 Mar 2007 22:06:49 +0800</pubDate>
			<guid>http://www.itweb2.com/default.asp?id=319</guid>
		<description><![CDATA[Tomcat 服务器server.xml的关键参数配置 说明：以下文字均以tomcat5.0.30为例进行。 1，配置tomcat服务器访问端口，只需配置Connector的port端口即可。Tomcat默认为8080，现修改port参数值为80。 2，配置tomcat支持URL中文参数，只需添加Connector的URIEncoding参数即可，默认情况下该参数未被配置。要支持URL参数支持中文，加上URIEncoding=”GBK”就行了（见1中附代码最后一行）。 3，配置新的webApp：找到host尾标记，插入新的context即可。如：（1）若要支持数据库（以SQL Server为例），则为：（2） factory o&#114;g.apache.commons.dbcp.BasicDataSourceFactory m<br/><br/><br/>Tomcat 服务器server.xml的关键参数配置<br/><br/>说明：以下文字均以tomcat5.0.30为例进行。<br/><br/>1，配置tomcat服务器访问端口，只需配置Connector的port端口即可。Tomcat默认为8080，现修改port参数值为80。<br/><br/>&lt;!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 --&gt;<br/><br/>&lt;Connector port=&#34;80&#34;<br/><br/>maxThreads=&#34;150&#34; minSpareThreads=&#34;25&#34; maxSpareThreads=&#34;75&#34;<br/><br/>enableLookups=&#34;false&#34; redirectPort=&#34;8443&#34; acceptCount=&#34;100&#34;<br/><br/>debug=&#34;0&#34; connectionTimeout=&#34;20000&#34; <br/><br/>disableUploadTimeout=&#34;true&#34; URIEncoding=&#34;GBK&#34;/&gt;<br/><br/>2，配置tomcat支持URL中文参数，只需添加Connector的URIEncoding参数即可，默认情况下该参数未被配置。要支持URL参数支持中文，加上URIEncoding=&#34;GBK&#34;就行了（见1中附代码最后一行）。<br/><br/>3，配置新的webApp：找到host尾标记&lt;/Host&gt;，插入新的context即可。<br/>如：<br/>（1）&lt;Context path=&#34;&#34; docBase=&#34;ROOT&#34; debug=&#34;0&#34;/&gt;<br/>若要支持数据库（以SQL Server为例），则为：<br/>（2）&lt;Context path=&#34;/xkb&#34; docBase=&#34;F:\XKB6\webApp&#34; debug=&#34;5&#34; reloadable=&#34;true&#34; crossContext=&#34;true&#34;&gt;<br/><br/>&lt;Logger className=&#34;org.apache.catalina.logger.FileLogger&#34; prefix=&#34;localhost_DBTest_log.&#34; suffix=&#34;.txt&#34; timestamp=&#34;true&#34;/&gt;<br/><br/>&lt;Resource name=&#34;jdbc/SqlServerDB&#34; auth=&#34;Container&#34; type=&#34;javax.sql.DataSource&#34;/&gt;<br/><br/>&lt;ResourceParams name=&#34;jdbc/SqlServerDB&#34;&gt;<br/><br/>&lt;parameter&gt;<br/><br/>&lt;name&gt;factory&lt;/name&gt;<br/><br/>&lt;value&gt;org.apache.commons.dbcp.BasicDataSourceFactory&lt;/value&gt;<br/><br/>&lt;/parameter&gt;<br/><br/>&lt;!-- Maximum number of dB connections in pool. Make sure you configure your mysqld max_connections large enough to handle all of your db connections. Set to 0 for no limit.--&gt;<br/><br/>&lt;parameter&gt;<br/><br/>&lt;name&gt;maxActive&lt;/name&gt;<br/><br/>&lt;value&gt;50&lt;/value&gt;<br/><br/>&lt;/parameter&gt;<br/><br/>&lt;!-- Maximum number of idle dB connections to retain in pool. Set to 0 for no limit.--&gt;<br/><br/>&lt;parameter&gt;<br/><br/>&lt;name&gt;maxIdle&lt;/name&gt;<br/><br/>&lt;value&gt;20&lt;/value&gt;<br/><br/>&lt;/parameter&gt;<br/><br/>&lt;!-- Maximum time to wait for a dB connection to become available in ms, in this example 0.5 seconds. An Exception is thrown if this timeout is exceeded. Set to -1 to wait indefinitely. --&gt;<br/><br/>&lt;parameter&gt;<br/><br/>&lt;name&gt;maxWait&lt;/name&gt;<br/><br/>&lt;value&gt;500&lt;/value&gt;<br/><br/>&lt;/parameter&gt;<br/><br/>&lt;!-- msSQL dB username and password for dB connections --&gt;<br/><br/>&lt;parameter&gt;<br/><br/>&lt;name&gt;username&lt;/name&gt;<br/><br/>&lt;value&gt;sa&lt;/value&gt;<br/><br/>&lt;/parameter&gt;<br/><br/>&lt;parameter&gt;<br/><br/>&lt;name&gt;password&lt;/name&gt;<br/><br/>&lt;value&gt;wangnewton&lt;/value&gt;<br/><br/>&lt;/parameter&gt;<br/><br/>&lt;!-- Class name for SQLServer2000 JDBC driver --&gt;<br/><br/>&lt;parameter&gt;<br/><br/>&lt;name&gt;driverClassName&lt;/name&gt;<br/><br/>&lt;value&gt;com.microsoft.jdbc.sqlserver.SQLServerDriver&lt;/value&gt;<br/><br/>&lt;/parameter&gt;<br/><br/>&lt;!-- The JDBC connection url for connecting to your MS SQL Server dB.The autoReconnect=true argument to the url makes sure that the mm.Sql Server JDBC Driver will automatically reconnect if mysqld closed the connection. mysqld by default closes idle connections after 8 hours.--&gt;<br/><br/>&lt;parameter&gt;<br/><br/>&lt;name&gt;url&lt;/name&gt;<br/><br/>&lt;value&gt;jdbc:microsoft:sqlserver://localhost:1433;databaseName=XKBCourse&lt;/value&gt;<br/><br/>&lt;!--must use &amp; not use &amp; --&gt;<br/><br/>&lt;/parameter&gt;<br/><br/>&lt;/ResourceParams&gt;<br/><br/>&lt;/Context&gt; <br/><br/>tomcat5.5.x 配置记录。<br/><br/>1.下载：<br/><a href="http://www.eu.apache.org/dist/jakarta/tomcat-5/" target="_blank" rel="external">http://www.eu.apache.org/dist/jakarta/tomcat-5/</a><br/><a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-admin.zip" target="_blank" rel="external">http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-admin.zip</a><br/><a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-compat.zip" target="_blank" rel="external">http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-compat.zip</a><br/><a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x.zip" target="_blank" rel="external">http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x.zip</a><br/><a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-deployer.zip" target="_blank" rel="external">http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-deployer.zip</a><br/>把jakarta-tomcat-5.5.x.zip<br/>和jakarta-tomcat-5.5.x-compat.zip<br/>和jakarta-tomcat-5.5.x-admin.zip<br/>(Tomcat 默认是没有内置admin模块了<br/>Tomcat***s administration web application is no longer installed by default. Download and install the &#34;admin&#34; package to use it. )<br/>都解压到同一个目录下面。比如：D:\jakarta-tomcat-5.5.x\<br/>(如果使用jdk1.4，才需要compat.zip用jdk1.5就可以免了这个。) <br/><br/>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/>&lt;role rolename=&#34;tomcat&#34;/&gt;<br/>&lt;role rolename=&#34;role1&#34;/&gt;<br/>&lt;role rolename=&#34;manager&#34;/&gt;<br/>&lt;role rolename=&#34;admin&#34;/&gt;<br/>&lt;user username=&#34;tomcat&#34; password=&#34;tomcat&#34; roles=&#34;tomcat&#34;/&gt;<br/>&lt;user username=&#34;role1&#34; password=&#34;tomcat&#34; roles=&#34;role1&#34;/&gt;<br/>&lt;user username=&#34;both&#34; password=&#34;tomcat&#34; roles=&#34;tomcat,role1&#34;/&gt;<br/>&lt;user username=&#34;lizongbo&#34; password=&#34;lizongbopass&#34; roles=&#34;admin,manager&#34;/&gt;<br/>&lt;/tomcat-users&gt;<br/><br/>3.修改jakarta-tomcat-5.5.x\conf\server.xml来解决编码问题。<br/>(给Connector 添加URIEncoding参数，参考<a href="http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx" target="_blank" rel="external">http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx</a>)<br/>(可以设置成GB18030)<br/>&lt;Connector port=&#34;8080&#34;<br/>maxThreads=&#34;150&#34; minSpareThreads=&#34;25&#34; maxSpareThreads=&#34;75&#34;<br/>enableLookups=&#34;false&#34; redirectPort=&#34;8443&#34; acceptCount=&#34;200&#34;<br/>connectionTimeout=&#34;20000&#34; disableUploadTimeout=&#34;true&#34; URIEncoding=&#34;GBK&#34;<br/>compression=&#34;on&#34; compressionMinSize=&#34;2048&#34; <br/>noCompressionUserAgents=&#34;gozilla, traviata&#34; <br/>compressableMimeType=&#34;text/html,text/xml&#34;/&gt;<br/><br/>&lt;Connector port=&#34;8009&#34; <br/>enableLookups=&#34;false&#34; redirectPort=&#34;8443&#34; protocol=&#34;AJP/1.3&#34; URIEncoding=&#34;GBK&#34;/&gt;<br/><br/>4.启用支持gzip压缩.<br/>(<a href="http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1" target="_blank" rel="external">http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1</a>&amp;i=81169)<br/>添加下列属性<br/>compression=&#34;on&#34; <br/>compressionMinSize=&#34;2048&#34; <br/>noCompressionUserAgents=&#34;gozilla, traviata&#34; <br/>compressableMimeType=&#34;text/html,text/xml&#34;<br/><br/>5.设置虚拟主机。<br/>在jakarta-tomcat-5.5.x\下建立文件夹vhost\www.mydomain.com。<br/>然后修改jakarta-tomcat-5.5.x\conf\server.xml<br/><br/>&lt;Engine defaultHost=&#34;localhost&#34; name=&#34;Catalina&#34;&gt;<br/>&lt;Host appBase=&#34;vhost/www.mydomain.com&#34; name=&#34;www.mydomain.com&#34;&gt;<br/>&lt;/Host&gt;<br/>&lt;Host appBase=&#34;webapps&#34; name=&#34;localhost&#34;&gt;<br/>&lt;/Host&gt;<br/>&lt;Realm className=&#34;org.apache.catalina.realm.UserDatabaseRealm&#34;/&gt;<br/>&lt;/Engine&gt;<br/><br/>6.添加数据库驱动,更新mail.jar和actiovation.jar<br/>复制mysql-connector-java-3.0.16-ga-bin.jar,pg74.215.jdbc3.jar到 jakarta-tomcat-5.5.x\common\lib\<br/>还有javamail 1.3.2的mail.jar，jaf-1_0_2的 activation.jar<br/>msSQl 2000 JDBC sp3，msbase.jar,msutil,jar,mssqlserver.jar<br/><br/>7.配置SSL<br/>参考 <a href="http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html" target="_blank" rel="external">http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html</a><br/>D:\j2sdk1.4.2_06\bin&gt;%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA<br/>输入keystore密码： lizongbossl<br/>您的名字与姓氏是什么？<br/>[tomcat5.5.x]： tomcat5.5.x<br/>您的组织单位名称是什么？<br/>[jakarta]： jakarta<br/>您的组织名称是什么？<br/>[apache]： apache<br/>您所在的城市或区域名称是什么？<br/>[hzcity]： hzcity<br/>您所在的州或省份名称是什么？<br/>[gdp]： gdp<br/>该单位的两字母国家代码是什么<br/>[CN]： CN<br/>CN=tomcat5.5.x, OU=jakarta, O=apache, L=hzcity, ST=gdp, C=CN 正确吗？<br/>[否]： y<br/><br/>输入&lt;tomcat&gt;的主密码<br/>（如果和 keystore 密码相同，按回车）：<br/><br/>(必须密码一致，因此直接回车)<br/>然后再把userhome(例如：C:\Documents and Settings\lizongbo\)下的.keystore复制到<br/>tomcat的conf\目录下。<br/>(例如：D:\jakarta-tomcat-5.5.x\conf\.keystore )<br/>配置jakarta-tomcat-5.5.x\conf\server.xml<br/>加上<br/>&lt;Connector port=&#34;8443&#34; <br/>maxThreads=&#34;150&#34; minSpareThreads=&#34;25&#34; maxSpareThreads=&#34;75&#34;<br/>enableLookups=&#34;false&#34; disableUploadTimeout=&#34;true&#34;<br/>acceptCount=&#34;100&#34; scheme=&#34;https&#34; secure=&#34;true&#34;<br/>clientAuth=&#34;false&#34; sslProtocol=&#34;TLS&#34; <br/>keystoreFile=&#34;conf/.keystore&#34; <br/>keystorePass=&#34;lizongbossl&#34;&gt; &lt;!--与先前设置的密码一致--&gt;<br/>&lt;/Connector&gt;<br/>8.禁止文件目录列表，<br/>修改jakarta-tomcat-5.5.x\conf\web.xml，把listing设置为false<br/><br/>&lt;servlet&gt;<br/>&lt;servlet-name&gt;default&lt;/servlet-name&gt;<br/>&lt;servlet-class&gt;org.apache.catalina.servlets.DefaultServlet&lt;/servlet-class&gt;<br/>&lt;init-param&gt;<br/>&lt;param-name&gt;debug&lt;/param-name&gt;<br/>&lt;param-value&gt;0&lt;/param-value&gt;<br/>&lt;/init-param&gt;<br/>&lt;init-param&gt;<br/>&lt;param-name&gt;listings&lt;/param-name&gt;<br/>&lt;param-value&gt;true&lt;/param-value&gt;<br/>&lt;/init-param&gt;<br/>&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br/>&lt;/servlet&gt;<br/><br/>9.指定了自己的javaEncoding<br/>(参考 <a href="http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html" target="_blank" rel="external">http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html</a> )<br/><br/>&lt;servlet&gt;<br/>&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br/>&lt;servlet-class&gt;org.apache.jasper.servlet.JspServlet&lt;/servlet-class&gt;<br/>&lt;init-param&gt;<br/>&lt;param-name&gt;fork&lt;/param-name&gt;<br/>&lt;param-value&gt;false&lt;/param-value&gt;<br/>&lt;/init-param&gt;<br/>&lt;init-param&gt;<br/>&lt;param-name&gt;javaEncoding&lt;/param-name&gt;<br/>&lt;param-value&gt;GB18030&lt;/param-value&gt;<br/>&lt;/init-param&gt;<br/>&lt;init-param&gt;<br/>&lt;param-name&gt;xpoweredBy&lt;/param-name&gt;<br/>&lt;param-value&gt;true&lt;/param-value&gt;<br/>&lt;/init-param&gt;<br/>&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br/>&lt;/servlet&gt;<br/>10.添加rar,iso等的mime-type映射 <br/>避免在浏览器里直接打开。<br/>&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;<br/>&lt;mime-mapping&gt;<br/>&lt;extension&gt;rar&lt;/extension&gt;<br/>&lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br/>&lt;/mime-mapping&gt;<br/>&lt;mime-mapping&gt;<br/>&lt;extension&gt;iso&lt;/extension&gt;<br/>&lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br/>&lt;/mime-mapping&gt;<br/>&lt;mime-mapping&gt;<br/>&lt;extension&gt;ape&lt;/extension&gt;<br/>&lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br/>&lt;/mime-mapping&gt;<br/>&lt;mime-mapping&gt;<br/>&lt;extension&gt;rmvb&lt;/extension&gt;<br/>&lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br/>&lt;/mime-mapping&gt;<br/>&lt;mime-mapping&gt;<br/>&lt;extension&gt;ico&lt;/extension&gt;<br/>&lt;mime-type&gt;image/x-icon&lt;/mime-type&gt;<br/>&lt;/mime-mapping&gt;<br/>10.1对html静态页面设置编码<br/>&lt;!-- 修改下面两行以支持静态超文本的自动编码 <br/>--&gt; <br/>&lt;mime-mapping&gt;<br/>&lt;extension&gt;htm&lt;/extension&gt; <br/>&lt;mime-type&gt;text/html;charset=gb2312&lt;/mime-type&gt; <br/>&lt;/mime-mapping&gt;<br/>&lt;mime-mapping&gt;<br/>&lt;extension&gt;html&lt;/extension&gt; <br/>&lt;mime-type&gt;text/html;charset=gb2312&lt;/mime-type&gt; <br/>&lt;/mime-mapping&gt;<br/>&lt;/web-app&gt;<br/><br/>11.添加welcome-file-list，并调整顺序。<br/>&lt;welcome-file-list&gt; <br/>&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br/>&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br/>&lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br/>&lt;welcome-file&gt;default.html&lt;/welcome-file&gt;<br/>&lt;welcome-file&gt;default.htm&lt;/welcome-file&gt;<br/>&lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;<br/>&lt;/welcome-file-list&gt; <br/><br/>Tomcat中文编码问题解决方案(简) <br/><br/>liyonghai 04/08/30 <br/><br/>编码问题的根源可参考<a href="http://www-900.ibm.com/developerWorks/cn/java/java_chinese/index.shtml" target="_blank" rel="external">http://www-900.ibm.com/developerWorks/cn/java/java_chinese/index.shtml</a><br/><br/>Tomcat 4.x解决方法: <br/>获取中文:request.setCharacterEncoding(&#34;gb2312&#34;); <br/>输出中文:&lt;%@ page contentType=&#34;text/html;charset=gb2312&#34; %&gt;,必要时需要转码 <br/><br/>Tomcat 5.x解决方法: <br/>获取中文: <br/>提交表单时 <br/>1)post:request.setCharacterEncoding(&#34;gb2312&#34;); <br/>2)get:修改server.xml,在Connector中加入URIEncoding=&#34;gb2312&#34; <br/>如: &lt;Connector port=&#34;80&#34; maxThreads=&#34;150&#34; minSpareThreads=&#34;25&#34; maxSpareThreads=&#34;75&#34; <br/>enableLookups=&#34;false&#34; redirectPort=&#34;8443&#34; acceptCount=&#34;100&#34; <br/>debug=&#34;0&#34; connectionTimeout=&#34;20000&#34; <br/>disableUploadTimeout=&#34;true&#34; URIEncoding=&#34;gb2312&#34; /&gt; <br/>或者使用useBodyEncodingForURI,使tomcat 5.x兼容tomcat 4.x <br/>输出中文:&lt;%@ page contentType=&#34;text/html;charset=gb2312&#34; %&gt;,必要时需要转码 <br/><br/>附:Tomcat 5.x与Tomcat 4.x在解析提交表单时发生了变化,Tomcat 4.x无论是post还是get,都使用 <br/>相同的编码,而Tomcat 5.x 却把get方法单独了出来.具体可查看tomcat的source code. <br/><br/>get方式的处理比较好，对于post方式建议用配置过滤器的方式来解决，因为这样,配置一个地方整个系统都不用操心了。 <br/><br/>简单说明： <br/>web.xml <br/>&lt;filter&gt; <br/>&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt; <br/>&lt;filter-class&gt;SetCharacterEncodingFilter&lt;/filter-class&gt; <br/>&lt;/filter&gt; <br/>&lt;filter-mapping&gt; <br/>&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt; <br/>&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br/>&lt;/filter-mapping&gt; <br/>/************************/ <br/><br/>SetCharacterEncodingFilter.java <br/>-------------------------------------------- <br/>import java.io.IOException; <br/>import javax.servlet.Filter; <br/>import javax.servlet.FilterChain; <br/>import javax.servlet.FilterConfig; <br/>import javax.servlet.ServletException; <br/>import javax.servlet.ServletRequest; <br/>import javax.servlet.ServletResponse; <br/>import javax.servlet.UnavailableException; <br/><br/>/** <br/>* Example filter that sets the character encoding to be used in parsing the <br/>* incoming request <br/>*/ <br/>public class SetCharacterEncodingFilter implements Filter { <br/><br/>/** <br/>* Take this filter out of service. <br/>*/ <br/>public void destroy() { <br/>} <br/>/** <br/>* sel&#101;ct and set (if specified) the character encoding to be used to <br/>* interpret request parameters for this request. <br/>*/ <br/>public void doFilter(ServletRequest request, ServletResponse response, <br/>FilterChain chain)throws IOException, ServletException { <br/><br/>request.setCharacterEncoding(&#34;GBK&#34;); <br/><br/>// 传递控制到下一个过滤器 <br/>chain.doFilter(request, response); <br/>} <br/><br/>public void init(FilterConfig filterConfig) throws ServletException { <br/>} <br/>} <br/>////也可以把编码做为参数传递进去。 <br/><br/>12.如果你的webapp需要只能够进行https方式访问，那么在webapp的web.xml里加上：<br/>&lt;security-constraint&gt;<br/>&lt;web-resource-collection&gt;<br/>&lt;web-resource-name&gt;must https&lt;/web-resource-name&gt;<br/>&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br/>&lt;/web-resource-collection&gt;<br/>&lt;user-data-constraint&gt;<br/>&lt;transport-guarantee&gt;CONFIDENTIAL&lt;/transport-guarantee&gt;<br/>&lt;/user-data-constraint&gt;<br/>&lt;/security-constraint&gt;<br/>参考：<a href="http://jakarta.apache.org/tomcat/faq/security.html" target="_blank" rel="external">http://jakarta.apache.org/tomcat/faq/security.html</a>#https<br/><a href="http://marc.theaimsgroup.com/?l=tomcat-user" target="_blank" rel="external">http://marc.theaimsgroup.com/?l=tomcat-user</a>&amp;m=104951559722619&amp;w=2<br/><br/>13.修改远程关闭服务器的命令。<br/>server.xml默认有下面一行：<br/>&lt;Server port=&#34;8005&#34; shutdown=&#34;SHUTDOWN&#34;&gt;<br/>这样允许任何人只要telnet到服务器的8005端口，输入&#34;SHUTDOWN&#34;，然后回车，服务器立即就被关掉了。<br/>从安全的角度上考虑，我们需要把这个shutdown指令改成一个别人不容易猜测的字符串。<br/>例如修改如下：<br/>&lt;Server port=&#34;8006&#34; shutdown=&#34;lizongbo&#34;&gt;，这样就只有在telnet到8005，并且输入&#34;lizongbo&#34;才能够关闭Tomcat.<br/>注意：这个修改不影响shutdown.bat的执行。运行shutdown.bat一样可以关闭服务器。<br/>参考：<a href="http://jakarta.apache.org/tomcat/faq/security.html" target="_blank" rel="external">http://jakarta.apache.org/tomcat/faq/security.html</a>#8005<br/><br/>以下皆可以参考：<a href="http://www.cnjsp.org/document/user/tuman/valve.html" target="_blank" rel="external">http://www.cnjsp.org/document/user/tuman/valve.html</a><br/><br/>14.配置http访问日志。Tomcat自带的能够记录的http访问日志已经很详细了<br/>取消下面这段的注释：<br/><br/>&lt;Valve className=&#34;org.apache.catalina.valves.AccessLogValve&#34;<br/>directory=&#34;logs&#34; prefix=&#34;localhost_access_log.&#34; suffix=&#34;.txt&#34;<br/>pattern=&#34;common&#34; resolveHosts=&#34;false&#34;/&gt;<br/><br/>然后修改为：<br/>&lt;Valve className=&#34;org.apache.catalina.valves.FastCommonAccessLogValve&#34;<br/>directory=&#34;logs&#34; prefix=&#34;localhost_access_log.&#34; suffix=&#34;.txt&#34;<br/>pattern=&#34;combined&#34; resolveHosts=&#34;false&#34; fileDateFormat=&#34;yyyy-MM-dd.HH&#34;/&gt;<br/><br/>pattern=&#34;combined&#34; 记录的日志内容更详细，fileDateFormat=&#34;yyyy-MM-dd.HH&#34;，会让日志文件按小时进行滚卷，<br/>比默认的按天滚卷要好些，尤其是访问量大的网站，可以考虑写成fileDateFormat=&#34;yyyy-MM-dd.HH.mm&#34;，就会是每分钟一个日志文件了。<br/>而且可以分别按Engine, Host, o&#114; Context,来记录自己的日志<br/>详情参考：<br/><a href="http://jakarta.apache.org/tomcat/tomcat-5.5-doc/config/valve.html" target="_blank" rel="external">http://jakarta.apache.org/tomcat/tomcat-5.5-doc/config/valve.html</a><br/><a href="http://jakarta.apache.org/tomcat/tomcat-5.0-doc/config/logger.html" target="_blank" rel="external">http://jakarta.apache.org/tomcat/tomcat-5.0-doc/config/logger.html</a><br/><a href="http://jakarta.apache.org/tomcat/tomcat-5.0-doc/config/host.html" target="_blank" rel="external">http://jakarta.apache.org/tomcat/tomcat-5.0-doc/config/host.html</a>#Access%20Logs<br/>而且还可以配合awstats来进行日志统计分析： <a href="http://www.chedong.com/tech/awstats.html" target="_blank" rel="external">http://www.chedong.com/tech/awstats.html</a> <a href="http://blog.csdn.net/lizongbo/archive/2005/02/18/291929.aspx" target="_blank" rel="external">http://blog.csdn.net/lizongbo/archive/2005/02/18/291929.aspx</a><br/><br/>15.限制ip，限制主机访问等。<br/>如果想禁止指定的ip或者主机名来拒绝某些机器访问，或者指定某些机器来访问。<br/>也支持分别按Engine, Host, o&#114; Context,进行以下配置：<br/>&lt;Context path=&#34;/examples&#34; ...&gt; ...<br/>&lt;Valve className=&#34;org.apache.catalina.valves.RemoteHostValve&#34;<br/>allow=&#34;*.mycompany.com,www.yourcompany.com&#34;/&gt;<br/>&lt;Valve className=&#34;org.apache.catalina.valves.RemoteAddrValve&#34;<br/>deny=&#34;192.168.1.*&#34;/&gt;<br/>&lt;/Context&gt;<br/>参考：<br/><a href="http://jakarta.apache.org/tomcat/tomcat-5.0-doc/config/context.html" target="_blank" rel="external">http://jakarta.apache.org/tomcat/tomcat-5.0-doc/config/context.html</a><br/><br/>16.发布webapp到网站根目录<br/>1。直接复制到ROOT目录下。<br/>2.因为无法创建无名字的xml文件，并且在xml文件里指定path也是无效的(tomcat靠文件名字来判断的)，<br/>因此必须在server.xml里写下面一段：<br/>&lt;Context docBase=&#34;${catalina.home}/vhost/www.lizongbo.com&#34; path=&#34;/&#34;<br/>privileged=&#34;true&#34; antiResourceLocking=&#34;false&#34; antiJARLocking=&#34;false&#34;&gt;<br/>&lt;Manager className=&#34;org.apache.catalina.session.StandardManager&#34; algorithm=&#34;SHA-512&#34; sessionIdLength=&#34;40&#34;&gt;<br/>&lt;Valve className=&#34;org.apache.catalina.valves.FastCommonAccessLogValve&#34;<br/>directory=&#34;logs&#34; prefix=&#34;localhost_mytest_access_log.&#34; suffix=&#34;.txt&#34;<br/>pattern=&#34;combined&#34; resolveHosts=&#34;true&#34; fileDateFormat=&#34;yyyy-MM-dd.HH&#34;/&gt; <br/><br/>&lt;/Context&gt;<br/>而且必须把ROOT目录删除掉，否则Tomcat还是优先部署ROOT目录为&#34;/&#34;。<br/><br/>17.在重新启动Tomcat的webapp的时候，禁止把session写入文件。<br/>修改conf/web.xml<br/>取消注释：<br/>&lt;!----&gt;<br/>&lt;Manager pathname=&#34;&#34; /&gt;<br/><br/>18.增强SessiionID的生成算法和长度。<br/><br/>&lt;Manager className=&#34;org.apache.catalina.session.StandardManager&#34; algorithm=&#34;SHA-512&#34; sessionIdLength=&#34;40&#34;&gt;<br/>&lt;/Manager&gt;<br/><br/>（Tomcat默认算法是MD5,默认长度是16位。） <br/><br/><br/>//------------------------------------------------------------------------------------------------------------------------------------------<br/><br/><br/><br/><a href="http://blog.csdn.net/dakuen/" target="_blank" rel="external">http://blog.csdn.net/dakuen/</a><br/><br/><br/>1.下载<a href="http://www.eu.apache.org/dist/jakarta/tomcat-5/" target="_blank" rel="external">http://www.eu.apache.org/dist/jakarta/tomcat-5/</a> <br/>这里注意，在jakarta-tomcat-5.0.28.exe以前是有默认的admin模块，在jakarta-tomcat-5.5.9.exe则没有安装默认的admin模块，这时<a href="http://127.0.0.1:8080/admin" target="_blank" rel="external">http://127.0.0.1:8080/admin</a>打开时则会出现 <br/>Tomcat***s administration web application is no longer installed by default. Download and install the &#34;admin&#34; package to use it. <br/>因此我们现在需要下载&#34;admin&#34;package 包<br/>把jakarta-tomcat-5.5.x.zip 与&nbsp;&nbsp; jakarta-tomcat-5.5.x-compat.zip 与 jakarta-tomcat-5.5.x-admin.zip<br/>三个文件解压在同一个目录中<br/>(如果使用jdk1.4，才需要compat.zip用jdk1.5就可以免了这个。) <br/><br/><br/><br/><br/>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/>&lt;role rolename=&#34;tomcat&#34;/&gt;<br/>&lt;role rolename=&#34;role1&#34;/&gt;<br/>&lt;role rolename=&#34;manager&#34;/&gt;<br/>&lt;role rolename=&#34;admin&#34;/&gt;<br/>&lt;user username=&#34;tomcat&#34; password=&#34;tomcat&#34; roles=&#34;tomcat&#34;/&gt;<br/>&lt;user username=&#34;role1&#34; password=&#34;tomcat&#34; roles=&#34;role1&#34;/&gt;<br/>&lt;user username=&#34;both&#34; password=&#34;tomcat&#34; roles=&#34;tomcat,role1&#34;/&gt;<br/>&lt;user username=&#34;lizongbo&#34; password=&#34;lizongbopass&#34; roles=&#34;admin,manager&#34;/&gt;<br/>&lt;/tomcat-users&gt;<br/><br/><br/>有时在%CATALINA_HOME%\server\webapps\admin\WEB-INF\web.xml里面也要做些修改<br/><br/><br/>&lt;!-- Security is active on entire directory --&gt;<br/>&lt;security-constraint&gt;<br/>&nbsp;&nbsp;&lt;display-name&gt;Tomcat Server Configuration Security Constraint&lt;/display-name&gt;<br/>&nbsp;&nbsp;&lt;web-resource-collection&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;web-resource-name&gt;Protected Area&lt;/web-resource-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- Define the context-relative URL(s) to be protected --&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;*.html&lt;/url-pattern&gt;<br/>&nbsp;&nbsp;&lt;/web-resource-collection&gt;<br/>&nbsp;&nbsp;&lt;auth-constraint&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- Anyone with one of the listed roles may access this area --&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;role-name&gt;admin&lt;/role-name&gt;<br/>&nbsp;&nbsp;&lt;/auth-constraint&gt;<br/>&lt;/security-constraint&gt;<br/><br/>&lt;!-- Login configuration uses form-based authentication --&gt;<br/>&lt;login-config&gt;<br/>&nbsp;&nbsp;&lt;auth-method&gt;FORM&lt;/auth-method&gt;<br/>&nbsp;&nbsp;&lt;realm-name&gt;Tomcat Server Configuration Form-Based Authentication Area&lt;/realm-name&gt;<br/>&nbsp;&nbsp;&lt;form-login-config&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-login-page&gt;/login.jsp&lt;/form-login-page&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;form-error-page&gt;/error.jsp&lt;/form-error-page&gt;<br/>&nbsp;&nbsp;&lt;/form-login-config&gt;<br/>&lt;/login-config&gt;<br/><br/>&lt;!-- Security roles referenced by this web application --&gt;<br/>&lt;security-role&gt;<br/>&nbsp;&nbsp;&lt;description&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;The role that is required to log in to the Administration Application<br/>&nbsp;&nbsp;&lt;/description&gt;<br/>&nbsp;&nbsp;&lt;role-name&gt;admin&lt;/role-name&gt;<br/>&lt;/security-role&gt;<br/>无论是 Authetication ( 身份验证 还是 Authorization ( 权限管控 都只有设置相关的 admin ROLE, 当你想要新增或修改相关的 AA, 就必须修改这一个文件, 来符合你的环境.<br/>3.修改jakarta-tomcat-5.5.x\conf\server.xml来解决编码问题。<br/>(给Connector 添加URIEncoding参数，参考<a href="http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx" target="_blank" rel="external">http://blog.csdn.net/darkxie/archive/2004/10/25/TOMCATAPP.aspx</a>) <br/>(可以设置成GB18030)<br/>&nbsp;&nbsp;&lt;Connector port=&#34;8080&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxThreads=&#34;150&#34; minSpareThreads=&#34;25&#34; maxSpareThreads=&#34;75&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enableLookups=&#34;false&#34; redirectPort=&#34;8443&#34; acceptCount=&#34;200&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connectionTimeout=&#34;20000&#34; disableUploadTimeout=&#34;true&#34; URIEncoding=&#34;GBK&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compression=&#34;on&#34; compressionMinSize=&#34;2048&#34; <br/>&nbsp;&nbsp;&nbsp;&nbsp;noCompressionUserAgents=&#34;gozilla, traviata&#34; <br/>&nbsp;&nbsp;&nbsp;&nbsp;compressableMimeType=&#34;text/html,text/xml&#34;/&gt;<br/><br/>&nbsp;&nbsp;&lt;Connector port=&#34;8009&#34; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enableLookups=&#34;false&#34; redirectPort=&#34;8443&#34; protocol=&#34;AJP/1.3&#34; URIEncoding=&#34;GBK&#34;/&gt;<br/><br/><br/>4.启用支持gzip压缩.<br/>(<a href="http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1" target="_blank" rel="external">http://www.linuxaid.com.cn/forum/showdoc.jsp?l=1</a>&amp;i=81169) <br/>添加下列属性<br/>compression=&#34;on&#34; <br/>&nbsp;&nbsp;&nbsp;&nbsp;compressionMinSize=&#34;2048&#34; <br/>&nbsp;&nbsp;&nbsp;&nbsp;noCompressionUserAgents=&#34;gozilla, traviata&#34; <br/>&nbsp;&nbsp;&nbsp;&nbsp;compressableMimeType=&#34;text/html,text/xml&#34;<br/><br/>5.设置虚拟主机。<br/>在jakarta-tomcat-5.5.x\下建立文件夹vhost\www.mydomain.com。<br/>然后修改jakarta-tomcat-5.5.x\conf\server.xml<br/><br/>&lt;Engine defaultHost=&#34;localhost&#34; name=&#34;Catalina&#34;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;Host appBase=&#34;vhost/www.mydomain.com&#34; name=&#34;<a href="http://www.mydomain.com/" target="_blank" rel="external">http://www.mydomain.com/</a>&#34;&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Host&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;Host appBase=&#34;webapps&#34; name=&#34;localhost&#34;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Host&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;Realm className=&#34;org.apache.catalina.realm.UserDatabaseRealm&#34;/&gt;<br/>&nbsp;&nbsp;&lt;/Engine&gt;<br/><br/>6.添加数据库驱动,更新mail.jar和actiovation.jar<br/>复制mysql-connector-java-3.0.16-ga-bin.jar,pg74.215.jdbc3.jar到 jakarta-tomcat-5.5.x\common\lib\<br/>还有javamail 1.3.2的mail.jar，jaf-1_0_2的 activation.jar<br/>msSQl 2000 JDBC sp3，msbase.jar,msutil,jar,mssqlserver.jar<br/><br/><br/>7.配置SSL<br/>参考 <a href="http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html" target="_blank" rel="external">http://jakarta.apache.org/tomcat/tomcat-5.5-doc/ssl-howto.html</a> <br/>D:\j2sdk1.4.2_06\bin&gt;%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA<br/>输入keystore密码： lizongbossl<br/>您的名字与姓氏是什么？<br/>[tomcat5.5.x]： tomcat5.5.x<br/>您的组织单位名称是什么？<br/>[jakarta]： jakarta<br/>您的组织名称是什么？<br/>[apache]： apache<br/>您所在的城市或区域名称是什么？<br/>[hzcity]： hzcity<br/>您所在的州或省份名称是什么？<br/>[gdp]： gdp<br/>该单位的两字母国家代码是什么<br/>[CN]： CN<br/>CN=tomcat5.5.x, OU=jakarta, O=apache, L=hzcity, ST=gdp, C=CN 正确吗？<br/>[否]： y<br/><br/>输入&lt;tomcat&gt;的主密码<br/>&nbsp;&nbsp;&nbsp;&nbsp;（如果和 keystore 密码相同，按回车）：<br/><br/>(必须密码一致，因此直接回车)<br/>然后再把userhome(例如：C:\Documents and Settings\lizongbo\)下的.keystore复制到<br/>tomcat的conf\目录下。<br/>(例如：D:\jakarta-tomcat-5.5.x\conf\.keystore <br/>配置jakarta-tomcat-5.5.x\conf\server.xml<br/>加上<br/>&nbsp;&nbsp;&lt;Connector port=&#34;8443&#34; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxThreads=&#34;150&#34; minSpareThreads=&#34;25&#34; maxSpareThreads=&#34;75&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enableLookups=&#34;false&#34; disableUploadTimeout=&#34;true&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acceptCount=&#34;100&#34; scheme=&#34;https&#34; secure=&#34;true&#34;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clientAuth=&#34;false&#34; sslProtocol=&#34;TLS&#34; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keystoreFile=&#34;conf/.keystore&#34; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;keystorePass=&#34;lizongbossl&#34;&gt; &lt;!--与先前设置的密码一致--&gt;<br/>&nbsp;&nbsp;&lt;/Connector&gt;<br/>8.禁止文件目录列表，<br/>修改jakarta-tomcat-5.5.x\conf\web.xml，把listing设置为false<br/><br/>&nbsp;&nbsp;&lt;servlet&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;default&lt;/servlet-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;org.apache.catalina.servlets.DefaultServlet&lt;/servlet-class&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br/>&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;&lt;param-value&gt;0&lt;/param-value&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br/>&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;&lt;param-value&gt;true&lt;/param-value&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br/>&nbsp;&nbsp;&lt;/servlet&gt;<br/><br/>9.指定了自己的javaEncoding<br/>(参考 <a href="http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html" target="_blank" rel="external">http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html</a> <br/><br/>&nbsp;&nbsp;&lt;servlet&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;org.apache.jasper.servlet.JspServlet&lt;/servlet-class&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br/>&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;&lt;param-value&gt;false&lt;/param-value&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br/>&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;&lt;param-value&gt;GB18030&lt;/param-value&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br/>&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;&lt;param-value&gt;true&lt;/param-value&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br/>&nbsp;&nbsp;&lt;/servlet&gt;<br/>10.添加rar,iso等的mime-type映射 <br/>避免在浏览器里直接打开。<br/>&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;<br/>&lt;mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;extension&gt;rar&lt;/extension&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br/>&nbsp;&nbsp;&lt;/mime-mapping&gt;<br/>&nbsp;&nbsp;&lt;mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;extension&gt;iso&lt;/extension&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br/>&nbsp;&nbsp;&lt;/mime-mapping&gt;<br/>&nbsp;&nbsp;&lt;mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;extension&gt;ape&lt;/extension&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br/>&nbsp;&nbsp;&lt;/mime-mapping&gt;<br/>&nbsp;&nbsp;&lt;mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;extension&gt;rmvb&lt;/extension&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br/>&nbsp;&nbsp;&lt;/mime-mapping&gt;<br/>&nbsp;&nbsp;&lt;mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;extension&gt;ico&lt;/extension&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-type&gt;image/x-icon&lt;/mime-type&gt;<br/>&nbsp;&nbsp;&lt;/mime-mapping&gt;<br/>10.1对html静态页面设置编码<br/>&lt;!-- 修改下面两行以支持静态超文本的自动编码 <br/>--&gt; <br/>&lt;mime-mapping&gt;<br/>&lt;extension&gt;htm&lt;/extension&gt; <br/>&lt;mime-type&gt;text/html;charset=gb2312&lt;/mime-type&gt; <br/>&lt;/mime-mapping&gt;<br/>&lt;mime-mapping&gt;<br/>&lt;extension&gt;html&lt;/extension&gt; <br/>&lt;mime-type&gt;text/html;charset=gb2312&lt;/mime-type&gt; <br/>&lt;/mime-mapping&gt;<br/>&lt;/web-app&gt;<br/><br/>11.添加welcome-file-list，并调整顺序。<br/>&lt;welcome-file-list&gt;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;default.html&lt;/welcome-file&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;default.htm&lt;/welcome-file&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;<br/>&nbsp;&nbsp;&lt;/welcome-file-list&gt;<br/><br/><br/><br/>发表于 @ 2005年12月01日 11:43 AM | 评论 (0)<br/><br/><br/><br/>Tomcat配置技巧Top 10<br/><br/><br/>Tomcat配置技巧Top 10 <br/>需要做的就是：按照你的需求配置Tomcat，只要你正确配置，Tomcat一般都能适合你的要求。下面是一系列关于Tomcat的配置技巧，这些技巧源自于我的书：《Tomcat权威指南》，希望对你有所帮助。 Jason Brittain <br/><br/>　　1． 配置系统管理（Admin Web Application） <br/><br/>　　大多数商业化的J2EE服务器都提供一个功能强大的管理界面，且大都采用易于理解的Web应用界面。Tomcat按照自己的方式，同样提供一个成熟的管理工具，并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现，当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数，user、group、role的多种数据库管理等。在后续的版本中，这些功能将得到很大的扩展，但现有的功能已经非常实用了。 <br/><br/>　　Admin Web Application被定义在自动部署文件：CATALINA_BASE/webapps/admin.xml 。 <br/>　　（译者注：CATALINA_BASE即tomcat安装目录下的server目录） <br/><br/>　　你必须编辑这个文件，以确定Context中的docBase参数是绝对路径。也就是说，CATALINA_BASE/webapps/admin.xml 的路径是绝对路径。作为另外一种选择，你也可以删除这个自动部署文件，而在server.xml文件中建立一个Admin Web Application的context，效果是一样的。你不能管理Admin Web Application这个应用，换而言之，除了删除CATALINA_BASE/webapps/admin.xml ，你可能什么都做不了。 <br/><br/>　　如果你使用UserDatabaseRealm（默认），你将需要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你编辑这个文件，添加一个名叫“admin”的role 到该文件中，如下： <br/><br/>＜role name=&#34;admin&#34;/＞ <br/><br/>　　你同样需要有一个用户，并且这个用户的角色是“admin”。象存在的用户那样，添加一个用户（改变密码使其更加安全）： <br/><br/>＜user name=&#34;admin&#34; password=&#34;deep_dark_secret&#34; roles=&#34;admin&#34;/＞ <br/><br/>　　当你完成这些步骤后，请重新启动Tomcat，访问<a href="http://localhost:8080/admin" target="_blank" rel="external">http://localhost:8080/admin</a>，你将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制，并采用了Jakarta Struts框架。一旦你作为“admin”角色的用户登录管理界面，你将能够使用这个管理界面配置Tomcat。 <br/><br/>　　2．配置应用管理（Manager Web Application） <br/><br/>　　Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面，执行一些简单的Web应用任务。 <br/><br/>　　Manager Web Application被被定义在一个自动部署文件中： <br/><br/>CATALINA_BASE/webapps/manager.xml 。 <br/><br/>　　你必须编辑这个文件，以确保context的docBase参数是绝对路径，也就是说CATALINA_HOME/server/webapps/manager的绝对路径。 <br/>　　（译者注：CATALINA_HOME即tomcat安装目录） <br/><br/>　　如果你使用的是UserDatabaseRealm，那么你需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来，编辑这个文件，添加一个名为“manager”的角色到该文件中： <br/><br/>＜role name=”manager”＞ <br/><br/>　　你同样需要有一个角色为“manager”的用户。像已经存在的用户那样，添加一个新用户（改变密码使其更加安全）： <br/><br/>＜user name=&#34;manager&#34; password=&#34;deep_dark_secret&#34; roles=&#34;manager&#34;/＞ <br/><br/>　　然后重新启动Tomcat，访问<a href="http://localhost/manager/list" target="_blank" rel="external">http://localhost/manager/list</a>，将看到一个很朴素的文本型管理界面，或者访问<a href="http://localhost/manager/html/list" target="_blank" rel="external">http://localhost/manager/html/list</a>，将看到一个HMTL的管理界面。不管是哪种方式都说明你的Manager Web Application现在已经启动了。 <br/><br/>　　Manager application让你可以在没有系统管理特权的基础上，安装新的Web应用，以用于测试。如果我们有一个新的web应用位于/home/user/hello下在，并且想把它安装到 /hello下，为了测试这个应用，我们可以这么做，在第一个文件框中输入“/hello”（作为访问时的path），在第二个文本框中输入“file:/home/user/hello”（作为Config URL）。 <br/><br/>　　Manager application还允许你停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问，当有用户尝试访问这个被停止的应用时，将看到一个503的错误??“503 - This application is not currently available”。 <br/><br/>　　移除一个web应用，只是指从Tomcat的运行拷贝中删除了该应用，如果你重新启动Tomcat，被删除的应用将再次出现（也就是说，移除并不是指从硬盘上删除）。 <br/>3．部署一个web应用 <br/><br/>　　有两个办法可以在系统中部署web服务。 <br/><br/>　　1＞ 拷贝你的WAR文件或者你的web应用文件夹（包括该web的所有内容）到$CATALINA_BASE/webapps目录下。 <br/><br/>　　2＞ 为你的web服务建立一个只包括context内容的XML片断文件，并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。 <br/><br/>　　如果你有一个WAR文件，你若想部署它，则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可，文件必须以“.war”作为扩展名。一旦Tomcat监听到这个文件，它将（缺省的）解开该文件包作为一个子目录，并以WAR文件的文件名作为子目录的名字。接下来，Tomcat将在内存中建立一个context，就好象你在server.xml文件里建立一样。当然，其他必需的内容，将从server.xml中的DefaultContext获得。 <br/><br/>　　部署web应用的另一种方式是写一个Context XML片断文件，然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件，而只是一个context元素，以及对该应用的相应描述。这种片断文件就像是从server.xml中切取出来的context元素一样，所以这种片断被命名为“context片断”。 <br/><br/>　　举个例子，如果我们想部署一个名叫MyWebApp.war的应用，该应用使用realm作为访问控制方式，我们可以使用下面这个片断： <br/><br/>＜!-- <br/>Context fragment for deploying MyWebApp.war <br/>--＞ <br/>＜Context path=&#34;/demo&#34; docBase=&#34;webapps/MyWebApp.war&#34; <br/>debug=&#34;0&#34; privileged=&#34;true&#34;＞ <br/>＜Realm className=&#34;org.apache.catalina.realm.UserDatabaseRealm&#34; <br/>resourceName=&#34;UserDatabase&#34;/＞ <br/>＜/Context＞ <br/><br/>　　把该片断命名为“MyWebApp.xml”，然后拷贝到CATALINA_BASE/webapps目录下。 <br/><br/>　　这种context片断提供了一种便利的方法来部署web应用，你不需要编辑server.xml，除非你想改变缺省的部署特性，安装一个新的web应用时不需要重启动Tomcat。 <br/><br/>　　4．配置虚拟主机（Virtual Hosts） <br/><br/>　　关于server.xml中“Host”这个元素，只有在你设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制，对每个域名而言，都好象独享了整个主机。实际上，大多数的小型商务网站都是采用虚拟主机实现的，这主要是因为虚拟主机能直接连接到Internet并提供相应的带宽，以保障合理的访问响应速度，另外虚拟主机还能提供一个稳定的固定IP。 <br/><br/>　　基于名字的虚拟主机可以被建立在任何web服务器上，建立的方法就是通过在域名服务器（DNS）上建立IP地址的别名，并且告诉web服务器把去往不同域名的请求分发到相应的网页目录。因为这篇文章主要是讲Tomcat，我们不准备介绍在各种操作系统上设置DNS的方法，如果你在这方面需要帮助，请参考《DNS and Bind》一书，作者是Paul Albitz and Cricket Liu (O***Reilly)。为了示范方便，我将使用一个静态的主机文件，因为这是测试别名最简单的方法。 <br/><br/>　　在Tomcat中使用虚拟主机，你需要设置DNS或主机数据。为了测试，为本地IP设置一个IP别名就足够了，接下来，你需要在server.xml中添加几行内容，如下： <br/><br/>＜Server port=&#34;8005&#34; shutdown=&#34;SHUTDOWN&#34; debug=&#34;0&#34;＞ <br/>＜Service name=&#34;Tomcat-Standalone&#34;＞ <br/>＜Connector className=&#34;org.apache.coyote.tomcat4.CoyoteConnector&#34; <br/>port=&#34;8080&#34; minProcessors=&#34;5&#34; maxProcessors=&#34;75&#34; <br/>enableLookups=&#34;true&#34; redirectPort=&#34;8443&#34;/＞ <br/>＜Connector className=&#34;org.apache.coyote.tomcat4.CoyoteConnector&#34; <br/>port=&#34;8443&#34; minProcessors=&#34;5&#34; maxProcessors=&#34;75&#34; <br/>acceptCount=&#34;10&#34; debug=&#34;0&#34; scheme=&#34;https&#34; secure=&#34;true&#34;/＞ <br/>＜Factory className=&#34;org.apache.coyote.tomcat4.CoyoteServerSocketFactory&#34; <br/>clientAuth=&#34;false&#34; protocol=&#34;TLS&#34; /＞ <br/>＜/Connector＞ <br/>＜Engine name=&#34;Standalone&#34; defaultHost=&#34;localhost&#34; debug=&#34;0&#34;＞ <br/>＜!-- This Host is the default Host --＞ <br/>＜Host name=&#34;localhost&#34; debug=&#34;0&#34; appBase=&#34;webapps&#34; <br/>unpackWARs=&#34;true&#34; autoDeploy=&#34;true&#34;＞ <br/>＜Context path=&#34;&#34; docBase=&#34;ROOT&#34; debug=&#34;0&#34;/＞ <br/>＜Context path=&#34;/orders&#34; docBase=&#34;/home/ian/orders&#34; debug=&#34;0&#34; <br/>reloadable=&#34;true&#34; crossContext=&#34;true&#34;＞ <br/>＜/Context＞ <br/>＜/Host＞ <br/><br/>＜!-- This Host is the first &#34;Virtual Host&#34;: <a href="http://www.example.com/" target="_blank" rel="external">http://www.example.com/</a> --＞ <br/>＜Host name=&#34;www.example.com&#34; appBase=&#34;/home/example/webapp&#34;＞ <br/>＜Context path=&#34;&#34; docBase=&#34;.&#34;/＞ <br/>＜/Host＞ <br/><br/>＜/Engine＞ <br/>＜/Service＞ <br/>＜/Server＞ <br/><br/>　　Tomcat的server.xml文件，在初始状态下，只包括一个虚拟主机，但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的server.xml版本，其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素，所包含的context元素中必须有一个是默认的context，这个默认的context的显示路径应该为空（例如，path=””）。<br/>　5．配置基础验证（Basic Authentication） <br/><br/>　　容器管理验证方法控制着当用户访问受保护的web应用资源时，如何进行用户的身份鉴别。当一个web应用使用了Basic Authentication（BASIC参数在web.xml文件中auto-method元素中设置），而有用户访问受保护的web应用时，Tomcat将通过HTTP Basic Authentication方式，弹出一个对话框，要求用户输入用户名和密码。在这种验证方法中，所有密码将被以64位的编码方式在网络上传输。 <br/><br/>　　注意：使用Basic Authentication通过被认为是不安全的，因为它没有强健的加密方法，除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式（比如，在一个虚拟私人网络中）。若没有额外的加密方法，网络管理员将能够截获（或滥用）用户的密码。但是，如果你是刚开始使用Tomcat，或者你想在你的web应用中测试一下基于容器的安全管理，Basic Authentication还是非常易于设置和使用的。只需要添加＜security-constraint＞和＜login-config＞两个元素到你的web应用的web.xml文件中，并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加适当的＜role＞和＜user＞即可，然后重新启动Tomcat。 <br/><br/>　　下面例子中的web.xml摘自一个俱乐部会员网站系统，该系统中只有member目录被保护起来，并使用Basic Authentication进行身份验证。请注意，这种方式将有效的代替Apache web服务器中的.htaccess文件。 <br/><br/>＜!-- <br/>Define the Members-only area, by defining <br/>a &#34;Security Constraint&#34; on this Application, and <br/>mapping it to the subdirectory (URL) that we want <br/>to restrict. <br/>--＞ <br/>＜security-constraint＞ <br/>＜web-resource-collection＞ <br/>＜web-resource-name＞ <br/>Entire Application <br/>＜/web-resource-name＞ <br/>＜url-pattern＞/members/*＜/url-pattern＞ <br/>＜/web-resource-collection＞ <br/>＜auth-constraint＞ <br/>＜role-name＞member＜/role-name＞ <br/>＜/auth-constraint＞ <br/>＜/security-constraint＞ <br/>＜!-- Define the Login Configuration for this Application --＞ <br/>＜login-config＞ <br/>＜auth-method＞BASIC＜/auth-method＞ <br/>＜realm-name＞My Club Members-only Area＜/realm-name＞ <br/>＜/login-config＞ <br/><br/>　　6．配置单点登录（Single Sign-On） <br/><br/>　　一旦你设置了realm和验证的方法，你就需要进行实际的用户登录处理。一般说来，对用户而言登录系统是一件很麻烦的事情，你必须尽量减少用户登录验证的次数。作为缺省的情况，当用户第一次请求受保护的资源时，每一个web应用都会要求用户登录。如果你运行了多个web应用，并且每个应用都需要进行单独的用户验证，那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统，所有他们也就不知道他们需要访问多少个不同的应用，只是很迷惑，为什么总要不停的登录。 <br/><br/>　　Tomcat 4的“single sign-on”特性允许用户在访问同一虚拟主机下所有web应用时，只需登录一次。为了使用这个功能，你只需要在Host上添加一个SingleSignOn Valve元素即可，如下所示： <br/><br/>＜Valve className=&#34;org.apache.catalina.authenticator.SingleSignOn&#34; <br/>debug=&#34;0&#34;/＞ <br/><br/>　　在Tomcat初始安装后，server.xml的注释里面包括SingleSignOn Valve配置的例子，你只需要去掉注释，即可使用。那么，任何用户只要登录过一个应用，则对于同一虚拟主机下的所有应用同样有效。 <br/><br/>　　使用single sign-on valve有一些重要的限制： <br/><br/>　　1＞ value必须被配置和嵌套在相同的Host元素里，并且所有需要进行单点验证的web应用（必须通过context元素定义）都位于该Host下。 <br/><br/>　　2＞ 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。 <br/><br/>　　3＞ 不能被context中的realm覆盖。 <br/><br/>　　4＞ 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式（被定义在web.xml中的＜auth-method＞中），这比自定义的验证方式强，Tomcat内置的的验证方式包括basic、digest、form和client-cert。 <br/><br/>　　5＞ 如果你使用单点登录，还希望集成一个第三方的web应用到你的网站中来，并且这个新的web应用使用它自己的验证方式，而不使用容器管理安全，那你基本上就没招了。你的用户每次登录原来所有应用时需要登录一次，并且在请求新的第三方应用时还得再登录一次。当然，如果你拥有这个第三方web应用的源码，而你又是一个程序员，你可以修改它，但那恐怕也不容易做。 <br/><br/>　　6＞ 单点登录需要使用cookies。 <br/><br/>　7．配置用户定制目录（Customized User Directores） <br/><br/>　　一些站点允许个别用户在服务器上发布网页。例如，一所大学的学院可能想给每一位学生一个公共区域，或者是一个ISP希望给一些web空间给他的客户，但这又不是虚拟主机。在这种情况下，一个典型的方法就是在用户名前面加一个特殊字符（~），作为每位用户的网站，比如： <br/><br/><a href="http://www.cs.myuniversity.edu/~username" target="_blank" rel="external">http://www.cs.myuniversity.edu/~username</a> <br/><a href="http://members.mybigisp.com/~username" target="_blank" rel="external">http://members.mybigisp.com/~username</a> <br/><br/>　　Tomcat提供两种方法在主机上映射这些个人网站，主要使用一对特殊的Listener元素。Listener的className属性应该是org.apache.catalina.startup.UserConfig，userClass属性应该是几个映射类之一。如果你的系统是Unix，它将有一个标准的/etc/passwd文件，该文件中的帐号能够被运行中的Tomcat很容易的读取，该文件指定了用户的主目录，使用PasswdUserDatabase 映射类。 <br/><br/>＜Listener className=&#34;org.apache.catalina.startup.UserConfig&#34; <br/>directoryName=&#34;public_html&#34; <br/>userClass=&#34;org.apache.catalina.startup.PasswdUserDatabase&#34;/＞ <br/><br/>　　web文件需要放置在像/home/users/ian/public_html 或者 /users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。 <br/><br/>　　实际上，这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件，但你又想把一个用户名映射到公共的像/home一样目录的子目录里面，则可以使用HomesUserDatabase类。 <br/><br/>＜Listener className=&#34;org.apache.catalina.startup.UserConfig&#34; <br/>directoryName=&#34;public_html&#34; homeBase=&#34;/home&#34; <br/>userClass=&#34;org.apache.catalina.startup.HomesUserDatabase&#34;/＞ <br/><br/>　　这样一来，web文件就可以位于像/home/ian/public_html 或者 /home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利，你可以使用一个像c:\home这样的目录。 <br/><br/>　　这些Listener元素，如果出现，则必须在Host元素里面，而不能在context元素里面，因为它们都用应用于Host本身。 <br/><br/>　　8．在Tomcat中使用CGI脚本 <br/><br/>　　Tomcat主要是作为Servlet/JSP容器，但它也有许多传统web服务器的性能。支持通用网关接口（Common Gateway Interface，即CGI）就是其中之一，CGI提供一组方法在响应浏览器请求时运行一些扩展程序。CGI之所以被称为通用，是因为它能在大多数程序或脚本中被调用，包括：Perl，Python，awk，Unix shell scripting等，甚至包括Java。当然，你大概不会把一个Java应用程序当作CGI来运行，毕竟这样太过原始。一般而言，开发Servlet总要比CGI具有更好的效率，因为当用户点击一个链接或一个按钮时，你不需要从操作系统层开始进行处理。 <br/><br/>　　Tomcat包括一个可选的CGI Servlet，允许你运行遗留下来的CGI脚本。 <br/><br/>　　为了使Tomcat能够运行CGI，你必须做如下几件事： <br/><br/>　　1. 把servlets-cgi.renametojar （在CATALINA_HOME/server/lib/目录下）改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。 <br/><br/>　　2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中，把关于＜servlet-name＞ CGI的那段的注释去掉（默认情况下，该段位于第241行）。 <br/><br/>　　3. 同样，在Tomcat的CATALINA_BASE/conf/web.xml文件中，把关于对CGI进行映射的那段的注释去掉（默认情况下，该段位于第299行）。注意，这段内容指定了HTML链接到CGI脚本的访问方式。 <br/><br/>　　4. 你可以把CGI脚本放置在WEB-INF/cgi 目录下（注意，WEB-INF是一个安全的地方，你可以把一些不想被用户看见或基于安全考虑不想暴露的文件放在此处），或者你也可以把CGI脚本放置在context下的其他目录下，并为CGI Servlet调整cgiPathPrefix初始化参数。这就指定的CGI Servlet的实际位置，且不能与上一步指定的URL重名。 <br/><br/>　　5. 重新启动Tomcat，你的CGI就可以运行了。 <br/><br/>　　在Tomcat中，CGI程序缺省放置在WEB-INF/cgi目录下，正如前面所提示的那样，WEB-INF目录受保护的，通过客户端的浏览器无法窥探到其中内容，所以对于放置含有密码或其他敏感信息的CGI脚本而言，这是一个非常好的地方。为了兼容其他服务器，尽管你也可以把CGI脚本保存在传统的/cgi-bin目录，但要知道，在这些目录中的文件有可能被网上好奇的冲浪者看到。另外，在Unix中，请确定运行Tomcat的用户有执行CGI脚本的权限。 <br/><br/>　9．改变Tomcat中的JSP编译器（JSP Compiler） <br/><br/>　　在Tomcat 4.1（或更高版本，大概），JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪，但这正是Ant有意为之的一部分，有一个API文档指导开发者在没有启动一个新的JVM的情况下，使用Ant。这是使用Ant进行Java开发的一大优势。另外，这也意味着你现在能够在Ant中使用任何javac支持的编译方式，这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的，因为你只需要在＜init-param＞ 元素中定义一个名字叫“compiler”，并且在value中有一个支持编译的编译器名字，示例如下： <br/><br/>＜servlet＞ <br/>＜servlet-name＞jsp＜/servlet-name＞ <br/>＜servlet-class＞ <br/>o&#114;g.apache.jasper.servlet.JspServlet <br/>＜/servlet-class＞ <br/>＜init-param＞ <br/>＜param-name＞logVerbosityLevel＜/param-name＞ <br/>＜param-value＞WARNING＜/param-value＞ <br/>＜/init-param＞ <br/>＜init-param＞ <br/>＜param-name＞compiler＜/param-name＞ <br/>＜param-value＞jikes＜/param-value＞ <br/>＜/init-param＞ <br/>＜load-on-startup＞3＜/load-on-startup＞ <br/>＜/servlet＞ <br/><br/>　　当然，给出的编译器必须已经安装在你的系统中，并且CLASSPATH可能需要设置，那处决于你选择的是何种编译器。 <br/><br/>　　10．限制特定主机访问（Restricting Access to Specific Hosts） <br/><br/>　　有时，你可能想限制对Tomcat web应用的访问，比如，你希望只有你指定的主机或IP地址可以访问你的应用。这样一来，就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效果，Tomcat提供了两个参数供你配置：RemoteHostValve 和RemoteAddrValve。 <br/><br/>　　通过配置这两个参数，可以让你过滤来自请求的主机或IP地址，并允许或拒绝哪些主机/IP。与之类似的，在Apache的httpd文件里有对每个目录的允许/拒绝指定。 <br/><br/>　　例如你可以把Admin Web application设置成只允许本地访问，设置如下： <br/><br/>＜Context path=&#34;/path/to/secret_files&#34; ...＞ <br/>＜Valve className=&#34;org.apache.catalina.valves.RemoteAddrValve&#34; <br/>allow=&#34;127.0.0.1&#34; deny=&#34;&#34;/＞ <br/>＜/Context＞ <br/><br/>　　如果没有给出允许主机的指定，那么与拒绝主机匹配的主机就会被拒绝，除此之外的都是允许的。与之类似，如果没有给出拒绝主机的指定，那么与允许主机匹配的主机就会被允许，除此之外的都是拒绝的。]]></description>
		</item>
		
			<item>
			<link>http://www.itweb2.com/article/java/315.htm</link>
			<title><![CDATA[Java日期选择控件]]></title>
			<author>lc1209@163.com(journey)</author>
			<category><![CDATA[程序乐园]]></category>
			<pubDate>Sat,27 Jan 2007 22:49:39 +0800</pubDate>
			<guid>http://www.itweb2.com/default.asp?id=315</guid>
		<description><![CDATA[正在用JAVA做个小系统，需要个日期时间选择控件，但又不想自己伤脑去写，还是GOOGLE吧，发现这个贴子，其将日期时间选择封装在一个按钮组件内，应该很好用，支持Application 、Applet的。<br/><br/>代码：<br/><br/>import java.util.Date;<br/>import java.util.Calendar;<br/>import java.text.DateFormat;<br/>import java.text.SimpleDateFormat;<br/>import java.text.ParseException ;<br/>import java.awt.Color ;<br/>import java.awt.Font;<br/>import java.awt.Point ;<br/>import java.awt.Dimension ;<br/>import java.awt.BorderLayout ;<br/>import java.awt.FlowLayout ;<br/>import java.awt.GridLayout ;<br/>import java.awt.Component ;<br/>import java.awt.Cursor ;<br/>import java.awt.Frame ;<br/><br/>import java.awt.event.ActionEvent;<br/>import java.awt.event.ActionListener;<br/>import java.awt.event.MouseListener;<br/>import java.awt.event.MouseAdapter;<br/>import java.awt.event.MouseEvent;<br/>//import javax.swing.JFrame;<br/>import javax.swing.JButton;<br/>import javax.swing.JDialog;<br/>import javax.swing.JPanel;<br/>import javax.swing.JLabel;<br/>import javax.swing.JSpinner ;<br/>import javax.swing.JSpinner.NumberEditor ;<br/>import javax.swing.SpinnerNumberModel;<br/>import javax.swing.SwingUtilities;<br/>import javax.swing.SwingConstants ;<br/>import javax.swing.event.ChangeListener ;<br/>import javax.swing.event.ChangeEvent ;<br/>import javax.swing.border.LineBorder ;<br/><br/><br/><br/>public class DateChooserJButton extends JButton {<br/><br/><br/>private DateChooser dateChooser =null;<br/><br/>private String preLabel =&#34;&#34; ;<br/><br/><br/>public DateChooserJButton() {<br/>this(getNowDate()) ;<br/>}<br/><br/><br/>public DateChooserJButton(SimpleDateFormat df , String dateString) {<br/>this() ;<br/>setText(df,dateString) ;<br/>}<br/><br/><br/>public DateChooserJButton(Date date) {<br/>this(&#34;&#34;,date);<br/>}<br/><br/>public DateChooserJButton(String preLabel , Date date) {<br/>if (preLabel!=null) this.preLabel = preLabel ;<br/>setDate(date) ;<br/>setBorder(null) ;<br/>setCursor(new Cursor(Cursor.HAND_CURSOR)) ;<br/>super.addActionListener( new ActionListener() {<br/>public void actionPerformed(ActionEvent e) {<br/>if (dateChooser==null) dateChooser = new DateChooser();<br/>Point p = getLocationOnScreen() ;<br/>p.y = p.y+30 ;<br/>dateChooser.showDateChooser(p) ;<br/>} <br/>}) ;<br/>} <br/><br/><br/>private static Date getNowDate() {<br/>return Calendar.getInstance().getTime() ;<br/>} <br/><br/>private static SimpleDateFormat getDefaultDateFormat() {<br/>return new SimpleDateFormat(&#34;yyyy年MM月dd日HH时&#34;) ;<br/>} <br/><br/>//覆盖父类的方法<br/>public void setText(String s) {<br/>Date date ;<br/>try {<br/>date = getDefaultDateFormat().parse(s) ; <br/>}catch (ParseException e) {<br/>date = getNowDate() ;<br/>}<br/>setDate(date) ;<br/>}<br/><br/><br/>public void setText(SimpleDateFormat df , String s) {<br/>Date date ;<br/>try {<br/>date = df.parse(s) ;<br/>}catch (ParseException e) {<br/>date = getNowDate() ;<br/>}<br/>setDate(date) ;<br/>}<br/><br/><br/><br/>public void setDate(Date date) {<br/>super.setText(preLabel+getDefaultDateFormat().format(date));<br/>}<br/><br/>public Date getDate() {<br/>String dateString = getText().substring(preLabel.length());<br/>try {<br/>return getDefaultDateFormat().parse(dateString); <br/>} catch (ParseException e) {<br/>return getNowDate() ;<br/>}<br/><br/>}<br/><br/><br/><br/>//覆盖父类的方法使之无效<br/>public void addActionListener(ActionListener listener ) {<br/>}<br/><br/><br/><br/><br/>private class DateChooser extends JPanel implements ActionListener ,ChangeListener {<br/>int startYear = 1980; //默认【最小】显示年份<br/>int lastYear = 2050; //默认【最大】显示年份<br/>int width = 200; //界面宽度<br/>int height = 200; //界面高度<br/><br/>Color backGroundColor = Color.gray; //底色<br/>//月历表格配色----------------//<br/>Color palletTableColor = Color.white; //日历表底色<br/>Color todayBackColor = Color.orange; //今天背景色<br/>Color weekFontColor = Color.blue; //星期文字色<br/>Color dateFontColor = Color.black; //日期文字色<br/>Color weekendFontColor = Color.red; //周末文字色<br/><br/>//控制条配色------------------//<br/>Color controlLineColor = Color.pink; //控制条底色<br/>Color controlTextColor = Color.white; //控制条标签文字色<br/><br/><br/>Color rbFontColor = Color.white; //RoundBox文字色<br/>Color rbBorderColor = Color.red; //RoundBox边框色<br/>Color rbButtonColor = Color.pink; //RoundBox按钮色<br/>Color rbBtFontColor = Color.red; //RoundBox按钮文字色<br/><br/>JDialog dialog ;<br/>JSpinner yearSpin ;<br/>JSpinner monthSpin ;<br/>JSpinner hourSpin ;<br/>JButton[][] daysButton = new JButton[6][7] ;<br/><br/><br/>DateChooser() {<br/><br/>setLayout(new BorderLayout());<br/>setBorder(new LineBorder(backGroundColor, 2));<br/>setBackground(backGroundColor);<br/><br/>JPanel topYearAndMonth = cr&#101;ateYearAndMonthPanal();<br/>add(topYearAndMonth,BorderLayout.NORTH);<br/>JPanel centerWeekAndDay = cr&#101;ateWeekAndDayPanal();<br/>add(centerWeekAndDay,BorderLayout.CENTER);<br/><br/>}<br/><br/><br/>private JPanel cr&#101;ateYearAndMonthPanal(){<br/>Calendar c = getCalendar() ;<br/>int currentYear =c.get(Calendar.YEAR);<br/>int currentMonth =c.get(Calendar.MONTH)+1;<br/>int currentHour =c.get(Calendar.HOUR_OF_DAY);<br/><br/>JPanel result = new JPanel();<br/>result.setLayout(new FlowLayout());<br/>result.setBackground(controlLineColor);<br/><br/>yearSpin = new JSpinner(new SpinnerNumberModel(currentYear,startYear,lastYear,1));<br/>yearSpin.setPreferredSize(new Dimension(48,20)) ;<br/>yearSpin.setName(&#34;Year&#34;) ;<br/>yearSpin.setEditor(new JSpinner.NumberEditor(yearSpin, &#34;####&#34;)) ; <br/>yearSpin.addChangeListener(this) ; <br/>result.add(yearSpin) ;<br/><br/>JLabel yearLabel = new JLabel(&#34;年&#34;);<br/>yearLabel.setForeground(controlTextColor);<br/>result.add(yearLabel);<br/><br/>monthSpin = new JSpinner(new SpinnerNumberModel(currentMonth,1,12,1));<br/>monthSpin.setPreferredSize(new Dimension(35,20)) ;<br/>monthSpin.setName(&#34;Month&#34;) ;<br/>monthSpin.addChangeListener(this) ; <br/>result.add(monthSpin) ;<br/><br/>JLabel monthLabel = new JLabel(&#34;月&#34;);<br/>monthLabel.setForeground(controlTextColor);<br/>result.add(monthLabel);<br/><br/>hourSpin = new JSpinner(new SpinnerNumberModel(currentHour,0,23,1));<br/>hourSpin.setPreferredSize(new Dimension(35,20)) ;<br/>hourSpin.setName(&#34;Hour&#34;) ;<br/>hourSpin.addChangeListener(this) ; <br/>result.add(hourSpin) ;<br/><br/>JLabel hourLabel = new JLabel(&#34;时&#34;);<br/>hourLabel.setForeground(controlTextColor);<br/>result.add(hourLabel);<br/><br/>return result ;<br/>}<br/><br/><br/><br/>private JPanel cr&#101;ateWeekAndDayPanal() {<br/>String colname[] = {&#34;日&#34;,&#34;一&#34;,&#34;二&#34;,&#34;三&#34;,&#34;四&#34;,&#34;五&#34;,&#34;六&#34;};<br/>JPanel result = new JPanel();<br/>//设置固定字体，以免调用环境改变影响界面美观<br/>result.setFont(new Font(&#34;宋体&#34;, Font.PLAIN, 12));<br/>result.setLayout(new GridLayout(7,7));<br/>result.setBackground(Color.white);<br/>JLabel cell ;<br/><br/>for(int i=0;i&lt;7;i++) {<br/>cell = new JLabel(colname[i]);<br/>cell.setHorizontalAlignment(JLabel.RIGHT);<br/>if (i==0 || i==6) cell.setForeground(weekendFontColor) ;<br/>else cell.setForeground(weekFontColor) ;<br/>result.add(cell) ;<br/>} <br/><br/>int actionCommandId = 0 ;<br/>for(int i = 0; i &lt; 6; i++) <br/>for(int j = 0; j &lt; 7; j++) {<br/>JButton numberButton = new JButton();<br/>numberButton.setBorder(null) ; <br/>numberButton.setHorizontalAlignment(SwingConstants.RIGHT);<br/>numberButton.setActionCommand(String.valueOf(actionCommandId)) ; <br/>numberButton.addActionListener(this) ;<br/>numberButton.setBackground(palletTableColor);<br/>numberButton.setForeground(dateFontColor) ;<br/>if (j==0 || j==6) numberButton.setForeground(weekendFontColor) ;<br/>else numberButton.setForeground(dateFontColor) ;<br/>daysButton[i][j] = numberButton;<br/>result.add(numberButton) ;<br/>actionCommandId ++ ;<br/>} <br/><br/>return result; <br/>}<br/><br/><br/><br/><br/><br/>private JDialog cr&#101;ateDialog(Frame owner ) {<br/>JDialog result = new JDialog(owner,&#34;日期时间选择&#34;,true) ;<br/>result.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);<br/>result.getContentPane().add(this,BorderLayout.CENTER) ;<br/>result.pack() ;<br/>result.setSize(width, height);<br/>return result ;<br/>}<br/><br/>void showDateChooser(Point position ) {<br/>Frame owner =(Frame)SwingUtilities.getWindowAncestor(DateChooserJButton.this) ;<br/>if (dialog==null || dialog.getOwner()!= owner) dialog = cr&#101;ateDialog(owner ) ;<br/>dialog.setLocation(getAppropriateLocation(owner ,position ) ) ;<br/>flushWeekAndDay() ;<br/>dialog.show(); <br/>}<br/><br/><br/>Point getAppropriateLocation(Frame owner ,Point position ) {<br/>Point result = new Point(position) ;<br/>Point p = owner.getLocation() ;<br/>int offsetX = (position.x+width) - (p.x + owner.getWidth() ) ;<br/>int offsetY = (position.y+height) - (p.y + owner.getHeight() ) ;<br/><br/>if (offsetX &gt;0 ) {<br/>result.x -= offsetX ; <br/>}<br/><br/>if (offsetY &gt;0 ) {<br/>result.y -= offsetY ; <br/>}<br/><br/>return result ;<br/><br/>}<br/><br/><br/>private Calendar getCalendar() {<br/>Calendar result = Calendar.getInstance();<br/>result.setTime(getDate()) ;<br/>return result ;<br/>} <br/><br/><br/>private int getSel&#101;ctedYear() {<br/>return ((Integer)yearSpin.getValue()).intValue() ;<br/>} <br/><br/><br/>private int getSel&#101;ctedMonth() {<br/>return ((Integer)monthSpin.getValue()).intValue() ;<br/>} <br/><br/>private int getSel&#101;ctedHour() {<br/>return ((Integer)hourSpin.getValue()).intValue() ;<br/>} <br/><br/><br/>private void dayColorUp&#100;ate(boolean isOldDay) {<br/>Calendar c = getCalendar() ;<br/>int day = c.get(Calendar.DAY_OF_MONTH);<br/>c.set(Calendar.DAY_OF_MONTH,1);<br/>int actionCommandId =day-2+c.get(Calendar.DAY_OF_WEEK) ;<br/>int i = actionCommandId/7;<br/>int j = actionCommandId%7;<br/>if (isOldDay) daysButton[i][j].setForeground(dateFontColor) ;<br/>else daysButton[i][j].setForeground(todayBackColor) ;<br/>}<br/><br/><br/>private void flushWeekAndDay() {<br/>Calendar c = getCalendar() ;<br/>c.set(Calendar.DAY_OF_MONTH,1);<br/>int maxDayNo = c.getActualMaximum(Calendar.DAY_OF_MONTH);<br/>int dayNo = 2 - c.get(Calendar.DAY_OF_WEEK) ;<br/>for(int i = 0; i &lt; 6; i++) {<br/>for(int j = 0; j &lt; 7; j++) {<br/>String s=&#34;&#34; ;<br/>if (dayNo&gt;=1 &amp;&amp; dayNo&lt;=maxDayNo ) s = String.valueOf(dayNo) ;<br/>daysButton[i][j].setText(s) ;<br/>dayNo ++ ;<br/>}<br/>} <br/>dayColorUp&#100;ate(false) ;<br/>}<br/><br/><br/><br/><br/>public void stateChanged(ChangeEvent e) {<br/>JSpinner source =(JSpinner)e.getSource() ;<br/>Calendar c = getCalendar() ;<br/>if (source.getName().equals(&#34;Hour&#34;)) {<br/>c.set(Calendar.HOUR_OF_DAY, getSel&#101;ctedHour());<br/>setDate(c.getTime());<br/>return ;<br/>}<br/><br/>dayColorUp&#100;ate(true) ;<br/><br/>if (source.getName().equals(&#34;Year&#34;)) <br/>c.set(Calendar.YEAR, getSel&#101;ctedYear());<br/>else <br/>// (source.getName().equals(&#34;Month&#34;)) <br/>c.set(Calendar.MONTH, getSel&#101;ctedMonth()-1);<br/>setDate(c.getTime());<br/>flushWeekAndDay() ;<br/>}<br/><br/><br/>public void actionPerformed(ActionEvent e) {<br/>JButton source =(JButton)e.getSource() ;<br/>if (source.getText().length()==0) return ;<br/>dayColorUp&#100;ate(true) ;<br/>source.setForeground(todayBackColor) ;<br/>int newDay = Integer.parseInt(source.getText());<br/>Calendar c = getCalendar() ;<br/>c.set(Calendar.DAY_OF_MONTH,newDay);<br/>setDate(c.getTime());<br/>}<br/>}<br/>}<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.itweb2.com/article/java/290.htm</link>
			<title><![CDATA[Java语言深入 final在java中的应用]]></title>
			<author>lc1209@163.com(journey)</author>
			<category><![CDATA[程序乐园]]></category>
			<pubDate>Sat,09 Dec 2006 19:24:57 +0800</pubDate>
			<guid>http://www.itweb2.com/default.asp?id=290</guid>
		<description><![CDATA[　　final在Java中并不常用，然而它却为我们提供了诸如在C语言中定义常量的功能，不仅如此，final还可以让你控制你的成员、方法或者是一个类是否可被覆写或继承等功能，这些特点使final在Java中拥有了一个不可或缺的地位，也是学习Java时必须要知道和掌握的关键字之一。<br/>final成员<br/>　　当你在类中定义变量时，在其前面加上final关键字，那便是说，这个变量一旦被初始化便不可改变，这里不可改变的意思对基本类型来说是其值不可变，而对于对象变量来说其引用不可再变。其初始化可以在两个地方，一是其定义处，也就是说在final变量定义时直接给其赋值，二是在构造函数中。这两个地方只能选其一，要么在定义时给值，要么在构造函数中给值，不能同时既在定义时给了值，又在构造函数中给另外的值。下面这段代码演示了这一点：<br/>import java.util.List;<br/>import java.util.ArrayList;<br/>import java.util.LinkedList;<br/>public class Bat{<br/>&nbsp;&nbsp;&nbsp;&nbsp;final PI=3.14;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在定义时便给址值<br/>&nbsp;&nbsp;&nbsp;&nbsp;final int i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//因为要在构造函数中进行初始化，所以此处便不可再给值<br/>&nbsp;&nbsp;&nbsp;&nbsp;final List list;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//此变量也与上面的一样<br/>&nbsp;&nbsp;&nbsp;&nbsp;Bat(){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=100;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list=new LinkedList();<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;Bat(int ii,List l){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=ii;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list=l;<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bat b=new Bat();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.list.add(new Bat());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//b.i=25;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//b.list=new ArrayList();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&#34;I=&#34;+b.i+&#34; List Type:&#34;+b.list.getClass());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b=new Bat(23,new ArrayList());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b.list.add(new Bat());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&#34;I=&#34;+b.i+&#34; List Type:&#34;+b.list.getClass());<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/>　　此程序很简单的演示了final的常规用法。在这里使用在构造函数中进行初始化的方法，这使你有了一点灵活性。如Bat的两个重载构造函数所示，第一个缺省构造函数会为你提供默认的值，重载的那个构造函数会根据你所提供的值或类型为final变量初始化。然而有时你并不需要这种灵活性，你只需要在定义时便给定其值并永不变化，这时就不要再用这种方法。在main方法中有两行语句注释掉了，如果你去掉注释，程序便无法通过编译，这便是说，不论是i的值或是 list的类型，一旦初始化，确实无法再更改。然而b可以通过重新初始化来指定i的值或list的类型，输出结果中显示了这一点：<br/>I=100 List Type:class java.util.LinkedList<br/>I=23 List Type:class java.util.ArrayList<br/>　　还有一种用法是定义方法中的参数为final，对于基本类型的变量，这样做并没有什么实际意义，因为基本类型的变量在调用方法时是传值的，也就是说你可以在方法中更改这个参数变量而不会影响到调用语句，然而对于对象变量，却显得很实用，因为对象变量在传递时是传递其引用，这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量，当你在方法中不需要改变作为参数的对象变量时，明确使用final进行声明，会防止你无意的修改而影响到调用方法。<br/>另外方法中的内部类在用到方法中的参变量时，此参变也必须声明为final才可使用，如下代码所示：<br/>public class INClass{<br/>&nbsp;&nbsp; void innerClass(final String str){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class IClass{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IClass(){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IClass ic=new IClass();<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;public static void main(String[] args){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INClass inc=new INClass();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inc.innerClass(&#34;Hello&#34;);<br/>&nbsp;&nbsp;}<br/>}<br/>final方法<br/>　　将方法声明为final，那就说明你已经知道这个方法提供的功能已经满足你要求，不需要进行扩展，并且也不允许任何从此类继承的类来覆写这个方法，但是继承仍然可以继承这个方法，也就是说可以直接使用。另外有一种被称为inline的机制，它会使你在调用final方法时，直接将方法主体插入到调用处，而不是进行例行的方法调用，例如保存断点，压栈等，这样可能会使你的程序效率有所提高，然而当你的方法主体非常庞大时，或你在多处调用此方法，那么你的调用主体代码便会迅速膨胀，可能反而会影响效率，所以你要慎用final进行方法定义。<br/>final类<br/>　　当你将final用于类身上时，你就需要仔细考虑，因为一个final类是无法被任何人继承的，那也就意味着此类在一个继承树中是一个叶子类，并且此类的设计已被认为很完美而不需要进行修改或扩展。对于final类中的成员，你可以定义其为final，也可以不是final。而对于方法，由于所属类为final的关系，自然也就成了 final型的。你也可以明确的给final类中的方法加上一个final，但这显然没有意义。<br/>　　下面的程序演示了final方法和final类的用法：<br/>final class final{<br/>&nbsp;&nbsp;&nbsp;&nbsp;final String str=&#34;final Data&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public String str1=&#34;non final data&#34;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;final public void print(){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&#34;final method.&#34;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void what(){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str+&#34;\n&#34;+str1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/>public class FinalDemo {&nbsp;&nbsp; //extends final 无法继承 <br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String[] args){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final f=new final();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.what();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.print();<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>}<br/>　　从程序中可以看出，final类与普通类的使用几乎没有差别，只是它失去了被继承的特性。final方法与非final方法的区别也很难从程序行看出，只是记住慎用。<br/>final在设计模式中的应用<br/>　　在设计模式中有一种模式叫做不变模式，在Java中通过final关键字可以很容易的实现这个模式，在讲解final成员时用到的程序Bat.java就是一个不变模式的例子。如果你对此感兴趣，可以参考阎宏博士编写的《Java与模式》一书中的讲解。<br/>　　到此为止，this,static,super和final的使用已经说完了，如果你对这四个关键字已经能够大致说出它们的区别与用法，那便说明你基本已经掌握。然而，世界上的任何东西都不是完美无缺的，Java提供这四个关键字，给程序员的编程带来了很大的便利，但并不是说要让你到处使用，一旦达到滥用的程序，便适得其反，所以在使用时请一定要认真考虑。&nbsp;&nbsp;]]></description>
		</item>
		
			<item>
			<link>http://www.itweb2.com/article/java/283.htm</link>
			<title><![CDATA[JAVA程序员面试32问]]></title>
			<author>lc1209@163.com(journey)</author>
			<category><![CDATA[程序乐园]]></category>
			<pubDate>Tue,28 Nov 2006 12:04:53 +0800</pubDate>
			<guid>http://www.itweb2.com/default.asp?id=283</guid>
		<description><![CDATA[第一，谈谈final, finally, finalize的区别。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;final 修饰符（关键字）如果一个类被声明为final，意味着它不能再派生出新的子类，不能作为父类被继承。因此一个类不能既被声明为 abstract的，又被声明为final的。将变量或方法声明为final，可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值，而在以后的引用中只能读取，不可修改。被声明为final的方法也同样只能使用，不能重载 <br/>&nbsp;&nbsp;&nbsp;&nbsp;finally 再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常，那么相匹配的 catch 子句就会执行，然后控制就会进入 finally 块（如果有的话）。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;finalize?方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的，因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。&nbsp;&nbsp;&nbsp;&nbsp; finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 <br/><br/>第二，Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类，是否可以implements(实现)interface(接口)? <br/>匿名的内部类是没有名字的内部类。不能extends(继承) 其它类，但一个内部类可以作为一个接口，由另一个内部类实现。 <br/><br/>第三，Static Nested Class 和 Inner Class的不同，说得越多越好(面试题有的很笼统)。 <br/>Nested Class （一般是C++的说法），Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。具体可见http: //www.frontfree.net/articles/services/view.asp?id=704&amp;page=1 <br/>注： 静态内部类（Inner Class）意味着1创建一个static内部类的对象，不需要一个外部类对象，2不能从一个static内部类的一个对象访问一个外部类对象 <br/><br/>第四，&amp;和&amp;&amp;的区别。 <br/>&amp;是位运算符。&amp;&amp;是布尔逻辑运算符。 <br/><br/>第五，HashMap和Hashtable的区别。 <br/>都属于Map接口的类，实现了将惟一键映射到特定的值上。 <br/>HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 <br/>Hashtable 类似于 HashMap，但是不允许 null 键和 null 值。它也比 HashMap 慢，因为它是同步的。 <br/><br/>第六，Collection 和 Collections的区别。 <br/>Collections是个java.util下的类，它包含有各种有关集合操作的静态方法。 <br/>Collection是个java.util下的接口，它是各种集合结构的父接口。 <br/><br/>第七，什么时候用assert。 <br/>断言是一个包含布尔表达式的语句，在执行这个语句时假定该表达式为 true。如果表达式计算为 false，那么系统会报告一个 AssertionError。它用于调试目的： <br/>assert(a &gt; 0); // throws an AssertionError if a &lt;= 0 <br/>断言可以有两种形式： <br/>assert Expression1 ; <br/>assert Expression1 : Expression2 ; <br/>Expression1 应该总是产生一个布尔值。 <br/>Expression2 可以是得出一个值的任意表达式。这个值用于生成显示更多调试信息的 String 消息。 <br/>断言在默认情况下是禁用的。要在编译时启用断言，需要使用 source 1.4 标记： <br/>javac -source 1.4 Test.java <br/>要在运行时启用断言，可使用 -enableassertions 或者 -ea 标记。 <br/>要在运行时选择禁用断言，可使用 -da 或者 -disableassertions 标记。 <br/>要系统类中启用断言，可使用 -esa 或者 -dsa 标记。还可以在包的基础上启用或者禁用断言。 <br/>可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过，断言不应该用于验证传递给公有方法的参数，因为不管是否启用了断言，公有方法都必须检查其参数。不过，既可以在公有方法中，也可以在非公有方法中利用断言测试后置条件。另外，断言不应该以任何方式改变程序的状态。 <br/><br/>第八，GC是什么? 为什么要有GC? (基础)。 <br/>GC是垃圾收集器。Java 程序员不用担心内存管理，因为垃圾收集器会自动进行管理。要请求垃圾收集，可以调用下面的方法之一： <br/>System.gc() <br/>Runtime.getRuntime().gc() <br/><br/>第九，String s = new String(&#34;xyz&#34;);创建了几个String Object? <br/>两个对象，一个是“xyx”,一个是指向“xyx”的引用对象s。 <br/><br/>第十，Math.round(11.5)等於多少? Math.round(-11.5)等於多少? <br/>Math.round(11.5)返回（long）12，Math.round(-11.5)返回（long）-11; <br/>第二十一，abstract的method是否可同时是static,是否可同时是native，是否可同时是synchronized? <br/>都不能 <br/><br/>第二十二，接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? <br/>接口可以继承接口。抽象类可以实现(implements)接口，抽象类是否可继承实体类，但前提是实体类必须有明确的构造函数。 <br/><br/>第二十三，启动一个线程是用run()还是start()? <br/>启动一个线程是调用start()方法，使线程所代表的虚拟处理机处于可运行状态，这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 <br/><br/>第二十四，构造器Constructor是否可被override? <br/>构造器Constructor不能被继承，因此不能重写Overriding，但可以被重载Overloading。 <br/><br/>第二十五，是否可以继承String类? <br/>String类是final类故不可以继承。 <br/><br/>第二十六，当一个线程进入一个对象的一个synchronized方法后，其它线程是否可进入此对象的其它方法? <br/>不能，一个对象的一个synchronized方法只能由一个线程访问。 <br/><br/>第二十七，try {}里有一个return语句，那么紧跟在这个try后的finally {}里的code会不会被执行，什么时候被执行，在return前还是后? <br/>会执行，在return前执行。 <br/><br/>第二十八，编程题: 用最有效率的方法算出2乘以8等於几? <br/>有C背景的程序员特别喜欢问这种问题。 <br/><br/>2 &lt;&lt; 3 <br/><br/>第二十九，两个对象值相同(x.equals(y) == true)，但却可有不同的hash code，这句话对不对? <br/>不对，有相同的hash code。 <br/><br/>第三十，当一个对象被当作参数传递到一个方法后，此方法可改变这个对象的属性，并可返回变化后的结果，那么这里到底是值传递还是引用传递? <br/>是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时，参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变，但对象的引用是永远不会改变的。 <br/><br/>第三十一，swtich是否能作用在byte上，是否能作用在long上，是否能作用在String上? <br/>switch（expr1）中，expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich。 <br/><br/>第三十二，编程题: 写一个Singleton出来。 <br/>Singleton模式主要作用是保证在Java应用程序中，一个类Class只有一个实例存在。 <br/>一般Singleton模式通常有几种种形式: <br/>第一种形式: 定义一个类，它的构造函数为private的，它有一个static的private的该类变量，在类初始化时实例话，通过一个public的getInstance方法获取对它的引用,继而调用其中的方法。 <br/>public class Singleton { <br/>　　private Singleton(){} <br/>　　//在自己内部定义自己一个实例，是不是很奇怪？ <br/>　　//注意这是private 只供内部调用 <br/>　　private static Singleton instance = new Singleton(); <br/>　　//这里提供了一个供外部访问本class的静态方法，可以直接访问　　 <br/>　　public static Singleton getInstance() { <br/>　　　　return instance; 　　 <br/>　　 } <br/>} <br/>第二种形式: <br/>public class Singleton { <br/>　　private static Singleton instance = null; <br/>　　public static synchronized Singleton getInstance() { <br/>　　//这个方法比上面有所改进，不用每次都进行生成对象，只是第一次　　　 　 <br/>　　//使用时生成实例，提高了效率！ <br/>　　if (instance==null) <br/>　　　　instance＝new Singleton(); <br/>return instance; 　　} <br/>}<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.itweb2.com/article/java/282.htm</link>
			<title><![CDATA[Web编程进阶 Jsp完全攻略专题索引(收藏)]]></title>
			<author>lc1209@163.com(journey)</author>
			<category><![CDATA[程序乐园]]></category>
			<pubDate>Tue,28 Nov 2006 12:01:55 +0800</pubDate>
			<guid>http://www.itweb2.com/default.asp?id=282</guid>
		<description><![CDATA[Jsp安装配置<br/>Java初学者：Jsp开发环境配置全过程 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=34267" target="_blank" rel="external"><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=34267" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=34267</a></a><br/>windows下jsp运行环境的配置方案<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=36162" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=36162</a><br/>Freebsd+Resin成功建立支持jsp平台<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=36096" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=36096</a><br/>Eclipse+MyEclipse+Lomboz图解安装JSP<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=35302" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=35302</a><br/>Java初学者：Jsp开发环境配置全过程<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=34267" target="_blank" rel="external"><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=34267" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=34267</a></a><br/>Linux下jsp环境：apache,tomcat配置 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=34186" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=34186</a><br/>Linux下JSP运行、开发环境的建立<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=33466" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=33466</a><br/>Tomcat+JSP经典配置实例<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=33170" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=33170</a><br/>新手入门之Windows下JSP安装全图解<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=33352" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=33352</a><br/>配置Eclpise+tomcat与实现JSP部署<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=32894" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=32894</a><br/>如何设置JSP开发及运行环境<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=31020" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=31020</a><br/>一步一步跟我学Linux平台下搭建Jsp环境<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=31522" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=31522</a><br/>在Windows 2000下搭建JSP环境<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=30850" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=30850</a><br/>Eclipse 3.0 上配置JSP开发环境<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=30056" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=30056</a><br/>支持JSP的WEB容器Tomcat环境配置<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=26471" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=26471</a><br/><br/>Jsp基础学习<br/>Java和JSP编程应该注意的六个常见问题<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=35870" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=35870</a><br/>JSP与ASP.Net之间的Session值共享<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=35624" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=35624</a><br/>Java爱好者菜园培训：JSP及语法概要<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=34972" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=34972</a><br/>关于JSP语法大全及实例解析<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=32941" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=32941</a><br/>JSP开发的安全编程实例详细解析<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=32762" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=32762</a><br/>JBuilder2005实战JSP之程序功能介绍<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=31769" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=31769</a><br/>初学者如何快速入门JSP实例分析<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=31015" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=31015</a><br/>JSP简明教程：令人兴奋的脚本编程<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=30851" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=30851</a><br/>JSP简明教程：行为标签与实例<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=30849" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=30849</a><br/><br/>Java和JSP编程中应该注意的几个问题<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=29989" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=29989</a><br/>JSP新手入门初级教程之JSP概述<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=29745" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=29745</a><br/>JSP避免Form重复提交的三种方案<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=29744" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=29744</a><br/>JSP入门初级教程之预定义变量的使用<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=28478" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=28478</a><br/>JSP入门初级教程之Actions的使用<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=28479" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=28479</a><br/>JSP入门初级教程之JSP指令<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=28477" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=28477</a><br/>JSP入门初级教程之实现页面跳转<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=28480" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=28480</a> <br/><br/><br/>JSP与Servlet<br/>JSP/Servlet应用程序优化八法<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=33256" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=33256</a><br/>Servlet及JSP中的多线程同步问题<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=33087" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=33087</a><br/>编程者入门：谈Servlet/JSP的配置详解<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=32474" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=32474</a><br/>Servlet和JSP 性能调整技术<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=31112" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=31112</a><br/>Servlets和JSP Pages最佳实践<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=30854" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=30854</a><br/>深入理解和改进JSP/Servlet会话管理机制<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=30678" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=30678</a><br/>在JSP-Servlet开发中导入事件驱动技术<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=30565" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=30565</a><br/>JSP/Servlet的重定向技术综述<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=30394" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=30394</a><br/>JSP/Servlet构建三层管理信息系统<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=27779" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=27779</a><br/>深入剖析JSP和Servlet对中文的处理<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=27329" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=27329</a><br/>在Jsp中用Bean和Servlet联合实现用户注册<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=26175" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=26175</a><br/>Java Servlet API说明文档（2.1a版） <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=27970" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=27970</a><br/>高性能、高弹性的JSP和Servlet的性能优化 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=21803" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=21803</a><br/>关于Java Servlet编程应用基础分析 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=36795" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=36795</a><br/>Servlet和JavaServerPages的集成应用 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=34761" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=34761</a> <br/><br/> <br/><br/>Jsp数据库<br/>JSP使用连接池连接数据库的问题<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=35985" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=35985</a><br/>JSP中连接SQL 2000数据库的问题总结<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=34790" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=34790</a><br/>加快JDBC设计中JSP访问数据库<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=33258" target="_blank" rel="external"><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=33258" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=33258</a></a><br/>JSP连接MySQL数据库攻略<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=32891" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=32891</a><br/>论JSP数据库连接池的必要性<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=32078" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=32078</a><br/>JBuilder2005实战JSP之创建数据库表<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=31796" target="_blank" rel="external"><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=31796" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=31796</a></a><br/>用JSP导出ORACLE的数据表DDL<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=30812" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=30812</a><br/>JSP连接SQL Server 2000系统配置<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=30404" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=30404</a><br/>JSP数据库基础知识 语法详解<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=29746" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=29746</a><br/>JSP中调用Oracle存储过程的小例子<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=28000" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=28000</a><br/>JSP连接数据库方法大全<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=27994" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=27994</a><br/>创建访问DB2 Everyplace的JSP应用程序<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=27904" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=27904</a><br/>Servlet开发中JDBC的高级应用 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=32127" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=32127</a><br/>加快JDBC设计中JSP访问数据库 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=33258" target="_blank" rel="external"><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=33258" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=33258</a></a><br/>JBuilder2005实战JSP之创建数据库表 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=31796" target="_blank" rel="external"><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=31796" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=31796</a></a><br/><br/><br/>Jsp经典实例<br/>JSP报表打印的一种简单解决方案<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37025" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37025</a><br/>详解如何利用iText在JSP中生成PDF报表<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=33082" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=33082</a><br/>JBuilder2005实战JSP之特殊页面<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=31967" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=31967</a><br/>JBuilder2005实战JSP之错误处理<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=31966" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=31966</a><br/>详细解析JSP编程中进度条的设计实例<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=31616" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=31616</a><br/>开发实例：JSP中实现全文检索<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=31017" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=31017</a><br/>JSP和IIS的最佳解决方案实例分析<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=30718" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=30718</a><br/>在JSP中使用JavaMail邮件发送收取(1)<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=27679" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=27679</a><br/>在JSP中使用JavaMail邮件发送收取(2)<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=27680" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=27680</a><br/>用jsp动态输出excel文档和中文乱码问题的解决<br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=26128" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=26128</a><br/><br/>Jsp电子教程<br/>JSP语法 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37149" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37149</a><br/>JSP学习指南 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37148" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37148</a><br/>JSP网页编程(PPT) <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37146" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37146</a><br/>JSP网络编程技术 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37145" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37145</a><br/>JSP速成教程 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37143" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37143</a><br/>JSP入门与提高 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37142" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37142</a><br/><br/>JSP快速入门 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37141" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37141</a><br/>JSP核心技术和电子商务应用实例源代码分析 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37140" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37140</a><br/>JSP高级编程5 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37139" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37139</a><br/>JSP高级编程4 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37138" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37138</a><br/> JSP高级编程3 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37137" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37137</a><br/>JSP高级编程2 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37136" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37136</a><br/>JSP高级编程1 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37134" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37134</a><br/> JSP程序设计指南 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37133" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37133</a><br/>JSP 实用教程 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37132" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37132</a><br/>JSP 动态网站技术入门与提高 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37131" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37131</a><br/>JSP and XML <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37130" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37130</a><br/>Java开发指南--Servlets和JSP篇 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37129" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37129</a><br/>JavaServerPages基础 <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37128" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37128</a><br/>JavaServer Pages Second Edition <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37127" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37127</a><br/>JavaServer Pages 3rd Edition <br/><a href="http://www.chinaitlab.com/www/news/article_show.asp?id=37126" target="_blank" rel="external">http://www.chinaitlab.com/www/news/article_show.asp?id=37126</a> <br/>]]></description>
		</item>
		
</channel>
</rss>
