输入输出类

import java.io.*; public class KeyboardInput{ private final BufferedReader in=new BufferedReader(new InputStreamReader(System.in)); public final synchronized int readInteger(){ String input=""; int value=0; try{ input=in.readLine(); } catch (IOException e){} if(input!=null){ try{ value=Integer.parseInt(input); } catch(NumberFormatException e){} } return value; } public final synchronized long readLong(){ String input=""; long value=0L; try{ input=in.readLine(); } catch (IOException e){} if(input!=null){ try{ value=Long.parseLong(input); } catch(NumberFormatException e){} } return value; } public final synchronized double readDouble(){ String input=""; double value=0.0D; try{ input=in.readLine(); } catch (IOException e){} if(input!=null){ try{ value=Double.parseDouble(input); } catch(NumberFormatException e){} } return value; } public final synchronized float readFloat(){ String input=""; float value=0.0F; try{ input=in.readLine(); } catch (IOException e){} if(input!=null){ try{ value=Float.parseFloat(input); } catch(NumberFormatException e){} } return value; } public final synchronized char readCharacter(){ char c=; try{ c=(char)in.read(); } catch (IOException e){} return c; } public final synchronized String readString(){ String s=""; try{ s=in.readLine(); } catch (IOException e){} if(s==null){ s=""; } return s; } } <淘宝热门商品:
 

 

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

 

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

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

来源:程序员网

小小豆叮

JSP中的pageEncoding和contentType属性

关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是jsp文件本身的编码 contentType的charset是指服务器发送给客户端时的内容编码 JSP要经过两次的“编码”,第一阶段会用pageEncoding,第二阶段会用utf-8至utf-8,第三阶段就是由Tomcat出来的网页, 用的是contentType。 第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。 第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。 JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。 第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效 contentType的設定. pageEncoding 和contentType的预设都是 ISO8859-1. 而随便设定了其中一个, 另一个就跟着一样了(TOMCAT4.1.27是如此). 但这不是绝对的, 这要看各自JSPC的处理方式. 而pageEncoding不等于contentType, 更有利亚洲区的文字 CJKV系JSP网页的开发和展示, (例pageEncoding=GB2312 不等于 contentType=utf-8)。 jsp文件不像.java,.java在被编译器读入的时候默认采用的是操作系统所设定的locale所对应的编码,比如中国大陆就是GBK,台湾就是BIG5或者MS950。而一般我们不管是在记事本还是在ue中写代码,如果没有经过特别转码的话,写出来的都是本地编码格式的内容。所以编译器采用的方法刚好可以让虚拟机得到正确的资料。 但是jsp文件不是这样,它没有这个默认转码过程,但是指定了pageEncoding就可以实现正确转码了。 举个例子: <%@ page contentType="text/html;charset=utf-8" %> 大都会打印出乱码,因为输入的“你好”是gbk的,但是服务器是否正确抓到“你好”不得而知。 但是如果更改为 <%@ page contentType="text/html;charset=utf-8" pageEncoding="GBK"%> 这样就服务器一定会是正确抓到“你好”了 <淘宝热门商品:
 

149.00 元 

专柜正品八心八箭瑞士钻石1.2克拉恬美吊坠项链

 

30.00 元 

实图12色2WAY含羊毛打底毛衣

来源:程序员网

小小豆叮

.NET Micro Framework技术大会圆满成功

