windows环境CVS client使用入门

v0.1 created by 曹晓钢,2002/01/03 last updated by $Author$,$Date$ 本文纯粹为“入门”性质,具体深入的命令解释请参见CVS手册。 本文首先介绍关于CVS的基础知识,然后对于流行的几种工具单独给出流程实例。 详细请进入 http://www.redsaga.com/CVS_newbie_win32/ <淘宝热门商品:
 

26.00 元  

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

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

小小豆叮

什么是J2ME及其基本慨念

如果您曾经http://www.javasoft.com ;网站上查询有关Java 2 Micro Edition 的资料,十之八九会被一大堆的技术名词搞的一头雾水。什么 KVM ,什么CLDC 、CDC 、MIDP ,后面面还冒出了Personal Java 、Embedded Java以及JES 等名词。虽然名为Java 的微小版本,可是它的世界可真是不小,让我们满肚子“见山不是山,见水不是水”的疑惑。的确,在我刚开始接触 Java 2 Micro Edition 的时候,就感觉到这个玩意儿实在越看越让人摸不著头绪。因此在本章中,我舍弃了技术上的细节,希望带大家从宏观的角度来看待 Java 2 Micro Edition 的世界。希望读过本文之后,可以使大家体验“见山是山,见水是水”,一切豁然开朗的感觉。首先,我们必须先对Java 2 Micro Edition 在整个Java 技术之中的定位做个了解。      各种不同版本之Java 程序的开发     如前面所说,各种不同的Java 版本,在其支援的核心类别函式库之完整性以及所支援的 Java 基本型别这两件事情上都有所差异,也就是说,不管您开发的是企业所使用的Java 程序、嵌入式装置上执行的Java 程序、浏览器上执行的Applet ,或是在PC 上执行的应用程序。您都必须在您的电脑上先安装 J2SE ,然後再安装各种版本的核心类别函式库以及额外的扩充类别函式库,如此才能成功地开发各种不同目的的Java 程序。J2SE所提供的Java 编译器(javac.exe)可以帮助我们编译各种不同平台上的Java 程序,而J2SE 所提供的Java 虚拟机器(java.exe)则可以帮助我们在PC 上先行测试这些程序执行结果的正确与否。另外,Java 编译器并不会帮您检查您的程序是否符合各种平台上所支援的核心类别函式库与 Java 基本型别。举例来说,虽然我们在前面说过,Smart Card 版本并不支援boolean 、byte 以外的Java 基本型别,而且该平台也只支援java.lang.* 核心类别,可是当我们在撰写 Smart Card 平台上的程序时,就算在程序码里用了boolean 或byte 以外的Java 基本型别,或者使用了java.lang.*之外的其他核心类别,编译器仍然可以照常帮您编译出类别档。这个时候大家一定开始产生疑惑 --那么这些程序如果放到Smart Card 上头执行的时候,出了问题怎么办 ? 难道不会造成Smart Card 上的虚拟机器执行时发生错误吗 ? 针对这个可能发生的潜在问题,Sun Microsystems 在各种不同版本的开发套件中,有些会内附检查器 (checker)或者预先审核器 preverifier),这两个工具可以帮助您在将程序放到目标平台之前先做好检查和预先审核的工作。检查器会帮您找出类别档之中不合目标平台规格的部分,并提醒你这些地方可能无法在目标平台上执行。因此只要有检查器的协助,您大致上可以确定您的程序可以符合目标平台的规定并顺利执行。 Java Card 的开发套件中就附有检查器。     而某些平台的开发套件则附有预先审核器,预先审核器除了做检查器做的工作之外,还有一项额外的工作,就是减轻目标平台上虚拟机器的负担,要解释预先审核器这个额外的工作,在传统的 Java 程序之中,为了安全上的考量,任何进入执行环境的类别档 (不管该类别档是来自本机或是远端机器 ),都必须先经过Byte Code 审核器(Byte code verifier)的验证,以防止程序在传送途中遭到恶意的修改,而使得 Java 程序在执行时对系统有不良影响。经过审核之後,该类别档才能开始被J 虚拟机器所执行。如果这个审核的动作在一般的 PC 上执行,速度倒是还能够接受,可是一旦放到如 Palm 或是手机这些CPU 较慢、记忆体也比较少的机器上面就显得十分吃力了。为了节省宝贵的 CPU 运算时间(既能省电又能够加速程序执行 ),因此,在程序设计师产生能够让某些特定平台执行的类别档之前,程序设计师必须先在 PC 上使用预先审核器做一些前置的审核工作,预先审核器会在类别档之中加入一些特殊标记或符号。如此一来,当这些程序放到目标平台上执行时,就可以大幅减少在目标平台上做审核时的时间,藉而加速程序的的启动及执行速度。因此在J2ME 之下的程序(Spotlet 、MIDlet),其执行步骤变成因为预先审核的关系,执行时Byte Code,审核器的工作就变少了,也因此从程序载入到开始执行之间的时间因而缩短。 CLDC标准实作和MIDP 参考实作之中就附有预先审核器。     Java 版本的演进     相信熟悉Java 演进历史的人或多或少都听说过,Java 技术一开始并非就叫做 Java ,而是叫做OAK ,而且最早的时候就是为了嵌入式系统而设计的一项产品。後来因为网际网路的发达,而OAK 的诸多特性刚好又适合用在网路上(例如可移植性、编译後程序码很小),因为商标已被注册的关系,因此 OAK 被改名成Java ,从此因缘际会地成了网路上的闪亮巨星,并随著时间越来越成熟,也慢慢地产生了许多非原本预期中的相关运用。   虽然 Java 已经被用到许多企业级软体上,可是其实骨子里面还是非常适合用在嵌入式系统之中。      虽然从Java 1.0 发表之後,Java 就被广泛地使用在桌上型应用程序以及Applet 的开发上,但是,从Java 1.1 开始,Java又回到了它一开始的老路--也就是嵌入式系统方面的应用,在当时Sun Microsystems 发表了Embedded Java 与Personal Java(也有人简称为PJava)这两项规格。其中Embedded Java 是为了资源十分有限,而且没有显示设备的嵌入式装置而设计; Personal Java 则是为了在能够与网际网路连线、并拥有显示系统(例如彩色LCD)的消费性电子装置而设计。接著Java 的版本演进到Java 2 ,这时为了再明显区分各种Java 的应用,所以分割出了J2EE、J2SE、以及 J2ME 三种版本。这三种版本的各种特性我们已经在前面已经详细地描述,在此不再赘述。不过请大家记住,由於 Java 2将Java 的应用区分成三大块,使得 Java 程序语言的发展不会再像Java 1.1时如树枝状般扩散出去,这么一来有助于大家对 Java 各种应用的了解,而不会造成今后越发展下去越不可收拾的混乱局面。额外向大家一提的是,后来Personal Java 发展到1.2 版的时候,也采用了一些Java 2 平台上与安全性有关的设计。  Java 2 Micro Edition 概念     J2ME 在设计其规格的时候,遵循著「对於各种不同的装置而造出一个单一的开发系统是没有意义的事」这个基本原则。於是 J2ME 先将所有的嵌入式装置大体上区分为两种 :一种是运算功能有限、电力供应也有限的嵌入式装置(比方说PDA 、手机);另外一种则是运算能力相对较佳、并请在电力供应上相对比较充足的嵌入式装置 (比方说冷气机、电冰箱、电视机上盒 (set-top box))。因为这两种型态的嵌入式装置,所以Java 引入了一个叫做Configuration 的概念,然後把上述运算功能有限、电力有限的嵌入式装置定义在Connected Limited Device Configuration(CLDC)规格之中;而另外一种装置则规范为 Connected Device Configuration(CDC)规格。也就是说, J2ME 先把所有的嵌入式装置利用Configuration 的概念区隔成两种抽象的型态。      其实在这里大家可以把Configuration 当作是J2ME 对於两种类型嵌入式装置的规格,而这些规格之中定义了这些装置至少要符合的运算能力、供电能力、记忆体大小等规范,同时也定了一组在这些装置上执行的 Java 程序所能使用的类别函式库、这些规范之中所定义的类别函式库为 Java 标准核心类别函式库的子集合以及与该型态装置特性相符的扩充类别函式库。比方就CLDC 的规范来说,可以支援的核心类别函式库为java.lang.* 、java.io.*、java.util.*,而支援的扩充类别函式库为java.microedition.io.*。区分出两种主要的Configuration 之後,J2ME 接著在定义出Profile的概念。Profile 是架构在Configuration 之上的规格。之所以有Profile的概念,是为了要更明确地区分出各种嵌入式装置上Java 程序该如何开发以及它们应该具有哪些功能。因此Profile 之中定义了与特定嵌入式装置非常相关的扩充类别函式库,而 Java 程序在各种嵌入式装置上的使用者介面该如何呈现就是定义在Profile 里头。Profile 之中所定义的扩充类别函式库是根据底层Configuration 内所定义的核心类别函式库所建立。      Java 在嵌入式系统上的应用     由于Java 本身最初的设计理念即是针对嵌入式系统,因此将他用在嵌入式系统上真可谓如鱼得水。在这个Linux 开始兴起的时空交会点,网路上出现了一篇关于嵌入式 Linux 与Java 互相配合以造就双赢局面的相关报导,这是由 LinuxDevices.com 的专栏作家 Randy Rorden 所发表的一篇白皮书,名为「 Java 与嵌入式 Linux 合作」。 在这篇文章里头,作者对嵌入式Linux与Java 个别的优点提出他的看法,同时也提出了Java-Linux 平台的构想。有兴趣的读者可以到到下列几个网站参考相关新闻与资料。      1. Java 与嵌入式 Linux 合作白皮书     http://www.ctech.com.tw/d-news/news/linux/89090208.asp ;   2. Java 及嵌入式Linux 合作     http://www.linuxdevices.com/news/NS5973673868.html ;   3. 即将来临的Java-Linux 结合     http://www.linuxdevices.com/articles/AT7102892618.html ;     为何要用Java 撰写PDA 上的应用程序?     由於预期到今後行动通讯时代的来临,所以通讯相关行业变的前景可期,而除了达成行动通讯的主要工具 -- 手机月来越精巧之外,有更多的厂商相继投入PDA 的生产与开发。本来PDA 主要的平台有PalmOS 、Windows CE 以及EPOC ,也不知道曾几何时,开始一大堆公司投入embedded linux 的研发,其中包括国内资策会自己开发的 @ViS 作业系统,互慧科技也有自己的嵌入式作业系统,当然更不用说大陆厂商与韩国厂商了。   这些作业平台的数量比起 PC 来说真不知道要复杂上几倍。对一般使用者来说当然影响比较小,可是对於程序开发者来说,看到这么多不同的程序发展平台,真是让人望之却步。如果每个平台都有自己的程序写法以及函式库,那么光是看上面这些平台至少就要学习五种以上程序的写法。当然,只专精一种平台当然是很好的事情。可是程序设计师不禁要说 :”如果我们写出来的软体可以在不经过修改原始码的情况下就能够在这些平台上执行,那不是更完美吗?” 对程序开发者来说,这样的投资报酬率当然是最大的。      要在那么多平台上开发程序,对程序设计师来说的确是一个很大的挑战,如果要把所有的时间和精力放在软体的可用性上,那么相对地很多时候我们根本没有那么多时间撰写各种平台的程序。要解决这个问题,一般来说程序设计师会选用一个可以跨平台的Framework 来达成至少source code level 的跨平台(例入Qt 就能做到)。不过在本篇文章中我们要介绍的则是更终极的解决方案 ?Java ,利用Java 的”write once, run anywhere”特性,我们可以真正达到程序只要写一次,拿到任何平台上都可以执行(当然前提是必须要PDA 的厂商也要实作出该平台的Java Virtual Machine 才行)。利用Java 来做PDA 上的程序当然有其缺点,最广为人知的可能就是执行效率的问题, Java 在执行速度这个议题上一直让人诟病。   不过笔者认为,随著技术的发达,将会有更快更省电的PDA 专用CPU 出现,因此效率上的问题其实是可以忽略的。更何况,当 Sun 在设计J2ME 的时候,也用了很多方式企图加快Java 在PDA 上的执行速度(例如预先审核)。 <淘宝热门商品:
 

 

时尚前线-袜子、打底裤、时尚女包 时尚从这里开始

小小豆叮

Sun公布服务器和台式机等6大类Java软件

美国当地时间9月16日,Sun Microsystems公布了6大类Java软件产品。包括服务器、台式个人电脑、开发平台、数据中心平台、移动终端和“Java Card”相关技术和服务。   据称,将分别以不同的价位提供可轻松导入的开放式集成系统。同时将附带安装、培训和支持服务。   6大类产品及其主要内容如下: ·服务器系统“Sun Java Enterprise System(Sun Java企业系统)”:   包括用户管理、认证、单点登录、用于执行安全对策的“Network Identity Services(网络标识服务)”和动态管理WWW内容的“Web and Application Services(Web及应用服务)”等网络服务。除“Java System Directory Server 5.2”、“Java System Identity Server 6.1”、“Java System Web Server 6.1”、“Java System Active Server Pages version 4”和“Java System Application Server 7,Enterprise Edition”以外,还将使用门户服务器和消息服务器等软件。价格每位职员每年100美元,将于年内发布。 ·台式个人电脑系统“Sun Java Desktop System(Sun Java桌面系统)”(原名:Project Mad Hatter):   除办公套件“StarOffice 7”、网络浏览器“Mozilla”、电子邮件协作套件等客户端软件外,还包括美国RealNetworks的“RealONE”和美国Macromedia的“Flash”。支持OS为Solaris和Linux。每台个人电脑为100美元。对于Sun Java Enterprise System的客户企业则为每人50元。 ·开发平台系统“Sun Java Studio Enterprise”:   支持Sun Java Enterprise System的开发工具集。由集成开发环境(IDE)、Connector Builder、插件和Sun Java Enterprise System的运行时间组成。 ·数据中心平台系统“N1”:   集成了服务器、存储设备、刀片服务器和应用程序等网络资源,能够自动分配服务和软件。使用“N1 CenterRun 4.0”。 ·移动终端系统“Sun Java Mobility System(Sun Java移动系统)”:   将提供用来向Java手机和PDA等终端发送服务的集成平台。 ·Java Card系统“Sun Java Card System”:   将提供用来发送电子商务个人认证服务的平台。 <淘宝热门商品:
 

25.00 元 

重庆女人香专业减肥丰胸网~一品婷/美姿姿/脱脂减肥*批发代理

小小豆叮

java sound

