设计你的JDBC代码

Simon Brunning 刚发表了一篇有关如何设计DAO代码的建议一文后,Bob Lee 继续这一话题进一步阐述己见,他使用command模式处理JDBC逻辑进一步拓展了Simon 的方案,他展示了这种代码如何工作,并使用HSQLDB 为测试实例(可以时时进行unit test)... http://weblogs.java.net/pub/wlg/1065 <淘宝热门商品:
 

 

徽商联盟】皇冠信誉店 联盟化妆品の屋

 

35.00 元 

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


来源:程序员网

小小豆叮

Tomcat 和IIS集成的性能调整

本文旨在介绍当使用IIS和tomcat集成时的一些调整技巧,由于IIS 是native的代码实现会比Tomcat的处理速度快,本文针对单个server和多虚拟主机的配置分别给出了调整方案... http://www.developer.com/java/other/article.php/3320281 <淘宝热门商品:
 

毛毛爱吃桔子  

毛毛爱吃桔子

 

 

皇冠舒友阁 顶级特效美容护肤 效果才是硬道理


来源:程序员网

小小豆叮

将脚本语言加进你的程序中

Toyokazu Tomatsu 最近发表了一篇名为"Embedding APIs for Java Scripting Engines"的文章,文中主要介绍了如何把六种脚本语言Jacl (Tcl), Jython (Python), Rhino (Javascript), Groovy, Beanshell 和 Pnuts整合到你应用中的方法,以7个主要的编程情况为例,他们是 1.从String中读值并计算 2.从Stream中执行脚本 3.捕获由脚本报出的异常 4.对变量进行非解析的get/set操作 5.调用方法 6.解析脚本 7.编译脚本 http://pnuts.org/~tomatsu/embedding.html <淘宝热门商品:
 

4.60 元  

旺智通讯手机配件商城-----诚邀各地商家加盟合作(可代发货)

皇冠推荐 特卖 诺基亚原装二手BL-5C电池 型号BL5C

 

218.00 元  

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


来源:程序员网

小小豆叮

谁还在使用EJB?

在JavaLobby论坛中,Seymour Cakes 提出这样一个问题:"现在J2EE1.4也发布了,其中就又EJB2.1,Ejb3.0也在研究之中,但大家现在讨论更多地却是AOP,Servlets & JSP MVC,在持久层大家研究的更多的是象Hibernate ,Spring Framework等JDO的实现,是不是EJB 已经快淘汰了 而后引出的了不少有关EJB是否需要的一系列精彩讨论: http://www.javalobby.org/thread.jspa?forumID=61&threadID=11754 <淘宝热门商品:
 

215.00 元  

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

 

 

糊涂乖宝☆电子城


来源:程序员网

小小豆叮

“Java之父”:微软太过商业

IT大公司很少攻击对手,Sun是个例外,继其CEO年初在北京痛斥过微软以后,“Java之父”詹姆斯.戈士林昨日又在京指责微软总是企图左右市场。 “Java之父”,这个头衔对普通人来说毫无触动,但 对昨天全国Java技术大会上的数百名程序员来说,这位有点像艺术家的老“同志”绝对堪称偶像。 Java技术被列为当今世界信息技术的三大要点之一,并是全球第一大通用开发平台,有数百万开发商在这个平台上开发自己的软件。除了导弹发射,Java几乎应用在信息设备的各个层面,全球仅已发货的Java手机就达到了1.2亿部。 詹姆斯.戈士林此次访华,受到国内不少厂商的欢迎,由于Java开放源代码,是最典型的开放性技术,国内软件业希望能靠它促进民族产业的成长。一个最好的例子是:尽管Sun是Java的发明者,但IBM、BEA等软件巨头如今都靠Java赚了大钱。 “Java之父”来京显然也有Sun的商业利益。不久前,中国联通刚和Sun结成了技术联盟,Sun渴望在中国这个最大的手机市场普及Java应用,最起码,要能与采用微软技术的“智能手机”抗衡。 但这没妨碍詹姆斯去指责微软“太过商业”,他昨天利用一切机会指摘微软的不是。“微软用了很大力气,让大家在桌面上看不到Java,但这将无损Java的成功,”詹姆斯表示,“商业上有两个逻辑:一种是做个小馅饼,自己吃掉大部分;一种是将饼做大,自己只吃一小部分。我认为,后者会更有前途,这也就是为什么Sun很乐于看到IBM、BEA等成为对手,而微软则总是企图垄断与左右市场。” <淘宝热门商品:
 

网络游戏点卡 

网游点卡武汉移动话费自动充专卖店

 

110.00元  

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


来源:程序员网

小小豆叮

MVC的异教徒:SQLTags

MVC现在是web应用的热门话题,本文作者Steve A. Olson 却介绍了一种直接在JSP中嵌套SQLTags进行逻辑数据处理的方法,把原来倡导的逻辑和表现分离的想法又推翻了,其实这种单一化"整合"也是为了适应一些规模稍小和快速开发的应用... http://www.onjava.com/pub/a/onjava/2004/03/03/sqltags.html <淘宝热门商品:
 

42.00 元  

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

 

120.00 元  

上万淘友使用推荐、修复红血丝、敏感、痘印(全国总代)


来源:程序员网

小小豆叮

使用servlet技术控制客户端访问缓存

作为servlet filter技术系列文章的一篇,本文主要分析了使用filter 来修改HTTP response header来影响客户浏览器缓存的技术,虽然client端的缓存和server端的缓存对访问的影响程度不一,但在某些情况下它还是个外地重要... http://www.onjava.com/pub/a/onjava/2004/03/03/filters.html <淘宝热门商品:
 

¥:1880.00 

正和宜时尚保健品 托玛琳颈肩腰膝腿护理 减肥产品-有礼品-快!

托玛琳电气石锗石玉石双温双控保健床垫 双人

 

 

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


来源:程序员网

小小豆叮

手机游戏趋势和相关J2ME APIs

