﻿<?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/jzgl-ever/category/33367.html</link><description>到教堂忏悔，愿主安抚我罪恶的心灵......</description><language>zh-cn</language><lastBuildDate>Mon, 08 Sep 2008 21:41:38 GMT</lastBuildDate><pubDate>Mon, 08 Sep 2008 21:41:38 GMT</pubDate><ttl>60</ttl><item><title>JBOSS安装配置</title><link>http://www.blogjava.net/jzgl-ever/articles/227731.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Mon, 08 Sep 2008 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/227731.html</guid><description><![CDATA[<font face="Times New Roman" size="3">&nbsp;
<h1><a title="_Toc157825737" target="_blank" name="_Toc157825737"></a><font size="5"><span><span>第一章 </span></span><span>安装运行</span><span>JBOSS</span></font></h1>
<h2><a title="_Toc157825738" target="_blank" name="_Toc157825738"></a><span><span>1 </span></span><span>安装</span><span>JBOSS</span></h2>
<p><span>JBOSS</span><span>最新发布的</span><span>AS</span><span>（</span><span>Application Server</span><span>）版本是</span><span>5.0.0.Beta1</span><span>，最近一个稳定版本是</span><span>4.0.5</span><span>，我们使用的版本是</span><span>4.0.4</span><span>。该版本比较稳定。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>安装</span><span>JBOSS</span><span>很简单。将</span><span>jboss-4.0.4.GA.zip</span><span>解压到一个目录</span><span>(</span><span>比如</span><span>d:\ jboss-4.0.4.GA)</span><span>下即可。</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>提示：保留原来的</span><span>zip</span><span>文件，以免在使用过程中出错，还可以恢复到正常状态。</span></p>
<h2><a title="_Toc157825739" target="_blank" name="_Toc157825739"></a><span><span>2 </span></span><span>运行</span><span>JBOSS</span><span><span>&nbsp;&nbsp; </span><span>&nbsp;</span></span></h2>
<p><span>在</span><span>JBOSS</span><span>的</span><span>home</span><span>目录</span><span>(</span><span>即</span><span>$JBOSS_HOME \bin)</span><span>有一个</span><span>run.bat</span><span>文件和</span> <span>一个</span><span>run.sh</span><span>文件，直接运行</span><span>run.sh</span><span>（</span><span>linux</span><span>系统）或</span><span>run.bat</span><span>（</span><span>windows</span><span>系统）即可启动</span><span>JBOSS</span><span>。</span></p>
<p><span>如果需要设置</span><span>JBOSS</span><span>应用启动的端口，可以修改</span><span>$JBOSS_HOME \server\default\deploy\jbossweb-tomcat55.sar\server.xml</span><span>文件</span></p>
<p><span>＜!-- A HTTP/1.1 Connector on port 8080 --＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜Connector port="<span>8080</span>" address="${jboss.bind.address}"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>maxThreads="250" strategy="ms" maxHttpHeaderSize="8192"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>emptySessionPath="true"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>enableLookups="false" redirectPort="8443" acceptCount="100"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>connectionTimeout="20000" disableUploadTimeout="true"/＞</span></p>
<p><span>可将这个</span><span>port</span><span>修改成需要的端口。</span></p>
<h2><a title="_Toc157825740" target="_blank" name="_Toc157825740"></a><span><span>3 </span></span><span>JBOSS</span><span><span>控制台</span></span></h2>
<h3><a title="_Toc157825741" target="_blank" name="_Toc157825741"></a><font size="5"><span><span>3.1 </span></span><span>如何查看</span><span>Jboss</span></font><font size="5"><span><span>的属性</span></span><span><br />
</span></font></h3>
<p><span>启动</span><span>JBOSS</span><span>，打开</span><span><a href="http://msplinks.com.cn/MDFodHRwOi8vbG9jYWxob3N0OjgwODAv" target="_blank">http://IP:Port/</a></span><span>，可进入如下页面</span></p>
<p><span><span style="font-size: 10.5pt; font-family: Arial; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">&nbsp;<img height="360" src="http://b0.ac-images.cdnmyspace.cn/cnimages01/2/l_56c6baf92ddf5fde4a0456e86ae11859.gif" width="575" border="0"  alt="" /><br />
</span></span><span><br />
</span><span><a href="http://msplinks.com.cn/MDFodHRwOi8vaXA6UG9ydC93ZWItY29uc29sZQ==" target="_blank">http://IP:Port/web-console</a></span><span>和</span><span><a href="http://msplinks.com.cn/MDFodHRwOi8vaXA6UG9ydC9qbXgtY29uc29sZQ==" target="_blank">http://IP:Port/jmx-console</a></span><span>，</span><span>Jboss</span><span>是以</span><span>JMX</span><span>为核心的，</span><span>console</span><span>上并不直接提供配置和控制</span><span>server</span><span>的功能，各项操作需要找到对应的</span><span>Mbean</span><span>，调用相关方法。</span><span><br />
</span></p>
<h3><a title="_Toc157825742" target="_blank" name="_Toc157825742"></a><font size="5"><span><span>3.2 </span></span><span>如何控制</span><span>Jboss</span></font><span><span><font size="5">控制台的访问权限</font></span></span></h3>
<p><span>web-console</span><span>和</span><span>jmx-console</span><span>都可以使用</span><span>Jboss</span><span>提供的</span><span>JAAS</span><span>框架进行访问权限控制，修改应用</span><span>war</span><span>包内的</span><span>WEB-INF/web.xml</span><span>和</span><span>jboss-web.xml</span><span>，取消对应的注释即可。以</span><span>web-console</span><span>为例</span></p>
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="581">
            <p><span><font size="3"><font face="Times New Roman">jboss-web.xml<br />
            </font></font></span></p>
            <font size="3"><font face="Times New Roman"><span>＜</span><span>security-domain</span><span>＞</span><span>java:/jaas/web-console</span><span>＜/</span><span>security-domain</span><span>＞<br />
            </span></font></font><span><font face="Times New Roman" size="3">&nbsp;</font></span><span><font size="3"><font face="Times New Roman">web.xml<br />
            </font></font></span><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>security-constraint</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>web-resource-collection</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>web-resource-name</span><span>＞</span><span>HtmlAdaptor</span><span>＜/</span><span>web-resource-name</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>description</span><span>＞</span><span>An example security config that only allows users with the<br />
            </span></font></font><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp; </span>role JBossAdmin to access the HTML JMX console web application<br />
            </font></font></span><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp; </span></span><span>＜/</span><span>description</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>url-pattern</span><span>＞</span><span>/*</span><span>＜/</span><span>url-pattern</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>http-method</span><span>＞</span><span>GET</span><span>＜/</span><span>http-method</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>http-method</span><span>＞</span><span>POST</span><span>＜/</span><span>http-method</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜/</span><span>web-resource-collection</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>auth-constraint</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>role-name</span><span>＞</span><span>JBossAdmin</span><span>＜/</span><span>role-name</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜/</span><span>auth-constraint</span><span>＞</span><span><br />
            </span></font></font><font face="Times New Roman"><font size="3"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜/</span><span>security-constraint</span><span>＞</span><span><br />
            </span></font></font></td>
        </tr>
    </tbody>
</table>
<p><span>jboss-web.xml</span><span>中指明该应用的</span><span>policy</span><span>为</span><span>web-console</span><span>，授权的角色为</span><span>JBossAdmin</span><span>。在</span><span>$JBOSS_HOME/server/${app}/conf/login-config.xml</span><span>中可以找到对</span><span>policy:web-console</span><span>的配置</span></p>
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="581">
            <p align="left"><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>application-policy</span><span> name </span><span>= "</span><span>web-console</span><span>"＞</span><span><br />
            </span></font></font></p>
            <font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>authentication</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>login-module</span><span> code</span><span>="</span><span>org.jboss.security.auth.spi.UsersRolesLoginModule</span><span>"</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>flag </span><span>= "</span><span>required</span><span>"＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>module-option</span><span> name</span><span>="</span><span>usersProperties</span><span>"＞</span><span>web-console-users.properties</span><span>＜/</span><span>module-option</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜</span><span>module-option</span><span> name</span><span>="</span><span>rolesProperties</span><span>"＞</span><span>web-console-roles.properties</span><span>＜/</span><span>module-option</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></span><span>＜/</span><span>login-module</span><span>＞</span><span><br />
            </span></font></font><font size="3"><font face="Times New Roman"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>＜/</span><span>authentication</span><span>＞</span><span><br />
            </span></font></font><font face="Times New Roman"><font size="3"><span><span>&nbsp;&nbsp;&nbsp; </span></span><span>＜/</span><span>application-policy</span><span>＞</span><span><br />
            </span></font></font></td>
        </tr>
    </tbody>
</table>
<p><span>在</span><span>$JBOSS_HOME/server/${app}/conf/</span><span>中建立文件</span><span>web-console-roles.properties</span><span>配置角色信息</span></p>
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="581">
            <p><font size="3"><span><font face="Times New Roman">#</font></span><span>用户名</span><span><font face="Times New Roman">=</font></span><span>角色</span><span><font face="Times New Roman">1,</font></span><span>角色</span><span><font face="Times New Roman">2,&#8230;,</font></span><span>角色</span><span><font face="Times New Roman">n</font></span></font> </p>
            <p><span><font face="Times New Roman" size="3">admin=JBossAdmin,HttpInvoker</font></span> </p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>在</span><span>$JBOSS_HOME/server/${app}/conf/</span><span>中建立文件</span><span>web-console-users.properties</span><span>配置用户信息</span></p>
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="581">
            <p><font size="3"><span><font face="Times New Roman">#</font></span><span>用户名</span><span><font face="Times New Roman">=</font></span><span>密码（明文）</span></font> </p>
            <p><span><font face="Times New Roman" size="3">admin=admin</font></span> </p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>经过上述配置，需要以用户</span><span>admin</span><span>密码</span><span>admin</span><span>才能登录</span><span><a href="http://msplinks.com.cn/MDFodHRwOi8vaXA6UG9ydC93ZWItY29uc29sZQ==" target="_blank">http://IP:Port/web-console</a></span><span>。</span></p>
<h1><a title="_Toc157825743" target="_blank" name="_Toc157825743"></a><font size="5"><span><span>第二章 </span></span><span>发布目录及配置文件</span></font></h1>
<h2><a title="_Toc157825744" target="_blank" name="_Toc157825744"></a><span><span>1 </span></span><span>JBOSS</span><span><span>的应用发布目录</span></span></h2>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>JBOSS</span><span>在控制台没有提供直接的目录发布应用的功能。需要通过直接修改配置文件完成。系统默认的发布目录是</span><span>$JBOSS_HOME \server\default\deploy</span><span>，直接将</span><span>war</span><span>包复制到这个目录下即可。如果需要以目录方式部署，可以将</span><span>war</span><span>包解开后的整个目录复制过来，但注意目录名一定要修改成</span><span><font color="#000000">${app}.</font>war</span><span>这种形式。</span></p>
<h2><a title="_Toc157825745" target="_blank" name="_Toc157825745"></a><span><span>2 </span></span><span>JBOSS</span><span><span>配置文件</span></span></h2>
<h3><a title="_Toc157825746" target="_blank" name="_Toc157825746"></a><font size="5"><span><span>2.1 </span></span><span>增加</span><span>jboss-web.xml</span></font></h3>
<p><span>jboss-web.xml</span><span>的作用类似于</span><span>weblogic.xml</span><span>，用于指定一些跟应用服务器相关的配置。在</span><span>jboss</span><span>环境下，原有的</span><span>weblogic.xml</span><span>已经没有用处，可以删除。在</span><span>WEB-INF</span><span>目录下新增</span><span>jboss-web.xml</span><span>，内容如下：</span></p>
<p><span>＜?xml version="1.0" encoding="UTF-8"?＞</span></p>
<p><span>＜!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 2.3V2//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_3_2.dtd"＞</span></p>
<p><span>＜jboss-web＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>＜context-root＞${app}＜/context-root＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜resource-ref＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜res-ref-name＞jdbc/JDBCDS＜/res-ref-name＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜jndi-name＞java:/JDBCDS＜/jndi-name＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>＜/resource-ref＞</span></p>
<p><span>＜/jboss-web＞</span></p>
<p><span>指定了</span><span>web</span><span>应用的</span><span>context</span><span>为</span><span>/${app}</span><span>，以及指定</span><span>web</span><span>应用中使用数据源的</span><span>jndi</span><span>名</span><span>java:/JDBCDS</span></p>
<h3><a title="_Toc157825747" target="_blank" name="_Toc157825747"></a><font size="5"><span><span>2.2 </span></span><span>修改</span><span>web.xml</span></font></h3>
<p><span>修改</span><span>WEB-INF</span><span>目录下的</span><span>web.xml</span><span>文件，增加如下内容：</span></p>
<p><span>＜resource-ref＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>＜res-ref-name＞jdbc/JDBCDS＜/res-ref-name＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>＜res-type＞javax.sql.DataSource＜/res-type＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>＜res-auth＞Container＜/res-auth＞</span></p>
<p><span><span>&nbsp; </span>＜/resource-ref＞</span></p>
<p><span>注意这里面的配置关系：</span><span>web.xml</span><span>里的</span><span>＜res-ref-name＞ <strong>jdbc/JDBCDS</strong> ＜/res-ref-name＞<br />
</span><span>中的</span><strong><span>jdbc/JDBCDS</span></strong><span>与</span><span>jboss-web.xml</span><span>里的</span><span>＜res-ref-name＞<strong> jdbc/JDBCDS</strong> ＜/res-ref-name＞<br />
</span><span>中的</span><strong><span>jdbc/JDBCDS</span></strong><span>一致，前者是向后者看齐的；而</span><span>jboss-web.xml</span><span>里的</span><span>&nbsp;&nbsp;＜jndi-name＞<strong>java:jdbc/MyDs</strong>＜/jndi-name＞</span><span>中的</span><strong><span>java:jdbc/MyDs</span></strong><span> </span><span>为前缀</span><span>&#8220;java:&#8221;&nbsp;</span><span>加上</span> <span>在第一步（数据源配置文件配置）中配置的</span><span>jndi</span><span>名称组成。</span></p>
<h3><a title="_Toc157825748" target="_blank" name="_Toc157825748"></a><font size="5"><span><span>2.3 </span></span><span>增加</span><span>oracle-ds.xml</span></font></h3>
<span>在</span><span>JBOSS</span><span>发布应用时，我们需要为数据库创建一个数据源描述文件，</span><span>在</span><span>$JBOSS_HOME/ server/default/deploy /</span><span>目录下，增加一个</span><span>oracle-ds.xml</span><span>文件，内容如下</span><span><br />
</span>
<p><span>＜?xml version="1.0" encoding="UTF-8"?＞</span></p>
<p><span>＜datasources＞</span></p>
<p><span><span>&nbsp; </span>＜local-tx-datasource＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>＜jndi-name＞JDBCDS＜/jndi-name＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>＜connection-url＞jdbc:oracle:thin:@10.1.1.1:1521:ora9i＜/connection-url＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>＜driver-class＞oracle.jdbc.driver.OracleDriver＜/driver-class＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>＜user-name＞eafcem＜/user-name＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp; </span>＜password＞eafcem＜/password＞</span></p>
<p><span>＜exception-sorter-class-name＞org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter＜/exception-sorter-class-name＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜metadata＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜type-mapping＞Oracle9i＜/type-mapping＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜/metadata＞</span></p>
<p><span><span>&nbsp; </span>＜/local-tx-datasource＞</span></p>
<p><span>＜/datasources＞</span></p>
<span>我们可以把</span><span>$JBOSS_HOME\docs\examples\jca\</span><span>oracle-ds.xml</span><span>或</span><span>oracle-xa-ds.xml</span><span>拷贝到</span><span>deploy</span><span>目录下</span><span>,</span><span>修改其中的连接串、用户名、密码即可</span><span><br />
</span>
<h1><a title="_Toc157825749" target="_blank" name="_Toc157825749"></a><font size="5"><span><span>第三章 </span></span><span>JBOSS</span></font><span><span><font size="5">配置</font></span></span></h1>
<span>以下以</span><span>Linux</span><span>平台为例：</span><span><br />
</span><span>Jboss</span><span>部署位置用</span><span>$JBOSS_HOME</span><span>指代</span><span><br />
</span>
<p><span><span>1、<span>&nbsp; </span></span></span><span>精简服务（可选）</span></p>
<p><span>default</span><span>配置中有一些我们不需要的服务，在</span><span>deploy</span><span>目录下以</span><span>xml</span><span>或</span><span>sar</span><span>的形势存在。可以删除以加快启动速度减少资源占用，目前确认可以删除的内容如下</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>jboss-aop.deployer</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>jbossws14.sar</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>jms</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>uuid-key-generator.sar</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>bsh-deployer.xml</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>cache-invalidation-service.xml</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>client-deployer-service.xml</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>ear-deployer.xml</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>ejb-deployer.xml</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>hsqldb-ds.xml</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>jboss-ha-xa-jdbc.rar</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>jsr88-service.xml</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>mail-ra.rar</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>mail-service.xml</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>vi conf/jboss-service.xml</span><span>，删除以下内容</span></p>
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="581">
            <p></p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp; </span>＜!-- ==================================================================== --＞</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp; </span>＜!-- Class Loading<span>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--＞</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp; </span>＜!-- ==================================================================== --＞</font></font></span> </p>
            <span><font face="Times New Roman" size="3">&nbsp;</font></span>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp; </span>＜mbean code="org.jboss.web.WebService"</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>name="jboss:service=WebService"＞</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜attribute name="Port"＞8083＜/attribute＞</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜!-- Should non-EJB .class files be downloadable --＞</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜attribute name="DownloadServerClasses"＞true＜/attribute＞</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜!-- Should resources other than .class files be downloadable. Both</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>DownloadServerClasses and DownloadResources must be true for resources</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>to be downloadable. This is false by default because its generally a</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>bad idea as server configuration files that container security</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>information can be accessed.</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--＞</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜attribute name="DownloadResources"＞false＜/attribute＞</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜attribute name="Host"＞${jboss.bind.address}＜/attribute＞</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜attribute name="BindAddress"＞${jboss.bind.address}＜/attribute＞</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜!-- Use the default thread pool for dynamic class loading --＞</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜depends optional-attribute-name="ThreadPool"</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>proxy-type="attribute"＞jboss.system:service=ThreadPool＜/depends＞</font></font></span> </p>
            <p><span><font size="3"><font face="Times New Roman"><span>&nbsp;&nbsp; </span>＜/mbean＞</font></font></span> </p>
            </td>
        </tr>
    </tbody>
</table>
<p><span><span>2、<span>&nbsp; </span></span></span><span>修改</span><span>jboss</span><span>运行参数配置文件</span></p>
<p><span>修改</span><span>run.conf</span><span>，<strong>修改或增加</strong>以下内容，参数值根据实际情况调整</span></p>
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="581">
            <p><span><font face="Times New Roman" size="3">MAX_FD="8192"</font></span> </p>
            <p><span><font face="Times New Roman" size="3">JAVA_HOME="/opt/aspire/product/jboss/jdk1.5.0_10"</font></span> </p>
            <p><span><font face="Times New Roman" size="3">JAVA_OPTS="-server -Xms512m -Xmx1024m -Xloggc:./gc/$$ -XX:PermSize=64m -XX:MaxPermSize=128m -XX:-UseParallelGC -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"</font></span> </p>
            </td>
        </tr>
    </tbody>
</table>
<p><span><span>3、<span>&nbsp; </span></span></span><span>创建启动脚本</span></p>
<p><span>在</span><span>$JBOSS_HOME/server/default</span><span>创建启动脚本</span><span>start</span><span>，内容如下</span></p>
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="581">
            <p><span><font face="Times New Roman" size="3">mv nohup.out nohup.bak</font></span> </p>
            <p><span><font face="Times New Roman" size="3">nohup $JBOSS_HOME/bin/run.sh -c default -P run.conf &amp; ＞ nohup.out</font></span> </p>
            </td>
        </tr>
    </tbody>
</table>
<p><span><span>4、<span>&nbsp; </span></span></span><span>创建停止脚本</span></p>
<p><span>在</span><span>$JBOSS_HOME/server/default</span><span>创建启动脚本</span><span>down</span><span>，内容如下</span></p>
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="581">
            <p><span><font face="Times New Roman" size="3">$JBOSS_HOME/bin/shutdown.sh --server=jnp://localhost:1099 --shutdown</font></span> </p>
            </td>
        </tr>
    </tbody>
</table>
<p><span>其中</span><span>11099</span><span>端口为示意，请根据实际的</span><span>JNDI</span><span>端口修改。</span></p>
<p><span><span>5、<span>&nbsp; </span></span></span><span>数据库驱动</span></p>
<p><span>JBOSS</span><span>不带</span><span>oracle jdbc driver</span><span>，需要手工放置</span><span>classes12.jar</span><span>到</span><span>$JBOSS_HOME/server/default/lib</span><span>目录下。</span></p>
<p><span><span>6、<span>&nbsp; </span></span></span><span>log4j</span><span>的问题</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>JBOSS</span><span>自己的</span><span>log4j</span><span>和应用</span><span>Log4j</span><span>冲突的问题，目前暂时的做法删除</span><span>JBOSS</span><span>自带的</span><span>server/default/deploy</span><span>目录下的</span><span>log4j.jar</span><span>，启动时会报一个错，但</span><span>simf</span><span>的日志可正常使用，在</span><span>$JBOSS_HOME/bin</span><span>目录下会生成</span><span>eaflog</span><span>目录</span></p>
<p><span><span>7、<span>&nbsp; </span></span></span><span>修改端口（可选）</span></p>
<p><span>如果在一台机器上部署了多个</span><span>jboss server</span><span>或者</span><span>jboss</span><span>默认端口已被其它应用使用，需要修改相关端口以避免端口冲突。目前确认需要修改的配置如下</span></p>
<p><span>vi $JBOSS_HOME/server/default/conf/jboss-service.xml</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>JNDI</span><span>端口：默认</span><span>1099</span></p>
<p><span><span>&nbsp;&nbsp; </span>＜mbean code="org.jboss.naming.NamingService"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>name="jboss:service=Naming"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>xmbean-dd="resource:xmdesc/NamingService-xmbean.xml"＞</span></p>
<p><span>......</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜attribute name="Port"＞1099＜/attribute＞</span></p>
<span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜!--<br />
</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜attribute name="RmiPort"＞1098＜/attribute＞<br />
</span><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>--＞<br />
</span>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>RMI</span><span>端口：默认</span><span>4444/4445</span></p>
<p><span><span>&nbsp;&nbsp; </span>＜mbean code="org.jboss.invocation.jrmp.server.JRMPInvoker"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>name="jboss:service=invoker,type=jrmp"＞</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜attribute name="RMIObjectPort"＞4444＜/attribute＞</span></p>
<p><span>.........</span></p>
<p><span><span>&nbsp;&nbsp; </span>＜/mbean＞</span></p>
<p><span>&#8230;&#8230;</span></p>
<p><span><span>&nbsp;&nbsp; </span>＜mbean code="org.jboss.invocation.pooled.server.PooledInvoker"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>name="jboss:service=invoker,type=pooled"＞</span></p>
<p><span>......</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜attribute name="ServerBindPort"＞4445＜/attribute＞</span></p>
<p><span><span>&nbsp;&nbsp; </span>＜/mbean＞</span></p>
<p><span>vi $JBOSS_HOME/eaf/deploy/jbossweb-tomcat55.sar/server.xml</span></p>
<p><span><span>n<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>HTTP</span><span>端口：默认</span><span>8080</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>＜Connector port="<strong>8080</strong>" address="${jboss.bind.address}"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>maxThreads="250" strategy="ms" maxHttpHeaderSize="8192"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>emptySessionPath="true"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>enableLookups="false" redirectPort="8443" acceptCount="100"</span></p>
<p><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>connectionTimeout="20000" disableUploadTimeout="true"/＞</span></p>
<p>&nbsp;</p>
</font>
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/227731.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-09-08 14:31 <a href="http://www.blogjava.net/jzgl-ever/articles/227731.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat 的数据源使用(1)</title><link>http://www.blogjava.net/jzgl-ever/articles/227703.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Mon, 08 Sep 2008 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/227703.html</guid><wfw:comment>http://www.blogjava.net/jzgl-ever/comments/227703.html</wfw:comment><comments>http://www.blogjava.net/jzgl-ever/articles/227703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzgl-ever/comments/commentRss/227703.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzgl-ever/services/trackbacks/227703.html</trackback:ping><description><![CDATA[<div id="blog_nav">
<div id="pre_next"><a class="next" href="http://justonly.javaeye.com/blog/108670">Tomcat 数据源的使用(2)</a> | <a class="pre" href="http://justonly.javaeye.com/blog/108293">AJAX应用笔记(1)</a> </div>
</div>
<div class="blog_title">
<div class="date"><span class="year">2007</span><span class="sep_year">-</span><span class="month">08</span><span class="sep_month">-</span><span class="day">02</span></div>
<h3 class="" title=""><a href="http://justonly.javaeye.com/blog/108300">Tomcat 的数据源使用(1)</a></h3>
<strong>关键字: Tomcat</strong> </div>
<div class="blog_content">一、<strong>数据源简介</strong>：
<p>　　在Java语言中，DataSource对象就是一个代表数据源实体的对象。一个数据源就是一个用来存储数据的工具，它可以是复杂的大型企业级数据库，也可以是简单得只有行和列的文件。数据源可以位于在服务器端，也可以位于客服端。</p>
<p>　　应用程序通过一个连接来访问数据源，那么一个DataSource对象就是用于提供连接数据源的工具。DataSource接口提供了两个方法用于建立和数据源的连接。</p>
<p>　　使用DataSource对象建立和数据库的连接比起使用DriverManager接口更加高效，虽然两者的使用范围都很相似，并且都提供了方法用于建立和数据库的连接，设置连接的最大超时时间，获取流、登录。<br />
&nbsp;&nbsp; <br />
　　但两者之间的区别更加明显。和DriverManager不同，一个DataSource对象能够识别和描述它所代表的数据源的属性，而且DataSource对象的工作和JNDI(Javatm Naming and Directory Interfaceti)具有密切的关系，DataSource的建立、发布、独立于应用程序的管理都依靠JNDI技术。<br />
&nbsp;&nbsp;&nbsp; <br />
　　在JDBC2.0或JDBC3.0中，所有的数据库驱动程序提供商必须提供一个实现了DataSource接口的类，要使用数据源必须首先在JNDI中注册该数据源对象。</p>
<p>　　如果在JNDI中注册了数据源对象，将会比起使用DriverManager来具有两个方面的优势：</p>
<p>　　首先程序不需要像使用DriverManager一样对加载的数据库驱动程序信息进行硬编码，程序员可以选择先在JNDI中注册这个数据源对象，然后在程序中使用一个逻辑名称来引用它，JNDI会自动根据你给出的名称找到与这个名称绑定的DataSource对象。然后就可以使用这个DataSource对象来建立和具体数据库的连接了。</p>
<p>　　其次，使用实现了DataSource接口的类所具有的第二个优势体现在连接池和分布式事务上。连接池通过对连接的复用而不是新建一个物理连接来显著地提高程序的效率。从而适用于任务繁忙、负担繁重的企业级分布式事务。</p>
<p><br />
　<strong>　二、JNDI简介：</strong></p>
<p>　　JNDI是用于向Java程序提供目录和命名功能的API。它被设计成独立于特定的目录服务，所以各种各样的目录都可以通过相同的方式进行访问。</p>
<p>　　可以简单地把JNDI理解为一种将对象和名字绑定的技术，对象工厂负责生产出对象，这些对象都和惟一的名字绑定。外部程序可以通过名字来获取对某个对象的引用。</p>
<p>　　在Intranets(企业内部网)和Internates（互联网）中目录服务(Directory service)扮演了一个非常重要的角色，它能够在众多的用户、机器、网络、服务、应用程序中访问各种各样的信息。目录服务提供了一系列的命名措施，用人类可以理解的命名方式来刻画各种各样的实体之间的关系。</p>
<p>　　一个企业式计算环境(computing environment)通常是由若干代表不同部分的命名复合而成。比如在一个企业级环境中DNS(Domain Name System)通常被当成顶层的命名方案(top-level namein facility)区分不同的部门或组织。而这些部门或组织自己又可以使用诸如LADP或NDS的目录服务。</p>
<p>　　从用户的角度来看，这些都是由不同的命名方案构成的复合名称。URL就是一个很典型的例子，它由多个命名方案构成。使用目录服务的应用程序必须支持这种复合构成方式。</p>
<p>　　使用目录服务API的Java开发人员获得的好处不仅在于API独立于特定的目录或命名服务，而且可以通过多层的命名方案无缝访问(seamless acess)目录对象。实际上，任何的应用程序都可以将自身的对象和特定的命名绑定起来，这种功能可以使到任何的Java程序查找和获取任何类型的对象。</p>
<p>　　终端用户可以方便地使用逻辑名称从而轻易地在网络上查找和识别各种不同的对象，目录服务的开发人员可以使用API方便地在不同的客服端之间切换而不需要作任何更改。</p>
<p><br />
　<strong>　三、数据源和连接池的关系：</strong></p>
<p>　　JDBC2.0提供了javax.sql.DataSource接口，它负责建立与数据库的连接，在应用程序访问数据库时不需要编写连接数据库的代码，可以直接从数据源获得数据库连接。<br />
　<br />
　　在DataSource中事先建立了多个数据库连接，这些数据库连接保存在连接池(Connect Pool)中。Java程序访问数据库时，只需要从连接池中取出空闲状态的数据库连接；当程序访问数据库结束，再将数据库连接放回连接池。</p>
<p><br />
　　<strong>四、数据源和JNDI的关系：</strong></p>
<p>　　DataSource对象是由Tomcat提供的，因此不能在程序中采用创建一个实例的方式来生产DataSource对象，而需要采用Java的另一个技术JNDI，来获得DataSource对象的引用。</p>
<p>　　Tomcat把DataSource作为一种可以配置的JNDI资源来处理。生成DataSource对象的工厂为org.apache.commons.dbcp.BasicDataSourceFactory。</p>
<p>　　在javax.naming包中提供了Context接口，该接口提供了将对象和名字绑定，以及通过名字检索对象的方法。Context中的主要方法有：</p>
<p>　　bind(String name,Object object)：将对象与一个名字绑定<br />
　　lookup(String name)：返回与指定的名字绑定的对象</p>
<p><strong>五、Tomcat中数据源的配置：</strong> </p>
<p>　　数据源的配置涉及修改server.xml和web.xml，在server.xml中加入定义数据源的元素<resource></resource>，在web.xml加入<resource-ref></resource-ref>元素，声明该Web应用所引用的数据。</p>
<p>　　A．在server.xml中加入<resource></resource>元素：<resource></resource>元素用来定义JNDI Resource。<br />
　　<br />
　　属性&nbsp;&nbsp;&nbsp; 描述<br />
　　name&nbsp;&nbsp;&nbsp; 指定Resource的JNDI名字<br />
　　auth&nbsp;&nbsp;&nbsp; 指定管理Resource的Manager，它有两个可选值：Container、Application<br />
　　type&nbsp;&nbsp;&nbsp; 指定Resource所属的Java类名</p>
<p>&nbsp;</p>
<div style="scrollbar-highlight-color: buttonhighlight; overflow: auto; width: 500px">
<pre style="border-right: black 1px solid; padding-right: 4px; border-top: black 1px solid; padding-left: 4px; padding-bottom: 4px; border-left: black 1px solid; padding-top: 4px; border-bottom: black 1px solid; background-color: #ededed">
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" /><span style="color: #000000">&lt;</span><span style="color: #000000">Resource name </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">jdbc/BookDb</span><span style="color: #000000">"</span></font><font face="Arial"><span style="color: #000000">　
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />auth </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">Container</span><span style="color: #000000">"</span></font><font face="Arial"><span style="color: #000000">　
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />     　　　type </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">javax.sql.DataSource</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">/&gt;</span></font></div>
</pre>
</div>
<p>　　B．在<resource></resource>元素中加入<resourceparams></resourceparams>元素：<resourceparams></resourceparams>元素用来指定各种参数值<br />
　　<br />
　　属性&nbsp;&nbsp;&nbsp; 　　描述<br />
　　factory&nbsp;&nbsp;&nbsp; 指定生成的DataResource的factory类名<br />
　　maxActive&nbsp;&nbsp;&nbsp; 指定数据库连接池中处于活动状态的最大连接数目，0表示不受限制<br />
　　maxIdle&nbsp;&nbsp;&nbsp; 指定数据库连接池中处于空闲状态的最大连接数目，0表示不受限制<br />
　　maxWait&nbsp;&nbsp;&nbsp; 指定连接池中连接处于空闲状态的最长时间,超过会抛出异常，-1表示无限<br />
　　username&nbsp;&nbsp;&nbsp; 指定连接数据库的用户名<br />
　　password&nbsp;&nbsp;&nbsp; 指定连接数据库的口令<br />
　　driverClassName&nbsp;&nbsp;&nbsp; 指定连接数据库的JDBC驱动程序<br />
　　url　　指定连接数据库的URL<br />
</p>
<div style="scrollbar-highlight-color: buttonhighlight; overflow: auto; width: 500px">
<pre style="border-right: black 1px solid; padding-right: 4px; border-top: black 1px solid; padding-left: 4px; padding-bottom: 4px; border-left: black 1px solid; padding-top: 4px; border-bottom: black 1px solid; background-color: #ededed">
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">ResourceParams name </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">jdbc/BookDb</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">factory</span><span style="color: #000000"><span style="color: #000000">name</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" /></font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">org.apache.commons.dbcp.BasicDataSourceFactory</span><span style="color: #000000"><span style="color: #000000">value</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000"><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">maxActive</span><span style="color: #000000"><span style="color: #000000">name</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">100</span><span style="color: #000000"><span style="color: #000000">value</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000"><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">maxIdle</span><span style="color: #000000"><span style="color: #000000">name</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">30</span><span style="color: #000000"><span style="color: #000000">value</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000"><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">maxWait</span><span style="color: #000000"><span style="color: #000000">name</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">10000</span><span style="color: #000000"><span style="color: #000000">value</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000"><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">username</span><span style="color: #000000"><span style="color: #000000">name</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">user</span><span style="color: #000000"><span style="color: #000000">value</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000"><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">password</span><span style="color: #000000"><span style="color: #000000">name</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">1234</span><span style="color: #000000"><span style="color: #000000">value</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000"><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></span></font><font face="Arial"><span style="color: #000000">
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </span><span style="color: #000000">&lt;</span><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">driverClassName</span><span style="color: #000000"><span style="color: #000000">name</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">com.mysql.jdbc.Driver</span><span style="color: #000000"><span style="color: #000000">value</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000"><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />    </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />       </font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">url</span><span style="color: #000000"><span style="color: #000000">name</span><span style="color: #000000">&gt;</span></span></font><span style="color: #000000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" /></font></span><font face="Arial"><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">jdbc:mysql</span><span style="color: #008000">//</span><span style="color: #008000">localhost:3306/BookDb?autoReconnect=true</span></font><span style="color: #008000">
<font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" /></font></span><font face="Arial"><span style="color: #000000">    </span><span style="color: #000000"><span style="color: #000000">parameter</span><span style="color: #000000">&gt;</span></span></font><font face="Arial"><span style="color: #000000">
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />
</span><span style="color: #000000"><span style="color: #000000">ResourceParams</span><span style="color: #000000">&gt;</span></span></font></div>
</pre>
</div>
<p>&nbsp;</p>
<p>　　C．在web.xml中加入<resource-ref></resource-ref>元素：<resource-ref></resource-ref>元素表示在Web应用中引用JNDI资源<br />
　　<br />
　　属性　　　　　　描述<br />
　　description&nbsp;&nbsp;&nbsp; 对所引用的资源的说明<br />
　　res-ref-name&nbsp;&nbsp;&nbsp; 指定所引用资源的JNDI名字，与<resource></resource>元素中的name属性对应<br />
　　res-type　　指定所引用资源的类名字，与<resource></resource>元素中的type属性对应<br />
　　res-auth　　指定所引用资源的Manager，与<resource></resource>元素中的auth属性对应</p>
<p><br />
　　<strong>六、在Web应用中使用数据源：</strong></p>
<p>　　javax.naming.Context提供了查找JNDI Resource的接口，可以通过三个步骤来使用数据源对象：</p>
<p>　　A．获得对数据源的引用：</p>
<p>&nbsp;</p>
<div style="scrollbar-highlight-color: buttonhighlight; overflow: auto; width: 500px">
<pre style="border-right: black 1px solid; padding-right: 4px; border-top: black 1px solid; padding-left: 4px; padding-bottom: 4px; border-left: black 1px solid; padding-top: 4px; border-bottom: black 1px solid; background-color: #ededed">
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" /><span style="color: #000000">　　　<font face="Arial">　Context ctx </font></span><font face="Arial"><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span></font><font face="Arial"><span style="color: #000000"> InitalContext();
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />DataSource ds </span><span style="color: #000000">=</span></font><font face="Arial"><span style="color: #000000">
<img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" />(DataSource)ctx.lookup(</span><span style="color: #000000">"</span><span style="color: #000000">java:comp/env/jdbc/BookDb</span><span style="color: #000000">"</span><span style="color: #000000">);</span></font></div>
</pre>
</div>
<p>　　B．获得数据库连接对象：<br />
</p>
<div style="scrollbar-highlight-color: buttonhighlight; overflow: auto; width: 500px">
<pre style="border-right: black 1px solid; padding-right: 4px; border-top: black 1px solid; padding-left: 4px; padding-bottom: 4px; border-left: black 1px solid; padding-top: 4px; border-bottom: black 1px solid; background-color: #ededed">
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" /><span style="color: #000000">Connection con </span><span style="color: #000000">=</span><span style="color: #000000"> ds.getConnection();</span></font></div>
</pre>
</div>
<p>　　C．返回数据库连接到连接池：<br />
</p>
<div style="scrollbar-highlight-color: buttonhighlight; overflow: auto; width: 500px">
<pre style="border-right: black 1px solid; padding-right: 4px; border-top: black 1px solid; padding-left: 4px; padding-bottom: 4px; border-left: black 1px solid; padding-top: 4px; border-bottom: black 1px solid; background-color: #ededed">
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
<a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a>
--><font face="Arial"><img alt="" src="http://cms.it168.com/Images/OutliningIndicators/None.gif" align="top" _counted="undefined" /><span style="color: #000000">con.close();</span></font></div>
</pre>
</div>
<p>&nbsp;</p>
<p>　　在连接池中使用close()方法和在非连接池中使用close()方法的区别是：前者仅仅是把数据库连接对象返回到数据库连接池中，是连接对象又恢复到空闲状态，而非关闭数据库连接，而后者将直接关闭和数据库的连接。</p>
<p><br />
　<strong>　七、发布使用数据源的Web应用：</strong></p>
<p>　　如果直接同JDBC访问数据库，可以把JDBC驱动程序拷贝到Web应用的WEB-INF/lib目录或者Tomcat安装目录下的common/lib目录下。<br />
　　<br />
　　如果通过数据源访问数据库，由于数据源由Servlet容器创建并维护，所以必须把JDBC驱动程序拷贝到Tomcat安装目录下的common/lib目录下，确保Servlet容器能够访问驱动程序。<br />
</p>
<div id="ParagraphCount" style="display: none"></div>
<div style="display: none">------------</div>
<div style="display: none"></div>
<div style="display: none">&nbsp;八.在WEB中应用JNDI访问数据源</div>
<div style="display: none">--java:comp/env是TOMCAT 固定的,Tomcat提供的JNDI绑定都必须加此前缀,</div>
<div style="display: none">--jdbc/dstest 是定义数据源时的数据名</div>
<div style="display: none">&nbsp;final String JNDINAME ="java:comp/env/jdbc/dstest";</div>
<div style="display: none">&nbsp;Context&nbsp; ctx = new InitalContext();</div>
<div style="display: none">&nbsp;DataSource ds = (DataSource)ctx.lookup(JNDINAME);</div>
<div style="display: none">&nbsp;Connection conn = ds.getConnection();</div>
<div style="display: none">&nbsp;Statement stmt=conn.createrStatement();</div>
<div style="display: none">&nbsp;ResultSet rs = stmt.executeQuery( "sql 语句");</div>
<div style="display: none">&nbsp;while(rs.next)</div>
<div style="display: none">&nbsp;{}</div>
<div style="display: none">---------</div>
<div style="display: none">可通过修改server.xml文件来进行配置全局数据源,配置方式与局部数据源类似,只是修改的文件不同.</div>
<div style="display: none">局部数据源只需要修改web应用的配置文件,而全局数据源需要修改Tomcat的系统文件.</div>
<div style="display: none">一般尽量不使用全局数据源.</div>
<div style="display: none"></div>
<div style="display: none">&nbsp;&nbsp; </div>
</div>
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/227703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-09-08 12:32 <a href="http://www.blogjava.net/jzgl-ever/articles/227703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JNDI全攻略之(一)</title><link>http://www.blogjava.net/jzgl-ever/articles/227698.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Mon, 08 Sep 2008 04:27:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/227698.html</guid><description><![CDATA[<h3 align="center"><font style="background-color: #b3d9ff" color="#000000">JNDI全攻略之(一)</font></h3>
<div>
<p><font size="2"><strong>关键字：JNDI,J2EE,Java，命名和目录接口，Java Naming and Directory Interface</strong></font></p>
<p><strong><font size="2">摘要:</font></strong></p>
</div>
<blockquote>
<div><font size="2">本文详细介绍了JNDI的架构与实现,JNDI的工作原理，并给出了具体代码，帮助读者更理解J2EE主要常用技术---JNDI.本文为系列文章的第一篇，其它相关文章会在近期推出。</font></div>
</blockquote>
<div>&nbsp;</div>
<div><font size="2"><strong>名词解释</strong></font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;jndi是Java 命名和目录接口（Java Naming and Directory Interface，JNDI）的简称.从一开始就一直是 Java 2 平台企业版（JEE）的核心技术之一。在JMS，JMail,JDBC,EJB等技术中，就大量应用的这种技术。</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;</font></div>
<div><font size="2"><strong>为什么会有jndi</strong></font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;jndi诞生的理由似乎很简单。随着分布式应用的发展，远程访问对象访问成为常用的方法。虽然说通过Socket等编程手段仍然可实现远程通信，但按照模式的理论来说，仍是有其局限性的。RMI技术，RMI-IIOP技术的产生，使远程对象的查找成为了技术焦点。JNDI技术就应运而生。JNDI技术产生后，就可方便的查找远程或是本地对象。</font></div>
<div>&nbsp;</div>
<div>
<div><font size="2"><strong>JNDI的架构与实现</strong></font></div>
<div><font size="2"></font></div>
<div><font size="2"><img style="width: 443px; height: 278px" height="359" src="http://blog.yesky.com/Blog/images/yesky_com/sylilzy/20050304182629_578.jpg" width="575" border="0"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
JNDI的架构与JDBC的架构非常类似.JNDI架构提供了一组标准命名系统的API,这些API在JDK1.3之前是作为一个单独的扩展包jndi.jar(<a href="http://java.sun.com/products/jndi/downloads/index.html">通过这个地址下载</a>),这个基础API构建在与SPI之上。这个API提供如下五个包</font></div>
<ul>
    <li><a href="http://java.sun.com/products/jndi/tutorial/getStarted/overview/naming.html">javax.naming</a>
    <li><a href="http://java.sun.com/products/jndi/tutorial/getStarted/overview/directory.html">javax.naming.directory</a>
    <li><a href="http://java.sun.com/products/jndi/tutorial/getStarted/overview/event.html">javax.naming.event</a>
    <li><a href="http://java.sun.com/products/jndi/tutorial/getStarted/overview/ldap.html">javax.naming.ldap</a>
    <li><a href="http://java.sun.com/products/jndi/tutorial/getStarted/overview/provider.html">javax.naming.spi</a> </li>
</ul>
<div><font size="2">在应用程序中,我们实际上只使到用以上几个包的中类.具体调用类及通信过程对用户来说是透明的.</font></div>
<div><font size="2">JNDI API提供了访问不同JNDI服务的一个标准的统一的实现,其具体实现可由不同的</font> <font size="2">Service Provider</font></a><font size="2">来完成。前面讲的为第一层JNDI API层.</font></div>
<div>&nbsp;</div>
<div><font size="2">最下层为JNDI SPI API及其具体实现。</div>
<div align="center">&nbsp;</div>
<div>
<p>图中所列的一些SPI可从<a href="http://java.sun.com/products/jndi/downloads/index.html"><font size="2">http://java.sun.com/products/jndi/downloads/index.html</font></a><font size="2">下载.</font></p>
<p><font size="2"></font></p>
<font size="2"><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"></v:shapetype></span></font></div>
<div><font size="2"><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><img height="206" src="http://blog.yesky.com/Blog/images/yesky_com/sylilzy/20050304182539_562.gif" width="230" border="0"  alt="" /><br />
它</v:shapetype></span></font><font size="2">包括了几个增强和下面的命名/目录服务提供者：</font></div>
<font size="2">
<ul>
    <li>LDAP(Lightweight Directory Access Protocol)服务提供者
    <li>CORBA COS（Common Object Request Broker Architecture Common Object Services）命名服务提供者&nbsp;
    <li>RMI(Java Remote Method Invocation)注册服务提供者
    <li>DNS(Domain Name System)服务提供者.
    <li>FSSP(File System Service Provider)文件系统服务提供者
    <li>其它服务提供者 </li>
</ul>
<div>&nbsp;</div>
<div>中间层为命名管理层。其功能应该由JNDI SPI来完成。上层为JNDI API,这个API包在Java 2 SDK 1.3及以上的版本中已经包括。</div>
<div>&nbsp;</div>
<div>前面讲解的只是作为应用程序客户端的架构实现,其服务端是由SPI对应的公司/厂商来实现的,我们只需将服务端的相关参数传给JNDI API就可以了,具体调用过程由SPI来完成.</div>
<div>&nbsp;</div>
</div>
<div>&nbsp;</div>
<div><font size="2"><strong>JNDI工作原理</strong></font></div>
<div>&nbsp;</div>
<div>
<p><font size="2">下面通过一个示例程序来说明JNDI工作原理(代码为自解释).</font></p>
<pre><font size="3"><code><font face="Courier New"><font color="#008000"><em>/*
* Created on 2005-3-4
*
* To change the template for this generated file go to
* Window&amp;gt;Preferences&amp;gt;Java&amp;gt;Code Generation&amp;gt;Code and Comments
*/
</em></font><font color="#ff0000"><strong>package </strong></font>com<font color="#0000ff"><strong>.</strong></font>sily<font color="#0000ff"><strong>.</strong></font>jndi<font color="#0000ff"><strong>;
</strong></font><font color="#ff0000"><strong>import </strong></font>java<font color="#0000ff"><strong>.</strong></font>io<font color="#0000ff"><strong>.</strong></font>FileInputStream<font color="#0000ff"><strong>;
</strong></font><font color="#ff0000"><strong>import </strong></font>java<font color="#0000ff"><strong>.</strong></font>util<font color="#0000ff"><strong>.</strong></font>Properties<font color="#0000ff"><strong>;
</strong></font><font color="#ff0000"><strong>import </strong></font>javax<font color="#0000ff"><strong>.</strong></font>naming<font color="#0000ff"><strong>.</strong></font>Context<font color="#0000ff"><strong>;
</strong></font><font color="#ff0000"><strong>import </strong></font>javax<font color="#0000ff"><strong>.</strong></font>naming<font color="#0000ff"><strong>.</strong></font>InitialContext<font color="#0000ff"><strong>;
</strong></font><font color="#3a6ea5">/**
* @author shizy
*
* To change the template for this generated type comment go to
* Window&amp;gt;Preferences&amp;gt;Java&amp;gt;Code Generation&amp;gt;Code and Comments
*/
</font><font color="#ff0000"><strong>public class </strong></font>TestJbossJNDI <font color="#0000ff"><strong>{
</strong></font><font color="#3a6ea5">/**
*
*/
</font><font color="#ff0000"><strong>public </strong></font>TestJbossJNDI<font color="#0000ff"><strong>() {
</strong></font><font color="#ff0000"><strong>super</strong></font><font color="#0000ff"><strong>();
</strong></font><font color="#008000"><em>// TODO Auto-generated constructor stub
</em></font><font color="#0000ff"><strong>}
</strong></font><font color="#ff0000"><strong>public static void </strong></font>main<font color="#0000ff"><strong>(</strong></font>String<font color="#0000ff"><strong>[] </strong></font>args<font color="#0000ff"><strong>) { </strong></font><font color="#ff0000"><strong>try </strong></font><font color="#0000ff"><strong>{
</strong></font>Properties env <font color="#0000ff"><strong>= </strong></font><font color="#ff0000"><strong>new </strong></font>Properties<font color="#0000ff"><strong>();
</strong></font><font color="#008000"><em>//载入jboss的SPI相关参数,包括初始上下文工厂，服务URL，等等
</em></font>env<font color="#0000ff"><strong>.</strong></font>load<font color="#0000ff"><strong>(</strong></font><font color="#ff0000"><strong>new </strong></font>FileInputStream<font color="#0000ff"><strong>(</strong>"jbossJndi.properties"<strong>));
</strong></font>env<font color="#0000ff"><strong>.</strong></font>list<font color="#0000ff"><strong>(</strong></font>System<font color="#0000ff"><strong>.</strong></font>out<font color="#0000ff"><strong>);
</strong></font><font color="#008000"><em>//通过JNDI api 初始化上下文
</em></font>InitialContext ctx <font color="#0000ff"><strong>= </strong></font><font color="#ff0000"><strong>new </strong></font>javax<font color="#0000ff"><strong>.</strong></font>naming<font color="#0000ff"><strong>.</strong></font>InitialContext<font color="#0000ff"><strong>(</strong></font>env<font color="#0000ff"><strong>);
</strong></font>System<font color="#0000ff"><strong>.</strong></font>out<font color="#0000ff"><strong>.</strong></font>println<font color="#0000ff"><strong>(</strong>"Got context"<strong>);
</strong></font><font color="#008000"><em>//create a subContext
</em></font>ctx<font color="#0000ff"><strong>.</strong></font>createSubcontext<font color="#0000ff"><strong>(</strong>"/sylilzy"<strong>);
</strong></font>ctx<font color="#0000ff"><strong>.</strong></font>createSubcontext<font color="#0000ff"><strong>(</strong>"sylilzy/sily"<strong>);
</strong></font><font color="#008000"><em>//rebind a object
</em></font>ctx<font color="#0000ff"><strong>.</strong></font>rebind<font color="#0000ff"><strong>(</strong>"sylilzy/sily/a"<strong>, </strong>"I am sily a!"<strong>);
</strong></font>ctx<font color="#0000ff"><strong>.</strong></font>rebind<font color="#0000ff"><strong>(</strong>"sylilzy/sily/b"<strong>, </strong>"I am sily b!"<strong>);
</strong></font><font color="#008000"><em>//lookup context
</em></font>Context ctx1<font color="#0000ff"><strong>=(</strong></font>Context<font color="#0000ff"><strong>)</strong></font>ctx<font color="#0000ff"><strong>.</strong></font>lookup<font color="#0000ff"><strong>(</strong>"sylilzy"<strong>);
</strong></font>Context ctx2<font color="#0000ff"><strong>=(</strong></font>Context<font color="#0000ff"><strong>)</strong></font>ctx1<font color="#0000ff"><strong>.</strong></font>lookup<font color="#0000ff"><strong>(</strong>"/sylilzy/sily"<strong>);
</strong></font>ctx2<font color="#0000ff"><strong>.</strong></font>bind<font color="#0000ff"><strong>(</strong>"/sylilzy/g"<strong>, </strong>"this is g"<strong>);
</strong></font><font color="#008000"><em>//lookup binded object
</em></font>Object o<font color="#0000ff"><strong>;
</strong></font>o<font color="#0000ff"><strong>=</strong></font>ctx1<font color="#0000ff"><strong>.</strong></font>lookup<font color="#0000ff"><strong>(</strong>"sily/a"<strong>);
</strong></font>System<font color="#0000ff"><strong>.</strong></font>out<font color="#0000ff"><strong>.</strong></font>println<font color="#0000ff"><strong>(</strong>"get object from jndi:"<strong>+</strong></font>o<font color="#0000ff"><strong>);
</strong></font><font color="#008000"><em>//rename the object
</em></font>ctx2<font color="#0000ff"><strong>.</strong></font>rename<font color="#0000ff"><strong>(</strong>"/sylilzy/g"<strong>, </strong>"g1"<strong>);
</strong></font>o<font color="#0000ff"><strong>=</strong></font>ctx2<font color="#0000ff"><strong>.</strong></font>lookup<font color="#0000ff"><strong>(</strong>"g1"<strong>);
</strong></font>System<font color="#0000ff"><strong>.</strong></font>out<font color="#0000ff"><strong>.</strong></font>println<font color="#0000ff"><strong>(</strong>"get object from jndi:"<strong>+</strong></font>o<font color="#0000ff"><strong>);
} </strong></font><font color="#ff0000"><strong>catch </strong></font><font color="#0000ff"><strong>(</strong></font>Exception e<font color="#0000ff"><strong>) {
</strong></font>e<font color="#0000ff"><strong>.</strong></font>printStackTrace<font color="#0000ff"><strong>();
}
}
}</strong></font></font></code></font><font size="2"><br />
</font><font size="2">结果输出如下:</font></pre>
</div>
<div><font size="2">-- listing properties --<br />
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory<br />
java.naming.provider.url=jnp://localhost:1099<br />
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces<br />
Got context<br />
get object from jndi:I am sily a!<br />
get object from jndi:this is g</font></div>
<div>&nbsp;</div>
<div><font size="2">程序中<font face="Courier New" color="#0000ff">jbossJndi.properties文件的内容为:</font></font></div>
<div><font size="2">java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory<br />
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces<br />
java.naming.provider.url=jnp://localhost:1099</font></div>
<div>&nbsp;</div>
<div><font size="2">注意:要正确运行示例程序,请启动jboss,并将jboss的jbossall-client.jar文件放入classpath中。</font></div>
<div>&nbsp;</div>
<div><font size="2">上述示例程序在jboss服务器的jndi树上建立了几个上下文,并bind了几对象,大家可通过附录中的代码或其它工具查看</font></div>
<div><font size="2">查看结果为：</font></div>
<div><font size="2">-----------------------------<br />
/sylilzy/sily<br />
-----------------------------<br />
/sylilzy/sily/b:I am sily b!<br />
/sylilzy/sily/a:I am sily a!<br />
/sylilzy/sily/g1:this is g<br />
-----------------------------<br />
-----------------------------</font></div>
<div>&nbsp;</div>
<div><font size="2">上述程序中，我们的代码只涉及到了jndi API，其它细节如初始化jboss jndi的初始上下文，建立网络连接，与服务器通信，对我们来说都是透明的，另外，我们将jboss jndi的spi包中的类名作为参数传入了程序中,要访问一个远程对象，我们所做的就这么多。</font></div>
<div>&nbsp;</div>
<div><font size="2">下面，再提供一个例子，与上例不同，我们不需要jboss,我们使用sun的FSSP(File System Service Provider)文件系统服务提供者.注意在这个例子中要使用到前面所说的File System Service Provider for the Java Naming and Directory Interface<sup>TM</sup> (JNDI)相关类（<a href="http://java.sun.com/products/jndi/downloads/index.html">下载</a>）。</font></div>
<pre><code><font face="Courier New" size="3"><font size="2"><font color="#008000"><em>/*
* Created on 2005-3-1
*
* To change the template for this generated file go to
* Window&amp;gt;Preferences&amp;gt;Java&amp;gt;Code Generation&amp;gt;Code and Comments
*/
</em></font><font color="#ff0000"><strong>package </strong></font>com<font color="#0000ff"><strong>.</strong></font>sily<font color="#0000ff"><strong>.</strong></font>jndi</font><font size="2"><font color="#0000ff"><strong>;
</strong></font><font color="#ff0000"><strong>import </strong></font>java<font color="#0000ff"><strong>.</strong></font>io<font color="#0000ff"><strong>.</strong></font>FileInputStream</font><font size="2"><font color="#0000ff"><strong>;
</strong></font><font color="#ff0000"><strong>import </strong></font>java<font color="#0000ff"><strong>.</strong></font>util<font color="#0000ff"><strong>.</strong></font>Properties</font><font size="2"><font color="#0000ff"><strong>;
</strong></font><font color="#ff0000"><strong>import </strong></font>javax<font color="#0000ff"><strong>.</strong></font>naming</font><font size="2"><font color="#0000ff"><strong>.*;
</strong></font><font color="#ff0000"><strong>import </strong></font>javax<font color="#0000ff"><strong>.</strong></font>naming<font color="#0000ff"><strong>.</strong></font>Context</font><font size="2"><font color="#0000ff"><strong>;
</strong></font><font color="#ff0000"><strong>import </strong></font>javax<font color="#0000ff"><strong>.</strong></font>naming<font color="#0000ff"><strong>.</strong></font>InitialContext</font><font color="#0000ff" size="2"><strong>;
</strong></font><font size="2"><font color="#3a6ea5">/**
* @author shizy
*
* To change the template for this generated type comment go to
* Window&amp;gt;Preferences&amp;gt;Java&amp;gt;Code Generation&amp;gt;Code and Comments
*/
</font><font color="#ff0000"><strong>public class </strong></font>JndiTest1 </font><font size="2"><font color="#0000ff"><strong>{
</strong></font></font><font size="2"><font color="#3a6ea5">/**
*
*/
</font><font color="#ff0000"><strong>public </strong></font>JndiTest1</font><font size="2"><font color="#0000ff"><strong>() {
</strong></font><font color="#000000">  </font><font color="#ff0000"><strong>super</strong></font></font><font size="2"><font color="#0000ff"><strong>();
</strong></font><font color="#000000">  </font></font><font size="2"><font color="#008000"><em>// TODO Auto-generated constructor stub
</em></font><font color="#000000"> </font></font><font size="2"><font color="#0000ff"><strong>}
</strong></font><font color="#000000"> </font><font color="#ff0000"><strong>public static void </strong></font>main<font color="#0000ff"><strong>(</strong></font>String<font color="#0000ff"><strong>[] </strong></font>args</font><font size="2"><font color="#0000ff"><strong>) {
</strong></font><font color="#000000">  </font><font color="#ff0000"><strong>try </strong></font></font><font size="2"><font color="#0000ff"><strong>{
</strong></font><font color="#000000">   </font>Properties env <font color="#0000ff"><strong>= </strong></font><font color="#ff0000"><strong>new </strong></font>Properties</font><font size="2"><font color="#0000ff"><strong>();
</strong></font><font color="#000000">   </font>env<font color="#0000ff"><strong>.</strong></font>load<font color="#0000ff"><strong>(</strong></font><font color="#ff0000"><strong>new </strong></font>FileInputStream</font><font color="#0000ff"><font size="2"><strong>(</strong>"fileSystemService.properties"</font><strong><font size="2">));
</font></strong></font><font size="2"><font color="#000000">   </font>env<font color="#0000ff"><strong>.</strong></font>put<font color="#0000ff"><strong>(</strong></font>Context<font color="#0000ff"><strong>.</strong></font>PROVIDER_URL</font><font color="#0000ff"><font size="2"><strong>, </strong>"file:///c:/"</font><strong><font size="2">);
</font></strong></font><font size="2"><font color="#000000">   </font>Context ctx <font color="#0000ff"><strong>= </strong></font><font color="#ff0000"><strong>new </strong></font>InitialContext<font color="#0000ff"><strong>(</strong></font>env</font><font size="2"><font color="#0000ff"><strong>);
</strong></font><font color="#000000">   </font>ctx<font color="#0000ff"><strong>.</strong></font>createSubcontext</font><font color="#0000ff"><font size="2"><strong>(</strong>"sylilzy"</font><strong><font size="2">);
</font></strong></font><font size="2"><font color="#000000">
</font>NamingEnumeration list <font color="#0000ff"><strong>= </strong></font>ctx<font color="#0000ff"><strong>.</strong></font>list</font><font color="#0000ff"><font size="2"><strong>(</strong>"/"</font><strong><font size="2">);
</font></strong></font><font size="2"><font color="#000000">   </font><font color="#ff0000"><strong>while </strong></font><font color="#0000ff"><strong>(</strong></font>list<font color="#0000ff"><strong>.</strong></font>hasMore</font><font size="2"><font color="#0000ff"><strong>()) {
</strong></font><font color="#000000">    </font>NameClassPair nc <font color="#0000ff"><strong>= (</strong></font>NameClassPair<font color="#0000ff"><strong>) </strong></font>list<font color="#0000ff"><strong>.</strong></font>next</font><font size="2"><font color="#0000ff"><strong>();
</strong></font><font color="#000000">    </font>System<font color="#0000ff"><strong>.</strong></font>out<font color="#0000ff"><strong>.</strong></font>println<font color="#0000ff"><strong>(</strong></font>nc</font><font size="2"><font color="#0000ff"><strong>);
</strong></font><font color="#000000">   </font></font><font color="#0000ff" size="2"><strong>}
</strong></font><font color="#000000" size="2">
</font><font size="2"><font color="#0000ff"><strong>}
</strong></font><font color="#000000">  </font><font color="#ff0000"><strong>catch </strong></font><font color="#0000ff"><strong>(</strong></font>Exception e</font><font size="2"><font color="#0000ff"><strong>) {
</strong></font><font color="#000000">   </font>e<font color="#0000ff"><strong>.</strong></font>printStackTrace</font><font size="2"><font color="#0000ff"><strong>();
</strong></font><font color="#000000">  </font></font><font size="2"><font color="#0000ff"><strong>}
</strong></font><font color="#000000"> </font></font><font color="#0000ff" size="2"><strong>}
}</strong></font></font>
</code></pre>
<div>&nbsp;</div>
<div><font size="2">上例中fileSystemService.properties文件的内容为：java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory</font></div>
<div>&nbsp;</div>
<div><font size="2">这个例子较简单，运行后，它会列出C:\下所有的文件和目录，另外你会发现有一个新目录被创建了.本例不同于上例，它并不需要服务端，因为它访问的是文件系统.有关帮助可查阅包内的相关文档。</font></div>
<div>&nbsp;</div>
<div><font size="2">通过对比这两个例子，应该JNDI的工作原理有了一个大致的了解。</font></div>
<pre><strong><font size="2">总结：</font></strong></pre>
<div><font size="2">jndi技术体现了分布式应用的优点，同进它的产生也为分布式对象提供了统一的访问接口。由于篇幅所限，对目录的操作本文未作介绍，其它内容将在接下来的系列中讨论。要对JNDI技术作全面的了解，请参阅参考资料.要对于JNDI技术深入学习，仍有许多地方值得进一步了解，例如EJB容器所使用的JNDI所提供的对象就有 Local和Remote之分，对于Local Object,对于不同的JVM是不可访问的；对于远程对象的访问，还涉及到Java安全机制。</font></div>
<div>&nbsp;</div>
<div><strong><font size="2">附录:</font></strong></div>
<div><font size="2">查看jboss jndi内容的代码:</font></div>
<div><font size="2">//----------------------------------------</font></div>
<div>
<pre><code><font face="Courier New"><font size="2"><font color="#008000"><em>/*
* Created on 2005-3-4
*
* To change the template for this generated file go to
* Window&amp;gt;Preferences&amp;gt;Java&amp;gt;Code Generation&amp;gt;Code and Comments
*/
</em></font><font color="#ff0000"><strong>package </strong></font>com<font color="#0000ff"><strong>.</strong></font>sily<font color="#0000ff"><strong>.</strong></font>jndi</font><font size="2"><font color="#0000ff"><strong>;
</strong></font><font color="#ff0000"><strong>import </strong></font>java<font color="#0000ff"><strong>.</strong></font>io<font color="#0000ff"><strong>.</strong></font>FileInputStream</font><font size="2"><font color="#0000ff"><strong>;
</strong></font><font color="#ff0000"><strong>import </strong></font>java<font color="#0000ff"><strong>.</strong></font>util<font color="#0000ff"><strong>.</strong></font>Properties</font><font size="2"><font color="#0000ff"><strong>;
</strong></font><font color="#ff0000"><strong>import </strong></font>javax<font color="#0000ff"><strong>.</strong></font>naming</font><font size="2"><font color="#0000ff"><strong>.*;
</strong></font><font color="#ff0000"><strong>import </strong></font>javax<font color="#0000ff"><strong>.</strong></font>naming<font color="#0000ff"><strong>.</strong></font>Context</font><font size="2"><font color="#0000ff"><strong>;
</strong></font><font color="#ff0000"><strong>import </strong></font>javax<font color="#0000ff"><strong>.</strong></font>naming<font color="#0000ff"><strong>.</strong></font>InitialContext</font><font color="#0000ff" size="2"><strong>;
</strong></font><font size="2"><font color="#3a6ea5">/**
* @author shizy
*
* To change the template for this generated type comment go to
* Window&amp;gt;Preferences&amp;gt;Java&amp;gt;Code Generation&amp;gt;Code and Comments
*/
</font><font color="#ff0000"><strong>public class </strong></font>ListJbossJndi </font><font size="2"><font color="#0000ff"><strong>{
</strong></font></font><font size="2"><font color="#3a6ea5">/**
*
*/
</font><font color="#ff0000"><strong>public </strong></font>ListJbossJndi</font><font size="2"><font color="#0000ff"><strong>() {
</strong></font><font color="#000000">  </font><font color="#ff0000"><strong>super</strong></font></font><font size="2"><font color="#0000ff"><strong>();
</strong></font><font color="#000000">  </font></font><font size="2"><font color="#008000"><em>// TODO Auto-generated constructor stub
</em></font><font color="#000000"> </font></font><font size="2"><font color="#0000ff"><strong>}
</strong></font><font color="#000000"> </font><font color="#ff0000"><strong>public static void </strong></font>main<font color="#0000ff"><strong>(</strong></font>String<font color="#0000ff"><strong>[] </strong></font>args</font><font size="2"><font color="#0000ff"><strong>) {
</strong></font><font color="#000000">  </font><font color="#ff0000"><strong>try </strong></font></font><font size="2"><font color="#0000ff"><strong>{
</strong></font><font color="#000000">   </font>Properties env <font color="#0000ff"><strong>= </strong></font><font color="#ff0000"><strong>new </strong></font>Properties</font><font size="2"><font color="#0000ff"><strong>();
</strong></font><font color="#000000">   </font>env<font color="#0000ff"><strong>.</strong></font>load<font color="#0000ff"><strong>(</strong></font><font color="#ff0000"><strong>new </strong></font>FileInputStream</font><font color="#0000ff"><font size="2"><strong>(</strong>"jbossJndi.properties"</font><strong><font size="2">));
</font></strong></font><font color="#000000" size="2">   </font><font size="2"><font color="#008000"><em>//env.list(System.out);
</em></font><font color="#000000">   </font>Context ctx <font color="#0000ff"><strong>= </strong></font><font color="#ff0000"><strong>new </strong></font>InitialContext<font color="#0000ff"><strong>(</strong></font>env</font><font size="2"><font color="#0000ff"><strong>);
</strong></font><font color="#000000">   </font>listCtx<font color="#0000ff"><strong>(</strong></font>ctx<font color="#0000ff"><strong>.</strong></font>lookup</font><font color="#0000ff"><font size="2"><strong>(</strong>"sylilzy"</font><strong><font size="2">));
</font></strong></font><font color="#000000" size="2">  </font><font size="2"><font color="#0000ff"><strong>}
</strong></font><font color="#000000">  </font><font color="#ff0000"><strong>catch </strong></font><font color="#0000ff"><strong>(</strong></font>Exception e</font><font size="2"><font color="#0000ff"><strong>) {
</strong></font><font color="#000000">   </font>e<font color="#0000ff"><strong>.</strong></font>printStackTrace</font><font size="2"><font color="#0000ff"><strong>();
</strong></font><font color="#000000">  </font></font><font size="2"><font color="#0000ff"><strong>}
</strong></font><font color="#000000"> </font></font><font size="2"><font color="#0000ff"><strong>}
</strong></font><font color="#000000"> </font><font color="#ff0000"><strong>static void </strong></font>listCtx<font color="#0000ff"><strong>(</strong></font>Object o</font><font size="2"><font color="#0000ff"><strong>){
</strong></font><font color="#000000">  </font><font color="#ff0000"><strong>if</strong></font><font color="#0000ff"><strong>(!(</strong></font>o <font color="#ff0000"><strong>instanceof </strong></font>Context<font color="#0000ff"><strong>))</strong></font>log<font color="#0000ff"><strong>(</strong>":"<strong>+</strong></font>o</font><font size="2"><font color="#0000ff"><strong>);
</strong></font><font color="#000000">  </font><font color="#ff0000"><strong>else </strong></font></font><font size="2"><font color="#0000ff"><strong>{
</strong></font><font color="#000000">   </font>log</font><font color="#0000ff"><font size="2"><strong>(</strong>"\n-----------------------------"</font><strong><font size="2">);
</font></strong></font><font size="2"><font color="#000000">  </font><font color="#ff0000"><strong>try </strong></font></font><font size="2"><font color="#0000ff"><strong>{
</strong></font><font color="#000000">   </font>Context ctx<font color="#0000ff"><strong>=(</strong></font>Context<font color="#0000ff"><strong>)</strong></font>o</font><font size="2"><font color="#0000ff"><strong>;
</strong></font><font color="#000000">   </font></font><font size="2"><font color="#008000"><em>//log(ctx.getNameInNamespace()+"/:");
</em></font><font color="#000000">   </font>NamingEnumeration list<font color="#0000ff"><strong>=</strong></font>ctx<font color="#0000ff"><strong>.</strong></font>listBindings</font><font color="#0000ff"><font size="2"><strong>(</strong>""</font><strong><font size="2">);
</font></strong></font><font size="2"><font color="#000000">   </font><font color="#ff0000"><strong>while</strong></font><font color="#0000ff"><strong>(</strong></font>list<font color="#0000ff"><strong>.</strong></font>hasMore</font><font size="2"><font color="#0000ff"><strong>()){
</strong></font><font color="#000000">    </font>Binding bind<font color="#0000ff"><strong>=(</strong></font>Binding<font color="#0000ff"><strong>)</strong></font>list<font color="#0000ff"><strong>.</strong></font>next</font><font size="2"><font color="#0000ff"><strong>();
</strong></font><font color="#000000">    </font>log<font color="#0000ff"><strong>(</strong>"\n/"<strong>+</strong></font>ctx<font color="#0000ff"><strong>.</strong></font>getNameInNamespace<font color="#0000ff"><strong>()+</strong>"/"<strong>+</strong></font>bind<font color="#0000ff"><strong>.</strong></font>getName</font><font size="2"><font color="#0000ff"><strong>());
</strong></font><font color="#000000">    </font>listCtx<font color="#0000ff"><strong>(</strong></font>bind<font color="#0000ff"><strong>.</strong></font>getObject</font><font size="2"><font color="#0000ff"><strong>());
</strong></font><font color="#000000">   </font></font><font size="2"><font color="#0000ff"><strong>}
</strong></font><font color="#000000">   </font>log</font><font color="#0000ff"><font size="2"><strong>(</strong>"\n-----------------------------"</font><strong><font size="2">);
</font></strong></font><font color="#000000" size="2">  </font><font size="2"><font color="#0000ff"><strong>}
</strong></font><font color="#000000">  </font><font color="#ff0000"><strong>catch </strong></font><font color="#0000ff"><strong>(</strong></font>NamingException e</font><font size="2"><font color="#0000ff"><strong>) {
</strong></font><font color="#000000">   </font></font><font size="2"><font color="#008000"><em>// TODO Auto-generated catch block
</em></font><font color="#000000">   </font>e<font color="#0000ff"><strong>.</strong></font>printStackTrace</font><font size="2"><font color="#0000ff"><strong>();
</strong></font><font color="#000000">  </font></font><font size="2"><font color="#0000ff"><strong>}
</strong></font><font color="#000000"> </font></font><font size="2"><font color="#0000ff"><strong>}
</strong></font><font color="#000000"> </font></font><font size="2"><font color="#0000ff"><strong>}
</strong></font><font color="#000000"> </font><font color="#ff0000"><strong>static void </strong></font>log<font color="#0000ff"><strong>(</strong></font>Object o</font><font size="2"><font color="#0000ff"><strong>){
</strong></font><font color="#000000">  </font>System<font color="#0000ff"><strong>.</strong></font>out<font color="#0000ff"><strong>.</strong></font>print<font color="#0000ff"><strong>(</strong></font>o</font><font size="2"><font color="#0000ff"><strong>);
</strong></font><font color="#000000"> </font></font><font color="#0000ff" size="2"><strong>}
}
</strong></font></font>
</code></pre>
<font size="2">&nbsp;&nbsp;&nbsp;&nbsp;</font></div>
<div>&nbsp;</div>
<div><font size="2">
<hr />
</font></div>
<div><font size="2">作者简介：</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;施祖阳，网名sylilzy,1979年生。</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;2002年起从事软件开发工作，主要研究为JAVA、Linux及相关技术。</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;你可通过</font><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#108;&#105;&#108;&#122;&#121;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;"><font size="2">sylilzy@163.com</font></a><font size="2">与作者联系。</font></div>
<div>&nbsp;</div>
<div><font size="2">参考资料：</font></div>
<div><font size="2">1.<font size="3"><a href="http://java.sun.com/products/jndi/tutorial/">http://java.sun.com/products/jndi/tutorial/</a></font></font></div>
<div>&nbsp;</div>
</font></font>
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/227698.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-09-08 12:27 <a href="http://www.blogjava.net/jzgl-ever/articles/227698.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JNDI全攻略之(二)</title><link>http://www.blogjava.net/jzgl-ever/articles/227699.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Mon, 08 Sep 2008 04:27:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/227699.html</guid><description><![CDATA[<h3 align="center"><font style="background-color: #b3d9ff" color="#000000">JNDI全攻略之(二)</font></h3>
<div>
<p><strong>关键字：</strong>JNDI,J2EE,Java，命名和目录接口，Java Naming and Directory Interface</p>
<p><strong>摘要：</strong>本文详细介绍了JNDI的目录相关内容，并以DNS Service Provider为例进行了示例代码的演示.本文为系列文章的第二篇，JNDI的基础内容请见本系列的第一篇</p>
<p><strong>总述：</strong></p>
<p>目录（Directory）可看作是对命名（Naming）的一个扩充，一个目录对象不仅像命名一样，而且还提供的对属性(Attributes)的操作.由API文档可知，javax.naming.directory.DirContext 类扩展自Context接口，同样，javax.naming.directory.InitialDirContext也扩展自javax.naming.InitialContext,由此也可看出目录操作完全支持命名操作。下面给出一个DNS Service Provider例子以演示有关目录的一些操作：</p>
<p>
<div style="border-right: black 1px dotted; border-top: black 1px dotted; font-size: 10pt; border-left: black 1px dotted; border-bottom: black 1px dotted; font-family: Courier New"><!-- Code creation by HtmlSave Eclipse Plug-in (C) 2005 Morten Moeller / eclipse.moelleryoung.com --><span style="color: #3f7f5f">&nbsp;*&nbsp;Created&nbsp;on&nbsp;2005-11-17 <br />
</span><span style="font-weight: bold; color: #7f0055">package</span><span>&nbsp;</span><span style="color: #000000">com.sily.jndi;</span><span> <br />
<br />
</span><span style="font-weight: bold; color: #7f0055">import</span><span>&nbsp;</span><span style="color: #000000">java.util.Properties;</span><span> <br />
<br />
</span><span style="color: #3f5fbf">/**</span><span> <br />
&nbsp;</span><span style="color: #3f5fbf">*</span><span>&nbsp;</span><span style="color: #3f5fbf">Description:</span><span> <br />
&nbsp;</span><span style="color: #3f5fbf">*</span><span>&nbsp; <br />
&nbsp;</span><span style="color: #3f5fbf">*</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f9fbf">@author&nbsp;</span><span style="color: #3f5fbf">shizy</span><span> <br />
&nbsp;</span><span style="color: #3f5fbf">*</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f9fbf">@version&nbsp;</span><span style="color: #3f5fbf">1.0</span><span>&nbsp;</span><span style="color: #3f5fbf">date:2005</span><span style="color: #7f7f9f">-</span><span style="color: #3f5fbf">11</span><span style="color: #7f7f9f">-</span><span style="color: #3f5fbf">17</span><span> <br />
&nbsp;</span><span style="color: #3f5fbf">*/</span><span> <br />
</span><span style="font-weight: bold; color: #7f0055">public</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">class</span><span>&nbsp;</span><span style="color: #000000">TestDNSJndi</span><span>&nbsp;</span><span style="color: #000000">{</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">public</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">static</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">void</span><span>&nbsp;</span><span style="color: #000000">main(String[]</span><span>&nbsp;</span><span style="color: #000000">args)</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">throws</span><span>&nbsp;</span><span style="color: #000000">Exception</span><span>&nbsp;</span><span style="color: #000000">{</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">Properties</span><span>&nbsp;</span><span style="color: #000000">env</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">new</span><span>&nbsp;</span><span style="color: #000000">Properties();</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">env.put(Context.</span><span style="color: #0000c0; font-style: italic">INITIAL_CONTEXT_FACTORY</span><span style="color: #000000">,</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #2a00ff">"com.sun.jndi.dns.DnsContextFactory"</span><span style="color: #000000">);</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #3f7f5f">//此IP一定要为要访问的DNS服务器的IP,可通过网络设置查看 <br />
</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">env.put(Context.</span><span style="color: #0000c0; font-style: italic">PROVIDER_URL</span><span style="color: #000000">,</span><span>&nbsp;</span><span style="color: #2a00ff">"dns://10.17.45.239"</span><span style="color: #000000">);</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">DirContext</span><span>&nbsp;</span><span style="color: #000000">ctx</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">new</span><span>&nbsp;</span><span style="color: #000000">InitialDirContext(env);</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">System.</span><span style="color: #0000c0; font-style: italic">out</span><span style="color: #000000">.println(</span><span style="color: #2a00ff">"a:"</span><span>&nbsp;</span><span style="color: #000000">+</span><span>&nbsp;</span><span style="color: #000000">ctx);</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">DirContext</span><span>&nbsp;</span><span style="color: #000000">ctx1</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="color: #000000">(DirContext)</span><span>&nbsp;</span><span style="color: #000000">ctx.lookup(</span><span style="color: #2a00ff">"www.sina.com"</span><span style="color: #000000">);</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">System.</span><span style="color: #0000c0; font-style: italic">out</span><span style="color: #000000">.println(</span><span style="color: #2a00ff">"b:"</span><span>&nbsp;</span><span style="color: #000000">+</span><span>&nbsp;</span><span style="color: #000000">ctx1);</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-style: italic">printAttributes</span><span style="color: #000000">(</span><span style="color: #2a00ff">"c:"</span><span style="color: #000000">,</span><span>&nbsp;</span><span style="color: #000000">ctx1.getAttributes(</span><span style="color: #2a00ff">""</span><span style="color: #000000">));</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #3f7f5f">//从ctx.getAttributes("www.sina.com")与ctx1.getAttributes("")结果一样 <br />
</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-style: italic">printAttributes</span><span style="color: #000000">(</span><span style="color: #2a00ff">"d:"</span><span style="color: #000000">,</span><span>&nbsp;</span><span style="color: #000000">ctx.getAttributes(</span><span style="color: #2a00ff">"www.sina.com"</span><span style="color: #000000">));</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">Attributes</span><span>&nbsp;</span><span style="color: #000000">attrs1</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="color: #000000">ctx.getAttributes(</span><span style="color: #2a00ff">"www.sina.com"</span><span style="color: #000000">,</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">new</span><span>&nbsp;</span><span style="color: #000000">String[]</span><span>&nbsp;</span><span style="color: #000000">{</span><span>&nbsp;</span><span style="color: #2a00ff">"a"</span><span>&nbsp;</span><span style="color: #000000">});</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">Attributes</span><span>&nbsp;</span><span style="color: #000000">attrs2</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="color: #000000">ctx.getAttributes(</span><span style="color: #2a00ff">"www.163.com"</span><span style="color: #000000">,</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">new</span><span>&nbsp;</span><span style="color: #000000">String[]</span><span>&nbsp;</span><span style="color: #000000">{</span><span>&nbsp;</span><span style="color: #2a00ff">"a"</span><span>&nbsp;</span><span style="color: #000000">});</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">Attributes</span><span>&nbsp;</span><span style="color: #000000">attrs3</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="color: #000000">ctx1.getAttributes(</span><span style="color: #2a00ff">""</span><span style="color: #000000">,</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">new</span><span>&nbsp;</span><span style="color: #000000">String[]</span><span>&nbsp;</span><span style="color: #000000">{</span><span>&nbsp;</span><span style="color: #2a00ff">"a"</span><span>&nbsp;</span><span style="color: #000000">});</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">Attributes</span><span>&nbsp;</span><span style="color: #000000">attrs4</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="color: #000000">ctx.getAttributes(</span><span style="color: #2a00ff">"www.baidu.com"</span><span style="color: #000000">,</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">new</span><span>&nbsp;</span><span style="color: #000000">String[]</span><span>&nbsp;</span><span style="color: #000000">{</span><span>&nbsp;</span><span style="color: #2a00ff">"a"</span><span>&nbsp;</span><span style="color: #000000">});</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-style: italic">printAttributes</span><span style="color: #000000">(</span><span style="color: #2a00ff">"e:"</span><span style="color: #000000">,</span><span>&nbsp;</span><span style="color: #000000">attrs1);</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-style: italic">printAttributes</span><span style="color: #000000">(</span><span style="color: #2a00ff">"f:"</span><span style="color: #000000">,</span><span>&nbsp;</span><span style="color: #000000">attrs2);</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-style: italic">printAttributes</span><span style="color: #000000">(</span><span style="color: #2a00ff">"g:"</span><span style="color: #000000">,</span><span>&nbsp;</span><span style="color: #000000">attrs3);</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-style: italic">printAttributes</span><span style="color: #000000">(</span><span style="color: #2a00ff">"attrs4:"</span><span style="color: #000000">,</span><span>&nbsp;</span><span style="color: #000000">attrs4);</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">System.</span><span style="color: #0000c0; font-style: italic">out</span><span style="color: #000000">.println(</span><span style="color: #2a00ff">"nameParse:"</span><span style="color: #000000">+ctx1.getNameInNamespace());</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #3f7f5f">//list,此方法会导致程序lock <br />
</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #3f7f5f">//listEnumation("list:",ctx.list("")); <br />
</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #3f7f5f">//----------------------search <br />
</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">Attributes</span><span>&nbsp;</span><span style="color: #000000">matchAttrs</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">new</span><span>&nbsp;</span><span style="color: #000000">BasicAttributes(</span><span style="font-weight: bold; color: #7f0055">true</span><span style="color: #000000">);</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">matchAttrs.put(</span><span style="font-weight: bold; color: #7f0055">new</span><span>&nbsp;</span><span style="color: #000000">BasicAttribute(</span><span style="color: #2a00ff">"a"</span><span style="color: #000000">,</span><span>&nbsp;</span><span style="color: #2a00ff">"61.172.201.13"</span><span style="color: #000000">));</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">NamingEnumeration</span><span>&nbsp;</span><span style="color: #000000">answer</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="color: #000000">ctx1.search(</span><span style="color: #2a00ff">"www.sina.com"</span><span style="color: #000000">,</span><span>&nbsp;</span><span style="color: #000000">matchAttrs);</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; font-style: italic">printNamingEnumeration</span><span style="color: #000000">(</span><span style="color: #2a00ff">"search&nbsp;:"</span><span style="color: #000000">,</span><span>&nbsp;</span><span style="color: #000000">answer);</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">}</span><span> <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">public</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">static</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">void</span><span>&nbsp;</span><span style="color: #000000">printAttributes(String</span><span>&nbsp;</span><span style="color: #000000">tag,</span><span>&nbsp;</span><span style="color: #000000">Attributes</span><span>&nbsp;</span><span style="color: #000000">attres)</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">throws</span><span>&nbsp;</span><span style="color: #000000">Exception</span><span>&nbsp;</span><span style="color: #000000">{</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">for</span><span>&nbsp;</span><span style="color: #000000">(NamingEnumeration</span><span>&nbsp;</span><span style="color: #000000">ae</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="color: #000000">attres.getAll();</span><span>&nbsp;</span><span style="color: #000000">ae.hasMore();)</span><span>&nbsp;</span><span style="color: #000000">{</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">Attribute</span><span>&nbsp;</span><span style="color: #000000">attr</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="color: #000000">(Attribute)</span><span>&nbsp;</span><span style="color: #000000">ae.next();</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">System.</span><span style="color: #0000c0; font-style: italic">out</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">.println(tag</span><span> <br />
&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;</span><span style="color: #000000">+</span><span>&nbsp;</span><span style="color: #2a00ff">"-----------------------------------------------\nattribute:&nbsp;"</span><span> <br />
&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;</span><span style="color: #000000">+</span><span>&nbsp;</span><span style="color: #000000">attr.getID());</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #3f7f5f">/*&nbsp;Print&nbsp;each&nbsp;value&nbsp;*/</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">for</span><span>&nbsp;</span><span style="color: #000000">(NamingEnumeration</span><span>&nbsp;</span><span style="color: #000000">e</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="color: #000000">attr.getAll();</span><span>&nbsp;</span><span style="color: #000000">e.hasMore();</span><span>&nbsp;</span><span style="color: #000000">System.</span><span style="color: #0000c0; font-style: italic">out</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">.println(</span><span style="color: #2a00ff">"value:&nbsp;"</span><span>&nbsp;</span><span style="color: #000000">+</span><span>&nbsp;</span><span style="color: #000000">e.next()))</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">;</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">}</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">}</span><span> <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">public</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">static</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">void</span><span>&nbsp;</span><span style="color: #000000">listEnumation(String</span><span>&nbsp;</span><span style="color: #000000">tag,</span><span>&nbsp;</span><span style="color: #000000">NamingEnumeration</span><span>&nbsp;</span><span style="color: #000000">name)</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">throws</span><span>&nbsp;</span><span style="color: #000000">Exception</span><span>&nbsp;</span><span style="color: #000000">{</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">for</span><span>&nbsp;</span><span style="color: #000000">(;</span><span>&nbsp;</span><span style="color: #000000">name.hasMore();)</span><span>&nbsp;</span><span style="color: #000000">{</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">NameClassPair</span><span>&nbsp;</span><span style="color: #000000">nameClass</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="color: #000000">(NameClassPair)</span><span>&nbsp;</span><span style="color: #000000">name.next();</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">System.</span><span style="color: #0000c0; font-style: italic">out</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">.println(tag</span><span> <br />
&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;</span><span style="color: #000000">+</span><span>&nbsp;</span><span style="color: #2a00ff">"-----------------------------------------------\nattribute:&nbsp;"</span><span> <br />
&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;</span><span style="color: #000000">+</span><span>&nbsp;</span><span style="color: #000000">nameClass.getName()</span><span>&nbsp;</span><span style="color: #000000">+</span><span>&nbsp;</span><span style="color: #2a00ff">":"</span><span> <br />
&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;</span><span style="color: #000000">+</span><span>&nbsp;</span><span style="color: #000000">nameClass.getClassName());</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">}</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">}</span><span> <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">public</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">static</span><span>&nbsp;</span><span style="font-weight: bold; color: #7f0055">void</span><span>&nbsp;</span><span style="color: #000000">printNamingEnumeration(String</span><span>&nbsp;</span><span style="color: #000000">tag,</span><span>&nbsp;</span><span style="color: #000000">NamingEnumeration</span><span>&nbsp;</span><span style="color: #000000">e)</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">throws</span><span>&nbsp;</span><span style="color: #000000">Exception</span><span>&nbsp;</span><span style="color: #000000">{</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">for</span><span>&nbsp;</span><span style="color: #000000">(;</span><span>&nbsp;</span><span style="color: #000000">e.hasMore();)</span><span>&nbsp;</span><span style="color: #000000">{</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">Attribute</span><span>&nbsp;</span><span style="color: #000000">attr</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="color: #000000">(Attribute)</span><span>&nbsp;</span><span style="color: #000000">e.next();</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">System.</span><span style="color: #0000c0; font-style: italic">out</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">.println(tag</span><span> <br />
&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;</span><span style="color: #000000">+</span><span>&nbsp;</span><span style="color: #2a00ff">"-----------------------------------------------\nattribute:&nbsp;"</span><span> <br />
&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;</span><span style="color: #000000">+</span><span>&nbsp;</span><span style="color: #000000">attr.getID());</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #3f7f5f">/*&nbsp;Print&nbsp;each&nbsp;value&nbsp;*/</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-weight: bold; color: #7f0055">for</span><span>&nbsp;</span><span style="color: #000000">(NamingEnumeration</span><span>&nbsp;</span><span style="color: #000000">ve</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="color: #000000">attr.getAll();</span><span>&nbsp;</span><span style="color: #000000">ve.hasMore();</span><span>&nbsp;</span><span style="color: #000000">System.</span><span style="color: #0000c0; font-style: italic">out</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">.println(</span><span style="color: #2a00ff">"value:&nbsp;"</span><span>&nbsp;</span><span style="color: #000000">+</span><span>&nbsp;</span><span style="color: #000000">ve.next()))</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">;</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">}</span><span> <br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">}</span><span> <br />
</span><span style="color: #000000">}</span><span> <br />
</span></div>
<p>&nbsp;</p>
<p><span>上例中，在jdk1.4中可运行通过。对于DNS Service Provider更详细的文档，大家可通过此URL下载：<a href="http://java.sun.com/products/jndi/downloads/index.html">http://java.sun.com/products/jndi/downloads/index.html</a></span></p>
<p><span>上例一个可能运行结果如下：</span></p>
<p><span><font color="#000066" size="2">a:javax.naming.directory.InitialDirContext@1bf216a<br />
b:com.sun.jndi.dns.DnsContext@3a6727<br />
c:-----------------------------------------------<br />
attribute: CNAME<br />
value: us.sina.com.cn.<br />
d:-----------------------------------------------<br />
attribute: CNAME<br />
value: us.sina.com.cn.<br />
e:-----------------------------------------------<br />
attribute: A<br />
value: 218.30.66.67<br />
value: 218.30.66.68<br />
value: 218.30.66.69<br />
value: 218.30.66.70<br />
value: 218.30.66.71<br />
value: 218.30.66.56<br />
value: 218.30.66.57<br />
value: 218.30.66.58<br />
value: 218.30.66.59<br />
value: 218.30.66.60<br />
value: 218.30.66.61<br />
value: 218.30.66.62<br />
value: 218.30.66.63<br />
value: 218.30.66.64<br />
value: 218.30.66.65<br />
value: 218.30.66.66<br />
f:-----------------------------------------------<br />
attribute: A<br />
value: 220.181.28.42<br />
g:-----------------------------------------------<br />
attribute: A<br />
value: 218.30.66.68<br />
value: 218.30.66.69<br />
value: 218.30.66.70<br />
value: 218.30.66.71<br />
value: 218.30.66.56<br />
value: 218.30.66.57<br />
value: 218.30.66.58<br />
value: 218.30.66.59<br />
value: 218.30.66.60<br />
value: 218.30.66.61<br />
value: 218.30.66.62<br />
value: 218.30.66.63<br />
value: 218.30.66.64<br />
value: 218.30.66.65<br />
value: 218.30.66.66<br />
value: 218.30.66.67<br />
attrs4:-----------------------------------------------<br />
attribute: A<br />
value: 220.181.27.5<br />
nameParse:www.sina.com.<br />
Exception in thread "main" javax.naming.OperationNotSupportedException<br />
at com.sun.jndi.dns.DnsContext.c_search(Unknown Source)<br />
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(Unknown Source)<br />
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(Unknown Source)<br />
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(Unknown Source)<br />
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(Unknown Source)<br />
at com.sily.jndi.TestDNSJndi.main(TestDNSJndi.java:57)</font><br />
<font size="2"><br />
</font>示例分析:<br />
通过分析代码，我们可以看出我们从DNS服务器获取了指定域名的IP地址,而且可以看出www.sina.com有多个IP.<br />
另外,可以看出从ctx.getAttributes("www.sina.com")得到的结果与ctx1.getAttributes("")结果一样,这便是目录操作的两种模式,这两种模式取得的结果是一样的,这点可以参考API文档(<a href="http://java.sun.com/j2se/1.5.0/docs/api/javax/naming/directory/DirContext.html">http://java.sun.com/j2se/1.5.0/docs/api/javax/naming/directory/DirContext.html</a>):<br />
</span><span>There are two basic models of what attributes should be associated with. First, attributes may be directly associated with a DirContext object. In this model, an attribute operation on the named object is roughly... </span></p>
<p><span>另外,还有一点需要注意,从ctx.getAttributes()方法返回的Attributes中包含多个Attribute,每个Attribute包含多个values,其它详细内容请参考API文档<br />
最后,代码</span><span style="color: #000000">NamingEnumeration</span><span>&nbsp;</span><span style="color: #000000">answer</span><span>&nbsp;</span><span style="color: #000000">=</span><span>&nbsp;</span><span style="color: #000000">ctx1.search(</span><span style="color: #2a00ff">"www.sina.com"</span><span style="color: #000000">,</span><span>&nbsp;</span><span style="color: #000000">matchAttrs);</span>试图对ctx1进行属性查找,但是抛出了异常,查看<span> DNS Service Provider 的文档可知,DNS Service Provider 没有提供对search方法的支持,大家可用其它的SP来测试此方法,如LDAP SP </span></p>
<p>总结:</p>
<p>此例只是简单地演示的JNDI的目录操作,对于目录操作的其它高级主题如Search,Search Scope,Count Limit,Composite Names 等没有详细介绍,请参考其它相关文档.</p>
<span>
<div><font size="2">
<hr />
</font></div>
<div><font size="2">作者简介：</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;施祖阳，网名sylilzy,1979年生。</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;2002年起从事软件开发工作，主要研究JAVA、Linux及相关技术。</font></div>
<div><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;你可通过<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#108;&#105;&#108;&#122;&#121;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">sylilzy@163.com</a>与作者联系。</font></div>
<div><font size="2"></font>&nbsp;</div>
<div><font size="2">参考资料：</font></div>
</span>
<div>
<p>1.<a href="http://java.sun.com/products/jndi/tutorial/">http://java.sun.com/products/jndi/tutorial/</a><br />
2.<a href="http://www.cn-java.com/target/news.php?news_id=832">http://www.cn-java.com/target/news.php?news_id=832</a></p>
</div>
</div>
<br />
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/227699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-09-08 12:27 <a href="http://www.blogjava.net/jzgl-ever/articles/227699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搞清楚的mysql中建立外键的方法</title><link>http://www.blogjava.net/jzgl-ever/articles/227680.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Mon, 08 Sep 2008 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/227680.html</guid><description><![CDATA[&nbsp;找了很久才找到并搞清楚的mysql中建立外键的方法，看下面的例子。&nbsp; <br />
&nbsp;&nbsp;&nbsp;一个主表blog博客表, <br />
DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;`blog`; <br />
CREATE&nbsp;TABLE&nbsp;`blog`&nbsp;( <br />
&nbsp;&nbsp;`id`&nbsp;int(11)&nbsp;NOT&nbsp;NULL&nbsp;auto_increment, <br />
&nbsp;&nbsp;`title`&nbsp;varchar(11)&nbsp;default&nbsp;NULL, <br />
&nbsp;&nbsp;`content`&nbsp;varchar(11)&nbsp;default&nbsp;NULL, <br />
&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;&nbsp;(`id`) <br />
)&nbsp;ENGINE=InnoDB&nbsp;DEFAULT&nbsp;CHARSET=gb2312; <br />
&nbsp;&nbsp;&nbsp;另一个表comment,评论表 <br />
&nbsp;&nbsp;&nbsp;博客表和评论表关系是1:N <br />
&nbsp;&nbsp; <br />
drop&nbsp;table&nbsp;comment; <br />
create&nbsp;table&nbsp;comment( <br />
&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;primary&nbsp;key, <br />
&nbsp;user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(11), <br />
&nbsp;email&nbsp;&nbsp;&nbsp;&nbsp;varchar(11), <br />
&nbsp;url&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(11), <br />
&nbsp;content&nbsp;&nbsp;varchar(11), <br />
&nbsp;addTime&nbsp;&nbsp;date, <br />
&nbsp;blog_id&nbsp;&nbsp;int, <br />
&nbsp;constraint&nbsp;FK_blog_id&nbsp;foreign&nbsp;key&nbsp;(blog_id)&nbsp;references&nbsp;blog(id)&nbsp; <br />
)ENGINE=InnoDB&nbsp;DEFAULT&nbsp;CHARSET=gb2312;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;注意，一定要varchar(11)，要不然就错了，我是根据已有表导出sql才看出来的． <br />
&nbsp;&nbsp;&nbsp;&nbsp;这个sql语句用sql-front导出后的结果是: <br />
DROP&nbsp;TABLE&nbsp;IF&nbsp;EXISTS&nbsp;`comment`; <br />
CREATE&nbsp;TABLE&nbsp;`comment`&nbsp;( <br />
&nbsp;&nbsp;`id`&nbsp;int(11)&nbsp;NOT&nbsp;NULL, <br />
&nbsp;&nbsp;`user`&nbsp;varchar(11)&nbsp;default&nbsp;NULL, <br />
&nbsp;&nbsp;`email`&nbsp;varchar(11)&nbsp;default&nbsp;NULL, <br />
&nbsp;&nbsp;`url`&nbsp;varchar(11)&nbsp;default&nbsp;NULL, <br />
&nbsp;&nbsp;`content`&nbsp;varchar(11)&nbsp;default&nbsp;NULL, <br />
&nbsp;&nbsp;`addTime`&nbsp;date&nbsp;default&nbsp;NULL, <br />
&nbsp;&nbsp;`blog_id`&nbsp;int(11)&nbsp;default&nbsp;NULL, <br />
&nbsp;&nbsp;PRIMARY&nbsp;KEY&nbsp;&nbsp;(`id`),&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; <br />
&nbsp;&nbsp;KEY&nbsp;`FK_blog_id`&nbsp;(`blog_id`)&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; <br />
)&nbsp;ENGINE=InnoDB&nbsp;DEFAULT&nbsp;CHARSET=gb2312;&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; <br />
ALTER&nbsp;TABLE&nbsp;`comment` <br />
&nbsp;&nbsp;ADD&nbsp;FOREIGN&nbsp;KEY&nbsp;(`blog_id`)&nbsp;REFERENCES&nbsp;`blog`&nbsp;(`id`);&nbsp;<br />
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/227680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-09-08 11:14 <a href="http://www.blogjava.net/jzgl-ever/articles/227680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java学习FAQ</title><link>http://www.blogjava.net/jzgl-ever/articles/227520.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Sun, 07 Sep 2008 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/227520.html</guid><description><![CDATA[Java Learning Path&nbsp; &nbsp; &nbsp; 过程篇 <br />
<br />
　　每个人的学习方法是不同的，一个人的方法不见得适合另一个人，我只能是谈自己的学习方法。因为我学习Java是完全自学的，从来没有问过别人，所以学习的过程基本上完全是自己摸索出来的。我也不知道这种方法是否是比较好的方法，只能给大家提供一点参考了。 <br />
<br />
　　学习Java的第一步是安装好JDK，写一个Hello World， 其实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 />
此外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 />
<br />
Java Learning Path&nbsp; &nbsp;&nbsp; 方法篇 <br />
<br />
　　Java作为一门编程语言，最好的学习方法就是写代码。当你学习一个类以后，你就可以自己写个简单的例子程序来运行一下，看看有什么结果，然后再多调用几个类的方法，看看运行结果，这样非常直观的把类给学会了，而且记忆非常深刻。然后不应该满足把代码调通，你应该想想看如果我不这样写，换个方式，再试试行不行。记得哪个高人说过学习编程就是个破坏的过程，把书上的例子，自己学习Documentation编写的例子在运行通过以后，不断的尝试着用不同的方法实现，不断的尝试破坏代码的结构，看看它会有什么结果。通过这样的方式，你会很彻底的很精通的掌握Java。 <br />
<br />
　　举个例子，我们都编过Hello World <br />
　　public class HelloWorld { <br />
　　public static void main(String[] args) { <br />
　　System.out.println("Hello World"); <br />
　　} <br />
　　} <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 />
其中特别值得一提的是JDK有一个非常棒的调试功能，-verbose，javac &#8211;verbose 以及其它很多JDK工具都有这个选项，-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&nbsp; &nbsp; &nbsp; &nbsp; 资源篇 <br />
<br />
　　<a href="http://java.sun.com/" target="_blank">http://java.sun.com/</a> (英文) <br />
　　Sun的Java网站，是一个应该经常去看的地方。不用多说。 <br />
<br />
　　<a href="http://www-900.ibm.com/developerWorks/cn/" target="_blank">http://www-900.ibm.com/developerWorks/cn/</a> <br />
　　IBM的developerWorks网站，英语好的直接去英文主站点看。这里不但是一个极好的面向对象的分析设计网站，也是Web Services，Java，Linux极好的网站。强烈推荐！！！ <br />
<br />
　　<a href="http://www.javaworld.com/" target="_blank">http://www.javaworld.com/</a> (英文) <br />
　　关于Java很多新技术的讨论和新闻。想多了解Java的方方面面的应用，这里比较好。 <br />
<br />
　　<a href="http://dev2dev.bea.com.cn/index.jsp" target="_blank">http://dev2dev.bea.com.cn/index.jsp</a> <br />
　　BEA的开发者园地，BEA作为最重要的App Server厂商，有很多独到的技术，在Weblogic上做开发的朋友不容错过。 <br />
<br />
　　<a href="http://www.theserverside.com/home/" target="_blank">http://www.theserverside.com/home/</a> (英文) <br />
　　TheServerSide是一个著名的专门面向Java Server端应用的网站。 <br />
<br />
　　<a href="http://www.cnjsp.org/" target="_blank">http://www.cnjsp.org/</a> <br />
　　JSP技术网站，有相当多的Java方面的文章和资源。 <br />
<br />
　　<a href="http://sourceforge.net/" target="_blank">http://sourceforge.net/</a> <br />
　　SourgeForge是一个开放源代码软件的大本营，其中也有非常非常丰富的Java的开放源代码的著名的软件。 <br />
<br />
附：java入门与加深FAQ <br />
<br />
一、准备篇 <br />
<br />
1 什么是Java、Java2、JDK？JDK后面的1.3、1.4.2版本号又是怎么回事？ <br />
　答：Java是一种通用的，并发的，强类型的，面向对象的编程语言（摘自Java规范第二版) JDK是Sun公司分发的免费Java开发工具，正式名称为J2SDK(Java2 Software Develop Kit)。 <br />
2 什么是JRE/J2RE？ <br />
　答：J2RE是Java2 Runtime Environment，即Java运行环境，有时简称JRE。如果你只需要运行Java程序或Applet，下载并安装它即可。如果你要自行开发Java软件，请下载JDK。在JDK中附带有J2RE。 <br />
注意:由于Microsoft对Java的支持不完全，请不要使用IE自带的虚拟机来运行Applet，务必安装一个J2RE或JDK。 <br />
<br />
3 学习Java用什么工具比较好？ <br />
　答：作者建议首先使用JDK+文本编辑器，这有助你理解下列几个基础概念：path，classpath，package并熟悉基本命令：javac和java。并且下载和你的JDK版本一致的API帮助。 <br />
<br />
　如果你不确定类或函数的用法，请先查阅API而不是发贴求助。当你熟悉Java之后，你可以考虑换一个IDE。很多人推荐JCreator，实际上JCreator的功能还 是很弱的。作者推荐eclipse，下载网<a href="http://www.eclipse.org/" target="_blank">http://www.eclipse.org</a>因eclispe是免费的. <br />
<br />
4 学习Java有哪些好的参考书？ <br />
　答：作者首先推荐Thinking in Java，中文名《Java编程思想》，有中文版。该书第一章介绍了很多面向对象的编程思想，作为新手应当认真阅读。除此以外，O&#180;relly出版社和Wrox出版社的书也不错。作者本人不喜欢大陆作者的书。也许你觉得英文太难，但是网上大多数资料都是英文的。另外，你需要经常查阅API，而那也是英文的。 <br />
<br />
5 Java和C++哪个更好？ <br />
　答：这个问题是一个很不恰当的问题。你应该问：Java和C++哪个更适用于我的项目？如果你不需要跨平台，不需要分布式，要强调程序的运行速度，C++更为适用。反之?你应当考虑Java。 <br />
<br />
6 什么是J2SE/J2EE/J2ME？ <br />
　答：J2SE就是一般的Java。 <br />
　J2ME是针对嵌入式设备的，比如Java手机，它有自己的SDK。而J2EE使用J2SE的SDK。 <br />
　J2EE规范更多的是对J2EE服务器的要求和开发人员的约束。详情见后继"J2EE FAQ"。 <br />
<br />
<br />
二、命令篇 <br />
<br />
7 我写了第一个Java程序，应该如何编译/运行？ <br />
　答：首先请将程序保存为xxx.java文件，然后在dos窗口下使用javac xxx.java命令，你会发现该目录下多了一个xxx.class文件，再使用java xxx命令，你的java程序就开始运行了。 <br />
<br />
8 我照你说的做了，但是出现什么"&#180;javac&#180; 不是内部或外部命令，也不是可运行的程序或批处理文件。"。 <br />
　答：你遇到了path问题。操作系统在一定的范围(path)内搜索javac.exe，但是没能找到。请编辑你的操作系统环境变量，新增一个JAVA_HOME变量，设为你JDK的安装目录，再编辑Path变量，加上一项 %JAVA_HOME%\bin。然后关掉并新开一个dos窗口，你就可以使用javac和java命令了。 <br />
<br />
9 环境变量怎么设置？ <br />
　答：请向身边会设的人咨询。 <br />
<br />
10 javac xxx.java顺利通过了，但是java xxx的时候显示什么&#8220;NoClassDefFoundError&#8221;。 <br />
　答：你遇到了classpath问题。java命令在一定的范围(classpath)内搜索你要用的class文件，但是未能找到。首先请确认你没有错敲成java xxx.class，其实你并不需要设置该变量，但如果你设置了该变量又没有包含.（代表当前目录）的项，你就会遇到这个问题。请在你的CLASSPATH环境变量中加入一项. 或干脆删掉这个变量。如果你使用了并非JDK自带的标准包，比如javax.servlet.*包，也会遇到这个问题，请将相应的jar文件加入classpath。如果你在java源文件中定义了package，请参见15。 <br />
<br />
<br />
11 我在java xxx的时候显示"Exception in thread "main" java.lang.NoSuchMethodError: main"。 <br />
　答：首先，在你的程序中每个java文件有且只能有一个public类，这个类的类名必须和文件名的大小写完全一样。其次，在你要运行的类中有且只能有一个public static void main(String[] args)方法，这个方法就是你的主程序。 <br />
<br />
12 package是什么意思？怎么用？ <br />
　答：为了唯一标识每个类并分组，java使用了package的概念。每个类都有一个全名，例如String的全名是java.lang.String，其中java.lang是包名，String是短名。这样，如果你也定义了String，你可以把它放在mypackage中，通过使用全名mypackage.String和java.lang.String来区分这两个类。同时，将逻辑上相关的类放在同一个包中，可以使程序结构更为清楚。 <br />
<br />
　你要做的就是在java文件开头加一行"package mypackage;"。注意包没有嵌套或包含关系，A包和A.B包对java命令来说是并列的两个包。 <br />
13 我没有声明任何package会怎么样？ <br />
　答：你的类被认为放在默认包中。这时全名和短名是一致的。 <br />
<br />
14 在一个类中怎么使用其他类？ <br />
　答：如果你使用java.lang包中的类，不用做任何事。如果你使用其他包中的类，使用import package1.class1; 或 import package2.*;这里.*表示引入这个包中的所有类。然后在程序中你可以使用其他类的短名。如果短名有冲突，使用全名来区分。 <br />
<br />
15 我用了package的时候显示"NoClassDefFoundError"，但是我把所有package去掉的时候能正常运行。 <br />
　答：将你的java文件按包名存放。 <br />
　比如你的工作目录是/work，你的类是package1.class1，那么将它存放为/work/package1/class1.java。如果没有声明包，那么直接放在/work下。在/work下执行javac package1/class1.java，再执行java package1.class1，你会发现一切正常。另外，你可以考虑开始使用IDE。 <br />
<br />
16 我想把java编译成exe文件，该怎么做？ <br />
　答：JDK只能将java源文件编译为class文件。class文件是一种跨平台的字节码，必须依赖平台相关的JRE来运行。Java以此来实现跨平台，有些开发工具可以将java文件编译为exe文件。作者反对这种做法，因为这样就取消了跨平台性。如果你确信你的软件只在Windows平台上运行，你可以考虑使用C++/C#来编程。 <br />
<br />
17 我在编译的时候遇到什么"deprecated API"，是什么意思？ <br />
　答：所谓deprecated是指已经?时，但是为了向前兼容起见仍然保留的方法，这些方法可能会在以后取消支持。你应当改用较新的方法。一般在API里面会说明你应当用什么方法来代替之。 <br />
<br />
<br />
三、I/O篇 <br />
<br />
18 我怎么给java程序加启动参数，就像dir /p/w那样？ <br />
　答：还记得public static void main(String[] args)吗？这里的args就是你的启动参数。 <br />
　在运行时你输入java package1.class1 -arg1 -arg2，args中就会有两个String，一个是arg1，另一个是arg2。 <br />
<br />
19 我怎么从键盘输入一个int/double/字符串？ <br />
　答：java的I/O操作比C++要复杂一点。如果要从键盘输入，样例代码如下： <br />
　BufferedReader cin = new BufferedReader( new InputStreamReader( System.in ) ) <br />
　; <br />
　String s = cin.readLine(); <br />
<br />
　这样你就获得了一个字符串，如果你需要数字的话再加上： <br />
　int n = Integer.parseInt( s ); <br />
<br />
　或者 <br />
　double d = Double.parseDouble( s ); <br />
<br />
<br />
20 我怎么输出一个int/double/字符串？ <br />
　答：在程序开始写： <br />
　PrintWriter cout = new PrintWriter( System.out ); <br />
<br />
　需要时写： <br />
　cout.print(n); <br />
<br />
　或者 <br />
　cout.println("hello") <br />
<br />
　等等。 <br />
<br />
21 我发现有些书上直接用System.in和System.out输入输出，比你要简单得多。 <br />
　答：java使用unicode，是双字节。而System.in和System.out是单字节的stream。如果你要输入输出双字节文字比如中文，请使用作者的做法。 <br />
22 我怎么从文件输入一个int/double/字符串？ <br />
　答：类似于从键盘输入，只不过换成 <br />
　BufferedReader fin = new BufferedReader( new FileReader(" myFileName " ) ); <br />
　PrintWriter fout = new PrintWriter( new FileWriter(" myFileName " ) ); <br />
<br />
　另外如果你还没下载API，请开始下载并阅读java.io包中的内容。 <br />
<br />
23 我想读写文件的指定位置，该怎么办？ <br />
　答：你肯定没有认真看API。java.io.RandomAccessFile可以满足你的需要。 <br />
<br />
24 怎么判断要读的文件已经到了尽头？ <br />
　答：你肯定没有认真看API。在Reaer的read方法中明确说明返回-1表示流的结尾。 <br />
<br />
<br />
四、 关键字篇 <br />
<br />
25 java里面怎么定义宏？ <br />
　答：java不支持宏，因为宏代换不能保证类型安全。如果你需要定义常量，可以将它定义为某个类的static final成员。参见26和30。 <br />
<br />
26 java里面没法用const。 <br />
　答：你可以用final关键字。例如 final int m = 9。被声明为final的变量不能被再次赋值。也可以用于声明方法或类，被声明为final的方法或类不能被继承。注意const是java的保留字以备扩充。 <br />
<br />
27 java里面也不能用goto。 <br />
　答：甚至在面向过程的语言中你也可以完全不用goto。请检查你的程序流程是否合理。如果你需要从多层循环中迅速跳出，java增强了（和C++相比）break和continue的功能。 <br />
　例如： <br />
　outer : <br />
　while( ... ) <br />
　{ <br />
　inner : <br />
　for( ... ) <br />
　{ <br />
　... break inner; ... <br />
　... continue outer; ... <br />
　} <br />
　} <br />
<br />
　和const一样，goto也是java的保留字以备扩充。 <br />
<br />
28 java里面能不能重载操作符？ <br />
　答：不能。String的+号是唯一一个内置的重载操作符。你可以通过定义接口和方法来实现类似功能。 <br />
<br />
29 我new了一个对象，但是没法delete掉它。 <br />
　答：java有自动内存回收机制，即所谓Garbarge Collector。你再也不用担心指针错误。 <br />
<br />
30 我想知道为什么main方法必须被声明为public static？ <br />
　答：声明为public是为了这个方法可以被外部调用，详情见面向对象篇37。 <br />
　static是为了将某个成员变量/方法关联到类（class）而非实例（instance）。你不需要创建一个对象就可以直接使用这个类的static成员，在A类中调用B类的static成员可以使用B.staticMember的写法。注意一个类的static成员变量是唯一的，被所有该类对象所共享的。 <br />
<br />
31 throw和throws有什么不同？ <br />
　答：throws用于声明一个方法会抛出哪些异常。而throw是在方法体中实际执行抛出异常的动作。如果你在方法中throw一个异常，却没有在方法声明中声明之，编译器会报错。注意Error和RuntimeException的子类是例外，无需特别声明。 <br />
<br />
32 什么是异常？ <br />
　答：异常最早在Ada语言中引入，用于在程序中动态处理错误并恢复。你可以在方法中拦截底层异常并处理之，也可以抛给更高层的模块去处理。你也可以抛出自己的异常指示发生了某些不正常情况。常见的拦截处理代码如下： <br />
　try <br />
　{ <br />
　...... //以下是可能发生异常的代码 <br />
　...... //异常被抛出，执行流程中断并转向拦截代码。 <br />
　...... <br />
　} <br />
<br />
　catch(Exception1 e) //如果Exception1是Exception2的子类并要做特别处理，应排在前面 <br />
　{ <br />
　//发生Exception1时被该段拦截 <br />
　} <br />
　catch(Exception2 e) <br />
　{ <br />
　//发生Exception2时被该段拦截 <br />
　} <br />
　finally //这是可选的 <br />
　{ <br />
　//无论异常是否发生，均执行此段代码 <br />
　} <br />
33 final和finally有什么不同？ <br />
　答：final请见26。finally用于异常机制，参见32。 <br />
<br />
<br />
五、 面向对象篇 <br />
<br />
34 extends和implements有什么不同？ <br />
　答：extends用于（单）继承一个类（class），而implements用于实现一个接口（interface）。interface的引入是为了部分地提供多继承的功能。 <br />
在interface中只需声明方法头，而将方法体留给实现的class来做。这些实现的class的实例完全可以当作interface的实例来对待。有趣的是在interface之间也可以声明为extends（单继承）的关系。 <br />
<br />
35 java怎么实现多继承？ <br />
　答：java不支持显式的多继承。因为在显式多继承的语言例如c++中，会出现子类被迫声明祖先虚基类构造函数的问题，而这是违反面向对象的封装性原则的。java提供了interface和implements关键字来部分地实现多继承。参见34。 <br />
<br />
36 abstract是什么？ <br />
　答：被声明为abstract的方法无需给出方法体，留给子类来实现。而如果一个类中有abstract方法，那么这个类也必须声明为abstract。被声明为abstract的类无法实例化，尽管它可以定义构造方法供子类使用。 <br />
<br />
37 public,protected,private有什么不同？ <br />
　答：这些关键字用于声明类和成员的可见性。 <br />
　public成员可以被任何类访问， <br />
　protected成员限于自己和子类访问， <br />
　private成员限于自己访问。 <br />
　Java还提供了第四种的默认可见性，一般称为package private，当没有任何public,protected,private修饰符时，成员是同一包内可见。类可以用public或默认来修饰。 <br />
<br />
38 Override和Overload有什么不同？ <br />
　答：Override是指父类和子类之间方法的继承关系，这些方法有着相同的名称和参数类型。Overload是指同一个类中不同方法（可以在子类也可以在父类中定义）间的关系，这些方法有着相同的名称和不同的参数类型。 <br />
<br />
39 我继承了一个方法，但现在我想调用在父类中定义的方法。 <br />
　答：用super.xxx()可以在子类中调用父类方法。 <br />
<br />
40 我想在子类的构造方法中调用父类的构造方法，该怎么办？ <br />
　答：在子类构造方法的第一行调用super(...)即可。 <br />
<br />
41 我在同一个类中定义了好几个构造方法并且想在一个构造方法中调用另一个。 <br />
　答：在构造方法第一行调用this(...)。 <br />
<br />
42 我没有定义构造方法会怎么样？ <br />
　答：自动获得一个无参数的构造方法。 <br />
<br />
43 我调用无参数的构造方法失败了。 <br />
　答：如果你至少定义了一个构造方法，就不再有自动提供的无参数的构造方法了。你需要显式定义一个无参数的构造方法。 <br />
<br />
44 我该怎么定义类似于C++中的析构方法（destructor）？ <br />
　答：提供一个void finalize()方法。在Garbarge Collector回收该对象时会调用该方法。注意实际上你很难判断一个对象会在什么时候被回收。作者从未感到需要提供该方法。 <br />
<br />
45 我想将一个父类对象转换成一个子类对象该怎么做？ <br />
　答：强制类型转换。如 <br />
　public void meth(A a) <br />
　{ <br />
　B b = (B)a; <br />
　} <br />
<br />
　如果a实际上并不是B的实例，会抛出ClassCastException。所以请确保a确实是B的实例。 <br />
<br />
46 其实我不确定a是不是B的实例，能不能分情况处理？ <br />
　答：可以使用instanceof操作符。例如 <br />
　if( a instanceof B ) <br />
　{ <br />
　B b = (B)a; <br />
　} <br />
　else <br />
　{ <br />
　... <br />
　} <br />
47 我在方法里修改了一个对象的值，但是退出方法后我发现这个对象的值没变！ <br />
　答：很可能你把传入参数重赋了一个新对象，例如下列代码就会造成这种错误： <br />
　public void fun1(A a) //a是局部参数，指向了一个外在对象。 <br />
　{ <br />
　a = new A(); //a指向了一个新对象，和外在对象脱钩了。如果你要让a作为传出变量，不要写这一句。 <br />
　a.setAttr(attr);//修改了新对象的值，外在对象没有被修改。 <br />
　} <br />
<br />
　基本类型也会出现这种情况。例如： <br />
　public void fun2(int a) <br />
　{ <br />
　a = 10;//只作用于本方法，外面的变量不会变化。 <br />
　} <br />
<br />
<br />
六、java.util篇 <br />
<br />
48 java能动态分配数组吗？ <br />
　答：可以。例如int n = 3; Language[] myLanguages = new Language[n]; <br />
<br />
49 我怎么知道数组的长度？ <br />
　答：用length属性。如上例中的 myLanguages.length 就为 3。 <br />
<br />
50 我还想让数组的长度能自动改变，能够增加/删除元素。 <br />
　答：用顺序表--java.util.List接口。你可以选择用ArrayList或是LinkedList，前者是数组实现，后者是链表实现。例如： <br />
　List list = new ArrayList(); <br />
<br />
　或是 <br />
　List list = new LinkedList(); <br />
<br />
<br />
51 什么是链表？为什么要有两种实现？ <br />
　答：请补习数据结构。 <br />
<br />
52 我想用队列/栈。 <br />
　答：用java.util.LinkedList。 <br />
<br />
53 我希望不要有重复的元素。 <br />
　答：用集合--java.util.Set接口。例如：Set set = new HashSet()。 <br />
<br />
54 我想遍历集合/Map。 <br />
　答：用java.util.Iterator。参见API。 <br />
<br />
55 我还要能够排序。 <br />
　答：用java.util.TreeSet。例如：Set set = new TreeSet()。放进去的元素会自动排序。你需要为元素实现Comparable接口，还可能需要提供equals()方法，compareTo()方法，hashCode()方法。 <br />
<br />
56 但是我想给数组排序。 <br />
　答：java.util.Arrays类包含了sort等实用方法。 <br />
<br />
57 我想按不同方法排序。 <br />
　答：为每种方法定义一个实现了接口Comparator的类并和Arrays综合运用。 <br />
<br />
58 Map有什么用？ <br />
　答：存储key-value的关键字-值对，你可以通过关键字来快速存取相应的值。 <br />
<br />
59 set方法没问题，但是get方法返回的是Object。 <br />
　答：强制类型转换成你需要的类型。参见45。 <br />
<br />
60 我要获得一个随机数。 <br />
　答：使用java.util.Random类。 <br />
<br />
61 我比较两个String总是false，但是它们明明都是"abc" ！ <br />
　答：比较String一定要使用equals或equalsIgnoreCase方法，不要使用 == ！ <br />
　==比较的是两个引用（变量）是否指向了同一个对象，而不是比较其内容。 <br />
<br />
62 我想修改一个String但是在String类中没找到编辑方法。 <br />
　答：使用StringBuffer类。 <br />
　String str = "......."; //待处理的字符串 <br />
　StringBuffer buffer = new StringBuffer(str); //使用该字符串初始化一个 <br />
　StringBuf <br />
　fer <br />
　buffer.append("..."); //调用StringBuffer的相关API来编辑字符串 <br />
　String str2 = buffer.toString(); //获得编辑后的字符串 <br />
<br />
　另外，如果你需要将多个字符串连接起来，请尽量避免使用+号直接连接，而是使用StringBuffer.append()方法。 <br />
<br />
63 我想处理日期/时间。 <br />
　答：使用java.util.Date类。你可以使用java.text.SimpleDateFormat类来在String和Date间互相转换。 <br />
　SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //规定日期格式 <br />
　Date date = formatter.parse("2003-07-26 18:30:35"); //将符合格式的String转换为Date <br />
　String s = formatter.format(date); //将Date转换为符合格式的String <br />
<br />
　关于定义日期格式的详细信息请参见API。
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/227520.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-09-07 11:50 <a href="http://www.blogjava.net/jzgl-ever/articles/227520.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat图形界面配置Mysql数据库连接池 </title><link>http://www.blogjava.net/jzgl-ever/articles/227463.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Sat, 06 Sep 2008 16:03:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/227463.html</guid><description><![CDATA[<p style="background: white; text-indent: 21pt; line-height: 20pt"><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">一、启动</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">Tomcat</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">服务器，打开浏览器，输入</span><span style="font-size: 10.5pt; color: windowtext"><a href="http://localhost:8080/admin/"><span style="color: windowtext; text-decoration: none; text-underline: none"><font face="Arial"><a href="http://localhost:8080/admin/" target="_blank">http://localhost:8080/admin/</a></font></span></a></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">（其中</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">localhost</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">是名称服务器或称为主机），进入管理界面的登陆页面，这时候请输入原来安装时要求输入的用户名和密码，登陆到管理界面。</span></p>
<p style="background: white; text-indent: 21pt; line-height: 20pt"><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">二、选择</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">Resources</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">－</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">Data sources</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">进入配置数据源界面，选择</span><span style="font-size: 10.5pt; color: windowtext"><br />
<font face="Arial">&nbsp;Data Source Actions </font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">－</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">&gt;</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">选择</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">Create New Data Source,</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">进入配置详细信息界面如图：<br />
</span><span style="font-size: 10.5pt; color: windowtext"><br />
<img src="http://blog.ccidnet.com/attachment/Mon_0611/10_20718_2429238835f3af3.bmp" onload="if(this.width  alt="" />'800')this.width='800';if(this.height>'600')this.height='600';" border=0><br />
&nbsp;<br />
<font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">三、修改</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">"conf"context.xml,</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">全部内容如下</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">:<br />
&lt;Context&gt;<br />
&lt;Resource name="jdbc/mysql" <br />
&nbsp;auth="Container" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;type="javax.sql.DataSource" <br />
&nbsp;driverClassName="</font></span><span style="font-size: 9.5pt; color: windowtext; font-family: Verdana">org.gjt.mm.mysql.Driver</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;url="jdbc:mysql://192.168.1.89/DB" <br />
&nbsp;username="root" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;password="19830918" <br />
&nbsp;maxActive="4" <br />
&nbsp;maxIdle="2" <br />
&nbsp;maxWait="500" /&gt;<br />
&lt;/Context&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">四、修改</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">web.xml</font></span></p>
<p style="background: white; line-height: 20pt"><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">打开</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">%TOMCAT_HOME%"conf"web.xml,</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">在的前面添加以下内容：</span><span style="font-size: 10.5pt; color: windowtext"><br />
<font face="Arial">&nbsp;&nbsp;&nbsp; &lt;resource-ref&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;description&gt;DB Connection&lt;/description&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;res-ref-name&gt;jdbc/mysql&lt;/res-ref-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;res-type&gt;javax.sql.DataSource&lt;/res-type&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;res-auth&gt;Container&lt;/res-auth&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/resource-ref&gt;<br />
&nbsp;&nbsp;&nbsp; </font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">注意</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">res-ref-name</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">填写的内容要与在上文提到的</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">JNDI Name</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">名称一致。</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial"> <br />
&nbsp;</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">到这里，配置工作就基本完成了</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">!</font></span></p>
<p style="background: white; text-indent: 31.5pt; line-height: 20pt"><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">五、引用</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">JNDI</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">时用</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">"java:comp/env/jdbc/mysql";<br />
</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">有的时候直接应用</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">JNDI</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">名就可以，比如</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">WEBLOGIC8</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">。而</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">TOMCAT</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">就是这么做。</span></p>
<p style="background: white; text-indent: 31.5pt; line-height: 20pt"><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">六、</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">JDBC</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">驱动程序</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">mysql-connector-java-5.0.0-beta-bin.jar<br />
</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">一定要放置到</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">%TOMCAT_HOME%"common"lib</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">下。</span><span style="font-size: 10.5pt; color: windowtext"><br />
</span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">重启你的</span><span style="font-size: 10.5pt; color: windowtext"><font face="Arial">Tomcat</font></span><span style="font-size: 10.5pt; color: windowtext; font-family: 宋体">服务。</span></p>
 <img src ="http://www.blogjava.net/jzgl-ever/aggbug/227463.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-09-07 00:03 <a href="http://www.blogjava.net/jzgl-ever/articles/227463.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat的配置和管理问题总结   精华</title><link>http://www.blogjava.net/jzgl-ever/articles/227461.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Sat, 06 Sep 2008 16:02:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/227461.html</guid><wfw:comment>http://www.blogjava.net/jzgl-ever/comments/227461.html</wfw:comment><comments>http://www.blogjava.net/jzgl-ever/articles/227461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzgl-ever/comments/commentRss/227461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzgl-ever/services/trackbacks/227461.html</trackback:ping><description><![CDATA[<p>终于在XP下配置好的JSP环境，并成功将它放到公网上，让所有Internet用户都可以访问我的机器（错了，我用的是同学老腌的机器，不要拿砖拍我），下面做下总结备忘：<br />