声音可以创造意境,触发遐想,当与虚拟图像相结合时,更加可以让整个世界充满幻觉。声音是多媒体技术的基础。这就是Sun公司的JAVA媒体技术开发小组忙于准备Java Sound 1.0 API并将其包含于下一版本的JAVA开发工具库中的原因。   在JAVA2平台出现之前,JAVA语言只能处理电话音质的声音,以单声道8KHZ的采样频率存储为μ-law AU文件。JAVA2平台增加了对AIFF,WAV以及三种MIDI文件类型的支持。所支持的三种MIDI文件格式为MIDI文件类型0、MIDI文件类型1、以及RMF。   应用程序接口API1.0版提供了一个易于使用的工具集,使程序员可以访问底层的合成与演奏引擎,从而扩展了JAVA声音的应用。其中两个重要的领域是创建数字化音频以及乐器指令数字化接口MIDI。由于提供了大量的底层支持功能,所以程序员能输入输出声音,控制MIDI设备,并能查询系统运作情况。   声音文件类型简介   主要的声音文件类型如下:   AU - (扩展名为AU或SND)适用于短的声音文件,为Solaris和下一代机器的通用文件格式,也是JAVA平台的标准的音频格式。AU类型文件使用的三种典型音频格式为: 8位μ-law类型(通常采样频率为8kHz), 8位线性类型,以及16位线性类型。   WAV - (扩展名为WAV)由 Microsoft和 IBM共同开发,对WAV的支持已经被加进Windows 95并且被延伸到Windows 98. WAV文件能存储各种格式包括μ-law,a-law和 PCM (线性)数据。他们几乎能被所有支持声音的Windows应用程序播放。   AIFF - (扩展名为AIF或IEF)音频互换文件格式是为Macintosh计算机和Silicon Graphics (SGI)计算机所共用的标准音频文件格式。AIFF和 AIFF-C几乎是相同的,除了后者支持例如μ-law和 IMA ADPCM类型的压缩。   MIDI - (扩展名为MID)乐器数字接口MIDI是为音乐制造业所认可的标准,主要用于控制诸如合成器和声卡之类的设备。   MIDI文件不包含数字音频采样,而是包括一系列指令,这些指令控制把来自不同乐器上的音符序列合成乐曲。一些MIDI文件包含附加指令来为各种合成设置进行编程。   大多数合成器支持MIDI标准,所以在一个合成器上制作的音乐能够在另一个上播放。 有 MIDI接口的计算机能操纵 MIDI数据以产生新音乐或音响效果。例如,一个完整的音乐作品可以通过一个软件驱动的命令转换成全新的形式。   JAVA声音引擎支持两种MIDI文件类型:   MIDI类型0文件-包含仅仅一个序列,所有相关的乐器部分被包含在同一个逻辑 "磁道"上。   MIDI类型1文件-包含多重的 "磁道"使得不同的乐器被逻辑地分开,从而使对声音的操作和重组更加容易。   RMF - (扩展名为RMF)混合音乐格式是由Beatnik设计出来的混合文件类型,通过交互式设定将MIDI和音频采样封装在一起。RMF好比是一个所有音乐相关文件的容器。RMF也包含对有关版权的详细文件说明的支持。RMF文件可以包含多个由不同艺术家创作的存储为MIDI类型或音频采样类型的作品,每个都关联着相关的版权信息。 <淘宝热门商品:
 

288.00 元 

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

小小豆叮

J2ME移动开发平台搭建篇

要进行J2ME的开发,首先必须要建立开发的平台,而在开发的平台选择上,有三种方案,在此推荐给大家。 一、功能比较全的Borland Jbuilder平台 搭建这个平台,我们必需要安装:JBUILDER 7 或 JBUILDER 8 ,BORLAND 的 MOBILESET 3.1。 可选材料有:(注意这些不是必须的,没有这些你也可以进行开发)你所想开发的手机SDK,例如要在NOKIA上开发必须准备 NOKIA DEVELOPER‘S SUITE,还可以根据自己需要加一些模拟器如7210等。 有了以上的材料就足够我们搭建一个很不错的开发平台了。 搭建步骤: (1):安装JBUILDER,并注册。(注意:D版JBUILDER 8用户,市面上有些D版JBUILDER 8破解有问题,会导致接下来安装的MOBILESET无法被激活的情况,也就是无论你怎么配置,在MIDP页面里的选项永远是灰的,请勿使用它 盘中的破解文件,用注册机注册) (2):正确安装JBUILDER ,并、成功注册后,安装 MOBILESET 3.1,安装完成后,需要注册,MOBILESET是免费的,你可以向BORLAND索要注册码,也可以用 附录3 中的注册码注册。 (3):完成以上2步必须步骤后,就可以安装你选装的DEVELOPER'S SUITE和模拟器了(NOKIA SDK安装方法见附录1)。 (4):正确完成了以上步骤,可以说这个平台已经搭建完成,就这么简单,下面你要做的就是在JBUILDER中NEW 一个PROJECT,在出现 的窗体中JDK选J2ME的,其他都使用默认的就可以了,完成配置后,再选NEW,这时候在最后的MIDP页面里两个选项应该是可选的,接下 来你就可以开发了。 2:Sun 公司官方工具,使用满方便的平台 j2me_wireless_toolkit; 搭建这个平台,我们必需要安装有:jdk1.4,j2me_wireless_toolkit1。04或j2me_wireless_toolkit2。0 beta1 可选材料有:(注意这些不是必须的,没有这些你也可以进行开发)你所想开发的手机SDK,例如要在NOKIA上开发必须准备NOKIA DEVELOPER‘S SUITE,还可以根据自己需要加一些模拟器如7210等(NOKIA SDK安装方法见附录1)。 有了以上的材料就足够我们搭建现在的平台。 (1):首先安装jdk1.4,(在方法一中因为JBUILDER自带JDK所以不需要单独安装。) (2):正确安装JDK后,才可以安装j2me_wireless_toolkit,不管1。04还是2。0 BETA1都可以,2个都装也可以。 (3):完成以上2步必须步骤后,就可以安装你选装的DEVELOPER‘S SUITE和模拟器了(NOKIA SDK安装方法见附录1)。 (4)正确完成了以上步骤,可以说这个平台已经搭建完毕了,有些菜鸟可能会问这个j2me_wireless_toolkit是干什么的,其实它的作用就和JB UILDER差不多,用来编译你写的JAVA程序,但它本身不提供编辑等功能,所以你得用记事本或其他文本编辑软件写程序,使用方法见附录4 3:个头最小,但用起来比较复杂的平台cldc+MIDP 搭建这个平台,我们必需要安装:jdk1.4,J2ME_CLDC_ 1.04,MIDP 2.0 对这个平台的使用方法我自己到现在还不是特别清楚,只粗略的介绍一下 (1)同样首先要安装jdk1.4 (2)将J2ME_CLDC_ 1.04,MIDP 2.0和解压到同一目录下如c:\j2me下,其实这两个就是在命令行下的编译器和JBUILDER,toolkit的作用 一样,但用起来更麻烦。 (3)详细使用方法见附录5 介绍完毕,希望能对刚起步的菜鸟有帮助,有什么错误的地方还请大家指正,文章中引用了其他作者的文字,向他们表示感谢。 附录1:NOKIA SDK安装 在装完JBUILDER(其实就是看有没有装JDK,JBUILDER自带JDK)或JDK后,NOKIA的DEVELOPER‘S SUITE才能被安装,谧巴闐EVELOPER‘S SUITE后装模拟器,一定要装在NOKIA的DEVELOPER‘S SUITE的 DEVICE目录下,下面是 NOKIA的DEVELOPER‘S SUITE和一些模拟器的注册码 nds_jme_v1.1(Nokia Developer Suite”) 用户名:allyfeng 序列号:pJzPqsT0PjnMEwaTR2Ga+WiCeSk= ns40 用户名:allyfeng 序列号:HgaDbt1HpXFucqDp97ThNjvN468= 7210 用户名:allyfeng 序列号:89YPeBKM6tzssXLLi5OxuDdhcyk= Nokia 6650模拟器 注册信息: 用户名:allyfeng 序列号:PLkvtJRKbzplqIXRqyb0czF969w= 附录2:注册机使用方法 这里我推荐使用JBLicenseGenW.exe 使用简单,装好JBUILDER后使用,可以注册J7,J8。先生成注册码,在SAVE一下就行。 对于那些先用试用版注册码,后来再替换的方法我没试过。 如果运行JBLicenseGenW.exe没反映或出错,可能是你的JBUILDER没装好。我也不知道怎么解决。 附录3: JBuilder MobileSet 3.0.1。需要先安装JBuilder7或JBuilder8。 注册方法:新建一个文本文件,将下面的注册码复制到文件中,保存。注册时选择Active File,然后 载入该文件便可。 注册码: -----BEGIN BLOCK----- %C5%17%DE%9B%00%00%02I%DE%DAL% 2C%B2%F7%9DE%80C5%A6%E5%AF%7C% A7%06%05%D1%B1%B5%0A%955L%87%E 5%E6%5B%8C%0D%01%A9%EE%EB-%A9% 21%7C%E7%8A%E2%1D%B6LZ%E2%F1%F B0%E3%7B%1F%F6%E3%9A%3E%E4%1D% 2B%FD%FB%CD%5C%D6%2BO%FB%F6%89 %7F%D8j%3E%96%8C%98L%C0%03%15% 86%D3%FEt%81%1Bf%8F%DD%B6%02%D 76z%FE%E4%8B%5B%D8%02%1D%BD%F1 %B0P%A9%27%13%F6%8F%AE%0D%8A%7 FR%99%ED%93%22%82v%2B%E7%9B%AF T%C3Q%1F%8E%CC%BFp%A52%26%DC%9 F%8EC%D3%1CU%D1%AA%ADb%DA%1B%2 B%A0%8A%D2i%B3%0C%20%C2%DC%81r %E3G%0A%90%E4%B2e%9D%11%3A%F1% 90%D2_%A0%7BO%C0%A4%A3%17%98%1 E%21%EE%9D%B3%24%9AK%1A%A5%BE% BE%3E%EAg-%F1%B6%9BL%BA-%2F%F8 %D5%E2%23%C0j%27%E8%B2%ADS%F6t %03%C0%D6%E7%3E%E96%28%95%C3%E 7Z%F4%3EH%B3%B3%D2Y%A9F%16%92% 93%88%1A%A4mW%85%A1%92i%B0%5BQ %A7%EF%87I%D2%7F%3D%8A%A0%A3Y% BEQc%EA%8A%8E%08%95%02%7E%9A%F F%DBe%80%40%04%8A%DB%BBd%A7g%3 D%C7%A6%E0%7C%90%29*%EC%E0%ABx %D4%29N%D0%DA%A6P%D6%11%1E%ED% 90%9D%1B%E7S%10%FD%B6%BF%14%A9 %07P%B9%B0%C1O%9Ds%14%8C%87%99 e%F7%18%1E%9C%EB%FDc%B4%13a%D9 %9D%8D%2C%97%1A8%C1%AF%D3x%87% 7FG%E6%94%98%26%90j%10%C8%EC%8 64%C2SN%E5%9E%D8T%EFez%BB%8A%D 1%20%CD5%0B%FC%E3%CC%19%89jv%C 4%D9%E1r%A2z0%BE%DD%A4j%91h%0D %E3%F1%9C%2B%ED%06%60%E1%F2%FA X%CA%18F%DE%FB%ABw%93q%29%D5%E E%BFF%A4%3E%02%B0%C6%ADH%98p%0 D%CE%FE%FC%7F%AE%07%04%8E%C7%F 9d%AD%29%7C%DF%AF%B5V%98%20%1C %A5%89%ED%7F%B5RU%EC%AB%FCQ%AF Z%5C%F4%9B%A7%5D%8C_%17%D8%CF% B1%5B%D6G%28%B2%EE%F8%02%A0%0F o%C3%B4%ECG%9E%3D%26%C2%CC%F4e %FF_%3C%A5%91%BB%1C%D3%26V%DA% F7%95u%BD%3Cf%D9%EE%E7%27%C8%1 5%3D%E7%A3%9E_%AAR%7C%92%F8%CD %13%9D%1E4%9F%84%EFT%8F%5CO%DB %B0%D4l%8ChN%83%E4%CE%3F%F32v% 95%AA%A2f%97p%2F%E5%E5%D8d%91h C -----END BLOCK----- 附录4:toolkit用法 启动工具包,真是说起来容易做起来难,说不定你初此动手的时候就偏偏不知道该如何启动了,OK,那 就找到KToolbar程序启动它。 按下Create Project按钮创建新项目。系统提示你输入项目的名字和主MIDlet类的名字,随便你写什么 都可以,该类应该在启动应用程序时运行 。工具包会用你输入的项目名为你创建项目目录。 检查显示的项目属性是否正确,待会儿我们还要回头再检查一下这些设置。 用记事本编写Java程序源代码(或者拷贝现有的代码)并把程序代码保存到前面KToolbar建立的以你工 程名命名的目录的src子目录里。 按下Build按钮编译,之后按下Run按钮在测试模拟器中测试程序。 附录5: 首先下载以下软件: JDK 1.2或者更高版本 http://java.sun.com/j2se/ 有限连接设备配置(clcdhttp://www.sun.com/software/communitysource/j2me/download.html MIDhttp://java.sun.com/products/midp/ 注意:你需要JDK中的JAVAC命令来编译MIDlets。 下载、解压缩以上软件,放到以下被推荐的目录中: C:\JDK1.2 C:\j2me │ MIDP │ CLCD 此文章假设目录为C:\j2me 为了测试MIDP应用程序,你需要安装MIDP和CLCD。 配置运行环境 设置环境变量,修改PATH添加MIDP和JDK的工作路径。 设置环境变量 设置PATH中的变量,用文本编辑器打开autoexec.bat,或者在开始运行中敲入sysedit命令,并且插入 以下两行,我们假定你的*作系统和JDK 全部安装在C盘下。 SET PATH=%PATH%;%JAVAHOME%\BIN; PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;C:\JDK\BIN; C:\j2me\midp\bin;%PATH% 检查你的环境变量设置是否成功 在命令行下键入如下命令: c:\midp 回车。 此时应该弹出一个窗口,如(图1)。 设置屏幕颜色 C:\set SCREEN DEPTH=8 C:\midp -des criptor run.jad 效果见图2 好了,你现在可以准备测试第一个MIDP了。 HelloMIDlet的描述文件 关于HelloMIDlet例子的代码,http://wireless.java.sun.com/midp/articles/intro/ ;查阅。 MIDlet-Name: HelloMIDlet MIDlet-Version: 1.0.0 MIDlet-Vendor: Sun Microsystems, Inc. MIDlet-Des cription: A Simple Example MIDlet-Info-URLhttp://java.sun.com/j2me/ ; MIDlet-Jar-URL: hello.jar MIDlet-Jar-Size: 1063 MicroEdition-Profile: MIDP-1.0 MicroEdition-Configuration: CLDC-1.0 MIDlet-1: HelloMIDlet,, HelloMIDlet 编译,校验,打包和运行 编译 在命令行下键入如下命令(应在一行中实现): C:\javac -d .\ -bootclasspath c:\pathTo\MIDP\classes HelloMIDlet.java 校验 C:\preverify -classpath c:\j2me\MIDP\classes; C:\Examples\ FirstMIDlet 一个校验过的CLASS文件被写到目录C:\Examples\output\ 中。 进入到C:\Examples\output\目录中,键入如下命令: C:\Example\output>midp FirstMIDlet 打包 把HelloMIDlet.class文件打包成JAR文件。 C:\jar cf hello.jar HelloMIDlet.class 运行 C:\midp -des criptor hello.jad Email: dekker@263.net QQ:50839655 MSN : dekkerdillon@hotmail.com <淘宝热门商品:
 