概要 手机游戏成绩斐然,成为IT产业中增长最快的部分之一。在本文中,作者 Michael Yuan 为Java开发者着力分析了这个令人激动的新市场的特征和当前形势。Java 2 平台,微型版(J2ME)是用于新一代多玩家手机游戏的主要技术平台。在本文的后半部分,作者Michael 还概观了J2ME 世界里与游戏相关的最新的技术创新和最新的APIs。 纵观IT产业的历史,计算机游戏已经成为技术创新背后的动力之一。计算机游戏者渴望更加强大的硬件计算能力;渴望不受不同的软件的限制——无论是将图形强制在人工智能(AI)上 还是网络安全性。游戏开发者和玩家常常是前沿计算机技术的最早的采用者。由于他们的创新天性,游戏不再是由大型采购公司控制的技术产品——游戏领域总是有充足的空间给那些在这方面有天分的单个创新者。 随着技术对游戏经验的促进,游戏市场持续增长。商业IT革命为我们节省了时间和金钱,从而提高了我们的工作水平,我们因此花费更多的时间和金钱在游戏上,来改善生活的整体质量。甚至在当今困难的经济时代,游戏仍保持快速增长,他仍然是盈利行业的组成部分。Java开发者应该注意到这里蕴藏着的巨大的商机。 作为IT产业的剩余部分,游戏行业中最新的热点就是可移动性。手机游戏将来自传统商业公司(如Sun Microsystems 的新游戏区)、设备生产厂(如:Nokia的 N-Gage 和Qualcomm的 Brew 设备)、和网络经营者(如Vodafone 的内容服务)的那些原本不可能在一起的商家拉到了一起。 作为Java开发者,我们很适合进入这个可盈利的新行业部分因为Java 2 平台,微型版(J2ME)是最广泛支持手机游戏的平台之一。在本文中,我将站在Java 开发者的角度来讨论手机游戏的商机和面临的挑战。我也将概观重要的J2ME 规范中的艺术级的移动Java 技术。 手机游戏特征 手机游戏的盈利主要是由于它们的涉及面很广。手机已经与现代生活方式紧紧地结合在一起。他们是最普遍携带的个人用品中仅次于钥匙和钱包的东西。传统的台式机游戏将目标锁定在低级趣味的人和青少年身上,而手机游戏则每个人都可以访问的到——随时,随地。尽管每个手机游戏都不贵,但是巨大的使用量(如:每人每星期一个新游戏)将使得这个市场商机无限并且有利可图。但是,对于开发者来说,将控制台游戏迁移到手机游戏工程很大因为他们所面向的对象、生活方式和分布式模型都有着极大的区别。让我们从手机游戏的需求谈起吧。 需求 一个成功的手机游戏大多具有以下特征: ·易于学习: 既然手机游戏面向的是普通消费者而不是计算机高手,那么他们不可能深入的学习游戏技巧。消费者不会花几个小时去研究一个3美元的手动操作的游戏。所以游戏必须是一下载就可以玩的。保持游戏的简单是最基本的要求。 ·可中断性: 多任务处理是手机生活方式的基本特征。手机用户常常在任务(如等一个电子邮件或者等车)之间有一小段时间。而游戏、日历管理、通讯和工作数据访问使用的是同一个设备。所以一个好的手机游戏应该提供短时间的娱乐功能,并且允许用户在游戏和工作模式之间顺利切换。 ·基于订阅:手机游戏的盈利成功取决于他们巨大的使用量。一开始开发和设计每个游戏都是昂贵的。如果一个手机游戏开发者要赚钱的话,重要的是:同一个游戏引擎,多个标题,基本的故事情节类似。基于订阅的游戏是不断产生收入的最好方法。 ·丰富的社会交互: 不管一个游戏设计得多好,只要玩家找到了它的根本模式或者玩完了所有的游戏路径很快就会厌烦这个游戏。对于一个基于订阅的游戏,重要的是与别的玩家合作以增强所玩游戏的智力和随机性。在今天纷繁复杂的多玩家游戏中具有丰富社会交互的游戏证明是成功的。 ·利用手机技术的优点: 巨额的手机技术研发费用都花在提高设备和网络的可用性和可靠性上面。因此,手机设备硬件和网络协议与桌面/控制台世界(如全球定位系统(GPS)扩展、条形码扫描仪、和短消息服务(SMS)/多媒体信息服务(MMS)通讯)有着非常大的差别。好的手机游戏应该利用那些更新的设备特征和网络基础设备的优点。 ·无违法内容:既然所有年龄/性别的人群都玩手机游戏并且常常在公共/工作场合,你应该避免明显的暴力或者色情内容。 手机游戏的类型 基于以上标准,最有可能成功的手机游戏就是那些临时小游戏,它可为广泛的玩家在所有的社交场合提供娱乐。特别是,下列类型的游戏将是明天最具有杀伤力的游戏: ·多玩家游戏: 这些游戏可以提供手机访问以便建立在线游戏团体。或者,他们利用手机专有特征如多媒体通讯和基于位置的服务,从而创建完全不同的社会结构。好的游戏设计和管理是这种类型游戏成功的关键。 ·基于内容的游戏:这些游戏传送版权的多媒体内容,如名人的图片、视频片断、音频立体声、和私人的体育节目,给那些音乐/电影/体育迷们。它成功的关键就是提供值得订阅的高品质的内容流。 ·高冲击的视频游戏:PC 和台式游戏已经从2D 进化到3D。手机游戏也会遵循这种趋势。现在已经出现手机3D工具箱和听筒。但是,3D是非常资源集中型的。他们要求开发者和图形设计者都是专家级的。专业的商店最有可能开发这些游戏。 在手机游戏的早期,大多数开发者都是想要玩转设备、学习技巧和快速攻关的狂热分子。但是,随着更多的开发者加入这个行业,手机游戏已经进化成涉及到专业设计师、构造师、开发者、产品经销商、律师、和艺术家在内的主导产品。这是行业走向成熟的必然趋势。尽管在某人的业余时间内要开发和推销简单的游戏更加困难,但是更多的专业商店将为许多人提供更多的就业机会。 手机的价值链 要完全理解手机游戏的前景,你必须理解资金是如何流动的。这种商业的价值链与传统游戏或者企业应用有着相当大的区别: ·开发者: 软件开发者通过创建伟大的应用驱动价值链。但是,大多数的开发者没有能力来处理巨大的营销问题。他们也缺乏到达消费者的分布式渠道。 ·发行商: 游戏发行商收集来自开发者的论题。他们建立商标名,确保游戏的技术正确性,将游戏升级,并且建立与无线通信公司的商业关系。他们还站在开发者的立场上处理账目问题。并且它们一般都是与开发者共享收益。 ·无线通信公司: 无线通信公司是手机游戏分布渠道的中心。通信公司不仅仅控制网络而且拥有客户信息。等于是他们决定支持哪种设备和服务。通信公司在全部收益中拿大头。他们也通过现有的服务协议向客户收款。 ·无线设备制造商:设备生产商驱动技术更新。他们制造新的硬件并且支持开发平台。实际上,J2ME的成功主要归功于主要设备制造商对它的采用。设备制造商是通信公司和消费者之间的一股独立的势力。 ·消费者: 消费者最终为成本和链中所有提供者的利润付款。消费者可从发行商的网站上购买游戏或者通过通信公司提供的内容供应系统购买游戏。 J2ME智能客户端 J2ME平台被认为是最杰出的手机游戏平台,它为开发者、设备制造商、网络通信公司和消费者广泛接受。它有一些非常重要的特征对所有组织都有益。 智能客户端的特征 J2ME 设备是智能的。他们可在自身上处理信息。区别J2ME智能手机与前几代手机最重要的特征有: ·对于用户来说,智能手机最吸引人的特征就是不总是处于网络连接状态也能玩游戏。在线模式在今天的2-2.5G 网络中是必要的。但是在该网络中,覆盖很少,而且数据通信昂贵。将数据和请求网络操作缓存到事务处理中也可显著的减少无线网络的使用并且提供应用的可靠性。 ·智能客户端可以使用不同的协议将后台的游戏服务器及其同位体(包括无线同位体和因特网同位体)集成。 ·智能客户端支持对视觉高冲击游戏至关重要的丰富的用户界面(UI)。 ·智能客户端可以访问手机专用网络(如SMS和MMS)或者设备扩展(如GPS)特征。这使得开发完全利用手机生活方式的优点的游戏成为可能。 ·智能客户端通过高级加密和数字签名算法提供更强大、更灵活的安全性。有了智能客户端,我们有可能在因特网上传递感性的私人数据以及建立有效的在线社会。 便携式平台 相对其他智能客户端平台而言,J2ME有一个独特的优点:它是专为手机设计的。J2ME应用可运行在不同投资商的不同设备上。这在高度竞争性的手机设备行业中是特别重要的,因为存在大量的不同设备。所有主要的智能手机制造商都承认支持J2ME平台。代码的可携带性对于那些想要维持单一代码库的消费者的数目不断扩大的开发者来说是至关重要的。 J2ME解决了“最低公共统治者”的问题,这个问题以前一直困扰着桌面Java。J2ME通过定义一个包括配置、配置文件和可选软件包在内的多层结构解决了这个问题。迄今为止,在手机游戏行业中,最流行的J2ME平台是手机平台设备配置文件(MIDP)和在MIDP之上建立的可选软件包。在本文中,我重点讨论MIDP V2平台。 因为J2ME应用在不同设备上都是便携式的,他们常常可在网络上下载和执行。如果没有正确的防范,它则为用户和无线通信公司冒着无数个安全的风险。幸运的是,Java被设计成一种安全的语言。所有字节码应用在执行之前都要校验;JVM在执行过程中监督应用的安全性和存储违反问题。MIDP v2 运行时间包括一个完全特征化的、基于域的安全管理员,它在应用的数字签名者鉴别的基础上赋予应用API级许可。 由于J2ME的广泛使用,手机Java开发者已经成长为一个相当大的市场。几乎所有流行的Java开发工具都已经改造得适合于J2ME开发者的需要。来自第三组织提供者的J2ME库和组件容易得到。那些库中的许多库提供针对于它们的Java2平台标准版(J2SE)对应物的类似的特征。例如:IBM服务管理框架(SMF)支持PDAs 上的Java servlets; PointBase 微型版提供的用于手机相关数据库的方法类似于Java数据库连接(JDBC)的方法; IAIK JCE-ME支持Java密码技术扩展(JCE)的轻型版。这些工具和库使得J2SE 开发者移植技术到手机行业中比较容易。相应的,他也为J2ME投资商提供了大量的开发者来源。这种良性循环将有助于J2ME的成长。 APIs和工具的概观 接下来的部分,我将概观J2ME与游戏相关的API并且测试他们提供给开发者的功能。 用户界面 MIDP 运行时间提供了对手机设备的屏幕和硬件键的细粒度控制。所有的MIDP UI类都是从 javax.microedition.Displayable接口上继承而来: ·Screen类是用于高级小器件如Alert, List, Form, 和 TextBox的基础。MIDP 运行时间控制如何显示那些高级UI类以及如何在特殊设备的UI惯例的基础之上安排功能键。MIDP 高级UI小器件最适合用于文本控制。在高级UI 类中,Form 类是最灵活的。你可以指定 Form屏幕的布局并且可以给它添加一些东西如:StringItem, TextField, DateField, ChoiceGroup, 和 Gauge。 MIDP v2 规范将两个重要的创新带进了高级UI中:首先,它引入Spacer 和ImageItem 项,从而允许同一个Form 上的混合文本和图像显示;其次,他引入CustomItem 类,从而为开发者提供了设计和实现自己的项级别的窗口小器件的机制。开发者对CustomItem 对象,包括像素级别的绘画和内部事件处理在内,拥有最终控制权。 ·Canvas类是低级别MIDP UI的基础。它提供对在整个屏幕之上的像素级绘画的访问以及对用于所有硬件键的自定义映射的访问。你可以只创建Canvas的子类并且跳过用于显示逻辑的paint()方法;用于键事件的 keyPressed(), keyRepeated(), 和keyReleased()方法;以及用于每个事件中指示器和触摸屏的pointerPressed(), pointerDragged()和 pointerReleased()方法。 ·GameCanvas 类继承于Canvas类。他是MIDP v2 游戏API的一部分并且为游戏开发提供了便利机制。例如:在GameCanvas子类中,每次你修改时不需要跳过paint() 方法就可以描绘整个屏幕。你可直接从getGraphics()方法中得到Graphics 对象并且在该对象上绘图。当你需要更新显示时,你可以调用flushGraphics()方法。但是 你使用flushGraphics()方法只可以更新屏幕的一部分。相比Canvas 类的单一方法而言,GameCanvas类使得我们易于保持图形状态,易于迅速更新屏幕的动画部分。类似的, GameCanvas 类使用和Canvas 类中回叫方法相反的getKeyStates()方法,为获得键状态提供了一个便利的途径。这使得复杂游戏屏幕类中的执行流动性要灵活的多。 MIDP v2规范为 javax.microedition.lcdui.game 软件包中的游戏应用程序定义了一个完整的API。除了GameCanvas类之外,他还提供了支持平铺或者动画游戏背景图片的Layer 类。游戏API也提供了处理动画图片和冲突的Sprite类。他们是2D图形游戏中的基本组件。在3D前沿,Java规范请求(JSR) 184 试图标准化手机上的Java 3D API 。它做出了极好的改进。开发者和艺术家需要的J2ME 3D工具现在在SuperScape (见 Resources)中可以得到。大型设备制造商在他们的高端智能手机设备上迅速的转变,以支持这种新API。 Figure 4. Java 3D games available from SuperScape 除了标准的MIDP UI 和游戏APIs之外,也存在几种其它的MIDP UI工具箱。他们要么提供设备的专有功能,要么旨在支持更好的可促进游戏开发的高级UI: ·Nokia UI 软件包提供对Nokia 手机上的声音、亮度和振动组件的控制。它也支持用于更加专业级的游戏的全屏模式。 ·Motorola 轻型小器件工具箱(LWT) 是一个独立的用于Motorola 手机的窗口工具箱。 ·Nextel Open Windowing Toolkit (OWT)是Motorola和Nextel联合开发的开源工具箱。 它运转一个容器模型来控制布局和其他UI组件,这是桌面UI开发者所熟悉的。OWT基于Canvas类并且运行在所有的MIDP手机上。但是,如果你使用OWT库,你必须将它包括在你的分布式MIDlet组中。 ·Synclast UI 项目开发了一个支持容器模型的开源UI软件包。在MIDP v1 Canvas 类的基础上,他支持许多MIDP v2小器件。因此,它允许MIDP v2应用做一点小小的修改之后运行在今天的MIDP v1设备上。有了OWT,你必须将Synclast库捆绑在分布式应用中。 总的来说,MIDP平台为丰富的UI游戏提供了多种选择。 网络和后台集成 正如我前面提到的一样,手机游戏的未来就是联网的多玩家游戏。J2ME中的联网可通过一般连接框架(GCF)来获得支持。GCF的核心就是工厂类 javax.microedition.io.Connector。你可以传递一个协议和地址字符串到静态方法Connector.open()上,以便获得到远程主机上的连接对象: ·HTTP协议支持在MIDP中是强制性的。如果你传递http://hostname:port 连接字符串给Connector.open()方法,则返回 HttpConnection对象。你可以直接打开连接上的输入/输出数据流并且编写/接收到远程主机/来自远程主机的数据。 ·Unix插座,用户自寻址协议(UDP) 连接、或者直接TCP/IP连接在某些实现中也得到支持。但是,你应该注意到手机网络与有线因特网有着根本区别。有些网络在HTTP层的开头模拟插座连接。所以,直接插座没必要出现在性能增加上。对于多数场合我推荐使用HTTP。 ·J2ME无线通讯API (WMA)支持GCF中手提设备之间的SMS通讯。你可以通过sms://phone_number:port获得的MessageConnection对象发送SMS信息 给另一个手机。你也可以打开一个“服务器” 连接,该连接可使用sms://port 字符串听取到来的SMS信息。到来的SMS信息可以同步处理也可以异步护理。 ·在 MIDP v2中,“服务器”SMS 连接可使用J2ME运行时间管理的推动注册进行注册。它允许开发者调用某个信息到达者之上的信息处理MIDlet。 在协议级别之上,J2ME支持传递结构化应用数据的几种方法: ·MIDP DataInputStream和 DataOutputStream 类支持 Java的便利 I/O 方法 (如 writeInt(), writeUTF(), writeFully()等等以及相应的readXXX()方法)(非)串行化普通的数据值和对象。在通讯通道的两边都使用成对的writeXXX() 和readXXX()方法可大大的简化开发者的工作并且增加终端对终端应用的强度。 ·如果你需要更多结构化的数据交换的话,MIDP平台也支持几种XML解析器。XML 解析器支持用于XML(SAX)、XmlPull 、和解析范例的轻型文档对象模型(DOM)的简单API(SI)。JSR 172 (J2ME Web 服务规范)正在开发一种用于J2ME的标准XML解析器API。 ·基于简单对象访问协议(SOAP)的Web服务是未来终端对终端的集成模式。J2ME 平台设置得很好,可通过第三组织工具箱如kSOAP (见Resources)以及标准API如JSR 172来支持SOAP信息交换。 数据管理 在设备上的数据管理是智能客户端游戏中的核心特征。J2ME强烈支持该领域: ·MIDP 上的标准数据持久性设备就是记录存储管理系统(RMS)。RMS 存储线性记录中的二进制数据(字节排列)。它不允许随机存储也不支持任何分层的数据结构。但是它提供搜索存储和对搜索结果排序的限制性功能。RMS在所有MIDP设备中是强制性的。它对于大多数用途来说已经足够了。但是,MIDP自身并不提供使用后台应用程序同步RMS数据的API。JSR 230 (数据同步API)刚刚起步开发这种同步的API。 ·JSR 75 (用于J2ME的PDA可选软件包)提供对设备本地的协议独立多点传送(PIM)应用(如:日历、地址薄、电子信函和任务列表)和文件系统的访问。 PIM 数据和文件可通过设备的本地同步设备组同步到台式计算机上。 ·至于更加复杂的数据,你可以使用手机数据库。几种商用MIDP数据库(包括相关数据库和面向对象的数据库)和同步引擎在MIDP平台上都可以得到(见 "High-Availability Mobile Applications" (JavaWorld, June 2003))。 多媒体 多媒体重放功能在内容驱动的手机娱乐应用中至关重要。J2ME 多媒体 API (JSR 135) 是J2ME中用于播放多媒体内容的标准框架。通过Player接口,它可播放来自多种数据源的多种音频和视频格式。在运行时间内传递给玩家的多用途的网际邮件扩充协议(MIME)类型 可指定内容格式。多媒体API的每种设备实现都支持依赖于硬件和本地玩家功能的一组不同的MIME类型。目前,几乎所有的与多媒体API兼容的设备都支持简单的立体声回放。 对更加成熟的格式如MP3音频和3GPP视频甚至是MPEG4视频的支持也快要出来了。 安全性 手机游戏涉及到可下载的代码、版权内容和财务往来。安全性对于维护用户、开发者、发行商和通讯公司的利益都至关重要。在多玩家游戏中有些用户试图通过炸开安全性的突破口攻进系统,这时安全性显得尤为重要。J2ME 对应用程序和通讯两者的安全性都提供了极好的支持: ·MIDP v2 规范支持使用开发者或者发行人的数字证明书的应用程序标记。基于签名者的鉴定(安全性领域),运行时间安全性管理者可赋予应用程序API级的访问权。例如,来源信任度较小的应用不允许实现网络连接或者发送SMS信息。 ·MIDP v2 规范也要求支持所有手机上的HTTP。这为因特网上的安全信息交换提供了基础。 · 如果基于连接的HTTP对于某些应用来说仍然不够灵活,许多第三组织的密码技术软件包在MIDP平台上也有 (见"Data Security in Mobile Java Applications" (JavaWorld, December 2002))。它们允许信息二进制片断的加密或者签名。 ·JSR 177 (用于J2ME的安全性和信任 API) 是标准化到被嵌入设备中的硬件安全单元(如订户识别模块(SIM)卡)的访问。例如:它允许J2ME开发者检索存储在SIM卡上的数字证明书或者使用加速硬件的加密算法。 供应和营销 手机游戏传送到消费者手中是一个涉及许多组织的复杂过程。MIDP 规范包括有关over-the-air (OTA) 供应的部分。它描绘了如何在无线应用协议(WAP)网络之上下载MIDP游戏,以及Java应用管理软件(AMS)应该如何安装应用程序并且使他为用户所用。 OTA过程为客户端设备报告安装状态给服务器提供了一个反馈机制。它为更加复杂的商业配置过程提供了技术基础。在商业领域内,你应该考虑以下几个重要的附加过程: ·应用必须被鉴定为防病毒状态并且放进通信公司支持的目录内。 ·不同客户端设备应同时提供不同的JAR文件,该文件可最大化使用设备的功能(图形和安装的可选软件包)。 ·客户的付款和给开发者的付款必须无缝处理。直接点击的手机内的付款系统是特别重要的。 几个商业供应方案对于通信公司和发行商来说已经可行。JSR 124 (Java 2 平台企业版 (J2EE)客户端供应规范)试图通过为客户端配置定义一个通用的J2EE框架来标准化那些方案。用于不同OTA规范、客户跟踪模式和付款服务的插入程序已经得到开发和设计,并可在框架内同时工作。这种成就对于J2ME游戏的商业成功也是非常关键的。 运行游戏 在本文中,我阐释了为什么带有随机内容的多玩家手机游戏是游戏行业的未来。手机设备制造商也看到了这个巨大的商机并且已经推动设备专为手机游戏而设计(如 Nokia N-Gage). J2ME/MIDP 是用于那些手机游戏设备和智能手机的最重要的技术平台之一。在读完全文后,你应该理解手机游戏中J2ME的优势和弱点。另外,我还介绍了MIDP V2中与游戏相关的关键性的技术革新以及它的可选软件包。 关于作者 Michael Yuan 著有Enterprise J2ME一书。他频繁的在J2ME、J2EE和手机企业应用方面写稿和演讲。目前,他领导一群人为Nokia开发平台建立应用蓝图系列。 本文译自:http://www.javaworld.com/javaworld/jw-11-2003/jw-1107-wireless.html? <淘宝热门商品:
 

