﻿<?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组</title><link>http://free-j2ee.blogjava.net/</link><description>学习，交流j2se,j2ee及中间件的开发。</description><language>zh-cn</language><lastBuildDate>Fri, 05 Sep 2008 20:45:13 GMT</lastBuildDate><pubDate>Fri, 05 Sep 2008 20:45:13 GMT</pubDate><ttl>60</ttl><item><title>强大的JavaScript UI脚本库Ext 2.0</title><link>http://www.blogjava.net/lfnxd/archive/2008/08/11/221315.html</link><dc:creator>云和山的彼端</dc:creator><author>云和山的彼端</author><pubDate>Mon, 11 Aug 2008 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/lfnxd/archive/2008/08/11/221315.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 当前作为AJAX的开发中可以选择的JS UI脚本库还是不少，但是Ext 2.0是中立的,开发简易的，界面和交互性更加强大友好的库，他不必要求和任何MVC结合，纯正的js前端脚本，不是java2js，也不是用xml语法描述界面，个人觉得更加适合引入项目来增加界面的友好性和交互体验，而且简化JS前端的编码。Ext 2.0的DEMO体验网址：&nbsp;&nbsp;http://extjs.com/...&nbsp;&nbsp;<a href='http://www.blogjava.net/lfnxd/archive/2008/08/11/221315.html'>阅读全文</a><img src ="http://free-j2ee.blogjava.net/aggbug/221315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lfnxd/" target="_blank">云和山的彼端</a> 2008-08-11 15:48 <a href="http://www.blogjava.net/lfnxd/archive/2008/08/11/221315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在局域网中搭建自己的gis服务器</title><link>http://www.blogjava.net/lfnxd/archive/2008/08/07/220604.html</link><dc:creator>云和山的彼端</dc:creator><author>云和山的彼端</author><pubDate>Thu, 07 Aug 2008 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/lfnxd/archive/2008/08/07/220604.html</guid><description><![CDATA[需求<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在客户的B/S应用系统中使用电子地图。该系统只可运行于内部网中。<br />
<br />
分析<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于系统中的电子地图只能运行于局域网中所以不能采用google地图等。而且客户项目不大，所以不能购买收费的gis服务器。<br />
<br />
设计及架构<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gis服务器采用开源的geoserver+tomcat。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 地图数据可以从国家基础地理信息系统<a href="http://nfgis.nsdi.gov.cn/nfgis/chinese/c_xz.htm">http://nfgis.nsdi.gov.cn/nfgis/chinese/c_xz.htm</a>下载。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库采用postgresql8.3。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 页面技术采用OpenLayers。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
实施<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、安装postgresql数据库，可以安装时选择安装postgis组件。也可在安装完的基础山再安装postgis。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、创建gis数据库，新建数据库时选择模板为template_postgis。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、下载县级数据bount500.e00。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、用工具将bount500.e00转换为shp格式。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、下载开源工具FWTools2.2，执行命令ogr2ogr -f "PostgreSQL" PG:"host=localhost dbname=数据库名称 user=用户名 password=密码"&nbsp; shp文件路径&nbsp;-append -update，将数据导入postgis数据库中。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6、下载tomcat5.5和geoserver,将geoserver.war部署到tomcat中，启动应用服务器。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、登录geoserver应用，配置地图服务端，参考geoserver在线帮助。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、下载OpenLayers，在javascript中包含OpenLayers.js。参考openlayers的例子编写客户端脚本。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样一个简单的电子地图系统就完成了。
 <img src ="http://free-j2ee.blogjava.net/aggbug/220604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lfnxd/" target="_blank">云和山的彼端</a> 2008-08-07 11:27 <a href="http://www.blogjava.net/lfnxd/archive/2008/08/07/220604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>主题: 如何从开发人员走向架构师－转载自developerWorks 中国</title><link>http://www.blogjava.net/lfnxd/archive/2008/08/07/220593.html</link><dc:creator>云和山的彼端</dc:creator><author>云和山的彼端</author><pubDate>Thu, 07 Aug 2008 02:54:00 GMT</pubDate><guid>http://www.blogjava.net/lfnxd/archive/2008/08/07/220593.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 很多架构师都是从好的开发人员逐步过渡而来的，但并非每个好的开发人员都希望成为架构师，而且他们并不是都适合做架构师。无论您是打算进行职业转型的开发人员，还是寻找能承担体系结构设计责任的合适人选的经理，都务必对此转型过程有个清楚的了解。本文将讨论从实现专家到架构师的过渡过程。　　在寻找优秀的指挥的时候，您首先要找的是一名优秀...&nbsp;&nbsp;<a href='http://www.blogjava.net/lfnxd/archive/2008/08/07/220593.html'>阅读全文</a><img src ="http://free-j2ee.blogjava.net/aggbug/220593.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lfnxd/" target="_blank">云和山的彼端</a> 2008-08-07 10:54 <a href="http://www.blogjava.net/lfnxd/archive/2008/08/07/220593.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>主题: tomahawk与trinidad呈现器冲突问题</title><link>http://www.blogjava.net/lfnxd/archive/2008/08/07/220590.html</link><dc:creator>云和山的彼端</dc:creator><author>云和山的彼端</author><pubDate>Thu, 07 Aug 2008 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/lfnxd/archive/2008/08/07/220590.html</guid><description><![CDATA[<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr class="bbs_con">
            <td valign="top" colspan="2" height="40">
            <div class="content">
            <p>&nbsp;&nbsp;&nbsp; tomahawk与trinidad提供了丰富的控件，但是当默认呈现器设置成org.apache.myfaces.trinidad.core时，tomahawk中的dataScroll不能正常工作。如果不设置默认呈现器，trinidad又不能工作，所以这是个矛盾，需要跟踪代码，使这两个优秀的开源JSF控件集能很好的共存。</p>
            <p>&nbsp;&nbsp;&nbsp; 解决方法：在eclipse中导入trinidad-1.0.2的源码，修改包org.apache.myfaces.trinidadinternal.renderkit.htmlBasic中的HtmlCommandLinkRenderer.java。</p>
            <p>public class HtmlCommandLinkRenderer extends Renderer<br />
            {</p>
            <p>&nbsp; ...<br />
            &nbsp; private Renderer renderer = null;&nbsp;&nbsp;&nbsp;//增加呈现器接口成员变量</p>
            <p>&nbsp; ....<br />
            &nbsp;&nbsp;//增加encodeBegin函数</p>
            <p>&nbsp; @SuppressWarnings("unchecked")<br />
            &nbsp; @Override<br />
            &nbsp; public void encodeBegin(FacesContext context,<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UIComponent component) throws IOException<br />
            &nbsp; {<br />
            &nbsp;&nbsp;&nbsp; // The tr:commandLink is not a rendersChildren component,<br />
            &nbsp;&nbsp;&nbsp; // but h:commandLink is.&nbsp; Hence, the difference in behavior<br />
            &nbsp;&nbsp;&nbsp; renderer = createRenderer(component);<br />
            &nbsp;&nbsp;&nbsp; renderer.encodeBegin(context, component);</p>
            <p>&nbsp;&nbsp;&nbsp; for(UIComponent child : (List&lt;UIComponent&gt;)component.getChildren())<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RenderUtils.encodeRecursive(context, child);<br />
            &nbsp;&nbsp;&nbsp; }<br />
            &nbsp; }</p>
            <p>&nbsp; ...<br />
            &nbsp; </p>
            <p>&nbsp; //修改encodeEnd函数为当前代码<br />
            &nbsp; @SuppressWarnings("unchecked")<br />
            &nbsp; @Override<br />
            &nbsp; public void encodeEnd(FacesContext context,<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UIComponent component) throws IOException<br />
            &nbsp; {<br />
            &nbsp;&nbsp;&nbsp; // The tr:commandLink is not a rendersChildren component,<br />
            &nbsp;&nbsp;&nbsp; // but h:commandLink is.&nbsp; Hence, the difference in behavior<br />
            &nbsp;&nbsp;&nbsp; if(renderer==null)<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp; &nbsp;renderer = createRenderer(component);<br />
            &nbsp;&nbsp;&nbsp;&nbsp; renderer.encodeBegin(context, component);<br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; for(UIComponent child : (List&lt;UIComponent&gt;)component.getChildren())<br />
            &nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RenderUtils.encodeRecursive(context, child);<br />
            &nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp; renderer.encodeEnd(context, component);<br />
            &nbsp; }</p>
            <p>&nbsp;&nbsp;...<br />
            }<br />
            </p>
            </div>
            </td>
        </tr>
        <!-- <tr class="bbs_con">
      		    <td colspan="2" class="attach">
      		      <div><strong>关联文档:</strong> <a href="#" onclick="newReference(); return false;">关联新文档</a></div>
      			</td>
      		  </tr>
      		  -->
    </tbody>
