2006年02月17日

1. MySQL(http://www.mysql.com)mm.mysql-2.0.2-bin.jar ;
Class.forName( "org.gjt.mm.mysql.Driver" ); 
cn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", sUsr, sPwd ); 
2. PostgreSQL(http://www.de.postgresql.org)pgjdbc2.jar ;
Class.forName( "org.postgresql.Driver" ); 
cn = DriverManager.getConnection( "jdbc:postgresql://MyDbComputerNameOrIP/myDatabaseName", sUsr, sPwd ); 
3. Oracle(http://www.oracle.com/ip/deploy/database/oracle9i/)classes12.zip ;
Class.forName( "oracle.jdbc.driver.OracleDriver" ); 
cn = DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd ); 
4. Sybase(http://jtds.sourceforge.net)jconn2.jar ;
Class.forName( "com.sybase.jdbc2.jdbc.SybDriver" ); 
cn = DriverManager.getConnection( "jdbc:sybase:Tds:MyDbComputerNameOrIP:2638", sUsr, sPwd ); 
// (Default-Username/Password: "dba"/"sql") 
5. Microsoft SQLServer(http://jtds.sourceforge.net) ;
Class.forName( "net.sourceforge.jtds.jdbc.Driver" ); 
cn = DriverManager.getConnection( "jdbc:jtds:sqlserver://MyDbComputerNameOrIP:1433/master", sUsr, sPwd ); 
6. Microsoft SQLServer(http://www.microsoft.com) ;
Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" ); 
cn = DriverManager.getConnection( "jdbc:microsoft:sqlserver://MyDbComputerNameOrIP:1433;databaseName=master", sUsr, sPwd ); 
7. ODBC 
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); 
Connection cn = DriverManager.getConnection( "jdbc:odbc:" + sDsn, sUsr, sPwd );
8.DB2
Class.forName("Com.ibm.db2.jdbc.net.DB2Driver");
String url="jdbc:db2://192.9.200.108:6789/SAMPLE"
cn = DriverManager.getConnection( url, sUsr, sPwd );

2006年02月09日
 什么是 Java 技术

Java 技术(版本 2)是一种面向对象的编程语言,是 Sun Microsystems 所开发的编程平台。Java 技术基于单一 Java 虚拟机(JVM)的概念,JVM 是编程语言与机器底层软件和硬件之间的翻译器。编程语言的所有实现都必须模拟 JVM,从而使 Java 程序可以在具有 JVM 版本的任何系统上运行。

Java 编程语言是与众不同的,因为 Java 程序需要经过编译(翻译为叫做 Java 字节码的中间语言)和解释(通过 JVM 分析和运行字节码)。编译只进行一次,而解释则在每次运行程序时都要进行。编译的字节码是 JVM 的最佳机器码形式;解释程序是 JVM 的实现。

Java 平台具有三个版本(请参阅下面的 Java 平台的多个版本),该平台由 JVM 和 Java Application Programming Interface (API) 组成,Java API 是现成软件组件的集合,便于进行 applet 和应用程序的开发和部署,其中包括健壮的、安全的和可互操作的企业应用程序。Java API 被分组到相关类和接口的库中;这些库称为

了解更多信息:

  • 要了解 Sun 的 Java 编程语言的未来发展方向,请阅读 2003 JavaOne Developer Conference 的 technical keynote digest

Java 平台的多个版本
因为 Java 技术的迅速普及,开发人员强烈要求某些东西更简单些。Sun Microsystems 通过创建三个 Java 平台版本来满足此需要 ― Standard Edition、Enterprise Edition 和 Micro Edition。

了解更多信息:

Merlin 的魔力 专栏极好地介绍了最新版本的 J2SE 1.4。

  • J2EE (Java 2 Enterprise Edition)。通过基于标准化模块组件,通过为这些组件提供一整套服务,以及通过自动处理应用程序行为的许多细节,而无需进行复杂编程,企业版简化了多层企业应用程序的构造和部署。J2EE 探索者 专栏将增加您对此版本的了解。

  • J2ME (Java 2 Micro Edition)。该版本是高度优化的 Java 运行时环境,针对特定的消费者领域,从智能型手机或寻呼机到机顶盒等一系列小型设备(外形小或者存储能力受限)。在“ J2ME 101,第 1 部分:介绍 MIDP 的高层 UI”教程中可以了解更多关于 J2ME 的信息。(您还可以在 developerWorks 无线 专题找到许多 J2ME 参考资料。)

  • 返回到页首 到页首


      Java 技术为什么重要?

    总体来说,Java 语言的主要优点在于跨平台和操作系统的可移植性,以及它可以通过带宽相对较窄的通道提供(比如拨号连接)。Java 语言还具有可伸缩性;现有应用程序可以很容易地适应那些受内存资源限制的设备。另外,由于 Java 语言设计用于通过网络以安全的方式运行,所以当通过 Internet 操作时,它也提供了此级别的安全性。本质上,Java 技术将用户计算能力从桌面扩展到了 Web 资源。


    返回到页首 到页首


      什么是 Java 组件技术?

    管理 Java 技术缩略词的字母汤(alphabet soup)可能是一项巨大的任务,就正如通过 Java Community Process 管理 Java 语言的发展一样。下面是 Java 语言各版本的组件、可选包和扩展包的部分列表(也就是组成这个平台的复杂部件),并给出了简短描述和参考资料链接,用以说明它在 Java 开发领域中的作用。注意下面许多参考资料都可以在各版本中使用。

    J2SE 中的技术:

    • Java Access Bridge 用于 Microsoft Windows,它起到了网桥的作用,允许基于 Windows 的辅助技术与 Java Accessibility API 进行交互(请参阅“为可访问性编码”。)

    • JavaBeans Component Architecture 是平台独立的规范,它为 Java 平台定义了一套标准组件软件 API。(请参阅“Reflecting, introspecting, and customizing JavaBeans”。)

    • Javadoc 是一种工具,用于从源代码的 doc 注释中生成 HTML 格式的 API 文档。(请参阅“Java 理论和实践:我必须对那些内容进行文档编制吗?”。)

    • Java Foundation Classes (Swing) (JFC) 是 Java 类库的集合,它支持为基于 Java 的客户机应用程序构建 GUI 和图形功能。(请参阅“Java 2 用户界面”。)

    • Java Platform Debugger Architecture (JPDA) 是 Java 2 的调试支持基础设施。JPDA 包括三层 API:
      • JDI (Java Debug Interface)是一种支持远程调试的高级别编程语言接口。
      • JDWP (Java Debug Wire Protocol) 定义在调试过程和调试器前端之间传输的信息和请求的格式。
      • JVMDI (Java Virtual Machine Debug Interface) 是低级别本地接口,定义了调试时 JVM 必须提供的服务。

      (请参阅“ 软件开发的未来 ”。)

    • Java 2D API 是用于高级 2D 图形和成像(为图像合成和 alpha 通道图像提供广泛支持)的类集合,是提供正确的色彩空间定义和转换的类集合,是面向显示的成像操作符的集合。(请参阅教程“Java 2D简介”。)

    • Java Web Start 使您可以通过单击而无需经历安装过程来下载和启动功能完善的应用程序(如电子表格),从而简化 Java 应用程序的部署。(请参阅“Java Web Start”。)

    • Java Database Connectivity (JDBC) 是一种 API,使您可以从 Java 内访问大多数表格式数据源,它提供了大多数 SQL 数据库的跨 DBMS 连通性,以及对其他表格式数据源的访问(如电子表格或平面文件)。(请参阅“JDBC 3.0 有什么新特性”。)

    • Remote Method Invocation (RMI) 提供引导命名服务,不会改变类型,并使用对象序列化使编程人员能够创建基于 Java 技术的分布式应用程序,在该应用程序中,可以从不同主机上的其他 Java 虚拟机上调用远程 Java 对象的方法。(请参阅教程“分布式对象 101-使用RMI和CORBA ”。)

    • Java Advanced Imaging (JAI) 是一种 API,提供了面向对象的接口的集合,这些接口支持简单的高级编程模型,使得开发人员可以很容易地操纵图像。(请参阅“利用 JSP 代码管理您的图像”。)

    • Java Authentication and Authorization Service (JAAS) 是一个包,它启用服务,通过实现标准 Pluggable Authentication Module (PAM) 框架的 Java 版本,通过支持基于用户的授权,对用户进行验证和执行访问控制。(请参阅教程“Java 安全性 第二部分 认证与授权”;“扩展 JAAS 实现类实例级授权”也是很好的信息来源。)

    • Java Cryptography Extension (JCE) 是一个包集合,提供了加密、密钥生成和协议以及 Message Authentication Code (MAC) 算法的框架和实现。它提供了对称、非对称、分组和流密码的加密支持,并支持安全流和密封对象。(请参阅教程“Java 安全性第一部分 密码学基础”。)

    • Java Data Objects (JDO) 是持久性的基于标准接口的 Java 模型抽象,它允许编程人员直接将 Java 域模型实例存储到持久存储(数据库)中,可能替代直接文件输入输出、序列化、JDBC 和 EJB Bean Managed Persistence (BMP) 或 Container Managed Persistence (CMP) Entity Bean 等方法。(请参阅教程“Java 数据对象上机实践”。)

    • Java Management Extensions (JMX) 提供的工具用于构建分布式、基于 Web 的、模块化和动态应用程序,以便管理和监视设备、应用程序和服务驱动的网络。(请参阅由三部分组成的“从黑箱到企业,第 1 部分:管理,JMX 1.1 样式”。)

    • Java Media Framework (JMF) 允许音频、视频和其他基于时间的媒体添加到 Java 应用程序和 applet 中。(请参阅教程“Java Media Framework 基础”。)

    • Java Naming and Directory Interface (JNDI) 是一种标准扩展包,为企业中的多个命名和目录服务提供具有统一接口的 Java 应用程序,允许不同种类的企业命名和目录服务的无缝连通性。(请参阅“EJB 最佳实践:工业强度的 JNDI 优化”。)

    • Java Secure Socket Extensions (JSSE) 是启用安全 Internet 通信的包集合,实现 SSL (Secure Sockets Layer) 和 TLS (Transport Layer Security) 协议的 Java 版本,并包括数据加密、服务器验证、消息完整性和可选客户机验证的功能。(请参阅教程“将 JSSE 用于安全套接字通信”。)

    • Java Speech API (JSAPI) 允许 Java 应用程序将语音技术合并到用户接口中。JSAPI 定义了跨平台的 API,以支持命令和控制识别程序、听写系统和语音合成器。(请参阅“The Java 2 user interface”部分。)

    • Java 3D 是一种 API,通过提供支持简单高级编程模型的一组面向对象的接口,开发人员可以使用它容易地将可伸缩的平台独立的 3D 图形合并到 Java 应用程序中。(请参阅教程“Java 3D 探奇 ”。)

    J2EE 中的技术:

    • Java API for XML Processing (JAXP) 通过使应用程序解析和转换不依赖特定 XML 处理实现的 XML 文档,通过使开发人员可以灵活地在 XML 处理器程序之间进行交换,而无需更改应用程序代码,从而支持使用 DOM、SAX 和 XSLT 处理 XML 文档。(请参阅“使用 Java 编程利用在线 XML 数据”。)

    • Java API for XML Registries (JAXR) 为访问不同种类的 XML 注册中心提供了统一和标准的 API (用于构建、部署和发现 Web 服务的可用基础设施)。(请参阅 Java 技术标准。)

    • Java API for XML-based RPC (JAX-RPC) 使开发人员可以开发基于 SOAP 的可互操作的和可移植的 Web 服务。(请参阅 Java 技术标准。)

    • SOAP with Attachments API for Java (SAAJ) 使开发人员可以生产和消费符合 SOAP 1.1 规范和 SOAP with Attachments 注解的消息。(从“使用SAAJ发送和接收SOAP消息”开始;有关 XML 技术的详细信息,请参阅 developerWorks XML 专区。)

    • Common Object Request Broker Architecture (CORBA) 是异构计算的开放标准,通过提供分布式对象框架、支持该框架的服务以及与其他语言的互操作性,该标准对 Java 进行了补充。(请参阅教程“使用RMI和CORBA ”;“企业中的 RMI-IIOP”也是很好的信息来源)。

    • ECperf 是用于度量 Web 商务系统的性能和可伸缩性的基准。它包括:组成应用程序的 EJB 组件;使用 JSP 进行单一用户/交互测试的 Web 客户机;模式脚本和加载程序;makefile 和部署描述符;用于实现运行规则和模拟客户机加载的驱动程序。(请参阅 Java 技术标准。)

    • Enterprise JavaBeans (EJB) 是一种技术,通过提供对事务、安全性、数据库连通性等服务的支持,它使用组件模型来简化中间件应用程序的部署。(请参阅介绍该技术的教程“Enterprise JavaBean 基础”;另请参阅系列文章 EJB 最佳实践。)

    • Java Authorization Contract for Containers (Java ACC) 是一种规范,它定义了容器使用的授权提供者的安装和配置。Java ACC 定义了提供者必须使用的接口,从而允许容器部署工具创建和管理与角色相对应的权限集合。(请参阅教程“Developing accessible GUIs with Swing”。)

    • JavaMail 是一种 API,它提供了模拟邮件系统的抽象类的集合。(请参阅教程“ JavaMail API 基础”。)

    • Java Message Service (JMS) 是一种用来添加提供者框架的 API。通过定义所有兼容 JMS 技术的消息系统所支持的消息概念和编程策略的公共集合,该框架为 Java 平台启用了可移植的、基于消息的应用程序的部署。(请参阅“实现独立于供应商的 JMS 解决方案”。)

    • JavaServer Faces 提供了一种编程模型,通过汇集页面中可重用的 UI 组件,将这些组件连接到应用程序数据源以及将客户机生成的事件写入服务器端事件处理程序,该模型有助于开发人员开发 Web 应用程序。(请参阅“JSP pages, evolving and contributing to Web services”。)

    • JavaServer Pages (JSP) 使 Web 开发人员可以使用单独的用户界面和内容生成功能,快速地进行开发和轻松地维护动态的、平台独立的 Web 页面,这样设计人员就可以更改页面布局,而无需改变动态内容。该技术使用类似于 XML 的标签,这些标签封装了用于生成页面内容的逻辑。(请参阅教程“JSP 技术入门 ”;另请参阅系列文章 JSP 最佳实践。)

    • Java Servlets 是一种扩展和增强 Web 服务器功能的 Java 方式。要做到这一点,应该为构建基于 Web 的应用程序提供基于组件的平台独立的方法,而不会出现 CGI 程序的性能限制。(developerWorks 中有许多关于 servlet 的信息。“创建 Java HTTP Servlet”和“构建带会话跟踪的 Servlet”这两篇入门教程应该是最好的起点。)

    • J2EE Connector Architecture 定义了一种标准体系结构,通过定义一组可伸缩的、安全的事务性机制,允许 EIS 供应商提供插入到应用服务器中的标准资源适配器,该体系结构用于将 J2EE 平台连接到异构企业信息系统(Enterprise Information Systems, EIS)。(请参阅教程“J2EE Connector Architecture 介绍”。)

    • J2EE Management Specification (JMX) 定义了 J2EE 平台的管理信息模型。该模型设计用于与许多管理系统和协议互操作,包括到 Common Information Model (CIM)、SNMP Management Information Base (MIB)的模型的标准映射,以及通过服务器驻留 EJB 组件(J2EE Management EJB Component,MEJB)到 Java 对象模型的模型的标准映射。(请参阅“从黑箱到企业,第 1 部分:管理,JMX 1.1 样式”。)

    • Java Transaction API (JTA) 是高级的独立于实现和协议的 API,它允许应用程序和应用程序服务器访问事务。Java Transaction Service (JTS) 指定 Transaction Manager 的实现, Transaction Manager 支持 JTA,并在低于 API 的级别上实现 OMG Object Transaction Service (OTS) 1.1 规范的 Java 映射。JTS 使用 Internet Inter-ORB Protocol (IIOP) 传输事务。(请参阅“理解 JTS ― 平衡安全性和性能 ”。)

    J2ME 中的技术:

    • Connected Limited Device Configuration (CLDC) 是组成资源受限移动信息设备的 Java 运行时环境的两个配置之一。CLDC 提供了最基本的库集合和虚拟机功能,在包含 K 虚拟机(KVM)的 J2ME 环境的每个实现中,这些都是必须存在的。(请参阅“Know no limits: Approaches to mobile device constraints”)

    • Mobile Information Device Profile (MIDP) 是组成资源受限移动信息设备的 Java 运行环境的两个配置之一。MIDP 提供核心应用程序功能,包括用户界面、网络连通性、本地数据存储和应用程序生命周期管理。(请参阅教程“Implementing Push technology with J2ME and MIDP”。)

    • Connected Device Configuration (CDC) 是一种基于标准的框架,用于构建和提供可在许多网络连接消费者和嵌入式设备之间共享的应用程序。(请参阅“Securing wireless J2ME”。)

    • developerWorks Wireless technology 专区包含了 J2ME 相关技术的多篇文章和教程。

    Java 网络技术:

    • JAIN APIs 是一组基于 Java 的 API,用于快速开发下一代电信产品和服务。(请参阅 Java 技术标准。)


    • Java Metadata Interface (JMI) 是实现动态的、平台独立的基础设施的规范,它允许进行元数据的创建、存储、访问、发现和交换。该规范基于 Object Management Group (OMG) 的 Meta Object Facility (MOF) 规范,由一组使用统一建模语言(Unified Modeling Language,UML)描述的基本建模工件组成。(请参阅 Java 技术标准。)

    • JavaGroups 是一个软件工具包(API 库),用于使用分布式系统解决方案进行设计、实现和实验。(请参阅“High-impact Web tier clustering, Part 1”和 Part 2。)

    • Jini 是一种开放体系结构,用于为硬件和软件创建高适应性的以网络为中心的服务。Jini 系统体系结构由三个类别组成:编程模型、基础设施和服务。(请参阅“Jini networking technology, the next step”。)

    • JXTA 是一组开放协议,允许网络上所有连接设备以 P2P 方式通信和协作。JXTA 对等方创建虚拟网络,任何对等方都可以在其中与其他对等方或资源进行直接交互,甚至当一些对等方和资源位于防火墙或 NAT 后或者位于不同的网络传输中也是如此。(请参阅“Making P2P interoperable: The JXTA story”。)



    Back to top 到页首


     Java 技术如何与 Web 服务联系起来?

    Web 服务是一种技术,允许用 XML 定义业务规则和过程,这样软件应用程序能够以平台独立和编程语言无关的方式进行通信。XML 技术使数据可以移植,方便了消息创建,而 Java 技术则使代码可以移植。事实上,XML 和 Java 语言可以很好地结合起来,成为构建和部署 Web 服务的完美组合。

    了解更多信息:



    Back to top 到页首


     如何提高 Java 编程技能?

    有两种途径可以提高您的技能:选学一门课程(为获得证书或仅为了学习)或者自学(当然要通过编写代码来练习)。除了汲取有经验的开发人员的知识外,获取证书途径还可以向未来的雇主提供确实的证据,证明您拥有构建他们要求的技术所需的技能。通过试验自己的技能,使用可用资源,您可以在 Java 技术的不同领域提高您的技能。下列参考资料对以上两种途径都应该有帮助。

    了解更多信息:

    • 要获得 Java 语言的全面介绍,Java 语言基础 教程是个很好的起点。

    • Robocode 是基于 Java 技术构建的易于使用的机器人战争模拟程序,它在提供纯粹娱乐的同时教您如何编程。要获得 Robocode 的介绍,请阅读“重锤痛击 Robocode!

    • 如果您是 C/C++ 编程人员,不熟悉 Java,“Java programming for C/C++ developers”教程通过比较和对照 Java 编程概念和 C/C++ 编程概念,可以帮助您快速入门 Java。

    • 本文是循序渐进的 帮助您准备 SCJP 考试指南,即 Sun Certified Java Programmer 证书考试。

    • IBM 在 WebSphere 开发(用于企业 Java 应用程序)、DB2、XML、电子商务和 Linux 这些相关技术方面提供了 专业认证

    • 如果您没有听说过 XP 精华 或 XP,它是一种应用程序设计理念,它合并了连续阶段测试、在编码编写测试、现场客户输入、重构(在不更改功能的情况下改进代码)等,本文可提供用于编写 Java 应用程序的极好工具。(揭开极端编程的神秘面纱:“XP 精华”重访,第 2 部分 中详细描述了如何进行实践。)

    • 将设计理论转换为实际应用程序是 Java 理论与实践 系列文章的出发点。

    • Java 编程人员知道利用集成 bug 检测和测试进行程序设计,所以利用 Java 调试 提高您的调试技能。而且,developerWorks 提供了关于 Java 调试(重点是称为 bug 模式的工具)的专栏集,称为 诊断 Java 代码

    • developerWorks 提供了大量 基于 Java 的教程,这是下一代自己编写代码的最佳学习体验。

    • 要获得更多学习如何使用 Java 语言的交互式方法,请参加 Java 讨论区,该论坛由具有多年 Java 相关技术开发经验的著名专家主持。



    Back to top 到页首


      Java 编程人员可以使用哪些 IBM 工具和产品?

    作为在 Java 技术使用方面的一流创新者,IBM 站在了最前线。浏览 Java technology downloads and products 页面可以获得工具和产品的完整列表。以下提供了一些重要部分。

    了解更多信息:

    • 软件开发工具箱:构造应用程序的工具箱,用于各种 Java 相关技术的大量工具。下面只是其中的几个:
    • Java technology on alphaWorks 是 IBM 生成的 Java 相关技术的虚拟仓库,包括 API、集成开发环境和 devkit、组件、参考实现和实用程序。

    • WebSphere 系列的 Java 开发工具:
    2005年12月14日

    在DotNet开发环境下,如果配置文件WEB.CONFIG中

    编码格式设置为utf-8,如下节点:

    <globalization requestEncoding="utf-8" responseEncoding="utf-8"/>

    那么在ASPX引用脚本文件,需要该脚本文件的文件格式也是utf-8,否则会报莫名其妙的脚本错误,

    其他文件也是类似的处理方法。

    2005年11月25日

    技术&管理&做人&行业

    每天晚上,请你问自己这些问题:
    1, 今天我是否克服了技术上新的困难?
    2, 今天我是否多读了一些新书?
    3, 今天我是否就某方面的问题与人进行了交流?
    4, 今天我是否多认识了一个新同事或新朋友并准备与他们保持联络?
    5, 今天我是否更多的接触到身处的行业需求,现状,和发展?

    精通技术

    精通技术是技术人员的根本要求,也是技术人员人生发展的必经之路,只有首先精确掌握一门技术,才能触类旁通的掌握其他技术。精通技术不仅仅是为了精通技术,而是为了触类旁通,为了掌握精通技术的学习方法,研究方法,体会身处技术顶点的感受和境界,这样,下一次准备或需要进入另一个领域时,才会有明确的目标。

    为了精通技术,就要有以工作为乐的精神。不主张过于频繁的换工作(常常被认为是不热爱工作,不适应环境,或者不忠诚的表现)。以工作为乐,才会投入更多的精力和时间,才能够飞快成长,成为该方面的能手。以工作为乐,是朝着技术高峰阔步迈进的享受过程。

    如果仅仅的是以工作为乐,仅仅号称自己喜欢工作,而没有“朝着技术高峰阔步迈进”,则是一种浪费。要做工作和生活的有心人,才不会迷信技术,才会避免骄傲,才不会在达到某个水平以后停步不前。不仅要做有心人,还要学会研究。研究该门技术的发展方向,该门技术最好的学习方法,在该门技术上取得突出成就的道路,和激励自己沿着正确的方向前进的诀窍。做好了这些问题的研究,就会在以工作为乐的境界中做出超凡的成绩。

    总之,
    1, 反对不认真对待技术。
    2, 反对不热爱工作,一心旁鹜。
    3, 做生活和工作的有心人。

    懂得管理

    懂得管理,既要学会管理,也要学会配合管理。那些对所有人和所有事情都吹毛求疵的人是不适应社会的,也是不容易成功的。懂得管理,既要学会管理工程(进度,过程,资源,需求分析,客户交流),又要学会管理人。要重视团队建设,重视团队的合作,重视团队的文化建设,重视团队的凝聚力,重视管理者的个人感染力。

    在用户不能提出明确的需求的情况下,要综合经验,替用户提出明确的需求。

    符合标准的过程控制,方法论的实际应用可以引导工程有一个可期望的好结果。否则就是运气的功劳。
    资源的合理配置,建设一个每个人舒适工作的环境,不要让你的组员不得不总是把精力放在环境建设等问题上,是让人做出更大成绩的捷径。

    与人畅快交流的能力,成为软件人员必备的素质之一。懂得行业的知识就从这里开始。

    那些单纯学过管理的人,无论进入那一个行业,都需要不断的迅速的学习一些关于该行业的专门知识,至少是名词术语,基本原理,关键技术,主要应用。这样的了解初步管理知识的人,一定不要对技术人员指手画脚,否则一定得不到应有的认同,反之,如果他们从过程本身的流程或者方法论等方面提出建议,就可以更好的体现自己的价值。

    进入行业

    软件工作,离不开行业,尤其是应用软件。一个仅仅懂得实现技术的人,是不够的。所以一定要拓展你的知识,对你所处在的行业有一个更全面,更准确,更实质性的了解。

    软件人员看到需求分析,常常想到如何去实现它,而不会认真的去研究这份需求,站在用户的角度上来做更多的工作,这是值得软件人才所注意的。

    研究你所在的行业,也需要有一种系统的方法。了解其中的关键点是进入这个行业的捷径。了解触及该行业更多方面的关键点,是掌握这个行业的必经之路。对该行业做系统的总结分析,是深入该行业的目的。初步的研究成果经过更多的提炼和交流,就会成为金子般的智慧。

    以下是几点建议:

    从点滴做起。先做好那些你力所能及的工作。标准化你的行业。你所处的行业虽然确定,但是每一家公司的需求各不相同。掌握他们做事情的流程,可以帮助你做好标准化。同时学习那些该行业的标准,以用户的标准为标准,更加深刻的理解标准,是代替用户做好标准化的方法。
    掌握核心技术。任何行业都有核心技术。掌握某一项核心技术,就可以让你进入这个行业并在其中生存,反之仅仅浅尝辄止,就会让你遭遇失败,抱怨不公。

    影响你职业发展的几项能力
    1, 研究问题的能力
    2, 影响他人的能力
    3, 个人履历

    请相信以下观念
    1,教育不是万能的。希望学校或者任何一个教育机构为你准备所有的知识,能力,水平,是不可能的。最好的大学是自己和无字书。
    2, 成长在工作中。工作中的表现和积累才是人生腾飞的实际动力。

    从今天起,请做好
    1, 培养你自己更广泛的兴趣,并坚持你的人生目标
    2, 锻炼你的演讲能力
    3, 多认识朋友,以他们为荣
    4, 培养你的远见卓识

    2005年11月01日

    添加一个aspx的转换页面,后台代码如下:

    Response.Write("<form name=frm id=frm action=aspxtoasp.asp method=post>");
       foreach(object obj in Session.Contents)
       {
           Response.Write("<input type=hidden name=’"+obj.ToString()+"’");
          Response.Write(" value = ‘"+Session[obj.ToString()].ToString()+"’>");
       }
       
       Response.Write("</form>");
       Response.Write("<script language=’javascript’>frm.submit();</script>");

    在aspxtoasp.asp获取FORM的值,写入自己的SESSION

    2005年10月24日

    我们大部分都用过TreeView控件,对这个控件的评价也是各式各样的,但是我觉得不论如何它是一个免费的开源的控件,所以我还是在用它。在刚接触ASP.NET的时候,记得需要做一个分配权限的权限树,当时只知道有这个树,经过一天的研究对其服务器端的行为基本以及搞清楚了,但是由于当时的js水平有限,所以对客户端的代码很畏惧,基本没有看过。
    当时有这样一个要求:如果一个节点被选中则该节点的所有子节点都要选中,如果该节点的所有子节点取消选择则该节点也要取消选择(节点一致性),相反一样。
    还有一个要求就是:如果可以实现三态树则更好(这个有点难,本文中不予讨论)。本文将详细介绍前面要求1。
            首先我们要庆幸微软的这个TreeView控件是开源的,不论是客户端代码还是服务器端代码您都可以轻松获得,可以去微软的网站上下载。在网上也见过一些讲述该问题的文章,他们大多是使用一个TreeView之外的js实现,我个人认为从面向对象的观点,该功能属于TreeView,所以没有理由将它分离出去,因此今天我将修改TreeView.htc来实现上面的功能。要想获得该文件(TreeView.htc)可以去微软的网站上下载之。
    说实在的该功能曾经也困扰了我很久,一直想解决这个问题,但是一直没有时间来研究TreeView.htc中的代码,今天终于下决心搞定它。
            我们知道在TreeView的oncheck中需要激发该事件处理函数,这个函数很容易找到,可以在TreeView生成的客户度脚本中找到,代码片断如下:
    oncheck="javascript: if (this.clickedNodeIndex != null) this.queueEvent(‘oncheck’, this.clickedNodeIndex)"
            由此我们可以去htc(以后说的htc都指的是TreeView.htc),找到doCheckboxClick方法,只要看名字就知道它是干什么的(命名实在太重要了,否则在3000行代码中找某个函数真的很累)。
            该方法是当用户点击CheckBox的使用要处理的函数,函数如下所示:
            function doCheckboxClick(el){
                var checked = private_getAttribute(el,"checked")
                el.checked = !checked;
                var evt = createEventObject();
                evt.treeNodeIndex = getNodeIndex(el);
                g_nodeClicked = el;
                _tvevtCheck.fire(evt);
                setNodeState(el,el.checked);// maybe need el only,but I think it’s safly
            }
            其中第一行、第二行以及最后一行是我添加的,第一二行是为了在页面回传以后checked属性无效时所做的修改,按照原来的方法在提交后el.checked是undefined,所以导致无法正确同步节点,如果读者有兴趣可以试一试。setNodeState函数,从名字上可以看出该函数是用来设置节点状态的,它将当前你选择的节点作为参数传递到函数内部。如注释中所说实际上你可以只传递el进去,而无需再传一个布尔值,不过我想这样传递可能更安全,不过没有关系,你觉得不爽可以修改:。
            下面看看setNodeState的函数体,该函数由两个方法组成,一个是设置所有孩子节点的状态,一个是设置该节点的父节点状态。代码如下:
            function  setNodeState(el,state){
                _setChildNode(el,state);
                _setParentNode(el,state);
            }
            为了可以设置当前节点的所有孩子节点是否和父节点(本节点)状态一至我们需要函数_setChildNode,同理为了使节点的父节点和该节点状态一至我们需要_setParentNode函数。两个函数都是递归函数,将会遍历所有的子节点和所有的父节点以及兄弟节点(为什么要遍历兄弟节点稍候再说),下面我们先看看遍历孩子节点的代码,代码如下所示:
            function  _setChildNode(el,state){
                var childNodes = el.children;
                if(childNodes.length > 0){// if has childs 
                    for(var i = 0 ;i<=childNodes.length-1;i++){
                        private_setAttribute(childNodes[i],"Checked",state);
                        _saveCheckState(childNodes[i]);
                        _setChildNode(childNodes[i],state);
                    }
                }
            }
            该函数先获得当前节点的所有子节点,这里可以直接使用TreeView提供的函数getChildren方法,而我使用的使html的原始方法。如果该节点存在子节点则遍历所有子节点,同时设置子节点的状态和当前节点的状态一致,_saveCheckState函数的作用稍候会介绍。private_setAttribute方法为TreeView提供的一个内部设置属性的方法(js没有private关键字,这里只是做说明而已),该方法将设置每一个节点的Checked属性为当前这个节点的状态。
            下面是如何设置父节点状态的代码:
             function  _setParentNode(el,state){
                var parentNode = el.parentElement;
                if(parentNode){
                    if(!_checkSiblingdNode(el)){
                        private_setAttribute(parentNode,"Checked",state);
                        _saveCheckState(parentNode);
                        _setParentNode(parentNode,state);
                    }
                }
            }
            该函数先获得其父节点,如果父节点存在则检查当前节点的兄弟节点,上面有提到了需要检查兄弟节点,这里检查兄弟节点的目的是:父节点的状态不是由当前节点一个节点控制的(这种情况只存在于当前节点没有兄弟节点的情况下),如果有其他兄弟是选中的,那么父节点是不能被取消了,这样将导致兄弟节点和父子节点不一致不一致。该函数里面也调用了_saveCheckState函数,在后面将介绍之。
    下面的代码描述了如何检查兄弟节点的状态,代码如下:
            function _checkSiblingdNode(el){
                var parentNode = el.parentElement;// you can use getParentTreeNode function in this htc,but I like this usage.
                for(var i = 0;i<=parentNode.children.length-1;i++){
                    if(el != parentNode.children[i]){
                        if(private_getAttribute(parentNode.children[i],"Checked")){
                            return true;
                        }
                    }
                }
                return false;
            }
            正如注释所述,你可以使用getParentTreeNode方法来获得节点的父节点,但是我比较喜欢使用原始的方法:。这里将排除自己(if(el!=parentNode.children[i]))。
            有了上面的代码我们就可以做到客户端无刷新的父子节点一致的选择,那么我们现在来介绍一下_saveCheckState函数,如果没有该函数页面提交以后,刚才除了手工点击的节点以外其他的节点都不能保存状态。所以该函数的作用就是要保存所有节点的状态(主要是自动选择的节点),保证在回传之后树的状态依然存在。下面的代码描述了_saveCheckState函数,代码如下:
            function _saveCheckState(el){
                if(getNodeIndex(el))
                    queueEvent(‘oncheck’, getNodeIndex(el));
            }
            该方法首先检查当前节点的index是否有效,如果有效则保存状态。这里需要说一下queueEvent方法做了什么,代码我就不帖了,该函数的实际意义是将客户端的操作保存在一个名为__TreeView1_State__的隐藏域中,这样在回传的时候服务器端会根据该隐藏域,初始化树的状态。其中TreeView1是我在测试系统中TreeView的名字。
            最后的问题就是部署的问题了,因为修改了htc,所以在部署的时候需要替换原来的htc文件。

    1.下载地址
    http://msdn.microsoft.com/downloads/samples/internet/ASP_DOT_NET_ServerControls/WebControls/default.asp
    下载后是后缀为bat的版本
    (1)bulid.将bulid.bat的路径指向csc.exe所在路径,生成Microsoft.Web.UI.WebControls.dll。
    (2)在wwwroot下创建空目录webctrl_client\1_0。
    (3)将build\Runtime下的文件拷至webctrl_client\1_0下。
    (4)选择工具箱的自定义工具箱,添加Microsoft.Web.UI.WebControls.dll。
    有些麻烦
    但如果你能找到后缀是msi的自动安装版本,直接下一步就行(我一直用这个版本,hoho)
    安装后,通过“自定义工具箱”->“.net框架组件”把TreeView添加到工具箱里

    2.运行时无法显示
    一般是TreeView的版本问题,最好下载英文版自动安装版本重新安装,安装前应该先到添加删除程序里卸掉原版本

    3.显示格式出错(非树状显示)
    TreeView要求客户端浏览器版本为IE5.5及以上,最好要求客户端升级为IE6.0

    4.框架里使用TreeView
    设置NavigateUrl、Target属性,可更新另外的Frame

    5.找不到TreeNode类
    使用TreeView,最好添加namespace:using Microsoft.Web.UI.WebControls;

    6.遍历TreeView节点(递归算法)
    private void Page_Load(object sender, System.EventArgs e)
    {
     GetAllNodeText(TreeView1.Nodes);
    }
    void GetAllNodeText(TreeNodeCollection tnc)
    {
     foreach(TreeNode node in tnc)
     {
      if(node.Nodes.Count!=0)
       GetAllNodeText(node.Nodes);
      Response.Write(node.Text + " ");
     }
    }

    7.得到node结点的父节点
    TreeNode pnode;
    if(node.Parent is TreeNode)
     pnode=(TreeNode)node.Parent;
    else
     //node is root node

    8.修改TreeView样式(示例)
    <iewc:TreeView id="TreeView1" runat="server" HoverStyle="color:blue;background:#00ffCC;" DefaultStyle="background:red;color:yellow;" SelectedStyle="color:red;background:#00ff00;">
    用代码:
    TreeView1.DefaultStyle["font-size"] = "20pt";

    9.展开时不提交,改变选择节点时才提交
    将autopostback设置成false; 
    在body里添加  <body  onload="initTree()"> 
    然后在PageLoad里写: 
    string  strTreeName  =  "TreeView1"; 
    string  strRef  =  Page.GetPostBackEventReference(TreeView1); 
    string  strScript  =  "<script  language=\"JavaScript\">  \n"  +  "<!–  \n"  +  "            function  initTree()  {  \n"  +"                        "  +  strTreeName  +  ".onSelectedIndexChange  =  function()  {  \n"  +    "if  (event.oldTreeNodeIndex  !=   
    event.newTreeNodeIndex)  \n"  +  "this.queueEvent(‘onselectedindexchange’,  event.oldTreeNodeIndex  +  ‘,’  +  event.newTreeNodeIndex);  \n"  +    "window.setTimeout(‘"  +  strRef.Replace("’","file://’/")    +  "’,  0,  ‘JavaScript’);  \n"  +    "                        }  \n"  +      "            }  \n"  +    "//  –>  \n"  +  "</script>"; 
    Page.RegisterClientScriptBlock("InitTree",strScript  ); 
     
    这样就只有你点击的节点更改的时候才提交!

    10.TreeView结合XML
    把XML文件设置为如下格式,然后直接设置TreeNodeSrc为该XML文件就行
    <?xml version="1.0" encoding="GB2312"?>
    <TREENODES>
     <TREENODE TEXT="node0" EXPANDED="true">
      <TREENODE TEXT="node1"/>
      <TREENODE TEXT="node2"/>
     </TREENODE>
     <TREENODE TEXT="node3" NavigateURL="3.aspx"/>
    </TREENODES>
    或者用代码
    TreeView1.TreeNodeSrc="a.xml";
    TreeView1.DataBind();

     

    客户端控制TreeView
    http://expert.csdn.net/Expert/topic/1382/1382892.xml

    1.设置所选节点,如选中第二个节点
    function SetSelNode()
    {
     TreeView1.selectedNodeIndex="1";
    }

    2.得到所选节点的Text,ID或NodeData
    function GetAttribute()
    {
     alert(TreeView1.getTreeNode(TreeView1.selectedNodeIndex).getAttribute("Text"));
    }
    替换Text为ID或NodeData,可分别得到所选节点的ID或NodeData

    3.修改节点属性,如修改第一个节点的Text
    function ModifyNode()
    {
     var node=TreeView1.getTreeNode("0");
     node.setAttribute("Text","hgknight");
    }

    4.得到点击节点
    function TreeView1.onclick()
    {
     alert(TreeView1.getTreeNode(TreeView1.clickedNodeIndex).getAttribute("Text"));
    }

    5.添加节点
    function AddNode()
    {
     var node=TreeView1.createTreeNode();
     node.setAttribute("Text","hgknight");
     TreeView1.add(node);   
    }

    6.js遍历所有节点
     var AllRootNode=new Array();
     AllRootNode=TreeView1.getChildren();
     AlertNode(AllRootNode);  

     function AlertNode(NodeArray)
     {
      if(parseInt(NodeArray.length)==0)
       return;
      else
      {
       for(i=0;i<NodeArray.length;i++)
       {
        var cNode;
        cNode=NodeArray[i];
        alert(cNode.getAttribute("Text"));
        if(parseInt(cNode.getChildren().length)!=0)
         AlertNode(cNode.getChildren());   
       }
      }
     }

    2005年10月20日

    <script language="javascript">
      <!–

    function window.onbeforeunload()
       {
        if(event.clientX>document.body.clientWidth)
         alert("关闭了");    
       }

    //–>
      </script>

    2005年10月13日

    ASP.NET调试。

    如果在本部分中找不到需要的错误消息,请查看处理常规调试问题部分或处理远程调试问题部分。

    消息:无法在 Web 服务器中启动调试。


    1. 无法启动调试错误消息

    原因 1未将 IIS 应用程序配置为使用 Integrated Windows Authentication。确保已选中“Authentication Method”对话框中的 Integrated Windows Authentication 复选框,如图 2 所示。


    2. 启用集成身份验证

    原因 2检查 IIS 的 Enable HTTP Keep Alive 选项。如果它是关闭的,则可能需要将其打开,再尝试调试。

    消息:您没有调试服务器的权限。


    3. 无调试权限

    原因 1确保已启用 Integrated Windows Authentication。可能的原因是仅为 IIS 的 Directory 安全启用了 Basic authentication

    原因 2如果您在使用 Integrated Windows Authentication,则需要确保您的用户帐户能够完全控制 IIS 的目录。

    原因 3如果使用完整的机器名(如 machinename.domainname.something)创建 Web 项目,则该 Web 站点会被识别为 Internet 站点。因此,Internet Explorer 的默认设置将对登录行为产生影响。在这种情况下,您需要使用当前帐户在具有 IE 设置的“Internet”区域启用登录。

    然而,这不是 Internet Explorer 的默认设置,因此最好仅使用机器名来创建项目,将图 4 用作 Security Settings 的指南。


    4. 设置 Internet Explorer 身份验证

    消息:发送调试 HTTP 请求时发生服务器端错误。


    5. 调试期间的服务器端错误

    原因 1Web 应用程序没有应用程序名。为此,请使用 IIS MMC 来检查 Web 项目的属性,确保 Web 项目具有应用程序名。当图 6 中的红色轮廓出现时,应该出现应用程序名。


    6. 设置应用程序名

    原因 2如果使用的是 NTFS 文件格式,则确保“aspnet”具有“wwwroot”或虚拟目录文件夹上的适当权限,才能访问和写入这些文件夹。

    消息:没有对项目进行配置以接受调试。


    7. 未针对调试配置项目

    如果出现这一错误消息,则需要针对调试配置 Web。为此,需要在 web.config 文件中设置 debug = true。此文件位于 Web 项目文件夹中。

    您可以启动调试,同时不出现错误消息,但是不能到达断点。

    您使用 F5 键启动了调试,看起来好像正确启动了调试并且也正确启动了 Internet Explorer,但是您不能到达代码隐藏的代码中的断点。

    原因 1 在项目属性中未启用 Asp.net 调试。按照图 8 所示将该项设置为 True。


    8. 启用 ASP.NET 调试

    在 VB 项目中,UI 有所不同,但可以轻松地识别等效项。

    原因 2请确保使用匹配的调试符号文件加载期望的 DLL。可以使用 Modules 窗口来检查这一点。

    消息:未正确安装调试器。


    9. 未正确安装调试器

    如果看到这一问题,请在 Console Application 项目中检查调试功能。如果控制台应用程序项目显示如图 10 所示的错误消息,则表示未正确安装 .NET Framework 应用程序。


    10. 无法启动调试

    需要通过执行“regsvr32 mscordbi.dll”来手动注册“mscordbi.dll”。

    消息:服务器不支持对 ASP.NET ATL 服务器应用程序的调试。


    11. 无法启动调试

    如果您在机器上安装了 Windows XP Pro 或 Windows 2000 Pro,则可能需要考虑 Visual Studio 7 和 IIS 之间的安装顺序。如果在 Visual Studio 7 之后安装 IIS,则会发生这一错误。在这种情况下,请使用“aspnet_regiis.exe –i”注册“aspnet_isapi.dll”。

    消息:访问被拒绝。检验您是否是管理员或某个组成员。


    12. 访问被拒绝

    您可能不是该计算机上 Debugger Users 组的成员。将您的用户帐户添加到计算机上的 Debugger Users 组中即可解决此错误。

    要将您的用户帐户添加到 Debugger Users 组中,需要执行以下操作:

    1.

    作为 Administrator 登录。

    2.

    运行 Administrator tools 中的 Computer management

    3.

    选择 Local users and groups\groups 节点。

    4.

    双击右边窗格中的 Debugger Users 组。

    5.

    单击 Debugger users properties 对话框中的 Add 按钮。

    6.

    键入用户帐户并单击 OK

    消息:无法启动 ASP.NET ATL 服务器调试。


    13. 未安装ASP.NET ATL

    原因 1您可能安装了 IIS Lockdown 工具。如果这样,则查找 urlscan.ini 文件,并将 DEBUG(区分大小写)添加到 [allowverbs] 部分中。

    原因 2如果将域控制器用作服务器,并且项目是使用机器名(非完整域名)创建的,则可能需要将项目的 URL 更改为完整域名。

    原因 3如果将 IIS 设置为使用专用 IP(例如 Web site identification,可以在 IIS MMC 的 IIS 设置中找到这一选项),则可能看到这条错误消息。在这种情况下,需要更改项目名,直接使用 IP 地址。对于现有项目,需要更改项目以使用 IP 地址,而不用通过编辑 .sln 文件和 .webinfo 文件使用机器名。

    原因 4web.config 文件的 中的值太大。默认单位是千字节而非字节,因此如果更改此数字,使用了错误的单位,则可能导致调试问题。

    消息:访问被拒绝。


    14. 访问被拒绝

    原因:您可能是 Debugger Users 组的成员,但是您不具有调试 aspnet 辅助进程的权限,因为您不是 aspnet 用户帐户或 Administrators 组的成员。将您的用户帐户添加到机器上的 Administrators 组即可解决此问题。

    无法使用包括文件进行调试

    在 ASPX 中,无法使用包括文件进行调试。将旧的 ASP 项目转换为 ASPX 时,往往产生包括文件。

    如果通过 包括文件,则可能无法正确调试该包括文件。您需要使用 来代替。

    更改密码后,需要注销/登录才能进行 ASP.NET 调试。

    更改密码后,需要注销,然后再登录才能正确进行 ASP.NET 调试。

    安装 Windows2000 SP4 后,ASP.NET 调试不能运行,同时显示消息访问被拒绝

    此问题的解决方法是,使用 regsvr32 –i aspnet_isap.dll 重新注册 aspnet_isap.dll

    仅在首次加载页面时遇到断点。

    针对这一特定问题,可能存在多种原因,但是最大的可能性是您在 web.config 文件中设置了页面缓存选项。

    如果在 web.config 中看到类似于 的内容,则需要将值设置为“False”,以关闭 Web 页面缓存。更改该设置并刷新页面后,可能遇到断点。

    您需要共享 Web 服务器以进行调试,但是不想让其他用户成为计算机管理员。

    在 Visual Studio .NET 中,以下二者可以确定用户是否可以进行调试。其中之一是 Debugger Users 组,另一个是用户权限,如管理员、Power User 或 SEDebug。

    Debugger Users 组确定用户是否可以访问 VS 调试组件(主要是 MDM-Machine Debug Manager,Visual Studio 的一部分),所以成为该组的成员意味着保证可以访问 MDM。因此在这一点上,您可以调试开放进程并查看机器上的进程列表。

    不过在此之后,您是否可以调试其他用户的进程取决于您的权限。例如,如果您想调试别人的本地进程,则需要具有 SEDebug 权限.针对其他用户的托管进程,您应该是该机器上的管理员,才有权进行调试。

    因为存在这一限制,所以在您的方案中,应该授予学生管理员权限。否则,默认情况下无法对 ASP.NET 辅助进程进行调试。

    我们有一种变通方法。Cassini 是一个独立的小型 ASP.NET 服务器。对学生来说,他们可以使用 Cassini 进行开发,稍后将开发结果部署到实际服务器上来提交结果。Cassini 位于 http://www.asp.net/Projects/Cassini/Download/

    返回页首返回页首


    常规调试

    这些案例基于 Console application 项目类型。

    消息:无法启动调试。


    15. 无法启动程序

    导致图 15 中所示问题的原因是没有正确注册 mscordbi.dll。此问题的补救办法是手动注册该文件。

    消息:无法启动调试。访问被拒绝。


    16. 拒绝访问错误消息

    确保正确启动 Machine Debugger Manager 服务,并且确保您是 Debugger UsersAdministrators 的成员。

    我可以启动托管调试,但是 PDB 不加载,并且不能遇到任何断点。

    如果正确启动了调试器,但不能遇到任何断点,则您可能需要检查 diasymreader.dll 的安装。可能没有注册该文件。要注册该文件,需要执行以下操作:

    regsvr32 \diasymreader.dll
    

    托管调试不运行

    在进程创建 CLR 对象前,以 CLR 模式连接本地进程。托管调试不运行。

    解决方案 1在进程中使用了 CLR 代码后再连接进程。

    解决方案 2以 InterOp 模式连接进程。在这种情况下,不必在调用 CLR 代码之后再连接进程。

    托管调试器不响应

    使用托管代码启动调试时,调试器不响应。

    解决方案:确保已停止并禁用 .NET FrameworkSupport 服务(仅停止该服务还不够)。

    如果没有运行 .NET FrameworkSupport 服务,则禁用 IIS admin 服务。

    使用 C# 代码单步调试不正确

    考虑以下代码:

    string someStr;
    someStr = "SomeValue";
    if(someStr == null)
      Console.WriteLine("what's up?"); 
    
    try
    {
    }
    catch(Exception e)
    {
    }
    

    如果使用此代码,则会看到遇到“if”语句时,指令指针将移动到“if”语句体 (Console.WriteLine("what’s up?");)。

    这不是一个调试器 bug,而是一个众所周知的 try catch 块调试信息问题。请参见以下调试器中 try catch 块示例的反汇编代码。

    if(someStr == null)
    a cmp        dword ptr [ebp-18h],0
    e jne        C 
    
    Console.WriteLine("what's up?");
     mov        ecx,dword ptr ds:[01C50070h]
     call       dword ptr ds:[02F0257Ch]
    c jmp        
    
    catch(Exception e)
    e mov        dword ptr [ebp-1Ch],eax
     call       C0846
     jmp        
    
    }
     nop
    

    值没有匹配时,指令指针移动到 0000003c jmp 行,但是该行已经错误地与“if”语句体相匹配。当代码功能正确时,显示就不正确了。

    返回页首返回页首


    因果性调试:Web 服务客户端和 Web 服务之间的步骤

    无法从 Web 服务客户端到 Web 服务设置调试

    默认设置不允许从 Web 服务客户端进入 Web 服务。它的运行方式类似 step-over。

    ASPNET 辅助进程(aspnet_wp.exe 或 w3wp.exe)在“aspnet”或“network service”用户帐户之下运行,而这些帐户没有通过 DCOM 访问 MDM 的权限。因此,需要将这些帐户添加到 Debugger Users 组中。

    启用 Web 服务模拟后,无法再使用因果性步骤。

    使用“web.config”为 Web 服务启用模拟时,不能从 Web 服务客户端代码进入 Web 服务代码。因为,它的运行方式类似于 step over。

    您需要执行以下操作来更正客户端和服务之间的步骤。

    关闭 IIS 中的 Anonymous access

    更改客户端代码,将凭据设置为 Web 服务,如下所示:

    Service1 obj = new Service1();

    obj.Credentials = System.Net.CredentialCache.DefaultCredentials;

    在此之后,您将能够从客户端进入 Web 服务。

    这些操作是必需的,因为当您进入 Web 服务时,某些 .NET Framework 组件需要使用系统级调试器组件 (MDM) 来共同创建它。如果不能提供正确的凭据,则此步骤将失败。如果没有这些正确的凭据,“step into”的运行将类似于“step over”。

    调试器挂起

    如果 Web 服务客户端代码在 STA (Single Thread Apartment) 模型中运行,并且它在等待异步调用完成,如下所示:

    Service1 obj = new Service1();
    System.IAsyncResult ar = obj.BeginHelloWorld(new System.AsyncCallback(Class1.Handle),obj);
    while(ar.IsCompleted != true)
    {
      System.Threading.Thread.Sleep(1000);
    }
    

    则调试器将挂起。发生此挂起操作,原因在于调试器中的代码已锁定一个调试器组件。解决方案 1 是更改代码以使用与事件或 mutex 同步的线程。另一个解决方案是注销 csm.dll。第二个解决方案禁用 causality 步骤(从 Web 服务客户端代码到 Web 服务方法的步骤)。您可能需要手动连接 aspnet_wp.exe 才能调试 Web 服务。

    返回页首返回页首


    远程调试

    无法查看远程机器上的任何进程

    确保在远程机器上安装了 Remote full debug 设置,并且您是 Debugger Users 组的成员。

    RPC 问题而无法连接到远程机器

    以下信息摘自 Mike Clay 撰写的 KB 文章。

    如果通过“Processes”对话框连接到远程机器上时看到以下错误消息:

    Error while trying to run project: Unable to start debugging on the
    web server. Not enough storage is available to complete this operation.
    

    或者在进行 ASP.NET 调试期间看到这一消息:

    Error while trying to run project: Unable to start debugging on the web
    server. Unable to map the debug start page URL to a machine name.
    

    则确保 RPC 在您的机器与远程机器之间正确运行。下面的行为可能导致 RPC 问题:

    通过防火墙进行调试。Microsoft 不建议或支持通过防火墙的远程 ASP.NET 调试。解决此问题最好的方式是,使用“终端服务”登录远程服务器并在本地进行调试。

    RPC 的一种常见故障是无力解析远程机器名。RPC 依靠名称解析在计算机之间通信。如果未能将远程服务器机器名解析为正确的 IP 地址,则可能发生错误。

    RPC 通信只能单向流动,另一个方向却不行。RPC 通信必须能够从用于调试的机器到达远程服务器,并从远程服务器返回用于调试的机器,这样才能成功进行远程调试。确保以双向方式启用 RPC 通信。

    要分析 RPC,可以使用 RPCPing 工具。

    远程调试工作组中的机器失败

    当您的两台 Windows XP Pro 机器都不在域中但在工作组中时,将发生这种情况。在它们之间进行远程调试时,您根本无法访问远程机器。

    在工作组环境中,您需要确保两台机器具有相同的用户帐户名和相同的密码。否则,DCOM 进行身份验证时将失败。

    另外,在 Windows XP Pro 上,将 Sharing and security model for local accounts 的默认安全设置设置为现在允许共享。下面是更改此设置的步骤:

    1.

    运行管理员工具中的 Local Security Settings

    2.

    选择 Security settings\Local policies\Security 选项。

    3.

    Network access : Sharing and Security model for local accountsGuest only – local users authenticate as Guest 更改为 Classic – local users authenticate as themselves

    4.

    重新启动计算机。

    应该将此更改应用于进行远程调试的两台机器。

    更改设置后,即可使用同一名称的用户帐户在两台机器上进行远程调试。请确保每台机器上的用户帐户都具有密码。在某些情况下,没有实际密码机器不能运行。

    然而,因为更改了安全模型的默认设置,所以可能公开下面的内容:

    意外的文件共享

    意外的 DCOM 组件共享。

    在进行这一更改之前,从远程机器到您的机器的任何种类的连接都是以 Guest 身份进行的;但更改后,他/她即可接受使用本地用户帐户的身份验证。因此,在调试案例中,如果将一个文件夹或 DCOM 对象共享出来,其他机器上的任何匹配用户(具有相同用户名和相同密码)都可能可以访问您的共享对象。

    我极力建议,如果您要使用这一变通方法,则请确保所有用户帐户都具有强密码,否则应该设置一个网络孤岛来调试机器,以防止恶意攻击。

    调用IE内置打印组件完成web打印方案及例程(10.28)

    重点:
    <OBJECT id=WebBrowser classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 width=0 VIEWASTEXT>
    </OBJECT>

    <script >

    function window.onbeforeprint(){
    alert("打印前事件");
    }
    function window.onafterprint(){
    alert("打印后事件");
    closes.Click();
    }

    function window.onload() {
      WebBrowser.printing.header = "http://www.caoruomou.8u8.com"//页脚
      WebBrowser.printing.footer = "青春驿站之练笔园地"//页眉
      WebBrowser.printing.leftMargin = 0.75//左边距
      WebBrowser.printing.topMargin = 1.5//顶边距
      WebBrowser.printing.rightMargin = 0.75//右边距
      WebBrowser.printing.bottomMargin = 1.5//底边距

       WebBrowser.printing.portrait = false;//=true和=false是表示不同的方向
       WebBrowser.printing.copies = 1;//打印份数
       WebBrowser.printing.Print(false);//是否选择打印机

      }
    </script>

    <input type=button value=打印 onclick="document.all.WebBrowser.ExecWB(6,1)" class="NOPRINT">
    <input type=button value=直接打印 onclick="document.all.WebBrowser.ExecWB(6,6)" class="NOPRINT">
    <input type=button value=页面设置 onclick="document.all.WebBrowser.ExecWB(8,1)" class="NOPRINT">
    <input type=button value=打印预览 onclick="document.all.WebBrowser.ExecWB(7,1)" class="NOPRINT">

    注意:
    1、CSS对打印的控制:
    <!–media=print 这个属性可以在打印时有效–>
    <style media=print>
    .Noprint{display:none;}
    .PageNext{page-break-after: always;}
    </style>

    Noprint样式可以使页面上的打印按钮等不出现在打印页面上,这一点非常重要,因为它可以用最少的代码完成最需要的功能

    PageNext样式可以设置分页,在需要分页的地方<div class="PageNext"></div>就OK了,呵呵

    2、表格线粗细的设置,更是通过样式表:

    <style>
    .tdp
    {
    border-bottom: 1 solid #000000;
    border-left: 1 solid #000000;
    border-right: 0 solid #ffffff;
    border-top: 0 solid #ffffff;
    }
    .tabp
    {
    border-color: #000000;

    border-collapse:collapse;
    }
    </style>

    或者:

    <style>
    .TdCs1 {
    border:solid windowtext 1.0pt;
    }
    .TdCs2 {
    border:solid windowtext 1.0pt; border-left:none;
    }
    .TdCs3 {
    border-top:none;
    border-left:solid windowtext 1.0pt;
    border-bottom:solid windowtext 1.0pt;
    border-right:solid windowtext 1.0pt;
    }
    .TdCs4 {
    border-top:none;
    border-left:none;
    border-bottom:solid windowtext 1.0pt;
    border-right:solid windowtext 1.0pt;
    }
    .underline {
    border-top-style: none;
    border-right-style: none;
    border-bottom-style: solid;
    border-left-style: none;
    border-bottom-color: #000000;
    }
    </style>