205.00 元  

东菱小熊贝尔莱德艾美特(面包机酸奶机挂烫机电暖器礼品小家电)

双皇冠,产地代理『艾美特暖风机HP2009』2000W功率,浴居两用

 

 

【广州商盟】意外金喜服装◎抵制暴利低价有好货◎收藏小店有惊喜


来源:程序员网

小小豆叮

使用本地代码设计跨平台的Java UI代码

你可以编写跨平台Java UI代码,比如Swing,但它们却不能向本地的图形界面代码那样快速的运行,这一直是Java程序员头疼的地方,本文中,程序员Vladimir Silva 分享了他这方面的经验,你将会从中学习到使用JNI来调用SLIK接口(一种在windows和unix平台下的C语言本地图形接口)的解决方案 http://www-106.ibm.com/developerworks/library/j-slik/ <淘宝热门商品:
 

68.00 元  

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

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

 

 

【广州商盟】意外金喜服装◎抵制暴利低价有好货◎收藏小店有惊喜


来源:程序员网

小小豆叮

Java也要植入.NET

2月17日消息称,在美国亚利桑那州Scottsdale举行的针对新商业软件的DEMOIT精品展上,许多新产品争奇斗艳,让人多少看到了业内蓬勃发展的态势.   在这许多产品中最为吸引消费者目光的就是KeyComputing的XKey产品,它是一种USB设备,能够将任何一台个人机转化为MicrosoftExchange客户端.这样用户就将不用带着笔记本电脑到处跑了,他仅仅需要将一张XKey卡插进一台电脑中,并且拥有一份安全的Outlook应用 程序.XKey与客户系统是独立的,拥有自己的的处理器和数据库,以及应用程序服务器,Exchange客户端,安全系统,以及SSL虚拟专用网络.它预期五月上市,售价300美元,拥有256兆的存储空间.   另一个吸引消费者目光的就是FlipStart迷你电脑.保罗.爱仑是微软的投资者,也是基金的拥有者,他是一个亿万富翁,他现在正在大力推广他的新产品,即FlipStart个人电脑.他表示公司历经两年的研发时间,致力于整合许多简单的功能在一台机器身上.(比如,笔记本电脑,MP3播放器,相机,手机).   许多在2004年Demo大会中首次登场的公司软件都显示出相当高的价值,mValent就是其中之一,作为一种InfrastructureAutomation软件系统,它主要被用来处理编译以及对于java应用程序中的复杂基础配置维护等问题.   mValent指出了一个一直以来存在于信息技术公司在编译应用软件时遇到的问题.在许多情况下,在编程阶段以及他们需要的架构很容易出现不能够统一的局面,这就会导致错误的出现,这样无疑会增加纠错的成本.mValent能够使所有的配置数据整齐化.它可以显示出那些互相依存的部件,并且减弱改变带来的影响,并且在分部的环境中使这些改变同步化.   Mainsoft则正在将Java编程软件引入微软的Visual Studio.Net环境,其产品名为:VisualMainWinforJava2企业版.它的功能是让那些不会运用Java的用户能够简单的将其运用C#以及VB编写的软件转化成J2EE应用程序.   许多公司的软件都是用于会议的召开,但是Quindi的软件MeetingCompanion是第一款用于会议回放的软件,它可以帮助那些没有按时出席会议的人们快速了解会议的进程和内容.    <淘宝热门商品:
 

¥:8.80 

『五博』新奥尔良烤鸡腌料

 

¥:88.00 

綠光森林改版我型我酷☆№1价廉物美!手机客服7*24小时等候!

冲4钻!李宁专柜正品超轻透气跑鞋原价369元!特价88元!数量有限


来源:程序员网

小小豆叮

中国学生可申请免费Java培训

昨日,Sun公司与中国教育和科研计算机网携手创建的Sun网上技术培训本地托管中心在京正式启动。Sun大中华区总裁余宏德预计,在未来的两年内,将有超过10万名同学在该中心注册学习。   参加在线学习的中国教师、学生,可望通过他们所在学校或教育机构,以单位的名义向Sun提出申请。在获得Sun公司总部批准后,取得资格的教师和学生则可遵照相关规则, 到指定网址免费访问SAI本地托管中心的在线课程。 <淘宝热门商品:
 

50.00 元 

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

 

268.00元  

Shanghai 秀卡蒂 女性健康購物中心 瘦身減肥


来源:程序员网

小小豆叮

SUN公司在考虑公开JAVA源代码

据业内消息灵通人士透露,Sun公司目前正在考虑公开Java技术的源代码——尽管该消息仍然有待确实,但是种种迹象表明Sun公司正在变得越来越“OPEN”。   据“开放源代码”运动的狂热推动者埃里克·S·雷蒙德介绍,IBM公司即将与SUN讨论,是否公开Java的源代码;至少,雷蒙德和IBM公司都支持SUN公司如此做。   上个月,雷蒙德给SUN公司总裁斯考特·麦克尼利寄出公开信,呼吁“让Java变得开放起来吧”。不久,雷蒙德收到SUN公司回信,要求进一步讨论“如何更好地利用‘开放源代码’的Java”。   雷蒙德建议,SUN公司应该遵循“开放源代码”的公认标准发布Java产品,但是保留产品品牌,有权实施监督和产品测试,有权进行产品认证等。当Java源代码公开之后,SUN公司应当做出以下声明:Java已经通过SUN公司的测试,能够与各种系统平台兼容。   在雷蒙德致SUN公司公开信后,IBM公司副总裁罗德·史密斯,也发表了致SUN公开信,要求拟定日期探讨公开Java源代码的具体事宜。该会议预计在未来数周内召开。   Sun公司发言人声称,公司已经与雷蒙德展开接触。“Sun公司对埃里克的建议很感兴趣,我们正在考虑‘开放源代码’的事情,所以很快回复了他的公开信。” <淘宝热门商品:
 

保健品/滋补品 

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

 

268.00元  

Shanghai 秀卡蒂 女性健康購物中心 瘦身減肥


来源:程序员网

小小豆叮

IBM致公开信给Sun 建议其将Java源代码公开

