﻿<?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 Tools-随笔分类-J2EE</title><link>http://www.blogjava.net/simie/category/23720.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 13 Jul 2007 02:10:42 GMT</lastBuildDate><pubDate>Fri, 13 Jul 2007 02:10:42 GMT</pubDate><ttl>60</ttl><item><title>Java EE/J2EE基本概念</title><link>http://www.blogjava.net/simie/archive/2007/07/12/129810.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Thu, 12 Jul 2007 05:28:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/12/129810.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/129810.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/12/129810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/129810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/129810.html</trackback:ping><description><![CDATA[<p><span>J2EE</span><span>可以说指</span><span>Java</span><span>在数据库信息系统上实现，数据库信息系统从早期的</span><span>dBase</span><span>、到</span><span>Delphi/VB</span><span>等</span><span>C/S</span><span>结构，发展到</span><span>B/S</span><span>（</span><span>Browser</span><span>浏览器</span><span>/Server</span><span>服务器）结构，而</span><span>J2EE</span><span>主要是指</span><span>B/S</span><span>结构的实现。</span></p>
<p><span>J2EE</span><span>又是一种框架和标准，框架类似</span><span>API</span><span>、库的概念，但是要超出它们。</span></p>
<p><span>J2EE</span><span>是一个虚的大的概念，</span><span>J2EE</span><span>标准主要有三种子技术标准：</span><span>WEB</span><span>技术、</span><span>EJB</span><span>技术和</span><span>JMS</span><span>，谈到</span><span>J2EE</span><span>应该说最终要落实到这三个子概念上。</span></p>
<p><span>这三种技术的每个技术在应用时都涉及两个部分：容器部分和应用部分，</span><span>Web</span><span>容器也是指</span><span>Jsp/Servlet</span><span>容器，你如果要开发一个</span><span>Web</span><span>应用，无论是编译或运行，都必须要有</span><span>Jsp/Servlet</span><span>库或</span><span>API</span><span>支持（除了</span><span>JDK/J2SE</span><span>以外）。</span></p>
<p><span>Web</span><span>技术中除了</span><span>Jsp/Servlet</span><span>技术外，还需要</span><span>JavaBeans</span><span>或</span><span>Java Class</span><span>实现一些功能或者包装携带数据，所以</span><span>Web</span><span>技术最初简称为</span><span>Jsp/Servlet+JavaBeans</span><span>系统。</span></p>
<p><span>谈到</span><span>JavaBeans</span><span>技术，就涉及到组件构件技术（</span><span>component</span><span>），这是</span><span>Java</span><span>的核心基础部分，很多软件设计概念（设计模式）都是通过</span><span>JavaBeans</span><span>实现的。</span></p>
<p><span>JavaBeans</span><span>不属于</span><span>J2EE</span><span>概念范畴中，如果一个</span><span>JavaBeans</span><span>对象被</span><span>Web</span><span>技术（也就是</span><span>Jsp/Servlet</span><span>）调用，那么</span><span>JavaBeans</span><span>就运行在</span><span>J2EE</span><span>的</span><span>Web</span><span>容器中；如果它被</span><span>EJB</span><span>调用，它就运行在</span><span>EJB</span><span>容器中。</span></p>
<p><span>EJB</span><span>（企业</span><span>JavaBeans</span><span>）是普通</span><span>JavaBeans</span><span>的一种提升和规范，因为企业信息系统开发中需要一个可伸缩的性能和事务、安全机制，这样能保证企业系统平滑发展，而不是发展到一种规模重新更换一套软件系统。</span></p>
<p><span>J2EE</span><span>集群原理</span><span>: http://www.jdon.com/jive/article.jsp?forum=121&amp;thread=22282</span></p>
<p><span>至此，</span><span>JavaBeans</span><span>组件发展到</span><span>EJB</span><span>后，并不是说以前的那种</span><span>JavaBeans</span><span>形式就消失了，这就自然形成了两种</span><span>JavaBeans</span><span>技术：</span><span>EJB</span><span>和</span><span>POJO</span><span>，</span><span>POJO</span><span>完全不同于</span><span>EJB</span><span>概念，指的是普通</span><span>JavaBeans</span><span>，而且这个</span><span>JavaBeans</span><span>不依附某种框架，或者干脆可以说：这个</span><span>JavaBeans</span><span>是你为这个应用程序单独开发创建的。</span></p>
<p><span>J2EE</span><span>应用系统开发工具有很多：如</span><span>JBuilder</span><span>、</span><span>Eclipse</span><span>等，这些</span><span>IDE</span><span>首先是</span><span>Java</span><span>开发工具，也就是说，它们首要基本功能是可以开发出</span><span>JavaBeans</span><span>或</span><span>Java class</span><span>，但是如果要开发出</span><span>J2EE</span><span>系统，就要落实到要么是</span><span>Web</span><span>技术或</span><span>EJB</span><span>技术，那么就有可能要一些专门模块功能，最重要的是，因为</span><span>J2EE</span><span>系统区分为容器和应用两个部分，所以，在任何开发工具中开发</span><span>J2EE</span><span>都需要指定</span><span>J2EE</span><span>容器。</span></p>
<p><span>J2EE</span><span>容器分为</span><span>WEB</span><span>容器和</span><span>EJB</span><span>容器，</span><span>Tomcat/Resin</span><span>是</span><span>Web</span><span>容器；</span><span>JBoss</span><span>是</span><span>EJB</span><span>容器</span><span>+Web</span><span>容器等，其中</span><span>Web</span><span>容器直接使用</span><span>Tomcat</span><span>实现的。所以你开发的</span><span>Web</span><span>应用程序可以在上面两种容器运行，而你开发的</span><span>Web+EJB</span><span>应用则只可以在</span><span>JBoss</span><span>服务器上运行，商业产品</span><span>Websphere/Weblogic</span><span>等和</span><span>JBoss</span><span>属于同一种性质。</span></p>
<p><span>J2EE</span><span>容器也称为</span><span>J2EE</span><span>服务器，大部分时它们概念是一致的。</span></p>
<p><span>如果你的</span><span>J2EE</span><span>应用系统的数据库连接是通过</span><span>JNDI</span><span>获得，也就是说是从容器中获得，那么你的</span><span>J2EE</span><span>应用系统基本与数据库无关，如果你在你的</span><span>J2EE</span><span>应用系统耦合了数据库</span><span>JDBC</span><span>驱动的配置，那么你的</span><span>J2EE</span><span>应用系统就有数据库概念色彩，作为一个成熟需要推广的</span><span>J2EE</span><span>应用系统，不推荐和具体数据库耦合，当然这其中如何保证</span><span>J2EE</span><span>应用系统运行性能又是体现你的设计水平了。</span></p>
<h3><span>高质量的</span><span>Java</span><span>企业系统</span></h3>
<p><span>衡量</span><span>J2EE</span><span>应用系统设计开发水平高低的标准就是：解耦性；你的应用系统各个功能是否能够彻底脱离？是否不相互依赖，也只有这样，才能体现可维护性、可拓展性的软件设计目标。</span></p>
<p><span>为了达到这个目的，诞生各种框架概念，</span><span>J2EE</span><span>框架标准将一个系统划分为</span><span>WEB</span><span>和</span><span>EJB</span><span>主要部分，当然我们有时不是以这个具体技术区分，而是从设计上抽象为表现层、服务层和持久层，这三个层次从一个高度将</span><span>J2EE</span><span>分离开来，实现解耦目的。</span></p>
<p><span>因此，我们实际编程中，也要将自己的功能向这三个层次上靠，做到大方向清楚，泾渭分明，但是没有技术上约束限制要做到这点是很不容易的，因此我们还是必须借助</span><span>J2EE</span><span>具体技术来实现，这时，你可以使用</span><span>EJB</span><span>规范实现服务层和持久层，</span><span>Web</span><span>技术实现表现层；</span></p>
<p><span>EJB</span><span>为什么能将服务层从</span><span>Jsp/Servlet</span><span>手中分离出来，因为它对</span><span>JavaBeans</span><span>编码有强制的约束，现在有一种对</span><span>JavaBeans</span><span>弱约束，使用</span><span>Ioc</span><span>模式实现的（当然</span><span>EJB 3.0</span><span>也采取这种方式），在</span><span>Ioc</span><span>模式诞生前，一般都是通过工厂模式来对</span><span>JavaBeans</span><span>约束，形成一个服务层，这也是是</span><span>Jive</span><span>这样开源论坛设计原理之一。</span></p>
<p><span>由此，将服务层从表现层中分离出来目前有两种可选架构选择：管理普通</span><span>JavaBeans</span><span>（</span><span>POJO</span><span>）框架</span><span>(</span><span>如</span><span>Spring</span><span>、</span><span>JdonFramework)</span><span>以及管理</span><span>EJB</span><span>的</span><span>EJB</span><span>框架，因为</span><span>EJB</span><span>不只是框架，还是标准，而标准可以扩展发展，所以，这两种区别将来是可能模糊，被纳入同一个标准了。</span></p>
<p><span>但是，通常标准制定是为某个目的服务的，总要牺牲一些换取另外一些，所以，这两种架构会长时间并存。</span></p>
<p><span>前面谈了服务层框架，使用服务层框架可以将</span><span>JavaBeans</span><span>从</span><span>Jsp/Servlet</span><span>中分离出来，而使用表现层框架则可以将</span><span>Jsp</span><span>中剩余的</span><span>JavaBeans</span><span>完全分离，这部分</span><span>JavaBeans</span><span>主要负责显示相关，一般是通过标签库（</span><span>taglib</span><span>）实现，不同框架有不同自己的标签库，</span><span>Struts</span><span>是应用比较广泛的一种表现层框架。</span></p>
<p><span>这样，表现层和服务层的分离是通过两种框架达到目的，剩余的就是持久层框架了，通过持久层的框架将数据库存储从服务层中分离出来是其目的，持久层框架有两种方向：直接自己编写</span><span>JDBC</span><span>等</span><span>SQL</span><span>语句（如</span><span>iBatis</span><span>）；使用</span><span>O/R Mapping</span><span>技术实现的</span><span>Hibernate</span><span>和</span><span>JDO</span><span>技术；当然还有</span><span>EJB</span><span>中的实体</span><span>Bean</span><span>技术。</span></p>
<p><span>持久层框架目前呈现百花齐放，各有优缺点的现状，所以正如表现层框架一样，目前没有一个框架被指定为标准框架，当然，表现层框架现在又出来了一个</span><span>JSF</span><span>，它代表的页面组件概念是一个新的发展方向，但是复杂的实现让人有些忘而却步。</span></p>
<p><span>最后，你的</span><span>J2EE</span><span>应用系统如果采取上面提到的表现层、服务层和持久层的框架实现，基本可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系统了。</span></p>
<p><span>还要注意的是</span><span>: </span><span>开发出一个高质量的</span><span>J2EE</span><span>系统还需要正确的业务需求理解，那么域建模提供了一种比较切实可行的正确理解业务需求的方法，相关详细知识可从</span><span>UML</span><span>角度结合理解。</span></p>
<p><span>当然，如果你想设计自己的行业框架，那么第一步从设计模式开始吧，因为设计模式提供你一个实现</span><span>JavaBeans</span><span>或类之间解耦参考实现方法，当你学会了系统基本单元</span><span>JavaBeans</span><span>或类之间解耦时，那么系统模块之间的解耦你就可能掌握，进而你就可以实现行业框架的提炼了，这又是另外一个发展方向了。</span></p>
<p><span>以上理念可以总结为一句话：</span></p>
<p><span>J2EE</span><span>开发三件宝</span><span>: Domain Model</span><span>（域建模）、</span><span>patterns</span><span>（模式）和</span><span>framework</span><span>（框架）。</span></p>
<img src ="http://www.blogjava.net/simie/aggbug/129810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-12 13:28 <a href="http://www.blogjava.net/simie/archive/2007/07/12/129810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAR 文件揭密</title><link>http://www.blogjava.net/simie/archive/2007/07/08/128852.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Sun, 08 Jul 2007 02:17:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/08/128852.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/128852.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/08/128852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/128852.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/128852.html</trackback:ping><description><![CDATA[<blockquote>大多数 Java 程序员都熟悉对 JAR 文件的基本操作。但是只有少数程序员了解 JAR 文件格式的 <em>强大功能</em>。在本文中，作者探讨了JAR 格式的许多功能和优势，包括打包、可执行的 JAR 文件、安全性和索引。 </blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><a name=1><span class=atitle>JAR 文件是什么？</span></a></p>
<p>JAR 文件格式以流行的 ZIP 文件格式为基础，用于将许多个文件聚集为一个文件。与 ZIP 文件不同的是，JAR 文件不仅用于压缩和发布，而且还用于部署和封装库、组件和插件程序，并可被像编译器和 JVM 这样的工具直接使用。在 JAR 中包含特殊的文件，如 manifests 和部署描述符，用来指示工具如何处理特定的 JAR。</p>
<p>一个 JAR 文件可以用于：</p>
<ul>
    <li>用于发布和使用类库
    <li>作为应用程序和扩展的构建单元
    <li>作为组件、applet 或者插件程序的部署单位
    <li>用于打包与组件相关联的辅助资源 </li>