配置过程中遇到的问题在下面，帖在CSDN上了，朋友们说的不是很详细，现在我就具体过程展示如下（前面已经解决的问题有备忘，不在赘述）：<br />
jdk1.5.0_05+Tomcat<!-- http://fjjsp.com
-->5.5环境配置正确，在欢迎页面访问Tomcat Administration即admin目录出现<br />
Tomcat's administraion web application is no longer installed by default. Download and install the "admin" package to use it. <br />
的问题。<br />
1，下载"admin"package 包jakarta-tomcat-5.5.x-admin.zip更正很多网站的错误：<br />
<a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-admin.zip">http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-admin.zip</a>这个下载地址是错误的！<br />
jakarta-tomcat-5.5.x-admin.zip的正确下载地址：<br />
<a href="http://www.apache.org/dist/tomcat/tomcat-5/v5.5.17/bin/apache-tomcat-5.5.17-admin.zip">http://www.apache.org/dist/tomcat/tomcat-5/v5.5.17/bin/apache-tomcat-5.5.17-admin.zip</a><br />
下载之后解压，将解压后得到文件夹下\conf\Catalina\localhost目录下的admin.xml拷贝到tomcat安装目录下的\conf\Catalina\localhost下，之候这个目录下有三个文件admin.xml，host-manager.xml，manager.xml；<br />
2，同样将解压后得到文件夹下\server\webapps目录下的admin文件夹拷贝到tomcat安装目录下的\server\webapps目录下，之候这个目录下有三个文件夹admin，host-manager，manager。</p>
<p>3，这时修改admin.xml文件，用记事本打开，将docBase=""引号中的值修改为第2步的admin，host-manager，manager文件夹所在的路径，例如我的就是：<br />
C:/Program Files/Tomcat 5.5/server/webapps/admin<br />
现在打开浏览器输入：<a href="http://localhost:8080/">http://localhost:8080</a>;<br />
看到toncat的欢迎页面，进入Tomcat Manager，将admin启动，如果已经启动则不用管他！<br />
在浏览器输入：<a href="http://localhost:8080/admin">http://localhost:8080/admin</a>看到登陆框了吧！如果不行的话，重启服务器，要给人家一个喘气的时间啊！呵呵！</p>
<p>特别强调的是admin文件夹拷贝到Tomcat 5.5\server\webapps目录下，而不是Tomcat 5.5\webapps目录下。</p>
<p>******************************下面是我的求助帖*********************************</p>
<p><a href="http://community.csdn.net/Expert/topic/4854/4854145.xml?temp=.9803888">http://community.csdn.net/Expert/topic/4854/4854145.xml?temp=.9803888</a></p>
<p><a href="http://community.csdn.net/Expert/topic/4854/4854150.xml?temp=.4356348">http://community.csdn.net/Expert/topic/4854/4854150.xml?temp=.4356348</a></p>
<p>问题简述：<br />
jdk1.5.0_05+Tomcat 5.5环境配置正确，下载"admin"package 包jakarta-tomcat-5.5.x-admin.zip并安装，在进到Tomcat的manager页面不能启动admin,http://127.0.0.1:8080/admin访问失败！</p>
<p><br />
问题的详细叙述：</p>
<p>我的jdk1.5.0_05+Tomcat 5.5环境的问题：<br />
jdk1.5.0_05环境配置正确，单独有程序测试没有问题，<br />
Tomcat 5.5环境配置正确，单独测试没有问题，访问<br />
<a href="http://127.0.0.1:8080/">http://127.0.0.1:8080</a>，可以看到欢迎页面，自己的<br />
jsp页面在wepapps下也可以正常访问，现在问题是无法<br />
访问Tomcat Administration，<a href="http://127.0.0.1:8080/admin">http://127.0.0.1:8080/admin</a>打开时提示如下：</p>
<p>Tomcat's administration web application is no longer installed by default. Download and install the "admin" package to use it. <br />
我就下载"admin"package 包jakarta-tomcat-5.5.x-admin.zip，并且按照网友的做法，把包中目录.\conf\Catalina\localhost下的admin.xml拷贝到Tomcat 5.5的相同目录下，在把包中目录.\server\webapps下的admin拷贝到Tomcat 5.5的webapps，再次访问<a href="http://127.0.0.1:8080/admin">http://127.0.0.1:8080/admin</a>，提示如下：</p>
<p>HTTP Status 404 - /admin/</p>
<p>type Status report</p>
<p>message /admin/</p>
<p>description The requested resource (/admin/) is not available.</p>
<p>在进到Tomcat的manager页面不能启动admin,请前辈没帮忙看看！</p>
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/227461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-09-07 00:02 <a href="http://www.blogjava.net/jzgl-ever/articles/227461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tomcat的配置和管理问题总结   精华</title><link>http://www.blogjava.net/jzgl-ever/articles/227462.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Sat, 06 Sep 2008 16:02:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/227462.html</guid><description><![CDATA[<p>终于在XP下配置好的JSP环境，并成功将它放到公网上，让所有Internet用户都可以访问我的机器（错了，我用的是同学老腌的机器，不要拿砖拍我），下面做下总结备忘：<br />
配置过程中遇到的问题在下面，帖在CSDN上了，朋友们说的不是很详细，现在我就具体过程展示如下（前面已经解决的问题有备忘，不在赘述）：<br />
jdk1.5.0_05+Tomcat<!-- http://fjjsp.com
-->5.5环境配置正确，在欢迎页面访问Tomcat Administration即admin目录出现<br />
Tomcat's administraion web application is no longer installed by default. Download and install the "admin" package to use it. <br />
的问题。<br />
1，下载"admin"package 包jakarta-tomcat-5.5.x-admin.zip更正很多网站的错误：<br />
<a href="http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-admin.zip">http://www.apache.org/dist/jakarta/tomcat-5/v5.5.x/bin/jakarta-tomcat-5.5.x-admin.zip</a>这个下载地址是错误的！<br />
jakarta-tomcat-5.5.x-admin.zip的正确下载地址：<br />
<a href="http://www.apache.org/dist/tomcat/tomcat-5/v5.5.17/bin/apache-tomcat-5.5.17-admin.zip">http://www.apache.org/dist/tomcat/tomcat-5/v5.5.17/bin/apache-tomcat-5.5.17-admin.zip</a><br />
下载之后解压，将解压后得到文件夹下\conf\Catalina\localhost目录下的admin.xml拷贝到tomcat安装目录下的\conf\Catalina\localhost下，之候这个目录下有三个文件admin.xml，host-manager.xml，manager.xml；<br />
2，同样将解压后得到文件夹下\server\webapps目录下的admin文件夹拷贝到tomcat安装目录下的\server\webapps目录下，之候这个目录下有三个文件夹admin，host-manager，manager。</p>
<p>3，这时修改admin.xml文件，用记事本打开，将docBase=""引号中的值修改为第2步的admin，host-manager，manager文件夹所在的路径，例如我的就是：<br />
C:/Program Files/Tomcat 5.5/server/webapps/admin<br />
现在打开浏览器输入：<a href="http://localhost:8080/">http://localhost:8080</a>;<br />
看到toncat的欢迎页面，进入Tomcat Manager，将admin启动，如果已经启动则不用管他！<br />
在浏览器输入：<a href="http://localhost:8080/admin">http://localhost:8080/admin</a>看到登陆框了吧！如果不行的话，重启服务器，要给人家一个喘气的时间啊！呵呵！</p>
<p>特别强调的是admin文件夹拷贝到Tomcat 5.5\server\webapps目录下，而不是Tomcat 5.5\webapps目录下。</p>
<p>******************************下面是我的求助帖*********************************</p>
<p><a href="http://community.csdn.net/Expert/topic/4854/4854145.xml?temp=.9803888">http://community.csdn.net/Expert/topic/4854/4854145.xml?temp=.9803888</a></p>
<p><a href="http://community.csdn.net/Expert/topic/4854/4854150.xml?temp=.4356348">http://community.csdn.net/Expert/topic/4854/4854150.xml?temp=.4356348</a></p>
<p>问题简述：<br />
jdk1.5.0_05+Tomcat 5.5环境配置正确，下载"admin"package 包jakarta-tomcat-5.5.x-admin.zip并安装，在进到Tomcat的manager页面不能启动admin,http://127.0.0.1:8080/admin访问失败！</p>
<p><br />
问题的详细叙述：</p>
<p>我的jdk1.5.0_05+Tomcat 5.5环境的问题：<br />
jdk1.5.0_05环境配置正确，单独有程序测试没有问题，<br />
Tomcat 5.5环境配置正确，单独测试没有问题，访问<br />
<a href="http://127.0.0.1:8080/">http://127.0.0.1:8080</a>，可以看到欢迎页面，自己的<br />
jsp页面在wepapps下也可以正常访问，现在问题是无法<br />
访问Tomcat Administration，<a href="http://127.0.0.1:8080/admin">http://127.0.0.1:8080/admin</a>打开时提示如下：</p>
<p>Tomcat's administration web application is no longer installed by default. Download and install the "admin" package to use it. <br />
我就下载"admin"package 包jakarta-tomcat-5.5.x-admin.zip，并且按照网友的做法，把包中目录.\conf\Catalina\localhost下的admin.xml拷贝到Tomcat 5.5的相同目录下，在把包中目录.\server\webapps下的admin拷贝到Tomcat 5.5的webapps，再次访问<a href="http://127.0.0.1:8080/admin">http://127.0.0.1:8080/admin</a>，提示如下：</p>
<p>HTTP Status 404 - /admin/</p>
<p>type Status report</p>
<p>message /admin/</p>
<p>description The requested resource (/admin/) is not available.</p>
<p>在进到Tomcat的manager页面不能启动admin,请前辈没帮忙看看！</p>
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/227462.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-09-07 00:02 <a href="http://www.blogjava.net/jzgl-ever/articles/227462.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从招聘的角度谈程序员应具备的能力</title><link>http://www.blogjava.net/jzgl-ever/articles/222380.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Fri, 15 Aug 2008 18:01:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/222380.html</guid><description><![CDATA[发信人: AtomAndBit (原子与比特), 信区: DotNET<br />
标&nbsp;&nbsp;题: 从招聘的角度谈程序员应具备的能力<br />
发信站: 水木社区 (Mon May 23 22:44:14 2005), 站内<br />
昨天写的，觉得写得不怎么样，没敢发。今天索性发了吧。别笑俺。<br />
从招聘的角度谈程序员应具备的能力<br />
今天实在太晕了.这几天面试了3个人了,这3个人都是科班的,一个大专,两个大本,大本中<br />
的一个还考上了软件工程硕士.我的考题很简单,就是写一个类,计算平面中2点间距离,注<br />
意类的设计和编码风格.我晕,一个都没写出来!第一个人不知道两点间距离怎么算.第二个<br />
人写出来这样的东西:<br />
Class Distance<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double distance = ......;<br />
}<br />
这也叫类,真服了.<br />
第三个回答更干脆,不会.他用c用的多,我让他用c写一个.写出来这样的:<br />
int Dis<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d = ......;<br />
}<br />
不传参,不return.<br />
真郁闷,这究竟是什么世道.感叹之下,感觉需要写一些东西,从招聘者的角度谈谈程序员(<br />
中国程序员!)应该具备什么样的素质,希望对即将踏上程序路上的人或刚踏上的人有点帮<br />
助.<br />
一般来说,单位招聘人都有一个定位,一般可分为售前,技术支持,项目经理,系分,高级开发<br />
人员,一般开发人员.咱就不谈售前，技术支持，俺在这方面没话语权。招项目经理关键是<br />
信任，对个人项目管理能力还有对个人自身做人的信任，这个谈起来江湖成分就比较多了<br />
。系分的关键是对业务和技术两方面的理解能力，还有沟通能力，这个俺也没资格谈，因<br />
为俺不是合格的系分。俺就从俺的经历谈一下高级开发人员和一般开发人员所应该具备的<br />
素质和能力。<br />
什么是高级开发人员。俺这么认为，给一个某个方面的需求，高级开发人员应该是能够提<br />
出一个有效的解决方案，能够独立或者带几个人实现这个方案的人。这个需求不是项目级<br />
别的需求，而是更具体一些的问题，比如关键类的设计，关键服务的设计，根据需求设计<br />
对数据库进行逻辑设计和物理设计等等。这种人应该对某一领域的技术知识有很深入的了<br />
解，对程序执行流程有很深入的理解，还应有阅读文档、撰写文档的能力。一般开发人员<br />
应该能够在高级开发人员的指导下，能够编写规范的代码，能够完成代码的实现与部署。<br />
俺从2个故事谈起吧，俺经历过的。当然，这些故事中俺也有问题，俺就不在这里做自我<br />
批评了。<br />
第一个故事，1个哥们。C#还行。一次俺交代了一个任务，尽快做出一个只有2－3个页面<br />
小网站的Demo。然后俺就去玩我自己的去了。过了两小时，俺估摸着差不多了，去看看，<br />
还在干呢。又过了1个小时，俺再去看，刚弄好一个页面。俺一看代码，吓偶一跳，虽然<br />
只有一个页面，但是类就有七八上十个。他用上了领域模式！！实体类都搞了好几个。问<br />
为什么。他说他刚看过一些网上优秀项目的源代码，觉得别人写得特别好。问题是，他看<br />
的那个网站数量级和俺要求做的这个是一样的吗？俺还只要做Demo，就用上了领域模式，<br />
只因为这是好的设计。结果他爽了，俺不爽。第一，问题没解决，第二，进度太慢。俺才<br />
不关心Demo的性能、可扩展性和可维护性呢。这样的人，在工作中，只能当一般程序员用<br />
，就不能当高级程序员用。<br />
第二个故事，这次是2位，A和B。是Linux下的C++开发。A的C++，Linux狂牛。B的C++，<br />
Linux仅仅会用，但是具有一定的领域知识。俺Linux刚会用。因为系统是要给一般人用的<br />
，俺想弄一个界面出来。这个任务交给了A。A咣咣咣折腾了1周，出来了1个界面，实现了<br />
一点点功能。具体怎么实现的？我的妈呀，底层设计得很庞大，按照他这种设计，到项目<br />
结束，他恐怕就做不了几个页面。俺对性能没什么要求，他也知道的，干嘛不用快速开发<br />
语言呀。俺只好出手了，俺听说Python在Linux下开发界面很快，俺一边学一边编，搞了<br />
一下午，没搞定。放弃，不玩这个，太灵活。俺又听说.net在linux下有个mono，俺也不<br />
知道怎么样，一番调研，可行。现学现用，GTK#+mono，安装用了3小时，编程用了3小时<br />
，俺就编出来个和他那一样的东东。B呢。B的特点是编的程序错误百出，几乎没编过什么<br />
完全正确的程序。但是，B的思路，B的框架是对的，尽管B编的程序跑出来的结果全部是<br />
错误的。从我的角度看，B可以做高级程序员用，而A则只能做一般程序员用，尽管A的OS<br />
，C++狂牛，而B的狂烂。俺是让A做B的助手，B有什么程序上的问题和需求让A来解决。A<br />
自己编的代码，到最后用上的只有2个函数。而B的代码则成了整个框架的基础。<br />
现实点讲，用人和被用的关键就是有需求和有应用价值。就拿第一个故事的哥们来说，你<br />
技术倒是锻炼了，但是你解决了什么问题？我不赞成用技术学习的态度去工作。道可道，<br />
非常道。能学习到的东西的价值始终是有限的。比如，等你把领域模式学好之后，能够干<br />
些大的项目了，但是此时，大项目各方面的工具都很成熟了，建模工具，ORMAP，什么的<br />
，别人需要的又是对需求、业务和过程的把握能力的人。你干的活，机器都能干，要你干<br />
嘛？能查找得来的东西最没价值。领悟出来的东西才是最有价值的。从用人单位的角度来<br />
看，它需要的是能够解决问题。而技术只是解决问题的手段之一。平台是技术的一种。语<br />
言是能够操作平台的工具。必须有所区别，有所把握，有所轻重。如果你能够解决问题，<br />
你什么技术都不会都没关系。比如一个门，用麻绳缠得乱七八糟，你要进屋必须解开麻绳<br />
，费了9牛2虎的力解不开，别人拿一把刀，一下就把绳子剁了。他的解决问题的能力就比<br />
你高。你如果理解一个平台的话，你什么语言不会都没关系，你只要能够指挥别人完成你<br />
指定的任务就行了。而如果你只会语言，对平台不了解，对问题领域也不了解，那么，你<br />
能干啥？茴香豆的茴字有几种写法有什么意义？还有的，过分依赖工具，知道斧头是劈柴<br />
的，而且也能够劈开柴，但是，某一天，一个木头没批开，他就不知道怎么办了。<br />
具体来说，我觉得一个一般的程序员应该具备这样的能力：<br />
1，熟悉至少一个工具<br />
2，熟悉平台中的某一块，熟悉一门语言，能够承担一些具体的任务。<br />
3，还得有些基础吧。不能工具玩的团团转，离了工具啥都干不了。连一个最简单的类都<br />
写不了。<br />
一个高级程序员应该具备：<br />
1，精通1门语言和1个平台，熟悉多种工具、语言、平台，能够通过对比研究选择合适的<br />
方案<br />
2，熟悉OO，UML<br />
3，对问题域有一定的了解，熟悉至少1种软件开发过程<br />
4，比较强的分析问题、解决问题的能力<br />
从学习的角度来说，也不能什么都学习，什么流行学习什么。市场规律最基本的一条就是<br />
什么多了就贬值。俺个人的体会是：<br />
1，从流程的角度来学习。比如，你如果从CLI层面搞清楚了一个Hello world程序的执行<br />
流程，搞清一个ASP.Net页面的执行流程，了解整个过程中发生了哪些调用操作，就很不<br />
错了。<br />
2，从横向的角度来学习。也就是学习平台的结构，了解类库哪一部分哪一部分是干啥的<br />
，能干啥，不能干啥，常用的多留意留意。一个平台通了，其它的都很简单。<br />
3，用比较的眼光来学习。俺觉得2个以上类似的东西对比学习效果比较好，主学一个，副<br />
学一个，先学一个，后学一个，比如，你学.net，可以适当看看java。windows的看看<br />
unix/linux。这样作最大好处是思考问题的思路不会狭窄，不会盲目迷信工具，不会盲目<br />
迷信平台，不会盲目迷信，会明白可选工具的优点和缺点，会慢慢培养出一种对解决方案<br />
的洞察力，会开始具备决策的能力，具备trade-off的能力。你不对方案的优缺点掌握，<br />
就不会总是选择出好的方案。具有方案选择能力的人和不具有选择能力的人不是一个量级<br />
的。<br />
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/222380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-08-16 02:01 <a href="http://www.blogjava.net/jzgl-ever/articles/222380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在Oracle里实现自增 </title><link>http://www.blogjava.net/jzgl-ever/articles/221155.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Sun, 10 Aug 2008 10:47:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/221155.html</guid><description><![CDATA[<h1 class="postTitle"><a class="postTitle2" id="AjaxHolder_ctl01_TitleUrl" href="http://www.cnblogs.com/believe3301/archive/2007/09/27/907852.html">如何在Oracle里实现自增</a> </h1>
<div class="clear"></div>
<div class="postBody">在oracle中sequence就是所谓的序列号，每次取的时候它会自动增加，一般用在需要按序列号排序的地方。 <br />
1、Create Sequence <br />
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限， <br />
CREATE SEQUENCE emp_sequence <br />
INCREMENT BY 1 -- 每次加几个 <br />
START WITH 1 -- 从1开始计数 <br />
NOMAXVALUE -- 不设置最大值 <br />
NOCYCLE -- 一直累加，不循环 <br />
CACHE 10; <br />
<br />
一旦定义了emp_sequence，你就可以用CURRVAL，NEXTVAL <br />
CURRVAL=返回 sequence的当前值 <br />
NEXTVAL=增加sequence的值，然后返回 sequence 值 <br />
比如： <br />
emp_sequence.CURRVAL <br />
emp_sequence.NEXTVAL <br />
<br />
可以使用sequence的地方： <br />
- 不包含子查询、snapshot、VIEW的 SELECT 语句 <br />
- INSERT语句的子查询中 <br />
- NSERT语句的VALUES中 <br />
- UPDATE 的 SET中 <br />
<br />
可以看如下例子： <br />
INSERT INTO emp VALUES <br />
(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20); <br />
<br />
SELECT empseq.currval FROM DUAL; <br />
<br />
但是要注意的是： <br />
- 第一次NEXTVAL返回的是初始值；随后的NEXTVAL会自动增加你定义的INCREMENT BY值，然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值，但是在第一次NEXTVAL初始化之后才能使用CURRVAL，否则会出错。一次NEXTVAL会增加一次SEQUENCE的值，所以如果你在同一个语句里面使用多个NEXTVAL，其值就是不一样的。明白？ <br />
<br />
- 如果指定CACHE值，ORACLE就可以预先在内存里面放置一些sequence，这样存取的快些。cache里面的取完后，oracle自动再取一组到cache。 使用cache或许会跳号， 比如数据库突然不正常down掉（shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。 <br />
<br />
2、Alter Sequence <br />
你或者是该sequence的owner，或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值，必须 drop sequence 再 re-create . <br />
Alter sequence 的例子 <br />
ALTER SEQUENCE emp_sequence <br />
INCREMENT BY 10 <br />
MAXVALUE 10000 <br />
CYCLE -- 到10000后从头开始 <br />
NOCACHE ; <br />
<br />
<br />
影响Sequence的初始化参数： <br />
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。 <br />
<br />
可以很简单的Drop Sequence <br />
DROP SEQUENCE order_seq; <br />
2.创建触发器<br />
&nbsp;&nbsp;&nbsp;&nbsp;<font face="Verdana">create or replace trigger trg_tb_course_bi<br />
&nbsp; before insert on tb_course&nbsp; <br />
&nbsp; for each row<br />
declare<br />
&nbsp;&nbsp; v_course_id number;<br />
&nbsp; -- local variables here<br />
begin<br />
&nbsp; select myseq.nextval into v_course_id from dual;<br />
&nbsp; :new.courseid := v_course_id;<br />
end trg_tb_course_bi;</font> </div>
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/221155.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-08-10 18:47 <a href="http://www.blogjava.net/jzgl-ever/articles/221155.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>将表t_uaer的字段ID设置为自增:(用序列sequence的方法来实现)__oracle如何实现自增？</title><link>http://www.blogjava.net/jzgl-ever/articles/221149.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Sun, 10 Aug 2008 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/221149.html</guid><description><![CDATA[<p><font size="4">将表t_uaer的字段ID设置为自增:(用序列sequence的方法来实现)</font></p>
<p><font size="4">----创建表<br />
Create&nbsp; table&nbsp; t_user(<br />
Id number(6),userid varchar2(20),loginpassword varchar2(20),isdisable number(6)<br />
);</font></p>
<p><font size="4">----创建序列<br />
create sequence user_seq<br />
increment by 1&nbsp; <br />
start with 1<br />
nomaxvalue<br />
nominvalue<br />
nocache</font></p>
<p><font size="4">----创建触发器<br />
create or&nbsp; replace trigger tr_user<br />
before insert on t_user<br />
for each row<br />
begin<br />
select user_seq.nextval into :new.id from dual;<br />
end;<br />
</font></p>
<p>(注：这里的触发器在DOS下的那个SQLplus里创建不了，需要到图形化的那个版本里才能创建）<br />
<font size="4">还有另处一种形式可以实现引用Sequence来自增，见另一篇文章－－《如何在Oracle里实现自增》现引用如下：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">在oracle中sequence就是所谓的序列号，每次取的时候它会自动增加，一般用在需要按序列号排序的地方。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">1</span><span style="color: #000000">、Create&nbsp;Sequence&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />你首先要有CREATE&nbsp;SEQUENCE或者CREATE&nbsp;ANY&nbsp;SEQUENCE权限，&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />CREATE&nbsp;SEQUENCE&nbsp;emp_sequence&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />INCREMENT&nbsp;BY&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">&nbsp;每次加几个&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />START&nbsp;WITH&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">&nbsp;从1开始计数&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />NOMAXVALUE&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">&nbsp;不设置最大值&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />NOCYCLE&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">&nbsp;一直累加，不循环&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />CACHE&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />一旦定义了emp_sequence，你就可以用CURRVAL，NEXTVAL&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />CURRVAL</span><span style="color: #000000">=</span><span style="color: #000000">返回&nbsp;sequence的当前值&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />NEXTVAL</span><span style="color: #000000">=</span><span style="color: #000000">增加sequence的值，然后返回&nbsp;sequence&nbsp;值&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />比如：&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />emp_sequence.CURRVAL&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />emp_sequence.NEXTVAL&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />可以使用sequence的地方：&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;不包含子查询、snapshot、VIEW的&nbsp;SELECT&nbsp;语句&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;INSERT语句的子查询中&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;NSERT语句的VALUES中&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;UPDATE&nbsp;的&nbsp;SET中&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />可以看如下例子：&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />INSERT&nbsp;INTO&nbsp;emp&nbsp;VALUES&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />(empseq.nextval,&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">LEWIS</span><span style="color: #000000">'</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">CLERK</span><span style="color: #000000">'</span><span style="color: #000000">,</span><span style="color: #000000">7902</span><span style="color: #000000">,&nbsp;SYSDATE,&nbsp;</span><span style="color: #000000">1200</span><span style="color: #000000">,&nbsp;NULL,&nbsp;</span><span style="color: #000000">20</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />SELECT&nbsp;empseq.currval&nbsp;FROM&nbsp;DUAL;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />但是要注意的是：&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;第一次NEXTVAL返回的是初始值；随后的NEXTVAL会自动增加你定义的INCREMENT&nbsp;BY值，然后返回增加后的值。CURRVAL&nbsp;总是返回当前SEQUENCE的值，但是在第一次NEXTVAL初始化之后才能使用CURRVAL，否则会出错。一次NEXTVAL会增加一次SEQUENCE的值，所以如果你在同一个语句里面使用多个NEXTVAL，其值就是不一样的。明白？&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;如果指定CACHE值，ORACLE就可以预先在内存里面放置一些sequence，这样存取的快些。cache里面的取完后，oracle自动再取一组到cache。&nbsp;使用cache或许会跳号，&nbsp;比如数据库突然不正常down掉（shutdown&nbsp;abort),cache中的sequence就会丢失.&nbsp;所以可以在create&nbsp;sequence的时候用nocache防止这种情况。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
----测试<br />
insert into t_user(userid,loginpassword, isdisable)<br />
values('ffll','liudddyujj', 0);<br />
insert into t_user(userid,loginpassword, isdisable)<br />
values('dddd','zhang', 0)<br />
select * from t_user;<br />
就可以看出结果。</font></p>
<p><font size="4">***********************************************************************<br />
对sequence说明：<br />
increment by ：用于指定序列增量（默认值：1），如果指定的是正整数，则序列号自动递增，如果指定的是负数，则自动递减。<br />
start with ：用于指定序列生成器生成的第一个序列号，当序列号顺序递增时默认值为序列号的最小值 当序列号顺序递减时默认值为序列号的最大值。<br />
Maxvalue:用于指定序列生成器可以生成的组大序列号（必须大于或等于start with，并且必须大于minvalue）,默认为nomaxvalue。<br />
Minvalue：用于指定序列生成器可以生成的最小序列号（必须小于或等于starr with，并且必须小于maxvalue）,默认值为nominvalue。<br />
Cycle：用于指定在达到序列的最大值或最小值之后是否继续生成序列号，默认为nocycle。<br />
Cache:用于指定在内存中可以预分配的序列号个数（默认值：20）。<br />
在sequence中应注意：<br />
1、&nbsp;第一次NEXTVAL返回的是初始值；随后的NEXTVAL会自动增加你定义的INCREMENT BY值，然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值，但是在第一次NEXTVAL初始化之后才能使用CURRVAL，否则会出错。一次NEXTVAL会增加一次SEQUENCE的值，所以如果你在同一个语句里面使用多个NEXTVAL，其值就是不一样的。<br />
2、&nbsp;如果指定CACHE值，ORACLE就可以预先在内存里面放置一些sequence，这样存取的快些。cache里面的取完后，oracle自动再取一组到cache。 使用cache或许会跳号， 比如数据库突然不正常down掉（shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。</font></p>
<p><font size="4"><br />
</font></p>
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/221149.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-08-10 17:39 <a href="http://www.blogjava.net/jzgl-ever/articles/221149.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle，SQL，MySQL的自增变量设置</title><link>http://www.blogjava.net/jzgl-ever/articles/221138.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Sun, 10 Aug 2008 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/221138.html</guid><description><![CDATA[Oracle，SQL Server，MySQL的自增变量设置： <br />
<br />
　　1、MySQL的自增变量是比较好记的，使用AUTO_INCREMENT关键字，如果知道英文的就容易记忆了，如下创建一个带有自增变理的表： <br />
<br />
　　create table test(id int AUTO_INCREMENT <br />
<br />
　　primary key not null，name varchar(50)); <br />
<br />
　　注释：此处的id一定要申明为主键，否则会报错。 <br />
<br />
　　2、SQl Server使用identity关键字，可以很容易指定从什么数开始，增幅是多少，如下： <br />
<br />
　　create table test(id int identity(100，10) <br />
<br />
　　primary key not null，name varchar(50)); <br />
<br />
　　3、Oracle不能够在创建表的时候指定自动关键字，它需要重新创建sequence，然后以"创建键。nextval"来引用： <br />
<br />
　　create table test(id int primary key <br />
<br />
　　not null，name varchar(50)); <br />
<br />
　　create sequence test_id(最好是表名+序列号标记) <br />
<br />
　　increment by 1 start with 1 maxvalue 9999; <br />
<br />
　　引用如下： <br />
<br />
　　insert into test(test_id.nextval，'www'); <br />
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/221138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-08-10 15:26 <a href="http://www.blogjava.net/jzgl-ever/articles/221138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是接口回调？ </title><link>http://www.blogjava.net/jzgl-ever/articles/220547.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Wed, 06 Aug 2008 17:15:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/220547.html</guid><description><![CDATA[<div class="post"><a id="viewpost1_TitleUrl" href="http://www.blogjava.net/Carter0618/archive/2007/08/19/137936.html">什么是接口回调？</a> </div>
<font size="2"><font face="SimSun"><strong>1</strong><strong>．接口回调是什么</strong><strong><sup>[2]</sup></strong><strong>？</strong></font></font><br />
<div style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font face="SimSun" size="2">接口回调是指：可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量，那么该接口变量就可以调用被类实现的接口的方法。实际上，当接口变量调用被类实现的接口中的方法时，就是通知相应的对象调用接口的方法，这一过程称为对象功能的接口回调。看下面示例。</font></div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_16_40_Open_Image" onclick="this.style.display='none'; Codehighlighter1_16_40_Open_Text.style.display='none'; Codehighlighter1_16_40_Closed_Image.style.display='inline'; Codehighlighter1_16_40_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_16_40_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_16_40_Closed_Text.style.display='none'; Codehighlighter1_16_40_Open_Image.style.display='inline'; Codehighlighter1_16_40_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;People</span><span id="Codehighlighter1_16_40_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_16_40_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;peopleList();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_73_148_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_148_Open_Text.style.display='none'; Codehighlighter1_73_148_Closed_Image.style.display='inline'; Codehighlighter1_73_148_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_73_148_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_73_148_Closed_Text.style.display='none'; Codehighlighter1_73_148_Open_Image.style.display='inline'; Codehighlighter1_73_148_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Student&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;People</span><span id="Codehighlighter1_73_148_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_73_148_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_102_146_Open_Image" onclick="this.style.display='none'; Codehighlighter1_102_146_Open_Text.style.display='none'; Codehighlighter1_102_146_Closed_Image.style.display='inline'; Codehighlighter1_102_146_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_102_146_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_102_146_Closed_Text.style.display='none'; Codehighlighter1_102_146_Open_Image.style.display='inline'; Codehighlighter1_102_146_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;peopleList()</span><span id="Codehighlighter1_102_146_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_102_146_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">I&#8217;m&nbsp;a&nbsp;student.</span><span style="color: #000000">"</span><span style="color: #000000">)；<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_181_255_Open_Image" onclick="this.style.display='none'; Codehighlighter1_181_255_Open_Text.style.display='none'; Codehighlighter1_181_255_Closed_Image.style.display='inline'; Codehighlighter1_181_255_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_181_255_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_181_255_Closed_Text.style.display='none'; Codehighlighter1_181_255_Open_Image.style.display='inline'; Codehighlighter1_181_255_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Teacher&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;People</span><span id="Codehighlighter1_181_255_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_181_255_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_209_253_Open_Image" onclick="this.style.display='none'; Codehighlighter1_209_253_Open_Text.style.display='none'; Codehighlighter1_209_253_Closed_Image.style.display='inline'; Codehighlighter1_209_253_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_209_253_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_209_253_Closed_Text.style.display='none'; Codehighlighter1_209_253_Open_Image.style.display='inline'; Codehighlighter1_209_253_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;peopleList()</span><span id="Codehighlighter1_209_253_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_209_253_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">I&#8217;m&nbsp;a&nbsp;teacher.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_277_498_Open_Image" onclick="this.style.display='none'; Codehighlighter1_277_498_Open_Text.style.display='none'; Codehighlighter1_277_498_Closed_Image.style.display='inline'; Codehighlighter1_277_498_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_277_498_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_277_498_Closed_Text.style.display='none'; Codehighlighter1_277_498_Open_Image.style.display='inline'; Codehighlighter1_277_498_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Example</span><span id="Codehighlighter1_277_498_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_277_498_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_319_496_Open_Image" onclick="this.style.display='none'; Codehighlighter1_319_496_Open_Text.style.display='none'; Codehighlighter1_319_496_Closed_Image.style.display='inline'; Codehighlighter1_319_496_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_319_496_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_319_496_Closed_Text.style.display='none'; Codehighlighter1_319_496_Open_Image.style.display='inline'; Codehighlighter1_319_496_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;args[])</span><span id="Codehighlighter1_319_496_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_319_496_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;People&nbsp;a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">声明接口变量</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">a</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Student();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">实例化，接口变量中存放对象的引用</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">a.peopleList();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">接口回调</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">a</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Teacher();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">实例化，接口变量中存放对象的引用</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">a.peopleList();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">接口回调</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<div style="margin: 0cm 0cm 0pt"><font size="2"><font face="SimSun"><u>结果：<br />
</u><font size="3">I&#8217;m a student.<br />
I&#8217;m a teacher.</font></font></font></div>
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/220547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-08-07 01:15 <a href="http://www.blogjava.net/jzgl-ever/articles/220547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>static的用法</title><link>http://www.blogjava.net/jzgl-ever/articles/219585.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Sat, 02 Aug 2008 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/219585.html</guid><wfw:comment>http://www.blogjava.net/jzgl-ever/comments/219585.html</wfw:comment><comments>http://www.blogjava.net/jzgl-ever/articles/219585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzgl-ever/comments/commentRss/219585.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzgl-ever/services/trackbacks/219585.html</trackback:ping><description><![CDATA[<div class="postTitle">static的用法[转]</div>
<div id="articleContentArea">
<div class="middleSize" id="articleContent">
<div><font style="font-size: 12px" color="#9999ff">&nbsp;要理解static，就必须要先理解另一个与之相对的关键字，很多人可能都还不知道有这个关键字，那就是auto，其实我们通常声明的不用static修饰的变量，都是auto的，因为它是默认的，就象short和long总是默认为int一样；我们通常声明一个变量：<br />
&nbsp;&nbsp;&nbsp;&nbsp;int a;<br />
&nbsp;&nbsp;&nbsp;&nbsp;string s;<br />
&nbsp;&nbsp;&nbsp;&nbsp;其实就是：<br />
&nbsp;&nbsp;&nbsp;&nbsp;auto int a;<br />
&nbsp;&nbsp;&nbsp;&nbsp;auto string s;<br />
&nbsp;&nbsp;&nbsp;&nbsp;而static变量的声明是：<br />
&nbsp;&nbsp;&nbsp;&nbsp;static int a;<br />
&nbsp;&nbsp;&nbsp;&nbsp;static string s;<br />
&nbsp;&nbsp;&nbsp;&nbsp;这样似乎可以更有利于理解auto和static是一对成对的关键字吧，就像private，protected，public一样；<br />
&nbsp;&nbsp;&nbsp;&nbsp;对于static的不理解，其实就是对于auto的不理解，因为它是更一般的；有的东西你天天在用，但未必就代表你真正了解它；auto的含义是由程序自动控制变量的生存周期，通常指的就是变量在进入其作用域的时候被分配，离开其作用域的时候被释放；而static就是不auto，变量在程序初始化时被分配，直到程序退出前才被释放；也就是static是按照程序的生命周期来分配释放变量的，而不是变量自己的生命周期；所以，像这样的例子：<br />
&nbsp;&nbsp;&nbsp;&nbsp;void func()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int a;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static int b;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;每一次调用该函数，变量a都是新的，因为它是在进入函数体的时候被分配，退出函数体的时候被释放，所以多个线程调用该函数，都会拥有各自独立的变量a，因为它总是要被重新分配的；而变量b不管你是否使用该函数，在程序初始化时就被分配的了，或者在第一次执行到它的声明的时候分配（不同的编译器可能不同），所以多个线程调用该函数的时候，总是访问同一个变量b，这也是在多线程编程中必须注意的！<br />
<br />
static的全部用法：<br />
1．类的静态成员：<br />
class A<br />
{<br />
private:<br />
&nbsp;&nbsp;&nbsp;&nbsp;static int s_value;<br />
};<br />
&nbsp;&nbsp;&nbsp;&nbsp;在cpp中必须对它进行初始化：<br />
int A::s_value = 0;// 注意，这里没有static的修饰！<br />
&nbsp;&nbsp;&nbsp;&nbsp;类的静态成员是该类所有实例的共用成员，也就是在该类的范畴内是个全局变量，也可以理解为是一个名为A::s_value的全局变量，只不过它是带有类安全属性的；道理很简单，因为它是在程序初始化的时候分配的，所以只分配一次，所以就是共用的；<br />
&nbsp;&nbsp;&nbsp;&nbsp;类的静态成员必须初始化，道理也是一样的，因为它是在程序初始化的时候分配的，所以必须有初始化，类中只是声明，在cpp中才是初始化，你可以在初始化的代码上放个断点，在程序执行main的第一条语句之前就会先走到那；如果你的静态成员是个类，那么就会调用到它的构造函数；<br />
<br />
2．类的静态函数：<br />
class A<br />
{<br />
private:<br />
&nbsp;&nbsp;&nbsp;&nbsp;static void func(int value);<br />
};<br />
&nbsp;&nbsp;&nbsp;&nbsp;实现的时候也不需要static的修饰，因为static是声明性关键字；<br />
类的静态函数是在该类的范畴内的全局函数，不能访问类的私有成员，只能访问类的静态成员，不需要类的实例即可调用；实际上，它就是增加了类的访问权限的全局函数：void A::func(int)；<br />
&nbsp;&nbsp;&nbsp;&nbsp;静态成员函数可以继承和覆盖,但无法是虚函数;<br />
<br />
3．只在cpp内有效的全局变量：<br />
&nbsp;&nbsp;&nbsp;&nbsp;在cpp文件的全局范围内声明：<br />
&nbsp;&nbsp;&nbsp;&nbsp;static int g_value = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;这个变量的含义是在该cpp内有效，但是其他的cpp文件不能访问这个变量；如果有两个cpp文件声明了同名的全局静态变量，那么他们实际上是独立的两个变量；<br />
&nbsp;&nbsp;&nbsp;&nbsp;如果不使用static声明全局变量：<br />
&nbsp;&nbsp;&nbsp;&nbsp;int g_value = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;那么将无法保证这个变量不被别的cpp共享，也无法保证一定能被别的cpp共享，因为要让多个cpp共享一个全局变量，应将它声明为extern（外部）的；也有可能编译会报告变量被重复定义；总之不建议这样的写法，不明确这个全局变量的用法；<br />
&nbsp;&nbsp;&nbsp;&nbsp;如果在一个头文件中声明：<br />
&nbsp;&nbsp;&nbsp;&nbsp;static int g_vaule = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;那么会为每个包含该头文件的cpp都创建一个全局变量，但他们都是独立的；所以也不建议这样的写法，一样不明确需要怎样使用这个变量，因为只是创建了一组同名而不同作用域的变量；<br />
&nbsp;&nbsp;&nbsp;&nbsp;这里顺便说一下如何声明所有cpp可共享的全局变量，在头文件里声明为extern的：<br />
&nbsp;&nbsp;&nbsp;&nbsp;extern int g_value;&nbsp;&nbsp;&nbsp;&nbsp; // 注意，不要初始化值！<br />
&nbsp;&nbsp;&nbsp;&nbsp;然后在其中任何一个包含该头文件的cpp中初始化（一次）就好：<br />
&nbsp;&nbsp;&nbsp;&nbsp;int g_value = 0;&nbsp;&nbsp;&nbsp;&nbsp; // 初始化一样不要extern修饰，因为extern也是声明性关键字；<br />
&nbsp;&nbsp;&nbsp;&nbsp;然后所有包含该头文件的cpp文件都可以用g_value这个名字访问相同的一个变量；<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
4．只在cpp内有效的全局函数：<br />
&nbsp;&nbsp;&nbsp;&nbsp;在cpp内声明：<br />
&nbsp;&nbsp;&nbsp;&nbsp;static void func();<br />
&nbsp;&nbsp;&nbsp;&nbsp;函数的实现不需要static修饰，那么这个函数只可在本cpp内使用，不会同其他cpp中的同名函数引起冲突；道理和如果不使用static会引起的问题和第3点一样；不要在头文件中声明static的全局函数，不要在cpp内声明非static的全局函数，如果你要在多个cpp中复用该函数，就把它的声明提到头文件里去，否则在cpp内部声明需要加上static修饰；在C语言中这点由为重要！<br />
</font></div>
<div><strong>另外：</strong>&nbsp;<br />
<font style="font-size: 12px" color="#9999ff">前一阵子在一段程序中用到了关键字static，就是静态类成员，当时的情况是所有对象都需要访问一个全局对象，所以自然就想到了静态数据成员，静态数据成员被当作该类的全局对象，它对每个类类型只有一份拷贝，该类所有对象共享访问。<br />
<br />
&nbsp; 那么它同全局变量相比有什么优势呢？<br />
一是静态数据成员不会与程序中的其他全局名字冲突，因为它在类中包含着。<br />
二是静态数据成员可以实现数据隐藏，它可以是private成员。<br />
<br />
需要注意的是静态数据成员需要在类外进行初始化，但整形的const静态数据成员可以在类中用常量初始化。如我们定义一个类A：<br />
<br />
class A<br />
{<br />
&nbsp;&nbsp;&nbsp; ........<br />
private:<br />
&nbsp;&nbsp;&nbsp; static double_a;<br />
&nbsp;&nbsp;&nbsp; static const int _b = 10;&nbsp;&nbsp; &nbsp;&nbsp; //对整形的const静态数据成员初始化<br />
};<br />
那么我们对它的样子就应该是这样：<br />
double A::_a = 0;<br />
const int static _b;&nbsp;&nbsp; &nbsp;&nbsp; //但它必须在类体之外进行定义<br />
</font></div>
<div>
<h4 class="TextColor1" id="subjcns!66DEE2BEDF5C559C!132" style="margin-bottom: 0px"><font style="font-size: 12px" color="#9999ff">java Static 用法</font></h4>
<div class="bvMsg" id="msgcns!66DEE2BEDF5C559C!132" style="font-size: 10pt; color: #3366ff">
<div>有时你希望定义一个类成员，使它的使用完全独立于该类的任何对象。通常情况下，类成员必须通过它的类的对象访问，但是可以创建这样一个成员，它能够被它自己使用，而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static，它就能够在它的类的任何对象创建之前被访问，而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ，所以它被声明为static。<br />
<br />
声明为static的变量实质上就是全局变量。当声明一个对象时，并不产生static变量的拷贝，而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制：<br />
&#183;<br />
它们仅能调用其他的static 方法。<br />
&#183;<br />
它们只能访问static数据。<br />
&#183;<br />
它们不能以任何方式引用this 或super（关键字super 与继承有关，在下一章中描述）。<br />
如果你需要通过计算来初始化你的static变量，你可以声明一个static块，Static 块仅在该类被加载时执行一次。下面的例子显示的类有一个static方法，一些static变量，以及一个static 初始化块：<br />
// Demonstrate static variables，methods，and blocks.<br />
<br />
class UseStatic {<br />
static int a = 3;<br />
static int b;<br />
<br />
<br />
static void meth(int x) {<br />
System.out.println("x = " + x);<br />
System.out.println("a = " + a);<br />
System.out.println("b = " + b);<br />
<br />
<br />
}<br />
<br />
static {<br />
System.out.println("Static block initialized.");<br />
b = a * 4;<br />
<br />
<br />
}<br />
<br />
public static void main(String args[]) {<br />
meth(42);<br />
}<br />
}<br />
<br />
<br />
一旦UseStatic 类被装载，所有的static语句被运行。首先，a被设置为3，接着static 块执行(打印一条消息)，最后，b被初始化为a*4 或12。然后调用main()，main() 调用meth() ，把值42传递给x。3个println ( ) 语句引用两个static变量a和b，以及局部变量x 。<br />
<br />
注意：在一个static 方法中引用任何实例变量都是非法的。<br />
<br />
下面是该程序的输出：<br />
<br />
Static block initialized.<br />
x = 42<br />
a = 3<br />
b = 12<br />
在定义它们的类的外面，static 方法和变量能独立于任何对象而被使用。这样，你只要在类的名字后面加点号运算符即可。例如，如果你希望从类外面调用一个static方法，你可以使用下面通用的格式：<br />
<br />
classname.method( )<br />
<br />
这里，classname 是类的名字，在该类中定义static方法。可以看到，这种格式与通过对象引用变量调用非static方法的格式类似。一个static变量可以以同样的格式来访问——类名加点号运算符。这就是Java 如何实现全局功能和全局变量的一个控制版本。<br />
<br />
下面是一个例子。在main() 中，static方法callme() 和static 变量b在它们的类之外被访问。<br />
<br />
class StaticDemo {<br />
static int a = 42;<br />
static int b = 99;<br />
static void callme() {<br />
<br />
<br />
System.out.println("a = " + a);<br />
}<br />
}<br />
<br />
<br />
class StaticByName {<br />
<br />
public static void main(String args[]) {<br />
StaticDemo.callme();<br />
System.out.println("b = " + StaticDemo.b);<br />
<br />
<br />
}<br />
}<br />
<br />
下面是该程序的输出：<br />
<br />
a = 42<br />
b = 99<br />
解释的很透彻，还想补充点，就是static成员是不能被其所在class创建的实例访问的。Example: Class MyClass { public static str = "this is for test purpose"; } MyClass instanceClass = new MyClass(); Console.WriteLine(MyClass.str); // Runs well Console.WriteLine(instanceClass.str); // Error,lack of accessor</div>
<div>&nbsp;</div>
<div>通俗点的解释如下：<br />
<br />
1。如果不加static修饰的成员是对象成员，也就是归每个对象所有的。<br />
<br />
2。加static修饰的成员是类成员，就是可以由一个类直接调用，为所有对象共有的</div>
</div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/219585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-08-02 16:07 <a href="http://www.blogjava.net/jzgl-ever/articles/219585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DAO设计模式--实例</title><link>http://www.blogjava.net/jzgl-ever/articles/219493.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Fri, 01 Aug 2008 16:48:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/219493.html</guid><wfw:comment>http://www.blogjava.net/jzgl-ever/comments/219493.html</wfw:comment><comments>http://www.blogjava.net/jzgl-ever/articles/219493.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzgl-ever/comments/commentRss/219493.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzgl-ever/services/trackbacks/219493.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: DAO设计模式1: 为什么使用DAO?&nbsp;&nbsp;&nbsp;&nbsp; a: 在涉及数据库操作，以前一般使用jdbc，使用这种方法我们会发现代码和html标签同时使用，维护很困难。&nbsp;&nbsp;&nbsp;&nbsp; b：jsp文件中不应该出现任何sql包，jsp文件侧重于显示界面的。&nbsp;&nbsp;&nbsp;&nbsp; c：所有的数据库...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzgl-ever/articles/219493.html'>阅读全文</a><img src ="http://www.blogjava.net/jzgl-ever/aggbug/219493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-08-02 00:48 <a href="http://www.blogjava.net/jzgl-ever/articles/219493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于JNDI——2</title><link>http://www.blogjava.net/jzgl-ever/articles/219195.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Thu, 31 Jul 2008 16:00:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/219195.html</guid><wfw:comment>http://www.blogjava.net/jzgl-ever/comments/219195.html</wfw:comment><comments>http://www.blogjava.net/jzgl-ever/articles/219195.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzgl-ever/comments/commentRss/219195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzgl-ever/services/trackbacks/219195.html</trackback:ping><description><![CDATA[<div class="cnt"><strong>JNDI</strong>是 Java 命名与目录接口（Java Naming and Directory Interface），在J2EE规范中是重要的规范之一，不少专家认为，没有透彻理解JNDI的意义和作用，就没有真正掌握J2EE特别是EJB的知识。<br />
那么，JNDI到底起什么作用？<br />
<br />
要了解JNDI的作用，我们可以从&#8220;如果不用JNDI我们怎样做？用了JNDI后我们又将怎样做？&#8221;这个问题来探讨。<br />
<br />
<font color="#800000"><strong><font size="4">没有JNDI的做法：</font></strong></font><br />
程序员开发时，知道要开发访问MySQL数据库的应用，于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码，并通过使用适当的 JDBC URL 连接到数据库。<br />
就像以下代码这样：<br />
<pre class="displaycode"><font color="#0000ff">Connection conn=null;<br />
try {<br />
Class.forName("com.mysql.jdbc.Driver",<br />
true, Thread.currentThread().getContextClassLoader());<br />
conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&amp;password=mingyue");<br />
/* 使用conn并进行SQL操作 */<br />
......<br />
conn.close();<br />
} <br />
catch(Exception e) {<br />
e.printStackTrace();<br />
} <br />
finally {<br />
if(conn!=null) {<br />
try {<br />
conn.close();<br />
} catch(SQLException e) {}<br />
}<br />
}</font></pre>
<font color="#0000ff"><br />
</font>这是传统的做法，也是以前非Java程序员（如Delphi、VB等）常见的做法。这种做法一般在小规模的开发过程中不会产生问题，只要程序员熟悉Java语言、了解JDBC技术和MySQL，可以很快开发出相应的应用程序。<br />
<br />
<strong><font size="4">没有JNDI的做法存在的问题：</font></strong><br />
1、数据库服务器名称<font size="+0"><font color="#0000ff">MyDBServer</font></font> 、用户名和口令都可能需要改变，由此引发JDBC URL需要修改；<br />
2、数据库可能改用别的产品，如改用DB2或者Oracle，引发JDBC驱动程序包和类名需要修改；<br />
3、随着实际使用终端的增加，原配置的连接池参数可能需要调整；<br />
4、......<br />
<br />
解决办法：<br />
程序员应该不需要关心&#8220;具体的数据库后台是什么？JDBC驱动程序是什么？JDBC URL格式是什么？访问数据库的用户名和口令是什么？&#8221;等等这些问题，程序员编写的程序应该没有对 JDBC 驱动程序的引用，没有服务器名称，没有用户名称或口令 —— 甚至没有数据库池或连接管理。而是把这些问题交给J2EE容器来配置和管理，程序员只需要对这些配置和管理进行引用即可。<br />
<br />
由此，就有了JNDI。<br />
<br />
<font size="4"><strong>用了JNDI之后的做法：</strong></font><br />
首先，在在J2EE容器中配置JNDI参数，定义一个数据源，也就是JDBC引用参数，给这个数据源设置一个名称；然后，在程序中，通过数据源名称引用数据源从而访问后台数据库。<br />
具体操作如下（以JBoss为例）：<br />
1、配置数据源<br />
在JBoss的 D:\jboss420GA\docs\examples\jca 文件夹下面，有很多不同数据库引用的数据源定义模板。将其中的 mysql-ds.xml 文件Copy到你使用的服务器下，如 D:\jboss420GA\server\default\deploy。<br />
修改 mysql-ds.xml 文件的内容，使之能通过JDBC正确访问你的MySQL数据库，如下：<br />
<font color="#0000ff">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;datasources&gt;<br />
&lt;local-tx-datasource&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;jndi-name&gt;</font><font color="#0000ff">MySqlDS&lt;/jndi-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;connection-url&gt;</font><font color="#0000ff">jdbc:mysql://localhost:3306/lw&lt;/connection-url&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;driver-class&gt;</font><font color="#0000ff">com.mysql.jdbc.Driver&lt;/driver-class&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;user-name&gt;</font><font color="#0000ff">root&lt;/user-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;password&gt;</font><font color="#0000ff">rootpassword&lt;/password&gt;<br />
&lt;exception-sorter-class-name&gt;org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter&lt;/exception-sorter-class-name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;metadata&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type-mapping&gt;</font><font color="#0000ff">mySQL&lt;/type-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/metadata&gt;<br />
&lt;/local-tx-datasource&gt;<br />
&lt;/datasources&gt;</font><br />
<br />
这里，定义了一个名为MySqlDS的数据源，其参数包括JDBC的URL，驱动类名，用户名及密码等。<br />
<br />
2、在程序中引用数据源：<br />
<pre class="displaycode"><font color="#0000ff">Connection conn=null;<br />
try {<br />
Context ctx=new InitialContext();<br />
Object datasourceRef=ctx.lookup("java:<strong>MySqlDS</strong>"); //引用数据源<br />
DataSource ds=(Datasource)datasourceRef;<br />
conn=ds.getConnection();<br />
/* 使用conn进行数据库SQL操作 */<br />
......<br />
c.close();<br />
} <br />
catch(Exception e) {<br />
e.printStackTrace();<br />
} <br />
finally {<br />
if(conn!=null) {<br />
try {<br />
conn.close();<br />
} catch(SQLException e) { }<br />
}<br />
}</font></pre>
直接使用JDBC或者通过JNDI引用数据源的编程代码量相差无几，但是现在的程序可以不用关心具体JDBC参数了。<br />
在系统部署后，如果数据库的相关参数变更，只需要重新配置 mysql-ds.xml 修改其中的JDBC参数，只要保证数据源的名称不变，那么程序源代码就无需修改。<br />
<br />
由此可见，JNDI避免了程序与数据库之间的紧耦合，使应用更加易于配置、易于部署。<br />
<br />
<strong><font size="4">JNDI的扩展：</font></strong><br />
JNDI在满足了数据源配置的要求的基础上，还进一步扩充了作用：所有与系统外部的资源的引用，都可以通过JNDI定义和引用。<br />
<br />
所以，在J2EE规范中，J2EE 中的资源并不局限于 JDBC 数据源。引用的类型有很多，其中包括资源引用（已经讨论过）、环境实体和 EJB 引用。特别是 EJB 引用，它暴露了 JNDI 在 J2EE 中的另外一项关键角色：查找其他应用程序组件。<br />
<br />
EJB 的 JNDI 引用非常类似于 JDBC 资源的引用。在服务趋于转换的环境中，这是一种很有效的方法。可以对应用程序架构中所得到的所有组件进行这类配置管理，从 EJB 组件到 JMS 队列和主题，再到简单配置字符串或其他对象，这可以降低随时间的推移服务变更所产生的维护成本，同时还可以简化部署，减少集成工作。 外部资源&#8221;。 <br />
<br />
<br />
<strong><font size="4">总结：</font></strong><br />
J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现。JNDI 在 J2EE 中的角色就是&#8220;交换机&#8221; —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下，提供 JNDI 供应者的容器可以充当有限的数据存储，这样管理员就可以设置应用程序的执行属性，并让其他应用程序引用这些属性（Java 管理扩展（Java Management Extensions，JMX）也可以用作这个目的）。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层，这样组件就可以发现所需要的资源，而不用了解这些间接性。<br />
<br />
在 J2EE 中，JNDI 是把 J2EE 应用程序合在一起的粘合剂，JNDI 提供的间接寻址允许跨企业交付可伸缩的、功能强大且很灵活的应用程序。这是 J2EE 的承诺，而且经过一些计划和预先考虑，这个承诺是完全可以实现的。</div>
&nbsp;<br />
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/219195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-08-01 00:00 <a href="http://www.blogjava.net/jzgl-ever/articles/219195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于JNDI——1</title><link>http://www.blogjava.net/jzgl-ever/articles/219193.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Thu, 31 Jul 2008 15:54:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/219193.html</guid><wfw:comment>http://www.blogjava.net/jzgl-ever/comments/219193.html</wfw:comment><comments>http://www.blogjava.net/jzgl-ever/articles/219193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzgl-ever/comments/commentRss/219193.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzgl-ever/services/trackbacks/219193.html</trackback:ping><description><![CDATA[<p class="g_w_100 g_t_wrap g_t_center g_t_bold g_t_24 g_c_pdin c07" id="blogtitle_fks_084064084081082074084080083095086085087071082087081067">基于JNDI的应用开发</p>
<div class="g_blog_list">
<div class="g_t_center g_c_pdin g_p_center c07 content" id="blogtext_fks_084064084081082074084080083095086085087071082087081067" style="width: 760px">
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JNDI(The Java Naming and Directory Interface，Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来，使得我们可以用名称访问对象。目录服务是一种命名服务，在这种服务里,对象不但有名称,还有属性。</p>
<p>命名或目录服务使你可以集中存储共有信息，这一点在网络应用中是重要的，因为这使得这样的应用更协调、更容易管理。例如，可以将打印机设置存储在目录服务中，以便被与打印机有关的应用使用。</p>
<p><strong style="color: #ff6600">JNDI概述</strong> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;我们大家每天都不知不觉地使用了命名服务。例如，当你在web浏览器输入URL,http://java.sun.com时， DNS(Domain Name System,域名系统)将这个符号URL名转换成通讯标识（IP地址）。命名系统中的对象可以是DNS记录中的名称、 应用服务器中的EJB组件(Enterprise JavaBeans Component)、LDAP (Lightweight Directory Access Protocol)中的用户Profile。 </p>
<p>目录服务是命名服务的自然 扩展。两者之间的关键差别是目录服务中对象可以有属性（例如，用户有email地址），而命名服务中对象没有属性。因此，在目录服务中，你可以根据属性搜 索对象。JNDI允许你访问文件系统中的文件，定位远程RMI注册的对象，访问象LDAP这样的目录服务，定位网络上的EJB组件。 </p>
<p>对于象LDAP 客户端、应用launcher、类浏览器、网络管理实用程序，甚至地址薄这样的应用来说，JNDI是一个很好的选择。</p>
<p><strong style="color: #ff6600">JNDI架构</strong> </p>
<p>JNDI 架构提供了一组标准的独立于命名系统的API,这些API构建在与命名系统有关的驱动之上。这一层有助于将应用与实际数据源分离，因此不管应用访问的是 LDAP、RMI、DNS、还是其他的目录服务。换句话说，JNDI独立于目录服务的具体实现，只要你有目录的服务提供接口（或驱动），你就可以使用目录。</p>
<p><strong><span style="color: #ff6600"><strong>J2SE和JNDI</strong> </span></strong></p>
<p>Java 2 SDK 1.3及以上的版本包含了JNDI。对于JDK 1.1和1.2也有一个标准的扩展。Java 2 SDK 1.4.x的最新版本包括了几个增强和下面的命名/目录服务提供者： </p>
<p>LDAP (Lightweight Directory Access Protocol)服务提供者CORBA COS （Common Object Request Broker Architecture Common Object Services）命名服务提供者RMI(Java Remote Method Invocation)注册服务提供者 l DNS(Domain Name System)服务提供者。</p>
<p><span style="color: #ff6600"><strong>JNDI API</strong></span> </p>
<p>JNDI API由5个包组成： </p>
<p>Javax.naming： 包含了访问命名服务的类和接口。例如，它定义了Context接口，这是命名服务执行查询的入口。 Javax.naming.directory： 对命名包的扩充，提供了访问目录服务的类和接口。例如，它为属性增加了新的类，提供了表示目录上下文的DirContext接口，定义了检查和更新目录对 象的属性的方法。Javax.naming.event：提供了对访问命名和目录服务时的时间通知的支持。例如，定义了NamingEvent类， 这个类用来表示命名/目录服务产生的事件，定义了侦听NamingEvents的NamingListener接口。&nbsp;Javax.naming.ldap：这个包提供了对LDAP 版本3扩充的操作和控制的支持，通用包 javax.naming.directory没有包含这些操作和控制。Javax.naming.spi：这个包提供了一个方法，通过 javax.naming和有关包动态增加对访问命名和目录服务的支持。这个包是为有兴趣创建服务提供者的开发者提供的。</p>
<p>JNDI 上下文 </p>
<p>正如在前面提到的，命名服务将名称和对象联系起来。这种联系称之为绑定(binding)。一组这样的绑定称之为上下文（context）,上下文提供了解 析（即返回对象的查找操作）。其他操作包括：名称的绑定和取消绑定，列出绑定的名称。注意到一个上下文对象的名称可以绑定到有同样的命名约定的另一个上下 文对象。这称之为子上下文。例如，如果UNIX中目录/home是一个上下文，那么相对于这个目录的子目录就是子上下文?例如，/home/guests 中guests就是home的子上下文。在JNDI中，上下文用接口javax.naming.Context表示，这个接口是与命名服务交互的关键接 口。在Context(或稍后讨论的DirContext)接口中的每一个命名方法都有两种重载形式：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lookup (String name)：接受串名 l Lookup(javax.naming.Name)：接受结构名，例如，CompositeName(跨越 了多个命名系统的名称)或CompondName(单个命名系统中的名称)；它们都实现了Name接口。Compound name的一个例子是：cn= mydir,cn=Q Mahmoud,ou=People,composite name的一个例子是：cn=mydir,cn=Q Mahmoud, ou=People/myfiles/max.txt(这里，myfiles/max.txt是表示第二部分的文件名)&nbsp; Javax.naming.InitialContext是实现了Context接口的类。用这个类作为命名服务的入口。为了创建 InitialContext对象，构造器以java.util.Hashtable或者是其子类（例如，Properties）的形式设置一组属性。下面给出了一个例子： </p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 71px; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">Hashtable&nbsp;env&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Hashtable();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />factory&nbsp;env.put(Context.INITIAL_CONTEXT_FACTORY,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">com.sun.jndi.fscontext.RefFSContext</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Context&nbsp;contxt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InitialContext(env);&nbsp;</span></div>
<p><br />
INITIAL_CONTEXT_FACTORY 指定了JNDI服务提供者中工厂类（factory class）的名称。Factory负责为其服务创建适当的InitialContext对象。在上 面的代码片断中，为文件系统服务提供者指定了工厂类。</p>
<p>为了用名称从命名服务或目录中取得或解析对象，使用Context的lookup方法：Object obj=contxt.lookup(name)。Lookup方法返回一个对象，这个对象表示的是你想要找的上下文的儿子。<br />
</p>
<p>&nbsp;</p>
</div>
</div>
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/219193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-07-31 23:54 <a href="http://www.blogjava.net/jzgl-ever/articles/219193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javabean是什么和总结javabean的两种使用方式 javabean 是什么？ </title><link>http://www.blogjava.net/jzgl-ever/articles/218518.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Tue, 29 Jul 2008 11:49:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/218518.html</guid><description><![CDATA[<h1><a id="viewpost1_TitleUrl" href="http://www.blogjava.net/flysky19/articles/88180.html">javabean是什么和总结javabean的两种使用方式06-7-23</a></h1>
<div>
<div>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt">一、 javabean <span style="font-family: 宋体">是什么？</span> </p>
<p style="margin: 0cm 0cm 0pt">Javabean <span style="font-family: 宋体">就是一个类，这个类就定义一系列</span> get&lt;Name&gt; <span style="font-family: 宋体">和</span> set&lt;Name&gt; <span style="font-family: 宋体">方法。</span> So simple <span style="font-family: 宋体">！</span> </p>
<p style="margin: 0cm 0cm 0pt">Javabean <span style="font-family: 宋体">就是为了和</span> jsp <span style="font-family: 宋体">页面传数据化简交互过程而产生的。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">自己的理解：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">使用</span> javabean <span style="font-family: 宋体">和不用</span> javabean <span style="font-family: 宋体">的区别：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">一个</span> javabean <span style="font-family: 宋体">就是为</span> jsp <span style="font-family: 宋体">页面上的元素一一开辟一个空间，然后根据需要赋值、读值。而如果不用</span> javabean <span style="font-family: 宋体">，就直接使用</span> HttpServlet <span style="font-family: 宋体">的</span> request <span style="font-family: 宋体">对象：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">只在</span> jsp <span style="font-family: 宋体">页面间传递获取数据：</span> </p>
<p style="margin: 0cm 0cm 0pt">String name=req.getParameter(&#8220;name&#8221;); </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">显示数据：</span> out.println(name); </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">存数据入</span> DB <span style="font-family: 宋体">：在</span> jsp <span style="font-family: 宋体">中直接嵌入</span> java <span style="font-family: 宋体">代码，用</span> insert <span style="font-family: 宋体">语句存入。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">感觉就像当年自己毕设做的</span> asp <span style="font-family: 宋体">代码一样。</span> .asp <span style="font-family: 宋体">页面中一系列的</span> req.getParameter <span style="font-family: 宋体">代码和嵌入一大堆的</span> sql <span style="font-family: 宋体">语句，代码很乱，很难维护。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">而使用</span> javabean <span style="font-family: 宋体">之后，优势也就是</span> java <span style="font-family: 宋体">的优势：组件技术，代码重用，易于维护。（在</span> jsp <span style="font-family: 宋体">页面中数据的显示很清晰。）</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue; font-family: 宋体">具体</span> <span style="color: blue">javabean</span> <span style="color: blue; font-family: 宋体">是什么？有待查资料</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue; font-family: 宋体">解决：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue">1</span> <span style="color: blue; font-family: 宋体">）</span> <span style="color: blue"><a href="http://www.itlearner.com/article/2004/551.shtml">http://www.itlearner.com/article/2004/551.shtml</a> </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">软件组件就是指可以进行独立分离、易于重复使用的软件部分。</span> <span style="font-size: 9pt; font-family: ˎ̥">JavaBean</span> <span style="font-size: 9pt; font-family: 宋体">就是一种基于</span> <span style="font-size: 9pt; font-family: ˎ̥">Java</span> <span style="font-size: 9pt; font-family: 宋体">平台的软件组件思想。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: ˎ̥">2</span> <span style="font-size: 9pt; font-family: 宋体">）</span> <span style="font-size: 9pt; font-family: ˎ̥"><a href="http://www.chinaitpower.com/A200507/2005-07-27/170233.html">http://www.chinaitpower.com/A200507/2005-07-27/170233.html</a> </span></p>
<h2 style="margin: auto 0cm"><font face="宋体"><span style="font-size: 10.5pt; color: red">JavaBean到底是个什么东西</span> </font></h2>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-size: 10.5pt"><font face="宋体">1.</font> <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10.5pt"><font face="宋体">JavaBean与EJB<br />
(1)JavaBean与EJB规范在以下方面有共同的目标：<span style="color: blue">通过标准的设计模式推广Java程序代码</span>，提升开发过程和开发工具之间的重复运用性可携性．但是这两种规格的原始问题却是为了解决不同的问题．<br />
定义于<span style="color: blue">JavaBean组件模型</span>中的标准规范，被设计来产生可重复运用的组件，而这些组件通常被用于IDE开发工具，而且通常是可视化组件，当然并不一定是可视化组件．<br />
(2)EJB规范所定义的组件模弄,刚是用来开发服务端的Java程序,由于EJB可能执行在不同的服务器平台上,包括无图形的大型主机上,所以EJB无法使用类似AWT或SWING之类的图形化程序库.</font> </span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-size: 10.5pt"><font face="宋体">2.</font> <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10.5pt"><font face="宋体">JavaBean与类库的区别:<br />
(1)并不是所有有用的模块都必须转化成Bean．Bean主要是能被用来可视化操作去完成一些效果．<br />
(2)类库是一个提供函数操作给编程者的一个有效操作,但是并不能从可视化操作中来获益.<br />
(3)举个例子来说：提供JDBC数据库访问的API作为一个类库比作为一个bean要好，因为JDBC的核心是用一个可编程的API,并不是能够直接展现于可视化操作．然而，写一个数库库访问Bean在JDBC的顶层还是有意义的．例如，你可以写一个能定制的＂Select＂bean以助于用户去组成一个查询语句，并且程序运行时用JDBC去运行这个查询语句，并显示结果集．</font> </span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-size: 10.5pt"><font face="宋体">3.</font> <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10.5pt"><font face="宋体">在可视化编程中,可以看出,<span style="color: blue">组件是一段程序代码,通过被存为class内,<span style="color: blue">关键在程序开发工具如何发现组件的<strong>属性和事件</strong></span>.VB和Delphi都是通过某种机制来实现这点的,而Java则通过JavaBeans将可视化组件开发带进了一个更高的境界,因为一个Bean就是一个Class.针对以上的内容,<span style="color: blue">JavaBean有如下的规则</span>：</span></font> </span></p>
<p><span style="font-size: 10.5pt"><font face="宋体">(1)针对一个名为xxx的属性,你通常要写两个函数,getXxx()和setXxx().<br />
(2)你可以用get/set方式来处理boolean,可以用is来代替get.<br />
(3)Bean的一般函数不需要遵守上述的命名规则,但是需要为public.<br />
(4)对于事件,你可以使用Swing的监听器作法来处理.</font> </span></p>
<p style="margin-left: 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-size: 10.5pt"><font face="宋体">4.</font> <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 10.5pt; color: blue"><font face="宋体">JavaBean的体系结构</font> </span><span style="font-size: 10.5pt"><font face="宋体">：</font> <br />
<font face="宋体">JavaBean体系结构是第一个全面的基于组件的标准模型之一.在集成的IDE中使JavaBean在设计时可以操作.组件模型见如下图：</font> </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10.5pt"><font face="宋体">结合所查资料得到自己的体会和总结：</font> </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 10.5pt"><font face="宋体">（以后有问题都google和baidu，唉这个问题去年上J2EE课的时候，问了很多同学，包括苏老师，他们都没有很好的回答出来。）</font> </span></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><strong><span style="font-size: 10.5pt"><font face="宋体">1.</font> <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span></strong><span style="font-size: 10.5pt"><font face="宋体">javabean是一种软件组件，所谓组件也就是一个java类而已。就像一个机械零件一样，可以重复的用它来组装形成产品。但是并不是每个java类都是javabean组件。软件组件是有一定的概念和体系结构的。<strong>自己的理解是，javabean组件是定义了需要get和set方法等规则的组件，通过定义这些规则，可以实现发现组件属性和事件的机制。</strong></font> </span></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-size: 10.5pt"><font face="宋体">2.</font> <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="宋体"><span style="font-size: 10.5pt">软件组件的作用：只需编写一回，各处都可执行。</span> </font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font face="宋体"><span style="font-size: 10.5pt">对于程序员来说，最好的一点就是</span> <span style="font-size: 10.5pt; font-family: ˎ̥">JavaBean</span> <span style="font-size: 10.5pt">可以实现代码的重复利用，另外对于程序的易维护性等等也有很重大的意义。</span> </font></p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt"><span style="font-size: 10.5pt; font-family: ˎ̥"><font face="宋体">3.</font> <span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font face="宋体"><span style="font-size: 10.5pt; font-family: ˎ̥">javabean</span> <span style="font-size: 10.5pt">的特点：</span> </font></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><font face="宋体"><span style="font-size: 10.5pt; color: #333333; font-family: ˎ̥">1.</span> <span style="font-size: 10.5pt; color: #333333">执行</span> <span style="font-size: 10.5pt; color: #333333; font-family: ˎ̥">java.io.Serializable </span><span style="font-size: 10.5pt; color: #333333">接口</span> </font><span style="font-size: 10.5pt; color: #333333; font-family: ˎ̥"><br />
</span><font face="宋体"><span style="font-size: 10.5pt; color: #333333">　　</span> <span style="font-size: 10.5pt; color: #333333; font-family: ˎ̥">2.</span> <span style="font-size: 10.5pt; color: #333333">提供无参数的构造器</span> </font><span style="font-size: 10.5pt; color: #333333; font-family: ˎ̥"><br />
</span><font face="宋体"><span style="font-size: 10.5pt; color: #333333">　　</span> <span style="font-size: 10.5pt; color: #333333; font-family: ˎ̥">3.</span> <span style="font-size: 10.5pt; color: #333333">提供</span> <span style="font-size: 10.5pt; color: #333333; font-family: ˎ̥">get </span><span style="font-size: 10.5pt; color: #333333">和</span> <span style="font-size: 10.5pt; color: #333333; font-family: ˎ̥">set</span> <span style="font-size: 10.5pt; color: #333333">方法访问它的属性</span> <span style="font-size: 10.5pt; color: #333333; font-family: ˎ̥">.</span> </font></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-size: 9pt; font-family: 宋体">二、</span> javabean <span style="font-family: 宋体">的两种使用方式：（嵌入</span> java <span style="font-family: 宋体">代码方式和使用</span> jsp <span style="font-family: 宋体">标记符方式）【也就是<span style="color: blue">当作普通的类来使用</span><strong>或</strong>者在</span> <span style="color: blue">jsp</span> <span style="color: blue; font-family: 宋体">中</span> <span style="font-family: 宋体">页面处理时有特殊的<span style="color: blue">标记符处理</span>方式】</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">以下是使用</span> javabean <span style="font-family: 宋体">的每个功能的两者不同方式比较：（用了</span> javabean <span style="font-family: 宋体">只是方便一点，并且可以实现组件重用而已。）</span> </p>
<p style="margin: 0cm 0cm 0pt">a <span style="font-family: 宋体">）</span> jsp <span style="font-family: 宋体">中使用</span> javabean <span style="font-family: 宋体">的类的两种方法：（这两行代码的作用是一样的）</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">法一：</span> jsp <span style="font-family: 宋体">中使用</span> &lt;jsp:useBean&gt; <span style="font-family: 宋体">标记符访问</span> javabean <span style="font-family: 宋体">：</span> </p>
<p style="margin: 0cm 0cm 0pt">&lt;jsp:useBean id="test" class="test.TestBean" /&gt; </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">法二：</span> jsp <span style="font-family: 宋体">中嵌入</span> java <span style="font-family: 宋体">代码方式访问</span> javabean <span style="font-family: 宋体">：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">首行导入</span> javabean <span style="font-family: 宋体">：</span> </p>
<p style="margin: 0cm 0cm 0pt">&lt;%@ page import="com.javaBean.TestBean" %&gt; </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">下边就可以像在</span> java <span style="font-family: 宋体">语言中那样用了：</span> </p>
<p style="margin: 0cm 0cm 0pt">&lt;% TestBean testBean=new TestBean(); %&gt; </p>
<p style="margin: 0cm 0cm 0pt">b)jsp <span style="font-family: 宋体">页面之间传递和获取数据的两种方法：</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">获取数据：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">法一：使用属性标记符：</span> </p>
<p style="margin: 0cm 0cm 0pt">&lt;jsp:getProperty name="test" property="message" /&gt; </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">法二：直接嵌入</span> java <span style="font-family: 宋体">代码：（更简单）</span> </p>
<p style="margin: 0cm 0cm 0pt">&lt;%=testBean.getName()%&gt; </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">存数据：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">法一：使用属性标记符：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">设置单个元素值：</span> </p>
<p style="margin: 0cm 0cm 0pt">&lt;jsp:setProperty name="test" property="name" value="jcm" &nbsp;/&gt; </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">设置</span> jsp <span style="font-family: 宋体">页面中所有元素的值：</span> </p>
<p style="margin: 0cm 0cm 0pt">&lt;jsp:setProperty name="test" property="*" /&gt; </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">注：这个方法特别方便，只需要在接收数据并负责显示的</span> jsp <span style="font-family: 宋体">页面使用</span> &lt;jsp:useBean&gt; <span style="font-family: 宋体">之后加上这一行代码，所有数据就自动赋值了。然后在接下来的</span> jsp <span style="font-family: 宋体">代码中就可以使用</span> get <span style="font-family: 宋体">方法显示出数据了。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">法二：直接嵌入</span> java <span style="font-family: 宋体">代码：</span> </p>
<p style="margin: 0cm 0cm 0pt">&lt;% </p>
<p style="margin: 0cm 0cm 0pt">String name=req.getParameter(&#8220;name&#8221;); </p>
<p style="margin: 0cm 0cm 0pt">testBean.setName(name) </p>
<p style="margin: 0cm 0cm 0pt">String pwd=req.getParameter(&#8220;password&#8221;); </p>
<p style="margin: 0cm 0cm 0pt">testBean.setName(pwd) </p>
<p style="margin: 0cm 0cm 0pt">%&gt; </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">注：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">通常</span> javabean <span style="font-family: 宋体">函数中除了</span> get <span style="font-family: 宋体">和</span> set <span style="font-family: 宋体">方法外，还有一个把数据存入</span> DB <span style="font-family: 宋体">中的方法（也就是和</span> DB <span style="font-family: 宋体">连接并实现</span> insert <span style="font-family: 宋体">语句）。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue; font-family: 宋体">问题：</span> </p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">一个</span> javabean <span style="font-family: 宋体">当作一个普通的类来使用，（</span> import <span style="font-family: 宋体">类，通过</span> new <span style="font-family: 宋体">方法构造一个对象，然后通过对象调用方法），和通过</span> jsp <span style="font-family: 宋体">标记符</span> &lt;jsp:useBean&gt; <span style="font-family: 宋体">来使用有区别吗？它和普通的类有什么区别呢？</span> javabean <span style="font-family: 宋体">也可以通过普通类的使用方式来访问呀。上面总结的内容就是这样的呀。</span> </p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt">2.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">是不是只有通过标记符</span> &lt;jsp:useBean&gt; <span style="font-family: 宋体">来使用才能真正体检</span> javabean <span style="font-family: 宋体">组件的优势：自动赋值？如果不使用标记符</span> &lt;jsp:useBean&gt; <span style="font-family: 宋体">可以实现自动赋值吗？</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue; font-family: 宋体">有待实验解决。</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue; font-family: 宋体">解决：（终于明白过来了！）</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue; font-family: 宋体">参考资料：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><a href="http://www.faq-it.org/archives/jsp/52ae59e6bc6d13af9ee621213347274a.php">http://www.faq-it.org/archives/jsp/52ae59e6bc6d13af9ee621213347274a.php</a> </span></p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">关于</span> javaBean <span style="font-family: 宋体">原理性的两个问题</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">作者</span> :<a href="http://www.google.com/search?q=bdsc" target="_blank">bdsc</a> </p>
<p style="margin: 0cm 0cm 0pt"><br />
<span style="font-family: 宋体">初次接触</span> javaBean <span style="font-family: 宋体">，遇到了两个原理性的问题，没有找到确定的资料得到答案，希望在这儿能得到大家的帮助。</span> <br />
&nbsp;1 <span style="font-family: 宋体">、</span> javaBean <span style="font-family: 宋体">的</span> class <span style="font-family: 宋体">与普通</span> java <span style="font-family: 宋体">的</span> class <span style="font-family: 宋体">有什么区别？</span> javaBean <span style="font-family: 宋体">的类代码有没有明确的规定，比如一定要继承什么类？如没有那怎么说一个</span> java <span style="font-family: 宋体">的</span> class <span style="font-family: 宋体">是</span> javaBean <span style="font-family: 宋体">，或不是呢？</span> <br />
2 <span style="font-family: 宋体">、</span> javaBean <span style="font-family: 宋体">是在客户端执行还是在服务器执行呢？</span> <br />
2.1 <span style="font-family: 宋体">如果在客户端执行，那是不是在客户端一定要有</span> jvm <span style="font-family: 宋体">，并且要下载对应的</span> <br />
javaBean <span style="font-family: 宋体">的</span> class <span style="font-family: 宋体">文件？但我怎么没有在自己的系统盘中找不到相应</span> javaBean <span style="font-family: 宋体">的</span> <br />
class <span style="font-family: 宋体">文件呢？那</span> applet <span style="font-family: 宋体">也是在客户端运行，为什么要出现</span> javaBean <span style="font-family: 宋体">呢？</span> <br />
2.2 <span style="font-family: 宋体">如果在服务器执行，那</span> javaBean <span style="font-family: 宋体">是在客户端生成用户界面而产生的，那服</span> <br />
<span style="font-family: 宋体">务器端执行的代码怎么在客户端生成用户界面呢？</span> <br />
--------------------------------------------------------------- <br />
<br />
1 <span style="font-family: 宋体">、<strong>对于</strong></span> <strong>javaBean </strong><strong><span style="font-family: 宋体">于普通</span> java </strong><strong><span style="font-family: 宋体">的</span> class </strong><strong><span style="font-family: 宋体">类的分别并非很明确</span> </strong><span style="font-family: 宋体">，<span style="color: blue">主要是</span></span> <strong><span style="color: blue">javabean</span> </strong><strong><span style="color: blue; font-family: 宋体">通常在</span> <span style="color: blue">jsp</span> </strong><strong><span style="color: blue; font-family: 宋体">页面上有特殊的引用方法。</span> </strong><span style="color: blue"><br />
</span>2 <span style="font-family: 宋体">、</span> <strong>javabean </strong><strong><span style="font-family: 宋体">是在服务器端执行的。</span> javabean </strong><strong><span style="font-family: 宋体">并不直接生成用户界面（那是</span> applet </strong><strong><span style="font-family: 宋体">做的事情），而通常只做数据的组织、处理工作。然后通过</span> jsp </strong><strong><span style="font-family: 宋体">页面来生成用户的界面。</span> </strong><br />
<br />
<span style="font-family: 宋体">以上只是我个人的理解。我也希望与大家一起讨论。</span> <br />
--------------------------------------------------------------- <br />
<br />
<strong><span style="color: blue">javaBean </strong></span><strong><span style="color: blue; font-family: 宋体">是一种（符合要求的）</span> <span style="color: blue">java</span> </strong><strong><span style="color: blue; font-family: 宋体">类</span> </strong><br />
<br />
*.jsp <span style="font-family: 宋体">在服务器端编译运行，通过封装的</span> socket <span style="font-family: 宋体">（你看到的是</span> outputStream/ <span style="font-family: 宋体">名字也许不正确</span> <span style="font-family: 宋体">一类的对象）向客户（</span> webbrowser __ie/navigator) <span style="font-family: 宋体">发送普通字符流（按</span> http <span style="font-family: 宋体">协议</span> ), <span style="font-family: 宋体">这个字符流由浏览器接受，解释然后按一定的格式显示</span> <br />
--------------------------------------------------------------- <br />
<br />
1 <span style="font-family: 宋体">、</span> javaBean <span style="font-family: 宋体">的</span> class <span style="font-family: 宋体">与普通</span> java <span style="font-family: 宋体">的</span> class <span style="font-family: 宋体">有什么区别？</span> javaBean <span style="font-family: 宋体">的类代码有没有明确的规定，比如一定要继承什么类？如没有那怎么说一个</span> java <span style="font-family: 宋体">的</span> class <span style="font-family: 宋体">是</span> javaBean <span style="font-family: 宋体">，或不是呢？</span> <br />
javaBean <span style="font-family: 宋体">其实就是一个</span> JAVA <span style="font-family: 宋体">程序。可以在</span> JSP <span style="font-family: 宋体">里面调用。</span> <br />
ENterprise JavaBean <span style="font-family: 宋体">是用于构建企业应用的</span> EJB <span style="font-family: 宋体">。必须在应用服务器上面部署。</span> <br />
<br />
2 <span style="font-family: 宋体">、</span> javaBean <span style="font-family: 宋体">是在客户端执行还是在服务器执行呢？</span> <br />
javaBean <span style="font-family: 宋体">是在服务器执行，返回给客户端的只是</span> HTML <span style="font-family: 宋体">代码。</span> <br />
<span style="font-family: 宋体">如果要在客户端执行，可以用</span> APPLET <br />
--------------------------------------------------------------- <br />
<br />
<strong>sun</strong> <strong><span style="font-family: 宋体">很早提出的</span> javabean </strong><strong><span style="font-family: 宋体">的概念是解决可视的</span> application </strong><strong><span style="font-family: 宋体">的模块化提出来的，但由于</span> java </strong><strong><span style="font-family: 宋体">在客户端开发实在不怎么样，所以</span> sun </strong><strong><span style="font-family: 宋体">没有在这方面再进行，作为界面模块化开发的</span> javabean </strong><strong><span style="font-family: 宋体">实际上已经死了。（以上纯粹个人观点，欢迎批评）</span> <br />
</strong><br />
<strong><span style="font-family: 宋体">但是随着</span> web </strong><strong><span style="font-family: 宋体">应用的兴起</span> jsp </strong><strong><span style="font-family: 宋体">的出现，</span> jsp </strong><strong><span style="font-family: 宋体">需要这样的概念，功能</span> / </strong><strong><span style="font-family: 宋体">表现分开，将功能封装在一个模块中，以便实现最大化的代码复用，就又拾起这个</span> javabean </strong><strong><span style="font-family: 宋体">将它用在</span> web/jsp </strong><strong><span style="font-family: 宋体">开发上。</span> </strong><br />
<br />
<span style="font-family: 宋体">你提到的那篇文章所说的是<strong>可视化的</strong></span> <strong>javabean </strong><strong><span style="font-family: 宋体">用在</span> applet </strong><strong><span style="font-family: 宋体">里的情况</span> </strong><span style="font-family: 宋体">，以后你可以在心理分清楚（因为也许没人这样看）别人说的是那种</span> javabean <span style="font-family: 宋体">。</span> <br />
<br />
<span style="font-family: 宋体">至于具体符合什么要求，说实话我不知道（因为我个人不赞成用</span> javabean <span style="font-family: 宋体">的）</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue; font-family: 宋体">自己的总结：</span> </p>
<p style="margin: 0cm 0cm 0pt">1. javaBean <span style="font-family: 宋体">是一种（符合要求的）</span> java <span style="font-family: 宋体">类。</span> javaBean <span style="font-family: 宋体">与普通</span> java <span style="font-family: 宋体">的</span> class <span style="font-family: 宋体">类的分别并非很明确，主要是</span> javabean <span style="font-family: 宋体">通常在</span> jsp <span style="font-family: 宋体">页面上有特殊的引用方法。</span> </p>
<p style="margin: 0cm 0cm 0pt">2. <span style="font-family: 宋体">所以</span> javabean <span style="font-family: 宋体">既可以当作普通的类来使用，也可以在</span> jsp <span style="font-family: 宋体">页面上有特殊的引用方法。</span> </p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt">3.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">对于第三个问题：是不是只有通过标记符</span> &lt;jsp:useBean&gt; <span style="font-family: 宋体">来使用才能真正体检</span> javabean <span style="font-family: 宋体">组件的优势：自动赋值？如果不使用标记符</span> &lt;jsp:useBean&gt; <span style="font-family: 宋体">可以实现自动赋值吗？</span> </p>
<p style="margin: 0cm 0cm 0pt 18pt"><span style="font-family: 宋体">答：不是的。</span> Jsp <span style="font-family: 宋体">的自动赋值是指：通过</span> &lt;jsp:setProperty name=&#8221;myBean&#8221; property=&#8221;*&#8221; /&gt; <span style="font-family: 宋体">这个属性访问标记符就可以轻松实现对</span> jsp <span style="font-family: 宋体">页面上所有参数的赋值，方便一点，而如果用普通类的访问方式，需要一一获取各项值，一一调用</span> set <span style="font-family: 宋体">方法而已。比如：</span> </p>
<p style="margin: 0cm 0cm 0pt 18pt">&lt;% </p>
<p style="margin: 0cm 0cm 0pt 18pt">StuInfoBean stuInfoBean=new StuInfoBean(); </p>
<p style="margin: 0cm 0cm 0pt 18pt">String stuNo=request.getParameter("stuNo"); </p>
<p style="margin: 0cm 0cm 0pt 18pt">String stuName=request.getParameter("stuName"); </p>
<p style="margin: 0cm 0cm 0pt 18pt">stuInfoBean.setStuNo(stuNo); </p>
<p style="margin: 0cm 0cm 0pt 18pt">stuInfoBean.setStuName(stuName); </p>
<p style="margin: 0cm 0cm 0pt 18pt">%&gt; </p>
<p style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt; tab-stops: list 18.0pt">4.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">所以</span> javabean <span style="font-family: 宋体">只是一个符合必须有</span> set <span style="font-family: 宋体">和</span> get <span style="font-family: 宋体">方法，并且可以在</span> jsp <span style="font-family: 宋体">上有特殊引用方式的</span> java <span style="font-family: 宋体">类。</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt">二、 <span style="font-family: 宋体">一个例子，分别使用</span> jsp <span style="font-family: 宋体">特殊引用方式和普通类的使用方式来实现对</span> javabean <span style="font-family: 宋体">的调用：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">主要的区别在于两个地方：</span> </p>
<p style="margin: 0cm 0cm 0pt">1 <span style="font-family: 宋体">）</span> <span style="font-family: 宋体">对类的使用：</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="color: blue; font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>jsp <span style="font-family: 宋体">标记符方式：使用</span> <span style="color: blue">&lt;jsp:useBean /&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="color: blue; font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">普通类方式：</span> <span style="color: blue">&lt;%@ page import="com.javaBean.StuInfoBean" %&gt;</span> </p>
<p style="margin: 0cm 0cm 0pt">2 <span style="font-family: 宋体">）</span> <span style="color: blue; font-family: 宋体">对属性的赋值：</span> </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="color: blue; font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>jsp <span style="font-family: 宋体">标记符方式：</span> <strong><span style="color: blue">&lt;jsp:setProperty name="stuInfoBean" property="*" /&gt; </span></strong></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt"><span style="color: blue; font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">普通类方式：</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue">&lt;%</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue">StuInfoBean stuInfoBean=new StuInfoBean();</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue">String stuNo=request.getParameter("stuNo");</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue">String stuName=request.getParameter("stuName");</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue">stuInfoBean.setStuNo(stuNo);</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue">stuInfoBean.setStuName(stuName);</span> </p>
<p style="margin: 0cm 0cm 0pt"><span style="color: blue">%&gt;</span> </p>
</div>
</div>
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/218518.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-07-29 19:49 <a href="http://www.blogjava.net/jzgl-ever/articles/218518.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP+JAVABEAN+SERVLET模式的购物车实现 </title><link>http://www.blogjava.net/jzgl-ever/articles/218139.html</link><dc:creator>freedoom</dc:creator><author>freedoom</author><pubDate>Mon, 28 Jul 2008 09:54:00 GMT</pubDate><guid>http://www.blogjava.net/jzgl-ever/articles/218139.html</guid><wfw:comment>http://www.blogjava.net/jzgl-ever/comments/218139.html</wfw:comment><comments>http://www.blogjava.net/jzgl-ever/articles/218139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jzgl-ever/comments/commentRss/218139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jzgl-ever/services/trackbacks/218139.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<h3>JSP+JAVABEAN+SERVLET模式的购物车实现 </h3>
<table class="blog-content">
    <tbody>
        <tr>
            <td>
            <p>JSP+JAVABEAN+SERVLET模式的购物车实现分类： servlet&amp;jsp 1．针对实现的JSP+JAVABEAN+SERVLET模式的购物车的说明。<br />
            <br />
            （1）应用说明。<br />
            我们实现的购物车是最大程度的接近和模仿现实电子商务中的购物车。实现了以下功能：<br />
            *向购物车中添加商品。<br />
            *在购物车中展示所购商品的编号，名称，单价，数量及总价。<br />
            *改变购物车中商品的数量。<br />
            *删除购物车中的某项商品。<br />
            *计算购物车中单项商品的总价。<br />
            *计算购物车中所有商品的价格。 <br />
            *清空购物车。<br />
            <br />
            （2）界面说明。<br />
            商品列表------用于选择要购买的商品并加入购物车。<br />
            URL：<a href="http://localhost:8080/cart/goodslist.jsp" target="_blank">http://localhost:8080/cart/goodslist.jsp</a><br />
            <br />
            点击&#8220;购入&#8221;便向购物车中购入商品。<br />
            点击&#8220;察看购物车&#8221;便展示购物车中的购入商品。<br />
            <br />
            URL：<a href="http://localhost:8080/cart/viewShoppingCart_servlet" target="_blank">http://localhost:8080/cart/viewShoppingCart_servlet</a><br />
            <br />
            点击&#8220;删除&#8221;便从购物车中删除该项商品。<br />
            在文本框中输入数量便改变了该项商品的购入数量。该文本框有相关的servlet 方法以保证输入合法。<br />
            点击&#8220;清空购物车&#8221;便删除了全部购入商品。<br />
            URL：<a href="http://localhost:8080/cart/clearShoppingCart_servlet" target="_blank">http://localhost:8080/cart/clearShoppingCart_servlet</a><br />
            <br />
            可查看购物车中已经没有了商品。<br />
            <br />
            （3）代码说明。<br />
            为了实现这个Medol2的购物车我们实现了以下组件：<br />
            <br />
            JAVABEAN：<br />
            CartGoodsInf.java用于封装购物车中的单项商品的属性及GET，SET方法。具体属性有： String goodsId, String goodsName， double goodsPrice，int goodsAmount，double totalPrice。<br />
            ShoppingCart.java用于封装整个购物车的属性及业务逻辑。<br />
            具体属性有：Map shopCart 用于封装购物车中的全部商品每一项商品都以CartGoodsInf 对象的形式封装于其中。<br />
            double allGoodsPrice 用于计算全部商品的总价。<br />
            <br />
            业务逻辑的方法有： &nbsp; &nbsp; <br />
            public void addGoods (String goodsId,String goodsName,double goodsPrice,int goodsAmount)；用于添加商品。<br />
            public void deleteGoods(String goodsId)；删除商品。<br />
            public void changeAmount(String goodsId, int goodsAmount)；改变商品数量。<br />
            public Map getShopCart()；返回购物车中的全部商品。<br />
            public double getAllGoodsPrice()；返回购物车中全部商品的总价。<br />
            public void clearShoppingCart()；清空购物车。<br />
            <br />
            SERVLET：用于控制逻辑.<br />
            AddGoodsServlet.java 添加商品。<br />
            ViewShoppingCartServlet.java 察看购物车。<br />
            DeleteGoodsServlet.java 删除商品。<br />
            ChangeAmountServlet.java 改变商品数量。<br />
            ClearShoppingCartServlet.java清空购物车。<br />
            JSP：我们的JSP用于实现VIEW向用户显示相关信息，由于实现了MVC我们可以方便的改变界面，所以界面并非唯一的也并非我们的重点。<br />
            goodslist.jsp<br />
            menageshopcart.jsp<br />
            <br />
            2. 学习心得。<br />
            通过对这一个购物车的实现，我们得到了以下启示：<br />
            整个购物车的逻辑过程其实是围绕ShoppingCart.java这个类的对象展开的，全部SERVLET实现的控制逻辑都是对ShoppingCart.java 定义的业务逻辑的方法的调用。在ShoppingCart.java 中对一项商品使用CartGoodsInf.java 类的实例对商品属性进行封装，因此在一个ShoppingCart 实例中维护了多个CartGoodsInf 实例。<br />
            <br />
            对于SERVLET将ShoppingCart.java 的相关业务逻辑的方法返回的数据设置为request 对象的属性，用于JSP获取及使用，或者是执行完无返回值的方法后用RequestDispatcher requestDispatcher=request.getRequestDispatcher("/&#8230;&#8230;.");requestDispatcher.forward(request,response);语句进行转发。<br />
            在实现VIEW的JSP中只是对SERVLET通过request 对象传递的属性的提取及通过矢代子的读取及显示为网页元素。并无相关业务控制逻辑。<br />
            <br />
            我们认识到在以后进行MVC开发时应投入一定精力分析相关项目的控制逻辑，业务逻辑以及与业务逻辑相关的模型的属性（用于JAVABEAN中）。在模型相关的JAVABEAN中应尽量发现业务逻辑中用于操作的对象应具有的属性。在业务逻辑中只用于封装项目中对模型进行操作的所有方法。至于要在何时使用这些方法及应具有何种条件应放在控制器中实现。<br />
            <br />
            业务逻辑中并不指定如何使用这些方法，只用给出相关义务逻辑应具有的方法。<br />
            <br />
            总之，基本的原则是：JAVABEAN用于实现模型及业务逻辑，SERVLET用于实现控制逻辑（控制器），JSP实现试图。<br />
            <br />
            至于具体的过程要联系具体项目才能说得清楚。这里只是做一些文字上的说明。<br />
            <br />
            <br />
            源码下载地址：<a href="http://matrix.org.cn/resource/upload/article/2006_06_12_231418_jfDDwCNzAa.rar" target="_blank">http://matrix.org.cn/resource/upload/article/2006_06_12_231418_jfDDwCNzAa.rar</a><br />
            <a href="http://matrix.org.cn/resource/article/2006-06-12/JSP+JAVABEAN+SERVLET_44477.html" target="_blank">http://matrix.org.cn/resource/article/2006-06-12/JSP+JAVABEAN+SERVLET_44477.html</a><br />
            <br />
            <br />
            </p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/jzgl-ever/aggbug/218139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzgl-ever/" target="_blank">freedoom</a> 2008-07-28 17:54 <a href="http://www.blogjava.net/jzgl-ever/articles/218139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>