﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-小菜毛毛技术分享-文章分类-java基础及其原理</title><link>http://www.blogjava.net/caizh2009/category/39984.html</link><description>与大家共同成长</description><language>zh-cn</language><lastBuildDate>Sat, 12 Dec 2009 02:09:20 GMT</lastBuildDate><pubDate>Sat, 12 Dec 2009 02:09:20 GMT</pubDate><ttl>60</ttl><item><title>J2EE 规范（java ee）</title><link>http://www.blogjava.net/caizh2009/articles/305220.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Tue, 08 Dec 2009 14:32:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/305220.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/305220.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/305220.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/305220.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/305220.html</trackback:ping><description><![CDATA[Java EEJava 企业系统李涛Technology EvangelistSun Microsystems Inc.<br />
--------------------------------------------------------------------------------<br />
Page 2 <br />
学习目标&#8226; 宏观地了解 Java EE&gt; 什么是 Java EE&gt; 为什么要用 Java EE&gt; Java EE 的核心概念&gt; Java EE 的 API<br />
--------------------------------------------------------------------------------<br />
Page 3 <br />
Java 和 Java EE<br />
--------------------------------------------------------------------------------<br />
Page 4 <br />
Java 平台Java EEJava SEJava ME Java Card<br />
--------------------------------------------------------------------------------<br />
Page 5 <br />
Java 概况&#8226; Java Standard Edition (Java SE)&gt; 编译器，常用工具 , Java 运行环境和 Java 应用开发的 API&#8226; Java Enterprise Edition (Java EE)&gt; 开发，部署和管理服务器端的，分散的，多层的基于组件的企业级应用系统&#8226; Java Micro Edition (Java ME)&gt; J2SE 的一个子集，用于开发在小型的，可移动的设备上的应用程序<br />
--------------------------------------------------------------------------------<br />
Page 6 <br />
The Java&#8482; PlatformHigh-EndServerJava TechnologyEnabled DesktopWorkgroupServerJava TechnologyEnabled Devices<br />
--------------------------------------------------------------------------------<br />
Page 7 <br />
企业级应用<br />
--------------------------------------------------------------------------------<br />
Page 8 <br />
什么是企业级应用？ 企业级应用是以服务器为中心，通过网络把服务器和分散的用户联系在一起的应用。网上银行，新浪信息网，校园网网络可以是 Internet ，也可以是无线电话网。<br />
--------------------------------------------------------------------------------<br />
Page 9 <br />
企业级应用的演变&#8226; 单层系统&gt; 庞大 , 直接相连&#8226; 两层系统&gt; 客户端逻辑复杂 (rich client)&#8226; 三层系统&gt; Browser, Web Server, DB&gt; 商业逻辑的处理集中在中间件上。DBSQLDBSQLHTTP<br />
--------------------------------------------------------------------------------<br />
Page 10 <br />
企业级系统的发展趋势&#8226; 由单层和两层系统向多层结构演变&#8226; 由庞大的，整体的系统向独立组件的系统演变&#8226; 客户端由&#8220; Rich Client&#8221; 向类似网络浏览器的&#8220; Thin Client&#8221; 演变&#8226; 客户端更多样化&gt; PC&gt; 手机&gt; 掌上电脑<br />
--------------------------------------------------------------------------------<br />
Page 11 <br />
由此产生的问题1.&#8220; 中间层&#8221;很复杂&gt; &#8220; 中间层&#8221;：应用中运行在应用服务器上的部分2.每一个应用都会重复一些基本的系统服务&gt; 协调对共享资源的调用&gt; 保证对共享资源的事务性操作&gt; 共享资源的平衡负载&gt; 保护共享资源的安全性<br />
--------------------------------------------------------------------------------<br />
Page 12 <br />
什么是 Java EE ？<br />
--------------------------------------------------------------------------------<br />
Page 13 <br />
什么是 Java EE ？ Java EE 是 Sun 公司针对现代企业级应用的解决方案 涉及企业级应用的开发，部署和管理<br />
--------------------------------------------------------------------------------<br />
Page 14 <br />
Java EE 针对解决了企业级应用的问题&#8226; Java EE 通过提供&gt; 一套标准的 API&gt; 以组件为基础的架构&gt; 一个新的容器概念，通过容器来提供标准的系统服务大大减低了&#8220;中间层&#8221;的复杂程度&#8226; 继承了 Java 的特性&gt; 安全性&gt; 高可移植性<br />
--------------------------------------------------------------------------------<br />
Page 15 <br />
Java EE 包含的技术内容&#8226; 平台标准&gt; 容器的技术规范&#8226; API 接口规范&gt; 组件开发&#8226; 参考实现&#8226; 开发工具&#8226; 兼容性测试包&#8226; 蓝图&gt; 系统架构设计指导<br />
--------------------------------------------------------------------------------<br />
Page 16 <br />
Java EE 平台架构<br />
--------------------------------------------------------------------------------<br />
Page 17 <br />
Java EE 5.0 的 APIs 和技术基础：Java SE 5.0表现层：ServletJSPJSF中间件：EJBJAX-WSJavaMailJMSConnectorJTAJAX-RPCJava EE ManagementJava EE DeploymentJMXJAXRJACCJAF <br />
--------------------------------------------------------------------------------<br />
Page 18 <br />
Java EE 的发展过程<br />
--------------------------------------------------------------------------------<br />
Page 19 <br />
Java EE 平台的发展过程98 年 5 月 99 年 12 月 01 年 9 月 03 年 11 月 06 年 5 月JPEProjectJ2EE 1.2Servlet,JSP, EJB,JMS, JTA,JNDI,RMI/IIOPJ2EE 1.3EJB 2.0,ConnectorArchitectureJ2EE 1.4Web Services,Management,Deployment,Async.ConnectorJava EE5Annotations,EJB 3.0,PersistanceAPI,JSF,Renewed WebServices企业平台初始强调稳定性Web 服务强调开发的简易性<br />
--------------------------------------------------------------------------------<br />
Page 20 <br />
Footnote position, 12 pts.o<br />
--------------------------------------------------------------------------------<br />
Page 21 <br />
Java EE 的优势<br />
--------------------------------------------------------------------------------<br />
Page 22 <br />
大量的开发人员&#8226; 容易学习，容易上手&gt; Java&gt; 有许多可选择的开发工具&gt;NetBeans&#8226; 容易搭建环境&gt; Java EE 实现可免费获得，免费运用&gt;Sun ， Apache ， JBoss&#8226; 大量的学习资源&gt; 书籍&gt; 网络学习资料<br />
--------------------------------------------------------------------------------<br />
Page 23 <br />
大量的中间件提供商&#8226; Java EE 标准的制定是公开的&gt; 各厂商共同制定标准&gt; 厂商有不同的实现但支持相同的标准&#8226; 在不影响组件间交互性的情况下，厂商有足够的空间来发挥自己的创造性，提高自己产品的竞争力。&#8226; 需求大，商机多<br />
--------------------------------------------------------------------------------<br />
Page 24 <br />
吸引商业客户&#8226; 应用的可移植性高&gt; 不同的操作系统&gt; 不同的中间件&#8226; 供选择的 Java EE 产品多&gt; 价格&gt; 可扩展性&gt; 可靠性&gt; 性能&#8226; 容易找到开发人员<br />
--------------------------------------------------------------------------------<br />
Page 25 <br />
Java EE 主宰了现代的企业级应用<br />
--------------------------------------------------------------------------------<br />
Page 26 <br />
怎样学习 Java EE<br />
--------------------------------------------------------------------------------<br />
Page 27 <br />
步骤 1: 针对初学者&#8226; 下载Java EE SDK ，试用其中的例子&gt; http://java.sun.com/javaee/downloads/index.jsp&gt;Java SE 5.0&gt;Sun application server 9.0&gt;例子&gt;API 文档&#8226; 下载 Java EE 在线教材&gt; http://java.sun.com/javaee/5/docs/tutorial/doc/&gt; 第二章： Web Application 起步&gt; 第三章： Servlet&gt; 第四章： JSP<br />
--------------------------------------------------------------------------------<br />
Page 28 <br />
步骤 2: 学习使用 IDE&#8226; NetBeans IDE&gt; http://www.netbeans.org&gt; 免费且开源&gt; 非常杰出的 Java EE 支持&gt;下载即用：完整的 Java EE 环境&#8226; Eclipse<br />
--------------------------------------------------------------------------------<br />
Page 29 <br />
步骤 3: 学习使用 Java EE 架构&#8226; 架构提供解决方案，简化开发&gt; Struts, JSF ， Tapestry (Web 层 )&gt; Spring framework&gt; JUnit ( 单元测试架构 )&gt; Log4j ( 日志架构 )&gt; Hibernate (O/R mapping)&gt; JDO ( 数据持久化框架 )<br />
--------------------------------------------------------------------------------<br />
Page 30 <br />
步骤 4: 时刻保持技术更新 &#8226; http://gceclub.sun.com.cn/&gt;中国 Java 开发者社区&#8226; http://www.csdn.net/&#8226; http://java.sun.com/Javaee&#8226; www.theserverside.com<br />
--------------------------------------------------------------------------------<br />
Page 31 <br />
总结<br />
--------------------------------------------------------------------------------<br />
Page 32 <br />
总结&#8226; Java EE 是标准的企业级应用的规范集合&#8226; Java EE 是开发现代的基于网络的企业级应用的首选平
<img src ="http://www.blogjava.net/caizh2009/aggbug/305220.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-12-08 22:32 <a href="http://www.blogjava.net/caizh2009/articles/305220.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转贴]System.getProperty()参数大全</title><link>http://www.blogjava.net/caizh2009/articles/304982.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Mon, 07 Dec 2009 04:04:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/304982.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/304982.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/304982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/304982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/304982.html</trackback:ping><description><![CDATA[一直做Web应用一般不会用到这些东西，今天在搞一个代码生成器的东西，发现这个值得收藏：<br />
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-j">
    <li class="alt"><span><span>&nbsp;&nbsp;<span class="hilite1">System</span>.<span class="hilite2">getProperty</span>()参数大全&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>java.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Runtime&nbsp;Environment&nbsp;version&nbsp;&nbsp;</span>
    <li class=""><span>java.vendor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Runtime&nbsp;Environment&nbsp;vendor&nbsp;&nbsp;</span>
    <li class="alt"><span>java.vendor.url&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;vendor&nbsp;URL&nbsp;&nbsp;</span>
    <li class=""><span>java.home&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;installation&nbsp;directory&nbsp;&nbsp;</span>
    <li class="alt"><span>java.vm.specification.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Virtual&nbsp;Machine&nbsp;specification&nbsp;version&nbsp;&nbsp;</span>
    <li class=""><span>java.vm.specification.vendor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Virtual&nbsp;Machine&nbsp;specification&nbsp;vendor&nbsp;&nbsp;</span>
    <li class="alt"><span>java.vm.specification.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Virtual&nbsp;Machine&nbsp;specification&nbsp;name&nbsp;&nbsp;</span>
    <li class=""><span>java.vm.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Virtual&nbsp;Machine&nbsp;implementation&nbsp;version&nbsp;&nbsp;</span>
    <li class="alt"><span>java.vm.vendor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Virtual&nbsp;Machine&nbsp;implementation&nbsp;vendor&nbsp;&nbsp;</span>
    <li class=""><span>java.vm.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Virtual&nbsp;Machine&nbsp;implementation&nbsp;name&nbsp;&nbsp;</span>
    <li class="alt"><span>java.specification.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Runtime&nbsp;Environment&nbsp;specification&nbsp;version&nbsp;&nbsp;</span>
    <li class=""><span>java.specification.vendor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Runtime&nbsp;Environment&nbsp;specification&nbsp;vendor&nbsp;&nbsp;</span>
    <li class="alt"><span>java.specification.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;Runtime&nbsp;Environment&nbsp;specification&nbsp;name&nbsp;&nbsp;</span>
    <li class=""><span>java.<span class="keyword">class</span><span>.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;</span><span class="keyword">class</span><span>&nbsp;format&nbsp;version&nbsp;number&nbsp;&nbsp;</span></span>
    <li class="alt"><span>java.<span class="keyword">class</span><span>.path&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java&nbsp;</span><span class="keyword">class</span><span>&nbsp;path&nbsp;&nbsp;</span></span>
    <li class=""><span>java.library.path&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;of&nbsp;paths&nbsp;to&nbsp;search&nbsp;when&nbsp;loading&nbsp;libraries&nbsp;&nbsp;</span>
    <li class="alt"><span>java.io.tmpdir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Default&nbsp;temp&nbsp;file&nbsp;path&nbsp;&nbsp;</span>
    <li class=""><span>java.compiler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name&nbsp;of&nbsp;JIT&nbsp;compiler&nbsp;to&nbsp;use&nbsp;&nbsp;</span>
    <li class="alt"><span>java.ext.dirs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;of&nbsp;extension&nbsp;directory&nbsp;or&nbsp;directories&nbsp;&nbsp;</span>
    <li class=""><span>os.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Operating&nbsp;<span class="hilite1">system</span>&nbsp;name&nbsp;&nbsp;</span>
    <li class="alt"><span>os.arch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Operating&nbsp;<span class="hilite1">system</span>&nbsp;architecture&nbsp;&nbsp;</span>
    <li class=""><span>os.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Operating&nbsp;<span class="hilite1">system</span>&nbsp;version&nbsp;&nbsp;</span>
    <li class="alt"><span>file.separator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;separator&nbsp;(<span class="string">"/"</span><span>&nbsp;on&nbsp;UNIX)&nbsp;&nbsp;</span></span>
    <li class=""><span>path.separator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;separator&nbsp;(<span class="string">":"</span><span>&nbsp;on&nbsp;UNIX)&nbsp;&nbsp;</span></span>
    <li class="alt"><span>line.separator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Line&nbsp;separator&nbsp;(<span class="string">"\n"</span><span>&nbsp;on&nbsp;UNIX)&nbsp;&nbsp;</span></span>
    <li class=""><span>user.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User's&nbsp;account&nbsp;name&nbsp;&nbsp;</span>
    <li class="alt"><span>user.home&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User's&nbsp;home&nbsp;directory&nbsp;&nbsp;</span>
    <li class=""><span>user.dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User's&nbsp;current&nbsp;working&nbsp;directory&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