IBM公司周三(2月26日)向Sun公司送达了一封公开信,建议Sun公司将Java技术开放源代码化。   在这封由IBM公司负责新兴技术的副总裁史密斯送交的这封信件中,IBM公司表示愿意与Sun公司合作成立一个项目,通过开放源代码开发模式管理Java的开发工作。如果这一建议得到采纳,Sun公司最有价值的软件资产━━Java就将成为一项免费技术,包括自愿编程人员和大企业在内的任何人和组织都可以提交对Java的开发工作。   史密斯在信中对Sun公司的副总裁金格尔表示,Sun公司对开放源代码Java的承诺将加快优秀和兼容性良好的开放源代码Java实现的开发,这对我们的客户和产业有利。他说,我们坚定地相信,开放源代码社区将支持这一计划。   根据IBM公司的提议,它将为开放源代码Java实现提供支持资源和代码,而Sun公司则提供与Java标准相关的文档和测试。IBM公司在Java上投入了大量资源,其基于Java的产品在市场上有很高的市场份额。   史密斯说,使Java成为开放源代码软件将加速Java软件的普及,并为新应用和Java社团的增长提供全新的机遇。   开放源代码支持者雷蒙德本月早些时候也致函Sun公司,要求Sun公司在控制和Java的普及中间作出选择。通过使Java开放源代码,Sun公司应当邀请开放源代码开发人员参与,帮助促进Java的应用。   Java的发明者詹姆斯在最近接受采访时说,Sun公司一直在考虑是否或如何使Java开放源代码化,但这些内部讨论从来没有达成“完全开放源代码化”的结论。他说,这一事情太复杂了。   IBM公司负责WebSphere基础设施的主管苏托尔表示,IBM公司数年来一直在呼吁使Java开放源代码化。考虑到对开放源代码软件兴趣的不断增长和最近Sun公司对开放源代码软件的评论,IBM公司认为时机已经成熟了。使Java编程模式开放源代码化将有助于它的普及,有利于Java厂商和微软公司之间对市场的争夺。Sun公司对这一问题有最终决定权,但如果说到对整个产业有利,Java的开放源代码化将是必然的。 <淘宝热门商品:
 

80.00 元  

托玛琳厂家直营店

托玛琳预防富贵病;脂降压降糖减肥 活效清肠杯 一馈赠佳品限量版

 

145.00 元 

八心八箭瑞士钻石六爪旁镶钻经典钻戒指


来源:程序员网

小小豆叮

Eclipse 3 M6 发布

Eclipse 3的又一个稳定版本已经发布,称为M6. 跟随下面的地址可以查看到M6的新特性: http://download.eclipse.org/downloads/drops/S-3.0M6-200312182000/eclipse-news-M6.html <淘宝热门商品:
 

¥:338.00 

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

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

 

网络游戏装备/游戏币/帐号/代练 

无悔于心2006


来源:程序员网

小小豆叮

Eclipse接收四个新成员 "开源阵线"在进一步扩大

Eclipse接收四个新成员 "开源阵线"在进一步扩大 星期三Eclipse开源基金会宣布新成立的董事会又增加了四个成员。 Genuitec公司,SAS软件研究所,华盛顿大学和IBM星期二被选举为董事会成员。IBM,惠普,英特尔,爱立信,MontaVista软件,QNX软件,SAP和Serena软件都是目前董事会的成员。新的Eclipse基金会的常务董事还没有被选举出来。 IBM在2001年末以开源组织的形式创建了Eclipse,上个月根据法律程序该组织转变为一个非营利性质的开源的基金会。Eclipse软件是可以同时集成多种开发工具的开发平台,比如源代码管理和程序建模。该软件可以同时支持不同的编程语言,不过作为Java开发工具它正越来越流行。 Eclipse管理委员会的形成已接近尾声。因为该组织正在脱离IBM,而且该软件的发展方向也将不会受IBM的控制。今年一月份Sun公司发表了给Eclipse的一封公开信,表达了IBM员工对Eclipse的影响太大了,即使是最新成立的独立的组织,IBM对他的影响也不容忽视。 Eclipse基金会计划选举新的常务董事来接管Skip McGaughey的工作,他是IBM任命的负责Eclipse项目的主管。 董事会考虑的另一个主要的议题是和其他的Java开发工具组织合作,比如著名的Java Tools团体和Sun公司自己的开源Java工具项目Netbeans。 <淘宝热门商品:
 

1.50元  

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

 

78.00 元 

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


来源:程序员网

小小豆叮

Java socket编程入门[1]

Java socket编程入门[1] [原创] Robinh00d 2004-02-19 -------------------------------------------------------------------------------- 本教程由IBM DevelopWorks提供,版权归IBM所有 原作:Roy Miller 翻译:Robinh00d[CSTC] 翻译本文的目的仅仅是为了练习,本教程版权归IBM所有,本人不对其拥有版权 第一章:学习提示 我适合学习这份教程吗 Socket提供了两台计算机之间进行通讯的机制,在James Gosling注意Java语言之前就已经很闻名了。Java语言使你更简单有效的使用Socket开发而无需了解操作系统的底层机制。大部分讨论Java编码的书籍都没有涉及这一主题,或者是只是“点到为止”,留给读者大量的想象空间。这份教程就是让你了解在你的Java代码中如何更有效的使用Socket所需的知识。包含以下内容: •什么是Socket •它位于你的应用程序的哪些地方 •能正常运行的最简单的Socket例程――帮助你理解Java Socket的基础知识 •详细剖析另外两个探讨如何在多线程和具有连接池环境中使用套接字的示例 •简要讨论在现实世界中的一个Socket应用程序 如果你能够描述如何使用java.net这个包里的类,这份教程对你来说也许基础了一点。尽管它是一份提高技术的好资料,但是如果你已经在PC或者其他平台上有过长期Socket的开发经历,这部分提示也许会让你产生厌烦,但是如果你并不是很理解Socket,并且只想知道“什么是Socket”以及“怎么将Socket应用在自己的Java代码中”的话,这份教程则是一个很好的开始。 第二章:Socket基础 介绍 大多程序员,无论是否使用Java语言编程,都不希望知道太多关于不同的计算机之间相互通信的底层知识。程序员希望处理更容易理解的高层抽象。程序员更希望用他们熟悉的java的构造,通过直观接口与对象交互。 Socket存在于两个领域--我们宁愿处理抽象层而避免涉及底层细节,这一章所讲解的底层细节仅用于你理解抽象应用所必须的知识。 计算机组网 计算机之间用一种非常简单的方式来进行操作和通信。电脑芯片是一种开关,用1和0来储存和传输数据。当计算机希望共享数据时,它们需要所作的全部就是以相同的速度,相同的顺序,相同的时间等来回传输上百万的数据流。当你想在两个应用程序之间通信时,你怎么想考虑这些细节呢? 为了避免上面提到的事情,我们每次需要一组包协议用同样的方法来完成工作。这将使我们能够处理应用程序级的工作而不需要担心底层网络技术的细节。这样设置的包协议被称作“栈”。TCP/IP是最常见的协议栈。大部分协议栈(包括TCP/IP)都大致遵循ISO国际标准化组织的开放系统互连参考模型(Open Systems Interconnect Reference Model,OSIRM)。OSIRM把计算机网络定义为7个逻辑层 (见下图)很多公司对于这个模型的某些层的构造有过贡献。从产生电子信号()到给应用程序提供数据。TCP/IP映射到OSI模型的两层,如图所示。 我们不必过多的深入这些层的细节,但我们应该知道socket位于模型的什么位置。 Socket存在于哪些地方? Socket大致位于OSI模型的会话层(下图),会话层夹在面向应用的高层(上)的层和实时数据通信层(下)之间。会话层在两台计算机之间为管理和控制数据流提供服务。作为这一层的一部分,socket提供一个隐藏从传输线上获取bytes和bits的复杂性的抽象。换言之,socket允许我们让应用程序表示它想发送bytes。 socket隐藏了完成该工作的具体细节。 当你拿起电话说话时,电话把你的声音转换电信号。电话机是人和电信网络之间的接口。你不必知道你的声音是如何转换的细节,只需知道要你想和谁联系。同样的道理,socket隐藏了复杂的传输二进制数据而扮演高层接口的角色。 向一个应用程序曝光socket 当你在使用socket编写代码时,你的代码工作在表示层。表示层提供一个能让应用层使用的公共信息表示(representation of information)。假如你想把你的应用程序连接到CC银行系统而仅能使用EBCDIC。你的域对象(domain objects)用ASCII格式储存信息。既然这样,你得负责在表示层编写代码把EBCDIC的数据转换成ASCII格式,然后(比如)向应用层提供一个域对象(domain objects)。应用层可以用域对象(domain objects)做它想做的任何事情。 你编写的socket处理代码仅存在于表示层。应用层并不需要知道socket如何工作。 什么是socket? 现在我们知道了socket扮演的角色,那么剩下的问题就是:什么是socket?Bruce Eckel在他的《Java编程思想》一书中是这样描述socket的: socket是一种用于表达两台机器之间连接“终端”的软件抽象。对于一个给定的连接,在每台机器上都有一个socket,你可以想象一个虚拟的"电缆"工作在两台机器之间,“电缆”插在两台机器的socket上。当然,物理硬件和两台机器之间的“电缆”这些连接装置都是未知的,抽象的所有目的就是为了让我们不必了解更多的细节。 简单的说,一台计算机上的socket同另一台计算机通话创建一个通信信道,程序员可以用这个信道在两台机器之间发送数据。当你发送数据时,TCP/IP协议栈的每一层都给你的数据里添加适当的报头。有个好消息是java语言隐藏了所有这些细节,这也是为什么他们有时被叫做“流socket”。 思考一下socket像电话听筒一样在电话的任意一端--你和我通过一个专门的信道来进行通话和接听。会话将一直进行下去直到我们决定挂断电话(除非我们使用蜂窝电话),除非我们挂断电话,否则我们各自的电话线路都会占线。 如果你需要在两台机器之间进行通讯而不使用高级机制像ORBs(以及CORBA, RMI, IIOP等等),socket比较适合你。Socket的底层机制则相当棘手。幸运的是,java平台给我们一些虽然简单但是相当强大的高层抽象以至于我们创建和使用socket更加容易一些。 socket的类型 一般而言,java socket有下面两种类型: •TCP socket(由Socket类实现,下面的章节我们将对其讨论) •UDP socket(由DatagramSocket类实现) TCP和UDP扮演同样的角色,但是实现是不同的。两者都接收传输协议数据包并把它们传递到表示层。TCP把信息分解成数据包(datagrams)并在接收端重新组装起来。它还对丢失的数据包进行重新传输的请求。TCP减少了上层的担忧。UDP没有组装和重传请求的功能。它只是传输数据包。更高层的层必须确保信息的完整性以及组合顺序的正确性。 一般而言,UDP使你的应用程序更有效率,但只在你的应用程序并不是立即交流大量数据并且不需要组装大量的数据报而完成一条消息的时候。否则TCP才是最简单和最有效的选择。 因为大部分读者相对于UDP来说更喜欢用TCP一些,我们将我们的讨论限定在java语言中面向TCP类。 <淘宝热门商品:
 

78.00 元 

卖疯了 顶级瘦脸 顾客赞不停

 

 

香港恒邦充电电池/充电器专卖店


来源:程序员网

小小豆叮