132.00 元 

假一罚十 专柜正品 进口牛皮单肩包

小小豆叮

Java回归嵌入式无线通信

编者按:当语言技术走向前台,成为通信应用“解决方案”的一种时,Java与BREW之争也日益明显。今年初,中国移动联合移动设备商、SP等举办了Java大赛,并且正在或将要举办类似活动,以大力推广Java在手机、互联网等通信领域的应用。另一方面,从10月15日开始,中国联通和美国高通公司合资成立的联通博路公司在全国推广基于BREW的应用大赛,此举吸引了包括媒体在内的多方力量的关注。 针对这一形势,《计算机世界》组织了一个小型专题,就Java和BREW在通信领域应用的趋势探讨。当Java和BREW都有理由宣扬自己的阵营已经确立时,虽然我们还不知道这一场较量谁会更占优势,但关于技术的讨论,本身就是一个必要。在这两篇针锋相对的文章背后,不仅是两个作者的工作差异,更多是两大开发群体之间的对垒。 在经历了互联网和电子商务的淘金时代后,Java已经准备好向通信领域发展,而且巨大的商业利益已经显现出来。据Ovum研究公司预测,到明年初,Java技术将应用于2.67多亿部移动设备,而Java手机目前已然在北美和欧洲大行其道。更有分析公司预测,到2007年,几乎100%的手机都将采用Java技术,Java已经回归到嵌入式无线通信领域。 Java在嵌入式通信领域的应用与发展颇具传奇色彩。1991年出现的Oak(Java语言前身)技术,最初的设想是在冰箱、电视等信息家电产品中嵌入可编程通信控制平台,以实现这些设备间的数据通信。然而在当时,Oak并没有受到开发者所希望的欢迎,整个市场对这一新技术语言的重视远远不够。 1995年后全球爆发的互联网络信息革命为Java带来机会,Java成为众多编程语言和编程技术中的黑马,迅速成为全球各大IT厂商应用开发平台的新贵,不仅一跃成为桌面应用(J2SE)平台,更在很短的时间内成为企业级应用(J2EE)开发平台。 如今, Java已经回归到嵌入式无线通信领域,并且这次是有备而来。 从Sun到与Sun无关 在1999年的JavaOne大会上,Sun Microsystems 介绍了第一个袖珍版 Java和第一个 KVM以及相关的类库,并于同年6月向Java团体宣布了Java的第一个Java 2 Micro Edition(J2ME)版本,为开发者提供了一个无线开发工具包Wireless Toolkit(WTK),WTK可以让开发者编译(compile)、打包(package)、部署(deploy)和执行(execute)J2ME应用,这一工具包还包括一个仿真测试环境,该环境用于在资源受限的设备上对J2ME应用进行模拟运行,这些仿真模拟器可以被当做插件向通信设备厂商提供,同时由这些设备商向消费者提供,例如摩托罗拉、诺基亚等。 遗憾的是,WTK中并不包含IDE开发环境和Debug调试环境,笔者认为,之所以出现这样的结果,主要原因不是Sun或JCP缺乏设计优良IDE环境的能力,而是Sun发布J2ME平台规范后,全球各软件工具开发商“百家争鸣”推出各自的IDE开发环境,虽然这样防止了IDE技术的企业垄断,却也忽略了市场和用户的个性需求。况且,自Java问世以来也没有正式提供IDE开发环境的先例。这样做的不利在于多版本差异,但也有好处,没有正式的IDE开发环境,并不意味着开发者没有开发环境,相反,专业开发者有更大的选择余地来选择合适的IDE,甚至从Opensource中获得免费的Wireless IDE工具,当前一些主流Java开发工具已经都有相关插件支持无线开发环境,例如Sun ONE Studio、JBuild、Oracle9i JDeveloper等。 从Sun发布袖珍版的Java技术标准,到IDE多种类局面出现,Java正走着一条整个产业化前进的道路。 Java技术的典型代表J2ME Sun 将 J2ME 定义为“一种以广泛的、以消费性产品为目标的、高度优化的 Java 运行环境,这些环境包括寻呼机、移动电话、可视电话、数字机顶盒和汽车导航系统等。”但由此也可以明显看出,要为所有这些设备定义一种最优化、或者接近最优化的单一技术是不可能的,因为这些设备的处理器能源、内存、固定存储器和用户界面的差异都非常之大。为解决这一问题,Sun 公司将适合 J2ME 的设备的配置分成各个部分,然后再进一步细分,其他品牌的Java技术也采用了大体相同的方式。 在第一步的划分中,Sun 将各种设备按照处理性能、内存和存储能力划分成CDC和CDLC两大类,需要说明的是,这一分类方法并没有考虑应用者最终的使用目的。在这一基础之上,Sun定义了 Java 语言的一个剥离版本,它能够在每一类设备的限制下工作,也包括通信设备,同时提供最低限度的 Java 语言功能性,这一点,对于作为消费类产品的终端通信设备而言,非常重要。 移动信息设备简表(MIDP)是J2ME补充CLDC配置的Java API集合,也是基于CDC和CDLC的最上层。MIDP为开发者提供了计时器、简单固定存储器、通过 HTTP 的连网等常用API,开发者可以通过MIDP提供的界面快速开发UI元素来构造J2ME应用,这些元素包括常用的:Alert 用于通过屏幕向用户显示有关异常情况或错误的信息;Choice 用于实现从既定数量的选项中进行选择;ChoiceGroup 可提供一组相关选项;Form 作为其他UI 元素的容器;List 提供选项列表;StringItem 提供只显示(display-only)字符串功能;TextBox 允许用户输入和编辑文本的屏幕显示;TextField 允许用户输入和编辑文本,多个 TextField 可放到一个 Form 中;DateField 作为可编辑组件,用于表示日期和时间信息,DateField 可以放到 Form 中;Ticker 用于文本的可滚动显示等。 当开发者对界面控制有较高要求时,可以使用Canvas技术来实现图形化的界面输出,利用Double buffering技术实现流畅的动画处理效果。MIDP还提供了记录管理系统RMS(Record Management System),RMS的记录管理系统存取数据到移动设备中。在CLDC中提供一个通用的连接框架(Connection Framework),我们可以使用该连接框架从Web端发送和接收数据,这一连接框架实现Http1.1协议。在企业级应用开发中,HttpConnection或Socekt经常会和Threads技术应用在一起,以提供高性能的企业数据连接。熟悉Java Serverlet的开发者在编写J2ME程序时并不会感觉环境的陌生,因为J2ME为每个应用提供了类似于Serverlet的有生命周期管理的MIDlet,每个J2ME应用都必须扩展MIDlet类,以便能够让应用系统控制它。Model-View-Controller,(MVC,Model为维护应用模型的状态,View指通过图形或非图形模式表现Model,Controller接收外部指令更新Model或View)J2ME的开发者必须参照MVC设计模式,因为整个设计需要在完成最后UI步骤之前完全测试通过商业逻辑部分,以保证在仿真运行环境下的联调焦点放在UI控制上。 Java之于GPRS GPRS是按欧洲电信协会GSM标准定义的封包交换协议,可快速接入数据网络。它在移动终端和网络之间实现了“永远在线”的连接,而网络容量只有在实际进行传输时才被占用。现在,我们已经习惯将移动通信分为三代。第一代是模拟的无线网络; 第二代是数字通信,包括GSM、CDMA等;第三代是分组型的移动业务,称为3G,TD-SCDMA、WCDMA和CDMA2000的所谓3G之争,已经为常人所熟悉。 GPRS是通用无线分组业务的缩写(General Packet Radio System),作为介于第二代和第三代之间的通信技术,通常也被当成2.5G,目前正通过升级GSM网络实现它。 为了推动GPRS,爱立信、PALM、IBM、Oracle和Symbian于1999年10月成立GPRS Application Alliance,即GAA。J2ME技术让移动设备拥有了自动下载、部署和运行Java应用的环境平台,将复杂的程序处理从传统的PC系统搬到轻巧、随身携带的便携移动设备中,更为关键的是,J2ME的推出引发了手机等无线终端的增值业务,既而逐渐培育出一个利润丰厚的无线应用行业。由于技术开放、标准容易统一的特性,使得Java技术的上下游技术以及设备提供商都能够准确找到共同的利润点,并加以放大,Java为全球无线增值业务提供了一个绿色的生态链。 目前,Java结合成熟的GPRS通信网络,已经开发出多种增值无线应用,同时也成为普及GPRS网络的关键应用技术。分析当今主流的应用成果,大致可归纳为娱乐游戏、位置服务、信息点播、电子商务、公共设施、企业应用、开发工具等几大类。 游戏娱乐类 这是当前应用已经比较普遍、应用种类也较繁多的一种应用。通过GRPS网络,可以让支持Java的手机用户下载各种小游戏、视频、图片、电子小说等电子消费类J2ME应用,成为电信运营商推动增值服务的核心业务。 位置服务类 这一类服务的本质是,利用J2ME的图形处理能力绘制全球定位系统并反馈位置数据,从而为特殊行业用户提供可视位置服务。 信息点播类 通过Http连接服务,以J2ME应用实现新闻、证券消息、天气预报、生活等信息资讯的点播服务,这一类服务也成为运营商下一阶段大力推广的业务模式。 电子商务类 通过J2ME提供的信息安全、传输技术实现手机银行、无线交易、股票查询等应用系统,当前,无论是使用Java还是Brew的电子商务类应用都还没有广泛推广开来,这与整个消费市场信用度有关,同时,在涉及到银行与通信两个领域的合作时,有很多的问题还有待进一步解决,有些还会涉及到法律层面的认可问题。 公众设施类 通过GPRS网络连接到数据服务中心,对数据进行无线远程操作,这类系统较为常见的有交通车辆信息查询系统、身份证查询系统等。 企业级应用类 结合企业内部业务管理系统实现无线办公环境,这类系统主要针对企业用户,应用需求比较分散,常见的有接入到企业内部办公系统数据库的无线办公自动化系统(例如炎黄盈动的iWork/OA)、业务信息处理系统,就市场发展来看,基于Java技术的企业级应用也会在未来成为中国移动运营商重要的收入来源之一。 开发工具类 为实现J2ME应用而单独提供的各种中间件、数据库、Framework等,例如Sybase、Oracle的J2ME数据库、XML解析器。 J2SE、J2EE和J2ME作为Java在三个不同方向的开发平台,运行在资源受限设备上的J2ME平台可以方便地与J2SE、J2EE应用进行通信,甚至可以共享J2EE或J2SE应用的类程序,这降低了传统Java程序向无线通信领域移植的难度,同时遍布全球的上百万Java程序员及积累了近10年的Java技术资源,也降低了J2ME的入门难度,成为J2ME的支持者。从2003年的JavaOne大会可以看出,包括Sun在内的众多公司正将业务瞄准J2ME市场,例如Sun就推出了新的Sun开发商网络移动项目(Sun Developer Network Mobility Program),为项目成员提供完整的资源包,用于创建、测试和验证基于J2ME技术的应用,并将这些应用通过市场提供给消费者和企业,一旦具备市场环境条件,Java开发者大军将会迅速向J2ME挺进。 正是这些因素的影响,使得目前中国移动当前推动的各种手机应用和中国联通与美国高通公司联合推动的Brew平台形成对垒局面。无论掌声来自何方,受益的将会是我们大众消费者。 相关链接 CLDC J2ME平台定义了两个底层配置CDC和CLDC。其中,CDC(Connect Device Configuration,连接设备配置)规范用于比PC机小、但同时具有多于 512K内存的设备,这一类设备包括互联网络电视系统、机顶盒、POS系统、汽车导航以及娱乐系统,这些应用被运行在JVM虚拟机中。 CLDC(Connected Limited Device Configuration ,有限连接设备配置)规范应用于内存128K到 512K之间的消费类电子设备, 这一类别中典型的代表设备包含呼叫器、移动电话、个人数字助理PDA和POS终端等。这些应用通常在移动设备的KVM虚拟机中运行。 从J2ME类库发展来看,CDC配置的类库包含了J2SE1.3应用程序接口类库的一个子集,并针对资源受限设备做了扩展。由于应用于CLDC配置的设备资源更受限制的原因,CLDC配置类库实际上完全是CDC类库的子集。 <淘宝热门商品:
 

42.00 元  

同仁堂保健品 协和护肤品 营养品 减肥瘦身品

小小豆叮

JSP与JavaMail (三)

