Sun:Java速度较慢的问题已经解决了

计算机世界网消息 上周五,Sun公司两年前的一份内部备忘录在internalmemos.com网站中被公开,Sun公司的几名工程师在其中指出,用于Solaris操作系统的Java软件对很 多程序都不大适合,这一软件载入时速度很慢,在Sun公司内部并没有得到很好的支持,而且运行起来要耗用很多内存。虽然Java语言比其他语言具有更多的优势,用户也愿意基于Java来配置程序,但Solaris操作系统所提供的执行操作对于实现具有可支持性及可靠性产品等任务来说却是不够的。 Sun公司证实了这份备忘录的真实性,但指出该备忘录是在两年前写下的,其中所记录的问题已经得以修正。Sun公司在一份声明中表示,这份备忘录并不能代表Sun公司的当前形式,也不能代表Sun公司进行Java开发的真实情况,其中所指出的问题与此毫无关系。 作为一种可以运行其他程序的中间层程序语言,Java很容易实现在不同计算机之间移植程序;至少从理论上来说,不必修改每台计算机所使用的Java程序。由于Sun公司目前逐渐在强调其软件与硬件相互协作的重要性,Java和Solaris操作系统对Sun公司显得越来越重要。然而,Sun公司的很多软件都是针对Sun ONE(开放式网络环境)服务器软件推出的,而这一软件并不是基于Java语言来构建的。 Java语言目前已经开始用于功能强大的控制网络数据存储和进程的服务器中,它可以运行在Windows、Linux、所有大型Unix系统以及很多其他操作系统中,不过Sun公司一直声称Java在Solaris操作系统中运行效果最好。 尽管如此,上周五公开的这份备忘录还是为Sun公司蒙上了一层不愉快的阴影。备忘录中指出,负责Java的人员已经决定反对修复其中的缺陷,并已经更改了Java语言,使得旧版本Java程序无法和新版本Java程序协同工作。 <淘宝热门商品:
 

1.50元  

星钻喜铺◣皇冠信誉◢{100%满意婚庆一站式店铺}特色婚庆用品大全

 

 

丑丑靓坊 丽君百合减肥胶囊淘宝唯一授权店铺


来源:程序员网

小小豆叮

开放源代码软件对Java构成威胁?

开放源代码软件已经威胁到了操作系统软件,这决不是危言耸听,现在,Java应用服务器软件厂商也感受到了这种威胁。 ; 业界分析人士指出,要评估Tomcat和JBoss等开放源代码Java应用服务器软件在多大程度上蚕食了商业Java应用服务器软件厂商的收入很困难,但开放源代码应用服务器正在不断普及这一点是毫无疑问的。Forrester调研公司的分析师托德表示,很明显,有许多企业都认为开放源代码产品能够节约预算,例如搜索巨头Google,开放源代码产品的质量没有什么大问题,但其服务和支持的质量却有不小的问题。 开放源代码应用服务器的普及也是Linux进入企业的一个侧面,开发人员通常使用开放源代码工具开发和测试定制化的商业软件,并在开放源代码或商业性的Java应用服务器、数据库上运行它们。 开放源代码软件还没有在BEA、IBM和甲骨文这样的公司大范围普及,但其它开放源代码产品的不断普及以及持续的IT预算紧张都极有可能重组应用服务器软件市场。Java应用软件服务器已经成为企业IT架构的支柱,所有Java应用软件服务器都符合J2EE标准,使软件具有较好的可移植性。 应用服务器以及相关工具仍然是一个年收入数十亿美元的市场,但在经过数年的增长后,Java应用服务器软件受到了开放源代码产品以及微软的威胁。知名IT市场调研厂商IDC公司公司表示,与2001年相比,2002年的应用软件开发和部署业务的销售收入萎缩了4个百分点,应用软件部署平台的销售收入下降了近9%。例如,惠普公司就于去年被迫退出了Java应用服务器软件市场。 去年,Tomcat和JBoss等开放源代码Java应用服务器软件都有良好的表现,尽管Tomcat只适合不太复杂的应用软件,但由于功能的完备性以及与J2EE的兼容性,JBoss越来越受到了重视。为JBoss提供支持服务的JBoss集团已经获得了象电信巨头世通等重量级的客户。JBoss在开发人员中也很普及,去年,有200万人次下载了JBoss集团的产品。该集团正在努力使企业客户相信,开放源代码应用服务器能够象Linux那样使它们减少巨额开支。该集团的总裁马克表示,它已经成为了开发标准,我们面临的挑战是,如何使它象微软的.Net那样成为一个产品标准。马克说,为BEA的WebLogic等商业性Java应用服务器编写的应用软件在2、3天内就能够移植到JBoss平台上。 开放源代码应用服务器的普及是促使应用服务器软件厂商推出更简单、更便宜的产品的重要因素,许多企业只需要运行相对简单的任务,根本无需花大钱购买许多昂贵但用不着的功能。BEA和IBM都推出了各自的Java应用服务器软件的特殊版本,它们面向大企业内的部门或中、小规模的企业。这些产品的安装和配置简单,而且价格也只有数百到数千美元,远低于完整版应用服务器的数十万美元。 另外,微软也是令Java应用服务器软件厂商寝食难安的因素之一。计划于4月底推出的Windows Server 2003中将捆绑有应用服务器软件。据微软的官员称,通过在Windows中集成更多的软件,微软正在使Java应用服务器软件中典型的中间件功能无用武之地。另外,微软还通过其高效率的开发工具赢得了客户的忠诚度。 BEA和IBM都加强了在开发工具方面的努力。去年,BEA发布了WebLogic Workshop,解决了编写Java和J2EE难这个老大难问题。IBM则通过启动Eclipse计划和收购Rational显示了加强开发工具的决心。 Gartner集团的分析师纳提斯表示,从长远来看,对应用服务器的需求将不断增长,但开发和封装方式则会多种多样。基本的应用服务器将是免费或几乎免费的,而且会被整合在其它产品中,例如微软的操作系统或SAP的R/3企业应用软件包中。他预测出,将会有更专业的应用服务器问世。 托德说,不会有新的应用服务器厂商出现,现有的厂商将激烈地争夺市场份额。因此竞争的焦点将是完整性、产品的凝聚力、开发工具的质量、价格、第三方的支持以及开发人员的熟练程度。应用服务器市场之争将演变为品牌之争。 <淘宝热门商品:
 

228.00 元 

【专柜正品 超值之选】 JACK JONES/杰

 

130.00 元  

强力瘦身组合 60天疗程装 店主体验 劲减30斤


来源:程序员网

小小豆叮

Vector在Java编程中的应用

Vector 类提供了实现可增长数组的功能,随着更多元素加入其中,数组变的更大。在删除一些元素之后,数组变小。   Vector 有三个构造函数:   public Vector(int initialCapacity,int capacityIncrement)   public Vector(int initialCapacity)   public Vector()   Vector 运行时创建一个初始的存储容量initialCapacity,存储容量是以capacityIncrement 变量定义的增量增长。初始的存储容量和capacityIncrement 可以在Vector 的构造函数中定义。第二个构造函数只创建初始存储容量。第三个构造函数既不指定初始的存储容量也不指定capacityIncrement。   Vector 类提供的访问方法支持类似数组运算和与Vector 大小相关的运算。类似数组的运算允许向量中增加,删除和插入元素。它们也允许测试矢量的内容和检索指定的元素,与大小相关的运算允许判定字节大小和矢量中元素不数目。   现针对经常用到的对向量增,删,插功能举例描述:    addElement(Object obj)      把组件加到向量尾部,同时大小加1,向量容量比以前大1      insertElementAt(Object obj, int index)      把组件加到所定索引处,此后的内容向后移动1 个单位     setElementAt(Object obj, int index)    把组件加到所定索引处,此处的内容被代替。    removeElement(Object obj) 把向量中含有本组件内容移走。    removeAllElements() 把向量中所有组件移走,向量大小为0。    例如:  import java.lang.System; import java.util.Vector; import java.util.Emumeration; public class Avector{   public static void main(String args[]){    Vector v=new Vector();    v.addElement("one");    v.addElement("two");   v.addElement("three");   v.insertElementAt("zero",0);   v.insertElementAt("oop",3);   v.setElementAt("three",3);      v.setElementAt("four",4);    v.removeAllElements(); } }   Vector中的变化情况:   1. one   2. one   3. one   4. zero   5.zero   6. zero  7. zero   8.             two   two  one   one  one   one                three  two   two  two   two                    three  oop  three  three                        three   three  four     另外,Vector 在参数传递中发挥着举足轻重的作用。   在Applet 中有一块画布(Canvas) 和一个(Panel), 而Panel 中放着用户要输入的信息,根据这些信息把参数传递到canvas 中,这时在Java 中用一个接口(Interface), 而在接口中需用一个Vector 去传递这些参数。另外,在一个类向另一个类参数传递就可以用这种方法。   例如:  import java.util.Vector interface codeselect{    Vector codeselect=new Vector();  }   显示数学信息   Vector(0)存入学生编号   Vector(1)存入学科     在Panel 中当用户在TextField 和Choice 中选择自己所要求的内容,程序中通过事件响应把值传到向量Vector 中。假若在Panel 类中:  public void codepanel extends Panel{   public void init()   {     **. TextField  s=new TextField(); Choice c=new Choice(); c. addItem("语文"); c.addItem("数学"); c.addItem("政治"); add(s); add (c); ** }     public boolean handleEvent(Event event){ if(event.id==Event.ACTION_EVENT){ if(event.target.instanceof Textfield) { coderesult.setElementAt(s.getText(),0); } else if(event.target intanceof Choice) { coderesult.setElementAt(new Integer(c.getSelectedIndex()),1); } }   } }   这时,向量中已经存入学生编号和学科索引号(0 为语文,1 为数学,2 为政治)。   而在Canvas 中得到此值,   public class codecanvas extends Canvas{    public void code{}   public void paint{    String str;   int t;   str=(String)coderesult.elementAt(0);   t=(new Integer(codeselect.elementAt(1).toString())).intValue();   if(t==0)   {   显示语文信息   }   else if(t==1)   {   显示数学信息   }   else if(t==2)   {   显示政治信息   }   } } <淘宝热门商品:
 

36.9元  

◢◤80工厂◥◣-亚洲最大最全(B2C)创意家居礼品购物网

 

 

【北京商盟】风の轩杂货铺 小美贵族瘦身


来源:程序员网

小小豆叮

印度将面临IT技术人员短缺

计算机世界网消息 最近,印度全国软件及服务公司协会(Nasscom)在一项调查中指出,印度到2008年技术人员的需求量将达到100万;如果按照目前的人才引进方式,印度不能在技术教育上进行改革,那么这 一庞大的需求数字将无法得到满足,在未来五年内印度将面临上述需求量中近四分之一的技术人员短缺。 Nasscom会长基兰·卡尔尼克表示,虽然印度有着庞大的人才市场,每年有16.7万工程专业的学生和154万研究生从各种教育学院中毕业,但技术培训的匮乏仍然存在。按照目前的趋势,印度在未来五年时间内只能输送88.5万技术人才,人才短缺达23.5万。 卡尔尼克呼吁要采取行动填补这一教育缺口,无论是私有部门还是公共部门都要加强合作,强化培训技术部门需求的一些专门技术。对于IT工业本身来说,必须要在学生实习期间提供适当的培训,经过多种技术训练的学生也应该要经过软件培训。 Nasscom的调查中还包括以下一些内容: ● 印度IT软件和服务专业人员下个月将达到65万,比去年增长了24.4%。 ● 2002年印度IT员工的基本工资平均增长了8%,很多公司在人员聘用中为了控制成本都采用了浮动的工资支付方式,并把工资水平同公司业绩联系起来。 ● 在雇用新IT专业人才上,印度南部地区最多,占44%;印度东部地区最少,只占6%。 ● 印度软件专业人才的平均年龄为26.5岁。 ● 印度软件公司中的专业人才中,79%是男性,21%是女性,即男女比例为79:21;不过这一比例到2005年可能会变成65:35,而IT职能服务部门中这一比例正好相反,即男女比例为35:65。 ● 42%的印度软件专业人才或知识型员工都有三年以上的工作经历。 ● 在印度所有的软件专业人才中,76%的人都有研究生或以上学历。 <淘宝热门商品:
 

198.00 元 

08秋款欧洲正版G-star双排扣夹克外套 超好

 

0.90 元  

:①般般dē我 开【不】①般般的店

『四钻信誉』官方QB正规秒冲Q币,按元直充0.9元/QQ币


来源:程序员网

小小豆叮

SUN 内部文件: Solaris 搭配Java很难用

据SUN 计算机(Sun Microsystems)一份内部的备忘录指出,SUN 的Java在Solaris系统无法顺利运作,对此,SUN 则表示,该份备忘录已经 是两年以前的事,现在已经没有兼容的问题了。 许多SUN 的工程师在该份备忘录中指出,对大多数程序来说,Solaris版本的Java都不是一个好选择,不但速度慢,在SUN 内部也没有完善的 支持。此外,选择Solaris搭配Java也太贵了。 星期五在internalmemos.com上所刊登的备忘录指出,“我们一致认为Java和其它程序语言相比,有很多好处。一般来说,我们倾向选择Java 作为我们工具。只是如果使用Solaris版本的Java,那根本没办法做出可靠又有完善支持的产品。 SUN 确认了该份备忘录的真实性,不过SUN 也强调,该份备忘录已经是两年以前的事,备忘录里面所描述的问题也已经被修正了。SUN 指出, “这个备忘录并不能代表SUN 目前的实际状况。当时的问题对现在来说完全无关紧要。” 因为Java本身多了一个中间层的设计,所以用Java写出来的程序,更易于在不同平台上进行移植。理论上来说,Java的程序在不同计算机 上使用时,甚至不需要作任何更动。也就是说Java的程序,应该可以同时在Windows或Solaris上面跑。 虽然SUN 在软件方面的重点,放在SUN 开放网络(Sun Open Network Environment, Sun ONE)上面,不过Java和Solaris的搭配,对SUN 想要 推广自有软件在自己的硬件上运行的企图,重要性也与日俱增。 Java在负责数据储存和网络运算的服务器上,已经站稳脚跟。不管在Windows、Linux、或其它各种主要的Unix服务器上,都可以跑Java, 不过SUN 向来宣称Java在Solaris上的性能最好。SUN 首席执行官Scott McNealy,在星期一的产品发布会的访谈当中,也再度以这个观点来促销Solaris。McNealy表示,“Java在Solaris上跑起来像风一样快。” 不过在这份披漏的备忘录当中,却显示了了比较平实的现象。 例如,在备忘录当中指出,那些主导Java的人,已经决定不要修正部份的程序漏洞,而且还做出一些决定,让旧版的Java程序没办法和新版的 Java兼容。此外备忘录当中也指出,在Solaris上安装Java得占上许多的空间,例如安装从Borland并购而来的TogetherSoft的软件,就得要 900MB才够。光是在屏幕上显示一个最简单的“Hello, world”程序,也得花上9MB。备忘录也把这个数据和另一个和Java有许多部份相似的 Python作比较,Python如果要跑“Hello, world”只需要1.6MB。(黄晨哲) <淘宝热门商品:
 

6.80 元  

北欧橱窗

三冠 三角形强力吸墙角架/置物架/杂物架 承重3公斤 不伤墙面0.14

 

¥:7.80 

高更食品极美滋新奥尔良系列烧烤腌料皇冠旗舰店

【皇冠之家推荐】Jumex极美滋㊣葱香烧烤腌料70g/7.80新品推荐


来源:程序员网

小小豆叮

如何使用Java编写NT服务

