﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-内蒙古java团队-文章分类-MapGuide</title><link>http://www.blogjava.net/gdws/category/48324.html</link><description>j2se,j2ee开发组</description><language>zh-cn</language><lastBuildDate>Thu, 14 Apr 2011 19:50:11 GMT</lastBuildDate><pubDate>Thu, 14 Apr 2011 19:50:11 GMT</pubDate><ttl>60</ttl><item><title>MapGuide服务器源码分析</title><link>http://www.blogjava.net/gdws/articles/348330.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 14 Apr 2011 16:25:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/348330.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/348330.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/348330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/348330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/348330.html</trackback:ping><description><![CDATA[
		<span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">
				<span class="Apple-style-span" style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left">
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">同样，在介绍MapGuide 服务器如何处理枚举资源操作之前，让我们首先来看看MapGuide 服务器用于处理服务请求和操作的类，图19‑9显示服务请求处理器类的类图，图19‑10显示了操作处理器类的类图。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image002_2_633969065346227500.gif">
										<img title="clip_image002" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="311" alt="clip_image002" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image002_thumb_633969065442477500.gif" width="525" border="0" />
								</a>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247889725">图<span class="Apple-converted-space"> </span></a>19‑10 服务请求处理器类的类图</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image004_2_633969065447946250.gif">
										<img title="clip_image004" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="739" alt="clip_image004" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image004_thumb_633969065483415000.gif" width="509" border="0" />
								</a>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247889912">图<span class="Apple-converted-space"> </span></a>19‑11 操作处理器类的类图</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MapGuide提供了资源服务、要素服务等多种服务，每种服务包含了大量操作。MapGuide为每种服务提供了一个服务请求处理器类，用于处理这些服务所提供的操作，例如MgResourceServiceHandler、MgFeatureServiceHanlder等。这些类都继承自IMgServiceHandler，并且实现了方法IMgServiceHandler::ProcessOperation(...)。MapGuide使用工厂类MgServiceHanlderFactory来创建一个服务请求处理器类的实例，给定一个服务ID，调用方法MgServiceHandlerFactory::GetHandler(...)可以创建对应的服务请求处理器类的实例。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">对于服务中的每种操作，MapGuide也提供了相应的操作处理器类。从图19‑10可以看到，操作处理器类分为四个层次，最高一层是类IMgOperationHandler，它是所有操作处理类的基类，第二层是类MgServiceOperation，第三层是类Mg<strong><em style="FONT-STYLE: italic">XXX</em></strong>Operation，“XXX”代表服务名称，在这一层每种类型的服务都有一个对应的类，例如MgFeatureOperation、MgResourceOperation等，第四层为真正负责工作的操作处理器类，每种服务中的每个操作都有一个对应的操作处理器类，某种服务中操作处理器类都继承自同一个父类，例如MgEnumerateResource、MgSetResource都继承自MgResourceOperation。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">接下来让我们看看MapGuide服务器如何处理枚举资源操作，这个操作流程的时序图如图 19‑11所示。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image006_2_633969065487946250.gif">
										<img title="clip_image006" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="441" alt="clip_image006" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image006_thumb_633969065494196250.gif" width="566" border="0" />
								</a>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247977543">图<span class="Apple-converted-space"> </span></a>19‑12 MapGuide服务器处理枚举资源操作的时序图</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">1） 在线程池中找一个空闲的线程执行操作</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MapGuide服务器使用了多线程和线程池的技术来提高操作处理和响应请求的性能。在MapGuide服务器启动时，会创建一个操作请求队列和一个用于处理操作请求的线程池。当一个操作请求进入操作队列，MapGuide服务器会在线程池中找一个空闲的线程执行操作。如果没有空闲的线程，那么这个操作请求会处于等待状态，直到线程池中有了空闲的线程。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">首先，让我们查看一下服务器的入口函数的源代码，看看服务器是如何启动的。MapGuide服务器可以像普通的应用程序一样运行，还可以在Windows操作系统可以运行为Windows服务，在Linux操作系统运行为守护进程，下面的代码中只保留了运行为普通应用程序部分的代码。</p>
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td valign="top" width="576">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">typedef ACE_Singleton SERVER;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">int ACE_TMAIN(int argc, ACE_TCHAR *argv[])</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">int nResult = 0;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 初始化ACE服务</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE::init();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 根据命令行参数执行响应的操作</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if((ACE_OS::strcasecmp(parameter, ACE_TEXT("?")) == 0) ||</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">(ACE_OS::strcasecmp(parameter,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MG_WCHAR_TO_TCHAR(MgResources::ServerCmdHelp)) == 0))</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 显示服务器命令行参数</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ShowCommandlineHelp();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">else if((ACE_OS::strcasecmp(parameter,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MG_WCHAR_TO_TCHAR(MgResources::ServerCmdRun)) == 0) ||</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">(ACE_OS::strcasecmp(parameter,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MG_WCHAR_TO_TCHAR(MgResources::ServerCmdInteractive)) == 0))</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE_OS::printf(MG_WCHAR_TO_CHAR(MgResources::ServerCmdRunInfo));</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 以普通应用程序的方式运行服务器</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">nResult = SERVER::instance()-&gt;init(argc, argv);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(0 == nResult)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 启动服务</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">nResult = SERVER::instance()-&gt;open();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 终止服务</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">SERVER::instance()-&gt;fini();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 终止ACE服务</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE::fini();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return nResult;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
												</td>
										</tr>
								</tbody>
						</table>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">在上面的代码中，我们可以看到大量以“ACE”为前缀的类，这些类是ACE自适配通信环境（Adaptive Communication Environment）工具包中的类。ACE是一个开源的工具包，它实现了许多用于并发通信软件的核心模式。ACE的目标用户是在UNIX和Win32平台上开发高性能通信服务和应用的开发者。ACE简化了使用进程间通信、事件多路分离、显式动态链接和并发的OO网络应用和服务的开发。ACE提供了一组丰富的可复用C++ Wrapper Facade（包装外观）和框架组件，可跨越多种平台完成通用的通信软件任务，其中包括：事件多路分离和事件处理器分派、信号处理、服务初始化、进程间通信、共享内存管理、消息路由、分布式服务动态（重）配置、并发执行和同步等。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">类MgServer继承自AEC工具包中的类ACE_NT_Service或ACE_Service_Object，对应于服务器的主线程，图19‑12显示了服务器主线程类的类图。MgServer::svc()是主线程的入口，调用方法MgServer::open()会启动主线程并且执行方法MgServer::svc()，调用MgServer::fini()会终止主线程。MapGuide使用了Singleton模板ACE_Singleton将MgServer封装为一个单实例类，为了方便使用MapGuide使用typedef为ACE_Singleton定义了一个别名SERVER，调用方法SERVER::instance()可以创建类MgServer的一个实例。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image008_2_633969065497165000.gif">
										<img title="clip_image008" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="194" alt="clip_image008" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image008_thumb_633969065502321250.gif" width="255" border="0" />
								</a>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref248070447">图<span class="Apple-converted-space"> </span></a>19‑13 服务器主线程类的类图</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgServer::svc()是主线程的入口，该方法会创建一个操作请求队列和一个用于处理操作请求的线程池，它的代码如下所示。事实上，该方法还定义了其它类型的队列和线程池，为了便于理解我们省略掉了这些代码。</p>
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td valign="top" width="576">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">int MgServer::svc()</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgServerManager* pServerManager = MgServerManager::GetInstance();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 创建线程管理器和操作线程</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE_Thread_Manager threadManager;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgOperationThread clientThreads(threadManager,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pServerManager-&gt;GetClientThreads());</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pServerManager-&gt;SetClientMessageQueue(clientThreads.msg_queue_);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgClientAcceptor clientAcceptor(clientAddr, ACE_Reactor::instance(),</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">clientThreads.msg_queue_);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">nResult = clientAcceptor.Initialize();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(nResult == 0)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 启动线程池</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">nResult = clientThreads.Activate();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(nResult == 0)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 通知操作线程停止执行</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE_Message_Block* mb = new ACE_Message_Block(4);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(mb)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">mb-&gt;msg_type(ACE_Message_Block::MB_STOP);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">clientThreads.putq(mb);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 停止操作线程</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">clientThreads.close();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 等待所有操作线程执行完成</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">threadManager.wait();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">threadManager.close();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return nResult;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
												</td>
										</tr>
								</tbody>
						</table>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">上面的代码中创建一个类MgOperationThread的实例，该对象创建了一个线程池，维护了一个操作请求队列。类MgOperationThread 继承自ACE工具包中的模板类AEC_Task，对应于操作线程，图19‑13显示了操作线程类的类图。ACE_Task封装了任务，每个任务都含有一或多个线程，以及一个底层消息队列。方法ACE_Task::svc()是线程的启动入口，调用方法ACE_Task::open()用于初始化任务，调用方法ACE_Task::close()用于终止任务，调用方法ACE_Task::activate()用于启动线程，调用方法ACE_Task::putq()放置消息到任务的消息队列中，调用方法ACE_Task::getq()从任务的消息队列中取出消息。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image010_2_633969065506227500.gif">
										<img title="clip_image010" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="321" alt="clip_image010" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image010_thumb_633969065600446250.gif" width="499" border="0" />
								</a>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref248076833">图<span class="Apple-converted-space"> </span></a>19‑14 操作线程类的类图</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">方法MgOperationThread::svc()是操作线程的入口，它的代码如下所示。</p>
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td valign="top" width="576">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">int MgOperationThread::svc()</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">INT32 nResult = 0;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">while (m_bActive)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE_Message_Block* messageBlock = NULL;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 从消息队列中取出消息</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">while (getq(messageBlock) == -1)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(messageBlock-&gt;msg_type() == ACE_Message_Block::MB_STOP)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">m_bActive = false;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ACE_Message_Block* mb = new ACE_Message_Block(4);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(mb)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">mb-&gt;msg_type(ACE_Message_Block::MB_STOP);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">putq(mb);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">else if(messageBlock-&gt;msg_type() ==<span class="Apple-converted-space"> </span><a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="OLE_LINK53"></a><a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="OLE_LINK52">ACE_Message_Block::MB_DATA</a>)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgServerStreamData* pData =</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">dynamic_cast(messageBlock-&gt;data_block());</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus stat =<span class="Apple-converted-space"> </span><strong><em style="FONT-STYLE: italic">ProcessMessage(messageBlock);</em></strong></p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return nResult;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus MgOperationThread::ProcessMessage(ACE_Message_Block* pMB)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus stat = IMgServiceHandler::mpsError;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgServerStreamData* pData = NULL;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pData = (MgServerStreamData*) pMB-&gt;data_block();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgStreamParser::ParseStreamHeader(pData);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgStreamParser::ParseDataHeader(pData);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgPacketParser::MgPacketHeader pt = MgPacketParser::GetPacketHeader(pData);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">switch ( pt )</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">case (MgPacketParser::mphOperation):</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
																<strong>
																		<em style="FONT-STYLE: italic">stat = ProcessOperation( pData );</em>
																</strong>
														</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">break;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return stat;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
												</td>
										</tr>
								</tbody>
						</table>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">从上面的代码可以看到，方法MgOperationThread::svc()会调用方法getq(…)循环访问消息队列，取出等待处理的消息。如果是数据类型的消息，那么调用方法MgOperationThread:: ProcessMessage(...)处理这个消息。方法MgOperationThread::ProcessMessage(...)会解析这个消息的头和数据，如果消息数据中包含了一个操作请求，那么调用方法MgOperationThread:: ProcessOperation(…)处理这个操作请求。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">2） 处理服务请求</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">方法MgOperationThread::ProcessOperation(…) 首先会解析消息数据中的服务ID、操作ID、操作的版本号等信息，然后根据服务ID使用工厂类MgServiceHanlderFactory来创建一个服务请求处理器类的实例，最后调用这个服务请求处理器类的方法IMgServiceHandler:: ProcessOperation(...)处理这个服务请求。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">本节的示例中客户端发送的是一个枚举资源的操作请求，所以工厂类会创建一个MgResourceServiceHandler的实例，调用方法MgResourceServiceHandler::ProcessOperation(...)处理这个服务请求。</p>
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td valign="top" width="576">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgOperationThread::ProcessOperation(MgServerStreamData* pData)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus stat = IMgServiceHandler::mpsError;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgOperationPacket op;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgStreamHelper* pHelper = NULL;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pHelper = pData-&gt;GetStreamHelper();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pHelper-&gt;GetUINT32(op.m_PacketHeader);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pHelper-&gt;GetUINT32(op.m_PacketVersion);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pHelper-&gt;GetUINT32(op.m_ServiceID);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pHelper-&gt;GetUINT32(op.m_OperationID);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pHelper-&gt;GetUINT32(op.m_OperationVersion);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler* pServiceHandler =</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgServiceHandlerFactory::Instance()-&gt;GetHandler(op.m_ServiceID, pData, op);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">delete pServiceHandler;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">pServiceHandler = NULL;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
																<strong>
																		<em style="FONT-STYLE: italic">stat = pServiceHandler-&gt;ProcessOperation();</em>
																</strong>
														</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return stat;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
												</td>
										</tr>
								</tbody>
						</table>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">3） 处理操作请求</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">首先，方法MgResourceServiceHandler::ProcessOperation(...)会根据操作请求的ID，调用资源操作工厂类的方法MgResourceOperationFactory::GetOperation(…)创建相应的资源服务操作类MgOpEnumerateResources的实例。然后，调用MgOpEnumerateResources:: Initialize(...)初始化枚举资源操作处理器，调用方法MgServiceManager::RequestService(…)创建服务器资源服务MgServerResourceService的实例。最后，调用方法MgOpEnumerateResources::Execute()处理操作请求，该方法会调用MgServerResourceService::EnumerateResources(…)实际执行枚举资源的功能。</p>
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td valign="top" width="576">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus MgResourceServiceHandler::ProcessOperation()</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::MgProcessStatus status = IMgServiceHandler::mpsError;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">auto_ptr handler;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MG_TRY()</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">handler.reset(MgResourceOperationFactory::GetOperation(</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">m_packet.m_OperationID, m_packet.m_OperationVersion));</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">assert(NULL != handler.get());</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">handler-&gt;Initialize(m_data, m_packet);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">handler-&gt;Execute();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">status = IMgServiceHandler::mpsDone;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MG_CATCH(L"MgResourceServiceHandler.ProcessOperation")</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if (mgException != NULL &amp;&amp; NULL != handler.get())</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">status = (handler.get()-&gt;HandleException(mgException) ?</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IMgServiceHandler::mpsDone : IMgServiceHandler::mpsError);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if (IMgServiceHandler::mpsDone != status)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MG_THROW();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return status;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">void MgOpEnumerateResources::Execute()</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">BeginExecution();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Validate();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr byteReader = m_service-&gt;EnumerateResources(resource, depth,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">type, properties, fromDate, toDate, computeChildren);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">EndExecution(byteReader);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
												</td>
										</tr>
								</tbody>
						</table>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
						</p>
				</span>
		</span>
		<br class="Apple-interchange-newline" />
<img src ="http://www.blogjava.net/gdws/aggbug/348330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2011-04-15 00:25 <a href="http://www.blogjava.net/gdws/articles/348330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapGuide源码分析【</title><link>http://www.blogjava.net/gdws/articles/348329.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 14 Apr 2011 16:24:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/348329.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/348329.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/348329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/348329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/348329.html</trackback:ping><description><![CDATA[
		<span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">
				<span class="Apple-style-span" style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left">
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">本节中，我们将通过介绍如何完成枚举资源功能来介绍MapGuide Web扩展的部分源代码。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">在浏览器端的地址栏输入类似如下字符串，就会发送一个枚举资源的HTTP请求。</p>
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td valign="top" width="576">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">http://hostname/mapGuide/mapagent.fcig?OPERATION=EnumerateResources&amp;VERSION=1.0.0&amp; RESOURCEID=Library:// &amp;TYPE=FeatureSource&amp;DEPTH=3</p>
												</td>
										</tr>
								</tbody>
						</table>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">下面我们来看看MapGuide Web扩展如何处理这个请求。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">在介绍MapGuide Web扩展如何处理枚举资源HTTP请求之前，让我们首先来看看MapGuide Web扩展用于处理HTTP请求和响应的类，这些类的类图如图19‑4所示。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image002_2_633962217361483308.gif">
										<img title="clip_image002" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="165" alt="clip_image002" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image002_thumb_633962217367264558.gif" width="506" border="0" />
								</a>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">图 19‑5 HTTP请求和响应类的类图</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">类MgHttpRequest和类MgHttpResponse分别是对HTTP请求和响应结果的抽象，这两个类可以用于任何类型的Web应用服务器，也就是说它们的代码不依赖于任何Web应用服务器API。在文件夹“\MgDev\Web\src\HttpHandler”下可以找到所有前缀为“MgHttp”类的源代码。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">类MgHttpRequest用于处理HTTP请求，它包含了一个HTTP请求头MgHttpHeader的实例、一个HTTP请求参数HttpRequestParam的实例和一个HTTP请求元数据HttpRequestMetadata的实例。调用方法MgHttpRequest::Execute()会将HTTP请求转发给MapGuide服务器，当MapGuide服务器处理完这个请求，将请求结果返回给Web扩展之后，这个方法会返回一个MgHttpResponse对象，它表示HTTP请求的响应结果。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">接下来让我们看看MapGuide Web扩展如何处理<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="OLE_LINK51"></a><a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="OLE_LINK42">枚举资源</a>的HTTP请求。大多数MapGuide用户都是使用IIS作为Web应用服务器，并且使用Web扩展模块isapi_MapAgent.dll来处理HTTP请求，所以本节侧重于isapi_MapAgent.dll模块处理HTTP请求的流程，这个处理流程的时序图如图19‑5所示。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image004_2.gif">
										<img title="clip_image004" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="496" alt="clip_image004" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image004_thumb.gif" width="567" border="0" />
								</a>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247802663">图<span class="Apple-converted-space"> </span></a>19‑6 Web扩展处理枚举资源请求的时序图</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">1） 加载Web应用服务器扩展模块</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">如果使用的是IIS Web应用服务，那么在接收到后缀为“fcgi”的HTTP请求后，IIS会加载Web应用服务器扩展模块isapi_MapAgent.dll或MapAgent.exe。其中，isapi_MapAgent.dll基于IIS API，具有更好的性能；MapAgent.exe基于CGI技术，性能要稍微差一些。如果使用的是Apache Web应用服务器，那么在Windows平台上Apache会加载Web应用服务器扩展模块MapAgent.exe，在Linux平台上会加载模块mod_mgmapagent.so。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">这三个Web服务器扩展模块实现了类似的功能，它们的源代码位置如表19‑2所示。</p>
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td valign="top" width="168">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
																<strong>服务器扩展模块</strong>
																<strong>
																</strong>
														</p>
												</td>
												<td valign="top" width="274">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
																<strong>源代码位置</strong>
																<strong>
																</strong>
														</p>
												</td>
										</tr>
										<tr>
												<td valign="top" width="168">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">isapi_MapAgent.dll</p>
												</td>
												<td valign="top" width="274">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">\Web\src\IsapiAgent</p>
												</td>
										</tr>
										<tr>
												<td valign="top" width="168">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MapAgent.exe</p>
												</td>
												<td valign="top" width="274">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">\Web\src\CgiAgent</p>
												</td>
										</tr>
										<tr>
												<td valign="top" width="168">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">mod_mgmapagent.so</p>
												</td>
												<td valign="top" width="274">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">\Web\src\ApacheAgent</p>
												</td>
										</tr>
								</tbody>
						</table>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247813607">表<span class="Apple-converted-space"> </span></a>19‑2 Web服务器扩展模块的源代码位置</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">从图19‑6中可以看到这三个Web服务器扩展模块提供了类似的类，这些类提供了相同的接口，类<strong><em style="FONT-STYLE: italic">XXX</em></strong>PostParser用于解析HTTP请求中传入的参数及参数值，类<strong><em style="FONT-STYLE: italic">XXX</em></strong>ResponseHandler用于将HTTP请求的响应结果发送给客户端。其中，“<strong><em style="FONT-STYLE: italic">XXX</em></strong>”表示“Cgi”、“Isapi”或“Apache”。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image006_2.gif">
										<img title="clip_image006" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="219" alt="clip_image006" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image006_thumb.gif" width="539" border="0" />
								</a>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247812702">图<span class="Apple-converted-space"> </span></a>19‑7 Web扩展的请求处理模块</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">对于模块isapi_MapAgent.dll，每个“fcgi”类型的HTTP请求会调用此模块中的方法HttpExtensionProc，这个方法的代码如下所示，为了便于理解我们只保留了一些核心代码。</p>
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td valign="top" width="576">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Initialize(pECB);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 调用GetServerVariable读取诸如服务器名称、端口号等服务器变量信息</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 创建MgHttpRequest的实例，用于处理HTTP请求</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr request = new MgHttpRequest(wUrl);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 解析HTTP请求中的参数，并且将这些参数置入MgHttpRequest对象中</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr params = request-&gt;GetRequestParam();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IsapiPostParser postParser(pECB);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">postParser.Parse(params);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 创建IsapiResponseHandler的实例，用于将响应请求返回给客户端</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">IsapiResponseHandler responseHandler(pECB);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 将HTTP请求转发给MapGuide服务器，当MapGuide服务器处理完这个请求，</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 将请求结果返回给Web扩展之后，这个方法会返回一个MgHttpResponse对象，</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 它表示HTTP请求的响应结果。</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr response = request-&gt;Execute();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 将响应结果返回给客户端</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">responseHandler.SendResponse(response);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
												</td>
										</tr>
								</tbody>
						</table>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">2） 创建MgHttpRequest的实例，用于处理HTTP请求</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">在加载Web应用服务器扩展模块后，需要创建一个MgHttpRequest的实例用于处理HTTP请求。类MgHttpRequest并不关联与任何类型的Web应用服务器，所以Web应用服务器扩展模块会使用类<strong><em style="FONT-STYLE: italic">XXX</em></strong>PostParser解析HTTP请求中传入的参数及参数值，将这些参数设置到MgHttpRequest对象中。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">3） 调用方法MgHttpRequest::Execute()处理HTTP请求</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">方法MgHttpRequest::Execute()的源代码如下所示。为了便于理解，我们同样只保留了一些核心代码。</p>
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td valign="top" width="576">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgHttpResponse* MgHttpRequest::Execute()</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr hResponse;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr result;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 创建MgHttpResponse对象，用于返回HTTP请求响应结果</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">hResponse = new MgHttpResponse();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">result = hResponse-&gt;GetResult();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 获得HTTP请求中参数“OPERATION”的值</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">STRING sParamValue = m_requestParam-&gt;GetParameterValue(MgHttpResourceStrings::reqOperation);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 根据参数“OPERATION”的值取得对应操作的请求响应处理器</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr rrHandler =</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">CreateRequestResponseHandler(sParamValue, result);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">.......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 处理HTTP请求</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">if(rrHandler != NULL) rrHandler-&gt;Execute(*hResponse);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 返回响应结果</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return SAFE_ADDREF((MgHttpResponse*)hResponse);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
												</td>
										</tr>
								</tbody>
						</table>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">每个HTTP请求中包含一个参数“OPERATION”，它用于代表操作的类型。对于不同的操作，MapGuide定义了不同的请求响应处理器类，这个类会调用MapGuide服务中对应的方法处理这个操作，这些请求响应处理器类的类图如图19‑7所示。从图19‑7可以看到，所有请求响应处理器类都继承自类MgHttpRequestResponseHandler，每一种操作都有一个对应的子类，例如枚举资源操作使用了类MgHttpEnumerateResources，描述模式操作使用了类MgHttpDescribeSchema。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image008_2.gif">
										<img title="clip_image008" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="301" alt="clip_image008" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image008_thumb.gif" width="521" border="0" />
								</a>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247863319">图<span class="Apple-converted-space"> </span></a>19‑8 HTTP请求响应处理器的类图</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MapGuide定义了一个全局map对象用于存放每种操作对应的请求响应处理器类对象，它的键是操作的名称，值是请求响应处理器类对象。</p>
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td valign="top" width="576">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 定义一个全局map对象，用于存放每种操作对应的请求响应处理器类对象</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">static map</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">httpClassCreators;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">bool InitializeStaticData()</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">httpClassCreators[MgHttpResourceStrings::opGetMap] =</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgHttpGetMap::CreateObject;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">httpClassCreators[MgHttpResourceStrings::opGetMapUpdate] =</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgHttpGetMapUpdate::CreateObject;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">httpClassCreators[MgHttpResourceStrings::opGetDrawing] =</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgHttpGetDrawing::CreateObject;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">httpClassCreators[MgHttpResourceStrings::opDescribeDrawing] = MgHttpDescribeDrawing::CreateObject;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">httpClassCreators[MgHttpResourceStrings::opEnumerateResources] = MgHttpEnumerateResources::CreateObject;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
												</td>
										</tr>
								</tbody>
						</table>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">调用方法MgHttpRequest::CreateRequestResponseHandler(...)可以根据操作的名称获得对应的请求响应处理器类对象。对于枚举资源操作，它会返回一个类MgHttpEnumerateResources的对象。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">调用这些请求响应处理器类的Execute(…)方法，会创建一个代理服务类对象，然后调用代理服务中对应的方法。为什么说创建的是一个代理服务类对象呢？我想看完图19‑8之后大家会有所明白。从图19‑8中可以看到，所有的MapGuide服务有两个子类，一个是名称为MgProxy<strong><em style="FONT-STYLE: italic">XXX</em></strong>Service的代理服务类，它是MapGuide Web扩展端的一个类，另一个是名称为MgServerXXXService的服务器服务类，它是MapGuide服务器端的一个类。MgProxy<strong><em style="FONT-STYLE: italic">XXX</em></strong>Service最终会将服务请求转发给服务器端类MgServerXXXService，所以说真正处理服务请求的类是MgServerXXXService，MgProxy<strong><em style="FONT-STYLE: italic">XXX</em></strong>Service仅仅起到一个转发的作用，这也就是为什么称类MgProxy<strong><em style="FONT-STYLE: italic">XXX</em></strong>Service为代理服务类的原因。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image010_2.gif">
										<img title="clip_image010" style="BORDER-TOP-WIDTH: 0px; DISPLAY: inline; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="131" alt="clip_image010" src="http://p.blog.csdn.net/images/p_blog_csdn_net/mapguide_inside/624109/o_clip_image010_thumb.gif" width="528" border="0" />
								</a>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref247868155">图<span class="Apple-converted-space"> </span></a>19‑9 代理服务和服务器服务类的类图</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">对于枚举资源操作，MgHttpEnumerateResources::Execute(...)的源代码如下所示。调用这个方法会创建一个代理资源服务类MgProxyResourceService的对象，然后调用MgProxyResourceService::EnumerateResources(...)枚举资源，最后将操作的执行结果放入MgHttpResponse对象中。</p>
						<table cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td valign="top" width="576">
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">void MgHttpEnumerateResources::Execute(MgHttpResponse&amp; hResponse)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr hResult;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">hResult = hResponse.GetResult();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 检查HTTP请求中的参数</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ValidateCommonParameters();</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 创建MgProxyResourceService实例</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr mgprService =</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">(MgResourceService*)(CreateService(MgServiceType::ResourceService));</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">......</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 执行枚举资源操作</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Ptr byteReader = mgprService-&gt;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">EnumerateResources(&amp;mgrIdentifier, m_depth, m_type, m_computeChildren);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 如果需要，转换响应请求的格式</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">ProcessFormatConversion(byteReader);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">// 将操作结果放入响应请求中的MgHttpResult对象</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">hResult-&gt;SetResultObject(byteReader, byteReader-&gt;GetMimeType());</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgByteReader* MgProxyResourceService::EnumerateResources(</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgResourceIdentifier* resource, INT32 depth, CREFSTRING type,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">INT32 properties, CREFSTRING fromDate, CREFSTRING toDate,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">bool computeChildren)</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">{</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand cmd;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">cmd.ExecuteCommand(m_connProp,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knObject,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgResourceService::opIdEnumerateResources,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">7,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">Resource_Service,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">BUILD_VERSION(1,0,0),</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knObject, resource,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knInt32, depth,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knString, &amp;type,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knInt32, properties,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knString, &amp;fromDate,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knString, &amp;toDate,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knInt8, (int)computeChildren,</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">MgCommand::knNone);</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">SetWarning(cmd.GetWarningObject());</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">return (MgByteReader*)cmd.GetReturnValue().val.m_obj;</p>
														<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">}</p>
												</td>
										</tr>
								</tbody>
						</table>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">4） 将HTTP请求的响应结果返回给客户端</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">调用MgHttpRequest::Execute()会返回一个MgHttpResponse对象，这个对象包含了HTTP请求的响应结果。不过，还需要调用方法<strong><em style="FONT-STYLE: italic">XXX</em></strong>ResponseHandler::SendResponse(...)，这样Web应用服务器才会将这个响应结果返回给客户端。</p>
				</span>
		</span>
<img src ="http://www.blogjava.net/gdws/aggbug/348329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2011-04-15 00:24 <a href="http://www.blogjava.net/gdws/articles/348329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapGuide开源版的修改流程</title><link>http://www.blogjava.net/gdws/articles/348328.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 14 Apr 2011 16:23:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/348328.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/348328.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/348328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/348328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/348328.html</trackback:ping><description><![CDATA[
		<span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">
				<span class="Apple-style-span" style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left">
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代码的修改可以分为两大类：功能增强</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">(Ehancement)</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">和缺陷修正</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">(Defect)</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">，</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">使用</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Tickets</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">来管理和跟踪这些修改，访问</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://trac.osgeo.org/mapguide/report">
														<span style="COLOR: rgb(128,0,128); LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">http://trac.osgeo.org/mapguide/report</span>
												</a>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">可以浏览和查询活动的和已经关闭的</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Tickets</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">，对于功能增强</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">还使用了</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">进行管理。需要注意的是无论创建</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Tickets</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">还是</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">，都需要有一个</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OSGeo</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的帐户，使用</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OSGeo</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">帐户登录后才可以创建</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Tickets</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">和</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">，访问</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="https://www.osgeo.org/cgi-bin/ldap_create_user.py">
														<span style="COLOR: rgb(128,0,128); LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">https://www.osgeo.org/cgi-bin/ldap_create_user.py</span>
												</a>
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">
														<span class="Apple-converted-space"> </span>
												</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">可以注册一个</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OSGeo</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的用户。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">1）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">缺陷修正</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">如果你在使用</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的过程中发现了一个</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">，那么可以考虑创建一个</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">。在创建</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">之前，最好访问</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://trac.osgeo.org/mapguide/search">
														<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">http://trac.osgeo.org/mapguide/search</span>
												</a>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">查找是否已经有其他人提交过类似的</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">，或者给</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">mapguide-users</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">邮件列表发</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">email</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">问询是否见到过类似问题。在为一个</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">创建</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">之时，需要提供一个完整的、可以重现</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的步骤，如果可能的话最好提供一段代码用于重现</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">，最后填写</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">图</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">
												<span lang="EN-US" style="LINE-HEIGHT: 19px">18</span>
												<span lang="EN-US" style="LINE-HEIGHT: 19px">‑<span style="LINE-HEIGHT: 19px">3</span></span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">所示的</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">属性。其中，</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Priority</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代表</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的优先级，</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Component</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代表</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">所属的功能组件，</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Severity</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代表</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的严重性，</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Milestone</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代表修正了</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的版本，</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Version</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代表可以重现</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的版本。最重要的是要填写正确的</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Version</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">值，如果不清楚需要为其他属性填写什么样的值，那么可以将其他值保留为空，在其他人检阅和分配这个</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Bug</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">时会为这些属性填写合适的值。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'"> <img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="174" alt="Ticket" src="http://p.blog.csdn.net/images/p_blog_csdn_net/MapGuide_Inside/EntryImages/20091104/Ticket.JPG" width="723" /></span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify"> </p>
						<p class="MsoCaption" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref244862339">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">图<span class="Apple-converted-space"> </span></span>
								</a>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px">
														<span lang="EN-US" style="LINE-HEIGHT: 19px">
																<span style="LINE-HEIGHT: 19px">18</span>
														</span>
												</span>
												<span style="LINE-HEIGHT: 19px">
														<span lang="EN-US" style="LINE-HEIGHT: 19px">‑</span>
												</span>
												<span style="LINE-HEIGHT: 19px">
														<span lang="EN-US" style="LINE-HEIGHT: 19px">
																<span style="LINE-HEIGHT: 19px">3</span>
														</span>
												</span>
												<span lang="EN-US" style="LINE-HEIGHT: 19px">
														<span class="Apple-converted-space"> </span>Ticket</span>的属性</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">2）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">功能增强</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">如果要改进</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">现有的功能，或者添加一些新的功能，那么需要创建一个</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">。访问</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://trac.osgeo.org/mapguide/wiki/MapGuideRfcs">
														<span style="COLOR: rgb(128,0,128); LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">http://trac.osgeo.org/mapguide/wiki/MapGuideRfcs</span>
												</a>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">可以浏览现有的</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">，通过这些</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">我们可以了解</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的每个版本添加了哪些功能，甚至下一个版本会添加哪些新的功能。</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">页面使用</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Wiki</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的方式进行维护，使用如下的步骤可以创建一个新的</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">1）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">点击“</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">login</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”登录。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">2）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">点击“</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Edit this page</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”编辑</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">列表页面。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">3）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">加入如下</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Wiki</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">格式的字符串。其中，“</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">XX</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”代表</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的序号，“</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">V.V</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”代表实现</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">版本号。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">||[wiki:MapGuideRfcXX MapGuide RFC XX - xxxxxxxxxxxx]||draft||V.V||</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">4）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">点击“</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Submit changes</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”按钮提交修改。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">5）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">点击超链接“</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide RFC XX</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”会出现一个新的页面用于创建新的</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">6）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">在按照</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">模板的格式创建完成新的</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">之后，发</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">email</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">给</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">邮件列表</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="mailto:mapguide-internals@lists.osgeo.org">
														<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">mapguide-internals@lists.osgeo.org</span>
												</a>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">要求</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">开源社区的人们评阅此</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">7）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">在</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">发布一周后，并且解答了</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">开源社区人们的所有问题之后，可以要求</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">PSC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的成员对此</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">投票。如果由多于两个</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">PSC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">成员同意此</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">，没有任何</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">PSC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">成员反对此</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">，那么此</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">就投票通过可以实现了。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">8）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">创建一个类型为“</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">enhancement</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”的</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">用于跟踪这个修改。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">在修正了一个缺陷或实现了一个</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">RFC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">之后，需要将相应的代码修改创建为一个</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">SVN Patch</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">文件，将其上传到相应的</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Ticket</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">上便于开源社区的人们评阅此修改，在评阅完成之后就可以提交代码了。如果你不是项目开发</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">人员，没有提交权限，</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">项目开发</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">人员会帮助你提交代码的。</span>
								</span>
						</p>
				</span>
		</span>
<img src ="http://www.blogjava.net/gdws/aggbug/348328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2011-04-15 00:23 <a href="http://www.blogjava.net/gdws/articles/348328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapGuide开源版的管理组织</title><link>http://www.blogjava.net/gdws/articles/348327.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 14 Apr 2011 16:22:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/348327.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/348327.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/348327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/348327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/348327.html</trackback:ping><description><![CDATA[
		<span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">
				<span class="Apple-style-span" style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left">
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">作为</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OSGeo</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的一个子项目，</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">遵守与其他</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OSGeo</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">项目的类似的管理方式，由如下四类组织和角色进行项目的开发和管理。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">1）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">项目筹划指导委员</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">会<span lang="EN-US" style="LINE-HEIGHT: 19px">(Project Steering Committee)</span></span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">项目筹划指导委员会简称为</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">PSC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">，负责</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">开源项目的管理工作，决定</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">开源版的发布日期、哪些功能和缺陷修正整合到那个发布版本、那些人可以成为项目开发人员等，而且</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">PSC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">还负责定期为</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OSGeo</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">委员会提供项目状况报告。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">2）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">项目开发</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">人员<span lang="EN-US" style="LINE-HEIGHT: 19px">(Project Developer)</span></span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">项目开发人员具有</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">源代码的读写权限，能够直接修改</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的源代码，并且负责检阅项目捐助人员的代码，帮助他们提交代码。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">3）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">项目捐助</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">人员<span lang="EN-US" style="LINE-HEIGHT: 19px">(Project Contributor)</span></span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">项目捐助人员也是</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的开发人员，但是没有</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">源代码的修改权限，他们通过项目跟踪</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">(Tracker)</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">工具为</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">贡献补丁</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">(Patch)</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">、代码、文档等，项目开发人员会检阅他们的修改，和他们进行交流，最后帮助他们提交代码。通常情况下，项目开发人员是从项目捐助人员着手做起，在项目捐助人员贡献了大量有价值的补丁</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">(Patch)</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">之后，他会被提名为项目开发人员，在</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">PSC</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">投票同意之后，他就会正式成为项目开发人员，具有了</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">代码的修改权限。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="LINE-HEIGHT: 21px">
												<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman'">
														<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">4）</span>
														<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
												</span>
										</span>
								</span>
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">用</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">户<span lang="EN-US" style="LINE-HEIGHT: 19px">(Users)</span></span>
								</span>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">    用户是</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman', serif">MapGuide</span>
								<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">的使用者，他们基于</span>
								<span lang="EN-US" style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 21px; FONT-FAMILY: 'Times New Roman', serif">MapGuide</span>
								<span style="FONT-SIZE: 10.5pt; LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">进行二次开发。</span>
						</p>
				</span>
		</span>
<img src ="http://www.blogjava.net/gdws/aggbug/348327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2011-04-15 00:22 <a href="http://www.blogjava.net/gdws/articles/348327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 编译MapGuide</title><link>http://www.blogjava.net/gdws/articles/348326.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 14 Apr 2011 16:21:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/348326.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/348326.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/348326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/348326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/348326.html</trackback:ping><description><![CDATA[
		<span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">
				<span class="Apple-style-span" style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left">
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">如果想自己编译<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>的源代码和运行<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>，那么请参考<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>开源版的文档<span lang="EN-US" style="LINE-HEIGHT: 19px"><span class="Apple-converted-space"> </span>(<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://mapguide.osgeo.org/documentation.html"><span style="COLOR: rgb(128,0,128); LINE-HEIGHT: 19px">http://mapguide.osgeo.org/documentation.html</span></a>)</span>，各个版本<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>的编译步骤基本相同，但是细节却不尽相同，所以要找到使用的源代码所对应的文档，严格按照文档中描述的步骤编译<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">因为<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>服务器和<span lang="EN-US" style="LINE-HEIGHT: 19px">Web</span>扩展是两个独立的组件，所以它们也是独立编译的。编译<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>服务器组件的基本步骤如下：</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="LINE-HEIGHT: 21px">
												<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">1）</span>
												<span style="FONT: 7pt 'Times New Roman'">
														<span class="Apple-converted-space"> </span>
												</span>
										</span>
								</span>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">编译<span lang="EN-US" style="LINE-HEIGHT: 19px">FDO</span></span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">MapGuide</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">使用了<span lang="EN-US" style="LINE-HEIGHT: 19px">FDO</span>来访问<span lang="EN-US" style="LINE-HEIGHT: 19px">GIS</span>数据，但是<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>的源代码中并没有包含<span lang="EN-US" style="LINE-HEIGHT: 19px">FDO</span>的源代码，所以需要开发人员自己下载<span lang="EN-US" style="LINE-HEIGHT: 19px">FDO</span>的源代码和编译<span lang="EN-US" style="LINE-HEIGHT: 19px">FDO</span>。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="LINE-HEIGHT: 21px">
												<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">2）</span>
												<span style="FONT: 7pt 'Times New Roman'">
														<span class="Apple-converted-space"> </span>
												</span>
										</span>
								</span>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">设置环境变量</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">需要注意的是不同版本的<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>源代码需要设置不同的环境变量，所以要注意参考对应版本的文档。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="LINE-HEIGHT: 21px">
												<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">3）</span>
												<span style="FONT: 7pt 'Times New Roman'">
														<span class="Apple-converted-space"> </span>
												</span>
										</span>
								</span>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">编译<span lang="EN-US" style="LINE-HEIGHT: 19px">CS-MAP</span></span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">从<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>开源版<span lang="EN-US" style="LINE-HEIGHT: 19px">2.1</span>之后，<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>使用<span lang="EN-US" style="LINE-HEIGHT: 19px">CS-MAP</span>替代了<span lang="EN-US" style="LINE-HEIGHT: 19px">PROJ4</span>来处理坐标系。现在<span lang="EN-US" style="LINE-HEIGHT: 19px">CS-MAP</span>也是<span lang="EN-US" style="LINE-HEIGHT: 19px">OSGeo</span>的一个开源项目，在使用<span lang="EN-US" style="LINE-HEIGHT: 19px">SVN</span>下载<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>源码的时候会自动下载<span lang="EN-US" style="LINE-HEIGHT: 19px">CS-MAP</span>的代码，不过需要用户独立编译<span lang="EN-US" style="LINE-HEIGHT: 19px">CS-MAP</span>。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="LINE-HEIGHT: 21px">
												<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">4）</span>
												<span style="FONT: 7pt 'Times New Roman'">
														<span class="Apple-converted-space"> </span>
												</span>
										</span>
								</span>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">编译<span lang="EN-US" style="LINE-HEIGHT: 19px">OEM</span></span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">OEM</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">就是<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>所依赖的第三方组件，例如<span lang="EN-US" style="LINE-HEIGHT: 19px">ACE</span>、<span lang="EN-US" style="LINE-HEIGHT: 19px">SWIG</span>、<span lang="EN-US" style="LINE-HEIGHT: 19px">DWF Toolkit</span>、<span lang="EN-US" style="LINE-HEIGHT: 19px">FDO</span>、<span lang="EN-US" style="LINE-HEIGHT: 19px">Oracle Berkeley DB XML</span>等，<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>服务器和<span lang="EN-US" style="LINE-HEIGHT: 19px">Web</span>扩展都依赖于<span lang="EN-US" style="LINE-HEIGHT: 19px">OEM</span>，所以在编译<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>服务器和<span lang="EN-US" style="LINE-HEIGHT: 19px">Web</span>扩展时都需要编译<span lang="EN-US" style="LINE-HEIGHT: 19px">OEM</span>，但是只需要编译一次。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">在<span lang="EN-US" style="LINE-HEIGHT: 19px">Windows</span>平台上，打开文件夹<span lang="EN-US" style="LINE-HEIGHT: 19px">\MgDev\Oem\</span>下的<span lang="EN-US" style="LINE-HEIGHT: 19px">Visual Studio Solution</span>文件<span lang="EN-US" style="LINE-HEIGHT: 19px">oem.sln</span>就可以编译<span lang="EN-US" style="LINE-HEIGHT: 19px">OEM</span>组件。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="LINE-HEIGHT: 21px">
												<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">5）</span>
												<span style="FONT: 7pt 'Times New Roman'">
														<span class="Apple-converted-space"> </span>
												</span>
										</span>
								</span>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">编译<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>服务器</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">这部分代码是<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>服务器真正的代码，在<span lang="EN-US" style="LINE-HEIGHT: 19px">Window</span>平台上打开文件夹<span lang="EN-US" style="LINE-HEIGHT: 19px">\MgDev\Server\</span>下的<span lang="EN-US" style="LINE-HEIGHT: 19px">Visual Studio Solution</span>文件<span lang="EN-US" style="LINE-HEIGHT: 19px">Server.sln</span>就可以编译<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>服务器。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">编译<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide Web</span>扩展的步骤如下：</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="LINE-HEIGHT: 21px">
												<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">1）</span>
												<span style="FONT: 7pt 'Times New Roman'">
														<span class="Apple-converted-space"> </span>
												</span>
										</span>
								</span>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">安装<span lang="EN-US" style="LINE-HEIGHT: 19px">JDK</span></span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">MapGuide Web</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">扩展需要安装<span lang="EN-US" style="LINE-HEIGHT: 19px">Java JDK 1.3</span>或更高的版本，如果没有安装<span lang="EN-US" style="LINE-HEIGHT: 19px">JDK</span>，请访问<span lang="EN-US" style="LINE-HEIGHT: 19px"><a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://java.sun.com/">http://java.sun.com</a></span>下载安装它。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="LINE-HEIGHT: 21px">
												<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">2）</span>
												<span style="FONT: 7pt 'Times New Roman'">
														<span class="Apple-converted-space"> </span>
												</span>
										</span>
								</span>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">设置环境变量</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">需要注意的是不同版本的<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>源代码需要设置不同的环境变量，所以要注意参考对应版本的文档。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="LINE-HEIGHT: 21px">
												<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">3）</span>
												<span style="FONT: 7pt 'Times New Roman'">
														<span class="Apple-converted-space"> </span>
												</span>
										</span>
								</span>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">编译<span lang="EN-US" style="LINE-HEIGHT: 19px">OEM</span></span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">OEM</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">组件只需要编译一次，如果在编译<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide</span>服务器时已经编译了<span lang="EN-US" style="LINE-HEIGHT: 19px">OEM</span>，那么无需重新编译。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="LINE-HEIGHT: 21px">
												<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">4）</span>
												<span style="FONT: 7pt 'Times New Roman'">
														<span class="Apple-converted-space"> </span>
												</span>
										</span>
								</span>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">编译<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide Web</span>扩展</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">这部分代码是<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide Web</span>扩展真正的代码，在<span lang="EN-US" style="LINE-HEIGHT: 19px">Window</span>平台上打开文件夹<span lang="EN-US" style="LINE-HEIGHT: 19px">\MgDev\Web\src</span>下的<span lang="EN-US" style="LINE-HEIGHT: 19px">Visual Studio Solution</span>文件<span lang="EN-US" style="LINE-HEIGHT: 19px">WebTier.sln</span>就可以编译<span lang="EN-US" style="LINE-HEIGHT: 19px">MapGuide Web</span>扩展。</span>
								</span>
						</p>
				</span>
		</span>
<img src ="http://www.blogjava.net/gdws/aggbug/348326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2011-04-15 00:21 <a href="http://www.blogjava.net/gdws/articles/348326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapGuide源代码结构</title><link>http://www.blogjava.net/gdws/articles/348325.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 14 Apr 2011 16:20:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/348325.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/348325.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/348325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/348325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/348325.html</trackback:ping><description><![CDATA[
		<span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">
				<span class="Apple-style-span" style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left">
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">源代码的目录结构如</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">表</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">
												<span lang="EN-US" style="LINE-HEIGHT: 19px">18</span>
												<span lang="EN-US" style="LINE-HEIGHT: 19px">‑<span style="LINE-HEIGHT: 19px">1</span></span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">和</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">图</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">
												<span lang="EN-US" style="LINE-HEIGHT: 19px">18</span>
												<span lang="EN-US" style="LINE-HEIGHT: 19px">‑<span style="LINE-HEIGHT: 19px">2</span></span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">所示，在后续的章节中我们将重点介绍</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Common</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">、</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OEM</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">、服务器和</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Web</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">扩展部分的源代码。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">
										</span>
								</span> </p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
						</p>
						<table class="MsoNormalTable" style="BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
								<tbody>
										<tr>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="187">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: center" align="center">
																<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																		<strong>
																				<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">文件夹</span>
																		</strong>
																		<strong>
																		</strong>
																</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="394">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: center" align="center">
																<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																		<strong>
																				<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">描述</span>
																		</strong>
																		<strong>
																		</strong>
																</span>
														</p>
												</td>
										</tr>
										<tr>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="187">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px">
																		<span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Installer</span>
																</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="394">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																		<span lang="EN-US" style="LINE-HEIGHT: 19px">
																				<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
																		</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">安装程序的源代码。</span>
																</span>
														</p>
												</td>
										</tr>
										<tr>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif">
																		<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">MgDev</span>
																</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																		<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">服务器和</span>
																		<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">Web</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">扩展的源代码。</span>
																</span>
														</p>
												</td>
										</tr>
										<tr>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif">
																		<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																				<span style="LINE-HEIGHT: 19px"> <span class="Apple-converted-space"> </span></span>BuildTools</span>
																</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings">
																		<span style="LINE-HEIGHT: 21px">
																				<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span>
																				<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
																		</span>
																</span>
																<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">编译</span>
																		<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">需要使用的一些工具。</span>
																</span>
														</p>
												</td>
										</tr>
										<tr>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif">
																		<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																				<span style="LINE-HEIGHT: 19px"> <span class="Apple-converted-space"> </span></span>Common</span>
																</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings">
																		<span style="LINE-HEIGHT: 21px">
																				<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span>
																				<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
																		</span>
																</span>
																<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																		<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">服务器和</span>
																		<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">Web</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">扩展共同依赖的一些模块。</span>
																</span>
														</p>
												</td>
										</tr>
										<tr>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif">
																		<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																				<span style="LINE-HEIGHT: 19px"> <span class="Apple-converted-space"> </span></span>Doc</span>
																</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings">
																		<span style="LINE-HEIGHT: 21px">
																				<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span>
																				<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
																		</span>
																</span>
																<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																		<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGudie</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">文档、应用程序示例和生成</span>
																		<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">文档需要用到的工具。</span>
																</span>
														</p>
												</td>
										</tr>
										<tr>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif">
																		<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																				<span style="LINE-HEIGHT: 19px"> <span class="Apple-converted-space"> </span></span>OEM</span>
																</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings">
																		<span style="LINE-HEIGHT: 21px">
																				<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span>
																				<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
																		</span>
																</span>
																<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																		<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">所依赖的第三方组件。</span>
																</span>
														</p>
												</td>
										</tr>
										<tr>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif">
																		<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																				<span style="LINE-HEIGHT: 19px"> <span class="Apple-converted-space"> </span></span>Server</span>
																</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings">
																		<span style="LINE-HEIGHT: 21px">
																				<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span>
																				<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
																		</span>
																</span>
																<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																		<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">服务器的源代码。</span>
																</span>
														</p>
												</td>
										</tr>
										<tr>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif">
																		<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																				<span style="LINE-HEIGHT: 19px"> <span class="Apple-converted-space"> </span></span>UnitTest</span>
																</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings">
																		<span style="LINE-HEIGHT: 21px">
																				<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span>
																				<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
																		</span>
																</span>
																<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																		<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide Web</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">扩展单元测试代码。</span>
																</span>
														</p>
												</td>
										</tr>
										<tr>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="187">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Calibri, sans-serif">
																		<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																				<span style="LINE-HEIGHT: 19px"> <span class="Apple-converted-space"> </span></span>Web</span>
																</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); BORDER-BOTTOM-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; BORDER-TOP-COLOR: rgb(236,233,216); PADDING-TOP: 0cm; BACKGROUND-COLOR: transparent" valign="top" width="394">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: -21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px; FONT-FAMILY: Wingdings">
																		<span style="LINE-HEIGHT: 21px">
																				<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">l</span>
																				<span style="FONT: 7pt 'Times New Roman'"> <span class="Apple-converted-space"> </span></span>
																		</span>
																</span>
																<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																		<span lang="EN-US" style="LINE-HEIGHT: 19px; FONT-FAMILY: Calibri, sans-serif">MapGuide Web</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">扩展的源代码。</span>
																</span>
														</p>
												</td>
										</tr>
										<tr>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 140.1pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="187">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span lang="EN-US" style="LINE-HEIGHT: 21px">
																		<span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Tools</span>
																</span>
														</p>
												</td>
												<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; BORDER-LEFT-COLOR: rgb(236,233,216); PADDING-BOTTOM: 0cm; WIDTH: 295.85pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="394">
														<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
																<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
																		<span lang="EN-US" style="LINE-HEIGHT: 19px">
																				<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide Maestro</span>
																		</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的源代码，关于</span>
																		<span lang="EN-US" style="LINE-HEIGHT: 19px">
																				<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Maestro</span>
																		</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">更详细的信息请参考</span>
																		<span lang="EN-US" style="LINE-HEIGHT: 19px">
																				<span style="LINE-HEIGHT: 19px">
																						<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">2.1.3.2.2</span>
																				</span>
																		</span>
																		<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">。</span>
																</span>
														</p>
												</td>
										</tr>
								</tbody>
						</table>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
						</p>
						<p class="MsoCaption" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref244355689">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">表<span class="Apple-converted-space"> </span></span>
								</a>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px">
														<span lang="EN-US" style="LINE-HEIGHT: 19px">
																<span style="LINE-HEIGHT: 19px">18</span>
														</span>
												</span>
												<span style="LINE-HEIGHT: 19px">
														<span lang="EN-US" style="LINE-HEIGHT: 19px">‑</span>
												</span>
												<span style="LINE-HEIGHT: 19px">
														<span lang="EN-US" style="LINE-HEIGHT: 19px">
																<span style="LINE-HEIGHT: 19px">1</span>
														</span>
												</span>
												<span lang="EN-US" style="LINE-HEIGHT: 19px">
														<span class="Apple-converted-space"> </span>MapGuide</span>源代码目录结构</span>
								</span>
						</p>
						<p class="MsoCaption" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px"> </p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'"> <img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="487" alt="MapGuide Source Code Structure" src="http://p.blog.csdn.net/images/p_blog_csdn_net/MapGuide_Inside/EntryImages/20091104/MapGuide_Source_Code.JPG" width="631" /></span>
								</span>
						</p>
				</span>
		</span>
<img src ="http://www.blogjava.net/gdws/aggbug/348325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2011-04-15 00:20 <a href="http://www.blogjava.net/gdws/articles/348325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapGuide源码分析</title><link>http://www.blogjava.net/gdws/articles/348324.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 14 Apr 2011 16:20:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/348324.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/348324.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/348324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/348324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/348324.html</trackback:ping><description><![CDATA[
		<span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">
				<span class="Apple-style-span" style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left">
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">如果要访问</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的源代码，需要先安装一个</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Subversion</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的客户端，通过</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Subversion</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的网站</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">(</span>
												<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://subversion.tigris.org/">
														<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">http://subversion.tigris.org/</span>
												</a>
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">)</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">可以了解到关于</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Subversion</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">最为详尽的信息。一般情况下，推荐大家使用</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">TortoiseSVN</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">访问</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的源代码，它将</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">SVN</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">客户端和</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Windows Shell</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">很好地整合在一起，在</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">TortoiseSVN</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的网站</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">(</span>
												<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://tortoisesvn.tigris.org/">
														<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">http://tortoisesvn.tigris.org/</span>
												</a>
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">)</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">上可以下载到最新版本的</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">TortoiseSVN</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Subversion</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">仓储的位置为</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://svn.osgeo.org/mapguide/">
														<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">http://svn.osgeo.org/mapguide/</span>
												</a>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">，在</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Windows Shell</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">中点击鼠标右键，选择菜单“</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">SVN Checkout</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”将显示如</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">图</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">
												<span lang="EN-US" style="LINE-HEIGHT: 19px">18</span>
												<span lang="EN-US" style="LINE-HEIGHT: 19px">‑<span style="LINE-HEIGHT: 19px">1</span></span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">所示的用户界面，在“</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Checkout Directory</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”中输入代码下载位置，然后点击“</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">OK</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”按钮就可以下载</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的源代码。在“</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">Trunk</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”目录下包含的是</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">最新的源代码，在“</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">branches</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">”目录下包含了</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">从版本</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">1.0.0</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">到</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">2.1</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的所有源代码。</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'"> <img style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="359" alt="SVN for MapGuide" src="http://p.blog.csdn.net/images/p_blog_csdn_net/MapGuide_Inside/EntryImages/20091101/MapGuide_SVN.JPG" width="460" /></span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px; TEXT-ALIGN: center" align="center"> </p>
						<p class="MsoCaption" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px">
								<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" name="_Ref244046929">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">图<span class="Apple-converted-space"> </span></span>
								</a>
								<span style="LINE-HEIGHT: 21px; FONT-FAMILY: 宋体">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px">
														<span lang="EN-US" style="LINE-HEIGHT: 19px">
																<span style="LINE-HEIGHT: 19px">18</span>
														</span>
												</span>
												<span style="LINE-HEIGHT: 19px">
														<span lang="EN-US" style="LINE-HEIGHT: 19px">‑</span>
												</span>
												<span style="LINE-HEIGHT: 19px">
														<span lang="EN-US" style="LINE-HEIGHT: 19px">
																<span style="LINE-HEIGHT: 19px">1</span>
														</span>
												</span>
												<span lang="EN-US" style="LINE-HEIGHT: 19px">
														<span class="Apple-converted-space"> </span>TortoiseSVN</span>用于<span lang="EN-US" style="LINE-HEIGHT: 19px">Checkout</span>代码的用户界面</span>
								</span>
						</p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; PADDING-TOP: 0px">
								<span lang="EN-US" style="LINE-HEIGHT: 21px">
										<span style="FONT-SIZE: small; LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">
										</span>
								</span> </p>
						<p class="MsoNormal" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; PADDING-TOP: 0px; TEXT-ALIGN: justify">
								<span style="FONT-SIZE: small; LINE-HEIGHT: 19px">
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">如果仅仅是希望浏览</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的源代码，可以访问</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://trac.osgeo.org/mapguide/browser">
														<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">http://trac.osgeo.org/mapguide/browser</span>
												</a>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">在浏览器中浏览</span>
										<span lang="EN-US" style="LINE-HEIGHT: 19px">
												<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 'Times New Roman'">MapGuide</span>
										</span>
										<span style="LINE-HEIGHT: 19px; FONT-FAMILY: 宋体">的源代码。</span>
								</span>
						</p>
				</span>
		</span>
<img src ="http://www.blogjava.net/gdws/aggbug/348324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2011-04-15 00:20 <a href="http://www.blogjava.net/gdws/articles/348324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapGuide Web API</title><link>http://www.blogjava.net/gdws/articles/348323.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 14 Apr 2011 16:18:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/348323.html</guid><wfw:comment>http://www.blogjava.net/gdws/comments/348323.html</wfw:comment><comments>http://www.blogjava.net/gdws/articles/348323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gdws/comments/commentRss/348323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gdws/services/trackbacks/348323.html</trackback:ping><description><![CDATA[
		<span class="Apple-style-span" style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px">
				<span class="Apple-style-span" style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left">
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">许多人都知道MapGuide提供了.NET、PHP和Java三种类型的Web API，但是不知道MapGuide是如何创建这三种类型的API的。试想一下，如果分别去创建这三种API，这将是一个很难维护的工作。每次增加或修改一些功能，就需要对三种类型的API都进行修改。所以，MapGuide使用了SWIG来自动生成这三种类型的API。我想这个时候许多人会问，什么是SWIG呢？我怎么从来没有听说过这个东东呢！其实，我也是在做MapGuide开发的时候才开始了解SWIG的。所以，首先让我们来认识一下SWIG，然后再来看MapGuide是如何使用SWIG来生成API的。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<strong>1. SWIG简介</strong>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    SWIG是Simple Wrapper and Interface Generator的缩写，是一个帮助使用C或者C++编写的软件创建其他编语言的API的工具。例如，我想要为一个C++编写的程序创建.NET API，一般情况下我必须使用托管C++(Managed C++)去编写大量的代码才能生成它的.NET API。有了SWIG，这个机械的工作将变得非常简单。你只须要使用一个接口文件告诉SWIG要为那些类创建.NET API，SWIG就会自动帮你生成它的.NET API。是不是非常的酷啊？</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    当然，SWIG不仅仅支持创建.NET API。最新版本的SWIG支持常用脚本语言Perl、PHP、Python、Tcl、Ruby和非脚本语言C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML以及R，甚至是编译器或者汇编的计划应用（Guile, MzScheme, Chicken）。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    下面我们通过一个例子来看看SWIG是如何帮我们创建API的。假设我打算为如下的C++类创建C#和Java的API。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    /* SwigTest.h */</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    class CSwigTest {<br />    public:<br />        CSwigTest();<br />        virtual ~CSwigTest();<br />        int Add(int a, int b) { return a + b; }<br />        int Substract(int a, int b) { return a - b; }</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">        int Multiple(int a, int b) { return a * b; }<br />        float Divide(int a, int b) { return (float)a / (float)b; }<br />    };</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<strong>1.1 接口文件</strong>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    首先，你需要写一个接口文件(Interface File)，告诉SWIG要为那些类的那些方法创建API。如下的接口文件只为类CSwigTest的方法Add(...)和Subtract(...)生成API，因为在接口文件的接口声明部分只声明了两个方法。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    /* SwigTest.i */<br />    %module SwigTest<br />    %{<br />    #include "SwigTest.h"<br />    %}</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    /* --- 接口声明部分 ---*/<br />    class CSwigTest {<br />    public:<br />        int Add(int a, int b);</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">        int Substract(int a, int b);</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    };</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    注解：%module标记用于定义SWIG生成的模块的名称，%{%}标记中的内容会被一字不差地插入SWIG自动生成的文件xxx_wrapper.c中，其中xxx代表用%module指定的模块名称。这个文件会在下面介绍，不必着急去理解它究竟有什么作用。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    如果打算为类中所有方法创建API，那么有一个非常简单的办法，在接口文件的类声明部分使用%include标记。SWIG将对%include所指定的文件进行语法分析，类中所有公有方法(Public Method)都将在API中暴露。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    /* SwigTest.i */<br />    %module SwigTest<br />    %{<br />    #include "SwigTest.h"<br />    %}<br />    #include “SwigTest.h” </p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<strong>1.2 编译模块</strong>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    有了接口文件之后，剩下的事就是执行几条命令。下面我们以Windows平台上生成.NET API为例介绍这些命令。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<strong>    (a) 调用SWIG自动生成代码</strong>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    swig -csharp  SwigTest.i</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    执行上面的命令会产生一个C语言文件SwigTest_wrapper.c和多个C#文件。在文件SwigTest_wrapper.c中，SWIG为接口文件中接口声明部分指定的每个方法产生一个全局方法，以便C#使用Pinvoke调用这些函数。而那些C#文件就是用来生成.NET API的。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">   <span class="Apple-converted-space"> </span><strong>(b) 为C++代码生成DLL(</strong>动态链接库<strong>)</strong></p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    cl SwigTest_wrapper.c *.cpp</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    link *.obj /out:SwigTest.dll</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    执行上面的命令，会为我们编写C++代码生成DLL。在编译C++文件时，一定要包括SWIG为我们生成的C++文件SwigTest_wrapper.cpp。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    注意：为了让大家便于理解上述命令，这些命令并没有列出完整的编译和链接选项。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">   <span class="Apple-converted-space"> </span><strong>(C) 生成.NET模块</strong></p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    csc /out:SwigTestNotNetAPI.dll /target:library *.cs</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    执行上面的命令就生成了.NET API模块SwigTestNotNetAPI.dll。如果用户想使用这些API，只需要添加对SwigTestNotNetAPI.dll的引用(Reference)就可以了。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    生成其它语言类型API的命令基本类似，下面我们再以Java在Unix平台下的命令为例结束对SWIG的介绍。事实上，SWIG也是一个开源项目。如果想了解更多关于SWIG的信息，大家可以登陆SWIG的官方网站<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://www.swig.org/">www.swig.org</a>，那里有SWIG最详细的资料。<br />    $ swig -java SwigTest_wrapper.i<br />    $ gcc -c *.cpp SwigTest_wrapper.c -I/c/jdk1.3.1/include -I/c/jdk1.3.1/include/win32<br />    $ gcc -shared *.o -mno-cygwin -Wl,--add-stdcall-alias  -o SwigTest.dll</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<strong>2. SWIG在MapGuide中的应用</strong>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    我们在前面已经提到过，MapGuide使用了SWIG来自动生成.NET、Java和PHP这三种类型的API。但是，SWIG也有不少限制和缺陷，所以MapGuide对SWIG源代码进行了大量的修改，以满足自己的要求。下面，我们看看这些改进。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<strong>2.1 IMake工具</strong>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    SWIG要求开发人员编写一个接口文件，那么能否让接口文件自动生成呢？借用一句中国移动的广告词，我能！虽然SWIG没有提供这方面的工具，但是我们可以自己开发吗！IMake(Interface Maker)就是为了满足这样的要求而开发一个工具，给定一个XML文件，它能帮你自动生成SWIG接口文件。登录MapGuide开源版的代码浏览页面(<a style="COLOR: rgb(51,102,153); TEXT-DECORATION: none" href="http://trac.osgeo.org/mapguide/browser">http://trac.osgeo.org/mapguide/browser</a>)，在root/trunk/MgDev/BuildTools/WebTools/IMake文件夹下可以找到IMake的源代码。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">     下面我们以MapGuide中使用的XML文件/trunk/MgDev/Web/src/MapGuideApi/MapGuideApiGen.xml为例，介绍一下IMake的用法。为了便于理解，在此我删掉了文件中的部分内容。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    &lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />    &lt;Parameters&gt;<br />      &lt;!-- 对应于%Module标记. --&gt;<br />      &lt;Module name="MapGuideApi" /&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">      &lt;!-- 生成的接口文件的名称. --&gt;<br />      &lt;Target path="./MapGuideApi.i" /&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">      &lt;!-- 对应于%{%}标记 --&gt;<br />      &lt;CppInline&gt;<br />        #include &amp;lt;string&amp;gt;<br />        #include &amp;lt;map&amp;gt;<br />        #include "MapGuideCommon.h"<br />        #include "WebApp.h"<br />        ......<br />      &lt;/CppInline&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">      &lt;!-- 用于替换接口中使用的部分类型 --&gt;<br />      &lt;TypeReplacements&gt;<br />        &lt;TypeReplacement oldtype="CREFSTRING" newtype="STRINGPARAM" /&gt;<br />        &lt;TypeReplacement oldtype="INT64" newtype="long long" /&gt;<br />      &lt;/TypeReplacements&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">      &lt;!-- 此部分的内容添加在%{%}之后，接口声明部分之前 --&gt;<br />      &lt;SwigInline&gt;<br />        %include "language.i"   //typemaps specific for each language<br />        ......<br />      &lt;/SwigInline&gt;<br />     <span class="Apple-converted-space"> </span><br />      &lt;!-- 为指定的C++文件生成接口声明 --&gt;<br />      &lt;Headers&gt;<br />        &lt;Header path="../../../Common/Foundation/Data/Property.h" /&gt;<br />        ......<br />      &lt;/Headers&gt;<br />    &lt;/Parameters&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    执行命令“IMake MapGuideApiGen.xml”，IMake就帮我们自动生成了如下SWIG接口文件MapGuideApi.i。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    /* MapGuideApi.i */<br />    %module MapGuideApi<span class="Apple-converted-space"> </span><br />    %{<br />        #include &lt;string&gt;;<br />        #include &lt;map&gt;;<br />        #include "MapGuideCommon.h"<br />        #include "WebApp.h"<br />        ......<br />    %}<br /> <br />    %include "language.i"   //typemaps specific for each language<br />    ......</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    class MgProperty: public MgNamedSerializable<br />    {<br />    public:<br />        virtual INT16 GetPropertyType();<br />        STRING GetName();<br />        void SetName(CREFSTRING name);<br />    };</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    ......</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    如果打开文件Proper.h，我们可以看到MgProperty有更多的方法，例如CanSetName(...)。为什么只有三个方法添加到了SWIG接口文件中？IMake在生成接口文件时，它会查找C++头文件中的宏PUBLISHED_API。只有被PUBLISHED_API修饰的方法，才会添加到接口文件中。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    注：宏PUBLISHED_API和INTERNAL_API的定义如下。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    #define PUBLISHED_API public</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    #define INTERNAL_API public</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    class MG_FOUNDATION_API MgProperty : public MgNamedSerializable<span class="Apple-converted-space"> </span><br />    {<span class="Apple-converted-space"> </span><br />    PUBLISHED_API:</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">        virtual INT16 GetPropertyType() = 0;  /// __get  <span class="Apple-converted-space"> </span><br />        STRING GetName();  /// __get, __set<span class="Apple-converted-space"> </span><br />        void SetName(CREFSTRING name);<span class="Apple-converted-space"> </span><br /> <span class="Apple-converted-space"> </span><br />    INTERNAL_API:<span class="Apple-converted-space"> </span><br />        virtual bool CanSetName();<span class="Apple-converted-space"> </span><br /> <span class="Apple-converted-space"> </span><br />    protected: <span class="Apple-converted-space"> </span><br />        INT32 GetClassId();<span class="Apple-converted-space"> </span><br />        MgProperty();<span class="Apple-converted-space"> </span><br />        virtual ~MgProperty();<span class="Apple-converted-space"> </span><br />        virtual void Dispose();  <span class="Apple-converted-space"> </span><br />        virtual void ToXml(string &amp;str, bool includeType = true, string rootElmName = "Property") = 0;<span class="Apple-converted-space"> </span><br /> <span class="Apple-converted-space"> </span><br />    private:<span class="Apple-converted-space"> </span><br />        friend class MgPropertyCollection;<span class="Apple-converted-space"> </span><br />        STRING m_propertyName;<span class="Apple-converted-space"> </span><br /> <br />    CLASS_ID:<span class="Apple-converted-space"> </span><br />        static const INT32 m_cls_id = Foundation_Property_Property;<span class="Apple-converted-space"> </span><br />    };     <br />    给定一个C++常量定义文件，IMake还可以自动生成对应的其他语言的常量定义文件。MapGuide .NET Web API中的所有常量都是使用IMake来生成的，例如MgMineType、MgPropertyType等。下面我们以MapGuide中使用的XML文件/trunk/MgDev/Web/src/MapGuideApi/Constants.xml为例，介绍如何自动生成各种语言的常量定义文件。同样，为了便于理解，在此我删掉了文件中的部分内容。与MapGuideApiGen.xml不同，Constants.xml包含一个新的元素Classes用来指出需要在目标语言中产生对应的常量类的C++类。<br />    &lt;?xml version="1.0" encoding="UTF-8"?&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    &lt;Parameters&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    &lt;!-- 用于替换类型 --&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    &lt;PHPTypeReplacements&gt;<span class="Apple-converted-space"> </span><br />        &lt;TypeReplacement oldtype="STRING" newtype="" /&gt;<br />        &lt;TypeReplacement oldtype="INT16" newtype="" /&gt;<br />        ......<br />    &lt;/PHPTypeReplacements&gt;<br />    &lt;CSharpTypeReplacements&gt;<br />        &lt;TypeReplacement oldtype="STRING" newtype="string" /&gt;<br />        &lt;TypeReplacement oldtype="INT16" newtype="short" /&gt;<br />        ......<br />    &lt;/CSharpTypeReplacements&gt;<br />    &lt;JavaTypeReplacements&gt;<br />        &lt;TypeReplacement oldtype="STRING" newtype="String" /&gt;<br />        &lt;TypeReplacement oldtype="INT16" newtype="short" /&gt;<br />        ......<br />    &lt;/JavaTypeReplacements&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    &lt;Namespace&gt;OSGeo.MapGuide&lt;/Namespace&gt;<br />    &lt;Package&gt;org.osgeo.mapguide&lt;/Package&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    &lt;!-- 用于指出需要在目标语言中产生对应的常量类的C++类 --&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    &lt;Classes&gt;<br />        &lt;Class name="MgMineType" /&gt;<br />        &lt;Class name="MgPropertyType" /&gt;<br />        ......<br />    &lt;/Classes&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    &lt;Headers&gt;<br />        &lt;Header path="../../../Common/Foundation/Data/MimeType.h" /&gt;<br />        &lt;Header path="../../../Common/Foundation/Data/PropertyType.h" /&gt;<br />        ......<br />    &lt;/Headers&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    &lt;/Parameters&gt;</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    执行命令“IMake.exe Constants.xml C# Constants.cs”，IMake就帮我们自动生成了一个C#常量文件Constants.cs。对于文件/trunk/MgDev/Common/Foundation/Data/PropertyType.h中定义了如下常量，</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    class MgPropertyType<span class="Apple-converted-space"> </span><br />    {<span class="Apple-converted-space"> </span><br />    PUBLISHED_API: <span class="Apple-converted-space"> </span><br />       static const int Null     =  0;<br />       static const int Boolean  =  1;<span class="Apple-converted-space"> </span><br />       static const int Byte     =  2;<span class="Apple-converted-space"> </span><br />       static const int DateTime =  3;<br />       static const int Single   =  4;<span class="Apple-converted-space"> </span><br />       ......<br />    };</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    在生成的Constants.cs文件中，有如下的类定义。<br />    class MgPropertyType<span class="Apple-converted-space"> </span><br />    { <br />       static const int Null     =  0;<br />       static const int Boolean  =  1;<span class="Apple-converted-space"> </span><br />       static const int Byte     =  2;<span class="Apple-converted-space"> </span><br />       static const int DateTime =  3;<br />       static const int Single   =  4;<span class="Apple-converted-space"> </span><br />       ......<br />    };</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    这个文件可以被C#的编译器直接编译，所以MapGuide没有使用SWIG生成常量的API，而是直接使用IMake。 如果想生成PHP或Java的常量定义文件，只需要将IMake命令的参数"C#"替换为"PHP"或"Jave"就可以了。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<strong>2.2 MapGuide对SWIG的修改</strong>
								<br />    在MapGuide开始使用SWIG的时候，可用的SWIG的最高版本是1.3.21，从那以后MapGuide在没有升级过SWIG。所以，到现在为止，MapGuide的SWIG版本仍然是1.3.21。这个版本的SWIG有不少限制和缺陷，</p>
						<ul style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 5px 0px 5px 35px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none">
								<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 2px; MARGIN: 0px; PADDING-TOP: 2px; LIST-STYLE-TYPE: disc">无法创建基于自定义根异常类MgException的异常处理机制。</li>
								<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 2px; MARGIN: 0px; PADDING-TOP: 2px; LIST-STYLE-TYPE: disc">无法创建属性(Property)。</li>
								<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 2px; MARGIN: 0px; PADDING-TOP: 2px; LIST-STYLE-TYPE: disc">对某些方法无法产生正确的API。例如，如果方法GetA(...)返回的是类A的子类B的实例，SWIG创建的API返回的仍然是A类的实例。此时如果你把返回值转换为类B，那么转换会失败。<br />    A* GetA();</li>
								<li style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 2px; MARGIN: 0px; PADDING-TOP: 2px; LIST-STYLE-TYPE: disc">......</li>
						</ul>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    事实上最新的SWIG版本也没有全部解决这些问题，所以MapGuide对SWIG源代码进行了大量的修改，以满足自己的要求。看看MapGuide在使用SWIG命令是传入的参数，我们可以发现有许多参数不是SWIG标准的参数，例如proxydir、clsidcode、clsiddata、catchallcode等。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<br />swig -c++ -csharp -dllname MapGuideUnmanagedApid -namespace OSGeo.MapGuide -proxydir .\custom -baseexception MgException -clsidcode getclassid.code -clsiddata m_cls_id -catchallcode catchall.code -dispose &amp;quot;((MgDisposable*)arg1)-&amp;gt;Release()&amp;quot; -rethrow &amp;quot;e-&amp;gt;Raise();&amp;quot; -nodefault -noconstants -module MapGuideApi -o MgApi_wrap.cpp -lib ..\..\..\Oem\SWIGEx\Lib MapGuideApi.i</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<br />    在此，我们不打算一一介绍这些参数，因为在多数情况下你没有必要对了解参数的含义。我们只介绍MapGuide是如何来解决上述SWIG的第二和第三个问题的，因为在扩展MapGuide Web API的时候你可能会用得着。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<br />
								<strong>2.2.1 创建属性</strong>
								<br />    如果你看过MapGuide源代码的话，你会发现有许多方法声明之后有“__get”、“__set”或“__get, __set”这样的注释，如类MgProperty中的方法。<br />    class MgProperty : public MgNamedSerializable<span class="Apple-converted-space"> </span><br />    {<span class="Apple-converted-space"> </span><br />    PUBLISHED_API:<span class="Apple-converted-space"> </span><br />        virtual INT16 GetPropertyType() = 0;  /// __get  <span class="Apple-converted-space"> </span><br />        STRING GetName();  /// __get, __set<span class="Apple-converted-space"> </span><br />        void SetName(CREFSTRING name);<span class="Apple-converted-space"> </span><br />        ......<br />};<br />    这些注释是有特殊含义的，它们就是用来解决上述SWIG的第二个问题的。当IMake工具扫描C++头文件时发现这注释后，会在目录“.\custom”下为每个类产生一个帮助创建属性的代码文件。例如，如果要类MgProperty生成.NET API，IMake会在“.\custom”生成一个文件名为MgProperty的C#代码文件，它的内容如下：<br />    public int PropertyType {<br />        get {return GetPropertyType(); }<br />    }<br />    public int Name {<br />        get { return GetPropertyType(); }<br />        set { setName(value);}<br />    }<br />    如果在SWIG的命令行中使用了参数proxydir，那么SWIG在为每个类生成代码的时候，会在proxydir所指定的目录下查找和类名相同的文件，并且将这个文件中的代码插入类的目标代码中。通过这种办法，就解决了上述SWIG的第二个问题。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<strong>2.2.2 ClassId</strong>
								<br />    MapGuide Web API中的所有类都是从MgObject继承而来的，在类MgObject中有一个方法GetClassId()用来返回每个类唯一的ID值。MapGuide就是用这个方法来解决上述SWIG的第三个问题的，所以如果要在MapGuide Web API中增加一个新类，一定要覆盖(override)这个方法，并且提供一个唯一的ID值。<br />    class MgObject<br />    {<br />    EXTERNAL_API:<br />        virtual INT32 GetClassId();<br />        virtual STRING GetClassName();<br />    INTERNAL_API:<br />        virtual ~MgObject();<br />        bool IsOfClass(INT32 classId);<br />    };</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">
								<strong>3. 扩展MapGudie Web API</strong>
						</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    如果你发现现有的MapGuide Web API无法满足你的要求，没有关系，你可以去尝试扩展它，因为MapGuide是开源的。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    如果要新添类，基本步骤如下：<br />    (a) 修改C++代码，添加新的类。对于需要暴露于API的方法，使用宏PUBLISHED_API修饰。<br />    (b) 修改XML文件/trunk/MgDev/Web/src/MapGuideApi/MapGuideApiGen.xml的Headers部分，为每个新添加类所在的C++头文件增加一个Header元素。下面的示例中，"path"代表C++头文件的路径，"filename.h"代表文件的名称。<br />    &lt;Headers&gt;<br />        &lt;Header path="path/filename.h" /&gt;<br />        ......<br />    &lt;/Headers&gt;<br />    (c) 重新编译MapGuide的Web模块(/trunk/MgDev/Web/src/)。<br /> <br />    如果要增加一些新的方法到现有的类中，基本步骤如下：<br />    (a) 修改C++代码，添加新的方法，并且使用宏PUBLISHED_API修饰这些方法。<br />    (b) 重新编译MapGuide的Web模块(/trunk/MgDev/Web/src/)。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    如果要新增常量类，基本步骤如下：<br />    (a) 修改C++代码，添加新的常量类。<br />    (b) 修改XML文件/trunk/MgDev/Web/src/MapGuideApi/Constants.xml，在Classes部分为每个新添加常量类增加一个Class元素，在Headers部分为每个新添加常量类所在的C++头文件增加一个Header元素。下面的示例中，"ClassName"代表新添加的C++常量类的名称。</p>
						<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">    &lt;Classes&gt;<br />        &lt;Class name="ClassName" /&gt;<br />        ......<br />    &lt;/Classes&gt;<br />    &lt;Headers&gt;<br />        &lt;Header path="path/filename.h" /&gt;<br />        ......<br />    &lt;/Headers&gt;   <span class="Apple-converted-space"> </span><br />    (c) 重新编译MapGuide的Web模块(/trunk/MgDev/Web/src/)。</p>
				</span>
		</span>
<img src ="http://www.blogjava.net/gdws/aggbug/348323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2011-04-15 00:18 <a href="http://www.blogjava.net/gdws/articles/348323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>