4.试着编写第一个发送程序 在前面我们已对JavaMail作了一些介绍,下面我们可试着写自己的程序了. 首先,我们先写一个撰写邮件的html程序index.htm,如下: ------------------------------------------------------------------------------------------- <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>撰写邮件</title> </head> <body> <form name="form1" method="post" action="testmail.jsp"> <table width="75" border="0" align="center" cellspacing="1" bgcolor="#006600" class="black"> <tr bgcolor="#FFFFFF"> <td width="24%">收信人地址:</td> <td width="76%"> <input name="to" type="text" id="to"></td> </tr> <tr bgcolor="#FFFFFF"> <td>主题:</td> <td> <input name="title" type="text" id="title"></td> </tr> <tr> <td height="107" colspan="2" bgcolor="#FFFFFF"> <textarea name="content" cols="50" rows="5" id="content"></textarea></td> </tr> <tr align="center"> <td colspan="2" bgcolor="#FFFFFF"> <input type="submit" name="Submit" value="发送"> <input type="reset" name="Submit2" value="重置"> </td> </tr> </table> </form> </body> </html> 接着,我们再写一个处理程序testmail.jsp,如下: ----------------------------------------------------------------------------------------- <%@ page contentType="text/html;charset=GB2312" %> <%request.setCharacterEncoding("gb2312");%><!--中文处理代码--> <!--引入要用到的类库--> <%@ page import="java.util.*,javax.mail.*"%> <%@ page import="javax.mail.internet.*"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>发送成功</title> </head> <body> <% try{ //从html表单中获取邮件信息 String tto=request.getParameter("to"); String ttitle=request.getParameter("title"); String tcontent=request.getParameter("content"); Properties props=new Properties();//也可用Properties props = System.getProperties(); props.put("mail.smtp.host","smtp.163.net");//存储发送邮件服务器的信息 props.put("mail.smtp.auth","true");//同时通过验证 Session s=Session.getInstance(props);//根据属性新建一个邮件会话 s.setDebug(true); MimeMessage message=new MimeMessage(s);//由邮件会话新建一个消息对象 //设置邮件 InternetAddress from=new InternetAddress("boy@163.net"); message.setFrom(from);//设置发件人 InternetAddress to=new InternetAddress(tto); message.setRecipient(Message.RecipientType.TO,to);//设置收件人,并设置其接收类型为TO message.setSubject(ttitle);//设置主题 message.setText(tcontent);//设置信件内容 message.setSentDate(new Date());//设置发信时间 //发送邮件 message.saveChanges();//存储邮件信息 Transport transport=s.getTransport("smtp"); transport.connect("smtp.163.net","boy","iloveyou");//以smtp方式登录邮箱 transport.sendMessage(message,message.getAllRecipients());//发送邮件,其中第二个参数是所有 //已设好的收件人地址 transport.close(); %> <div align="center"> <p><font color="#FF6600">发送成功!</font></p> <p><a href="recmail.jsp">去看看我的信箱</a><br> <br> <a href="index.htm">再发一封</a> </p> </div> <% }catch(MessagingException e){ out.println(e.toString()); } %> </body> </html> **********************************注意*************************************** 有好多书上和网上的文章在关键部分都是这样写testmail.jsp的,如下: String tto=request.getParameter("to"); String ttitle=request.getParameter("title"); String tcontent=request.getParameter("content"); Properties props=new Properties(); props.put("mail.smtp.host","smtp.163.net"); Session s=Session.getInstance(props); MimeMessage message=new MimeMessage(s); InternetAddress from=new InternetAddress("boy@163.net"); message.setFrom(from); InternetAddress to=new InternetAddress(tto); message.setRecipient(Message.RecipientType.TO,to); message.setSubject(ttitle); message.setText(tcontent); message.setSentDate(new Date()); Store store=s.getStore("pop3"); store.connect("pop.163.net","boy","iloveyou");//以pop3的方式登录邮箱 Transport transport=s.getTransport("smtp"); transport.send(message); store.close(); 事实上,这种方式并不可靠,因为很多电子邮局的smtp服务器要求我们通过验证,所以用这种方式发邮件时,只能发给同类邮箱(即相同smtp的邮箱),甚至有时同类邮箱也发不出去.以上两种方式我试过很多次,结果证明第一种方式是最可靠的. 好了,我相信你应该会写最简单的Email发送程序了.OK,下一次我们将说说怎样写发送HTML格式的邮件. (待续) <淘宝热门商品:
 

36.9元  

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

小小豆叮

JSP与JavaMail (五)

6.发送三种类型的附件 前面我们已学会了发送一般文本邮件和超文本邮件,今天我们将让大家学会编写三种类型的附件的邮件 发送程序.(注:撰写界面仍然用前面的) <%@ page contentType="text/html;charset=GB2312" %> <%request.setCharacterEncoding("gb2312");%> <%@ page import="java.util.*,javax.mail.*"%> <%@ page import="javax.mail.internet.*"%> <%@ page import="javax.activation.*"%><!--要发送附件必须引入该库--> <%@ page import="java.net.*"%><!--要用到URL类--> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>发送成功</title> </head> <body> <% try{ String tto=request.getParameter("to"); String ttitle=request.getParameter("title"); String tcontent=request.getParameter("content"); Properties props=new Properties(); props.put("mail.smtp.host","127.0.0.1"); props.put("mail.smtp.auth","true"); Session s=Session.getInstance(props); s.setDebug(true); MimeMessage message=new MimeMessage(s); //给消息对象设置发件人/收件人/主题/发信时间 InternetAddress from=new InternetAddress("xxf@cafe.com"); message.setFrom(from); InternetAddress to=new InternetAddress(tto); message.setRecipient(Message.RecipientType.TO,to); message.setSubject(ttitle); message.setSentDate(new Date()); Multipart mm=new MimeMultipart();//新建一个MimeMultipart对象用来存放多个BodyPart对象 //设置信件文本内容 BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象 mdp.setContent(tcontent,"text/html;charset=gb2312");//给BodyPart对象设置内容和格式/编码方式 mm.addBodyPart(mdp);//将含有信件内容的BodyPart加入到MimeMultipart对象中 //设置信件的附件1(自定义附件:直接将所设文本内容加到自定义文件中作为附件发送) mdp=new MimeBodyPart();//新建一个存放附件的BodyPart DataHandler dh=new DataHandler("JavaMail附件测试","text/plain;charset=gb2312"); //新建一个DataHandler对象,并设置其内容和格式/编码方式 mdp.setFileName("xxf.txt");//加上这句将作为附件发送,否则将作为信件的文本内容 mdp.setDataHandler(dh);//给BodyPart对象设置内容为dh mm.addBodyPart(mdp);//将含有附件的BodyPart加入到MimeMultipart对象中 //设置信件的附件2(用本地上的文件作为附件) mdp=new MimeBodyPart(); FileDataSource fds=new FileDataSource("g:/xx.txt"); dh=new DataHandler(fds); mdp.setFileName("dd.txt");//可以和原文件名不一致 mdp.setDataHandler(dh); mm.addBodyPart(mdp); //设置信件的附件3(用远程文件作为附件) mdp=new MimeBodyPart(); URLDataSource ur=new URLDataSource(new URL("http://localhost:8080/jspstudy/email/xx.gif")); //注:这里用的参数只能为URL对象,不能为URL字串,在前面类介绍时有误(请谅解),这里纠正一下. dh=new DataHandler(ur); mdp.setFileName("ss.txt"); mdp.setDataHandler(dh); mm.addBodyPart(mdp); message.setContent(mm);//把mm作为消息对象的内容 message.saveChanges(); Transport transport=s.getTransport("smtp"); transport.connect("127.0.0.1","xxf","coffee"); transport.sendMessage(message,message.getAllRecipients()); transport.close(); %> <div align="center"> <p><font color="#FF6600">发送成功!</font></p> <p><a href="recmail.jsp">去看看我的信箱</a><br> <br> <a href="index.htm">再发一封</a> </p> </div> <% }catch(MessagingException e){ out.println(e.toString()); } %> </body> </html> 发送附件是不是很有趣呢?但是在这里由于没有修改撰写界面,要发送的附件只能在程序里固定,所以一点都不灵活.不用担心,下一次我们将重写撰写界面,当然同时也会修改邮件处理程序,到时我们将能灵活地发送自己的邮件. (待续) <淘宝热门商品:
 

136.00 元  

达人公社 专柜正品 纽巴伦 newbalance 匡威 crocs折扣 店

正品 日版纽巴伦new balance 型号:TK02 深灰黑

小小豆叮

JSP与JavaMail (四)

5.发送HTML格式的邮件 所谓HTML格式,就是超文本格式.你的邮件可以用HTML代码编写,发给对方后,对方收到的将是信息将是超文本,超文本比纯文本好看多了.下以面是在以前例子的基础上修改的程序: <%@ page contentType="text/html;charset=GB2312" %> <%request.setCharacterEncoding("gb2312");%> <%@ page import="java.util.*,javax.mail.*"%> <%@ page import="javax.mail.internet.*"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <title>发送成功</title> </head> <body> <% try{ String tto=request.getParameter("to"); String ttitle=request.getParameter("title"); String tcontent=request.getParameter("content"); Properties props=new Properties(); props.put("mail.smtp.host","127.0.0.1"); props.put("mail.smtp.auth","true"); Session s=Session.getInstance(props); s.setDebug(true); MimeMessage message=new MimeMessage(s); //给消息对象设置发件人/收件人/主题/发信时间 InternetAddress from=new InternetAddress("xxf@cafe.com"); message.setFrom(from); InternetAddress to=new InternetAddress(tto); message.setRecipient(Message.RecipientType.TO,to); message.setSubject(ttitle); message.setSentDate(new Date()); //给消息对象设置内容 BodyPart mdp=new MimeBodyPart();//新建一个存放信件内容的BodyPart对象 mdp.setContent(tcontent,"text/html;charset=gb2312");//给BodyPart对象设置内容和格式/编码方式 Multipart mm=new MimeMultipart();//新建一个MimeMultipart对象用来存放BodyPart对 //象(事实上可以存放多个) mm.addBodyPart(mdp);//将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart) message.setContent(mm);//把mm作为消息对象的内容 message.saveChanges(); Transport transport=s.getTransport("smtp"); transport.connect("127.0.0.1","xxf","coffee"); transport.sendMessage(message,message.getAllRecipients()); transport.close(); %> <div align="center"> <p><font color="#FF6600">发送成功!</font></p> <p><a href="recmail.jsp">去看看我的信箱</a><br> <br> <a href="index.htm">再发一封</a> </p> </div> <% }catch(MessagingException e){ out.println(e.toString()); } %> </body> </html> 注:撰写邮件的html文件仍然和前面(请参考jsp和Java Mail(三))那个一样,不需要作任何修改. 怎么样,这个程序是不是很简单呢?如果还有什么不懂的话,请在下面留言.下一次我们将要讲一讲怎样发送附件. (待续) <淘宝热门商品:
 

138.00 元  

免邮-七色瘦减肥胶囊-店主亲试劲减30斤前后照片

小小豆叮

JSP与JavaMail (一)

1.介绍: Java Mail API的开发是SUN为Java开发者提供公用API框架的持续努力的良好例证。提倡公用框架,反对受限于供应商的解决方案,充分预示着一个日益开放的开发环境的建立。   Java Mail API的结构本身证明了它的开发者的基本目标之一--软件开发的工作量应该取决于应用程序本身的复杂程度以及开发者所要求的控制程度。换句话说,Java Mail API尽可能地保持简单。乍看起来,JavaMail API所拥有的类总数以及类之间的关系可能让人误解为要花费漫长的学习时间。实际上,一旦正式开始使用,你就会发现该API不失为在应用程序中加入健壮的邮件/通讯支持的简单工具。 2.安装: 安装前要确保你的机子上安装得有标准版的JDK和Web服务器,并且已配置好,有关它们的安装方法,请参考其它文章(网上到处都有). (1).安装JavaMail API。现在最常用的 JavaMail API 版本是1.3.   要使用 JavaMail 1.3 API,请下载 JavaMail 1.3 实现,解开Javamail-1_3.zip 文件,并将 mail.jar 文件添加到 CLASSPATH 中。除了核心类,随版本 1.3 实现一起提供的还有 SMTP、IMAP4 和 POP3 供应商。    (2).JavaBeans Activation Framework(1.0.2版) 的安装 JavaMail API 的所有版本都需要 JavaBeans Activation Framework 来支持任意数据块的输入及相应处理。功能似乎不多,但目前许多浏览器和邮件工具中都能找到这种基本的 MIME 型支持。下载完框架后,解开 jaf1_0_2.zip 文件,并将 activation.jar 文件添加到 CLASSPATH 中。    注: 如果您使用的JDK是J2EE,就没有什么特定的事非要用基本 JavaMail API来做不可;J2EE 的类就能处理了,因为它本身就包含有JavaMail API和JAF,您只需要确将 j2ee.jar 文件添加到您的CLASSPATH 中并已全部设置好。 <淘宝热门商品:
 

88.00 元 

双皇冠 狂卖2000条!Levis 超赞牛仔裤

小小豆叮

怎样成为优秀的软件模型设计者

们期待自己成为一个优秀的软件模型设计者,但是,要怎样做,又从哪里开始呢? 将下列原则应用到你的软件工程中,你会获得立杆见影的成果。 1. 人远比技术重要 你开发软件是为了供别人使用,没有人使用的软件只是没有意义的数据的集合而已。许多在软件方面很有成就的行家在他们事业的初期却表现平平,因为他们那时侯将主要精力都集中在技术上。显然,构件(components),EJB(Enterprise Java Beans)和代理(agent)是很有趣的东西。但是对于用户来说,如果你设计的软件很难使用或者不能满足他们的需求,后台用再好的技术也于事无补。多花点时间到软件需求和设计一个使用户能很容易理解的界面上。 2. 理解你要实现的东西 好的软件设计人员把大多数时间花费在建立系统模型上,偶尔写一些源代码,但那只不过是为了验证设计过程中所遇到的问题。这将使他们的设计方案更加可行。 3. 谦虚是必须的品格 你不可能知道一切,你甚至要很努力才能获得足够用的知识。软件开发是一项复杂而艰巨的工作,因为软件开发所用到的工具和技术是在不断更新的。而且,一个人也不可能了解软件开发的所有过程。在日常生活中你每天接触到的新鲜事物可能不会太多。但是对于从事软件开发的人来说,每天可以学习很多新东西(如果愿意的话)。 4. 需求就是需求 如果你没有任何需求,你就不要动手开发任何软件。成功的软件取决于时间(在用户要求的时间内完成)、预算和是否满足用户的需求。如果你不能确切知道用户需要的是什么,或者软件的需求定义,那么你的工程注定会失败。 5. 需求其实很少改变,改变的是你对需求的理解 Object ToolSmiths公司(www.objecttoolsmiths.com)的Doug Smith常喜欢说:“分析是一门科学,设计是一门艺术”。他的意思是说在众多的“正确”分析模型中只存在一个最“正确”分析模型可以完全满足解决某个具体问题的需要(我理解的意思是需求分析需要一丝不苟、精确的完成,而设计的时候反而可以发挥创造力和想象力 - 译者注)。 如果需求经常改动,很可能是你没有作好需求分析,并不是需求真的改变了。 你可以抱怨用户不能告诉你他们想得到什么,但是不要忘记,收集需求信息是你工作。 你可以说是新来的开发人员把事情搞得一团糟,但是,你应该确定在工程的第一天就告诉他们应该做什么和怎样去做。 如果你觉得公司不让你与用户充分接触,那只能说明公司的管理层并不是真正支持你的项目。 你可以抱怨公司有关软件工程的管理制度不合理,但你必须了解大多同行公司是怎么做的。 你可以借口说你们的竞争对手的成功是因为他们有了一个新的理念,但是为什么你没先想到呢? 需求真正改变的情况很少,但是没有做好需求分析工作的理由却很多。 6. 经常阅读 在这个每日都在发生变化的产业中,你不可能在已取得的成就上陶醉太久。 每个月至少读2、3本专业杂志或者1本专业书籍。保持不落伍需要付出很多的时间和金钱,但会使你成为一个很有实力的竞争者。 7. 降低软件模块间的耦合度 高耦合度的系统是很难维护的。一处的修改引起另一处甚至更多处的变动。 你可以通过以下方法降低程序的耦合度:隐藏实现细节,强制构件接口定义,不使用公用数据结构,不让应用程序直接操作数据库(我的经验法则是:当应用程序员在写SQL代码的时候,你的程序的耦合度就已经很高了)。 耦合度低的软件可以很容易被重用、维护和扩充。 8. 提高软件的内聚性 如果一个软件的模块只实现一个功能,那么该模块具有高内聚性。高内聚性的软件更容易维护和改进。 判断一个模块是否有高的内聚性,看一看你是否能够用一个简单的句子描述它的功能就行了。如果你用了一段话或者你需要使用类似“和”、“或”等连词,则说明你需要将该模块细化。 只有高内聚性的模块才可能被重用。 9. 考虑软件的移植性 移植是软件开发中一项具体而又实际的工作,不要相信某些软件工具的广告宣传(比如java 的宣传口号write once run many ? 译者注)。 即使仅仅对软件进行常规升级,也要把这看得和向另一个操作系统或数据库移植一样重要。 记得从16位Windows移植到32位windows的“乐趣”吗 ?当你使用了某个操作系统的特性,如它的进程间通信(IPC)策略,或用某数据库专有语言写了存储过程。你的软件和那个特定的产品结合度就已经很高了。 好的软件设计者把那些特有的实现细节打包隐藏起来,所以,当那些特性该变的时候,你的仅仅需要更新那个包就可以了。 10. 接受变化 这是一句老话了:唯一不变的只有变化。 你应该将所有系统将可能发生的变化以及潜在需求记录下来,以便将来能够实现(参见“Architecting for Change”,Thinking Objectively, May 1999) 通过在建模期间考虑这些假设的情况,你就有可能开发出足够强壮且容易维护的软件。设计强壮的软件是你最基本的目标。 11. 不要低估对软件规模的需求 Internet 带给我们的最大的教训是你必须在软件开发的最初阶段就考虑软件规模的可扩充性。 今天只有100人的部门使用的应用程序,明天可能会被有好几万人的组织使用,下月,通过因特网可能会有几百万人使用它。 在软件设计的初期,根据在用例模型中定义的必须支持的基本事务处理,确定软件的基本功能。然后,在建造系统的时候再逐步加入比较常用的功能。 在设计的开始考虑软件的规模需求,避免在用户群突然增大的情况下,重写软件。 12. 性能仅仅是很多设计因素之一 关注软件设计中的一个重要因素--性能,这好象也是用户最关心的事情。一个性能不佳的软件将不可避免被重写。 但是你的设计还必须具有可靠性,可用性,便携性和可扩展性。你应该在工程开始就应该定义并区分好这些因素,以便在工作中恰当使用。性能可以是,也可以不是优先级最高的因素,我的观点是,给每个设计因素应有的考虑。 13. 管理接口 “ UML User Guide”(Grady Booch,Ivar Jacobson和Jim Rumbaugh ,Addison Wesley, 1999)中指出,你应该在开发阶段的早期就定义软件模块之间的接口。 这有助于你的开发人员全面理解软件的设计结构并取得一致意见,让各模块开发小组相对独立的工作。一旦模块的接口确定之后,模块怎样实现就不是很重要了。 从根本上说,如果你不能够定义你的模块“从外部看上去会是什么样子”,你肯定也不清楚模块内要实现什么。 14. 走近路需要更长的时间 在软件开发中没有捷径可以走。 缩短你的在需求分析上花的时间,结果只能是开发出来的软件不能满足用户的需求,必须被重写。 在软件建模上每节省一周,在将来的编码阶段可能会多花几周时间,因为你在全面思考之前就动手写程序。 你为了节省一天的测试时间而漏掉了一个bug,在将来的维护阶段,可能需要花几周甚至几个月的时间去修复。与其如此,还不如重新安排一下项目计划。 避免走捷径,只做一次但要做对(do it once by doing it right)。 15. 别信赖任何人 产品和服务销售公司不是你的朋友,你的大部分员工和高层管理人员也不是。 大部分产品供应商希望把你牢牢绑在他们的产品上,可能是操作系统,数据库或者某个开发工具。 大部分的顾问和承包商只关心你的钱并不是你的工程(停止向他们付款,看一看他们会在周围呆多长时间)。 大部分程序员认为他们自己比其他人更优秀,他们可能抛弃你设计的模型而用自己认为更好的。 只有良好的沟通才能解决这些问题。 要明确的是,不要只依靠一家产品或服务提供商,即使你的公司(或组织)已经在建模、文档和过程等方面向那个公司投入了很多钱。 16. 证明你的设计在实践中可行 在设计的时候应当先建立一个技术原型, 或者称为“端到端”原型。以证明你的设计是能够工作的。 你应该在开发工作的早期做这些事情,因为,如果软件的设计方案是不可行的,在编码实现阶段无论采取什么措施都于事无补。技术原型将证明你的设计的可行性,从而,你的设计将更容易获得支持。 17. 应用已知的模式 目前,我们有大量现成的分析和设计模式以及问题的解决方案可以使用。 一般来说,好的模型设计和开发人员,都会避免重新设计已经成熟的并被广泛应用的东西。 http://www.ambysoft.com/processPatternsPage.html 收藏了许多开发模式的信息。 18. 研究每个模型的长处和弱点 目前有很多种类的模型可以使用,如下图所示。用例捕获的是系统行为需求,数据模型则描述支持一个系统运行所需要的数据构成。你可能会试图在用例中加入实际数据描述,但是,这对开发者不是非常有用。同样,数据模型对描述软件需求来说是无用的。每个模型在你建模过程中有其相应的位置,但是,你需要明白在什么地方,什么时候使用它们。 19. 在现有任务中应用多个模型 当你收集需求的时候,考虑使用用例模型,用户界面模型和领域级的类模型。 当你设计软件的时候,应该考虑制作类模型,顺序图、状态图、协作图和最终的软件实际物理模型。 程序设计人员应该慢慢意识到,仅仅使用一个模型而实现的软件要么不能够很好地满足用户的需求,要么很难扩展。 20. 教育你的听众 你花了很大力气建立一个很成熟的系统模型,而你的听众却不能理解它们,甚至更糟-连为什么要先建立模型都不知道。那么你的工作是毫无意义的。 教给你开发人员基本的建模知识;否则,他们会只看看你画的漂亮图表,然后继续编写不规范的程序。 另外, 你还需要告诉你的用户一些需求建模的基础知识。给他们解释你的用例(uses case)和用户界面模型,以使他们能够明白你要表达地东西。当每个人都能使用一个通用的设计语言的时候(比如UML-译者注),你的团队才能实现真正的合作。 21. 带工具的傻瓜还是傻瓜 你给我CAD/CAM工具,请我设计一座桥。但是,如果那座桥建成的话,我肯定不想当第一个从桥上过的人,因为我对建筑一窍不通。 使用一个很优秀的CASE工具并不能使你成为一个建模专家,只能使你成为一个优秀CASE工具的使用者。成为一个优秀的建模专家需要多年的积累,不会是一周针对某个价值几千美元工具的培训。一个优秀的CASE工具是很重要,但你必须学习使用它,并能够使用它设计它支持的模型。 22. 理解完整的过程 好的设计人员应该理解整个软件过程,尽管他们可能不是精通全部实现细节。 软件开发是一个很复杂的过程,还记得《object-oriented software process》第36页的内容吗?除了编程、建模、测试等你擅长工作外,还有很多工作要做。 好的设计者需要考虑全局。必须从长远考虑如何使软件满足用户需要,如何提供维护和技术支持等。 23. 常做测试,早做测试 如果测试对你的软件来说是无所谓的,那么你的软件多半也没什么必要被开发出来。 建立一个技术原型供技术评审使用,以检验你的软件模型。 在软件生命周期中,越晚发现的错误越难修改,修改成本越昂贵。尽可能早的做测试是很值得的。 24. 把你的工作归档 不值得归档的工作往往也不值得做。归档你的设想,以及根据设想做出的决定;归档软件模型中很重要但不很明显的部分。 给每个模型一些概要描述以使别人很快明白模型所表达的内容。 25. 技术会变,基本原理不会 如果有人说“使用某种开发语言、某个工具或某某技术,我们就不需要再做需求分析,建模,编码或测试”。不要相信,这只说明他还缺乏经验。抛开技术和人的因素,实际上软件开发的基本原理自20世纪70年代以来就没有改变过。你必须还定义需求,建模,编码,测试,配置,面对风险,发布产品,管理工作人员等等。 软件建模技术是需要多年的实际工作才能完全掌握的。好在你可以从我的建议开始,完善你们自己的软件开发经验。 以鸡汤开始,加入自己的蔬菜。然后,开始享受你自己的丰盛晚餐吧。 <淘宝热门商品:
 

 

【家倍乐床上笔记本电脑桌专利厂家批发零售店】

小小豆叮

Java的秘密:使用全屏幕模式

什么时候会用到全屏幕模式? 也许用到的机会很少,但JDK还是为我们提供了这个的功能。像许多软件中的打印预览功能,还有某些文本编辑器中为了获得更大的编辑画面,也用到了全屏幕模式,如果你有兴趣写一个像ACDSee这样的软件,使用全屏幕模式可以让用户看到更大的图片画面。 如何使用全屏幕模式? 关键是java.awt.*里面的两个与显示设备有关的类:GraphicsEnvironment和GraphicsDevice。 GraphicsEnvironment为Java应用程序提供了特定平台的 GraphicsDevice 对象和 Font 对象集合。这些GraphicsDevice可以是各种本机和远端机器的资源,如屏幕、打印机或者是Image Buffer,甚至是Graphics2D绘图方法的目标对象。 而GraphicsDevice就是指特定的图形环境了,如屏幕和打印设备等。这样,我们就可以用GraphicsDevice来操纵屏幕了。GraphicsDevice提供的setFullScreenWindow()方法就是设置全屏幕用的。 由于GraphicsEnvironment的构造器是受保护的(protected),我们不能直接构造一个 GraphicsEnvironment对象来获得GraphicsDevice对象。幸好它提供了getLocalGraphicsEnvironment()方法,用来获得一个GraphicsEnvironment实例: GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 有了GraphicsEnvironment可以调用getDefaultScreenDevice方法获得当前的屏幕设备了: GraphicsDevice gd = ge.getDefaultScreenDevice(); 自己动手体验一下 有了上面的简介,写一个实例来体验一下吧: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class FullScreenTest { public static void main(String[] args) { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); GraphicsDevice gd = ge.getDefaultScreenDevice(); FullScreenWindow myWindow = new FullScreenWindow(); if ( gd.isFullScreenSupported() ) gd.setFullScreenWindow(myWindow); else System.out.println("Unsupported full screen."); } } class FullScreenWindow extends JWindow { public FullScreenWindow() { this.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent evt) { quit(); } }); } public void quit() { this.dispose(); } public void paint(Graphics g) { g.setFont(new Font("Arial",Font.BOLD,30)); g.setColor(Color.RED); g.drawString("这是全屏幕模式",100,100); } } <淘宝热门商品:
 