Servlet及JSP中的多线程同步问题

 Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的同步问题。然而,很多人编写Servlet/JSP程序时并没有注意到多线程同步的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫明其妙的问题,对于这类随机性的问题调试难度也很大。  在Servlet/JSP中的几种变量类型   在编写Servlet/JSP程序时,对实例变量一定要小心使用。因为实例变量是非线程安全的。在Servlet/JSP中,变量可以归为下面的几类:   1. 类变量   request,response,session,config,application,以及JSP页面内置的page, pageContext。其中除了application外,其它都是线程安全的。   2. 实例变量   实例变量是实例所有的,在堆中分配。在Servlet/JSP容器中,一般仅实例化一个Servlet/JSP实例,启动多个该实例的线程来处理请求。而实例变量是该实例所有的线程所共享,所以,实例变量不是线程安全的。   3. 局部变量   局部变量在堆栈中分配,因为每一个线程有自己的执行堆栈,所以,局部变量是线程安全的。 <淘宝热门商品:
 

18.00 元 

最新版 2面圆领打底衫 精品莱卡棉

 

25.00 元 

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


来源:程序员网

小小豆叮

如何用jsp生成excel文件

介绍: Jakarta_POI 使用Java读写Excel(97-2002)文件,可以满足大部分的需要。 因为刚好有一个项目使用到了这个工具,花了点时间顺便翻译了一下POI本身 带的一个Guide.有一些节减和修改,希望给使用这个项目的人一些入门帮助。 POI 下面有几个自项目:HSSF用来实现Excel 的读写.以下是HSSF的主页 http://jakarta.apache.org/poi/hssf/index.html 下面的介绍是基于以下地址的翻译: http://jakarta.apache.org/poi/hssf/quick-guide.html 目前的版本为1.51应该是很长时间之内的一个稳定版,但HSSF提供的Sample不是基于 1.51所写,所以使用的时候需要适当的注意. 其实POI下面的几个子项目侧重不同读写 Word 的HDF正在开发当中. XML下的FOP(http://xml.apache.org/fop/index.html) 可以输出pdf文件,也是比较好的一个工具 目录: 创建一个workbook 创建一个sheet 创建cells 创建日期cells 设定单元格格式 说明: 以下可能需要使用到如下的类 import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; 创建workbook HSSFWorkbook wb = new HSSFWorkbook(); //使用默认的构造方法创建workbook FileOutputStream fileOut = new FileOutputStream("workbook.xls"); //指定文件名 wb.write(fileOut); //输出到文件 fileOut.close(); 创建一个sheet HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet1 = wb.createSheet("new sheet"); //workbook创建sheet HSSFSheet sheet2 = wb.createSheet("second sheet"); //workbook创建另外的sheet FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close(); 创建cells HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("new sheet"); //注意以下的代码很多方法的参数是short 而不是int 所以需要做一次类型转换 HSSFRow row = sheet.createRow((short)0); //sheet 创建一行 HSSFCell cell = row.createCell((short)0); //行创建一个单元格 cell.setCellValue(1); //设定单元格的值 //值的类型参数有多中double ,String ,boolean, row.createCell((short)1).setCellValue(1.2); row.createCell((short)2).setCellValue("This is a string"); row.createCell((short)3).setCellValue(true); // Write the output to a file FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close(); 创建日期cells HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("new sheet"); HSSFRow row = sheet.createRow((short)0); HSSFCell cell = row.createCell((short)0); //设定值为日期 cell.setCellValue(new Date()); HSSFCellStyle cellStyle = wb.createCellStyle(); //指定日期显示格式 cellStyle.setDataFormat(HSSFDataFormat.getFormat("m/d/yy h:mm")); cell = row.createCell((short)1); cell.setCellValue(new Date()); //设定单元格日期显示格式 cell.setCellStyle(cellStyle); FileOutputStream fileOut = new FileOutputStream("workbook.xls"); wb.write(fileOut); fileOut.close(); 设定单元格格式 单元格格式的设定有很多形式包括单元格的对齐方式,内容的字体设置, 单元格的背景色等,因为形式比较多,只举一些例子.以下的例子在 POI1.5中可能会有所改变具体查看API. .......... // Aqua background HSSFCellStyle style = wb.createCellStyle(); //创建一个样式 style.setFillBackgroundColor(HSSFCellStyle.AQUA); //设定此样式的的背景颜色填充 style.setFillPattern(HSSFCellStyle.BIG_SPOTS); //样式的填充类型。 //有多种式样如: //HSSFCellStyle.BIG_SPOTS //HSSFCellStyle.FINE_DOTS //HSSFCellStyle.SPARSE_DOTS等 style.setAlignment(HSSFCellStyle.ALIGN_CENTER ); //居中对齐 style.setFillBackgroundColor(HSSFColor.GREEN.index); //设定单元个背景颜色 style.setFillForegroundColor(HSSFColor.RED.index); //设置单元格显示颜色 HSSFCell cell = row.createCell((short) 1); cell.setCellValue("X"); cell.setCellStyle(style); <淘宝热门商品:
 

110.00元  

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

 

136.00 元  

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

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


来源:程序员网

小小豆叮

Tomcat配置技巧Top 10