</ul>
<p>JAR 文件格式提供了许多优势和功能，其中很多是传统的压缩格式如 ZIP 或者 TAR 所没有提供的。它们包括：</p>
<ul>
    <li><strong>安全性。</strong>可以对 JAR 文件内容加上数字化签名。这样，能够识别签名的工具就可以有选择地为您授予软件安全特权，这是其他文件做不到的，它还可以检测代码是否被篡改过。 <br>
    <li><strong>减少下载时间。</strong> 如果一个 applet 捆绑到一个 JAR 文件中，那么浏览器就可以在一个 HTTP 事务中下载这个 applet 的类文件和相关的资源，而不是对每一个文件打开一个新连接。 <br>
    <li><strong>压缩。</strong>JAR 格式允许您压缩文件以提高存储效率。 <br>
    <li><strong>传输平台扩展。</strong> Java 扩展框架(Java Extensions Framework)提供了向 Java 核心平台添加功能的方法，这些扩展是用 JAR 文件打包的(Java 3D 和 JavaMail 就是由 Sun 开发的扩展例子)。 <br>
    <li><strong>包密封。</strong>存储在 JAR 文件中的包可以选择进行 <em>密封</em>，以增强版本一致性和安全性。密封一个包意味着包中的所有类都必须在同一 JAR 文件中找到。 <br>
    <li><strong>包版本控制。</strong>一个 JAR 文件可以包含有关它所包含的文件的数据，如厂商和版本信息。 <br>
    <li><strong>可移植性。</strong>处理 JAR 文件的机制是 Java 平台核心 API 的标准部分。 </li>