¥:338.00 

【澳钻/Swarovski/手机钻/美甲钻/婚沙礼服钻】专卖店

【五钻信誉】Swarovski々豪华水晶甲々1200颗338元[包快递]

小小豆叮

用JAI扩展Java的图像处理能力

Java的图像处理能力不断地在增长,但是将一个如PNG或者JPEG格式的文件写入磁盘或从磁盘读取这样的操作仍然是一种巫术。解决方案是使用Java Advanced Imaging(JAI)API。JAI可以在Sun的Java网站下载,在JDK1.4的javax.imageio包里已经包括了它。 有针对Windows平台的exe格式的JAI安装文件可以下载, 但是没有针对UNIX和Linux的安装文件。尽管JAI可以在纯Java模式下运行,但它也为Windows、Linux、UNIX提供了本地库,使用它们可以提高运行速度。 下面的例子是安装在Apple机的OS X系统上的,因此我们选择了纯Java模式。为了安装JAI,你需要一个jai tar.gz文件。把三个重要的jar文件mlibwrapper_jar.jar、jar_codec.jar和jar_core.jar移到你的classpath环境变量指定的目录下。我们推荐把它们放到你的JDK的jre/lib/ext目录下。 实际上JAI是Java中的一个临时系统。这里只有一个名为JAI的顶层类和很少的几个辅助方法,而没有很多方法让人去学习。这些方法里的第一个参数是操作名,所以代码象这样: src = JAI.create("fileload", .. ); JAI.create("extrema", src, ...); JAI.create("histogram", src, ...); 这样的系统在使它与你自己的或者第三方的功能可以很容易结合在一起的同时也使得类型间的耦合更松散,这进而使得在这之下的开发更困难。 将一个AWT图形转换成一个PNG文件需要下列的代码片断: import java.awt.Image; import java.awt.image.renderable.ParameterBlock; import javax.media.jai.JAI; import javax.media.jai.PlanarImage; ..... Image img = .... OutputStream out = .... ParameterBlock pb = new ParameterBlock().add(img); PlanarImage src = (PlanarImage) JAI.create("awtImage", pb); JAI.create("encode", src, out,"PNG", null); 以上的例子演示了两种给create方法传参数的方法,其中较新的方法是使用一个包含了所有参数的ParameterBlock,我们在对awtImage的操作中是这么做的。旧的方法使用的是一个重载的方法,它现在是deprecated(即被替代的旧方法,不推荐使用的)方法,但在这个例子中,我们为encode操作使用了它。 上面的代码会将一个图像按PNG格式编码并写到OutputStream中去。如果你想对JAI进行进一步的了解,我们强烈推荐你去读JAI指南。 <淘宝热门商品:
 

188.00 元  

地球都踩在脚下

T-MAC8麦迪8代 麦8 08-09赛季麦迪篮球鞋 白黑红 阿迪达斯adidas

小小豆叮

基于Web的系统测试方法