编者按:现在开发Java Web应用,建立和部署Web内容是一件很简单的工作。使用Jakarta Tomcat作为Servlet和JSP容器的人已经遍及全世界。Tomcat具有免费、跨平台等诸多特性,并且更新得很快,现在非常的流行。 你所需要做的就是:按照你的需求配置Tomcat,只要你正确配置,Tomcat一般都能适合你的要求。下面是一系列关于Tomcat的配置技巧,这些技巧源自于我的书:《Tomcat权威指南》,希望对你有所帮助。—— Jason Brittain 1. 配置系统管理(Admin Web Application) 大多数商业化的J2EE服务器都提供一个功能强大的管理界面,且大都采用易于理解的Web应用界面。Tomcat按照自己的方式,同样提供一个成熟的管理工具,并且丝毫不逊于那些商业化的竞争对手。Tomcat的Admin Web Application最初在4.1版本时出现,当时的功能包括管理context、data source、user和group等。当然也可以管理像初始化参数,user、group、role的多种数据库管理等。在后续的版本中,这些功能将得到很大的扩展,但现有的功能已经非常实用了。 Admin Web Application被定义在自动部署文件:CATALINA_BASE/webapps/admin.xml 。 (译者注:CATALINA_BASE即tomcat安装目录下的server目录) 你必须编辑这个文件,以确定Context中的docBase参数是绝对路径。也就是说,CATALINA_BASE/webapps/admin.xml 的路径是绝对路径。作为另外一种选择,你也可以删除这个自动部署文件,而在server.xml文件中建立一个Admin Web Application的context,效果是一样的。你不能管理Admin Web Application这个应用,换而言之,除了删除CATALINA_BASE/webapps/admin.xml ,你可能什么都做不了。 如果你使用UserDatabaseRealm(默认),你将需要添加一个user以及一个role到CATALINA_BASE/conf/tomcat-users.xml 文件中。你编辑这个文件,添加一个名叫“admin”的role 到该文件中,如下: <role name="admin"/> 你同样需要有一个用户,并且这个用户的角色是“admin”。象存在的用户那样,添加一个用户(改变密码使其更加安全): <user name="admin" password="deep_dark_secret" roles="admin"/> 当你完成这些步骤后,请重新启动Tomcat,访问http://localhost:8080/admin,你将看到一个登录界面。Admin Web Application采用基于容器管理的安全机制,并采用了Jakarta Struts框架。一旦你作为“admin”角色的用户登录管理界面,你将能够使用这个管理界面配置Tomcat。 2.配置应用管理(Manager Web Application) Manager Web Application让你通过一个比Admin Web Application更为简单的用户界面,执行一些简单的Web应用任务。 Manager Web Application被被定义在一个自动部署文件中: CATALINA_BASE/webapps/manager.xml 。 你必须编辑这个文件,以确保context的docBase参数是绝对路径,也就是说CATALINA_HOME/server/webapps/manager的绝对路径。 (译者注:CATALINA_HOME即tomcat安装目录) 如果你使用的是UserDatabaseRealm,那么你需要添加一个角色和一个用户到CATALINA_BASE/conf/tomcat-users.xml文件中。接下来,编辑这个文件,添加一个名为“manager”的角色到该文件中: <role name=”manager”> 你同样需要有一个角色为“manager”的用户。像已经存在的用户那样,添加一个新用户(改变密码使其更加安全): <user name="manager" password="deep_dark_secret" roles="manager"/> 然后重新启动Tomcat,访问http://localhost/manager/list,将看到一个很朴素的文本型管理界面,或者访问http://localhost/manager/html/list,将看到一个HMTL的管理界面。不管是哪种方式都说明你的Manager Web Application现在已经启动了。 Manager application让你可以在没有系统管理特权的基础上,安装新的Web应用,以用于测试。如果我们有一个新的web应用位于/home/user/hello下在,并且想把它安装到 /hello下,为了测试这个应用,我们可以这么做,在第一个文件框中输入“/hello”(作为访问时的path),在第二个文本框中输入“file:/home/user/hello”(作为Config URL)。 Manager application还允许你停止、重新启动、移除以及重新部署一个web应用。停止一个应用使其无法被访问,当有用户尝试访问这个被停止的应用时,将看到一个503的错误——“503 - This application is not currently available”。 移除一个web应用,只是指从Tomcat的运行拷贝中删除了该应用,如果你重新启动Tomcat,被删除的应用将再次出现(也就是说,移除并不是指从硬盘上删除)。 3.部署一个web应用 有两个办法可以在系统中部署web服务。 1> 拷贝你的WAR文件或者你的web应用文件夹(包括该web的所有内容)到$CATALINA_BASE/webapps目录下。 2> 为你的web服务建立一个只包括context内容的XML片断文件,并把该文件放到$CATALINA_BASE/webapps目录下。这个web应用本身可以存储在硬盘上的任何地方。 如果你有一个WAR文件,你若想部署它,则只需要把该文件简单的拷贝到CATALINA_BASE/webapps目录下即可,文件必须以“.war”作为扩展名。一旦Tomcat监听到这个文件,它将(缺省的)解开该文件包作为一个子目录,并以WAR文件的文件名作为子目录的名字。接下来,Tomcat将在内存中建立一个context,就好象你在server.xml文件里建立一样。当然,其他必需的内容,将从server.xml中的DefaultContext获得。 部署web应用的另一种方式是写一个Context XML片断文件,然后把该文件拷贝到CATALINA_BASE/webapps目录下。一个Context片断并非一个完整的XML文件,而只是一个context元素,以及对该应用的相应描述。这种片断文件就像是从server.xml中切取出来的context元素一样,所以这种片断被命名为“context片断”。 举个例子,如果我们想部署一个名叫MyWebApp.war的应用,该应用使用realm作为访问控制方式,我们可以使用下面这个片断: <!-- Context fragment for deploying MyWebApp.war --> <Context path="/demo" docBase="webapps/MyWebApp.war" debug="0" privileged="true"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Context> 把该片断命名为“MyWebApp.xml”,然后拷贝到CATALINA_BASE/webapps目录下。 这种context片断提供了一种便利的方法来部署web应用,你不需要编辑server.xml,除非你想改变缺省的部署特性,安装一个新的web应用时不需要重启动Tomcat。 4.配置虚拟主机(Virtual Hosts) 关于server.xml中“Host”这个元素,只有在你设置虚拟主机的才需要修改。虚拟主机是一种在一个web服务器上服务多个域名的机制,对每个域名而言,都好象独享了整个主机。实际上,大多数的小型商务网站都是采用虚拟主机实现的,这主要是因为虚拟主机能直接连接到Internet并提供相应的带宽,以保障合理的访问响应速度,另外虚拟主机还能提供一个稳定的固定IP。 基于名字的虚拟主机可以被建立在任何web服务器上,建立的方法就是通过在域名服务器(DNS)上建立IP地址的别名,并且告诉web服务器把去往不同域名的请求分发到相应的网页目录。因为这篇文章主要是讲Tomcat,我们不准备介绍在各种操作系统上设置DNS的方法,如果你在这方面需要帮助,请参考《DNS and Bind》一书,作者是Paul Albitz and Cricket Liu (OReilly)。为了示范方便,我将使用一个静态的主机文件,因为这是测试别名最简单的方法。 在Tomcat中使用虚拟主机,你需要设置DNS或主机数据。为了测试,为本地IP设置一个IP别名就足够了,接下来,你需要在server.xml中添加几行内容,如下: <Server port="8005" shutdown="SHUTDOWN" debug="0"> <Service name="Tomcat-Standalone"> <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="8080" minProcessors="5" maxProcessors="75" enableLookups="true" redirectPort="8443"/> <Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="8443" minProcessors="5" maxProcessors="75" acceptCount="10" debug="0" scheme="https" secure="true"/> <Factory className="org.apache.coyote.tomcat4.CoyoteServerSocketFactory" clientAuth="false" protocol="TLS" /> </Connector> <Engine name="Standalone" defaultHost="localhost" debug="0"> <!-- This Host is the default Host --> <Host name="localhost" debug="0" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context path="" docBase="ROOT" debug="0"/> <Context path="/orders" docBase="/home/ian/orders" debug="0" reloadable="true" crossContext="true"> </Context> </Host> <!-- This Host is the first "Virtual Host": www.example.com --> <Host name="www.example.com" appBase="/home/example/webapp"> <Context path="" docBase="."/> </Host> </Engine> </Service> </Server> Tomcat的server.xml文件,在初始状态下,只包括一个虚拟主机,但是它容易被扩充到支持多个虚拟主机。在前面的例子中展示的是一个简单的server.xml版本,其中粗体部分就是用于添加一个虚拟主机。每一个Host元素必须包括一个或多个context元素,所包含的context元素中必须有一个是默认的context,这个默认的context的显示路径应该为空(例如,path=””)。 5.配置基础验证(Basic Authentication) 容器管理验证方法控制着当用户访问受保护的web应用资源时,如何进行用户的身份鉴别。当一个web应用使用了Basic Authentication(BASIC参数在web.xml文件中auto-method元素中设置),而有用户访问受保护的web应用时,Tomcat将通过HTTP Basic Authentication方式,弹出一个对话框,要求用户输入用户名和密码。在这种验证方法中,所有密码将被以64位的编码方式在网络上传输。 注意:使用Basic Authentication通过被认为是不安全的,因为它没有强健的加密方法,除非在客户端和服务器端都使用HTTPS或者其他密码加密码方式(比如,在一个虚拟私人网络中)。若没有额外的加密方法,网络管理员将能够截获(或滥用)用户的密码。但是,如果你是刚开始使用Tomcat,或者你想在你的web应用中测试一下基于容器的安全管理,Basic Authentication还是非常易于设置和使用的。只需要添加<security-constraint>和<login-config>两个元素到你的web应用的web.xml文件中,并且在CATALINA_BASE/conf/tomcat-users.xml 文件中添加适当的<role>和<user>即可,然后重新启动Tomcat。 下面例子中的web.xml摘自一个俱乐部会员网站系统,该系统中只有member目录被保护起来,并使用Basic Authentication进行身份验证。请注意,这种方式将有效的代替Apache web服务器中的.htaccess文件。 <!-- Define the Members-only area, by defining a "Security Constraint" on this Application, and mapping it to the subdirectory (URL) that we want to restrict. --> <security-constraint> <web-resource-collection> <web-resource-name> Entire Application </web-resource-name> <url-pattern>/members/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>member</role-name> </auth-constraint> </security-constraint> <!-- Define the Login Configuration for this Application --> <login-config> <auth-method>BASIC</auth-method> <realm-name>My Club Members-only Area</realm-name> </login-config> 6.配置单点登录(Single Sign-On) 一旦你设置了realm和验证的方法,你就需要进行实际的用户登录处理。一般说来,对用户而言登录系统是一件很麻烦的事情,你必须尽量减少用户登录验证的次数。作为缺省的情况,当用户第一次请求受保护的资源时,每一个web应用都会要求用户登录。如果你运行了多个web应用,并且每个应用都需要进行单独的用户验证,那这看起来就有点像你在与你的用户搏斗。用户们不知道怎样才能把多个分离的应用整合成一个单独的系统,所有他们也就不知道他们需要访问多少个不同的应用,只是很迷惑,为什么总要不停的登录。 Tomcat 4的“single sign-on”特性允许用户在访问同一虚拟主机下所有web应用时,只需登录一次。为了使用这个功能,你只需要在Host上添加一个SingleSignOn Valve元素即可,如下所示: <Valve className="org.apache.catalina.authenticator.SingleSignOn" debug="0"/> 在Tomcat初始安装后,server.xml的注释里面包括SingleSignOn Valve配置的例子,你只需要去掉注释,即可使用。那么,任何用户只要登录过一个应用,则对于同一虚拟主机下的所有应用同样有效。 使用single sign-on valve有一些重要的限制: 1> value必须被配置和嵌套在相同的Host元素里,并且所有需要进行单点验证的web应用(必须通过context元素定义)都位于该Host下。 2> 包括共享用户信息的realm必须被设置在同一级Host中或者嵌套之外。 3> 不能被context中的realm覆盖。 4> 使用单点登录的web应用最好使用一个Tomcat的内置的验证方式(被定义在web.xml中的<auth-method>中),这比自定义的验证方式强,Tomcat内置的的验证方式包括basic、digest、form和client-cert。 5> 如果你使用单点登录,还希望集成一个第三方的web应用到你的网站中来,并且这个新的web应用使用它自己的验证方式,而不使用容器管理安全,那你基本上就没招了。你的用户每次登录原来所有应用时需要登录一次,并且在请求新的第三方应用时还得再登录一次。当然,如果你拥有这个第三方web应用的源码,而你又是一个程序员,你可以修改它,但那恐怕也不容易做。 6> 单点登录需要使用cookies。 7.配置用户定制目录(Customized User Directores) 一些站点允许个别用户在服务器上发布网页。例如,一所大学的学院可能想给每一位学生一个公共区域,或者是一个ISP希望给一些web空间给他的客户,但这又不是虚拟主机。在这种情况下,一个典型的方法就是在用户名前面加一个特殊字符(~),作为每位用户的网站,比如: http://www.cs.myuniversity.edu/~username http://members.mybigisp.com/~username Tomcat提供两种方法在主机上映射这些个人网站,主要使用一对特殊的Listener元素。Listener的className属性应该是org.apache.catalina.startup.UserConfig,userClass属性应该是几个映射类之一。如果你的系统是Unix,它将有一个标准的/etc/passwd文件,该文件中的帐号能够被运行中的Tomcat很容易的读取,该文件指定了用户的主目录,使用PasswdUserDatabase 映射类。 <Listener className="org.apache.catalina.startup.UserConfig" directoryName="public_html" userClass="org.apache.catalina.startup.PasswdUserDatabase"/> web文件需要放置在像/home/users/ian/public_html 或者 /users/jbrittain/public_html一样的目录下面。当然你也可以改变public_html 到其他任何子目录下。 实际上,这个用户目录根本不一定需要位于用户主目录下里面。如果你没有一个密码文件,但你又想把一个用户名映射到公共的像/home一样目录的子目录里面,则可以使用HomesUserDatabase类。 <Listener className="org.apache.catalina.startup.UserConfig" directoryName="public_html" homeBase="/home" userClass="org.apache.catalina.startup.HomesUserDatabase"/> 这样一来,web文件就可以位于像/home/ian/public_html 或者 /home/jasonb/public_html一样的目录下。这种形式对Windows而言更加有利,你可以使用一个像c:home这样的目录。 这些Listener元素,如果出现,则必须在Host元素里面,而不能在context元素里面,因为它们都用应用于Host本身。 8.在Tomcat中使用CGI脚本 Tomcat主要是作为Servlet/JSP容器,但它也有许多传统web服务器的性能。支持通用网关接口(Common Gateway Interface,即CGI)就是其中之一,CGI提供一组方法在响应浏览器请求时运行一些扩展程序。CGI之所以被称为通用,是因为它能在大多数程序或脚本中被调用,包括:Perl,Python,awk,Unix shell scripting等,甚至包括Java。当然,你大概不会把一个Java应用程序当作CGI来运行,毕竟这样太过原始。一般而言,开发Servlet总要比CGI具有更好的效率,因为当用户点击一个链接或一个按钮时,你不需要从操作系统层开始进行处理。 Tomcat包括一个可选的CGI Servlet,允许你运行遗留下来的CGI脚本。 为了使Tomcat能够运行CGI,你必须做如下几件事: 1. 把servlets-cgi.renametojar (在CATALINA_HOME/server/lib/目录下)改名为servlets-cgi.jar。处理CGI的servlet应该位于Tomcat的CLASSPATH下。 2. 在Tomcat的CATALINA_BASE/conf/web.xml 文件中,把关于<servlet-name> CGI的那段的注释去掉(默认情况下,该段位于第241行)。 3. 同样,在Tomcat的CATALINA_BASE/conf/web.xml文件中,把关于对CGI进行映射的那段的注释去掉(默认情况下,该段位于第299行)。注意,这段内容指定了HTML链接到CGI脚本的访问方式。 4. 你可以把CGI脚本放置在WEB-INF/cgi 目录下(注意,WEB-INF是一个安全的地方,你可以把一些不想被用户看见或基于安全考虑不想暴露的文件放在此处),或者你也可以把CGI脚本放置在context下的其他目录下,并为CGI Servlet调整cgiPathPrefix初始化参数。这就指定的CGI Servlet的实际位置,且不能与上一步指定的URL重名。 5. 重新启动Tomcat,你的CGI就可以运行了。 在Tomcat中,CGI程序缺省放置在WEB-INF/cgi目录下,正如前面所提示的那样,WEB-INF目录受保护的,通过客户端的浏览器无法窥探到其中内容,所以对于放置含有密码或其他敏感信息的CGI脚本而言,这是一个非常好的地方。为了兼容其他服务器,尽管你也可以把CGI脚本保存在传统的/cgi-bin目录,但要知道,在这些目录中的文件有可能被网上好奇的冲浪者看到。另外,在Unix中,请确定运行Tomcat的用户有执行CGI脚本的权限。 9.改变Tomcat中的JSP编译器(JSP Compiler) 在Tomcat 4.1(或更高版本,大概),JSP的编译由包含在Tomcat里面的Ant程序控制器直接执行。这听起来有一点点奇怪,但这正是Ant有意为之的一部分,有一个API文档指导开发者在没有启动一个新的JVM的情况下,使用Ant。这是使用Ant进行Java开发的一大优势。另外,这也意味着你现在能够在Ant中使用任何javac支持的编译方式,这里有一个关于Apache Ant使用手册的javac page列表。使用起来是容易的,因为你只需要在<init-param> 元素中定义一个名字叫“compiler”,并且在value中有一个支持编译的编译器名字,示例如下: <servlet> <servlet-name>jsp</servlet-name> <servlet-class> org.apache.jasper.servlet.JspServlet </servlet-class> <init-param> <param-name>logVerbosityLevel</param-name> <param-value>WARNING</param-value> </init-param> <init-param> <param-name>compiler</param-name> <param-value>jikes</param-value> </init-param> <load-on-startup>3</load-on-startup> </servlet> 当然,给出的编译器必须已经安装在你的系统中,并且CLASSPATH可能需要设置,那处决于你选择的是何种编译器。 10.限制特定主机访问(Restricting Access to Specific Hosts) 有时,你可能想限制对Tomcat web应用的访问,比如,你希望只有你指定的主机或IP地址可以访问你的应用。这样一来,就只有那些指定的的客户端可以访问服务的内容了。为了实现这种效果,Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve。 通过配置这两个参数,可以让你过滤来自请求的主机或IP地址,并允许或拒绝哪些主机/IP。与之类似的,在Apache的httpd文件里有对每个目录的允许/拒绝指定。 例如你可以把Admin Web application设置成只允许本地访问,设置如下: <Context path="/path/to/secret_files" ...> <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127.0.0.1" deny=""/> </Context> 如果没有给出允许主机的指定,那么与拒绝主机匹配的主机就会被拒绝,除此之外的都是允许的。与之类似,如果没有给出拒绝主机的指定,那么与允许主机匹配的主机就会被允许,除此之外的都是拒绝的。 -------------------------------------- 作者简介: Jason Brittain是CollabNet公司的一名资深软件工程师,主要负责软件底层架构的开发。他已经为Apache Jakarta项目做了很多贡献,多年以来,他一直是一名积极的开源软件开发者。 Ian F. Darwin已经在计算机行业工作了30年:从1980年开始使用Unix,从1995年开始使用Java,从1998年开始使用OpenBSD。他是两本Oreilly图书的作者:Checking C Programs with lint 和 Java Cookbook,还与Jason Brittain合著了Tomcat: The Definitive Guide。 译者简介: 陈光(Holen Chen),J2EE项目经理,熟悉知识管理及电子政务,致力于Apache Jakarta项目在国广的推广及深层次应用,可通过 holen@263.net与作者联系。 <淘宝热门商品:
 