</table>
&nbsp;
 <img src ="http://free-j2ee.blogjava.net/aggbug/220590.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lfnxd/" target="_blank">云和山的彼端</a> 2008-08-07 10:48 <a href="http://www.blogjava.net/lfnxd/archive/2008/08/07/220590.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(七)</title><link>http://www.blogjava.net/gdws/articles/219380.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219380.html</guid><description><![CDATA[61.你们的每个人都了解项目的商业意义么？<br />      <br />      要。这是Vision的意思。别把项目只当成工作。有时候要想着自己是在为中国某某行业的信息化作先驱者，或者时不时的告诉team member，这个项目能够为某某某国家部门每年节省多少多少百万的纳税人的钱，这样就有动力了。平凡的事情也是可以有个崇高的目标的。<br />      <br />      62.产品各部分的界面和操作习惯一致么？<br />      <br />      要这样。要让用户觉得整个程序好像是一个人写出来的那样。<br />      <br />      63.有可以作为宣传亮点的Cool Feature么？<br />      <br />      要。这是增强团队凝聚力、信心的。而且，“一俊遮百丑”，有亮点就可以掩盖一些问题。这样，对于客户来说，会感觉产品从质量角度来说还是acceptable的。或者说，cool feature或者说亮点可以作为质量问题的一个事后弥补措施。<br />      <br />      64.尽可能缩短产品的启动时间要这样。<br />      <br />      软件启动时间（Start-Up time）是客户对性能好坏的第一印象。<br />      <br />      65.不要过于注重内在品质而忽视了第一眼的外在印象。<br />      <br />      程序员容易犯这个错误：太看重性能、稳定性、存储效率，但忽视了外在感受。而高层经理、客户正相反。这两方面要兼顾，协调这些是PM的工作。<br />      <br />      66.你们根据详细产品功能说明书做开发么？<br />      <br />      要这样。要有设计才能开发，这是必须的。设计文档，应该说清楚这个产品会怎么运行，应该采取一些讲故事的方法。设计的时候千万别钻细节，别钻到数据库、代码等具体实现里面去，那些是后面的事情，一步步来不能着急。<br />      <br />      67.开始开发和测试之前每个人都仔细审阅功能设计么？<br />      <br />      要做。Function Spec review是用来统一思想的。而且，review过以后形成了一致意见，将来再也没有人可以说“你看，当初我就是反对这么设计的，现在吃苦头了吧！”<br />      <br />      68.所有人都始终想着The Whole Image么？<br />      <br />      要这样。项目里面每个人虽然都只是在制造一片叶子，但每个人都应该知道自己在制造的那片叶子所在的树是怎么样子的。我反对软件蓝领，反对过分的把软件制造看成流水线、车间。参见第61条。<br />      <br />      69.Dev工作的划分是单纯纵向或横向的么？<br />      <br />      不能单纯的根据功能模块分，或者单纯根据表现层、中间层、数据库层分。我推荐这么做：首先根据功能模块分，然后每个“层”都有一个Owner来Review所有人的设计和代码，保证consistency。<br />      <br />      70.你们的程序员写程序设计说明文档么？<br />      <br />      要。不过我听说微软的程序员1999年以前也不写。所以说，写不写也不是绝对的，偷懒有时候也是可以的。参见第56条。<br />      <br />      71.你在招人面试时让他写一段程序么？<br />      <br />      要的。我最喜欢让人做字符串和链表一类的题目。这种题目有很多循环、判断、指针、递归等，既不偏向过于考算法，也不偏向过于考特定的API。<br /><br />           <br />    72.你们有没有技术交流讲座？<br />    <br />    要的。每一两个礼拜搞一次内部的Tech Talk或者Chalk Talk吧。让组员之间分享技术心得，这笔花钱送到外面去培训划算。<br />    <br />    73.你们的程序员都能专注于一件事情么？<br />    <br />    要让程序员专注一件事。例如说，一个部门有两个项目和10个人，一种方法是让10个人同时参加两个项目，每个项目上每个人都花50%时间；另一种方法是5个人去项目A，5个人去项目B，每个人都100%在某一个项目上。我一定选后面一种。这个道理很多人都懂，但很多领导实践起来就把属下当成可以任意拆分的资源了。<br />    <br />    74.你们的程序员会夸大完成某项工作所需要的时间么？<br />    <br />    会的，这是常见的，尤其会在项目后期夸大做某个change所需要的时间，以次来抵制change。解决的方法是坐下来慢慢磨，磨掉程序员的逆反心理，一起分析，并把估算时间的颗粒度变小。<br />    <br />    75.尽量不要用Virtual Heads最好不要用Virtual Heads。<br />    <br />    Virtual heads意味着resource is not secure，shared resource会降低resource的工作效率，容易增加出错的机会，会让一心二用的人没有太多时间去review spec、review design。一个dedicated的人，要强过两个只能投入50%时间和精力的人。我是吃过亏的：7个part time的tester，发现的Bug和干的活，加起来还不如两个full-time的。参见第73条。73条是针对程序员的，75条是针对Resource Manager的。 <br /><img src ="http://free-j2ee.blogjava.net/aggbug/219380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:09 <a href="http://www.blogjava.net/gdws/articles/219380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(六)</title><link>http://www.blogjava.net/gdws/articles/219379.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219379.html</guid><description><![CDATA[51.你们是否随便抓一些人来做易用性测试？<br />      <br />      要这么做。自己看自己写的程序界面，怎么看都是顺眼的。这叫做审美疲劳——臭的看久了也就不臭了，不方便的永久了也就习惯了。<br />      <br />      52.你对自动测试的期望正确么？<br />      <br />      别期望太高。依我看，除了性能测试以外，还是暂时先忘掉“自动测试”吧，忘掉WinRunner和LoadRunner吧。对于国内的软件测试的现状来说，只能“矫枉必须过正”了。<br />      <br />      53.你们的性能测试是等所有功能都开发完才做的么？<br />      <br />      不能这样。性能测试不能被归到所谓的“系统测试”阶段。早测早改正，早死早升天。<br />      <br />      54.你注意到测试中的杀虫剂效应了么？<br />      <br />      虫子有抗药性，Bug也有。发现的新Bug越来越少是正常的。这时候，最好大家交换一下测试的area，或者用用看其他工具和手法，就又会发现一些新bug了。<br />      <br />      55.你们项目组中有人能说出产品的当前整体质量情况么？<br />      <br />      要有。当老板问起这个产品目前质量如何，Test Lead/Manager应该负责回答。<br />      <br />      56.你们有单元测试么？<br />      <br />      单元测试要有的。不过没有单元测试也不是不可以，我做过没有单元测试的项目，也做成功了——可能是侥幸，可能是大家都是熟手的关系。还是那句话，软件工程是非常实践、非常工程、非常灵活的一套方法，某些方法在某些情况下会比另一些方法好，反之亦然。<br />      <br />      57.你们的程序员是写完代码就扔过墙的么？<br />      <br />      大忌。写好一块程序以后，即便不做单元测试，也应该自己先跑一跑。虽然有了专门的测试人员，做开发的人也不可以一点测试都不做。微软还有Test Release Document的说法，程序太烂的话，测试有权踢回去。<br />      <br />      58.你们的程序中所有的函数都有输入检查么？<br />      <br />      不要。虽然说做输入检查是write secure code的要点，但不要做太多的输入检查，有些内部函数之间的参数传递就不必检查输入了，省点功夫。同样的道理，未必要给所有的函数都写注释。写一部分主要的就够了。<br />      <br />      59.产品有统一的错误处理机制和报错界面么？<br />      <br />      要有。最好能有统一的error message，然后每个error message都带一个error number。<br />      <br />      这样，用户可以自己根据error number到user manual里面去看看错误的具体描述和可能原因，就像SQL Server的错误那样。同样，ASP.NET也要有统一的Exception处理。可以参考有关的Application Block。<br />      <br />      60.你们有统一的代码书写规范么？<br />      <br />      要有。Code Convention很多，搞一份来发给大家就可以了。当然，要是有FxCop这种工具来检查代码就更好了。<img src ="http://free-j2ee.blogjava.net/aggbug/219379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:08 <a href="http://www.blogjava.net/gdws/articles/219379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(五)</title><link>http://www.blogjava.net/gdws/articles/219378.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219378.html</guid><description><![CDATA[41.通过Email进行所有正式沟通<br />       <br />       Email的好处是免得抵赖。但也要避免矫枉过正，最好的方法是先用电话和当面说，然后Email来确认。<br />       <br />       42.为项目组建立多个Mailing Group <br />       <br />       如果在AD+Exchange里面，就建Distribution List。比如，我会建ABC Project Core Team，ABC Project Dev Team，ABC Project All Testers，ABC Project Extended Team等等。这样发起Email来方便，而且能让该收到email的人都收到、不该收到不被骚扰。 <br />       <br />       43.每个人都知道哪里可以找到全部的文档么？<br />       <br />       应该每个人都知道。这叫做知识管理（Knowledge Management）。最方便的就是把文档放在一个集中的File Share，更好的方法是用Sharepoint。 <br />       <br />       44.你做决定、做变化时，告诉大家原因了么？<br />       <br />       要告诉大家原因。Empower team member的手段之一是提供足够的information，这是MSF一开篇的几个原则之一。的确如此，tell me why是人之常情，tell me why了才能有understanding。中国人做事喜欢搞限制，限制信息，似乎能够看到某一份文件的人就是有身份的人。大错特错。权威、权力，不在于是不是能access information/data，而在于是不是掌握资源。<br />       <br />       45.Stay agile and expect change要这样。<br />       <br />       需求一定会变的，已经写好的代码一定会被要求修改的。做好心理准备，对change不要抗拒，而是expect change。