基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战。基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。   本文从功能、性能、可用性、客户端兼容性、安全性等方面讨论了基于Web的系统测试方法。   随着Internet和Intranet/Extranet的快速增长,Web已经对商业、工业、银行、财政、教育、政府和娱乐及我们的工作和生活产生了深远的影响。许多传统的信息和数据库系统正在被移植到互联网上,电子商务迅速增长,早已超过了国界。范围广泛的、复杂的分布式应用正在Web环境中出现。Web的流行和无所不在,是因为它能提供支持所有类型内容连接的信息发布,容易为最终用户存取。   Yogesh Deshpande和Steve Hansen在1998年就提出了Web工程的概念。Web工程作为一门新兴的学科,提倡使用一个过程和系统的方法来开发高质量的基于Web的系统。它"使用合理的、科学的工程和管理原则,用严密的和系统的方法来开发、发布和维护基于Web的系统"。目前,对于web工程的研究主要是在国外开展的,国内还刚刚起步。   在基于Web的系统开发中,如果缺乏严格的过程,我们在开发、发布、实施和维护Web的过程中,可能就会碰到一些严重的问题,失败的可能性很大。而且,随着基于Web的系统变得越来越复杂,一个项目的失败将可能导致很多问题。当这种情况发生时,我们对Web和Internet的信心可能会无法挽救地动摇,从而引起Web危机。并且,Web危机可能会比软件开发人员所面对的软件危机更加严重、更加广泛。   在Web工程过程中,基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同,它不但需要检查和验证是否按照设计的要求运行,而且还要测试系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。然而,Internet和Web媒体的不可预见性使测试基于Web的系统变得困难。因此,我们必须为测试和评估复杂的基于Web的系统研究新的方法和技术。   一般软件的发布周期以月或以年计算,而Web应用的发布周期以天计算甚至以小时计算。Web测试人员必须处理更短的发布周期,测试人员和测试管理人员面临着从测试传统的C/S结构和框架环境到测试快速改变的Web应用系统的转变。   一、功能测试   1、链接测试   链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的页面是否存在;最后,保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。   链接测试可以自动进行,现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成,也就是说,在整个Web应用系统的所有页面开发完成之后进行链接测试。   2、表单测试   当用户给Web应用系统管理员提交信息时,就需要使用表单操作,例如用户注册、登陆、信息提交等。在这种情况下,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等。如果使用了默认值,还要检验默认值的正确性。如果表单只能接受指定的某些值,则也要进行测试。例如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。   3、Cookies测试   Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。   如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。   4、设计语言测试   Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如Java、JavaScript、 ActiveX、VBScript或Perl等也要进行验证。   5、数据库测试   在Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。 在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。   二、性能测试   1、连接速度测试   用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。   另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面。   2、负载测试   负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?   3、压力测试   负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。   进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。   压力测试的区域包括表单、登陆和其他信息传输页面等。   三、可用性测试   1、导航测试   导航描述了用户在一个页面内操作的方式,在不同的用户接口控制之间,例如按钮、对话框、列表和窗口等;或在不同的连接页面之间。通过考虑下列问题,可以决定一个Web应用系统是否易于导航:导航是否直观?Web系统的主要部分是否可通过主页存取?Web系统是否需要站点地图、搜索引擎或其他的导航帮助?   在一个页面上放太多的信息往往起到与预期相反的效果。Web应用系统的用户趋向于目的驱动,很快地扫描一个Web应用系统,看是否有满足自己需要的信息,如果没有,就会很快地离开。很少有用户愿意花时间去熟悉Web应用系统的结构,因此,Web应用系统导航帮助要尽可能地准确。   导航的另一个重要方面是Web应用系统的页面结构、导航、菜单、连接的风格是否一致。确保用户凭直觉就知道Web应用系统里面是否还有内容,内容在什么地方。   Web应用系统的层次一旦决定,就要着手测试用户导航功能,让最终用户参与这种测试,效果将更加明显。   2、图形测试   在Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有:   (1)要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间。Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面。   (2)验证所有页面字体的风格是否一致。   (3)背景颜色应该与字体颜色和前景颜色相搭配。   (4)图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩。   3、内容测试   内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。   信息的正确性是指信息是可靠的还是误传的。例如,在商品价格列表中,错误的价格可能引起财政问题甚至导致法律纠纷;信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行,例如使用Microsoft Word的"拼音与语法检查"功能;信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的信息列表或入口,也就是一般Web站点中的所谓"相关文章列表"。   4、整体界面测试   整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致? 对整体界面的测试过程,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。   对所有的可用性测试来说,都需要有外部人员(与Web应用系统开发没有联系或联系很少的人员)的参与,最好是最终用户的参与。   四、客户端兼容性测试   1、平台测试   市场上有很多不同的操作系统类型,最常见的有Windows、Unix、Macintosh、Linux等。Web应用系统的最终用户究竟使用哪一种操作系统,取决于用户系统的配置。这样,就可能会发生兼容性问题,同一个应用可能在某些操作系统下能正常运行,但在另外的操作系统下可能会运行失败。   因此,在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试。   2、浏览器测试   浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、JavaScript、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如,ActiveX是Microsoft的产品,是为Internet Explorer而设计的,JavaScript是Netscape的产品,Java是Sun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。   测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。   五、安全性测试   Web应用系统的安全性测试区域主要有:   (1)现在的Web应用系统基本采用先注册,后登陆的方式。因此,必须测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而直接浏览某个页面等。   (2)Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。   (3)为了保证Web应用系统的安全性,日志文件是至关重要的。需要测试相关信息是否写进了日志文件、是否可追踪。   (4)当使用了安全套接字时,还要测试加密是否正确,检查信息的完整性。   (5)服务器端的脚本常常构成安全漏洞,这些漏洞又常常被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。   六、总结   本文从功能、性能、可用性、客户端兼容性、安全性等方面讨论了基于Web的系统测试方法。 基于Web的系统测试与传统的软件测试既有相同之处,也有不同的地方,对软件测试提出了新的挑战。基于Web的系统测试不但需要检查和验证是否按照设计的要求运行,而且还要评价系统在不同用户的浏览器端的显示是否合适。重要的是,还要从最终用户的角度进行安全性和可用性测试。 <淘宝热门商品:
 

27.50 元  

兼济天下 公司运营 多家实体店 毛巾 浴巾 美容巾 浴袍 毛巾被

【皇冠信誉 专业做毛巾】外贸原单★素色绣小圆点浴巾◎加厚

小小豆叮

使用AWT 将Graphics对象转换为Image对象

Java抽象窗口工具包(AWT)为在Graphics对象上绘制提供许多方法,但是如何在Image对象上绘制或者转换Graphics对象为Image对象? AWT Image类提供getGraphics方法和它的扩充,BufferedImage类提供createGraphics方法。优先的选择是使用BufferedImage,它返回更强大的Graphics2D类。 BufferedImage bffImg = new BufferedImage( ); Graphics gfx = bffImg.createGraphics( ); gfx.drawRect(10, 10, 50, 20); // draw a rectangle 使用强大的Graphics API开发人员能够创建他们自己的图像,然后把它写入磁盘或者以PNG 或GIF的形式把它返回到客户端。新的JDK 1.4提供一个处理图像编码的API。对于那些仍使用1.3和更早的版本,有JAI(Java Advanced Imaging ,Java高级图像)API。 这个技术可以用来对任何Swing或AWT组件创建快照,并作为图像保存。这可能是创建屏幕快照的一种方法。请注意正被讨论的组件必须可绘制,因此你必须把它添加到某不可见的屏幕上的容器中。来自nanoTITAN Inc.开放源码的公用库的ComponentUtility类有这样的一个快照方法。 <淘宝热门商品:
 

215.00 元  

08秋冬新款 D&G 优质面料修

小小豆叮

如何做好code review

软件工程中一直在强调code review的重要性,但在我们部门中,code review做得并不是很好。负责人意识到了这一点,想有意识的来做一下。问题随之而来,code review都应该做些什么? 说起来,code review应该是从编码规范出发,发掘代码中存在的不符合编码规范的东西。但实际上,我们的编码规范中更多的是对编码格式和命名方法的要求,如果简单的来看编码格式,我觉得根本就是没有必要的,有个好的IDE,全部格式化一下,很容易就统一了。命名方法,虽然重要,但大家都编了一段时间的程序,一般不会只以a、b、c来命名吧! 这就是我的困惑所在,code review应该怎么做?code review的目的是为了提高软件产品的质量,如果仅仅做我上面提到的一些工作,似乎根本就与质量搭不上什么边。 请各位就自己所想,结合自己遇到的实际情况,谈谈如何做好code review? <淘宝热门商品:
 

 

哈喽嘟嘟-柠檬绿茶.心蓝t透0.双生儿香港平价店.

小小豆叮

软件开发的精益理念

精益生产是制造业领域的一大创举,而如果把精益生产的简单原则运用到软件开发上,我们称之为精益编程(Lean Programming)。有人预言,精益编程的效果可能与20世纪80年代精益生产所带来的生产改进一样重大。精益生产的10条简单原则对精益编程同样适用。实际上自适用软件开发及肯特·贝克的极限编程(Extreme Programming)中都运用了这些原则。 精益原则一:消除浪费 精益生产的第一个原则就是消除浪费。利用价值流分析可以发现流程中的所有活动,并能找出最终添加到产品中的价值,然后价值流分析会试图找到更为有效的方法去产生同一价值。 在软件开发过程中制作的文档、图表及模型是软件开发项目的一部分,但它们往往是消耗品,可以用来帮助系统的生产,但未必是最终产品。一旦系统交付,用户对这些中间过程的消耗品并不在乎。所以此类消耗品需要证明自己不仅能为最终产品增值,而且还是获得最终价值的最有效的方法。 精益原则二: 尽量减少冗余“库存” 库存太多会耗用资源、延长响应时间以及隐藏质量问题。软件开发的“库存”是指不属于最终产品的那些文档。分析一下就会发现,制作这类文档所花费的时间占据了产品周期的一大部分,而最大的浪费还是因为文档无法正确、全面地抓住用户需求而开发了不符合用户需求的系统。 我们知道用户很难依据文档去设想系统的细节;即使是在实际使用前,用户也不可能正确预测系统的运行;甚至在系统交付之后,用户还可能发现这并不是今后整个使用期间自己所期望的系统运行方式。而在评估文档的价值时,这些因素都必须考虑在内。 精益原则三: 缩短系统的响应时间 20世纪80年代,TQM(全面质量管理)原则教会我们如何在数小时而不是数天或数周之内完成产品生产;在传统软件开发需要几个月或几年时间的时候,电子商务项目往往能够在几周之内完成。 丹尼斯·弗雷利曾提议利用降低制造周期所用的技术来缩短软件开发周期。他建议充分利用“小批量”和“流畅流程”原则。 迭代开发基本上就是把这些原则运用到软件编程上。按照这种方法,在整个开发周期不断设计和交付小而完整的部分。迭代周期从几周到几个月不等,每个迭代阶段都涵盖从收集需求到验收测试的整个开发过程。 精益原则四:获取需求 延迟决策 制造行业过去常常认为,如果营销部分能够准确预测市场需求那该多好。但后来发现这种想法是不对的,相反,应该大大缩短系统的响应时间,以便系统能够对变化做出充分的反应,从而抛弃对预测的依赖。其实IBM目前所推广的E-Business On Demand正是出于这样的思路,而此前戴尔的成功也是与这个理念分不开的。 使需求保持灵活性,并尽可能贴近交付系统,将为软件开发提供更强的竞争优势。在软件开发的早期阶段敲定设计同样带有预测性,所以软件系统的设计应该随时捕获新的需求,并对变化做出响应。 精益原则五:满足客户需求 导致软件项目失败最常见的原因就是需求不全面或不正确,针对这种风险,软件开发商在继续设计系统之前,会尽量收集详细的用户需求,然后由用户确认。 但很多用户在确认需求文档时经常会拖拖拉拉,他们担心自己认可的项目到头来会是个错误,所以等待他们确认文档会浪费大量时间。从这个角度来说,获得用户的同意非但不能鼓励用户参与,反而会造成开发人员和用户之间的对立。 准确抓住用户需求的有效办法就是借助于迭代系统开发,及早开发核心特性并且通过每个迭代阶段的可用性演示获得客户反馈。 精益原则六:结合反馈 一次做好 当在生产线上发现劣质产品时,很多制造企业会对劣质品进行返工,但效果不佳。相反,如果在整个制造流程中运用测试和控制手段,确保每次移交时每个部件都是合格的,这样就很容易查明产品何时偏离了规格。 业界已经公认,软件交付后找到问题并修正的成本是早期设计阶段的100倍,所以企业需要在编写程序之前验证详细设计的合理性。当然软件的规格在不断变化,企业需要利用各种技术手段不断适应变化。 各种测试技术是整个开发过程中适应变化的最佳手段。另一种应对变化的技术就是再构,即通过受控的方式改进现有软件的设计,利用再构,初始设计可以专注于眼前的问题,以后再考虑将来的需求。 精益原则七:对员工下放权力 如果软件开发环境不如预期,主管的本能反应往往是实行更严格的流程,更加详细地明确员工如何完成任务。精益生产则建议采取截然相反的方法,如果开发出现了问题,不要引进外面的专家,而是为员工提供评估及改进各自领域的工具,给予员工足够的权力,最终自己解决问题。 跟精益生产一样,精益编程同样重视团队的协作。软件开发至少需要一次信息移交,即从用户到编程人员,但更多的时候不止一次,比如从用户到设计人员,再到编程人员。有观点认为,这类书面信息最好全部移交,但实际上在移交纸面信息时,会无形中丢失大量有效信息,而让小组成员协同工作则效率要高得多,同时还减少了文书工作。 精益原则八:取消局部优化 在过去,不让机器满负荷运作是难以接受的,但在精益生产中这却是合理的。 一些受过训练的项目经理会非常关注某些局部的管理,正如制造工人致力于尽量提高机器的生产效率一样。但精益编程是受时间和反馈的驱动,所以局部生产力的优化会削弱整个制造流程。在用户所处环境不断变化的今天,如果把局部优化放在非常重要的位置,那当用户需求发生变化时,所有优化工作都付之东流。 如果某个局部的功能有一定的框架限制,只要它不会拖延工期,就不必为它担心。 精益原则九:利用逐步采购 供应链并不是在今天才产生,让供应商相互竞争,保证以最低的成本获得原材料也是很常见的,但精益生产又一次改变了这种惯例。美国管理大师W·爱德华兹·戴明认为,与供应商基于信赖的关系创造了给双方公司带来最大效益的环境。 事实证明,减少供应商的数量,其合作关系具有更高的质量。长期的合作关系可以帮助企业改进产品设计及生产流程,而且几乎无需文书工作。 很多软件企业认识到,传统的软件开发合同造成了隐性浪费。而对软件用户来说,相对稳定的软件开发商可以专注于为用户提供更优秀的软件,并可在开发中尽可能迟地使需求稳定下来。 精益原则十:缔造精益文化 这个原则不用解释也一目了然,如今优秀的软件开发意味着能够不断适应变化。其实在类似CMM的模型中缺乏对变化迅速做出响应的灵活性。 从某种意义上来说,迭代项目环境成了运行环境,因为流程重复出现,就可以把流程改进技术从一个迭代阶段运用到另一个阶段。不过我们需要的不仅仅是涵盖某个项目的改进模型,只要学习现有的项目,就可以改进未来项目的性能。 到目前为止,精益生产的十大原则已经被普及到了多个行业,包括物流、客户服务、医疗保健、金融、建筑、软件等领域。 http://www2.ccw.com.cn/03/0312/b/0312b04_3.asp <淘宝热门商品:
 

