用Axis 1.1 for Java进行Web Services开发(1)

用Axis 1.1 for Java进行Web Services开发 下面的所有几乎来自Axis1.1的文档。但不完全来自文档,本人做了部分修改,这些修改完全出自国内读者的需要。 什么是SOAP? SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出,随着不断地完善和改进,SOAP很快被业界广泛应用,目前完全发布版本是1.1。在其发展过程中,W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。在写作此文档之时,SOAP1.2草案已经发布,1.2对1.1中相对混乱的部分做了改进。 SOAP被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。 这里太肤浅的说明,请参阅我的整理《一步一步学习SOAP》。 什么是Axis? Axis本质上就是一个SOAP引擎,提供创建服务器端、客户端和网关SOAP操作的基本框架。Axis目前版本是为Java编写的,不过为C++的版本正在开发中。 但Axis并不完全是一个SOAP引擎,它还包括: ? 是一个独立的SOAP服务器。 ? 是一个嵌入Servlet引擎(例如Tomcat)的服务器。 ? 支持WSDL。 ? 提供转化WSDL为Java类的工具。 ? 提供例子程序。 ? 提供TCP/IP数据包监视工具。 Axis是第三代Apache SOAP,从2000年起,SOAP v2开发小组开始讨论如何让Axis更加灵活、可配置,以及能够处理SOAP和来自W3C的各种XML标准。通过不断地讨论和代码编写,Axis目前取得了如下成果: ? 速度提高。 Axis通过基于事件的SAX对XML文档进行处理,从而在速度和效率上比Apache SOAP有所提高。 ? 灵活性提高。 ? 稳定性提高。 ? 提供面向组件的部署。 ? 提供一个简洁的传输抽象框架。其核心引擎完全于传输方式独立。从而使基于何种协议传输的选择更加灵活。 ? 支持WSDL。包括到处WSDL和客户代理生成等。 在目前发行1.1版本中有什么东西? ? SOAP1.1/1.2引擎。 ? 灵活的配置和部署系统。 ? 支持及时自动生成SOAP服务(JWS)。 ? 支持所有的基本数据类型,为自定义串行操作提供类型映射系统。 ? JavaBean的自动串行操作,包括将自定义属性类型映射到XML的属性和元素。 ? RPC和基于消息的SOAP服务提供者。 ? 从部署好的服务自动生成WSDL。 ? WSDL2Java工具可以从WSDL描述文件中产生相应的客户和服务器端SOAP操作框架。 ? 初步提供安全扩展,能够与Servlet2.2安全集成。 ? 通过HTTP Cookie和与传输无关的SOAP头信息提供会话跟踪。 ? 初步支持带附件的SOAP消息。 ? 在EJB方面提供把EJB作为Web服务的访问途经。 ? 基于Servlet的HTTP传输。 ? 基于JMS的传输。 ? 独立的服务器(但需要HTTP 服务器和Servlet容器支持)。 ? 提供客户端、服务器端相关应用程序的样例。 Axis的运行需要如下组件包 ? axis.jar ? jaxrpc.jar ? saaj.jar ? commons-logging.jar ? commons-discovery.jar ? wsdl4j.jar ? 符合JAXP-1.1的XML处理器。 一步一步开始用Axis进行Web Services操作 下面给出一段简单的调用Web Services方法的客户端代码(由于原文档中直接用导入包的方式初学者不易了解那个类在那个包中,所以下面我做了一些简单的修改,希望能给学习者清晰的思路): public class TestClient { public static void main(String[] args) { try{ String endpoint="http://localhost:8080/axis/SayHello.jws?wsdl";// 调用的web服务的url地址,这里是一个http请求,希望得到的结果是wsdl文档。 org.apache.axis.client.Service service=new org.apache.axis.client.Service();//建立请求服务框架实例。 /* * org.apache.axis.client.Service实现JAX-RPCs javax.xml.rpc.Services接口 * 该接口充当产生下面提到的org.apache.axis.client.Call实例 * 的角色。 */ org.apache.axis.client.Call call=(org.apache.axis.client.Call)service.createCall();//从框架中生成一个维护调用的实例。 /* * org.apache.axis.client.Call实现了JAX-RPCs javax.xml.rpc.Call接口。 */ call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName(new javax.xml.namespace.QName("http://www.edu-edu.com.cn/luopc/ws","echoString"));//设置需要调用的函数名称 String result=(String)call.invoke(new Object[]{"hello!"}); System.out.println(result); }catch(Exception e){ System.err.println(e.toString()); } } } 上面的代码可能和原文档中不同,并且在名称空间、函数多态上会给用户造成糊涂。不过别急,我在翻译手册的同时会加入很多解释的代码,如果哪位纯粹看不懂可以通过邮件获取帮助:luopc@edu-edu.com.cn ,邮件主题必须是我提供的文档名称。 通过上面的调用代码,最终生成向服务器请求SOAP信息包,具体XML内容如下: <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <ns1:echoString xmlns:ns1="http://www.edu-edu.com.cn/luopc/ws"> <arg0 xsi:type="xsd:string">Hello!</arg0> </ns1:echoString> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 这里我不再多少,细心的朋友请从代码中找相应的对应信息来进行自己的逻辑理解。至于SOAP协议在我以后的翻译文档中会加入进去。 从上面的代码中我们在调用的时候输入了参数new Object[]{“hello!”}。然后从生成的SOAP请求包中可以看到自动序列化成<arg0 xsi:type="xsd:string">Hello!</arg0>。你可以看到参数名称为arg0,类型为xsd:string。其实在Axis客户端我们可以直接通过具体的方法来设置每一个参数名称、类型以及返回值类型。如下代码: call.addParameter("testParam", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN); call.setReturnType(org.apache.axis.Constants.XSD_STRING); 加入上面的代码之后生成如下的SOAP信息: <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <SOAP-ENV:Body> <ns1:echoString xmlns:ns1="http://www.edu-edu.com.cn/luopc/ws"> <testParam xsi:type="xsd:string">Hello!</testParam> </ns1:echoString> </SOAP-ENV:Body> </SOAP-ENV:Envelope> 可以作简单的对比。 也许你会疑惑设置参数名称和不设置参数名称有什么区别的疑问。这里作简单的解释: 1. 为什么要call.setReturnType(org.apache.axis.Constants.XSD_STRING)? 上面你可以调用或者可以不调用,但当返回结果中没有标明数据类型时Axis就不知道如何进行数据类型转换。当然如果返回类型你很清楚并且返回应答SOAP的结果中表明了相应的数据类型你便可以不进行上面的函数调用。 2. 为什么要设置参数名称和类型? 好了,下在你知道了如何调用Web Services了,下面告诉你如何写作和发布Web Services。 通过Axis发布Web Services 这里写作一个简单的类,然后一步一步进行发布。希望用户能够从中理出一些思路来。我在其他的关于Web Services的文章中会专门针对Web Services的通用发布方法。虽然Web Services牵涉到很多复杂的知识,但请大家不要感觉到这些操作简单,也许你已经有很多疑问,没关系,记下你的疑问,不断的投试。 public class SayHello { public String echoString(String hello){ return hello; } } 哈哈,这个类是不是太简单了。 一步一步来。 Axis提供两种将Java类发布成Web Services的途径,即即时快速自动发布和通过配置文件进行发布。我们首先从最容易部署的入手。 JWS----即时部署 简单说就是将自己写的Java类源文件按一定的规则Copy到特定的目录下便可自行被Axis部署。具体步骤如下: ? 将上面写的SayHello.java复制到axis目录下。 ? 改名为SayHello.jws。 注意:在你写的类中不能有具体包的信息,因为这正是Axis即时部署不支持的。 运行我们前面写的客户端进行测试,运行结果是hello!。 目前你是否有如下的问题? 如果类中用多态的函数将如何处理? 其实很简单,我们知道在每次发出调用请求之前代理程序在后台会直接请求你给的URL,这里是http://localhost:8080/axis/SayHello.jws?wsdl,其实这一请求返回来的是WSDL描述文件,通过具体的描述文件的内容和你输入的参数的类型比较,最终确定发送什么请求。细节上的解释需要用户阅读SOAP的具体内容。我也会提供相应的权威文当翻译的。 Axis的客户端默认就是通过HTTP协议传输吗? 如何将自己定义的类型进行映射? 通过WSDD自定义部署 上面的自动部署相当简单,但当你需要 ? 映射自己的类型时 ? 不需要暴露源代码时 ? 需要自己的路径和包管理时 ? 对用户操作Web Services的事件进行相应时 就需要通过WSDD来自定义部署。 前面新特性中提到过,Axis是一个很灵活的可配置系统,但在配置之前你得懂得Axis Web Services描述文档(WSDD)的格式和意义。这里有一个简单的例子(deploy.wsdd): <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="SayHello2" provider="java:RPC"> <parameter name="className" value="luopc.ws.SayHello"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> 很简短的描述就会自定义对特定类以Web Services的形式发布。上面的每一个service项都会意味着开通一个相应的可被WSDL文件引用的服务。其内部描述信息将会描述从请求-处理请求-应答需要的所有核心信息。这里provider=”java:RPC”对应着相应的服务类为org.apache.axis.providers.java.RPCProvider。其实你可以通过多种方式提供相应的服务。在关于Axis的架构文章中将会详细解释这些内容。 上面的各个参数我不再解释,我想大家一看就明白。 下面让我们在上面的简单配置上开始一步一步的进行各种高级配置: 服务存活范围 Axis提供Session、Request和Application三种可选范围配置。具体配置标记为: <service name="MyService"...> <parameter name="scope" value="value"/> ... </service> 一旦你完成上面的文件。可以写一个脚本批处理文件来完成部署。批处理文件如下: java -classpath F:\resource\tools\axis-1_1\lib\axis.jar;F:\resource\tools\axis-1_1\lib\commons-discovery.jar;F:\resource\tools\axis-1_1\lib\jaxrpc.jar;F:\resource\tools\axis-1_1\lib\commons-logging.jar;F:\resource\tools\axis-1_1\lib\log4j-1.2.8.jar;F:\resource\tools\axis-1_1\lib\wsdl4j.jar;F:\resource\tools\axis-1_1\lib\j2ee.jar org.apache.axis.client.AdminClient sayHelloD.wsdd。 上面的一些jar文件都是Axis运行需要的组件,所以必须添加到环境中。上面的目录是我的机器里的目录,你可以按自己的目录进行。 如果部署成功,会输出<Admin>Done processing</Admin>信息。 但本人这里再强调几个: ? 你首先要将你编译好的类放到axis/web-inf/classes/下面。 ? 可以通过http://localhost:8080/axis/services/SayHello2来调用。 ? 你可以从我的配置文件中发现了包的概念。 ? 可以用相应的xml文件进行卸载已部署的服务。 卸载方法如下: 编写如下XML文档 <undeployment xmlns="http://xml.apache.org/axis/wsdd/"> <service name="MyService"/> </undeployment> 把上面的批处理文件中的sayHelloD.wsdd换成该文件便可。 继续关注高级部署 如果你想知道自己的某个Web Services被调用多少次,你应该怎么做呢? Axis提供了相应的跟踪机制。 ? 首先你应该编写一个满足一定接口的事件处理类。 ? 在配置文件中添加事件处理器信息。 我们先看看配置文件中的信息: <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <!-- define the logging handler configuration --> <handler name="track" type="java:samples.userguide.example4.LogHandler"> <parameter name="parameter1" value="访问该services"/> </handler> <!-- define the service, using the log handler we just defined --> <service name="SayHello2" provider="java:RPC"> <requestFlow> <handler type="track"/> </requestFlow> <parameter name="className" value="luopc.ws.SayHello"/> <parameter name="allowedMethods" value="*"/> </service> </deployment> 上面的绿色部分起到核心的配置信息提供。 下面提供一个事件处理类,同样来自原文档,但为了更清晰我同样将所有的类前面加上了包名称。 package luopc.ws; /** * @author luopc */ public class EventHandler extends org.apache.axis.handlers.BasicHandler{ public void invoke(org.apache.axis.MessageContext mtxt){ String param=(String)getOption("parameter1"); System.out.println(param); } public static void main(String[] args) { } } 就这样,我们对请求跟踪了。嘻嘻。 可以远程进行管理(不推荐) 前面就提到服务类型的问题,在Axis有四种类型的服务,分别为RPC、Document、Wrapped和Message。 <淘宝热门商品:
 

58.00 元  

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

 

36.9元  

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


来源:程序员网

小小豆叮

广东工业大学的JAVA热

最近在广东工业大学兴起一股学习JAVA语言的热潮。 JAVA语言在广东工业大学的影响已越来越大,每一个学习编程语言的人都在讨论JAVA语言,这对于SUN公司来说是非常值得高兴的事。 说明JAVA已经深入到新一代大学生的意识中。这对JAVA的发展是十分有利的。 并且学校也大量引进JAVA语言的书籍,大大方便了学生学习JAVA语言,且不欠的将来我们学校也将开展JAVA语言学习班。 <淘宝热门商品:
 

288.00 元 

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

 

132.00 元 

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


来源:程序员网

小小豆叮

Java教程电子文档下载

Java教程电子文档下载 Java教程电子文档下载 (其中有些可能己不能链接了) A.书名:《Thinking in Java》2e中文版 侯捷 / 王建兴 合译 URL: http://jjhou.csdn.net/thinking-in-java-20010919.pdf B.书名:JBuilder5中文帮助文件 URL: http://www.code-labs.com/manual/Jb5cn_help1.rar http://www.code-labs.com/manual/Jb5cn_help2.rar C.书名:Think in Java(中文版)---chm格式 URL: http://www.code-labs.com/manual/Think%20In%20Java.chm D.书名:Jbuilder开发人员指南(完整版) URL: http://www.java-cn.net/book/books-zip/JbuilderGuide.zip E.书名:Java2编程详解(Special_Edition_Using_Java) URL: http://www.java-cn.net/book/books-zip/Java2Xiangjie.zip F.书名:Java2 轻松进阶 URL: http://www.java-cn.net/book/books-zip/java11.zip G.书名: JavaBeans开发使用手册 URL: http://www.java-cn.net/book/books-zip/JavaBeansDevelop.zip H.书名:Java1.3API手册 URL: http://www.java-cn.net/book/books-zip/api.zip java 教程与实例 http://download.pchome.net/php/download2.php?sid=10837&;url=/development/reference/Javateach0307.zip&svr=3 I.书名:SCJP认证笔记 URL: http://vanstone.myetang.com/scjp/scjpnotes.rar J.书名:Sun培训教材中文稿 URL: http://vanstone.myetang.com/scjp/javabook/sl275cn.pdf K.书名:SCJP认证Bible URL: http://vanstone.myetang.com/scjp/scjpbible.rar L.书名:java开发规范(html) URL: http://www.cn-java.com/target/download.php?id=790&;downurl=../download/book/javaformat.zip M.书名:EJB2.0 Entity bean(PDF) URL: http://www.cn-java.com/target/download.php?id=708&;downurl=../download/book/EJB2.0.zip N.书名:J2ME用户使用手册(PDF) URL: http://www.cn-java.com/target/download.php?id=667&;downurl=../download/book/UserGuide.pdf O.书名:JavaServerPages基础 URL: http://www.java-cn.net/book/books-zip/JSPIntro.zip P.书名:RMI Enhancements URL: http://www.cn-java.com/target/download.php?id=297&;downurl=/download/tools/rmispecjdk12.zip Q.书名:无废话XML URL: http://www.cn-java.com/target/download.php?id=222&;downurl=../download/tools/wfhxml_gb.zip R.书名:Design Pattens 注释:号称软件工程师的床头必备书籍,非常经典,对面向对象思想在实践应用中的模式做了经典性的总结 URL: http://automation.seu.edu.cn/auto/content/Design.zip S.书名:设计模式 可复用面向对象软件的基础 注释:南京大学翻译的Design Patterns的中译本,机械工业出版社出版,翻译质量较好 URL: http://automation.seu.edu.cn/auto/content/DesignCh.zip T.书名:Thinking in Java with Patten 注释:与Thinking in Java为同一作者所著,设计模式与Java的结合 URL: http://automation.seu.edu.cn/auto/content/TIPatterns[Thinking%20in%20Pattern%20with%20java].zip U.书名:The Design Pattens Java Companion 注释:另一本Design patten 与Java相结合的书 James w.Cooper著 URL: http://automation.seu.edu.cn/auto/content/DesignJava.zip V.书名:Java 2 平台安全技术-结构,API设计和实现 注释:来自china pub,PDF文档,中译本 URL: http://automation.seu.edu.cn/auto/content/Java2Safe.zip W.书名:Mastering Enterprise JavaBeans 注释:Ed Roman著,EJB的优秀书籍 URL: http://automation.seu.edu.cn/auto/content/EJB-book.zip X.书名:Pure JSP 注释:James Goodwill著 Sams, Macmillan Computer Publishing 2000.6.8出版 URL: http://automation.seu.edu.cn/auto/content/Pure%20jsp.zip Y.书名:Sun Tutorial 2001.5 注释:Sun公司的经典教程,入门必读 URL: http://automation.seu.edu.cn/auto/content/tutorial_2001.zip Z.书名:JDK1.3.1 document Winhelp 格式 注释:Winhelp格式的JDK文档,更易阅读和查找,很棒 URL: http://automation.seu.edu.cn/auto/content/jdk13doc_help.zip 1A.书名:The Java Virtual Machine Specification Second Edition 注释:Java 虚拟机规范,有助于理解Java的实现原理,Sun出版 URL:http://automation.seu.edu.cn/auto/content/vmspec.2nded.html.zip 1B.书名:The Java Language Sepcification Second Edition 注释:Java 语言规范,Java编程语言的详细说明,Sun出版 URL: http://automation.seu.edu.cn/auto/content/langspec-2.0.zip 1C.书名:Java programmer´s FAQ 注释:Sun公司的FAQ,内容丰富,覆盖面广 URL: http://automation.seu.edu.cn/auto/content/faq.zip 1D.书名:Cocoon 2 简介 注释:Cocoon 是一种 Java 服务器框架,它允许使用 XSLT转换动态发布 XML 内容。通过依靠 XML 描述内容,使用 XSLT 将内容转换成多种格式,Cocoon 提供了用于构建内容、逻辑和表示在很大程度上彼此分离的应用程序的平台。 本教程将介绍 Cocoon 2,一个比原始 Cocoon 应用程序更有效和更可伸缩的平台。 URL: http://www-900.ibm.com/developerWorks/cn/education/xml/x-cocoon/tutorial/x-cocoon.zip 1E.书名:java事件传递技术 注释:Java 2 平台使程序员可以从事件的角度来思考系统,而不从是传统的调用-返回(call-return)体系结构风格的角度。在该平台本身内部,就有对多种事件通知模式的直接支持。思考事件的一种方式是通过事件的粒度和所有权。一些事件模式适合在对象实例状态变化的粒度上表示事件。 URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-delivery/tutorial/j-delivery.zip 1F.书名:使用 JDBC 构建基于 Web 的应用程序 注释:如果您对构建使用 JDBC 访问数据库的 Web 应用程序的各种方法感兴趣,那么本教程适合于您。在这一实践指南中,您将通过使用三项独立的技术来学习这一过程的基础知识,这三项技术是:servlet 方法、JavaServer Pages(JSP)页面方法以及 JSP、JavaBeans 与 servlet 相结合的方法(也称为 Model Two)。 URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-jdbcweb/tutorial/j-jdbcweb.zip 1G.书名:Java 3D 探奇 注释:本教程是为没有任何 3D 编程经验的 Java 程序员而编写的。我们将从一些基本的 3D 概念入手,探索如何构建一副场景图 ? 用于描述我们想要渲染的场景的基本对象。然后,我们将接触 Java 3D 的一些更强大的功能。我们的重点将放在使用一些 Java 3D 实用类来开始您的编程。 URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-java3d/tutorial/j-java3d.zip 1H.书名:使用 JDBC 的高级数据库操作 注释:本教程旨在向您介绍几种高级数据库操作,包括存储过程和高级数据类型,它们可以通过使用 JDBC 的 Java 应用程序执行。教程中的示例代码是为 DB2 通用数据库 7.2 编写的,但因为使用了 DataSource 对象,修改这些代码以适用于其它数据库是不成问题的。 URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-jdbcadv/tutorial/j-jdbcadv.zip 1I.书名:用 JDBC 管理数据库连接 注释:本教程介绍了使用“Java 数据库连接”(Java Database Connection(JDBC))从 Java 应用程序内部建立和管理数据库连接所涉及的不同概念。 URL: http://www-900.ibm.com/developerWorks/cn/education/java/j-jdbc/tutorial/j-jdbc.zip <淘宝热门商品:
 

3C数码配件 

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

 

96.00 元 

奥地利进口 专柜礼盒 天然水晶 施家经典STARS


来源:程序员网

小小豆叮

网络开发应用JAVA EJB开发中间件(weblogic+oracle+ejb)

网络开发应用JAVA EJB开发中间件(weblogic+oracle+ejb) JAVA语言是时下流行的网络开发应用语言,以它的安全性与可扩展性得到应用开发人员的信赖,而基于JAVA的EJB系统又是JAVA开发中的高级开发应用,基于JAVA的MVC的开发过程,对于中间件的开发浮出水面。现在,我处已经成功开发出WEBLOGIC + ORACLE + EJB的中间件应用系统OME(Open Meister Enterprise),使用中间件系统,用户可以在短时间内开发出高质量的WEB应用系统,此中间件适用于各种后台管理系统的开发。如:商品系统,人员系统,销售系统等等,基于网络(包括局网)和数据库的后台管理系统。我处有成品模型可供参考。提供文档与技术支持。 二、产品技术优势 2.1 先进的体系架构: 采用B/S(浏览器/服务器)体系结构使得用户只需要通过浏览器即可轻松完成各种信息处理, 简单易用,大大缩短了信息系统建立周期,节省管理费用, 集中管理、统一维护、分类有序存放信息数据,使得系统维护、升级、扩充更方便, 并且可针对集团企业组合和扩展迅速做出相应的系统调整和变化, 极大的适应了用户在不同环境和条件下的需求; 2.2 完美的适应性: 开发基于bea公司的Weblogic J2EE平台,从而适用于多种操作系统(如:Windows NT/2000、Unix、Linux等) 及多种数据库系统(如:MS SQL Server、Oracle等); 2.3 可靠的群集结构: 针对大型集团企业办公的特点提供了群集构架模式。支持公文、报表在集团各级企业间流转和催办的功能, 更加适合办公管理要求,还支持各种群集数据库和分布式数据库结构, 保障企业内部的办公更清晰、更顺畅。 强大灵活的流程管理功能使企业可以方便地规范内部管理流程; 2.4 模块化结构设计: 能适应企业不同阶段的组织结构或人事结构变化,系统伸缩性好,支持不同规模的用户; 2.5 高度的安全性: 整合了多层次的安全控制方案,消除浏览器自身的诸多不安全因素, 用户在浏览器中输入了其无权访问的页面地址,系统将自动注销该用户; 系统在登录认证时,仅将用户输入的密码加密后与数据库中的加密密码比较, 不提供任何对数据库中的密码提供解密操作的服务,使得系统更加安全可靠; 三、体系结构   从设计到开发完全采用了面向对象技术,整体的架构完全遵循SUN公司的J2EE规范, 实际开发中采用了JAVA技术,例如:Servlet、Applet、JSP、JavaBean、JDBC Pool等, 使得整个体系结构符合知识经济时代信息应用的发展趋势。   采用模型、视图和控制器架构(MVC),模型提供应用业务逻辑(Enterprise Beans类); 视图则是其在屏幕上的显示(HTML页面、JSP页面);控制器则是Servlet、JavaBeans类, 它用于管理用户与视图发生的交互,采用MVC模型,将逻辑层和表示层分开以后, 使得它们各自能够独立的变化。进而使得可维护性、可扩展性及可测试性方面得到很大的改善; 通过将控制器和模型代码保持在视图之外,可以动态地决定表示的形式。 联系人:郑红岗 电话:013516776048 0571-85939828 邮箱bpboys@sina.com.cn <淘宝热门商品:
 

350.00 元  

【收藏本店天天有奖】 家家康 淘宝第一品牌家电商城!

亚都净化型加湿器 YZ-D231W 水公主 亚都十大经销商

 

5.00 元  

好 Baby外贸童装玩具批发

(男款成人袜子)日本原价580日元 特卖 5元人民币 随机发货


来源:程序员网

小小豆叮

JBOSS 组织将于下月访华

JBOSS组织的Ben Wang将于下月访问台湾、香港与上海。 他将在上海进行一场演讲: 题为:JBoss, the Professional Open-Source J2EE Server 4月4日(周日):3:00pm ~ 5:00pm, 复旦大学软件学院 复旦大学第三教学楼3209教室 (到达复旦大学是很容易的,进复旦大门右转就是复旦的第二、第三教学楼,非常容易找。) Ben Wang是JBOSS Cache和集群方面的主要编写者之一。 主办:复旦大学软件学院 策划:www.redsaga.com 满江红开源网站 感谢复旦大学软件学院提供活动场地和会场安排。 <淘宝热门商品:
 

118.00 元 

韩国正品intercrew LED表 真皮皮带款

 

12.00 元  

最新奇的负离子手表,减压手表


来源:程序员网

小小豆叮

在JBuilder 9上使用Struts 1.1

Struts1.1比Struts1.0功能增强了很多。比如:提供DynaActionForms,可不用编写任何代码创建动态的ActionForm;多应用支持允许定义多个struts-config.xml配置文件等等。但JBuilder 9只直接支持Struts1.0,不直接支持Struts1.1,下面让我们来看看怎样让JBuilder 9支持Struts1.1。 首先下载 jakarta-struts-1.1,把整个目录放到/extras目录下. 接着在JBuilder用 Configure Libraries对话框 (Tools-->Configure Libraries)创建一个新的library ,我们命名为Struts1.1,把jakarta-struts-1.1lib目录下所有的jar添加到新的library里,在library Settings里设置Framework为Struts,点OK,设置完成. 接下来看看设置是否成功: File-->New创建一个web application, 在Web Application wizard的JSP/Servlet frameworks中我们看到了Struts 1.1选择框,设置成功! 接下来您就可以在JBuilder9里使用Struts1.1开发您的Web Application了. <淘宝热门商品:
 

59.00 元 

doob多布-皇冠商铺机器猫一家现货供应

 

 

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


来源:程序员网

小小豆叮

J2me的基本概念

本文主要介绍J2me的基本概念。因为注意到国内的java站点介绍J2me的还比较少,所以就写了本文。如果有什么不妥的地方,欢迎您email我,讨论商榷。 如您要转贴,请保留原出处,并勿做删改。谢谢。 1.名词 这里我列出一些常见的关键词,方便与下文参照.具体解释见后文. J2ME(Java2 Platform, Micro Edition) CLDC(Connected, Limited Device Configuration) MIDP(Mobile Information Device Profile) KVM(The K Virtual Machine) 2.背景 随着无线应用与嵌入式系统的愈来愈受到人们的重视,SUN也推出了J2ME来迎合这一趋势.(实际上道也不能算是新推出,熟悉Java历史的人都知道,java原先本是为了开发消费性电子产品而研制的.谁知,无心插柳柳成荫,因在网络应用上的出色表现而流行,以致现在的J2EE、EJB等等,发展地越来越庞大。这次实质是杀了个回马枪。至于表现如何,还得拭目以待)sun认为,未来的信息设备将比我们今天的更为customizable 和 personal。这一点我们已经可以从手机和pda的流行程度看出。所以为了开发面向这些设备的applications。sun推出了J2ME(Java2 Platform, Micro Edition)。 3.j2me的基本结构 j2me把设备分为两类,一种是联接设备( connected device),一种是有限联接设备(Connected, Limited Device)。前一种对应于那些有电源的,电力充裕,较大的设备。例如:电视机,冰箱等,后一种对应于主要使用电池,小型的设备,例如:手机,pda等。这里我只涉及第二种,有限联接设备(Connected, Limited Device)。 3.j2me的基本结构 sun把J2me分为两个部分:configuration 和 profile。 configuration包括虚拟机(virtual machine),核心的类库与API。configuration层定义一个java虚拟机的特性与java类库的最小子集。也就是说,configuration层提供了开发人员一个最基础,最核心的Java平台。就像我前文提到的,j2me把设备分为两类,一种是联接 设备(connected device),一种是有限联接设备(Connected, Limited Device)。对应这两种设备就有了两种J2ME configuration。分别为CDC(Connected Device Con-figuration )和CLDC(Connected, Limited Device Configuration)。这里请注意,CDC使用经典的javaVM,而CLDC使用的是KVM(The K Virtual Machine)。 注:kvm是sun为使用16/32位RISC/CISC微处理器或控制器,并其可用内存为160kb~512kb 的的设备而开发的。 Profile层也包含一组API,主要针对于特定的某一族系的设备而定义。profile层在特定的configuration层上实现,而我们程序员则负责在特定的profile上编写应用程序。对于手机,pda等Connected, Limited Device。它们的profile层称为MIDP(Mobile InformationDevice Profile)。于是MIDP与CLDC合在一起就构成了一个完整的J2ME架构。 顺便说一句,对于MIDP上的应用程序sun也有独特的叫法,它们被称为MIDlet。你是不是觉得有点眼熟。想想java中的applet。 ┌───────┐┄┄┄┄┄┄┄ │MIDlet │ 应用程序 ├───────┤┈┈┈┈┈┈┈ │ MIDP │ proflie层 ├───────┤┄┄┄┄┄┄┄ │J2ME核心API │ configuration层 ├───────┤ CLDC │ KVM │ ├───────┤┈┄┄┄┄┄┄ │特定的硬件 │ └───────┘ 图1 J2ME的CLDC&MIDP架构 4。深入理解CLDC 本节的部分内容译自J2ME White Paper,比较枯燥,但请记住,毕竟,正确的观念重于一切。 CLDC的目的 ·为小型的,且资源有限,Connected Limited的设备定义一个标准的Java平台。 ·允许动态的向这些设备发布内容与应用程序。 ·方便第三方软件厂商与开发者向这些设备移植内容与应用程序。 CLDC的范围 ·Java语言与虚拟机的特性 ·核心Java类库(如java.lang.*, java.util.*) ·输入/输出 ·对网络的支持 ·对安全性的支持 ·对国际化的支持 CLDC不包括的范围(即由MIDP解决的) ·对应用程序life-cycle的管理(就是指一个应用程序是如何安装,运行,删除的) ·UI界面(User Interface) ·Event处理 ·高级应用程序模式(这里指用户与应用程序的交互)。 CLDC的安全性 低端的基于虚拟机的安全性由下载时对class文件的审核(verification)步骤来保证。(如果你写过并编译过MIDlet程序,就会知道这一步是必须的。这里有一个概念就行了,我会在以后讲述如何创建MIDlet程序时,详细介绍具体的步骤)。 基于应用程序的安全性通过使每个应用程序分别运行在相对独立的封闭环境中来保证并且处于被保护的系统package中的类不能被应用程序重载(overridded)。 对于Java语言支持的特殊的方面 CLDC总的来说是与Java语言完全兼容的,但需注意以下几点: 不支持浮点数据类型(即没有float和double)(这实际上主要是由于CLDC所面向的设备,其硬件因其内存限制或是基于安全性的考虑不支持浮点运算) 不支持类实例(class instance)的终结(finalization),即不存Object.finalize ()方法。(注:finalization指的是java中提供的有别与garbage collection的另外的一种对象清理方法。具体可参看侯捷老师译的Bruce Eckel的《Thinking in Java 第二版》,可以在www.jjhou.com中下载) 有限的错误处理,即大部分Java.lang.Error的子类都未被支持。与此相反,CLDC包括了相当完备的异常(exception)类。 对于Java虚拟机(Java Virtual Machine)支持的特殊的方面 实质上CLDC在其严格的内存限制下达到了对Java虚拟机相当程度的兼容性。不过还是有下列不同点。 ·不支持浮点数据类型(没有float和double) ·不支持JNI (the Java Native Interface ) ·不支持用户自定义的Java级的类载入器(class loaders ) ·没有反射(reflection)特性(注:reflection指java通过java.lang.reflect提供的,可以对类的能力进行分析的功能。常用来对类的结构进行检查,在JavaBeans上有广泛运用可参见Gary Cornell的Core Java2 volumeI,II,机工有出中译本) ·不支持线程组(thread groups)或守护线程(daemon threads) ·不支持类实例(class instance)的终结(finalization) ·没有弱参考(weak references)(注:weak reference提供了一种解决指向已经被garbage collector清除的对象的方法。在Java2中被介绍。具体请参考java.lang.ref API文档,和sun网站上关于Reference Objects和Garbage Collection的文章。) ·有限的错误处理(error handling) 4。深入理解CLDC (part II) 本节的部分内容译自J2ME White Paper,比较枯燥,但请记住,毕竟,正确的观念重于一切。 类文件审核过程(classfiles Verification) CLDC要求其下层的虚拟机能够辨别并拒绝非法的class文件。但由于CLDC本身面向小内存消耗的小型设备这一前提。其类文件检测机制与J2SE中定义的标准类文件审核机制还有所不同。请注意看下图: MyApp.java │ ↓ ┌───┐ │Javac │┄编译器 └───┘ ↓ MyApp.class ↓ ┌──────┐ │preverifier │┈预审核器 └──────┘ ↓ MyApp.class │ ↓download... ┌────────┒ │ ┠┄┄KVM运行环境 │┌──────┐┃ (目标设备) ││ verifier │┃ │└──────┘┃ │ ┃ │┌──────┐┃ ││ │┃ ││interpreter │┃ ││ │┃ │└──────┘┃ ┕━━━━━━━━┛ 图2 CLDC/KVM中类文件的审核过程 请注意CLDC中的预审核(preverification)过程。这是CLDC区别于通常的类文件审核过程的关键。如上图所示,当源程序被编译后,必须被预审核器预审核,然后才能被下载到目标设备上去。之所以有这一步骤,主要是为了减轻KVM中审核器的负担,加快审核速度。就像我前文提到的,这是出于对CLDC支持的硬件的考虑(毕竟手机和PDA并没有我们PC机那样奔腾的“芯”呀!^-^)。这里记住这个概念就行了。具体的操作方法我会在以后讲述编写MIDlet程序时介绍。 类文件格式 sun要求通过Jar(compressed Java Archive)给Java应用程序打包,这里也不例外。所以如果你想把你的MIDlet程序下载到设备上运行,你就得先用jar打包。具体的操作方法我会在以后讲述编写MIDlet程序时介绍。 CLDC的类库 如果不严格的说,CLDC的类库是J2SE的一个小的子集,有以下这种近似关系成立,即J2SE包含CDC包含CLDC。但要注意CLDC并未完全包含于J2SE,它还包括一 些专门针对无线设施的类。所以可以把CLDC的类库简要划分为两部分:从J2SE继承的类和CLDC专有的类。 (1)从J2SE继承的类 这部分包括三个package,即java.lang,java.util和java.io。注意即使这些从J2SE继承的的类,也是大大“缩了水”的。例如java.util的类与接口由J2SE的47个缩减到10个。另外两个也有相应缩减。 系统类 From java.lang: Object, Class, Runtime, System, Thread, Runnable, String, StringBuffer, Throwable 数据类型类 From java.lang: Boolean, Byte, Short, Integer, Long, Character 容器类(container class) From java.util: Vector, Stack, Hashtable, Enumeration I/O 类 From java.io: InputStream, OutputStream, ByteArrayInputStream, ByteArrayOutputStream, DataInput, DataOutput, DataInputStream, DataOutputStream, Reader, Writer, InputStreamReader, OutputStreamWriter, PrintStream 日期与时间类 From java.util: Calendar, Date, TimeZone 附加的实用类 java.util.Random, java.lang.Math 异常类(Exception Classes) From java.lang: Exception, ClassNotFoundException, IllegalAccessException, InstantiationException, InterruptedException, RuntimeException, ArithmeticException, ArrayStoreException, ClassCastException, IllegalArgumentException, IllegalThreadStateException, NumberformatException, IllegalMonitorStateException, IndexOutOfBoundsException, ArrayIndexOutOfBoundsException, StringIndexOutOfBoundsException, NegativeArraySizeException, NullPointerException, SecurityException From java.util: EmptyStackException, NoSuchElementException From java.io: EOFException, IOException, InterruptedException, UnsupportedEncodingException, UTFDataformatException 错误类 From java.lang: Error, VirtualMachineError, OutOfMemoryError (2)CLDC专有的类 这里sun提供了javax.microedition.io包。用它来提供与外界沟通的桥梁。(注:就像在J2SE中我们利用java.net.*)注意,所有的连接都由javax.microedition.Connector创建。例如:你可以打开一个http连接通过 Connector.open("http://www.chinajavaworld.com") javax.microedition.io的接口包括: Connection, InputConnection, OutputConnection, StreamConnection, ContentConnection, DatagramConnection, StreamConnectionNotifier 这里再说明一点,实际上你也可以看出,CLDC所包括的类库,并不足以开发应用程序。例如,没有UI界面的支持等。这也正是CLDC的设计理念。CLDC本身就从未想过要解决所有的问题。这些问题要靠其上层的Profile-MIDP来解决。例如javax.microedition.lcdui就是定义在MIDP中的UI包。 计算机世界开发者俱乐部 http://www.dev-club.com <淘宝热门商品:
 

 

衣品堂

 

288.00 元 

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


来源:程序员网

小小豆叮

Adapter模式在J2SE事件处理中的应用

1.Adapter模式理论 Adapter模式又称变压器模式,关于该模式的基本概念请参考其他书籍或资料;这里我们只粗略讨论该模式两大实现方法的区别:基于类的Adapter模式和基于对象的Adapter模式。 基于类的Adapter模式的一般结构如下:Adaptee类为Adapter的父类,Adaptee类为适配源,适配目标(接口)也是Adapter的父类;基于类的Adapter模式比较适合应用于Adapter想修改Adaptee的部分方法的情况。基于对象的Adapter模式的一般结构如下:Adaptee类对象为Adapter所依赖,适配目标(接口)是Adapter的父类;基于对象的Adapter模式比较适合应用于Adapter想为Adaptee添加新的方法的情况。但在Adaptee类的方法与Adapter类的方法不同名而实现相同功能的情况下,我们一般也使用基于对象的Adapter模式,在J2SE事件处理中,我们就大量使用了基于对象的Adapter模式。 2.J2SE中的事件处理 J2SE中的事件处理代码示例如下: public class WebFormDesigner extends JFrame { void jbInit() throws Exception { text.addActionListener(new WebFormDesigner_text_actionAdapter(this)); } void text_actionPerformed(ActionEvent e) { TextDialog createText = new TextDialog(); createText.setVisible(true); createText.setTitle("TEXT"); createText.setBounds(100, 100, 500, 300); createText.setModal(true); createText.show(); } } class WebFormDesigner_text_actionAdapter implements java.awt.event.ActionListener { WebFormDesigner adaptee; WebFormDesigner_text_actionAdapter(WebFormDesigner adaptee) { this.adaptee = adaptee; } public void actionPerformed(ActionEvent e) { adaptee.text_actionPerformed(e); } } 在实际编程时,text_actionPerformed方法由程序员自己实现(弹出新的对话框),而WebFormDesigner_text_actionAdapter类是由开发环境依据基于对象的Adapter模式自动生成的。 3.Adapter模式与代码分析 由上面的分析可见,WebFormDesigner在本例中是Adaptee, WebFormDesigner_text_actionAdapter在本例中是Adapter, java.awt.event.ActionListener在本例中是适配目标。 适配目标为一接口,代码如下: public interface ActionListener extends EventListener { /** * Invoked when an action occurs. */ public void actionPerformed(ActionEvent e); } 适配目标中只有一个方法:actionPerformed()。由于WebFormDesigner_text_actionAdapter 实现了java.awt.event.ActionListener,所以要求实现actionPerformed()方法。WebFormDesigner_text_actionAdapter实现actionPerformed()方法是引用了WebFormDesigner这个adaptee而完成的。从代码中可以看出,WebFormDesigner是WebFormDesigner_text_actionAdapter的方法的参数,所以WebFormDesigner_text_actionAdapter依赖WebFormDesigner。 Adaptee类(WebFormDesigner)的方法(text_actionPerformed)与Adapter类(WebFormDesigner_text_actionAdapte)的方法(actionPerformed)不同名而实现相同功能,这就是我们上面分析的基于对象的Adapter模式。 <淘宝热门商品:
 

 

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

 

55.00 元 

年底冲钻免邮费!热销包包 !韩版单肩包!销量过千


来源:程序员网

小小豆叮

10年编程无师自通

为什么每个人都急不可耐? 走进任何一家书店,你会看见《Teach Yourself Java in 7 Days》(7天Java无师自通)的旁边是一长排看不到尽头的类似书籍,它们要教会你Visual Basic、Windows、Internet等等,而只需要几天甚至几小时。我在Amazon.com上进行了如下搜索:     pubdate: after 1992 and title: days and (title: learn or title: teach yourself)     (出版日期:1992年后 and 书名:天 and (书名:学会 or 书名:无师自通)) 我一共得到了248个搜索结果。前面的78个是计算机书籍(第79个是《Learn Bengali in 30 days》,30天学会孟加拉语)。我把关键词“days”换成“hours”,得到了非常相似的结果:这次有253本书,头77本是计算机书籍,第78本是《Teach Yourself Grammar and Style in 24 Hours》(24小时学会文法和文体)。头200本书中,有96%是计算机书籍。 结论是,要么是人们非常急于学会计算机,要么就是不知道为什么计算机惊人地简单,比任何东西都容易学会。没有一本书是要在几天里教会人们贝多芬或者量子物理学,甚至怎样帮狗打扮。 让我们来分析一下像《Learn Pascal in Three Days》(3天学会Pascal)这样的题目到底是什么意思: 学会:在3天时间里,你不够时间写一些有意义的程序,并从它们的失败与成功中学习。你不够时间跟一些有经验的程序员一起工作,你不会知道在那样的环境中是什么滋味。简而言之,没有足够的时间让你学到很多东西。所以这些书谈论的只是表面上的精通,而非深入的理解。如Alexander Pope(英国诗人、作家,1688-1744)所言,一知半解是危险的(a little learning is a dangerous thing) Pascal:在3天时间里你可以学会Pascal的语法(如果你已经会一门类似的语言),但你无法学到多少如何运用这些语法。简而言之,如果你是,比如说一个Basic程序员,你可以学会用Pascal语法写出Basic风格的程序,但你学不到Pascal真正的优点(和缺点)。那关键在哪里?Alan Perlis(ACM第一任主席,图灵奖得主,1922-1990)曾经说过:“如果一门语言不能影响你对编程的想法,那它就不值得去学”。另一种观点是,有时候你不得不学一点Pascal(更可能是Visual Basic和JavaScript之类)的皮毛,因为你需要接触现有的工具,用来完成特定的任务。但此时你不是在学习如何编程,你是在学习如何完成任务。 3天:不幸的是,这是不够的,正如下一节所言。 10年编程无师自通 一些研究者(Hayes、Bloom)的研究表明,在许多领域,都需要大约10 年时间才能培养出专业技能,包括国际象棋、作曲、绘画、钢琴、游泳、网球,以及神经心理学和拓扑学的研究。似乎并不存在真正的捷径:即使是莫扎特,他4 岁就显露出音乐天才,在他写出世界级的音乐之前仍然用了超过13年时间。再看另一种音乐类型的披头士,他们似乎是在1964年的Ed Sullivan节目中突然冒头的。但其实他们从1957年就开始表演了,即使他们很早就显示出了巨大的吸引力,他们第一次真正的成功——Sgt. Peppers——也要到1967年才发行。Samuel Johnson(英国诗人)认为10 年还是不够的:“任何领域的卓越成就都只能通过一生的努力来获得;稍低一点的代价也换不来。”(Excellence in any department can be attained only by the labor of a lifetime; it is not to be purchased at a lesser price.) 乔叟(Chaucer,英国诗人,1340-1400)也抱怨说:“生命如此短暂,掌握技艺却要如此长久。”(the lyf so short, the craft so long to lerne.) 下面是我在编程这个行当里获得成功的处方: 对编程感兴趣,因为乐趣而去编程。确定始终都能保持足够的乐趣,以致你能够将10年时间投入其中。 跟其他程序员交谈;阅读其他程序。这比任何书籍或训练课程都更重要。 编程。最好的学习是从实践中学习。用更加技术性的语言来讲,“个体在特定领域最高水平的表现不是作为长期的经验的结果而自动获得的,但即使是非常富有经验的个体也可以通过刻意的努力而提高其表现水平。”(p. 366),而且“最有效的学习要求为特定个体制定适当难度的任务,有意义的反馈,以及重复及改正错误的机会。”(p. 20-21)《Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life》(在实践中认知:心智、数学和日常生活的文化)是关于这个观点的一本有趣的参考书。 如果你愿意,在大学里花上4年时间(或者再花几年读研究生)。这能让你获得一些工作的入门资格,还能让你对此领域有更深入的理解,但如果你不喜欢进学校,(作出一点牺牲)你在工作中也同样能获得类似的经验。在任何情况下,单从书本上学习都是不够的。“计算机科学的教育不会让任何人成为内行的程序员,正如研究画笔和颜料不会让任何人成为内行的画家”, Eric Raymond,《The New Hackers Dictionary》(新黑客字典)的作者如是说。我曾经雇用过的最优秀的程序员之一仅有高中学历;但他创造出了许多伟大的软件,甚至有讨论他本人的新闻组,而且股票期权让他达到我无法企及的富有程度(译注:指Jamie Zawinski,Xemacs和Netscape的作者)。 跟别的程序员一起完成项目。在一些项目中成为最好的程序员;在其他一些项目中当最差的一个。当你是最好的程序员时,你要测试自己领导项目的能力,并通过你的洞见鼓舞其他人。当你是最差的时候,你学习高手们在做些什么,以及他们不喜欢做什么(因为他们让你帮他们做那些事)。 接手别的程序员完成项目。用心理解别人编写的程序。看看在没有最初的程序员在场的时候理解和修改程序需要些什么。想一想怎样设计你的程序才能让别人接手维护你的程序时更容易一些。 学会至少半打编程语言。包括一门支持类抽象(class abstraction)的语言(如Java或C++),一门支持函数抽象(functional abstraction)的语言(如Lisp或ML),一门支持句法抽象(syntactic abstraction)的语言(如Lisp),一门支持说明性规约(declarative specification)的语言(如Prolog或C++模版),一门支持协程(coroutine)的语言(如Icon或Scheme),以及一门支持并行处理(parallelism)的语言(如Sisal)。 记住在“计算机科学”这个词组里包含“计算机”这个词。了解你的计算机执行一条指令要多长时间,从内存中取一个word要多长时间(包括缓存命中和未命中的情况),从磁盘上读取连续的数据要多长时间,定位到磁盘上的新位置又要多长时间。(答案在这里。) 尝试参与到一项语言标准化工作中。可以是ANSI C++委员会,也可以是决定自己团队的编码风格到底采用2个空格的缩进还是4个。不论是哪一种,你都可以学到在这门语言中到底人们喜欢些什么,他们有多喜欢,甚至有可能稍微了解为什么他们会有这样的感觉。 拥有尽快从语言标准化工作中抽身的良好判断力。 抱着这些想法,我很怀疑从书上到底能学到多少东西。在我第一个孩子出生前,我读完了所有“怎样……”的书,却仍然感到自己是个茫无头绪的新手。30个月后,我第二个孩子出生的时候,我重新拿起那些书来复习了吗?不。相反,我依靠我自己的经验,结果比专家写的几千页东西更有用更靠得住。 Fred Brooks在他的短文《No Silver Bullets》(没有银弹)中确立了如何发现杰出的软件设计者的三步规划: 尽早系统地识别出最好的设计者群体。 指派一个事业上的导师负责有潜质的对象的发展,小心地帮他保持职业生涯的履历。 让成长中的设计师们有机会互相影响,互相激励。 这实际上是假定了有些人本身就具有成为杰出设计师的必要潜质;要做的只是引导他们前进。Alan Perlis说得更简洁:“每个人都可以被教授如何雕塑;而对米开朗基罗来说,能教给他的倒是怎样能够不去雕塑。杰出的程序员也一样”。 所以尽管去买那些Java书;你很可能会从中找到些用处。但你的生活,或者你作为程序员的真正的专业技术,并不会因此在24小时、24天甚至24个月内发生真正的变化。 参考文献 Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985. Brooks, Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4, 1987, p. 10-19. Hayes, John R., Complete Problem Solver, Lawrence Erlbaum, 1989. Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988. 答案 各种操作的计时,2001年夏天在一台典型的1GHz PC上完成:     执行单条指令            1 纳秒 = (1/1,000,000,000) 秒     从L1缓存中取一个word        2 纳秒     从主内存中取一个word        10 纳秒     从连续的磁盘位置中取一个word    200 纳秒     从新的磁盘位置中取一个word(寻址) 8,000,000纳秒 = 8毫秒 <淘宝热门商品:
 

88.00 元  

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

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

 

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

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


来源:程序员网

小小豆叮