使用方法很简单：<span class="hilite1">System</span>.<span class="hilite2">getProperty</span>("user.dir")&nbsp;&nbsp; 
<img src ="http://www.blogjava.net/caizh2009/aggbug/304982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-12-07 12:04 <a href="http://www.blogjava.net/caizh2009/articles/304982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中cache的处理 简单实现</title><link>http://www.blogjava.net/caizh2009/articles/304963.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Mon, 07 Dec 2009 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/304963.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/304963.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/304963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/304963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/304963.html</trackback:ping><description><![CDATA[public class Cache {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String key;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Object value;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private long timeOut;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private boolean expired;
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Cache() {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Cache(String key, String value, long timeOut, boolean expired) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.key = key;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.value = value;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.timeOut = timeOut;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.expired = expired;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getKey() {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return key;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public long getTimeOut() {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return timeOut;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object getValue() {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setKey(String string) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key = string;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setTimeOut(long l) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeOut = l;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setValue(Object object) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = object;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isExpired() {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return expired;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setExpired(boolean b) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expired = b;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br style="line-height: normal" />
}</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">另外一个类：<br style="line-height: normal" />
import <a onclick="javascript:tagshow(event, 'java');" href="javascript:;" target="_self"><u><strong>java</strong></u></a>.util.Date;<br style="line-height: normal" />
import java.util.HashMap;</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">public class CacheManager {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static HashMap cacheMap = new HashMap();</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * This class is singleton so private constructor is used.<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private CacheManager() {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super();<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * returns cache item from hashmap<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param key<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @return Cache<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private synchronized static Cache getCache(String key) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (Cache)cacheMap.get(key);<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Looks at <a onclick="javascript:tagshow(event, 'the');" href="javascript:;" target="_self"><u><strong>the</strong></u></a> hashmap if a cache item exists or <a onclick="javascript:tagshow(event, 'not');" href="javascript:;" target="_self"><u><strong>not</strong></u></a><br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param key<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @return Cache<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private synchronized static boolean hasCache(String key) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cacheMap.containsKey(key);<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Invalidates all cache<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public synchronized static void invalidateAll() {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cacheMap.clear();<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Invalidates a single cache item<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param key<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public synchronized static void invalidate(String key) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cacheMap.remove(key);<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Adds new item to cache hashmap<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param key<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @return Cache<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private synchronized static void putCache(String key, Cache object) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cacheMap.put(key, object);<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Reads a cache item's content<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param key<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @return<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Cache getContent(String key) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (hasCache(key)) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cache cache = getCache(key);<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cacheExpired(cache)) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cache.setExpired(true);<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return cache;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param key<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param content<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param ttl<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void putContent(String key, Object content, long ttl) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cache cache = new Cache();<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cache.setKey(key);<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cache.setValue(content);<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cache.setTimeOut(ttl + new Date().getTime());<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cache.setExpired(false);<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; putCache(key, cache);<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /** @modelguid {172828D6-3AB2-46C4-96E2-E72B34264031} */<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static boolean cacheExpired(Cache cache) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cache == null) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long milisNow = new Date().getTime();<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long milisExpire = cache.getTimeOut();<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (milisExpire &lt; 0) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Cache never expires&nbsp;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (milisNow &gt;= milisExpire) {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br style="line-height: normal" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p style="line-height: normal"><font style="line-height: normal" color="#000080">}</font></p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/304963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-12-07 10:10 <a href="http://www.blogjava.net/caizh2009/articles/304963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java操作IM的一些资源</title><link>http://www.blogjava.net/caizh2009/articles/293207.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Sun, 30 Aug 2009 10:11:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/293207.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/293207.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/293207.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/293207.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/293207.html</trackback:ping><description><![CDATA[１、<strong>Java IM</strong> <br />
SourceForge 上一款开源IM软件，A simple and straightforeward instant messaging program written in Java for all platforms developed with ease of use and efficiency in mind.<br />
<a href="http://sourceforge.net/projects/im-java/" target="_blank">http://sourceforge.net/projects/im-java/</a> <br />
<br />
２、<strong>Java Instant Messenger</strong>
<p>Java Instant Messenger (or JIM) is an application to allow instant messaging over a network. JIM does not have a centralized server. Instead, users run the server on one of the computers on the network and other users connect to that server.</p>
<p>(This Description is auto-translated)<br />
<a href="http://zh.sourceforge.jp/projects/sfnet_jinstantmessage/" target="_blank">http://zh.sourceforge.jp/projects/sfnet_jinstantmessage/</a> <br />
<br />
3、<strong>IM客户端 <span style="text-decoration: underline">Spark</span> </strong><br />
Spark是一个开源，跨平台IM客户端。它的特性支持集组聊天，电话集成和强大安全性能。如果企业内部部署IM使用Openfire+Spark是最佳的组合。<br />
<a href="http://www.oschina.net/p/spark" target="_blank">http://www.oschina.net/p/spark</a> <br />
<a href="http://blog.csdn.net/masterjames/archive/2009/08/21/4465255.aspx" target="_blank">http://blog.csdn.net/masterjames/archive/2009/08/21/4465255.aspx</a> <br />
<br />
<br />
４、<strong>LumaQQ&nbsp; </strong><br />
&nbsp;LumaQQ 是一个独立的 &nbsp; Java &nbsp; QQ &nbsp; 客户端，具有可重用的纯Java核心和基于SWT的仿 &nbsp; QQ &nbsp; 界面。我们遵循GNU &nbsp; General &nbsp; Public &nbsp; License &nbsp; 许可证（简称GPL）发布。该条款的原文可见和 &nbsp; LumaQQ &nbsp; 源代码一同发布的 &nbsp; COPYING &nbsp; 文件。 &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; 需要特别声明的是 &nbsp; LumaQQ &nbsp; 是以研究和学习为目的的，我们并没有违反 &nbsp; QQ &nbsp; 的版权许可的东西。一切的协议分析都是把 &nbsp; QQ &nbsp; 当作黑箱分析，我们所做的一切都遵循中华人民共和国《计算机软件保护条例》。 <br />
<a href="http://lumaqq.linuxsir.org/main/index.php" target="_blank">http://lumaqq.linuxsir.org/main/index.php</a> <br />
<br />
５、<strong>Openfire</strong> <br />
Openfire 是实时的基于WEB的即时消息传输平台，是原来的Jive Messenger<br />
<a href="http://www.cnblogs.com/downmoon/admin/Openfire%20%E6%98%AF%E5%AE%9E%E6%97%B6%E7%9A%84%E5%9F%BA%E4%BA%8EWEB%E7%9A%84%E5%8D%B3%E6%97%B6%E6%B6%88%E6%81%AF%E4%BC%A0%E8%BE%93%E5%B9%B3%E5%8F%B0%EF%BC%8C%E6%98%AF%E5%8E%9F%E6%9D%A5%E7%9A%84Jive%20Messenger" target="_blank">http://www.oschina.net/p/openfire</a> <br />
<br />
６、<strong>类似QQ的聊天软件JAVA版源码（附设计文档）<br />
</strong>作者：其实像QQ聊天这样的软件有很多，但基本上都没有公开源代码，而且也只是提供软件客户端，有一些像ICQ的软件虽提供服务端但却不公开源代码。本人很想知道它的运行机理，想弄明白它是怎么一回事，所以就试着做了一个，虽然没有正式公司的那么复杂和友好的界面，但至少可以给你点启发，对学习是有帮助的。<br />
<a href="http://www.codefans.net/soft/1472.shtml" target="_blank">http://www.codefans.net/soft/1472.shtml</a> <br />
<a href="http://www.chinajia.com/soft/downinfo/3383.html" target="_blank">http://www.chinajia.com/soft/downinfo/3383.html</a> <br />
<br />
７、<strong>JavaQQ.</strong> <br />
用java写的简单QQ，共同<span class="t_tag" onclick="tagshow(event)">学习</span> 。<br />
<a href="http://www.itxuexi.com/bbs/thread-13226-1-1.html" target="_blank">http://www.itxuexi.com/bbs/thread-13226-1-1.html</a> <br />
<a href="http://download.csdn.net/source/745684" target="_blank">http://download.csdn.net/source/745684</a> <br />
</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/293207.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-08-30 18:11 <a href="http://www.blogjava.net/caizh2009/articles/293207.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是java的path和classpath?</title><link>http://www.blogjava.net/caizh2009/articles/292849.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Thu, 27 Aug 2009 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/292849.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/292849.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/292849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/292849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/292849.html</trackback:ping><description><![CDATA[<p>1.什么是java的path和classpath?</p>
<p>Java 中的 ClassPath 和 Package</p>
<p>前言:</p>
<p>由于这两个问题新手问得较多, 且回答比较零散, 很难统一整理, 所<br />
以就直接写了一篇, 还请大家见谅.</p>
<p><br />
正文:</p>
<p>一, 类路径 (class path)</p>
<p>当你满怀着希望安装好了 java, 然后兴冲冲地写了个 hello world,然后编译,<br />
运行, 就等着那两个美好的单词出现在眼前, 可是不幸的是, 只看到了 Can't find<br />
class HelloWorld 或者 Exception in thread "main" java.lang.NoSuchMethodError: ma<br />
in.<br />
为什么呢? 编译好的 class 明明在呀.<br />
我们一起来看一看 java 程序的运行过程. 我们已经知道 java 是通过 java</p>
<p><br />
发信人: SuperMMX (笑天子), 信区: Java<br />
标 题: [整理] Java 的 Class Path 和 Package<br />
发信站: BBS 水木清华站 (Mon Apr 9 08:15:01 2001)</p>
<p>Java 中的 ClassPath 和 Package</p>
<p>前言:</p>
<p>由于这两个问题新手问得较多, 且回答比较零散, 很难统一整理, 所<br />
以就直接写了一篇, 还请大家见谅.</p>
<p><br />
正文:</p>
<p>一, 类路径 (class path)</p>
<p>当你满怀着希望安装好了 java, 然后兴冲冲地写了个 hello world,然后编译,<br />
运行, 就等着那两个美好的单词出现在眼前, 可是不幸的是, 只看到了 Can't find<br />
class HelloWorld 或者 Exception in thread "main" java.lang.NoSuchMethodError: ma<br />
in.<br />
为什么呢? 编译好的 class 明明在呀.<br />
我们一起来看一看 java 程序的运行过程. 我们已经知道 java 是通过 java</p>
<p><br />
虚拟机来解释运行的, 也就是通过 java 命令, javac 编译生成的 .class<br />
文件就是虚拟机要执行的代码, 称之为字节码(bytecode), 虚拟机通过 classloader<br />
来装载这些字节码, 也就是通常意义上的类. 这里就有一个问题, classloader 从<br />
哪里知道 java 本身的类库及用户自己的类在什么地方呢? 或者有着缺省值(当前路径).<br />
或者要有一个用户指定的变量来表明, 这个变量就是类路径(classpath), 或者在运行<br />
的时候传参数给虚拟机. 这也就是指明 classpath 的三个方法. 编译的过程和运行<br />
的过程大同小异, 只是一个是找出来编译, 另一个是找出来装载.<br />
实际上 java 虚拟机是由 java luncher 初始化的, 也就是 java (或 java.exe)<br />
这个程序来做的. 虚拟机按以下顺序搜索并装载所有需要的类:<br />
1, 引导类: 组成 java 平台的类, 包含 rt.jar 和 i18n.jar 中的类.<br />
2, 扩展类: 使用 java 扩展机制的类, 都是位于扩展目录($JAVA_HOME/jre/lib/ext)<br />
中的 .jar 档案包.<br />
3, 用户类: 开发者定义的类或者没有使用 java 扩展机制的第三方产品. 你必须在<br />
命令行中使用 -classpath 选项或者使用 CLASSPATH 环境变量来确定这些类的位置. 我<br />
们在上面所说的用户自己的类就是特指这些类.<br />
这样, 一般来说, 用户只需指定用户类的位置, 引导类和扩展类是"自动"寻找的.<br />
那么到底该怎么做呢? 用户类路径就是一些包含类文件的目录, .jar, .zip 文件的<br />
列表, 至于类具体怎么找, 因为牵扯到 package 的问题, 下面将会说到, 暂时可认为<br />
只要包含了这个类就算找到了这个类. 根据平台的不同分隔符略有不同, 类 unix 的系<br />
统基本上都是 ":", windows 多是 ";". 其可能的来源是:</p>
<p>* ".", 即当前目录, 这个是缺省值.</p>
<p><br />
* CLASSPATH 环境变量, 一旦设置, 将缺省值覆盖.<br />
* 命令行参数 -cp 或者 -classpath, 一旦指定, 将上两者覆盖.<br />
* 由 -jar 参数指定的 .jar 档案包, 就把所有其他的值覆盖, 所有的类都来自这个指<br />
定的档案包中. 由于生成可执行的 .jar 文件, 还需要其他一些知识, 比如 package, 还有<br />
特定的配置文件, 本文的最后会提到. 可先看看 jdk 自带的一些例子.</p>
<p>我们举个 HelloWorld 的例子来说明. 先做以下假设:<br />
* 当前目录是 /HelloWorld (或 c:\HelloWorld, 以后都使用前一个)<br />
* jdk 版本为 1.2.2 (linux 下的)<br />
* PATH 环境变量设置正确. (这样可以在任何目录下都可以使用工具)<br />
* 文件是 HelloWorld.java, 内容是:</p>
<p>public class HelloWorld<br />
{<br />
public static void main(String[] args)<br />
{<br />
System.out.println("Hello World!\n");<br />
System.exit(0);<br />
}<br />
}</p>
<p>首先这个文件一定要写对, 如果对 c 熟悉的话, 很有可能写成这样:</p>
<p>&nbsp;</p>
<p>public static void main(int argc, String[] argv)<br />
{<br />
....<br />
}</p>
<p>这样是不对的, 不信可以试一试. 由于手头没有 java 的规范, 所以<br />
作如下猜想: java 的 application 程序, 必须以 public static void main(String[])<br />
开始, 其他不一样的都不行.</p>
<p>到现在为止, 我们设置方面只设置了 PATH.</p>
<p>1, 当前路径就是指你的 .class 文件在当前目录下,</p>
<p>[HelloWorld]$ javac HelloWorld.java //这一步不会有多大问题,<br />
[HelloWorld]$ java HelloWorld // 这一步可能就会有问题.</p>
<p>如果出了象开头那样的问题, 首先确定不是由于敲错命令而出错. 如果没有敲错命令,<br />
那么接着做:</p>
<p>[HelloWorld]$ echo $CLASSPATH<br />
或者</p>
<p><br />
c:\HelloWorld&gt;echo %CLASSPATH%</p>
<p>看看 CLASSPATH 环境变量是否设置了, 如果设置了, 那么用以下命令:</p>
<p>[HelloWorld]$ CLASSPATH=<br />
或者<br />
c:\HelloWorld&gt; set CLASSPATH=</p>
<p>来使它为空, 然后重新运行. 这次用户类路径缺省的是 ".", 所以应该不会有相<br />
同的问题了. 还有一个方法就是把 "." 加入到 CLASSPATH 中.</p>
<p>[/]$ CLASSPATH=$CLASSPATH:.<br />
或者<br />
c:\HelloWorld&gt; set CLASSPATH=%CLASSPATH%;.</p>
<p>同样也可以成功. Good Luck.</p>
<p>2, 当你的程序需要第三方的类库支持, 而且比较常用, 就可以采用此种方法.比如常<br />
用的数据库驱动程序, 写 servlet 需要的 servlet 包等等. 设置方法就是在环境变量中<br />
加入 CLASSPATH. 然后就可以直接编译运行了. 还是以 HelloWorld 为例, 比如你想在根<br />
目录中运行它, 那么你直接在根目录下执行</p>
<p>&nbsp;</p>
<p>$ java HelloWorld<br />
或者<br />
c:\&gt;java HelloWorld</p>
<p>这样肯定会出错, 如果你的 CLASSPATH 没有改动的话. 我想大家应该知道为什么错了<br />
吧, 那么怎么改呢? 前面说过, 用户类路径就是一些包含你所需要的类的目录, .jar 档案<br />
包, .zip 包. 现在没有生成包, 所以只好把 HelloWorld.class 所在的目录加到 CLASSPAT<br />
H<br />
了, 根据前面的做法, 再运行一次, 看看, 呵呵, 成功了, 换个路径, 又成功了!! 不仅仅<br />
可<br />
以直接运行其中的类, 当你要 import 其中的某些类时, 同样处理.<br />
不知道你想到没有, 随着你的系统的不断的扩充, (当然了, 都是一些需要 java 的东<br />
西)<br />
如果都加到这个环境变量里, 那这个变量会越来越臃肿, 虽然环境变量空间可以开很大, 总<br />
觉得有些不舒服. 看看下面一个方法.</p>
<p>3, 在命令行参数中指明 classpath.</p>
<p>还是和上面相同的目标, 在任何目录下执行 HelloWorld, 用这个方法怎么实现呢?</p>
<p>[/]$ java -cp /HelloWorld HelloWorld<br />
或者</p>
<p><br />
c:\&gt;java -cp c:\HelloWorld HelloWorld</p>
<p>就可以了. 这是这种方法的最简单的应用了. 当你使用了另外的包的时候, 还可以采用<br />
这<br />
种方法. 例如:</p>
<p>$ javac -classpath aPath/aPackage.jar:. myJava.java<br />
$ java -cp aPath/aPackage.jar:. myJava<br />
或者<br />
c:\&gt; javac -classpath aPath\aPackage.jar;. myJava.java<br />
c:\&gt; java -cp aPath\aPackage.jar;. myJava</p>
<p>这种方法也有一个不方便的的地方就是当第三方包所在的路径较长或者需要两个以上包<br />
的<br />
时候, 每次编译运行都要写很长, 非常不方便, 这时候可以写脚本来解决. 比如一个例子:</p>
<p>compile (文件, 权限改为可执行, 当前目录)</p>
<p>$ cat compile<br />
---------------------------<br />
#!/bin/bash</p>
<p>&nbsp;</p>
<p>javac -classpath aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJav<br />
a.java<br />
---------------------------</p>
<p>run (文件, 权限改为可执行, 当前目录)</p>
<p>$cat run<br />
---------------------------<br />
#!/bin/bash</p>
<p>java -cp aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJava<br />
---------------------------</p>
<p>或者:</p>
<p>compile.bat</p>
<p>c:\HelloWorld&gt; type compile.bat<br />
-------------------------<br />
javac -classpath aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJav<br />
a.java<br />
-------------------------</p>
<p>&nbsp;</p>
<p>run.bat</p>
<p>c:\HelloWorld&gt; type run.bat<br />
------------------------<br />
java -cp aPath\aPackage.jar:anotherPath\anotherPackage.jar:. myJava<br />
------------------------<br />
就可以了. 试试看.<br />
前面提到了扩展类, 扩展类是什么呢? java 的扩展类就是应用程序开发者用来<br />
扩展核心平台功能的 java 类的包(或者是 native code). 虚拟机能像使用系统类一<br />
样使用这些扩展类. 有人建议可以把包放入扩展目录里, 这样, CLASSPATH 也不用设了,<br />
也不用指定了, 岂不是很方便? 确实可以正确运行, 但是个人认为这样不好, 不能什么<br />
东西都往里搁, 一些标准的扩展包可以, 比如, JavaServlet, Java3D 等等. 可以提个<br />
建议, 加一个环境变量, 比如叫 JARPATH, 指定一个目录, 专门存放用户的 jar zip<br />
等包, 这个要等 SUN 公司来做了.</p>
<p><br />
windows98 下, 我原来安装的时候, 一直装不上, 总是死机, 好不容易装上了, 缺<br />
省的是不能运行正确的, 然后把 tool.jar 放入 CLASSPATH 后工作正常. 现在作测试,<br />
去掉仍然是正确的. 经过多次测试, 发现如果原来曾装过 jdk 的都很好, 没有装过的<br />
装的时候会死机, 多装几次就可以了. 如果你发现正确安装后, 不能正常工作, 就把<br />
tools.jar 加入 CLASSPATH, 试一下.</p>
<p>&nbsp;</p>
<p><br />
二, 包 (package)</p>
<p>Java 中的 "包" 是一个比较重要的概念, package 是这样定义的:</p>
<p>Definition: A package is a collection of related classes and interfaces<br />
that provides access protection and namespace management.</p>
<p>也就是: 一个包就是一些提供访问保护和命名空间管理的相关类与接口的集合.<br />
使用包的目的就是使类容易查找使用, 防止命名冲突, 以及控制访问.<br />
这里我们不讨论关于包的过多的东西, 只讨论和编译, 运行, 类路径相关的东西.<br />
至于包的其他内容, 请自己查阅相关文档.</p>
<p>简单一点来说, 包就是一个目录, 下面的子包就是子目录, 这个包里的类就是<br />
这个目录下的文件. 我们用一个例子来说明.<br />
首先建目录结构如下: PackageTest/source/, 以后根目录指的是 PackageTest<br />
目录, 我们的源程序放在 source 目录下. 源程序如下:</p>
<p>PackageTest.java</p>
<p>package pktest;</p>
<p>&nbsp;</p>
<p>import pktest.subpk.*;</p>
<p>public class PackageTest<br />
{<br />
private String value;</p>
<p>public PackageTest(String s)<br />
{<br />
value = s;<br />
}</p>
<p>public void printvalue()<br />
{<br />
System.out.println("value of PackageTest is " + value);<br />
}</p>
<p>public static void main(String[] args)<br />
{<br />
PackageTest test = new PackageTest("This is a Test Package");<br />
test.printvalue();<br />
PackageSecond second = new PackageSecond("I am in PackageTest");</p>
<p><br />
second.printvalue();<br />
PackageSub sub = new PackageSub("I am in PackageTest");<br />
sub.printvalue();<br />
System.exit(0);<br />
}<br />
}</p>
<p>PackageSecond.java</p>
<p>package pktest;</p>
<p>public class PackageSecond<br />
{<br />
private String value;</p>
<p>public PackageSecond(String s)<br />
{<br />
value = s;<br />
}</p>
<p>public void printvalue()<br />
{</p>
<p><br />
System.out.println("value of PackageSecond is " + value);<br />
}<br />
}</p>
<p>PackageSub.java</p>
<p>package pktest.subpk;</p>
<p>import pktest.*;</p>
<p>public class PackageSub<br />
{<br />
private String value;</p>
<p>public PackageSub(String s)<br />
{<br />
value = s;<br />
}</p>
<p>public void printvalue()<br />
{<br />
PackageSecond second = new PackageSecond("I am in subpackage.");</p>
<p><br />
second.printvalue();<br />
System.out.println("value of PackageSub is " + value);<br />
}</p>
<p>}</p>
<p>Main.java</p>
<p>import pktest.*;<br />
import pktest.subpk.*;</p>
<p>public class Main()<br />
{<br />
public static void main()<br />
{<br />
PackageSecond second = new PackageSecond("I am in Main");<br />
second.printvalue();<br />
PackageSub sub = new PackageSub("I am in Main");<br />
sub.printvalue();<br />
System.exit(0);<br />
}<br />
}</p>
<p>&nbsp;</p>
<p>其中, Main.java 是包之外的一个程序, 用来测试包外的程序访问包内的类,<br />
PackageTest.java 属于 pktest 这个包, 也是主程序. PackageSecond.java 也<br />
属于 pktest, PackageSub 属于 pktest 下的 subpk 包, 也就是 pktest.subpk.<br />
详细使用情况, 请参看源程序.<br />
好了, 先把源程序都放在 source 目录下, 使 source 成为当前目录, 然后编<br />
译一下, 呵呵, 出错了,</p>
<p>Main.java:1: Package pktest not found in import.<br />
import pktest.*;</p>
<p>这里涉及到类路径中包是怎么查找的, 前面我们做了一点假设: "只要包含了<br />
这个类就算找到了这个类", 现在就有问题了. 其实 jdk 的 工具 javac java<br />
javadoc 都需要查找类, 看见目录, 就认为是包的名字, 对于 import 语句来说,<br />
一个包对应一个目录. 这个例子中, import pktest.*, 我们知道类路径可以包<br />
含一个目录, 那么就以那个目录为根, 比如有个目录 /myclass, 那么就会在查找<br />
/myclass/pktest 目录及其下的类. 所有的都找遍, 如果没有就会报错. 由于现在<br />
的类路径只有当前目录, 而当前目录下没有 pktest 目录, 所以就会出错. 类路径<br />
还可以包含 .jar .zip 文件, 这些就是可以带目录的压缩包, 可以把 .jar .zip<br />
文件看做一个虚拟的目录, 然后就和目录一样对待了.<br />
好了, 应该知道怎么做了吧, 修改后的目录结构如下:</p>
<p>&nbsp;</p>
<p>PackageTest<br />
|<br />
|__source Main.java<br />
|<br />
|__pktest PackageTest.java PackageSecond.java<br />
|<br />
|__subpk PackageSub.java</p>
<p>然后重新编译, 运行, 哈哈, 通过了. 我们再来运行一下 PackageTest.</p>
<p>[source]$ java pktest/PackageTest</p>
<p>怎么又出错了?</p>
<p>Exception in thread "main" java.lang.NoClassDefFoundError: pktest/PackageTest</p>
<p>是这样的, java 所要运行的是一个类的名字, 它可不管你的类在什么地方, 就象<br />
我们前面所讨论的一样来查找这个类, 所以它把 pktest/PackageTest 看成是一个类的<br />
名字了, 当然会出错了, 应该这么做,</p>
<p>[source]$ java pktest.PackageTest</p>
<p>&nbsp;</p>
<p>大家应该明白道理吧, 我就不多说了. 注意 javac 不一样, 是可以指明源文件路径<br />
的, javac 只编译, 不运行, 查找类也只有在源文件中碰到 import 时才会做, 与源文件<br />
所在的包没有关系.<br />
似乎还又些不好的地方, 怎么生成的 .class 文件这么分散呀, 看着真别扭. 别急,<br />
javac 有一个 -d 命令行参数, 可以指定一个目录, 把生成的 .class 文件按照包给你<br />
好好地搁在这个目录里面.</p>
<p>[source]$ mkdir classes<br />
[source]$ javac -d classes pktest/PackageTest.java<br />
[source]$ javac -d classes Main.java</p>
<p>那么运行怎么运行呢?</p>
<p>[source]$ cd classes<br />
[classes]$ java pktest.PackageTest<br />
[classes]$ java Main</p>
<p>就可以了. 其实 jdk 的这一套工具小巧简单, 功能强大, 不会用或者用错其<br />
实不关工具的事, 关键是明白工具背后的一些原理和必要的知识. 集成环境是很好,<br />
但是它屏蔽了很多底层的知识, 不出错还好, 一旦出错, 如果没有这些必要的知识<br />
就很难办, 只好上 bbs 问, 别人只告诉了你解决的具体方法, 下一次遇到稍微变化<br />
一点的问题又不懂了. 所以不要拘泥于工具, java 的这一套工具组合起来使用, 中</p>
<p><br />
小型工程(五六十个类), 还是应付得下来的.</p>
<p><br />
三, jar 文件</p>
<p>以下把 .jar .zip 都看做是 .jar 文件.</p>
<p><br />
1, 从前面我们可以看出来 jar 文件在 java 中非常重要, 极大地方便了用户的<br />
使用. 我们也可以做自己的 .jar 包.<br />
还是使用前面那个例子, Main.java 是包之外的东西, 用了 pktest 包中的类,<br />
我们现在就是要把 pktest 做成一个 .jar 包, 很简单, 刚才我们已经把 pktest<br />
中的 .class 都集中起来了,</p>
<p>[classes]$ jar -cvf mypackage.jar pktest</p>
<p>就会生成 mypackage.jar 文件, 测试一下, 刚才我们生成的 Main.class 就在<br />
classes 目录下, 所以, 从前面可以知道:</p>
<p>[classes]$ java -cp mypackage.jar:. Main</p>
<p>就可以运行了.</p>
<p>&nbsp;</p>
<p>2, 如果你看过 jdk 所带的例子, 你就会知道, .jar 还可以直接运行,</p>
<p>[/demo]$ java -jar aJar.jar</p>
<p>那好, 就那我们的试一试,</p>
<p>[classes]$ java -jar mypackage.jar<br />
Failed to load Main-Class manifest attribute from<br />
mypackage.jar</p>
<p>看来我们的 jar 和它的 jar 还不一样, 有什么不一样呢? 拿它一个例子出来,<br />
重新编译, 生成 .jar 文件, 比较后发现, 是 .jar 压缩包中 META-INF/MANIFEST.MF<br />
文件不一样, 多了一行, Main-Class: xxxxx, 再看看出错信息, 原来是没有指定<br />
Main-Class, 看看 jar 命令, 发现有一个参数 -m,</p>
<p>-m include manifest information from specified manifest file</p>
<p>和出错信息有点关系, 看来它要读一个配制文件. 只好照猫画虎写一个了.</p>
<p>[classes]$ cat myManifest<br />
Manifest-Version: 1.0</p>
<p><br />
Main-Class: pktest.PackageTest<br />
Created-By: 1.2.2 (Sun Microsystems Inc.)</p>
<p>[classes]$ jar cvfm mypackage.jar myManifest pktest<br />
added manifest<br />
adding: pktest/(in = 0) (out= 0)(stored 0%)<br />
adding: pktest/PackageSecond.class(in = 659) (out= 395)(deflated 40%)<br />
adding: pktest/subpk/(in = 0) (out= 0)(stored 0%)<br />
adding: pktest/subpk/PackageSub.class(in = 744) (out= 454)(deflated 38%)<br />
adding: pktest/PackageTest.class(in = 1041) (out= 602)(deflated 42%)</p>
<p>[classes]$ java -jar mypackage.jar<br />
value of PackageTest is This is a Test Package<br />
value of PackageSecond is I am in PackageTest<br />
value of PackageSecond is I am in subpackage.<br />
value of PackageSub is I am in PackageTest</p>
<p>好了, 成功了, 这样就做好了一个可以直接执行的 .jar 文件. 大家可以自己试一试<br />
做一个以 Main 为主程序的可执行的 jar.</p>
<p><br />
小结:</p>
<p>&nbsp;</p>
<p>这篇文章中, 我们讨论了 java 中的 class path, package, jar 等基本但比较<br />
重要的东西, 主要是 class path. 并不是简单的一份 CLASSPATH 的完全功略, 而是<br />
试图让读者明白其原理, 自己思考, 自己动手. 其实大多数东西都在 sun 的 java doc<br />
中都有, 我只不过结合例子稍微谈了一下, 希望能有所帮助. 由于条件所限, 只测试了<br />
jdk1.2.2 在 98 及 linux 的情况, 其他版本的 jdk 和平台请大家自己测试, 错误在<br />
所难免, 还请指正.</p>
<p>下面是一些需要注意的问题:</p>
<p>1, 如果类路径中需要用到 .jar 文件, 必须把 jar 文件的文件名放入类路径, 而不是<br />
其所在的目录.<br />
2, 在任何时候, 类名必须带有完全的包名,<br />
3, "." 当前目录最好在你的类路径中.</p>
<p>下面是一些常见的编译和运行的模式.</p>
<p>4. To compile HelloWorld.java app in the default package in C:\MyDir, use<br />
CD \MyDir<br />
C:\jdk1.3\bin\Javac.exe -classpath . HelloWorld.java<br />
5. To run a HelloWorld.class app, in the default package in C:\MyDir, use<br />
CD \MyDir</p>
<p><br />
C:\jdk1.3\bin\Java.exe -classpath . HelloWorld<br />
6. To run a HelloWorld.class app, in the default package in a jar in C:\MyDir, u<br />
se<br />
CD \MyDir<br />
C:\jdk1.3\bin\Java.exe -classpath HelloWorld.jar HelloWorld<br />
7. To compile a HelloWorld.java app in C:\MyPackage, in package MyPackage, use<br />
CD \<br />
C:\jdk1.3\bin\Javac.exe -classpath . MyPackage\HelloWorld.java<br />
8. To run a HelloWorld.class app in C:\MyPackage, in package MyPackage, use<br />
CD \<br />
C:\jdk1.3\bin\Java.exe -classpath . MyPackage.HelloWorld<br />
9. To run a HelloWorld.class app in C:\MyPackage, in a jar in package MyPackage,<br />
use<br />
CD \MyDir<br />
C:\jdk1.3\bin\Java.exe -classpath HelloWorld.jar MyPackage.HelloWorl<br />
d</p>
<p>(注: default package 指的是在程序中不指定任何包).</p>
<p>最后一个小小的建议, 把 sun 的 jdk tools document．tion 好好地看一看,<br />
把 jdk 的那些工具 java javac javadoc jar javap jdb......好好用一用, 会<br />
有好处的. The Simplest Is The Best.</p>
<p>&nbsp;</p>
<p>&nbsp;2.如何一次把一个目录下的所有.jar加入到classpath?</p>
<p>tomcat的做法<br />
//tomcat.bat<br />
...<br />
set _LIBJARS=<br />
for %%i in (%TOMCAT_HOME%\lib\*.jar) do call<br />
%TOMCAT_HOME%\bin\cpappend.bat %%i<br />
...</p>
<p>//cpappend.bat<br />
set _LIBJARS=%_LIBJARS%;%1 <br />
&nbsp;</p>
<p>&nbsp;</p>
<p>3.classspath 的默认值是什么?</p>
<p>在 JDK 1.2 中，有三个搜索路径用于查找类：<br />
1) java 搜索类的第一个位置是自举类路径。<br />
可通过调用 System.getProperty("sun.boot.class.path") 检查该路径的值。<br />
注意，其中前缀&#8220;sun.&#8221;显示至少到现在为止，该属性是特定于 Sun 公司的实现。<br />
2) java 查找类的第二个位置是扩展目录。<br />
可通过调用 System.getProperty("java.ext.dirs") 检查目录列表。<br />
3) java 查找类的第三个位置是应用程序类路径。<br />
可通过调用 System.getProperty("java.class.path") 检查该路径的值。</p>
<p>you can get:</p>
<p>1) java_base\jre\lib\rt.jar<br />
java_base\jre\lib\i18n.jar<br />
java_base\jre\classes<br />
2) java_base\jre\lib\ext</p>
<p><br />
4.怎样找到程序运行需要的类?</p>
<p>编译的时候用选项 javac -verbose ********<br />
可以看你的程序都用到了类库中的哪些类 .</p>
<p>java -verbose<br />
javac -verbose <br />
是jdk很好的调试功能</p>
<p><br />
5. Linux下Path和ClassPath是怎么设的?<br />
修改文件 /etc/profile<br />
CLASSPATH = pathAathBathC<br />
export CLASSPATH</p>
<p>JAVA_HOME类似<br />
和windows下设置的主要区别应该在分隔符上</p>
<p><br />
6.如何修改path和classpath?</p>
<p>方法一：用cmd进入控制台，输入set命令，你会看到你机子上的所有环境变量的名称和值！<br />
然后你再输入set classpath=你要设的目录。就可以了！！！<br />
方法二：<br />
2000,控制面板-》系统-》高级-》环境变量-》系统变量，如果没有CLASSPATH变量就自己新建<br />
一个<br />
xp:<br />
开始-&gt; 我的电脑-&gt;属性-&gt;高级－＞环境变量-&gt;新建<br />
JAVA_HOME<br />
CLASSPATH<br />
PATH</p>
<p>&nbsp;</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/yicikou/archive/2004/06/28/28715.aspx</p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/292849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-08-27 17:07 <a href="http://www.blogjava.net/caizh2009/articles/292849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java学习从入门到精通</title><link>http://www.blogjava.net/caizh2009/articles/290020.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Thu, 06 Aug 2009 00:38:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/290020.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/290020.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/290020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/290020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/290020.html</trackback:ping><description><![CDATA[<table id="forum_main" cellspacing="1">
    <tbody id="posts">
        <tr id="102">
            <td class="postcontent">
            <div class="postbody clearfix">Java Learning Path （一）、工具篇 <br />
            <br />
            <br />
            一、 JDK (Java Development Kit) <br />
            <br />
            JDK是整个Java的核心，包括了Java运行环境（Java Runtime Envirnment），一堆Java工具和Java基础的类库(rt.jar)。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。最主流的JDK是Sun公司发布的JDK，除了Sun之外，还有很多公司和组织都开发了自己的JDK，例如IBM公司开发的JDK，BEA公司的Jrocket，还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM（Java Virtual Machine）运行效率要比Sun JDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比Sun JDK好很多。但不管怎么说，我们还是需要先把Sun JDK掌握好。 <br />
            <br />
            1、 JDK的下载和安装 <br />
            JDK又叫做J2SE（Java2 SDK Standard Edition），可以从Sun的Java网站上下载到，http://java.sun.com/j2se/downloads.html ，JDK当前最新的版本是J2SDK1.4.2，建议下载该版本的JDK，下载页面在这里：http://java.sun.com/j2se/1.4.2/download.html。 <br />
            <br />
            下载好的JDK是一个可执行安装程序，默认安装完毕后会在C:\Program Files\Java\目录下安装一套JRE（供浏览器来使用），在C:\j2sdk1.4.2下安装一套JDK（也包括一套JRE）。然后我们需要在环境变量PATH的最前面增加java的路径C:\j2sdk1.4.2\bin。这样JDK就安装好了。 <br />
            <br />
            2、 JDK的命令工具 <br />
            JDK的最重要命令行工具： <br />
            java： 启动JVM执行class <br />
            javac： Java编译器 <br />
            jar： Java打包工具 <br />
            javadoc： Java文档生成器 <br />
            这些命令行必须要非常非常熟悉，对于每个参数都要很精通才行。对于这些命令的学习，JDK Documentation上有详细的文档。 <br />
            <br />
            <br />
            二、 JDK Documentation <br />
            <br />
            Documentation在JDK的下载页面也有下载连接，建议同时下载Documentation。Documentation是最最重要的编程手册，涵盖了整个Java所有方面的内容的描述。可以这样说，学习Java编程，大部分时间都是花在看这个Documentation上面的。我是随身携带的，写Java代码的时候，随时查看，须臾不离手。 <br />
            <br />
            <br />
            三、 应用服务器(App Server) <br />
            <br />
            App Server是运行Java企业组件的平台，构成了应用软件的主要运行环境。当前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免费的Jboss，选择其中一个进行学习就可以了，个人推荐Weblogic，因为它的体系结构更加干净，开发和部署更加方便，是Java企业软件开发人员首选的开发平台。下面简要介绍几种常用的App Server： <br />
            <br />
            1、 Tomcat <br />
            Tomcat严格意义上并不是一个真正的App Server，它只是一个可以支持运行Serlvet/JSP的Web容器，不过Tomcat也扩展了一些App Server的功能，如JNDI，数据库连接池，用户事务处理等等。Tomcat被非常广泛的应用在中小规模的Java Web应用中，因此本文做一点下载、安装和配置Tomcat的介绍： <br />
            <br />
            Tomcat是Apache组织下Jakarta项目下的一个子项目，它的主网站是：http://jakarta.apache.org/tomcat/ ，Tomcat最新版本是Tomcat4.1.27，软件下载的连接是：http://www.apache.org/dist/jakarta/tomcat-4/binaries/ 。 <br />
            <br />
            下载Tomcat既可以直接下载zip包，也可以下载exe安装包（个人建议zip更干净些），不管哪种情况，下载完毕安装好以后（zip直接解压缩就可以了）。需要设置两个环境变量： <br />
            <br />
            JAVA_HOME=C:\j2sdk1.4.2 <br />
            CATALINA_HOME=D:\tomcat4 (你的Tomcat安装目录) <br />
            <br />
            这样就安装好了，启动Tomcat运行CATALINA_HOME\bin\startup.bat，关闭Tomcat运行shutdown.bat脚本。Tomcat启动以后，默认使用8080端口，因此可以用浏览器访问http://localhost:8080来测试Tomcat是否正常启动。 <br />
            <br />
            Tomcat提供了两个Web界面的管理工具，URL分别是： <br />
            http://localhost:8080/admin/index.jsp <br />
            http://localhost:8080/manager/html <br />
            在启用这两个管理工具之前，先需要手工配置一下管理员用户和口令。用一个文本工具打开CATALINA_HOME\conf\tomcat-users.xml这个文件，加入如下几行： <br />
            <br />
            &nbsp; &amp;lt;role rolename="manager"/&amp;gt; <br />
            &nbsp; &amp;lt;role rolename="admin"/&amp;gt; <br />
            &nbsp; &amp;lt;user username="robbin" password="12345678" roles="admin,manager,tomcat"/&amp;gt; <br />
            <br />
            这样用户&#8220;robbin&#8221;就具备了超级管理员权限。重新启动Tomcat以后，你就可以使用该用户来登陆如上的两个管理工具，通过Web方式进行Tomcat的配置和管理了。 <br />
            <br />
            2、 BEA Weblogic <br />
            Weblogic可以到BEA的网站上免费注册之后下载到最新的Weblogic8.1企业版，License可以免费使用1年时间，其实这已经完全足够了。Weblogic的下载连接：http://commerce.bea.com/index.jsp，Weblogic的在线文档：http://edocs.bea.com/ 。 <br />
            <br />
            3、 IBM Webshpere <br />
            Websphere同样可以下载到免费的试用版本，到IBM的developerWorks网站可以看到Websphere试用产品的下载和相关的Websphere的资料，developerWorks中文网站的连接是：http://www-900.ibm.com/developerWorks/cn/wsdd/ ，Websphere的下载连接：http://www7b.software.ibm.com/wsdd/downloads/WASsupport.html 。 <br />
            <br />
            4、 Jboss <br />
            Jboss是免费开源的App Server，可以免费的从Jboss网站下载：http://www.jboss.org/index.html，然而Jboss的文档是不免费，需要花钱购买，所以为我们学习Jboss设置了一定的障碍。在Jdon上有几篇不错的Jboss配置文档，可以用来参考：http://www.jdon.com/idea.html <br />
            <br />
            <br />
            四、 Java应用的运行环境 <br />
            <br />
            Java的应用可以简单分为以下几个方面： <br />
            <br />
            1、 Java的桌面应用 <br />
            桌面应用一般仅仅需要JRE的支持就足够了。 <br />
            <br />
            2、 Java Web应用 <br />
            Java的Web应用至少需要安装JDK和一个web容器（例如Tomcat），以及一个多用户数据库，Web应用至少分为三层： <br />
            Browser层：浏览器显示用户页面 <br />
            Web层：运行Servlet/JSP <br />
            DB层：后端数据库，向Java程序提供数据访问服务 <br />
            <br />
            3、 Java企业级应用 <br />
            企业级应用比较复杂，可以扩展到n层，最简单情况会分为4层： <br />
            Browser层：浏览器显示用户页面 <br />
            Client层：Java客户端图形程序（或者嵌入式设备的程序）直接和Web层或者EJB层交互 <br />
            Web层：运行Servlet/JSP <br />
            EJB层：运行EJB，完成业务逻辑运算 <br />
            DB层：后端数据库，向Java程序提供数据访问服务 <br />
            <br />
            4、 Java嵌入式应用 <br />
            Java嵌入式应用是一个方兴未艾的领域，从事嵌入式开发，需要从Sun下载J2ME开发包，J2ME包含了嵌入式设备专用虚拟机KVM，和普通的JDK中包含的JVM有所不同。另外还需要到特定的嵌入式厂商那里下载模拟器。 <br />
            <br />
            <br />
            Java Learning Path（二）、书籍篇 <br />
            <br />
            学习一门新的知识，不可能指望只看一本，或者两本书就能够完全掌握。需要有一个循序渐进的阅读过程。我推荐Oreilly出版的Java系列书籍。 <br />
            <br />
            在这里我只想补充一点看法，很多人学习Java是从《Thinking in Java》这本书入手的，但是我认为这本书是不适合初学者的。我认为正确的使用这本书的方法应该是作为辅助的读物。《Thinking in Java》并不是在完整的介绍Java的整个体系，而是一种跳跃式的写作方法，是一种类似tips的方法来对Java很多知识点进行了深入的分析和解释。 <br />
            <br />
            对于初学者来说，最好是找一本Java入门的书籍，但是比较完整的循序的介绍Java的语法，面向对象的特性，核心类库等等，在看这本书的同时，可以同步来看《Thinking in Java》，来加深对Java的理解和原理的运用，同时又可以完整的了解Java的整个体系。 <br />
            <br />
            对于Java的入门书籍，蔡学镛推荐的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition（针对C++背景）》，我并没有看过这两本书。其实我觉得电子工业出版社的《Java 2编程详解》或者《Java 2从入门到精通》就很不错。 <br />
            <br />
            在所有的Java书籍当中，其实最最有用的，并不是O'reilly的 Java Serials，真正最最有用处是JDK的Documentation！几乎你想获得的所有的知识在Documentation里面全部都有，其中最主要的部分当然是Java基础类库的API文档，是按照package来组织的，对于每一个class都有详细的解释，它的继承关系，是否实现了某个接口，通常用在哪些场合，还可以查到它所有的public的属性和方法，每个属性的解释，意义，每个方法的用途，调用的参数，参数的意义，返回值的类型，以及方法可能抛出的异常等等。可以这样来说，所有关于Java编程方面的书籍其实都不过是在用比较通俗易懂的语言，和良好的组织方式来介绍Documentation里面的某个package里面包含的一些类的用法而已。所以万变不离其宗，如果你有足够的能力来直接通过Documentation来学习Java的类库，那么基本上就不需要看其他的书籍了。除此之外，Documentation也是编程必备的手册，我的桌面上有三个Documentation的快捷方式，分别是J2SDK1.4.1的Documentation，Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了这个三个Documentation，什么其他的书籍都不需要了。 <br />
            <br />
            对于Java Web 编程来说，最核心的是要熟悉和掌握HTTP协议，这个就和Java无关了，在熟悉HTTP协议之后，就需要熟悉Java的实现HTTP协议的类库，也就是Servlet API，所以最重要的东西就是Servlet API。当然对于初学者而言，直接通过Servlet API来学习Web编程有很大的难度，我推荐O'reilly的《Java Server Pages 》这本书来学习Web 编程。 <br />
            <br />
            EJB的书籍当中，《Enterprise JavaBeans, 2nd Edition》是一本很不错的书， EJB的学习门槛是比较高，入门很难，但是这本书完全降低了学习的难度，特别重要的一点是，EJB的学习需要结合一种App Server的具体实现，所以在学习EJB的同时，必须同步的学习某种App Server，而这本书相关的出了三本书，分别是Weblogic6.1，Websphere4.0和JBoss3.0上面部署书中例子的实做。真是既有理论，又有实践。在学习EJB的同时，可以边看边做，EJB的学习会变得很轻松。 <br />
            <br />
            但是这本书也有一个问题，就是版本比较旧，主要讲EJB1.1规范和部分EJB2.0的规范。而Ed Roman写的《Mastering EJB 2.0》这本书完全是根据EJB2.0规范写的，深入浅出，覆盖了EJB编程的各个方面，并且还有很多编程经验tips，也是学习EJB非常推荐的书籍之一。 <br />
            <br />
            如果是结合Weblogic来学习J2EE的话，《J2EE应用与BEA Weblogic Server》绝对是首选读物，虽然是讲述的Weblogic6.0，仍然值得购买，这本书是BEA官方推荐的教材，作者也是BEA公司的工程师。现在中文版已经随处可见了。这本书结合Weblogic介绍了J2EE各个方面的技术在Weblogic平台上的开发和部署，实践指导意义非常强。 <br />
            <br />
            在掌握了Java平台基础知识和J2EE方面的知识以后，更进一步的是学习如何运用OO的方法进行软件的设计，那么就一定要学习&#8220;设计模式&#8221;。Sun公司出版了一本《J2EE核心模式》，是每个开发Java企业平台软件的架构师必备的书籍。这本书全面的介绍了J2EE体系架构的各种设计模式，是设计师的必读书籍。 <br />
            <br />
            Java Learning Path（三）过程篇 <br />
            <br />
            每个人的学习方法是不同的，一个人的方法不见得适合另一个人，我只能是谈自己的学习方法。因为我学习Java是完全自学的，从来没有问过别人，所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法，只能给大家提供一点参考了。 <br />
            <br />
            学习Java的第一步是安装好JDK，写一个Hello World，&#61514; 其实JDK的学习没有那么简单，关于JDK有两个问题是很容易一直困扰Java程序员的地方：一个是CLASSPATH的问题，其实从原理上来说，是要搞清楚JRE的ClassLoader是如何加载Class的；另一个问题是package和import问题，如何来寻找类的路径问题。把这两个问题摸索清楚了，就扫除了学习Java和使用JDK的最大障碍。推荐看一下王森的《Java深度历险》，对这两个问题进行了深入的探讨。 <br />
            <br />
            第二步是学习Java的语法。Java的语法是类C++的，基本上主流的编程语言不是类C，就是类C++的，没有什么新东西，所以语法的学习，大概就是半天的时间足够了。唯一需要注意的是有几个不容易搞清楚的关键字的用法，public，protected，private，static，什么时候用，为什么要用，怎么用，这可能需要有人来指点一下，我当初是完全自己琢磨出来的，花了很久的时间。不过后来我看到《Thinking in Java》这本书上面是讲了这些概念的。 <br />
            <br />
            第三步是学习Java的面向对象的编程语言的特性的地方。比如继承，构造器，抽象类，接口，方法的多态，重载，覆盖，Java的异常处理机制。对于一个没有面向对象语言背景的人来说，我觉得这个过程需要花很长很长时间，因为学习Java之前没有C++的经验，只有C的经验，我是大概花了一个月左右吧，才彻底把这些概念都搞清楚，把书上面的例子反复的揣摩，修改，尝试，把那几章内容反复的看过来，看过去，看了不下5遍，才彻底领悟了。不过我想如果有C++经验的话，应该一两天时间足够了。那么在这个过程中，可以多看看《Thinking in Java》这本书，对面向对象的讲解非常透彻。可惜的是我学习的时候，并没有看到这本书，所以自己花了大量的时间，通过自己的尝试和揣摩来学会的。 <br />
            <br />
            第四步就是开始熟悉Java的类库。Java的基础类库其实就是JDK安装目录下面jre\lib\rt.jar这个包。学习基础类库就是学习rt.jar。基础类库里面的类非常非常多。据说有3000多个，我没有统计过。但是真正对于我们来说最核心的只有4个，分别是 <br />
            java.lang.*; <br />
            java.io.*; <br />
            java.util.*; <br />
            java.sql.*; <br />
            <br />
            这四个包的学习，每个包的学习都可以写成一本厚厚的教材，而O'reilly也确实是这样做的。我觉得如果时间比较紧，是不可能通过读四本书来学习。我觉得比较好的学习方法是这样的： <br />
            首先要通读整个package的框架，了解整个package的class，interface，exception的构成，最好是能够找到介绍整个包框架的文章。这些专门介绍包的书籍的前几章应该就是这些总体的框架内容介绍。 <br />
            <br />
            对包整体框架的把握并不是要熟悉每个类的用法，记住它有哪些属性，方法。想记也记不住的。而是要知道包有哪些方面的类构成的，这些类的用途是什么，最核心的几个类分别是完成什么功能的。我在给人培训的时候一般是一次课讲一个包，所以不可能详细的介绍每个类的用法，但是我反复强调，我给你们讲这些包的不是要告诉你们类的方法是怎么调用的，也不要求你们记住类的方法调用，而是要你们了解，Java给我们提供了哪些类，每个类是用在什么场合，当我遇到问题的时候，我知道哪个类，或者哪几个类的组合可以解决我的问题，That'all！，当我们具体写程序的时候，只要你知道该用哪个类来完成你的工作就足够了。编码的时候，具体的方法调用，是边写代码，边查Documentation，所有的东西都在Documentation里面，不要求你一定记住，实际你也记不住3000多个类的总共将近10万个方法调用。所以对每个包的总体框架的把握就变得极为重要。 <br />
            <br />
            第五步，通过上面的学习，如果学的比较扎实的话，就打好了Java的基础了，剩下要做的工作是扫清Documentation里面除了上面4个包之外的其他一些比较有用处的类。相信进展到这一步，Java的自学能力已经被培养出来了，可以到了直接学习Documentation的水平了。除了要做GUI编程之外，JDK里面其他会有用处的包是这些： <br />
            java.text.*; <br />
            java.net.*; <br />
            javax.naming.*; <br />
            这些包里面真正用的比较多的类其实很少，只有几个，所以不需要花很多时间。 <br />
            <br />
            第六步，Java Web 编程 <br />
            Web编程的核心是HTTP协议，HTTP协议和Java无关，如果不熟悉HTTP协议的话，虽然也可以学好Servlet/JSP编程，但是达不到举一反三，一通百通的境界。所以HTTP协议的学习是必备的。如果熟悉了HTTP协议的话，又有了Java编程的良好的基础，学习Servlet/JSP简直易如反掌，我学习Servlet/JSP就用了不到一周的时间，然后就开始用JSP来做项目了。 <br />
            <br />
            在Servlet/JSP的学习中，重头仍然是Servlet Documentation。Servlet API最常用的类很少，花比较少的时间就可以掌握了。把这些类都看一遍，多写几个例子试试。Servlet/JSP编程本质就是在反复调用这些类来通过HTTP协议在Web Server和Brower之间交谈。另外对JSP，还需要熟悉几个常用JSP的标记，具体的写法记不住的话，临时查就是了。 <br />
            <br />
            此外Java Web编程学习的重点要放在Web Application的设计模式上，如何进行业务逻辑的分析，并且进行合理的设计，按照MVC设计模式的要求，运用Servlet和JSP分别完成不同的逻辑层，掌握如何在Servlet和JSP之间进行流程的控制和数据的共享，以及Web Application应该如何配置和部署。 <br />
            <br />
            第七步，J2EE编程 <br />
            以上的学习过程如果是比较顺利的话，进行到这一步，难度又陡然提高。因为上面的知识内容都是只涉及一个方面，而像EJB，JMS，JTA等核心的J2EE规范往往是几种Java技术的综合运用的结晶，所以掌握起来难度比较大。 <br />
            <br />
            首先一定要学习好JNDI，JNDI是App Server定位服务器资源（EJB组件，Datasouce，JMS）查找方法，如果对JNDI不熟悉的话，EJB，JMS这些东西几乎学不下去。JNDI其实就是javax.naming.*这个包，运用起来很简单。难点在于服务器资源文件的配置。对于服务器资源文件的配置，就需要看看专门的文档规范了，比如web.xml的写法，ejb-jar.xml的写法等等。针对每种不同的App Server，还有自己的服务资源配置文件，也是需要熟悉的。 <br />
            <br />
            然后可以学习JTA，主要是要理解JTA对于事务的控制的方法，以及该在什么场合使用JTA。这里可以简单的举个例子，我们知道一般情况可以对于一个数据库连接进行事务控制(conn.setAutoCommit(false),....,conn.commit())，做为一个原子操作，但是假设我的业务需求是要把对两个不同数据库的操作做为一个原子操作，你能做的到吗？这时候只能用JTA了。假设操作过程是先往A数据库插一条记录，然后删除B数据库另一个记录，我们自己写代码是控制不了把整个操作做为一个原子操作的。用JTA的话，由App Server来完成控制。 <br />
            <br />
            在学习EJB之前要学习对象序列化和RMI，RMI是EJB的基础。接着学习JMS和EJB，对于EJB来说，最关键是要理解EJB是如何通过RMI来实现对远端对象的调用的，以及在什么情况下要用到EJB。 <br />
            <br />
            在学习完EJB，JMS这些东西之后，你可能会意识到要急不可待学习两个领域的知识，一个是UML，另一个是Design Pattern。Java企业软件的设计非常重视框架(Framework)的设计，一个好的软件框架是软件开发成功的必要条件。在这个时候，应该开始把学习的重点放在设计模式和框架的学习上，通过学习和实际的编程经验来掌握EJB的设计模式和J2EE的核心模式。 <br />
            <br />
            J2EE规范里面，除了EJB，JMS，JTA，Servlet/JSP，JDBC之外还有很多很多的企业技术，这里不一一进行介绍了。 <br />
            <br />
            另外还有一个最新领域Web Services。Web Services也完全没有任何新东西，它像是一种黏合剂，可以把不同的服务统一起来提供一个统一的调用接口，作为使用者来说，我只要获得服务提供者给我的WSDL（对服务的描述），就够了，我完全不知道服务器提供者提供的服务究竟是EJB组件，还是.Net组件，还是什么CORBA组件，还是其他的什么实现，我也不需要知道。Web Services最伟大的地方就在于通过统一的服务提供方式和调用方式，实现了整个Internet服务的共享，是一个非常令人激动的技术领域。Web Services好像目前还没有什么很好的书籍，但是可以通过在网络上面查资料的方式来学习。 <br />
            <br />
            Java Learning Path（四） 方法篇 <br />
            <br />
            Java作为一门编程语言，最好的学习方法就是写代码。当你学习一个类以后，你就可以自己写个简单的例子程序来运行一下，看看有什么结果，然后再多调用几个类的方法，看看运行结果，这样非常直观的把类给学会了，而且记忆非常深刻。然后不应该满足把代码调通，你应该想想看如果我不这样写，换个方式，再试试行不行。记得哪个高人说过学习编程就是个破坏的过程，把书上的例子，自己学习Documentation编写的例子在运行通过以后，不断的尝试着用不同的方法实现，不断的尝试破坏代码的结构，看看它会有什么结果。通过这样的方式，你会很彻底的很精通的掌握Java。 <br />
            <br />
            举个例子，我们都编过Hello World <br />
            <br />
            public class HelloWorld { <br />
            &nbsp; public static void main(String[] args) { <br />
            &nbsp;&nbsp;&nbsp; System.out.println("Hello World"); <br />
            &nbsp; } <br />
            } <br />
            <br />
            很多初学者不是很理解为什么main方法一定要这样来定义public static void main(String[] args)，能不能不这样写？包括我刚学习Java的时候也有这样的疑问。想知道答案吗？很简单，你把main改个名字运行一下，看看报什么错误，然后根据出错信息进行分析；把main的public取掉，在试试看，报什么错误；static去掉还能不能运行；不知道main方法是否一定要传一个String[]数组的，把String[]改掉，改成int[]，或者String试试看；不知道是否必须写args参数名称的，也可以把args改成别的名字，看看运行结果如何。 <br />
            <br />
            我当初学习Java的时候就是这样做的，把Hello World程序反复改了七八次，不断运行，分析运行结果，最后就彻底明白为什么了main方法是这样定义的了。 <br />
            <br />
            此外，我对于staic，public，private，Exception，try{ }catch {}finally{}等等等等一开始都不是很懂，都是把参考书上面的例子运行成功，然后就开始破坏它，不断的根据自己心里面的疑问来重新改写程序，看看能不能运行，运行出来是个什么样子，是否可以得到预期的结果。这样虽然比较费时间，不过一个例子程序这样反复破坏几次之后。我就对这个相关的知识彻底学通了。有时候甚至故意写一些错误的代码来运行，看看能否得到预期的运行错误。这样对于编程的掌握是及其深刻的。 <br />
            <br />
            其中特别值得一提的是JDK有一个非常棒的调试功能，-verbose <br />
            java &#8211;verbose <br />
            javac &#8211;verbose 以及其它很多JDK工具都有这个选项 <br />
            -verbose 可以显示在命令执行的过程中，JVM都依次加载哪里Class，通过这些宝贵的调试信息，可以帮助我们分析出JVM在执行的过程中都干了些什么。 <br />
            <br />
            另外，自己在学习过程中，写的很多的这种破坏例程，应该有意识的分门别类的保存下来，在工作中积累的典型例程也应该定期整理，日积月累，自己就有了一个代码库了。遇到类似的问题，到代码库里面 Copy &amp; Paste ，Search &amp; Replace，就好了，极大提高了开发速度。最理想的情况是把一些通用的例程自己再抽象一层，形成一个通用的类库，封装好。那么可复用性就更强了。 <br />
            <br />
            所以我觉得其实不是特别需要例程的，自己写的破坏例程就是最好的例子，如果你实在对自己写的代码不放心的话，我强烈推荐你看看JDK基础类库的Java源代码。在JDK安装目录下面会有一个src.zip，解开来就可以完整的看到整个JDK基础类库，也就是rt.jar的Java源代码，你可以参考一下Sun是怎么写Java程序的，规范是什么样子的。我自己在学习Java的类库的时候，当有些地方理解的不是很清楚的时候，或者想更加清晰的理解运作的细节的时候，往往会打开相应的类的源代码，通过看源代码，所有的问题都会一扫而空。 <br />
            <br />
            Java Learning Path（五）资源篇 <br />
            <br />
            1、 http://java.sun.com/ (英文) <br />
            Sun的Java网站，是一个应该经常去看的地方。不用多说。 <br />
            <br />
            2、http://www-900.ibm.com/developerWorks/cn/ <br />
            IBM的developerWorks网站，英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站，也是Web Services，Java，Linux极好的网站。强烈推荐！！！ <br />
            <br />
            3、http://www.javaworld.com/ (英文) <br />
            关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用，这里比较好。 <br />
            <br />
            4、http://dev2dev.bea.com.cn/index.jsp <br />
            BEA的开发者园地，BEA作为最重要的App Server厂商，有很多独到的技术，在Weblogic上做开发的朋友不容错过。 <br />
            <br />
            5、http://www.huihoo.com/&nbsp; <br />
            灰狐动力网站，一个专业的中间件网站，虽然不是专业的Java网站，但是在J2EE企业应用技术方面有深厚的造诣。 <br />
            <br />
            6、http://www.theserverside.com/home/ (英文) <br />
            TheServerSide是一个著名的专门面向Java Server端应用的网站。 <br />
            <br />
            7、http://www.javaresearch.org/ <br />
            Java研究组织，有很多优秀的Java方面的文章和教程，特别是在JDO方面的文章比较丰富。 <br />
            <br />
            8、http://www.cnjsp.org/ <br />
            JSP技术网站，有相当多的Java方面的文章和资源。 <br />
            <br />
            9、http://www.jdon.com/ <br />
            Jdon论坛，是一个个人性质的中文J2EE专业技术论坛，在众多的Java的中文论坛中，Jdon一个是技术含量非常高，帖子质量非常好的论坛。 <br />
            <br />
            10、http://sourceforge.net/ <br />
            SourgeForge是一个开放源代码软件的大本营，其中也有非常非常丰富的Java的开放源代码的著名的软件。 </div>
            <div id="topic_copyright">声明：JavaEye文章版权属于作者，受法律保护。没有作者书面许可不得转载。 </div>
            <div id="forum_advert_f5"><span>推荐链接</span>
            <ul class="adverts">
                <li><a href="http://www.javaeye.com/adverts/170" target="_blank"><span style="font-weight: bold; color: blue">【8月推荐】JAVA技术沙龙活动通知--欢迎并期待您的参与!</span></a></li>
            </ul>
            </div>
            </td>
        </tr>
        <tr>
            <td class="postauthor"><a href="http://www.javaeye.com/topic/37#">返回顶楼</a></td>
            <td class="postcontent">
            <div class="icons"><a class="icon_www" title="浏览作者的博客" href="http://robbin.javaeye.com/">&nbsp;</a> <a class="icon_profile" title="浏览作者资料" href="http://robbin.javaeye.com/blog/profile">&nbsp;</a> <a class="icon_pm" title="发送站内短信" href="http://app.javaeye.com/messages/new?message%5Breceiver_name%5D=robbin">&nbsp;</a> <a class="icon_guestbook" title="给作者留言" href="http://robbin.javaeye.com/blog/guest_book">&nbsp;</a> </div>
            </td>
        </tr>
        <tr class="sep2">
            <td colspan="2"></td>
        </tr>
        <tr id="2957">
            <td class="postauthor">
            <ul>
                <li class="name">Arbow
                <li>等级: <img title="五星会员" alt="五星会员" src="http://www.javaeye.com/images/star5.gif" />
                <li><a href="http://arbow.javaeye.com/" target="_blank"><img class="logo" title="Arbow的博客: Arbow@JavaEye，技术流水账" alt="Arbow的博客" src="http://www.javaeye.com/upload/logo/user/16301/d94f7ba5-70ca-31e1-bd44-69ed147762ea.jpg?1236832337" /></a>
                <li>文章: 133
                <li>积分: 561
                <li>来自: 广州
                <li><img src="http://www.javaeye.com/images/status/offline.gif"  alt="" /> </li>
            </ul>
            </td>
            <td class="postcontent">
            <div class="postactions">
            <div class="description">发表时间：2003-10-04 </div>
            <div class="links"><a title="Arbow回帖:Java学习从入门到精通" href="http://www.javaeye.com/topic/37#2957">回帖地址</a> <a class="favorite" href="http://app.javaeye.com/links?user_favorite%5Btitle%5D=Arbow%E5%9B%9E%E8%B4%B4%3AJava%E5%AD%A6%E4%B9%A0%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A&amp;user_favorite%5Burl%5D=http%3A%2F%2Fwww.javaeye.com%2Ftopic%2F37%232957" target="_blank">收藏</a> </div>
            </div>
            <div class="postbody clearfix">感谢高手们分享经验：） </div>
            </td>
        </tr>
        <tr>
            <td class="postauthor"><a href="http://www.javaeye.com/topic/37#">返回顶楼</a></td>
            <td class="postcontent">
            <div class="icons"><a class="icon_www" title="浏览作者的博客" href="http://arbow.javaeye.com/">&nbsp;</a> <a class="icon_profile" title="浏览作者资料" href="http://arbow.javaeye.com/blog/profile">&nbsp;</a> <a class="icon_pm" title="发送站内短信" href="http://app.javaeye.com/messages/new?message%5Breceiver_name%5D=Arbow">&nbsp;</a> <a class="icon_guestbook" title="给作者留言" href="http://arbow.javaeye.com/blog/guest_book">&nbsp;</a> </div>
            <div class="post_rate_box" id="post_rate_box_2957"><a class="good" title="好" onclick='rate_post(2957, "good"); return false;' href="http://www.javaeye.com/topic/37#">0</a> <a class="hidden" title="差" onclick='rate_post(2957, "hidden"); return false;' href="http://www.javaeye.com/topic/37#">1</a> </div>
            </td>
        </tr>
        <tr class="sep2">
            <td colspan="2"></td>
        </tr>
        <tr id="3676">
            <td class="postauthor">
            <ul>
                <li class="name">空心菜
                <li>等级: <img title="五星会员" alt="五星会员" src="http://www.javaeye.com/images/star5.gif" />
                <li><a href="http://solerun.javaeye.com/" target="_blank"><img class="logo" title="空心菜的博客: 空心菜" alt="空心菜的博客" src="http://www.javaeye.com/upload/logo/user/245/0f761f8d-36a9-4599-a4fa-07d0092127f1.gif?1236831845" /></a>
                <li>文章: 38
                <li>积分: 785
                <li><img src="http://www.javaeye.com/images/status/offline.gif"  alt="" /> </li>
            </ul>
            </td>
            <td class="postcontent">
            <div class="postactions">
            <div class="description">发表时间：2003-10-15 </div>
            <div class="links"><a title="空心菜回帖:Java学习从入门到精通" href="http://www.javaeye.com/topic/37#3676">回帖地址</a> <a class="favorite" href="http://app.javaeye.com/links?user_favorite%5Btitle%5D=%E7%A9%BA%E5%BF%83%E8%8F%9C%E5%9B%9E%E8%B4%B4%3AJava%E5%AD%A6%E4%B9%A0%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A&amp;user_favorite%5Burl%5D=http%3A%2F%2Fwww.javaeye.com%2Ftopic%2F37%233676" target="_blank">收藏</a> </div>
            </div>
            <div class="postbody clearfix">如何迅速成为Java高手[Tomjava原创]&nbsp; <br />
            很多网友问我学习Java有没有什么捷径,我说&#8220;无他，唯手熟尔&#8221;。但是我却很愿意将自己学习的一些经验写出来，以便后来者少走弯路,帮助别人是最大的快乐嘛！&nbsp; <br />
            &nbsp; 要想学好Java，首先要知道Java的大致分类。我们知道，自从Sun推出Java以来，就力图使之无所不包，所以Java发展到现在，按应用来分主要分为三大块：J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版，主要用于桌面应用软件的编程；J2ME主要应用于嵌入是系统开发，如手机和PDA的编程；J2EE是Java2的企业版，主要用于分布式的网络程序的开发，如电子商务网站和ERP系统。J2SE开发桌面应用软件比起VC,VB,DEPHI这些传统开发语言来说，优势好象并不明显。J2ME对于初学者来说，好象又有点深奥，而且一般开发者很难有开发环境。所以现在应用最广泛又最好学的就是J2EE了。J2EE又包括许多组件，如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。&nbsp; <br />
            &nbsp; 那么又该如何学习J2EE呢？当然Java语法得先看一看的，I/O包，Util包，Lang包你都熟悉了吗？然后再从JSP学起。如果你学过HTML，那么事情要好办的多，如果没有，那你快去补一补HTML基础吧。其实JSP中的Java语法也不多，它更象一个脚本语言，有点象ASP。然后你就该学一学Servlet了。Servlet就是服务器端小程序，他负责生成发送给客户端的HTML文件。JSP在执行时，也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet，这也是SUN推出JSP的本意，可是Servlet用来控制流程跳转还是挺方便的，也令程序更清晰。接下来你应该学习一下Javabean了，可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了，这种方式跟ASP又有什么区别呢？还好，SUN提供了Javabean可以把你的JSP中的Java代码封装起来，便于调用也便于重用。接着就是EJB了，EJB就是Enterprise JavaBean,看名字好象它是Javabean，可是它和Javabean还是有区别的。它是一个体系结构，你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件（也就是我们常听到的Weblogic,Websphere这些J2EE服务器）完成了，所以我们要做的程序代码量很少，大部分工作都在设计和配置中间件上。至于JDBC，就不用我多说了，你如果用java编过存取数据库的程序，就应该很熟悉。还有，如果你要用Java编发送电子邮件的程序，你就得看看Javamail了。&nbsp; <br />
            &nbsp; 好了，对Java和J2EE有了一些基本概念之后，你就应该编一些程序了，千万不要纸上谈兵哦。最好找一些有实例且带光盘的书来看，这样看到好的程序就可以直接Ctrl+C再Ctrl+V，也不用劳您老大架再亲自把它 再输一遍吧，再说直接复制还不用怕出错，何乐而不为呢！还有就是要经常上一些好的Java编程文章，有好的文章要Cut下来，有问题尽管问，只要问题不是太傻，一般高手都会回答你的。下面介绍几个好的Java方面的编程网站：&nbsp; <br />
            CSDN论坛 http://www.csdn.net/&nbsp; 中国最有名的技术论坛，《程序员》杂志就是他们出版的，你可以在上面提出问题，马上就有人回答你，如果你觉得好，你可以给那人加分；&nbsp; <br />
            Java研究组织http://www.javaresearch.org/&nbsp; 上面有很多原创文章，高手还是挺多的；&nbsp; <br />
            Java开发者 http://www.chinajavaworld.com/&nbsp; 那里Java资料比较全；&nbsp; <br />
            java.com.cn&nbsp; http://www.java.com.cn/&nbsp; 看这域名就知道有多牛，注册用户快接近一万了，同时在线人数也在一千左右，人气很旺的；&nbsp; <br />
            IBM的开发者网络http://www-900.ibm.com/developerWorks/cn/java/index.shtml&nbsp; IBM永远的蓝色巨人；&nbsp; <br />
            &nbsp; 那么我书也看了，程序也做了，别人问我的问题我都能解决了，是不是就成为高手了呢？当然没那么简单，这只是万里长征走完了第一步。不信？那你出去接一个项目，你知道怎么下手吗，你知道怎么设计吗，你知道怎么组织人员进行开发吗？你现在脑子里除了一些散乱的代码之外，可能再没有别的东西了吧！你现在最缺的是实际的工作经验，而不是书本上那些凭空想出来的程序。所以你快去找一份Java的编程工作来做吧（如果是在校学生可以去做兼职啊），在实践中提高自己，那才是最快的。不过你得祈祷在公司里碰到一个高手，而且他还愿意不厌其烦地教你，这样好象有点难哦！&nbsp; <br />
            &nbsp; 还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手，他们设计合理，考虑周到，再加上有广大的程序员参与，代码的价值自然是字字珠叽，铿锵有力（对不起，偶最近《金装四大才子》看多了）。学Java必读的两个开源程序就是Jive和Pet Store.。Jive是国外一个非常著名的BBS程序，完全开放源码。论坛的设计采用了很多先进的技术，如Cache、用户认证、Filter、XML等，而且论坛完全屏蔽了对数据库的访问，可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序，这是我们平时编程时容易忽略的一部份（中国程序员一般只注重编程的技术含量，却完全不考虑用户的感受，这就是我们与国外软件的差距所在）。Jive的资料在很多网站上都有，大家可以找来研究一下。相信你读完代码后，会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码，同时有licence限制。不过幸好还有中国一流的Java程序员关注它，外国人不开源了，中国人就不能开源吗？这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文，增加了一些实用功能，如贴图，用户头像和用户资料查询等，而且有一个开发团队在不断升级。你可以访问banq的网站http://www.jdon.com/&nbsp; 去下载，或到同济技术论坛的服务器上ftp://nro.shtdu.edu.cn去下，安装上有什么问题，可以到论坛上去提问。Pet Store.（宠物店）是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序，应该很具有权威性，想学J2EE和EJB的朋友不要错过了。&nbsp; <br />
            &nbsp;&nbsp; 你一定会高兴地说，哈哈，原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理，号称Java很简单，只要三个月就可以学会。其实说这种话的人就如当年小日本号称&#8220;三个月拿下中国&#8221;一样大言不惭。不是Tomjava泼你冷水，你现在只是学到了Java的骨架，却还没有学到Java的精髓。接下来你得研究设计模式了。设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想，它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧，让你能够真正掌握接口或抽象类的应用，从而在原来的Java语言基础上跃进一步，更重要的是，设计模式反复向你强调一个宗旨：要让你的程序尽可能的可重用。关于设计模式的资料，还是向大家推荐banq的网站http://www.jdon.com/&nbsp; ，他把GOF的23种模式以通俗易懂的方式诠释出来，纯Java描述，真是经典中的经典。有时间再研究一下MVC结构（把Model-View-Control分离开的设计思想）吧，现在很流行的Structs就是它的一种实现方式，不过Structs用起来实在是很繁，我们只要学习其精髓即可，我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring(重整)和极限XP编程，相信你又会上一个台阶。&nbsp; <br />
            做完这些，你不如整理一下你的Java代码，把那些经典的程序和常见的应用整理出来，再精心打造一番，提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧，你可以去承接一些项目做了，一开始可能有些困难，可是你有技术积累，又考虑周全，接下项目来可以迅速作完，相信大家以后都会来找你的，所以Money就哗啦啦的来了。。。。。。&nbsp; <br />
            当然你也可以参加一些开源项目，一方面可以提高自己，另一方面也是为中国软件事业做贡献嘛！开发者在互联网上用CVS合作开发，用QQ,MSN,E-mail讨论联系，天南海北的程序员分散在各地却同时开发同一个软件，是不是很有意思呢？&nbsp; <br />
            下面介绍两个好的开源项目网站：&nbsp; <br />
            湖北省软件公共开发平台http://gro.clinux.org/&nbsp;&nbsp; <br />
            共创联盟http://cosoft.org.cn/&nbsp;&nbsp; <br />
            &nbsp; 哇，好高兴哦，我终于成为高手了！非也，非也。古人云：&#8220;识时务者为俊杰&#8221;。你知道计算机界现在的发展形势吗？你知道微软的.NET蓝图和SUN ONE计划之间的明争暗斗吗?你知道计算机技术将向何处发展吗?其实从各大计算机厂商最近的动作,都可以看出来&#8220;Web服务将是下一代互联网应用的制高点&#8221;，而微软的.NET蓝图和SUN ONE计划的斗争焦点，也就是Web服务。Web服务就是一个崭新的分布式计算模型，它是一系列标准的综合（XML,SOAP,UDDI,WSDL和WSFL等）。它使得不同语言编写的软件能够轻易的集成起来，使网络资源和Web站点变成一种服务而不是混乱的垃圾场。不远的将来，我们就可以在家里点击一下鼠标，就可以完成出门旅游的全部准备工作，包括定飞机票，定旅游线路，定好房间等。请注意，这所有的一切都是Web站点间自动完成的，再也不用象现在一样，表面上是电子商务，实际上很多环节都是人工操作。也许你会觉得这是天方夜谈，不过就近的说，你也很有可能承接一个项目，要集成两个企业的ERP系统。很有可能上游企业的系统是用Dephi编的，而下游企业的系统是用Java编的。你说你是Java高手，大家都看者你怎么做呢。所以啊，你还得学习新技术，如Web服务，而且你Dephi也要懂一点吧（Dephi6现在已经提供Web服务的控件了）。 你编的Java系统，可能要和.NET集成，所以你.NET要懂一点吧？到最后，你可能发现你已经成为Java高手了，但很多时间却在搞别的技术。太极张三丰里说，最厉害的招式就是没有招式，可能就是这个道理吧！&nbsp; <br />
            因为刚刚兴起，所以网上Web服务的资料不是很多，我还是给大家推荐几个网站吧：&nbsp; <br />
            中国UDDI技术联盟http://www.uddi-china.org/&nbsp;&nbsp; <br />
            CSDN的柴晓路专栏http://www.csdn.net/develop/author/ColumnAuthor/fennivel/&nbsp; （注：柴晓路也是互联网上一个有名的人物，他发表过很多关于Web服务的文章，还出了一书，应该称的上是中国Web服务技术的先行者）&nbsp; <br />
            IBM的开发者网络的XML&amp;Web Service专栏:&nbsp; <br />
            http://www-900.ibm.com/developerWorks/cn/xml/index.shtml?csdn&nbsp;&nbsp; IBM可是Web服务的力推者&nbsp; <br />
            呜&#8230;你费劲千心万苦，总算成为Java高手了，怎叫人不由喜极而泣呢！是啊，真不容易，真不简单，真叫人感动啊！那么打个电话告诉我吧，什么？我的电话号码是多少？昏到，你打电话问不就知道了吗，真是的&#8230;&#8230; </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/caizh2009/aggbug/290020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-08-06 08:38 <a href="http://www.blogjava.net/caizh2009/articles/290020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提升JSP应用程序的七大绝招</title><link>http://www.blogjava.net/caizh2009/articles/289187.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Thu, 30 Jul 2009 15:05:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/289187.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/289187.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/289187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/289187.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/289187.html</trackback:ping><description><![CDATA[你时常被客户抱怨JSP页面响应速度很慢吗？你想过当客户访问次数剧增时，你的WEB应用能承受日益增加的访问量吗？<br />