¥:59.90 

天使之城外贸服装商行(童装/女装)【双皇冠网店 实体店同步】

双皇冠!韩国安卡米文静米色提花高领毛衣,专柜236元,140码

小小豆叮

让Web Start解决你的应用部署问题

部署一个应用到桌面是一件艰难而痛苦的事情,但是来自Sun的一个新的应用接口(API)使得这件事情变的简单了起来。这个新的技术就是Java Web Start,它解决了许多开发人员要经历的部署问题。 Web Start是一个图形界面(GUI)的应用程序,它位于JNLP(the Java Network Launching Protocol )的顶层。在部署一个新创建的应用到客户端之前,开发人员必须写一个JNLP配置文件。这个文件使用XML格式,包含了应用的信息,包括要求什么样的Java版本和到什么地方检出并下载最新版本。 下面是一个读/写CVS的GUI程序的JNLP文件的例子: <?xml version="1.0" encoding="utf-8"?> <!-- JNLP File for Csv --> <jnlp spec="1.0+" codebase="http://www.generationjava.com/jnlp" href="Csv.jnlp"> <information> <title>Csv Application</title> <vendor>GenerationJava</vendor> <homepage href="index.html"/> <description>Csv Spreadsheet</description> <description kind="short">Lets you view/modify CSVs. </description> <offline-allowed/> </information> <resources> <j2se version="1.2+"/> <jar href="Csv.jar"/> </resources> <application-desc main-class="com/generationjava/apps/csv/Csv"/> </jnlp> 在这段代码中,最重要的部分包括:标题,它将在应用安装时显示;J2SE的版本,这里1.2+意味着1.2或者以上版本;启动应用的主类;应用自身的jar。 Web服务器需要配置为以“application/x-java-jnlp-file”的形式返回JNLP文件。当用户点击例子连接http://www.generationjava.com/jnlp/Csv.jnlp的时候,Java Web Star将激活并且下载JNLP文件,进一步它会下载并运行必须的jar。下一次用户在线并且请求这个JNLP文件时,Web Start将检查是否存在新的版本并决定是更新还是启动当前版本。 JNLP应用在一个Java Applet类型的沙箱中运行并且必须被授予特定的访问权限,例如能够读/写文件系统。它是高度可配置的并且远比上面给出的简单例子强大。 Java Web Start和JNLP提供了一种简单的部署Java应用的方法。Apple的新的操作系统OS X对Java非常友好,预安装了Web Start,并且在Windows上的Web Start能填加Web应用到开始菜单中。可下载Java应用的开发者可以根据自己的部署需求考虑使用Java Start。 <淘宝热门商品:
 

218.00 元  

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

小小豆叮

Test of the Java Skill

Question 1: What will happen when you attempt to compile and run this code? class Base{ public final void amethod(){ System.out.println(“amethod”); } } public class Fin extends Base{ public static void main(String argv[]){ Base b = new Base(); b.amethod(); } } A. Compile time error indicating that a class with any final methods must be declared final itself B. Compile time error indicating that you cannot inherit from a class with final methods C. Run time error indicating that Base is not defined as final D. Success in compilation and output of “amethod” at run time Question 2: Given the following code what will be output? public class Pass{ static int j = 20; public static void main(String argv[]){ int i=10; Pass p = new Pass(); p.amethod(i); System.out.println(i); System.out.println(j); } public void amethod(int x){ x=x*2; j=j*2; } } A. Error: amethod parameter does not match variable B. 20 and 40 C. 10 and 40 D. 10 and 20 Question 3: What happens when you attempt to compile and run these two files in the same directory? // File P1.java package MyPackage; class P1{ void afancymethod(){ System.out.println(“what a fancy method”); } } // File P2.java public class P2 extends P1{ afancymethod(); } A. Both compile and P2 outputs “what a fancy method” when run B. Neither will compile C. Both compile but P2 has an error at run time D. P1 compiles cleanly but P2 has an error at compile time Question 4: Which statement declares a variable a which is suitable for referring to an array of 50 string objects? A. char a[][]; B. String a[]; C. String []a; D. Object a[50]; E. String a[50]; Question 5: Given the following declaration String s = "Example"; Which are legal code? A. s >>> = 3; B. s >> = 2; C. int i = s.length(); D. String t = "For " + s; E. s = s + 10; Question 6: What will happen when you compile and run the following code? public class Scope{ private int i; public static void main(String argv[]){ Scope s = new Scope(); s.amethod(); } public static void amethod(){ System.out.println(i); } } A. A value of 0 will be printed out B. Nothing will be printed out C. A compile time error D. A compile time error complaining of the scope of the variable i Question 7: What will happen when you attempt to compile and run this program? public class Outer{ public String name = “Outer”; public static void main(String argv[]){ Inner i = new Inner(); i.showName(); }//End of main private class Inner{ String name = new String(“Inner”); void showName(){ System.out.println(name); } }//End of Inner class } A. Compile and run with output of “Outer” B. Compile and run with output of “Inner” C. Compile time error because Inner is declared as private D. Compile time error because of the line creating the instance of Inner Question 8: What will be the result when you attempt to compile and run the following code? public class Conv{ public static void main(String argv[]){ Conv c = new Conv(); String s = new String(“ello”); c.amethod(s); } public void amethod(String s){ char c = ‘H’; c+=s; System.out.println(c); } } A. Compilation and output the String “Hello” B. Compilation and output the String “ello” C. Compilation and output the String “elloH” D. Compile time error Question 9: What code placed after the comment: // Start For loop would populate the elements of the array ia[] with values of the variables i ? public class Lin{ public static void main(String argv[]){ Lin l = new Lin(); l.amethod(); } public void amethod(){ int ia[] = new int[4]; // Start For loop { ia[i] = i; System.out.println(ia[i]); } } } A. for(int i=0; i
 

156.00 元  

消腩宝贝 快速瘦身 月减20斤

小小豆叮

用JFC/Swing将可访问性构建到Java应用中

Barry A. Feigenbaum,博士(feigenba@us.ibm.com) 高级 IT 咨询专家,IBM 2003 年 1 月 所有 Java 应用程序对于残疾人士都应该是可访问的。用 GUI 应用程序实现这一点时需要格外注意。本文向您展示了如何使用基于 JFC/Swing 的可访问性工具箱事半功倍地实现最高级别的可访问性。 大多数基于 GUI 的软件设计都基于这一假设:即用户可以清楚地看到屏幕并且可以有效地使用鼠标选择图形用户界面(GUI)上的选项。对于许多残疾人士,尤其是那些视力和运动控制受损的人,这个假设是有问题的。1998 年,美国康复法案(Rehabilitation Act)经过修改(请参阅侧栏的 508 条款),以确保残疾人可以访问政府使用的电子和信息技术产品。因此,许多 IT 企业已经开始采用可访问性指导原则作为其整个 GUI 设计标准的一部分。自从美国康复法案修正案通过以后,可访问性也成为商业软件设计中日益重要的问题,从而导致了 Java 平台的一些更改和添加。 详细请参看: http://www-900.ibm.com/developerWorks/cn/java/j-access/index.shtml <淘宝热门商品:
 

 

:◤╭ Shanghai 秀卡蒂╮╰女性健康購物中心 ╯◥◣瘦身╮減肥╮

小小豆叮

SWT:AWT和SWING的强大竞争者

从Java诞生至今,已经在太多的领域取得成功,然而它却很少在图形界面程序上崭露头角。究其原因,Java语言缺省的图形界面开发包AWT和SWING实在是难脱其究, 无论速度和外观,它们都难以让人接受。 如今,Eclipse组织编写的SWT开发包,为Java程序员提供了AWT和SWING之外的一个更佳的选择。在本文中,对SWT做了简单但尽可能全面的介绍。 Java语言的声望和它在桌面应用程序(GUI程序)所取得的成就显然极不相符,至今仍然很少能看到非常成功Java桌面程序。虽然有JBuilder,Netbean,JProbe等大型软件作为代表,但这仍不能证明Java的GUI程序是成功的:它们的外观总是和同一操作系统平台下的其它软件显得格格不入。对机器配置的需求也似乎永无止境,这使得它们只能被一些总是拥有当前最高性能PC的程序员们所容忍,或是那些不在乎金钱和时间的专业用户所接受。对绝大多数计算机使用者来说,AWT或SWING代表着怪异的界面和无法接受的速度。Standard Widget Toolkit(SWT)或许是Java这一噩梦的终结者,广大Java程序员终于可以开发出高效率的GUI程序,它们拥有标准的外观,几乎没有人能看出你的程序是用Java写出来的,更为重要的是,这些程序是跨平台的。 详细请参看: http://www-900.ibm.com/developerWorks/cn/java/l-swt/index.shtml <淘宝热门商品:
 

2.35 元  

露连泉百货超级市场

阿尔卑斯喜缘喜糖 全市最低价

小小豆叮

sendMail