掌握前沿,共创未来” ——.NET Micro Framework技术大会圆满成功 2007年9月18 日,微软公司与信息产业部软件与集成电路促进中心(CSIP)联合主办的.NET Micro Framework技术大会在京隆重召开。 会上,信息产业部软件与集成电路促进中心的邱善勤副主任代表CSIP与微软公司签署了《Porting Kit Agreement》。该协议的签署标志着CSIP与微软公司在嵌入式领域的战略合作进入了更新、更快速的发展阶段。今后CSIP将联合微软公司为国内嵌入式设备厂商提供.NET Micro Framework技术咨询、培训、协作开发等服务。 会中,来自美国的.NET Micro Framework产品组总监、.NET Micro Framework 之父——Colin Miller,向参会的中国硬件厂商全面介绍了.NET Micro Framework的技术体系和典型应用场景,并发布了.NET Micro Framework中国支持计划。本次大会的赞助厂商Digi和Freescale场演示和讲解了.NET Micro Framework行业解决方案、MII-MS嵌入式实验室技术经理介绍了CSIP面向.NET Micro Framework的市场推广支持计划、微软战略合作部技术专家就.NET Micro Framework的应用开发及中国市场前景与参会的硬件厂商展开了深入的讨论。 微软公司作为全球IT行业的领先者,一直致力于把世界领先的理念、技术和成功经验介绍到中国,帮助中国企业提升软件开发能力,促进整个产业的持续发展。 在过去几年里,Microsoft为嵌入式领域提供了 XP Embedded 、 Windows CE 等操作系统,它们已经成为PDA、智能手机、自动柜员机、网络交换机等很多设备的平台。Microsoft 推出的.NET Compact Framework 把强大、可靠的托管代码从大型服务器扩展到了嵌入式设备。但是,依然有许多设备由于资源限制而无法支持这些平台。 这也是嵌入式领域的软件一直无法做大做强的一个很重要原因——缺乏统一的开发平台,因为在不同平台间移植应用程序要花费高昂的代价。为了响应微型设备的市场需要,Microsoft 开发了.NET Micro Framework (.NET MF) 这一新平台。.NET Micro Framework 定位于这个未开发的领域,向微型设备提供小巧、高效的.NET 运行时的实现。开发人员将能够使用同样的托管代码,使用同样的世界级的工具,继续参与到全世界最大的开发社区。 .NET Micro Framework是微软公司基于.NET平台,主要针对硬件资源非常稀少、有限的嵌入式应用而设计的快速嵌入式开发技术。它针对传统的SOC、MCU市场设计,可以运行在ARM7/ARM9之上,对于低端的ARM7处理器,可以不具备存储器管理单元(MMU),而存储器方面更是只要300KB左右的容量即可运作。特别适合Windows Vista Sideshow、远程控制、智能家电、医疗电子、零售终端以及汽车电子等行业应用场景。并且用户使用统一的Visual Studio .NET平台和托管代码(C#)开发产品应用,包括设备驱动!显著的降低了厂商开发门槛,节约了大量开发时间和开发成本。 从2004年4月信息产业部与微软公司签订合作备忘录在CSIP成立MII-MS Windows/.Net平台软件实验室和嵌入式系统与硬件平台实验室开始,CSIP就致力于向国内业界提供与微软嵌入式平台技术(Windows XP Embedded及Windows CE.NET)相关的技术推广和技术支持服务,传播最新的Windows Embedded技术。 此次CSIP与微软强强联手在国内共同推广.NET Micro Framework意义重大。CSIP将继续担当中国嵌入式产业发展的引领者,连接美国产品组和中国本地的OEM/ODM,并向各企业提供相关的咨询服务,引进技术本地化,提供技术培训,商讨应用解决方案,成立爱好者俱乐部和联盟等。这对于嵌入式设备厂商和嵌入式开发者来说,是个不容错过的提升自身技术能力的良好机会。 此次大会的圆满成功标志着中国嵌入式技术的发展进入了一个新台阶,.NET Micro Framework将在多种工用、民用领域中,为嵌入式设备厂商打开一片更为广阔的发展空间 <淘宝热门商品:
 

278.00 元  

拍趣-拍你喜欢 享受乐趣

3皇冠 大遥控 灿凌RMBOX368(高清DVD/RMVB硬盘播放器) AOK

 

26.00 元  

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

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

来源:程序员网

小小豆叮

JSP生成静态页面-Tomcat提高性能之王道

常见的分类信息首页,需读取至少六次数据库;其他子页面,五至十几次次不等。 在使用数据库连接池的情况下,Tomcat可以支撑的并发量也十分有限。系统资源主要消耗在两方面: 1、数据库操作,频繁的从数据库返回结果; 2、Tomcat解析JAVA文件。 将动态页面按一定规则创建一匹.html纯静态页面的过程,称之为生成静态页面。 优点 无须访问数据库,节省了最大的系统消耗。 Tomcat直接返回.html静态文件,无须解析JAVA文件,最大限度的提高效率。 安全,避免了非法传递参数所导致的错误。 缺点 生成的大量.html静态页面需要占用较多的硬盘空间。 失去了动态页面所具有交互性能。 运行稳定的动态页面是生成.html静态页面的前提。 起初,.html静态页面是通过系统频繁的访问(抓取)动态页面,得到运行结果,再而保存为.html档而来的.因此,抓取这一部分操作将是生成静态页面的核心;而如何尽可能减少抓取后的解析操作,取决于动态页面(例:Jsp页面);以何种规则保存这些.html静态页面、如何利用静态页面与用户交互等等也是避不可少的.归纳以下几点: 1、定义规则 绝大部分Jsp页面作用将不再是面对用户,而是供系统调用,得到运行结果,从而保存为.html档.因此,Jsp应该根据核心代码的规则,替换所有.jsp标签及连接.由.html代替。 2、路径 若.html静态页面太多,将不可避免的存放在不同的文件夹下。 在所有Jsp页面里指定以根目录开头的绝对路径,是解决办法之一。 3、交互性能 静态页面不可避免的失去了交互性能,例如:无法统计信息的阅读次数,无法得到Session信息等等.但也并非没有解决的办法,思路是将整张静态页面分割成若干张小页面,小页面依旧可以是.html静态页面,也可以是.Jsp动态页面.例如,可以嵌套某一零高度零宽度的.Jsp文件专门用作统计信息的阅读次数。 4、优化 若信息量比较大,.html静态页面占用硬盘容量也会随之增大.将静态页面共有的部分组织成一张新的.html页面,再令所有静态页面嵌套这样一个文件有助于降低页面体积.(注意该体积只能降低页面的文件大小,无助于提高访问效率) 5、风险 风险主要集中在生成静态页面的这个过程.网络异常可能导致返回的Jsp页面运行结果为空白、频繁读取可能导致Jsp页面未显示完整就保存为.html档等等,都是要考虑的问题 <淘宝热门商品:
 

188.00 元 

深大玉妹Shenda Yummy粉刺液、去痘王,

 

 

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

来源:程序员网

小小豆叮

JAVA中的反射机制详解

JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。 1. 得到某个对象的属性 1 public Object getProperty(Object owner, String fieldName) throws Exception { 2 Class ownerClass = owner.getClass(); 3 4 Field field = ownerClass.getField(fieldName); 5 6 Object property = field.get(owner); 7 8 return property; 9 } Class ownerClass = owner.getClass():得到该对象的Class。 Field field = ownerClass.getField(fieldName):通过Class得到类声明的属性。 Object property = field.get(owner):通过对象得到该属性的实例,如果这个属性是非公有的,这里会报IllegalAccessException。 2. 得到某个类的静态属性 1 public Object getStaticProperty(String className, String fieldName) 2 throws Exception { 3 Class ownerClass = Class.forName(className); 4 5 Field field = ownerClass.getField(fieldName); 6 7 Object property = field.get(ownerClass); 8 9 return property; 10 } Class ownerClass = Class.forName(className) :首先得到这个类的Class。 Field field = ownerClass.getField(fieldName):和上面一样,通过Class得到类声明的属性。 Object property = field.get(ownerClass) :这里和上面有些不同,因为该属性是静态的,所以直接从类的Class里取。 3. 执行某对象的方法 1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception { 2 3 Class ownerClass = owner.getClass(); 4 5 Class[] argsClass = new Class[args.length]; 6 7 for (int i = 0, j = args.length; i < j; i++) { 8 argsClass[i] = args[i].getClass(); 9 } 10 11 Method method = ownerClass.getMethod(methodName, argsClass); 12 13 return method.invoke(owner, args); 14 } Class owner_class = owner.getClass() :首先还是必须得到这个对象的Class。 5~9行:配置参数的Class数组,作为寻找Method的条件。 Method method = ownerClass.getMethod(methodName, argsClass):通过Method名和参数的Class数组得到要执行的Method。 method.invoke(owner, args):执行该Method,invoke方法的参数是执行这个方法的对象,和参数数组。返回值是Object,也既是该方法的返回值。 4. 执行某个类的静态方法 1 public Object invokeStaticMethod(String className, String methodName, 2 Object[] args) throws Exception { 3 Class ownerClass = Class.forName(className); 4 5 Class[] argsClass = new Class[args.length]; 6 7 for (int i = 0, j = args.length; i < j; i++) { 8 argsClass[i] = args[i].getClass(); 9 } 10 11 Method method = ownerClass.getMethod(methodName, argsClass); 12 13 return method.invoke(null, args); 14 } 基本的原理和实例3相同,不同点是最后一行,invoke的一个参数是null,因为这是静态方法,不需要借助实例运行。 5. 新建实例 1 2 public Object newInstance(String className, Object[] args) throws Exception { 3 Class newoneClass = Class.forName(className); 4 5 Class[] argsClass = new Class[args.length]; 6 7 for (int i = 0, j = args.length; i < j; i++) { 8 argsClass[i] = args[i].getClass(); 9 } 10 11 Constructor cons = newoneClass.getConstructor(argsClass); 12 13 return cons.newInstance(args); 14 15 } 这里说的方法是执行带参数的构造函数来新建实例的方法。如果不需要参数,可以直接使用newoneClass.newInstance()来实现。 Class newoneClass = Class.forName(className):第一步,得到要构造的实例的Class。 第5~第9行:得到参数的Class数组。 Constructor cons = newoneClass.getConstructor(argsClass):得到构造子。 cons.newInstance(args):新建实例。 6. 判断是否为某个类的实例 1 public boolean isInstance(Object obj, Class cls) { 2 return cls.isInstance(obj); 3 } 7. 得到数组中的某个元素 1 public Object getByArray(Object array, int index) { 2 return Array.get(array,index); 3 } <淘宝热门商品:
 

0.70 元  

滋补品专门店/雪蛤油 燕窝 低价运作拒绝暴利,令美丽不再昂贵!

 

¥:89.00 

爱相依外贸童装.精品低价.15天无理由退货

特价 贺年款 精美棉大衣外套/棉衣/棉袄 帽子可拆卸 3971

来源:程序员网

小小豆叮

如何掌握JDK1.5枚举类型

Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。   1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。   2.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。   3.Enum默认实现了java.lang.Comparable接口。   4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.   5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。   6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。   7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。   了解了这些基本特性,我们来看看如何使用它们。   1.遍历所有有枚举值. 知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。   for (Color c: Color.values())   System.out.println(“find value:” + c);   2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。   public enum Color {   Red,   Green,   Blue;   /*   *定义一个变量表示枚举值的数目。   *(我有点奇怪为什么sun没有给enum直接提供一个size方法).   */   private static int number = Color.values().length ;   /**   * 随机返回一个枚举值   @return a random enum value.   */   public static Color getRandomColor(){   long random = System.currentTimeMillis() % number;   switch ((int) random){    case 0:     return Color.Red;    case 1:     return Color.Green;    case 2:     return Color.Blue;    default : return Color.Red;   }   }   }   可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。   3.覆载(Override)toString, valueOf方法   前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。   ….   public String toString(){   switch (this){   case Red:    return "Color.Red";   case Green:    return "Color.Green";   case Blue:    return "Color.Blue";   default:    return "Unknow Color";   }   }   ….   这时我们可以看到,此时再用前面的遍历代码打印出来的是   Color.Red   Color.Green   Color.Blue   而不是   Red   Green   Blue.   可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。   4.使用构造函数   虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。   public enum Color {   Red("This is Red"),   Green("This is Green"),   Blue("This is Blue");   private String desc;   Color(String desc){   this.desc = desc;   }   public String getDesc(){   return this.desc;   }   }   这里我们为每一个颜色提供了一个说明信息, 然后定义了一个构造函数接受这个说明信息。   要注意这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。   5.实现特定的接口   我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。   6.定义枚举值自己的方法。   前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。   public enum Color {   Red {   public String toString(){    return "Color.Red";   }   },   Green {   public String toString(){    return "Color.Green";   }   },   Blue{   public String toString(){    return "Color.Blue";   }   };   }   从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。   总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了 <淘宝热门商品:
 

¥:4.00 

蓉蓉de美女加工厂 打造淘宝最低价

 

288.00 元 

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

来源:程序员网

小小豆叮

Java程序员需要了解的几个开源协议

Mozilla Public License   MPL License,允许免费重发布、免费修改,但要求修改后的代码版权归软件的发起者。这种授权维护了商业软件的利益,,它要求基于这种软件得修改无偿贡献版权给该软件。这样,围绕该软件得所有代码得版权都集中在发起开发人得手中。但MPL是允许修改,无偿使用得。MPL软件对链接没有要求。   BSD开源协议   BSD开源协议是一个给于使用者很大自由的协议。可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。 当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:   1. 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。   2. 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。   3. 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。   BSD代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。   Apache Licence 2.0   Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件:   1. 需要给代码的用户一份Apache Licence   2. 如果你修改了代码,需要再被修改的文件中说明。   3. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。   4. 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。   Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。   GPL   GPL许可证是自由软件的应用最广泛的软件许可证,人们可以修改程式的一个或几个副本或程式的任何部分,以此形成基於这些程式的衍生作品。必须在修改过的档案中附有明显的说明:您修改了此一档案及任何修改的日期。 您必须让您发布或出版的作品,包括本程式的全部或一部分,或内含本程式的全部或部分所衍生的作品,允许第三方在此许可证条款下使用,并且不得因为此项授权行为而收费。   LGPL   Linux就是采用了GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商业软件公司开发的免费软件了。   GPL协议的主要内容是只要在一个软件中使用(“使用”指类库引用,修改后的代码或者衍生代码)GPL协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。   由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。   其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似   Public Domain   公共域授权。将软件授权为公共域,这些软件包没有授权协议,任何人都可以随意使用它。   Artistic许可   使作者保持对进一步开发的控制 <淘宝热门商品:
 

 

【上海商盟】高更食品极美滋新奥尔良系列烧烤腌料皇冠旗舰店

 

19.00 元  

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

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

来源:程序员网

小小豆叮

利用Java Applet编程实现动画显示特技

在Java中实现动画有很多种办法,但它们实现的基本原理是一样的,即在屏幕上画出一系列的帧来造成运动的感觉。 Java 不仅提供了对图形、图像的支持,还允许用户实现连续的图像播放,即动画技术。Java 动画的实现,首先用Java.awt 包中的 Graphics 类的drawImage()方法在屏幕上画出图像,然后通过定义一个线程,让该线程睡眠一段时间,然后再切换成另外一幅图像;如此循环,在屏幕上画出一系列的帧来造成运动的感觉,从而达到显示动画的目的。 为了每秒钟多次更新屏幕,必须创建一个线程来实现动画的循环,这个循环要跟踪当前帧并响应周期性的屏幕更新要求;实现线程的方法有两种,可以创建一个类Thread 的派生类,或附和在一个Runnable 的界面上。 * 动画技巧 在编写动画过程时,遇到最常见的问题是屏幕会出现闪烁现象。闪烁有两个原因:一是绘制每一帧花费的时间太长(因为重绘时要求的计算量大);二是在每次调用Pain()前,Java 会用背景颜色重画整个画面,当在进行下一帧的计算时,用户看到的是背景。 有两种方法可以明显地减弱闪烁:重载 update()或使用双缓冲。 (1) 重载 update() 当AWT接收到一个applet的重绘请求时,它就调用applet的 update(),默认地,update() 清除applet的背景,然后调用 paint()。重载 update(),将以前在paint()中的绘图代码包含在update()中,从而避免每次重绘时将整个区域清除。下面是 update()方法的原始程序代码: public void update(Graphics g) {   //首先用背景色来绘制整个画面   g.setColor(getBackGround());   g.fillRect(0,0,width,height);   //接着设置前景色为绘制图像的颜色,然后调用paint()方法   g.setColor(getForeGround());   paint(g); } 所以要消除画面闪烁就一定要改写 update() 方法,使该方法不会清除整个画面,只是消除必要的部分。 (2) 使用双缓冲技术 另一种减小帧之间闪烁的方法是使用双缓冲,它在许多动画Applet中被使用。其主要原理是创建一个后台图像,将需要绘制的一帧画入图像,然后调用DrawImage()将整个图像一次画到屏幕上去;好处是大部分绘制是离屏的,将离屏图像一次绘至屏幕上比直接在屏幕上绘制要有效得多,大大提高做图的性能。 双缓冲可以使动画平滑,但有一个缺点,要分配一张后台图像,如果图像相当大,这将需要很大一块内存;当你使用双缓冲技术时,应重载 update()。 下面举一个时钟的例子来说明如何处理动画 //AnimatorDemo.java import java.util.*; import java.awt.*; import java.applet.*; import java.text.*; public class AnimatorDemo extends Applet implements Runnable {   Thread timer; // 用于显示时钟的线程   int lastxs, lastys, lastxm,   lastym, lastxh, lastyh;   SimpleDateFormat formatter; //格式化时间显示   String lastdate; // 保存当前时间的字符串   Font clockFaceFont; //设置显示时钟里面的数字的字体   Date currentDate; // 显示当前时间   Color handColor; // 用于显示时针、分针和表盘的颜色   Color numberColor; // 用于显示秒针和数字的颜色   public void init()   {    int x,y;    lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0;    formatter = new SimpleDateFormat ("yyyy EEE MMM dd hh:mm:ss ");    currentDate = new Date();    lastdate = formatter.format(currentDate);    clockFaceFont = new Font("Serif", Font.PLAIN, 14);    handColor = Color.blue;    numberColor = Color.darkGray;    try {     setBackground(new Color(Integer.parseInt(getParameter("bgcolor"),16)));    } catch (Exception E) { }    try {     handColor = new Color(Integer.parseInt(getParameter("fgcolor1"),16));    } catch (Exception E) { }    try {     numberColor = new Color(Integer.parseInt(getParameter("fgcolor2"),16));    } catch (Exception E) { }    resize(300,300); // 设置时钟窗口大小   }   // 计算四分之一的圆弧   public void plotpoints(int x0, int y0, int x, int y, Graphics g)   {    g.drawLine(x0+x,y0+y,x0+x,y0+y);    g.drawLine(x0+y,y0+x,x0+y,y0+x);    g.drawLine(x0+y,y0-x,x0+y,y0-x);    g.drawLine(x0+x,y0-y,x0+x,y0-y);    g.drawLine(x0-x,y0-y,x0-x,y0-y);    g.drawLine(x0-y,y0-x,x0-y,y0-x);    g.drawLine(x0-y,y0+x,x0-y,y0+x);    g.drawLine(x0-x,y0+y,x0-x,y0+y);   }   // 用Bresenham算法来画圆,其中(x0,y0)是圆的中心,r为圆半径   public void circle(int x0, int y0, int r, Graphics g)   {    int x,y;    float d;    x=0;    y=r;    d=5/4-r;    plotpoints(x0,y0,x,y,g);    while (y>x) {     if (d<0) {      d=d+2*x+3;      x++;     }     else {      d=d+2*(x-y)+5;      x++;      y--;      }     plotpoints(x0,y0,x,y,g);    }   }   public void paint(Graphics g)   {    int xh, yh, xm, ym, xs, ys, s = 0, m = 10, h = 10, xcenter, ycenter;    String today;    currentDate = new Date();    SimpleDateFormat formatter = new SimpleDateFormat("s",Locale.getDefault());    try {     s = Integer.parseInt(formatter.format(currentDate));    } catch (NumberFormatException n) {     s = 0;    }    formatter.applyPattern("m");    try {     m = Integer.parseInt(formatter.format(currentDate));    } catch (NumberFormatException n) {     m = 10;    }    formatter.applyPattern("h");    try {     h = Integer.parseInt(formatter.format(currentDate));    } catch (NumberFormatException n) {     h = 10;    }    formatter.applyPattern("EEE MMM dd HH:mm:ss yyyy");    today = formatter.format(currentDate);    //设置时钟的表盘的中心点为(80,55)    xcenter=80;    ycenter=55;    // a= s* pi/2 - pi/2 (to switch 0,0 from 3:00 to 12:00)    // x = r(cos a) + xcenter, y = r(sin a) + ycenter    xs = (int)(Math.cos(s * 3.14f/30 - 3.14f/2) * 45 + xcenter);    ys = (int)(Math.sin(s * 3.14f/30 - 3.14f/2) * 45 + ycenter);    xm = (int)(Math.cos(m * 3.14f/30 - 3.14f/2) * 40 + xcenter);    ym = (int)(Math.sin(m * 3.14f/30 - 3.14f/2) * 40 + ycenter);    xh = (int)(Math.cos((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + xcenter);    yh = (int)(Math.sin((h*30 + m/2) * 3.14f/180 - 3.14f/2) * 30 + ycenter);    //画时钟最外面的圆盘其中心在(xcenter,ycenter)半径为50    g.setFont(clockFaceFont);    g.setColor(handColor);    circle(xcenter,ycenter,50,g);    //画时钟表盘里的数字    g.setColor(numberColor);    g.drawString("9",xcenter-45,ycenter+3);    g.drawString("3",xcenter+40,ycenter+3);    g.drawString("12",xcenter-5,ycenter-37);    g.drawString("6",xcenter-3,ycenter+45);    // 如果必要的话抹去然后重画    g.setColor(getBackground());    if (xs != lastxs || ys != lastys) {     g.drawLine(xcenter, ycenter, lastxs, lastys);     g.drawString(lastdate, 5, 125);    }    if (xm != lastxm || ym != lastym) {     g.drawLine(xcenter, ycenter-1, lastxm, lastym);     g.drawLine(xcenter-1, ycenter, lastxm, lastym); }     if (xh != lastxh || yh != lastyh) {      g.drawLine(xcenter, ycenter-1, lastxh, lastyh);      g.drawLine(xcenter-1, ycenter, lastxh, lastyh); }     g.setColor(numberColor);     g.drawString("", 5, 125);     g.drawString(today, 5, 125);     g.drawLine(xcenter, ycenter, xs, ys);     g.setColor(handColor);     g.drawLine(xcenter, ycenter-1, xm, ym);     g.drawLine(xcenter-1, ycenter, xm, ym);     g.drawLine(xcenter, ycenter-1, xh, yh);     g.drawLine(xcenter-1, ycenter, xh, yh);     lastxs=xs; lastys=ys;     lastxm=xm; lastym=ym;     lastxh=xh; lastyh=yh;     lastdate = today;     currentDate=null;    }    //applet的启动方法    public void start()    {     timer = new Thread(this);     timer.start();    }    // applet的停止方法    public void stop()    {     timer = null;    }    //线程的run方法    public void run()    {     Thread me = Thread.currentThread();     while (timer == me) {      try {       Thread.currentThread().sleep(1000);      }      catch (InterruptedException e) {      }      repaint();     }    }    //注意:这里重写了update()方法,只是调用了paint()方法来消除闪烁现象    public void update(Graphics g)    {     paint(g);    }   } 下面是运行该Applet 需要的AnimatorDemo.html 的内容 <HTML> <HEAD>   <TITLE>一个时钟的例子</TITLE> </HEAD> <BODY>   <hr>   <applet codebase="." ALIGN=MIDDLE code="AnimatorDemo.class" width=200 height=150>   </applet> </BODY> </HTML> <淘宝热门商品:
 

118.00 元 

【冲皇冠】八心八箭瑞士钻石六爪经典钻戒指

 

105.00 元 

Levi's 复古铜系列情侣款女装牛仔裤

来源:程序员网

小小豆叮

开源技术基础:教你如何熟练使用TOMCAT

一、小猫TOMCAT其实很可爱 2003年底,我换公司了,同样也换了WEBAPP,TOMCAT出现在我的面前(以前使用weblogic),我有点茫然,免费的东西真的能用的好么?担心ING……(其实是在火星呆太久)出门一打听,原来此猫出自名门-jakarta项目,2001年度最具创新的java产品(Most Innovative Java Product),又有JAVA的老大SUN的力捧(官方推荐的servlet和jsp容器),以后就靠它吃饭了。不说二话,搞起来先: 1、 安装 TOMCAT最新版本是5.0.29(http://jakarta.apache.org/site/binindex.cgi) 如果在WINDOWS下它可以自动找到你的JDK或者set JAVA_HOME=c:/jdk 在LINUX下需要先解压,然后设置JAVA_HOME export JAVA_HOME=/usr/local/jdk 2、 RUN 设置完毕后就可以运行tomcat服务器了,进入tomcat的bin目录,WINDOWS下用startup启动tomcat,linux下用startup.sh,相应的关闭tomcat的命令为shutdown和shutdown.sh。 启动服务后在浏览器里输入http://localhost:8080/来测试一下 3、 目录结构 Bin:存放启动和关闭tomcat脚本。 Conf:包含不同的配置文件,server.xml(Tomcat的主要配置文件)。 Work:存放jsp编译后产生的class文件。 Webapp:存放应用程序示例,以后你要部署的应用程序也要放到此目录。 Logs:存放日志文件 Comm./server/shared:这三个文件夹下的LIB文件夹放jar文件。 1、 配置server.xml文件 没有什么好说的,看TOMCAT的文档比较有用,这里提供一些主要的东西吧。 元素名 属性 解释 server port 指定一个端口,这个端口负责监听关闭tomcat的请求 shutdown 指定向端口发送的命令字符串 service name 指定service的名字 Connector(表示客户端和service之间的连接) port 指定服务器端要创建的端口号,并在这个断口监听来自客户端的请求 minProcessors 服务器启动时创建的处理请求的线程数 maxProcessors 最大可以创建的处理请求的线程数 enableLookups 如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址 redirectPort 指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号 acceptCount 指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理 connectionTimeout 指定超时的时间数(以毫秒为单位) Engine(表示指定service中的请求处理机,接收和处理来自Connector的请求) defaultHost 指定缺省的处理请求的主机名,它至少与其中的一个host元素的name属性值是一样的 Context(表示一个web应用程序,通常为WAR文件,关于WAR的具体信息见servlet规范) docBase 应用程序的路径或者是WAR文件存放的路径 path 表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/**** reloadable 这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序 host(表示一个虚拟主机) name 指定主机名 appBase 应用程序基本目录,即存放应用程序的目录 unpackWARs 如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序 Logger(表示日志,调试和错误信息) className 指定logger使用的类名,此类必须实现org.apache.catalina.Logger 接口 prefix 指定log文件的前缀 suffix 指定log文件的后缀 timestamp 如果为true,则log文件名中要加入时间,如下例:localhost_log.2001-10-04.txt Realm(表示存放用户名,密码及role的数据库) className 指定Realm使用的类名,此类必须实现org.apache.catalina.Realm接口 Valve(功能与Logger差不多,其prefix和suffix属性解释和Logger 中的一样) className 指定Valve使用的类名,如用org.apache.catalina.valves.AccessLogValve类可以记录应用程序的访问信息 directory 指定log文件存放的位置 pattern 有两个值,common方式记录远程主机名或ip地址,用户名,日期,第一行请求的字符串,HTTP响应代码,发送的字节数。combined方式比common方式记录的值更多 <淘宝热门商品:
 

 

『女人天生是妖精』店内商品均为现货 拍下后可直接留言修改运费

 

保健品/滋补品 

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

来源:程序员网

小小豆叮

JBuilder和JDeveloper的比较

lder是Borland公司开发的java开发的工具,而JDeveloper是Oracle公司提供给大家使用的IDE工具,最近的开发过程中分别使用了这两种工具,现在来谈一下自己在设计和开发的过程中发现的两种工具的不同,并对两种工具提供的功能做一个简单的比较,希望与大家共同交流。 一、UML设计:在开发之前,我们首先想到使用UML对所要开发的项目进行设计,以使自己在真正编码的时候做到心中有数。在这个方面,JDeveloper比Jbuilder有着天然的优势,因为在Jdeveloper中就包含了创建UML图的工具,我们可以方便的在一个工具下进行UML的设计,并且在其中,从图到代码的转换是自动完成的,而不需要我们手动的进行转换,而且,所有的图示与源代码都是处于一个工程中的,这也方便了我们对整个工程的把握和管理。 而在Jbuilder的开发过程中,我们不得不借助与其他的工具进行UML设计,我们选择的是Borland公司专门针对JBuilder的Together Designer for Jbuilder,然而,这个工具在一定程度上与我们的工程有些不协调的地方。我并不是说这个工具不如JDeveloper中的UML设计工具,相反,我觉得在很大程度上,尤其是方便易用的方面,Together Designer比JDeveloper有更大的优势,一方面Together Designer 2005全面集成的针对UML 2.0的支持,我们可以在其中非常方面的建立UML的设计。(可惜我对UML2.0的理解还不太深入,没有胆量使用,呵呵),另一方面,里面集成了一些模式的模板。哪些模式呢?那就是大家最熟悉的“四人帮”所提出的那些模式,这样如果我们在设计过程中使用了设计模式的话,就可以方便的调用,而无需自己设计,这一点也是非常方便的。但是我们的设计是一个非常小的工程,我考虑了一下,但是暂时没有发现可以使用设计模式的地方,可惜了这么好的功能。 另外,我个人觉得有一点二者是各有所长,那就是对参数的处理上,在JDeveloper中,所有的参数我们都需要手动输入,并且可以在设计图中显示。而在Together Designer中,我们可以向在编制程序的过程中一样,对一个操作的各项参数进行详细的设计,但是所有的参数都不会显示在图上,这项功能我想每个人的看法都是不一样的,如果说好,那么这样的设计可以避免由于操作的描述太长,而在页面显示上出现问题。如果说不好,那就是我们在看UML图的时候无法了解到其中参数的情况。 在设计的过程中,应该说二者是打了一个平手。 二、开发:这个方面我主要指的就是实际的编码工作,在这个方面,Oracle作为数据库方面的老大,当然对数据库的支持方面为我们提供了很多的方便,但是正如大家所知道的,Borland所提供的开发工具都是以简单易用、对用户友好而出名的,在实际的开发过程中,在代码自动完成,错误自动修正还有调试的过程中,JBuilder都提供了JDeveloper所不能提供的方便,这也是我们最终在开发的时候选择了JBuilder的原因。 例如:当我们在代码中使用了一个我们没有引用的类的时候,JDeveloper只是简单的为我们报错,而不会给我们提供解决的方法,而在Jbuilder当中,我们可以方便的按下alt+enter来看提示,并在建议的改进方法中选择自动修改我们的错误。或者在java开发中我们深恶痛绝的catch exception,有些操作由于没有捕获异常,而不能在编译过程中通过,在JDeveloper中我们只能老老实实的添加try……catch,然而在Jbuilder中,我们同样可以让它自动完成这项功能。 在这个方面,应该说JBuilder在很大程度上获得了胜利 <淘宝热门商品:
 

 

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

 

 

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

来源:程序员网

小小豆叮

为什么面向对象的数据库不普及

中国的软件为什么发展这么慢.还有就是现在主流的三层架构或者是多层架构,而瓶颈就在于数据库的性能 跟不上需求,换句话说,也就是数据库的设计拖了现在软件的后腿. 所以就郁闷,为什么OO和关系型数据库按照两个截然不同的理念可以并存 而不去使用面向对象的数据库呢? 我自己有些见解,不知道是否正确: 1.关系型数据库的设计接近于计算机硬件,使得关系型比面向对象的数据库性能要好得多. 2.现在使用关系型数据库的企业太多,更改数据库会使成本上升. 3.数据库开发厂商致力于纯XML,整合SOA,忽略了这方面的需求 真希望哪天能有厂商站出来跟关系型数据库进行竞争,就想当初的C挑战Fortran,Pascal,C++挑战C,JAVA挑战C++一样...得益的是我们众多的开发工作者啊,我也没有针对关系型数据库,毕竟存在就是合理这句话还不是盖的.只是希望能像ROR的出现一样提高我们的开发效率,可能也是等N年之后的事情了. <淘宝热门商品:
 

 

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

 

 

衣品堂

来源:程序员网

小小豆叮

新手入门:写Java程序的三十个基本规则

(1) 类名首字母应该大写。字段、方法以及对象(句柄)的首字母应小写。对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。例如:   ThisIsAClassName   thisIsMethodOrFieldName   若在定义中出现了常数初始化字符,则大写static final基本类型标识符中的所有字母。这样便可标志出它们属于编译期的常数。   Java包(Package)属于一种特殊情况:它们全都是小写字母,即便中间的单词亦是如此。对于域名扩展名称,如com,org,net或者edu等,全部都应小写(这也是Java 1.1和Java 1.2的区别之一)。   (2) 为了常规用途而创建一个类时,请采取“经典形式”,并包含对下述元素的定义:   equals()   hashCode()   toString()   clone()(implement Cloneable)   implement Serializable   (3) 对于自己创建的每一个类,都考虑置入一个main(),其中包含了用于测试那个类的代码。为使用一个项目中的类,我们没必要删除测试代码。若进行了任何形式的改动,可方便地返回测试。这些代码也可作为如何使用类的一个示例使用。   (4) 应将方法设计成简要的、功能性单元,用它描述和实现一个不连续的类接口部分。理想情况下,方法应简明扼要。若长度很大,可考虑通过某种方式将其分割成较短的几个方法。这样做也便于类内代码的重复使用(有些时候,方法必须非常大,但它们仍应只做同样的一件事情)。 (5) 设计一个类时,请设身处地为客户程序员考虑一下(类的使用方法应该是非常明确的)。然后,再设身处地为管理代码的人考虑一下(预计有可能进行哪些形式的修改,想想用什么方法可把它们变得更简单)。   (6) 使类尽可能短小精悍,而且只解决一个特定的问题。下面是对类设计的一些建议:   ■一个复杂的开关语句:考虑采用“多形”机制   ■数量众多的方法涉及到类型差别极大的操作:考虑用几个类来分别实现   ■许多成员变量在特征上有很大的差别:考虑使用几个类 。   (7) 让一切东西都尽可能地“私有”——private。可使库的某一部分“公共化”(一个方法、类或者一个字段等等),就永远不能把它拿出。若强行拿出,就可能破坏其他人现有的代码,使他们不得不重新编写和设计。若只公布自己必须公布的,就可放心大胆地改变其他任何东西。在多线程环境中,隐私是特别重要的一个因素——只有private字段才能在非同步使用的情况下受到保护。   (8) 谨惕“巨大对象综合症”。对一些习惯于顺序编程思维、且初涉OOP领域的新手,往往喜欢先写一个顺序执行的程序,再把它嵌入一个或两个巨大的对象里。根据编程原理,对象表达的应该是应用程序的概念,而非应用程序本身。   (9) 若不得已进行一些不太雅观的编程,至少应该把那些代码置于一个类的内部。   (10) 任何时候只要发现类与类之间结合得非常紧密,就需要考虑是否采用内部类,从而改善编码及维护工作(参见第14章14.1.2小节的“用内部类改进代码”)。   (11) 尽可能细致地加上注释,并用javadoc注释文档语法生成自己的程序文档。   (12) 避免使用“魔术数字”,这些数字很难与代码很好地配合。如以后需要修改它,无疑会成为一场噩梦,因为根本不知道“100”到底是指“数组大小”还是“其他全然不同的东西”。所以,我们应创建一个常数,并为其使用具有说服力的描述性名称,并在整个程序中都采用常数标识符。这样可使程序更易理解以及更易维护。   (13) 涉及构建器和异常的时候,通常希望重新丢弃在构建器中捕获的任何异常——如果它造成了那个对象的创建失败。这样一来,调用者就不会以为那个对象已正确地创建,从而盲目地继续。   (14) 当客户程序员用完对象以后,若你的类要求进行任何清除工作,可考虑将清除代码置于一个良好定义的方法里,采用类似于cleanup()这样的名字,明确表明自己的用途。除此以外,可在类内放置一个boolean(布尔)标记,指出对象是否已被清除。在类的finalize()方法里,请确定对象已被清除,并已丢弃了从RuntimeException继承的一个类(如果还没有的话),从而指出一个编程错误。在采取象这样的方案之前,请确定finalize ()能够在自己的系统中工作(可能需要调用System.runFinalizersonExit(true),从而确保这一行为)。   (15) 在一个特定的作用域内,若一个对象必须清除(非由垃圾收集机制处理),请采用下述方法:初始化对象;若成功,则立即进入一个含有finally从句的try块,开始清除工作。   (16) 若在初始化过程中需要覆盖(取消)finalize(),请记住调用super.finalize()(若Object属于我们的直接超类,则无此必要)。在对finalize()进行覆盖的过程中,对super.finalize()的调用应属于最后一个行动,而不应是第一个行动,这样可确保在需要基础类组件的时候它们依然有效。   (17) 创建大小固定的对象集合时,请将它们传输至一个数组(若准备从一个方法里返回这个集合,更应如此操作)。这样一来,我们就可享受到数组在编译期进行类型检查的好处。此外,为使用它们,数组的接收者也许并不需要将对象“造型”到数组里。   (18) 尽量使用interfaces,不要使用abstract类。若已知某样东西准备成为一个基础类,那么第一个选择应是将其变成一个interface(接口)。只有在不得不使用方法定义或者成员变量的时候,才需要将其变成一个abstract(抽象)类。接口主要描述了客户希望做什么事情,而一个类则致力于(或允许)具体的实施细节。   (19) 在构建器内部,只进行那些将对象设为正确状态所需的工作。尽可能地避免调用其他方法,因为那些方法可能被其他人覆盖或取消,从而在构建过程中产生不可预知的结果(参见第7章的详细说明)。   (20) 对象不应只是简单地容纳一些数据;它们的行为也应得到良好的定义。   (21) 在现成类的基础上创建新类时,请首先选择“新建”或“创作”。只有自己的设计要求必须继承时,才应考虑这方面的问题。若在本来允许新建的场合使用了继承,则整个设计会变得没有必要地复杂。   (22) 用继承及方法覆盖来表示行为间的差异,而用字段表示状态间的区别。一个非常极端的例子是通过对不同类的继承来表示颜色,这是绝对应该避免的:应直接使用一个“颜色”字段。   (23) 为避免编程时遇到麻烦,请保证在自己类路径指到的任何地方,每个名字都仅对应一个类。否则,编译器可能先找到同名的另一个类,并报告出错消息。若怀疑自己碰到了类路径问题,请试试在类路径的每一个起点,搜索一下同名的.class文件。   (24) 在Java 1.1 AWT中使用事件“适配器”时,特别容易碰到一个陷阱。若覆盖了某个适配器方法,同时拼写方法没有特别讲究,最后的结果就是新添加一个方法,而不是覆盖现成方法。然而,由于这样做是完全合法的,所以不会从编译器或运行期系统获得任何出错提示——只不过代码的工作就变得不正常了。   (25) 用合理的设计方案消除“伪功能”。也就是说,假若只需要创建类的一个对象,就不要提前限制自己使用应用程序,并加上一条“只生成其中一个”注释。请考虑将其封装成一个“独生子”的形式。若在主程序里有大量散乱的代码,用于创建自己的对象,请考虑采纳一种创造性的方案,将些代码封装起来。   (26) 警惕“分析瘫痪”。请记住,无论如何都要提前了解整个项目的状况,再去考察其中的细节。由于把握了全局,可快速认识自己未知的一些因素,防止在考察细节的时候陷入“死逻辑”中。   (27) 警惕“过早优化”。首先让它运行起来,再考虑变得更快——但只有在自己必须这样做、而且经证实在某部分代码中的确存在一个性能瓶颈的时候,才应进行优化。除非用专门的工具分析瓶颈,否则很有可能是在浪费自己的时间。性能提升的隐含代价是自己的代码变得难于理解,而且难于维护。   (28) 请记住,阅读代码的时间比写代码的时间多得多。思路清晰的设计可获得易于理解的程序,但注释、细致的解释以及一些示例往往具有不可估量的价值。无论对你自己,还是对后来的人,它们都是相当重要的。如对此仍有怀疑,那么请试想自己试图从联机Java文档里找出有用信息时碰到的挫折,这样或许能将你说服。   (29) 如认为自己已进行了良好的分析、设计或者实施,那么请稍微更换一下思维角度。试试邀请一些外来人士——并不一定是专家,但可以是来自本公司其他部门的人。请他们用完全新鲜的眼光考察你的工作,看看是否能找出你一度熟视无睹的问题。采取这种方式,往往能在最适合修改的阶段找出一些关键性的问题,避免产品发行后再解决问题而造成的金钱及精力方面的损失。   (30) 良好的设计能带来最大的回报。简言之,对于一个特定的问题,通常会花较长的时间才能找到一种最恰当的解决方案。但一旦找到了正确的方法,以后的工作就轻松多了,再也不用经历数小时、数天或者数月的痛苦挣扎。我们的努力工作会带来最大的回报(甚至无可估量)。而且由于自己倾注了大量心血,最终获得一个出色的设计方案,成功的快感也是令人心动的。坚持抵制草草完工的诱惑——那样做往往得不偿失。 <淘宝热门商品:
 

95.00 元  

韩国正品专卖!Intercrew LED手表/男

 

1.02 元  

冰之.点卡店

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

来源:程序员网

小小豆叮

this与super的应用

通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量。但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自己是否在用面向对象的思想编程,自己的程序是否是面向对象的。好了,现在开始讨论this&super这两个关键字的意义和用法。   在Java中,this通常指当前对象,super则指父类的。当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的,当然,this的另一个用途是调用当前对象的另一个构造函数,这些马上就要讨论。如果你想引用父类的某种东西,则非super莫属。由于this与super有如此相似的一些特性和与生俱来的某种关系,所以我们在这一块儿来讨论,希望能帮助你区分和掌握它们两个。   在一般方法中   最普遍的情况就是,在你的方法中的某个形参名与当前对象的某个成员有相同的名字,这时为了不至于混淆,你便需要明确使用this关键字来指明你要使用某个成员,使用方法是“this.成员名”,而不带this的那个便是形参。另外,还可以用“this.方法名”来引用当前对象的某个方法,但这时this就不是必须的了,你可以直接用方法名来访问那个方法,编译器会知道你要调用的是那一个。下面的代码演示了上面的用法:   public class DemoThis{  private String name;  private int age;  DemoThis(String name,int age){   setName(name); //你可以加上this来调用方法,像这样:this.setName(name);但这并不是必须的   setAge(age);   this.print(); br> }   public void setName(String name){   this.name=name;//此处必须指明你要引用成员变量  } public void etAge(int age){  this.age=age;  }  public void print(){   System.out.println("Name="+name+" ge="+age); //在此行中并不需要用this,因为没有会导致混淆的东西  }  public static void main(String[] args){   DemoThis dt=new DemoThis("Kevin","22");   这段代码很简单,不用解释你也应该能看明白。在构造函数中你看到用this.print(),你完全可以用print()来代替它,两者效果一样。下面我们修改这个程序,来演示super的用法。   class Person{  public int c;  private String name;  private int age; protected void setName(String name){   this.name=name;  }  protected void setAge(int age){  this.age=age;  } protected void print(){   System.out.println("Name="+name+" Age="+age); } } public class DemoSuper extends Person{  public void print(){   System.out.println("DemoSuper:");  super.print(); }  public static void main(String[] args){  DemoSuper ds=new DemoSuper();  ds.setName("kevin");  ds.setAge(22);  ds.print(); } }   在DemoSuper中,重新定义的print方法覆写了父类的print方法,它首先做一些自己的事情,然后调用父类的那个被覆写了的方法。输出结果说明了这一点:   DemoSuper: Name=kevin Age=22   这样的使用方法是比较常用的。另外如果父类的成员可以被子类访问,那你可以像使用this一样使用它,用“super.父类中的成员名”的方式,但常常你并不是这样来访问父类中的成员名的。   在构造函数中构造函数是一种特殊的方法,在对象初始化的时候自动调用。在构造函数中,this和super也有上面说的种种使用方式,并且它还有特殊的地方,请看下面的例子:    class Person{  public static void prt(String s){   System.out.println(s);  }  Person(){  prt("A Person.");  } Person(String name){   prt("A person name is:"+name);  } } public class Chinese extends Person{  Chinese(){   super(); //调用父类构造函数(1)  prt("A chinese.");//(4) }  Chinese(String name){   super(name);//调用父类具有相同形参的构造函数(2)   prt("his name is:"+name); } Chinese(String name,int age){   this(name);//调用当前具有相同形参的构造函数(3)  prt("his age is:"+age); } public static void main(String[] args){  Chinese cn=new Chinese();   cn=new Chinese("kevin");  cn=new Chinese("kevin",22); } }   在这段程序中,this和super不再是像以前那样用“.”连接一个方法或成员,而是直接在其后跟   上适当的参数,因此它的意义也就有了变化。super后加参数的是用来调用父类中具有相同形式的   构造函数,如1和2处。this后加参数则调用的是当前具有相同参数的构造函数,如3处。当然,在   Chinese的各个重载构造函数中,this和super在一般方法中的各种用法也仍可使用,比如4处,你   可以将它替换为“this.prt”(因为它继承了父类中的那个方法)或者是“super.prt”(因为它   是父类中的方法且可被子类访问),它照样可以正确运行。但这样似乎就有点画蛇添足的味道   了。   最后,写了这么多,如果你能对“this通常指代当前对象,super通常指代父类”这句话牢记在   心,那么本篇便达到了目的,其它的你自会在以后的编程实践当中慢慢体会、掌握。另外关于本 <淘宝热门商品:
 

 

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

 

58.00 元  

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

来源:程序员网

小小豆叮

Java能为应用程序提供统一的平台吗?

Java作为一种成熟的语言,同时作为一种优秀的平台,已被广为接受。很多的程序员对Java技术很精通。如果说在进行软件开发的时候,把Java这个平台抛掉或对之置若罔闻,对现在的开发者来说,这是一件忍痛割爱的事情。不管是为了更好的提高程序的性能或是稳定性,还是看中了Java非常丰富的类库,非Java应用程序在JVM上运行已经吊足了程序员的胃口。那么,Java可以为应用程序提供统一的运行平台吗?JVM能承担这一艰巨的任务否? 一、 引言 最近笔者读到一篇”Use Java to Improve Drupals Scalability”的文章。作者(Geert Bevin)在使用Drupal(一套采用GPL授权的开放源码软件,它可以让个人或社区使用者很容易地发表、管理并组织一个网站里大量且多样的内容,已经有许多个人和组织采用Drupal来建立各种不同的网站)时遇到了程序稳定性方面的瓶颈。由于Drupal使用数据库作为缓存,而PHP在跨越Request时是不会保存对象的状态信息的,所以他决定使用Terracotta——一个JVM级的开源群集框架,能提供:HTTP Session复制,分布式缓存,POJO群集,跨越群集的JVM来实现分布式应用程序协调。使用这一替代方案后,尽管他也遇到了一些别的小问题,但稳定性的问题最终得以解决。同时,将PHP在Java下运行,还可以得到更加安全的运行环境。 上面的例子,我们可以看出,应用程序虽然采用了非Java的技术来构建,但最终在Java的环境下运行,并通过JVM来提高应用程序的稳定性和性能。而且,非Java编写的程序可以在JVM上更加快速的运行,这是非常有意思且有意义的事情。而在不久之前,也许三年或四年前,程序员经常报怨,一种语言编写的程序往往只能在特定的环境下运行。当然,这也包括Java本身。 当然,如今而言,这听上去有点不够人性化。因为不管是PHP应用程序,Ruby on Rails应用程序,或是.NET应用程序,似乎都可以在Java环境下运行了。更有甚者宣称,这三种应用程序在Java环境下的运行效率比他们在各自特定的环境下运行的效率还要高。 不管是为了更好的提高程序的性能或是稳定性,还是看中了Java非常丰富的类库,非Java应用程序在JVM上运行已经吊足了程序员的胃口。那么,Java可以为应用程序提供统一的运行平台吗?JVM能承担这一艰巨的任务否? <淘宝热门商品:
 

保健品/滋补品 

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

 

 

天使名妆 08日韩版秋季OL洋装平价针织2件包邮 时尚only韩国代购

来源:程序员网

小小豆叮

JSP+JavaBean+Servlet工作原理实例讲解

JSP+JavaBean两层结构的开发应该是比较熟悉的,也比较好理解。 但是有一点必须要清楚就是用户通过浏览器来发送网页的请求,此请求到达服务器后在服务器端查找对应 的网页,如果是首次请求(第二次就不用解释执行了),对于JSP来说要生成Servlet,然后通过Servlet 引擎来执行Servlet,把调用JavaBean的结果嵌入到页面中返回给用户的浏览器。 JSP+JavaBean+Servlet三层结构的实质是多了一个Controller:Servlet来分发客户端浏览器的请求。如 果把起控制器作用的Servlet的作用理解为对客户端的请求进行预处理对理解Servlet将有很大的帮助。通 过web.xml配置文件可以找到用户请求和特定的Servlet的对应关系,每个Servlet都有一个特定的Servlet 对象与之对应,所以说处理用户请求的就是一个继承自HttpServlet的Servlet对象。 <!-- JSPC servlet mappings start --> <servlet> <servlet-name>ms1</servlet-name> <servlet-class>news.FirstAction</servlet-class> </servlet> <servlet> <servlet-name>ms2</servlet-name> <servlet-class>news.DetailAction</servlet-class> </servlet> <!-- JSPC servlet mappings end --> <servlet-mapping> <servlet-name>ms1</servlet-name> <url-pattern>/newsmain</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ms2</servlet-name> <url-pattern>/newsDetail</url-pattern> </servlet-mapping> 如上面所示的摘自web.xml的一段配置servlet,第一部分主要用来配置Servlet与具体的Servlet对象关联 ,第二部分主要用来配置请求由哪个Servlet处理,Servlet名字的关联,处理请求就与具体Servlet处理 对象关联起来,比如说,客户端浏览器发来/newsmain的请求,它由ms1 servlet进行处理,通过ms1就能 找到相对应的serlet对象news.FirstAction,即/newsmain->ms1->news.FirstAction,这也就是配置 文件的意义所在。到现在懂得了用户/newsmain请求会被news.FirstAction类的对象进行处理,所以说, 要看懂程序就要看懂FirstAction的作用是什么就行了。比如说下面是FirstAction的一个实现。 public final class FirstAction extends HttpServlet { protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { DB db = new DB(); HttpSession session = req.getSession(); try { session.setAttribute(Constants.NEWS_LIST_KEY, News .SearchNewsTitle(db)); } catch (Exception e) { e.printStackTrace(); } db.close(); String target = "/P43_News/newsMain.jsp"; resp.sendRedirect(target); } } 通过这个实现可以看到,当服务器收到客户端请求执行News.SearchNewsTitle(db)的操作,然后把返回值 通过session.setAttribute放到session里,然后通过resp.sendRedirect(target)间接转移到 newsMain.jsp,这样在newsMain.jsp里通过session.getAttribute函数就可以得到在存储在session里的 对应值。 回过头来就容易看出JSP+JavaBean两层结构和JSP+JavaBean+Servlet三层结构的不同了,两层结构必须把 预处理放在JSP中进行,比如说News.SearchNewsTitle(db),三层结构先把预处理在Servlet里进行了,然 后相当于把这个处理结果通过Session返回给JSP,让JSP更关注于界面的显示 <淘宝热门商品:
 

50.00 元 

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

 

188.00 元 

深大玉妹Shenda Yummy粉刺液、去痘王,

来源:程序员网

小小豆叮

编程需要注意的陷阱:Java继承是有害的

大多数好的设计者象躲避瘟疫一样来避免使用实现继承(extends 关系)。实际上80%的代码应该完全用interfaces写,而不是通过extends。“JAVA设计模式”一书详细阐述了怎样用接口继承代替实现继承。这篇文章描述设计者为什么会这么作。 Extends是有害的;也许对于Charles Manson这个级别的不是,但是足够糟糕的它应该在任何可能的时候被避开。“JAVA设计模式”一书花了很大的部分讨论用interface继承代替实现继承。 好的设计者在他的代码中,大部分用interface,而不是具体的基类。本文讨论为什么设计者会这样选择,并且也介绍一些基于interface的编程基础。 接口(Interface)和类(Class)? Jams Gosling(Java之父)做发起人讲话。有人问他:“如果你重新构造Java,你想改变什么?”。“我想抛弃classes”他回答。在笑声平息后,它解释说,真正的问题不是由于class本身,而是实现继承(extends 关系)。接口继承(implements关系)是更好的。你应该尽可能的避免实现继承。 失去了灵活性 为什么你应该避免实现继承呢?第一个问题是明确的使用具体类名将你固定到特定的实现,给底层的改变增加了不必要的困难。 在当前的敏捷编程方法中,核心是并行的设计和开发的概念。在你详细设计程序前,你开始编程。这个技术不同于传统方法的形式----传统的方式是设计应该在编码开始前完成----但是许多成功的项目已经证明你能够更快速的开发高质量代码,相对于传统的按部就班的方法。但是在并行开发的核心是主张灵活性。你不得不以某一种方式写你的代码以至于最新发现的需求能够尽可能没有痛苦的合并到已有的代码中。 胜于实现你也许需要的特征,你只需实现你明确需要的特征,而且适度的对变化的包容。如果你没有这种灵活,并行的开发,那简直不可能。 对于Inteface的编程是灵活结构的核心。为了说明为什么,让我们看一下当使用它们的时候,会发生什么。考虑下面的代码: f() { LinkedList list = new LinkedList(); //... g( list ); } g( LinkedList list ) { list.add( ... ); g2( list ) } 现在,假设一个对于快速查询的需求被提出,以至于这个LinkedList不能够解决。你需要用HashSet来代替它。在已有代码中,变化不能够局部化,因为你不仅仅需要修改f()也需要修改g()(它带有LinkedList参数),并且还有g()把列表传递给的任何代码。象下面这样重写代码: f() { Collection list = new LinkedList(); //... g( list ); } g( Collection list ) { list.add( ... ); g2( list ) } 这样修改Linked list成hash,可能只是简单的用new HashSet()代替new LinkedList()。就这样。没有其他的需要修改的地方。 作为另一个例子,比较下面两段代码: f() { Collection c = new HashSet(); //... g( c ); } g( Collection c ) { for( Iterator i = c.iterator(); i.hasNext() ) do_something_with( i.next() ); } 和 f2() { Collection c = new HashSet(); //... g2( c.iterator() ); } g2( Iterator i ) { while( i.hasNext() ) do_something_with( i.next() ); } g2()方法现在能够遍历Collection的派生,就像你能够从Map中得到的键值对。事实上,你能够写iterator,它产生数据,代替遍历一个Collection。你能够写iterator,它从测试的框架或者文件中得到信息。这会有巨大的灵活性。 耦合 对于实现继承,一个更加关键的问题是耦合---令人烦躁的依赖,就是那种程序的一部分对于另一部分的依赖。全局变量提供经典的例子,证明为什么强耦合会引起麻烦。例如,如果你改变全局变量的类型,那么所有用到这个变量的函数也许都被影响,所以所有这些代码都要被检查,变更和重新测试。而且,所有用到这个变量的函数通过这个变量相互耦合。也就是,如果一个变量值在难以使用的时候被改变,一个函数也许就不正确的影响了另一个函数的行为。这个问题显著的隐藏于多线程的程序。 作为一个设计者,你应该努力最小化耦合关系。你不能一并消除耦合,因为从一个类的对象到另一个类的对象的方法调用是一个松耦合的形式。你不可能有一个程序,它没有任何的耦合。然而,你能够通过遵守OO规则,最小化一定的耦合(最重要的是,一个对象的实现应该完全隐藏于使用他的对象)。例如,一个对象的实例变量(不是常量的成员域),应该总是private。我意思是某段时期的,无例外的,不断的。(你能够偶尔有效地使用protected方法,但是protected实例变量是可憎的事)同样的原因你应该不用get/set函数---他们对于是一个域公用只是使人感到过于复杂的方式(尽管返回修饰的对象而不是基本类型值的访问函数是在某些情况下是由原因的,那种情况下,返回的对象类是一个在设计时的关键抽象)。 这里,我不是书生气。在我自己的工作中,我发现一个直接的相互关系在我OO方法的严格之间,快速代码开发和容易的代码实现。无论什么时候我违反中心的OO原则,如实现隐藏,我结果重写那个代码(一般因为代码是不可调试的)。我没有时间重写代码,所以我遵循那些规则。我关心的完全实用?我对干净的原因没有兴趣。 脆弱的基类问题 现在,让我们应用耦合的概念到继承。在一个用extends的继承实现系统中,派生类是非常紧密的和基类耦合,当且这种紧密的连接是不期望的。设计者已经应用了绰号“脆弱的基类问题”去描述这个行为。基础类被认为是脆弱的是,因为你在看起来安全的情况下修改基类,但是当从派生类继承时,新的行为也许引起派生类出现功能紊乱。你不能通过简单的在隔离下检查基类的方法来分辨基类的变化是安全的;而是你也必须看(和测试)所有派生类。而且,你必须检查所有的代码,它们也用在基类和派生类对象中,因为这个代码也许被新的行为所打破。一个对于基础类的简单变化可能导致整个程序不可操作。 让我们一起检查脆弱的基类和基类耦合的问题。下面的类extends了Java的ArrayList类去使它像一个stack来运转: class Stack extends ArrayList { private int stack_pointer = 0; public void push( Object article ) { add( stack_pointer++, article ); } public Object pop() { return remove( --stack_pointer ); } public void push_many( Object[] articles ) { for( int i = 0; i < articles.length; ++i ) push( articles[i] ); } } 甚至一个象这样简单的类也有问题。思考当一个用户平衡继承和用ArrayList的clear()方法去弹出堆栈时: Stack a_stack = new Stack(); a_stack.push("1"); a_stack.push("2"); a_stack.clear(); 这个代码成功编译,但是因为基类不知道关于stack指针堆栈的情况,这个stack对象当前在一个未定义的状态。下一个对于push()调用把新的项放入索引2的位置。(stack_pointer的当前值),所以stack有效地有三个元素-下边两个是垃圾。(Java的stack类正是有这个问题,不要用它). 对这个令人讨厌的继承的方法问题的解决办法是为Stack覆盖所有的ArrayList方法,那能够修改数组的状态,所以覆盖正确的操作Stack指针或者抛出一个例外。(removeRange()方法对于抛出一个例外一个好的候选方法)。 这个方法有两个缺点。第一,如果你覆盖了所有的东西,这个基类应该真正的是一个interface,而不是一个class。如果你不用任何继承方法,在实现继承中就没有这一点。第二,更重要的是,你不能够让一个stack支持所有的ArrayList方法。例如,令人烦恼的removeRange()没有什么作用。唯一实现无用方法的合理的途径是使它抛出一个例外,因为它应该永远不被调用。这个方法有效的把编译错误成为运行错误。不好的方法是,如果方法只是不被定义,编译器会输出一个方法未找到的错误。如果方法存在,但是抛出一个例外,你只有在程序真正的运行时,你才能够发现调用错误。 对于这个基类问题的一个更好的解决办法是封装数据结构代替用继承。这是新的和改进的Stack的版本: class Stack { private int stack_pointer = 0; private ArrayList the_data = new ArrayList(); public void push( Object article ) { the_data.add( stack_poniter++, article ); } public Object pop() { return the_data.remove( --stack_pointer ); } public void push_many( Object[] articles ) { for( int i = 0; i < o.length; ++i ) push( articles[i] ); } } 到现在为止,一直都不错,但是考虑脆弱的基类问题,我们说你想要在stack创建一个变量, 用它在一段周期内跟踪最大的堆栈尺寸。一个可能的实现也许象下面这样: class Monitorable_stack extends Stack { private int high_water_mark = 0; private int current_size; public void push( Object article ) { if( ++current_size > high_water_mark ) high_water_mark = current_size; super.push( article ); } publish Object pop() { --current_size; return super.pop(); } public int maximum_size_so_far() { return high_water_mark; } } 这个新类运行的很好,至少是一段时间。不幸的是,这个代码发掘了一个事实,push_many()通过调用push()来运行。首先,这个细节看起来不是一个坏的选择。它简化了代码,并且你能够得到push()的派生类版本,甚至当Monitorable_stack通过Stack的参考来访问的时候,以至于high_water_mark能够正确的更新 <淘宝热门商品:
 

 

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

 

98.00 元 

莎莎调配速效去皱眼霜15g 淘宝眼霜销量冠军

来源:程序员网

小小豆叮

使用JDBC建立各种数据库的连接方式集萃

Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序。然而各个开发商的接口并不完全相同,所以开发环境的变化会带来一定的配置变化。本文主要集合了不同数据库的连接方式。 下面罗列了各种数据库使用JDBC连接的方式,可以作为一个手册使用。 1、Oracle8/8i/9i数据库(thin模式) Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();   String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl为数据库的SID   String user="test";   String password="test";   Connection conn= DriverManager.getConnection(url,user,password);    2、DB2数据库 Class.forName("com.ibm.db2.jdbc.app.DB2Driver ").newInstance();   String url="jdbc:db2://localhost:5000/sample"; //sample为你的数据库名   String user="admin";   String password="";   Connection conn= DriverManager.getConnection(url,user,password);    3、Sql Server7.0/2000数据库 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();   String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=mydb";   //mydb为数据库   String user="sa";   String password="";   Connection conn= DriverManager.getConnection(url,user,password);    4、Sybase数据库 Class.forName("com.sybase.jdbc.SybDriver").newInstance();   String url =" jdbc:sybase:Tds:localhost:5007/myDB";//myDB为你的数据库名   Properties sysProps = System.getProperties();   SysProps.put("user","userid");   SysProps.put("password","user_password");   Connection conn= DriverManager.getConnection(url, SysProps);    5、Informix数据库 Class.forName("com.informix.jdbc.IfxDriver").newInstance();   String url = "jdbc:informix-sqli://123.45.67.89:1533/myDB:INFORMIXSERVER=myserver;   user=testuser;password=testpassword"; //myDB为数据库名   Connection conn= DriverManager.getConnection(url);    6、MySQL数据库 Class.forName("org.gjt.mm.mysql.Driver").newInstance();   String url ="jdbc:mysql://localhost/myDB? user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"   //myDB为数据库名   Connection conn= DriverManager.getConnection(url);    7、PostgreSQL数据库 Class.forName("org.postgresql.Driver").newInstance();   String url ="jdbc:postgresql://localhost/myDB" //myDB为数据库名   String user="myuser";   String password="mypassword";   Connection conn= DriverManager.getConnection(url,user,password);    8、access数据库使用ODBC直连 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver") ;   String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ="+application.getRealPath("/Data/ReportDemo.mdb");   Connection conn = DriverManager.getConnection(url,"","");   Statement stmtNew=conn.createStatement() ; <淘宝热门商品:
 

运动鞋 

阿迪耐克正品折扣店

 

一口价 98.00元  

无效退款〓狂减35斤〓KOIA天然植物瘦身减肥胶囊

来源:程序员网

小小豆叮

经验分享全过程JSP程序员完全蜕变手册

一:说明 在本文章中使用精通、熟练、熟悉、了解标志你对某技术的掌握程度。 精通:能够掌握此技术的85%技术要点以上,使用此技术时间超过两年,并使用此技术成功实施5个以上的项目。能使用此技术优化性能或代码,做到最大可能的重用。 熟练:能够掌握此技术的60%技术要点以上,使用此技术时间超过一年,并使用此技术成功实施3个以上的项目。能使用此技术实现软件需求并有经验的积累在实现之前能做优化设计尽可能的实现模块或代码的重用。 熟悉:能够掌握此技术的50%技术要点以上,使用此技术时间超过半年上,并使用此技术成功实施1个以上的项目。能使用此技术实现软件需求。 了解:可以在实际需要时参考技术文档或帮助文件满足你的需要,基本知道此项技术在你运用是所起的作用,能够调用或者使用其根据规定提供给你的调用方式。 二:基本要求 1:html 掌握程度:熟练。原因:不会html你可能写JSP? 2:javascript/jscript:掌握程度:熟悉。原因:client端的数据校验、一些页面处理需要你使用脚本。 3:css 掌握程度:熟悉。原因:实现页面风格的统一通常会使用css去实现。 4:java基础编程 掌握程度:熟练。原因:不会java你能写JSP?开玩笑吧。还有你必须非常熟悉以下几个包java.lang;java.io;java.sql;java.util;java.text;javax.sevrlet;javax.servlet.http; javax.mail;等。 5:sql 掌握程度:熟练。原因:如果你不使用数据库的话你也许不需要掌握sql。同时你必须对以下几种数据库中的一种以上的sql比较熟悉。Oracle,DB2,Mysql,Postgresql. 6:xml 掌握程度:了解 原因:AppServer的配置一般是使用XML来实现的。 7:ejb 掌握程度:了解 原因:很多项目中商业逻辑是由ejb来实现的,所以呢…… 8:以下几种AppServer(engnier) 你需要了解一个以上。 a:)Tomcat b:)WebLogic c:)WebSphere d:)JRun e:)Resin 原因:你的jsp跑在什么上面啊! 三:选择要求(因项目而定) 1:LDAP 掌握程度:了解 原因:LADP越来越多的运用在权限控制上面。 2:Struts 掌握程度:熟练 原因:如果符合MVC设计通常会使用Struts实现C。 3:Xsp 掌握程度:根据需要而定很多时候是不使用的,但在不需要使用ejb但jsp+servlet+bean实现不了的时候Xsp是一个非常不错的选择。 4:Linux 掌握程度:熟悉 原因:如果你的运用跑在Linux/Unix上你最少要知道rm ,mv,cp,vi,tar gzip/gunzip 是用来做什么的吧。 四:工具的使用 1:UltraEdit(EditPlus)+jakarta-ant+jakarta-log4j; 2:Jubilder4-6 3:Visual Age For Java 4:VCafe 以上的工具你选择你自己熟悉的吧。不过强烈建议你用log4j做调试工具。 五:成长之路 1:html 学习时间,如果你的智商在80以上,15天时间应该够用了。至少你能手写出一个页面来。 2:jacascript/jscript学习时间,这真的不好说,比较深奥的东西,够用的话一个礼拜可以学写皮毛。 3:css 学习时间,三天的时间你应该知道如何使用css了,不要求你写,一般是美工来写css。 4:java 学习时间,天才也的三个月吧。慢满学吧。如果要精通,那我不知道需要多少时间了。用来写jsp,四个月应该够了。 5:sql 学习时间,只需要知道insert ,delete ,update ,select,create/drop table的话一天你应该知道了。 6:xml 学习时间,我不知道我还没有学会呢。呵呵。不过我知道DTD是用来做什么的。 7:ejb 学习时间,基本的调用看3天你会调用了。不过是建立在你学会java的基础上的。 8:熟悉AppServer,Tomcat四天你可以掌握安装,配置。把jsp跑起来了。如果是WebLogic也够了,但要使用ejb那不关你的事情吧。SA做什么去了。 9:熟悉Linux那可得需要不少时间。慢慢看man吧。 10:Struts如果需要你再学习 <淘宝热门商品:
 

118.00 元 

【冲皇冠】八心八箭瑞士钻石六爪经典钻戒指

 

 

『女人天生是妖精』店内商品均为现货 拍下后可直接留言修改运费

来源:程序员网

小小豆叮

Java类库(java.lang)包概述

1. 接口java.lang.Appendable可追加(append)接口。实现了该接口的类的对象实例具有可向其追加字符或字符序列的能力。希望能够接收Formatter输出的类必须实现该接口。java.lang.CharSequenceCharSequence是指可阅读的字符序列。该接口为只读访问各种类型的字符序列提供了统一的方法。java.lang.Cloneable可克隆接口。实现了该接口的类具有克隆的能力。可以通过Object.clone()方法将类的实例对象的域(field)逐个复制到同一个类的另外一个实例中。如果使用Object.clone()方法克隆没有实现该接口的类的实例对象,将会触发CloneNotSupportedException异常。java.lang.Comparable可比较接口。实现了该接口的类的两个实例对象之间可以进行比较。比较结果负数(-1)、0、正数(1)分别代表比较对象与被比较对象之间的关系分别是小于、等于、大于。可对实现了该接口的类的多个实例对象进行排序。java.lang.Iterable可迭代接口。实现了该接口的类一般作为容器,且具有提供依次访问被包容对象功能的能力。java.lang.Readable可读取接口。客户对象可以从实现了该接口的类的实例对象中读取字符。java.lang.Runable可运行接口。实现了该接口的类的实例对象将在一个单独的线程(thread)中被运行。没有扩展Thread的类可以通过实现该接口,开发出多线程服务的能力。java.lang.Thread.UncaughtExceptionHandler线程未捕获异常控制器接口。在线程执行过程中引发了异常而没有捕获时, 实现了该接口的类可以作为控制器处理该状况。 2. 类java.lang.Boolean将原始数据类型boolean对象化的类。该类的实例对象除了包含一个boolean值之外,还提供boolean String之间转化等处理boolean的方法。java.lang.Byte将原始数据类型byte对象化的类。该类的实例对象除了包含一个byte值之外,还提供byte与其他类型之间转化等处理byte的方法。java.lang.Character将原始数据类型char对象化的类。该类的实例对象除了包含一个char值之外,还提供了处理字符的方法。Java 2平台在字符数组、字符串或StringBuffer中使用UTF-16表达字符。UTF-16使用16至21位二进制位表达,即从/u0000到/u10FFFF。/u0000到/uFFFF表示基本的16位字符,/u10000到/u10FFFF表示辅助字符(supplymentary characters)。 辅助字符由一个高位替代符(high-surrogate )和一个低位替代符(low-surrogate )共同组成。高位替代符使用一个/uD800到/uDBFF之间的字符表示;低位替代符使用一个/uDC00到/uDFFF之间的字符表示。假设:A代表辅助字符(SC)的码点值; B代表SC的高位替代符的码点(Unicode code point)值; C代表SC的低位替代符的码点值。那么下面的等式成立:A = (B - 0xD800) << 10 + (C - 0xDC00) + 0x10000在将Unicode还原为可阅读字符的时候,当且仅当当前字符时高位替代符,下一字符是低位替代符时,此连续的两个字符被解释为辅助字符。java.lang.Character.Subset该类的实例对表达某个Unicode字符集的特定子集。java.lang.Character.UnicodeBlock该类的实例对象表达一族相关的子Unicode字符集。这些子字符集通常服务于相同的目的。java.lang.Class该类的实例对象表达Java应用中正在运行的类或者接口。该类没有公共的构造方法,所以不能由Java虚拟机自动实例化,而是由ClassLoader实例化。java.lang.ClassLoader该类是Java类加载器,负责根据制定的二进制名称加载相应的类。在Java语言规范中规定,类、接口或原始数据类型有三种命名,他们分别是许可名(fully qualified name)、规范名(canonical name)、二进制名(binary name)。不同的类加载器根据类的二进制名从不同的源中读取二进制的类“*.class”信息,并生成Class对象。每个类中都有对其加载器的引用。 package org.javaplus.jdkoverview; public class OuterClass { public class InnerClass { public InnerClass() {} } public OutterClass() {} } public class SubClass extends OuterClass { public SubClass() {} } org.javaplus.jdkoverview.SubClass的内部类(InnerClass)的名称许可名: org.javaplus.jdkoverview.SubClass.InnerClass规范名: org.javaplus.jdkoverview.OuterClass.InnerClass二进制名: org.javaplus.jdkoverview.OuterClass$InnerClassjava.lang.Compiler该类提供Java到本机代码的支持,及相关服务。该类只是JIT编译器(Java Just-in-Time Compiler)的一个占位符而已。如果JVM(Java Virtual Machine )第一次启动时未成功加载JIT编译器,则本类不做任何工作。java.lang.Double将原始数据类型double对象化的类。该类的实例对象除了包含一个double值之外,还提供double与其他类型之间转化等处理double的方法 <淘宝热门商品:
 

80.00 元  

托玛琳厂家直营店

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

 

120.00 元  

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

来源:程序员网

小小豆叮

用java实现的经典递归算法

一、写作此文的原因: 学过程序设计的朋友都知道,存在自调用的算法称作递归算法。 递归往往能给我们带来非常简洁非常直观的代码形势,从而使我们的编码大大简化,然而递归的思维确实很我们的常规思维相逆的,我们通常都是从上而下的思维问题, 而递归趋势从下往上的进行思维,正由于此,很多人对于递归有着深深的恐惧,我曾经也是如此,如今为把我的经验通过几个经典的例子与初学者共享,故作此文,希望能对需要者有所助益,如若如此,便是幸甚。。。 二、递归算法设计的基本思想是:对于一个复杂的问题,把员问题分解为若干个相对简单前类同的子问题,继续下去直到子问题简单到能够直接求解,也就是说到了递推的出口,这样原问题就有递推得解。 关键要抓住的是:(1)递归出口 (2)地推逐步向出口逼近 三、具体实例 1。汉诺塔 这是递归的超经典的例子,几乎每本程序设计书上谈到递归都会介绍。具体情景不再赘述。以我上述的方法观之:(1)递归的出口在于disk数为一的时候 (2)向出口逼近:如果不是一,是n ,则我们先挪动上面n-1块disk,等上面挪完,即递归返回的时候,我们挪动最底下的disk。 仅仅如此,一个貌似十分复杂的问题就解决了,因为挪动那n-1块disk的时候,会继续向上减少,直到disk的数量为一为止。下面给出java程序编码(已测试过,运行正常): import javax.swing.JOptionPane; public class Hanoi { private static final String DISK_B = "diskB"; private static final String DISK_C = "diskC"; private static final String DISK_A = "diskA"; static String from=DISK_A; static String to=DISK_C; static String mid=DISK_B; public static void main(String[] args) { String input=JOptionPane.showInputDialog("please input the number of the disks you want me move."); int num=Integer.parseInt(input); move(num,from,mid,to); } private static void move(int num, String from2, String mid2, String to2) { if(num==1){ System.out.println("move disk 1 from "+from2+" to "+to2); } else { move(num-1,from2,to2,mid2); System.out.println("move disk "+num+" from "+from2+" to "+to2); move(num-1,mid2,from2,to2); } } } 2。这是一个排列的例子,它所做的工作是将输入的一个字符串中的所有元素进行排序并输出,例如:你给出的参数是"abc" 则程序会输出: abc acb bac bca cab cba   (1)算法的出口在于:low=high也就是现在给出的排列元素只有一个时。   (2)算法的逼近过程:先确定排列的第一位元素,也就是循环中i所代表的元素, 然后low+1开始减少排列元素,如此下去,直到low=high public static void permute(String str) { char[] strArray = str.toCharArray(); permute(strArray, 0, strArray.length - 1); } public static void permute(char[] list, int low, int high) { int i; if (low == high) { String cout = ""; for (i = 0; i <= high; i++) cout += list[i]; System.out.println(cout); } else { for (i = low; i <= high; i++) { char temp = list[low]; list[low] = list[i]; list[i] = temp; permute(list, low + 1, high); temp = list[low]; list[low] = list[i]; list[i] = temp; } } } 3.这是一个组合的例子,与上述的例子相似,只是它所做的工作是,输出所给字符串中制定数目的元素的组合种类      (1)程序出口在于n=1,此时只要输出目标数组的所有元素即可      (2)逼近过程,当n>1 的时候,我们先取第一个元素放入目标数组中,然后n-1,如此下去,最后出来。      import javax.swing.JOptionPane; public class Combination { /** * @param args */ public static void main(String[] args) { String input = JOptionPane .showInputDialog("please input your String: "); String numString = JOptionPane .showInputDialog("please input the number of your Combination: "); int num = Integer.parseInt(numString); Combine(input, num); } private static void Combine(String input, int num) { char[] a = input.toCharArray(); String b = ""; Combine(a, num, b, 0, a.length); } private static void Combine(char[] a, int num, String b, int low, int high) { if (num == 0) { System.out.println(b); } else { for (int i = low; i < a.length; i++) { b += a[i]; Combine(a, num - 1, b, i+1, a.length); b=b.substring(0, b.length()-1); } } } } 由于递归的表述确实不易加上本人的水平有限,颇有以己之昏昏欲人之昭昭的意味,还望大家多多谅解。 <淘宝热门商品:
 

7.20元  

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

 

136.00 元  

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

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

来源:程序员网

小小豆叮

Java应用技巧:对于 Cookie 的操作详解

1.设置Cookie Cookie cookie = new Cookie("key", "value"); cookie.setMaxAge(60); 设置60秒生存期,如果设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效。 cookie.setPath("/test/test2"); 设置Cookie路径,不设置的话为当前路径(对于Servlet来说为request.getContextPath() + web.xml里配置的该Servlet的url-pattern路径部分) response.addCookie(cookie); 2.读取Cookie 该方法可以读取当前路径以及“直接父路径”的所有Cookie对象,如果没有任何Cookie的话,则返回null Cookie[] cookies = request.getCookies(); 3.删除Cookie Cookie cookie = new Cookie("key", null); cookie.setMaxAge(0); 设置为0为立即删除该Cookie cookie.setPath("/test/test2"); 删除指定路径上的Cookie,不设置该路径,默认为删除当前路径Cookie response.addCookie(cookie); 4.注意:假设路径结构如下 test/test2/test345/test555/test666 a.相同键名的Cookie(值可以相同或不同)可以存在于不同的路径下。 b. 删除时,如果当前路径下没有键为"key"的Cookie,则查询全部父路径,检索到就执行删除操作(每次只能删除一个与自己最近的父路径Cookie) FF.必须指定与设定cookie时使用的相同路径来删除改cookie,而且cookie的键名不论大写、小写或大小混合都要指定路径。 IE.键名小写时,如果当前路径为/test/test2,如果找不到再向上查询/test、/test555、/test345,如果还找不到就查询/ 。(/test555/test666不查询) 键名大小写混合或大写时,不指定路径则默认删除当前路径,并且不向上查询。 c.读取Cookie时只能读取直接父路径的Cookie。 如果当前路径为/test/test2,要读取的键为"key"。当前路径读取后,还要读取/test,/test读取后,还要读取/ d.在做Java的web项目时,由于一般的Web服务器(如Tomcat或Jetty)都用Context来管理不同的Web Application,这样对于每个Context有不同的Path, 在一个Server中有多个Web Application时要特别小心,不要设置Path为/的Cookie,容易误操作。(当然前提是域名相同) <淘宝热门商品:
 

¥:180.00 

安婴房婴儿用品童装旗舰店/上海总经销可批发、团购

【双皇冠】热卖再次到货!原单DISNEY维尼小熊 专业婴儿定型枕

 

18.00 元 

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

来源:程序员网

小小豆叮

关于输入输出流的一个问题

我是一个java初学者碰到一些小问题,希望前辈们给我解答一下,谢谢! 原题目: 编写应用程序,利用缓冲输入流BufferedInputStream 从键盘输入字符串,当输入的字符串为“exit”时结束输入,将输入的所有字符串存放到 my file.txt中。 编写应用程序,读出“my file.txt”的内容,并将读出的内容输出到屏幕上,读文件结束后,显示“Finished reading,programe ended.”. 代码: import java.io.*; public class Ex3 { public static void main(String[]args)throws Exception { BufferedInputStream bis=new BufferedInputStream(System.in); FileWriter fw=new FileWriter("my file.txt"); while(true) { byte[]b=new byte[200]; int len=bis.read(b); String str=new String(b,0,len-2); if(str.equals("exit")) { System.exit(0); } fw.write(str); fw.flush(); } } } 上面的代码中为什么String str=new String(b,0,len-2);这个方法的参数最后一个要用 len-2?尝试过len或者len-1,结果会将exit也写入文件,len-1还有回车操作符,不明白。 试写的代码: import java.io.*; public class Ex4 { public static void main(String[]args)throws Exception { FileReader fr=new FileReader("my file.txt"); FileOutputStream fos=new FileOutputStream("my file.txt"); int c; byte b[]=new byte[200]; int len=fr.read(); while((c=fr.read())!=-1) { fos.write(b); } System.out.print("Finished reading,programe ended."); fr.close(); fos.close(); } } 思路是否正确,这道题应该怎么写? <淘宝热门商品:
 

 

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

 

 

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

来源:程序员网

小小豆叮

JavaMail常见问题之安装和配置问题解答

问. 我如何安装 JavaMail API 实现? 答:解压缩分发的 zip 文件,并编辑 CLASSPATH 环境变量以包含 mail.jar 文件,该文件包括在 JavaMail API 分发中。你也需要 JavaBeans Activation Framework(参见下面)的实现。参阅 README 文件(在分发中),获得其他细节和例子。 问. JavaMail 是否包括所有必要的邮件服务器? 答:不是,JavaMail API 包不包括任何邮件服务器。为了使用 JavaMail API 包,你将需要访问 IMAP 或 POP3 邮件服务器(用于阅读邮件)和/或 SMTP 邮件服务器(用于发送邮件)。这些邮件服务器通常由 Internet 服务提供商提供,或者作为组织网络基础结构的一部分。如果你不必访问这样的邮件服务器,请往下看。 问. 从哪里可以获得必要的邮件服务器? 答:Sun Java System Messaging Server 可用于 Solaris 和 Windows 平台。华盛顿大学的 IMAP 服务器支持多种平台 (UNIX、32 位 Windows 等)。可从如下地址获取源代码:ftp://ftp.cac.washington.edu/imap/imap.tar.Z。其他的许多供应商提供了支持 Internet 标准的邮件服务器。可以从 IMAP Connection 和 Internet Mail Consortium 获得更多信息。 问. 我应该使用什么主机名、用户名或密码? 答:我们不提供邮件服务器让你使用。你必须使用自己的邮件服务器,或者使用 Internet 服务提供商或你所工作的公司提供的邮件服务器。网络管理员可能给你一些必要的信息用于配置 JavaMail,以便同邮件服务器一起工作。 问. 我如何配置 JavaMail 通过代理服务器工作? 答:大多数代理服务器只支持 HTTP 协议。JavaMail 没有使用 HTTP 协议来阅读或发送邮件。使用代理服务器的一个主要原因是为了允许企业网络中的 HTTP 请求通过企业防火墙。防火墙通常会阻止对 Internet 的大多数访问,但允许来自代理服务器的请求通过。此外,企业网络内部的邮件服务器将为邮件执行类似的功能,通过 SMTP 接收消息,然后将它们转发到 Internet 上的最终目的地,以及接收传入的消息,然后将它们发送到合适的内部邮件服务器。 如果你的代理服务器支持 SOCKS V4 或 V5 协议 (http://www.socks.nec.com/aboutsocks.html, RFC1928),并允许匿名连接,可以告诉 Java 运行时把所有的 TCP socket 直接连接到 SOCKS 服务器。参阅 http://java.sun.com/j2se/1.4/docs/guide/net/properties.html,获取 socksProxyHost 和 socksProxyPort 属性的最新文档。这些是系统级属性,而不是 JavaMail 会话属性。当调用应用程序时,它们可以从命令行中设置,例如:java -DsocksProxyHost=myproxy ...。这个工具可用于指出从 JavaMail 到 SOCKS 代理服务器进行 SMTP、IMAP 和 POP3 通信。注意,设置这些属性将告诉 所有 TCP socket 连接到 SOCKS 代理,在应用程序的其他方面上,这可能会带来负面影响。 假如没有这样的 SOCKS 服务器,如果想使用 JavaMail 来直接访问防火墙外部的邮件服务器,那将需要配置防火墙来允许这一访问。一个简单的 HTTP 代理 Web 服务器是足够的。 问. 如何在 Windows NT 中设置 CLASSPATH? 答:详细说明可从 这里 获得。 问. 当试图在 Linux 中运行程序时,得到了非常奇怪的错误消息,而且程序运行失败了。错误在哪里? 答:通常,错误消息看起来像下面这样: Exception in thread "main" java.lang.VerifyError:(Class:com/sun/mail/pop3/POP3Store, method: finalize Signature :()V) Illegal use of nonvirtual function call 问题是由于在 Linux 上,使用的 unzip 命令是有 bug 的版本,这样解压缩 JavaMail 下载包时,unzip 命令破坏了 mail.jar 文件。获取更新版本的 unzip 命令或使用 JDK 的 jar 命令来解压缩下载包。 问. 在运行于 SecurityManager 下面的应用程序中,我如何使用 JavaMail;我必须授予应用程序和 JavaMail 什么权限? 答:在具有 SecurityManager 的 JDK 1.2(或更新版本)中,当使用 JavaMail 时,JavaMail 读取 mail.jar 文件中的配置文件有时会失败。在从 activation.jar 文件中读取配置文件时,JavaBeans Activation Framework 可能也有相同的问题。这些默认配置文件是作为“资源”文件存储的,并且存储在 jar 文件的 META-INF 目录中。 有许多调试技术可用于决定这是否是个问题。设置 Session 属性“mail.debug”为 true(或调用 session.setDebug(true)),将导致 JavaMail 在试图加载各个配置文件时打印调试消息。形如“DEBUG: cant load default providers file”(DEBUG: 不能加载默认提供程序文件) 的消息指出这个问题可能存在。同样,设置 System 属性“javax.activation.debug”为“true”(例如,通过使用 "java -Djavax.activation.debug=true ..." 来运行程序),将导致 JAF 在试图加载各个资源文件时打印调试消息。最后,通过设置 system 属性“java.security.debug” 为“access:failure”(例如,通过使用“java -Djava.security.debug=access:failure ...”来运行程序),JDK 可以产生有用的调试输出。 除了读取配置文件的必要权限外,应用程序(和 JavaMail)也将需要一定的权限才可以连接到它使用的邮件服务器。如果应用程序使用 System 属性来配置 JavaMail(例如,像许多 JavaMail 演示程序所做的那样,通过传递从 System.getProperties() 中返回的 Properties 对象到 Session 构造函数),它也将需要一定的权限才可以使用 System Properties 对象。另外,应用程序可以使用自己的 Properties 对象,以及确信设置 "mail.from" 属性 或 "mail.user" 和 "mail.host" 属性(参见 InternetAddress.getLocalAddress() 方法)。 在 JDK 1.2 SecurityManager 中,为了使应用程序能够使用 JavaMail,应用程序、JavaMail 和 JAF 将需要某些权限,比如下面的一些权限(一定要使用适当的值替换主机名和路径名);把这些权限添加到应用程序使用的安全策略文件中。 grant {     // following two permissions allow     // access to default config files     permission java.io.FilePermission    "/path/to/mail.jar", "read";     permission java.io.FilePermission    "/path/to/activation.jar", "read";     // following to use SMTP     permission java.net.SocketPermission    "SMTPHOST:25", "connect,resolve";     // following to use IMAP     permission java.net.SocketPermission    "IMAPHOST:143", "connect,resolve";     // following to use POP3     permission java.net.SocketPermission    "POP3HOST:110", "connect,resolve";     // following needed if System.getProperties() is used     permission java.util.PropertyPermission    "*", "read,write";   }; 问. 如何配置 Web 服务器来运行 JavaMail 演示 servlet? 答:针对以下 Web 服务器的指导说明可从这里获得: Tomcat Apache with JServ iPlanet Web Server Java Web Server 问. 当在 servlet 中使用 JavaMail 时,未找到任何的 JavaMail 类。我已经在服务器的 CLASSPATH 中添加了 mail.jar? 答:当改变 CLASSPATH 时,通常有必要完全重启 Web 服务器。 问. 我的 servlet 可以找到 JavaMail 类,但 JavaMail 抱怨它不能找到针对“smtp”或“imap”的服务提供程序或地址类型“rfc822”。 答:通常这是因为 JavaMail 无法访问 mail.jar 中的配置文件,而这可能是由于安全权限问题造成的;参见 本条目,获取更多的细节。也保证你没有提取 mail.jar 内容;在服务器的 CLASSPATH 中,应该包括未更改的 mail.jar 文件。 问. 在哪里可以找到 jws.jar?我已经安装了 Java Web Server 2.0,并试图运行 JavaMailServlet。README 文件指示我在 CLASSPATH 中添加 jws.jar。 答:jws.jar 不再与 Java Web Server 一起发行(在以前版本中,它们是一起发行的),因此不需要在 CLASSPATH 中添加它。只要在 CLASSPATH 中添加 mail.jar 和 activation.jar,然后重启 Java Web Server <淘宝热门商品:
 

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

缤纷园艺淘宝店--苗圃直销各类花卉苗木 购买送惊喜

 

0.70 元  

滋补品专门店/雪蛤油 燕窝 低价运作拒绝暴利,令美丽不再昂贵!

来源:程序员网

小小豆叮

J2EE新手入门:“Hibernate”名词解释

Hibernate 是什么?从不同角度的解释: 1、它是连接 Java 应用程序和关系数据库的中间件。 2、它对 JDBC API 进行了封装,负责Java对象的持久化。 3、在分层的软件架构中它位于持久化层,封装了所有数据访问细节,使业务罗基层可以专注于实现业务逻辑。 4、它是一种 ORM(Object-Relation Mapping 对象-关系映射)工具,能够建立面向对象的域模型和关系模型的映射。 应用程序分层体系结构: 1、表述层:提供与用户交互的界面。 2、业务逻辑层:实现各种业务逻辑。 3、数据层:负责存放和管理应用的持久性业务。 软件分层包含两种含义: 一种是物理分层,即每一层都运行在单独的机器上,这意味着创建分布式的软件系统; 一种是逻辑分层,指的是在单个软件模块中完成特定的功能。 软件分层必须符合以下特征: 1、每个层由一组相关的类或组件构成,共同完成特定的功能。 2、层与层之间存在自上而下的依赖关系,即上层组件会访问下层组件的 API,而下层组件不应该依赖上层组件。 3、每个层对上层公开 API,但具体的实现细节对外透明。 软件分层的优点: 适当的分层,将会提高软件的以下性能。 1、伸缩性:指应用程序是否支持更多的用户。例如数据库连接。 2、可维护性:当发生需求变化,只需修改软件的某一部分,不会影响其他部分的代码。 3、可扩展性:在现有系统中增加新功能的难易程度。 4、可重用性:程序代码没有冗余,同一个程序能满足多种需求。 5、可管理性:管理系统的难易程度。 缺点: 1、分层越多对软件设计人员的要求越高。 2、分层越多调试越困难。 表通过主建来保证每条记录的唯一性,表的主键应当不具有任何业务含义,因为任何有业务含义的列都有改变的可能性。关系数据库学的最重要的一个理论就是:不要给关键字赋予任何业务意义。 在域模型中,类之间存在四种关系。 1、关联:类之间的应用关系。 如果类A与类B关联,那么被引用的类B将被定义为类A的属性。关联还可以分为单项关联和双向关联。 2、依赖:类之间的访问关系。 如果类A访问类B的属性或方法,或者类A负责实例化类B,那么可以说类A依赖类B. 3、聚集:整体与部分之间的关系。 4、继承 <淘宝热门商品:
 

9.80 元  

恒睿日本长筒棉袜批发网

疯狂促销 韩国进口复古百搭格子围巾风扉全球明星必备 只要9.8

 

 

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

来源:程序员网

小小豆叮

J2EE新手入门篇:“Spring”的名词解释

Spring是一个分层构架,意思是你可以选择只用它的一部分,而不影响其他。它的构架体系是内部相容的。所以,你将会在你的学习曲线中获得最大价值。 例如,你可以选择只用Spring 的JDBC 单一应用或者用Spring 管理你的业务对象。 Spring 可以有效的组织你的中间层对象,无论你是否选择了EJB. Spring关心的是那些如果你选择Struts或者其他的使用特定的J2EE APIs的框架而留给你自己完成的部件。 Spring可以消除在许多projects中出现的Singlton的大量使用。 以我的经验, 主要的问题是, 减弱了测试能力和面向对象。 Spring 可以消除规定多样的定制属性文件的需要, 用一致的配置操作贯穿整个应用和项目。多样的属性健或者系统属性寻找使你不得不去读Javadoc 或者甚至是源代码?然而,Sping可以使你非常简单地看到这些class 的JavaBean的属性。 倒置控制的用法(下面介绍) 可以帮助你完成简化。 Spring 可以使良好的编程习惯更容易培养,利用接口代替classes 减弱编程成本,降至最小。 Spring 的设计使依靠很少的APIs 建立应用成为可能。 在Spring 应用中的许多业务对象根本不要依靠Spring. 利用Sping 建立的应用使单元测试变得非常简单。 Spring 是使用EJB成为一个选择,优于成为决定性的应用构架。你可以选择作为POJOs或者local EJBs 扩展业务借口,而不影响调用代码。 Spring 可以帮助你解决没有EJB的许多的问题。Spring可以提供适应许多web应用的EJB的替换方案……例如, Spring 可以借用AOP 提供声明事务管理,在不用EJB容器的情况下。 如果你只需要工作在单个的数据库上面, 甚至不用JTA 的支持。 Spring 提供了一致的数据访问框架, 无论用JDBC 或者像Hibernate 一样的O/R mapping 产品 <淘宝热门商品:
 

185.00 元  

累计销售1000多件 G-STAR 雪纺短款夹克

 

188.00 元 

深大玉妹Shenda Yummy粉刺液、去痘王,

来源:程序员网

小小豆叮