<p>      46.你们有没有专职的软件测试人员？<br />      <br />      要有专职测试。如果人手不够，可以peer test，交换了测试。千万别自己测试自己的。<br />      <br />      47.你们的测试有一份总的计划来规定做什么和怎么做么？<br />      <br />      这就是Test Plan。要不要做性能测试？要不要做Usability测试？什么时候开始测试性能？测试通过的标准是什么？用什么手段，自动的还是手动的？这些问题需要用TestPlan来回答。<br />      <br />      48.你是先写Test Case然后再测试的么？<br />      <br />      应该如此。应该先设计再编程、先test case再测试。当然，事情是灵活的。我有时候在做第一遍测试的同时补上test case。至于先test case再开发，我不喜欢，因为不习惯，太麻烦，至于别人推荐，那试试看也无妨。<br />      <br />      49.你是否会为各种输入组合创建测试用例？<br />      <br />      不要，不要搞边界条件组合。当心组合爆炸。有很多test case工具能够自动生成各种边界条件的组合——但要想清楚，你是否有时间去运行那么多test case。<br />      <br />      50.你们的程序员能看到测试用例么？<br />      <br />      要。让Dev看到Test Case吧。我们都是为了同一个目的走到一起来的：提高质量。</p><img src ="http://free-j2ee.blogjava.net/aggbug/219378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:07 <a href="http://www.blogjava.net/gdws/articles/219378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(四)</title><link>http://www.blogjava.net/gdws/articles/219377.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219377.html</guid><description><![CDATA[31.你们的项目组做每日编译么？<br />       <br />       当然要做。有三样东西是软件项目/产品开发必备的：1.bug management;2.source control;3.daily build。 <br />       <br />       32.你们公司有没有积累一个项目风险列表？<br />       <br />       要。Risk Inventory。否则，下个项目开始的时候，又只能拍脑袋分析Risk了。<br />       <br />       33.设计越简单越好。<br />       <br />       设计时候多一句话，将来可能就带来无穷无尽的烦恼。应该从一开始就勇敢的砍。这叫scope management。<br />       <br />       34.尽量利用现有的产品、技术、代码千万别什么东西都自己Coding。<br />       <br />       BizTalk和Sharepoint就是最好的例子，有这两个作为基础，可以把起点提高很多。或者可以尽量多用现成的Control之类的。或者尽量用XML，而不是自己去Parse一个文本文件；尽量用RegExp，而不是自己从头操作字符串，等等等等。这就是“软件复用”的体现。<br />       <br />       35.你们会隔一段时间就停下来夯实代码么？<br />       <br />       要。最好一个月左右一次。传言去年年初Windows组在Stevb的命令下停过一个月增强安全。Btw，“夯”这个字念“hang”，第一声。<br />       <br />       36.你们的项目组每个人都写Daily Report么？<br />       <br />       要写。五分钟就够了，写10句话左右，告诉自己小组的人今天我干了什么。一则为了沟通，二则鞭策自己（要是游手好闲一天，自己都会不好意思写的）。<br />       <br />       37.你们的项目经理会发出Weekly Report么？<br />       <br />       要。也是为了沟通。内容包括目前进度，可能的风险，质量状况，各种工作的进展等。<br />       <br />       38.你们项目组是否至少每周全体开会一次？<br />       <br />       要。一定要开会。程序员讨厌开会，但每个礼拜开会时间加起来至少应该有4小时。包括team meeting, spec review meeting, bug triage meeting。千万别大家闷头写code。<br />       <br />       39.你们项目组的会议、讨论都有记录么？<br />       <br />       会前发meeting request和agenda，会中有人负责主持和记录，会后有人负责发meeting minutes，这都是effective meeting的要点。而且，每个会议都要形成agreements和action items。<br />       <br />       40.其他部门知道你们项目组在干什么么？<br />       <br />       要发一些Newsflash给整个大组织。Show your team’s value。否则，当你坐在电梯里面，其他部门的人问：“你们在干嘛”，你回答“ABC项目”的时候，别人全然不知，那种感觉不太好。<img src ="http://free-j2ee.blogjava.net/aggbug/219377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:07 <a href="http://www.blogjava.net/gdws/articles/219377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(二)</title><link>http://www.blogjava.net/gdws/articles/219374.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219374.html</guid><description><![CDATA[11.你们的进度表是否反映最新开发进展情况？<br />       <br />       应该反映。但是，应该用Baseline的方法来管理进度表：维护一份稳定的Schedule，再维护一份最新更改。Baseline的方法也应该用于其它的Spec。Baseline是变更管理里面的一个重要手段。<br />       <br />       12.你们的工作量是先由每个人自己估算的么？<br />       <br />       应该让每个人自己估算。要从下而上估算工作量，而不是从上往下分派。除非有其他原因，比如政治任务工期固定等。<br />       <br />       13.你们的开发人员从项目一开始就加班么？<br />       <br />       不要这样。不要一开始就搞疲劳战。从项目一开始就加班，只能说明项目进度不合理。当然，一些对日软件外包必须天天加班，那属于剥削的范畴。<br />       <br />       14.你们的项目计划中Buffer Time是加在每个小任务后面的么？<br />       <br />       不要。Buffer Time加在每个小任务后面，很容易轻易的就被消耗掉。Buffer Time要整段的加在一个Milestone或者checkpoint前面。<br />       <br />       15.值得再多花一些时间，从95%做到100%好值得，非常值得。<br />       <br />       尤其当项目后期人困马乏的时候，要坚持。这会给产品带来质的区别。<br />       <br />       16.登记新缺陷时，是否写清了重现步骤？<br />       <br />       要。这属于Dev和Test之间的沟通手段。面对面沟通需要，详细填写Repro Steps也需要。 <br />       <br />       17.写新代码前会把已知缺陷解决么？<br />       <br />       要。每个人的缺陷不能超过10个或15个，否则必须先解决老的bug才能继续写新代码。<br />       <br />       18.你们对缺陷的轻重缓急有事先的约定么？<br />       <br />       必须有定义。Severity要分1、2、3，约定好：蓝屏和Data Lost算Sev 1，Function Error算Sev 2，界面上的算Sev 3。但这种约定可以根据产品质量现状适当进行调整。<br />       <br />       19.你们对意见不一的缺陷有三国会议么？<br />       <br />       必须要有。要有一个明确的决策过程。这类似于CCB(Change Control Board)的概念。 <br />       <br />       20.所有的缺陷都是由登记的人最后关闭的么？<br />       <br />       Bug应该由Opener关闭。Dev不能私自关闭Bug。<img src ="http://free-j2ee.blogjava.net/aggbug/219374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:05 <a href="http://www.blogjava.net/gdws/articles/219374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(三)</title><link>http://www.blogjava.net/gdws/articles/219375.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219375.html</guid><description><![CDATA[21.你们的程序员厌恶修改老的代码么？<br />       <br />       厌恶是正常的。解决方法是组织Code Review，单独留出时间来。XP也是一个方法。<br />       <br />       22.你们项目组有Team Morale Activity么？<br />       <br />       每个月都要搞一次，吃饭、唱歌、Outing、打球、开卡丁车等等，一定要有。不要省这些钱。<br />       <br />       23.你们项目组有自己的Logo么？<br />       <br />       要有自己的Logo。至少应该有自己的Codename。<br />   <br />       24.你们的员工有印有公司Logo的T-Shirt么？<br />       <br />       要有。能增强归属感。当然，T-Shirt要做的好看一些，最好用80支的棉来做。别没穿几次就破破烂烂的。<br />       <br />       25.总经理至少每月参加次项目组会议要的。<br />       <br />       要让team member觉得高层关注这个项目。<br />       <br />       26.你们是给每个Dev开一个分支么？<br />       <br />       反对。Branch的管理以及Merge的工作量太大，而且容易出错。<br />       <br />       27.有人长期不Check-In代码么？<br />       <br />       不可以。对大部分项目来说，最多两三天就应该Check-In。<br />       <br />       28.在Check-In代码时都填写注释了么？<br />       <br />       要写的，至少一两句话，比如“解决了Bug No.225”。如果往高处拔，这也算做“配置审计”的一部分。<br />       <br />       29.有没有设定每天Check-In的最后期限？<br />       <br />       要的，要明确Check-In Deadline。否则会Build Break。<br />       <br />       30.你们能把所有源码一下子编译成安装文件吗？
<p>      要的。这是每日编译（Daily Build）的基础。而且必须要能够做成自动的。<br /></p><img src ="http://free-j2ee.blogjava.net/aggbug/219375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:05 <a href="http://www.blogjava.net/gdws/articles/219375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效编写软件的75条建议(-)</title><link>http://www.blogjava.net/gdws/articles/219373.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/219373.html</guid><description><![CDATA[本文给出了有效编写软件的75条建议，内容包括工具的使用、协调部门人员间配合、编程过程中的注意事项等。供大家参考！ <br />       <br />       1.你们的项目组使用源代码管理工具了么？<br />       <br />       应该用。VSS、CVS、PVCS、ClearCase、CCC/Harvest、FireFly都可以。我的选择是VSS。<br />       <br />       2.你们的项目组使用缺陷管理系统了么？<br />       <br />       应该用。ClearQuest太复杂，我的推荐是BugZilla。<br />       <br />       3.你们的测试组还在用Word写测试用例么？<br />       <br />       不要用Word写测试用例（Test Case）。应该用一个专门的系统，可以是Test Manager，也可以是自己开发一个ASP.NET的小网站。主要目的是Track和Browse。<br />       <br />       4.你们的项目组有没有建立一个门户网站？<br />       <br />       要有一个门户网站，用来放Contact Info、Baselined Schedule、News等等。推荐Sharepoint Portal Server 2003来实现，15分钟就搞定。买不起SPS 2003可以用WSS(Windows Sharepoint Service)。 <br />       <br />       5.你们的项目组用了你能买到最好的工具么？<br />       <br />       应该用尽量好的工具来工作。比如，应该用VS.NET而不是Notepad来写C#。用Notepad写程序多半只是一种炫耀。但也要考虑到经费，所以说是“你能买到最好的”。<br />       <br />       6.你们的程序员工作在安静的环境里么？<br />       <br />       需要安静环境。这点极端重要，而且要保证每个人的空间大于一定面积。<br />       <br />       7.你们的员工每个人都有一部电话么？<br />       <br />       需要每人一部电话。而且电话最好是带留言功能的。当然，上这么一套带留言电话系统开销不小。不过至少每人一部电话要有，千万别搞得经常有人站起来喊：“某某某电话”。《人件》里面就强烈谴责这种做法。<br />       <br />       8.你们每个人都知道出了问题应该找谁么？<br />       <br />       应该知道。任何一个Feature至少都应该有一个Owner，当然，Owner可以继续Dispatch给其他人。<br />       <br />       9.你遇到过有人说“我以为…”么？<br />       <br />       要消灭“我以为”。Never assume anything。 <br />       <br />       10.你们的项目组中所有的人都坐在一起么？<br />       <br />       需要。我反对Virtual Team，也反对Dev在美国、Test在中国这种开发方式。能坐在一起就最好坐在一起，好处多得不得了。<img src ="http://free-j2ee.blogjava.net/aggbug/219373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:04 <a href="http://www.blogjava.net/gdws/articles/219373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>软件研发人员考核的十项基本原则</title><link>http://www.blogjava.net/gdws/archive/2008/08/01/219371.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 01 Aug 2008 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/archive/2008/08/01/219371.html</guid><description><![CDATA[软件研发人员的考核一直是软件企业管理的难点，笔者在长期的研发管理实践与咨询实践中，总结了进行软件研发人员考核的一些基本原则，整理出来与大家共享： 
<p>　◆要体现公司的价值观 </p><p>　　公司的价值观体现了公司认可什么类型的人员?要挽留哪些人?提倡做什么?对这些人员的认可可以通过具体的考核办法落实下来。比如企业鼓励在某一个业务领域内积累丰富的领域经验，鼓励在某个技术方向上进行深入钻研等，对于提倡的这些行为，要有具体的奖励措施。所以在定义考核办法时，需要首先考虑清楚要体现企业的哪些价值观。 </p><p>　　◆要体现多劳多得，质与量并重 </p><p>　　不能让那些完成了大量艰苦工作的人员吃亏，否则就会打击真正努力工作的人员的积极性。多劳多得原则的实现，基于对工作量的计算。规范的管理都是“以人为本、以过程为核心、以度量为基础”的。要做到多劳多得就需要做好对工作量的度量，如果仅仅注重工作量而不关注工作质量，显然是不对的，而对于质量的考核，可以通过多个渠道来获得数据，如发现的缺陷个数、客户的反馈等等。当然多劳多得的前提是团队的目标达成了，如果目标未完成，多劳未必多得。 </p><p>　　◆要鼓励创新与规范管理 </p><p>　　管理与创新是软件企业发展的2个轮子，通过规范管理可以确保企业的常规发展，通过创新实现企业的跳跃式发展，管理为创新提供了转化为生产力的基础，创新可以快速地提高企业的竞争能力，因此在考核办法中要体现出来对这2者的认可。有的企业设立了创新基金，专门用来奖励那些技术创新、管理创新等，有的企业在研发人员的考核指标中加入了对过程改进工作的支持等指标。 </p><p>　　◆要鼓励技术复用 </p><p>　　成功的软件企业必须在人员、技术、过程三个方面加大投入。软件复用是目前软件公司提高软件生产率的最有效的手段之一，为了在企业内建立组织级的技术复用体系，首先就要鼓励大家主动去提取可复用的各种构件，主动贡献可复用的构件。对于这种提取可复用构件的行为，应根据其可能带来的收益，适当给予奖励。 </p><p>　　◆要因时而变，但要尽可能保持连续性 </p><p>　　考核办法的制定都有一定的针对性，具有一定时限性，随着公司内外部环境的变化，随着公司文化的逐步稳定，对考核办法要逐步调整，在改变考核办法时，要注意保持考核办法的连续性，不要变化太大，否则就会让被考核人无所适从，产生观望的心态，或者在研究考核办法上花费很多时间，造成不必要的生产效率的下降。 </p><p>　　◆要量化与非量化结合 </p><p>　　如果没有量化的考核指标，全靠非量化的指标，对于开发人员来讲，很难体现多劳多得的原则，很容易走向“吃大锅饭”的模式，无法调动开发人员的积极性。如果全量化也很难，在开发过程中，有很多工作难以量化，比如需求开发的工作，就很难定量的计算工作量。因此在考核时，在尽可能量化的基础上，也允许有一些非量化的指标的存在。至于2者的比重，可以根据当前企业的管理水平来确定。对于管理比较规范的企业，成熟度比较高的企业，可以采用量化的指标多一些，量化的比重大一些。 </p><img src ="http://free-j2ee.blogjava.net/aggbug/219371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-08-01 16:01 <a href="http://www.blogjava.net/gdws/archive/2008/08/01/219371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>排序链树搜索算法在GIS POI关键字搜索中的应用</title><link>http://www.blogjava.net/gdws/articles/218953.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 31 Jul 2008 04:04:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/articles/218953.html</guid><description><![CDATA[
		<h3>标签</h3>排序 链树 GIS POI 关键字 搜索算法<br /><h3>概念阐述</h3><h4>链树及其相关概念</h4>本来，数据结构教科书中，不存在一种叫做“链树”的数据结构，用Goolge也搜索不到。这种数据结构，是为了在GIS系统中进行POI关键字高速搜索，在n叉树的基础上，改进的一种数据结构，为了论述方便，姑且称之为链树。<br />链树，就是在n叉树的基础上，给每个树节点(包括树根和叶子)，都挂接上一个链表而形成的数据结构。<br />下图就表示一棵典型的链树<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls1-full.jpeg" /><br />图1<br /><br />链树的2个显著特点是：<br />   1. 某树节点所挂接的链表元素，为该树节点的所有子孙节点(如果有)所挂接的链表元素之集合(无重复节点)。<br />   2. 链树的根结点，可以是一个虚拟节点，代表系统中所有实体节点的祖先。这样，就不必要形成链树森林了。图1的根结点就是一个虚拟节点，其余节点都为实体节点。 <br /><h4>排序链树搜索算法</h4>该算法是指，根据关键字序列，从链树根结点出发，在链树中路由，最终找到一个链树路径和关键字序列最大匹配的树节点，然后取其挂接链表的算法。<br />以图1所示之排序链树为例，假定每个树节点的关键字即为其上的标签字符，假如我们需要搜索的关键字序列为“ACI”,那么该算法的执行顺序为：<br />1.从根结点出发，查找关键字为‘A’的树节点。<br />根节点Root下有2个孩子，分别为‘A’和‘X’，因为排序链树节点的所有孩子都按一定规则排序，所以这一步可以使用二分查找来进行，假定Root有n个孩子，那么这一步所花时间为lgn.<br />2.在‘A’的所有孩子中查找关键字为‘C’的孩子。<br />同样用二分查找，假定‘A’有m个孩子，那么这一步所花时间为lgm。<br />3.在‘C’的所有孩子中查找关键字为‘I’的孩子。<br />同样使用二分查找，假定‘C’有p个孩子，那么这一步所花时间为lgp<br />综上，关键字序列为“ACI”的搜索时间为lgn+lgm+lgp。<br />根据链树的特点，有n&gt;=k&gt;=p，所以搜索长度为3的关键字序列的时间复杂度为O(3lgn)，推而广之，我们得到更一般的排序链树搜索算法复杂度:<br />假如关键字序列长度为k，系统中总的实体节点个数为n,那么在排序链树搜索算法的时间复杂度为O(klgn)。<br /><h3>关于POI</h3>在GIS系统中，对于地图上的一个具有详细信息的点，我们称之为POI（Point Of Interest）。比如名称为“北京西单图书大厦”的POI,就包含了该地点的一系列详细信息，这些信息通常有:<br />   1.该POI的名称，这里是“西单图书大厦”<br />   2.该POI的经纬度<br />   3.该POI的地址<br />   4.该POI的类型<br />   5.该POI的描述信息<br />   6.该POI的电话号码<br />   7.该POI的网址<br />   8.该POI的照片<br />   9.该POI的音频，视频<br />   …...<br />通常，一个城市中，就存在千百万个这样的POI。其数据量是相当的巨大。<br /><h4>关于POI的关键字搜索</h4>在GIS相关应用中，都会提供一种最基本的功能，就是根据用户输入的关键字，搜索到和该关键字相关的一系列POI，按照和用户输入字串匹配度由高到底的顺序，把这些POI呈现给用户。因为用户输入的关键字，可能和该POI的名称相关，也可能和该POI的地址，类型名称，描述信息，网址等字段相关。理论上，只要POI的某个字段，或者某几个字段的组合，和用户输入的关键字有关系，那么，这个POI就应该出现在搜索结果列表的合适位置上。<br />比如用户输入的关键字为“北大”，那么搜索出来的POI可能有:<br />  北大荒(名字中包含’北’，‘大’，且这2个字连在一起)<br />  北京大学(名字中包含’北’，‘大’，这2个关键字被隔开了，称之为跳字)<br />  北京邮电大学(名字中包含’北’，‘大’，跳字)<br />  大北窑(名字中包含‘北’,‘大’，但这2个关键字被颠倒了，称之为逆字)<br />  未名湖(地址中含有‘北‘，‘大’二字)<br />  ……<br />当然按照我们一般的思路，北京大学应该排在第一位，因为一般来说，北大指的就是它。所以GIS系统要求在本次搜索中，北京大学应该排在第一位。<br />为了简化问题，本文只限于对POI的名称这一字段进行关键字搜索。也就是说，只把名称字段和用户输入字串有关联的POI搜索出来。<br /><h3>如何在POI关键字搜索中应用链树搜索算法</h3>如何在POI关键字搜索应用链树呢，我们举例来说。假定某城市中存在5个POI,其名称分别是:<br />  北京大学<br />  北京邮电大学<br />  大北窑<br />  未名湖<br />  北大荒<br />那么我们首先要做的工作就是建立排序链树，然后再依据排序链树，进行关键字搜索。<br /><h4>建立排序链树</h4>建立排序链树的工作分成以下几步来做。<br />  1.分别给每个POI编号,指定其ID，如下<br />       北京大学(1)<br />       北京邮电大学(2)<br />       大北窑(3)<br />       未名湖(4)<br />       北大荒(5)<br />每个POI的详细信息，可以存在一个二进制文件(raw data)中，然后再建立一个索引文件，该文件包括5个索引条目，每个条目为一个POI在raw data文件中的偏移量(offset)与长度(size),该POI的索引条目序号(index)，即为该POI的ID，这样，根据该POI的ID,查询索引文件，可以得到其在raw data中的offset和size,进而获取其详细信息。<br />  2.建立一个虚拟节点Root,作为排序链树之根，把所有POI的ID链表挂接在Root上，这些ID按以空字符为关键字进行POI查询的呈现结果为序。<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls2-full.jpeg" /><br />图2<br /><br />可以看到，如果以空字符进行POI关键字查询，输出结果顺序为<br />      北大荒<br />      北京大学<br />      北京邮电大学<br />      大北窑<br />      未名湖<br />很明显，这是按拼音排序的。<br />  3.找出该城市所有POI名称中涉及到的字符集合。<br />在我们的例子中，这个集合包括为:{‘北’，‘大’，‘荒’，‘京’，‘学’，‘邮’，‘电’，‘窑’，‘未’，‘名’，‘湖’},共11个汉字。把该集合中的元素按字符的UNICODE编码大小排序，我们姑且假定排序后的顺序不变。<br />  4.把字符集合中的每一个字符都作为一个树节点之关键字，并且让该树节点成为Root之子。如下图<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls3-full.jpeg" /><br />图3<br /><br />接下来，我们要以每个孩子为根，建立一颗子链树，为了论述方便，本文只讲述以‘北’字为树根的这棵子链树，其他子链树，可以依此类推。<br />  5.对于图3中每个子节点，挂接上一个ID链表，这些ID所代表的POI的名称中，都包含了该树节点所对应的字符。而且这些ID按照以该字符为关键字进行POI查询的呈现结果顺序为序。例如‘北’字形成的链表如下:<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls4-full.jpeg" /><br />图4<br /><br />之所以挂接链表是5，1，2，3，是因为我们在以‘北’字进行POI关键字查询时，GIS系统要求我们的输出POI的列表顺序必须是:北大荒，北京大学，北京邮电大学，大北窑这个顺序。<br /><br />  6.对于每一个根节点，构建其子节点列表。构建规则为<br />   a.子节点所代表字符，能和其父节点所代表字符，出现在同一个POI的名称中。<br />   b.子节点列表，按其所代表字符的UNICODE大小排序。<br />比如‘北’字，其子节点列表为:<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls5-full.jpeg" /><br />图5<br /><br />在这里，我们假定这几个字的UNICODE排序结果如上图所示。 <br />大家可以看到，11个字符中，基本上所有字符都能和‘北’字组合，除了‘未’，‘名’，‘湖’这3个字符和‘北’字本身，当然，如果有个POI叫“北北 ”，那么‘北’字也会成为其本身的子节点。但是有一点是，父子节点的关键字可以相同，但是兄弟节点的关键字绝对不相同，他们是互斥的.<br />  7.结合父节点和每个子节点，形成每个子节点所挂接的ID链表。构建规则为：<br />  该ID链表所代表的POI列表，即为用户以链树路径作为关键字，查询出来的POI结果列表。<br />比如对于根为‘北’字的链树，到这一步的结果为:<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls6-full.jpeg" /><br />图6<br /><br />大家可以看到，对于路径“北大”，所挂接的ID链表为1，5，2，3，也就是<br />        北京大学<br />        北大荒<br />        北京邮电大学<br />        大北窑<br />这个顺序，也就是GIS系统所要求的输出顺序。<br />  8.按照以上规律，继续为第二层节点添加子节点。形成的高度为3的链树如下图所示<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/chencwf/437146/o_ls7-full.jpeg" /><br />图7<br /><br />从上图可以看到，颜色为红色的链树节点已经到达叶子，无法再向下伸展了。 <br />  9.依此类推，还可以继续向下扩展链树。最终的链树深度为6,对应着名称最长的POI节点，也就是“北京邮电大学”，由于篇幅所限，就不再给出图示了。<br />至此，我们的排序链树已经建好了。关于链树的建立，还有几个地方要说明一下:<br />    a.关于ID链表的排序<br />ID链表的顺序，需要我们的POI数据处理程序按照一定的规则来实现，除了通用的一些规则外，还有些特定的简称数据要处理，比如“北大”所对应的POI列表，第一条通常应该是“北京大学”，而不是“北大荒”。  <br />    b.关于排序链树的存储<br />为了加快搜索速度，排序链树森林中的冗余数据很多，所以实现者应该认真考虑文件存储格式，以便节约存储空间。 <br /><h4>根据排序链树，按关键字搜索POI</h4>建立了排序链树之后，我们就可以按排序链树搜索算法，来进行POI关键字查询了。例如用户如果输入的关键字为“北大”2字，先从Root根节点出发，根据关键字序列，逐级向下路由，得到查询结果1,5,2,3。然后根据这些POI ID,从raw data文件中检索出详细信息即可。因为采用了排序链树搜索算法，对于长度为k的关键字，在POI总量为n的情况下，POI关键字查询的时间复杂度为:<br />        T = O(klgn)<br />比一般的时间复杂度为O(kn)的GIS POI关键字搜索算法，搜索速度有了较大的提升。<br /><h3>算法优劣分析</h3>综上分析可知，采用排序链树搜索算法进行POI关键字查询，其优势在于：<br />    * 搜索时间少，时间复杂度为O(klgn)<br />    * 可以让用户边输入，边路由，边搜索，实现实时搜索的功能，对于采用ajax效果的Web GIS来说，犹为合适。<br />    * 此算法对通配符支持友好，比如用户输入的关键字串为“北大*”或者“北?荒”，此算法都能够比较容易的适应。<br />其主要劣势在于其ID链表的数据冗余度较大，而且建树过程比较复杂，对POI数据处理程序的要求比较高。但是因为这些工作都在Server端完成，在目前多核，巨量内存，集群的server端硬件条件下，应该都不是大问题。<br /><h3>作者信息</h3>Jagie,软件开发爱好者,可以通过chen_cwf@163.com与他联系。本文来自于Jagie的google page:http://chencwf.googlepages.com/linktree <br /><img src ="http://free-j2ee.blogjava.net/aggbug/218953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-07-31 12:04 <a href="http://www.blogjava.net/gdws/articles/218953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内蒙古小吃-稍美</title><link>http://www.blogjava.net/gdws/archive/2008/07/24/217124.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Thu, 24 Jul 2008 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/archive/2008/07/24/217124.html</guid><description><![CDATA[
		<p align="left">
				<font color="#0000ff" size="4">稍美     <br />      又称“烧美”，是呼和浩特的一种流传很久、至今不衰的传统风味食品。  <br /><br />早在清朝时，当地的稍美就已名扬京城了。当时，北京前门一带，<br /><br />稍美馆的门前悬挂的招牌上，往往标有“归化城稍美”字样。<br /><br />外地客人来到呼和浩特，都要品尝一下稍美，才算不虚此行。<br /><br />稍美制作工艺独特，选料精良，皮子精而薄、羊肉馅肥瘦适中，<br /><br />葱姜等佐料齐全。稍美出笼，鲜香四溢。观其形，只见皮薄蝉翼，<br /><br />晶莹透明，用筷提起垂垂如细囊，置于盘中团团如小饼。<br /><br />吃起来香而不腻。可谓食中美餐，形美而味浓。呼和浩特的稍美，<br /><br />过去专作早点之用，多由茶馆经营，<br /><br />如今，已成了许多饭馆的必备食品和家庭中的常用美餐了。</font>
		</p>