</ul>
<p><a name=N100BF><span class=smalltitle><strong><font face=Arial>压缩的和未压缩的 JAR</font></strong></span></a></p>
<p><code>jar</code> 工具(有关细节参阅 <a href="http://www.ibm.com/developerworks/cn/java/j-jar/?ca=j-t10#jartool"><u><font color=#996699><code>jar</code> 工具 </font></u></a>)在默认情况下压缩文件。未压缩的 JAR 文件一般可以比压缩过的 JAR 文件更快地装载，因为在装载过程中要解压缩文件，但是未压缩的文件在网络上的下载时间可能更长。 </p>
<p><a name=N100D4><span class=smalltitle><strong><font face=Arial>META-INF 目录</font></strong></span></a></p>
<p>大多数 JAR 文件包含一个 META-INF 目录，它用于存储包和扩展的配置数据，如安全性和版本信息。Java 2 平台识别并解释 META-INF 目录中的下述文件和目录，以便配置应用程序、扩展和类装载器：</p>
<ul>
    <li><strong>MANIFEST.MF。</strong>这个 <em>manifest 文件</em>定义了与扩展和包相关的数据。 <br>
    <li><strong>INDEX.LIST。</strong> 这个文件由 <code>jar</code> 工具的新选项 <code>-i</code> 生成，它包含在应用程序或者扩展中定义的包的位置信息。它是 JarIndex 实现的一部分，并由类装载器用于加速类装载过程。 <br>
    <li><strong><em>xxx</em>.SF。 </strong>这是 JAR 文件的签名文件。占位符 <em>xxx</em>标识了签名者。 <br>
    <li><strong><em>xxx</em>.DSA。 </strong>与签名文件相关联的签名程序块文件，它存储了用于签名 JAR 文件的公共签名。 </li>
</ul>
<p><a name=N10112><span class=smalltitle><strong><font face=Arial>jar 工具</font></strong></span></a></p>
<p>为了用 JAR 文件执行基本的任务，要使用作为Java Development Kit 的一部分提供的 Java Archive Tool ( <code>jar</code> 工具)。用 <code>jar</code> 命令调用 <code>jar</code> 工具。表 1 显示了一些常见的应用： </p>
<p><a name=N10127><span class=smalltitle><strong><font face=Arial>表 1. 常见的 jar 工具用法 </font></strong></span></a></p>
<p>
<table cellSpacing=0 cellPadding=3 width="100%" border=1>
    <tbody>
        <tr>
            <td><strong>功能</strong> </td>
            <td><strong>命令</strong> </td>
        </tr>
        <tr>
            <td>用一个单独的文件创建一个 JAR 文件</td>
            <td>jar cf jar-file input-file...</td>
        </tr>
        <tr>
            <td>用一个目录创建一个 JAR 文件</td>
            <td>jar cf jar-file dir-name</td>
        </tr>
        <tr>
            <td>创建一个未压缩的 JAR 文件</td>
            <td>jar cf0 jar-file dir-name</td>
        </tr>
        <tr>
            <td>更新一个 JAR 文件</td>
            <td>jar uf jar-file input-file...</td>
        </tr>
        <tr>
            <td>查看一个 JAR 文件的内容</td>
            <td>jar tf jar-file</td>
        </tr>
        <tr>
            <td>提取一个 JAR 文件的内容</td>
            <td>jar xf jar-file</td>
        </tr>
        <tr>
            <td>从一个 JAR 文件中提取特定的文件</td>
            <td>jar xf jar-file archived-file...</td>
        </tr>
        <tr>
            <td>运行一个打包为可执行 JAR 文件的应用程序</td>
            <td>java -jar app.jar</td>
        </tr>
    </tbody>
</table>
</p>
<br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
        </tr>
    </tbody>
</table>
<table class=no-print cellSpacing=0 cellPadding=0 align=right>
    <tbody>
        <tr align=right>
            <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
            <table cellSpacing=0 cellPadding=0 border=0>
                <tbody>
                    <tr>
                        <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                        <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/java/j-jar/?ca=j-t10#main"><strong><font color=#996699>回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=2><span class=atitle>可执行的 JAR</span></a></p>
<p>一个 <em>可执行的 jar</em> 文件是一个自包含的 Java 应用程序，它存储在特别配置的JAR 文件中，可以由 JVM 直接执行它而无需事先提取文件或者设置类路径。要运行存储在非可执行的 JAR 中的应用程序，必须将它加入到您的类路径中，并用名字调用应用程序的主类。但是使用可执行的 JAR 文件，我们可以不用提取它或者知道主要入口点就可以运行一个应用程序。可执行 JAR 有助于方便发布和执行 Java 应用程序。 </p>
<p><a name=N1019E><span class=smalltitle><strong><font face=Arial>创建可执行 JAR</font></strong></span></a></p>
<p>创建一个可执行 JAR 很容易。首先将所有应用程序代码放到一个目录中。假设应用程序中的主类是 <code>com.mycompany.myapp.Sample</code> 。您要创建一个包含应用程序代码的 JAR 文件并标识出主类。为此，在某个位置(不是在应用程序目录中)创建一个名为 <code>manifest</code> 的文件，并在其中加入以下一行： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>Main-Class: com.mycompany.myapp.Sample
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>然后，像这样创建 JAR 文件：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jar cmf manifest ExecutableJar.jar application-dir
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>所要做的就是这些了 -- 现在可以用 <code>java -jar</code> 执行这个 JAR 文件 ExecutableJar.jar。 </p>
<p>一个可执行的 JAR 必须通过 menifest 文件的头引用它所需要的所有其他从属 JAR。如果使用了 <code>-jar</code> 选项，那么环境变量 CLASSPATH 和在命令行中指定的所有类路径都被 JVM 所忽略。 </p>
<p><a name=N101C8><span class=smalltitle><strong><font face=Arial>启动可执行 JAR</font></strong></span></a></p>
<p>既然我们已经将自己的应用程序打包到了一个名为 ExecutableJar.jar 的可执行 JAR 中了，那么我们就可以用下面的命令直接从文件启动这个应用程序：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>java -jar ExecutableJar.jar
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
        </tr>
    </tbody>
</table>
<table class=no-print cellSpacing=0 cellPadding=0 align=right>
    <tbody>
        <tr align=right>
            <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
            <table cellSpacing=0 cellPadding=0 border=0>
                <tbody>
                    <tr>
                        <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                        <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/java/j-jar/?ca=j-t10#main"><strong><font color=#996699>回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=3><span class=atitle>包密封</span></a></p>
<p>密封 JAR 文件中的一个包意味着在这个包中定义的所有类都必须在同一个 JAR 文件中找到。这使包的作者可以增强打包类之间的版本一致性。密封还提供了防止代码篡改的手段。</p>
<p>要密封包，需要在 JAR 的 manifest 文件中为包添加一个 <code>Name</code> 头，然后加上值为&#8220;true&#8221;的 <code>Sealed</code> 头。与可执行的 JAR 一样，可以在创建 JAR 时，通过指定一个具有适当头元素的 manifest 文件密封一个 JAR，如下所示： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>Name: com/samplePackage/
            Sealed: true
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><code>Name</code> 头标识出包的相对路径名。它以一个&#8220;/&#8221;结束以与文件名区别。在 <code>Name</code> 头后面第一个空行之前的所有头都作用于在 <code>Name</code> 头中指定的文件或者包。在上述例子中，因为 <code>Sealed</code> 头出现在 <code>Name</code> 头后并且中间没有空行，所以 <code>Sealed</code> 头将被解释为只应用到包 <code>com/samplePackage</code> 上。 </p>
<p>如果试图从密封包所在的 JAR 文件以外的其他地方装载密封包中的一个类，那么 JVM 将抛出一个 <code>SecurityException</code> 。 </p>
<p><a name=IDAM1WVB>扩展打包 <br>扩展为 Java 平台增加了功能，在 JAR 文件格式中已经加入了扩展机制。扩展机制使得 JAR 文件可以通过 manifest 文件中的 <code>Class-Path</code> 头指定所需要的其他 JAR 文件。 </p>
<p>假设 extension1.jar 和 extension2.jar 是同一个目录中的两个 JAR 文件，extension1.jar 的 manifest 文件包含以下头：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>Class-Path: extension2.jar
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>这个头表明 extension2.jar 中的类是 extension1.jar 中的类的 <em>扩展类</em>。extension1.jar 中的类可以调用 extension2.jar 中的类，并且不要求 extension2.jar 处在类路径中。 </p>
<p>在装载使用扩展机制的 JAR 时，JVM 会高效而自动地将在 <code>Class-Path</code> 头中引用的 JAR 添加到类路径中。不过，扩展 JAR 路径被解释为相对路径，所以一般来说，扩展 JAR 必须存储在引用它的 JAR 所在的同一目录中。 </p>
<p>例如，假设类 <code>ExtensionClient</code> 引用了类 <code>ExtensionDemo</code> ,它捆绑在一个名为 ExtensionClient.jar 的 JAR 文件中，而类 <code>ExtensionDemo</code> 则捆绑在 ExtensionDemo.jar 中。为了使 ExtensionDemo.jar 可以成为扩展，必须将 ExtensionDemo.jar 列在 ExtensionClient.jar 的 manifest 的 <code>Class-Path</code> 头中，如下所示： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>Manifest-Version: 1.0
            Class-Path: ExtensionDemo.jar
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>在这个 manifest 中 <code>Class-Path</code> 头的值是没有指定路径的 ExtensionDemo.jar，表明 ExtensionDemo.jar 与 ExtensionClient JAR 文件处在同一目录中。 </p>
<br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
        </tr>
    </tbody>
</table>
<table class=no-print cellSpacing=0 cellPadding=0 align=right>
    <tbody>
        <tr align=right>
            <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
            <table cellSpacing=0 cellPadding=0 border=0>
                <tbody>
                    <tr>
                        <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                        <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/java/j-jar/?ca=j-t10#main"><strong><font color=#996699>回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=4><span class=atitle>JAR 文件中的安全性</span></a></p>
<p>JAR 文件可以用 <code>jarsigner</code> 工具或者直接通过 <code>java.security</code> API 签名。一个签名的 JAR 文件与原来的 JAR 文件完全相同，只是更新了它的 manifest，并在 META-INF 目录中增加了两个文件，一个签名文件和一个签名块文件。 </p>
<p>JAR 文件是用一个存储在 <em>Keystore</em> 数据库中的证书签名的。存储在 keystore 中的证书有密码保护，必须向 <code>jarsigner</code> 工具提供这个密码才能对 JAR 文件签名。 </p>
<br><br><a name=IDAV3WVB><strong>图 1. Keystore 数据库 </strong></a><br><img height=117 alt="Keystore 数据库" src="http://www.ibm.com/developerworks/cn/java/j-jar/images/keystoredatabase.gif" width=324> <br>
<p>JAR 的每一位签名者都由在 JAR 文件的 META-INF 目录中的一个具有 .SF 扩展名的签名文件表示。这个文件的格式类似于 manifest 文件 -- 一组 RFC-822 头。如下所示，它的组成包括一个主要部分，它包括了由签名者提供的信息、但是不特别针对任何特定的 JAR 文件项，还有一系列的单独的项，这些项也必须包含在 menifest 文件中。在验证一个签名的 JAR 时，将签名文件的摘要值与对 JAR 文件中的相应项计算的摘要值进行比较。</p>
<br><br><a name=IDAA4WVB><strong>清单 1. 签名 JAR 中的 Manifest 和 signature 文件</strong></a><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>Contents of signature file META-INF/MANIFEST.MF
            Manifest-Version: 1.0
            Created-By: 1.3.0 (Sun Microsystems Inc.)
            Name: Sample.java
            SHA1-Digest: 3+DdYW8INICtyG8ZarHlFxX0W6g=
            Name: Sample.class
            SHA1-Digest: YJ5yQHBZBJ3SsTNcHJFqUkfWEmI=
            Contents of signature file META-INF/JAMES.SF
            Signature-Version: 1.0
            SHA1-Digest-Manifest: HBstZOJBuuTJ6QMIdB90T8sjaOM=
            Created-By: 1.3.0 (Sun Microsystems Inc.)
            Name: Sample.java
            SHA1-Digest: qipMDrkurQcKwnyIlI3Jtrnia8Q=
            Name: Sample.class
            SHA1-Digest: pT2DYby8QXPcCzv2NwpLxd8p4G4=
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p><a name=N10288><span class=smalltitle><strong><font face=Arial>数字签名</font></strong></span></a></p>
<p>一个数字签名是.SF 签名文件的已签名版本。数字签名文件是二进制文件，并且与 .SF 文件有相同的文件名，但是扩展名不同。根据数字签名的类型 -- RSA、DSA 或者 PGP -- 以及用于签名 JAR 的证书类型而有不同的扩展名。</p>
<p><a name=N10291><span class=smalltitle><strong><font face=Arial>Keystore</font></strong></span></a></p>
<p>要签名一个 JAR 文件，必须首先有一个私钥。私钥及其相关的公钥证书存储在名为 <code>keystores</code> 的、有密码保护的数据库中。JDK 包含创建和修改 keystores 的工具。keystore 中的每一个密钥都可以用一个别名标识，它通常是拥有这个密钥的签名者的名字。 </p>
<p>所有 keystore 项(密钥和信任的证书项)都是用唯一别名访问的。别名是在用 <code>keytool -genkey</code> 命令生成密钥对(公钥和私钥)并在 keystore 中添加项时指定的。之后的 <code>keytool</code> 命令必须使用同样的别名引用这一项。 </p>
<p>例如，要用别名&#8220;james&#8221;生成一个新的公钥/私钥对并将公钥包装到自签名的证书中，要使用下述命令：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>keytool -genkey -alias james -keypass jamespass
            -validity 80 -keystore jamesKeyStore
            -storepass jamesKeyStorePass
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>这个命令序列指定了一个初始密码&#8220;jamespass&#8221;，后续的命令在访问 keystore &#8220;jamesKeyStore&#8221;中与别名&#8220;james&#8221;相关联的私钥时，就需要这个密码。如果 keystore&#8220;jamesKeyStore&#8221;不存在，则 <code>keytool</code> 会自动创建它。 </p>
<p><a name=N102B7><span class=smalltitle><strong><font face=Arial>jarsigner 工具</font></strong></span></a></p>
<p><code>jarsigner</code> 工具使用 keystore 生成或者验证 JAR 文件的数字签名。 </p>
<p>假设像上述例子那样创建了 keystore &#8220;jamesKeyStore&#8221;，并且它包含一个别名为&#8220;james&#8221;的密钥，可以用下面的命令签名一个 JAR 文件：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jarsigner -keystore jamesKeyStore -storepass jamesKeyStorePass
            -keypass jamespass -signedjar SSample.jar Sample.jar james
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>这个命令用密码&#8220;jamesKeyStorePass&#8221;从名为&#8220;jamesKeyStore&#8221;的 keystore 中提出别名为&#8220;james&#8221;、密码为&#8220;jamespass&#8221;的密钥，并对 Sample.jar 文件签名、创建一个签名的 JAR -- SSample.jar。</p>
<p><code>jarsigner</code> 工具还可以验证一个签名的 JAR 文件，这种操作比签名 JAR 文件要简单得多，只需执行以下命令： </p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jarsigner -verify SSample.jar
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>如果签名的 JAR 文件没有被篡改过，那么 <code>jarsigner</code> 工具就会告诉您 JAR 通过验证了。否则，它会抛出一个 <code>SecurityException</code> ， 表明哪些文件没有通过验证。 </p>
<p>还可以用 <code>java.util.jar</code> 和 <code>java.security</code> API 以编程方式签名 JAR(有关细节参阅 <a href="http://www.ibm.com/developerworks/cn/java/j-jar/?ca=j-t10#resources"><u><font color=#996699>参考资料</font></u></a>)。也可以使用像 Netscape Object Signing Tool 这样的工具。 </p>
<br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
        </tr>
    </tbody>
</table>
<table class=no-print cellSpacing=0 cellPadding=0 align=right>
    <tbody>
        <tr align=right>
            <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
            <table cellSpacing=0 cellPadding=0 border=0>
                <tbody>
                    <tr>
                        <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                        <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/java/j-jar/?ca=j-t10#main"><strong><font color=#996699>回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=5><span class=atitle>JAR 索引</span></a></p>
<p>如果一个应用程序或者 applet 捆绑到多个 JAR 文件中，那么类装载器就使用一个简单的线性搜索算法搜索类路径中的每一个元素，这使类装载器可能要下载并打开许多个 JAR 文件，直到找到所要的类或者资源。如果类装载器试图寻找一个不存在的资源，那么在应用程序或者 applet 中的所有 JAR 文件都会下载。对于大型的网络应用程序和 applet，这会导致启动缓慢、响应迟缓并浪费带宽。</p>
<p>从 JDK 1.3 以后，JAR 文件格式开始支持索引以优化网络应用程序中类的搜索过程，特别是 applet。JarIndex 机制收集在 applet 或者应用程序中定义的所有 JAR 文件的内容，并将这些信息存储到第一个 JAR 文件中的索引文件中。下载了第一个 JAR 文件后，applet 类装载器将使用收集的内容信息高效地装载 JAR 文件。这个目录信息存储在根 JAR 文件的 META-INF 目录中的一个名为 INDEX.LIST 的简单文本文件中。</p>
<p><a name=IDA3BXVB>创建一个 JarIndex <br>可以通过在 <code>jar</code> 命令中指定 <code>-i</code> 选项创建一个 JarIndex。假设我们的目录结构如下图所示： </p>
<br><br><a name=IDAOCXVB><strong>图 2. JarIndex </strong></a><br><img height=163 alt="JarIndex Demo" src="http://www.ibm.com/developerworks/cn/java/j-jar/images/jarindex.gif" width=329> <br>
<p>您将使用下述命令为 JarIndex_Main.jar、JarIndex_test.jar 和 JarIndex_test1.jar 创建一个索引文件：</p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>jar -i JarIndex_Main.jar JarIndex_test.jar SampleDir/JarIndex_test1.jar
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br>
<p>INDEX.LIST 文件的格式很简单，包含每个已索引的 JAR 文件中包含的包或者类的名字，如清单 2 所示：</p>
<br><br><a name=IDA3CXVB><strong>清单 2. JarIndex INDEX.LIST 文件示例</strong></a><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td class=code-outline>
            <pre class=displaycode>JarIndex-Version: 1.0
            JarIndex_Main.jar
            sp
            JarIndex_test.jar
            Sample
            SampleDir/JarIndex_test1.jar
            org
            org/apache
            org/apache/xerces
            org/apache/xerces/framework
            org/apache/xerces/framework/xml4j
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td><img height=1 alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%"><br><img height=6 alt="" src="http://www.ibm.com/i/c.gif" width=8 border=0></td>
        </tr>
    </tbody>
</table>
<table class=no-print cellSpacing=0 cellPadding=0 align=right>
    <tbody>
        <tr align=right>
            <td><img height=4 alt="" src="http://www.ibm.com/i/c.gif" width="100%"><br>
            <table cellSpacing=0 cellPadding=0 border=0>
                <tbody>
                    <tr>
                        <td vAlign=center><img height=16 alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width=16 border=0><br></td>
                        <td vAlign=top align=right><a class=fbox href="http://www.ibm.com/developerworks/cn/java/j-jar/?ca=j-t10#main"><strong><font color=#996699>回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br><br>
<p><a name=6><span class=atitle>结束语</span></a></p>
<p>JAR 格式远远超出了一种压缩格式，它有许多可以改进效率、安全性和组织 Java 应用程序的功能。因为这些功能已经建立在核心平台 -- 包括编译器和类装载器 -- 中了，所以开发人员可以利用 JAR 文件格式的能力简化和改进开发和部署过程。.</p>
<br><br>
<p><a name=resources><span class=atitle>参考资料 </span></a></p>
<ul>
    <li>您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www.ibm.com/developerworks/library/j-jar/index.html?S_TACT=105AGX52&amp;S_CMP=cn-a-j"><u><font color=#5c81a7>英文原文</font></u></a>. <br><br>
    <li>参阅 <a href="http://java.sun.com/docs/books/tutorial/jar/basics/index.html"><u><font color=#5c81a7>jar</font></u></a> 实用程序的命令行选项的文档。 <br><br><br>
    <li>Raffi Krikorian 在 ONJava 上发表的文章提供了有关 <a href="http://www.onjava.com/pub/a/onjava/2001/04/12/signing_jar.html?page=1"><u><font color=#5c81a7>programmatically signing a JAR file</font></u></a>的帮助。 <br><br><br>
    <li>这篇关于 <a href="http://robocode.alphaworks.ibm.com/docs/jdk1.3/tooldocs/solaris/jar.html"><u><font color=#5c81a7>Java Archive Tool</font></u></a>的文档解释了创建和操作 JAR 文件可以使用的选项。 <br><br><br>
    <li>文章&#8220; <a href="http://www.ibm.com/developerworks/cn/java/j-webstart/"><u><font color=#5c81a7>Java Web Start</font></u></a>&#8221;( <em>developerWorks</em>，2001 年 9 月)描述了如何使用这种技术，以便允许应用程序可以指定所需的 JAR 文件并动态下载它们。 <br><br><br>
    <li>有关 J2EE 服务器（比如 IBM WebSphere Application Server）使用 JAR 文件格式的不同方式，请参阅&#8220; <a href="http://www7b.software.ibm.com/wsdd/WASInfoCenter/infocenter/wasa_content/003401.html"><u><font color=#5c81a7>What are Java Archive (JAR) files?</font></u></a>&#8221; <br><br><br>
    <li>JAR 格式是 WAR (Web Archive) 格式的基础，WAR用于在 J2EE 容器中部署 Servlet 和 JSP 应用程序。更多内容请参阅&#8220; <a href="http://www.ibm.com/servers/eserver/iseries/software/websphere/wsappserver/docs/as400v35/help/000801.html"><u><font color=#5c81a7>What are WAR files?</font></u></a>&#8221;。 <br><br><br>
    <li>JAR 格式也是 EAR (Enterprise Archive) 格式的基础，EAR 用于在 J2EE 容器中部署 EJB。更多内容请参阅&#8220; <a href="http://www7b.software.ibm.com/wsdd/WASInfoCenter/infocenter/wasa_content/000101.html"><u><font color=#5c81a7>What are Enterprise Archive (EAR) files?</font></u></a>&#8221;。 <br><br><br>
    <li>在 <a href="http://www.ibm.com/developerworks/cn/java/"><u><font color=#996699><em>developerWorks</em> Java 技术专区 </font></u></a>上可以找到数百篇关于 Java 编程的各个方面的文章。 <br><br></li>
</ul>
<br><br>
<p><a name=author><span class=atitle>作者简介</span></a></p>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td colSpan=3><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width="100%"></td>
        </tr>
        <tr vAlign=top align=left>
            <td>
            <p><img height=80 alt="Photo of Pagadala Suresh" src="http://www.ibm.com/developerworks/cn/java/j-jar/p-suresh.jpg" width=64 align=left></p>
            </td>
            <td><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width=4></td>
            <td width="100%">
            <p>Pagadala J. Suresh 是 IBM Global Services India 的软件工程师。他擅长的领域包括 Java 技术、WebSphere Application Server 和 WebSphere Studio Application Developer (WSAD)、Ariba Buyer。他参与了 WebSphere 的 IBM Redbook 项目。可以通过 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#106;&#115;&#117;&#114;&#101;&#115;&#104;&#64;&#105;&#110;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;&#63;&#99;&#99;&#61;&#112;&#106;&#115;&#117;&#114;&#101;&#115;&#104;&#64;&#105;&#110;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;"><u><font color=#5c81a7>pjsuresh@in.ibm.com</font></u></a> 与 Pagadala 联系。 </p>
            </td>
        </tr>
    </tbody>
</table>
<br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr>
            <td colSpan=3><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width="100%"></td>
        </tr>
        <tr vAlign=top align=left>
            <td>
            <p><img height=80 alt="Photo of Palaniyappan Thiagarajan" src="http://www.ibm.com/developerworks/cn/i/p-thiagarajan.jpg" width=64 align=left></p>
            </td>
            <td><img height=5 alt="" src="http://www.ibm.com/i/c.gif" width=4></td>
            <td width="100%">
            <p>Palaniyappan Thiagarajan 是位于印度班加罗尔的 IBM Global Services India 的软件工程师。他是IBM 认证的 IBM WebSphere Application Server V3.5 和 IBM DB2 UDB V7.1 Family Fundamentals 专家。可以通过 <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#112;&#97;&#108;&#97;&#110;&#105;&#121;&#64;&#105;&#110;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;&#63;&#99;&#99;&#61;&#116;&#112;&#97;&#108;&#97;&#110;&#105;&#121;&#64;&#105;&#110;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;"><u><font color=#5c81a7>tpalaniy@in.ibm.com</font></u></a> 与 Palaniyappan 联系。 </p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/simie/aggbug/128852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-08 10:17 <a href="http://www.blogjava.net/simie/archive/2007/07/08/128852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaBeans 程序开发从入门到精通教程</title><link>http://www.blogjava.net/simie/archive/2007/07/03/127856.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Tue, 03 Jul 2007 07:14:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/03/127856.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127856.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/03/127856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127856.html</trackback:ping><description><![CDATA[JavaBeans的属性&nbsp;<br><br>JavaBeans的属性与一般Java程序中所指的属性，或者说与所有面向对象的程序设计语言中对象的属性是一个概念，在程序中的具体体现就是类中的变量。在JavaBeans设计中，按照属性的不同作用又细分为四类：Simple,&nbsp;Index,&nbsp;Bound与Constrained属性。&nbsp;<br><br>1.&nbsp;Simple属性&nbsp;<br><br>一个简单属性表示一个伴随有一对get/set方法（C语言的过程或函数在Java程序中称为"方法"）的变量。属性名与和该属性相关的get/set方法名对应。例如：如果有setX和getX方法，则暗指有一个名为"X"的属性。如果有一个方法名为isX，则通常暗指"X"是一个布尔属性（即X的值为true或false）。例如在下面这个程序中：&nbsp;<br><br><br>public&nbsp;class&nbsp;alden1&nbsp;extends&nbsp;Canvas&nbsp;{&nbsp;<br>string&nbsp;ourString=&nbsp;"Hello";&nbsp;//属性名为ourString，类型为字符串&nbsp;<br>public&nbsp;alden1(){&nbsp;　　　　//alden1()是alden1的构造函数，&nbsp;<br>与C++中构造函数的意义相同&nbsp;<br>setBackground(Color.red);&nbsp;<br>setForeground(Color.blue);&nbsp;<br>}&nbsp;<br>/*&nbsp;"set"属性*/&nbsp;<br>public&nbsp;void&nbsp;setString(String&nbsp;newString)&nbsp;{&nbsp;<br>ourString=newString;&nbsp;<br>}&nbsp;<br>/*&nbsp;"get"属性&nbsp;*/&nbsp;<br>public&nbsp;String&nbsp;getString()&nbsp;{&nbsp;<br>return&nbsp;ourString;&nbsp;<br>}&nbsp;<br>}&nbsp;<br><br><br><br><br>2.&nbsp;Indexed属性&nbsp;<br><br>一个Indexed属性表示一个数组值。使用与该属性对应的set/get方法可取得数组中的数值。该属性也可一次设置或取得整个数组的值。例：&nbsp;<br><br><br>public&nbsp;class&nbsp;alden2&nbsp;extends&nbsp;Canvas&nbsp;{&nbsp;<br>int[]&nbsp;dataSet={1,2,3,4,5,6};&nbsp;//&nbsp;dataSet是一个indexed属性&nbsp;<br>public&nbsp;alden2()&nbsp;{&nbsp;<br>setBackground(Color.red);&nbsp;<br>setForeground(Color.blue);&nbsp;<br>}&nbsp;<br>/*&nbsp;设置整个数组　*/&nbsp;<br>public&nbsp;void&nbsp;setDataSet(int[]&nbsp;x){&nbsp;<br>dataSet=x;&nbsp;<br>}&nbsp;<br>/*&nbsp;设置数组中的单个元素值&nbsp;*/&nbsp;<br>public&nbsp;void&nbsp;setDataSet(int&nbsp;index,&nbsp;int&nbsp;x){&nbsp;<br>dataSet[index]=x;&nbsp;<br>}&nbsp;<br>/*&nbsp;取得整个数组值&nbsp;*/&nbsp;<br>public&nbsp;int[]&nbsp;getDataSet(){&nbsp;<br>return&nbsp;dataSet;&nbsp;<br>}&nbsp;<br>/*&nbsp;取得数组中的指定元素值&nbsp;*/&nbsp;<br>public&nbsp;int&nbsp;getDataSet(int&nbsp;x){&nbsp;<br>return&nbsp;dataSet[x];&nbsp;<br>}&nbsp;<br>}&nbsp;<br><br><br><br><br>3.&nbsp;Bound属性&nbsp;<br><br>一个Bound属性是指当该种属性的值发生变化时，要通知其它的对象。每次属性值改变时，这种属性就点火一个PropertyChange事件(在Java程序中，事件也是一个对象)。事件中封装了属性名、属性的原值、属性变化后的新值。这种事件是传递到其它的Beans，至于接收事件的Beans应做什么动作由其自己定义。当PushButton的background属性与Dialog的background属性bind时，若PushButton的background属性发生变化时，Dialog的background属性也发生同样的变化。&nbsp;例：&nbsp;<br><br><br>public&nbsp;class&nbsp;alden3&nbsp;extends&nbsp;Canvas{&nbsp;<br>String&nbsp;ourString=&nbsp;"Hello";&nbsp;<br>//ourString是一个bound属性&nbsp;<br>private&nbsp;PropertyChangeSupport&nbsp;changes&nbsp;=&nbsp;new&nbsp;PropertyChangeSupport(this);&nbsp;<br>/**&nbsp;注：Java是纯面向对象的语言，&nbsp;<br>如果要使用某种方法则必须指明是要使用哪个对象的方法，&nbsp;<br>在下面的程序中要进行点火事件的操作，&nbsp;<br>这种操作所使用的方法是在PropertyChangeSupport类中的。&nbsp;<br>所以上面声明并实例化了一个changes对象，&nbsp;<br>在下面将使用changes的firePropertyChange方法来点火ourString的属性改变事件。*/&nbsp;<br><br>public&nbsp;void&nbsp;setString(string&nbsp;newString){&nbsp;<br>String&nbsp;oldString&nbsp;=&nbsp;ourString;&nbsp;<br>ourString&nbsp;=&nbsp;newString;&nbsp;<br>/*&nbsp;ourString的属性值已发生变化，于是接着点火属性改变事件&nbsp;*/&nbsp;<br>changes.firePropertyChange("ourString",oldString,newString);&nbsp;<br>}&nbsp;<br>public&nbsp;String&nbsp;getString(){&nbsp;<br>return&nbsp;ourString;&nbsp;<br>}&nbsp;<br>/**&nbsp;以下代码是为开发工具所使用的。&nbsp;<br>我们不能预知alden3将与哪些其它的Beans组合成为一个应用，&nbsp;<br>无法预知若alden3的ourString属性发生变化时有哪些其它的组件与此变化有关，&nbsp;<br>因而alden3这个Beans要预留出一些接口给开发工具，&nbsp;<br>开发工具使用这些接口，&nbsp;<br>把其它的JavaBeans对象与alden3挂接。*/&nbsp;<br><br>public&nbsp;void&nbsp;addPropertyChangeListener(PropertyChangeLisener&nbsp;l){&nbsp;<br>changes.addPropertyChangeListener(l);&nbsp;<br>}&nbsp;<br>public&nbsp;void&nbsp;removePropertyChangeListener(PropertyChangeListener&nbsp;l){&nbsp;<br>changes.removePropertyChangeListener(l);&nbsp;<br>}&nbsp;<br><br><br><br><br>通过上面的代码，&nbsp;<br><br>开发工具调用changes的addPropertyChangeListener方法&nbsp;<br><br>把其它JavaBeans注册入ourString属性的监听者队列l中，&nbsp;<br><br>l是一个Vector数组，可存储任何Java对象。&nbsp;<br><br>开发工具也可使用changes的removePropertyChangeListener方法，&nbsp;<br><br>从l中注销指定的对象，&nbsp;<br><br>使alden3的ourString属性的改变不再与这个对象有关。&nbsp;<br><br>当然，当程序员手写代码编制程序时，&nbsp;<br><br>也可直接调用这两个方法，&nbsp;<br><br>把其它Java对象与alden3挂接。&nbsp;<br><br>4.&nbsp;Constrained属性&nbsp;<br><br>一个JavaBeans的constrained属性，是指当这个属性的值要发生变化时，与这个属性已建立了某种连接的其它Java对象可否决属性值的改变。constrained属性的监听者通过抛出PropertyVetoException来阻止该属性值的改变。例：下面程序中的constrained属性是PriceInCents。&nbsp;<br><br><br>public&nbsp;class&nbsp;JellyBeans&nbsp;extends&nbsp;Canvas{&nbsp;<br>private&nbsp;PropertyChangeSupport&nbsp;changes=new&nbsp;PropertyChangeSupport(this);&nbsp;<br>private&nbsp;VetoableChangeSupport&nbsp;Vetos=new&nbsp;VetoableChangeSupport(this);&nbsp;<br>/*与前述changes相同，&nbsp;<br>可使用VetoableChangeSupport对象的实例Vetos中的方法，&nbsp;<br>在特定条件下来阻止PriceInCents值的改变。*/&nbsp;<br><br><br>......&nbsp;<br>public&nbsp;void&nbsp;setPriceInCents(int&nbsp;newPriceInCents)&nbsp;throws&nbsp;PropertyVetoException&nbsp;{&nbsp;<br>/*方法名中throws&nbsp;PropertyVetoException的作用是当有&nbsp;<br>其它Java对象否决PriceInCents的改变时，&nbsp;<br>要抛出例外。*/&nbsp;<br>/*&nbsp;先保存原来的属性值*/&nbsp;<br><br>int&nbsp;oldPriceInCents=ourPriceInCents;&nbsp;<br>/**点火属性改变否决事件*/&nbsp;<br>vetos.fireVetoableChange("priceInCents",new&nbsp;Integer(OldPriceInCents),&nbsp;<br>new&nbsp;Integer(newPriceInCents));&nbsp;<br><br>/**若有其它对象否决priceInCents的改变，&nbsp;<br>则程序抛出例外，不再继续执行下面的两条语句，&nbsp;<br>方法结束。若无其它对象否决priceInCents的改变，&nbsp;<br>则在下面的代码中把ourPriceIncents赋予新值，&nbsp;<br>并点火属性改变事件*/&nbsp;<br><br>ourPriceInCents=newPriceInCents;&nbsp;<br>changes.firePropertyChange("priceInCents",&nbsp;<br>new&nbsp;Integer(oldPriceInCents),&nbsp;<br>new&nbsp;Integer(newPriceInCents));&nbsp;<br>}&nbsp;<br><br>/**与前述changes相同，&nbsp;<br>也要为PriceInCents属性预留接口，&nbsp;<br>使其它对象可注册入PriceInCents否决改变监听者队列中，&nbsp;<br>或把该对象从中注销&nbsp;<br><br>public&nbsp;void&nbsp;addVetoableChangeListener(VetoableChangeListener&nbsp;l)&nbsp;<br>{&nbsp;vetos.addVetoableChangeListener(l);&nbsp;<br>}&nbsp;<br>public&nbsp;void&nbsp;removeVetoableChangeListener(VetoableChangeListener&nbsp;l){&nbsp;<br>vetos.removeVetoableChangeListener(l);&nbsp;<br>}&nbsp;<br>......&nbsp;<br>}&nbsp;<br><br><br><br><br>从上面的例子中可看到，一个constrained属性有两种监听者：属性变化监听者和否决属性改变的监听者。否决属性改变的监听者在自己的对象代码中有相应的控制语句，在监听到有constrained属性要发生变化时，在控制语句中判断是否应否决这个属性值的改变。&nbsp;<br><br>总之，某个Beans的constrained属性值可否改变取决于其它的Beans或者是Java对象是否允许这种改变。允许与否的条件由其它的Beans或Java对象在自己的类中进行定义。&nbsp;<br><br>JavaBeans的事件&nbsp;<br><br>事件处理是JavaBeans体系结构的核心之一。通过事件处理机制，可让一些组件作为事件源，发出可被描述环境或其它组件接收的事件。这样，不同的组件就可在构造工具内组合在一起，组件之间通过事件的传递进行通信，构成一个应用。从概念上讲，事件是一种在"源对象"和"监听者对象"之间，某种状态发生变化的传递机制。事件有许多不同的用途，例如在Windows系统中常要处理的鼠标事件、窗口边界改变事件、键盘事件等。在Java和JavaBeans中则是定义了一个一般的、可扩充的事件机制，这种机制能够：&nbsp;<br><br>对事件类型和传递的模型的定义和扩充提供一个公共框架，并适合于广泛的应用。&nbsp;<br><br>与Java语言和环境有较高的集成度。&nbsp;<br><br>事件能被描述环境捕获和点火。&nbsp;<br><br>能使其它构造工具采取某种技术在设计时直接控制事件，以及事件源和事件监听者之间的联系。&nbsp;<br><br>事件机制本身不依赖于复杂的开发工具。特别地，还应当：&nbsp;<br><br>能够发现指定的对象类可以生成的事件。&nbsp;<br><br>能够发现指定的对象类可以观察（监听）到的事件。&nbsp;<br><br>提供一个常规的注册机制，允许动态操纵事件源与事件监听者之间的关系。&nbsp;<br><br>不需要其它的虚拟机和语言即可实现。&nbsp;<br><br>事件源与监听者之间可进行高效的事件传递。&nbsp;<br><br>能完成JavaBeans事件模型与相关的其它组件体系结构事件模型的中立映射。&nbsp;<br><br>JavaBeans事件模型的主要构成有：&nbsp;事件从事件源到监听者的传递是通过对目标监听者对象的Java方法调用进行的。对每个明确的事件的发生，都相应地定义一个明确的Java方法。这些方法都集中定义在事件监听者（EventListener）接口中，这个接口要继承java.util.EventListener。实现了事件监听者接口中一些或全部方法的类就是事件监听者。&nbsp;伴随着事件的发生，相应的状态通常都封装在事件状态对象中，该对象必须继承自java.util.EventObject。事件状态对象作为单参传递给应响应该事件的监听者方法中。&nbsp;发出某种特定事件的事件源的标识是：遵从规定的设计格式为事件监听者定义注册方法，并接受对指定事件监听者接口实例的引用。&nbsp;有时，事件监听者不能直接实现事件监听者接口，或者还有其它的额外动作时，就要在一个源与其它一个或多个监听者之间插入一个事件适配器类的实例，来建立它们之间的联系。&nbsp;<br><br>事件状态对象（Event&nbsp;State&nbsp;Object）&nbsp;<br><br>与事件发生有关的状态信息一般都封装在一个事件状态对象中，这种对象是java.util.EventObject的子类。按设计习惯，这种事件状态对象类的名应以Event结尾。例如：&nbsp;<br><br><br>public&nbsp;class&nbsp;MouseMovedExampleEvent&nbsp;extends&nbsp;java.util.EventObject&nbsp;<br><br>{&nbsp;protected&nbsp;int&nbsp;x,&nbsp;y；&nbsp;<br>/*　创建一个鼠标移动事件MouseMovedExampleEvent&nbsp;*/&nbsp;<br>　&nbsp;MouseMovedExampleEvent(java.awt.Component&nbsp;source,&nbsp;Point&nbsp;location)&nbsp;{&nbsp;<br>super(source);&nbsp;<br>x&nbsp;=&nbsp;location.x;&nbsp;<br>y&nbsp;=&nbsp;location.y;&nbsp;<br>}&nbsp;<br>/*&nbsp;获取鼠标位置*/&nbsp;<br>public&nbsp;Point&nbsp;getLocation()&nbsp;{&nbsp;<br>return&nbsp;new&nbsp;Point(x,&nbsp;y);&nbsp;<br>}}&nbsp;<br><br><br><br><br>事件监听者接口（EventListener&nbsp;Interface）与事件监听者&nbsp;<br><br>由于Java事件模型是基于方法调用，因而需要一个定义并组织事件操纵方法的方式。JavaBeans中，事件操纵方法都被定义在继承了java.util.EventListener类的EventListener接口中，按规定，EventListener接口的命名要以Listener结尾。任何一个类如果想操纵在EventListener接口中定义的方法都必须以实现这个接口方式进行。这个类也就是事件监听者。例如：&nbsp;<br><br><br>/*先定义了一个鼠标移动事件对象*/&nbsp;<br>　　&nbsp;public&nbsp;class&nbsp;MouseMovedExampleEvent&nbsp;<br>extends&nbsp;java.util.EventObject&nbsp;{&nbsp;<br>//&nbsp;在此类中包含了与鼠标移动事件有关的状态信息&nbsp;<br>　　　　&nbsp;...&nbsp;<br>　　&nbsp;}&nbsp;<br>　　&nbsp;/*定义了鼠标移动事件的监听者接口*/&nbsp;<br>　　&nbsp;interface&nbsp;MouseMovedExampleListener&nbsp;<br>extends&nbsp;java.util.EventListener&nbsp;{&nbsp;<br>/*在这个接口中定义了鼠标移动事件监听者所应支持的方法*/&nbsp;<br>void&nbsp;mouseMoved(MouseMovedExampleEvent&nbsp;mme);&nbsp;<br>}&nbsp;<br><br>在接口中只定义方法名，&nbsp;<br>方法的参数和返回值类型。&nbsp;<br>如：上面接口中的mouseMoved方法的&nbsp;<br>具体实现是在下面的ArbitraryObject类中定义的。&nbsp;<br><br>class&nbsp;ArbitraryObject&nbsp;implements&nbsp;MouseMovedExampleListener&nbsp;{&nbsp;<br>　　　&nbsp;public&nbsp;void&nbsp;mouseMoved(MouseMovedExampleEvent&nbsp;mme)&nbsp;<br>　&nbsp;{&nbsp;...&nbsp;}&nbsp;<br>｝&nbsp;<br>ArbitraryObject就是MouseMovedExampleEvent事件的监听者。&nbsp;<br><br><br><br><br>事件监听者的注册与注销&nbsp;<br><br>为了各种可能的事件监听者把自己注册入合适的事件源中，建立源与事件监听者间的事件流，事件源必须为事件监听者提供注册和注销的方法。在前面的bound属性介绍中已看到了这种使用过程，在实际中，事件监听者的注册和注销要使用标准的设计格式：&nbsp;<br><br><br>public&nbsp;void&nbsp;add&lt;&nbsp;ListenerType&gt;(&lt;&nbsp;ListenerType&gt;&nbsp;listener)；&nbsp;<br>public&nbsp;void&nbsp;remove&lt;&nbsp;ListenerType&gt;(&lt;&nbsp;ListenerType&gt;&nbsp;listener)；&nbsp;<br><br><br><br><br>例如：&nbsp;<br><br>首先定义了一个事件监听者接口：&nbsp;<br><br><br>public&nbsp;interface&nbsp;<br>ModelChangedListener&nbsp;extends&nbsp;java.util.EventListener&nbsp;{&nbsp;<br>void&nbsp;modelChanged(EventObject&nbsp;e);&nbsp;<br>}&nbsp;<br><br><br><br><br>接着定义事件源类：&nbsp;<br><br><br>public&nbsp;abstract&nbsp;class&nbsp;Model&nbsp;{&nbsp;<br>private&nbsp;Vector&nbsp;listeners&nbsp;=&nbsp;new&nbsp;Vector();&nbsp;//&nbsp;定义了一个储存事件监听者的数组&nbsp;<br><br>/*上面设计格式中的&lt;&nbsp;ListenerType&gt;在此处即是下面的ModelChangedListener*/&nbsp;<br><br>public&nbsp;synchronized&nbsp;void&nbsp;addModelChangedListener(ModelChangedListener&nbsp;mcl)&nbsp;<br>　　&nbsp;{&nbsp;listeners.addElement(mcl);&nbsp;}//把监听者注册入listeners数组中&nbsp;<br>public&nbsp;synchronized&nbsp;void&nbsp;removeModelChangedListener(ModelChangedListener&nbsp;mcl)&nbsp;<br>　　　　&nbsp;{&nbsp;listeners.removeElement(mcl);&nbsp;//把监听者从listeners中注销&nbsp;<br>　　　　&nbsp;｝&nbsp;<br>　　&nbsp;/*以上两个方法的前面均冠以synchronized，&nbsp;<br>是因为运行在多线程环境时，&nbsp;<br>可能同时有几个对象同时要进行注册和注销操作，&nbsp;<br>使用synchronized来确保它们之间的同步。&nbsp;<br>开发工具或程序员使用这两个方法建立源与监听者之间的事件流*/&nbsp;<br><br>protected&nbsp;void&nbsp;notifyModelChanged()&nbsp;{&nbsp;<br>/**事件源使用本方法通知监听者发生了modelChanged事件*/&nbsp;<br>　　　&nbsp;Vector&nbsp;l;&nbsp;<br>　　　　&nbsp;EventObject&nbsp;e&nbsp;=&nbsp;new&nbsp;EventObject(this);&nbsp;<br>/*&nbsp;首先要把监听者拷贝到l数组中，&nbsp;<br>冻结EventListeners的状态以传递事件。&nbsp;<br>这样来确保在事件传递到所有监听者之前，&nbsp;<br>已接收了事件的目标监听者的对应方法暂不生效。*/&nbsp;<br>　　　　&nbsp;synchronized(this)&nbsp;{&nbsp;<br>　　　　　　&nbsp;l&nbsp;=&nbsp;(Vector)listeners.clone();&nbsp;<br>　　　　&nbsp;}&nbsp;<br>　　　　&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;l.size();&nbsp;i++)&nbsp;{&nbsp;<br>　　　　&nbsp;/*&nbsp;依次通知注册在监听者队列中的每个监听者发生了modelChanged事件，&nbsp;<br>　　　　&nbsp;并把事件状态对象e作为参数传递给监听者队列中的每个监听者*/&nbsp;<br>((ModelChangedListener)l.elementAt(i)).modelChanged(e);&nbsp;<br>　　　　&nbsp;}&nbsp;<br>　　　&nbsp;}&nbsp;<br>　　　&nbsp;}&nbsp;<br><br><br><br><br>在程序中可见事件源Model类显式地调用了接口中的modelChanged方法，实际是把事件状态对象e作为参数，传递给了监听者类中的modelChanged方法。&nbsp;<br><br>适配类&nbsp;<br><br>适配类是Java事件模型中极其重要的一部分。在一些应用场合，事件从源到监听者之间的传递要通过适配类来"转发"。例如：当事件源发出一个事件，而有几个事件监听者对象都可接收该事件，但只有指定对象做出反应时，就要在事件源与事件监听者之间插入一个事件适配器类，由适配器类来指定事件应该是由哪些监听者来响应。&nbsp;<br><br>适配类成为了事件监听者，事件源实际是把适配类作为监听者注册入监听者队列中，而真正的事件响应者并未在监听者队列中，事件响应者应做的动作由适配类决定。目前绝大多数的开发工具在生成代码时，事件处理都是通过适配类来进行的。&nbsp;<br><br>JavaBeans用户化&nbsp;<br><br>JavaBeans开发者可以给一个Beans添加用户化器（Customizer）、属性编辑器（PropertyEditor）和BeansInfo接口来描述一个Beans的内容，Beans的使用者可在构造环境中通过与Beans附带在一起的这些信息来用户化Beans的外观和应做的动作。一个Beans不必都有BeansCustomizer、PrpertyEditor和BeansInfo，根据实际情况，这些是可选的，当有些Beans较复杂时，就要提供这些信息，以Wizard的方式使Beans的使用者能够用户化一个Beans。有些简单的Beans可能这些信息都没有，则构造工具可使用自带的透视装置，透视出Beans的内容，并把信息显示到标准的属性表或事件表中供使用者用户化Beans，前几节提到的Beans的属性、方法和事件名要以一定的格式命名，主要的作用就是供开发工具对Beans进行透视。当然也是给程序员在手写程序中使用Beans提供方便，使他能观其名、知其意。&nbsp;<br><br>用户化器接口（Customizer&nbsp;Interface）&nbsp;<br><br>当一个Beans有了自己的用户化器时，在构造工具内就可展现出自己的属性表。在定义用户化器时必须要实现java.Beanss.Customizer接口。例如，下面是一个"按钮"Beans的用户化一器：&nbsp;<br><br><br>public&nbsp;class&nbsp;OurButtonCustomizer&nbsp;<br>extends&nbsp;Panel&nbsp;implements&nbsp;Customizer&nbsp;{&nbsp;<br>...&nbsp;...&nbsp;<br>/*当实现象OurButtonCustomizer这样的常规属性表时，&nbsp;<br>一定要在其中实现addProperChangeListener&nbsp;<br>和removePropertyChangeListener,这样，&nbsp;<br>构造工具可用这些功能代码为属性事件添加监听者。*/&nbsp;<br>...&nbsp;...&nbsp;<br>private&nbsp;PropertyChangeSupport&nbsp;changes=new&nbsp;PropertyChangeSupport(this);&nbsp;<br>public&nbsp;void&nbsp;addPropertyChangeListener(PropertyChangeListener&nbsp;l)&nbsp;{&nbsp;<br>changes.addPropertyChangeListener(l);&nbsp;<br>public&nbsp;void&nbsp;removePropertyChangeListener(PropertyChangeListener&nbsp;l)&nbsp;{&nbsp;<br>changes.removePropertyChangeListener(l);&nbsp;<br>}&nbsp;<br>...&nbsp;...&nbsp;<br><br><br><br><br>属性编辑器接口（PropertyEditor&nbsp;Interface）&nbsp;<br><br>一个JavaBeans可提供PropertyEditor类，为指定的属性创建一个编辑器。这个类必须继承自java.Beanss.PropertyEditorSupport类。构造工具与手写代码的程序员不直接使用这个类，而是在下一小节的BeansInfo中实例化并调用这个类。例：&nbsp;<br><br><br>public&nbsp;class&nbsp;MoleculeNameEditor&nbsp;extends&nbsp;java.Beanss.PropertyEditorSupport&nbsp;{&nbsp;<br>public&nbsp;String[]&nbsp;getTags()&nbsp;{&nbsp;<br>String&nbsp;resule[]={&nbsp;<br>"HyaluronicAcid","Benzene","buckmisterfullerine",&nbsp;<br>"cyclohexane","ethane","water"};&nbsp;<br>return&nbsp;resule;}&nbsp;<br>}&nbsp;<br><br><br><br><br>上例中是为Tags属性创建了属性编辑器，在构造工具内，可从下拉表格中选择MoleculeName的属性应是"HyaluronicAid"或是"water"。&nbsp;<br><br>BeansInfo接口&nbsp;<br><br>每个Beans类也可能有与之相关的BeansInfo类，在其中描述了这个Beans在构造工具内出现时的外观。BeansInfo中可定义属性、方法、事件，显示它们的名称，提供简单的帮助说明。&nbsp;例如：&nbsp;<br><br><br>public&nbsp;class&nbsp;MoleculeBeansInfo&nbsp;extends&nbsp;SimpleBeansInfo&nbsp;{&nbsp;<br>public&nbsp;PropertyDescriptor[]&nbsp;getPropertyDescriptors()&nbsp;{&nbsp;<br>try&nbsp;{&nbsp;<br>PropertyDescriptor&nbsp;pd=new&nbsp;PropertyDescriptor("moleculeName",Molecule.class);&nbsp;<br>/*通过pd引用了上一节的MoleculeNameEditor类,取得并返回moleculeName属性*/&nbsp;<br>pd.setPropertyEditorClass(MoleculeNameEditor.class);&nbsp;<br>PropertyDescriptor&nbsp;result[]={pd};&nbsp;<br>return&nbsp;result;&nbsp;<br>}&nbsp;catch(Exception&nbsp;ex)&nbsp;{&nbsp;<br>System.err.println("MoleculeBeansInfo:&nbsp;unexpected&nbsp;exeption:&nbsp;"+ex);&nbsp;<br>return&nbsp;null;&nbsp;<br>}&nbsp;<br>}&nbsp;<br>}&nbsp;<br><br><br><br><br>JavaBeans持久化&nbsp;<br><br>当一个JavaBeans在构造工具内被用户化，并与其它Beans建立连接之后，它的所有状态都应当可被保存，下一次被load进构造工具内或在运行时，就应当是上一次修改完的信息。为了能做到这一点，要把Beans的某些字段的信息保存下来，在定义Beans时要使它实现java.io.Serializable接口。例如：&nbsp;<br><br>public&nbsp;class&nbsp;Button&nbsp;<br>implements&nbsp;java.io.Serializable&nbsp;{&nbsp;<br>}&nbsp;<br><br><br><br>实现了序列化接口的Beans中字段的信息将被自动保存。若不想保存某些字段的信息则可在这些字段前冠以transient或static关键字，transient和static变量的信息是不可被保存的。通常，一个Beans所有公开出来的属性都应当是被保存的，也可有选择地保存内部状态。&nbsp;Beans开发者在修改软件时，可以添加字段，移走对其它类的引用，改变一个字段的private/protected/public状态，这些都不影响类的存储结构关系。然而，当从类中删除一个字段，改变一个变量在类体系中的位置，把某个字段改成transient/static，或原来是transient/static，现改为别的特性时，都将引起存储关系的变化。&nbsp;<br><br>JavaBeans的存储格式&nbsp;<br><br>JavaBeans组件被设计出来后，一般是以扩展名为jar的Zip格式文件存储，在jar中包含与JavaBeans有关的信息，并以MANIFEST文件指定其中的哪些类是JavaBeans。以jar文件存储的JavaBeans在网络中传送时极大地减少了数据的传输数量，并把JavaBeans运行时所需要的一些资源捆绑在一起，本章主要论述了JavaBeans的一些内部特性及其常规设计方法，参考的是JavaBeans规范1.0A版本。随着世界各大ISV对JavaBeans越来越多的支持，规范在一些细节上还在不断演化，但基本框架不会再有大的变动。
<img src ="http://www.blogjava.net/simie/aggbug/127856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-03 15:14 <a href="http://www.blogjava.net/simie/archive/2007/07/03/127856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE到底是什么？</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127655.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 11:19:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127655.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127655.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127655.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127655.html</trackback:ping><description><![CDATA[<p>目前所有的B/S系统应用可以分为：有状态(statefull)和无状态(stateless)两大类别。 有状态是指在整个系统的处理过程中要保留记住一些信息，而无状态则相反，每次request都是独立的连接，不需要在每个request之间共享数据等等。
<p>对于这两种应用，通常第一考虑是性能要最优，性能是我们选择IT技术的主要依据之一。</p>
<p>为达到最大化的性能，对于Java系统，以前通常的作法是使用对象池，这样节约对象生成时的性能开销，也就是说系统启动时，预先生成一定数目的对象实例在内存中，需要使用时，从对象池中取出实例，用完，归还对象池，对于有状态的应用，可以使用相关持久化（persistence）策略来保存状态。</p>
<p>下一步，如何并行访问对象池将是非常重要，java的多线程技术为我们提供了实现可能，线程的创建销毁也是可能非常耗时的，那么，无疑象使用对象池一样，我们必须使用线程池来实现多线程并行计算的最优化。</p>
<p>使用线程池和对象池，每次客户端请求发生一次就从线程池中借用一个线程，处理完这个请求就将线程返回线程池，同样，使用线程快速的访问对象，对象也是从对象池中借用，用完就还回对象池。 整个这样的架构设计在性能上是最优的。</p>
<p>有了性能保证，安全机制、事务机制、集群(cluster)技术也将是选择IT技术的主要依据。</p>
<p>J2EE就是这样一个实现上述多种考量的综合标准框架系统，在具体使用中，也许我们对所有这些考量的要求并不都一样重视，比如：如果纯粹追求性能是第一，可以忽视事务机制，那么，完整的J2EE技术也许就并不适合你。</p>
<p>那么我们先看看J2EE是如何从性能上保证我们的应用系统以最快速度运行的，也就是说J2EE中必然应该有上述线程池和对象池的实现技术，servlet实际是基于线程池的更好的线程容器；EJB是基于对象池的更好的对象容器。</p>
<p>看看Servler的架构图：</p>
<p><img height=260 src="http://www.jdon.com/concurrent/servletartichect.gif" width=510></p>
<p>&nbsp;</p>
<p>当client1发生请求时servlet容器会从线程池中分配一个线程给这个request.</p>
<p><br>再看看EJB的架构图：</p>
<p><img height=230 src="http://www.jdon.com/concurrent/EJBartichect.gif" width=430><br><br>instance Pool作为一个对象实例池，维持着EJB实例，当然这个对象池是用生命周期的，简单的说 EJB=对象池+远程对象池</p>
<p>但是，EJB还整合了相当的其它增强功能，如安全 事务机制等，这些对于一般应用都是必需的，当然你还必须根据你的需要来选择是否使用J2EE，如果你的应用对安全 事务机制没有要求，直接使用线程池和对象池技术肯定获得最好的性能。</p>
<p>所以，根据Servler和EJB的原理，我们已经可以规划我们的应用，什么可以放在servlet，或什么需要放在EJB中实现：</p>
<p>线程的本质决定了servlet只适合一些轻量的应用，如分析简单XML文档, 通过JDBC访问数据源，使用JMS或JavaMail处理简单的信息Message，或使用JTS/JTA处理简单的事务机制，注意这些用词都是"简单"的，一旦复杂了，就要使用EJB了。</p>
<p>下面从客户端和服务器端两个方面来具体考量这两个技术的使用，这里的客户端不一定是指最终客户端，因为J2EE是多层结构，中间层可能在多个服务器上实现，如果一个服务器上的服务是供另外一个服务器上的应用访问的，那么后者我们也称为客户端。</p>
<p>根据应用的复杂程度和要求不同，分下列情况：</p>
<p>1.在WEB层可以实现的一些应用</p>
<p>如果你的系统没有很复杂的事务处理，或访问很多企业原有的资源，那么可以借助javabean这样的一些Help性质的类来实现你的应用，但是，这样的方案不是最干净clean, 最有效efficient, 或最有扩展性的scalable。</p>
<p>否则，将所有核心计算放置入EJB中。</p>
<p>2.所有的复杂商务计算核心都在EJB中完成</p>
<p>如果你的客户端和服务器端之间有防火墙，那么目前能够无障碍通过防火墙的协议只有Http了(Web Service也是基于http就是这个道理)，既然使用http了，而Servlet是基于Http协议的，那么就需要通过servlet来访问EJB，这是我们最普遍的应用情况。</p>
<p>但是，如果你的客户端和服务器端可以放置在一个网络内，之间没有防火墙，那么就不必使用Servlet，直接使用Java调用RMI来访问EJB，这样性能是最好的，这时的Servlet大概只有用于控制Jsp的页面的输出了(MVC模式中的控制作用)。</p>
<p>如果是非java客户端，可以通过CORBA组件来访问EJB。</p>
<p>3.如果你的应用对速度要求很高，要求非常快，对于事务处理等方面几乎无要求</p>
<p>直接使用J2SE，加上线程池和对象池技术，将会使你的java系统性能发挥极致。Jakarta.Apache.org有这两种技术的源码，线程池可以从Servlet容器Tomcat的源码中发现。</p>
<img src ="http://www.blogjava.net/simie/aggbug/127655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 19:19 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写你自己的单点登录（SSO）服务（转载</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127526.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 05:10:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127526.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127526.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127526.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘要：单点登录（SSO）的技术被越来越广泛地运用到各个领域的软件系统当中。本文从业务的角度分析了单点登录的需求和应用领域；从技术本身的角度分析了单点登录技术的内部机制和实现手段，并且给出Web-SSO和桌面SSO的实现、源代码和详细讲解；还从安全和性能的角度对现有的实现技术进行进一步分析，指出相应的风险和需要改进的方面。本文除了从多个方面和角度给出了对单点登录（SSO）的全面分析，还并且讨论了如何...&nbsp;&nbsp;<a href='http://www.blogjava.net/simie/archive/2007/07/02/127526.html'>阅读全文</a><img src ="http://www.blogjava.net/simie/aggbug/127526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 13:10 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Web项目开发到底需要掌握哪些技术？（转载）</title><link>http://www.blogjava.net/simie/archive/2007/07/02/127516.html</link><dc:creator>和田雨</dc:creator><author>和田雨</author><pubDate>Mon, 02 Jul 2007 04:58:00 GMT</pubDate><guid>http://www.blogjava.net/simie/archive/2007/07/02/127516.html</guid><wfw:comment>http://www.blogjava.net/simie/comments/127516.html</wfw:comment><comments>http://www.blogjava.net/simie/archive/2007/07/02/127516.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/simie/comments/commentRss/127516.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/simie/services/trackbacks/127516.html</trackback:ping><description><![CDATA[目前， 国内外信息化建设已经进入基于Web应用为核心的阶段， Java作为应用于网络的最好语言，前景无限看好。然而，就算用Java建造一个不是很烦琐的web应用，也不是件轻松的事情。概括一下，实施Java的WEB项目需要掌握的技术如下： <br><br>
<div><span></span>&nbsp;</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">Java</span><span style="COLOR: black">语言</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">面向对象分析设计思想</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">设计模式和框架结构</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">XML</span><span style="COLOR: black">语言</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">网页脚本语言</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">数据库</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">应用服务器</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">集成开发环境</span></div>
<div>&nbsp;</div>
<div><span style="COLOR: black">下面我们具体地看每个技术.<br></span></div>
<div><font size=2><strong>1、Java</strong><strong>语言</strong></font></div>
<div><span style="COLOR: black"><br>Java</span><span style="COLOR: black">语言体系比较庞大，包括多个模块。从WEB项目应用角度讲有JSP、Servlet、JDBC、JavaBean(Application)四部分技术。</span></div>
<div>&nbsp;</div>
<div style="MARGIN-LEFT: 36pt; TEXT-INDENT: -36pt"><strong><span style="COLOR: black">（1）、</span>Java Database Connectivity</strong><strong><span style="COLOR: black"> (JDBC)</span></strong><strong><span style="COLOR: black">技术</span></strong></div>
<div>在<span>Java Web应用开发中，数据库管理系统（RDBMS）的使用是不可缺少的。</span>JDBC(Java Database Connectivity) 是一种用于执行<span> SQL 语句的 Java API。它由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的API，使他们能够用纯Java API 来编写数据库应用程序。</span></div>
<div>简单地说，<span>JDBC 可做三件事：</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>l</span>与数据库建立连接，</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>l</span>发送<span> SQL 语句，</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>l</span>处理结果。</div>
<div>&nbsp;</div>
<div><strong><span style="COLOR: black">&nbsp;<span style="COLOR: black">（2）、</span>Servlet</span></strong><strong><span style="COLOR: black">技术</span></strong></div>
<div><span style="COLOR: black">Servlet</span><span style="COLOR: black">是运行在服务器端的程序，</span>可以被认为是服务器端的<span>applet。servlet被Web服务器（例如Tomcat）加载和执行，就如同applet被浏览器加载和执行一样。servlet从客户端(通过Web服务器)接收请求，执行某种操作，然后返回结果。</span></div>
<div>&nbsp;</div>
<div>Servlet的主要优点包括</div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>l</span>Servlet是持久的。<span>servlet只需Web服务器加载一次，而且可以在不同请求之间保持服务(例如一次数据库连接)。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span>Servlet是与平台无关的。如前所述，<span>servlet是用Java编写的，它自然也继承了Java的平台无关性。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span>Servlet是可扩展的。由于<span>servlet是用Java编写的，它就具备了Java所能带来的所有优点。Java是健壮的、面向对象的编程语言，它很容易扩展以适应你的需求。servlet自然也具备了这些特征。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span>Servlet是安全的。从外界调用一个<span>servlet的惟一方法就是通过Web服务器。这提供了高水平的安全性保障，尤其是在你的Web服务器有防火墙保护的时候。</span></div>
<div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span>Servlet可以在多种多样的客户机上使用。由于<span>servlet是用Java编写的，所以你可以很方便地在HTML中使用它们。</span></div>
<div>&nbsp;</div>
<div><strong><span style="COLOR: black"><span style="COLOR: black">（3）、</span>JavaServer Pages(JSP) </span></strong><strong><span style="COLOR: black">技术</span></strong></div>
<div><span style="COLOR: black">JSP</span><span style="COLOR: black">是从Servlet上分离出来的一小部分，简化了开发，加强了界面设计。JSP定位在交互网页的开发。运用Java语法，但功能较Servlet弱了很多，并且高级开发中只充当用户界面部分。</span>JSP容器收到客户端发出的请求时，首先执行其中的程序片段，然后将执行结果以<span>HTML格式响应给客户端。其中程序片段可以是：操作数据库、重新定向网页以及发送 E-Mail 等等，这些都是建立动态网站所需要的功能。所有程序操作都在服务器端执行，网络上传送给客户端的仅是得到的结果，与客户端的浏览器无关，因此，JSP 称为Server-Side Language。</span></div>
<div>&nbsp;</div>
<div>JavaServer Pages的主要优点包括</div>
<div>●一次编写，各处执行<span>(Write o&shy;nce, Run Anywhere)特性</span></div>
<div>作为<span>Java 平台的一部分，JavaServer Pages 技术拥有Java语言&#8220;一次编写，各处执行&#8221;的特点。随着越来越多的供货商将JavaServer Pages 技术添加到他们的产品中，您可以针对自己公司的需求，做出审慎评估后，选择符合公司成本及规模的服务器，假若未来的需求有所变更时，更换服务器平台并不影响之前所投下的成本、人力所开发的应用程序。</span></div>
<div>● 搭配可重复使用的组件</div>
<div>JavaServer Pages技术可依赖于重复使用跨平台的组件（如：<span>JavaBean或Enterprise JavaBean组件）来执行更复杂的运算、数据处理。开发人员能够共享开发完成的组件，或者能够加强这些组件的功能，让更多用户或是客户团体使用。基于善加利用组件的方法，可以加快整体开发过程，也大大降低公司的开发成本和人力。</span></div>
<div>● 采用标签化页面开发</div>
<div>Web 网页开发人员不一定都是熟悉<span>Java 语言的程序员。因此，JSP 技术能够将许多功能封装起来，成为一个自定义的标签，这些功能是完全根据XML 的标准来制订的，即JSP 技术中的标签库(Tag Library)。因此，Web 页面开发人员可以运用自定义好的标签来达成工作需求，而无须再写复杂的Java 语法，让Web 页面开发人员亦能快速开发出一动态内容网页。</span></div>
<div>今后，第三方开发人员和其他人员可以为常用功能建立自己的标签库，让<span>Web 网页开发人员能够使用熟悉的开发工具，如同HTML 一样的标签语法来执行特定功能的工作。</span></div>
<div>●<span> N-tier 企业应用架构的支持</span></div>
<div>有鉴于网际网络的发展，为因应未来服务越来越繁杂的要求，且不再受地域的限制，因此，</div>
<div>必须放弃以往<span>Client-Server的Two-tier 架构，进而转向更具威力、弹性的分散性对象系统。由于JavaServer Page 技术是Java 2 Platform Enterprise Edition (J2EE)集成中的一部分，它主要是负责前端显示经过复杂运算后之结果内容，而分散性的对象系统则是主要依赖EJB ( Enterprise JavaBean )和JNDI ( Java Naming and Directory Interface )构建而成。</span></div>
<div><span style="COLOR: black"><br><strong><span style="COLOR: black">（4）、</span>JavaBean(Application)</strong></span><strong><span style="COLOR: black">应用组件技术</span></strong><span style="COLOR: black"><br>Application</span><span style="COLOR: black">是Java应用程序，在WEB项目和一些开发中主要应用JavaBean。它就是Application的一部分，逻辑运算能力很强，能极大的发挥Java语言的优点。</span>JavaBean 被称为是<span>Java 组件技术的核心。JavaBean 的结构必须满足一定的命名约定。JavaBean能提供常用功能并且可以重复使用，这使得开发人员可以把某些关键功能和核心算法提取出来封装成为一个组件对象，这样就增加了代码的重用率和系统的安全性。</span><span style="COLOR: black"><br><br></span><span style="COLOR: black">高级的WEB项目会应用到以上所有技术，它们之间联合使用和协作开发会提高开发的效率和系统的性能。&nbsp;<br><br></span><font size=2><strong>2、</strong><strong>面向对象分析设计思想</strong></font><span style="COLOR: black"><br><br>Java</span><span style="COLOR: black">语言是完全面向对象的语言，所以在项目设计时会有很大的帮助，在设计时应尽量舍弃以往的面向过程的设计方式。 <br><br>在分析项目业务关系的时候，应用一些UML(Unified Modeling Language)图,例如常用的用例图(use case diagram)，类图(class diagram)，时序图(sequence diagram)等等,会有很大的帮助，这样能尽快找出业务逻辑主要面对的对象，然后对每个对象进行行为划分，最后再实现对象之间的集成和通信。</span></div>
<div><span style="COLOR: black"><br></span><font size=2><strong>3、设计模式和框架</strong><strong><span style="COLOR: black">结构<br></span></strong></font></div>
<div><span style="COLOR: black">Java</span><span style="COLOR: black">从语言角度来讲不是很难，但是从整体设计角度来讲我们还需要了解一些高级应用框架。如果要设计一个良好的框架结构，单单只掌握Java语言远远不够。这就涉及到一个设计模式，还有和设计模式相关的一些知识。 <br><br>设计模式在Java项目实施过程更是重中之重。主要在与两层的设计模式、三层的设计模式和Ｎ层的设计模式。它直接决定着项目的应用、部署和实际开发设计。 <br><br>在普通的WEB项目中很多采用两层的开发结构。JSP+Servlet或JSP+JavaBean。当对开发要求高的项目中使用很多的还是MVC的三层开发结构，也就是JSP+Servlet+JavaBean。它能分有效的分离逻辑开发，使开发人员能专注于各自的开发。同时也能时整个开发结构流程更清晰，但是需要比较高的开发配合度。 <br>在项目中，我们经常使用著名的Model-View-Controller(MVC)架构。</span>MVC架构是随着<span>smalltalk language语言的发展提出的，它是一个著名的用户界面设计架构。经典的MVC架构把一个组件（可认为是整个应用程序的一个模块）划分成三部分组 Model管理这个模块中所用到的数据和业务逻辑。而View 管理模块如何显示给用户，Controller 决定如何处理用户和该模块交互式时候产生的事件 如用户点击一个按钮等。 <br></span><strong><br><font size=2>4、XML</font></strong><strong><font size=2>语言</font></strong><span style="COLOR: black"><br><br></span><span style="COLOR: black">在服务器和设计模式结构中会应用到自定义文件，而且在应用高级设计时也会定义自用的标签，现在流行的是用XML去定义配置，所以XML语言应该有一定掌握。</span></div>
<div><span style="LETTER-SPACING: 0pt">当前，<span>Java 2平台企业版（J2EE）架构在厂商市场和开发者社区中倍受推崇。作为一种工具，可扩展标记语言（XML）简化了数据交换、进程间消息交换这一类的事情，因而对开发者逐渐变得有吸引力，并开始流行起来。自然，在J2EE架构中访问或集成XML解决方案的想法也很诱人。因为这将是强大系统架构同高度灵活的数据管理方案的结合。</span></span><br><br><span><span style="LETTER-SPACING: 0pt">XML</span></span><span style="LETTER-SPACING: 0pt">的应用似乎是无穷无尽的，但它们大致上可以分为三大类：</span><br><span><span style="LETTER-SPACING: 0pt">1</span></span><span style="LETTER-SPACING: 0pt">、简单数据的表示和交换（针对<span>XML的简单API（SAX）和文档对象模型（DOM）语法解析，不同的文档类型定义（DTDs）和概要（schemas））</span></span><br><span><span style="LETTER-SPACING: 0pt">2</span></span><span style="LETTER-SPACING: 0pt">、用户界面相关、表示相关的上下文（可扩展样式表语言（<span>XSL），可扩展样式表语言转换（XSLT））</span></span><br><span><span style="LETTER-SPACING: 0pt">3</span></span><span style="LETTER-SPACING: 0pt">、面向消息的计算（<span>XML-RPC（远程过程调用），基于SOAP协议的Web 服务（Web Services），电子化业务XML（ebXML））</span></span><br><span style="COLOR: black"><br></span><strong><font size=2>5、网页脚本语言</font></strong><span style="COLOR: black"><br>&nbsp;<br></span><span style="COLOR: black">为了提高WEB项目的整体性能，提高人机交互的友好界面，网页的脚本语言是很有用处的，有的时候可以解决很大的难题或提高程序的性能和应用性。 <br><br>网页脚本语言的执行都是在客户端执行的，速度很很快，并且大多的操作与服务器没有交互运算，所以在一些应用中非常理想。在设计WEB项目的应用中，网页的脚本语言起着不能忽视的作用，所以如果设计WEB项目的应用中，对JavaScript应有一定的了解。</span></div>
<div>&nbsp;</div>
<div>JavaScript是一种基于对象<span>(Object Based)和事件驱动(Event Driven)并具有安全性能（Secure）的脚本语言。使用它的目的是与HTML超文本标记语言、Java 脚本语言（Java小程序）一起实现在一个Web页面中链接多个对象，与Web客户交互作用。从而可以开发客户端的应用程序等。它是通过嵌入或调入在标准的HTML语言中实现的。它具有以下几个基本特点：</span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -18pt"><span>1.</span>它是一种脚本编写语言<span><br>JavaScript是一种脚本语言，它采用小程序段的方式实现编程。像其它脚本语言一样,JavaScript同样已是一种解释性语言,它提供了一个易的开发过程。 <br>它的基本结构形式与C、C++、VB十分类似。但它不像这些语言一样，需要先编译，而是在程序运行过程中被逐行地解释。它与HTML标识结合在一起，从而方便用户的使用操作。 </span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -18pt"><span>2.</span>&nbsp;基于对象的语言。<span><br>&nbsp;JavaScript是一种基于对象的语言，同时以可以看作一种面向对象的。这意味着它能运用自己已经创建的对象。因此，许多功能可以来自于脚本环境中对象的方法与脚本的相互作用。 </span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -18pt"><span>3.</span>简单性<span><br>&nbsp;JavaScript的简单性主要体现在：首先它是一种基于Java基本语句和控制流之上的简单而紧凑的设计, 从而对于学习Java是一种非常好的过渡。其次它的变量类型是采用弱类型，并未使用严格的数据类型。 </span></div>
<div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -18pt"><span>4.</span>安全性<span><br>&nbsp;JavaScript是一种安全性语言，它不允许访问本地的硬盘，并不能将数据存入到服务器上，不允许对网络文档进行修改和删除，只能通过浏览器实现信息浏览或动态交互。从而有效地防止数据的丢失。 </span></div>
<div style="MARGIN-LEFT: 5.25pt">5. 动态性<span><br>&nbsp;JavaScript是动态的，它可以直接对用户或客户输入做出响应，无须经过Web服务程序。它对用户的响应，是采用以事件驱动的方式进行的。所谓事件驱动，就是指在主页(Home Page)中执行了某种操作所产生的动作，就称为&#8220;事件&#8221;(Event)。比如按下鼠标、移动窗口、选择菜单等都可以视为事件。当事件发生后，可能会引起相应的事件响应。 <br><br></span></div>
<div style="TEXT-JUSTIFY: inter-ideograph; MARGIN-LEFT: 0cm; TEXT-ALIGN: justify"><strong><span style="FONT-SIZE: 10.5pt"><font size=2>6、开发工具</font></span></strong></div>
<div style="TEXT-JUSTIFY: inter-ideograph; MARGIN-LEFT: 0cm; TEXT-ALIGN: justify"><strong><span style="FONT-SIZE: 10.5pt"><font size=2></font></span></strong></div>
<div><strong><span style="COLOR: black">（1）、数据库 </span></strong></div>
<div><span style="COLOR: black">在主要的应用中，数据库相关的环节应用很多，所以对数据库应该有一定了解。不能单单只了解一种数据库，因为在很多实际开发中会提出很多数据库解决方案，所以只有在了解多种数据库的情况下才能有一个比较方案。</span></div>
<div><span style="COLOR: black">对于数据库应该了解他的性能和一些基本的操作常识，还有该数据库的特点。而针对与Java语言WEB项目的数据库开发则主要是对JDBC的应用，还有数据库事务处理和连接池等高级概念的应用。<br><br></span></div>
<div><strong><span style="COLOR: black"><span style="COLOR: black">（2）、</span>Web</span></strong><strong><span style="COLOR: black">服务器</span></strong></div>
<div>&nbsp;</div>
<div><span style="COLOR: black">同数据库一样，应该了解该服务器的性能，特点和一些常识。</span></div>
<div><span style="COLOR: black">在应用方面，Web服务器主要是针对于配置和部署，对目录的配置，调试；对配置文件属性的修改；对访问权限和并发性的控制；Java类的部署等。</span></div>
<div><strong><span style="COLOR: black"><br><span style="COLOR: black">（3）、</span>集成开发环境（IDE）：</span></strong></div>
<div><span style="COLOR: black">&#8220;</span><span style="COLOR: black">公欲善其事， 必先利其器&#8221;. 对于Web应用开发人员来讲，好的集成开发环境（IDE：Integrated Development Enviroment）是非常重要的。目前在市场上占主导位置的一个集成开发工具就是Eclipse. </span></div>
&nbsp;(转载文章请保留出处：<a href="http://www.javajia.com/"><u><font color=#0000ff>Java家(www.javajia.com)</font></u></a>)
<img src ="http://www.blogjava.net/simie/aggbug/127516.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/simie/" target="_blank">和田雨</a> 2007-07-02 12:58 <a href="http://www.blogjava.net/simie/archive/2007/07/02/127516.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>