﻿<?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-asklxf-文章分类-J2EE</title><link>http://www.blogjava.net/asklxf/category/5516.html</link><description>A java developer's notebook.</description><language>zh-cn</language><lastBuildDate>Mon, 20 Aug 2007 22:46:09 GMT</lastBuildDate><pubDate>Mon, 20 Aug 2007 22:46:09 GMT</pubDate><ttl>60</ttl><item><title>基于Spring 2.0的2个Web应用</title><link>http://www.blogjava.net/asklxf/articles/138015.html</link><dc:creator>Xuefeng's Weblog</dc:creator><author>Xuefeng's Weblog</author><pubDate>Sun, 19 Aug 2007 22:39:00 GMT</pubDate><guid>http://www.blogjava.net/asklxf/articles/138015.html</guid><wfw:comment>http://www.blogjava.net/asklxf/comments/138015.html</wfw:comment><comments>http://www.blogjava.net/asklxf/articles/138015.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/asklxf/comments/commentRss/138015.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/asklxf/services/trackbacks/138015.html</trackback:ping><description><![CDATA[<font size=4>
<p>基于Spring 2.0的2个Web应用：</p>
<p><font size=4><u><font color=#800080>Live在线书店</font></u>：</font><a href="http://www.livebookstore.net/" target=_blank><u><font color=#800080>http://www.livebookstore.net/</font></u></a></p>
<p>这是《<a href="http://www.china-pub.com/computers/common/info.asp?id=34820" target=_blank><u><font color=#800080>Spring 2.0核心技术与最佳实践</font></u></a>》一书的完整示例，源代码在书的配套光盘中。</p>
<p><font size=4>JavaEE开发网：</font><a href="http://www.javaeedev.com/" target=_blank><u><font color=#800080>http://www.javaeedev.com/</font></u></a></p>
<p>这是基于Spring 2.0的CMS系统，包括文档，博客，论坛，公告等系统模块，源码将在网站试运行一段时间后公布。&nbsp;</p>
<p>两个架构均是完整的基于Spring 2.0的3层轻量级应用，前端采用SpringMVC，后端采用Hibernate 3，扩展性强。</p>
</font>
<img src ="http://www.blogjava.net/asklxf/aggbug/138015.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/asklxf/" target="_blank">Xuefeng's Weblog</a> 2007-08-20 06:39 <a href="http://www.blogjava.net/asklxf/articles/138015.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用WebLogic Platform构建音乐站点</title><link>http://www.blogjava.net/asklxf/articles/22203.html</link><dc:creator>Xuefeng's Weblog</dc:creator><author>Xuefeng's Weblog</author><pubDate>Fri, 02 Dec 2005 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/asklxf/articles/22203.html</guid><wfw:comment>http://www.blogjava.net/asklxf/comments/22203.html</wfw:comment><comments>http://www.blogjava.net/asklxf/articles/22203.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/asklxf/comments/commentRss/22203.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/asklxf/services/trackbacks/22203.html</trackback:ping><description><![CDATA[<P><SPAN><FONT face=Arial size=2>Orienginal URL: </FONT><A href="http://dev2dev.bea.com.cn/bbs/yuanch/ArticleShow.jsp?Id=35"><FONT face=Arial size=2>http://dev2dev.bea.com.cn/bbs/yuanch/ArticleShow.jsp?Id=35</FONT></A><BR><BR><STRONG>摘要</STRONG></SPAN></P>
<P>拥有自己的音乐站点是个不错的想法，相比传统的<SPAN>ASP</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>或</SPAN><SPAN>PHP</SPAN><SPAN>站点，我们将采用</SPAN><SPAN>J2EE</SPAN><SPAN>架构实现多层结构的，高度可扩展的站点。您将看到，采用</SPAN><SPAN>J2EE</SPAN><SPAN>技术，加上强大的</SPAN><SPAN>WebLogic</SPAN><SPAN>平台，我们能更容易的实现一个音乐站点应用，而非传统意义上的平面结构的网站。</SPAN></P>
<P><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>简介</SPAN></B><B><SPAN style="FONT-SIZE: 14pt"></SPAN></B></P>
<P>随着<SPAN>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>的快速普及，越来越多的开发人员都想编写基于</SPAN><SPAN>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>架构的分布式的企业级应用程序。为了降低开发难度，</SPAN><SPAN>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>提供的基于组件的，分层的分布式应用模式，使具有可伸缩，可扩展和易维护等优点。利用</SPAN><SPAN>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，可以快速开发、部署和管理多层结构、面向</SPAN><SPAN>Web</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>的，以服务器为中心的企业级应用。</SPAN></P>
<P>在下面的这个示例中，我们将构建一个基于<SPAN>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>的音乐站点，暂定名为</SPAN><SPAN>JetMusic</SPAN><SPAN>，计划给用户提供浏览，下载等在线服务。事实上，</SPAN><SPAN>Internet</SPAN><SPAN>上已有很多这种类型的站点，但是它们大多是传统的基于两层结构的模型，使用了混合</SPAN><SPAN>HTML</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>和</SPAN><SPAN>ASP</SPAN><SPAN>或</SPAN><SPAN>PHP</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>脚本代码的页面。</SPAN></P>
<P>尽管我们的<SPAN>JetMusic</SPAN>站点可能现在规模不大，仅仅使用<SPAN>JSP/JavaBeans/</SPAN>数据库就已经足够了，但是作为示例，我们还是打算用<SPAN>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>来实现它。借助</SPAN><SPAN>J2EE</SPAN><SPAN>的强大功能，我们能够轻易地快速创建这样一个音乐站点，并且使我们的编码量最小。更重要的是，它是完全的</SPAN><SPAN>3</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>层分布式结构，具有很强的扩展性。</SPAN></P>
<P><A name=系统设计></A><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>系统设计</SPAN></B></P>
<P>我们的站点需要对用户提供浏览，下载等服务，还要允许系统管理员能随时登陆并管理站点资源。对于我们的<SPAN>JetMusic</SPAN>站点，我们计划使用树型结构来组织分类、艺术家、专辑、歌曲，一个简单的示例图如下：</P>
<P><SPAN><IMG height=179 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152649961.jpg" width=176 border=0 v:shapes="_x0000_i1026"></SPAN></P>
<P>对用户而言，我们需要提供以下服务：</P>
<P>用户可以浏览分类、艺术家、专辑、歌曲、歌词。</P>
<P>用户可以按关键字模糊搜索歌曲，专辑，艺术家和歌词。</P>
<P>用户可以对某一首歌评分。</P>
<P>如果歌曲文件存在，用户可以下载歌曲。</P>
<P>如果歌词存在，用户可以浏览歌词。</P>
<P>为了管理站点资源，我们把使用者分为用户和管理员两类：</P>
<P>用户可以注册，更改自己的信息。</P>
<P>管理员可以创建或删除分类，艺术家，专辑，歌曲。</P>
<P>以上可以简单看作是我们分析的全部用例。我们将采用<SPAN>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>标准的三层结构模型，将系统分为表示层，逻辑层和持久层（</SPAN><SPAN>EIS</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>层就免了，因为我们并没有所谓的“遗产系统”），下面将详细讨论设计方案。</SPAN></P>
<P>通常，设计总是从域模型开始的，我们通过对用例的分析，可以建立以下实体：</P>
<P>分类对象（<SPAN>Category</SPAN>），艺术家对象（<SPAN>Artist</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>），专辑对象（</SPAN><SPAN>Album</SPAN><SPAN>），歌曲对象（</SPAN><SPAN>Song</SPAN><SPAN>），这些对象是简单的一对多关系。我们把这些对象都一一映射为实体</SPAN><SPAN>Bean</SPAN><SPAN>，由于这些对象最终映射为数据库表，这些表的结构相对简单，因此我们选择</SPAN><SPAN>CMP</SPAN><SPAN>实现。相比</SPAN><SPAN>BMP</SPAN><SPAN>，</SPAN><SPAN>CMP</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>不仅大大简化了数据库访问的代码，而且由容器管理的特性通常使</SPAN><SPAN>CMP</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>比</SPAN><SPAN>BMP</SPAN><SPAN>具有更好的缓冲性能和可移植性。</SPAN></P>
<P>在逻辑层，毫无疑问，会话<SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>将是最好的选择。如果不使用</SPAN><SPAN>Session Bean</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，您可能需要自行处理多线程同步，安全，事务处理等问题，这将是一项复杂而艰巨的工程。由于容器自动为我们处理了大量的如事务，安全，多线程等底层服务操作，我们就只需关注于我们的业务逻辑。此外，对于异步调用，消息驱动</SPAN><SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>是不错的选择。</SPAN></P>
<P>在表示层，我们用<SPAN>JSP</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>页面将界面呈现给用户。有过网站开发经验的开发人员一定有过这样的深刻感受，</SPAN><SPAN>HTML</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>元素和</SPAN><SPAN>JSP</SPAN><SPAN>代码混合在一起是多么巨大的灾难，它将导致可维护性随着页面数量的增加呈指数增长。</SPAN></P>
<P>开源的<SPAN>Struts</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>模型通过</SPAN><SPAN>MVC</SPAN><SPAN>架构大大简化了</SPAN><SPAN>JSP</SPAN><SPAN>前端的开发。但是，使用</SPAN><SPAN>Struts</SPAN><SPAN>还要求开发人员对于</SPAN><SPAN>Struts</SPAN><SPAN>底层结构和配置文件有相当的了解。</SPAN><SPAN>WebLogic</SPAN><SPAN>提供的</SPAN><SPAN>Java Page Flow</SPAN><SPAN>技术完全基于</SPAN><SPAN>Struts</SPAN><SPAN>技术，并且隐藏了更多的底层细节，提供了图形化的页面导航功能，大大简化了</SPAN><SPAN>Web</SPAN><SPAN>层的开发。此外，大量的</SPAN><SPAN>NetUI</SPAN><SPAN>标签和数据绑定技术，使您的</SPAN><SPAN>JSP</SPAN><SPAN>页面立刻具备了可视化开发的功能。我们将采用各种实现方式来编写</SPAN><SPAN>Web</SPAN><SPAN>层。</SPAN></P>
<P><A name=开发环境></A><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>开发环境</SPAN></B></P>
<P><SPAN>J2EE</SPAN><SPAN>仅仅是一个标准，众多的厂商提供了相应的实现平台，其中，</SPAN><SPAN>BEA</SPAN><SPAN>的</SPAN><SPAN>WebLogic</SPAN><SPAN>无疑是最优秀的</SPAN><SPAN>J2EE</SPAN><SPAN>平台之一。我们将把</SPAN><SPAN>JetMusic</SPAN><SPAN>站点建立在</SPAN><SPAN>WebLogic Platform 8.1</SPAN><SPAN>平台上，并采用</SPAN><SPAN>WebLogic Workshop 8.1</SPAN><SPAN>这个强大的</SPAN><SPAN>IDE</SPAN><SPAN>作为开发工具。你可以免费从</SPAN><SPAN>BEA</SPAN><SPAN>官方站点上下载非商业目的开发使用的</SPAN><SPAN>5-IP</SPAN><SPAN>限制版本的</SPAN><SPAN>WebLogic Platform 8.1</SPAN><SPAN>：</SPAN></P>
<P><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: " &quot;Courier New&quot;><A href="http://commerce.bea.com/showproduct.jsp?family=WLP&amp;major=8.1&amp;minor=2"><FONT color=#004080>http://commerce.bea.com/showproduct.jsp?family=WLP&amp;major=8.1&amp;minor=2</FONT></A></SPAN></P>
<P>我们的站点资源除了歌曲文件外，将全部存放在关系数据库中。选用<SPAN>MS SQL Server 2000</SPAN>的原因是这个数据库对硬件资源的消耗要比<SPAN>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>少，适合于我们作开发使用。如果您计划采用</SPAN><SPAN>Oracle</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>或其他数据库，没有关系，您只需修改实体</SPAN><SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>的相关部署配置，即可立刻移植到其他厂商的数据库上。</SPAN></P>
<P>要流畅地运行<SPAN>WebLogic Server 8.1</SPAN>和<SPAN>WebLogic Workshop 8.1</SPAN>，您至少需要<SPAN>512M</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>内存，如果仅有</SPAN><SPAN>256M</SPAN><SPAN>内存，您可以修改</SPAN><SPAN>WebLogic</SPAN><SPAN>的启动参数，指定较小的</SPAN><SPAN>JVM</SPAN><SPAN>内存（如</SPAN><SPAN>128M</SPAN><SPAN>）。</SPAN></P>
<P><B><SPAN>配置数据库：</SPAN><SPAN></SPAN></B></P>
<P>启动<SPAN>MS SQL Server</SPAN>，打开企业管理器，新建数据库<SPAN>music</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，请注意我们并不需要建立任何表，稍候部署我们的应用时</SPAN><SPAN>WebLogic</SPAN>会自动创建相应的表。</P>
<P><B><SPAN>配置</SPAN><SPAN>WebLogic</SPAN></B><B>：<SPAN></SPAN></B></P>
<P>新建一个名为“<SPAN>music</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>”的配置，并选择模板</SPAN><SPAN>Basic Weblogic Workshop Domain</SPAN>，以便能使用<SPAN>Workshop</SPAN>进行开发和调试。</P>
<P>启动<SPAN>WebLogic</SPAN>，打开浏览器，输入<SPAN><A href="http://localhost:7001/console"><FONT color=#004080>http://localhost:7001/console</FONT></A></SPAN><SPAN>，登陆，在左边找到</SPAN><SPAN>music</SPAN><SPAN>→</SPAN><SPAN>Services</SPAN><SPAN>→</SPAN><SPAN>JDBC</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>→</SPAN><SPAN>Connection Pools</SPAN>，新建一个连接池，选择数据库“<SPAN>MS SQL Server</SPAN>”，驱动程序“<SPAN>BEAs MS SQL Server Driver(Type 4) Versions:7.0, 2000</SPAN><SPAN>”，填好数据库名，用户名，口令等，测试无误后部署。然后选择左边的</SPAN><SPAN>music</SPAN><SPAN>→</SPAN><SPAN>Services</SPAN><SPAN>→</SPAN><SPAN>JDBC</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>→</SPAN><SPAN>Data Sources</SPAN>，新建一个名为“<SPAN style="COLOR: blue">jdbc/MusicDataSource</SPAN><SPAN>”的数据源，使用刚才建好的连接池，部署。</SPAN></P>
<P>启动<SPAN>Workshop</SPAN>，选择<SPAN>New</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>→</SPAN><SPAN>Application</SPAN><SPAN>新建应用程序</SPAN><SPAN>Music</SPAN><SPAN>，然后选择</SPAN><SPAN>Browse</SPAN><SPAN>，找到服务器配置文件“</SPAN><SPAN>&lt;BEA</SPAN><SPAN>安装目录</SPAN><SPAN>&gt;user_projectsdomainsmusicconfig.xml</SPAN><SPAN>”，确定后创建一个应用程序。</SPAN></P>
<P>为了有效组织和管理代码，我们把所有的实体<SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>均放在包</SPAN><SPAN>music.ejb.db</SPAN><SPAN>中，所有的会话</SPAN><SPAN>Bean</SPAN><SPAN>放在</SPAN><SPAN>music.ejb</SPAN><SPAN>中，另外建一个</SPAN><SPAN>music.shared</SPAN><SPAN>包用于存放会话</SPAN><SPAN>Bean</SPAN><SPAN>和表示层</SPAN><SPAN>JSP/Servlets</SPAN><SPAN>共享的</SPAN><SPAN>Java</SPAN><SPAN>类，包括各种自定义异常，传递的值对象等。</SPAN></P>
<P>我们将创建<SPAN>3</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>个工程，分别为</SPAN><SPAN>MusicEjb Project</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，实现持久层和逻辑层；</SPAN><SPAN>MusicClient Project</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，用于在命令行测试和调试逻辑层和持久层；</SPAN><SPAN>MusicWeb Project</SPAN>，用于实现表示层。创建好的结构在<SPAN>Workshop</SPAN>中显示如下：</P>
<P><SPAN><IMG height=381 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152650392.jpg" width=225 border=0 v:shapes="_x0000_i1025"> </SPAN></P>
<P><A name=设计持久层></A><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>设计持久层</SPAN></B></P>
<P>我们首先开始设计持久层，通过前面的分析，我们抽象出以下实体<SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>：</SPAN></P>
<P><SPAN>Category</SPAN><SPAN>实体</SPAN><SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>：代表一个分类；</SPAN></P>
<P><SPAN>Artist</SPAN><SPAN>实体</SPAN><SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>：代表一个艺术家；</SPAN></P>
<P><SPAN>Album</SPAN><SPAN>实体</SPAN><SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>：代表一个专辑；</SPAN></P>
<P><SPAN>Song</SPAN><SPAN>实体</SPAN><SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>：代表一首歌曲；</SPAN></P>
<P><SPAN>Account</SPAN><SPAN>实体</SPAN><SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>：代表一个用户。</SPAN></P>
<P>对应的<SPAN>CMR</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>关系为：</SPAN></P>
<P><SPAN>Category-Artist</SPAN><SPAN>：一对多</SPAN></P>
<P><SPAN>Artist-Album</SPAN><SPAN>：一对多</SPAN></P>
<P><SPAN>Album-Song</SPAN><SPAN>：一对多</SPAN></P>
<P>先建立一个简单的名为<SPAN>Category</SPAN>的<SPAN>Entity Bean</SPAN>：展开左侧<SPAN>MusicEjb</SPAN>→<SPAN>music</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>→</SPAN><SPAN>ejb</SPAN><SPAN>→</SPAN><SPAN>db</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>，选择菜单</SPAN><SPAN>File</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>→</SPAN><SPAN>New</SPAN><SPAN>→</SPAN><SPAN>Entity Bean</SPAN><SPAN>，在设计视图中分别添加</SPAN><SPAN>3</SPAN><SPAN>个</SPAN><SPAN>CMP</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>字段，一个</SPAN><SPAN>Create</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>方法，一个</SPAN><SPAN>Finder</SPAN><SPAN>方法，另外我们还添加了一个</SPAN><SPAN>copy</SPAN><SPAN>方法用于返回一个</SPAN><SPAN>Value Object</SPAN><SPAN>对象：</SPAN></P>
<P><SPAN><IMG height=471 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152650530.jpg" width=438 border=0 v:shapes="_x0000_i1027"> </SPAN></P>
<P>然后在右边的属性面板中为<SPAN>Entity Bean</SPAN>设置属性，在这里我们的主要设置如下：</P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>data-source-name: jdbc/MusicDataSource</SPAN></B></P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>default-transaction: Required</SPAN></B></P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>table-name: category</SPAN></B></P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>Local EJB</SPAN></B></P>
<P><B><SPAN>&nbsp; </SPAN>JNDI name: ejb/Category</B></P>
<P><B><SPAN>&nbsp; </SPAN>Bean class name: CategoryLocal</B></P>
<P><B><SPAN>&nbsp; </SPAN>Home class name: CategoryLocalHome</B></P>
<P>为了实现自增主键的功能，需要指定一个<SPAN>Ejb-Gen</SPAN>属性：点击右键弹出菜单，选择<SPAN>Insert EJB Gentag</SPAN>→<SPAN>automatic-key-generation</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，指定字段名</SPAN><SPAN>id</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，数据库类型</SPAN><SPAN>SQLServer2000</SPAN><SPAN>即可。</SPAN></P>
<P>为了提高<SPAN>CMP</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>的性能，我们全部采用本地接口，如果某些</SPAN><SPAN>CMP</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>字段需要提供只读接口（如</SPAN><SPAN>id,username</SPAN><SPAN>字段），只需右键点击字段名，然后选择“</SPAN><SPAN>Read Only</SPAN><SPAN>”。</SPAN></P>
<P>按相同方法建立<SPAN>Artist.ejb</SPAN>，<SPAN>Album.ejb</SPAN>，<SPAN>Song.ejb</SPAN>，<SPAN>Account.ejb</SPAN>，然后创建<SPAN>CMR</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>关系：</SPAN></P>
<P>打开<SPAN>Category.ejb</SPAN>的设计视图，点击右键，在弹出菜单里选择<SPAN>Add Relation</SPAN>，建立一对多的<SPAN>CMR</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>关系：</SPAN></P>
<P><SPAN><IMG height=398 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152650500.jpg" width=530 border=0 v:shapes="_x0000_i1028"> </SPAN></P>
<P>类似的，创建<SPAN>Artist-Album</SPAN>和<SPAN>Album-Song</SPAN>的一对多关系。</P>
<P>注意我们还设计了一个<SPAN>AccountUtil</SPAN>类，使用正则表达验证用户信息的有效性，比如用户名，口令是否符合要求。</P>
<P><A name=设计逻辑层></A><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>设计逻辑层</SPAN></B></P>
<P>首先我们设计一个<SPAN>JndiHelper</SPAN>类，用于封装查找实体<SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>的</SPAN><SPAN>JNDI</SPAN><SPAN>操作，同时还对实体</SPAN><SPAN>Bean</SPAN><SPAN>的</SPAN><SPAN>Home</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>接口缓存。</SPAN></P>
<P>我们把所有的逻辑封装到<SPAN>3</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>个</SPAN><SPAN>Session Bean</SPAN><SPAN>中：</SPAN></P>
<P><SPAN>MusicView.ejb</SPAN><SPAN>：用于封装浏览，下载等页面操作。</SPAN></P>
<P><SPAN>AccountManage.ejb</SPAN><SPAN>：用于封装注册，登陆等账号操作。</SPAN></P>
<P><SPAN>MusicManage.ejb</SPAN><SPAN>：用于封装管理员的各项操作。</SPAN></P>
<P>首先建立<SPAN>MusicView.ejb</SPAN>，我们一共设计了以下业务方法：</P>
<P><SPAN><IMG height=411 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152650782.jpg" width=509 border=0 v:shapes="_x0000_i1029"> </SPAN></P>
<P>所有的方法均为远程方法，这样<SPAN>Web</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>层和</SPAN><SPAN>EJB</SPAN><SPAN>就可分开部署。当然你也可以将会话</SPAN><SPAN>Bean</SPAN><SPAN>接口全部改成本地接口以进一步提高性能。方法看上去虽多，但逻辑相当简单，例如，</SPAN><SPAN>getAlbums(int artistId)</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>方法：</SPAN></P>
<P><SPAN><IMG height=439 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152650849.jpg" width=509 border=0 v:shapes="_x0000_i1030"> </SPAN></P>
<P>基本逻辑大致为：</P>
<P>查找相应的实体<SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，获得实体</SPAN><SPAN>Bean</SPAN><SPAN>对应</SPAN><SPAN>CMR</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>关系的集合，在将其包装成值对象返回给客户端。你可以看到，由于没有</SPAN><SPAN>JDBC</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>操作，代码被大大的简化了，并且由于容器处理了底层数据库连接，使我们的代码更加健壮。</SPAN></P>
<P>在这里我们采用了值对象（<SPAN>Value Object</SPAN>）模式，用于在<SPAN>Web</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>层和逻辑层之间传送对象。你可以很容易的写出每个实体</SPAN><SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>对应的值对象，比如</SPAN><SPAN>Album.ejb</SPAN><SPAN>对应的值对象</SPAN><SPAN>AlbumVO</SPAN><SPAN>。</SPAN></P>
<P>然后创建<SPAN>AccountManage.ejb</SPAN>，用于处理用户帐号相关的操作：</P>
<P><SPAN><IMG height=253 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152651429.jpg" width=426 border=0 v:shapes="_x0000_i1031"> </SPAN></P>
<P>如果要提高系统的安全性，建议使用<SPAN>MD5</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>码存储用户口令，</SPAN><SPAN>MD5</SPAN><SPAN>算法是一个单向函数，即使获得数据库表也无法得知用户口令。如果要进一步防止使用预先算好的</SPAN><SPAN>MD5</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>码攻击，还可以采用加盐处理。为了简单起见，我们直接将用户口令存储在数据库表的字段中，因此</SPAN><SPAN>login(String username, String password)</SPAN><SPAN>看起来像这样：</SPAN></P>
<P><SPAN><IMG height=371 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152651157.jpg" width=580 border=0 v:shapes="_x0000_i1032"> </SPAN></P>
<P>如果找到了相应的实体<SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>（即数据库表中存在此记录），再判断</SPAN><SPAN>password</SPAN>字段，如果相符，验证通过，否则，抛出一个自定义的<SPAN>UnauthorizedException</SPAN>异常。这里也不涉及<SPAN>JDBC</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>操作，因此代码非常简单。</SPAN></P>
<P>搜索功能是通过实体<SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>的</SPAN><SPAN>Finder</SPAN><SPAN>方法实现的，标准的</SPAN><SPAN>EJB QL 2.0</SPAN><SPAN>并不支持带参数的</SPAN><SPAN>like</SPAN><SPAN>关键字（在</SPAN><SPAN>SUN J2EE SDK</SPAN><SPAN>中编译就会失败），幸好</SPAN><SPAN>WebLogic</SPAN><SPAN>对其进行了扩充。为了实现模糊搜索，这里我们定义了</SPAN><SPAN>Song.ejb</SPAN><SPAN>的一个</SPAN><SPAN>Finder</SPAN><SPAN>方法</SPAN><SPAN>findByTitle(String title)</SPAN><SPAN>，对应的</SPAN><SPAN>EJB QL</SPAN><SPAN>为“</SPAN><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>SELECT OBJECT(o) FROM Song AS o WHERE lower(o.title) LIKE concat(%, concat(?1, %))</SPAN></B><SPAN>”。如果使用其他厂商的服务器，你需要查看厂商的</SPAN><SPAN>EJB QL</SPAN><SPAN>文档然后作相应的修改。</SPAN></P>
<P>最后一个是<SPAN>MusicManage.ejb</SPAN>，用于管理员创建、删除信息：</P>
<P><SPAN><IMG height=362 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152651818.jpg" width=482 border=0 v:shapes="_x0000_i1033"> </SPAN></P>
<P>创建和删除实体<SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>的代码都非常简单，唯一需要的就是捕获相应的异常，我们在</SPAN><SPAN>deleteSong(int songId)</SPAN>中将<SPAN>RemoveException</SPAN>包装成更一般的<SPAN>ApplicationException</SPAN>异常返回客户端：</P>
<P><SPAN><IMG height=303 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152651299.jpg" width=584 border=0 v:shapes="_x0000_i1034"> </SPAN></P>
<P>需要特别注意的是，对存在一对多<SPAN>CMR</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>关系的实体</SPAN><SPAN>Bean</SPAN><SPAN>，如果指定了级联删除，当删除“一”时，对应的“多”会被自动删除，因此执行删除前要异常小心，至少应该提示用户，或者，只允许删除“多”为空的实体</SPAN><SPAN>Bean</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，比如删除</SPAN><SPAN>Artist.ejb</SPAN><SPAN>时：</SPAN></P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>home = JndiHelper.getArtistLocalHome();</SPAN></B></P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>artist = home.findByPrimaryKey(new Integer(artistId));</SPAN></B></P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>Collection c = artist.getAlbums();</SPAN></B></P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>if(c.size()&gt;0) throw new Exception("Cannot delete unless it is empty.");</SPAN></B></P>
<P>为了安全起见，我们在删除时不允许删除“多”一方不为空的实体。</P>
<P>编译，部署。<SPAN>OK</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，小功告成！现在我们可以测试一下我们的逻辑层。一个好的办法是使用</SPAN><SPAN>JUnit</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>测试，但是似乎</SPAN><SPAN>Workshop</SPAN><SPAN>尚未集成</SPAN><SPAN>JUnit</SPAN><SPAN>。没关系，我们自己写一个客户端</SPAN><SPAN>Java</SPAN><SPAN>程序来测试逻辑层。</SPAN></P>
<P>在<SPAN>MusicClientProject</SPAN>中建立<SPAN>Client.Java</SPAN>类，放在包<SPAN>music.client</SPAN>中。为了测试，我们首先在数据库中创建一些测试数据：</P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>void initData () throws Exception { … }</SPAN></B></P>
<P>然后，我们写一个<SPAN>testGetCategories()</SPAN>方法：</P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>void testGetCategoris(int parentCategoryId) throws Exception { … }</SPAN></B></P>
<P>类似的，我们对每个业务逻辑都写一个相应的测试方法，直到每一个业务逻辑都正确无误。在一个独立的<SPAN>Java</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>客户端程序中测试</SPAN><SPAN>EJB</SPAN><SPAN>要比在</SPAN><SPAN>JSP</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>中方便得多，你可以方便地设置断点，跟踪以便查看变量，随时使用</SPAN><SPAN>System.out.println()</SPAN>在控制台输出任何调试信息。</P>
<P><A name=设计表示层></A><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>设计表示层</SPAN></B></P>
<P>表示层用于向用户提供系统交互的接口。采用<SPAN>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>的系统表示层一般都是瘦客户端，使用</SPAN><SPAN>JSP/Servlets</SPAN>技术，使用户能通过浏览器使用系统。在<SPAN>JetMusic</SPAN>站点中，我们将考虑以下几种实现方式：</P>
<P><B><SPAN>1</SPAN></B><B>．在<SPAN>JSP</SPAN></B><B><SPAN>中使用业务代表模式：</SPAN><SPAN></SPAN></B></P>
<P>通常，在<SPAN>JSP/Servlets</SPAN>中直接调用<SPAN>EJB</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>并不是一个好主意，这需要大量的查找</SPAN><SPAN>JNDI</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>的代码，业务代表（</SPAN><SPAN>Business Delegate</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>）是一个不错的模式，它封装了所有的</SPAN><SPAN>EJB</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>查找和调用，使得表示层和逻辑层的耦合度能降到最低，并且还可以进行一些缓存。</SPAN></P>
<P>由于业务代表类将<SPAN>Web</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>和</SPAN><SPAN>EJB</SPAN><SPAN>隔开了，因此，对于</SPAN><SPAN>JSP/Servlets</SPAN><SPAN>来说，它们根本就不知道</SPAN><SPAN>EJB</SPAN><SPAN>的存在。这将带来另一个好处：只要在设计时仔细定义了业务代表的接口，</SPAN><SPAN>Web</SPAN><SPAN>层和</SPAN><SPAN>EJB</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>的开发人员立即可以同时开发各自的模块，</SPAN><SPAN>Web</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>层的开发人员可以首先对业务代表类进行硬编码，以便返回他们希望的结果。等到</SPAN><SPAN>EJB</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>开发完成后，再用实际的</SPAN><SPAN>EJB</SPAN><SPAN>调用替换即可。</SPAN></P>
<P>为了封装对<SPAN>MusicView.ejb</SPAN>的所有调用，我们建立一个<SPAN>MusicViewBD</SPAN>的业务代表类：</P>
<P><SPAN><IMG height=390 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152651305.jpg" width=564 border=0 v:shapes="_x0000_i1035"> </SPAN></P>
<P>在<SPAN>index.jsp</SPAN>中即可使用<SPAN>MusicViewBD</SPAN>以便输出<SPAN>Categories</SPAN>：</P>
<P><SPAN><IMG height=225 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152651293.jpg" width=564 border=0 v:shapes="_x0000_i1036"> </SPAN></P>
<P><B><SPAN>2</SPAN></B><B>．使用<SPAN>NetUI</SPAN></B><B><SPAN>标签实现数据绑定</SPAN><SPAN></SPAN></B></P>
<P><SPAN>WebLogic</SPAN><SPAN>提供了大量的</SPAN><SPAN>NetUI</SPAN><SPAN>标签，能够方便地在</SPAN><SPAN>JSP</SPAN><SPAN>中绑定数据。我们下一步将创建一个</SPAN><SPAN>viewCa.jsp</SPAN><SPAN>页面，此页面向用户展示分类。</SPAN></P>
<P>我们首先创建一个<SPAN>EJB Control</SPAN>。<SPAN>WebLogic</SPAN>向我们提供的<SPAN>EJB Control</SPAN>完全封装了<SPAN>EJB</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>调用。利用</SPAN><SPAN>EJB Control</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，我们不用写一行代码，立刻就可以在</SPAN><SPAN>JSP</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>中调用</SPAN><SPAN>EJB</SPAN><SPAN>。这个</SPAN><SPAN>EJB Control</SPAN><SPAN>可以看作是一个用标签封装的业务代表模式的应用。</SPAN></P>
<P>在<SPAN>MusicWeb</SPAN>工程下新建文件夹<SPAN>music.control</SPAN>，用于存放<SPAN>EJB Control</SPAN>。新建<SPAN>EJB Control</SPAN>，命名为<SPAN>CallMusicView</SPAN>：</P>
<P><SPAN><IMG height=351 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152652567.jpg" width=480 border=0 v:shapes="_x0000_i1037"> </SPAN></P>
<P>选择“<SPAN>Browse application EJBs…</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>”，直接找到“</SPAN><SPAN>MusicView (remote jndi)</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>”，</SPAN><SPAN>Workshop</SPAN>会自动填好相应的接口，点击“<SPAN>create</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>”即创建成功。</SPAN></P>
<P>当我们获得了从<SPAN>EJB</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>返回的</SPAN><SPAN>Collection</SPAN><SPAN>后，可以使用</SPAN><SPAN>Repeater</SPAN><SPAN>标签显示这个复杂的数据，在这里我们不打算进一步讨论</SPAN><SPAN>Repeater</SPAN><SPAN>标签的细节，关于如何使用</SPAN><SPAN>Repeater</SPAN><SPAN>标签，可以参考下面的文章：</SPAN></P>
<P><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: " &quot;Courier New&quot;><A href="http://dev2dev.bea.com/products/wlworkshop81/articles/repeater.jsp"><FONT color=#004080>http://dev2dev.bea.com/products/wlworkshop81/articles/repeater.jsp</FONT></A></SPAN></P>
<P>以下<SPAN>JSP</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>页面显示了如何使用</SPAN><SPAN>EJB Control</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>调用</SPAN><SPAN>EJB</SPAN><SPAN>的</SPAN><SPAN>getCategories</SPAN><SPAN>远程方法，并将返回的</SPAN><SPAN>Collection</SPAN><SPAN>结果集用</SPAN><SPAN>Repeater</SPAN><SPAN>标签以超链接的形式显示出来，这里还用到了一个</SPAN><SPAN>netui:anchor</SPAN><SPAN>标签：</SPAN></P>
<P><SPAN><IMG height=292 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152652503.jpg" width=563 border=0 v:shapes="_x0000_i1038"> </SPAN></P>
<P>第一个<SPAN>DeclareControl</SPAN>标签申明了一个<SPAN>Control</SPAN>，名为<SPAN>ctrlMusicView</SPAN>，第二个<SPAN>CallControl</SPAN>标签调用控件<SPAN>ctrlMusicView</SPAN>的一个方法<SPAN>getCategories</SPAN>并附带参数<SPAN>MethodParameter</SPAN>，参数值由<SPAN>URL</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>的</SPAN><SPAN>id</SPAN><SPAN>确定，然后将结果放在变量</SPAN><SPAN>categories</SPAN><SPAN>中。</SPAN><SPAN>Repeater</SPAN><SPAN>标签从</SPAN><SPAN>categories</SPAN><SPAN>取得数据源，然后循环显示集合中的每个元素。</SPAN></P>
<P>对应的源代码看起来是这样：</P>
<P><SPAN><IMG height=490 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152652103.jpg" width=589 border=0 v:shapes="_x0000_i1039"> </SPAN></P>
<P>运行结果在<SPAN>IE</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>中显示如下：</SPAN></P>
<P><SPAN><IMG height=232 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152652287.jpg" width=265 border=0 v:shapes="_x0000_i1040"> </SPAN></P>
<P>类似地，您可以自己“画”出列艺术家，列专辑的页面，然后将它们组合起来。这些<SPAN>JSP</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>页面仅仅是通过简单的鼠标拖放和属性设置完成的，真是太棒了！</SPAN></P>
<P><B><SPAN>3</SPAN></B><B>．使用<SPAN>Java Page Flow</SPAN></B></P>
<P><SPAN>Java Page Flow</SPAN><SPAN>是完全基于开源的</SPAN><SPAN>Struts</SPAN><SPAN>模型，但提供了更强的易用性和自动化的状态管理，支持数据绑定，拥有更强大的动作和异常处理。下一步，我们将创建一个名为</SPAN><SPAN>FileUploadController</SPAN>的页面流，完成一个文件上传的功能。</P>
<P>新建页面流<SPAN>fileUpload</SPAN>，<SPAN>Workshop</SPAN>自动为我们创建了一个<SPAN>FileUploadController.jpf</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，这个</SPAN><SPAN>jpf</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>作为控制器，我们再添加一个</SPAN><SPAN>uploadFile</SPAN><SPAN>的</SPAN><SPAN>Action</SPAN><SPAN>，包含一个名为“</SPAN><SPAN>UploadForm</SPAN><SPAN>”的</SPAN><SPAN>ActionForm</SPAN><SPAN>，</SPAN><SPAN>3</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>个</SPAN><SPAN>JSP</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>文件，然后设置导航如下：</SPAN></P>
<P><SPAN><IMG height=362 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152652642.jpg" width=423 border=0 v:shapes="_x0000_i1041"> </SPAN></P>
<P>详细代码请下载源代码包。</P>
<P>使用<SPAN>Java Page Flow</SPAN>的最大的优点是完全的<SPAN>MVC</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>架构，有清晰的导航模型，并且配合</SPAN><SPAN>NetUI</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>标签，实现起来更为简单。</SPAN></P>
<P>以上讨论了基本的浏览页面，下面我们要实现用户登陆的功能和针对管理员的管理功能。</P>
<P><B><SPAN>实现用户登陆</SPAN><SPAN></SPAN></B></P>
<P>为了跟踪用户，我们创建一个<SPAN>AccountManageBD</SPAN>的业务代理类，并将它放在<SPAN>Session</SPAN>中，封装所有与用户帐号相关的操作。几个关键的方法如下：</P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>String getName() // </SPAN></B><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" color:purple>返回用户登陆名</SPAN></B><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple></SPAN></B></P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>boolean isAdmin() // </SPAN></B><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" color:purple>是否是管理员</SPAN></B><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple></SPAN></B></P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>void login(String username, String password) // </SPAN></B><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体" color:purple>登陆系统</SPAN></B><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple></SPAN></B></P>
<P>我们在<SPAN>MusicSessionListener</SPAN>中监听<SPAN>Session</SPAN>事件，以便创建和销毁与<SPAN>Session</SPAN>关联的<SPAN>AccountManageBD</SPAN>对象。然后在<SPAN>/WEB-INF/web.xml</SPAN>中注册<SPAN>MusicSessionListener</SPAN>。</P>
<P>这样，任何时候均可在<SPAN>JSP</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>中调用</SPAN></P>
<P><B><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier" New?;color:purple>AccountManageBD account = (accountManageBD)</SPAN></B></P>
<P><B><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>session.getAttribute(AccountManageBD.ACCOUNT);</B></P>
<P>来访问用户当前登陆信息。</P>
<P>创建一个登陆页面流<SPAN>LoginController.jpf</SPAN>实现登陆页面：</P>
<P><SPAN><IMG height=285 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152652553.jpg" width=488 border=0 v:shapes="_x0000_i1042"> </SPAN></P>
<P>类似的，一个<SPAN>registerUser</SPAN>页面流实现用户注册功能：</P>
<P><SPAN><IMG height=265 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152652758.jpg" width=416 border=0 v:shapes="_x0000_i1043"> </SPAN></P>
<P><B><SPAN>实现管理功能</SPAN><SPAN></SPAN></B></P>
<P>为了能使管理员登陆后管理站点，我们把所有的管理页面放在目录<SPAN>{MusicWeb}/admin/</SPAN>下，为了防止未授权用户访问任何<SPAN>/admin/</SPAN>下的任何页面，我们准备一个过滤器<SPAN>AdminFilter</SPAN>，将所有未授权的操作重定向到<SPAN>/login/LoginController.jpf</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>中。核心代码如下：</SPAN></P>
<P><SPAN><IMG height=242 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152653618.jpg" width=572 border=0 v:shapes="_x0000_i1044"> </SPAN></P>
<P>修改<SPAN>/WEB-INF/web.xml</SPAN>，添加过滤器申明：</P>
<P><SPAN><IMG height=241 src="http://www.crackj2ee.com/Article/UploadFiles/200505/20050505152653671.jpg" width=580 border=0 v:shapes="_x0000_i1045"> </SPAN></P>
<P>最后，你只需要用<SPAN>Dreamwaver</SPAN>之类的网页制作软件强化界面，然后把这些<SPAN>JSP</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>及页面流组织起来，即可发布您的</SPAN><SPAN>JetMusic</SPAN>站点。</P>
<P><A name=安全></A><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>安全</SPAN></B></P>
<P>正如你所看到的，我们的安全是通过<SPAN>Web</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>层的登陆验证实现的，在逻辑层并未使用基于角色的验证逻辑，对于我们现在的站点来说，可能已经足够了。不过，如果您打算将来向用户提供付费下载，付费收听的业务，那么就需要切实保证系统的安全性。通常，不建议您自己开发安全逻辑，因为开发防攻击的安全逻辑本身就不是一个简单的任务，此外，自定义的安全逻辑可能会导致较低的可重用性。</SPAN></P>
<P>从<SPAN>Java 1.4</SPAN>和<SPAN>J2EE 1.3</SPAN>开始，<SPAN>Java</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>验证与授权服务</SPAN><SPAN>JAAS</SPAN><SPAN>（</SPAN><SPAN>Java Authentication and Authorization Service</SPAN>）就被引入到核心包中。<SPAN>JAAS</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>实现了验证和授权两类服务，验证服务能够可靠并安全地确定目前是谁在执行代码，在我们的这个应用中，只需要用到</SPAN><SPAN>JAAS</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>的验证服务。以下是</SPAN><SPAN>JAAS</SPAN><SPAN>验证的一般步骤：</SPAN></P>
<P><SPAN>1</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>．创建一个</SPAN><SPAN>LoginContext</SPAN>实例。</P>
<P><SPAN>2</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>．指定</SPAN><SPAN>LoginContext</SPAN>的配置文件。</P>
<P><SPAN>3</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>．加载指定的</SPAN><SPAN>LoginModule</SPAN>。</P>
<P><SPAN>4</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>．客户端调用</SPAN><SPAN>LoginContext</SPAN>的<SPAN>login</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>方法。</SPAN></P>
<P><SPAN>5</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>．如果登陆成功，就会将一个通过身份验证的</SPAN><SPAN>Principal</SPAN>和<SPAN>Subject</SPAN>联系起来。</P>
<P><SPAN>6</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>．</SPAN><SPAN>LoginContext</SPAN>将通过身份验证的<SPAN>Subject</SPAN>返回客户机。</P>
<P>在<SPAN>WebLogic</SPAN>中，缺省的用户，组和角色都是在<SPAN>XML</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>配置文件中指定的，我们只需要提供一个登陆页面，包含一个名为</SPAN><SPAN>j_security_check</SPAN>的<SPAN>Form</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，一个名为</SPAN><SPAN>j_username</SPAN><SPAN>的</SPAN><SPAN>TextBox</SPAN><SPAN>和一个名为</SPAN><SPAN>j_password</SPAN><SPAN>的</SPAN><SPAN>PasswordBox</SPAN><SPAN>，然后在</SPAN><SPAN>/WEB-INF/web.xml</SPAN><SPAN>中配置即可使用</SPAN><SPAN>WebLogic</SPAN><SPAN>默认的</SPAN><SPAN>JAAS</SPAN><SPAN>身份验证。但是，这些用户是静态的，无法满足我们使用数据库动态管理用户的需求。好在</SPAN><SPAN>JAAS</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>本身就是一个“可插拔”的模块，我们可以轻易地使用自定义的安全模块实现验证功能。</SPAN></P>
<P>要在<SPAN>WebLogic</SPAN>中实现自定义的安全验证，需要提供一个<SPAN>Security Provider</SPAN>，包括自定义的<SPAN>Authentication Provider</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，</SPAN><SPAN>Login Module</SPAN>，<SPAN>Identity Assertion</SPAN>，<SPAN>Principal Validation Provider</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，</SPAN><SPAN>Role Mapping Provider</SPAN>，看上去有点复杂，不过，你可以从<SPAN>BEA</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>站点下载一个示例代码：</SPAN></P>
<P><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: " &quot;Courier New&quot;><A href="http://dev2dev.bea.com/codelibrary/code/security_prov81.jsp"><FONT color=#004080>http://dev2dev.bea.com/codelibrary/code/security_prov81.jsp</FONT></A></SPAN></P>
<P>然后修改相应的实现类，配置部署，即可实现自定义的<SPAN>JAAS</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>验证。</SPAN></P>
<P>使用<SPAN>JAAS</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>验证的好处是，验证逻辑从页面中分离，对页面的限制访问是通过</SPAN><SPAN>/WEB-INF/web.xml</SPAN>中的配置指定的，无需自定义过滤器；在调用<SPAN>EJB</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>时，</SPAN><SPAN>Web</SPAN><SPAN>容器能隐含的把</SPAN><SPAN>Principal</SPAN><SPAN>传递给</SPAN><SPAN>EJB</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>容器，从而和</SPAN><SPAN>EJB</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>的安全限制联系起来。</SPAN></P>
<P>在我们的<SPAN>JetMusic</SPAN>站点中，目前仅仅使用<SPAN>Session+</SPAN>过滤器的机制，也许可以考虑在下一个版本中加入<SPAN>JAAS</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>验证，以便更清晰地划分表示层逻辑和安全逻辑。</SPAN></P>
<P><A name=部署></A><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>部署</SPAN></B></P>
<P>可以直接在<SPAN>Workshop</SPAN>中启动<SPAN>WebLogic Server</SPAN>，即可自动完成部署。如果部署成功，<SPAN>WebLogic</SPAN>不会输出提示信息，如果部署失败，会提示异常信息。</P>
<P>常见的异常有：</P>
<P><SPAN>JDBC</SPAN><SPAN>连接出错：没有启动数据库，或者没有找到对应</SPAN><SPAN>JNDI</SPAN><SPAN>名称的数据库。你需要检查</SPAN><SPAN>JNDI</SPAN><SPAN>设置和数据库是否已经启动。</SPAN></P>
<P><SPAN>INSERT</SPAN><SPAN>语句出错：这是创建实体</SPAN><SPAN>Bean</SPAN><SPAN>时容器的</SPAN><SPAN>INSERT</SPAN><SPAN>语句出错。如果指定了</SPAN><SPAN>automatic-key-generation</SPAN><SPAN>，第一次部署时</SPAN><SPAN>WebLogic</SPAN><SPAN>自动创建的主键为</SPAN><SPAN>INT</SPAN><SPAN>类型，但并不是</SPAN><SPAN>AUTOINCREASE</SPAN><SPAN>，需要打开数据库，手动更改主键设置，或者，您可以直接下载示例数据库，然后导入到</SPAN><SPAN>SQL Server2000</SPAN>即可。</P>
<P><A name=总结></A><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>总结</SPAN></B></P>
<P>我们已经利用<SPAN>J2EE</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>技术在</SPAN><SPAN>WebLogic Server</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>上基本建立起了一个健壮的，可扩展的</SPAN><SPAN>JetMusic</SPAN>音乐站点，其中涉及到<SPAN>EJB</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>，</SPAN><SPAN>JSP</SPAN><SPAN>，</SPAN><SPAN>Servlets</SPAN><SPAN>，</SPAN><SPAN>NetUI</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>，</SPAN><SPAN>Java Page Flow</SPAN>，<SPAN>JAAS</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>以及几个常用的</SPAN><SPAN>EJB</SPAN><SPAN>设计模式等。相信您能从这个小小的</SPAN><SPAN>Web</SPAN><SPAN>应用中看到</SPAN><SPAN>J2EE</SPAN><SPAN>体系强大的功能。由于时间仓促，水平有限，文中不免会有一些错误，恳请读者指正。最后希望本文能够给您带来一点收获。最后申明：如果您使用</SPAN><SPAN>JetMusic</SPAN>系统在网上发布音乐，所引起的一切版权纠纷本文作者概不负责。</P>
<P><A name=源代码下载></A><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>源代码下载</SPAN></B><B><SPAN style="FONT-SIZE: 14pt"></SPAN></B></P>
<P><SPAN>JetMusic</SPAN><SPAN>站点的全部源代码（</SPAN><SPAN>Workshop 8.1</SPAN><SPAN>工程）和示例数据库：</SPAN></P>
<P><SPAN style="FONT-SIZE: 9pt; FONT-FAMILY: " &quot;Courier New&quot;><A href="http://javap2p.nease.net/src/jetmusic.zip"><FONT color=#004080>http://javap2p.nease.net/src/jetmusic.zip</FONT></A></SPAN></P>
<P><A name=参考></A><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>参考</SPAN></B><B><SPAN style="FONT-SIZE: 14pt"></SPAN></B></P>
<P><SPAN>Sun J2EE Tutorial</SPAN><SPAN>，</SPAN><SPAN><A href="http://java.sun.com/j2ee/tutorial/1_3-fcs/index.html"><FONT color=#004080>http://java.sun.com/j2ee/tutorial/1_3-fcs/index.html</FONT></A></SPAN></P>
<P><SPAN>EJB</SPAN><SPAN>设计模式，</SPAN><SPAN>[</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>美</SPAN><SPAN>]Floyd Marinescu</SPAN></P>
<P><SPAN>EJB 2.0</SPAN><SPAN>企业级应用程序开发，</SPAN><SPAN>[</SPAN><SPAN>美</SPAN><SPAN>]Chuck Cavaness</SPAN><SPAN>，</SPAN><SPAN>Brian Keeton</SPAN></P>
<P><SPAN>BEA WebLogic Server</SPAN><SPAN>宝典，</SPAN><SPAN>[</SPAN><SPAN style="FONT-FAMILY: " New Roman&quot; 宋体;&quot;Times>美</SPAN><SPAN>]Joe Zuffoletto</SPAN></P>
<P><SPAN>WebLogic Workshop Help</SPAN><SPAN>，</SPAN><SPAN><A href="http://e-docs.bea.com/workshop/docs81/doc/en/core/index.html"><FONT color=#004080>http://e-docs.bea.com/workshop/docs81/doc/en/core/index.html</FONT></A></SPAN></P>
<P><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>关于作者</SPAN></B><B><SPAN style="FONT-SIZE: 14pt"></SPAN></B></P>
<P>廖雪峰（<SPAN>dev2dev</SPAN>论坛<SPAN>ID</SPAN><SPAN style="FONT-FAMILY: 宋体" &quot;Times New Roman&quot;>：</SPAN><SPAN>xuefengl</SPAN><SPAN>）</SPAN></P>
<P>北京邮电大学在校本科生，信息工程专业，对<SPAN>J2EE/J2ME</SPAN>开发有浓厚兴趣。</P><img src ="http://www.blogjava.net/asklxf/aggbug/22203.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/asklxf/" target="_blank">Xuefeng's Weblog</a> 2005-12-02 10:38 <a href="http://www.blogjava.net/asklxf/articles/22203.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JNDI简介&amp;简单示例</title><link>http://www.blogjava.net/asklxf/articles/22199.html</link><dc:creator>Xuefeng's Weblog</dc:creator><author>Xuefeng's Weblog</author><pubDate>Fri, 02 Dec 2005 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/asklxf/articles/22199.html</guid><wfw:comment>http://www.blogjava.net/asklxf/comments/22199.html</wfw:comment><comments>http://www.blogjava.net/asklxf/articles/22199.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/asklxf/comments/commentRss/22199.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/asklxf/services/trackbacks/22199.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B style="mso-bidi-font-weight: normal"><SPAN lang=EN>JNDI: The Java Naming and Directory Interface</SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN><FONT color=#000080><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></FONT></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 1.71"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">什么是</SPAN><SPAN lang=EN>JNDI</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">？</SPAN><SPAN lang=EN><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN lang=EN>The Java Naming and Directory Interface</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是访问不同名字和目录服务的统一</SPAN><SPAN lang=EN>API</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不同的服务使用不同的名字格式。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN lang=EN>Java</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序需要以相同的格式访问数据库，文件，目录，对象和网络。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN lang=EN><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN lang=EN>JNID</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有两部分接口：应用程序接口和提供服务的接口。在应用程序中使用</SPAN><SPAN lang=EN>API</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来访问名字或目录服务，在一个新的服务中使用</SPAN><SPAN lang=EN>SPI</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来提供服务。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN lang=EN><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 1.71"><B style="mso-bidi-font-weight: normal"><SPAN lang=EN>JNDI</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构</SPAN><SPAN lang=EN><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">名字服务（</SPAN><SPAN lang=EN>Naming Services</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">名字服务提供一种方法，映射标识符到实体或对象。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你需要知道的几条基本条款：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 1.71"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">绑定：</SPAN></B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">绑定是将一个不可分割的名字（</SPAN><SPAN lang=EN>"</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">原子</SPAN><SPAN lang=EN>"</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">名字）与一个对象联系起来。像</SPAN><SPAN lang=EN>DNS</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，我们用名字</SPAN><SPAN lang=EN><A href="http://www.yahoo.com/"><SPAN style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none">www.yahoo.com</SPAN></A></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与</SPAN><SPAN lang=EN>IP</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">地址</SPAN><SPAN lang=EN>216.32.74.53</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">联系起来，一个文件对象用文件名</SPAN><SPAN lang=EN>afile.txt</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">联系起来。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 1.71"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">名字空间；</SPAN></B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">名字空间包含一组名字，但名字空间内每个名字是唯一的。一个文件目录就是一个简单的名字空间，如目录</SPAN><SPAN lang=EN>C:\temp</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在这个目录下，不能有两个相同名字的文件，但是，不同目录下的两个文件可能有相同的名字。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 1.71"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">复合名字：</SPAN></B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">复合名字是用名字空间构成的唯一名字，有一个或多个</SPAN><SPAN lang=EN>"</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">原子</SPAN><SPAN lang=EN>"</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">名字构成，取决于所在的名字空间。文件路径就是一个复合名字，比如我们用</SPAN><SPAN lang=EN>C:\temp\myfile.txt</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，我们可以看到，这个名字由根目录名（</SPAN><SPAN lang=EN>C:\</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），临时目录名（</SPAN><SPAN lang=EN>temp</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）和一个文件名（</SPAN><SPAN lang=EN>myfile.txt</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）构成，这</SPAN><SPAN lang=EN>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个名字复合起来表示一个唯一的名字。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; mso-char-indent-count: 1.71"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组合名字：</SPAN></B><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组合名字能跨越多个名字空间。一个</SPAN><SPAN lang=EN>URL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是一个组合名字，如果你看见</SPAN><SPAN lang=EN><A href="http://www.npu.edu/index.htm"><SPAN style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none">http://www.npu.edu/index.htm</SPAN></A></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，你使用</SPAN><SPAN lang=EN>http</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务连接到服务器，然后使用另一个名字空间</SPAN><SPAN lang=EN>/index.htm</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来访问一个文件。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><STRONG>目录服务</STRONG></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目录服务提供一组分成等级的目录对象，具有可搜索的能力。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在目录服务中存储的对象可以是任何能用一组属性描述的对象，每个对象都可通过一组属性来描述该对象的能力。例如，一个</SPAN><SPAN lang=EN>Person</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象可能有</SPAN><SPAN lang=EN>height</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN>hair color</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN>age</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN>sex</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等属性。目录服务还可提供根据要求来搜索的能力，如我们可以使用</SPAN><SPAN lang=EN>Person</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</SPAN><SPAN lang=EN>age</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性，搜索</SPAN><SPAN lang=EN>20-25</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">岁间的</SPAN><SPAN lang=EN>Person</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，目录服务将返回符合条件的</SPAN><SPAN lang=EN>Persion</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象。这通常被称作基于内容的搜索。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN lang=EN><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN lang=EN><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 17.95pt; mso-char-indent-count: 1.71"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在客户端使用</SPAN><SPAN lang=EN>JNDI</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 38.95pt; TEXT-INDENT: -21pt; tab-stops: list 38.95pt; mso-list: l0 level1 lfo1"><SPAN lang=EN style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><SPAN style="mso-list: Ignore">u<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建一个</SPAN><SPAN lang=EN>java.util.Hashtable</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或者</SPAN><SPAN lang=EN>java.util.Properties</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实例。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 38.95pt; TEXT-INDENT: -21pt; tab-stops: list 38.95pt; mso-list: l0 level1 lfo1"><SPAN lang=EN style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><SPAN style="mso-list: Ignore">u<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">添加变量到</SPAN><SPAN lang=EN>Hashtable</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN>Properties</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象：</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">由</SPAN><SPAN lang=EN>naming server</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供的</SPAN><SPAN lang=EN>JNDI class</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类名。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">包含</SPAN><SPAN lang=EN>aming server</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">位置的</SPAN><SPAN lang=EN>URL</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 45pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">安全信任书。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 38.95pt; TEXT-INDENT: -21pt; tab-stops: list 38.95pt; mso-list: l0 level1 lfo1"><SPAN lang=EN style="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><SPAN style="mso-list: Ignore">u<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过</SPAN><SPAN lang=EN>Hashtable</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN>Properites</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN>jndi</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性文件创建一个</SPAN><SPAN lang=EN>InitialContext</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 38.95pt; TEXT-INDENT: -21pt; tab-stops: list 38.95pt; mso-list: l0 level1 lfo1"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></SPAN>&nbsp;</P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">示例：</SPAN><SPAN lang=EN><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">import java.util.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">import javax.naming.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">…<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">env.put(Context.PROVIDER_URL,"t3://localhost:7001");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">InitialContext ctx = new InitialContext(env);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN><o:p>&nbsp;</o:p></SPAN></P>
<TABLE class=MsoTableGrid style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-table-layout-alt: fixed; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 480; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellSpacing=0 cellPadding=0 border=1>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 131.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" vAlign=top width=175>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">环境变量</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 198pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=264>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相应的常量</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 90pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=120>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">说明</SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 1">
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 131.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=175>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN>java.naming.factory.initial</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 198pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=264>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN>Context.INITIAL_CONTEXT_FACTORY</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 90pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=120>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN>Context Factory</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类名，由服务提供商给出。</SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 2">
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 131.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=175>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN>java.naming.provider.url</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 198pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=264>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN>Context.PROVIDE_URL</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 90pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=120>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">初始化地址。</SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 3">
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 131.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=175>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN>java.naming.security.</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN>principal</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 198pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=264>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN>Context.SECURITY_PRINCIPAL</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 90pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=120>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">服务使用者信息。</SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 4; mso-yfti-lastrow: yes">
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 131.4pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=175>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN>java.naming.security.</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN>credentials</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 198pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=264>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN>Context.SECURITY_CREDENTIAL</SPAN></P></TD>
<TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 90pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" vAlign=top width=120>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">口令。</SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更多的配置示例：</SPAN><SPAN lang=EN><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">Hashtable env = new Hashtable();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">env.put (Context.INITIAL_CONTEXT_FACTORY, <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">"weblogic.jndi.WLInitialContextFactory");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">env.put(Context.PROVIDER_URL, "t3://localhost:7001");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">env.put(Context.SECURITY_PRINCIPAL, "system");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">env.put(Context.SECURITY_CREDENTIALS, "password here");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">Properties env = new Properties();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">env.setProperties ("java.naming.factory.initial", <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">"weblogic.jndi.WLInitialContextFactory");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">env.setProperties("java.naming.provider.url" , "t3://localhost:7001");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">env.setProperties("java.naming.security.principal" , "tommy");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">env.setProperties("java.naming.security.credentials" ,"password here");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">创建</SPAN><SPAN lang=EN>InitialContext</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN><SPAN lang=EN><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">Class Name: javax.naming.InitialContext<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">Interfaces that it implements: javax.naming.Context<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">Constructors:<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>public InitialContext();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>public InitialContext(Hashtable configuration);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>public InitialContext(Properties configuration);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以上所有方法都可能抛出</SPAN><SPAN lang=EN>NamingException</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个</SPAN><SPAN lang=EN>Binding</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">示例：</SPAN><SPAN lang=EN><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">public static InitialContext getInitialContext() throws NamingException {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>Hashtable env = new Hashtable();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>env.put(Context.INITIAL_CONTEXT_FACTORY,<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>"weblogic.jndi.WLInitialContextFactory");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>env.put(Context.PROVIDER_URL,"t3://localhost:7001");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>InitialContext context = new InitialContext(env);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>return context;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">//Obtain the initial context<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">InitialContext initialContext = getInitialContext();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">//Create a Bank object.<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">Bank myBank = new Bank();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">//Bind the object into the JNDI tree.<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">initialContext.rebind("theBank",myBank);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个</SPAN><SPAN lang=EN>Lookup</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">示例：</SPAN><SPAN lang=EN><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">public static InitialContext getInitialContext() throws NamingException {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>Hashtable env = new Hashtable();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>env.put(Context.INITIAL_CONTEXT_FACTORY,<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>"weblogic.jndi.WLInitialContextFactory");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>env.put(Context.PROVIDER_URL,"t3://localhost:7001");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>InitialContext context = new InitialContext(env);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>return context;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">//Obtain the initial context<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">InitialContext initialContext = getInitialContext();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">//Lookup an existing Bank object.<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">Bank myBank = (Bank) initialContext.lookup("theBank");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可能发生的</SPAN><SPAN lang=EN>NamingException</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</SPAN><SPAN lang=EN><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 17.95pt; mso-para-margin-left: 1.71gd"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">AuthenticationException<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 17.95pt; mso-para-margin-left: 1.71gd"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">CommunicationException<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 17.95pt; mso-para-margin-left: 1.71gd"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">InvalidNameException<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 17.95pt; mso-para-margin-left: 1.71gd"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">NameNotFoundException<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt 17.95pt; mso-para-margin-left: 1.71gd"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">NoInitialContextException<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">枚举所有名字对象：</SPAN><SPAN lang=EN><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">NamingEnumeration Declaration:<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">public interface NamingEnumeration extends Enumeration {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>public boolean hashMore() throws NamingException;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>public Object next() throws NamingException;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>public void close() throws NamingException; //jndi 1.2<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">try {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>…<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>NamingEnumeration enum = ctx.list("");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>while (enum.hasMore()) {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>NameClassPair ncp = (NameClassPair) enum.next();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println("JNDI name is:" + ncp.getName());<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">catch (NamingException e) {…}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最后的示例：</SPAN><SPAN lang=EN><o:p></o:p></SPAN></B></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">import java.util.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">import javax.naming.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">import javax.naming.directory.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">import java.io.*;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">public class ListAll {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>public static void main(java.lang.String[] args) {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Hashtable env = new Hashtable();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>env.put(Context.INITIAL_CONTEXT_FACTORY,<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>"weblogic.jndi.WLInitialContextFactory");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>env.put(Context.PROVIDER_URL, "t3://localhost:7001");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>try {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>InitialContext ctx = new InitialContext(env);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>NamingEnumeration enum = ctx.listBindings("");<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>while(enum.hasMore()) {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Binding binding = (Binding) enum.next();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>Object obj = (Object) binding.getObject();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 4">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println(obj);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>} catch (NamingException e) {<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>System.out.println(e);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN>} // end main<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN style="FONT-SIZE: 9pt; FONT-FAMILY: 'Courier New'">} // end List</SPAN></P><img src ="http://www.blogjava.net/asklxf/aggbug/22199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/asklxf/" target="_blank">Xuefeng's Weblog</a> 2005-12-02 10:34 <a href="http://www.blogjava.net/asklxf/articles/22199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用FileUpload组件实现文件上传</title><link>http://www.blogjava.net/asklxf/articles/22194.html</link><dc:creator>Xuefeng's Weblog</dc:creator><author>Xuefeng's Weblog</author><pubDate>Fri, 02 Dec 2005 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/asklxf/articles/22194.html</guid><wfw:comment>http://www.blogjava.net/asklxf/comments/22194.html</wfw:comment><comments>http://www.blogjava.net/asklxf/articles/22194.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/asklxf/comments/commentRss/22194.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/asklxf/services/trackbacks/22194.html</trackback:ping><description><![CDATA[<P>文件上传在web应用中非常普遍，要在servlet/jsp环境中实现文件上传功能非常容易，因为网上已经有许多用java开发的组件用于文件上传，本文以commons-fileupload组件为例，为servlet/jsp应用添加文件上传功能。</P>
<P>common-fileupload组件是apache的一个开源项目之一，可以从<A href="http://jakarta.apache.org/commons/fileupload/">http://jakarta.apache.org/commons/fileupload/</A>下载。该组件简单易用，可实现一次上传一个或多个文件，并可限制文件大小。</P>
<P>下载后解压zip包，将commons-fileupload-1.0.jar复制到tomcat的webapps\你的webapp\WEB-INF\lib\下，如果目录不存在请自建目录。</P>
<P>新建一个servlet: Upload.java用于文件上传：</P>
<P><FONT face="Courier New">import java.io.*;<BR>import java.util.*;<BR>import javax.servlet.*;<BR>import javax.servlet.http.*;<BR>import org.apache.commons.fileupload.*;<BR><BR>public class Upload extends HttpServlet {</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp; private String uploadPath = "C:\\upload\\"; // 用于存放上传文件的目录<BR>&nbsp;&nbsp;&nbsp; private String tempPath = "C:\\upload\\tmp\\"; // 用于存放临时文件的目录</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp; public void doPost(HttpServletRequest request, HttpServletResponse response)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws IOException, ServletException<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; }<BR>}</FONT></P>
<P>当servlet收到浏览器发出的Post请求后，在doPost()方法中实现文件上传。以下是示例代码：</P>
<P><FONT face="Courier New">public void doPost(HttpServletRequest request, HttpServletResponse response)<BR>&nbsp;&nbsp;&nbsp; throws IOException, ServletException<BR>{<BR>&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DiskFileUpload fu = new DiskFileUpload();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置最大文件尺寸，这里是4MB<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fu.setSizeMax(4194304);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置缓冲区大小，这里是4kb<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fu.setSizeThreshold(4096);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置临时目录：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fu.setRepositoryPath(tempPath);</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 得到所有的文件：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List fileItems = fu.parseRequest(request);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Iterator i = fileItems.iterator();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 依次处理每一个文件：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(i.hasNext()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileItem fi = (FileItem)i.next();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 获得文件名，这个文件名包括路径：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String fileName = fi.getName();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(fileName!=null) {</FONT><FONT face="Courier New"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;// 在这里可以记录用户和文件信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; // ...<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 写入文件a.txt，你也可以从fileName中提取文件名：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fi.write(new File(uploadPath + "a.txt"));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp;跳转到上传成功提示页面<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; catch(Exception e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 可以跳转出错页面<BR>&nbsp;&nbsp;&nbsp; }<BR>}</FONT></P>
<P>如果要在配置文件中读取指定的上传文件夹，可以在init()方法中执行：</P>
<P><FONT face="Courier New">public void init() throws ServletException {<BR>&nbsp;&nbsp;&nbsp; uploadPath = ....<BR>&nbsp;&nbsp;&nbsp; tempPath = ....<BR>&nbsp;&nbsp;&nbsp; // 文件夹不存在就自动创建：<BR>&nbsp;&nbsp;&nbsp; if(!new File(uploadPath).isDirectory())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new File(uploadPath).mkdirs();<BR>&nbsp;&nbsp;&nbsp; if(!new File(tempPath).isDirectory())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new File(tempPath).mkdirs();<BR>}</FONT></P>
<P>编译该servlet，注意要指定classpath，确保包含commons-upload-1.0.jar和tomcat\common\lib\servlet-api.jar。</P>
<P>配置servlet，用记事本打开tomcat\webapps\你的webapp\WEB-INF\web.xml，没有的话新建一个。典型配置如下：</P>
<P><FONT face="Courier New"><?xml version="1.0" encoding="ISO-8859-1"?>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<BR>&lt;!DOCTYPE web-app<BR>&nbsp;&nbsp;&nbsp; PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<BR>&nbsp;&nbsp;&nbsp; "<A href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</A>"&gt;</FONT></P>
<P><FONT face="Courier New">&lt;web-app&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Upload&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;Upload&lt;/servlet-class&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;</FONT></P>
<P><FONT face="Courier New">&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;Upload&lt;/servlet-name&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/fileupload&lt;/url-pattern&gt;<BR>&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;<BR>&lt;/web-app&gt;</FONT><FONT face="Courier New"></SERVLET-MAPPING><BR></P></WEB-APP></FONT>
<P>配置好servlet后，启动tomcat，写一个简单的html测试：</P>
<P><FONT face="Courier New"><FORM name="form1" action="" color="#0000ff">&lt;form action="fileupload" method="post"<BR>enctype="multipart/form-data" name="form1"&gt;<BR>&nbsp; &lt;input type="file" name="file"&gt;<BR>&nbsp; &lt;input type="submit" name="Submit" value="upload"&gt;<BR>&lt;/form&gt;</FONT></FONT></P>
<P>注意action="fileupload"其中fileupload是配置servlet时指定的url-pattern。</P><img src ="http://www.blogjava.net/asklxf/aggbug/22194.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/asklxf/" target="_blank">Xuefeng's Weblog</a> 2005-12-02 10:28 <a href="http://www.blogjava.net/asklxf/articles/22194.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>