??xml version="1.0" encoding="utf-8" standalone="yes"?> 伴随着WTO 的加入以?qing)企业信息化的飞速进展,ERP 在中国也q入q泛普及(qing)阶段Q越来越多的人知道了(jin)什么是erp.erp应用更加务实、业务范围更加广泛、涉?qing)的业务深度逐渐加强的ERP 正ؓ(f)q大的中国企业所期盼?br />
然而,目前国内的ERP 应用q不如人意Q就整体而言Q我国在应用ERP 上呈现出不^衡的发展势。各个企业差距较大,能够真正成功地全面实施ERP 理pȝ的企业ƈ不是很多。其原因在于Q一、ERP业界对广大中国企业缺乏深入的理解Q同时ERP成熟标准在我国缺乏深入实践,从而导致企业ERP 选型错ؕQ实施风险失控。二、一些Y件厂商肆无忌惮地Ҏ(gu)自己的品,使得ERP ?jng)场鱼目L(fng)Q更直接D?jin)客户对ERP 产品的怀疑?br />
一、落后的企业理水^严重制UERP 的运?br />
ERP 的发展是理思想和计机技术的l合体,从ERP 的生历E来看,ERP 的成熟完全符合理论、实c(din)再理论到实늚q程。在20 多年的发展中Q经q不断的实践理理论的应用和创新Q其pȝ内涵和基本模型已l十分清晰。而ERP的成熟不能只看这个Y件本w的理思想是多么的行Q更主要的是看ERP本n蕴涵的管理理论是不是在实际中已经得到?jin)运用,在发辑֛家的成功q用证明?jin)其思想是成功的?br />
在我国,企业理水^长期落后于信息化要求。很多企业存在基数据不全Q信息失真的问题。同Ӟ大量企业未建立C企业制度Q企业内部对利用信息技术进行管理创新的动力不Q采用信息技术处于被动状态,普遍存在着信息理机构不健全,信息理制度不完善,执行力度不到位,现场理不严根{不规范Q信息设备利用率低等问题。这些问题的存在Q将严重制约ERP 在我国的q用?br />
二、企业纵向管理的不成熟将严重影响ERP 的运?br />
ERP的运用ؓ(f)企业提高理水^提供?jin)更为广阔的I间。ERP应用h范围扩展性,q渐形成针对行业的解x(chng)案,来满不同行业业务的Ҏ(gu)需求。而这一切成为现实的前提是,理视角和管理高度的全面集成。尤其是QERP 中胦(ch)务系l应能实时收到来自所有业务过E、分析系l和交叉功能子系l的触发信息Qƈ执行监控功能Q敏捷做出快速决{。只有这P才能使ERP 能更加综合的Z业运行进行支持和诊断。本文章什么是erp严禁抄袭.而我国企业目前在销售、采购、生产、胦(ch)务等各环节严重脱节,是很常见的现象,其是成长较快的企业Q脱节更Z重。如采购和生产之间的不协调经帔R成停工待料Q有时胦(ch)务和销售环节的衔接不良Q造成应收账款不能收清{现象。造成q种情况的原因在于,企业~Z整体考虑Q尤其体现在不能集成“三流”Q资金流、物、信息流Q,q而造成计划与控制不能统一Q各部门业务不能协调{。这是ERP 在我国发展面临的W二个考验?br />
三、ERP 软g生存周期的缺陷将严重制约ERP 的运?br />
ERP 是综合应用了(jin)C/S 或者B/S 体系、关pL据库l构、面向对象技术、图形用L(fng)面、第四代语言Q?GLQ、网l通讯{信息业成果,以现代管理思想为灵的软g产品。ERP 成熟的品应该具备实现数据完全按逻辑集成、提供业务流E模型、具有开发接口、可实现 惛_阅读q个文章的朋友都已经具备丰富的开发经验,有自己动手、发现、解决问题的能力Q所以Eclipse和MyEclipse的安装配|等l节我就不提?jin),让我们从MyEclipse下的Weblogic配置开始吧。看图作文:(x) Q图1QWeblogic配置Q?/p>
Ҏ(gu)自己的实际情况配|上囄诸多参数Q最后别忘(sh)(jin)点击“Apply”和“OK”按钮,后面的类似操作也都别忘(sh)(jin)?/p>
选择一个“J2EE ?EJB Project”再Next?/p>
注意Q因为目前的Xdoclet版本只支持J2EE 1.3Q所以ؓ(f)?jin)可以利用Xdoclet来自动生成EJB各接口的代码和配|描q文Ӟq里应该选择J2EE 1.3 规范U别?/p>
工程创徏好了(jin)Q可以看到初始的目录l构?/p>
开始创建我们的W一个SessionBean吧。“J2EE ?EJB ?Session Bean”,p么简单?/p>
q个囄上红框表C的都是需要特别注意的地方Q讲解如下:(x)
初始的SessionBean代码创徏好了(jin)Q左边“Package Explorer”里可以看到当前的目录结构,双的代码窗口里面可以看到Xdoclet自动生成的代码,里面有一些ؓ(f)q一步生成各U接口代码以?qing)部|描q文档所用的Xdoclet标记Q这里的标记很浅显,大家思义一看就明白?jin),如果要改变部|后的JNDI名称以符合项目的具体规约要求Q那么可以在图中U框标示的地方修攏V?/p>
OKQ现在开始最重要也最复杂的一步:(x)Xdoclet配置。实际上Jbuilder的代码自动生成的q后功臣也是XdocletQ只不过Borland把它?yu)装得严严实实,对于开发者来说就透明化了(jin)Q这样做的好处是?c)化,降低了(jin)配|的隑ֺQ坏处很明显――损׃(jin)Xdoclet所著称的灵zL?br />MyEclipse提供?jin)许多标准的Xdoclet模板Q我们直接拿来再Ҏ(gu)实际情况自定义屈指可数的几个参数可以用了(jin)?/p>
d一个“Standard EJB”配|?/p>
把我们当前工E中用不到的东西通通删掉,例如dao,dataobject,entitybmp,entitycmp,entitypk,valueobject,utilobject。得到图12所C的配置?/p>
Q图12Q)(j)
d一个weblogic的部|描q选项Q接着q要Ҏ(gu)实际需要配|它?/p>
配置CreatetablesQ设|ؓ(f)AlterOrCreateQ以便以后加入其它EJBlg时共享一个部|描q文件?/p>
配置destDirQ就是weblogic-ejb-jar.xml文g所在的目录?/p>
配置VersionQ根据实际的weblogic版本M个版本号卛_Q我用的版本?11Q这里设?.1?/p>
选择使用动态Xdoclet配置文gq是?rn)态Xdoclet配置文gQ这里用缺省的“动态”方式即可?/p>
OKQXdoclet配置好之后就可以Ҏ(gu)它的配置文g扚w生成我们所期望的代码和文档?jin)?/p>
Xdoclet执行q程?/p>
FinishedQ看看红色选框里的文gQ怎么P果然不负众望吧?q里包括q程接口、本地接口、远EHome接口、本地Home接口、ejb-jar.xml、weblogic-ejb-jar.xml{文件?/p>
q里是远E接口。看图中的高?sh)部分,思义Q用你自q商务Ҏ(gu)替换Xdoclet模板生成的示例商务方法?/p>
q里是BeancR同h示例方法替换成实际的商务方法?/p>
代码都写好了(jin)Q文件也都整理好?jin),嗯,该部|了(jin)?/p>
部vq程很简单。看图,在“Project”选项中选择我们的“Hello”工E,再点几ZAdd”按钮添加一个部|方案?/p>
部v到在文章初始配|好的Weblogic8服务器,使用jar包方式?/p>
配置完毕Q该启动Weblogic看看效果?jin)?Q)(j)btwQ整理用的是离UK|Ԍ或者叫做“冷部v”)(j)方式Q也是说在部vq程中Weblogic没有启动Q这时候如果EJBlg包含部v期可发现的错误那么在q一阶段不能得到报告,当然我们也可以用在UK|Ԍ“热部v”?Q方式以x(chng)得到部v期可能的异常QeasyQ自己尝试吧?/p>
部v好之后该q什么呢Q看着屏幕发呆Q呵c(din)。还是先写个Client试一下你的EJBlg是不是能够正常运行吧。如图,包名和类名除W合基本的JAVA规范之外都没有硬性的规定Q只是习(fn)惯上类名的后缀设ؓ(f)“TestClient”?/p>
因ؓ(f)要用到Weblogic的初始上下文工厂QWLInitialContextFactoryQ,所以我们应该导入Weblogic的函数库Q就是WL_HOME/server/lib/weblogic.jar?jin)。当然这一步也未必p攑֜q里做,反正在测试程序运行之前就可以?/p>
该编写我们的试客户端的实际代码?jin),看图Q就那么二三十行l典代码Q很单吧Q?/p>
叫上WeblogicQ一起开动咯?/p>
Weblogic启动成功Q启动过E中?x)自动蝲入我们刚才冷部v的EJBlgQ这ơ没有报告Q何异常,说明我们的EJBlg是正无误的?/p>
执行我们的测试客L(fng)Q得到预期的输出?/p>
然后观察Weblogic的控制台Q同样也是我们所期望的反馈,yeahQ收工,吃饭M(jin)?/p>
参考文献:(x)《MyEclipse Application Developer Guide》?/p>
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=310359 Java q_一直都以其q_无关性自豪。虽然这U无x(chng)有许多好处Q但是它也得编写与g交互?Java 应用E序的过E变得相当复杂。在本文中,研究U学家蒋清野讨论?jin)两个项目,它们通过提供使Java 应用E序可以使用 USB 讑֤?API 而ɘq个q程变得更容易。虽然这两个目仍然处于萌芽状态,但是它们都显CZ(jin)良好的前景,q已l成Z些实用应用程序的基础? 通用串行ȝ(Universal Serial Bus USB)规范的第一个版本发表于 1996q?1月。因为它的低成本、高数据传输率、用容易和灉|性,USB 在计机行业里获得了(jin)q泛接受。今天,许多周边讑֤和装|都是通过 USB 接口q接到计机上的。目前,大多C般用途的操作pȝ都提供了(jin)?USB 讑֤的支持,q且?C 或?C++ 可以相对Ҏ(gu)地开发访问这些外讄应用E序。不q,Java ~程语言在设计上对硬件访问提供的支持很少Q所以编写与 USB 讑֤交互的应用程序是相当困难的? IBM ?Dan Streetman 最早开始了(jin)?Java 语言中提供对 USB 讑֤的访问的努力?001q_(d)他的目通过 Java 规范h(Java Specification RequestQJSR)q程被接受ؓ(f) Java 语言的候选扩展标准。这个项目现在称?JSR-80 q且指定?jin)官方?javax.usb。同Ӟ?2000q?6月,Mojo Jojo ?David Brownell ?SourceForge 开始了(jin) jUSB 目。这两个目都开发出?Linux 开发h员可以用的包,管它们都还很不完善。这两个目也都开始试囑其他操作pȝ上的 Java 应用E序提供?USB 讑֤的访问,管它们都还没有开发出可以使用的包(参阅 参考资?中有x(chng)文中讨论的这两个目?qing)其他项目的资??/p>
在本文中Q将?jUSB ?JSR-80 目作一个简要介l,不过Q我们首先要看一?USB 协议的具体细节,q样(zhn)就可以理解q两个项目是如何?USB 讑֤交互的。我们还提供代码片D以展示如何用这两个目?API 讉K USB 讑֤?USB 介绍 1994q_(d)一个由四个行业伙伴(Compaq、Intel、Microsoft ?NEC)l成的联盟开始制?USB 协议。该协议最初的目的是将 PC 与电(sh)话相qƈ提供Ҏ(gu)扩展和重新配|的 I/O 接口?996q?1月,发表?USB 规范的第一个版本,1998q?9月发表了(jin)后箋(hu)版本(版本 1.1)。这个规范允?127台设备同时连接到一Pȝ通信带宽限制?12 Mbps。后来,又有三个成员(Hewlett-Packard、Lucent ?Philips)加入?jin)这个联盟?000q?4月,发表?USB 规范?2.0版本Q它支持高达 480 Mbps 的传输率。今天,USB 在高?视频、图像、储?和全?音频、宽带、麦克风)数据传输应用中v?jin)关键作用。它q(sh)各种低速设?键盘、鼠标、游戏外设、虚拟现实外?q接?PC 上?/p>
USB 协议有严格的层次l构。在所?USB pȝ中,只有一个主讑֤Q到主计机的的 USB 接口UCؓ(f)L?host controller)。主控器有两个标??开放主控器接口(Compaq ?Open Host Controller InterfaceQOHCI)和通用L器接?Intel ?Universal Host Controller InterfaceQUHCI)。这两个标准提供?jin)同L(fng)能力Qƈ可用于所有的 USB 讑֤QUHCI 的硬件实现更单一些,但是需要更复杂的设备驱动程?因?CPU 的负h大一??/p>
USB 物理互连是分层的星Ş拓朴Q最多有七层。一?hub 是每个星形的中心(j)QUSB L被认为是 root hub。每一D连UK?hub ?USB 讑֤的点对点q接Q后者可以是为系l提供更多附加点的另一?hubQ也可以是一个提供功能的某种讑֤。主Z用主/从协议与 USB 讑֤通信。这U方式解决了(jin)包冲H的问题Q但是同时也L?jin)附加的讑֤彼此建立直接通信?/p>
所有传输的数据都是׃控器发v的。数据从L向讑֤UCؓ(f)下行(downstream)或者输?out)传输Q数据从讑֤向LUCؓ(f)??upstream)或者输?in)传输。数据传输发生在L?USB 讑֤上特定的端点(endpoint) 之间Q主Z端点之间的数据链接称为管?pipe)?一个给定的 USB 讑֤可以有许多个端点Q主Z讑֤之间数据道的数量与该设备上端点的数量相同。一个管道可以是单向或者是双向的,一个管道中的数据流与所有其他管道中的数据流无关?/p>
USB |络中的通信可以使用下面四种数据传输cd中的L一U:(x) 控制传输Q?q些是一些短的数据包Q用于设备控制和配置Q特别是在设备附加到L上时? 扚w传输Q?q些是数量相对大的数据包。像扫描仪或?SCSI 适配器这L(fng)讑֤使用q种传输cd? 中断传输Q?q些是定期轮询的数据包。主控器?x)以特定的间隔自动发Z个中断? {时传输Q?q些是实时的数据?hu),它们对带宽的要求高?sh)可靠性要求。音频和视频讑֤一般用这U传输类型? 像串行端口一P计算Z每一?USB 端口都由 USB 控制器指定了(jin)一个惟一的标识数?端口 ID)。当 USB 讑֤附加?USB 端口上时Q就这?惟一端口 ID 分配l这台设备,q且 USB 控制器会(x)d讑֤描述W。设备描q符包括适用于该讑֤的全局信息、以?qing)设备的配置信息。配|定义了(jin)一?USB 讑֤的功能和 I/O 行ؓ(f)。一?USB 讑֤可以有一个或者多个配|,q由它们相应的配|描q符所描述。每一个配|都有一个或者多个接口,它可以视Z个物理通信渠道 Q每一个接口有零个或者多个端点,它可以是数据提供者或者数据消费者,或者同时具有这两种w䆾。接口由接口描述W描qͼ端点qҎ(gu)q符描述。ƈ且一?USB 讑֤可能q有字符串描q符以提供像厂商名、设备名或者序列号q样的附加信息?/p>
正如(zhn)所看到的,?USB q样的协议ؓ(f)使用 Java q种q_和硬件无x(chng)的语言的开发h员提Z(jin)?xi)战。现在让我们看两个试图解册个问题的目?/p>
jUSB API
jUSB 目是由 Mojo Jojo ?David Brownell ?2000q?6月创立的。其目标是提供一l免费的、在 Linux q_上访?USB 讑֤?Java API。这?API 是按?Lesser GPL (LGPL)条款发表的,q意味着(zhn)可以在专有和免费Y仉目中使用它。这?API 提供?jin)对多个物?USB 讑֤的多U程讉KQƈ支持本机和远E设备。具有多个接口的讑֤可以同时被多个应用程?或者设备驱动程?所讉KQ其中每一个应用程?或者设备驱动程?都占据一个不同的接口。该 API 支持控制传输、批量传输和中断传输Q不支持{时传输Q因为等时传输用于媒体数?如音频和视频)QJMF API 已经在其他标准设备驱动程序上Ҏ(gu)提供?jin)很好的支?参阅 参考资?。当前,?API 可以在具?Linux 2.4 核心(j)或者以前的 2.2.18 核心(j)?GNU/Linux 版本上工作。因此可支持大多数最新的版本Q例如,?API 可以在没有Q何补丁或者升U的 Red Hat 7.2 ?9.0 上工作?/span>
jUSB API 包括以下包:(x)
管 usb.core.Host 对象的实现对于不同的操作pȝ是不同的Q但?Java E序员只需要理?usb.core 包就可以?jUSB API 开始应用程序的开发。表 1 列出?usb.core 的接口和c,Java E序员应该熟(zhn)它们:(x)
?1. jUSB 中的接口和类
清单 1 展示?jin)如何?jUSB API 获得 USB pȝ中的内容。这个程序编写ؓ(f)只是查看 root hub 上可用的 USB 讑֤Q但是很Ҏ(gu)它改ؓ(f)遍历整个 USB ?wi)。这里的逻辑对应于上q步?1 到步?4?/span>
清单 1. ?jUSB API 获得 USB pȝ的内?/span>
清单 2 展示?jin)在应用E序成功地找C(jin) Device 的条件下Q如何与 Interface ?EndPoint q行扚w I/O?q个代码D也可以修改为执行控制或者中?I/O。它对应于上q步?5?/span>
清单 2. ?jUSB API 执行扚w I/O
jUSB 目?2000q?6月到 2001q?2月期间非常活跃。该 API 的最新的版本 0.4.4发表?2001q?2?14日。从那以后只提出?jin)很的改进Q原因可能是 IBM 组成功地成Z(jin) Java 语言的候选扩展标准。不q,Z jUSB 已经开发出一些第三方应用E序Q包?JPhoto 目(q是一个用 jUSB q接到数码照相机的应用程??jSyncManager 目(q是一个用 jUSB 与?Palm 操作pȝ?PDA 同步的应用程??/span>
JSR-80 API (javax.usb)
正如前面提到的,JSR-80 目是由 IBM ?Dan Streetman ?1999q创立的?001q_(d)q个目通过 Java 规范h(JSR)q程被接受ؓ(f) Java 语言的候选扩展标准。这个项目现在称?JSR-80 q且被正式分z了(jin) Java ?javax.usb。这个项目?Common Public License 的许可证形式Qƈ通过 Java Community Process q行开发。这个项目的目标是ؓ(f) Java q_开发一?USB 接口Q可以从M Java 应用E序中完全访?USB pȝ。JSR-80 API 支持 USB 规范所定义的全部四U传输类型。目前,?API ?Linux 实现可以在支?2.4 核心(j)的大多数最?GNU/Linux 版本上工作,?Red Hat 7.2 ?9.0?/span>
JSR-80 目包括三个包:(x)javax-usb (javax.usb API)、javax-usb-ri (操作pȝ无关的基准实现的公共部分)以及(qing) javax-usb-ri-linux (Linux q_的基准实玎ͼ它将公共基准实现链接?Linux USB 堆栈)。所有这三个部分都是构成 Linux q_?java.usb API 完整功能所必需的。在该项目的?sh)子邮g列表中可以看到有人正在致力于这?API UL到其他操作系l上(主要?Microsoft Windows)Q但是还没有可以工作的版本发表?/span>
管 JSR-80 API 的操作系l无关的实现在不同的操作pȝ上是不同的,但是 Java E序员只需要理?javax.usb 包就可以开始开发应用程序了(jin)。表 2 列出?javax.usb 中的接口和类Q?Java E序员应该熟(zhn)它们:(x)
?2. JSR-80 API 中的接口和类
?JSR-80 API 讉K USB 讑֤的正常过E如下:(x)
清单 3. ?JSR-80 API 获得 USB pȝ的内?/span>
清单 4 展示?jin)在应用E序成功地找?Device 后,如何?Interface ?EndPoint q行 I/O。这D代码还可以修改行所有四U数据传输类型的 I/O。它对应于上q步?4 到步?6?/span>
清单 4. ?JSR-80 API q行 I/O
JSR-80 目从一开始就非常z跃?003q?2月发表了(jin) javax.usb API、RI ?RI ?0.10.0 版本。看hq一版本?x)提交?JSR-80 委员?sh)(x)做最l批准。预计正式成?Java 语言的扩展标准后Q其他操作系l上的实C(x)很快出现。Linux 开发者团体看来对 JSR-80 目的兴比 jUSB 目更大Q?Linux q_?javax.usb API 的项目数量在不断地增加?/span>
l束?/b>
jUSB API ?JSR-80 API 都ؓ(f)应用E序提供?jin)从q行 Linux 操作pȝ的计机中访?USB 讑֤的能力。JSR-80 API 提供?jin)?jUSB API 更多的功能,很有可能成ؓ(f) Java 语言的扩展标准。目前,只有 Linux 开发h员可以利?jUSB ?JSR-80 API 的功能。不q,有h正在U极地将q两U?API UL到其他操作系l上。Java 开发h员应该在不久可以在其他操作pȝ上访?USB 讑֤。从现在起就熟?zhn)q些 APIQ当q些目可以在多个^C发挥作用Ӟ(zhn)就可以在自q应用E序中加?USB 功能?jin)?/span>
用Java语言实现的各U排序,包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归q排序、堆排序、SortUtil{?/p>
插入排序Q?/strong>
package org.rut.util.algorithm.support;
冒(chng)排序Q?/strong>
package org.rut.util.algorithm.support;
选择排序Q?/strong>
package org.rut.util.algorithm.support;
Shell排序Q?/strong>
package org.rut.util.algorithm.support;
快速排序:(x)
package org.rut.util.algorithm.support;
改进后的快速排序:(x)
package org.rut.util.algorithm.support;
归ƈ排序Q?/strong>
package org.rut.util.algorithm.support;
改进后的归ƈ排序:
package org.rut.util.algorithm.support; }
堆排序:(x)
package org.rut.util.algorithm.support;
SortUtilQ?/strong>
package org.rut.util.algorithm; (tng) (tng) 应用开发中的技??/p>
作者:(x)z徏 2000q毕业以来,从事SUN Solarisq_的J2EE保险行业的应用开发已l有三年多的旉?jin)。在q些q的开发实践中Q积累了(jin)一些自p为对工作有帮助的技巧和Ҏ(gu)Q希望给其他的同行也有所帮助?/p>
一、对JAVA源文件、类、帮助文档的理
在一个实际的应用开发中Q都需要编写大量的JavaBeans{等一些JAVAcR尤其在一个项目中?x)有大量的共用类供其他开发h员(sh)用,那么很好地管理这些类Q方便其他开发h员的查找相关帮助和项目中各成员的怺学习(fn)Q有必要采用一U简单、行之有效的Ҏ(gu)辑ֈ该目的?/p>
1、JAVA源文件的l织
现有两个packageQ?/p>
那么我们可以在work工作目录分别建立以下文g夹:(x)
相应的JAVA源文件分别置于basicinfo和util文g夹下卛_。那么我们可以把所有的JAVA源文件放在com文g下相应的子文件夹下?
2、JAVA源文件的~译
先书写一个文本文件filelist.txt保存在work目录下,其内容ؓ(f)Q?/p>
然后在work目录下徏立一个classes文g夹,用来存储class文g?/p>
在命令行方式下进入到work目录Q用以下命o(h)~译卛_Q?/p>
如果~译通过的话Q将形成以下的文件夹和类文gQ?/p>
那么我们可以把所有的CLASScL仉攑֜classes文g夹下相应的子文g夹下?/p>
3、生成帮助文?/b>
先书写一个文本文件package.txt保存在work目录下,其内容ؓ(f)Q?/p>
然后在work目录下徏立一个docs文g夹,用来存储javadoc帮助文g?/p>
在命令行方式下进入到work目录Q用以下命o(h)~译卛_Q?/p>
他将形成以下的文件夹和htmlcd的帮助文档:(x)
那么我们可以把所有的html帮助文g都放在docs文g夹下相应的子文g夹下?/p>
4、用java2html工具
利用java2html工具可以方便地生成类gjavadoccd的java源码览html面。可以先到http://www.java2html.com|站下蝲一个Java2HTML.zip文gQ解压后j2h.jar文g的\径添加到classpath环境变量中?/p>
然后在work目录下徏立一个codeSource文g?/p>
在命令行方式下进入到work目录Q用以下命o(h)卛_Q?/p>
他将形成以下的文件夹和htmlcd的JAVA源代码html查看面Q?/p>
5、ȝ
通过q些单的Ҏ(gu)和步骤,我们可以分门别类地把java源文件、classcL件、javadoc帮助文档和java源代码html览面l织在work工作目录下不同的子文件夹下,l构清晰、有利于工作的展开和开发h员(sh)间的交流?/p>
Win32
?/span>
Swt-Designer
环境Q?/span>
win32
Q?/span>
Eclipse3.1
Q?/span>
Designer_v
1Q?span style="FONT: 7pt 'Times New Roman'"> (tng)
首先?/span>
http://www.swt-designer.com/
左边?/span>
download
菜单点击q去后下?/span>
Edition for Eclipse 3.1 & 3.2
Q下载后的文件名?/span>
Designer_v
2Q?span style="FONT: 7pt 'Times New Roman'"> (tng)
然后在我的网l硬盘(sh)下蝲破解文g
: http://www.thefilehut.com/userfiles/gufen/forblog/swt.designer.pro.keygen.for.eclipse.3.1.rar
3Q?span style="FONT: 7pt 'Times New Roman'"> (tng)
解压后在
cmd
命o(h)中敲?/span>
swt.ui.bat
Q运行后出现以下界面Q输入框中的内容Q然后点?/span>
Generate
产生序列号和Ȁzȝ?/span>
a)
该目录下的
org.eclipse.swt.win32.win32.x86_
b)
?/span>
Eclipse
目录下找?/span>
swt.jar
Q名字视版本而定Q?/span>
eclipse3.1
下是
org.eclipse.swt.win32.win32.x86_
c)
修改
swt.ui.bat,
如这P(x)
原来?/span>
: start javaw -cp SWTDesigner_
修改?/span>
:start javaw -cp SWTDesigner_
U色Z改的地方Q然后运行后?/span>
Version
填入你下载的
swt-designer
版本号即可生注册码?/span>
4. (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
下载的
Designer_v
q行
eclipse,
打开
window->preferences?>
选择左边?wi)Ş中?/span>
designer(
如果没有q一说?/span>
swt-designer
插g没有安装成功
)
?/span>
->
点击右下的?/span>
Registration and Activation
?/span>
->
弹出?/span>
Product Registration and Activation
”框Q用默认直接点击
Next->
q一步需要注意的?/span>
Name
框中两个字符串之间要有个I格Q他?x)认Z个是姓一个是名,否则
Next
按钮一直是灰的Q其他随便填Q?/span>
email
框中要合?/span>
email
格式可以了(jin)
->
输入破解产生的序列号和激zȝ
->
昄?/span>
Activation is complete. Thank you.
”表C破解成?/span>
现在可以免费?/span>
swt-designer
?/span>
Win32
?/span>
MyEclipse4.0
破解
q个破解h很简单,先去
http://www.myeclipseide.com
下蝲
Myeclipse4.0,
然后?/span>
http://www.thefilehut.com/userfiles/gufen/forblog/MyEclipse-4.0.0-GA.Keygen.zip
下蝲破解。安?/span>
Myeclipse,
之后解压破解文g后运?/span>
keygen.bat
Q生一?/span>
key
Q之后在
Myeclipse
注册一下就可以?jin)?span lang="EN-US">Myeclipse我忘C么地Ҏ(gu)册了(jin)Q好像装?span lang="EN-US">Myeclipse后在preferences中的Myeclipse里点几下׃(x)弹出来个框,把key copyq去认可以了(jin)?br /> 现在不一样了(jin)?/P>
2q_标准?/a>QJ2SETMQ?.4版包含一个名 ?CODE>的新软g?/a>Q得用正则表辑ּ成ؓ(f)可能?目前的功能包括元字符的用,它赋予正则表辑ּ极大的灵zL?/P>
本文概括Cl了(jin)正则表达式的使用Qƈ详细解释如何利用
Z(jin)~译q些例子中的代码和在应用E序中用正则表辑ּQ需要安?J2SE 1.4版?/P>
构造正则表辑ּ
正则表达式是一U字W模式,它描q的是一l字W串。你可以使用 正则表达式最单的形式是一个精的字符Ԍ比如“Java”或 “programming”。正则表辑ּ匚wq允怽(g)查一个字W串是否W合某个具体?句法形式Q比如是不是一个电(sh)?a class="bluekey" target="_blank">邮g地址 Z(jin)~写正则表达式,普通字W和Ҏ(gu)字符都要使用Q?/P>
正则表达式中出现的Q何其他字W都是普通字W,除非它前面有? Ҏ(gu)字符有着特别的用处。例如,.可匹配除?jin)换行符之外的Q意字W。与 在正则表辑ּ中有许多Ҏ(gu)字符Q可以查找一行开头的单词Q忽略大写?大小写敏感的单词Q还有特D字W可以给Z个范_(d)比如 使用q个新Y件包的正则表辑ּ用法与PerlcMQ所以如果你熟?zhn)Perl中正?表达式的使用Q就可以在Java语言中用同L(fng)表达式语法。如果你不熟(zhn)正?表达式,下面是一些入门的例子Q?/P>
]]>
ERPQ企业资源管理计划)(j)——Enterprise Resources PlannigQ是在先q的企业理思想的基上,应用信息技术实现对整个企业资源的一体化理。ERP是一U可以提供跨地区、跨部门、甚臌公司整合实时信息的企业管理信息系l。它在企业资源最优化配置的前提下Q整合企业内部主要或所有的l营zdQ包括胦(ch)务会(x)计、管理会(x)计、生产计划及(qing)理、物料管理、销售与分销{主要功能模块,以达到效率化l营的目标?br />
ERP?0q代后期从美国传入,为我国的企业体制攚w注入的新的活力,ERP已成为大型现代企业管理中不可或缺的有力管理工P是企业现代化和信息化E度的重要标志。ERP目是一个企业管理系l工E,而不是一般意义上的企业管理信息系l工E或者是企业信息化徏讑ַE,q是因ؓ(f)整个理pȝ不但ZERP、系l工E和信息技术等CU学技术的思想、原理和Ҏ(gu)Q而且q(sh)本质上充分地体现?jin)企业应用ERP与开展企业管理创新、推q企业管理现代化和提高(sh)业竞争力的必然关pR?br />
1、销售:(x)销售部门接客户采购计划Q根据客戯求,查看是否有库存,有——即l客户发货;无——即下生产Q务给生部门Q要求安排生产;待成品机器完工后Q即可给客户发货?br />
2、生产:(x)生部门接销售部dQ向生车间下达生dQ可依据库存Q向采购部门误有关雉件。完工后Q入库供销售部发货?br />
3、采购:(x)采购部门依据所接请购Q务和库存情况Q向材料供应商采购料品?br />
4、库存:(x)仓库Ҏ(gu)雉件的安全库存量向采购部门误雉件。依据生产R间的生领单lR间发料?/font>
客户化配|等功能。技术和应用的完结合应该是ERP成熟的一个表玎ͼ但是Q我国ERP 软g目前存在的以下三个方面的问题严重媄(jing)响ERP 软g的生存周期,q而制UERP 的运用?/font>
]]>
www.e-works.com.cn
其他q有很多,但是国内我认两个p够了(jin),资料也很?前者还相对较权?
其他的网站我认ؓ(f)都是抄袭.(ERP行业咨询实施12q经?
ERPQ企业资源计划)(j)是一U企业管理的思想Q强调对企业的内部甚臛_部的资源q行优化配置、提高利用效率?
一个由 Gartner Group 开发的概念Q描qC一代制造商业系l和刉资源计划(MRP IIQY件。它?yu)包含客?服务架构Q用图形用h口,应用开攄l制作。除?jin)已有的标准功能Q它q包括其它特性,如品质、过E运作管理、以?qing)调整报告等。特别是QERP采用的基技术将同时l用戯Y件和g两方面的独立性从而更加容易升U。ERP的关键在于所有用戯够裁剪其应用Q因而具有天然的易用性?
Gartner Group提出ERP具备的功能标准应包括四个斚w:
1.越MRPⅡ范围的集成功能
包括质量理;试验室管?程作业理;配方理;产品数据理;l护理;制报告和仓库管理?
2.支持混合方式的制造环?
包括既可支持L又可支持程的制造环?按照面向对象的业务模型组合业务过E的能力和国际范围内的应用?
3.支持能动的监控能?提高?sh)务l效
包括在整个企业内采用控制和工E方?模拟功能;决策支持和用于生产及(qing)分析的图形能力?
4.支持开攄客户?服务器计环?
包括客户?服务器体pȝ?囑Ş用户界面(GUI);计算助设计工E?CASE),面向对象技?使用SQL对关pL据库查询;内部集成的工E系l、商业系l、数据采集和外部集成 (EDI)?
ERP是对MRPⅡ的越,从本质上?ERP仍然是以MRPⅡؓ(f)核心(j),但在功能和技术上却超了(jin)传统的MRP?它是以顾客驱动的、基于时间的、面向整个供应链理的企业资源计划?
一、ERPpȝ的管理思想
ERP的核?j)管理思想是实现Ҏ(gu)个供应链的有效管理,主要体现在以下三个方面:(x)
1、体现对整个供应链资源进行管理的思想
在知识经时代仅靠自׃业的资源不可能有效地参与?jng)场竞争Q还必须把经营过E中的有兛_方如供应商、制造工厂、分销|络、客L(fng)U_一个紧密的供应链中Q才能有效地安排企业的、供、销zdQ满企业利用全C会(x)一切市(jng)源快速高效地q行生l营的需求,以期q一步提高效率和在市(jng)Z获得竞争优势。换句话_(d)C企业竞争不是单一企业与单一企业间的竞争Q而是一个企业供应链与另一个企业供应链之间的竞争。ERPpȝ实现?jin)对整个企业供应铄理Q适应?jin)企业在知识l济时代?jng)场竞争的需要?
2、体现精益生产、同步工E和敏捷刉的思想
ERPpȝ支持Ҏ(gu)合型生方式的管理,其管理思想表现在两个方面:(x)其一?#8220;_生LPQLean ProductionQ?#8221;的思想Q它是由国ȝ理工学院QMITQ提出的一U企业经营战略体pR即企业按大扚w生方式l织生Ӟ把客戗销售代理商、供应商、协作单位纳入生产体p,企业同其销售代理、客户和供应商的关系Q已不再单地是业务往来关p,而是利益׃n的合作伙伴关p,q种合作伙伴关系l成?jin)一个企业的供应链,q即是精益生产的核心(j)思想。其二是“敏捷刉(Agile ManufacturingQ?#8221;的思想。当?jng)场发生变化Q企业遇有特定的?jng)场和品需求时Q企业的基本合作伙伴不一定能满C品开发生产的要求Q这Ӟ企业?x)组l一个由特定的供应商和销售渠道组成的短期或一ơ性供应链QŞ?#8220;虚拟工厂”Q把供应和协作单位看成是企业的一个组成部分,q用“同步工程QSEQ?#8221;Q组l生产,用最短的旉新产品打入?jng)场Q时M持品的高质量、多样化和灵zL,q即?#8220;敏捷刉?#8221;的核?j)思想?
3、体C先计划与事中控制的思想
ERPpȝ中的计划体系主要包括Q主生计划、物料需求计划、能力计划、采购计划、销售执行计划、利润计划、胦(ch)务预和人力资源计划{,而且q些计划功能与h(hun)值控制功能已完全集成到整个供应链pȝ中?
另一斚wQERPpȝ通过定义事务处理QTransactionQ相关的?x)计核算U目与核方式,以便在事务处理发生的同时自动生成?x)计核算分录Q保证了(jin)资金与物流的同步记录和数据的一致性。从而实C(jin)Ҏ(gu)财务资金现状Q可以追溯资金的来龙去脉Qƈq一步追溯所发生的相关业务活动,改变?sh)(jin)资金信息滞后于物料信息的状况,便于实现事中控制和实时做出决{?
此外Q计划、事务处理、控制与决策功能都在整个供应铄业务处理程中实玎ͼ要求在每个流E业务处理过E中最大限度地发挥每个人的工作潜能与责d(j)Q流E与程之间则强调h与h之间的合作精,以便在有机组l中充分发挥每个的主观能动性与潜能。实C业管理从“高耸式”l织l构?#8220;扁^?#8221;l织机构的{变,提高?sh)业对?jng)场动态变化的响应速度?
MQ借助IT技术的飞速发展与应用QERPpȝ得以很多先q的理思想变成现实中可实施应用的计机软gpȝ?
二、应用ERP与企业的关系
ERP是借用一U新的管理模式来攚w原企业旧的理模式Q是先进的、行之有效的理思想和方法。ERP软g在实际的推广应用中,其应用深度和q度都不CQ多C业的效果不显著,没有引v企业决策者的震动和h们的q泛x(chng)?
1Q实施ERP是企业管理全方位的变?
企业领导层应该首先是受教育者,其次才是C理理论的诏彻者和实施者,规范企业理?qing)其有关环节Q之成为领D、管理层?qing)员工自觉的行动QC理意识扎根于企业中Q成Z业文化的一部分。国外企业实施ERP g没有讨论的余圎ͼ全盘接受Q自觉性强。其实,办企业这样做是天l地义的Q而我们还要等待思想提高Q观忉|斎ͼ有时q要避开锋芒Q迁陈腐,互相推诿。如果我们不坚决向这些陋?fn)告别,q场全方位的变革׃(x)反复、甚臛_折?
2Q企业管理班子要取得p
要眼睛向内,l好内功Q做好管理的基础工作Q这是Q何再好的应用软g和Y件供应商都无法提供的Q只能靠自己勤勤x(chng)地耕耘。把ERP的实施称?W一把手工程"Q这说明?jin)企业的决策者在ERP实施q程中的Ҏ(gu)作用。ERP是一个管理系l,牵动全局Q没有第一把手的参与和授权Q很难调动全局?
3QERP的投入是一个系l工E?
ERP的投入和产出与其他固定资产设备的投入和出比较,q不那么直观、浅昑֒明了(jin)Q投入不可能马上得到回报Q见到效益。ERP的投入是一个系l工E,q不能立竿见影,它所贯彻的主要是理思想Q这是企业管理中的一条红Uѝ它长期起作用、创效益Q在不断深化中向理要效益?
此外Q实施ERPq要因地制宜Q因企业而别Q具体问题具体分析。首先,要根据企业的具体需求上相应的系l,而不是笼l地都上型机,或者不企业的规模?WindowsNTQ这样长期运作,对企业危x(chng)极大。其ơ,q种投入不是一x(chng)逸的Q由于技术的发展很快Q随着工作的深入,企业?x)越来越感到资源的紧~,因此Q每q应有相应的投入Q才能保证系l健康地q{?
4QERP的实施需要复合型人才
他们既要懂计机技术,又要懂管理。当前高校对复合型h才的培养q远满不了(jin)企业的需求。复合型人才的培养需要有一个过E和一定的旉Q但企业领导者常把这样不多的人才当作一般管理者,没有把他们当作是企业来之不易的胦(ch)富,是一支重要的队伍。这与长期忽视管理有养Iq些复合型h才在企业中的Cq远不及(qing)?jng)场开拓h员和产品开发者,而是"辅助"角色Q不是政{倾斜对象Q这U因素是造成人才失的重要原因。另外,当企业上ERPӞq些复合型h才vC(jin)先导作用Q而一旦管理进入常规,他们g又成为多余的人,q已成ؓ(f)必然规律。在人才?jng)场上,复合型h才最为活跃,那些有眼力的企业安?x)下功夫挖掘(sh)才Q而这也不利于实施队伍的稳定?
MQ条件具备的企业要不失时机地上ERP理pȝQ不能只搞纯理论研究、再研究Q长旉地考察。要首先整理好内部管理基本数据,选定或开发适合自己企业的ERP软gQ条件成熟了(jin)׃?
三、ERP的风险及(qing)光?
企业的条件无论多优越Q所做的准备无论多充分,实施的风险仍然存在。在ERPpȝ的实施周期中Q各U媄(jing)响因素随旉可能发生变化。如何有效地理和控刉险是保证ERPpȝ实施成功的重要环节之一?
ERP目的风?
通常Z在考虑p|的因素时Q一般着重于对实施过E中众多因素的分析,而往往忽视目启动前和实施完成后ERPpȝ潜在的风险。对于ERP目而言Q风险存在于目的全q程Q包括项目规划、项目预准备、实施过E和pȝq行。归Uv来,ERP目的风险主要有以下几方面:(x)
1. ~Z规划或规划不合理Q?
2. 目预准备不充分Q表Cؓ(f)g选型?qing)ERP软g选择错误Q?
3. 实施q程控制不严|阶段成果未达标;
4. 设计程~Z有效的控制环节;
5. 实施效果未做评估或评C合理Q?
6. pȝ安全设计不完善,存在pȝ被非法入늚隐?zhn)Q?
7. N防范措施不当或不完整Q容易造成pȝ崩溃?
1Q战略规?
企业是否存在一个五q的ITpȝ规划Q随着C会(x)的信息化QITpȝ对于企业不仅是工P更是技术手Dc(din)ERP作ؓ(f)ITpȝ的重要组成部分,服务于企业的长期规划Q是长期规划的手D和保证。ERP的目标源于ITpȝ规划Q是评h(hun)ERPpȝ成|的基本标准,应依据ITpȝ规划Q明ERP pȝ的实施范围和实施内容?
2Q项目预准备
定g?qing)网l方案、选择ERPpȝ和评估咨询合作伙伴是该阶D늚三项主要dQ也是ERPpȝ实施的三大要素。硬件及(qing)|络Ҏ(gu)直接影响pȝ的性能、运行的可靠性和E_性;ERPpȝ功能的强弱决定企业需求的满E度Q咨询合作伙伴的工作能力和经验决定实施过E的质量?qing)实施成效?
3Q项目实施控?
在ERPpȝ实施中,通常采用目理技术对实施q程q行控制和管理。有效的实施控制表现在科学的实施计划、明的阶段成果和严格的成果审核。不仅如此,有效的控制还表现在积极的协调和通畅的信息传递渠道。实施ERP 的组l机构包括:(x)指导委员?sh)(x)、项目经理、外部咨询顾问、IT部门、职能部门的实施组和职能部门的最l用戗部门之间协调和交流得好坏决定实施过E的工作质量和工作效率。目前,在企业缺乏合适的目l理的条件下Q这一风险其明显和严重?
4Q业务流E控?
企业业务程重组是在目实施的设计阶D完成的。流E中的控制和监督环节保证ERP在正式运行后Q各业务处于有效的控制之中Q避免企业遭受h为损失。设计控制环节时Q要兼顾控制和效率。过多的控制环节和业务流E冗余势必降低工作效率。而控制环节不_?x)有业务失控的风险?
5Q项目实施效?
虽然目评估是ERP实施q程的最后一个环节。但qƈ不意味着目评估不重要。相反,目评估的结果是ERP实施效果的直接反映。正地评h(hun)实施成果Q离不开清晰的实施目标、客观的评h(hun)标准和科学的评h(hun)Ҏ(gu)。目前普遍存在着忽视目评估的问题。忽视项目评估将带来实施组不关?j)实施成果这一隐?zhn)。这正是ERP目的巨大风险所在?
6Q系l安全管?
pȝ安全包括Q操作系l授权、网l设备权限、应用系l功能权限、数据访问权限、病毒的预防、非法入늚监督、数据更改的q踪、数据的安全备䆾与存档、主机房的安全管理规章、系l管理员的监督,{等。目前,企业中熟l掌握计机技术的人员较少Q计机接入Internet的也不多。因此,在实施ERPpȝӞ普遍存在着不重视系l安全的现象。诸如:(x)用户不注意口令保密、超U用h权多人等。缺乏安全意识的直接后果是系l在安全设计上存在着漏洞和缺陗近q来Q不断有报章披露银行或企业计机pȝ被非法入늚消息Q这l企业敲响了(jin)警钟?
7Q意外事故或N
水灾、火灾、地震等不可抗拒的自然灾害会(x)lERPpȝ带来毁灭性的打击。企业正式启用ERPpȝ后,q种破坏直接造成业务交易的中断,l企业带来不可估量的损失。未雨绸~的{略和应Ҏ(gu)施是降低q一风险的良斏V如建立q程备䆾和恢复机Ӟ在计机pȝ不能正常工作的情况下Q恢复手工处理业务的步骤和措施?
四、ERP应用成功的标?
ERP应用是否成功Q原则地_(d)可以从以下几个方面加以衡量:(x)
1Q?pȝq行集成化:(x)
q是ERP应用成功在技术解x(chng)案方面最基本的表现。ERPpȝ是对企业物流、资金流、信息流q行一体化理的Y件系l,其核?j)管理思想是实现?#8220;供应链(Supply ChainQ?#8221;的管理。Y件的应用跨多个部门甚臛_个企业。ؓ(f)?jin)达到预期设定的应用目标Q最基本的要求是pȝ能够q行hQ实现集成化应用Q徏立企业决{完善的数据体系和信息共享机制?
一般来_(d)如果ERPpȝ仅在财务部门应用Q只能实现胦(ch)务管理规范化、改善应收帐Ƒ֒资金理Q仅在销售部门应用,只能加强和改善营销理Q仅在库存管理部门应用,只能帮助掌握存货信息Q仅在生产部门应用只能辅助制定生产计划和物资需求计划。只有集成一体化q行hQ才有可能达刎ͼ(x)
降低库存Q提高资金利用率和控制经营风险;
控制产品生成本Q羃短品生产周期;
提高?sh)品质量和合格率Q?
减少财务坏帐、呆帐金额等?
q些目标能否真正辑ֈQ还要取决于企业业务程重组的实施效果?
2Q?业务程合理化:(x)
q是ERP应用成功在改善管理效率方面的体现。ERP应用成功的前提是必须对企业实施业务流E重l,因此QERP应用成功也即意味着企业业务处理程于合理化,q实C(jin)ERP应用的以下几个最l目标:(x)
企业竞争力得到大q度提升Q?
企业面对?jng)场的响应速度大大加快Q?
客户满意度显著改善?
3Q?l效监控动态化Q?
ERP的应用,ؓ(f)企业提供丰富的管理信息。如何用好这些信息ƈ在企业管理和决策q程中真正vC用,是衡量ERP应用成功的另一个标志。在ERPpȝ完全投入实际q行后,企业应根据管理需要,利用ERPpȝ提供的信息资源设计出一套动态监控管理W效变化的报表体系Q以期即时反馈和U正理中存在的问题。这工作,一般是在ERPpȝ实施完成后由企业设计完成。企业如未能利用ERPpȝ提供的信息资源徏立v自己的W效监控系l,意味着ERPpȝ应用没有完全成功?
4Q?理改善持箋(hu)化:(x)
随着ERPpȝ的应用和企业业务程的合理化Q企业管理水q_?x)明显提高。ؓ(f)?jin)衡量企业管理水q的改善E度Q可以依据管理咨询公司提供的企业理评h(hun)指标体系对企业管理水q行综合评仗评仯E本wƈ不是目的Qؓ(f)企业建立一个可以不断进行自我评价和不断改善理的机Ӟ才是真正目的。这也是ERP应用成功的一个经怸被h们重视的标志
]]>
Q图2Q新Z个EJB工程Q?/p>
Q图3Q新Z个EJB工程l)(j)
Q图4Q新Z个EJB工程完毕Q?/p>
Q图5Q新Z个SessionBean ModuleQ?/p>
Q图6Q创建期参数Q?/p>
1. 为适应Xdoclet的惯用法QEJB lg的BeancL在的包名应该以?ejb”结,Beancd应该以“Bean”或“EJB”结,q里我用的是“Bean”?br />2. 如果q个BeancMl扩展而直接用,那么应该实C个“ejbCreate”方法。如果扩展后再用的话,那么可以攑ֈ子类里面再实现?/p>
Q图7QSessionBean创徏完毕Q?/p>
Q图8Q开始Xdoclet配置Q?/p>
Q图9Q)(j)
Q图10QRemove不需要的目Q?/p>
Q图11Q)(j)
Q图13Q)(j)
Q图14Q)(j)
Q图15Q)(j)
Q图16Q)(j)
Q图17Q)(j)
Q图18Q)(j)
Q图19Q)(j)
Q图20Q)(j)
Q图21Q)(j)
Q图22Q)(j)
Q图23Q)(j)
Q图24Q)(j)
Q图25Q)(j)
Q图26Q)(j)
Q图27Q)(j)
Q图28Q)(j)
Q图29Q)(j)
Q图30Q)(j)
Q图31Q)(j)
Q图32Q)(j)
有问题请大家回帖共同探讨?br />希望q有Z(x)下次跟大家讨论EntityBean的开发,
再下ơ是MessageDrivenBeanQ以?qing)综合实例。:(x)Q?/p>
]]>
]]>
?Java 应用E序中访问USB讑֤
作? 斌
·usb.core: q个包是 jUSB API 的核?j)部分。它使得 Java 应用E序可以?USB L讉K USB 讑֤?br />·usb.linux: q个包包?usb.core.Host 对象?Linux 实现、bootstrapping 支持和其他可以提?Linux USB 支持的类。这个实现通过虚拟 USB 文gpȝ(usbdevfs)讉K USB 讑֤?br />·usb.windows: q个包包?usb.core.Host 对象?Windows 实现、bootstrapping 支持和其他可以提?Windows USB 支持的类。这个实C然处于非常初U的阶段?br />·usb.remote: q个包是 usb.core API 的远E版本。它包括一?RMI proxy 和一?daemon 应用E序Q它?Java 应用E序可以讉Kq程计算Z?USB 讑֤?br />·usb.util: q个包提供了(jin)一些有用的实用E序Q可以将 firmware下蝲?USB 讑֤上、将 USB pȝ的内容{储到 XML 中、以?qing)将只?bulk I/O ?USB 讑֤工具转换成一个套接字(socket)?br />·usb.devices: q个可选包攉?jin)?jUSB API 讉K不同 USB 讑֤?Java 代码Q包括柯达数码相机和 Rio 500 MP3 播放器。这?API l过特别~写以简化访问特?USB 讑֤的过E,q且不能用于讉K其他讑֤。这?API 是在 usb.core API 之上构徏的,它们可以工作在所有支?jUSB 的操作系l上?br />·usb.view: q个可选包提供?jin)基?Swing ?USB ?wi)简单浏览器。它是一个展C?jUSB API 应用的很好的CZE序?/span>
接口
说明
Bus
一l?USB 讑֤q接?Host ?/td>
Host
表示h一个或者多?Bus ?USB 控制?/td>
c?/td>
说明
Configuration
提供对设备所支持?USB 配置的访问,以及(qing)对与该配|关联的接口的访?/td>
Descriptor
h USB cd的描q符的实体的基类
Device
提供?USB 讑֤的访?/td>
DeviceDescriptor
提供?USB 讑֤描述W的讉K
EndPoint
提供?USB 端点描述W的讉K、在l定讑֤配置中构造设备数据输入或者输?/td>
HostFactory
包含 bootstrapping Ҏ(gu)
Hub
提供?USB hub 描述W以?qing)一?hub 操作的访?/td>
Interface
描述一l端点,q与一个特定设备配|相兌
PortIdentifier
?USB 讑֤提供E_的字W串标识W,以便在操作和故障诊断时?/td>
?jUSB API 讉K一?USB 讑֤的正常过E如下:(x)
·通过?HostFactory 得到 USB Host q行 Bootstrap?br />·?Host 讉K USB BusQ然后从q个 Bus 讉K USB root hub(?USB Device)?br />·得到 hub 上可用的 USB 端口数量Q遍历所有端口以扑ֈ正确?Device?br />·讉K附加到特定端口上?USB Device。可以用一?Device ?PortIdentifier 直接?Host 讉K它,也可以通过?root hub 开始遍?USB Bus 扑ֈ它?br />·?ControlMessage 与该 Device 直接交互Q或者从?Device 的当?Configuration 中要求一?InterfaceQƈ与该 Interface 上可用的 Endpoint q行 I/O ?/span>
import usb.core.*;
public class ListUSB
{
public static void main(String[] args)
{
try
{
// Bootstrap by getting the USB Host from the HostFactory.
Host host = HostFactory.getHost();
// Obtain a list of the USB buses available on the Host.
Bus[] bus = host.getBusses();
int total_bus = bus.length;
// Traverse through all the USB buses.
for (int i=0; i<total_bus; i++)
{
// Access the root hub on the USB bus and obtain the
// number of USB ports available on the root hub.
Device root = bus[i].getRootHub();
int total_port = root.getNumPorts();
// Traverse through all the USB ports available on the
// root hub. It should be mentioned that the numbering
// starts from 1, not 0.
for (int j=1; j<=total_port; j++)
{
// Obtain the Device connected to the port.
Device device = root.getChild(j);
if (device != null)
{
// USB device available, do something here.
}
}
}
} catch (Exception e)
{
System.out.println(e.getMessage());
}
}
if (device != null)
{
// Obtain the current Configuration of the device and the number of
// Interfaces available under the current Configuration.
Configuration config = device.getConfiguration();
int total_interface = config.getNumInterfaces();
// Traverse through the Interfaces
for (int k=0; k<total_interface; k++)
{
// Access the currently Interface and obtain the number of
// endpoints available on the Interface.
Interface itf = config.getInterface(k, 0);
int total_ep = itf.getNumEndpoints();
// Traverse through all the endpoints.
for (int l=0; l<total_ep; l++)
{
// Access the endpoint, and obtain its I/O type.
Endpoint ep = itf.getEndpoint(l);
String io_type = ep.getType();
boolean input = ep.isInput();
// If the endpoint is an input endpoint, obtain its
// InputStream and read in data.
if (input)
{
InputStream in;
in = ep.getInputStream();
// Read in data here
in.close();
}
// If the Endpoint is and output Endpoint, obtain its
// OutputStream and write out data.
else
{
OutputStream out;
out = ep.getOutputStream();
// Write out data here.
out.close();
}
}
}
}
接口
说明
UsbConfiguration
表示 USB 讑֤的配|?/td>
UsbConfigurationDescriptor
USB 配置描述W的接口
UsbDevice
USB 讑֤的接?/td>
UsbDeviceDescriptor
USB 讑֤描述W的接口
UsbEndpoint
USB 端点的接?/td>
UsbEndpointDescriptor
USB 端点描述W的接口
UsbHub
USB hub 的接?/td>
UsbInterface
USB 接口的接?/td>
UsbInterfaceDescriptor
USB 接口描述W的接口
UsbPipe
USB 道的接?/td>
UsbPort
USB 端口的接?/td>
UsbServices
javax.usb 实现的接?/td>
c?/td>
说明
UsbHostManager
javax.usb 的入口点
·通过?UsbHostManager 得到相应?UsbServices q行 Bootstrap?br />·通过 UsbServices 讉K root hub。在应用E序?root hub 是一?UsbHub?br />·获得q接?root hub ?UsbDevices 清单。遍历所有低U?hub 以找到正的 UsbDevice?br />·用控制消?UsbControlIrp)?UsbDevice 直接交互Q或者从 UsbDevice 的相?UsbConfiguration 中要求一?UsbInterface q与?UsbInterface 上可用的 UsbEndpoint q行 I/O?br />·如果一?UsbEndpoint 用于q行 I/OQ那么打开与它兌?UsbPipe。通过q个 UsbPipe 可以同步或者异步提交上行数??USB 讑֤C计算?和下行数?从主计算机到 USB 讑֤)?br />·当应用程序不再需要访问该 UsbDevice Ӟ关闭q个 UsbPipe q攄应的 UsbInterface?br />
在清?3 中,我们?JSR-80 API 获得 USB pȝ的内宏V这个程序递归地遍?USB pȝ上的所?USB hub q找?gu)接到L计算Z的所?USB 讑֤。这D代码对应于上述步骤 1 到步?3?/span>
import javax.usb.*;
import java.util.List;
public class TraverseUSB
{
public static void main(String argv[])
{
try
{
// Access the system USB services, and access to the root
// hub. Then traverse through the root hub.
UsbServices services = UsbHostManager.getUsbServices();
UsbHub rootHub = services.getRootUsbHub();
traverse(rootHub);
} catch (Exception e) {}
}
public static void traverse(UsbDevice device)
{
if (device.isUsbHub())
{
// This is a USB Hub, traverse through the hub.
List attachedDevices = ((UsbHub) device).getAttachedUsbDevices();
for (int i=0; i<attachedDevices.size(); i++)
{
traverse((UsbDevice) attachedDevices.get(i));
}
}
else
{
// This is a USB function, not a hub.
// Do something.
}
}
}
public static void testIO(UsbDevice device)
{
try
{
// Access to the active configuration of the USB device, obtain
// all the interfaces available in that configuration.
UsbConfiguration config = device.getActiveUsbConfiguration();
List totalInterfaces = config.getUsbInterfaces();
// Traverse through all the interfaces, and access the endpoints
// available to that interface for I/O.
for (int i=0; i<totalInterfaces.size(); i++)
{
UsbInterface interf = (UsbInterface) totalInterfaces.get(i);
interf.claim();
List totalEndpoints = interf.getUsbEndpoints();
for (int j=0; j<totalEndpoints.size(); j++)
{
// Access the particular endpoint, determine the direction
// of its data flow, and type of data transfer, and open the
// data pipe for I/O.
UsbEndpoint ep = (UsbEndpoint) totalEndpoints.get(i);
int direction = ep.getDirection();
int type = ep.getType();
UsbPipe pipe = ep.getUsbPipe();
pipe.open();
// Perform I/O through the USB pipe here.
pipe.close();
}
interf.release();
}
} catch (Exception e) {}
}
]]>
用Java实现几种常见的排序算?br />
<转蝲> 作者:(x)treeroot
import org.rut.util.algorithm.SortUtil;
/**
(tng)* @author treeroot
(tng)* @since 2006-2-2
(tng)* @version 1.0
(tng)*/
public class InsertSort implements SortUtil.Sort{
(tng) (tng) (tng) /* (non-Javadoc)
(tng) (tng) (tng) (tng) * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
(tng) (tng) (tng) (tng) */
(tng) (tng) (tng) public void sort(int[] data) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int temp;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int i=1;i<data.length;i++){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,j,j-1);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) } (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) }
}
import org.rut.util.algorithm.SortUtil;
/**
(tng)* @author treeroot
(tng)* @since 2006-2-2
(tng)* @version 1.0
(tng)*/
public class BubbleSort implements SortUtil.Sort{
(tng) (tng) (tng) /* (non-Javadoc)
(tng) (tng) (tng) (tng) * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
(tng) (tng) (tng) (tng) */
(tng) (tng) (tng) public void sort(int[] data) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int temp;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int i=0;i<data.length;i++){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int j=data.length-1;j>i;j--){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(data[j]<data[j-1]){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,j,j-1);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) }
}
import org.rut.util.algorithm.SortUtil;
/**
(tng)* @author treeroot
(tng)* @since 2006-2-2
(tng)* @version 1.0
(tng)*/
public class SelectionSort implements SortUtil.Sort {
(tng) (tng) (tng) /*
(tng) (tng) (tng) (tng) * (non-Javadoc)
(tng) (tng) (tng) (tng) *
(tng) (tng) (tng) (tng) * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
(tng) (tng) (tng) (tng) */
(tng) (tng) (tng) public void sort(int[] data) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int temp;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) for (int i = 0; i < data.length; i++) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int lowIndex = i;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) for (int j = data.length - 1; j > i; j--) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (data[j] < data[lowIndex]) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) lowIndex = j;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,i,lowIndex);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) }
}
import org.rut.util.algorithm.SortUtil;
/**
(tng)* @author treeroot
(tng)* @since 2006-2-2
(tng)* @version 1.0
(tng)*/
public class ShellSort implements SortUtil.Sort{
(tng) (tng) (tng) /* (non-Javadoc)
(tng) (tng) (tng) (tng) * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
(tng) (tng) (tng) (tng) */
(tng) (tng) (tng) public void sort(int[] data) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int i=data.length/2;i>2;i/=2){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int j=0;j<i;j++){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) insertSort(data,j,i);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) insertSort(data,0,1);
(tng) (tng) (tng) }
(tng) (tng) (tng) /**
(tng) (tng) (tng) (tng) * @param data
(tng) (tng) (tng) (tng) * @param j
(tng) (tng) (tng) (tng) * @param i
(tng) (tng) (tng) (tng) */
(tng) (tng) (tng) private void insertSort(int[] data, int start, int inc) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int temp;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int i=start+inc;i<data.length;i+=inc){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int j=i;(j>=inc)&&(data[j]<data[j-inc]);j-=inc){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,j,j-inc);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) }
}
import org.rut.util.algorithm.SortUtil;
/**
(tng)* @author treeroot
(tng)* @since 2006-2-2
(tng)* @version 1.0
(tng)*/
public class QuickSort implements SortUtil.Sort{
(tng) (tng) (tng) /* (non-Javadoc)
(tng) (tng) (tng) (tng) * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
(tng) (tng) (tng) (tng) */
(tng) (tng) (tng) public void sort(int[] data) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) quickSort(data,0,data.length-1); (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) }
(tng) (tng) (tng) private void quickSort(int[] data,int i,int j){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int pivotIndex=(i+j)/2;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) //swap
(tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,pivotIndex,j);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int k=partition(data,i-1,j,data[j]);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,k,j);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) if((k-i)>1) quickSort(data,i,k-1);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) if((j-k)>1) quickSort(data,k+1,j);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) }
(tng) (tng) (tng) /**
(tng) (tng) (tng) (tng) * @param data
(tng) (tng) (tng) (tng) * @param i
(tng) (tng) (tng) (tng) * @param j
(tng) (tng) (tng) (tng) * @return
(tng) (tng) (tng) (tng) */
(tng) (tng) (tng) private int partition(int[] data, int l, int r,int pivot) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) do{
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) while(data[++l]<pivot);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) while((r!=0)&&data[--r]>pivot);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,l,r);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) while(l<r);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,l,r); (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return l;
(tng) (tng) (tng) }
}
import org.rut.util.algorithm.SortUtil;
/**
(tng)* @author treeroot
(tng)* @since 2006-2-2
(tng)* @version 1.0
(tng)*/
public class ImprovedQuickSort implements SortUtil.Sort {
(tng) (tng) (tng) private static int MAX_STACK_SIZE=4096;
(tng) (tng) (tng) private static int THRESHOLD=10;
(tng) (tng) (tng) /* (non-Javadoc)
(tng) (tng) (tng) (tng) * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
(tng) (tng) (tng) (tng) */
(tng) (tng) (tng) public void sort(int[] data) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int[] stack=new int[MAX_STACK_SIZE];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int top=-1;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int pivot;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int pivotIndex,l,r;
(tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) stack[++top]=0;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) stack[++top]=data.length-1;
(tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) while(top>0){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int j=stack[top--];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int i=stack[top--];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) pivotIndex=(i+j)/2;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) pivot=data[pivotIndex];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,pivotIndex,j);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) //partition
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) l=i-1;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) r=j;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) do{
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) while(data[++l]<pivot);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) while((r!=0)&&(data[--r]>pivot));
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,l,r);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) while(l<r);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,l,r);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,l,j);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if((l-i)>THRESHOLD){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) stack[++top]=i;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) stack[++top]=l-1;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if((j-l)>THRESHOLD){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) stack[++top]=l+1;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) stack[++top]=j;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) //new InsertSort().sort(data);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) insertSort(data);
(tng) (tng) (tng) }
(tng) (tng) (tng) /**
(tng) (tng) (tng) (tng) * @param data
(tng) (tng) (tng) (tng) */
(tng) (tng) (tng) private void insertSort(int[] data) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int temp;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int i=1;i<data.length;i++){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,j,j-1);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) } (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) }
}
import org.rut.util.algorithm.SortUtil;
/**
(tng)* @author treeroot
(tng)* @since 2006-2-2
(tng)* @version 1.0
(tng)*/
public class MergeSort implements SortUtil.Sort{
(tng) (tng) (tng) /* (non-Javadoc)
(tng) (tng) (tng) (tng) * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
(tng) (tng) (tng) (tng) */
(tng) (tng) (tng) public void sort(int[] data) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int[] temp=new int[data.length];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) mergeSort(data,temp,0,data.length-1);
(tng) (tng) (tng) }
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) private void mergeSort(int[] data,int[] temp,int l,int r){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int mid=(l+r)/2;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) if(l==r) return ;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) mergeSort(data,temp,l,mid);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) mergeSort(data,temp,mid+1,r);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int i=l;i<=r;i++){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) temp[i]=data[i];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int i1=l;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int i2=mid+1;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int cur=l;cur<=r;cur++){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if(i1==mid+1)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) data[cur]=temp[i2++];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else if(i2>r)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) data[cur]=temp[i1++];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else if(temp[i1]<temp[i2])
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) data[cur]=temp[i1++];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) else
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) data[cur]=temp[i2++]; (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) }
}
import org.rut.util.algorithm.SortUtil;
/**
(tng)* @author treeroot
(tng)* @since 2006-2-2
(tng)* @version 1.0
(tng)*/
public class ImprovedMergeSort implements SortUtil.Sort {
(tng) (tng) (tng) private static final int THRESHOLD = 10;
(tng) (tng) (tng) /*
(tng) (tng) (tng) (tng) * (non-Javadoc)
(tng) (tng) (tng) (tng) *
(tng) (tng) (tng) (tng) * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
(tng) (tng) (tng) (tng) */
(tng) (tng) (tng) public void sort(int[] data) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int[] temp=new int[data.length];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) mergeSort(data,temp,0,data.length-1);
(tng) (tng) (tng) }
(tng) (tng) (tng) private void mergeSort(int[] data, int[] temp, int l, int r) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int i, j, k;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int mid = (l + r) / 2;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) if (l == r)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) if ((mid - l) >= THRESHOLD)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) mergeSort(data, temp, l, mid);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) else
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) insertSort(data, l, mid - l + 1);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) if ((r - mid) > THRESHOLD)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) mergeSort(data, temp, mid + 1, r);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) else
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) insertSort(data, mid + 1, r - mid);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) for (i = l; i <= mid; i++) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) temp[i] = data[i];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) for (j = 1; j <= r - mid; j++) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) temp[r - j + 1] = data[j + mid];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int a = temp[l];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int b = temp[r];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) for (i = l, j = r, k = l; k <= r; k++) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (a < b) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) data[k] = temp[i++];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) a = temp[i];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) } else {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) data[k] = temp[j--];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) b = temp[j];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) }
(tng) (tng) (tng) /**
(tng) (tng) (tng) (tng) * @param data
(tng) (tng) (tng) (tng) * @param l
(tng) (tng) (tng) (tng) * @param i
(tng) (tng) (tng) (tng) */
(tng) (tng) (tng) private void insertSort(int[] data, int start, int len) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int i=start+1;i<start+len;i++){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int j=i;(j>start) && data[j]<data[j-1];j--){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(data,j,j-1);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) }
import org.rut.util.algorithm.SortUtil;
/**
(tng)* @author treeroot
(tng)* @since 2006-2-2
(tng)* @version 1.0
(tng)*/
public class HeapSort implements SortUtil.Sort{
(tng) (tng) (tng) /* (non-Javadoc)
(tng) (tng) (tng) (tng) * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
(tng) (tng) (tng) (tng) */
(tng) (tng) (tng) public void sort(int[] data) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) MaxHeap h=new MaxHeap();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) h.init(data);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int i=0;i<data.length;i++)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) h.remove();
(tng) (tng) (tng) (tng) (tng) (tng) (tng) System.arraycopy(h.queue,1,data,0,data.length);
(tng) (tng) (tng) }
(tng) (tng) (tng) (tng) private static class MaxHeap{ (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) void init(int[] data){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) this.queue=new int[data.length+1];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) for(int i=0;i<data.length;i++){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) queue[++size]=data[i];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) fixUp(size);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) private int size=0;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) private int[] queue;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng)
(tng) (tng) (tng) (tng) (tng) (tng) (tng) public int get() {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) return queue[1];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) public void remove() {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(queue,1,size--);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) fixDown(1);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) //fixdown
(tng) (tng) (tng) (tng) (tng) (tng) (tng) private void fixDown(int k) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int j;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) while ((j = k << 1) <= size) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (j < size && queue[j]<queue[j+1])
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) j++;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (queue[k]>queue[j]) //不用交换
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) break;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(queue,j,k);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) k = j;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) private void fixUp(int k) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) while (k > 1) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) int j = k >> 1;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) if (queue[j]>queue[k])
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) break;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) SortUtil.swap(queue,j,k);
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) k = j;
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) (tng) (tng) (tng) (tng) }
(tng) (tng) (tng) }
}
import org.rut.util.algorithm.support.BubbleSort;
import org.rut.util.algorithm.support.HeapSort;
import org.rut.util.algorithm.support.ImprovedMergeSort;
import org.rut.util.algorithm.support.ImprovedQuickSort;
import org.rut.util.algorithm.support.InsertSort;
import org.rut.util.algorithm.support.MergeSort;
import org.rut.util.algorithm.support.QuickSort;
import org.rut.util.algorithm.support.SelectionSort;
import org.rut.util.algorithm.support.ShellSort;
/**
(tng)* @author treeroot
(tng)* @since 2006-2-2
(tng)* @version 1.0
(tng)*/
public class SortUtil {
(tng) (tng) (tng) public final static int INSERT = 1;
(tng) (tng) (tng) public final static int BUBBLE = 2;
(tng) (tng) (tng) public final static int SELECTION = 3;
(tng) (tng) (tng) public final static int SHELL = 4;
(tng) (tng) (tng) public final static int QUICK = 5;
(tng) (tng) (tng) public final static int IMPROVED_QUICK = 6;
(tng) (tng) (tng) public final static int MERGE = 7;
(tng) (tng) (tng) public final static int IMPROVED_MERGE = 8;
(tng) (tng) (tng) public final static int HEAP = 9;
(tng) (tng) (tng) public static void sort(int[] data) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) sort(data, IMPROVED_QUICK);
(tng) (tng) (tng) }
(tng) (tng) (tng) private static String[] name={
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) "insert", "bubble", "selection", "shell", "quick", "improved_quick", "merge", "improved_merge", "heap"
(tng) (tng) (tng) };
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) private static Sort[] impl=new Sort[]{
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) new InsertSort(),
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) new BubbleSort(),
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) new SelectionSort(),
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) new ShellSort(),
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) new QuickSort(),
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) new ImprovedQuickSort(),
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) new MergeSort(),
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) new ImprovedMergeSort(),
(tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) (tng) new HeapSort()
(tng) (tng) (tng) };
(tng) (tng) (tng) public static String toString(int algorithm){
(tng) (tng) (tng) (tng) (tng) (tng) (tng) return name[algorithm-1];
(tng) (tng) (tng) }
(tng) (tng) (tng) (tng)
(tng) (tng) (tng) public static void sort(int[] data, int algorithm) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) impl[algorithm-1].sort(data);
(tng) (tng) (tng) }
(tng) (tng) (tng) public static interface Sort {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) public void sort(int[] data);
(tng) (tng) (tng) }
(tng) (tng) (tng) public static void swap(int[] data, int i, int j) {
(tng) (tng) (tng) (tng) (tng) (tng) (tng) int temp = data[i];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) data[i] = data[j];
(tng) (tng) (tng) (tng) (tng) (tng) (tng) data[j] = temp;
(tng) (tng) (tng) }
}
]]>
package com.j2ee.crm.util;
package com.j2ee.crm.basicinfo;
./com/j2ee/crm/basicinfo/UserInfo.java
./com/j2ee/crm/basicinfo/UserInfoList.java
./com/j2ee/crm/basicinfo/UserInfoDAO.java
./com/j2ee/crm/util/Utility.java
./com/j2ee/crm/util/DbException.java
./com/j2ee/crm/util/DbConnection.java
work>javac -d ./classes @filelist.txt
com.j2ee.crm.basicinfo
com.j2ee.crm.util
work> javadoc -d ./docs @package.txt
work> java j2h -js ./ -n 名称 -nh -nf -d ./codeSource
]]>
如果你所使用的环境和版本不是
win32
Q?/span>
Eclipse3.1
Q?/span>
Designer_v
以上破解Ҏ(gu)仅供个h学习(fn)Q请支持正版?形式Q?
]]>
1.泛型(Generic)
C++通过模板技术可以指定集合的元素cdQ而Java?.5之前一直没有相对应的功能。一个集合可以放Mcd的对象,相应C集合里面拿对象的时候我们也不得不对他们q行强制?a class="bluekey" target="_blank">cd转换。猛虎引入了(jin)泛型Q它允许指定集合里元素的cdQ这样你可以得到强类型在~译时刻q行cd(g)查的好处?BR>
Collection<String> c = new ArrayList();
c.add(new Date());
~译器会(x)l出一个错误:(x)
add(java.lang.String) in java.util.Collection<java.lang.String> cannot be applied to (java.util.Date)
2.For-Each循环
For-Each循环得加入简化了(jin)集合的遍历。假设我们要遍历一个集合对其中的元素进行一些处理。典型的代码为:(x)
void processAll(Collection c){
for(Iterator i=c.iterator(); i.hasNext();){
MyClass myObject = (MyClass)i.next();
myObject.process();
}
}
使用For-Each循环Q我们可以把代码改写成:(x)
void processAll(Collection<MyClass> c){
for (MyClass myObject :c)
myObject.process();
}
q段代码要比上面清晰许多Qƈ且避免了(jin)强制cd转换?BR>
自动装包/拆包大大方便?jin)基本类型数据和它们包装cd使用?BR>
自动装包Q基本类型自动{为包装类.(int >> Integer)
自动拆包Q包装类自动转ؓ(f)基本cd.(Integer >> int)
在JDK1.5之前Q我们L寚w合不能存攑֟本类型而耿耿于怀Q现在自动{换机制解决了(jin)我们的问题?BR>
int a = 3;
Collection c = new ArrayList();
c.add(a);//自动转换成Integer.
Integer b = new Integer(2);
c.add(b + 2);
q里Integer先自动{换ؓ(f)intq行加法q算Q然后int再次转换为Integer.
4.枚D(Enums)
JDK1.5加入?jin)一个全新类型的“类”-枚Dcd。ؓ(f)此JDK1.5引入?jin)一个新关键字enmu. 我们可以q样来定义一个枚丄型?BR>
public enum Color
{
Red,
White,
Blue
}
然后可以q样来用Color myColor = Color.Red.
枚Dcdq提供了(jin)两个有用的静(rn)态方法values()和valueOf(). 我们可以很方便地使用它们Q例?BR>
for (Color c : Color.values())
System.out.println(c);
5.可变参数(Varargs)
可变参数使程序员可以声明一个接受可变数目参数的Ҏ(gu)。注意,可变参数必须是函数声明中的最后一个参数。假设我们要写一个简单的Ҏ(gu)打印一些对象,
util.write(obj1);
util.write(obj1,obj2);
util.write(obj1,obj2,obj3);
?/TD>
在JDK1.5之前Q我们可以用重蝲来实玎ͼ但是q样需要写很多的重载函敎ͼ昑־不是很有效。如果用可变参数的话我们只需要一个函数就行了(jin)
public void write(Object... objs) {
for (Object obj: objs)
System.out.println(obj);
}
在引入可变参C后,Java的反包也更加方便用了(jin)。对于c.getMethod("test", new Object[0]).invoke(c.newInstance(), new Object[0]))Q现在我们可以这样写?jin)c.getMethod("test").invoke(c.newInstance())Q这L(fng)代码比原来清楚了(jin)很多。
6.?rn)态导?Static Imports)
要用用?rn)态成员(Ҏ(gu)和变量)(j)我们必须l出提供q个Ҏ(gu)的类。用静(rn)态导入可以被导入类的所有静(rn)态变量和?rn)态方法在当前cȝ接可见,使用q些?rn)态成员无需再给Z们的cd?BR>
import static java.lang.Math.*;
…?
r = sin(PI * 2); //无需再写r = Math.sin(Math.PI);
不过Q过度用这个特性也?x)一定程度上降低代码地可L?BR>
JDK1.5 正式版即发布,让我们共同期待吧。我们可以去http://java.sun.com/j2se/1.5.0/download.jspQ先下蝲一个beta爽一把?BR>
]]>
很多应用E序要求动态生?PDF 文档。这cd用程序包括银行生成用于电(sh)子邮件投递的客户报表Q到读者购买特定图书章节ƈ?PDF 格式接收q些文档。例子罗列下L很多的。在本文中,?iText Java 库生?PDF 文档Qƈ引导(zhn)完成一个示例应用程序,以(zhn)能够更好地理解和?iText?
熟?zhn)?iText
iText ?Lowagie.com 站点Q请参阅 参考资料)(j)免费提供?Java 库。iText 库的功能很强大,支持 HTML、RTF ?XML 文档的生成,此外q能够生?PDF 文档。可以从多种字体中选择文档中所使用的字体。同ӞiText 的结构允怋用相同的代码生成以上Lcd的文档?BR>
iText 库中的类用于以各U字体来生成 PDF 文本、在 PDF 文档中生成表根{ؓ(f)|加水印等。iText q提供许多功能。在一文章中不可能一一演示。本文中介l生?PDF 文档的基本需求?BR>
我们?Eclipse 来进行示例应用程序开发。作Z个开放源码的 IDEQ可以免费获?EclipseQ而且其功能非常强大。现在就可以下蝲 Eclipse?BR>
iText APIQ近距离观察
com.lowagie.text.Document 是生?PDF 的主要的cR它是需要用的W一个类。一旦开始创建文档,需要一个写入器向文档中写入内容。com.lowagie.text.pdf.PdfWriter 是一?PDF 写入器。下面列Z(jin)通常需要用的c:(x)
com.lowagie.text.Paragraph —?q个c表CZ个羃q的D落?
com.lowagie.text.Chapter —?q个c表C?PDF 文档中的章节。?Paragraph 作ؓ(f)题目q?int 作ؓ(f)章节L(fng)来创建它?BR>
com.lowagie.text.Font —?q个cd含了(jin)全部的字体规范,例如字体、大、样式和颜色。各U字体都在这个类中声明ؓ(f)?rn)态常数?
com.lowagie.text.List —?q个c表CZ个列表,按顺序包含许?ListItems?BR>
com.lowagie.text.Table —?q个c表C包含单元格的表Q单元格有序地排列在矩阵中?BR>
下蝲 iText q在 Eclipse 中进行配|?/B>
作ؓ(f)一个纯_的 Java 库,iText 是以 JAR 文g的Ş式出现的Q请参阅 参考资料)(j)。一旦下载了(jin)q个库(在\?C:\temp 下)(j)Q执行下列步骤将?x)?Eclipse 环境中配|?iText 库:(x)
?Eclipse 中创Z个新?Java 目Q将其命名ؓ(f) iText?BR>
?Package Explorer 视图中右?iText 目Q然后选择 Properties?BR>
单击 Java Build Path。在 Libraries 选项卡中Q单?Add External JARs?BR>
览?C:\temp 目录Q选择该目录下?itext-1.3.jar?BR>
单击 OK?BR>
现在已经配置?iTextQEclipse 已经准备好创?Java 应用E序以生成动?PDF 文档?BR>
CZ应用E序
q有什么能够比自己动手创徏一个工作示例更好地演示技术了(jin)Q现在有?jin)所需的工PEclipse IDEQ和库(iText 库)(j)Q可以开始设计和开发一个示例应用程序了(jin)?BR>
让我们创Z个简单的 PDF 文档Q其中包含一些基本元素,如纯文本、非默认字体的彩色文本、表根{列表、章节和节{。此应用E序的目的是让?zhn)熟(zhn)?iText 库的使用方式。有很多与帮助生?PDF 文档有关的类。在q里不可能介l所有这些类。iText ?javadoc 是介l如何用这些类的很好的资料。下面让我们来开始编写代码?BR>
W一步是创徏一个文档。文档是 PDF 文档的所有元素的容器?
清单 1. 实例化文档对?BR>
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
W一个参数是面大小。接下来的参数分别是左、右、上和下边距。但是还没有定义该文档的cd。它取决于所创徏的写入器的类型。对于我们的CZQ选择?com.lowagie.text.pdf.PdfWriter。其他写入器?HtmlWriter、RtfWriter、XmlWriter {等。它们的名称解释?jin)它们的实际用途?BR>
清单 2. 创徏 PdfWriter 对象
PdfWriter writer = PdfWriter.getInstance(document, \
new FileOutputStream("C:\\ITextTest.pdf"));
document.open();
W一个参数是Ҏ(gu)档对象的引用Q第二个参数是文件的实际名称Q在该名UCq(sh)(x)l出其输?gu)\径。接下来Q打开文档以写入内宏V?BR>
现在Q将在文档的W一上d一些文本。通过 com.lowagie.text.Paragraph 来添加文本。可以用文本?qing)其默认的字体、颜艌Ӏ大等{设|来创徏一个默认段落。或者,也可以设|自q字体。下面让我们来看看这两种做法?BR>
清单 3. 创徏D落对象
document.add(new Paragraph("First page of the document."));
document.add(new Paragraph("Some more text on the \
first page with different color and font type.",
FontFactory.getFont(FontFactory.COURIER, 14, Font.BOLD, new Color(255, 150, 200))));
下面是上面代码的输出CZ。在上面代码的结֤d document.close(); 以关闭文档?
?1. 上面代码的输出示?/DIV>
(zhn)已l看C(jin)如何?PDF 文档中添加纯文本。接下来Q需要向文档中添加一些复杂的元素。我们开始创Z个新的章节。章节是一个特D的节Q默认情况下Q章节从一个新的页面开始,q显CZ个默认的~号?BR>
清单 4. 创徏章节对象
Paragraph title1 = new Paragraph("Chapter 1",
FontFactory.getFont(FontFactory.HELVETICA, \
18, Font.BOLDITALIC, new Color(0, 0, 255)));
Chapter chapter1 = new Chapter(title1, 1);
chapter1.setNumberDepth(0);
在上面的代码中,创徏?jin)一个新的章节对象,chapter1Q其标题?sh)?“This is Chapter 1”,编L(fng)别设?0 ׃?x)在面上显C章节编受?BR>
节是章节的子元素。在下面的代码中Q创Z(jin)一个标题(sh)ؓ(f) “This is Section 1 in Chapter 1?的小节。ؓ(f)在该节下添加一些文本,创徏?jin)另一个段落对象,someSectionTextQƈ其d到小节对象中?BR>
清单 5. 创徏节对象
Paragraph title11 = new Paragraph("This is Section 1 in Chapter 1",
FontFactory.getFont(FontFactory.HELVETICA, 16, \
Font.BOLD, new Color(255, 0, 0)));
Section section1 = chapter1.addSection(title11);
Paragraph someSectionText = new Paragraph("This \
text comes as part of section 1 of chapter 1.");
section1.add(someSectionText);
someSectionText = new Paragraph("Following is a 3 X 2 table.");
section1.add(someSectionText);
在添加表g前,我们先看一下文档的样子。添加下面两行代码以关闭文档Q然后编译ƈ执行E序以生?PDF 文档Qdocument.add(chapter1);document.close();?BR>
?2. 章节输出CZ
接下来,创徏一个表格对象。创Z个包含行列矩늚表格。行中的单元格可以跨多个列。同样地Q列中的单元g可以跨多个行。因此,一?3 x 2 的表格实际上不一定有 6 个单元格?BR>
清单 6. 创徏表格对象
Table t = new Table(3,2);
t.setBorderColor(new Color(220, 255, 100));
t.setPadding(5);
t.setSpacing(5);
t.setBorderWidth(1);
Cell c1 = new Cell("header1");
c1.setHeader(true);
t.addCell(c1);
c1 = new Cell("Header2");
t.addCell(c1);
c1 = new Cell("Header3");
t.addCell(c1);
t.endHeaders();
t.addCell("1.1");
t.addCell("1.2");
t.addCell("1.3");
section1.add(t);
在上面的代码中,创徏?jin)一个表格对象,tQ它有三列、两行。然后设|表格的Ҏ(gu)颜色。填充用于设|单元格中文本间的间隔以?qing)单元格的边界。间隔指的是盔R单元格间的边界。接下来Q将创徏三个单元格对象,每个单元g的文本都各不相同。接下来Q将它们d到表g。将它们d到第一行中Q从W一列开始,Ud同一行中的下一列。一旦该行创建完成,将下一个单元格dC一行的W一列中。也可以通过只提供单元格的文本将单元格添加到表格中,例如Qt.addCell("1.1");。最后,表格对象添加到节对象中?BR>
最后,我们来看一下如何将列表d?PDF 文档中。列表包含一定数量的 ListItem。可以对列表q行~号Q也可以不编受将W一个参数设|ؓ(f) true 表明惛_Z个要q行~号的列表?BR>
清单 7. 创徏列表对象
List l = new List(true, false, 10);
l.add(new ListItem("First item of list"));
l.add(new ListItem("Second item of list"));
section1.add(l);
我们已经?chapter1 对象中添加了(jin)所需的对象。因此,已经没有其他要添加到 chapter1 中的元素?jin),现在可以?chapter1 dC document 中了(jin)。与在示例应用程序中所做的一Pq要在这时关闭文档对象?
清单 8. 向主文档中添加章?BR>
document.add(chapter1);
document.close();
q行CZ应用E序
下蝲CZ应用E序Qj-itextsample.jarQ参?下蝲Q?BR>
在某个目录中解压~?j-itextsample.jar。例如,如果其解压~到 C:\tempQ则?x)将源码和类文g攑ֈ C:\temp\com\itext\test 目录下?BR>
打开一个命令提C,目录更改ؓ(f) C:\temp?BR>
在这个命令提CZ讄pȝ的类路径。将 C:\temp\itext-1.3.jar 包括在系l的c\径中。在 Windows? 上,执行命o(h) set classpath=C:\temp\itext-1.3.jar;%classpath%?BR>
使用命o(h) java com.itext.test.ITextTest q行应用E序?BR>
E序?x)?C:\ 目录下生成一?ITextTest.pdf 文档。下面显CZ(jin)q个 PDF 文档W二늚屏幕图?BR>
?3. PDF 文档的屏q图
l束?/B>
(zhn)已l看C(jin)一些生?PDF 的基本元素。iText 的美妙之处是相同元素的语法可以供不同cd的写入器使用。而且Q写入器的输出可以重定向到控制台Q当写入器类型是 XML ?HTML Ӟ(j)、servlet 的输出流Q在?PDF 文档?Web h作出响应Ӟ(j)或者是其他cd?OutputStream。当响应相同Q但其类型随所h的是 PDF、RTF、HTML ?XML 文档而有所不同Ӟ使用 iText 是非常方便的。iText 允许用户创徏水印Q对文档q行加密以及(qing)讄其他输出l节.
]]>
]]>
关键?/B> Java 列表?BR>
引言
Java是一U纯_的面向对象的编E语aQ由于具有良好的UL性已l成为程序员开发应用系l的常用工具。在开发hZ互界面时Q程序员?sh)用户都惛_量少的输入数据。如果有很多固定的选项供用户选择Q列表框是很好的解决Ҏ(gu)。用户在列表框中选择所需要的列表元素Q可以在另外一个列表框中显C出来,后一列表框中的元素就要能够动态的d和删除,最后需要获得用户选择的列表元素D行其他的q算或者处理。由于Java语言的特点,解决q个问题q需要一定的技巧,下面l出?jin)对q一问题?a class="bluekey" target="_blank">解决Ҏ(gu)?BR>
实现Ҏ(gu)
1、初始化
首先dJScrollPane的实例jScrollPane1QDefaultListModel 实例model1Q然后用model1生成JList的实例。在对话框合适的位置djScrollPane1Q调整到合适的大小Q然后在jScrollPane1上增加jList1。这样带有滚动条的列表框添加完成了(jin)?BR>
初始化一个Vector实例用来存储选择的列表元素。由于选择的元素具有不定性,所以用Vectorq种存储I间可以动态变化的数据l构。Vector初始化实例时不能指定初始化长度,所以增加一个整形变量指CVector中列表中对象的个数?BR>
2、添加和删除列表元素
列表框中的元素添加和删除是通过model1的addElementҎ(gu)和removeElementҎ(gu)实现的。通过列表框的属性selectionMode可以讄列表框单选,单个间断选择和多个间断选择。Vector中存储的对象是和选择的元素相对应的,对象的添加和删除是通过addElementҎ(gu)和removeElementҎ(gu)实现的?BR>
3、获得选择元素
在点几Z确定?a class="bluekey" target="_blank">按钮以后Q需要将Vector实例中的对象转化成ؓ(f)需要的数据cd?BR>
实例解析
C?所CZؓ(f)例对具体实现Ҏ(gu)q行描述。由?中左面列表框中选择可用元素Q选择方式设ؓ(f)多个间断选择Q由于其他两U方式相对简单,实现Ҏ(gu)可在q个实例的基上修改得到。选定元素之后Q点几Z?gt;>”按钮,选择的元素就?x)在右面的列表框昄出来。如果多选或者错选,可在右面的列表框中选定元素后点几Z?lt;<”按钮移去选定的元素?BR>
? 列表框示?/P>
具体E序实现Ҏ(gu)如下?BR>
1Q?初始?仅给出初始化左面的列表框)
private JScrollPane jScrollPane1 = new JScrollPane();
DefaultListModel model1 = new DefaultListModel();
private JList jList1 = new JList(model1);
private Vector selectedElement = new Vector();
private int selectedNumber = 0;
2Q添加和删除元素
向右面的列表框中d元素Q也是单击?gt;>”按钮执行的操作?BR>
for(int i = 0;i< jList1.getSelectedValues().length; i++)
{
//选择多个元素Q逐个q行操作
selectedElement.addElement(jList1.getSelectedValues()[i]); //Vector实例中增加对?BR> model2.addElement(jList1.getSelectedValues()[i]); //右面的列表中增加元素
selectedNumber = selectedNumber + 1; //选定元素个数?
selectedElement.setSize(selectedNumber); //讑֮Vector实例的长?BR>}
从右面的列表框中选择元素q行删除Q也是单击?lt;<”按钮执行的操作?BR>
for(int i = 0;i< jList2.getSelectedValues().length; i++)
{
selectedElement.removeElement(jList2.getSelectedValues()[0]);
model2.removeElement(jList2.getSelectedValues()[0]);
//减少元素,需要注意每ơ移ȝ都是W?个元?BR> selectedNumber = selectedNumber - 1;
selectedElement.setSize(selectedNumber);
}
3Q获取选择的元?BR>
以将选定的元素{换成字符?/a>cdZQ这D代码一般放在“确定”按钮的单击操作里面?BR>
StringQ] selectedProduct = new String[selectedElement.size()];
for (int i = 0; i < selectedElement.size(); i++) {
selectedProduct[i] = (String)selectedElement.elementAt(i); //强制cd转换成ؓ(f)字符?BR>}
ȝ
本文l出?jin)实现Java列表框中元素动态添加、删除操作和获得用户选择的元素值的Ҏ(gu)和实例,解决?jin)JavaE序设计中的列表框元素的动态变化问题?BR>
]]> c,d字母或符号以便处理文本。这常常D复杂或凌q代码?
软g包来使用正则表达式,用以下常见情形作?例子Q?/P>
软g包,查找、显C或修改输入序列中出现的 某个模式的一部分或全部?/P>
\$
^
.
*
+
?
['
']
\.
?/P>
q样的正则表辑ּ匚w的是M三个字符的、以
开始以
l束的字W串Q包?CODE>?CODE> ?/P>
?CZ
?CODE>的Q何字母?/P>
构?/TH>
匚w?/TH>
字符
x
字符 x
反斜U字W?/TD>
n
八进制值的字符 n (0
n
7)
nn
八进制值的字符 nn (0
n
7)
mnn
八进制值的字符0mnn mnn (0
m
3, 0
n
7)
hh
十六q制值的字符 hh
hhhh
十六q制值的字符 hhhh
制表W? )
换行W?( )
回RW?( )
换页W?( )
响铃W?( )
转义W?( )
x
T对应于x的控制字W?x
字符c?/TH>
,
, or
(单类)
除了(jin) ?CODE>?CODE>之外的Q?字符Q求反)(j)
?CODE>?CODE>?CODE> Q包含(范围)
?CODE>Q除?CODE>?CODE> Q?
Q减去)(j)
?CODE>Q除?CODE>?
Q?
,
, ?
预定义的字符c?/TH>
L字符Q也许能与行l止W匹配,也许不能Q?/TD>
数字:
非数?
I格W?
非空格符:
单词字符:
非单词字W?
黑暗岁月
有一个StringQ如何查询其中是否有y和f字符Q最黑暗的办法就是:(x)
E序1Q我知道if、for语句和charAt()啊?BR>
class Test{
public static void main(String args[]) {
String str="For my money, the important thing "+"about the meeting was bridge-building";
char x='y';
char y='f';
boolean result=false;
for(int i=0;iQstr.length;i++){
char z=str.charAt(i); //System.out.println(z);
if(x==z||y==z) {
result=true;
break;
}
else result=false;
}
System.out.println(result);
}
}
好像很直观,但这U方式难以应付复杂的工作。如查询一D|字中Q是否有isQ是否有thing或ting{。这是一个讨厌的工作?BR>
Java的java.util.regex?BR>
按照面向对象的思\Q把希望查询的字W串如is、thing或ting装成一个对象,以这个对象作为模板去匚w一D|字,更加自然了(jin)。作为模板的那个东西是下面要讨论的正则表达式。先不考虑那么复杂Q看一个例子:(x) E序2Q不懂。先看看可以吧?
import java.util.regex.*;
class Regex1{
public static void main(String args[]) {
String str="For my money, the important thing "+"about the meeting was bridge-building";
String regEx="a|f"; //表示a或f
Pattern p=Pattern.compile(regEx);
Matcher m=p.matcher(str);
boolean result=m.find();
System.out.println(result);
}
}
如果str匚wregExQ那么result为trueQ否则ؓ(f)flase。如果想在查找时忽略大小写,则可以写成:(x)
Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
虽然暂时不知道P(yng)atternQ模ѝ模式)(j)和MatcherQ匹配器Q的l节Q程序的感觉比较爽Q如果先查询is、后来又要查询thing或tingQ我们只需要修改一下模板PatternQ而不是考虑if语句和for语句Q或者通过charAt()?BR>
1、写一个特D的字符东y(c)—正则表辑ּ如a|f?BR>
2、将正则表达式编译成一个模板:(x)p
3、用模板pd配字W串str?BR>
思\清楚?jin),现在看Java是如何处理的QJavaE序员直到JDK1.4才能使用q些cR?BR>
PatterncM查找
①public final class java.util.regex.Pattern是正则表辑ּ~译后的表达法。下面的语句创Z个Pattern对象q赋值给句柄pQPattern p=Pattern.compile(regEx);
有趣的是QPatterncLfinalc,而且它的构造器是private。也许有人告诉你一些设计模式的东西Q或者你自己查有兌料。这里的l论是:(x)PatterncM能被l承Q我们不能通过new创徏Patterncȝ对象?BR>
因此在PatterncMQ提供了(jin)2个重载的?rn)态方法,其返回值是Pattern对象Q的引用Q。如Q?BR>
public static Pattern compile(String regex) {
return new Pattern(regex, 0);
}
当然Q我们可以声明Patterncȝ句柄Q如Pattern p=nullQ?BR>
②p.matcher(str)表示以用模板pȝ成一个字W串str的匹配器Q它的返回值是一个Matchercȝ引用Qؓ(f)什么要q个东西呢?按照自然的想法,q回一个booleang行吗Q?BR>
我们可以单的使用如下Ҏ(gu)Q?BR>
boolean result=Pattern.compile(regEx).matcher(str).find();
其实是三个语句合q的无句柄方式。无句柄常常不是好方式。后面再学习(fn)Matchercd。先看看regEx——这个怪咚咚?BR>
正则表达式之限定W?/B>
正则表达式(Regular ExpressionQ是一U生成字W串的字W串。晕吧。比如说QString regEx="me+";q里字符串me+能够生成的字W串是:(x)me、mee、meee、meeeeeeeeee{等Q一个正则表辑ּ可能生成无穷的字W串Q所以我们不可能Q有必要吗?Q输出正则表辑ּ产生的所有东ѝ?BR>
反过来考虑Q对于字W串Qme、mee、meee、meeeeeeeeee{等Q我们能否有一U语aLq它们呢Q显?dng)正则表达式语a是这U语aQ它是一些字W串的模式——简z而深ȝ描述?BR>
我们使用正则表达式,用于字符串查找、匹配、指定字W串替换、字W串分割{等目的?BR>
生成字符串的字符东y(c)—正则表辑ּQ真有些复杂Q因为我们希望由普通字W(例如字符 a ?zQ以?qing)特D字W(UCؓ(f)元字W)(j)描述L的字W串Q而且要准?BR>
先看几个正则表达式例子:(x)
E序3Q我们ȝq个E序试正则表达式?BR>
import java.util.regex.*;
class Regex1{
public static void main(String args[]) {
String str="For my money, the important thing "Q?BR> String regEx="ab*";
boolean result=Pattern.compile(regEx).matcher(str).find();
System.out.println(result);
}
}//ture
?ab*"——能匚wa、ab?a class="bluekey" target="_blank">abb
?ab+"——能匚wab、abb、abbb……。等价于"abb*"。问题regEx="or+"l果如何Q?BR>
?or?"——能匚wo和or? 表示前面字符可以有零ơ或一ơ?BR>
q些限定W???方便地表CZ(jin)其前面字W?子串)出现的次敎ͼ我们用{}来描qͼ(j)Q?x*Q零ơ或多次 ≡{0,}
1Q什么是模式Q?/b>
模式Q即pattern。其实就是解x(chng)一c问题的Ҏ(gu)论。你把解x(chng)c问题的Ҏ(gu)ȝ归纳到理论高度,那就是模式?br> ?br> Alexanderl出的经典定义是Q每个模式都描述?jin)一个在我们的环境中不断出现的问题,然后描述?jin)该问题的解x(chng)案的核心(j)。通过q种方式Q你可以无数ơ地使用那些已有的解x(chng)案,无需在重复相同的工作?br> ?br> 模式有不同的领域Q徏{领域有建筑模式QY件设计领域也有设计模式。当一个领域逐渐成熟的时候,自然?x)出现很多模式?br> ?br> 什么是框架Q?/b>
框架Q即framework。其实就是某U应用的半成品,是一l组Ӟ供你选用完成你自qpȝ。简单说是使用别h搭好的舞収ͼ你来做表演。而且Q框架一般是成熟的,不断升的Y件?br> ?br> 2Qؓ(f)什么要用模式?
因ؓ(f)模式是一U指|在一个良好的指导下,有助于你完成dQ有助于你作Z个优良的设计Ҏ(gu)Q达C半功倍的效果。而且?x)得到解决问题的最?jng)_法?br> ?br> Z么要用框Ӟ
因ؓ(f)软gpȝ发展C天已l很复杂?jin),特别是服务器端YӞ设计到的知识Q内容,问题太多。在某些斚w使用别h成熟的框Ӟq当于让别人帮你完成一些基工作Q你只需要集中精力完成系l的业务逻辑设计。而且框架一般是成熟Q稳健的Q他可以处理pȝ很多l节问题Q比如,事物处理Q安全性,数据?hu)控制等问题。还有框架一般都l过很多Z用,所以结构很好,所以扩展性也很好Q而且它是不断升的,你可以直接n受别人升U代码带来的好处?br>
框架一般处在低层应用^収ͼ如J2EEQ和高层业务逻辑之间的中间层?br> ?br> 软gZ么要分层Q?/b>
Z(jin)实现“高内聚、低耦合”。把问题划分开来各个解冻I易于控制Q易于g展,易于分配资源…M好处很多啦:(x)Q?br>
3Q以下所qC要是JAVAQJ2EE斚w的模式和框架Q?/b>
常见的设计模式有什么?
首先Q你要了(jin)解的是GOF的《设计模?-可复用面向对象Y件的基础》一书(q个可以说是E序员必备的?jin)?j)Q注意:(x)GOF不是一个hQ而是指四个h。它的原意是Gangs Of Four,是“四人帮”,是指此书的四个作者:(x)Erich Gamma,Richard HelmQRalph Johnson,John Vlissides。这本书讲了(jin)23U主要的模式Q包括:(x)抽象工厂、适配器、外观模式等?br>
q有其他的很多模式,估计?00多种?br> ?br> 软g设计模式太多Q就我的理解单说一下最常见的MVC模式?br>
MVC模式?996q由Buschmann提出的:(x)
模型QModelQ:(x)是装数据和所有基于对q些数据的操作?br>
视图QViewQ:(x)是装的是Ҏ(gu)据显C,即用L(fng)面?br>
控制器(ControlQ:(x)是装外界作用于模型的操作和对数据?hu)向的控制等?br>
另外Q?br>
RUPQRational Unified ProcessQY件统一q程QXPQExtreme ProgrammingQ极端编E,q些通常被叫做“过E方法”,是一UY仉目实施过E的Ҏ(gu)论,它是针对软g目的实施过E提出的Ҏ(gu){略。也是另一个角度的模式?br>
4Q常见的JAVA框架有什么?
WAFQ?/b>
全称QWEB APPLICATION FRAMEWORK
主要应用斚wQEJB层,QWEB层也有,但是比较弱)(j)?br>
主要应用技术:(x)EJB{?br>
出处Qhttp://java.sun.com/blueprints/code/index.html
qͼ(x)q是SUN在展CJ2EEq_时所用的例子PetStore(宠物商店pȝ)里面的框架。是SUN蓝皮书例子程序中提出的应用框架。它实现?MVC和其他良好的设计模式。SUN的网站上有技术资料,最好下载PetStore来研IӞW(xu)EBLOGIC里自带此pȝQ源码在bea\weblogic700\samples\server\src\petstore。这是学?fn)?jin)解J2EE的首选框架?br>
Struts:
主要应用斚wQWEB层?br>
主要应用技术:(x)JSP,TagLib,JavaBean,XML{?br>
出处Qhttp://jakarta.apache.org/struts/index.html
qͼ(x)q是APACHE的开源项目,目前应用很广泛。基于MVC模式Q结构很好,ZJSP。Jbuilder8里已l集成了(jin)STRUTS1.02的制作?br> ?br> qWAF+STRUTSl合的例子:(x)WEB层用STRUTSQEJB层用WAFQ?br>
JSP(TagLib)—?ActionForm—?Action —? Event—?EJBAction—?EJB —?DAO—?Database JSPQTagLibQ?(forward) <——Action <——EventResponse<—?br>
TurbineQ?/b>
主要应用斚wQWEB层?br>
主要应用技术:(x)servlet{?br>
出处Qhttp://jakarta.apache.org/turbine/index.html
qͼ(x)q是APACHE的开源项目。基于SERVLET。据说速度比较快,ZserviceQpluggable implementation可插拔的执行lgQ的方式提供各种服务?br>
COCOONQ?/b>
主要应用斚wQWEB层?br>
主要应用技术:(x)XMLQXSPQservlet{?br>
出处Qhttp://cocoon.apache.org/2.0/
qͼ(x)q是APACHE的一个开源项目。基于XMLQ基于XSPQ通俗地说QXSP是在XML?rn)态文档中加入JavaE序D后形成的动态XML文档。)(j)。特Ҏ(gu)可以与多U数据源交互Q包括文件系l,数据库,LDAPQXML资源库,|络数据源等?br>
ECHOQ?br>
主要应用斚wQWEB层?br>
主要应用技术:(x)servlet{?br>
出处Qhttp://www.nextapp.com/products/echo/
qͼ(x)nextapp公司的一个开源项目。基于SERVLET。页面可以做的很漂亮Q结合echopointQ可以作出很多图形效果(里面用了(jin)jfreechart包)(j)。用SWING的思想来作|页Q把HTML当作JAVA的类来做。但是大量用SessionQ页面分帧(F(tun)rameQ很?pȝ资源消耗很大?br>
JATOQ?br>
全称QSUN ONE Application Framework
主要应用斚wQWEB层?br>
主要应用技术:(x)JSP,TagLib,JavaBean{?br>
出处Qhttp://www.sun.com/
qͼ(x)q是SUN推出的一个商业性框Ӟ一看名字就知道是结合SUN ONE的^台推出的。我下蝲?jin)JATO2.0看了(jin)一下,感觉有些单,使用?jin)JSPQTagLib+JavaBean。如他的DOC所说JATO是适合用在的WEB应用里?br>
TCFQ?/b>
全称QThin-Client Framework
主要应用斚wQJAVA GUI?br>
主要应用技术:(x)JAVA application{?br>
出处Qhttp://www.alphaworks.ibm.com/tech/tcf
qͼ(x)q是IBM出的一个框架。基于MVC模式Q基于JAVA Application。推荐一介l文章:(x)http://www-900.ibm.com/developerWorks/cn/java/j-tcf1/index.shtml
]]>
]]>
47. 问:(x)session怎样存取intcd的变量?
{:(x)
session.setAttribute("int", i+"");
int i = Integer.parseInt(session.getAttribute("int"));
48. 问:(x)在javascript中如何输出的floatcd的数据保留两位小数?br />{:(x)Math.round(aaaaa*100)/100?/p>
49. 问:(x)在beanU如何调用session
{:(x)
你可把session对象作ؓ(f)一个参Clbean
在BEAN中定义HttpServletRequest request;HttpSession session;
然后
session = request.getSession(false);
false为如果session为空,不徏立新的session
session作ؓ(f)参数传入.其实只要request传入可?/p>
50. 问:(x)如何把txt或word文g按原格式昄在jsp面或servlet上?
{:(x)
其实一个非常简单的解决Ҏ(gu)是在服务器的MIME中指点定TEXT和W(xu)ORD的解释方?然后用JSP或SERVLET生成它就行了(jin),客户端就?x)自动调用相应程序打开你的文档?br />如果是希望按原格式的昄在页面上Q而不是调用其他程序打开那么你可以试试用WEBDEV协议,可以说这是MS的一个亮?它是在WEB方式下打开文档,和共享一?完全W合的要求?/p>
51. 问:(x)object的cloneҎ(gu)Z么不能直接调用?
{:(x)
q个Ҏ(gu)在object中是protected
Z么要把这个方法定义ؓ(f)protected,q是一个折?sh)?它的目的是想知道你这个方法在Object里只是一个标?而不是一个实?比如
public class Object
{
.............
protected Object clone()
{}
}
所以直接承的clone()Ҏ(gu)q不能做M?你要使用q个Ҏ(gu)p重蝲q个Ҏ(gu)q放宽访问权限ؓ(f)public,或实现cloneable接口. 但它没法q样告诉你它没有真的实现,只好用protected Ҏ(gu)加以警示
52. 问:(x)一个页面中如何h另外一个页面?
{:(x)
要求是这些面必L兌,一是它们都有一个共同的层?也就是说是一个内的分面,当然可以是Q意,帧内再分帧也可以,另一个可能是当前H口弹出的窗?如果没有联系,那就不可能用一个页面刷新另一个页? 帧内只要一U一U引用就行了(jin). 比如在左帧中一个页面中写top.right.location.reload();那么名ؓ(f)right的右帧中的页面就?x)刷? 弹出的一?用open时的名称h子窗?子窗口用openerhȝ?/p>
53. 问:(x)如何在jsp中怎么样向客户端写cookiesQ?br />{:(x)
Cookie coo = new Cookie(name, value);
HttpServletResponse.addCookie(name);
54. 问:(x)Z么jTextField1.setText("aaabbb");jTextField2.setText("AAABBB"); 得到的字体宽度不一P
{:(x)是说如果不是指定ؓ(f){宽字体,每个字体的宽度都是不一L(fng).因此JAVA中用FontMetrics cL取字W宽度?/p>
55. 问:(x)String kk=application/octet-stream; name="G:/SMBCrack.exe";如何得到SMBCrack.exeQ?br />{:(x)
q应该是解析上传时候的二进制流得到的这一行里面格式是固定的,取到name="后面的字W串Q然后把";L。然后取最后一?后面的所有字W组成一个新字符串就行了(jin)?/p>
56. 问:(x)如何传值ƈ不刷新页面?
{:(x)
弹出一个页面进行值的选择或者输入,ok后用将gl原H口Q用javascript关闭打开的窗口即可:(x)
window.close();opener.focus();
(tng)
57. 问:(x)有一个字W串Q?EF0C114EA4"Q如何变?sh)a[0] = 0xEF a[1] = 0x0C a[2] = 0x11 a[3] = 0x4E a[4] = 0xA4Q?br />{:(x)
String str="EF0C114EA4F";
out.print(str+"<br>");
int l=str.length()/2+str.length()%2,j=0,k=0;
String[] a=new String[l];
for(int i=0;i<l;i++){
if(str.length()-j==1)
k=str.length();
else
k=j+2;
a="0x"+str.substring(j,k);
out.print("a["+Integer.toString(i)+"]="+a+"<br>");
j+=2;
}
58. 问:(x)怎样一个int转换成一个四字节的byte数组Q?br />{:(x)
int x = 1234567;
byte[] b = new byte[4];
for(int i=0;i<b.length;i++)
{
b = (x >>( i*8)) & 0xFF;
}
59. 问:(x)indexOf()的用需要注意什么?
{:(x)参数是指从第几位Q?Q?Q?Q?..Q开始搜索,而返回值是指搜索到的位|(0Q?Q?Q?.......Q注意是从零v的?/p>
60. 问:(x)在Java应用E序中如何动态的d一个按钮?
{:(x)
q里涉及(qing)一个组仉l的问题,lg要先于panel被显CZ处存?如果一panel已经昄?那么加在上面你能看到?但如果在同一个panel? 先有button A,假如按下它加?jin)butt on B,q时你如果整个panel重给,那么A本n要重l?它的事g监听没有了(jin),当然也就加不成B?所以如果要先有另一个panel,当按A时把B加在q个panel上ƈ重绘q个paenl,其实更好的方法是先把B加在panel?同一个也?把它setVisiable(flase),按A时设?true?/p>
61. 问:(x)book mybook=new book(bookid);book是servlet,出错?br />{:(x)
book是servlet,能book mybook=new book(bookid);
说明自己实现?jin)servlet容器?不然,servlet能让你自己去调用? servlet如果调用其实和EJBq?%的区别都没有,它们都是自己l承或实C些接?在这些父cL接口中实C(jin)如果和容器\"打交?的方?然后容器调用q些Ҏ(gu)来管理它,让它生成实例,池化,钝化,销?再生{?所以这样写是错误的?/p>
62. 问:(x)l定一个字W串5*(5+9)/7怎样计算出结果?
{:(x)
可有两种Ҏ(gu)
1。用堆栈完成
2。最单的Ҏ(gu)Q不用编E,如果有Q何一个数据库的化Q用select (5*(5+9)/7) from oneTable
63. 问:(x)如何实现递交表单内容的加密解密?
{:(x)
如果你用IE目前只能用SSL协议,q一层不要你考虑,否则只你用你自己的工具加密传?接收后再解密?至于如何加解,如果要和公认的系l结?q通用的MD5,RAS{公开法,如果你只是自׃自己?你随便按你的x(chng)把数据加上一些东?取回来按规则减掉q些东西,我敢保证除你自己没有M知道解密Ҏ(gu).
64. 问:(x)Z么Integer.parseInt("+1");?x)抛出NumberFormatException的异常?
{:(x)因ؓ(f)"+"q行在JAVA中被重蝲.pȝ无法定你用的是术加还是字W??br />q一点可以在JAVASCRIPT中更好地理解:
<form name="t"><input name=s value=1234></form>
var a = document.t.s.value+1;
q时a = 12345,因ؓ(f)document.t.s.value作ؓ(f)字符?但var a = document.t.s.value-1;
a 是1233,因ؓ(f)pȝ知道-q算肯定是算术运?所以把document.t.s.value转换成数?
(tng)
65. 问:(x)hashCode() 有什么用Z么有时候需要覆盖Object里的hashcode()Ҏ(gu)Q?br />{:(x)q就是这个对象的w䆾证啊,要不如何区分哪个对象?/p>
66. 问:(x)怎样在tomcat中实C个定时执行的东东Q?br />{:(x)
在应用程序启动时自动q行。servlet2.3中定义了(jin)ServletListener,监听Servlet Con text的启动或则关闭(可在配置文g中配|)(j)Q启动时触发一个守护程序的q行(可以实现java.util.Timer或则 javax.swing.Timer).
67. 问:(x)E序可以输出自己吗?
{:(x)孔d(zhn)论q个非常有名的法?是说Q何程序都不可能输?gu)?
68. 问:(x)能够把字W{化成ASCII码?比如?A 转化?65Q?br />{:(x)
int a='A';
out.println(a);
69. 问:(x)如何区分输入的文字中的全角与半角Q?br />{:(x)׃不能分L出全角和半角字符的值有什么规?只好把全角符L(fng)丑և来了(jin).
70. 问:(x)用户注册后的自动发信E序该怎么做?
{:(x)
q种发信E序不考虑性能,因ؓ(f)不可?U就有一个h注册,我们说的考虑性能的发信程序是指上百万信在队列里要不停发送的那种,象你q个随便怎么写一个程序都?没有必要用JAVAMAIL.只要指定一个发信的服务器然后用cocketq它?5口就行了(jin).自己用SOCKETqSMTP?5口发一信好象两个邻居之间送一样东?直接递过d?用JAVAMAIL,消息机制是你把q个东西从邮局寄给你的d?
21. 问:(x)applet中如何获得键盘的输入
{:(x)application的System.in是当前系l的标准输入,applet因ؓ(f)安全的原因不可能d当前pȝ(客户?的标准输?只能从它的ROOTlg的事件中,比如键盘?sh)g中取得键?
(tng)
22. 问:(x)怎样计算代码执行所p的时_(d)
{:(x)
代码开始取旉Q结束后取时_(d)相减
long t1 = System.currentTimeMillis();
///////////////// your code
long t2 = System.currentTimeMillis() ;
long time = t2-t1;
(tng)
23. 问:(x)如何获在E序中获得一个文件的ContentTypeQ?br />{:(x)
URL u = new URL("file:///aaa.txt");
URLConnection uc = u.openConnection();
String s = uc.getContentType();
24. 问:(x)q接池的使用是徏立很多连接池Q还是一个连接池里用多个q接Q?br />{:(x)
只有在对象源不同的情况下才会(x)发生多个池化,如果你只q一l一个数据源,永远不要用多个连l池. 所以连l池的初始化一定要做成?rn)态的,而且应该在构造对象之?也就是只有在cLOAD的时?别的时候不应该有Q何生成新的连l池的时候?/p>
25. 问:(x)JavaMail要怎么安装Q?br />{:(x)下蝲两个包,一个是javamail包,另一个是jaf包。下载完直接把这两个包不解压加到CLASSPATH?/p>
26. 问:(x)怎样把地址栏里的地址锁定Q?br />{:(x)把你的服务器的可讉K目录索引选项关闭p?M服务器都有一个conf文g,里面都有q个选项?/p>
27. 问:(x)在JAVA中怎么取得环境变量啊。比如:(x) TEMP = CQ\TEMP Q?br />{:(x)String sss = System.getProperty(key)
28. 问:(x)怎样实现四舍五入Q保留小数点后两位小敎ͼ
{:(x)
import java.text.*;
...
NumberFormat nf=NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
nf.format(numb);
29. 问:(x)Applet和form如何通信Q?br />{:(x)
取得的参C到param里面
<%
String xxx = request.getParameter("xxx");
%>
<applet>
<param value="<%=xxx%>">
</applet>
(tng)
30. 问:(x)java-plug-in是什么?
{:(x)Java Runtime Environment的插件。用来运行javaE序。不需要什么特别的讄。等于你的机器里面有?jin)jvm?/p>
31. 问:(x)WEB上面怎么栯接上一个EXCEL表格Q?br />{:(x)
定义面得contentType="application/vnd.ms-excel"Q让面以excel得Ş式打开。同样也可以以word得Ş式打开Qapplication/msword?/p>
32. 问:(x)怎样才能避免textarea字数限制Q?br />{:(x)是用了(jin)FORM的默认方法的~故,如果什么也不写默认是GET改用Post卛_Q在Form中定义mothod="post"?/p>
33. 问:(x)Z么加?lt;%@page contentType="text/html;charset=gb2312" %>插入数据库的中文Q依然是qQ?br />{:(x)
q要从环境看,能显C明你的JSP引擎没有问题,但写入数据库时你的JDBC能不能处理中?同一公司不同版本的JDBC都有支持中文和不支持中文的情?RESIN自带的MYSQL JDBC׃支持,MM的就支持,q有你的数据库类型是否支持中?CHAR的一般支?但是否用binary存储双字节码
34. 问:(x)对于JFrameQhide()Qshow()与setVisibel()有什么区别吗Q?br />{:(x)
setVisible()从Componentl承q来Q而hide(),show()从Window里面l承q来?br />Makes the Window visible. If the Window and/or its owner are not yet displa yable, both are made displayable. The Window will be validated prior to being made visible. If t he Window is already visible, this will bring the Window to the front. 区别在这?/p>
36. 问:(x)sendRedirectZ么不可以转到mms协议的地址的?response.sendRedirect("mms://missiah.adsldns.org:9394");
{:(x)javaq_目前实现的protocol中ƈ没有mms,你可以取pȝ属性java.protocol.handler.pkgs看看它的g有没有mms,所以如果要想重定向到mms://hostq样和URL,只有生成客户端的JAVASCRIPT让它来重定向
37. 问:(x)JTable中怎样定义各个Columns和W(xu)idth和怎样讄表格的内定w做靠x(chng)居中Q?br />{:(x)
TableColumn tc = table.getColumn("Name");//取得列名?Name"的列Handle
int currentWidth = tc.getPreferredWidth(); //取得该列当前的宽?br />tc.setPreferredWidth(200); //讄当前列宽
tc.setMaxWidth(200); //讄该列最大宽?br />tc.setMinWidth(50); //讄该列最宽?/p>
38. 问:(x)Ҏ(gu)作是否可用于select语句Q?br />{:(x)Ҏ(gu)作其实是指成批理更新的操?l对不可能用于select操作?/p>
39. 问:(x)Z么jsp路径太深文g名太长就无法d文gQ?br />{:(x)path不能过255长度,不然找不到?q是作业pȝ的事?/p>
40. 问:(x)如何让页面不保留~存Q?br />{:(x)
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
%>
41. 问:(x)我的applet code 中用到jbutton 时就出错是否׃ie不支持swing package 请问应怎么办?
{:(x)JBUTTON是SWING基本包啊,只要把jdk/jre/lib/rt.jar攑֜classpathp?不要加蝲M别的库?/p>
42. 问:(x)不知道java是否支持midi格式Q如果支持,应该怎么把wave格式转换成midi格式Q?br />{:(x)目前q(sh)?可以看一下JMF三个版中对MIDI的格式支持是read only,而W(xu)AVE是read/write,MIDI只能播放,不能生成?/p>
43. 问:(x)在jsp里面防止用户直接输入urlq去面Q应该怎么做呢Q?br />{:(x)
一是从web服务器控?Ҏ(gu)一目录的所有访问要通过验证.
二是在要讉K的页面中加入控制.q个一般用session,也可以用h状态码实现
44. 问:(x)
例如后台有一计算应用E序Q此E序q算h很慢Q可持箋(hu)几分钟到几小Ӟq不,主要是能ȀzdQ,客户d提交后,服务器对dq行(g)无误后向服务器后台程序发送信息,q将其激zR要求如下:(x)
1Q首先将后台E序Ȁz,让它执行此Q务(比如Q前台将计算的C代码提交上后Q后台程序程序能马上调用Qƈ其q行Q?br />2Q要在前台JSP面中显C行过E信息(׃q行旉长,希望让客L(fng)到运行过E中产生的信息)(j)如何完成Q?/p>
{:(x)
zL可以?q行一个shell让它去运行后台就?但不可能取出q行信息,因ؓ(f)HTTP的超旉制不可能永远{你后台q行?而且信息如果要动态实时推出来得用SERVER PUSH技术?/p>
(tng)
45. 问:(x)数据库是datetime ?Q插入当前时间到数据库?
{:(x)
java.sql.Date sqlDate = new java.sql.Date();
PreparedStatement pstmt = conn.prepareStatement("insert into foo(time) values(?)");
pstmt.setDate(1,sqlDate);
pstmt.executeUpdate();
(tng)