如何使用Java编写NT服务 杨山河 内容简介:本文通过例子讲解了如何利用Java的特性快速编写安全可靠的NT服务,并展示了Java的多线程如何实施,以及如何应用套接字实现网络服务。 关键词:Java JntSvc.exe NT服务 多线程 套接字编程 一、NT服务介绍 所谓NT服务,实际上是一类特殊的应用程序所谓NT服务,实际上就是一个可以在系统启动时自动在一定身份下启动的伴随系统长时间存在的进程。象FTP server、HTTP server、脱机打印等都是采用NT服务的形式提供的。这实际上类似Unix的root daemon进程。NT服务归纳起来,NT服务又以下几个特征: 1、可以自启动,不需要交互启动。这对于服务器来说是一个重要的特征。当然,你可以决定服务是否自启动,甚至可以屏蔽某个服务。 2、NT服务没有用户界面,基本上类似一个DOS 程序,因为NT服务必须长时间运行,所以不想普通win32进程一样有自己的界面。但是NT服务可以同用户有界面交互,这是一类特殊的服务进程。可以通过NT的任务管理器来看到服务进程。 3、NT服务通过SCM(Services Control Manager)接口来管理,安装、启动、停止、撤除等都需要SCM的接口功能来进行。控制面板的服务控制器就是利用SCM接口来管理系统中的所有服务的。实际上,还有一些可以控制服务的程序或者命令,有net.exe 、服务器管理器等 、SCM.exe等。 4、这些进程都以一定的身份运行,以方便进行服务器资源的存取。一般情况下使用域中的LocalSystem账号运行,此账号对本机上的大多数资源(除非特别禁止)有完全的存取权限,这样可以保证服务程序的“强大”。但是,也有些服务采用特别的账号运行,你也可以特别设定一个服务的帐号。 5、由系统自动以线程方式运行,一般情况下不过多占用系统资源,这同普通的进程有所区别,如果不采用线程方式,一般进程往往消耗整个CPU资源。一般需要时时存在,又不能过多消耗资源的任务以服务来实现最合适。 二、Java编写服务的准备 1、作为本地化的实现,实现NT服务的Java程序当然不是100%纯Java,单靠标准类库是无法实现我们的编写NT服务的目的,所以MS提供了一套SDK for Java(本文采用的是Microsoft SDK for Java 4.0),提到了如何利用MS提供的扩展类库和相应的工具,实现符合Windows平台需要的程序。其中包括了实现NT服务的所需要的类库API框架以及将Java编译的class文件组装成标准的NT服务程序的工具。SDK的下载路径可以从www.microsoft.com/java/查找到。 2、安装完SDK后可以看到在安装目录下有jntsvc目录,此目录就包含了service.zip文件,它实际上是一个NT services的类库框架,封装了一些NT服务实现细节,使得我们可以按照框架舒服实现我们关心的细节。将service.zip展开至开发机器的系统安装Service库到Java扩展库\Winnt\java\TrustLib下,如果在其他操作系统下进行开发,参照此系统目录进行安装文件。 3、在该目录下还有一个jntsvc.exe文件,也就是Java NT Service的意思啦。她可以帮助您实现将按照SDK提供的框架实现的编译后的class文件组装成一个标准的NT服务可执行文件。JntSvc帮助我们在已经编译好的.class文件基础上设置了所有NT服务程序必须的特征,是很重要的工具,得到NT服务取决于如何有效利用她。为了我们能够方便从任何其他目录的控制台窗口调用她,我们将JntSvc.exe所在的目录全路径加入path环境变量。这可以通过设置系统属性的高级属性页当中进行环境变量的设定。 4、按照要求,我们写好各项代码,然后编译编写Java程序,得到class文件。我们当然不会在Vj Studio中启动她,因为它目前还没有可执行文件的入口,系统无法启动她。为了得到NT服务程序,我们需要在class文件所在目录的控制台窗口执行一个命令:X:>jntsvc *.class /OUT:ECHOSvc.exe /SVCMAIN:EchoSvc "/SERVICENAME:ECHOSvc"。具体的Jntsvc的参数我们可以看一看jntsvc -?得到,这里的意思大概是:将当前目录下的所有class文件组装成一个NT服务进程exe文件,文件名为EchoSvc.exe,服务的启动入口在echosvc.class中,在注册表中相应的服务名称为/Servicename参数指定的EchoSvc。如果有多个多个NT服务需要组装在一个Exe文件中,还可以在 /Out参数后指定每一个服务展示名称。/SVCMAIN参数指定服务的入口,所谓入口是指服务启动之初是从哪一个类的实例开始的。"/SERVICENAME:"参数指定了该服务将以什么名称出现。这些参数都是jntsvc.exe实用工具需要组装服务所必须的信息,根据这些信息将编译后的.class文件按照win32格式要求得到一个可执行文件。 需要注意的是,这个exe文件的运行必须要有JVM存在,她实际上是通过解释.class来实现服务提供的。如果需要另外的扩展包,可以通过在/Classpath参数指定另外的扩展包的位置。所以在安装Java编写得到的NT服务的机器上必须存在JVM。如果是拥有IE5.x那么不用操心这个问题,IE核心组件已经包括了JVM;但是如果是IE6版本,则需要到MS的网站上下载JVM。如果您讲SDK for Java安装在服务器上就更方便了。 5、如果没有什么错误,您将得到一个可执行文件echosvc.exe。像大多数服务可执行文件一样,它可以将自己安装到系统中: echosvc.exe –install,这一个过程将会往系统注册表添加一些项目,特别是关于服务的项目,SCM也可以列出这个服务了。我们可以在控制台下采用DOS NT服务控制命令Net start/stop来测试服务是否真像普通服务一样可以按照标准方式来控制,当然在服务管理器当中启停该服务更不会有问题。 三、Echo服务的样例 当系统载入服务进程时,入口是在EchoSvc的构造函数中,我们可以看到此构造函数带有同一般程序的入口main()类似的参数。 import com.ms.service.* ; public class EchoSvc extends Service { static Thread mainSvc=null ; //定义服务主线程 public EchoSvc (String[] args) //构造此服务 { CheckPoint(1000); setRunning(ACCEPT_SHUTDOWN | ACCEPT_PAUSE_CONTINUE |ACCEPT_STOP); // 该项服务接受的关于服务控制的命令 mainSvc = new Thread((Runnable) new MainSvcThread()); mainSvc.start(); System.out.println( "The Echo Service Was Started Successfully!");//纪录事件,可以通过事件察看器看到 } } CheckPoint是 Service的同步方法,指示系统正改变服务的状态,需要让系统等待1秒。这里我们启动的是一个线程,实际上相当于一个进程,她是服务进程的主线程。在这个线程中我们响应SCM对此服务的控制。大致的表达为: public class MainSvcThread implements Runnable //实现线程控制 { public static boolean STOP = false; //由系统来控制的内部变量,决定着服务进程(线程)的启动、暂停等 public static boolean PAUSE = false; public void run() { while (!STOP) { while (!PAUSE && !STOP) { 。。。//此处为服务控制逻辑,下面会充实此处 } try {Thread.sleep(5000);//休眠5秒后实现暂停或者停止} catch (InterruptedException e) { } } try {Thread.sleep(1000);} catch (InterruptedException ie) {} } } //Run结束 } 在服务逻辑控制当中,我们会具体实现Echo服务。我们的Echo服务监听2002端口,接收客户端任何一行输入,然后加上“Echo:”后返回。如果客户端输入一个quit词组那么服务认为这是客户关闭此套接字的命令,会自动关闭当前的套接字连接,停止对当前连接的服务。具体的实现(EchoThread.java的代码): public void run() { String line; DataInputStream in; PrintWriter out; boolean exitflag=false; try { in=new DataInputStream(so.getInputStream()) ;//获取套接字的输入流 out=new PrintWriter(new DataOutputStream(so.getOutputStream())) ; out.println("You have connected to EchoSvc!"); //发送问候 out.flush(); while((line=in.readLine())!=null) //读取 { line=line.trim(); if (line.equalsIgnoreCase("quit") ) { out.println("ECHO:" + line ); out.flush(); return; } else { out.println("ECHO:" + line ); out.flush(); } } in.close(); out.close(); } catch(IOException ioe) {} } Echo服务主要就是将客户发送的字符回显给客户,并加上Echo:的前缀,以表明是从服务器返回的内容。如果客户输入“quit”那么表示这是要求服务器停止服务的表现。 如何调试NT服务进程工程。如果直接将此函数调用来提供客户端的ECHO套接字服务,逻辑上是没有什么错误,但是就是无法支持多个用户同时访问。为了能够提供多服务,允许同时又多个用户连接此服务器(这种情况在很多网络服务都不可少),我们可以将此逻辑在由MainSvcTread创建的线程中实现,而且可以允许多个用户同时访问此服务。具体的表达在MainSvcTread的run函数中实现: while(ListenThreadCount
 

218.00 元  

2件全国包快递!韩国SHEZ~SZ超值春秋装4件

 

188.00 元  

脚踏运动-专卖品牌折扣店(已加入消费者保障计划)

08款 耐克5折=nike WMNS LEGEND 板鞋 女 311958-193 包邮+赠品


来源:程序员网

小小豆叮

使用JMX监控应用程序内、外部的状况

Java管理API (JMX)对管理WebLogic服务器而言是必需的。通过这个API,你可以在应用程序服务器里搜索管理beans (mbeans) 并且通过它们你既可以查询配置信息又可以查询runtime监控信息。 此外,通过这个API还可以用来改变服务器的配置。 事实上,这个API 已在控制台和其他的管理工具上使用着,用来完成它们的工作和提供报告数据。 这个API是一个强大的监控工具。让我们来看一个例子。 在这个应用程序中,有大部分的静态内容,一些你的个性化的JSP页面,一个注册系统,一个基于JMS(Java Messaging Services,Java消息服务)的数据系统,以及一个小付费应用系统。在这个应用程序中在哪里使用JMX对我们有利呢?在静态页面上,你可以为FileServlet存取信息并且可以看到花费了多少时间用来服务静态内容。时间可能比你预期的要少,因为浏览器自动的在客户端缓存了部分内容。大多数对静态内容的请求将会是HEAD请求,用来检查变化。对于动态页面,在系统中的每个servlet是被分别计算地。这个数据不能很好的反映用户的经验 (因为用户在他们送出请求和接到页面的返回之间存在延迟),但是这些数据告知了平均每个servlet花在一个请求上的时间,以及多少个请求被完成。我们的注册系统是一个实体bean,而付费系统是一个由外部服务返回的无状态会话bean。 两个bean都能被监控,而且通过这些监控信息可以帮助我们用来优化缓存和池的大小。我们的数据同样能有助于决定是否我们已经得到了所需要的信息,或是决定多少用户正在使用数据。吞吐量也可以使用JMS的topic和queue类型的mbean的属性来计算。此外,所有的JDBC连接都可以被监控,而且从它们的mbeans你能发现多少连接池被争用,举例来说,这将帮助你判断是否需要更多的数据库客户端授权。 mbeans 在WebLogic服务器中的第二种用途是用于配置信息。通过配置mbeans,所有资源的配置都被包含在runtime中。这些mbeans本质上是被包含在config.xml文件里的信息的表示。部署在服务器监听端口上的应用程序的所有内容都包括在这些接口中。大多数个别的属性是直接相关直接;然而,描述一个部署单元的属性集合是复杂的并且为了方便它们被集合在weblogic.Deployer类中。直接访问它们是可能的,但是除了看配置以及不改变它之外的操作是不被推荐的。其余的属性是随意的,但要小心,但如果组件(如JDBC池)被重新部署或服务器重新启动,大多数这些属性实际上只改变运行时的行为。这些配置性的mbeans 应用的作用范围从决定为某一特定应用使用资源,到调整基于来自监mbeans的反馈数值。 正如你所看到的,这有许多信息――但是如果你对JMS和WebLogic服务器都不熟悉,你如何着手呢? 它实际上不那么难。 只要你能使用JNDI并且可以阅读JavaDocs你就会发现操纵 mbeans是相当容易的。在下面你所看见的代码示例中,会告诉你如何得到本地服务器的mbean home接口以及JDBC池。 MBeanHome home = (MBeanHome) new InitialContext().lookup(MBeanHome.LOCAL_JNDI_NAME); Set pools = home.getMBeansByType("JDBCConnectionPool"); 上面的代码给出了对于JDBC(Java DataBase Connectivity,Java数据库连接)池的配置mbean。如果你想监控连接池而不考虑它们的配置,只要通过添加"Runtime"来改变mbean的类型就可以完成。从这个mbean你可以确定重要的信息,比如是否有连接泄漏――你甚至可以得到一个堆栈追踪,找到该连接的具体位置。 如果你不想做任何Java编程,就像从一个脚本文件中一样的使用JMX mbean系统,怎么办?幸运的是我们有一个命令行工具,它能让你以命令行的方式直接查看和改变mbean-weblogic.Admin。除了PINGing服务器,得到JNDI列表,重置连接池,以及关闭服务器外,它给出了直接访问mbean的分层结构。在下面的代码示例中你将看到这样的一个weblogic.Admin的指令。 java weblogic.Admin -username system -password [password] -url [url] GET -pretty -type JDBCConnectionPool 相比于在这些mbeans上加上属性的类型描述器,这段代码给出了关于mbean的简单易读的描述。同样的,有一个SET命令会在系统中改变任何mbean的属性。 拥有这种工具你应该能够在Java内部以及从脚本外部监控你的应用程序。 <淘宝热门商品:
 

¥:60.00 

燕窝饼店-皇冠信誉.纯中药美白.丰胸.减肥.排毒饼干.美丽吃出来

★燕窝饼店★燕窝全麦排毒饼干**排毒、养颜、美肤**

 

鲜花速递/蛋糕配送/园艺花艺 

瑞锦记锦缎喜糖袋〓婚礼特制●上等材质●流行韩


来源:程序员网

小小豆叮

诺基亚为Linux带来Java

诺基亚公司于日前推出了基于Linux的J2ME 1.1版本的开发工具。这将促使更多的创造性人才投身于移动应用开发。 此诺基亚开发伙伴套件为开发伙伴提供了创建、测试和配置可下载应用的工具,这些应用基于J2ME(Java 2微型版本)开发,J2ME是面向小型消费电子产品的Java版本。诺基亚此前已经宣布,其一系列现有和将来的移动终端都支持Java技术。 诺基亚J2ME 1.1开发伙伴套件支持MIDP(移动信息设备情景)应用。此套件帮助MIDP应用在一个独立环境下得到高效开发,同时它能与行业领导者Borland和Sun公司现有的IDEs实现集成。它提供了自动代码生成工具、档案创建器,可与诺基亚所有MIDP软件开发工具兼容。 《Java开发伙伴杂志》的总编Alan Willamson评论道:“今年的确是Java技术的发展之年。开发伙伴开始将他们的移动设备视作移动计算中心,而不只是电话――他们可以充分利用这些设备。诺基亚开发工具将激发开发伙伴的能量和热情,Linux开发伙伴将在此基础上取得创造性成果。” 诺基亚论坛副总裁Jouko Hayrynen 说:“这个流行的开发工具的新版本将进一步拓展创新性应用和服务的提供,以支持诺基亚和其他产商生产更多支持Java技术的设备。2002年,单是诺基亚Java手机的供应量就总计达数千万部。” 他接着说:“诺基亚很高兴能支持多种开发环境,帮助所有对基于开放性标准的应用开发感兴趣的潜在开发伙伴。诺基亚听取了开发伙伴的建议,并为此提供了我们最受欢迎的开发工具的Linux版本。” 诺基亚J2ME 1.1版本开发工具将把目前最流行的一项无线开发技术引入全球开发者社区中最具活力的一个项目。根据领先的IT发展市场分析公司――Evans数据公司的预测,14%的北美开发伙伴计划将Linux作为其2003年主要的开发工具,而2002年这一数字是8%。Evans的数据还显示,在全球范围内,12%的无线开发伙伴将主要在Linux环境下工作。 在发布Linux版本的同时,诺基亚还推出了开发工具的增强版。新版本提供音频转换器,可将MIDI音乐文件转换成诺基亚铃声文件,或者直接创制声源代码。此版本还提供可自动将Java应用上传到Web服务器以测试和配置的工具。这些增强功能在开发工具的Linux和Windows版本中都有。 此工具的两种版本都可从诺基亚论坛网站www.forum.nokia.com/tools下载。 <淘宝热门商品:
 

16.00 元  

减肥极品魔芋胶

 

 

【皇冠康康美美】同仁堂保健品 协和护肤品 营养品 减肥瘦身品


来源:程序员网

小小豆叮

摩托罗拉将第1个推出内置Linux软件的手机

【eNews消息】据英国金融时报2月13日报道,世界第二大移动电话制造商摩托罗拉公司周四在操作系统之战中选择了自己的接受对象,它宣布将推出第一个有着内置Java技术和Linux软件的手机。   给予Linux的认可对私人软件供应商是一个打击,特别是对英国的无线软件公司Symbian,因为摩托罗拉同该公司一直在进行合作。这一宣布还标志着对微软公司有了一个反应,微软一直在为它的软件能够在移动电话设备上的运用取得进展而在努力。同时这一宣布对高通公司也是一个反应,高通在这方面已经有了一个称作Brew的平台。   摩托罗拉手机分部的集团副总裁Mike Bordelon说:“我们是第一个建立一个全新的移动空间平台的重要手机制造商。我们支持Java。”   基于上述软件平台的摩托罗拉第一款手机是A760,它今年将在亚洲推出并且在明年向其它市场推出。所使用的软件平台预计首先将安装在中高档手机中。   由于Linux逐渐被诸如IBM等众多公司在使用,Linux已经成为主流软件。这一情况使得开发商的数量不断在增加并且也使得移动电话连接到诸如电脑等其它设备变得容易。   Bordelon说:“在我们最重要的市场之一的中国,我们几乎把Linux视作唯一的平台。中国政府也把它视作希望与电脑和移动电话市场相配的一个平台。” <淘宝热门商品:
 

188.00 元  

脚踏运动-专卖品牌折扣店(已加入消费者保障计划)

08款 耐克5折=nike WMNS LEGEND 板鞋 女 311958-193 包邮+赠品

 

 

黑龙江商盟】棋子儿平价美妆店-烟熏彩妆/假睫毛大全/新娘用品


来源:程序员网

小小豆叮

对等计算实践:基于 IP 多播的发现

要完成有用的工作,P2P 应用程序中的对等点必须能够彼此发现对方并与对方交互。在上一篇文章中,Todd 描述了几种不同的机制,对等点可以使用这些机制彼此发现,他还解释了每种机制的优缺点。本月,他提供了一种基于 IP 多播的发现的实现。 在软件实体能够参与具有 P2P 应用程序特征的直接的对等交互之前,该实体必须发现将要与之交互的适当的对等点。所有可行的 P2P 体系结构都提供一种针对发现问题的解决方案。上一次,我们研究了实现发现的几种不同的方法。本月,我将描述其中一种机制的实现。让我们通过回顾来开始今天的讨论。 再访发现 对等点发现使 P2P 应用程序中的对等点能够彼此定位以便相互之间可以交互。实现对等点发现服务有多种方法。最简单的机制是显式点到点配置。这种机制通过要求每个对等点知道所有它可能与之交互的其它对等点,并与它们相连,来进行工作。点到点配置的主要优点是简单。它的主要缺点是缺乏灵活性并且缺少扩展到对等点的大型网络的能力。 发现的另一个公共模型是使用中央目录作为中介。该模型在许多传统的、非 P2P 分布式类型的应用程序中间很流行,其优点是很好理解。对等点向中央目录注册自己的存在,并使用中央目录定位其它对等点。这种模型的主要优点是易于管理和扩展的能力。但是,其集中化设计会导致单点故障,因此它对自然力或网上冲浪人数增加所带来的危害缺乏抵御能力。 许多流行的 P2P 应用程序使用网络模型而不是中央目录,在网络模型中,单个对等点只知道局域网络上的对等点身份。每个对等点都作为那些与之相连的对等点的目录。对等点通过向相邻对等点传播目录查询并返回相关的响应来进行合作。这种模型的主要优点是没有集中化。它的主要缺点是由于传播查询耗费了大量的网络和处理能力。 上面三种机制有无数种变体。不讨论这些变体了,让我们继续前进并研究另一种发现机制。 IP 多播发现 就每个对等点维护自己的目录这点而言,多播模型类似于网络模型。但是,对等点不通过合作来实现大规模网络查询。另外,对等点利用网络本身提供的特性(IP 多播)来定位和标识其它对等点。 IP 多播是无连接和不可靠的(不象 TCP/IP 是面向连接和可靠的)。虽然它使用 IP 数据报;但是不象单播 IP 数据报那样是从一台主机发送到另一台主机,多播 IP 数据报可以同时发往多台主机。 对等点定期使用 IP 多播来宣布自己的存在。宣布包含了它们的主机名和一个用于正常通信的端口。对此消息感兴趣的对等点检测这个消息后,抽取出主机名和端口号,并使用该消息建立一个通信通道。 回顾已经足够了。让我们开始研究代码吧。 简单的客户机与服务器 我们将从一个简单的示例开始,该示例演示了两个进程如何使用 IP 多播进行通信。为了简化演示,我将分别从客户机和服务器进程这两个方面来介绍示例。P2P 应用程序通常会实现这两个进程,将它们划分为客户机或服务器并不容易。 在本例中,服务器进程进行循环并等待数据报包的到来。每接收到一个包,服务器就会向控制台打印一条简短的诊断消息。客户机角色要简单得多 — 它多播单个数据报包并退出。 清单 1 和 2 说明了这两部分是如何组合在一起的。代码中的注释说明了正在发生的事情。 清单 1. 简单服务器 public class Server { public static void main(String [] arstring) { try { // Create a multicast datagram socket for receiving IP // multicast packets. Join the multicast group at // 230.0.0.1, port 7777. MulticastSocket multicastSocket = new MulticastSocket(7777); InetAddress inetAddress = InetAddress.getByName("230.0.0.1"); multicastSocket.joinGroup(inetAddress); // Loop forever and receive messages from clients. Print // the received messages. while (true) { byte [] arb = new byte [100]; DatagramPacket datagramPacket = new DatagramPacket(arb, arb.length); multicastSocket.receive(datagramPacket); System.out.println(new String(arb)); } } catch (Exception exception) { exception.printStackTrace(); } } } 清单 2. 简单客户机 public class Client { public static void main(String [] arstring) { try { // Create a datagram package and send it to the multicast // group at 230.0.0.1, port 7777. byte [] arb = new byte [] {'h','e','l','l','o'}; InetAddress inetAddress = InetAddress.getByName("230.0.0.1"); DatagramPacket datagramPacket = new DatagramPacket(arb, arb.length, inetAddress, 7777); MulticastSocket multicastSocket = new MulticastSocket(); multicastSocket.send(datagramPacket); } catch (Exception exception) { exception.printStackTrace(); } } } java.net 包中的两个类使它运行。java.net.DatagramPacket 类保存了 IP 数据报包中包含的数据。java.net.MulticastSocket 类创建一个调整到一个特定多播组的多播套接字。 发现组件 尽管上述示例是一个很好的 IP 多播的演示,但它没有说明实现基于 IP 多播的对等点发现需要什么。要使它有用,我们需要一个功能不仅限于发送和接收包的软件组件。理想情况下,这个组件将了解它所接收的包的源对等点,并适当地丢弃一些信息,这些信息是关于那些它认为已经消失、死亡或以其它方式离去的对等点的。 在这个新设计中,对等点是一个多播组的成员。请牢记,发送到多播组的消息会透明地路由到该组的所有成员。 设计包括两个核心类和三个接口(我使用术语“接口”似乎不太严谨 — 在技术上是一个接口和两个抽象类)。Member 类的实例是一个多播组的成员。这个类管理所有的通信细节。MemberManager 类的一个实例负责了解参与多播组的其它成员。 对等点通过向多播组发送一个消息,来向属于多播组中的对等点宣布自己的存在。每个消息包含关于发送消息的对等点的信息 — 通常是主机名和用于正常(与发现无关)通信的端口。Member 类和 MemberManager 类对这些消息的内容几乎一无所知。对该信息的访问权属于使用这两个类的应用程序。 有三个接口跨越了消息传递/发现层和使用它的应用程序层之间的边界。它们是 Reference 抽象类、Message 接口和 MessageFactory 抽象类。应用程序必须提供这三个接口的实现。 Reference 抽象类定义了对多播组成员的引用。MemberManager 类管理一个引用集。应用程序将实现这个类的一个具体版本,它将包含应用程序所需要的任何引用逻辑。该类定义了两个方法,名称是 equalsInternal() 和 hashCodeInternal(),并且重新定义了 equals() 和 hashCode() 方法来调用这些方法。它通过这样做来强制实现者为这两个关键功能提供实现 — MemberManager 依赖于它们。 Message 接口定义了通过网络代码交换的消息数据的应用程序视图。应用程序将该消息看作是相对于应用程序运行范围的高级概念 — 类似于主机名和端口的概念。网络代码希望发送一个由字节组成的包。Message 接口的实现定义了如何将这些高级信息与字节相互转换。引用是信息的一个关键部分,所有消息都必须包含,因此该接口要求实现提供用于读和写 reference 的方法。 问题的最后部分是 MessageFactory 抽象类。这个类定义了生成新的 Message 实例的机制。深藏在 Member 类内的网络代码使用一个工厂来创建从多播数据报中抽取出的数据的 Message 实例。每个 MessageFactory 实例拥有一个随机生成的身份,它使用这个身份来从接收的消息中滤出要发送的消息。 总之,这五个类和接口(Member、MemberManager、Reference、Message 和 MessageFactory)构成了一个用于进行对等点发现的简单框架。当然,还有可以改进的空间。可以很容易地添加一种基于事件的机制,用于向感兴趣的侦听器通知成员的出现或消失。一种用于过滤所接收消息的灵活机制将很有用,但其实现却比较困难。我将这些建议留作读者的作业。 Member 类 上面描述的框架的完整源代码太长了,这里就不详细展示了,所以让我们只研究 Member 类的部分代码,因为其中包含了操作的大多数内容。更准确地说,操作发生在两个内部类中:MemberClient 类和 MemberServer 类。 请再次考虑第一个示例。它由一个发送 IP 多播数据报的客户机和一个接收数据报的服务器组成。在本例中(清单 3 和 4),两个单独的应用程序执行这两项功能。P2P 应用程序中的对等点的行为方式既象客户机又象服务器,所以我们的 P2P 应用程序应该同时包含两者才是适合的。 清单 3. MemberClient 类 private class MemberClient extends Thread { public void run() { try { while (true) { try { Message message = m_messagefactory.createSendMessage(); Reference reference = message.createReference(); message.writeReference(reference); message.sync(); byte [] arb = message.getByteArray(); DatagramPacket datagrampacket = new DatagramPacket(arb, arb.length); datagrampacket.setAddress(m_inetAddress); datagrampacket.setPort(m_nPort); MulticastSocket multicastsocket = new MulticastSocket(); multicastsocket.send(datagrampacket); } catch (IOException ioException) { ioException.printStackTrace(); } try { synchronized (this) { wait(m_nPeriod); } } catch (InterruptedException interruptedException) { break; } } } catch (Throwable throwable) { throwable.printStackTrace(); } } } 清单 3 包含了 MemberClient 类的源代码。象清单 1 中的客户机一样,这个客户机创建一个 MulticastSocket 实例并使用它来发送一个 DatagramPacket 实例。DatagramPacket 实例包含一个到发送方对等点的引用,该引用是作为字节数组编码的。只要该对等点还是活动的并在运行,客户机就会每隔一段常规时间来广播这条信息。 清单 4. MemberServer 类 private class MemberServer extends Thread { public void run() { try { MulticastSocket multicastsocket = new MulticastSocket(m_nPort); multicastsocket.joinGroup(m_inetAddress); while (true) { Message message = m_messagefactory.createReceiveMessage(); byte [] arb = message.getByteArray(); DatagramPacket datagrampacket = new DatagramPacket(arb, arb.length); multicastsocket.receive(datagrampacket); message.sync(); if (m_messagefactory.isMine(message) == false) { Reference reference = message.createReference(); message.readReference(reference); m_membermanager.addReference(reference); } } } catch (Throwable throwable) { throwable.printStackTrace(); } } } MemberServer 类在很多方面类似于清单 2 中的服务器。除了创建必需的代码,使用它从建立的通信(wire)上采集适当的数据报以外,这个服务器还对已编码的引用进行解码、创建消息并将消息传递到 MemberManager 实例进行保管。干得不错。 该类的其余部分由用于各种特性的读方法和写方法以及用于控制该类的生命周期的 start() 和 stop() 方法组成。 P2P 应用程序 对等点发现框架完成了,剩下的所有工作就是将它集成到现有的 P2P 应用程序中去了。对原来的 P2P 应用程序的更改相对较少。 首先,在其前身中,P2P 应用程序期望在其特性文件中列出所有已知的对等点。尽管这对演示用途来说很好(请回忆上面讨论的点到点配置),并在最多至大约四个对等点的情况下运行良好,但最终它的限制还是太大了。因此,除去了在特性文件中读取和管理对等点的代码,并以使用上面的发现机制的代码取代它。 其次,因为在特性文件中枚举了对等点,看上去它们就好象持久存在了。现有的应用程序如果假定它们不会消失,有时会侥幸获得成功。但是,在 P2P 的真实世界中,事情更易发生变化。新的应用程序进行了重新设计,适于在对等点消失时进行更好的恢复。 更新的源代码可在参考资料中得到。 结束语 找到对等点只是成功了一半。下一次我将研究一个难题,涉及两个对等点在现代因特网上的通信,要克服防火墙、网关以及其它一大堆麻烦。 参考资料 下载并更新本文的源代码。 “How IP Multicast Works”一文为初学者提供了很棒的简介。 Jxta Discovery Service 使用 IP 多播来定位合适的对等点。 在这个关于 Jxta 的系列文章中,Making P2P interoperable(developerWorks,2001 年 8-9 月)中,Sing Li 提供了一篇关于这种新的 P2P 技术的实用简介,并演示了如何使用 Jxta 构建 P2P 应用程序。 Vincent Matossian 的网站上有一个很棒的到高级 P2P 主题的链接集,其中包含发现。 请到 developerWorks Java 技术专区查找更多 Java 编程参考资料。 关于作者 自从有了台式计算机以来,Todd Sundsted 就一直在编写软件。他对安全性、分布式计算和发生于大规模细粒度系统中的动态行为以及突发的行为感兴趣。除了写作以外,Todd 还做一些编码工作。可通过 todd-p2p@etcee.com 与 Todd 联系。 <淘宝热门商品:
 

26.00 元  

时尚巴黎女人街 V 火爆这个冬季

附带女人我最大推荐魔法烘罩器电吹风机人性化冷暖风切换魔发冬夏

 

 

【华佗天然居】天然花草茶花茶中草药中药材


来源:程序员网

小小豆叮

Huihoo.org发布了JFoxMX的最新版本 1.2

近日,Huihoo.org发布了JFoxMX的最新版本 1.2,JFoxMX是JFox(开源J2EE应用服务器)的一个子项目。在新版本中,我们实现了SUN JMX 最新的 1.2 规范,JMX 1.2 规范相对于先前的 1.1 版本做了比较大的改动,使JMX看上去更加成熟,详细的资料可以参考JMX 1.2 规范 的第 29 页。 JFoxMX 1.2是国内第一个完整实现SUN JMX 1.2 规范的产品,将SUN JMX 1.2 的新功能以第一时间带给国内和全球的Java程序员。 同时,JFoxMX也通过了SUN公司的相关测试。 http://java.sun.com/products/JavaManagement/JMXperience.html 附:JMX 1.2 change log 。New interface NotificationEmitter extends NotificationBroadcaster 。Open MBeans made mandatory 。New interface StandardMBean generalizes standard MBean design patterns 。Model MBean descriptor fields updated 。ObjectName class updated 。MBeanServerDelegate updated 。New MBeanServerConnection interface 。Class loader repository redesigned and class loading behavior clarified 。New class MBeanServerBuilder allows alternative MBean server implementations 。Getters and setters cannot be invoked through the invoke method 。New MBeanServerInvocationHandler class facilitates construction of MBean proxies 。Timer service allows past times and supports fixed-rate execution 。Monitor service can monitor the same attribute in several MBeans 。New “Security” chapter added 相关信息: JFox产品主页:http://www.huihoo.org/jfox/index.html JFox产品下载:http://sourceforge.net/projects/jfox JFoxMX介绍:http://www.huihoo.org/jfox/jfoxmx.html huihoo.org http://www.huihoo.org 开源中间件组织 <淘宝热门商品:
 

1.02 元  

冰之.点卡店

【112热血传奇元宝】1个*游戏交易*

 

19.00 元  

【广州商盟】靓一族专营匡威运动鞋/秋冬针织帽子

特价19元 09年新款出口韩国时尚个性净版球球针织帽爆款卷边


来源:程序员网

小小豆叮

NEC表示将在手机中采用Linux

】 NEC表明了在该公司制造的手机中OS将采用Linux的意向。目前该公司的手机中采用了遵循μITRON的OS。但NEC未公布将从何时开始及在哪款手机中配备Linux。   NEC正在独自开发手机用Linux。另外,该公司还正在开发能重新利用现有应用软件的中间件。“目前已经完成中间件的β版”(NEC网络公司的执行董事、大谷进) <淘宝热门商品:
 

 

新势力品牌旗舰店/LED手表 手机话筒 负离子表 钛项圈大量批发!

大量批发

 

 

Оo*Оo*Оo淑芳阁_苗条姿_最有效的减肥瘦身与丰胸专卖店


来源:程序员网

小小豆叮

IBM发表可以在PDA等中利用Linux和Java的技术

【日经BP社报道】美国IBM于美国时间1月21日发表了一项技术,可以在掌上电脑及手持式设备等面向消费者的电子产品中利用Linux和Java。IBM公司将提供在微处理器“IBM PowerPC 405LP”中整合了美国MontaVista Software的Linux内核“MontaVista Linux Consumer Electronic Edition(CEE)”等的参考设计。这样,“将可以使制造商迅速及容易制作最终产品”(IBM公司)。   “在移动领域中,利用非电脑产品访问技术及企业信息的机会将会越来越增多。通过利用本公司提供的参考设计,将可以在面向消费者的电子产品中应用牢靠及高效的访问方法”(IBM公司Microelectronics的Power PC/新增产品主管部长、Lisa Su)。   通过在低耗电量的嵌入式处理器PowerPC 405LP中组合IBM公司的中间件“IBM Power Manager”和MontaVista Linux CEE,将可以节约约50%的处理器和内存的耗电量。“整个系统的耗电量将可以节约20%”(IBM公司)。   此外,为使该技术支持面向企业及消费者的双方面应用,在该技术中还将准备有J2ME(Java2 Platform, Micro Edition)认证的Java Runtime平台“WebSphere Micro Environment”。其结果,还将可以利用多媒体、数据接入以及语音识别和手写识别。   为了适应企业市场的要求,除了将准备IBM公司的“Service Management Framework”、“DB2 Everyplace”以及“Tivoli Device Management”以外,在参考设计中还将准备寿命周期管理软件及面向企业连接(EnterPriseConnectivity)的软件。此外,还将提供挪威Trolltech AS的移动式办公组件“QTopia”和挪威Opera Software的Web浏览器。   IBM公司计划在2003年第2季度使该参考设计可供使用。目前已经可以从该公司获取PowerPC 405LP的工业样品,该公司计划从2003年第3季度开始批量提供产品。另外,预计从第1季度开始可以利用MontaVistaLinuxCEE。其它的软件目前已经可以使用。 <淘宝热门商品:
 

50.00 元 

黑头粉刺净 扫光黑头粉刺顽痘 卖疯了

 

48.00 元  

韩国同步时尚休闲卫衣长款全棉开衫外套


来源:程序员网

小小豆叮

开放源代码+ Java = 省钱项目

公司内部各种异质IT基础设施与OS专用的老旧程序阻碍了公司进步,你该怎么办? 你可仿效FCCI保险集团应用软件开发主股Steve Goldsmith的作法,把公司内的Windows、Linux、甲骨文与AS/400系统之间的藩篱通通拆掉。 要让所有系统都能有某种程度的兼容性,这意味着每个平台商业逻辑都必需经过标准化,以便与其它平台作沟通;同时还要选择一个整合开发平台,一体适用在整个基础设施上;最后则是加入一层界面来作统一的呈现。 Goldsmith与他的同事最后决定采用Java当作商业逻辑层,另采HTTP/HTML作为呈现层。但FCCI公司并不以此自满,虽然让整个应用基础设施具备共通性在未来将会有莫大成效,但FCCI决定再从这些整合行动中再榨出额外的投资报酬率:那就是进入开放原始码领域。 根据Goldsmith的说法,一旦基础架构完成后,他们只需选择适用于各个部分的开放原始码组件即可:包括IDE、Web服务器、J2EE服务器等。Goldsmith表示,FCCI在敲定最后规格之前也经历一段「尝试错误」的实验阶段。现在最难的部分已经过关,FCCI不但省下一笔可观的,授权费Goldsmith甚至宣称商业软件寿终正寝之日也指日可待。以下是他的故事。 Steve Goldsmith现身说法 三年前,我们开始讨论应用开发的未来方向。当时我们是以Delphi撰写ISAPI模块(执行于IIS的Web应用DLL),并部署在Windows NT与 Windows 2000服务器上。Delphi语言同时还可让我们开发用在Windows平台的n-tier,以及客户/伺服端解决方案。 那时候我们的IT环境主要采用IBM AS/400、Windows 2000服务器以及甲骨文服务器;我们还收购了一家采用AS/400系统的厂商。以Windows为导向的解决方案,包括微软即将推出的.Net,都无法在全部的平台上执行。当时IBM与甲骨文已开始全力支持Java,若我们希望我们的程序代码能在内部所有平台上执行,Java是一个相当合乎逻辑的选择。 我们一开始是使用Borland的JBuilder搭配Apache Tomcat来开发JSP服务器程序。我们也决定使用HTML模板来区隔呈现层与商业逻辑层。开放原始码世界里有许多不错的服务器端模板解决方案。我们选择Velocity,因为它的弹性大,且在Trubine与JPublish的使用上也都经过市场验证。在数据库连接方面,我们采用JDBC,以及一个称为DBConnectionManager的类别来当作数据库连接共享。但一模式虽然效果不错,但为了能完全善用J2EE堆栈,我们还加入EJB与其它Tomcat所缺乏的J2EE功能。 不久之后,我们发现JBoss不但有所有我们需要的功能,还有一些额外的部分。JBoss是百分之百Java软件,并有一个HTTP 1.1网络服务器,热部署、丛集、JMX,更棒的是,JBoss可让我们将原本执行于Tomcat下的服务器小程序直接拿来用在JBoss上。我们于是开始善加利用这些J2EE功能,拿掉DBConnectionManager软件,直接使用JNDI当作DataSources与JavaMail。JBoss与我们的应用都能部署载Windows 2000 Server、Linux与AS/400上。截至此时,我们还持续使用JBuilder当作我们的IDE,但这一情形即将发生变化。 为了寻求建立J2EE终极开发套件,我接触到Eclipse。若结合1.4 Java SDK、JBoss与各种plug-in程序来使用,Eclipse不仅可与JBuilder并驾齐驱,许多方面甚至有青出于蓝的趋势。Eclipse+JBoss可允许直接在已部署的EJB上进行类别放置,并在同一IDE上进行伺服端与客户端的除错。Eclipse的观点模式可轻松切换于编写、除错与schema(纲要)编辑。即使我们决定使用商业软件,我们的程序代码也可与JBuilder、WebShpere Studio、BEA Weblogic等兼容。 目前,我们正积极使用EJB与自家资料快取技术来开发商业逻辑层。我们已经从撰写Servlet程序进展至撰写Applet、Thinlet、Swing应用、AS/400 RPG程序呼叫原生Java对象等。 IT部门不必再付出高额授权费便可开发完整的企业解决方案。花大钱购买企业开发软件包与应用服务器的时代即将开始没落。 <淘宝热门商品:
 

35.00 元 

【天使名妆】100%纯棉休闲瑜珈裤

 

99.00 元  

皇冠联盟增高鞋垫 鞋(足)护理原单服装批发店

【韩国内增高魔力秀腿鞋】◆增高6公分◆惊爆价99元◆银粉


来源:程序员网

小小豆叮

使用 J2ME 实现移动支付

本周,Roman 讨论的是电子交易(e-commerce)的另一方面 - 移动支付(m-payment)。移动支付是一种在移动设备上进行商务活动的新型方式,专门使用 Java 2 平台微型版(Java 2 Platform Micro Edition(J2ME))框架。 移动支付解决方案使用了 MIDP/SIM API、SSL 和 Java Card 平台,Java Card 平台提供了比通常情况更高的安全性和网络效率,并且还为事务本身提供经济上可行的适当的安全性。 详细请参见: http://www-900.ibm.com/developerWorks/cn/java/wi-tip29/index.shtml <淘宝热门商品:
 

288.00 元 

【19shop 超值正品】英国TOPMAN经典修

 

58.00 元  

忆草 中药去印平疤活肤霜 去痘印去


来源:程序员网

小小豆叮

Java正影响着一代程序员

Java正影响着一代程序员   不管你对Java是怎样一个态度,有一点不可否认,Java是现在全球最时髦的开发工具之一。这是一个奇妙的混合体:它拥有一门叫做Java的语言,拥有一套庞大且完善的类库,内置了其他语言,需要靠库甚至是操作系统才能支持的功能,拥有一个虚拟机。不管把这个混合体叫做什么,总之,Java的出现,确实给整个程序界带了巨大的冲击,把它称之为革命 还为时尚早,也许现在还无法准确评估Java为整个IT业带来的影响。但是有一点却毋庸置疑——Java将不可避免地影响一代程序员。   作为一名真正的职业程序员,也许真的需要评估一下Java在可以预见的一段时间里带给自己的影响。在美国,越来越多的应用是基于Java开发的。随着Java在企业应用的日臻完善,诞生了一批如ebny.com这样的重量级的应用方案,为此也打消了许多人对Java无法应用于大型企业级应用的顾虑。Weblogic——这个靠着appliction server起家的、提供纯Java应用的软件公司,几乎是在一夜之间崛起,股价青云直上,短短两三年间成为全球知名企业。而在国内,Java也已如火如荼。据调查,在未来几年内,将会出现20万个Java程序员职位需求,也许这将超过其他任何一种程序员的需求。   也许你开始对Java心动了,也许你经过深思熟虑将要开始Java的学习了,也许你已经读过Java的一两本入门的书了,现在要开始系统、基于开发的角度来学习Java,但是你都将面临一个问题,那就是以何种方式学习Java。   Java的职业培训课   对于国内绝大多数的程序员来说,自学可能是最好的方法。然而对于Java这么一个包含如此多东西的系统来说要想通过自学来理清整个系统脉络,并能运用它自如地开发系统,可以说具有相当的难度。程序员们学习某种语言或是某个系统可以算作是一种投资了,如何才能确保你获得最大的收益,一个有效合理的学习途径是必不可少的。在目前看来,上职业培训课是一种较为有效的方式。   为何职业培训课相对自学来说更加有效呢?可以从以下几方面考虑:首先在富有经验的培训教师的指导下,你可以避免走很多弯路,可以快速地获得许多专家级的经验,而这些如果靠自己来摸索,那将是一件很费时的事。其次这里拥有一个可供讨论的环境,这种培训课程上的学员,通常拥有相似知识背景,大家交流起来就非常的方便,不会存在什么障碍。   作为Java之父,Sun公司自然是不遗余力地推广Java。而职业培训课作为推广的一个重要手段,就显示出了其巨大价值,而培训本身就是一门巨大的产业。Sun公司自然在培训方面使足了全力。   其实Sun早在几年前就已在国内开展Java培训,通过与高校联办的十几个授权认证中心来进行培训。不过那时培训内容基本上都集中在J2SE即Java标准版的课程上,这些课程主要是帮助程序员了解并掌握Java的基本开发。不过随着Java版本的升级,Java本身也在发生一些重要的变化。Java应用领域逐渐扩大,企业级应用变得越来越普遍和重要。所以以前的培训内容已经不能完全适应今日的需求。Sun显然也看到了这一点,为了满足Java程序员们对日益深入的Java开发所需的技能,同时也能更近一步开拓这个有着巨大市场前景的培训市场,Sun重新强化完善了国内的培训体系。   让我们看一看Sun关于Java培训课程的结构图(见下)。作为Sun主推的4门课程,整个培训体系被分为3个层次:Programer(程序员)——Developer(开发人员)——Enterprise Architect(建筑师)。这有点类似我们传统的程序员——高级程序员——系统分析员的设置。这是一种非常灵活的培训体系,任何Java的开发人员可根据自己的兴趣和能力选择不同层次的课程,而无需从头学起,浪费不必要的时间和金钱。   对于初学者,或是一些想学习Java的非编程人员,如技术人员、Web开发人员、技术管理人员、系统管理员来说,SL--110就是一个很好的起点。通过对这门课程的学习,一个初学者能够很好地了解Java这个开发工具。   而对于一个拥有其他语言如C/C++设计经验的程序员,SL--275可能对你更适合,学习了这门课程,你将获得GUI、事件处理机制、例外处理、I/O、多线程、网络处理等实际的编程经验。   SL--285这门课程又上了一个台阶,它将使学员熟悉数据库服务器程序的设计方法,学会各种网络编程接口,如何调用其他语言的程序。完成了这门课程,程序员就有能力开发复杂的、产品级的Java程序。   SL--425作为Sun这次在国内主推的Java课程,也是Java培训课程中最高的一个层次。它主要是为高级开发人员以及体系结构决策人员所准备的,学员将熟练地进行体系结构的设计和描述,了解J2EE对体系结构的影响,以及如何应用J2EE来完成企业级的应用方案。   SL--275和SL--285这两门课程如果自己感觉还不错,还可以参加对应的Sun的Java认证考试。如考试通过,你将获得全球统一认证的资格证书。这在就业市场上是一个相当专业的资格认证。   但是任何的课程培训都不能代替程序员自己的学习,关键在于自己。一名出色的开发人员,是不会停止学习的!   Sun的Java职业培训课的三大好处:在教师的指导下,可以少走很多弯路。   可以快速地获得许多专家级的经验。   拥有一个可供讨论的环境。 <淘宝热门商品:
 

58.00 元  

淘宝生活 运动鞋专卖/正品ZIPPO热卖//淘宝职业信誉卖家

冲双钻 ADIDAS三叶草08夏季新款特价 漫画小子个性 休闲板鞋

 

 

【北京商盟】风の轩杂货铺 小美贵族瘦身


来源:程序员网

小小豆叮

jsp+javaServlet 的心得

先看下面的代码: JSP: <%@ include file="/jsp/includes/common/header.jsp"%> <%@ page import="utility.StringUtil" %> <%@ page import="question.entity.*" %> <%@ page import="system.*" %> <%@ page import="java.text.*" %> <html> <head> <TITLE>Question Inforamtion Page</TITLE> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1"> <link rel="stylesheet" type="text/css" href="<%=StringUtil.getRealPath()%>css/menu.css"/> <link rel="stylesheet" type="text/css" href="<%=StringUtil.getRealPath()%>css/timesheet.css"> </head> <script> function load(){} function unload(){} </script> <%@ include file="/jsp/includes/template/template1/header.jsp"%> <jsp:useBean id="etmQuestionInformationPages" class="QuestionInformationPages" scope="request"/> <jsp:setProperty name="etmQuestionInformationPages" property="currentPage" param="etmCurrentPage"/> <%@ include file="/jsp/system/checkAccess.jsp"%> <% String functionId = (String)request.getAttribute("etmFunctionID"); String temp = etmQuestionInformationPages.isAscending() ? "asc.gif" : "desc.gif"; String orderBy = etmQuestionInformationPages.getOrderByAttribute(); DateFormat df = new SimpleDateFormat("yyyy/MM/dd"); %> <form name="form1" method="post" action="../question/questionInformation"> <tr> <td class="head"> <!-- Start of Body Title: <%=functionId%>--> <%=StringUtil.getDisplayLabel(request, functionId + "-01","Maintain Question Template")%> <!-- End of Body Title --> </td> </tr> <tr> <td> <!-- Start of Action Button --> <jsp:include page="/jsp/system/sysListMenuWithAction.jsp" flush="true"/> <!-- End of Action Button --> </td> </tr> <tr> <td align="center"> <table width="700" border="0" cellspacing="0" cellpadding="0" background="<%=StringUtil.getRealPath()%>jsp/includes/images/clock.gif"> <tr> <td align="center" valign="top"> <table width="700" border="0" cellspacing="0" cellpadding="0" background="<%=StringUtil.getRealPath()%>jsp/includes/images/spacer.gif"> <tr> <!-- Start of Page "Previous / Next" Info. --> <td class="pageInfoRight" colspan="5"> <% if (etmQuestionInformationPages.totalNoOfPages() > 0) { %> <a class="nav" href="<%=StringUtil.getRealPath()%>question/questionInformation?etmAction=list&etmCurrentPage=previous"><%=etmQuestionInformationPages.hasPrevious()?"<img src=\"" + StringUtil.getRealPath() + "images/arrow_left2.gif\" border=0>":""%></a> <%=appBundle.getString("lblPage1")%> <%=etmQuestionInformationPages.pageNumber()%> <%=appBundle.getString("lblPage2")%> <%=etmQuestionInformationPages.totalNoOfPages()%> <%=appBundle.getString("lblPage3")%> <a class="nav" href="<%=StringUtil.getRealPath()%>question/questionInformation?etmAction=list&etmCurrentPage=next"><%=etmQuestionInformationPages.hasNext()?"<img src=\"" + StringUtil.getRealPath() + "images/arrow_right2.gif\" border=0>":""%></a> <% } else { %> <br> <% } %> </td> <!-- End of Page "Previous / Next" Info. --> </tr> <tr> <td align="center" valign="top"> <table border="1" cellspacing="0" cellpadding="0" width="100%"> <tr class="header"> <% if (isAuthorized(request, functionId, "batchDelete")) { %> <td width="4%" class="header"> <input type="checkbox" name="checkAll" onclick = "CheckAll()"> </td> <% } %> <td width="12%" class="header"> <a class="menu2" href="<%=StringUtil.getRealPath()%>question/questionInformation?etmAction=refresh&etmOrderBy=ID_QUESTION"> <%=bundle.getString("lblIdQuestion")%></a> <% if(orderBy.equals("ID_QUESTION")) { %> <img src="<%=StringUtil.getRealPath()%>images/<%= temp %>" height=7 hspace=3 width=7 border=0> <% } %> </td> <td width="25%" class="header"> <a class="menu2" href="<%=StringUtil.getRealPath()%>question/questionInformation?etmAction=refresh&etmOrderBy=QUESTION_DESC"> <%=bundle.getString("lblQuestionDesc")%></a> <% if(orderBy.equals("QUESTION_DESC")) { %> <img src="<%=StringUtil.getRealPath()%>images/<%= temp %>" height=7 hspace=3 width=7 border=0> <% } %> </td> <td width="8%" class="header"> <a class="menu2" href="<%=StringUtil.getRealPath()%>question/questionInformation?etmAction=refresh&etmOrderBy=QUESTION_CATEGORY"> <%=bundle.getString("lblQuestionCategory")%></a> <% if(orderBy.equals("QUESTION_CATEGORY")) { %> <img src="<%=StringUtil.getRealPath()%>images/<%= temp %>" height=7 hspace=3 width=7 border=0> <% } %> </td> <td width="21%" class="header"> <a class="menu2" href="<%=StringUtil.getRealPath()%>question/questionInformation?etmAction=refresh&etmOrderBy=QUESTION_CREATION_DATE"> <%=bundle.getString("lblQuestionCreationDate")%></a> <% if(orderBy.equals("QUESTION_CREATION_DATE")) { %> <img src="<%=StringUtil.getRealPath()%>images/<%= temp %>" height=7 hspace=3 width=7 border=0> <% } %> </td> <td width="5%" class="header"> <a class="menu2" href="<%=StringUtil.getRealPath()%>question/questionInformation?etmAction=refresh&etmOrderBy=STATUS"> <%=bundle.getString("lblStatus")%></a> <% if(orderBy.equals("STATUS")) { %> <img src="<%=StringUtil.getRealPath()%>images/<%= temp %>" height=7 hspace=3 width=7 border=0> <% } %> </td> <td width="16%" class="header"> </td> </tr> <% QuestionInformation questionInformation = (QuestionInformation)etmQuestionInformationPages.next(); int offset = 0; while(questionInformation != null) { %> <tr class="data"> <% if(isAuthorized(request, functionId, "batchDelete")) { %> <td class="data"> <input type="checkbox" name="etmItemOffset" value="<%=offset%>"> </td> <% } %> <td class="data"> <a href="<%=StringUtil.getRealPath()%>question/questionInformation?etmAction=view&etmIdQuestion=<%=questionInformation.getIdQuestion()%>&etmItemOffset=<%=offset%>"><%=questionInformation.getIdQuestion()%></a> </td> <td class="data"> <%=StringUtil.toTextField(questionInformation.getQuestionDesc())%></td> <td class="data"> <%=questionInformation.getQuestionCategory()%></td> <td class="data"> <%=df.format(questionInformation.getCreationDate())%></td> <td class="data"> <%=questionInformation.getStatus()%></td> <td > <% if(isAuthorized(request, "QUES2", "view")) { %> <a class="data" href="<%=StringUtil.getRealPath()%>question/questionDetailInformation?etmAction=view&etmIdQuestion=<%=questionInformation.getIdQuestion()%>&etmItemOffset=<%=offset%>"><%=bundle.getString("lblDetail")%></a> <% } %> <% if(isAuthorized(request, functionId, "edit")) { %> <a class="data" href="<%=StringUtil.getRealPath()%>question/questionInformation?etmAction=edit&etmIdQuestion=<%=questionInformation.getIdQuestion()%>&etmItemOffset=<%=offset%>"><%=appBundle.getString("lblEdit")%></a> <% } %> <a class="data" href="<%=StringUtil.getRealPath()%>question/questionInformation?etmAction=copy&etmCodeSubscriber=<%=questionInformation.getCodeSubscriber()%>&etmIdQuestion=<%=questionInformation.getIdQuestion()%>&etmItemOffset=<%=offset%>">Copy</a> <% if(true || isAuthorized(request, "QUES_REP", "view")) { %> <a class="data" href="<%=StringUtil.getRealPath()%>question/questionReply?etmAction=list&etmIdQuestion=<%=questionInformation.getIdQuestion()%>&etmItemOffset=<%=offset%>"><%=bundle.getString("lblReply")%></a> <% } %> </td> </tr> <% offset++; questionInformation = (QuestionInformation)etmQuestionInformationPages.next(); } %> </table> <tr> <td class="pageInfoRight" colspan="5"> <% if (etmQuestionInformationPages.totalNoOfPages() > 0) { %> <a class="nav" href="<%=StringUtil.getRealPath()%>question/questionInformation?etmAction=list&etmCurrentPage=previous"><%=etmQuestionInformationPages.hasPrevious()?"<img src=\"" + StringUtil.getRealPath() + "images/arrow_left2.gif\" border=0>":""%></a> <%=appBundle.getString("lblPage1")%> <%=etmQuestionInformationPages.pageNumber()%> <%=appBundle.getString("lblPage2")%> <%=etmQuestionInformationPages.totalNoOfPages()%> <%=appBundle.getString("lblPage3")%> <a class="nav" href="<%=StringUtil.getRealPath()%>question/questionInformation?etmAction=list&etmCurrentPage=next"><%=etmQuestionInformationPages.hasNext()?"<img src=\"" + StringUtil.getRealPath() + "images/arrow_right2.gif\" border=0>":""%></a> <% } else { %> <br> <% } %> </td> </tr> </td> </tr> </table> </td> </tr> </table> </td> </tr> <tr> <td> <!-- Start of Action Button --> <jsp:include page="/jsp/system/sysListMenu.jsp" flush="true"/> <!-- End of Action Button --> <jsp:include page="/jsp/system/message.jsp" flush="true"/> </td> </tr> </form> <%@ include file="/jsp/includes/template/template1/footer.jsp"%> 一般把页面分为, 菜单, 功能菜单, 详细内容, 汇总部分, 和页脚 (大家先分析一下, 待续) <淘宝热门商品:
 

3C数码配件 

江南精品馆----仪器机箱 仪表外壳 设备壳体大全

 

 

燕窝饼店-皇冠信誉.纯中药美白.丰胸.减肥.排毒饼干.美丽吃出来


来源:程序员网

小小豆叮

J2SE 1.4 中assertion 功能介绍

j2SE 1.4 中assertion 功能介绍 摘要 J2SE 1.4 在JAVA中新增添了assertion(暂译作断定)功能。 最简单的情形下,在JAVA代码中任一行可以写入一条布尔表达式, 在这一行代码的最前面加上assert关键字,就可以实现这样的功能: 如果表达式为真,则代码继续执行;否则,抛出异常。为了实现这项功能, 在JAVA中新添加了assert关键字,AssertionError类, java.lang.ClassLoader中增加了几个新的方法。 本文章详细介绍了assert关键字的使用, 从命令行控制assertion功能,从代码内部控制assertion功能,以及何时使用assertion功能等内容。下文中提到assert时特指assert关键字,而提到assertion则表示断定语句或断定功能。 assertion功能提供了一种在代码中进行正确性检查的机制,这种检查通常用于开发和调试阶段,到了软件完成部署后就可以关闭。这使得程序员可以在代码中加入调试检查语句,同时又可以在软件部署后关闭该功能而避免对软件速度和内存消耗的影响。基本上,assertion功能就是JAVA中的一种新的错误检查机制,只不过这项功能可以根据需要关闭。 通常在C和C++中,断定功能语句是可以通过预处理过程而不编译进最终的执行代码,由于JAVA中没有宏功能,所以在以前的java版本中断定功能没有被广泛的使用,在JDK1.4中通过增加assert关键字改变了这种状况。 这项新功能最重要的特点是断定语句可以在运行时任意的开启或关闭,这意味着这些起错误检查功能的语句不必在开发过程结束后从源代码中删除。 assertion语法非常简单,但正确的使用能帮助我们编写出健壮(ROBAST)可靠的代码。这篇文章中,我们不仅学习如何编写assertion语句,更要讨论应该在什么情况下使用assertion语句。 一、assertion语法基本知识 我们可以用新的JAVA关键字assert来书写断定语句。一条断定语句有以下两种合法的形式: assert expression1; assert expression1 : expression2; expression1是一条被判断的布尔表达式,必须保证在程序执行过程中它的值一定是真;expression2是可选的,用于在expression1为假时,传递给抛出的异常AssertionError的构造器,因此expression2的类型必须是合法的AssertionError构造器的参数类型。以下是几条断定语句的例子: assert 0 < value; assert ref != null; assert count == (oldCount + 1); assert ref.m1(parm); assert关键字后面的表达式一定要是boolean类型,否则编译时就会出错。 以下是使用断定语句的一个完整例子(见粗体语句行): public class aClass { public void aMethod( int value ) { assert value >= 0; System.out.println( "OK" ); } public static void main( String[] args ){ aClass foo = new aClass(); System.out.print( "aClass.aMethod( 1 ): " ); foo.aMethod( 1 ); System.out.print( "aClass.aMethod( -1 ): " ); foo.aMethod( -1 ); } } 这段程序通过语句 assert value >= 0; 来判断传入aMethod方法中的参数是否不小于0,如果传入一个负数,则会触发AssertionError的异常。 为了和J2SE 1.4 以前的程序兼容,在JDK1.4 中的javac 和 java 命令在默认情况下都是关闭assertion功能的,即不允许使用assert作为关键字,这就保证了如果你以前编写的程序中如果使用了assert作为变量名或是方法名,程序不必修改仍然可以运行。但需要注意的是,这些程序是无法使用JDK1.4 的javac进行重新编译的,只能使用JDK1.3或之前的版本编译。为了编译我们前面写的小程序,首先要使用符合J2SE 1.4 的编译器,同时还要使用几个命令行参数来使编译器启用assertion功能。 使用以下的命令来编译aClass.java: javac -source 1.4 aClass.java 如果我们使用 java aClass 来运行这段程序,就会发现assertion语句实际上并未得到执行,和javac一样,java命令在默认情况下,关闭了assertion功能,因而会忽略assertion语句。如何启用assertion语句将在下一节讨论。 二、通过命令行控制assertion功能 assertion语句的一项最重要的特点是它可以被关闭,关闭的作用是这条代码虽然仍存在于程序当中,但程序运行时,JVM会忽略它的存在,不予执行,这样代码的运行速度不会由于assertion语句的存在而受到影响,如果代码执行过程中出现了问题,我们又可以启用assertion语句,帮助我们进行分析判断。默认情况下,这项功能是关闭的。(提示:本小节介绍的命令行参数都是针对SUN提供的JDK1.4而言,如果使用其他公司的JDK则未必会完全一样。) JDK1.4 中,通过java命令的命令行选项 -ea (-enableassertions 的缩写)来启用。以下两个命令是等效的: java -ea myPackage.myProgram java -enableassertions myPackage.myProgram 同样,我们通过 -da (-disableassertions 的缩写)来关闭assertion功能: java -da myPackage.myProgram java -disableassertions myPackage.myProgram assertion功能还可以针对特定的包(package)或类(class)分别启用和关闭。针对类时,使用完整的类名;针对包时,包名后面紧跟“...”: java -ea: myPackage.myProgram java -da:... myPackage.myProgram 在一个java命令中使用多项 -ea -da 参数时,后面的参数设定会覆盖前面参数的设定,比如我们可以默认启用所有的assertion功能,但针对特定的包却关闭此功能: java -ea -da:... myPackage.myProgram 对于未命名的包(位于当前目录中)都属于默认包,可以使用以下的命令控制: java -ea:... myPackage.myProgram java -da:... myPackage.myProgram 对于随JVM安装时自己附带的所有系统类,可以分别使用 -esa(-enablesystemassertions)和-dsa(-disablesystemassertions)来控制assertion功能的启用和关闭。在表1.1中列出了控制assertion功能参数的所有用法。 表1 JDK1.4 中java命令和assertion功能有关的命令行参数 命令行参数 实例 含义 -ea Java -ea 启用除系统类外所有类的assertion -da Java -da 关闭除系统类外所有类的assertion -ea: Java -ea:AssertionClass 启用AssertionClass类的assertion -da: Java -da:AssertionClass 关闭AssertionClass类的assertion -ea: Java -ea:pkg0... 启用pkg0包的assertion -da: Java -da:pkg0... 关闭pkg0包的assertion -esa Java -esa 启用系统类中的assertion -dsa Java -dsa 关闭系统类中的assertion 至此,我们前面编写的小程序aClass可以用以下的任意命令运行: java -ea aClass java -ea:aClass aClass java -ea:... aClass 运行结果如下: aClass.aMethod( 1 ): OK aClass.aMethod( -1 ): java.lang.AssertionError at aClass.aMethod(aClass.java:3) at aClass.main(aClass.java:12) Exception in thread "main" 三、assertion命令行参数之间的继承关系 assertion功能的启用和关闭可以一直控制到每一个类,一个命令行可以容纳任意多个-ea -da 参数,这些参数之间是如何相互起作用的,基本上遵循两个原则:特定具体的设定优先于一般的设定,后面的设定优先于前面的设定。我们看下面的例子: // Base.java package tmp; public class Base{ public void m1( boolean test ){ assert test : "Assertion failed: test is " + test; System.out.println( "OK" ); } } // Derived.java // package tmp.sub; import tmp.Base; public class Derived extends Base{ public void m2( boolean test ){ assert test : "Assertion failed: test is " + test; System.out.println( "OK" ); } public static void printAssertionError( AssertionError ae ){ StackTraceElement[] stackTraceElements = ae.getStackTrace(); StackTraceElement stackTraceElement = stackTraceElements[ 0 ]; System.err.println( "AssertionError" ); System.err.println( " class= " + stackTraceElement.getClassName() ); System.err.println( " method= " + stackTraceElement.getMethodName() ); System.err.println( " message= " + ae.getMessage() ); } public static void main( String[] args ){ try{ Derived derived = new Derived(); System.out.print( "derived.m1( false ): " ); derived.m1( false ); System.out.print( "derived.m2( false ): " ); derived.m2( false ); }catch( AssertionError ae ){ printAssertionError( ae ); } } } Base类和Derived类个有一个方法m1和m2,因为Derived是Base的子类,所以它同时继承了方法m1。 首先在启用所有类的assertion功能后,运行程序: java -ea tmp.sub.Derived derived.m1( false ): AssertionError class= tmp.Base method= m1 message= Assertion failed: test is false 然后,我们单独关闭Base类的assertion功能的情况下,运行程序: java -ea -da:tmp.Base tmp.sub.Derived derived.m1( false ): OK derived.m2( false ): AssertionError class= tmp.sub.Derived method= m2 message= Assertion failed: test is false 可以看到,derived.m1(false)语句没有触发异常,显然这条语句是受到Base类的assertion功能状态控制的。如果继续研究,会发现以下两条语句的作用是一样的: java -da:tmp.Base -ea:tmp... tmp.sub.Derived java -ea:tmp... -da:tmp.Base tmp.sub.Derived 这说明前面提到的两条原则是在起作用。 四、在程序代码中控制assertion功能 assertion功能的启用和关闭也可以通过代码内部进行控制,一般情况下,是不需要这样做的,除非我们是在编写java程序的调试器,或是某个控制java程序运行的程序。 每一个java类都有一个代表其assertion功能启用与否的标识符。当程序运行到assertion语句行时,JVM就会检查这行assertion语句所在类的assertion标识符,如果是true,那就会执行这条语句,否则就忽略这条语句。 这个assertion标识符可以ClassLoader的以下方法设定: public void setClassAssertionStatus(String className, boolean enabled); className--需要设定assertion标识符的类 enabled--assertion功能启用或是关闭 这个assertion标识符也可以针对整个包一起控制,用ClassLoader的另一个方法设定: public void setPackageAssertionStatus(String packageName, boolean enabled); className--需要设定assertion标识符的包 enabled--assertion功能启用或是关闭 注意这个方法对于包packageName 的所有子包也起作用。 ClassLoader还有一个方法可以设定所有通过此ClassLoader装载的类的默认assertion状态: public void setDefaultAssertionStatus(boolean enabled); 最后,ClassLoader有一个方法可以清除所有以前进行的设定: public void clearAssertionStatus(); Class类也新增加了一个与assertion功能有关的方法,利用这个方法可以知道某个类的assertion功能是启用的还是关闭的: public boolean desiredAssertionStatus(); 注意:通过ClassLoader来设定assertion标识符只会影响此后通过该ClassLoader装载的类,而不会改变此前已经装载的类的assertion标识符状态。 五、AssertionError介绍 java.lang包增加了AssertinError类,它是Error的直接子类,因此代表程序出现了严重的错误,这种异常通常是不需要程序员使用catch语句捕捉的。AssertionError除了一个不带参数的缺省构造器外,还有7个带单个参数的构造器,分别为: object boolean char int long float double 我们前面提到的assertion语句的两种语法形式如下: assert expression1; assert expression1 : expression2; 第一种形式如果抛出异常,则调用AssertionError的缺省构造器,对于第二种形式,则根据expression2值的类型,分别调用7种单参数构造器中的一种。 下面我们对例一稍做修改,看看第二种assertion表达式的用法: public class aClass2{ public void m1( int value ){ assert 0 <= value : "Value must be non-negative: value= " + value; System.out.println( "OK" ); } public static void printAssertionError( AssertionError ae ){ StackTraceElement[] stackTraceElements = ae.getStackTrace(); StackTraceElement stackTraceElement = stackTraceElements[ 0 ]; System.err.println( "AssertionError" ); System.err.println( " class= " + stackTraceElement.getClassName() ); System.err.println( " method= " + stackTraceElement.getMethodName() ); System.err.println( " message= " + ae.getMessage() ); } public static void main( String[] args ){ try{ aClass2 fooBar = new aClass2 (); System.out.print( " aClass2.m1( 1 ): " ); fooBar.m1( 1 ); System.out.print( " aClass2.m1( -1 ): " ); fooBar.m1( -1 ); } catch( AssertionError ae ){ printAssertionError( ae ); } } } 运行结果如下: aClass2.m1( 1 ): OK aClass2.m1( -1 ): AssertionError class= aClass2 method= m1 message= Value must be non-negative: value= -1 从以上的结果可以可以发现,assertion语句 : 之后的参数被传递给了AssertionError的构造器,成为StackTrace的一部分。 因为AssertionError代表正常时不应该出现的错误,所以一旦出现,应尽快抛出,中止程序的执行,以引起程序维护人员的注意。但有时我们也需要捕捉AssertionError,执行一些任务,然后,重新抛出AssertionError。比如,我们的程序在网络中的某处有控制台监控整个系统的运行,我们就需要首先获得关于AssertionError的异常信息,通过网络传送给控制台,然后再抛出AssertionError,中止程序,就象例3做的那样: public void method() { AssertionError ae = null; try { int a = anotherMethod(); // ... assert i==10; // ... }catch( AssertionError ae2 ){ ae = ae2; StackTraceElement stes[] = ae.getStackTrace(); if (stes.length>0) { StackTraceElement first = stes[0]; System.out.println( "NOTE: Assertion failure in "+ first.getFileName()+" at line "+first.getLineNumber() ); } else { System.out.println( "NOTE: No info available." ); } throw ae; } } 六、是否使用assertion的几条准则 对assertion而言,重要的不是如何使用,而是何时何地使用。这一节将介绍几条准则,归纳在表2当中,可以帮助我们在决定是否应该使用assertion语句这样的问题时,做出正确的判断。 表2:是否使用assertion语句的判断原则 应该使用的情形 不应该使用的情形 用于保证内部数据结构的正确 不用于保证命令行参数的正确 用于保证私有(private)方法参数的正确 不用于保证公共(public)方法参数的正确 用于检查任何方法结束时状态的正确 不用于检查外界对公共方法的使用是否正确 用于检查决不应该出现的状态 不用于保证应该由用户提供的信息的正确性 用于检查决不应该出现的状态,即使你肯定它不会发生 不要用于代替if语句 用于在任何方法的开始检查相关的初始状态 不要用做外部控制条件 用于检查一个长循环执行过程中的的某些状态 不要用于检查编译器、操作系统、硬件的正确性,除非在调试过程中你有充分的理由相信它们有错误 assertion语句并不是if (expression) then 语句的简写,相反,它是保证代码健壮的重要手段。重要的是正确的区分何时使用assertion,何时使用一般的条件表达式。以下几条是使用assertion语句时需注意的情形。 不要使用assertion来保证明命令行参数的正确 使用命令行参数的程序都要检查这些参数的正确性,但这应该通过正常的条件检查来实现。以下就是一个错误使用assertion的例子。 public class Application{ static public void main( String args[] ) { // BAD!! assert args.length == 3; int a = Integer.parseInt( args[0] ); int b = Integer.parseInt( args[1] ); int c = Integer.parseInt( args[2] ); } } 如果你的程序必须有三个参数,否则不能运行的话,那更好的方法是抛出适当的RuntimeException: public class App{ static public void main( String args[] ) { if (args.length != 3) throw new RuntimeException( "Usage: a b c" ); int a = Integer.parseInt( args[0] ); int b = Integer.parseInt( args[1] ); int c = Integer.parseInt( args[2] ); } } assertion语句的作用是保证程序内部的一致性,而不是用户与程序之间的一致性。 使用assertion来保证传递给私有方法参数的正确性 以下的私有方法有两个参数,一个是必须的,一个是可选的。 private void method( Object required, Object optional ) { assert( required != null ) : "method(): required=null"; } 通常,私有方法只是在类的内部被调用,因而是程序员可以控制的,我们可以预期它的状态是正确和一致的。我们也就可以假设对它的调用是正确的,这自然包括调用参数的正确,因此可以使用assertion语句来保证这种准确性。 这一原则同样适用protected和package-protected方法。 不要使用assertion来保证传递给公共方法参数的正确性 下面这个公共方法有两个参数,source和sink分别代表头和尾,它们之间是互连的。在断开它们之间的连接之前,必须保证它们之间已经是互连的: public void disconnect( Source source, sink sink ) { // BAD!! assert source.isConnected( sink ) : "disconnect(): not connected "+source+","+sink; } 由于这个方法是public,因此source和sink之间的关系是我们不能控制的。这种我们不能保证正确的场合是不适合使用assertion语句的。 更重要的是,public方法可能被许多不同的程序调用,它必须保证在不同的调用情形下,它的接口特性是完全相同的。由于assertion语句是不能保证会被运行的,这取决于运行环境中的assertion功能是否被启用,如果assertion功能未被启用,就无法保证这个public 方法参数的正确。 这种情况下,你应该假设调用代码是有可能出错的,抛出适当的异常: public void disconnect( Source source, sink sink ) throws IOException{ if (!source.isConnected( sink )) { throw new IOException( "disconnect(): not connected "+source+","+sink ); } } 不要使用assertion来保证外部对公共方法的用法模式是否正确 下面这个public类可能处于两种状态,open或是closed。打开一个已经打开的Connection,关闭一个已经关闭的Connection都是错误的。但我们不应该使用assertion功能来保证这种错误不会发生: public class Connection{ private boolean isOpen = false; public void open() { // ... isOpen = true; } public void close() { // BAD!! assert isOpen : "Cannot close a connection that is not open!"; // ... } } 我们只有在Connection类是private类时,或者保证这个类对外界是不可见的,并且愿意相信所有使用这个类的的代码都是正确的情况下,才可以使用这种用法。 然而,Connection类是被公共使用的,完全有可能某个使用Connection类的程序存在漏洞,而试图关闭一个未打开的连接。由于存在这种可能,使用抛出异常是更适合的: public class Connection{ private boolean isOpen = false; public void open() { // ... isOpen = true; } public void close() throws ConnectionException { if (!isOpen) { throw new ConnectionException( "Cannot close a connection that is not open!" ); } // ... } } 不要使用assertion来保证对用户提供的某项信息的要求 在下面这段代码里,程序员使用assertion来确保邮政编码有5或9位数字: public void processZipCode( String zipCode ) { if (zipCode.length() == 5) { // ... } else if (zipCode.length() == 9) { // ... } else { // BAD!! assert false : "Only 5- and 9-digit zip codes supported"; } } assertion应该用来保证内部的一致性,而不是保证正确的输入。上面的代码应该在错误是直接抛出异常: public void processZipCode( String zipCode ) throws ZipCodeException { if (zipCode.length() == 5) { // ... } else if (zipCode.length() == 9) { // ... } else { throw new ZipCodeException( "Only 5- and 9-digit zip codes supported" ); } } 使用assert来保证对内部数据结构方面假设的正确 下面的私有方法的参数是3个整数构成的数组。我们可以用assertion来确认这个数组有正确的长度: private void showDate( int array[] ) { assert( array.length==3 ); } 我们预期对这个方法的调用都是正确的,即只提供长度为3的数组,assertion语句在此正是起到这个作用。 Java语言对数组已经有边界检查的功能,这保证程序不会读取数组边界之外的值,这段代码中assertion语句的作用就不如在C或C++中的作用那么重要,但也不意味着这是多余的。 使用assertion来检查任何方法将结束时状态 我们看下面的例子是如何在方法返回之前检查最后的状态: public class Connection{ private boolean isOpen = false; public void open() { // ... isOpen = true; // ... assert isOpen; } public void close() throws ConnectionException { if (!isOpen) { throw new ConnectionException( "Cannot close a connection that is not open!" ); } // ... isOpen = false; // ... assert !isOpen; } } 这样做的好处是这些方法内部的代码不管如何复杂,或是经过多少修改变动,利用最后的一条assertion语句我们都可以保证方法返回时某个状态的正确。 使用assertion检查不应该发生的状态 下面的代码正是起到这种作用: private int getValue() { if (/* something */) { return 0; } else if (/* something else */) { return 1; } else { return 2; } } public void method() { int a = getValue(); // returns 0, 1, or 2 if (a==0) { // deal with 0 ... } else if (a==1) { // deal with 1 ... } else if (a==2) { // deal with 2 ... } else { assert false : "Impossible: a is out of range"; } } 这个例子中,getValue的返回值只能是0,1,2,正常时出现其他值的情形是不应该的,使用assertion来确保这一点是最合适的。 提示:一个很好的编程习惯是对每组if else 语句总是写一条最后的else语句来包括所有的其他情况,如果你能保证程序一定不会进入这条语句,加进一条assert false;。 使用assertion检查任何方法开始时的初始状态 在这个例子里,方法processZipCode()必须保证zipCode的格式是有效的,才进行进一步的处理: public void processZipCode( String zipCode ) { assert zipCodeMapIsValid(); // ... } 这样做可以使程序中的漏洞及早被发现。 最后的原则:有胜于无 加入assertion语句是非常简单的,可以在代码编写的任何阶段加入,而且对程序运行速度性能等方面带来的影响也是轻微的,因此如果你对程序的某些环节有怀疑,不确定的时候,尽管加入assertion语句。一条永远不会触发的assertion语句并没有什么坏处,但如果应该触发却没有assertion语句存在,那时给我们带来的麻烦却是巨大的。 七、结束语: 我们可以发现,几乎所有的assertion代码看起来都是多余的,而这正是assertion语句的特点,如果我们发现某条assertion代码在程序中的作用是必不可少的,那我们肯定是错误的使用了assertion语句。assertion语句并不构成程序正常运行逻辑的一部分,时刻记住在运行时它们可能不会被执行。我们在判断是否应该使用assertion语句是,考虑的关键是是否有助于提高代码的健壮性,是否有助于代码出错后为调试过程提供有用的信息。 作者简介 甲子:长期从事JAVA相关技术的学习,持有SCJP和SCWCD证书,希望和广大JAVA爱好者交流。 -------------------------------------------------------------------------------- <淘宝热门商品:
 

 

糊涂乖宝☆电子城

 

7.20元  

:529M网络购物机构-江、浙、沪满百包快递


来源:程序员网

小小豆叮

用Xalan-Java分割字符串

读者或许熟悉Apache软件基金和它的各种相关的项目。在上次的文章中,我们涉及了Xerces,Apache的XML解析引擎。下面,我们讨论Xalan-Java XSLT处理器和关于它分割功能的应用。 XML数据有各种各样的格式。然而,XML文档中的数据格式不一定符合目标系统的规范。XMLT模板常被采用来把一种格式转换为另一种格式。不幸的是,XSLT的方法仅仅提供一套有限的功能执行这些转换。 Apache软件基金的Xalan项目包括Java和C++两种版本的XSLT处理器。这个处理器提供解析XML文档的功能,并使用XSLT模板来转换它们。除了标准的XSLT转换以外,Xalan也提供一把扩展方法。在扩展库提供的这些方法中,有一个字符串tokenizer把字符串分割成一组token。 问题领域 精确的一组XML转换用tokenize方法。任何时候,当你需要把字符串以一致的样式分解为子串,可以采用tokenize方法。实际上,tokenize方法是一个XSLT方法,它带两个参数。第一个参数指定要被分割的字符串。第二个参数指定把字符串分解为一组字符串token的分隔符。 tokenize方法的结果是一组表示token的节点。这些token和节点可以使用iterator或者作为单个值来处理。你可以用tokenizer把字符串分解为一组单个值,从一个长字符串获取单个token。 例子 为了举例说明tokenize方法的用法,我们看一个使用它的例子。下面是包含需要我们分割的字符串的一个XML文档: <CustomerAddress> <Address1>9399 W Higgins Street</Address1> <Address2>Rosemont, IL 60018</Address2> </CustomerAddress> 这个例子演示了系统的一个客户地址记录,包含两行地址。这是在系统中一个相当普遍的情形,地址信息仅当发邮件时使用,而实际的城市、州和邮编信息并不特别重要。不幸的是,许多系统希望地址信息被分成城市、州和邮编。需要一个机制把组合的<Address2>元素分成单独的城市、州和邮编元素。 方案 为了把数据以恰当的格式提供给目标系统,我使用Xalan的tokenize扩展功能。这个方法基于一组分割符把一个字符串,比如像地址,分割成多个token。如果没有指定分割符,使用默认的空格符号作为分割符。在我们的例子中,使用的分割符包括空格符号和逗号。 <淘宝热门商品:
 

¥:7.80 

高更食品极美滋新奥尔良系列烧烤腌料皇冠旗舰店

【皇冠之家推荐】Jumex极美滋㊣葱香烧烤腌料70g/7.80新品推荐

 

39.00 元 

双皇冠AAA级天然墨西哥彩眼黑曜石手链


来源:程序员网

小小豆叮

在JDBC警告的帮助下修正数据库

当数据库运行不正常却又没有报错和警告时,该查查Java数据库连接(JDBC)警告信息。这些警告能帮助我们找到未知的错误,修正费解的缺陷和调整数据库。 有三种提供JDBC警告的类:java.sql.Statement,java.sql.Connection,java.sql.ResultSet。这三种类都有getWarnings()方法返回SQLWaring对象。 该对象是SQLException的扩展,它以与SQLException封装错误信息集相同的方式封装了警告信息集。 很容易打印出SQLWaring信息: package com.generationjava.sql; import java.sql.SQLWarning; public final class JdbcW { static public void printWarnings(SQLWarning warning) { if(warning == null) { return; } System.err.println( formatWarnings(warning) ); } static public String formatWarnings(SQLWarning warning) { StringBuffer buffer = new StringBuffer(); while(warning != null) { buffer.append("SQLWarning: "); buffer.append( warning.getMessage() ); buffer.append("\nSQL State: "); buffer.append( warning.getSQLState( )); buffer.append("\nErrorCode: "); buffer.append( warning.getErrorCode( )); buffer.append("\n"); warning = warning.getNextWarning(); } return buffer.toString(); } } 下面是如何使用这个类: Connection connection = ....; JdbcW.printWarnings(connection.getWarnings()); Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM Users"); JdbcW.printWarnings(stmt.getWarnings()); JdbcW.printWarnings(rs.getWarnings()); 最后,使用Apache Jakarta[http://jakarta.apache.org/log4j/docs/index.html]项目的Log4J包,能把数据库警告信息传递给数据库管理员。 <淘宝热门商品:
 

2.19 元  

瑞锦记锦缎喜糖袋 婚礼特制●上等材质●流行韩\日〓厂家批售

瑞锦记●织锦缎喜糖袋喜袋喜糖盒巧克力包装婚礼首饰袋喜糖包装

 

¥:28.00 

冲三皇冠疯抢啦 亲亲baby快乐驿站,宝宝用品童鞋童帽童装

*皇冠特色*纯手工,可爱特别的老虎护耳帽宝宝帽子童帽,46-48cm


来源:程序员网

小小豆叮

Borland与独立软件提供商联手

Borland软件公司(Nasdaq NM: BORL)宣布与独立软件提供商实现双赢,联手推出合作伙伴计划。这个计划旨在拓展独立软件提供商和Borland在全球范围内的销售业绩,帮助独立软件提供商快速灵活地开发并部署Borland技术,并将其纳入自己的软件应用程序系统中,以便更好地为各自的客户服务。合作伙伴将从直接购进的Borland产品和专业技术中受益,提高生产力,降低成本,并更快的将其产品推向市场,从而增强自身的市场竞争力。独立软件提供商中已经有数家部署了Borland软件,如亚信公司、中科软件股份有限公司、河南电力和速达软件。 Borland大中华区董事总经理Jenny Liu说:“通过这个合作伙伴计划,在任何市场中、在任何平台上开发应用软件的独立软件提供商都可以利用Borland的全球优势,领先市场的技术和最直接的销售力量,增强他们作为企业级软件提供商的竞争力。Borland将继续开拓产品种类,以覆盖应用软件完整的生命周期。我们的合作伙伴将拥有一个绝佳的机会,将最新技术整合到其产品中,并与我们并肩快速拓展业务。” Borland独立软件提供商伙伴计划还将帮助独立软件提供商获得新的客户,这主要是通过联合销售和市场营销手段。同时这个计划还为Borland提供最佳商业解决方案,可以与Borland技术配套使用。 独立软件提供商和Borland联手优化软件解决方案 众多独立软件提供商都在采用Borland产品。它们覆盖众多市场领域,如客户关系管理,企业资源计划和企业应用程序集成。Borland产品覆盖应用软件生命周期的各个环节,从Borland? JBuilder? ,Borland? JDataStore?到Borland? Enterprise Server。 中科软件 “Borland严格遵循行业标准,产品质量卓越,因此成为我们理想的合作伙伴。我们把它的中间件和系统集成产品融入我们的产品,获得了立竿见影的竞争优势,能向客户提供更加综合的解决方案。” --中科软件股份有限公司总裁左春 亚信公司 “长期以来亚信公司一直同Borland软件公司保持密切合作。亚信AIOBS产品广泛使用了Borland Enterprise Server和VisiBroker Edition作为中间件,具备卓越的稳定性和性价比优势,可以为我们的客户带来更高的利润空间。” --亚信公司高级副总裁张振清 郑州信源 “Borland行业应用解决方案实现了与电力行业特性的完美结合。我们通过使用Borland 的中间件产品(Borland Enterprise Server),成功地实现了河南全省18个地市电力营销技术支持系统的“电力营销MIS”、“95598客户服务系统”和“电力负荷管理系统”多平台、多家应用开发厂商的数据整合,实现了全省电力营销数据的集中管理和实施监控。” --郑州信源总经理赵红 速达软件 “Borland强大灵活的数据库是我们重要的软件资源。与Borland建立的高价值的商业合作伙伴关系帮助我们快速将产品推向市场,为客户提供物超所值的产品与服务。实践经验证明我们的选择是对的。” --速达软件总经理邹其雄 关于Borland和独立软件提供商合作伙伴计划 作为一家独立软件提供商,Borland深知软件产品市场竞争激烈,并且战略伙伴关系对业务增长起到了至关重要的作用。Borland和独立软件提供商合作伙伴计划致力于帮助其它独立软件提供商利用领先市场的技术和Borland的全球推广机会,以更快的速度、更低的成本为更多的客户服务。独立软件提供商把Borland的开发和部署技术融入他们的产品服务中,使其开发人员和客户从中获得更多收益。如需更多信息,请访问http://www.borland.com/partners/ 或是发邮件给http://bdn.com。 关于美国Borland软件 美国Borland软件公司是全球领先的技术提供商,其技术主要用于开发、分发和集成软件应用。Borland公司提供的优秀技术解决方案专门针对互操作性而设计,各种规模的企业都可以借此成功迈入基于Web的网络计算时代,同时提升现有系统的应用价值。从《财富》1,000强企业到由上百万开发人员组成的“Borland开发人员网络(Borland Developer Network)”,Borland公司都使其客户能够自由地开发应用程序,将应用分发到任何地方,并在整个企业内对这些应用进行集成和管理。Borland解决方案能够帮助企业提高效率,并在降低用户总成本的情况下,使客户更快速经济地完成更高性能的项目。 美国Borland软件公司成立于1983年,总部设在美国加州Scotts Valley,业务遍及全球。更多信息请访问Borland公司网站http://www.borland.com 及开发网站http://bdn.com,或者拨打Borland免费咨询电话:800-632-2864。 所有Borland品牌及产品名称是属于Borland Software Corp.在美国及其它国家的商标或注册商标。其它的品牌分别属于它们各自的所有者。 <淘宝热门商品:
 

17.80 元  

居家家--18个月上四皇冠,家居类信用最高卖家

简家 四皇冠信用 鲸鱼USB暖手鼠标垫D4063 冬天上网必备

 

68.00 元  

SOCOOL时尚女包五皇冠店~美一天~每一天~批发V零售

★五皇冠-SUPER LOVER黑白奶牛个性秋时尚翻盖斜挎包-3902★


来源:程序员网

小小豆叮

中国移动“预热”无线JAVA

由中国移动和摩托罗拉公司共同主办的“中国移动—摩托罗拉杯第一届移动梦网无线JAVA应用设计大赛”在北京启动。大赛得到了诺基亚、爱立信、西门子等移动通信行业领军企业和SUN公司的支持。中国移动副总经理鲁向东在发言中将此次大赛称为“中国移动正式商用无线JAVA服务前的预热”,并表示,它将对未来的移动通信市场产生积极影响。 鲁向东认为,目前的手机是一个封闭的操作系统,除非用厂商自己的软件和工具,无法对手机的菜单进行改动,更无法在手机上附加其他应用。而中国移动无线JAVA服务是一种新的移动数据业务的增值服务,它提供了一个开放的平台,能更好地为客户提供全新图形化、动态化的移动增值服务。鲁向东说:“中国移动将在‘移动梦网’无线JAVA业务商用中吸收此次的获奖作品,并尽快将竞赛成果转化成实际的移动数据服务。” 据介绍,本次大赛主要针对应用程序开发群体,鼓励无线JAVA技术在提高工作效率、商业、服务质量、经营收益、娱乐和信息服务等领域的应用,力求为中国移动即将推出的无线JAVA增值业务平台打下基础,在移动应用开发领域倡导开放、标准、规范、信息安全、互动和商务实用化的理念。大赛将历时两个多月,来自中国移动、摩托罗拉和其他厂商的专家们将从受欢迎程度、易用性、功能性和移动性等方面对参赛作品进行评估,大赛的获奖者将优先成为中国移动未来无线JAVA服务推广中的合作伙伴。 <淘宝热门商品:
 

 

宜兴紫砂专卖--茗壶轩(宜兴丁山人经营 钻石信誉 实铺保证)

 

4.00 元  

阳光网游挂机程序专业店

[自动发货]梦幻西游辅助脚本单开压镖+半自动跑商+单开打图日卡


来源:程序员网

小小豆叮

java数据库的实现

此程序是用Java 通过JDBC—DOBC桥利用Access作后台制作的一个图书馆管理系统 表格: BookInfo(书籍信息) ISBN VARCHAR 20 NOT NULL PK Title: VARCHAR 30 Publisher VARCHAR 30 Author VARCHAR 20 IsLend VARCHAR 4 Reader(读者信息) ReadID VARCHAR 15 NOT NULL PK Name VARCHAR 20 Class VARCHAR 40 BorrowInfo(借阅信息) BorrowID VARCHAR 20 NOT NULL PK ReadID VARCHAR 20 NOT NULL ISBN VARCHAR 20 NOT NULL BorrowDate VARCHAR 20 NOT NULL ReturnDate VARCHAR 20 NOT NULL 源代码如下: *****************表格类******************** //表格的布局 package Table; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Table extends JPanel { private JPanel labelPanel, fieldsPanel;//定义两块面板对象 //labelPanel用来放标签,fieldsPanel用来放文本区 private String labels[] = //标签名 { "* ISBN:", "名称:", "作者:", "出版社:", /*"借出情况:",*/ //access table1 "读者编号:", "姓名:", "单位","借出日期","还书日期"}; JTextField ISBN, title, author, publisher,/*isLend,*/readerID,name,workPlace, borrowDate, returnDate; public Table() { labelPanel = new JPanel(); labelPanel.setLayout( //指定布局管理器 new GridLayout( labels.length, 1 ) ); ImageIcon ii = new ImageIcon( "images/icon.jpg" ); for ( int i = 0; i < labels.length; i++ )//加载 labelPanel.add( new JLabel( labels[ i ], ii, 0) ); // TextField panel fieldsPanel = new JPanel(); fieldsPanel.setLayout( new GridLayout( labels.length, 1 ) ); ISBN = new JTextField( 20 ); fieldsPanel.add( ISBN ); title = new JTextField( 20 ); fieldsPanel.add( title ); author = new JTextField( 20 ); fieldsPanel.add( author ); publisher = new JTextField( 20 ); fieldsPanel.add( publisher ); readerID = new JTextField( 20 ); fieldsPanel.add( readerID ); name = new JTextField( 20 ); fieldsPanel.add( name ); workPlace = new JTextField( 20 ); fieldsPanel.add( workPlace ); borrowDate = new JTextField( 20 ); fieldsPanel.add( borrowDate ); returnDate = new JTextField( 20 ); fieldsPanel.add( returnDate ); setLayout( new GridLayout( 1, 2 ) );//两块面板在GridLayout中呈一行两列 add( labelPanel ); add( fieldsPanel ); } } ****************操作********* import Table; import java.sql.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import sun.audio.*; import java.io.*; public class LibManager extends JFrame implements ActionListener { private Table tableArea;//调用Table类 private JTable output; //显示表的内容 private String url; //指定了帮助程序(在本地文件系统或网络上)定位数据库的数据库URL private Connection connect;//Connection对象管理java程序和数据库的连接 private JScrollPane textpane;//滚动区域对象 private ResultSet resultSet;//保存结果 private String password;//用户登录权限密码 private String comp = "manager";//制定密码 Statement statement ;//将向数据库递交查询 /*--------------------------Menu Component----------------------*/ private JMenuBar bar;//菜单栏对象 private JMenu fileMenu,controlMenu,optionMenu,helpMenu;//菜单对象 private JMenuItem exitItem, grantItem; //菜单项对象 private JMenuItem findItem1,findItem2,updateItem,insertItem,deleteItem; private JMenuItem borrowItem,returnItem,resetItem,refreshItem,advancedItem; private JMenuItem backgroundColorItem,fontColorItem,musicItem,stopItem; private JMenuItem useDisItem, aboutItem; private Container c = getContentPane(); private Color color = Color.lightGray; private AudioStream asWin, asDouble; public LibManager() { super( "LibraryManager 2.0" ); try { InputStream inDouble = new FileInputStream ( "绝代双骄.wav" ); asDouble = new AudioStream ( inDouble ); InputStream inWin = new FileInputStream ( "Windows 登录音.wav" ); asWin = new AudioStream ( inWin ); } catch (Exception e ) { e.printStackTrace ( ); } tableArea = new Table( ); output = new JTable (0, 0); c.setLayout( new BorderLayout() );//布局管理器 c.add( new JScrollPane( tableArea ),BorderLayout.NORTH ); textpane = new JScrollPane( output ); c.add( new JScrollPane( output ), BorderLayout.CENTER ); /*---------------------------------------------------*/ //加载菜单对象并注册监听 /*--------------------------Menu-----------------------*/ bar = new JMenuBar ( ); setJMenuBar ( bar ); /*----------------------File----------------------------*/ fileMenu = new JMenu ( "系统设置" ); grantItem = new JMenuItem ( "权限密码" ); grantItem.addActionListener ( this ); exitItem = new JMenuItem ( "退出" ); exitItem.addActionListener ( this ); fileMenu.add ( grantItem ); fileMenu.addSeparator ( ); fileMenu.add ( exitItem ); bar.add ( fileMenu ); /*------------------------------------Control------------------------------*/ controlMenu = new JMenu ( "功能" ); findItem1 = new JMenuItem ( "借阅查询" ); findItem1.addActionListener ( this ); findItem2 = new JMenuItem ( "读者查询" ); findItem2.addActionListener ( this ); updateItem = new JMenuItem ( "更新" ); updateItem.addActionListener ( this ); insertItem = new JMenuItem ( "插入书籍" ); insertItem.addActionListener ( this ); deleteItem = new JMenuItem ( "删除书籍" ); deleteItem.addActionListener ( this ); borrowItem = new JMenuItem ( "借阅" ); borrowItem.addActionListener ( this ); returnItem = new JMenuItem ( "归还" ); returnItem.addActionListener ( this ); resetItem = new JMenuItem ( "复位" ); resetItem.addActionListener ( this ); refreshItem = new JMenuItem ( "刷新" ); refreshItem.addActionListener ( this ); advancedItem = new JMenuItem ( "高级" ); advancedItem.addActionListener ( this ); ///////////////////////////////////////// password = JOptionPane.showInputDialog ( "管理员权限密码" ); controlMenu.add ( findItem1 ); controlMenu.add ( findItem2 ); controlMenu.add ( updateItem ); controlMenu.add ( insertItem ); controlMenu.add ( deleteItem ); controlMenu.add ( borrowItem ); controlMenu.add ( returnItem ); controlMenu.add ( resetItem ); controlMenu.add ( refreshItem ); controlMenu.addSeparator ( ); controlMenu.add ( advancedItem ); if ( password.compareToIgnoreCase ( comp ) != 0 )//判断两个字符串是否相等 { updateItem.setEnabled ( false ); insertItem.setEnabled ( false ); deleteItem.setEnabled ( false ); borrowItem.setEnabled ( false ); returnItem.setEnabled ( false ); advancedItem.setEnabled ( false ); }//end_if bar.add ( controlMenu ); /*------------------------------Option-------------------------------*/ optionMenu = new JMenu ( "选项" ); backgroundColorItem = new JMenuItem ( "Background Color" ); backgroundColorItem.addActionListener ( this ); fontColorItem = new JMenuItem ( "Font Color" ); fontColorItem.addActionListener ( this ); musicItem = new JMenuItem ( "音乐" ); musicItem.addActionListener ( this ); stopItem = new JMenuItem ( "暂停" ); stopItem.addActionListener ( this ); optionMenu.add ( musicItem ); optionMenu.add ( stopItem ); optionMenu.add ( backgroundColorItem ); optionMenu.add ( fontColorItem ); backgroundColorItem.setEnabled ( false ); fontColorItem.setEnabled ( false ); //musicItem.setEnabled ( false ); bar.add ( optionMenu ); /*---------------------------------Help------------------------------*/ helpMenu = new JMenu ( "帮助" ); helpMenu.setMnemonic ( 'H' ); aboutItem = new JMenuItem ( "关于" ); aboutItem.addActionListener ( this ); useDisItem = new JMenuItem ( "使用说明" ); useDisItem.addActionListener ( this ); helpMenu.add ( useDisItem ); helpMenu.add ( aboutItem ); bar.add ( helpMenu ); /*-------------------------------End Menu---------------------------*/ /*-------------------- Set up database connection --------------------*/ try { url = "jdbc:odbc:Books"; //指定了帮助程序(在本地文件系统或网络上)定位数据库的数据库URL //String username = "anonymouse";//指定了用户登录的用户名和口令 //String userpassword = "guest"; Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );//装入了数据库驱动程序的类定义 connect = DriverManager.getConnection( url );//尝试与URL指定的数据库的连接 } catch ( ClassNotFoundException cnfex ) //若不成功抛出异常 { // process ClassNotFoundExceptions here cnfex.printStackTrace(); } catch ( SQLException sqlex ) { // process SQLExceptions here sqlex.printStackTrace(); } catch ( Exception ex ) { //process remaining Exceptions here ex.printStackTrace(); } setSize( 530, 500 );//设置显示的区域 setLocation ( 120 , 35 ); AudioPlayer.player.start ( asWin ); show();//显示 }//end_constructure function public void actionPerformed ( ActionEvent e ) { /*--------------------------file menu-----------------------*/ if ( e.getActionCommand ( ) == "退出" ) { int option = 0; option = JOptionPane.showOptionDialog( null ,//询问是否真的退出 "Are yout sure to exit?", "Exit", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE,null,null,null ); ////////////////////////////////////////////////////// //YES_OPTION RETURN 0 , NO_OPTION RETURN 1 if ( option == JOptionPane.YES_OPTION ) System.exit ( 0 ); } else if ( e.getActionCommand ( ) == "权限密码" )//升级到管理员权限 { String grant = JOptionPane.showInputDialog ( "权限密码:" ); if ( grant.compareToIgnoreCase ( comp ) == 0 ) { updateItem.setEnabled ( true ); insertItem.setEnabled ( true ); deleteItem.setEnabled ( true ); borrowItem.setEnabled ( true ); returnItem.setEnabled ( true ); advancedItem.setEnabled ( true ); }//end_if }//end_grant else if ( e.getActionCommand ( ) == "复位" )//Reset清空表格 { clear(); } /*---------------------------------option menu-------------------------------*/ /* else if ( e.getActionCommand ( ) == "Background Color" ) { color = JColorChooser.showDialog ( BooksManager.this, "Choose a color" , color ); c.setBackground( color ); c.repaint(); } else if ( e.getActionCommand ( ) == "Font Color" ) { } else if ( e.getActionCommand ( ) == "Music" ) { //audio.play ( ); //play ( codebase ,"hua.mp3" ); }//end_music */ /*-------------------------------control------------------------------*/ else if ( e.getActionCommand ( ) == "借阅查询" )//查询所有记录 { boolean record = false;//是否有前一个记录,初始无 try { statement = connect.createStatement ( );//实现了接口的对象, //现在可以使用statement进行查询 ///--------------------------extend--------------------------------- if ( tableArea.ISBN.getText().equals( "" )&& tableArea.title.getText().equals( "" )&& tableArea.author.getText().equals( "" )&& tableArea.publisher.getText().equals( "" ) )//若用户不输入,默认为查询所用信息 { String query = "SELECT * FROM BookInfo";//查询指令 resultSet = statement.executeQuery ( query );//执行查询指令 //将结果保存在ResultSet对象中 }//end_if else if ( tableArea.ISBN.getText().equals( "$" )|| tableArea.title.getText().equals( "$" )|| tableArea.publisher.getText().equals( "$" )|| tableArea.author.getText().equals( "$" ) )//一旦有$值,查找与之匹配的记录 {//else_start String query = "SELECT DISTINCT ";//查询指令 if ( tableArea.ISBN.getText().equals( "$" ) ) { if ( record != true ) { query += " ISBN "; record = true; } } //--------- if ( tableArea.title.getText().equals( "$" ) ) { if ( record != true ) { query += " Title "; record = true; } else query += " ,Title "; } //------------------ if ( tableArea.publisher.getText().equals( "$" ) ) { if ( record != true ) { query += " Publisher "; record = true; } else query += " ,Publisher "; }//--------- if ( tableArea.author.getText().equals( "$" ) ) { if ( record != true ) { query += " Author "; record = true; } else query += " ,Author"; }//--------- query += " FROM BookInfo"; resultSet = statement.executeQuery ( query );//执行查询指令 //将结果保存在ResultSet对象中 clear(); }//end_first_else else //一旦有值,查找与之匹配的记录 {//else_start String query = "SELECT * FROM BookInfo";//查询指令 if ( ! tableArea.ISBN.getText().equals( "" ) ) { if ( record != true ) { query += " where ISBN LIKE '%"+tableArea.ISBN.getText()+"%' "; record = true; } } //---------- if ( ! tableArea.title.getText().equals( "" ) ) { if ( record != true ) { query += " where Title LIKE '%"+tableArea.title.getText()+"%' "; record = true; } else query += " and Title LIKE '%"+tableArea.title.getText()+"%' "; }//--------- if ( ! tableArea.publisher.getText().equals( "" ) ) { if ( record != true ) { query += " where Publisher LIKE '%"+tableArea.publisher.getText()+"%' "; record = true; } else query += " and Publisher LIKE '%"+tableArea.publisher.getText()+"%' "; }//--------- if ( ! tableArea.author.getText().equals( "" ) ) { if ( record != true ) { query += " where Author LIKE '%"+tableArea.author.getText()+"%' "; record = true; } else query += " and Author LIKE '%"+tableArea.author.getText()+"%' "; }//--------- resultSet = statement.executeQuery ( query );//执行查询指令 //将结果保存在ResultSet对象中 }//end_else displayResult ( resultSet );//调用显示函数 statement.close ( );//关闭数据库 }//end_try catch ( SQLException sqlex ) { sqlex.printStackTrace ( ); } }//end_borrowfind else if ( e.getActionCommand ( ) == "读者查询" ) { boolean record = false;//是否有前一个记录,初始无 try { statement = connect.createStatement ( );//实现了接口的对象, //现在可以使用statement进行查询 ///--------------------------extend--------------------------------- if ( tableArea.readerID.getText().equals( "" )&& tableArea.name.getText().equals( "" )&& tableArea.workPlace.getText().equals( "" ) )//若用户不输入,默认为查询所用信息 { String query = "SELECT BorrowInfo.ReadID, BorrowInfo.ISBN, BorrowInfo.LendDate,"+ " BorrowInfo.ReturnDate, Reader.Name, Reader.Class, BookInfo.Title"+ " FROM Reader INNER JOIN (BookInfo INNER JOIN BorrowInfo "+ " ON BookInfo.ISBN = BorrowInfo.ISBN) ON Reader.ReadID = BorrowInfo.ReadID"; resultSet = statement.executeQuery ( query );//执行查询指令 //将结果保存在ResultSet对象中 }//end_if else if ( tableArea.readerID.getText().equals( "$" )|| tableArea.name.getText().equals( "$" )|| tableArea.workPlace.getText().equals( "$" ) )//一旦有$值,查找与之匹配的记录 {//else_start String query = "SELECT DISTINCT ";//查询指令 if ( tableArea.readerID.getText().equals( "$" ) ) { if ( record != true ) { query += " ReadID "; record = true; } } //--------- if ( tableArea.name.getText().equals( "$" ) ) { if ( record != true ) { query += " Name "; record = true; } else query += " ,Name "; } //------------------ if ( tableArea.workPlace.getText().equals( "$" ) ) { if ( record != true ) { query += " Class "; record = true; } else query += " ,Class "; }//--------- query += " FROM Reader"; resultSet = statement.executeQuery ( query );//执行查询指令 //将结果保存在ResultSet对象中 clear(); }//end_first_else else //一旦有值,查找与之匹配的记录 {//else_start //String query = "SELECT ReadID,Name,Class,ISBN,Title FROM BookInfo,Reader";//查询指令 String query = "SELECT * FROM Reader";//查询指令 if ( ! tableArea.readerID.getText().equals( "" ) ) { if ( record != true ) { query += " where ReadID LIKE '%"+tableArea.readerID.getText()+"%' "; record = true; } } //---------- if ( ! tableArea.name.getText().equals( "" ) ) { if ( record != true ) { query += " where Name LIKE '%"+tableArea.name.getText()+"%' "; record = true; } else query += " and Name LIKE '%"+tableArea.name.getText()+"%' "; }//--------- if ( ! tableArea.workPlace.getText().equals( "" ) ) { if ( record != true ) { query += " where Class LIKE '%"+tableArea.workPlace.getText()+"%' "; record = true; } else query += " and Class LIKE '%"+tableArea.workPlace.getText()+"%' "; }//--------- resultSet = statement.executeQuery ( query );//执行查询指令 //将结果保存在ResultSet对象中 }//end_else displayResult ( resultSet );//调用显示函数 statement.close ( );//关闭数据库 }//end_try catch ( SQLException sqlex ) { sqlex.printStackTrace ( ); } }//end_borrowfind /* else if ( e.getActionCommand ( ) == "更新" )//修改存在的记录 { try { statement = connect.createStatement(); String query = "UPDATE BookInfo SET IsLend='否' WHERE ISBN >='0'"; boolean record = false; if ( ! tableArea.ISBN.getText().equals( "" ) ) { if ( ! tableArea.title.getText().equals( "" ) ) { if ( record != true ) { query += " SET Title = '"+tableArea.title.getText()+"' "; record = true; } } //----------------- if ( ! tableArea.publisher.getText().equals( "" ) ) { if ( record != true ) { query += " SET Publisher = '"+tableArea.publisher.getText()+"' "; record = true; } else query += ", Publisher = '"+tableArea.publisher.getText()+"' "; } //-------------------- if ( ! tableArea.author.getText().equals( "" ) ) { if ( record != true ) { query += " SET Author = '"+tableArea.author.getText()+"' "; record = true; } else query += ", Author = '"+tableArea.author.getText()+"' "; } //-------------------- query +=" WHERE ISBN = '" +tableArea.ISBN.getText()+ "' "; int result = statement.executeUpdate( query );//executeUpdate返回一个整型值 //执行成功为1, if ( result == 1 ) { //清空表格 clear(); String Jquery = "SELECT * FROM BookInfo";//查询指令 resultSet = statement.executeQuery ( Jquery );//执行查询指令 //将结果保存在ResultSet对象中 displayResult ( resultSet ); } else JOptionPane.showMessageDialog ( null, "You may only update existing record", "Warning", JOptionPane.ERROR_MESSAGE ); statement.close();//关闭连接 // }//end_if }//end_try catch ( SQLException sqlex ) //抛出异常 { JOptionPane.showMessageDialog ( null , "Can't connect ", "Warning", JOptionPane.ERROR_MESSAGE ); sqlex.printStackTrace(); }//end_catch }//end_update */ else if ( e.getActionCommand ( ) == "插入书籍" )//插入操作 { try { statement = connect.createStatement(); //返回表格中的值,并存放在临时变量中 String sisbn = tableArea.ISBN.getText(); String stitle = tableArea.title.getText(); String spublisher = tableArea.publisher.getText(); String sauthor = tableArea.author.getText(); if ( ! tableArea.ISBN.getText().equals( "" ) ) { String query= "INSERT INTO BookInfo( ISBN, Title,Publisher,Author,IsLend )VALUES( '"+sisbn+"','"+stitle+"','"+spublisher+"','"+sauthor+"','否')"; int result = statement.executeUpdate( query );//executeUpdate返回一个整型值 //执行成功为1, if ( result == 1 ) { clear ( ); String Jquery = "SELECT * FROM BookInfo";//查询指令 resultSet = statement.executeQuery ( Jquery );//执行查询指令 //将结果保存在ResultSet对象中 }//end_if }//end_if(s) else //如果ISBN无值 { JOptionPane.showMessageDialog ( null , "You must input a value in the ISBN", "Warning",JOptionPane.INFORMATION_MESSAGE ); displayResult ( resultSet ); clear ( ); } displayResult ( resultSet ); statement.close();//关闭连接 }//end_try catch ( SQLException sqlex ) { JOptionPane.showMessageDialog ( null , "Can't connect \n Check you PK ", "Warning", JOptionPane.ERROR_MESSAGE ); sqlex.printStackTrace(); } } //end_insert else if ( e.getActionCommand ( ) == "删除书籍" )//删除操作 { try { statement = connect.createStatement(); //初步处理,只能输入主键值 if ( !tableArea.ISBN.getText().equals( "" ) ) { String query = "DELETE FROM BookInfo WHERE ISBN = '" +tableArea.ISBN.getText() +"' "; int result = statement.executeUpdate( query ); if ( result == 1 ) { clear ( ); String Jquery = "SELECT * FROM BookInfo";//查询指令 resultSet = statement.executeQuery ( Jquery );//执行查询指令 //将结果保存在ResultSet对象中 }//end _if ( result ) else { JOptionPane.showMessageDialog ( null , "The values has been deleted \n or you input a wrong value \n Check it and reinput", "Warning", JOptionPane.INFORMATION_MESSAGE ); clear ( ); } displayResult ( resultSet ); }//end first if else { JOptionPane.showMessageDialog ( null , "You must input a value in the ISBN \n or you input a wrong value \n Check it and reinput", "Warning", JOptionPane.INFORMATION_MESSAGE ); } statement.close ( ); }//end_try catch ( SQLException sqlex ) { sqlex.printStackTrace(); } }//end_delete else if ( e.getActionCommand ( ) == "借阅" )//借阅操作 { try { statement = connect.createStatement(); //返回表格中的值,并存放在临时变量中 String sreaderID = tableArea.readerID.getText(); String sname = tableArea.name.getText(); String sclass = tableArea.workPlace.getText(); String sisbn = tableArea.ISBN.getText(); String sbordate = tableArea.borrowDate.getText(); String sretdate = tableArea.returnDate.getText(); if ( ! tableArea.readerID.getText().equals( "" )&& ! tableArea.ISBN.getText().equals( "" )&& ! tableArea.name.getText().equals( "" )&& ! tableArea.workPlace.getText().equals( "" ) ) { String query= "INSERT INTO Reader VALUES ( '"+sreaderID+"','"+sname+"','"+sclass+"')"; int result = statement.executeUpdate( query );//executeUpdate返回一个整型值 //执行成功为1, if ( result == 1 ) { clear ( ); String Uquery = "UPDATE BookInfo SET IsLend='是' WHERE ISBN='"+sisbn+"'"; statement.executeUpdate( Uquery ); String Iquery= "INSERT INTO BorrowInfo (ReadID,ISBN,LendDate,ReturnDate ) VALUES ( '"+sreaderID+"','"+sisbn+"','"+sbordate+"','"+sretdate+"')"; statement.executeUpdate( Iquery ); String Jquery = "SELECT * FROM BookInfo";//查询指令 resultSet = statement.executeQuery ( Jquery );//执行查询指令 //将结果保存在ResultSet对象中 }//end_if }//end_if(s) else //如果readerID无值 { JOptionPane.showMessageDialog ( null , "You must input a value in the 'readerID'", "Warning",JOptionPane.INFORMATION_MESSAGE ); displayResult ( resultSet ); clear ( ); } displayResult ( resultSet ); statement.close();//关闭连接 }//end_try catch ( SQLException sqlex ) { JOptionPane.showMessageDialog ( null , "Can't connect \n Check you PK ", "Warning", JOptionPane.ERROR_MESSAGE ); sqlex.printStackTrace(); } } //end_borrow ////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////// else if ( e.getActionCommand ( ) == "归还" )//归还操作 { try { statement = connect.createStatement ( ); if ( ! tableArea.readerID.getText().equals( "" )&& ! tableArea.ISBN.getText().equals( "" ) ) { String Dquery = "DELETE FROM BorrowInfo WHERE ISBN = '" +tableArea.ISBN.getText() +"' "; int result = statement.executeUpdate( Dquery ); String query = "DELETE FROM Reader WHERE ReadID = '"+tableArea.readerID.getText()+"'"; result = statement.executeUpdate( query ); String Uquery = "UPDATE BookInfo SET IsLend='否' WHERE ISBN='" +tableArea.ISBN.getText() +"' "; result = statement.executeUpdate( Uquery ); if ( result == 1 ) { clear ( ); String Fquery = "SELECT * FROM BookInfo"; resultSet = statement.executeQuery ( Fquery ); displayResult ( resultSet );//显示结果 statement.close ( ); }//end_if }//end_if(s) else //如果readerID无值 { JOptionPane.showMessageDialog ( null , "You must input a value in the 'readerID'", "Warning",JOptionPane.INFORMATION_MESSAGE ); displayResult ( resultSet ); clear ( ); } //displayResult ( resultSet ); statement.close();//关闭连接 }//end_try catch ( SQLException sqlex ) { JOptionPane.showMessageDialog ( null , "Can't connect \n Check you PK ", "Warning", JOptionPane.ERROR_MESSAGE ); sqlex.printStackTrace(); } } //end_borrow //////////////////////////////////////////////////////////////////////////////////////////// else if ( e.getActionCommand ( ) == "高级" )//高级用户操作 //允许用户自己键入查询指令 { try { statement = connect.createStatement ( ); String Query = JOptionPane.showInputDialog ( "Please input the SQL" ); //返回用户键入的查询指令 ResultSet result = statement.executeQuery ( Query ); displayResult ( result ); statement.close ( ); } catch ( SQLException sqlex ) { JOptionPane.showMessageDialog ( null , "Unvailable syntax", "Warning", JOptionPane.ERROR_MESSAGE ); sqlex.printStackTrace(); } }//end_advanced /*-------------------Option-------------------------------*/ else if ( e.getActionCommand ( ) == "音乐" ) { if ( asDouble == null ) { JOptionPane.showMessageDialog ( null , "Can't create", "Warning", JOptionPane.ERROR_MESSAGE ); return; } else { AudioPlayer.player.start ( asDouble ); } }//end_music else if ( e.getActionCommand ( ) == "暂停" ) { AudioPlayer.player.stop ( asDouble ); }//end_stop /*-------------------------------Help----------------------------*/ else if ( e.getActionCommand ( ) == "关于" )//关于对话框 { JOptionPane.showMessageDialog ( null , "LibraryManager 2.1 改良版 \n 信控学院 计算机五班 齐辉 24 \n E-mail: lionqi742@sohu.com", "JDBC-ODBC", JOptionPane.INFORMATION_MESSAGE ); }//end_about else if ( e.getActionCommand ( ) == "使用说明" )// 使用说明对话框 { String s = "欢迎使用本软件\n 查找:若不在文本中输入内容,则默认查找全部\n"+ "若在查找文本框中输入$,查找该属性项\n"+ "否则查找限定的内容。\n 输入管理员权限密码可执行高级功能\n"+ "允许用户自己输入查询语句查找自己需要的信息\n"+ " 插入和删除功能中必须键入ISBN,然后按照文本框中\n"+ "指定的内容修改"; JTextArea useDis = new JTextArea ( s, 10, 20 ); JScrollPane use = new JScrollPane ( useDis ); JOptionPane.showMessageDialog ( null ,useDis, "使用说明", JOptionPane.INFORMATION_MESSAGE ); }//end_使用说明 else if ( e.getActionCommand ( ) == "刷新" )//刷新,将删除、插入后的操作的结果显示在屏幕上 { String query = "SELECT * FROM BookInfo"; try { statement = connect.createStatement ( ); resultSet = statement.executeQuery ( query ); displayResult ( resultSet );//显示结果 statement.close ( ); } catch ( SQLException sqlex ) { sqlex.printStackTrace ( ); } }//end_refresh } //end_actionPerformed /*----------------------------------------------------------------------*/ private void clear() { tableArea.ISBN.setText( "" ); tableArea.title.setText( "" ); tableArea.publisher.setText( "" ); tableArea.author.setText( "" ); tableArea.readerID.setText( "" ); tableArea.name.setText( "" ); tableArea.workPlace.setText( "" ); tableArea.borrowDate.setText( "" ); tableArea.returnDate.setText( "" ); } /*---------------------------------Display Result----------------------*/ private void displayResult ( ResultSet rs ) throws SQLException { boolean moreRecords = rs.next(); //定位于第一条记录 if ( ! moreRecords ) //若无记录,显示对话框 { JOptionPane.showMessageDialog( this, "ResultSet contained no records" ); setTitle( "No records to display" ); return; } Vector columnHeads = new Vector();//定义矢量数组存放属性 Vector rows = new Vector();//定义矢量数组存放内容 try { //该方法可获取ResultSet中关于列的名字和类型的信息 ResultSetMetaData rsmd = rs.getMetaData(); //循环查找记录 for ( int i = 1; i <= rsmd.getColumnCount(); ++i ) columnHeads.addElement( rsmd.getColumnName( i ) ); do //获得行数据 { rows.addElement( getNextRow( rs, rsmd ) ); } while ( rs.next() ); output = new JTable ( rows, columnHeads );//将显示数据的output实例化 textpane = new JScrollPane( output ); c.remove( 1 ); c.add( textpane , BorderLayout.CENTER ); c.validate(); }//end_try catch ( SQLException sqlex ) { sqlex.printStackTrace(); } }//end_displayResult /*-----------------------------getNextRow---------------------------------*/ private Vector getNextRow( ResultSet rs, ResultSetMetaData rsmd ) throws SQLException { Vector currentRow = new Vector(); for ( int i = 1; i <= rsmd.getColumnCount(); ++i ) switch( rsmd.getColumnType( i ) ) //判断数据类型 { case Types.VARCHAR: case Types.LONGVARCHAR: currentRow.addElement( rs.getString( i ) ); break; case Types.INTEGER: currentRow.addElement( new Long( rs.getLong( i ) ) ); break; default: System.out.println( "Type was: " + rsmd.getColumnTypeName( i ) ); }//end_Switch return currentRow;//返回当前行 }//end_getNextRow public static void main( String args[] ) { LibManager app = new LibManager(); app.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) { System.exit( 0 ); } } ); } } <淘宝热门商品:
 

 

靓之彩数码影像:柯达数码冲印 刷照片冲印 水晶版画相册 冲洗彩扩

 

120.00元  

┏◤妙妙减肥大王╭消费保障◥┗◣℡谁比我性感╰ 皇冠100%◢


来源:程序员网

小小豆叮