<br />
本文讲述了调整JSP和servlet的一些非常实用的方法，它可使你的servlet和JSP页面响应更快，扩展性更强。而且在用户数增加的情况下，系统负载会呈现出平滑上长的趋势。在本文中，我将通过一些实际例子和配置方法使得你的应用程序的性能有出人意料的提升。其中，某些调优技术是在你的编程工作中实现的。而另一些技术是与应用服务器的配置相关的。在本文中，我们将详细地描述怎样通过调整servlet和JSP页面，来提高你的应用程序的总体性能。在阅读本文之前，假设你有基本的servlet和JSP的知识。 　　<br />
<br />
方法一：在servlet的init()方法中缓存数据<br />
<br />
　　当应用服务器初始化servlet实例之后，为客户端请求提供服务之前，它会调用这个servlet的init()方法。在一个servlet的生命周期中，init()方法只会被调用一次。通过在init()方法中缓存一些静态的数据或完成一些只需要执行一次的、耗时的操作，就可大大地提高系统性能。<br />
<br />
　　例如，通过在init()方法中建立一个JDBC连接池是一个最佳例子，假设我们是用jdbc2.0的DataSource接口来取得数据库连接，在通常的情况下，我们需要通过JNDI来取得具体的数据源。我们可以想象在一个具体的应用中，如果每次SQL请求都要执行一次JNDI查询的话，那系统性能将会急剧下降。解决方法是如下代码，它通过缓存DataSource，使得下一次SQL调用时仍然可以继续利用它： public class ControllerServlet extends HttpServlet { 　private javax.sql.DataSource testDS = null; 　public void init(ServletConfig config) throws ServletException 　{ 　　super.init(config); 　　Context ctx = null; 　　try 　　{ 　　　ctx = new InitialContext(); 　　　testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS"); 　　} 　　catch(NamingException ne) 　　{ 　　　ne.printStackTrace(); 　　} 　　catch(Exception e) 　　{ 　　　e.printStackTrace(); 　　} 　} 　public javax.sql.DataSource getTestDS() 　{ 　　return testDS; 　} 　... 　... }<br />
<br />
　　方法 2:禁止servlet和JSP 自动重载(auto-reloading)<br />
<br />
　　Servlet/JSP提供了一个实用的技术，即自动重载技术，它为开发人员提供了一个好的开发环境，当你改变servlet和JSP页面后而不必重启应用服务器。然而，这种技术在产品运行阶段对系统的资源是一个极大的损耗，因为它会给JSP引擎的类装载器(classloader)带来极大的负担。因此关闭自动重载功能对系统性能的提升是一个极大的帮助。<br />
<br />
　　方法 3: 不要滥用HttpSession<br />
<br />
　　在很多应用中，我们的程序需要保持客户端的状态，以便页面之间可以相互联系。但不幸的是由于HTTP具有天生无状态性，从而无法保存客户端的状态。因此一般的应用服务器都提供了session来保存客户的状态。在JSP应用服务器中，是通过HttpSession对像来实现session的功能的，但在方便的同时，它也给系统带来了不小的负担。因为每当你获得或更新session时，系统者要对它进行费时的序列化操作。你可以通过对HttpSession的以下几种处理方式来提升系统的性能：<br />
<br />
如果没有必要，就应该关闭JSP页面中对HttpSession的缺省设置： 如果你没有明确指定的话，每个JSP页面都会缺省地创建一个HttpSession。如果你的JSP中不需要使用session的话，那可以通过如下的JSP页面指示符来禁止它： ＜%@ page session="false"%＞<br />
<br />
不要在HttpSession中存放大的数据对像：如果你在HttpSession中存放大的数据对像的话，每当对它进行读写时，应用服务器都将对其进行序列化，从而增加了系统的额外负担。你在HttpSession中存放的数据对像越大，那系统的性能就下降得越快。<br />
<br />
当你不需要HttpSession时，尽快地释放它：当你不再需要session时，你可以通过调用HttpSession.invalidate()方法来释放它。<br />
<br />
尽量将session的超时时间设得短一点：在JSP应用服务器中，有一个缺省的session的超时时间。当客户在这个时间之后没有进行任何操作的话，系统会将相关的session自动从内存中释放。超时时间设得越大，系统的性能就会越低，因此最好的方法就是尽量使得它的值保持在一个较低的水平。<br />
<br />
　方法 4: 将页面输出进行压缩<br />
<br />
　　压缩是解决数据冗余的一个好的方法，特别是在网络带宽不够发达的今天。有的浏览器支持gzip(GNU zip)进行来对HTML文件进行压缩，这种方法可以戏剧性地减少HTML文件的下载时间。因此，如果你将servlet或JSP页面生成的HTML页面进行压缩的话，那用户就会觉得页面浏览速度会非常快。但不幸的是，不是所有的浏览器都支持gzip压缩，但你可以通过在你的程序中检查客户的浏览器是否支持它。下面就是关于这种方法实现的一个代码片段：<br />
<br />
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { 　OutputStream out = null 　String encoding = request.getHeader("Accept-Encoding"); 　if (encoding != null &amp;&amp; encoding.indexOf("gzip") != -1) 　{ 　　request.setHeader("Content-Encoding" , "gzip"); 　　out = new GZIPOutputStream(request.getOutputStream()); 　} 　else if (encoding != null &amp;&amp; encoding.indexOf("compress") != -1) 　{ 　　request.setHeader("Content-Encoding" , "compress"); 　　out = new ZIPOutputStream(request.getOutputStream()); 　} 　else 　{ 　　out = request.getOutputStream(); 　} 　... 　... }<br />
<br />
　　方法 5: 使用线程池<br />
<br />
　　应用服务器缺省地为每个不同的客户端请求创建一个线程进行处理，并为它们分派service()方法，当service()方法调用完成后，与之相应的线程也随之撤消。由于创建和撤消线程会耗费一定的系统资源，这种缺省模式降低了系统的性能。但所幸的是我们可以通过创建一个线程池来改变这种状况。另外，我们还要为这个线程池设置一个最小线程数和一个最大线程数。在应用服务器启动时，它会创建数量等于最小线程数的一个线程池，当客户有请求时，相应地从池从取出一个线程来进行处理，当处理完成后，再将线程重新放入到池中。如果池中的线程不够地话，系统会自动地增加池中线程的数量，但总量不能超过最大线程数。通过使用线程池，当客户端请求急剧增加时，系统的负载就会呈现的平滑的上升曲线，从而提高的系统的可伸缩性。<br />
<br />
　　方法 6: 选择正确的页面包含机制<br />
　　在JSP中有两种方法可以用来包含另一个页面1、使用include指示符(＜%@ includee file=&#8221;test.jsp&#8221; %＞)。2、使用jsp指示符(＜jsp:includee page=&#8221;test.jsp&#8221; flush=&#8221;true&#8221;/＞)。在实际中我发现，如果使用第一种方法的话，可以使得系统性能更高。<br />
<br />
　　方法 7:正确地确定javabean的生命周期<br />
<br />
　　JSP的一个强大的地方就是对javabean的支持。通过在JSP页面中使用＜jsp:useBean＞标签，可以将javabean直接插入到一个JSP页面中。它的使用方法如下： ＜jsp:useBean id="name" scope="page|request|session|application" class= "package.className" type="typeName"＞＜/jsp:useBean＞<br />
<br />
　　其中scope属性指出了这个bean的生命周期。缺省的生命周期为page。如果你没有正确地选择bean的生命周期的话，它将影响系统的性能。<br />
<br />
　　举例来说，如果你只想在一次请求中使用某个bean，但你却将这个bean的生命周期设置成了session，那当这次请求结束后，这个bean将仍然保留在内存中，除非session超时或用户关闭浏览器。这样会耗费一定的内存，并无谓的增加了JVM垃圾收集器的工作量。因此为bean设置正确的生命周期，并在bean的使命结束后尽快地清理它们，会使用系统性能有一个提高。<br />
<br />
　　其它一些有用的方法 　　? 在字符串连接操作中尽量不使用&#8220;＋&#8221;操作符：在java编程中，我们常常使用&#8220;＋&#8221;操作符来将几个字符串连接起来，但你或许从来没有想到过它居然会对系统性能造成影响吧？由于字符串是常量，因此JVM会产生一些临时的对像。你使用的&#8220;＋&#8221;越多，生成的临时对像就越多，这样也会给系统性能带来一些影响。解决的方法是用StringBuffer对像来代替&#8220;＋&#8221;操作符。<br />
<br />
　　? 避免使用System.out.println()方法：由于System.out.println()是一种同步调用，即在调用它时，磁盘I/O操作必须等待它的完成，因此我们要尽量避免对它的调用。但我们在调试程序时它又是一个必不可少的方便工具，为了解决这个矛盾，我建议你最好使用Log4j工具(http://Jakarta.apache.org ; )，它既可以方便调试，而不会产生System.out.println()这样的方法。<br />
<br />
　　? ServletOutputStream 与 PrintWriter的权衡:使用PrintWriter可能会带来一些小的开销，因为它将所有的原始输出都转换为字符流来输出，因此如果使用它来作为页面输出的话，系统要负担一个转换过程。而使用ServletOutputStream作为页面输出的话就不存在一个问题，但它是以二进制进行输出的。因此在实际应用中要权衡两者的利弊。<br />
<br />
　　总结。<br />
<br />
本文的目的是通过对servlet和JSP的一些调优技术来极大地提高你的应用程序的性能，并因此提升整个J2EE应用的性能。通过这些调优技术，你可以发现其实并不是某种技术平台（比如J2EE和.NET之争）决定了你的应用程序的性能，重要是你要对这种平台有一个较为深入的了解，这样你才能从根本上对自己的应用程序做一个优化！ <br />
<br />
- mokey1的专栏 - CSDN博客
<img src ="http://www.blogjava.net/caizh2009/aggbug/289187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-07-30 23:05 <a href="http://www.blogjava.net/caizh2009/articles/289187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java class文件解析（2）</title><link>http://www.blogjava.net/caizh2009/articles/279778.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Wed, 03 Jun 2009 04:21:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/279778.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/279778.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/279778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/279778.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/279778.html</trackback:ping><description><![CDATA[<strong>关键字: class</strong>
<div>
<p style="margin-left: 42pt; text-indent: -21pt; line-height: 115%"><span style="color: #ff0000">Fields_count 和 fields </span></p>
<p style="margin-left: 42pt; text-indent: 0cm; line-height: 115%">&nbsp;紧接着 interfaces 后面的是对该类或者接口中所生命的字段的描述。首先是计数 fields_count ，它是类变量和实例变量的字段的数量总和。在这个计数后面有相应数目个 field_info 表。此表包含了字段的名字、描述符和修饰符。如果该字段被声明为 final ， field_info 还会展示其常量值。 </p>
<p style="margin-left: 42pt; text-indent: 0cm; line-height: 115%; text-align: center" align="center">图 2 ： field_info 表的格式 </p>
<p style="margin-left: 42pt; text-indent: 0cm; line-height: 115%"><em>自上而下分别为：访问标志，简单名称（非全限定名），字段描述符，属性。字段描述符即该字段的型别。 </em></p>
<p style="margin-left: 42pt; text-indent: 0cm; line-height: 115%">&nbsp;方法表与方法表计数。方法表的格式与 field_info 类似，区别在于其描述的是方法。故不再赘述。 </p>
<p style="margin-left: 42pt; text-indent: 0cm; line-height: 115%">&nbsp;Java 虚拟机实现定义了两种属性 ----SourceCode 和 InnerClasses ，它们出现在 ClassFile 表中的属性列表中。 </p>
<p style="margin-left: 42pt; text-indent: 0cm; line-height: 115%"><span style="color: #0000ff">&nbsp; </span></p>
<p style="line-height: 115%; text-align: left" align="left"><span style="color: #0000ff"><strong>Class </strong></span><strong><span style="color: #0000ff">的生命周期 </span></strong></p>
<p style="line-height: 115%; text-align: left" align="left"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong></p>
<p style="margin-left: 5.15pt; text-indent: 36pt; line-height: 115%; text-align: left" align="left">Java 虚拟机通过装载、连接和初始化一个 java 类型，使该类型可以被正在运行的 java 程序所使用。其中，装载就是把二进制形式的 java 类型读入 java 虚拟机中；而连接就是把这种已经读入虚拟机的二进制形式的类型数据合并到虚拟机的运行时状态中。连接阶段分为三个子步骤 ----- 验证、准备、解析。&#8220;验证&#8221;确保了 java 类型数据格式正确并且适于 java 虚拟机的使用。而&#8220;准备&#8221;步骤则负责为该类型分配它所需的内存，比如为它的类变量分配内存。&#8220;解析&#8221;步骤则负责把常量池中的符号引用转换为直接引用。 </p>
<p style="margin-left: 5.15pt; text-indent: 36pt; line-height: 115%; text-align: left" align="left">&nbsp;&nbsp;&nbsp; <strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong></p>
<p style="margin-left: 42pt; text-indent: 0cm; line-height: 115%; text-align: center" align="center">图 3 ：类型生命周期的开始 </p>
<p style="margin-left: 42pt; text-indent: 0cm; line-height: 115%"><strong>装载 </strong></p>
<p style="margin-left: 42pt; text-indent: 0cm; line-height: 115%">要装载一个类型， java 虚拟机必须： </p>
<p style="margin-left: 63pt; text-indent: -21pt; line-height: 115%">通过该类型的完全限定名，产生一个代表该类型的二进制数据流 </p>
<p style="margin-left: 63pt; text-indent: -21pt; line-height: 115%">解析这个二进制数据流为方法去内的内部数据结构 </p>
<p style="margin-left: 63pt; text-indent: -21pt; line-height: 115%">创建一个俄表示该类型的 <span style="font-size: 9pt; line-height: 115%">java.lang.Class</span> 类的实例 </p>
<p style="margin-left: 21.3pt; text-indent: 0cm; line-height: 115%">装载步骤的最终产品就是一个 java.lang.Class 的实例对象，而这个对象就是该类型在虚拟机中的&#8220;注册&#8221;，要访问该类型的信息，程序就要调用该类型对应的 class 实例对象的方法。 </p>
<p style="margin-left: 21.3pt; text-indent: 0cm; line-height: 115%">&nbsp;&nbsp; 所有类都由类装载器载入，载入内存中的类对应一个 java.lang.Class 实例。存在一个 Bootstrap Loader （以下简称为 BL ），由 C++ 写成，负责在虚拟机启动后一次性加载 Java 基础类库中的所有类。其他的类装载器由 java 写成，都是 java.lang.ClassLoader 的子类。除 BL 之外的所有类装载器都有一个 parent 属性，指向其父装载器。 </p>
<p style="margin-left: 21.3pt; text-indent: 0cm; line-height: 115%">&nbsp;&nbsp; 用户自定义的类装载器是 java.lang.ClassLoader 的子类的实例，它以定制的方式装入类。 </p>
<p style="margin-left: 21pt; text-indent: 18pt; line-height: 115%">装载一个类时，首先要装载该类的基类及其接口 </p>
<p style="margin-left: 21pt; text-indent: 18pt; line-height: 115%"><span style="font-size: 9pt; line-height: 115%">Java </span>基础类由 <span style="font-size: 9pt; line-height: 115%">BL </span>在虚拟机启动时一次性载入 </p>
<p style="margin-left: 21pt; text-indent: 18pt; line-height: 115%">包含 <span style="font-size: 9pt; line-height: 115%">main() </span>的入口类由 <span style="font-size: 9pt; line-height: 115%">AL </span>的 <span style="font-size: 9pt; line-height: 115%">loadClass() </span>方法载入。 </p>
<p style="margin-left: 21pt; text-indent: 18pt; line-height: 115%"><span style="font-size: 9pt; line-height: 115%">&nbsp; </span>由 <span style="font-size: 9pt; line-height: 115%">new </span>关键字创建一个类的实例。该类由运行时刻包含该 <span style="font-size: 9pt; line-height: 115%">new </span>语句的类实例的类装载器（ <span style="font-size: 9pt; line-height: 115%">ClassLoader.getCallerClassLoader() </span>）的 <span style="font-size: 9pt; line-height: 115%">loadClass() </span>方法载入 </p>
<p style="margin-left: 21pt; text-indent: 18pt; line-height: 115%"><strong>连接 </strong></p>
<p style="margin-left: 57pt; text-indent: 0cm; line-height: 115%">验证 &nbsp;&nbsp; </p>
<p style="margin-left: 21.3pt; text-indent: 10.5pt; line-height: 115%">&nbsp; 连接过程的第一步是验证 - 确认类型符合 JAVA 语言的语义，并且它不会危及虚拟机的完整性。确保每个 final 类不含有子类， final 方法不能被覆盖，以及常量池中所有的域引用和方法引用有有效的名字和类型描述符号。 &nbsp;&nbsp;&nbsp;&nbsp; </p>
<p style="margin-left: 42.3pt; text-indent: 5.25pt; line-height: 115%">&nbsp;准备 </p>
<p style="margin-left: 42.3pt; text-indent: 0cm; line-height: 115%">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JAVA 虚拟机为类变量分配内存，设置默认初始值（非初始化时的默认值）。 </p>
<p style="margin-left: 42.3pt; text-indent: 5.25pt; line-height: 115%">&nbsp;解析 </p>
<p style="margin-left: 42.3pt; text-indent: 0cm; line-height: 115%"><strong>初始化 </strong></p>
<p style="margin-left: 73.8pt; text-indent: -31.5pt; line-height: 115%">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 在初始化阶段， Java 虚拟机设计者需要将类变量赋予正确的初始值。 &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;clinit&gt; 方法：类变量初始化语句与静态初始化块 </p>
</div>
<img src ="http://www.blogjava.net/caizh2009/aggbug/279778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-06-03 12:21 <a href="http://www.blogjava.net/caizh2009/articles/279778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java class文件的解析（1）</title><link>http://www.blogjava.net/caizh2009/articles/279777.html</link><dc:creator>小菜毛毛</dc:creator><author>小菜毛毛</author><pubDate>Wed, 03 Jun 2009 04:20:00 GMT</pubDate><guid>http://www.blogjava.net/caizh2009/articles/279777.html</guid><wfw:comment>http://www.blogjava.net/caizh2009/comments/279777.html</wfw:comment><comments>http://www.blogjava.net/caizh2009/articles/279777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caizh2009/comments/commentRss/279777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caizh2009/services/trackbacks/279777.html</trackback:ping><description><![CDATA[<p><span style="color: #0000ff">从今天开始分几节介绍Java中最重要的class文件。</span> </p>
<p><span style="color: #0000ff">包括class文件的结构、class是如何进入到虚拟机中的（类装载）、class的消亡（垃圾收集）</span> </p>
<p style="text-align: left" align="left"><strong>Class </strong><strong>的结构 </strong></p>
<p style="text-align: left" align="left"><strong>&nbsp;&nbsp; </strong>Class 文件由 java 代码编译而来，每个类都会生成一个 .class 文件。 Java class 文件中包含了 java 虚拟机所需知道的、关于类或接口的所有信息。这些信息用表格的形式来说明，我们可以得到 classfile 表：如图 1 </p>
<p><img alt="" src="http://iamjordan.javaeye.com/upload/attachment/63518/f099cec3-89ad-352a-a5b3-12be1f1ae907.jpg" /> </p>
<p style="text-align: center" align="center">图 1 classfile 表的格式 </p>
<p style="text-indent: 21pt">其中类型或者为表名，或者如表 1 所示的&#8220;基本类型&#8221;。所有存储在类型 u2 、 u4 和 u8 中的值，在 class 文件中以高位在前的形式出现。 </p>
<div>
<table style="border-top-width: 1px; border-left-width: 1px; border-left-color: #000000; border-bottom-width: 1px; border-bottom-color: #000000; border-top-color: #000000; border-collapse: collapse; border-right-width: 1px; border-right-color: #000000" cellspacing="0" cellpadding="0" border="1" frame="all">
    <tbody>
        <tr>
            <td style="border-right: black 1pt solid; padding-right: 5.4pt; border-top: black 1pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: black 1pt solid; width: 97.55pt; padding-top: 0cm; border-bottom: black 1pt solid" valign="top" width="130">
            <p style="text-align: center" align="center">U1 </p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 184.3pt; padding-top: 0cm" valign="top" width="246">
            <p>1 个字节，无符号整形 </p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 97.55pt; padding-top: 0cm" valign="top" width="130">
            <p style="text-align: center" align="center">U2 </p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 184.3pt; padding-top: 0cm" valign="top" width="246">
            <p>1 个字节，无符号整形 </p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 97.55pt; padding-top: 0cm" valign="top" width="130">
            <p style="text-align: center" align="center">U3 </p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 184.3pt; padding-top: 0cm" valign="top" width="246">
            <p>1 个字节，无符号整形 </p>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 97.55pt; padding-top: 0cm" valign="top" width="130">
            <p style="text-align: center" align="center">U4 </p>
            </td>
            <td style="padding-right: 5.4pt; padding-left: 5.4pt; padding-bottom: 0cm; width: 184.3pt; padding-top: 0cm" valign="top" width="246">
            <p>1 个字节，无符号整形 </p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p style="text-indent: 21pt; text-align: center" align="center">表 1 class 文件&#8220;基本类型&#8221; </p>
<p style="text-indent: 21pt">Classfile 表中各项简介如下： </p>
<p style="margin-left: 42pt; text-indent: -21pt"><span style="color: #ff0000">1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Magic( 魔数 ) </span></p>
<p style="margin-left: 42pt; text-indent: 10.5pt">每个 java class 文件的前 4 个字节被称为 magic number ： 0xCAFEBABE 。魔数的作用在于，可以轻松的分辨出 java class 文件和非 java class 文件。 </p>
<p style="margin-left: 42pt; text-indent: 0cm">&nbsp;Class 文件的下面 4 个字节包含了主次版本号。随着 java 技术的发展， java class 文件格式可能会加入新特性。 Class 文件格式一旦发生变化，版本号也会随之变化。如果 class 文件的版本号超出了 java 虚拟机所能处理的有效范围， java 虚拟机将不会处理该文件。 </p>
<p style="margin-left: 42pt; text-indent: 0cm">&nbsp;之后的是常量池。其中包含了与文件中类和接口相关的常量。常量池中存储了诸如文字字符串、 final 变量值、类名和方法名的常量。 Java 虚拟机把常量池组织为入口列表的形式。在实际列表 constant_pool 之前，是入口在列表中的计数 constant_pool_count 。 </p>
<p style="margin-left: 42pt; text-indent: 0cm">&nbsp;常量池中的许多入口都指向其他的常量池入口，而且 class 文件中紧随着常量池的许多条目也会指向常量池中的入口。在整个 class 文件中，指示常量池入口在常量池列表中位置的整数索引都指向这些常量池入口。列表中的一项索引值为 1 ，第二项索引值为 2 ，以此类推。 </p>
<p style="margin-left: 42pt; text-indent: 0cm; text-align: left" align="left">例： act.class 的常量池。 </p>
<p style="margin-left: 42pt; text-indent: 0cm; text-align: left" align="left">&#8220; { }V &#8221;<em>表示一个返回类型为</em> <em>void </em><em>的方法。 </em></p>
<p style="margin-left: 42pt; text-indent: 0cm">&nbsp;访问标志。这个字段表示的意思指明了文件中定义的是类还是接口；还定义了在类或接口的声明中，使用了哪种修饰符：是抽象的还是公共的，或者是 final 。类的类型可以为 final ，而 final 类不可能是抽象的，同时接口也不能为 final 类型。 </p>
<p style="margin-left: 42pt; text-indent: 0cm">&nbsp;这个类的名字和超类名字。特殊的，对于 object 类， super_class 为 0 ，除此以外 super_class 对于所有的类均有效。对于接口，在常量池入口 super_class 位置的项为 java.lang.object </p>
<p style="margin-left: 42pt; text-indent: 0cm">。 </p>
<p>&nbsp;紧接着 super_class 的是 Interfaces_count 。此项的含义为：在文件中由该类直接实现或者由该接口所扩展的父接口的数量。在这个技术的后面，是名为 interfaces 的数组，它包含了对每个由由该类直接实现或者由该接口所扩展的父接口的常量池索引。 </p>
<img src ="http://www.blogjava.net/caizh2009/aggbug/279777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caizh2009/" target="_blank">小菜毛毛</a> 2009-06-03 12:20 <a href="http://www.blogjava.net/caizh2009/articles/279777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>