<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_镜涛的家              JT</title><subtitle type="text">A NEW LIFE WITH YOU !</subtitle><id>http://feed.cnblogs.com/blog/u/18788/rss</id><updated>2011-11-20T08:16:42Z</updated><author><name>镜涛</name><uri>http://www.cnblogs.com/jingtao/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jingtao/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/18788/rss"/><entry><id>http://www.cnblogs.com/jingtao/archive/2011/08/09/2133101.html</id><title type="text">工作流系统概述</title><summary type="text">什么是工作流引擎？用一句话来描述我觉得应该是：驱动任务按照预定义的业务规则在参与者之间进行流转，最终完成特定业务处理的功能组件。那么什么是工作流系统呢？我觉得应该是：建立在工作流引擎基础上的一系列的用户交互、监控、仿真、评估等功能组件的集合，也就是围绕引擎展开的与业务松耦合的辅助组件的组合。下面先从引擎说起，按照上面的定义，引擎的关键点在于驱动、规则和参与者。驱动实际上是建立在特定流程模型上的，例如：发送、回退、跳转发送、跳转回退、发散、汇聚等。规则是建立在流程变量上的运行时流转路线定义，它可以是一段脚本或者是一条sql。参与者则是任务的实际处理者，可能是时间，可能是人还有可能是其它外部设备输</summary><published>2011-08-09T15:05:00Z</published><updated>2011-08-09T15:05:00Z</updated><author><name>镜涛</name><uri>http://www.cnblogs.com/jingtao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jingtao/archive/2011/08/09/2133101.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jingtao/archive/2011/08/09/2133101.html"/><content type="html">&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14px;" size="3"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;什么是工作流引擎？用一句话来描述我觉得应该是：驱动任务按照预定义的业务规则在参与者之间进行流转，最终完成特定业务处理的功能组件。那么什么是工作流系统呢？我觉得应该是：建立在工作流引擎基础上的一系列的用户交互、监控、仿真、评估等功能组件的集合，也就是围绕引擎展开的与业务松耦合的辅助组件的组合。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14px;" size="3"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;下面先从引擎说起，按照上面的定义，引擎的关键点在于驱动、规则和参与者。驱动实际上是建立在特定流程模型上的，例如：发送、回退、跳转发送、跳转回退、发散、汇聚等。规则是建立在流程变量上的运行时流转路线定义，它可以是一段脚本或者是一条&lt;/span&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;sql&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;。参与者则是任务的实际处理者，可能是时间，可能是人还有可能是其它外部设备输入。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14px;" size="3"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;举个简单的例子，如下图的请假流程：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 14px;"&gt;&lt;img style="display: block; margin-left: auto; margin-right: auto;" alt="" src="http://pic002.cnblogs.com/images/2011/15230/2011080923020127.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14px;" size="3"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;申请人提交请假事由，如果请假天数小于&lt;/span&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;7&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;天，那么经理直接审批结束即可，如果大于&lt;/span&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;7&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;天，那么经理审批后需要人力主管备案结束流程。在这个过程中，应该发到哪个环节是业务规则决定的，怎么发是引擎控制的，谁处理取决于环节参与者的设置。工作流的核心实际上就是上面这三部分的内容，当然上面仅仅是一个最简单的应用场景，实际业务场景可能比这要复杂的多，但是核心思想是这样的，无非是实现逻辑的复杂性高了些。在这三部分中，流程驱动模型的实现最为复杂，很多情况下无法实现所有的模型，往往根据产品的市场做一定的取舍，但是一些基础的模型是必须要支持的，如上面提到的六种。业务规则的处理需要实现业务规则引擎，因为业务规则的多样性和复杂性一般来说规则引擎需要支持业务扩展；同时需要做好业务数据和流程数据的转换，避免流程和业务的耦合。参与者相对于业务规则来说要简单些，毕竟是系统级的，但是要充分考虑到系统集成等因素的影响。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14px;" size="3"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;上面我们描述了工作流系统的核心，但是这对于一个完善可用的工作流系统来说是远远不够的，因而我们需要做一系列的扩展，达到更好的友好性和可用性。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14px;" size="3"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;根据&lt;/span&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;wfmc&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;的定义，我们需要必要的流程定制工具，即通过可视化的界面来编排流程中环节个数，环节之间的先后顺序，同时设置各个环节的参与者，环节之间流转的规则。当然，我们也可以通过手工编写流程脚本或者组装&lt;/span&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;xml&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;的方式来达到定制流程的目的，但前提是你可以说服用户，同时教会他们该如何做这件事。如果你面对的不是具有编程能力的开发人员，我觉得这似乎是一项艰巨而不可能完成的任务。对于定制工具来说，必须要提及的内容便是定制流程的数据表示，目前主要有三种国际规范，即&lt;/span&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;xpdl&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;，&lt;/span&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;bpel&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;，&lt;/span&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;bpmn&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;。具体使用哪一种需要权衡，或者可以以一种为基础进行相互转换。当然你可以自己定义格式，但是在企业应用集成的大环境下，这很难站住脚。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14px;" size="3"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;流程定义之后便是流程的运转，引擎按照规则将任务发送给参与者，如果参与者是人（参与者是时间或者外部输入的情况在此暂不讨论）那么必须提供任务处理入口，这便是任务列表。任务列表的实现一般是多样化的，因为它需要呈现给多样化的人看，这些人可能是不同级别的，可能是不同行业的，他们所处的环境不同，视角不同，关注点不同。例如，如果一个生产型企业申请营业执照，那么需要通过环保局和工商局的审批，但是这两个委办局关注的业务点肯定是不同的，环保局可能关注企业的环保设备型号、处理能力、排污标准等业务信息，而工商局可能关注其生产设备、生产条件、资质等业务信息。关注点不同，任务列表呈现的内容就不同。再例如，在环保局中，科长可能只关注科室下目前有多少正在处理的任务，都是什么类型的任务；而科员可能关注每一条任务的具体内容和状态。参与者层次不同，任务列表呈现的内容也不同。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14px;" size="3"&gt;&lt;span style="mso-tab-count: 1;"&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;流程定制工具、流程引擎、任务列表以及完善的工作流查询、操作&lt;/span&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;api&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;" lang="ZH-CN"&gt;几部分构成了一个相对完善的工作流系统，能够满足大多数业务需要。但是随着流程系统的发展，越来越多的特性融入了进来，例如任务监控、流程仿真、统计分析等。流程监控能够让用户以更直观的方式查看流程、业务信息。仿真和统计分析则可以通过对流程制定各种监控指标，并以此指导用户优化流程，或者进行绩效考核。&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14px;" size="3"&gt;&lt;span style="font-family: Calibri;" face="Calibri"&gt;&lt;span style="mso-tab-count: 1;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 14px; mso-tab-count: 1;"&gt;&lt;span style="font-family: Calibri;" size="3" face="Calibri"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jingtao/aggbug/2133101.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jingtao/archive/2011/08/09/2133101.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jingtao/archive/2011/08/05/2128942.html</id><title type="text">需要掌握的flex知识点</title><summary type="text">1.函数使用a.匿名函数b.闭包c.包函数、全局函数2.动态对象a.如何使用动态变量、动态方法（创建、访问、遍历）b.如何使用方法对象（声明、创建、本质、原型）c.如何使用类原型，有那些注意事项d.原型链3.异常处理机制a.异常类型、捕获、处理、传递b.全局异常处理4.垃圾收集机制、安全模型、反射机制5.UI元素a.核心UI类的层次结构b.元素显示列表树c.UI元素的显示顺序，如何调整元素显示顺序，如何确定元素是否在舞台上d.如何监听容器的元素变化，如何监听舞台的元素变化e.在多级显示层次中，各个元素的坐标如何确定（全局的，局部的）f.自定义UI元素的使用（自定义行为、自定义布局、皮肤）6.事</summary><published>2011-08-05T10:38:00Z</published><updated>2011-08-05T10:38:00Z</updated><author><name>镜涛</name><uri>http://www.cnblogs.com/jingtao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jingtao/archive/2011/08/05/2128942.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jingtao/archive/2011/08/05/2128942.html"/><content type="html">&lt;p class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l2 level1 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;1.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;函数使用&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 42.0pt; text-indent: -21.0pt; mso-char-indent-count: 0; mso-list: l2 level2 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;a.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;匿名函数&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 42.0pt; text-indent: -21.0pt; mso-char-indent-count: 0; mso-list: l2 level2 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;b.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;闭包&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 42.0pt; text-indent: -21.0pt; mso-char-indent-count: 0; mso-list: l2 level2 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;c.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;包函数、全局函数&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l2 level1 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;2.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;动态对象&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l3 level1 lfo5;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;a.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;如何使用动态变量、动态方法（创建、访问、遍历）&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l3 level1 lfo5;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;b.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;如何使用方法对象（声明、创建、本质、原型）&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l3 level1 lfo5;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;c.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;如何使用类原型，有那些注意事项&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l3 level1 lfo5;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;d.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;原型链&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l2 level1 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;3.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;异常处理机制&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 42.0pt; text-indent: -21.0pt; mso-char-indent-count: 0; mso-list: l2 level2 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;a.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;异常类型、捕获、处理、传递&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 42.0pt; text-indent: -21.0pt; mso-char-indent-count: 0; mso-list: l2 level2 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;b.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;全局异常处理&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l2 level1 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;4.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;垃圾收集机制、安全模型、反射机制&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l2 level1 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;5.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;UI&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;元素&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo3;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;a.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;核心&lt;/span&gt;UI&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;类的层次结构&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo3;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;b.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;元素显示列表树&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo3;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;c.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;UI&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;元素的显示顺序，如何调整元素显示顺序，如何确定元素是否在舞台上&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo3;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;d.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;如何监听容器的元素变化，如何监听舞台的元素变化&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo3;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;e.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;在多级显示层次中，各个元素的坐标如何确定（全局的，局部的）&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l1 level1 lfo3;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;f.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;自定义&lt;/span&gt;UI&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;元素的使用（自定义行为、自定义布局、皮肤）&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l2 level1 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;6.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;事件流&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo2;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;a.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Flex&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;事件分为那几个阶段，各个阶段的特点是什么，如何区分不同阶段&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo2;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;b.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;如何监听不同阶段的事件&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo2;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;c.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;如何停止事件的传播，&lt;/span&gt;stopPropergation&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;和&lt;/span&gt;stopImmediatePropagation&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;有什么区别&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo2;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;d.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;界面&lt;/span&gt;ui&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;层次结构发生变化的时候对事件流有什么影响；在事件流传播过程中监听函数的变化对事件流有什么影响&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l0 level1 lfo2;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;e.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;如何使用自定义事件，如何安排自定义事件流&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l2 level1 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;7.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;屏幕刷新&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l4 level1 lfo4;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;a.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;什么是帧率，实际帧率和设计帧率的有什么区别，如何确定实际帧率和设计帧率，如何设置帧率&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l4 level1 lfo4;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;b.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;屏幕刷新的周期，哪些因素会影响屏幕刷新周期，屏幕刷新的内容包括哪些&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l4 level1 lfo4;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;c.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;如何强制刷新&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 36.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l4 level1 lfo4;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;d.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Event.Render&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;的触发条件，如何使用&lt;/span&gt;Event.Render&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;事件&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l2 level1 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;8.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;Xml&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;、图形、音频、视频处理&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l2 level1 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;9.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;外部资源加载、与容器交互&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 42.0pt; text-indent: -21.0pt; mso-char-indent-count: 0; mso-list: l2 level2 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;a.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;加载外部类库&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 42.0pt; text-indent: -21.0pt; mso-char-indent-count: 0; mso-list: l2 level2 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;b.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;加载外部数据（&lt;/span&gt;webservice/remoteObject/http&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;）&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 42.0pt; text-indent: -21.0pt; mso-char-indent-count: 0; mso-list: l2 level2 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;c.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;与容器交互&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l2 level1 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;10.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;内置的元数据标签及其含义；自定义元数据标签的使用&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 18.0pt; text-indent: -18.0pt; mso-char-indent-count: 0; mso-list: l2 level1 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;11.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;编译相关&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 42.0pt; text-indent: -21.0pt; mso-char-indent-count: 0; mso-list: l2 level2 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;a.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;编译参数&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 42.0pt; text-indent: -21.0pt; mso-char-indent-count: 0; mso-list: l2 level2 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;b.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;编译模式&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoListParagraph" style="margin-left: 42.0pt; text-indent: -21.0pt; mso-char-indent-count: 0; mso-list: l2 level2 lfo1;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span&gt;&lt;span&gt;c.&lt;span style="font: 7.0pt 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span lang="ZH-CN" style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;"&gt;编译类路径&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jingtao/aggbug/2128942.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jingtao/archive/2011/08/05/2128942.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jingtao/archive/2011/05/23/2054246.html</id><title type="text">ORA-01460: 转换请求无法实现或不合理</title><summary type="text">oracle10g数据库执行数据库更新sql时报错：Caused by: java.sql.SQLException: ORA-01460: 转换请求无法实现或不合理at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573)at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7</summary><published>2011-05-23T04:58:00Z</published><updated>2011-05-23T04:58:00Z</updated><author><name>镜涛</name><uri>http://www.cnblogs.com/jingtao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jingtao/archive/2011/05/23/2054246.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jingtao/archive/2011/05/23/2054246.html"/><content type="html">&lt;p&gt;oracle10g数据库执行数据库更新sql时报错：&lt;/p&gt;&lt;p&gt;Caused by: java.sql.SQLException: ORA-01460: 转换请求无法实现或不合理&lt;/p&gt;&lt;p&gt;&amp;nbsp;at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)&lt;br /&gt;&amp;nbsp;at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)&lt;br /&gt;&amp;nbsp;at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573)&lt;br /&gt;&amp;nbsp;at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891)&lt;br /&gt;&amp;nbsp;at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093)&lt;br /&gt;&amp;nbsp;at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047)&lt;br /&gt;&amp;nbsp;at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940)&lt;br /&gt;&amp;nbsp;at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2709)&lt;br /&gt;&amp;nbsp;at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589)&lt;br /&gt;&amp;nbsp;at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:102)&lt;/p&gt;&lt;p&gt;错误原因：数据库驱动版本错误&lt;/p&gt;&lt;p&gt;处理方式：将直连或者jndi连接使用的驱动替换为oracle10g安装目录下jdbc里面的驱动程序&lt;/p&gt;&lt;p&gt;引起这个错误的其他原因：&lt;/p&gt;&lt;p&gt;1.数据库类型字段长度不够&lt;/p&gt;&lt;p&gt;2.数据库服务器字符集与客户端不匹配&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jingtao/aggbug/2054246.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jingtao/archive/2011/05/23/2054246.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jingtao/archive/2011/04/28/2031806.html</id><title type="text">去除对象中的类型集合</title><summary type="text">一般来说，当某一个对象有多个集合类型的子元素时，我们都会给每个子元素创建一个集合对象来承载子元素，类似于： public class Process { public var isExecutable:Boolean; public var refLaneSet:LaneSet; public var startEventList:ArrayList; public var endEventList:ArrayList; public var taskList:ArrayList; public var serviceTaskList:ArrayList; public var sendTas</summary><published>2011-04-28T07:15:00Z</published><updated>2011-04-28T07:15:00Z</updated><author><name>镜涛</name><uri>http://www.cnblogs.com/jingtao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jingtao/archive/2011/04/28/2031806.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jingtao/archive/2011/04/28/2031806.html"/><content type="html">&lt;p class="p0"&gt;一般来说，当某一个对象有多个集合类型的子元素时，我们都会给每个子元素创建一个集合对象来承载子元素，类似于：&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Process&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; var isExecutable:Boolean;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; var refLaneSet:LaneSet;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; var startEventList:ArrayList;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; var endEventList:ArrayList;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; var taskList:ArrayList;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; var serviceTaskList:ArrayList;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; var sendTaskList:ArrayList;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; var receiveTaskList:ArrayList;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; var userTaskList:ArrayList;&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class="p0"&gt;一般来说，这是没什么问题的。但是某些情况下，例如在图形化与结构化文档之间进行转化时，这样做有很多弊端。如图：&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;img src="http://pic002.cnblogs.com/images/2011/15230/2011042815130778.jpg" /&gt;&lt;/p&gt;&lt;p class="p0"&gt;图中：&lt;/p&gt;&lt;p class="p0"&gt;Participant1&lt;span style="font-family: 宋体;" face="宋体"&gt;，展现类型为&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;PoolDiagram&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;，对应模型为之前的&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;Process&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;对象；&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;Task1&lt;span style="font-family: 宋体;" face="宋体"&gt;，展现类型为&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;UserTaskDiagram&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;，对应模型为&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;UserTask&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;；&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;Task2&lt;span style="font-family: 宋体;" face="宋体"&gt;，展现类型为&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;ManualTaskDiagram&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;，对应模型为&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;ManualTask&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;我们每向&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;Participant1&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;中增加一个&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;UserTaskDiagram&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;或者&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;ManualTaskDiagram&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;时，都需要向对应的&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;Process&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;中增加&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;UserTask&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;或者&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;ManualTask&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;对象；删除时也是如此。这时候就需要通过判断图形的类型来向相关的模型列表中增加模型对象，删除也需要判断。在类型比较少的时候，这样做比较简单，但是如果类型比较多的时候，特别是类型数量是一个变化点的时候，这种处理方式局限性就很大了，每次变动，都会对既有的代码造成影响。具体的代码可能类似于：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;增加：&lt;/p&gt;&lt;p class="p0"&gt;If(diagram&amp;nbsp;is&amp;nbsp;UserTaskDiagram)&amp;nbsp;Process.UserTaskList.add(userTask)&lt;/p&gt;&lt;p class="p0"&gt;Else&amp;nbsp;if(diagram&amp;nbsp;is&amp;nbsp;ManualTaskDiagram)Process.ManualTaskDiagram.add&lt;span style="font-family: 宋体;" face="宋体"&gt;（&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;manualTask&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;）&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;......&lt;/p&gt;&lt;p class="p0"&gt;......&lt;/p&gt;&lt;p class="p0"&gt;删除：&lt;/p&gt;&lt;p class="p0"&gt;If(diagram&amp;nbsp;is&amp;nbsp;UserTaskDiagram)&amp;nbsp;Process.UserTaskList.remove(userTask)&lt;/p&gt;&lt;p class="p0"&gt;Else&amp;nbsp;if(diagram&amp;nbsp;is&amp;nbsp;ManualTaskDiagram)Process.ManualTaskDiagram.remove&lt;span style="font-family: 宋体;" face="宋体"&gt;（&lt;/span&gt;&lt;span style="font-family: 'Times New Roman';" face="Times New Roman"&gt;manualTask&lt;/span&gt;&lt;span style="font-family: 宋体;" face="宋体"&gt;）&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;......&lt;/p&gt;&lt;p class="p0"&gt;......&lt;/p&gt;&lt;p class="p0"&gt;即使我们将这段代码封装到一个地方，这个地方在新类型增加时也需要改变，有没有一种方法可以在类型增加时不改变既有代码呢？答案是肯定的。&lt;/p&gt;&lt;p class="p0"&gt;具体方案如下：&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ContainerElement &lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; var _typeListDic:Dictionary&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Dictionary();&lt;br /&gt;        &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; function addChildElement(element:BPMNElement):&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;_typeListDic[element.type])&lt;br /&gt;                _typeListDic[element.type]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ArrayCollection();&lt;br /&gt;            _typeListDic[element.type].addItem(element);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; function removeChildElement(element:BPMNElement):&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(_typeListDic[element.type])&lt;br /&gt;            {&lt;br /&gt;                var index:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;_typeListDic[element.type].getItemIndex(element);&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(index&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=-&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;                {&lt;br /&gt;                    _typeListDic[element.type].removeItemAt(index);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; function getChildElements(classInfo:Class):ArrayCollection&lt;br /&gt;        {            &lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;_typeListDic[classInfo])&lt;br /&gt;                _typeListDic[classInfo]&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ArrayCollection();&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; _typeListDic[classInfo];&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Process extends ContainerElement&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; var isExecutable:Boolean;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; var laneSet:LaneSet;&lt;br /&gt;        &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; function Process(){}&lt;br /&gt;        &lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; function &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt; type():Class&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; Process;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p class="p0"&gt;上面的代码将所有的类型列表相关的操作封装在ContainerElement中，该类维护一个类型和对象集合的映射关系，从而将相关的判断逻辑从代码中去除。再增加或者去除新类型时我们的process&lt;span style="font-family: 宋体;" face="宋体"&gt;类是保持不变的，相关的增加删除逻辑也会保存相对固定。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;经过以上实现，之前的增加删除逻辑变为：&lt;/p&gt;&lt;p class="p0"&gt;Process.addChildElement(userTask);&lt;/p&gt;&lt;p class="p0"&gt;Process.removeChildElement(manualTask);&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jingtao/aggbug/2031806.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jingtao/archive/2011/04/28/2031806.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jingtao/archive/2011/04/16/2018412.html</id><title type="text">【转载】Tomcat内存溢出的原因及调试</title><summary type="text">在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的，当然处理方式也不一样。这里根据平时遇到的情况和相关资料进行一个总结。常见的一般会有下面三种情况：1.OutOfMemoryError：Javaheapspace2.OutOfMemoryError：PermGenspace3.OutOfMemoryError：unabletocreatenewnativethread.Tomcat内存溢出解决方案对于前两种情况，在应用本身没有内存泄露的情况下可以用设置tomcatjvm参数来解决。（-Xms-Xmx-XX：PermSize-XX：MaxPermSize）最后一种可能</summary><published>2011-04-16T11:26:00Z</published><updated>2011-04-16T11:26:00Z</updated><author><name>镜涛</name><uri>http://www.cnblogs.com/jingtao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jingtao/archive/2011/04/16/2018412.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jingtao/archive/2011/04/16/2018412.html"/><content type="html">&lt;div class="Section0"&gt;&lt;div class="Section0"&gt;&lt;p class="p0"&gt;在生产环境中&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;tomcat&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;内存设置不好很容易出现内存溢出。造成内存原因是不一样的，当然处理方式也不一样。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;这里根据平时遇到的情况和相关资料进行一个总结。常见的一般会有下面三种情况：&amp;nbsp;&lt;br /&gt;1.OutOfMemoryError&lt;span face="宋体" style="font-family: 宋体;"&gt;：&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;Java&amp;nbsp;heap&amp;nbsp;space&amp;nbsp;&lt;/span&gt;&lt;br /&gt;2.OutOfMemoryError&lt;span face="宋体" style="font-family: 宋体;"&gt;：&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;PermGen&amp;nbsp;space&amp;nbsp;&lt;/span&gt;&lt;br /&gt;3.OutOfMemoryError&lt;span face="宋体" style="font-family: 宋体;"&gt;：&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;unable&amp;nbsp;to&amp;nbsp;create&amp;nbsp;new&amp;nbsp;native&amp;nbsp;thread.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tomcat&lt;span face="宋体" style="font-family: 宋体;"&gt;内存溢出解决方案&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;对于前两种情况，在应用本身没有内存泄露的情况下可以用设置&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;tomcat&amp;nbsp;jvm&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;参数来解决。（&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;-Xms&amp;nbsp;-Xmx&amp;nbsp;-XX&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;PermSize&amp;nbsp;-XX&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;MaxPermSize&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;）最后一种可能需要调整操作系统和&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;tomcat&amp;nbsp;jvm&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;参数同时调整才能达到目的。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;第一种：是堆溢出。&amp;nbsp;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;在&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;JVM&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;中如果&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;98&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;％的时间是用于&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;GC&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;且可用的&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;Heap&amp;nbsp;size&amp;nbsp;&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;不足&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;2&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;％的时候将抛出此异常信息。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;没有内存泄露的情况下，调整&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;-Xms&amp;nbsp;-Xmx&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;参数可以解决。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;-Xms&lt;span face="宋体" style="font-family: 宋体;"&gt;：初始堆大小&amp;nbsp;&lt;/span&gt;&lt;br /&gt;-Xmx&lt;span face="宋体" style="font-family: 宋体;"&gt;：最大堆大小&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;但堆的大小受下面三方面影响：&amp;nbsp;&lt;br /&gt;&lt;br /&gt;1.&lt;span face="宋体" style="font-family: 宋体;"&gt;相关操作系统的数据模型（&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;32-bt&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;还是&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;64-bit&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;）限制；（&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;32&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;位系统下，一般限制在&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;1.5G~2G&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;；我在&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;2003&amp;nbsp;server&amp;nbsp;&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;系统下（物理内存：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;4G&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;和&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;6G&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;jdk&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;1.6&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;）测试&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;1612M&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;64&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;为操作系统对内存无限制。）&amp;nbsp;&lt;/span&gt;&lt;br /&gt;2.&lt;span face="宋体" style="font-family: 宋体;"&gt;系统的可用虚拟内存限制；&amp;nbsp;&lt;/span&gt;&lt;br /&gt;3.&lt;span face="宋体" style="font-family: 宋体;"&gt;系统的可用物理内存限制。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;-Xms&amp;nbsp;-Xmx&lt;span face="宋体" style="font-family: 宋体;"&gt;一般配置成一样比较好比如&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;set&amp;nbsp;JAVA_OPTS=&amp;nbsp;-Xms1024m&amp;nbsp;-Xmx1024m&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;第二种：永久保存区域溢出&amp;nbsp;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;PermGen&amp;nbsp;space&lt;span face="宋体" style="font-family: 宋体;"&gt;的全称是&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;Permanent&amp;nbsp;Generation&amp;nbsp;space&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，是指内存的永久保存区域。这一部分用于存放&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;Class&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;和&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;Meta&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的信息，&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;Class&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;在被&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;Load&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的时候被放入&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;PermGen&amp;nbsp;space&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;区域，它和和存放&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;Instance&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;Heap&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;区域不同，&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;GC&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;（&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;Garbage&amp;nbsp;Collection&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;）不会在主程序运行期对&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;PermGen&amp;nbsp;space&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;进行清理，所以如果你的&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;APP&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;会&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;LOAD&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;很多&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;CLASS&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的话，就很可能出现&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;PermGen&amp;nbsp;space&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;错误。这种错误常见在&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;web&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;服务器对&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;JSP&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;进行&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;pre&amp;nbsp;compile&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的时候。但目前的&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;hibernate&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;和&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;spring&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;项目中也很容易出现这样的问题。&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;http://www.javaeye.com&amp;nbsp;/topic/80620&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;？&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;page=1&amp;nbsp;&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的帖子有讨论的这个问题。可能是由于这些框架会动态&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;class&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，而且&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;jvm&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;gc&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;是不会清理&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;PemGen&amp;nbsp;space&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的，导致内存溢出。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;这一个一般是加大&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;-XX&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;PermSize&amp;nbsp;-XX&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;MaxPermSize&amp;nbsp;&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;来解决问题。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;-XX&lt;span face="宋体" style="font-family: 宋体;"&gt;：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;PermSize&amp;nbsp;&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;永久保存区域初始大小&amp;nbsp;&lt;/span&gt;&lt;br /&gt;-XX&lt;span face="宋体" style="font-family: 宋体;"&gt;：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;PermSize&amp;nbsp;&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;永久保存区域初始最大值&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;这一般结合第一条使用，比如&amp;nbsp;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;set&amp;nbsp;JAVA_OPTS=&amp;nbsp;-Xms1024m&amp;nbsp;-Xmx1024m&amp;nbsp;-XX&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;PermSize=128M&amp;nbsp;-XX&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;PermSize=256M&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;有一点需要注意：&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;java&amp;nbsp;-Xmx***M&amp;nbsp;version&amp;nbsp;&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;命令来测试的最大堆内存是&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;-Xmx&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;与&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;-XX&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;PermSize&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的&amp;nbsp;和比如系统支持最大的&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;jvm&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;堆大小事&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;1.5G&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，那&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;-Xmx1024m&amp;nbsp;-XX&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;PermSize=768M&amp;nbsp;&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;是无法运行的。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;第三种：无法创建新的线程。&amp;nbsp;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;这种现象比较少见，也比较奇怪，主要是和&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;jvm&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;与系统内存的比例有关。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;这种怪事是因为&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;JVM&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;已经被系统分配了大量的内存（比如&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;1.5G&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;），并且它至少要占用可用内存的一半。有人发现，在线程个数很多的情况下，你分配给&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;JVM&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的内存越多，那么，上述错误发生的可能性就越大。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;产生这种现象的原因如下（从这个&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;blog&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;中了解到原因：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;）：&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;每一个&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;32&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;位的进程最多可以使用&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;2G&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的可用内存，因为另外&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;2G&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;被操作系统保留。这里假设使用&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;1.5G&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;给&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;JVM&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，那么还余下&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;500M&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;可用内存。这&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;500M&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;内存中的一部分必须用于系统&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;dll&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的加载，那么真正剩下的也许只有&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;400M&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，现在关键的地方出现了：当你使用&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;Java&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;创建一个线程，在&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;JVM&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的内存里也会创建一个&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;Thread&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;对象，但是同时也会在操作系统里创建一个真正的物理线程（参考&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;JVM&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;规范），操作系统会在余下的&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;400&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;兆内存里创建这个物理线程，而不是在&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;JVM&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;1500M&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的内存堆里创建。在&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;jdk1.4&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;里头，默认的栈大小是&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;256KB&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，但是在&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;jdk1.5&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;里头，默认的栈大小为&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;1M&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;每线程，因此，在余下&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;400M&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的可用内存里边我们最多也只能创建&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;400&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;个可用线程。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;这样结论就出来了，要想创建更多的线程，你必须减少分配给&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;JVM&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的最大内存。还有一种做法是让&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;JVM&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;宿主在你的&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;JNI&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;代码里边。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;给出一个有关能够创建线程的最大个数的估算公式：&amp;nbsp;&lt;br /&gt;&lt;br /&gt;（&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;MaxProcessMemory&amp;nbsp;-&amp;nbsp;JVMMemory&amp;nbsp;-&amp;nbsp;ReservedOsMemory&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;）&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;/&amp;nbsp;&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;（&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;ThreadStackSize&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;）&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;=&amp;nbsp;Number&amp;nbsp;of&amp;nbsp;threads&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;对于&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;jdk1.5&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;而言，假设操作系统保留&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;120M&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;内存：&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1.5GB&amp;nbsp;JVM&lt;span face="宋体" style="font-family: 宋体;"&gt;：&amp;nbsp;（&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;2GB-1.5Gb-120MB&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;）&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;/&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;（&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;1MB&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;）&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;=&amp;nbsp;~380&amp;nbsp;threads&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1.0GB&amp;nbsp;JVM&lt;span face="宋体" style="font-family: 宋体;"&gt;：&amp;nbsp;（&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;2GB-1.0Gb-120MB&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;）&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;/&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;（&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;1MB&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;）&amp;nbsp;&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;=&amp;nbsp;~880&amp;nbsp;threads&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;2000/XP/2003&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;boot.ini&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;里头有一个启动选项，好像是：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;/PAE&amp;nbsp;/3G&amp;nbsp;&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，可以让用户进程最大内存扩充至&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;3G&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，这时操作系统只能占用最多&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;1G&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的虚存。那样应该可以让&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;JVM&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;创建更多的线程。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;因此这种情况需要结合操作系统进行相关调整。&amp;nbsp;&lt;br /&gt;&lt;br /&gt;因此：我们需要结合不同情况对&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;tomcat&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;内存分配进行不同的诊断才能从根本上解决问题。&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;以上就是针对&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;Tomcat&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;内存溢出的几种解决方案。&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;因为是好久之前保存的文章，转载出处无法确定了，相关文章可以访问&lt;a href="http://www.google.com.hk/search?hl=zh-TW&amp;amp;source=hp&amp;amp;biw=1366&amp;amp;bih=641&amp;amp;q=Tomcat%E5%86%85%E5%AD%98%E6%BA%A2%E5%87%BA%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88++&amp;amp;btnG=Google+%E6%90%9C%E5%B0%8B&amp;amp;aq=f&amp;amp;aqi=&amp;amp;aql=&amp;amp;oq="&gt;http://www.google.com.hk/search?hl=zh-TW&amp;amp;source=hp&amp;amp;biw=1366&amp;amp;bih=641&amp;amp;q=Tomcat%E5%86%85%E5%AD%98%E6%BA%A2%E5%87%BA%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88++&amp;amp;btnG=Google+%E6%90%9C%E5%B0%8B&amp;amp;aq=f&amp;amp;aqi=&amp;amp;aql=&amp;amp;oq=&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/jingtao/aggbug/2018412.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jingtao/archive/2011/04/16/2018412.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jingtao/archive/2011/04/16/2017886.html</id><title type="text">做产品开发的感想</title><summary type="text">还有三个月的时间，工作就两年了。在此期间收获了很多东西，特别是对平台产品的开发有了比较深刻的理解和认识，在此做个总结，一是通过总结归纳来完善和提高自己，而是希望和大家分享经验，交流感想。 两年的时间不长不短，在这段时间里，通过bug的修改、功能点的开发、模块开发到整个产品的开发维护过程让我对现在的产品有了很全面深刻的理解，如果说前面的路是铺垫，是相对平坦自己能够轻松胜任的，那么现在的工作就是挑战，需要通过不断的提高完善自身来出色的完成自己的工作。 从目前的经验和专业水平来说，我觉得做好平台产品，需要从以下几个方面下功夫：1.定位和发展路线 定位和发展路线用一句话来概括就是：要做什么，分那几步.</summary><published>2011-04-16T03:24:00Z</published><updated>2011-04-16T03:24:00Z</updated><author><name>镜涛</name><uri>http://www.cnblogs.com/jingtao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jingtao/archive/2011/04/16/2017886.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jingtao/archive/2011/04/16/2017886.html"/><content type="html">&lt;div class="Section0"&gt;&lt;p class="p0"&gt;还有三个月的时间，工作就两年了。在此期间收获了很多东西，特别是对平台产品的开发有了比较深刻的理解和认识，在此做个总结，一是通过总结归纳来完善和提高自己，而是希望和大家分享经验，交流感想。&lt;/p&gt;&lt;p class="p0"&gt;两年的时间不长不短，在这段时间里，通过bug&lt;span face="宋体" style="font-family: 宋体;"&gt;的修改、功能点的开发、模块开发到整个产品的开发维护过程让我对现在的产品有了很全面深刻的理解，如果说前面的路是铺垫，是相对平坦自己能够轻松胜任的，那么现在的工作就是挑战，需要通过不断的提高完善自身来出色的完成自己的工作。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;从目前的经验和专业水平来说，我觉得做好平台产品，需要从以下几个方面下功夫：&lt;/p&gt;&lt;p class="p0"&gt;&lt;strong&gt;1.&amp;nbsp;定位和发展路线&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;定位和发展路线用一句话来概括就是：要做什么，分那几步做。以目前做的工作流为例，国外的工作流产品和国内的产品所实现的业务模型是有区别的，国内的工作流产品中针对企业的和针对政府的业务模型是不同的，而政府中协同办公和行政执法的业务模型还不一样。假如现在要做工作流的产品，我们就需要考虑这款产品针对的市场是什么？以后还有可能向那些行业或者市场扩展？这些行业和市场的共性有哪些？如何从当前主要市场扩展到相关市场？要搞清楚这些问题，就需要进行调研，研究目标市场和相关市场的企业或者政府的办事流程，将其主要的工作流程进行分析，提炼业务模型，找到流程中的共性，同时结合现有的相关标准，决定自己要实现的工作流业务模型。业务模型确定之后，需要根据目前市场、内部资源配置等情况，制定产品的发展路线。&lt;/p&gt;&lt;p class="p0"&gt;&lt;strong&gt;2.&amp;nbsp;架构&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;业务模型和路线确定之后，接下来就是进行实现了。不管是迭代开发还是瀑布式开发，首先需要确定产品架构，也就是对业务模型进行建模，确定支持业务模型的技术模型。建模的过程中我们首先要保证该技术模型能够满足之前确立的核心业务模型，同时需要为以后的业务扩展方向预留必要的接口，以满足后期市场拓展的需求。技术模型的确立需要不断的验证和改进，因为几乎没人可以一次性的完成一个产品的架构，并且保证这个架构就是准确、健壮、可扩展、易维护的；所以需要通过原型开发和场景检验工作来验证、改进架构的准确、扩展和可维护性。架构一旦确立，后期改动的成本就很高了，所以一定要甚重，充分考虑到当前的可配置资源（人员、成本、技术平台、开发周期等）以及后期的业务拓展和相关标准支持。&lt;/p&gt;&lt;p class="p0"&gt;&lt;strong&gt;3.&amp;nbsp;质量&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;质量是产品的生命线，功能再强大的产品，如果没有质量做保证，那也是浮云，最终会磨灭在时间的轨迹中，所以要想自己走的更远，就需要把好质量关，从开发的起始阶段就要做好测试工作。良好的测试需要合理的过程规范，保证我们所有的每一步都是正确的，都是一步一个脚印的。首先我们要保证新功能的正确性，确保我们开发的成果是满足用户需求的，是健壮的、易用的。通过相关测试部门的功能性验证，基本能够达到这个效果。其次需要保证新功能增加之后，已有的接口或者功能是正确的，不受影响的。这个工作如果通过测试人员来完成，那么工作量是随时间快速增长的，在人力和成本有限的情况下这显然是行不通的，所以我们需要自动化的测试工具来完成此项工作。单元测试是个不错的选择，虽然开始进行单元测试会有些不适应，而且这会牵涉一部分的精力，但是相对于后期带来的收益，这部分的付出还是相当有价值的。完成了这些工作，我们基本能够保证给产品的每次升级都是正确的，当然产品升级包也是需要进行相关测试来验证的。&lt;/p&gt;&lt;p class="p0"&gt;&lt;strong&gt;4.&amp;nbsp;性能&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;在保证质量的前提下，性能的提升是产品必须要做的事情，长时间的等待是令人难以忍受的。当然，这也取决于产品的定位，如果数据量本身就不大，那可能性能提升的价值就没有那么高。但是，如果每天的数据量就有上万，那么可能很小的失误就能带来几秒甚至十几秒的延迟，这直接决定了用户体验，进而影响客户对产品的看法，最终决定了产品的生存能力；同时，性能提升也需要甚重，千万不能不升反降。要提升性能，我们首先要有依据，找到影响性能的瓶颈，然后我们才能够有的放矢。通过完善的压力测试可以达到这一个目的，找到瓶颈，进而保证产品能够满足用户数据量、访问量的需求。&lt;/p&gt;&lt;p class="p0"&gt;&lt;strong&gt;5.&amp;nbsp;文档支持&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;好的产品，离不开完善文档的支撑。再好的东西，如果别人不知道怎么用，那也是扯淡，所以不仅要&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;code&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，还需要写文档，虽然大多数的编码人员厌烦写文档。但是如果我们抱着提高自己、完善自己的心态去做这件事情，或许文档并没有我们想象中的那么枯燥。完成自己的功能，教会别人去使用这也是一件很快乐的事情。同时，如果文档很麻烦，步骤很多，那可能易用性就有问题，或许通过写文档可以让自己的产品在细节上做的更好一些。《开发指南》，《&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;api&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;接口》，《功能示例文档》，《&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;faq&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;》这些应该是每个产品必备的内容。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&lt;strong&gt;6.&amp;nbsp;需求控制&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;产品开发完成之后，并不是就可以高枕无忧了，我们需要面对其他产品的竞争，需要在日益恶化的市场上站稳脚跟就需要通过项目反馈来不断提升自己的产品。项目反馈的问题自然不用说了，这些都是必须要解决的问题，但是对于来自于项目上的需求就需要慎重的处理，不是每个需求都是合理的，不是每个需求都是可以做的，不是每个需求都是放到产品中的。 这里说的合理性，需要对业务的把握，因为大多数的用户在表述他们所需的时候，并不能准确、真实的反映他们对信息系统的要求，这就需要通过经验和对业务的理解来引导客户，确定用户的真实需求。有些情况下，需求甚至是开发人员自己想象出来的，这对中间件平台开发者来说是家常便饭，这个时候更需要保持清醒，弄清楚真正的客户需求是什么。&lt;/p&gt;&lt;p class="p0"&gt;哪些需求可以做，哪些不可以做，这个在弄清楚真实的客户需求之后就很明了了。但是可以做的需求却不一定要放到产品中，因为产品可能面对比较多的市场，不同的市场有自己个性化的需求，这些个性化的需求很可能有冲突，即使没有冲突，放到产品中也会影响产品的稳定和扩展性，将业务和产品绑定，影响到后期的发展和维护。所以对于需求的处理，一定是共性的东西才能放到产品中，同时对于个性的东西做好扩展接口。&lt;/p&gt;&lt;p class="p0"&gt;&lt;strong&gt;7.&amp;nbsp;产品比较&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;任何时候都需要知己知彼，这样才能更好的活下去，任何时候都不能固步自封，对竞争产品不予重视，相反的，我们应该及时掌握竞争产品的动态，了解、理解竞争产品，取其长处，补己短处。&lt;/p&gt;&lt;p class="p0"&gt;&lt;strong&gt;8.&amp;nbsp;标准研究&lt;/strong&gt;&lt;/p&gt;&lt;p class="p0"&gt;在国际化的大形势下，产品必须要有长远的眼光，很多东西老外比我们有经验，比我们先进，而标准是领域专家经验和思想的结晶，通过对相关标准的研究，我们能够把握目前国际上相关领域产品的发展方向，感知先进的思想。标准能够让我们少走弯路，提高产品的通用性和用户认可度，提供产品的竞争力。&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/jingtao/aggbug/2017886.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jingtao/archive/2011/04/16/2017886.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jingtao/archive/2011/03/18/1988435.html</id><title type="text">基于SAML的单点登录.NET代理端实现方案</title><summary type="text">SAML的相关内容就不介绍了，想深究的可以研究下相关的规范，主要写下大体的思路。通过SAML实现单点登录的运转过程如图：此处的ServiceProvider是服务提供者，也就是用户需要访问的应用，IdentityProvider是认证提供者。通过上图可以看出，当用户访问一个应用的时候，如果用户没有登陆，那么需要将用户重定向到认证服务，认证服务判断该用户是否已经经过认证，如果没有认证过那么进行认证，然后生成断言响应发送给SP，SP负责处理断言，验证用户是否认证通过。也就是说SP进行了请求转发和断言解析两个过程。在.NET中我们可以通过HttpModule来过滤请求，对没有认证的请求进行转发，通过</summary><published>2011-03-18T13:52:00Z</published><updated>2011-03-18T13:52:00Z</updated><author><name>镜涛</name><uri>http://www.cnblogs.com/jingtao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jingtao/archive/2011/03/18/1988435.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jingtao/archive/2011/03/18/1988435.html"/><content type="html">&lt;div class="Section0"&gt;&lt;p class="p0"&gt;&lt;a href="http://wiki.oasis-open.org/security"&gt;SAML&lt;/a&gt;的相关内容就不介绍了，想深究的可以研究下相关的规范，主要写下大体的思路。&lt;/p&gt;&lt;p class="p0"&gt;通过&lt;span face="Calibri" style="font-family: Calibri;"&gt;SAML&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;实现单点登录的运转过程如图：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;img src="http://pic002.cnblogs.com/images/2011/15230/2011031821384175.jpg" /&gt;&lt;/p&gt;&lt;p class="p0"&gt;此处的&lt;span face="Calibri" style="font-family: Calibri;"&gt;ServiceProvider&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;是服务提供者，也就是用户需要访问的应用，&lt;/span&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;IdentityProvider&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;是认证提供者。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;通过上图可以看出，当用户访问一个应用的时候，如果用户没有登陆，那么需要将用户重定向到认证服务，认证服务判断该用户是否已经经过认证，如果没有认证过那么进行认证，然后生成断言响应发送给&lt;span face="Calibri" style="font-family: Calibri;"&gt;SP&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，&lt;/span&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;SP&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;负责处理断言，验证用户是否认证通过。也就是说&lt;/span&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;SP&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;进行了请求转发和断言解析两个过程。在&lt;/span&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;.NET&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;中我们可以通过&lt;/span&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;HttpModule&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;来过滤请求，对没有认证的请求进行转发，通过&lt;/span&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;HttpHandler&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;过滤断言请求，对断言进行处理。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;这种方案的好处是，不需要修改既有的应用程序代码，就能够将其集成到单点登录系统中。也就是只要把认证的&lt;span face="Calibri" style="font-family: Calibri;"&gt;Dll&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;复制到应用执行目录下，然后配置&lt;/span&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;HttpModule&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;和&lt;/span&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;HttpHandler&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;即可。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;示例Module&lt;span face="宋体" style="font-family: 宋体;"&gt;和&lt;/span&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;Handler&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;如下&lt;/span&gt;：&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;HTTP&amp;nbsp;Module&amp;nbsp;处理所有Http请求&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;class&amp;nbsp;SPDispatcherFilter&amp;nbsp;:&amp;nbsp;IHttpModule&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;Init(HttpApplication&amp;nbsp;context)&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.AcquireRequestState&amp;nbsp;+=&amp;nbsp;new&amp;nbsp;EventHandler(context_AcquireRequestState);&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;在session创建完成后处理请求&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;&amp;lt;param&amp;nbsp;name="sender"&amp;gt;&amp;lt;/param&amp;gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;&amp;lt;param&amp;nbsp;name="e"&amp;gt;&amp;lt;/param&amp;gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void&amp;nbsp;context_AcquireRequestState(object&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpApplication&amp;nbsp;app&amp;nbsp;=&amp;nbsp;sender&amp;nbsp;as&amp;nbsp;HttpApplication;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//如果还没加载过配置信息，那么进行加载&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(!ConfigInfo.HasLoadMetaData)&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MetaData.Load(app.Request.PhysicalApplicationPath&amp;nbsp;+&amp;nbsp;ConfigurationManager.AppSettings["MetaDataPath"]);&lt;/p&gt;&lt;p class="p0"&gt;//处理http请求&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(HTTPUtils.HandleRequest(app.Context))&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;app.CompleteRequest();&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;p class="p0"&gt;}&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;&amp;lt;summary&amp;gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;Http&amp;nbsp;Handler&amp;nbsp;处理SAML请求&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;///&amp;nbsp;&amp;lt;/summary&amp;gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;class&amp;nbsp;SPDispatcherHandler:IHttpHandler,IRequiresSessionState&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;bool&amp;nbsp;IsReusable&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;get&amp;nbsp;{&amp;nbsp;return&amp;nbsp;true;&amp;nbsp;}&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;ProcessRequest(HttpContext&amp;nbsp;context)&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HTTPUtils.HandleRequest(context);&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;配置方式如下：&lt;/p&gt;&lt;p class="p0"&gt;1.&amp;nbsp;在&lt;span face="Calibri" style="font-family: Calibri;"&gt;IIS&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;应用程序中增加模块（&lt;/span&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;Module&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;），如图：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;img src="http://pic002.cnblogs.com/images/2011/15230/2011031821442555.jpg" /&gt;&lt;/p&gt;&lt;p class="p0"&gt;名称随便，类型为：处理类的完整名称（命名空间+&lt;span face="宋体" style="font-family: 宋体;"&gt;类名&lt;/span&gt;）&lt;/p&gt;&lt;p class="p0"&gt;2.&amp;nbsp;在&lt;span face="Calibri" style="font-family: Calibri;"&gt;IIS&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;应用程序中增加&lt;/span&gt;&lt;span face="Calibri" style="font-family: Calibri;"&gt;HttpHandler&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，如图：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;img src="http://pic002.cnblogs.com/images/2011/15230/2011031821402135.jpg" /&gt;&lt;/p&gt;&lt;p class="p0"&gt;请求路径为：&lt;span face="Calibri" style="font-family: Calibri;"&gt;*/SAML/*&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;类型为：处理类的完整名称（命名空间+&lt;span face="宋体" style="font-family: 宋体;"&gt;类名&lt;/span&gt;）&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/jingtao/aggbug/1988435.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jingtao/archive/2011/03/18/1988435.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jingtao/archive/2011/03/11/1981195.html</id><title type="text">Cursor identified in Fetch statement is not open</title><summary type="text">在weblogic9.1和9.2版本中使用其自带的数据库驱动连接db2V9.5时，流程解析发布报错：经过测试，应该是weblogic自身提供的驱动版本问题。解决方案如下：1.将db2安装目录下的驱动copy到目录：%WL_HOME%\server\lib\2.修改%WL_HOME%\common\bin下的commEnv.cmd文件，在WEBLOGIC_CLASSPATH变量中增加内容：%WL_HOME%\server\lib\db2jcc.jar;%WL_HOME%\server\lib\db2jcc_license_cu.jar;3.修改%WL_HOME%\server\lib\jdbcd</summary><published>2011-03-11T04:43:00Z</published><updated>2011-03-11T04:43:00Z</updated><author><name>镜涛</name><uri>http://www.cnblogs.com/jingtao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jingtao/archive/2011/03/11/1981195.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jingtao/archive/2011/03/11/1981195.html"/><content type="html">&lt;div class="Section0"&gt;&lt;p class="p0"&gt;在weblogic9.1&lt;span face="宋体" style="font-family: 宋体;"&gt;和&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;9.2&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;版本中使用其自带的数据库驱动连接&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;db2V9.5&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;时，流程解析发布报错：&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;nbsp;&lt;img src="http://pic002.cnblogs.com/images/2011/15230/2011031112401741.jpg" /&gt;&lt;/p&gt;&lt;p class="p0"&gt;经过测试，应该是&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;weblogic&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;自身提供的驱动版本问题。&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;解决方案如下：&lt;/p&gt;&lt;p class="p0"&gt;1.&amp;nbsp;将&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;db2&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;安装目录下的驱动&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;copy&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;到目录：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;%WL_HOME%\server\lib\&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;2.&amp;nbsp;修改&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;%WL_HOME%\&lt;/span&gt;common\bin下的&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;commEnv.cmd&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;文件，在&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;WEBLOGIC_CLASSPATH&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;变量中增加内容：&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;%WL_HOME%\server\lib\db2jcc.jar;%WL_HOME%\server\lib\db2jcc_license_cu.jar;&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;3.&amp;nbsp;修改&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;%WL_HOME%\server\lib\jdbcdrivers.xml&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;文件，将&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;&amp;lt;!--&amp;nbsp;Need&amp;nbsp;db2jcc.jar&amp;nbsp;in&amp;nbsp;CLASSPATH&amp;nbsp;for&amp;nbsp;DB2&amp;nbsp;--&amp;gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;后对&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;&amp;lt;Driver&amp;nbsp;Database="DB2"&amp;nbsp;.....&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的驱动配置的注释去掉&lt;/span&gt;&lt;/p&gt;&lt;p class="p0"&gt;4. 在&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;WebLogic&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;中配置使用以上&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: Times New Roman;"&gt;driver&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;的数据源&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/jingtao/aggbug/1981195.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jingtao/archive/2011/03/11/1981195.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jingtao/archive/2010/12/16/1908450.html</id><title type="text">Java下载中文乱码问题解决方法</title><summary type="text">问题描述：Java应用下载文件功能，输出文件名中的中文乱码 测试环境：tomcat，websphere6.1 方法一： response.setContentType("application/x-download"); fileName = URLDecoder.decode(fileName, "utf-8"); fileName= java.net.URLEncoder.encode(fileName,"utf-8"); response.setHeader("Content-Disposition", "attachment; filename=\""+ new String((fil</summary><published>2010-12-16T09:47:00Z</published><updated>2010-12-16T09:47:00Z</updated><author><name>镜涛</name><uri>http://www.cnblogs.com/jingtao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jingtao/archive/2010/12/16/1908450.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jingtao/archive/2010/12/16/1908450.html"/><content type="html">&lt;p&gt;&lt;span style="color: black; font-family: 微软雅黑; font-size: 12pt;"&gt;问题描述：Java应用下载文件功能，输出文件名中的中文乱码 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: 微软雅黑; font-size: 12pt;"&gt;测试环境：tomcat，websphere6.1 &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: 微软雅黑; font-size: 12pt;"&gt;方法一： &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;response.&lt;span style="text-decoration: underline;"&gt;setContentType&lt;/span&gt;(&lt;span style="color: #2a00ff;"&gt;"application/x-download"&lt;span style="color: black;"&gt;);&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;fileName = URLDecoder.&lt;em&gt;decode&lt;/em&gt;(fileName, &lt;span style="color: #2a00ff;"&gt;"utf-8"&lt;span style="color: black;"&gt;);&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;fileName= java.net.URLEncoder.&lt;em&gt;encode&lt;/em&gt;(fileName,&lt;span style="color: #2a00ff;"&gt;"utf-8"&lt;span style="color: black;"&gt;);&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;response.setHeader(&lt;span style="color: #2a00ff;"&gt;"Content-Disposition"&lt;span style="color: black;"&gt;, &lt;span style="color: #2a00ff;"&gt;"attachment; filename=\""&lt;span style="color: black;"&gt;+ &lt;span style="color: #7f0055;"&gt;&lt;strong&gt;new&lt;/strong&gt;&lt;span style="color: black;"&gt; String((fileName + &lt;span style="color: #2a00ff;"&gt;".zip"&lt;span style="color: black;"&gt;).getBytes(),&lt;span style="color: #2a00ff;"&gt;"UTF-8"&lt;span style="color: black;"&gt;) +&lt;span style="color: #2a00ff;"&gt;"\""&lt;span style="color: black;"&gt;); &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: 微软雅黑; font-size: 12pt;"&gt;方法二： &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;response.setHeader(&lt;span style="color: #2a00ff;"&gt;"Content-Disposition"&lt;span style="color: black;"&gt;, &lt;span style="color: #2a00ff;"&gt;"attachment;filename="&lt;span style="color: black;"&gt; + &lt;em&gt;toUtf8String&lt;/em&gt;(&lt;span style="text-decoration: underline;"&gt;filename&lt;/span&gt;));&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Courier New; font-size: 12pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #7f0055; font-family: Courier New; font-size: 12pt;"&gt;&lt;strong&gt;public&lt;/strong&gt;&lt;span style="color: black;"&gt; &lt;span style="color: #7f0055;"&gt;&lt;strong&gt;static&lt;/strong&gt;&lt;span style="color: black;"&gt; String toUtf8String(String s) {&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuffer sb = &lt;span style="color: #7f0055;"&gt;&lt;strong&gt;new&lt;/strong&gt;&lt;span style="color: black;"&gt; StringBuffer();&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #7f0055;"&gt;&lt;strong&gt;for&lt;/strong&gt;&lt;span style="color: black;"&gt; (&lt;span style="color: #7f0055;"&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;span style="color: black;"&gt; i=0;i&amp;lt;s.length();i++) {&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #7f0055;"&gt;&lt;strong&gt;char&lt;/strong&gt;&lt;span style="color: black;"&gt; c = s.charAt(i);&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #7f0055;"&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;span style="color: black;"&gt; (c &amp;gt;= 0 &amp;amp;&amp;amp; c &amp;lt;= 255) {&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Courier New; font-size: 12pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append(c);&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: #7f0055;"&gt;&lt;strong&gt;else&lt;/strong&gt;&lt;span style="color: black;"&gt; {&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #7f0055;"&gt;&lt;strong&gt;byte&lt;/strong&gt;&lt;span style="color: black;"&gt;[] b;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #7f0055;"&gt;&lt;strong&gt;try&lt;/strong&gt;&lt;span style="color: black;"&gt; {&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b = Character.&lt;em&gt;toString&lt;/em&gt;(c).getBytes(&lt;span style="color: #2a00ff;"&gt;"utf-8"&lt;span style="color: black;"&gt;);&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;span style="color: #7f0055;"&gt;&lt;strong&gt;catch&lt;/strong&gt;&lt;span style="color: black;"&gt; (Exception ex) {&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Courier New; font-size: 12pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="text-decoration: underline;"&gt;log&lt;/span&gt;.error(ex);&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b = &lt;span style="color: #7f0055;"&gt;&lt;strong&gt;new&lt;/strong&gt;&lt;span style="color: black;"&gt; &lt;span style="color: #7f0055;"&gt;&lt;strong&gt;byte&lt;/strong&gt;&lt;span style="color: black;"&gt;[0];&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Courier New; font-size: 12pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #7f0055;"&gt;&lt;strong&gt;for&lt;/strong&gt;&lt;span style="color: black;"&gt; (&lt;span style="color: #7f0055;"&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;span style="color: black;"&gt; j = 0; j &amp;lt; b.&lt;span style="color: #0000c0;"&gt;length&lt;span style="color: black;"&gt;; j++) {&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #7f0055;"&gt;&lt;strong&gt;int&lt;/strong&gt;&lt;span style="color: black;"&gt; k = b[j];&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #7f0055;"&gt;&lt;strong&gt;if&lt;/strong&gt;&lt;span style="color: black;"&gt; (k &amp;lt; 0) k += 256;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;sb.append(&lt;span style="color: #2a00ff;"&gt;"%"&lt;span style="color: black;"&gt; + Integer.&lt;em&gt;toHexString&lt;/em&gt;(k).toUpperCase());&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Courier New; font-size: 12pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Courier New; font-size: 12pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: Courier New; font-size: 12pt;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #7f0055;"&gt;&lt;strong&gt;return&lt;/strong&gt;&lt;span style="color: black;"&gt; sb.toString();&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: black; font-family: Courier New; font-size: 12pt;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jingtao/aggbug/1908450.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jingtao/archive/2010/12/16/1908450.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jingtao/archive/2010/12/06/1898189.html</id><title type="text">获取矩形中心点与矩形外某点连线和矩形交点的算法</title><summary type="text">图形化广泛应用于各种系统中，包括ESB的适配，业务流程的建模，工作流程的定制，数据交换系统的配置等等，这其中不可避免的需要用到各种图形符号来直观、清晰的表达抽象的内容。一般来说，我们会通过标准的图形来表述特定的含义，达到交流的目的，而图形间信息导向一般都是通过线来完成的，一个好的画线算法，不仅能够让业务或者配置图更加美观，也更能清晰的向受众表述业务或者配置内容。本文实现了一个获取矩形中心点与矩形外某点连线与矩形交点的算法。实现语言为ActionScript。[代码]</summary><published>2010-12-06T14:02:00Z</published><updated>2010-12-06T14:02:00Z</updated><author><name>镜涛</name><uri>http://www.cnblogs.com/jingtao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jingtao/archive/2010/12/06/1898189.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jingtao/archive/2010/12/06/1898189.html"/><content type="html">&lt;p&gt;图形化广泛应用于各种系统中，包括ESB的适配，业务流程的建模，工作流程的定制，数据交换系统的配置等等，这其中不可避免的需要用到各种图形符号来直观、清晰的表达抽象的内容。一般来说，我们会通过标准的图形来表述特定的含义，达到交流的目的，而图形间信息导向一般都是通过线来完成的，一个好的画线算法，不仅能够让业务或者配置图更加美观，也更能清晰的向受众表述业务或者配置内容。&lt;/p&gt;&lt;p&gt;本文实现了一个获取矩形中心点与矩形外某点连线与矩形交点的算法。实现语言为ActionScript。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt;  1&lt;/span&gt; &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;*&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt; &lt;span style="color: #008000;"&gt;         * 获得一个矩形中心点到矩形外某点之间的连线与矩形的交点&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt; &lt;span style="color: #008000;"&gt;         * 算法思路：&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt; &lt;span style="color: #008000;"&gt;         * 以矩形外的某点为坐标原点，将图形分为四个象限，每个象限分两种情况，坐标轴上单独处理&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt; &lt;span style="color: #008000;"&gt;         * 1.坐标轴的情况：&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  6&lt;/span&gt; &lt;span style="color: #008000;"&gt;         *     1.负x轴的情况&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  7&lt;/span&gt; &lt;span style="color: #008000;"&gt;         *     2.正x轴的情况&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  8&lt;/span&gt; &lt;span style="color: #008000;"&gt;         *     3.正y轴的情况&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  9&lt;/span&gt; &lt;span style="color: #008000;"&gt;         *     4.负y轴的情况&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 10&lt;/span&gt; &lt;span style="color: #008000;"&gt;         * 2.象限情况：&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 11&lt;/span&gt; &lt;span style="color: #008000;"&gt;         *     2.1.第一象限：连线与矩形左边相交的情况；与矩形下边相交的情况&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt; &lt;span style="color: #008000;"&gt;         *    2.2.第二象限：连线与矩形右边相交的情况；与矩形下边相交的情况&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt; &lt;span style="color: #008000;"&gt;         *     2.3.第三象限：连线与矩形右边相交的情况；与矩形上边相交的情况&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt; &lt;span style="color: #008000;"&gt;         *     2.4.第四象限：连线与矩形左边相交的情况；与矩形上边相交的情况&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt; &lt;span style="color: #008000;"&gt;         * &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt; &lt;span style="color: #008000;"&gt;         * &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt; &lt;span style="color: #000000;"&gt;        private &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; getIntersectPoint(fromNode:Rectangle,endPoint:Point):Point&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;开始矩形的x坐标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; x1:Number&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.x;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;开始矩形的y坐标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt; &lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; y1:Number&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.y;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结束点的x坐标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; x2:Number&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;endPoint.x;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;结束点的y坐标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; y2:Number&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;endPoint.y;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;开始矩形的中心点x坐标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; fromCenterX:Number&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;x1&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.width&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;2;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;开始矩形的中心点的y坐标&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; fromCenterY:Number&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;y1&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.height&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;2;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;矩形和点之间的x坐标相对距离&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; dx:Number&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;Math.abs(x1&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;x2);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;矩形和点之间的y坐标相对距离&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; dy:Number&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;Math.abs(y1&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;y2);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;相对距离的正切值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; tanDYX:Number&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;dy&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;dx;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;开始矩形的正切值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; fromDYX:Number&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.height&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.width;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; returnPoint:Point&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;负x轴&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(y1&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;y2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;x1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;x2)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt; &lt;span style="color: #000000;"&gt;                returnPoint&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(x1&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.width,fromCenterY);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;正x轴&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(y1&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;y2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;x1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;x2)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt; &lt;span style="color: #000000;"&gt;                returnPoint&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(x1,fromCenterY);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;正y轴&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x1&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;x2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;y1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;y2)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt; &lt;span style="color: #000000;"&gt;                returnPoint&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(fromCenterX,y1&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.height);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;负y轴&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x1&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;x2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;y1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;y2)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt; &lt;span style="color: #000000;"&gt;                returnPoint&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(fromCenterX,y1);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;第一象限&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;x2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;y1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;y2)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(fromDYX&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;tanDYX)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    returnPoint&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(x1,fromCenterY&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;tanDYX&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.width&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;2);&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    returnPoint&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(fromCenterX&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;dx&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;dy*fromNode.height&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;,y1&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.height);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;第二象限&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;x2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;y1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;y2)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(fromDYX&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;tanDYX)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    returnPoint&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(x1&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.width,fromCenterY&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;tanDYX&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.width&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;2);&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    returnPoint&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(fromCenterX&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;dx&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;dy*fromNode.height&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;,y1&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.height);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;第三象限&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;x2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;y1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;y2)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(fromDYX&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;tanDYX)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    returnPoint&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(x1&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.width,fromCenterY&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;tanDYX&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.width&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;2);&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    returnPoint&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(fromCenterX&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.height&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;2*dx&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;dy,y1);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;第四象限&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(x1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;x2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;y1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;y2)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt; &lt;span style="color: #000000;"&gt;            {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(fromDYX&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;tanDYX)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;104&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;105&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    returnPoint&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(x1,fromCenterY&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.width&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;2*tanDYX);&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;106&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;107&lt;/span&gt; &lt;span style="color: #000000;"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;108&lt;/span&gt; &lt;span style="color: #000000;"&gt;                {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;109&lt;/span&gt; &lt;span style="color: #000000;"&gt;                    returnPoint&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Point(fromCenterX&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;fromNode.height&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;2*dx&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;dy,y1);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;110&lt;/span&gt; &lt;span style="color: #000000;"&gt;                }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;111&lt;/span&gt; &lt;span style="color: #000000;"&gt;            }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;112&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; returnPoint;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;113&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;114&lt;/span&gt; &lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jingtao/aggbug/1898189.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jingtao/archive/2010/12/06/1898189.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