198元 

深深魅惑-*减肥*美容*收藏有惊喜:-)购物惊喜不断……

 

4.00 元  

阳光网游挂机程序专业店

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


来源:程序员网

小小豆叮

J2EE设计模式浅谈(二)之Filter

J2EE设计模式浅谈(二)之Filter zhaum@studyjava.com 其实J2EE中太多的定义是很烦人的,设计模式也很抽象的,今天我就以Servlet2.3中新增的Filter在Web Application中的应用,来进一步的说明设计模式。 首先假设我们现在想做一个Web Application(例如BBS)。 要求具备下列功能: 1、 在用户发帖子之前,要进行身份认证,以确认该用户是已登陆用户。 2、 其次是要对删除帖子,修改帖子,进行权限检查。 3、 访问特定资源(Web 页、JSP 页)时的身份认证 那么对待这些要求我们该怎么去做,如果在每个页面中都写检查权限的代码,不是一个好想法,且使的程序的可重用性降低,对比设计模式Intercepting Filter(截获过滤)正好符合我们的要求,且在Servlet2.3中通过使用过滤器(Filter)能够使得Web Application开发者能够在请求到达Web资源之前截取请求,在处理请求之后修改应答。 一个执行过滤器的Java 类必须实现javax.servlet.Filter 接口。这一接口含有三个方法: · init(FilterConfig):这是容器所调用的初始化方法。它保证了在第一次 doFilter() 调用前由容器调用。它能获取在 web.xml 文件中指定的filter初始化参数(文章的后面有lightningboard 的web.xml文件)。 · doFilter(ServletRequest, ServletResponse, FilterChain):这是一个完成过滤行为的方法。它同样是上一个过滤器调用的方法。引入的 FilterChain 对象提供了后续过滤器所要调用的信息,Filter中因为有了 FilterChain,就使的几个FILTER 成了一个链条。 · destroy():容器在销毁过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法 在开源的lightningboard BBS中实现了两个Filter,如下 1、ControllerFilter在这里起到的是Front Controller(前端控制器)的作用,是MVC模式中的控制器,是该BBS的入口点。 package lightningboard; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.FilterChain; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import lightningboard.action.*; /** * Control all *.do. * @version 0.3.5 * @author Xiaobo Liu */ public class ControllerFilter implements Filter { /** * Action dispatch
* example: homde.do will be create HomeAction and call its excute() method. */ protected FilterConfig filterConfig; public void init(FilterConfig config) { this.filterConfig = config; } public void destroy() { this.filterConfig = null; } public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain) throws IOException, ServletException{ HttpServletRequest request = (HttpServletRequest)srequest; HttpServletResponse response = (HttpServletResponse)sresponse; long timeStart=System.currentTimeMillis(); Configuration cfg=Configuration.getInstance(); String encoding=cfg.getValue("SYS.ENCODING"); request.setCharacterEncoding(encoding); String path = (String) request.getRequestURI(); String actionString = path.substring(path.lastIndexOf("/") + 1,path.lastIndexOf(".")); String forwardPage=null; try { if(actionString.equals("forum")) forwardPage=new ForumAction().excute(request,response); else if(actionString.equals("topic")) forwardPage=new TopicAction().excute(request,response); else if(actionString.equals("user")) forwardPage=new UserAction().excute(request,response); else if(actionString.equals("userList")) forwardPage=new UserListAction().excute(request,response); else if(actionString.equals("login")) forwardPage=new LoginAction().excute(request,response); else if(actionString.equals("register")) forwardPage=new RegisterAction().excute(request,response); else if(actionString.equals("post")) forwardPage=new PostAction().excute(request,response); else if(actionString.equals("postP")) forwardPage=new PostPAction().excute(request,response); else if(actionString.equals("userEdit")) forwardPage=new UserEditAction().excute(request,response); else if(actionString.equals("userEditP")) forwardPage=new UserEditPAction().excute(request,response); else if(actionString.equals("logout")) forwardPage=new LogoutAction().excute(request,response); else //default: home forwardPage=new HomeAction().excute(request,response); }catch (ActionException ex) { Debug.out(ex); request.setAttribute("actionMessage",new ActionMessage("system_error")); forwardPage="/actionMessage.jsp"; } // forward page if (forwardPage!=null){ String processTime=""+(System.currentTimeMillis()-timeStart); request.setAttribute("processTime",processTime); filterConfig.getServletContext().getRequestDispatcher(forwardPage).forward(request,response); } } } 2、此FILTER起的是Intercepting Filter(截获过滤)的作用。 package lightningboard.filter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.FilterChain; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class SessionAuthorizationFilter implements Filter { protected FilterConfig filterConfig; public void init(FilterConfig config) { this.filterConfig = config; } public void destroy() { this.filterConfig = null; } private boolean passed(ServletRequest request, ServletResponse response) throws IOException, ServletException { boolean result=false; String objectName=this.filterConfig.getInitParameter("OBJECT_NAME"); HttpServletRequest req = (HttpServletRequest)request; HttpSession session =req.getSession(false); if(session!=null){ Object object=session.getAttribute(objectName); if(object!=null) result= true; } return result; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException{ if (passed(request,response)) filterChain.doFilter(request, response); else{ HttpServletResponse res = (HttpServletResponse)response; String errorPage=this.filterConfig.getInitParameter("ERROR_PAGE"); res.sendRedirect(errorPage); } } } 容器通过 Web 应用程序中的配置描述符 web.xml 文件解析过滤器配置信息。有两个新的标记与过滤器相关: 标记是一个过滤器定义,它必定有一个 子元素。 子元素给出了一个与过滤器实例相关的名字。 指定了由容器载入的实现类。您能随意地包含一个 子元素为过滤器实例提供初始化参数。 标记代表了一个过滤器的映射,指定了过滤器会对其产生作用的 URL 的子集。 lightningboard 项目中的web.xml文件如下: controllerFilter lightningboard.ControllerFilter sessionAuthorizationFilter lightningboard.filter.SessionAuthorizationFilter ERROR_PAGE login.jsp OBJECT_NAME loginBean sessionAuthorizationFilter /post.do sessionAuthorizationFilter /postP.do sessionAuthorizationFilter /post.jsp sessionAuthorizationFilter /userEdit.do sessionAuthorizationFilter /userEditP.do sessionAuthorizationFilter /userEdit.jsp sessionAuthorizationFilter /userList.do controllerFilter *.do index.html 由于本人水平有限,不当之处还请指正,谢谢!!! <淘宝热门商品:
 

¥:28.00 

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

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

 

¥:7.00 

极限特攻-新奇产品仓库    金秋时节好礼送不停 

创意小猪/手摇式LED手电/手动手电/LED手电


来源:程序员网

小小豆叮

SWING与AWT小应用程序的区别

SWING与AWT小应用程序的区别 也许你以前使用过AWT进行图形用户界面(GUI)的设计,感觉如何呢?现在JAVA2提供了Swing包,向大家展示了更丰富的功能,使用它设计的界面会更友好,现在我们就来看一下。 以前你设计小应用程序会扩展Applet(java.applet.Applet);现在为了使用Swing包,你要扩展JApplet(javax.swing.JApplet)让我们先来看一个扩展JApplet小应用程序的实例,然后再分析二者的区别。 程序源代吗如下:(JAppletTest.java) import javax.swing.*; import java.awt.*; import java.event.*; public class JAppletTest extends JApplet {  public void init() {   Container contentPane = getContentPane();   Icon icon = new ImageIcon("swing.gif", "A GIF on a swing");   JLabel label = new JLabel("Swing!", icon, SwingConstants.CENTER);   contentPane.add(label, BorderLayout.CENTER);  } } 有几点需要注意: 1、程序的最后一行不是必须的,因为JApplet类使用BorderLayout的一个实例做为其内容窗格的布局管理器,而BorderLayout的缺省约束条件是BorderLayout.CENTER,所以程序的最后一行不是必须的。 2、Applet的缺省的布局管理器是FlowLayout,而FlowLayout的缺省约束条件是FlowLayout.LEFT,这是二者最显著的区别之一。 3、JApplet是只包含一个组件的容器,这个组件就是JRootPane的一个实例,而JRootPane包含了一个称作内容窗格的容器。 4、“内容窗格”,它包含与特定的小应用程序有关的所有内容。即是说,小应用程序必须把所有的组件添加到内容窗格中,而不是把它们直接添加到小应用程序中。 5、我们不应该直接为小应用程序设置布局管理器。 6、JApplet的实例可以有一个菜单栏,它是由setJMenuBar方法指定的,而AWT小应用程序却不能。 <淘宝热门商品:
 

58.00 元  

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

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

 

3C数码配件 

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


来源:程序员网

小小豆叮

MySQL安全问题(匿名用户)的一点心得

前两天在帮朋友整理他的主页空间时候,发现的一点关于MySQL可能大家都会忽略的问题:我们知道,在安装完MySQL后,它会自动创建一个root用户和一个匿名用户,其初始密码都是空,对于前者,很多参考资料上都会提醒大家要注意及时设定一个密码,而忽略了后者,大概是因为后者默认设定为只能在本机使用的缘故吧。   但如果你的MySQL是要提供给Web服务器作数据库服务的,忽略这个匿名用户的代价可能相当惨重,因为在默认设置下,这个匿名用户在localhost上几乎拥有和root一样的权限,这时候,如果你的客户拥有上传脚本文件、脚本文件可以进行MySQL数据库操作(比如允许操作MySQL的php)的权限已经可能将你的MySQL改动得面目全非了:   我今天帮朋友整理他的主页空间的时候,试着写了一个很简单的执行sql语句的php文件上传上去,其中连接字中的user,password我都试着置空,host=localhost,结果发现我的sql语句可以执行,于是执行select * from MySQL.user察看用户权限,发现这个用户在localhost权限非常高,连grant_priv都有,(察看的时候,会发现在root用户下有两行用户名、密码为空的,但各项权限有y 的,就是这个匿名用户本地、远程权限设置了)   所以我试着用这个php页面创建一个新用户,并grant给他较高的权限,结果一举成功,这样我就可以用这个新用户通过我本机的MySQL client连接到这个网站的MySQL server,并用这个新建立的用户的管理权限对这个网站的MySQL server进行管理,看到自己可以进行这样轻易获得深入的数据库操作,我怎么还敢把朋友的主页空间的敏感资料放入这个MySQL server呢?   改进建议:   1、在安装完成MySQL 后,不仅改变root用户的的密码,也同时改变匿名用户的密码,方法类似改变root的密码的方式:   MySQL> UPDATE user set password=PASSWORD(´yournewpassword´) where user=´´;   MySQL>FLUSH PRIVILEGES;   2、如非必要,删除这个匿名用户,这样所有人要使用MySQL 都必须提供用户名,即便日后出了问题,也容易查找问题的源头。   3、除了root用户外,其他用户包括匿名用户(如果没有删除这个用户)不应该拥有grant权限,防止管理权限不受控制的扩散出去。   4、赋予用户updatedeletealertcreatedrop权限的时候,应该限定到特定的数据库,尤其要避免普通客户拥有对MySQL数据库做操作的权限,否则你的系统设置很可能被替换掉。   5、检查MySQL.user表,取消不必要用户的shutdown_priv,reload_priv,process_priv和File_priv权限,这些权限可能泄漏更多的服务器信息包括非MySQL的其它信息出去。   6、如果不打算让你的用户使用MySQL数据库,在提供诸如php这样的脚本语言的时候,重新设置或编译你的php,取消它们对MySQL的默认支持。 <淘宝热门商品:
 

88.00 元  

【广州商盟】外贸男装、男鞋工厂直接供货批发零售

〖亿贝特价〗外贸原单Versace范思哲多LOGO特色羊毛衫、毛衣V灰紫

 

132.00 元 

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


来源:程序员网

小小豆叮

我学习使用java的一点体会

java基本类库的学习 曾经面试过一些java程序员,我出的题目是在使用java时,经常用到哪些类,在哪个包里。很少有人能答好,甚至有人做了2年java程序都没有回答出,他们会用java,但必须依赖工具(指java集成开工具),我觉得他们可以编写出程序,但不能编写出特别好得程序。 我认为作为java程序员必须掌握java类库的两个包:java.lang和java.util这两个包。java.lang包提供的是java编程要用到的基本类包,java程序员天天在用,无非是看别人如何用,自己就如何用,但很少有人去总结一下,比如String 和StringBuffer这两个类有什么差别,应该有很多java程序员说不出来。另外Vector和HashMap这两个类大家都在用,有多少人能说清楚Vector和HashMap继承了哪些类,实现了哪些接口呢。 理论学习。认真阅读java API的以下内容:java.lang包中的String,StringBuffer,Number,Double,Float,Byte,Short,Integer,Long,Character,Boolean,Process,Runtime,System,Object,Cloneable,Class,ClassLoader,Thread,ThreadGroup,Runnable,Package类或接口。java.util包中的Collection,list,Set,ArrayList,LinkedList,Hashset,TreeSet,Iterator,Map,SortedMap,HashMap,TreeMap,Comparator,Arrays,Enumeration,Vector,Stack,Dictionary,Hashtable,Properties,StringTokenizer,BitSet,Date,Calendar,Locale,Random,Observer,Observable类和接口。主要理清楚这些类或接口的继承关系、主要功能。 演绎阶段。通过阅读代码,练习编程,学习并应用这些类和接口。其实这些类的大部分是经常用的,无非对这些类和接口说不清楚。在这些类中,对java.lang和java.util包中的类,最好将各个方法练习使用一次。而对java.util包中Collections framework中的类,最好理清楚各个类和接口之间的关系。常用的类的方法我就不具体介绍了,我举一个使用Observer和Obserable 的例子(摘自《The Complete Reference Java 2 》)。在Observer和Obserable中,java实现了对设计模式Observer的支持。 Watcher.java代码 import java.util.*; class Watcher implements Observer { public void update(Observable obj, Object arg ) { System.out.println("Update() called, count is " + ((Integer) arg).intValue()); } } BeingWatched.java代码 import java.util.*; class BeingWatched extends Observable { void counter( int period ) { for(;period >=0; period-- ) { setChanged(); notifyObservers( new Integer ( period ) ); try { Thread.sleep(100); } catch( InterruptedException e) { System.out.println("Sleep interrupeted" ); } } } }; ObserverDemo.java代码 public class ObserverDemo { public static void main( String[] args ) { BeingWatched observed = new BeingWatched(); Watcher observing = new Watcher(); observed.addObserver( observing); observed.counter(10); } }; 执行结果 Update() called, count is 10 Update() called, count is 9 Update() called, count is 8 Update() called, count is 7 Update() called, count is 6 Update() called, count is 5 Update() called, count is 4 Update() called, count is 3 Update() called, count is 2 Update() called, count is 1 Update() called, count is 0 归纳阶段。总结使用经验,体会这两个包中类的继承关系,对设计模式的支持(如Iterator本身就是设计模式,同时也是工厂方法模式的应用),了解这些类提供的所有功能,比较功能相近类的异同。将这些类的api记在心中。 虽然集成开发环境支持方法提示功能,但我个人认为,对于java.lang和java.util这两个包的api应当熟记于心,java的其他类库在使用时可以查找api。当然如果从事不同的开发,对其他类库应当有相应的了解,如开发swing,就应当对javax.swing包了如执掌,开发b/s结构的程序,就要了解javax.servlet,依个人的应用来开发了。 <淘宝热门商品:
 

37.00 元  

深圳兴鹏电子/专业的索爱外壳配件供应商

【兴鹏电子】索爱W800外壳W800c机壳 高品质做工 比肩原装 大图

 

¥:21.00 

【义乌绘美家居】【收藏本店送礼品】


来源:程序员网

小小豆叮

JDB 的简单使用

当新手开始学习Java时,在一开始的新鲜感后马上就会发现的一个问题就是如何调试。大家知道在Visual C++中提供了很好的调试工具,使用起来特别的方便。Java中,以JDK为例,没有一个方便的图形界面,所以给新手调试带来了很多的困难。很多人一开始是用System.out.println()来观察输出结果。如果写的程序很大,这样的方法就显然是效率太低。下面结合自己的学习体会简单谈一下Java中的调试工具JDB的使用。 环境:jdk 1.2.2 首先我们写一个最简单的小程序,但是它包含了一些最基本的面向对象要素。 class test { int a; int b; test(int aa,int bb) { a = aa; b = bb; } int add() {return a+b;} } public class hehe { public static void main(String args[]) { int a = 2; int b = 3; int c= a+b; System.out.println(c); test kk=new test(1,2); System.out.println(kk.add()); } } 存为hehe.java后,用javac -g hehe.java进行编译。用参数g是为了产生各种调试信息,不用就无法调试。如果这里遇到问题,请参考Helloworld攻略。上面的程序是可以通过的,可以直接用java hehe运行。下面结合该例子谈谈JDB的使用。 首先键入jdb hehe 如果出现下面信息,说明系统没有找到调试的类。此时可以用java -classpath . hehe命令解决。 C:javasource>jdb hehe Initializing jdb... hehe not found > 如果出现一下信息,说明开始进行调试,一切正常。如果是调试Applet,则用 appletviewer -debug hehe.html命令进行调试 C:javasource>jdb -classpath . hehe Initializing jdb... 0xb0:class(hehe) > 回想VC中的调试,应该是设置断点,然后再进行跟踪。Java中也是一样。用stop命令进行断点设置。然后用 run 命令开始调试,运行程序到断点,这里断点是设置在 main 主函数中。 > stop at hehe:18 Breakpoint set at hehe:18 > run run hehe running ... main[1] Breakpoint hit: hehe.main (hehe:18) main[1] 此时可以用locals命令查看变量,用step命令进入下一条命令,也可以用单独一个stop命令来查看断点的设置情况。注意此时b还没有被赋值。 main[1] locals Method arguments: Local variables: args = a = 2 main[1] step main[1] Breakpoint hit: hehe.main (hehe:19) main[1] 当运行到System.out.println()函数时,会出现一下提示: main[1] step main[1] Breakpoint hit: java.lang.ClassLoader.loadClass (ClassLoader:247) 这个是因为我们跟踪进去了println方法,我们一般没有必要这样做,此时可以用next跳过该方法进入到下一条一句。step的含义是进入函数跟踪,next是转入下一条语句执行。我们随时可以键入 locals 和 list 命令来查看变量值和当前运行的代码。下面箭头指到地方即为当前程序运行到的地方。 main[1] next main[1] Breakpoint hit: hehe.main (hehe:20) main[1] list 16 { 17 int a = 2; 18 int b = 3; 19 int c= a+b; 20 => System.out.println(c); 21 test kk=new test(1,2); 22 System.out.println(kk.add()); 23 24 } main[1] 接下来的问题自然是如何查看对象。当程序运行到new命令处时,键入locals,可以看到 main[1] step main[1] Breakpoint hit: test. (test:5) main[1] list 1 class test 2 { 3 int a; 4 int b; 5 => test(int aa,int bb) 6 { 7 a = aa; 8 b = bb; 9 } main[1] locals Method arguments: Local variables: this = test@64fd6722 aa = 1 bb = 2 main[1] 可以看到此时显示的变量值是类test中构造函数中的变量值。this对象即为当前构造的对象。可以用dump命令进行查看。 main[1] dump this this = (test)0x11a { int b = 0 int a = 0 } 也可以在main函数中用dump kk和print命令命令进行对象查看 main[1] dump kk kk = (test)0x11a { int b = 2 int a = 1 } main[1] print kk kk = test@64fd6722 main[1] print kk.a kk.a = 1 main[1] print kk.b kk.b = 2 最后键入cont命令,如果没有其他断点,程序就直接运行完毕退出。调试结束。 main[1] cont 3 > Current thread "main" died. Execution continuing... > hehe exited 上述操作中的断点都是设置在main函数中的,如果要设置在调用的类方法中,则要用 stop in yourclassname.functionname 命令来进行设置,比如说: > stop in test.add Breakpoint set in test.add > run run hehe running ... main[1] 5 Breakpoint hit: test.add (test:11) main[1] list 7 a = aa; 8 b = bb; 9 } 10 int add() 11 => {return a+b;} 12 } 13 public class hehe 14 { 15 public static void main(String args[]) main[1] 这样的话,我们已经可以在程序中的几乎所有需要地方的地方进行断点设置并进行跟踪,查看变量。 JDB还有很多的调试手段,除了上面那些最常用的,其他很重要的还有clear清除断点,use设置源程序路径,memory显示当前内存使用状况,gc强制进行内存回收,!!重复上面的命令,thread设置当前线程,quit和exit退出jdb等,还有远程调试等内容,都很有用。这里就不一一介绍了。 <淘宝热门商品:
 

36.9元  

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

 

 

专做VIVI昕薇瑞丽韩日女装~


来源:程序员网

小小豆叮