/* 此篇僅介紹用javamail實現發送郵件功能,其中涉及smtp認證,郵件附件發送,及HTML內容郵件等。 其他有關多郵箱的實現,接收POP3郵件及IMAP等內容。 如下程式需要:javamail,JAF包,j2ee.jar包含了上述兩個包,建議大家安裝J2SDKEE或直接拷貝j2ee.jar,將其添加到jbuilder的library中, 或系統ClassPath中 */ /** * @author Haley haley_hj@163.com * @QQ:87823050 * @homepage:http://haley.yeah.net * @12/18/2002 */ import java.util.*; import javax.mail.*; import javax.mail.internet.*; import java.util.Date; import javax.activation.*; import java.io.*; public class sendMail { private MimeMessage mimeMsg; //MIME郵件物件 private Session session; //郵件會話物件 private Properties props; //系統屬性 private boolean needAuth = false; //smtp是否需要認證 private String username = ""; //smtp認證用戶名和密碼 private String password = ""; private Multipart mp; //Multipart物件,郵件內容,標題,附件等內容均添加到其中後再生成MimeMessage物件 public sendMail() { setSmtpHost("172.24.15.228");//指定郵件伺服器 createMimeMessage(); } public sendMail(String smtp){ setSmtpHost(smtp); createMimeMessage(); } /** * @param hostName String */ public void setSmtpHost(String hostName) { System.out.println("設置系統屬性:mail.smtp.host = "+hostName); if(props == null)props = System.getProperties(); //獲得系統屬性物件 props.put("mail.smtp.host",hostName); //設置SMTP主機 } /** * @return boolean */ public boolean createMimeMessage() { try{ System.out.println("準備獲取郵件會話對象!"); session = Session.getDefaultInstance(props,null); //獲得郵件會話對象 } catch(Exception e){ System.err.println("獲取郵件會話物件時發生錯誤!"+e); return false; } System.out.println("準備創建MIME郵件對象!"); try{ mimeMsg = new MimeMessage(session); //創建MIME郵件物件 mp = new MimeMultipart(); return true; } catch(Exception e){ System.err.println("創建MIME郵件物件失敗!"+e); return false; } } /** * @param need boolean */ public void setNeedAuth(boolean need) { System.out.println("設置smtp身份認證:mail.smtp.auth = "+need); if(props == null)props = System.getProperties(); if(need){ props.put("mail.smtp.auth","true"); }else{ props.put("mail.smtp.auth","false"); } } /** * @param name String * @param pass String */ public void setNamePass(String name,String pass) { username = name; password = pass; } /** * @param mailSubject String * @return boolean */ public boolean setSubject(String mailSubject) { System.out.println("設置郵件主題!"); try{ mimeMsg.setSubject(mailSubject); return true; } catch(Exception e) { System.err.println("設置郵件主題發生錯誤!"); return false; } } /** * @param mailBody String */ public boolean setBody(String mailBody) { try{ BodyPart bp = new MimeBodyPart(); bp.setContent("<meta http-equiv=Content-Type content=text/html; charset=gb2312>"+mailBody,"text/html;charset=GB2312"); mp.addBodyPart(bp); return true; } catch(Exception e){ System.err.println("設置郵件正文時發生錯誤!"+e); return false; } } /** * @param name String * @param pass String */ public boolean addFileAffix(String filename) { System.out.println("增加郵件附件:"+filename); try{ BodyPart bp = new MimeBodyPart(); FileDataSource fileds = new FileDataSource(filename); bp.setDataHandler(new DataHandler(fileds)); bp.setFileName(fileds.getName()); mp.addBodyPart(bp); return true; } catch(Exception e){ System.err.println("增加郵件附件:"+filename+"發生錯誤!"+e); return false; } } /** * @param name String * @param pass String */ public boolean setFrom(String from) { System.out.println("設置發信人!"); try{ mimeMsg.setFrom(new InternetAddress(from)); //設置發信人 return true; } catch(Exception e) { return false; } } /** * @param name String * @param pass String */ public boolean setTo(String to){ if(to == null)return false; try{ mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to)); return true; } catch(Exception e) { return false; } } /** * @param name String * @param pass String */ public boolean setCopyTo(String copyto) { if(copyto == null)return false; try{ mimeMsg.setRecipients(Message.RecipientType.CC,(Address[])InternetAddress.parse(copyto)); return true; } catch(Exception e) { return false; } } /** * @param name String * @param pass String */ public boolean sendout() { try{ mimeMsg.setContent(mp); mimeMsg.saveChanges(); System.out.println("正在發送郵件...."); Session mailSession = Session.getInstance(props,null); Transport transport = mailSession.getTransport("smtp"); transport.connect((String)props.get("mail.smtp.host"),username,password); transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO)); //transport.send(mimeMsg); System.out.println("發送郵件成功!"); transport.close(); return true; } catch(Exception e) { System.err.println("郵件發送失敗!"+e); return false; } } /** * Just do it as this */ public static void main(String[] args) { String mailbody = "<meta http-equiv=Content-Type content=text/html; charset=big5>"+ "<div align=center><a href=http://haley.yeah.net> Haley </a></div>"; sendMail themail = new sendMail("172.24.15.228"); themail.setNeedAuth(true); if(themail.setSubject("JavaMail") == false) return; if(themail.setBody(mailbody) == false) return; if(themail.setTo("haley@172.24.15.228") == false) return; if(themail.setFrom("haley@172.24.15.228") == false) return; if(themail.addFileAffix("c:\\sqlnet.log") == false) return; themail.setNamePass("haley","584520"); if(themail.sendout() == false) return; } } <淘宝热门商品:
 

110.00元  

动感娱乐中心(修身堂 减肥咖啡 瘦身咖啡 神奇咖啡)

小小豆叮

javaMail

小小豆叮

Java程序员(SCJP)和开发员(SCJD)认证

Java语言自1995年出现以来,以其良好的开发兼容性被越来越多的开发人员接受。许多高校学生也纷纷对Java “投怀送抱”,特别是即将毕业的大四学生,更对Java钟爱有佳。其中最受关注的就是Java程序员(SCJP)和开发员 <淘宝热门商品:
 

 

自然美人 红酒面膜及口碑护理产品

小小豆叮

关于JavaMail处理中文附件的问题

JavaMail能很好的支持中文,但在测试过程中发现使用JavaMail发带有中文文件名的 附件时,文件名是乱码,经测试与查看源文件发现,是在JavaMail包里的一个写邮件 的方法没有考虑国际化因素,对双字节或多字节的字符没有考虑。即在 com.sun.mail.util.LineOutputStream调用 com.sun.mail.util.ASCIIUtility.getBytes(String s); 此方法直接将字符串转化成字符然后转换成字节。其实在String类里的getBytes() 方法就直接可以按照系统缺省的编码正确转换成字节码。 解决方法:将com.sun.mail.util.LineOutputStream中调用ASCIIUtility.getBytes(String s); 方法的部分改为s.getBytes()解决了此问题。 用重新编译好的LineOutputStream.class文件替换javamail里的Com/sun/mail/util/LineOutputStream.class文件即可 <淘宝热门商品:
 

78.00 元 

印疤修复液 消除深浅痘印 改善凹凸疤痕

小小豆叮

揭开极端编程的神秘面纱:重访XP精华,第1部分

最流行的灵活方法称作极端编程(Extreme Programming),或简称 XP,但许多人并不真正了解它。对软件开发项目使用 XP 可以大大提高成功的机会。由 Roy Miller 撰写的这个新专栏从重访他受欢迎的文章“XP 精华”开始,将消除谣言和误解,帮助您理解 XP,并解释为什么它这么重要。 详细请见: http://www-900.ibm.com/developerWorks/cn/java/j-xp0813/index.shtml <淘宝热门商品:
 

¥:38.00 

[郭氏鞋坊旗下]四季兜外贸童鞋店

185黑黄 库存外贸 DISNEY/迪斯尼Tigger&pooh童休闲运动鞋 带闪灯

小小豆叮

SCJP:“菜鸟”也能玩Java

Java学习与SCJP认证 Java语言在1995年发布以来,因其具有简单性、健壮性、跨平台、面向对象等特点,受到程序员们的欢迎,经过这几年的迅速发展,现在已经成为和C++语言并列的主流开发语言。 Java语言的广泛使用,使得越来越多的人加入到Java语言的学习和应用中来。在不胜枚举的各种论坛、网站、BBS上,常常可以看到“菜鸟”、“新手”们的凄苦感叹,也可以看到“大牛”、“高手”们的真知灼见。笔者在某网站上看到的这篇文章,对Java学习历程的论述可谓精辟。 Java的学习,将经历如下三个境界,方能成为高手。 其一:语法级别。——“昨夜西风凋敝树,独上高楼,望断天涯路。” 熟悉Java编程结构、语法、I/O、多线程、文件流、数据库编程等,面向对象入门。需要时间:最多1个月。 其二:语义类库级别。——“衣带渐宽终不悔,为伊消得人憔悴。” 在实际项目中,对所学知识进行再熟悉,掌握面向对象、分布式编程等,精通Java类库。熟悉软件工程和基本的设计模式。需要时间:不定。 其三:思想级别。——“蓦然回首,那人却在,灯火阑珊处。” 体会到面向对象的精髓和软件工程的本质,在实际项目中体会和理解主要的设计模式,能把Java思想与软件工程无缝结合。需要时间:不定。 由此看来,虽然Java具有简单性特点,但真正学起来还有很长的路要走。令人快慰的是,“望断天涯路”的时间并不长,而且还有SCJP的认证培训资料可以帮忙。 从SCJP的考试大纲中不难看出,SCJP的认证内容已经超过了“语法级别”所涉及的内容。通过SCJP的学习,应该能够具备相应的编程能力。从参加培训的学员的角度看,在漫长的学习过程中,参加培训,可以减少自己的学习压力、加快学习进度;通过考试,获得SCJP的认证证书,既可以宣告某一学习历程的结束,同时,也让自己在应用和求职时有了一个能力的说明。这也许是它作为编程语言认证位列十大热门认证的主要原因吧。 谁适合参加SCJP认证? 笔者是Sun授权的T3培训教师,在培训授课的工作过程中发现,希望通过SCJP认证的学员大概有如下几类。 计算机相关专业的学生 由于各种原因,现在还有一些大学没有开设Java这门课。有的学校虽然开设了这门课,可是教师讲述的内容要么过于简单、要么过于偏向应用,对于SCJP认证的针对性不强,导致学生在准备SCJP考试的过程中感到困难。 没有学习过Java的计算机专业学生,可能已经学习过C语言或C++语言,具有了一些学习计算机语言的基本素质,但是要真正通过考试,或者考出高分来也不是一件容易的事。在准备考试的过程中,有一些人因为自己的英语能力不足(SCJP属于英文教材、英文考试),给自己的学习带来了更多的困难。 对于学习过Java的计算机专业的学生,在准备SCJP考试的过程中,也存在针对性和学习深度的问题。我在培训工作中,曾碰到多位大学里的Java授课老师来培训SCJP。他们明确表示,在他们的授课过程中,不可能像真正的SCJP培训一样把内容做非常详细的分析,甚至讲课的范围也不一定能够达到SCJP授课培训的程度。 IT从业人员 这部分人,大部分是从计算机专业的学生过渡而来。也存在学过或没有学过Java的问题。但无论如何,对于编程语言的学习能力和应用能力,比在校学生强些。有一部分人甚至已经做Java编程很长时间了,但还是希望能够通过SCJP的考试,一方面可以获得升职、加薪;另一方面是为了满足工作需要。 已经有些Java编程经验的人存在这样一种理解:我已经能够编写程序了,为什么还要通过SCJP的认证? 我们都熟知这样的诗句:“海上生明月,天涯共此时。”其实这十个字在我们小学二年级之前都已经学过了,可是经过很多年之后,我们仍然无法自己写出类似的文字组合来。因此,能编写程序,对于Java语言的理解,也许仅限于会写那十个字而已。而对于更深入的含义甚至艺术感觉还相去甚远。 当然,SCJP认证与“文字上的艺术感觉”还有很大的差距。可是它确实能够强化我们对于Java语言的理解,为以后能够写出有艺术感觉的程序,做好必要的准备工作。起码能够更加熟悉Java的语法和部分内嵌机制,从而减少在编程过程中犯下低级的语法错误和结构错误的次数,增加编程效率。 非IT业希望转行IT的人 现在,在IT行业,有一大部分非计算机相关专业的人员在做着非常专业的工作,比如做程序员、网络维护、网络管理等等。他们为什么要转行IT呢? A、IT业就业难度小 据相关报道,从去年起,IT业就业人员的薪资在连续9年的增长后,开始下降。尽管如此,IT业的就业需求依然非常旺盛,在一般的人才交流会上,IT业的展台都会占半数以上。大量的职位空缺,使非计算机相关专业的人员能够转行IT业成为可能。 另外,刚刚转行到IT业的员工,对于薪资要求通常较低。用人单位从生产成本的角度考虑,为转行的人们打开了大门。 B、投资与回报比大 大学毕业后从事一般传统行业的工作人员,一般薪资在2000元以下。相对来讲,IT业的工资水平诱人得多。仅通过SCJP认证,一般从业薪资也能达到甚至超过5000元。而且,这份投资的成本仅需2000多元、少于半年的时间。知识本无高低贵贱之分,但选择的道路不同,回报就相去甚远。 C、时机与学习周期适当 Java自1995年发布以来,经过了近7年的发展。据统计,全世界目前有200多万Java程序员。但Java技术的职位空缺依然相当大。并且,Java技术的发展远没有达到它的颠峰时期。现在学习Java,随着Java技术的成熟和发展不断完善自己,实现自身的增值,当是个不错的选择。 <淘宝热门商品:
 

¥:60.00 

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

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

小小豆叮

javamail发送邮件

/* 在java版经常看到有人问如何用javamail发送邮件?如何接收邮件?如何访问多个文件夹等。问题零散,而历史的回复早已经淹没在问题的海洋之中。 本人之前所做过一个java项目,其中包含有WebMail功能,当初为用java实现而对javamail摸索了一段时间,总算有点收获。看到论坛中的经常有此方面的问题,因此把我的一些经验帖出来,希望对大家有些帮助。 此篇仅介绍用javamail实现发送邮件功能,其中涉及smtp认证,邮件附件发送,及HTML内容邮件等。 其它有关多邮箱的实现,接收POP3邮件及IMAP等内容,将在后续文章中介绍。 如下程序需要:javamail,JAF包,j2ee.jar包含了上述两个包,建议大家安装J2SDKEE或直接拷贝j2ee.jar,将其添加到jbuilder的library中,或系统ClassPath中 */ package com.me.util.mail; /** * @author Zhangkun aistill@msn.com * @version 1.0 */ import java.util.*; import javax.mail.*; import javax.mail.internet.*; import java.util.Date; import javax.activation.*; import java.io.*; import com.me.util.*; public class sendMail { private MimeMessage mimeMsg; //MIME邮件对象 private Session session; //邮件会话对象 private Properties props; //系统属性 private boolean needAuth = false; //smtp是否需要认证 private String username = ""; //smtp认证用户名和密码 private String password = ""; private Multipart mp; //Multipart对象,邮件内容,标题,附件等内容均添加到其中后再生成MimeMessage对象 /** * */ public sendMail() { setSmtpHost(getConfig.mailHost);//如果没有指定邮件服务器,就从getConfig类中获取 createMimeMessage(); } public sendMail(String smtp){ setSmtpHost(smtp); createMimeMessage(); } /** * @param hostName String */ public void setSmtpHost(String hostName) { System.out.println("设置系统属性:mail.smtp.host = "+hostName); if(props == null)props = System.getProperties(); //获得系统属性对象 props.put("mail.smtp.host",hostName); //设置SMTP主机 } /** * @return boolean */ public boolean createMimeMessage() { try{ System.out.println("准备获取邮件会话对象!"); session = Session.getDefaultInstance(props,null); //获得邮件会话对象 } catch(Exception e){ System.err.println("获取邮件会话对象时发生错误!"+e); return false; } System.out.println("准备创建MIME邮件对象!"); try{ mimeMsg = new MimeMessage(session); //创建MIME邮件对象 mp = new MimeMultipart(); return true; } catch(Exception e){ System.err.println("创建MIME邮件对象失败!"+e); return false; } } /** * @param need boolean */ public void setNeedAuth(boolean need) { System.out.println("设置smtp身份认证:mail.smtp.auth = "+need); if(props == null)props = System.getProperties(); if(need){ props.put("mail.smtp.auth","true"); }else{ props.put("mail.smtp.auth","false"); } } /** * @param name String * @param pass String */ public void setNamePass(String name,String pass) { username = name; password = pass; } /** * @param mailSubject String * @return boolean */ public boolean setSubject(String mailSubject) { System.out.println("设置邮件主题!"); try{ mimeMsg.setSubject(mailSubject); return true; } catch(Exception e) { System.err.println("设置邮件主题发生错误!"); return false; } } /** * @param mailBody String */ public boolean setBody(String mailBody) { try{ BodyPart bp = new MimeBodyPart(); bp.setContent("<meta http-equiv=Content-Type content=text/html; charset=gb2312>"+mailBody,"text/html;charset=GB2312"); mp.addBodyPart(bp); return true; } catch(Exception e){ System.err.println("设置邮件正文时发生错误!"+e); return false; } } /** * @param name String * @param pass String */ public boolean addFileAffix(String filename) { System.out.println("增加邮件附件:"+filename); try{ BodyPart bp = new MimeBodyPart(); FileDataSource fileds = new FileDataSource(filename); bp.setDataHandler(new DataHandler(fileds)); bp.setFileName(fileds.getName()); mp.addBodyPart(bp); return true; } catch(Exception e){ System.err.println("增加邮件附件:"+filename+"发生错误!"+e); return false; } } /** * @param name String * @param pass String */ public boolean setFrom(String from) { System.out.println("设置发信人!"); try{ mimeMsg.setFrom(new InternetAddress(from)); //设置发信人 return true; } catch(Exception e) { return false; } } /** * @param name String * @param pass String */ public boolean setTo(String to){ if(to == null)return false; try{ mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to)); return true; } catch(Exception e) { return false; } } /** * @param name String * @param pass String */ public boolean setCopyTo(String copyto) { if(copyto == null)return false; try{ mimeMsg.setRecipients(Message.RecipientType.CC,(Address[])InternetAddress.parse(copyto)); return true; } catch(Exception e) { return false; } } /** * @param name String * @param pass String */ public boolean sendout() { try{ mimeMsg.setContent(mp); mimeMsg.saveChanges(); System.out.println("正在发送邮件...."); Session mailSession = Session.getInstance(props,null); Transport transport = mailSession.getTransport("smtp"); transport.connect((String)props.get("mail.smtp.host"),username,password); transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO)); //transport.send(mimeMsg); System.out.println("发送邮件成功!"); transport.close(); return true; } catch(Exception e) { System.err.println("邮件发送失败!"+e); return false; } } /** * Just do it as this */ public static void main(String[] args) { String mailbody = "<meta http-equiv=Content-Type content=text/html; charset=gb2312>"+ "<div align=center><a href=http://www.csdn.net> csdn </a></div>"; sendMail themail = new sendMail("smtp.msn.com"); themail.setNeedAuth(true); if(themail.setSubject("标题") == false) return; if(themail.setBody(mailbody) == false) return; if(themail.setTo("gates@msn.com") == false) return; if(themail.setFrom("bill@msn.com") == false) return; if(themail.addFileAffix("c:\\boot.ini") == false) return; themail.setNamePass("user","password"); if(themail.sendout() == false) return; } } <淘宝热门商品:
 

198.00 元 

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

小小豆叮