<img src ="http://free-j2ee.blogjava.net/aggbug/217124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-07-24 11:08 <a href="http://www.blogjava.net/gdws/archive/2008/07/24/217124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PDA开发环境搭建。</title><link>http://www.blogjava.net/gdws/archive/2008/07/21/216279.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Mon, 21 Jul 2008 01:03:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/archive/2008/07/21/216279.html</guid><description><![CDATA[所使用<span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">EVC4.0</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体">开发环境：<br /><br />  1.<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 宋体">首先安装</span><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"></span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 宋体"><a href="http://download.microsoft.com/download/WindowsCENETPlatformBuilder/Install/4.0/NT5XP/EN-US/eVC4.exe"><span style="COLOR: #336699; TEXT-DECORATION: none; text-underline: none">eMbedded Visual C++ 4.0</span></a><br />   2. <span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">然后下载</span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span><p class="MsoNormal" style="BACKGROUND: white; MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; TEXT-INDENT: 24pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-line-height-alt: 11.0pt" align="left"></p><p class="MsoNormal" style="BACKGROUND: white; MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; TEXT-INDENT: 24pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-line-height-alt: 11.0pt" align="left"><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><a href="http://download.microsoft.com/download/7/4/7/747b8147-2541-4948-a7a5-d24dc0535419/evc4sp3.exe"><span style="COLOR: #336699; TEXT-DECORATION: none; text-underline: none"></span></a></span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p><p class="MsoNormal" style="BACKGROUND: white; MARGIN: 0cm 0cm 0pt; WORD-BREAK: break-all; TEXT-INDENT: 24pt; LINE-HEIGHT: 11pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><a href="http://download.microsoft.com/download/7/4/7/747b8147-2541-4948-a7a5-d24dc0535419/evc4sp3.exe"></a></span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></span></p><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 宋体"><a href="http://download.microsoft.com/download/a/7/3/a735c7fb-dcbd-429f-9090-d09b3b15d3fa/evc4sp4.exe"><span style="COLOR: #336699; TEXT-DECORATION: none; text-underline: none">eMbedded Visual C++ 4.0 SP4</span></a><br /><br /><span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 宋体">补丁安装，装好后，就可以安装各个开发平台的模拟器了<br /><br />3.<span style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 宋体"><span style="mso-spacerun: yes"> 下载模拟器：</span><span lang="EN-US"><a href="http://download.microsoft.com/download/6/9/5/69570242-44e8-45e6-a252-9bd56db8ec83/Microsoft%20Pocket%20PC%202003%20SDK.msi"><span style="COLOR: #336699; TEXT-DECORATION: none; text-underline: none">Microsoft Pocket PC 2003 SDK.msi</span></a></span></span></span></span></span></span><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: #2a2a2a; FONT-FAMILY: Times"></span><span lang="EN-US" style="FONT-SIZE: 7pt; COLOR: #2a2a2a"><o:p></o:p></span></p><p></p><p>注意的地方:</p><p>(一).Localized Emulation Images for Windows Mobile? 2003-based PPC2003SE ,若开发简体中文程</p><p>序它应该是PPC2003SE 2003 SDK Chinese Simplified Emulation Images.msi。它可以使你的模拟器具</p><p>备显示中文的能力。安装完毕后，需要在evc环境中作一些设置，方可让你的开发环境调用支持中文的模</p><p>拟器映像。设置步骤如下：</p><p>1).打开evc环境下的tools-&gt;configure platform manager...,在TreeView中选择PPC2003SE(若你以正确</p><p>安装了SDK for Windows Mobile? 2003-based PPC2003SE ），</p><p>2)点击add device，输入设备名称，如：“CHS_SMARTPHONE 2003 Emulator”。</p><p>3).点击properties...进入device properties对话框，在transport一栏中选择TCP/IP Transport for </p><p>windows ce，在startup一栏中选择Emulator startup server（默认选项），</p><p>4).点击startup一栏右边的Configure...按钮进入Emulator configuration settings对话框，在</p><p>device-&gt;image一栏下选择CHS PPC2003SE（virtual radio),其他保持默认值，选择确定，回到device </p><p>properties界面，选择test可以测试你的设置是否正常工作。在正确设置后便可在evc环境的WCE </p><p>Configuration bar中选择支持中文的模拟器了;<br /></p><img src ="http://free-j2ee.blogjava.net/aggbug/216279.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-07-21 09:03 <a href="http://www.blogjava.net/gdws/archive/2008/07/21/216279.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ESuperMap开发</title><link>http://www.blogjava.net/gdws/archive/2008/07/15/214922.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Tue, 15 Jul 2008 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/archive/2008/07/15/214922.html</guid><description><![CDATA[最近在做PDA上GIS系统的开发，所用GIS平台是esupermap，使用evc++进行开发。<br /><br />有爱好者可加入我们的行列，共同开发。<br /><br />欢迎大家加入。<img src ="http://free-j2ee.blogjava.net/aggbug/214922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-07-15 11:42 <a href="http://www.blogjava.net/gdws/archive/2008/07/15/214922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>祝大家5.1节日快乐</title><link>http://www.blogjava.net/gdws/archive/2008/04/30/197476.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Wed, 30 Apr 2008 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/archive/2008/04/30/197476.html</guid><description><![CDATA[            一年一度的劳动节到了,到处都流露着节日的气息,政府,企业,学校等都在响应国家放假3天.<br /> 又是一个回家欢庆的节日、又是一个家人团圆、朋友相聚的节日、又是一个可以好好放松、休养生息的节日！<br />  做为开发人员希望大家出去玩玩,放松一下.<img src ="http://free-j2ee.blogjava.net/aggbug/197476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-04-30 11:40 <a href="http://www.blogjava.net/gdws/archive/2008/04/30/197476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax 入门 4 </title><link>http://www.blogjava.net/gdws/archive/2008/04/25/195956.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 25 Apr 2008 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/archive/2008/04/25/195956.html</guid><description><![CDATA[这次我们来一步一步的仿造一个google的搜索栏,由于本人学的也很浅相信大家不会看得很迷糊,由于我们没有链接数据库,我采用一个硬编码来编写被匹配的内容,正常情况下应该是从数据库中取出一个表的”被搜索最多次数”的10个内容然后进行匹配<br />import java.util.ArrayList;<br />import java.util.List;<br /><br /><br />public class ListFactory {<br />    public static List getList(){<br />        List list = new ArrayList();<br />        list.add("ibm");<br />        list.add("hp");<br />        list.add("dell");<br />        list.add("desk");<br />        return list;<br />    }<br /><br />}<br /><br />这个工厂生成了一个list,里面存储了需要匹配的内容<br />有了匹配信息我们还需要一个servlet来对它进行匹配<br /><br />新建一个servlet<br />映射地址 searchAction<br /><br />import java.io.IOException;<br />import java.io.PrintWriter;<br />import java.util.List;<br /><br />import javax.servlet.ServletException;<br />import javax.servlet.http.HttpServlet;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br /><br /><br />public class SearchAction extends HttpServlet {<br /><br />    /**<br />     * Constructor of the object.<br />     */<br />    public SearchAction() {<br />        super();<br />    }<br /><br />    /**<br />     * Destruction of the servlet. &lt;br&gt;<br />     */<br />    public void destroy() {<br />        super.destroy(); // Just puts "destroy" string in log<br />        // Put your code here<br />    }<br /><br />    /**<br />     * The doGet method of the servlet. &lt;br&gt;<br />     *<br />     * This method is called when a form has its tag value method equals to get.<br />     * <br />     * @param request the request send by the client to the server<br />     * @param response the response send by the server to the client<br />     * @throws ServletException if an error occurred<br />     * @throws IOException if an error occurred<br />     */<br />    public void doGet(HttpServletRequest request, HttpServletResponse response)<br />            throws ServletException, IOException {<br />        //转发至doPost();<br />        doPost(request,response);<br />    }<br /><br />    /**<br />     * The doPost method of the servlet. &lt;br&gt;<br />     *<br />     * This method is called when a form has its tag value method equals to post.<br />     * <br />     * @param request the request send by the client to the server<br />     * @param response the response send by the server to the client<br />     * @throws ServletException if an error occurred<br />     * @throws IOException if an error occurred<br />     */<br />    public void doPost(HttpServletRequest request, HttpServletResponse response)<br />            throws ServletException, IOException {<br />        //用于缓存匹配对象的字符串,正常应该是个数组<br />        String temps="";<br />        response.setContentType("text/html");<br />        PrintWriter out = response.getWriter();<br />        //从工厂类中取出要匹配的list<br />        List list = ListFactory.getList();<br />        //ajax发送过来的请求值,也就是页面上现在输入的内容<br />        String inputtext = request.getParameter("inputtext");<br />        //遍历list<br />        for(int i=0;i&lt;list.size();i++){<br />            String temp = (String) list.get(i);<br />            //如果在匹配内容头中找到当前输入的字符串,且输入不是空串<br />//indexOf 返回字串的位置,为0 则表示 123中找到了12 ,而找不到23因为23的indexOf<br />//为1<br />            if(temp.indexOf(inputtext)==0 &amp;&amp; inputtext!=null &amp;&amp; inputtext.trim().length()!=0){<br />                //将匹配上的list内容添加到缓存字符串<br />                temps=temps+temp+"&lt;br&gt;";<br />            }<br />        }<br />        //输出缓存字符串<br />        out.write(temps);<br />        out.flush();<br />        out.close();<br />    }<br /><br />    /**<br />     * Initialization of the servlet. &lt;br&gt;<br />     *<br />     * @throws ServletException if an error occure<br />     */<br />    public void init() throws ServletException {<br />        // Put your code here<br />    }<br /><br />}<br /><br />有了工厂类(替代数据库),有了控制器,现在开始写前台的页面和ajax<br /><br />&lt;%@ page language="java" import="java.util.*" pageEncoding="utf-8"%&gt;<br />&lt;%<br />String path = request.getContextPath();<br />String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";<br />%&gt;<br /><br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />  &lt;head&gt;<br />    &lt;base href="&lt;%=basePath%&gt;"&gt;<br />    <br />    &lt;title&gt;My JSP 'index.jsp' starting page&lt;/title&gt;<br />    &lt;meta http-equiv="pragma" content="no-cache"&gt;<br />    &lt;meta http-equiv="cache-control" content="no-cache"&gt;<br />    &lt;meta http-equiv="expires" content="0"&gt;    <br />    &lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;<br />    &lt;meta http-equiv="description" content="This is my page"&gt;<br />    &lt;!--<br />    &lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;<br />    --&gt;<br />  &lt;/head&gt;<br />  &lt;script src="js/prototype.js"&gt;&lt;/script&gt;<br />  &lt;script src="js/test.js" &gt;&lt;/script&gt;<br />  &lt;body&gt;<br />  &lt;table width="100%" border="1" bordercolor="#000000"&gt;<br />    &lt;tr&gt;<br />      &lt;td&gt;<br />        &lt;input name="text" type="text" id="itext" onKeyUp="getXML()"/&gt;<br />        &lt;input name="button" type="button"  value="搜索"/&gt;<br />        &lt;div id="outdiv" style=" display:none; width:119px; height:20; position:absolute; left: 16px; top: 41px; background-color:#ECEDFF"&gt;111&lt;/div&gt;<br />      &lt;/td&gt;<br />    &lt;/tr&gt;<br />    &lt;tr&gt;<br />      &lt;td&gt; &lt;/td&gt;<br />    &lt;/tr&gt;<br />  &lt;/table&gt;<br />  &lt;/body&gt;<br />&lt;/html&gt;<br /><br />这个页面中唯一需要注意的是 作为输出匹配框的 div 层<br />&lt;div id="outdiv" style=" display:none; width:119px; height:20; position:absolute; left: 16px; top: 41px; background-color:#ECEDFF"&gt;111&lt;/div&gt;<br />此层一开始被设置为隐藏,111可以不写,其实写什么都看不到,因为它根本没有被显示<br />Display:none 类似的属性还有 visible,它们的区别在此不说了,百度一下,你就知道<br />文本框设置一个键盘事件<br />onKeyUp="getXML()"<br />每次键盘抬起就调用一次函数<br /><br />在开始写脚本文件之前需要先导入prototype库,在我的ajax入门3 里有提及<br /><br />正常导入它以后我们就开始 编写 test.js 文件<br /><br />//键盘抬起时激活的函数<br />function getXML(){<br />    //局部请求地址<br />    var url="searchAction";<br />    //获取用户当前输入的内容<br />    var inputvalue=$("itext").value;<br />    //使用prototype函数构造xmlhttprequest对象<br />    var myAjax = new Ajax.Request(<br />    url,<br />    {<br />        //请求方法为post<br />        method:'post',<br />        //设置参数为 inputtext=inputvalue<br />        parameters:"inputtext="+inputvalue,<br />        //设置回调函数<br />        onComplete:showResponse,<br />        //是否异步<br />        asynchronous:true<br />    }<br />    );<br />}<br /><br />function showResponse(xmlrequest){<br />//还是需要注意回调函数的参数,使用此参数的responseText属性获取服务器//servlet返回的文本内容,要取得XML请参考我之前的 ajax 入门文章<br />    var text = xmlrequest.responseText;<br />    //如果返回的被匹配上的内容不为空<br />    if(text!=""){<br />        //显示该层,关于element.show也是prototype的函数<br />        Element.show("outdiv");<br />    }else{<br />//如果没匹配上就隐藏该层,注意我们的思路是每次键盘抬起都进行一次请求,<br />//然后进行判断,不匹配就隐藏<br />        Element.hide("outdiv");<br />    }<br />    //将匹配的内容输出到 div 层<br />    $("outdiv").innerHTML=xmlrequest.responseText;<br />}<br /><br /><br />以下内容为更新:<br /><br /><br /><br />这里我们可以再稍微丰富一下比如将servlet的doPost改写成<br /><br />    public void doPost(HttpServletRequest request, HttpServletResponse response)<br />            throws ServletException, IOException {<br />        String temps="";<br />        response.setContentType("text/html");<br />        PrintWriter out = response.getWriter();<br />        List list = ListFactory.getList();<br />        String inputtext = request.getParameter("inputtext");<br />        for(int i=0;i&lt;list.size();i++){<br />            String temp = (String) list.get(i);<br />            if(temp.indexOf(inputtext)==0 &amp;&amp; inputtext!=null &amp;&amp; inputtext.trim().length()!=0){<br />                temps=temps+temp+"$";<br />            }<br />        }<br />        out.write(temps);<br />        out.flush();<br />        out.close();<br />    }<br /><br />也就是使用"$"字符来将返回的几个匹配分割<br /><br />然后在javascript中对其进行解析<br /><br />function showResponse(xmlrequest){<br />    var text = xmlrequest.responseText;<br />    var texts = text.split("$");<br />    if(text!=""){<br />        Element.show("outdiv");<br />    }else{<br />        Element.hide("outdiv");<br />    }<br />    var temp = "";<br />    var outdiv = $("outdiv");<br />    for(var i = 0;i &lt; texts.length-1;i++){<br />        temp = temp + "&lt;span style=cursor:hand onclick='inMessage(this)'&gt;" +texts[i]+ "&lt;/span&gt;" +"&lt;br&gt;";<br />    }<br />    outdiv.innerHTML = temp;<br />}<br /><br /><br />function inMessage(obj){<br />    //alert(obj.innerHTML);<br />    $(itext).value = obj.innerHTML;<br />    Element.hide("outdiv");<br />}<br /><br />这样每次出现下拉列表之后列表中的项目都可以被选择,点击之后内容就会录入到搜索框中了 <br /><img src ="http://free-j2ee.blogjava.net/aggbug/195956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-04-25 14:16 <a href="http://www.blogjava.net/gdws/archive/2008/04/25/195956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax 入门 5</title><link>http://www.blogjava.net/gdws/archive/2008/04/25/195957.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 25 Apr 2008 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/archive/2008/04/25/195957.html</guid><description><![CDATA[本次我们再做一点,给这个搜索栏加入一个能够表示请求状态的功能<br />先引出Ajax.Responsders对象<br />这还是一个prototype类库的ajax对象,没有接触的朋友请去找我的ajax入门3<br /><br />这个对象用于注册Ajax的事件监听器,无论任何一个xmlhttprequest对象与服务器发生交互,该对象注册的监听器都将被自动调用<br /><br />首先在我们的仿造google搜索栏的项目中的test.js脚本文件中加入一个事件监听器<br />//定义全局事件处理<br />var globalMan={<br />    //开始交互时运行<br />    onCreate: function(){<br />        //alert("onCreate()");<br />        Element.show("loading");<br />    },<br />    onFailure: function(){<br />        alert("服务器错误或者网络连接错误");<br />    },<br />    onComplete:function(){<br />        if(Ajax.activeRequestCount == 0){<br />            //alert("onComplete");<br />            Element.hide("loading");<br />        }<br />    }<br />}<br /><br />然后用 Ajax.Responders对象将它绑定<br />Ajax.Responders.register(globalMan);<br /><br />其中onCreate为开始交互时,onFailure为交互失败,onComplete为交互完成<br />Ajax.activeRequestCount 表示 Ajax类下的activeRequestCount属性,这个属性代表了正在进行交互的xmlhttprequest对象的个数,当它为0时,表示所有的局部请求都已完成.<br /><br />这里我们仅仅对一个id属性为”loading”的div层进行了显示和隐藏的操作,用来提示用户交互是否在执行,如果交互开始执行就显示它,提示用户开始交互了,交互完毕就隐藏它.<br />下面我们在页面中加入这个loading层<br /><br />&lt;%@ page language="java" import="java.util.*" pageEncoding="utf-8"%&gt;<br />&lt;%<br />String path = request.getContextPath();<br />String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";<br />%&gt;<br /><br />&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />  &lt;head&gt;<br />    &lt;base href="&lt;%=basePath%&gt;"&gt;<br />    <br />    &lt;title&gt;My JSP 'index.jsp' starting page&lt;/title&gt;<br />    &lt;meta http-equiv="pragma" content="no-cache"&gt;<br />    &lt;meta http-equiv="cache-control" content="no-cache"&gt;<br />    &lt;meta http-equiv="expires" content="0"&gt;    <br />    &lt;meta http-equiv="keywords" content="keyword1,keyword2,keyword3"&gt;<br />    &lt;meta http-equiv="description" content="This is my page"&gt;<br />    &lt;!--<br />    &lt;link rel="stylesheet" type="text/css" href="styles.css"&gt;<br />    --&gt;<br />  &lt;/head&gt;<br />  &lt;script src="js/prototype.js"&gt;&lt;/script&gt;<br />  &lt;script src="js/test.js" &gt;&lt;/script&gt;<br />  &lt;body&gt;<br />  &lt;table width="100%" border="1" bordercolor="#000000"&gt;<br />    &lt;tr&gt;<br />      &lt;td width="18%"&gt;<br />        &lt;input name="text" type="text" id="itext" onKeyUp="getXML()"/&gt;<br />        &lt;input name="button" type="button"  value="搜索"/&gt;<br />        &lt;div id="outdiv" style=" display:none; width:119px; height:20; position:absolute; left: 16px; top: 41px; background-color:#ECEDFF"&gt;<br />        <br />        &lt;!-- 此处添加行列 --&gt;<br />        <br />        &lt;/div&gt;<br />      &lt;/td&gt;<br />    &lt;td width="82%"&gt;&lt;div id="loading" style="position:absolute; display:none"&gt;正在加载...&lt;/div&gt; &lt;/td&gt;<br />    &lt;/tr&gt;<br />    &lt;tr&gt;<br />      &lt;td colspan="2"&gt; &lt;/td&gt;<br />    &lt;/tr&gt;<br />  &lt;/table&gt;<br />  &lt;/body&gt;<br />&lt;/html&gt;<br /><br />这里唯一需要注意的是div层的定位,关于position:absolute 的属性等我研究明白了跟大家分享 - -<br /><img src ="http://free-j2ee.blogjava.net/aggbug/195957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-04-25 14:16 <a href="http://www.blogjava.net/gdws/archive/2008/04/25/195957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax 入门 3</title><link>http://www.blogjava.net/gdws/archive/2008/04/25/195954.html</link><dc:creator>帅子</dc:creator><author>帅子</author><pubDate>Fri, 25 Apr 2008 06:15:00 GMT</pubDate><guid>http://www.blogjava.net/gdws/archive/2008/04/25/195954.html</guid><description><![CDATA[才知道ajax应用并不需要一次又一次createXmlHttpRequest,使用框架,一切变得很轻松<br />Prototype仅仅是一个编写好的js脚本库,跟javascript一样,此脚本库只需在页面引用即可<br />下载地址: <a href="http://prototype.conio.net/dist/prototype-1.4.0.tar.gz">http://prototype.conio.net/dist/prototype-1.4.0.tar.gz</a><br />这是一个完全版本,只需要将文件解压,然后在dest目录下拷贝出prototype.js就可以使用,这个文件不需要任何其他文件,只需要在您的项目中拷贝它,引用它,使用它.<br />这里我使用两个脚本文件来对其进行讲解<br />  &lt;script src="js/prototype.js"&gt;&lt;/script&gt;<br />  &lt;script src="js/test.js" &gt;&lt;/script&gt;<br />在调试的时候使用&lt;script src="js/prototype.js"/&gt;会造成IE页面没有任何显示,也不报错,很不解,希望知道为什么的朋友可以告诉我<br /><br />要被赋值的文本框<br />&lt;input type="text" id="userName"&gt;&lt;/input&gt;<br />触发事件的button<br />&lt;input type="button" value="button" onClick="testGEBI('userName')"/&gt;&lt;br&gt;<br />用于输出的局部刷新位置<br />ss:&lt;span id="ss"&gt;&lt;/span&gt;&lt;br&gt;<br /><br />test.js中的函数<br />function testGEBI(str){<br />    //使用$()代替getElementById()<br />    $(str).value="button";<br />    //使用$F取文本框值<br />    ss.innerHTML=$F("userName");<br />}<br />这里$(element)相当于document.getElementById()<br />    $F(element)相当于document.getElementById().value<br />使用prototype的好处就在于可以简化我们的代码,减少代码量<br />其中参数element可以是object对象也可以是id值<br />类似的方法还有一些,大家可以去查查<br /><br />Prototype还有一些自定义的对象和类<br />这里用一个Element对象的empty(element)方法来举例<br />页面上布置一个触发事件的按钮<br />&lt;input type="button" value="testEmpty" onClick="isEmpty()"/&gt;<br />&lt;span id=”ise”&gt;&lt;/span&gt;<br />脚本中加入<br />function isEmpty(){<br />    if(Element.empty("ss")){<br />        ise.innerHTML="空元素";<br />    }<br />}<br />这个方法判断id为”ss”的标签内部是否有元素,如果没有返回true,这个对象还有一些hide(element),show(element)等控制元素显示和隐藏的函数<br /><br />以下是ajax相关的内容,prototype同样为ajax提供了相关函数,避免不停的重复编写createXHR()函数,类有很多,这里只介绍一下Ajax.Request类<br /><br />脚本中加入<br />function getXML(){<br />    //局部请求的地址<br />    var url="priceAction";<br />    //创建的 对象名(这个对象名其实在这里并没有被使用过,当对象一被创建,局部请求就已经发出,所以这里不需要使用这个对象名,它完全可以是匿名的)<br />    var myAjax = new Ajax.Request(<br />    url,<br />    {<br />        method:'post', //请求方法<br />        onComplete:showResponse, //回调函数<br />        asynchronous:true //是否异步<br />    }<br />    );<br />}<br />//回调函数,注意这个回调函数是有参数,用于接收返回的信息<br />function showResponse(xmlrequest){<br />    gx.innerHTML=xmlrequest.responseText;<br />}<br />页面中加入<br />xml:&lt;span id="gx"&gt;&lt;/span&gt;&lt;input type="button" value="getXml" onclick="getXML()"/&gt;<br /><br />可以看到请求被正确发出了,没有浏览器的判断,没有手写的open函数,很简洁<br /><br />同一页面可以很方便的使用多个XmlHttpRequest对象来进行异步请求<br />脚本中再加入<br />function getXML2(){<br />    var url="priceAction";<br />    var myAjax = new Ajax.Request(<br />    url,<br />    {<br />        method:'post',<br />        onComplete:showResponse2,<br />        asynchronous:true<br />    }<br />    );<br />}<br /><br />function showResponse2(xmlrequest2){<br />    gx2.innerHTML=xmlrequest2.responseText;<br />}<br />页面中<br />xml2:&lt;span id="gx2"&gt;&lt;/span&gt;&lt;input type="button" value="getXml2" onclick="getXML2()"/&gt;<br /><br />然后我们编写一个生成随机数的servlet,注意他的地址和上面的url参数一致<br />import java.io.IOException;<br />import java.io.PrintWriter;<br />import java.util.Random;<br /><br />import javax.servlet.ServletException;<br />import javax.servlet.http.HttpServlet;<br />import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br /><br /><br />public class PriceAction extends HttpServlet {<br /><br />    /**<br />     * Constructor of the object.<br />     */<br />    public PriceAction() {<br />        super();<br />    }<br /><br />    /**<br />     * Destruction of the servlet. &lt;br&gt;<br />     */<br />    public void destroy() {<br />        super.destroy(); // Just puts "destroy" string in log<br />        // Put your code here<br />    }<br /><br />    /**<br />     * The doGet method of the servlet. &lt;br&gt;<br />     *<br />     * This method is called when a form has its tag value method equals to get.<br />     * <br />     * @param request the request send by the client to the server<br />     * @param response the response send by the server to the client<br />     * @throws ServletException if an error occurred<br />     * @throws IOException if an error occurred<br />     */<br />    public void doGet(HttpServletRequest request, HttpServletResponse response)<br />            throws ServletException, IOException {<br /><br />        response.setContentType("text/html");<br />        PrintWriter out = response.getWriter();<br />        out<br />                .println("&lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"&gt;");<br /><br />        <br />        Random rand = new Random(System.currentTimeMillis());<br />        out.write(rand.nextInt(10)+"$"+rand.nextInt(10)+"$"+rand.nextInt(10));<br />        //System.out.println(rand.nextInt(10)+"$"+rand.nextInt(10)+"$"+rand.nextInt(10));<br />        out.flush();<br />        out.close();<br />    }<br /><br />    /**<br />     * The doPost method of the servlet. &lt;br&gt;<br />     *<br />     * This method is called when a form has its tag value method equals to post.<br />     * <br />     * @param request the request send by the client to the server<br />     * @param response the response send by the server to the client<br />     * @throws ServletException if an error occurred<br />     * @throws IOException if an error occurred<br />     */<br />    public void doPost(HttpServletRequest request, HttpServletResponse response)<br />            throws ServletException, IOException {<br /><br />        doGet(request,response);<br />    }<br /><br />    /**<br />     * Initialization of the servlet. &lt;br&gt;<br />     *<br />     * @throws ServletException if an error occure<br />     */<br />    public void init() throws ServletException {<br />        // Put your code here<br />    }<br /><br />}<br /><br />点击两个getXml按钮,可以发现它们并不互相影响,页面也没有被刷新,请求被局部发出,局部刷新.Ajax的框架还有很多,prototype是一个轻量级的<img src ="http://free-j2ee.blogjava.net/aggbug/195954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gdws/" target="_blank">帅子</a> 2008-04-25 14:15 <a href="http://www.blogjava.net/gdws/archive/2008/04/25/195954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>