<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/feedsky0.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:bokee="http://rssnamespace.org/bokee/ext/1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/null" type="application/rss+xml" ref="self"></atom:link><fs:self_link href="http://feed.feedsky.com/null" type="application/rss+xml"></fs:self_link><lastBuildDate>Fri, 06 Apr 2007 16:07:47 GMT</lastBuildDate><title>letle的博客</title><description>有事没事都来瞅瞅。。。</description><link>http://letle.bokee.com</link><atom:link rel="self" href="http://letle.bokee.com.bokee.com" type="application/rss+xml"></atom:link><bokee:browserFriendly>您好，欢迎访问yunle110.bokee.com</bokee:browserFriendly><language>zh_cn</language><pubDate>Mon, 09 May 2005 03:14:59 GMT</pubDate><dc:date>2005-05-09T03:14:59Z</dc:date><dc:language>zh_cn</dc:language><image><title>博客网</title><url>http://reg.bokee.com/account/web/img/logo.gif</url><link>http://www.bokee.com</link></image><item><title>大学生求职看清劳动合同　别被试用期盘剥</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235196/1237942/1/item.html</link><description>&lt;STRONG&gt;
&lt;TABLE cellSpacing=0 cellPadding=3 width=557 align=center border=0&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD class=text&gt;
&lt;P&gt;临近毕业，很多大四学生经过努力都落实了自己的工作或是与用人单位确定了意向。对于初涉职场的大学生朋友来说，就业之前还有一个关键的环节马虎不得，那就是与用人单位签订劳动合同，如果当时麻痹大意，就有可能对今后的发展产生障碍。&lt;/P&gt;
&lt;P&gt;　　指导专家：&lt;/P&gt;
&lt;P&gt;　　北京中孚律师事务所律师 高冰&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;　　劳动合同≠劳务合同&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;　　有些用人单位会用劳务合同代替劳动合同，这二者的差别是相当大的。劳动合同中必须写明对劳动者的义务，如必须为劳动者交纳各种保险、明确最低工资标准等，而劳务合同则仅仅是一方提供劳务、另一方给付报酬的一种约定形式，一般不受劳动法的制约。&lt;/P&gt;
&lt;P&gt;　　用人单位违反劳动合同可能承担行政责任、民事责任甚至刑事责任，而违反劳务合同一般只承担民事赔偿责任。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;　　对不平等条约说不&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;　　由于用人单位在劳动合同关系中处于强势地位，在签订劳动合同过程中，有些单位会利用这种优势，制定一些不公平的格式条款，如规定不合理的服务年限、苛刻的劳动纪律以及劳动者解除合同时的惩罚性补偿措施等，强迫劳动者接受。大学生在签订劳动合同之前要特别注意审查类似的条款，对其中有失公平的地方要及时提出异议。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;　　试用期规定要明确&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;　　劳动法中对劳动者的试用期有较明确的规定：一是试用期内也应当参加社会保险；二是试用期应当包含在劳动期内；三是试用期的最长期限不得超过6个月，其中合同期在1年以上2年以下的，试用期不得超过60日，以此类推。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;　　合理确定岗位条款&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;　　一些用人单位往往故意在劳动合同中避开工作岗位条款，从而随心所欲地变更劳动者的岗位，无限扩大其管理权，这样在合同履行过程中，用人单位便可以任意变更合同内容，甚至故意进行刁难，劳动者却无以应对，最后只有无奈辞职。&lt;/P&gt;
&lt;P&gt;　　同时，对劳动合同中的工资补助和奖金条款、培训条款、保密和禁止同业竞争条款等，都需要详细审查。如工资数额是否确定及有无增资的条件，补贴及奖金的发放有无明确的计算依据和标准。至于劳动合同中的工作时间、社会保险、休息休假和劳动保护等内容，劳动法中都有明确的强制性规定，发生纠纷时直接引用相应的规定即可解决。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;　　违约条款要慎签&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;　　劳动合同中，对违约行为的补偿主要是通过支付违约金来实现的，主要包括提前解除劳动合同、违反培训协议以及因失职造成损失等情形下发生的违约金。&lt;/P&gt;
&lt;P&gt;　　最明确清晰的违约条款应当包括如下内容：构成违约的条件、赔偿损失的范围、违约金的计算方法及数额等，上述内容应合法、公平，特别对其中关于提前解除合同及因培训而产生的违约金，在签订合同时，一定要审视自己的经济承受能力，避免日后无力承担巨额赔偿陷入困境。&lt;/P&gt;
&lt;P&gt;　　经验谈&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;　　写在合同里才有效&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;　　王超 大学毕业一年，现为外企职员&lt;/P&gt;
&lt;P&gt;　　我觉得在与公司签订劳动合同的时候有两点要注意：&lt;/P&gt;
&lt;P&gt;　　一是不要轻信公司的口头承诺。我所在的公司中间经历了一次大的变动，原来的老板把公司转让给现在的法国老板，新公司给我们的合同中写着工资总计700元，人力资源负责人向我们承诺这是暂时的，很快能达到1500元，有的同事就签了这份合同。事实上根本达不到公司承诺的数目。只有写在合同中的，有明确约定的才能更好地得到履行，否则很难落实。&lt;/P&gt;
&lt;P&gt;　　二是要选择适合自己的合同期限。我在和公司签订劳动合同的时候，有两种合同期限可以选择，一种是一年的，还有一种是9个月的。我考虑我签合同的时间是在9月，如果签一年的劳动合同，到下一年9月跳槽，找工作的机会不是很好。如果签9个月的合同，到第二年五六月正好和应届生一起找工作，就业机会多一些，于是选择了后者。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;　　别被“试用期”盘剥&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;　　李雪妮 大学毕业两年，现在一家民营公司工作&lt;/P&gt;
&lt;P&gt;　　当初我签合同的时候，已经被试用了大半年，没有任何底薪和保险，终于等到签合同了，因为不太明白劳动合同，没怎么仔细看合同就签了。现在才发现当初的合同不合理。因为按照合同法的规定，最长试用期不能超过半年，而且应该从进入公司的时间开始算。&lt;/P&gt;
&lt;P&gt;　　签了合同之后，我发现其中没有明确说明如果违约了要怎么赔偿。我打算在续签合同的时候把这一项补充上去，不然，将来出现纠纷就不好办了。&lt;BR&gt;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;
&lt;TR&gt;
&lt;TD&gt;
&lt;P align=right&gt;&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;/STRONG&gt;</description><category>我的生活</category><pubDate>Sat, 07 Apr 2007 00:07:47 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.15580338.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.15580338.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235196/1237942</fs:itemid></item><item><title>好久没来了</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235197/1237942/1/item.html</link><description>&lt;P&gt;对bokee失去信心了，好久没上来了，今天一打开发现速度比以前快了不少。不过还是不太喜欢这个界面。&lt;/P&gt;
&lt;P&gt;朋友们可以去&lt;A href=&quot;http://letle.javaeye.com&quot;&gt;http://letle.javaeye.com&lt;/A&gt;继续捧场，有的文章也在&lt;A href=&quot;http://dev.iseasky.com&quot;&gt;http://dev.iseasky.com&lt;/A&gt;上。&lt;/P&gt;
&lt;P&gt;有什么需要的给我留言好了。 &lt;/P&gt;</description><category>默认栏目</category><pubDate>Mon, 02 Apr 2007 14:20:18 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.15534945.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.15534945.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235197/1237942</fs:itemid></item><item><title>开始后悔升级了</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235198/1237942/1/item.html</link><description>&lt;P&gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;升级到新版博客后，界面的视觉效果的确好了不少，图片的空间的容量也大了很多。但是模块删除的时候把原来的图片也一并删除了，55555555555~~~~~~~~~~.很是不爽，而且感觉新版的界面太过于体现人性化这一特点。可以支持将模块拖放以及快捷删除模块及日志，感觉这样反而失去了博客的特色，背离了博客诞生的初衷。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 后悔了，开始考虑搬家......&lt;/P&gt;</description><category>默认栏目</category><pubDate>Sat, 13 Jan 2007 23:57:14 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14632715.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14632715.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235198/1237942</fs:itemid></item><item><title>［译］Struts Menu开发向导</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235199/1237942/1/item.html</link><description>官方英文版向导（&lt;a href=&quot;http://struts-menu.sourceforge.net/userguide.html&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://struts-menu.sourceforge.net/userguide.html&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://struts-menu.sourceforge.net/userguide.html&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;） &lt;p&gt;一、从1.X升级到2.X需要做以下事情：&lt;br /&gt;1、改变你的taglib声明中的URI。&lt;br /&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&amp;nbsp;&amp;lt;% at taglib uri=&amp;quot;&lt;/font&gt;&lt;a href=&quot;http://struts-menu%20dot%20sf.net/tag&quot;&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&lt;/font&gt;&lt;/a /&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&amp;quot; prefix=&amp;quot;menu&amp;quot; %&amp;gt;&lt;br /&gt;&lt;/font&gt;2、改变&amp;lt;plug-in&amp;gt;,使用新的包名&amp;quot;net.sf.navigator.&amp;quot; 。&lt;br /&gt;&amp;nbsp;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&amp;lt;plug-in className=&amp;quot;net.sf.navigator.menu.MenuPlugIn&amp;quot;&amp;gt;&lt;/font&gt;&lt;br /&gt;3、改变你的menu-config.xml文件，使用新的包名&amp;quot;net.sf.navigator.&amp;quot; 。&lt;br /&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&amp;nbsp;&amp;lt;Displayer name=&amp;quot;Simple&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; type=&amp;quot;net.sf.navigator.displayer.SimpleMenuDisplayer&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/a&gt;&lt;a href=&quot;http://struts-menu.sf.net/tag&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://struts-menu.sf.net/tag&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;二、快速开始：&lt;br /&gt;1、下载最新的struts-menu版本；&lt;br /&gt;2、解包到本地目录；&lt;br /&gt;3、下载Tomcat或者其它Servlet容器；&lt;br /&gt;4、把struts-menu.war包放入Tomcat安装目录的wabapps目录下，并重启Tomcat服务。&lt;br /&gt;5、打开htpp://localhost:8080/struts-menu/&lt;/p&gt;&lt;p&gt;三、把Struts Menu整合到你的应用程序中：&lt;br /&gt;Struts Menu能够被轻易的整合到你的Struts应用程序中，它也可以整合到一个非Struts的应用程序中，但是我不喜欢这样做，所以在此没有提供相应的教程。这里将一步步的带你整合这个标签库。&lt;br /&gt;你需要把struts-menu.jar放到你的WEB-INF/lib目录下。然后使用URI标签声明你的JSP文件中想使用的这个标签库。&lt;br /&gt;如果使用Struts Menu 2.1，你还需要 Jakarta's Standard Tag Library JAR包放入你的WEB-INF/lib目录下。下载地址：&lt;a href=&quot;http://ibiblio.org/maven/taglibs/jars/standard-1.0.4.jar&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://ibiblio.org/maven/taglibs/jars/standard-1.0.4.jar&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://ibiblio.org/maven/taglibs/jars/standard-1.0.4.jar&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;，这个文件包括例程WAR包文件和二进制发布包。&lt;br /&gt;1、放入struts-menu.jar包到你的应用程序的WEB-INF/lib目录中。&lt;br /&gt;2、在你的struts-config.xml文件中加入plug-in设置。&lt;br /&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&amp;nbsp;&amp;lt;plug-in className=&amp;quot;net.sf.navigator.menu.MenuPlugIn&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;set-property property=&amp;quot;menuConfig&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; value=&amp;quot;/WEB-INF/menu-config.xml&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/plug-in&amp;gt;&lt;/font&gt;&lt;br /&gt;3、你将需要在你的应用程序的/WEB-INF/menu-config.xml文件中定义你的菜单，这里提供一个简单的片断：&lt;br /&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&amp;nbsp;&amp;lt;Menu name=&amp;quot;contactMenu&amp;quot; title=&amp;quot;Contact&amp;quot; location=&amp;quot;?Contact&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Item name=&amp;quot;email&amp;quot; title=&amp;quot;E-Mail&amp;quot; location=&amp;quot;?EMail&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;Item name=&amp;quot;phone&amp;quot; title=&amp;quot;Phone&amp;quot; location=&amp;quot;?Phone&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/Menu&amp;gt;&lt;/font&gt;&lt;br /&gt;　　更多全面的例程，请查看应用程序的web/WEB-INF目录中的menu-config.xml文件，你可以截取一段作为你需要的菜单。完整的属性列表，可以查看MenuBase class's javadocs（&lt;a href=&quot;http://struts-menu.sourceforge.net/apidocs/net/sf/navigator/menu/MenuBase.html&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://struts-menu.sourceforge.net/apidocs/net/sf/navigator/menu/MenuBase.html&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://struts-menu.source......avigator/menu/MenuBase.html&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;）。&lt;br /&gt;4、在你的JSP文件的顶部加入taglib声明：&lt;br /&gt;&amp;nbsp;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&amp;lt;% at taglib uri=&amp;quot;&lt;/font&gt;&lt;a href=&quot;http://struts-menu%20dot%20sf.net/tag&quot;&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&lt;/font&gt;&lt;/a /&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&amp;quot; prefix=&amp;quot;menu&amp;quot; %&amp;gt;&lt;/font&gt;&lt;br /&gt;5、在你的JSP文件中要放置菜单的位置加入taglib代码：&lt;br /&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&amp;nbsp;&amp;lt;menu:useMenuDisplayer name=&amp;quot;TabbedMenu&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; bundle=&amp;quot;org.apache.struts.action.MESSAGE&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;menu:displayMenu name=&amp;quot;Home&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;menu:displayMenu name=&amp;quot;About&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/menu:useMenuDisplayer&amp;gt;&lt;/font&gt;&lt;br /&gt;　　属性name=&amp;quot;TabbedMenu&amp;quot;被定义在menu-config.xml文件的顶部：&lt;br /&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&amp;nbsp;&amp;lt;Displayer name=&amp;quot;TabbedMenu&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; type=&amp;quot;net.sf.navigator.displayer.TabbedMenuDisplayer&amp;quot;/&amp;gt;&lt;/font&gt;&lt;/a&gt;&lt;a href=&quot;http://struts-menu.sf.net/tag&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://struts-menu.sf.net/tag&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;font style=&quot;BACKGROUND-COLOR: #a0ff00&quot;&gt;(译注：其实到此步即可在你的JSP文件中添加相应的菜单了，只不过是没有结合Velocity。在menu-config.xml文件的头部可以定义多个Displayer，每个Displayer都有name和type属性，name属性与JSP文件中menu:useMenuDisplayer标签的name属性相对应，即表明使用何种样式，具体的样式定义便在type属性中定义，type属性中是一个class。在menu-config.xml文件中的菜单定义中的name属性则与JSP文件中的menu:displayMenu标签的name属性相对应。)&lt;/font&gt;&lt;/p&gt;&lt;p&gt;使用定制的Velocity模版实施你的菜单，你需要整合Velocity到你的WEB应用程序中。如果需要这样做的话，请完成下面的步骤：&lt;br /&gt;1、确定你的menu-config.xml文件有“Velocity”的displayer定义：&lt;br /&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&amp;nbsp;&amp;lt;Displayer name=&amp;quot;Velocity&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type=&amp;quot;net.sf.navigator.displayer.VelocityMenuDisplayer&amp;quot;/&amp;gt;&lt;/font&gt;&lt;br /&gt;2、加入Velocity的JARs包到你的WEB-INF/lib目录中，下载velocity-1.4-rc1.jar（&lt;a href=&quot;http://www.ibiblio.org/maven/velocity/jars/velocity-1.4-rc1.jar&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://www.ibiblio.org/maven/velocity/jars/velocity-1.4-rc1.jar&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://www.ibiblio.org/ma......y/jars/velocity-1.4-rc1.jar&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;）和velocity-tools-view-1.0.jar（&lt;a href=&quot;http://www.ibiblio.org/maven/velocity-tools/jars/velocity-tools-view-1.0.jar&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://www.ibiblio.org/maven/velocity-tools/jars/velocity-tools-view-1.0.jar&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://www.ibiblio.org/ma......velocity-tools-view-1.0.jar&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;）。 &lt;br /&gt;3、加入globalMacros.vm（&lt;a href=&quot;http://cvs.sourceforge.net/viewcvs.py/*checkout*/struts-menu/navigator/web/WEB-INF/classes/globalMacros.vm?content-type=text%2Fplain&amp;rev=1.1&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://cvs.sourceforge.net/viewcvs.py/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://cvs.sourceforge.net/viewcvs.py/&lt;/font&gt;&lt;/a&gt;*checkout*/struts-menu/navigator/web/WEB-INF/classes/globalMacros.vm?content-type=text%2Fplain&amp;amp;rev=1.1&lt;/a /&gt;（右键另存为））到你的WEB-INF/lib目录中。&lt;br /&gt;4、改变你的JSP文件中displayer的值为“Velocity”，“config”属性指向一个文件（如config=&amp;quot;/templates/tabs.html&amp;quot;）或者如果tabs.htm在你的WEB-INF/classes目录中的话，则可设config=&amp;quot;tabs.html&amp;quot;。&lt;/p&gt;&lt;p&gt;这里提供了一些使用Velocity的displayer例子，可在sample application（&lt;a href=&quot;http://demo.raibledesigns.com/struts-menu/index.jsp&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://demo.raibledesigns.com/struts-menu/index.jsp&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://demo.raibledesigns.com/struts-menu/index.jsp&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;）中查看。它总是在你的菜单需要的时候显示CSS，JavaScript和图像文件。下面有一些在当前的Struts Menu中用到的Velocity模版的例子的链接：&lt;br /&gt;&amp;nbsp;CoolMenus: Demo（&lt;a href=&quot;http://demo.raibledesigns.com/struts-menu/velocity-coolmenu4.jsp&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://demo.raibledesigns.com/struts-menu/velocity-coolmenu4.jsp&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://demo.raibledesigns......menu/velocity-coolmenu4.jsp&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;）, &lt;br /&gt;&amp;nbsp;&amp;nbsp;　 Template（&lt;a href=&quot;http://struts-menu.sourceforge.net/templates/coolmenus.html&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://struts-menu.sourceforge.net/templates/coolmenus.html&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://struts-menu.sourceforge.net/templates/coolmenus.html&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;） &lt;br /&gt;&amp;nbsp;NiceTabs: Demo, Template &lt;br /&gt;&amp;nbsp;Tabs: Demo, Template &lt;br /&gt;&amp;nbsp;XTree: Demo, Template &lt;/p&gt;&lt;p&gt;所有相关的有用的文件如果你需要的话都可以在下面的站点上下载：&lt;br /&gt;&amp;nbsp;Images （&lt;a href=&quot;http://struts-menu.sourceforge.net/menu-images/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://struts-menu.sourceforge.net/menu-images/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://struts-menu.sourceforge.net/menu-images/&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;）&lt;br /&gt;&amp;nbsp;Stylesheets （&lt;a href=&quot;http://struts-menu.sourceforge.net/styles/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://struts-menu.sourceforge.net/styles/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://struts-menu.sourceforge.net/styles/&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;）&lt;br /&gt;&amp;nbsp;Scripts （&lt;a href=&quot;http://struts-menu.sourceforge.net/scripts/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://struts-menu.sourceforge.net/scripts/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://struts-menu.sourceforge.net/scripts/&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;）&lt;br /&gt;&amp;nbsp;Templates （&lt;a href=&quot;http://struts-menu.sourceforge.net/templates/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://struts-menu.sourceforge.net/templates/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://struts-menu.sourceforge.net/templates/&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;）&lt;/p&gt;&lt;p&gt;更多的基于roles的显示/隐藏菜单的信息，请查看FAQs（&lt;a href=&quot;http://struts-menu.sourceforge.net/faq.html&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://struts-menu.sourceforge.net/faq.html&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://struts-menu.sourceforge.net/faq.html&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;）。&lt;/p&gt;&lt;p&gt;四、在Struts之外使用Struts Menu:&lt;br /&gt;在2.2版中，Menu Repository能够使用MenuContextListener载入：&lt;br /&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&amp;nbsp;&amp;lt;!--&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Loads the menu-config.xml for struts-menu at startup,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - by default from &amp;quot;/WEB-INF/menu-config.xml&amp;quot;.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - To override this, add a context-param named &amp;quot;menuConfigLocation&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - web.xml file.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;listener&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;listener-class&amp;gt;net.sf.navigator.menu.MenuContextListener&amp;lt;/listener-class&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/listener&amp;gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;或者如果你使用Spring，甚至更容易。仅仅需要加入下面的部分到你的applicationContext.xml文件中：&lt;br /&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffe000&quot;&gt;&amp;nbsp;&amp;lt;bean id=&amp;quot;menu&amp;quot; class=&amp;quot;net.sf.navigator.menu.MenuLoader&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;menuConfig&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;value&amp;gt;/WEB-INF/menu-config.xml&amp;lt;/value&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;!-- The menuConfig property is an optional attribute.&amp;nbsp; It is set to&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /WEB-INF/menu-config.xml by default. --&amp;gt;&lt;/font&gt;&lt;br /&gt;感谢Dan Luputan提供MenuLoader类的源代码。&lt;/p&gt;&lt;p&gt;五、从源文件编译：&lt;br /&gt;要从源文件编译这个项目，执行下面的步骤：&lt;br /&gt;1、下载并安装Maven（&lt;a href=&quot;http://maven.apache.org/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://maven.apache.org/&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://maven.apache.org/&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;）；&lt;br /&gt;2、创建一个环境变量MAVEN＿HOME指出你的Maven的安装目录，然后添加$MAVEN_HOME/bin到你的PATH变量中；&lt;br /&gt;3、操纵这个目录你可以扩展源代码，执行“maven.jar”创建target/struts-menu.jar。&lt;/p&gt;&lt;p&gt;要展开struts-menu例程，需要下面的步骤：&lt;br /&gt;1、下载和安装Tomcat；&lt;br /&gt;2、创建一个环境变量CATALINA＿HOME指出你的Tomcat的安装目录；&lt;br /&gt;3、执行“maven deploy”把应用程序展开到Tomcat中；&lt;br /&gt;4、打开&lt;a href=&quot;http://localhost:8080/struts-menu&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://localhost:8080/struts-menu&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://localhost:8080/struts-menu&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;在你喜爱的浏览器中。&lt;/p&gt;&lt;p&gt;如果你喜欢使用Eclipse开发项目，请参考此份开发向导（&lt;a href=&quot;http://struts-menu.sourceforge.net/devguide.html&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://struts-menu.sourceforge.net/devguide.html&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#666666&quot;&gt;http://struts-menu.sourceforge.net/devguide.html&lt;/font&gt;&lt;/a&gt;&lt;/a /&gt;）。 &lt;/p&gt;&lt;p /&gt;</description><category>Java</category><pubDate>Mon, 08 Jan 2007 11:57:42 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14498009.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14498009.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235199/1237942</fs:itemid></item><item><title>PowerDesigner中定制数据字典</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235200/1237942/1/item.html</link><description>&amp;nbsp;&amp;nbsp;&amp;nbsp; 若我们需要对已经完成的数据库模型生成数据字典，&lt;span&gt;PowerDesigner&lt;/span&gt;&lt;span&gt;提供了强大的文档订制功能让我们可以生成不同类型文档以满足不同分析要求。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;前段时间一直觉得郁闷的是使用&lt;/span&gt;&lt;span&gt;PowerDesigner&lt;/span&gt;&lt;span&gt;基本的默认设置生成数据字典不太令人满意，今天尝试许久终于生成了自己想要版面风格。&lt;/span&gt;&lt;span&gt;我想要实现的仅仅是将数据模型中的所有字段按所在表不同分别列出，同时将字段一些重要属性按习惯约定形式显示出来。&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span&gt;具体操作过程：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;只需要在可用项目面板（&lt;/span&gt;&lt;span&gt;Available Items&lt;/span&gt;&lt;span&gt;）中选择&lt;/span&gt;&lt;span&gt;Table&lt;/span&gt;&lt;span&gt;节点下的&lt;/span&gt;&lt;span&gt;List of Table Columns&lt;/span&gt;&lt;span&gt;项目添加到报告项目（&lt;/span&gt;&lt;span&gt;Report Items&lt;/span&gt;&lt;span&gt;）面板中即可。要设置所要显示属性项目只需要在报告项目（&lt;/span&gt;&lt;span&gt;Report Items&lt;/span&gt;&lt;span&gt;）面板中选中&lt;/span&gt;&lt;span&gt;”Table-&lt;/span&gt;&lt;span&gt;表格&lt;/span&gt;&lt;span&gt;%ITEM%”&lt;/span&gt;&lt;span&gt;下&lt;/span&gt;&lt;span&gt;”List of Table Columns-&lt;/span&gt;&lt;span&gt;表格&lt;/span&gt;&lt;span&gt;%PARENT%&lt;/span&gt;&lt;span&gt;的列清单&lt;/span&gt;&lt;span&gt;”&lt;/span&gt;&lt;span&gt;项目，右键单击选择&lt;/span&gt;&lt;span&gt;Layout,&lt;/span&gt;&lt;span&gt;即打开&lt;/span&gt;&lt;span&gt;List Layout&lt;/span&gt;&lt;span&gt;，进行编辑设置即可。&lt;/span&gt;</description><category>数据库</category><pubDate>Fri, 05 Jan 2007 13:57:03 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14498008.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14498008.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235200/1237942</fs:itemid></item><item><title>深入浅出之正则表达式（一）</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235201/1237942/1/item.html</link><description>&lt;font face=&quot;宋体&quot;&gt;前言：&lt;br /&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;半年前我对正则表达式产生了兴趣，在网上查找过不少资料，看过不少的教程，最后在使用一个正则表达式工具&lt;/span&gt;RegexBuddy&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;时发现他的教程写的非常好，可以说是我目前见过最好的正则表达式教程。于是一直想把他翻译过来。这个愿望直到这个五一长假才得以实现，结果就有了这篇文章。关于本文的名字，使用&lt;/span&gt;“&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;深入浅出&lt;/span&gt;”&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;似乎已经太俗。但是通读原文以后，觉得只有用&lt;/span&gt;“&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;深入浅出&lt;/span&gt;”&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;才能准确的表达出该教程给我的感受，所以也就不能免俗了。&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;本文是&lt;/span&gt;Jan Goyvaerts&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;为&lt;/span&gt;RegexBuddy&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;写的教程的译文，版权归原作者所有，欢迎转载。但是为了尊重原作者和译者的劳动，请注明出处！谢谢！&lt;/span&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;FONT-SIZE: 18pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.25in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1; tab-stops: list .25in&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;mso-fareast-font-family: 'Times New Roman'&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;1.&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;什么是正则表达式&lt;/span&gt;&lt;p /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;基本说来，正则表达式是一种用来描述一定数量文本的模式。&lt;/span&gt;Regex&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;代表&lt;/span&gt;Regular Express&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。本文将用&lt;/span&gt;&amp;lt;&amp;lt;regex&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;来表示一段具体的正则表达式。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;一段文本就是最基本的模式，简单的匹配相同的文本。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.25in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1; tab-stops: list .25in&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;mso-fareast-font-family: 'Times New Roman'&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;2.&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;不同的正则表达式引擎&lt;/span&gt;&lt;p /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;正则表达式引擎是一种可以处理正则表达式的软件。通常，引擎是更大的应用程序的一部分。在软件世界，不同的正则表达式并不互相兼容。本教程会集中讨论&lt;/span&gt;Perl 5 &lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;类型的引擎，因为这种引擎是应用最广泛的引擎。同时我们也会提到一些和其他引擎的区别。许多近代的引擎都很类似，但不完全一样。例如&lt;/span&gt;.NET&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;正则库，&lt;/span&gt;JDK&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;正则包。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.25in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1; tab-stops: list .25in&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;mso-fareast-font-family: 'Times New Roman'&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;3.&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;文字符号&lt;/span&gt;&lt;p /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;最基本的正则表达式由单个文字符号组成。如&lt;/span&gt;&amp;lt;&amp;lt;a&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，它将匹配字符串中第一次出现的字符“&lt;/span&gt;a&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。如对字符串“&lt;/span&gt;Jack is a boy&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。“&lt;/span&gt;J&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”后的“&lt;/span&gt;a&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”将被匹配。而第二个“&lt;/span&gt;a&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”将不会被匹配。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;正则表达式也可以匹配第二个“&lt;/span&gt;a&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，这必须是你告诉正则表达式引擎从第一次匹配的地方开始搜索。在文本编辑器中，你可以使用“查找下一个”。在编程语言中，会有一个函数可以使你从前一次匹配的位置开始继续向后搜索。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;类似的，&lt;/span&gt;&amp;lt;&amp;lt;cat&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;会匹配“&lt;/span&gt;About cats and dogs&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”中的“&lt;/span&gt;cat&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。这等于是告诉正则表达式引擎，找到一个&lt;/span&gt;&amp;lt;&amp;lt;c&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，紧跟一个&lt;/span&gt;&amp;lt;&amp;lt;a&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，再跟一个&lt;/span&gt;&amp;lt;&amp;lt;t&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;要注意，正则表达式引擎缺省是大小写敏感的。除非你告诉引擎忽略大小写，否则&lt;/span&gt;&amp;lt;&amp;lt;cat&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;不会匹配“&lt;/span&gt;Cat&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;特殊字符&lt;/span&gt;&lt;p /&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;对于文字字符，有&lt;/span&gt;11&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;个字符被保留作特殊用途。他们是：&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.5in; TEXT-INDENT: 0.5in&quot;&gt;[ ] \ ^ $ . | ? * + ( )&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;这些特殊字符也被称作元字符。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;如果你想在正则表达式中将这些字符用作文本字符，你需要用反斜杠“&lt;/span&gt;\&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”对其进行换码&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot;&gt; &lt;/span&gt;(escape)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。例如你想匹配“&lt;/span&gt;1+1=2&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，正确的表达式为&lt;/span&gt;&amp;lt;&amp;lt;1\+1=2&amp;gt;&amp;gt;.&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;需要注意的是，&lt;/span&gt;&amp;lt;&amp;lt;1+1=2&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;也是有效的正则表达式。但它不会匹配“&lt;/span&gt;1+1=2&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，而会匹配“&lt;/span&gt;123+111=234&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”中的“&lt;/span&gt;111=2&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。因为“&lt;/span&gt;+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”在这里表示特殊含义（重复&lt;/span&gt;1&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;次到多次）。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在编程语言中，要注意，一些特殊的字符会先被编译器处理，然后再传递给正则引擎。因此正则表达式&lt;/span&gt;&amp;lt;&amp;lt;1\+2=2&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在&lt;/span&gt;C++&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;中要写成“&lt;/span&gt;1\\+1=2&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。为了匹配“&lt;/span&gt;C:\temp&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，你要用正则表达式&lt;/span&gt;&amp;lt;&amp;lt;C:\\temp&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。而在&lt;/span&gt;C++&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;中，正则表达式则变成了“&lt;/span&gt;C:\\\\temp&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;不可显示字符&lt;/span&gt;&lt;p /&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;可以使用特殊字符序列来代表某些不可显示字符：&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&amp;lt;&amp;lt;\t&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;代表&lt;/span&gt;Tab(0x09)&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&amp;lt;&amp;lt;\r&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;代表回车符&lt;/span&gt;(0x0D)&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&amp;lt;&amp;lt;\n&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;代表换行符&lt;/span&gt;(0x0A)&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;要注意的是&lt;/span&gt;Windows&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;中文本文件使用“&lt;/span&gt;\r\n&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”来结束一行而&lt;/span&gt;Unix&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;使用“&lt;/span&gt;\n&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.25in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1; tab-stops: list .25in&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;mso-fareast-font-family: 'Times New Roman'&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;4.&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;正则表达式引擎的内部工作机制&lt;/span&gt;&lt;p /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;知道正则表达式引擎是如何工作的有助于你很快理解为何某个正则表达式不像你期望的那样工作。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;有两种类型的引擎：文本导向&lt;/span&gt;(text-directed)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的引擎和正则导向&lt;/span&gt;(regex-directed)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的引擎。&lt;/span&gt;Jeffrey Friedl&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;把他们称作&lt;/span&gt;DFA&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和&lt;/span&gt;NFA&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;引擎。本文谈到的是正则导向的引擎。这是因为一些非常有用的特性，如“惰性”量词&lt;/span&gt;(lazy quantifiers)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和反向引用&lt;/span&gt;(backreferences)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，只能在正则导向的引擎中实现。所以毫不意外这种引擎是目前最流行的引擎。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;你可以轻易分辨出所使用的引擎是文本导向还是正则导向。如果反向引用或“惰性”量词被实现，则可以肯定你使用的引擎是正则导向的。你可以作如下测试：将正则表达式&lt;/span&gt;&amp;lt;&amp;lt;regex|regex not&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;应用到字符串“&lt;/span&gt;regex not&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。如果匹配的结果是&lt;/span&gt;regex&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，则引擎是正则导向的。如果结果是&lt;/span&gt;regex not&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，则是文本导向的。因为正则导向的引擎是“猴急”的，它会很急切的进行表功，报告它找到的第一个匹配&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;正则导向的引擎总是返回最左边的匹配&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;这是需要你理解的很重要的一点：即使以后有可能发现一个“更好”的匹配，正则导向的引擎也总是返回最左边的匹配。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;当把&lt;/span&gt;&amp;lt;&amp;lt;cat&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;应用到“&lt;/span&gt;He captured a catfish for his cat&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，引擎先比较&lt;/span&gt;&amp;lt;&amp;lt;c&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和“&lt;/span&gt;H&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，结果失败了。于是引擎再比较&lt;/span&gt;&amp;lt;&amp;lt;c&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和“&lt;/span&gt;e&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，也失败了。直到第四个字符，&lt;/span&gt;&amp;lt;&amp;lt;c&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配了“&lt;/span&gt;c&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。&lt;/span&gt;&amp;lt;&amp;lt;a&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配了第五个字符。到第六个字符&lt;/span&gt;&amp;lt;&amp;lt;t&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;没能匹配“&lt;/span&gt;p&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，也失败了。引擎再继续从第五个字符重新检查匹配性。直到第十五个字符开始，&lt;/span&gt;&amp;lt;&amp;lt;cat&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配上了“&lt;/span&gt;catfish&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”中的“&lt;/span&gt;cat&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，正则表达式引擎急切的返回第一个匹配的结果，而不会再继续查找是否有其他更好的匹配。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.25in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1; tab-stops: list .25in&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;mso-fareast-font-family: 'Times New Roman'&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;5.&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;字符集&lt;/span&gt;&lt;p /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;字符集是由一对方括号“&lt;/span&gt;[]&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”括起来的字符集合。使用字符集，你可以告诉正则表达式引擎仅仅匹配多个字符中的一个。如果你想匹配一个“&lt;/span&gt;a&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”或一个“&lt;/span&gt;e&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，使用&lt;/span&gt;&amp;lt;&amp;lt;[ae]&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。你可以使用&lt;/span&gt;&amp;lt;&amp;lt;gr[ae]y&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配&lt;/span&gt;gray&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;或&lt;/span&gt;grey&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。这在你不确定你要搜索的字符是采用美国英语还是英国英语时特别有用。相反，&lt;/span&gt;&amp;lt;&amp;lt;gr[ae]y&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;将不会匹配&lt;/span&gt;graay&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;或&lt;/span&gt;graey&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。字符集中的字符顺序并没有什么关系，结果都是相同的。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;你可以使用连字符“&lt;/span&gt;-&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”定义一个字符范围作为字符集。&lt;/span&gt;&amp;lt;&amp;lt;[0-9]&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配&lt;/span&gt;0&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;到&lt;/span&gt;9&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;之间的单个数字。你可以使用不止一个范围。&lt;/span&gt;&amp;lt;&amp;lt;[0-9a-fA-F] &amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配单个的十六进制数字，并且大小写不敏感。你也可以结合范围定义与单个字符定义。&lt;/span&gt;&amp;lt;&amp;lt;[0-9a-fxA-FX]&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配一个十六进制数字或字母&lt;/span&gt;X&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。再次强调一下，字符和范围定义的先后顺序对结果没有影响。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;字符集的一些应用&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;查找一个可能有拼写错误的单词，比如&lt;/span&gt;&amp;lt;&amp;lt;sep[ae]r[ae]te&amp;gt;&amp;gt; &lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;或&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot;&gt; &lt;/span&gt;&amp;lt;&amp;lt;li[cs]en[cs]e&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;查找程序语言的标识符，&lt;/span&gt;&amp;lt;&amp;lt;A-Za-z_][A-Za-z_0-9]*&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;(*&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;表示重复&lt;/span&gt;0&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;或多次&lt;/span&gt;)&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;查找&lt;/span&gt;C&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;风格的十六进制数&lt;/span&gt;&amp;lt;&amp;lt;0[xX][A-Fa-f0-9]+&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;(+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;表示重复一次或多次&lt;/span&gt;)&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;取反字符集&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在左方括号“&lt;/span&gt;[&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”后面紧跟一个尖括号“&lt;/span&gt;^&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，将会对字符集取反。结果是字符集将匹配任何不在方括号中的字符。不像“&lt;/span&gt;.&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，取反字符集是可以匹配回车换行符的。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;需要记住的很重要的一点是，取反字符集必须要匹配一个字符。&lt;/span&gt;&amp;lt;&amp;lt;q[^u]&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;并不意味着：匹配一个&lt;/span&gt;q&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，后面没有&lt;/span&gt;u&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;跟着。它意味着：匹配一个&lt;/span&gt;q&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，后面跟着一个不是&lt;/span&gt;u&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的字符。所以它不会匹配“&lt;/span&gt;Iraq&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”中的&lt;/span&gt;q&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，而会匹配“&lt;/span&gt;Iraq is a country&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”中的&lt;/span&gt;q&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和一个空格符。事实上，空格符是匹配中的一部分，因为它是一个“不是&lt;/span&gt;u&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的字符”。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;如果你只想匹配一个&lt;/span&gt;q&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，条件是&lt;/span&gt;q&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;后面有一个不是&lt;/span&gt;u&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的字符，我们可以用后面将讲到的向前查看来解决。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;字符集中的元字符&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;需要注意的是，在字符集中只有&lt;/span&gt;4&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;个&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot;&gt; &lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;字符具有特殊含义。它们是：“&lt;/span&gt;] \ ^ -&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。“&lt;/span&gt;]&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”代表字符集定义的结束；“&lt;/span&gt;\&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”代表转义；“&lt;/span&gt;^&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”代表取反；“&lt;/span&gt;-&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”代表范围定义。其他常见的元字符在字符集定义内部都是正常字符，不需要转义。例如，要搜索星号&lt;/span&gt;*&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;或加号&lt;/span&gt;+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，你可以用&lt;/span&gt;&amp;lt;&amp;lt;[+*]&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。当然，如果你对那些通常的元字符进行转义，你的正则表达式一样会工作得很好，但是这会降低可读性。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在字符集定义中为了将反斜杠“&lt;/span&gt;\&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”作为一个文字字符而非特殊含义的字符，你需要用另一个反斜杠对它进行转义。&lt;/span&gt;&amp;lt;&amp;lt;[\\x]&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;将会匹配一个反斜杠和一个&lt;/span&gt;X&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。“&lt;/span&gt;]^-&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”都可以用反斜杠进行转义，或者将他们放在一个不可能使用到他们特殊含义的位置。我们推荐后者，因为这样可以增加可读性。比如对于字符“&lt;/span&gt;^&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，将它放在除了左括号“&lt;/span&gt;[&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”后面的位置，使用的都是文字字符含义而非取反含义。如&lt;/span&gt;&amp;lt;&amp;lt;[x^]&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;会匹配一个&lt;/span&gt;x&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;或&lt;/span&gt;^&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&amp;lt;&amp;lt;[]x]&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;会匹配一个“&lt;/span&gt;]&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”或“&lt;/span&gt;x&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。&lt;/span&gt;&amp;lt;&amp;lt;[-x]&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;或&lt;/span&gt;&amp;lt;&amp;lt;[x-]&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;都会匹配一个“&lt;/span&gt;-&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”或“&lt;/span&gt;x&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;字符集的简写&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;因为一些字符集非常常用，所以有一些简写方式。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&amp;lt;&amp;lt;\d&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;代表&lt;/span&gt;&amp;lt;&amp;lt;[0-9]&amp;gt;&amp;gt;;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&amp;lt;&amp;lt;\w&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;代表单词字符。这个是随正则表达式实现的不同而有些差异。绝大多数的正则表达式实现的单词字符集都包含了&lt;/span&gt;&amp;lt;&amp;lt;A-Za-z0-9_]&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&amp;lt;&amp;lt;\s&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;代表“白字符”。这个也是和不同的实现有关的。在绝大多数的实现中，都包含了空格符和&lt;/span&gt;Tab&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;符，以及回车换行符&lt;/span&gt;&amp;lt;&amp;lt;\r\n&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;字符集的缩写形式可以用在方括号之内或之外。&lt;/span&gt;&amp;lt;&amp;lt;\s\d&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配一个白字符后面紧跟一个数字。&lt;/span&gt;&amp;lt;&amp;lt;[\s\d]&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配单个白字符或数字。&lt;/span&gt;&amp;lt;&amp;lt;[\da-fA-F]&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;将匹配一个十六进制数字。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;取反字符集的简写&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&amp;lt;&amp;lt;[\S]&amp;gt;&amp;gt; = &amp;lt;&amp;lt;[^\s]&amp;gt;&amp;gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&amp;lt;&amp;lt;[\W]&amp;gt;&amp;gt; = &amp;lt;&amp;lt;[^\w]&amp;gt;&amp;gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&amp;lt;&amp;lt;[\D]&amp;gt;&amp;gt; = &amp;lt;&amp;lt;[^\d]&amp;gt;&amp;gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;字符集的重复&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;如果你用“&lt;/span&gt;?*+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”操作符来重复一个字符集，你将会重复整个字符集。而不仅是它匹配的那个字符。正则表达式&lt;/span&gt;&amp;lt;&amp;lt;[0-9]+&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;会匹配&lt;/span&gt;837&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;以及&lt;/span&gt;222&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;如果你仅仅想重复被匹配的那个字符，可以用向后引用达到目的。我们以后将讲到向后引用。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.25in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1; tab-stops: list .25in&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;mso-fareast-font-family: 'Times New Roman'&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;6.&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;使用&lt;/span&gt;?*&lt;/b&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;或&lt;/span&gt;+ &lt;/b&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;进行重复&lt;/span&gt;&lt;p /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;?&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;：告诉引擎匹配前导字符&lt;/span&gt;0&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;次或一次。事实上是表示前导字符是可选的。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;：告诉引擎匹配前导字符&lt;/span&gt;1&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;次或多次&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;*&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;：告诉引擎匹配前导字符&lt;/span&gt;0&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;次或多次&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&amp;lt;[A-Za-z][A-Za-z0-9]*&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配没有属性的&lt;/span&gt;HTML&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;标签，“&lt;/span&gt;&amp;lt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”以及“&lt;/span&gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”是文字符号。第一个字符集匹配一个字母，第二个字符集匹配一个字母或数字。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;我们似乎也可以用&lt;/span&gt;&amp;lt;[A-Za-z0-9]+&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。但是它会匹配&lt;/span&gt;&amp;lt;1&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。但是这个正则表达式在你知道你要搜索的字符串不包含类似的无效标签时还是足够有效的。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;限制性重复&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;许多现代的正则表达式实现，都允许你定义对一个字符重复多少次。词法是：&lt;/span&gt;{min,max}&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;min&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和&lt;/span&gt;max&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;都是非负整数。如果逗号有而&lt;/span&gt;max&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;被忽略了，则&lt;/span&gt;max&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;没有限制。如果逗号和&lt;/span&gt;max&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;都被忽略了，则重复&lt;/span&gt;min&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;次。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;因此&lt;/span&gt;{0,}&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和&lt;/span&gt;*&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;一样，&lt;/span&gt;{1&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，&lt;/span&gt;}&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和&lt;/span&gt;+ &lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的作用一样。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;你可以用&lt;/span&gt;&amp;lt;&amp;lt;\b[1-9][0-9]{3}\b&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配&lt;/span&gt;1000~9999&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;之间的数字&lt;/span&gt;(&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;“&lt;/span&gt;\b&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”表示单词边界&lt;/span&gt;)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&amp;lt;&amp;lt;\b[1-9][0-9]{2,4}\b&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配一个在&lt;/span&gt;100~99999&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;之间的数字。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: 0.3in&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;注意贪婪性&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;假设你想用一个正则表达式匹配一个&lt;/span&gt;HTML&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;标签。你知道输入将会是一个有效的&lt;/span&gt;HTML&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;文件，因此正则表达式不需要排除那些无效的标签。所以如果是在两个尖括号之间的内容，就应该是一个&lt;/span&gt;HTML&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;标签。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;许多正则表达式的新手会首先想到用正则表达式&lt;/span&gt;&amp;lt;&amp;lt; &amp;lt;.+&amp;gt; &amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，他们会很惊讶的发现，对于测试字符串，“&lt;/span&gt;This is a &amp;lt;EM&amp;gt;first&amp;lt;/EM&amp;gt; test&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，你可能期望会返回&lt;/span&gt;&amp;lt;EM&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，然后继续进行匹配的时候，返回&lt;/span&gt;&amp;lt;/EM&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;但事实是不会。正则表达式将会匹配“&lt;/span&gt;&amp;lt;EM&amp;gt;first&amp;lt;/EM&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。很显然这不是我们想要的结果。原因在于“&lt;/span&gt;+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”是贪婪的。也就是说，“&lt;/span&gt;+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”会导致正则表达式引擎试图尽可能的重复前导字符。只有当这种重复会引起整个正则表达式匹配失败的情况下，引擎会进行回溯。也就是说，它会放弃最后一次的“重复”，然后处理正则表达式余下的部分。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和“&lt;/span&gt;+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”类似，“&lt;/span&gt;?*&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”的重复也是贪婪的。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;深入正则表达式引擎内部&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;让我们来看看正则引擎如何匹配前面的例子。第一个记号是“&lt;/span&gt;&amp;lt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，这是一个文字符号。第二个符号是“&lt;/span&gt;.&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，匹配了字符“&lt;/span&gt;E&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，然后“&lt;/span&gt;+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”一直可以匹配其余的字符，直到一行的结束。然后到了换行符，匹配失败&lt;/span&gt;(&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;“&lt;/span&gt;.&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”不匹配换行符&lt;/span&gt;)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。于是引擎开始对下一个正则表达式符号进行匹配。也即试图匹配“&lt;/span&gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。到目前为止，“&lt;/span&gt;&amp;lt;.+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”已经匹配了“&lt;/span&gt;&amp;lt;EM&amp;gt;first&amp;lt;/EM&amp;gt; test&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。引擎会试图将“&lt;/span&gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”与换行符进行匹配，结果失败了。于是引擎进行回溯。结果是现在“&lt;/span&gt;&amp;lt;.+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”匹配“&lt;/span&gt;&amp;lt;EM&amp;gt;first&amp;lt;/EM&amp;gt; tes&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。于是引擎将“&lt;/span&gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”与“&lt;/span&gt;t&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”进行匹配。显然还是会失败。这个过程继续，直到“&lt;/span&gt;&amp;lt;.+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”匹配“&lt;/span&gt;&amp;lt;EM&amp;gt;first&amp;lt;/EM&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，“&lt;/span&gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”与“&lt;/span&gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”匹配。于是引擎找到了一个匹配“&lt;/span&gt;&amp;lt;EM&amp;gt;first&amp;lt;/EM&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。记住，正则导向的引擎是“急切的”，所以它会急着报告它找到的第一个匹配。而不是继续回溯，即使可能会有更好的匹配，例如“&lt;/span&gt;&amp;lt;EM&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。所以我们可以看到，由于“&lt;/span&gt;+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”的贪婪性，使得正则表达式引擎返回了一个最左边的最长的匹配。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: 0.3in&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;用懒惰性取代贪婪性&lt;/span&gt;&lt;p /&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;一个用于修正以上问题的可能方案是用“&lt;/span&gt;+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”的惰性代替贪婪性。你可以在“&lt;/span&gt;+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”后面紧跟一个问号“&lt;/span&gt;?&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”来达到这一点。“&lt;/span&gt;*&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，“&lt;/span&gt;{}&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”和“&lt;/span&gt;?&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”表示的重复也可以用这个方案。因此在上面的例子中我们可以使用“&lt;/span&gt;&amp;lt;.+?&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。让我们再来看看正则表达式引擎的处理过程。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;再一次，正则表达式记号“&lt;/span&gt;&amp;lt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”会匹配字符串的第一个“&lt;/span&gt;&amp;lt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。下一个正则记号是“&lt;/span&gt;.&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。这次是一个懒惰的“&lt;/span&gt;+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”来重复上一个字符。这告诉正则引擎，尽可能少的重复上一个字符。因此引擎匹配“&lt;/span&gt;.&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”和字符“&lt;/span&gt;E&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，然后用“&lt;/span&gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”匹配“&lt;/span&gt;M&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，结果失败了。引擎会进行回溯，和上一个例子不同，因为是惰性重复，所以引擎是扩展惰性重复而不是减少，于是“&lt;/span&gt;&amp;lt;.+&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”现在被扩展为“&lt;/span&gt;&amp;lt;EM&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。引擎继续匹配下一个记号“&lt;/span&gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。这次得到了一个成功匹配。引擎于是报告“&lt;/span&gt;&amp;lt;EM&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”是一个成功的匹配。整个过程大致如此。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: 0.3in&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;惰性扩展的一个替代方案&lt;/span&gt;&lt;p /&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;我们还有一个更好的替代方案。可以用一个贪婪重复与一个取反字符集：“&lt;/span&gt;&amp;lt;[^&amp;gt;]+&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。之所以说这是一个更好的方案在于使用惰性重复时，引擎会在找到一个成功匹配前对每一个字符进行回溯。而使用取反字符集则不需要进行回溯。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;最后要记住的是，本教程仅仅谈到的是正则导向的引擎。文本导向的引擎是不回溯的。但是同时他们也不支持惰性重复操作。&lt;/span&gt;&lt;p /&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.25in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1; tab-stops: list .25in&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;mso-fareast-font-family: 'Times New Roman'&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;7.&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;使用“&lt;/span&gt;.&lt;/b&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”匹配几乎任意字符&lt;/span&gt;&lt;p /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在正则表达式中，“&lt;/span&gt;.&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”是最常用的符号之一。不幸的是，它也是最容易被误用的符号之一。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;“&lt;/span&gt;.&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”匹配一个单个的字符而不用关心被匹配的字符是什么。唯一的例外是新行符。在本教程中谈到的引擎，缺省情况下都是不匹配新行符的。因此在缺省情况下，“&lt;/span&gt;.&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”等于是字符集&lt;/span&gt;[^\n\r](Window)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;或&lt;/span&gt;[^\n]( Unix)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的简写。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;这个例外是因为历史的原因。因为早期使用正则表达式的工具是基于行的。它们都是一行一行的读入一个文件，将正则表达式分别应用到每一行上去。在这些工具中，字符串是不包含新行符的。因此“&lt;/span&gt;.&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”也就从不匹配新行符。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;现代的工具和语言能够将正则表达式应用到很大的字符串甚至整个文件上去。本教程讨论的所有正则表达式实现都提供一个选项，可以使“&lt;/span&gt;.&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”匹配所有的字符，包括新行符。在&lt;/span&gt;RegexBuddy, EditPad Pro&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;或&lt;/span&gt;PowerGREP&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;等工具中，你可以简单的选中“点号匹配新行符”。在&lt;/span&gt;Perl&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;中，“&lt;/span&gt;.&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”可以匹配新行符的模式被称作“单行模式”。很不幸，这是一个很容易混淆的名词。因为还有所谓“多行模式”。多行模式只影响行首行尾的锚定&lt;/span&gt;(anchor)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，而单行模式只影响“&lt;/span&gt;.&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;其他语言和正则表达式库也采用了&lt;/span&gt;Perl&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的术语定义。当在&lt;/span&gt;.NET Framework&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;中使用正则表达式类时，你可以用类似下面的语句来激活单行模式：&lt;/span&gt;Regex.Match(“string”,”regex”,RegexOptions.SingleLine)&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;保守的使用点号“&lt;/span&gt;.&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;点号可以说是最强大的元字符。它允许你偷懒：用一个点号，就能匹配几乎所有的字符。但是问题在于，它也常常会匹配不该匹配的字符。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;我会以一个简单的例子来说明。让我们看看如何匹配一个具有“&lt;/span&gt;mm/dd/yy&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”格式的日期，但是我们想允许用户来选择分隔符。很快能想到的一个方案是&lt;/span&gt;&amp;lt;&amp;lt;\d\d.\d\d.\d\d&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。看上去它能匹配日期“&lt;/span&gt;02/12/03&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。问题在于&lt;/span&gt;02512703&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;也会被认为是一个有效的日期。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&amp;lt;&amp;lt;\d\d[-/.]\d\d[-/.]\d\d&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;看上去是一个好一点的解决方案。记住点号在一个字符集里不是元字符。这个方案远不够完善，它会匹配“&lt;/span&gt;99/99/99&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。而&lt;/span&gt;&amp;lt;&amp;lt;[0-1]\d[-/.][0-3]\d[-/.]\d\d&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;又更进一步。尽管他也会匹配“&lt;/span&gt;19/39/99&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。你想要你的正则表达式达到如何完美的程度取决于你想达到什么样的目的。如果你想校验用户输入，则需要尽可能的完美。如果你只是想分析一个已知的源，并且我们知道没有错误的数据，用一个比较好的正则表达式来匹配你想要搜寻的字符就已经足够。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.25in; TEXT-INDENT: -0.25in; mso-list: l0 level1 lfo1; tab-stops: list .25in&quot;&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;mso-fareast-font-family: 'Times New Roman'&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;8.&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;b style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;字符串开始和结束的锚定&lt;/span&gt;&lt;p /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;锚定和一般的正则表达式符号不同，它不匹配任何字符。相反，他们匹配的是字符之前或之后的位置。“&lt;/span&gt;^&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”匹配一行字符串第一个字符前的位置。&lt;/span&gt;&amp;lt;&amp;lt;^a&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;将会匹配字符串“&lt;/span&gt;abc&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”中的&lt;/span&gt;a&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&amp;lt;&amp;lt;^b&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;将不会匹配“&lt;/span&gt;abc&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”中的任何字符。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;类似的，&lt;/span&gt;$&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配字符串中最后一个字符的后面的位置。所以&lt;/span&gt;&amp;lt;&amp;lt;c$&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;匹配“&lt;/span&gt;abc&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”中的&lt;/span&gt;c&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.25in&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;锚定的应用&lt;/span&gt;&lt;p /&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在编程语言中校验用户输入时，使用锚定是非常重要的。如果你想校验用户的输入为整数，用&lt;/span&gt;&amp;lt;&amp;lt;^\d+$&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;用户输入中，常常会有多余的前导空格或结束空格。你可以用&lt;/span&gt;&amp;lt;&amp;lt;^\s*&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和&lt;/span&gt;&amp;lt;&amp;lt;\s*$&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;来匹配前导空格或结束空格。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;使用“&lt;/span&gt;^&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”和“&lt;/span&gt;$&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”作为行的开始和结束锚定&lt;/span&gt;&lt;p /&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;如果你有一个包含了多行的字符串。例如：“&lt;/span&gt;first line\n\rsecond line&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”&lt;/span&gt;(&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;其中&lt;/span&gt;\n\r&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;表示一个新行符&lt;/span&gt;)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。常常需要对每行分别处理而不是整个字符串。因此，几乎所有的正则表达式引擎都提供一个选项，可以扩展这两种锚定的含义。“&lt;/span&gt;^&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”可以匹配字串的开始位置&lt;/span&gt;(&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在&lt;/span&gt;f&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;之前&lt;/span&gt;)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，以及每一个新行符的后面位置&lt;/span&gt;(&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在&lt;/span&gt;\n\r&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和&lt;/span&gt;s&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;之间&lt;/span&gt;)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。类似的，&lt;/span&gt;$&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;会匹配字串的结束位置&lt;/span&gt;(&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;最后一个&lt;/span&gt;e&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;之后&lt;/span&gt;)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，以及每个新行符的前面&lt;/span&gt;(&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在&lt;/span&gt;e&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;与&lt;/span&gt;\n\r&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;之间&lt;/span&gt;)&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在&lt;/span&gt;.NET&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;中，当你使用如下代码时，将会定义锚定匹配每一个新行符的前面和后面位置：&lt;/span&gt;Regex.Match(&amp;quot;string&amp;quot;, &amp;quot;regex&amp;quot;, RegexOptions.Multiline)&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;应用：&lt;/span&gt;string str = Regex.Replace(Original, &amp;quot;^&amp;quot;, &amp;quot;&amp;gt; &amp;quot;, RegexOptions.Multiline)--&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;将会在每行的行首插入“&lt;/span&gt;&amp;gt; &lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt 0.3in; TEXT-INDENT: -0.25in; mso-list: l1 level1 lfo2; tab-stops: list .3in&quot;&gt;&lt;span style=&quot;FONT-FAMILY: Symbol; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol&quot;&gt;&lt;span style=&quot;mso-list: Ignore&quot;&gt;·&lt;span style=&quot;FONT: 7pt 'Times New Roman'&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;绝对锚定&lt;/span&gt;&lt;p /&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&amp;lt;&amp;lt;\A&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;只匹配整个字符串的开始位置，&lt;/span&gt;&amp;lt;&amp;lt;\Z&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;只匹配整个字符串的结束位置。即使你使用了“多行模式”，&lt;/span&gt;&amp;lt;&amp;lt;\A&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和&lt;/span&gt;&amp;lt;&amp;lt;\Z&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;也从不匹配新行符。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0in 0in 0pt; TEXT-INDENT: 0.3in&quot;&gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;即使&lt;/span&gt;\Z&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和&lt;/span&gt;$&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;只匹配字符串的结束位置，仍然有一个例外的情况。如果字符串以新行符结束，则&lt;/span&gt;\Z&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;和&lt;/span&gt;$&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;将会匹配新行符前面的位置，而不是整个字符串的最后面。这个“改进”是由&lt;/span&gt;Perl&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;引进的，然后被许多的正则表达式实现所遵循，包括&lt;/span&gt;Java&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，&lt;/span&gt;.NET&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;等。如果应用&lt;/span&gt;&amp;lt;&amp;lt;^[a-z]+$&amp;gt;&amp;gt;&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;到“&lt;/span&gt;joe\n&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”，则匹配结果是“&lt;/span&gt;joe&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”而不是“&lt;/span&gt;joe\n&lt;span lang=&quot;ZH-CN&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;”。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</description><category>web开发</category><pubDate>Sat, 30 Dec 2006 20:58:48 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14498007.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14498007.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235201/1237942</fs:itemid></item><item><title>JS的正则表达式</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235202/1237942/1/item.html</link><description>&lt;p&gt;//校验是否全由数字组成 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;isDigit(s) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;patrn=/^[&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;9&lt;/span&gt;&lt;span&gt;]{&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;20&lt;/span&gt;&lt;span&gt;}$/; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(!patrn.exec(s))&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;false&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;true&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;//校验登录名：只能输入5-20个以字母开头、可带数字、“_”、“.”的字串 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;isRegisterUserName(s) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;patrn=/^[a-zA-Z]{&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;}([a-zA-Z0-&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;9&lt;/span&gt;&lt;span&gt;]|[._]){&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;19&lt;/span&gt;&lt;span&gt;}$/; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(!patrn.exec(s))&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;false&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;true&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;//校验用户姓名：只能输入1-30个以字母开头的字串 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;isTrueName(s) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;patrn=/^[a-zA-Z]{&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;30&lt;/span&gt;&lt;span&gt;}$/; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(!patrn.exec(s))&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;false&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;true&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;}} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//校验密码：只能输入6-20个字母、数字、下划线 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;[code] &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;function&amp;nbsp;isPasswd(s) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;patrn=/^(\w){&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;6&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;20&lt;/span&gt;&lt;span&gt;}$/; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(!patrn.exec(s))&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;false&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;true&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;//校验普通电话、传真号码：可以“+”开头，除数字外，可含有“-” &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;isTel(s) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//var&amp;nbsp;patrn=/^[+]{0,1}(\d){1,3}[&amp;nbsp;]?([-]?(\d){1,12})+$/; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;var&amp;nbsp;patrn=/^[+]{&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;}(\d){&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;3&lt;/span&gt;&lt;span&gt;}[&amp;nbsp;]?([-]?((\d)|[&amp;nbsp;]){&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;12&lt;/span&gt;&lt;span&gt;})+$/; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(!patrn.exec(s))&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;false&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;true&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;//校验手机号码：必须以数字开头，除数字外，可含有“-” &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;isMobil(s) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;patrn=/^[+]{&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;}(\d){&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;3&lt;/span&gt;&lt;span&gt;}[&amp;nbsp;]?([-]?((\d)|[&amp;nbsp;]){&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;12&lt;/span&gt;&lt;span&gt;})+$/; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(!patrn.exec(s))&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;false&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;true&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;//校验邮政编码 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;isPostalCode(s) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//var&amp;nbsp;patrn=/^[a-zA-Z0-9]{3,12}$/; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;var&amp;nbsp;patrn=/^[a-zA-Z0-&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;9&lt;/span&gt;&lt;span&gt;&amp;nbsp;]{&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;12&lt;/span&gt;&lt;span&gt;}$/; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(!patrn.exec(s))&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;false&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;true&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;//校验搜索关键字 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;isSearch(s) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;patrn=/^[^`~!@#$%^&amp;amp;*()+=|\\\][\]\{\}:;'\,.&amp;lt;&amp;gt;/?]{&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;}[^`~!@$%^&amp;amp;()+=|\\\] &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[\]\{\}:;'\,.&amp;lt;&amp;gt;?]{&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;19&lt;/span&gt;&lt;span&gt;}$/; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(!patrn.exec(s))&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;false&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;true&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;function&amp;nbsp;isIP(s)&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//by&amp;nbsp;zergling &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;patrn=/^[&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;9&lt;/span&gt;&lt;span&gt;.]{&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;20&lt;/span&gt;&lt;span&gt;}$/; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(!patrn.exec(s))&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;false&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;true&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 18pt&quot;&gt;正则表达式&lt;/span&gt; &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^\\d+$&amp;quot;&lt;/span&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//非负整数（正整数&amp;nbsp;+&amp;nbsp;0） &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^[0-9]*[1-9][0-9]*$&amp;quot;&lt;/span&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//正整数&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^((-\\d+)|(0+))$&amp;quot;&lt;/span&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//非正整数（负整数&amp;nbsp;+&amp;nbsp;0）&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^-[0-9]*[1-9][0-9]*$&amp;quot;&lt;/span&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//负整数&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^-?\\d+$&amp;quot;&lt;/span&gt;&lt;span&gt;　　　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//整数&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^\\d+(\\.\\d+)?$&amp;quot;&lt;/span&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//非负浮点数（正浮点数&amp;nbsp;+&amp;nbsp;0）&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$&amp;quot;&lt;/span&gt;&lt;span&gt;　 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//正浮点数&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$&amp;quot;&lt;/span&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//非正浮点数（负浮点数&amp;nbsp;+&amp;nbsp;0）&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$&amp;quot;&lt;/span&gt;&lt;span&gt;　 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//负浮点数&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^(-?\\d+)(\\.\\d+)?$&amp;quot;&lt;/span&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//浮点数&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^[A-Za-z]+$&amp;quot;&lt;/span&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//由26个英文字母组成的字符串&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^[A-Z]+$&amp;quot;&lt;/span&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//由26个英文字母的大写组成的字符串&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^[a-z]+$&amp;quot;&lt;/span&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//由26个英文字母的小写组成的字符串&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^[A-Za-z0-9]+$&amp;quot;&lt;/span&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//由数字和26个英文字母组成的字符串&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^\\w+$&amp;quot;&lt;/span&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//由数字、26个英文字母或者下划线组成的字符串&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$&amp;quot;&lt;/span&gt;&lt;span&gt;　　　　&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//email地址&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$&amp;quot;&lt;/span&gt;&lt;span&gt;　　//url &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^[A-Za-z0-9_]*$&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 18pt&quot;&gt;正则表达式使用详解&lt;/span&gt;&lt;/p&gt;&lt;p&gt;简介 &lt;/p&gt;&lt;p&gt;简单的说，正则表达式是一种可以用于模式匹配和替换的强有力的工具。其作用如下： &lt;br /&gt;测试字符串的某个模式。例如，可以对一个输入字符串进行测试，看在该字符串是否存在一个电话号码模式或一个信用卡号码模式。这称为数据有效性验证。 &lt;br /&gt;替换文本。可以在文档中使用一个正则表达式来标识特定文字，然后可以全部将其删除，或者替换为别的文字。 &lt;br /&gt;根据模式匹配从字符串中提取一个子字符串。可以用来在文本或输入字段中查找特定文字。 &lt;/p&gt;&lt;p&gt;基本语法 &lt;/p&gt;&lt;p&gt;在对正则表达式的功能和作用有了初步的了解之后，我们就来具体看一下正则表达式的语法格式。 &lt;br /&gt;正则表达式的形式一般如下：　　&lt;/p&gt;&lt;p&gt;/love/　　其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。用户只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。为了能够使用户更加灵活的定制模式内容，正则表达式提供了专门的“元字符”。所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符，可以用来规定其前导字符（即位于元字符前面的字符）在目标对象中的出现模式。 &lt;br /&gt;较为常用的元字符包括： “+”， “*”，以及 “?”。&lt;/p&gt;&lt;p&gt;“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次。&lt;/p&gt;&lt;p&gt;“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次。&lt;/p&gt;&lt;p&gt;“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。&lt;/p&gt;&lt;p&gt;下面，就让我们来看一下正则表达式元字符的具体应用。 &lt;/p&gt;&lt;p&gt;/fo+/　　因为上述正则表达式中包含“+”元字符，表示可以与目标对象中的 “fool”, “fo”, 或者 “football”等在字母f后面连续出现一个或多个字母o的字符串相匹配。 &lt;/p&gt;&lt;p&gt;/eg*/　　因为上述正则表达式中包含“*”元字符，表示可以与目标对象中的 “easy”, “ego”, 或者 “egg”等在字母e后面连续出现零个或多个字母g的字符串相匹配。 &lt;/p&gt;&lt;p&gt;/Wil?/　　因为上述正则表达式中包含“？”元字符，表示可以与目标对象中的 “Win”, 或者“Wilson”,等在字母i后面连续出现零个或一个字母l的字符串相匹配。 &lt;/p&gt;&lt;p&gt;有时候不知道要匹配多少字符。为了能适应这种不确定性，正则表达式支持限定符的概念。这些限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。&lt;/p&gt;&lt;p&gt;{n} n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 &amp;quot;Bob&amp;quot; 中的 'o'，但是能匹配 &amp;quot;food&amp;quot; 中的两个 o。&lt;/p&gt;&lt;p&gt;{n,} n 是一个非负整数。至少匹配 n 次。例如，'o{2,}' 不能匹配 &amp;quot;Bob&amp;quot; 中的 'o'，但能匹配 &amp;quot;foooood&amp;quot; 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。&lt;/p&gt;&lt;p&gt;{n,m} m 和 n 均为非负整数，其中n &amp;lt;= m。最少匹配 n 次且最多匹配 m 次。例如，&amp;quot;o{1,3}&amp;quot; 将匹配 &amp;quot;fooooood&amp;quot; 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。&lt;/p&gt;&lt;p&gt;除了元字符之外，用户还可以精确指定模式在匹配对象中出现的频率。例如，/jim {2,6}/ 上述正则表达式规定字符m可以在匹配对象中连续出现2-6次，因此，上述正则表达式可以同jimmy或jimmmmmy等字符串相匹配。 &lt;br /&gt;在对如何使用正则表达式有了初步了解之后，我们来看一下其它几个重要的元字符的使用方式。 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;\s：用于匹配单个空格符，包括tab键和换行符；&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;\S：用于匹配除单个空格符之外的所有字符；&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;\d：用于匹配从&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;&lt;span&gt;到&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;9&lt;/span&gt;&lt;span&gt;的数字；&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;\w：用于匹配字母，数字或下划线字符；&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;\W：用于匹配所有与\w不匹配的字符；&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;.&amp;nbsp;：用于匹配除换行符之外的所有字符。&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;br /&gt;（说明：我们可以把\s和\S以及\w和\W看作互为逆运算） &lt;br /&gt;下面，我们就通过实例看一下如何在正则表达式中使用上述元字符。 &lt;br /&gt;/\s+/ 上述正则表达式可以用于匹配目标对象中的一个或多个空格字符。 &lt;br /&gt;/\d000/　如果我们手中有一份复杂的财务报表，那么我们可以通过上述正则表达式轻而易举的查找到所有总额达千元的款项。 &lt;br /&gt;除了我们以上所介绍的元字符之外，正则表达式中还具有另外一种较为独特的专用字符，即定位符。定位符用于规定匹配模式在目标对象中的出现位置。 较为常用的定位符包括： “^”, “$”, “\b” 以及 “\B”。 &lt;br /&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;“^”定位符规定匹配模式必须出现在目标字符串的开头 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;“$”定位符规定匹配模式必须出现在目标对象的结尾 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;“\b”定位符规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;“\B”定位符则规定匹配对象必须位于目标字符串的开头和结尾两个边界之内， &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;即匹配对象既不能作为目标字符串的开头，也不能作为目标字符串的结尾。 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;br /&gt;同样，我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。举例来说： /^hell/　因为上述正则表达式中包含“^”定位符，所以可以与目标对象中以 “hell”, “hello”或“hellhound”开头的字符串相匹配。 /ar$/　因为上述正则表达式中包含“$”定位符，所以可以与目标对象中以 “car”, “bar”或 “ar” 结尾的字符串相匹配。 /\bbom/　因为上述正则表达式模式以“\b”定位符开头，所以可以与目标对象中以 “bomb”, 或 “bom”开头的字符串相匹配。/man\b/　因为上述正则表达式模式以“\b”定位符结尾，所以可以与目标对象中以 “human”, “woman”或 “man”结尾的字符串相匹配。 &lt;br /&gt;为了能够方便用户更加灵活的设定匹配模式，正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。例如： &lt;br /&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;/[A-Z]/　　上述正则表达式将会与从A到Z范围内任何一个大写字母相匹配。 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;/[a-z]/　　上述正则表达式将会与从a到z范围内任何一个小写字母相匹配。&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;/[&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;9&lt;/span&gt;&lt;span&gt;]/&amp;nbsp;　上述正则表达式将会与从&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;&lt;span&gt;到&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;9&lt;/span&gt;&lt;span&gt;范围内任何一个数字相匹配。&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;/([a-z][A-Z][&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;9&lt;/span&gt;&lt;span&gt;])+/　上述正则表达式将会与任何由字母和数字组成的字符串，如&amp;nbsp;“aB0”&amp;nbsp;等相匹配。 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;br /&gt;这里需要提醒用户注意的一点就是可以在正则表达式中使用 “()” 把字符串组合在一起。“()”符号包含的内容必须同时出现在目标对象中。因此，上述正则表达式将无法与诸如 “abc”等的字符串匹配，因为“abc”中的最后一个字符为字母而非数字。 &lt;br /&gt;如果我们希望在正则表达式中实现类似编程逻辑中的“或”运算，在多个不同的模式中任选一个进行匹配的话，可以使用管道符 “|”。例如：/to|too|2/　上述正则表达式将会与目标对象中的 “to”, “too”, 或 “2” 相匹配。 &lt;br /&gt;正则表达式中还有一个较为常用的运算符，即否定符 “[^]”。与我们前文所介绍的定位符 “^” 不同，否定符 “[^]”规定目标对象中不能存在模式中所规定的字符串。例如：/[^A-C]/　上述字符串将会与目标对象中除A，B，和C之外的任何字符相匹配。一般来说，当“^”出现在 “[]”内时就被视做否定运算符；而当“^”位于“[]”之外，或没有“[]”时，则应当被视做定位符。 &lt;br /&gt;最后，当用户需要在正则表达式的模式中加入元字符，并查找其匹配对象时，可以使用转义符“\”。例如：/Th\*/ 　上述正则表达式将会与目标对象中的“Th*”而非“The”等相匹配。 &lt;br /&gt;在构造正则表达式之后，就可以象数学表达式一样来求值，也就是说，可以从左至右并按照一个优先级顺序来求值。优先级如下： &lt;br /&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;．\&amp;nbsp;转义符 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;&lt;span&gt;．(),&amp;nbsp;(?:),&amp;nbsp;(?=),&amp;nbsp;[]&amp;nbsp;圆括号和方括号 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;3&lt;/span&gt;&lt;span&gt;．*,&amp;nbsp;+,&amp;nbsp;?,&amp;nbsp;{n},&amp;nbsp;{n,},&amp;nbsp;{n,m}&amp;nbsp;限定符 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;4&lt;/span&gt;&lt;span&gt;．^,&amp;nbsp;$,&amp;nbsp;\anymetacharacter&amp;nbsp;位置和顺序 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;5&lt;/span&gt;&lt;span&gt;．|“或”操作 &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 18pt&quot;&gt;使用实例&lt;/span&gt; &lt;br /&gt;在JavaScript 1.2中带有一个功能强大的RegExp()对象，可以用来进行正则表达式的匹配操作。其中的test()方法可以检验目标对象中是否包含匹配模式，并相应的返回true或false。 &lt;br /&gt;我们可以使用JavaScript编写以下脚本，验证用户输入的邮件地址的有效性。 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-xml&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;　&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;script&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;language&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;Javascript1.2&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　　　&amp;nbsp;&amp;lt;!--&amp;nbsp;start&amp;nbsp;hiding&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;　　　　&amp;nbsp;function&amp;nbsp;verifyAddress(obj)&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　　　　{&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;　　　　　　var&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;email&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;obj&lt;/span&gt;&lt;span&gt;.email.value;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　　　　　var&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;pattern&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　　　　　&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;flag&lt;/span&gt;&lt;span&gt;&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;pattern&lt;/span&gt;&lt;span&gt;.test(email);&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;　　　　　　if(flag)&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　　　　　{&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;　　　　　　　alert(“Your&amp;nbsp;email&amp;nbsp;address&amp;nbsp;is&amp;nbsp;correct!”);&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　　　　　　return&amp;nbsp;true;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;　　　　　　}&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　　　　　else&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;　　　　　　　{&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　　　　　　　alert(“Please&amp;nbsp;try&amp;nbsp;again!”);&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;　　　　　　　　return&amp;nbsp;false;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　　　　　　&amp;nbsp;}&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;　　　　　&amp;nbsp;}&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　　　&amp;nbsp;//&amp;nbsp;stop&amp;nbsp;hiding&amp;nbsp;--&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;　　　&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;head&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;　&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;form&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;onSubmit&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;return&amp;nbsp;verifyAddress(this);&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;　　　&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;input&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;email&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　　&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;input&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;attribute&quot;&gt;type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span class=&quot;attribute-value&quot;&gt;&amp;quot;submit&amp;quot;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;　　　&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;form&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;　　&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;tag-name&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;tag&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 18pt&quot;&gt;正则表达式对象&lt;/span&gt; &lt;br /&gt;本对象包含正则表达式模式以及表明如何应用模式的标志。 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;语法&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;&amp;nbsp;re&amp;nbsp;=&amp;nbsp;/pattern/[flags] &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;语法&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;&lt;span&gt;&amp;nbsp;re&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;RegExp(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;pattern&amp;quot;&lt;/span&gt;&lt;span&gt;,[&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;flags&amp;quot;&lt;/span&gt;&lt;span&gt;])&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;br /&gt;参数 &lt;br /&gt;re &lt;br /&gt;必选项。将要赋值为正则表达式模式的变量名。 &lt;p /&gt;&lt;p&gt;Pattern &lt;br /&gt;必选项。要使用的正则表达式模式。如果使用语法 1，用 &amp;quot;/&amp;quot; 字符分隔模式。如果用语法 2，用引号将模式引起来。 &lt;/p&gt;&lt;p&gt;Flags &lt;br /&gt;可选项。如果使用语法 2 要用引号将 flag 引起来。标志可以组合使用，可用的有： &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;g&amp;nbsp;（全文查找出现的所有&amp;nbsp;pattern）&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;i&amp;nbsp;（忽略大小写）&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;m&amp;nbsp;（多行查找）&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 18pt&quot;&gt;示例&lt;/span&gt; &lt;br /&gt;下面的示例创建一个包含正则表达式模式及相关标志的对象(re)，向您演示正则表达式对象的用法。在本例中，作为结果的正则表达式对象又用于 match 方法中： &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;MatchDemo() &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;r,&amp;nbsp;re;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;声明变量。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;var&amp;nbsp;s&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;The&amp;nbsp;rain&amp;nbsp;in&amp;nbsp;Spain&amp;nbsp;falls&amp;nbsp;mainly&amp;nbsp;in&amp;nbsp;the&amp;nbsp;plain&amp;quot;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;re&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;RegExp(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;ain&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;g&amp;quot;&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;创建正则表达式对象。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;r&amp;nbsp;=&amp;nbsp;s.match(re);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;在字符串&amp;nbsp;s&amp;nbsp;中查找匹配。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;(r);&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;返回值： ain,ain,ain,ain\\ &lt;br /&gt;属性 lastIndex 属性 | source 属性\\ &lt;br /&gt;方法 compile 方法 | exec 方法 | test 方法\\ &lt;br /&gt;要求 版本 3\\ &lt;br /&gt;请参阅 RegExp 对象 | 正则表达式语法 | String 对象\\&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 18pt&quot;&gt;exec 方法&lt;/span&gt; &lt;br /&gt;用正则表达式模式在字符串中运行查找，并返回包含该查找结果的一个数组。 &lt;br /&gt;rgExp.exec(str)&lt;/p&gt;&lt;p&gt;参数&lt;/p&gt;&lt;p&gt;rgExp &lt;br /&gt;必选项。包含正则表达式模式和可用标志的正则表达式对象。 &lt;/p&gt;&lt;p&gt;str &lt;br /&gt;必选项。要在其中执行查找的 String 对象或字符串文字。 &lt;/p&gt;&lt;p&gt;说明\\ &lt;br /&gt;如果 exec 方法没有找到匹配，则它返回 null。如果它找到匹配，则 exec 方法返回一个数组，并且更新全局 RegExp 对象的属性，以反映匹配结果。数组的0元素包含了完整的匹配，而第1到n元素中包含的是匹配中出现的任意一个子匹配。这相当于没有设置全局标志 (g) 的 match 方法。 &lt;br /&gt;如果为正则表达式设置了全局标志，exec 从以 lastIndex 的值指示的位置开始查找。如果没有设置全局标志，exec 忽略 lastIndex 的值，从字符串的起始位置开始搜索。&lt;/p&gt;&lt;p&gt;exec 方法返回的数组有三个属性，分别是 input、index 和 lastIndex。Input 属性包含了整个被查找的字符串。Index 属性中包含了整个被查找字符串中被匹配的子字符串的位置。LastIndex 属性中包含了匹配中最后一个字符的下一个位置。&lt;/p&gt;&lt;p&gt;示例\\ &lt;br /&gt;下面的例子举例说明了 exec 方法的用法： &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;RegExpTest() &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;ver&amp;nbsp;=&amp;nbsp;Number(ScriptEngineMajorVersion()&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;ScriptEngineMinorVersion()) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(ver&amp;nbsp;&amp;gt;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;5.5&lt;/span&gt;&lt;span&gt;){&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;测试&amp;nbsp;JScript&amp;nbsp;的版本。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;src&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;The&amp;nbsp;rain&amp;nbsp;in&amp;nbsp;Spain&amp;nbsp;falls&amp;nbsp;mainly&amp;nbsp;in&amp;nbsp;the&amp;nbsp;plain.&amp;quot;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;var&amp;nbsp;re&amp;nbsp;=&amp;nbsp;/\w+/g;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;创建正则表达式模式。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;arr; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt;&lt;span&gt;&amp;nbsp;((arr&amp;nbsp;=&amp;nbsp;re.exec(src))&amp;nbsp;!=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;null&lt;/span&gt;&lt;span&gt;) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;document.write(arr.index&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;-&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;arr.lastIndex&amp;nbsp;+&amp;nbsp;arr&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;\t&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;alert(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;请使用&amp;nbsp;JScript&amp;nbsp;的更新版本&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;返回值：0-3The 4-8rain 9-11in 12-17Spain 18-23falls 24-30mainly 31-33in 34-37the 38-43plain&lt;/p&gt;&lt;p&gt;test 方法\\ &lt;br /&gt;返回一个 Boolean 值，它指出在被查找的字符串中是否存在模式。 &lt;br /&gt;rgexp.test(str) &lt;/p&gt;&lt;p&gt;参数\\ &lt;br /&gt;rgexp &lt;br /&gt;必选项。包含正则表达式模式或可用标志的正则表达式对象。 &lt;/p&gt;&lt;p&gt;str &lt;br /&gt;必选项。要在其上测试查找的字符串。 &lt;/p&gt;&lt;p&gt;说明 &lt;br /&gt;test 方法检查在字符串中是否存在一个模式，如果存在则返回 true，否则就返回 false。 &lt;br /&gt;全局 RegExp 对象的属性不由 test 方法来修改。&lt;/p&gt;&lt;p&gt;示例 &lt;br /&gt;下面的例子举例说明了 test 方法的用法： &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;TestDemo(re,&amp;nbsp;s) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;s1;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;声明变量。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;检查字符串是否存在正则表达式。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(re.test(s))&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;测试是否存在。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;s1&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;&amp;nbsp;contains&amp;nbsp;&amp;quot;&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;s&amp;nbsp;包含模式。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;s1&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;&amp;nbsp;does&amp;nbsp;not&amp;nbsp;contain&amp;nbsp;&amp;quot;&lt;/span&gt;&lt;span&gt;;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;s&amp;nbsp;不包含模式。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;'&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;s&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;'&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;+&amp;nbsp;s1&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;'&amp;quot;&lt;/span&gt;&lt;span&gt;+&amp;nbsp;re.source&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;'&amp;quot;&lt;/span&gt;&lt;span&gt;);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;返回字符串。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;函数调用：document.write (TestDemo(/ain+/ ,&amp;quot;The rain in Spain falls mainly in the plain.&amp;quot;));&lt;/p&gt;&lt;p&gt;返回值：'The rain in Spain falls mainly in the plain.' contains 'ain+'&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 18pt&quot;&gt;match 方法&lt;/span&gt; &lt;br /&gt;使用正则表达式模式对字符串执行查找，并将包含查找的结果作为数组返回。\\ &lt;br /&gt;stringObj.match(rgExp) &lt;/p&gt;&lt;p&gt;参数\\ &lt;br /&gt;stringObj &lt;br /&gt;必选项。对其进行查找的 String 对象或字符串文字。 &lt;/p&gt;&lt;p&gt;rgExp &lt;br /&gt;必选项。为包含正则表达式模式和可用标志的正则表达式对象。也可以是包含正则表达式模式和可用标志的变量名或字符串文字。 &lt;/p&gt;&lt;p&gt;说明\\ &lt;br /&gt;如果 match 方法没有找到匹配，返回 null。如果找到匹配返回一个数组并且更新全局 RegExp 对象的属性以反映匹配结果。 &lt;br /&gt;match 方法返回的数组有三个属性：input、index 和 lastIndex。Input 属性包含整个的被查找字符串。Index 属性包含了在整个被查找字符串中匹配的子字符串的位置。LastIndex 属性包含了最后一次匹配中最后一个字符的下一个位置。 &lt;br /&gt;如果没有设置全局标志 (g)，数组的 0 元素包含整个匹配，而第 1 到 n 元素包含了匹配中曾出现过的任一个子匹配。这相当于没有设置全局标志的 exec 方法。如果设置了全局标志，元素 0 到 n 中包含所有匹配。&lt;/p&gt;&lt;p&gt;示例\\ &lt;br /&gt;下面的示例演示了match 方法的用法： &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;MatchDemo() &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;r,&amp;nbsp;re;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;声明变量。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;var&amp;nbsp;s&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;The&amp;nbsp;rain&amp;nbsp;in&amp;nbsp;Spain&amp;nbsp;falls&amp;nbsp;mainly&amp;nbsp;in&amp;nbsp;the&amp;nbsp;plain&amp;quot;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;re&amp;nbsp;=&amp;nbsp;/ain/i;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;创建正则表达式模式。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;r&amp;nbsp;=&amp;nbsp;s.match(re);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;尝试匹配搜索字符串。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;(r);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;返回第一次出现&amp;nbsp;&amp;quot;ain&amp;quot;&amp;nbsp;的地方。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;br /&gt;返回值：ain &lt;p /&gt;&lt;p&gt;本示例说明带 g 标志设置的 match 方法的用法。 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;MatchDemo() &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;r,&amp;nbsp;re;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;声明变量。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;var&amp;nbsp;s&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;The&amp;nbsp;rain&amp;nbsp;in&amp;nbsp;Spain&amp;nbsp;falls&amp;nbsp;mainly&amp;nbsp;in&amp;nbsp;the&amp;nbsp;plain&amp;quot;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;re&amp;nbsp;=&amp;nbsp;/ain/ig;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;创建正则表达式模式。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;r&amp;nbsp;=&amp;nbsp;s.match(re);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;尝试去匹配搜索字符串。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;(r);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;返回的数组包含了所有&amp;nbsp;&amp;quot;ain&amp;quot;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;出现的四个匹配。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;br /&gt;返回值：ain,ain,ain,ain &lt;p /&gt;&lt;p&gt;上面几行代码演示了字符串文字的 match 方法的用法。 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;var&amp;nbsp;r,&amp;nbsp;re&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Spain&amp;quot;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;r&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;The&amp;nbsp;rain&amp;nbsp;in&amp;nbsp;Spain&amp;quot;&lt;/span&gt;&lt;span&gt;.replace(re,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;Canada&amp;quot;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;r; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;br /&gt;返回值：The rain in Canada &lt;p /&gt;&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 18pt&quot;&gt;search 方法&lt;/span&gt; &lt;br /&gt;返回与正则表达式查找内容匹配的第一个子字符串的位置。&lt;/p&gt;&lt;p&gt;stringObj.search(rgExp)&lt;/p&gt;&lt;p&gt;参数\\ &lt;br /&gt;stringObj &lt;br /&gt;必选项。要在其上进行查找的 String 对象或字符串文字。 &lt;/p&gt;&lt;p&gt;rgExp &lt;br /&gt;必选项。包含正则表达式模式和可用标志的正则表达式对象。 &lt;/p&gt;&lt;p&gt;说明&lt;/p&gt;&lt;p&gt;search 方法指明是否存在相应的匹配。如果找到一个匹配，search 方法将返回一个整数值，指明这个匹配距离字符串开始的偏移位置。如果没有找到匹配，则返回 -1。&lt;/p&gt;&lt;p&gt;示例\\ &lt;br /&gt;下面的示例演示了 search 方法的用法。 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;SearchDemo() &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;r,&amp;nbsp;re;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;声明变量。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;var&amp;nbsp;s&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;The&amp;nbsp;rain&amp;nbsp;in&amp;nbsp;Spain&amp;nbsp;falls&amp;nbsp;mainly&amp;nbsp;in&amp;nbsp;the&amp;nbsp;plain.&amp;quot;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;re&amp;nbsp;=&amp;nbsp;/falls/i;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;创建正则表达式模式。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;r&amp;nbsp;=&amp;nbsp;s.search(re);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;查找字符串。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;(r);&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;comment&quot;&gt;//&amp;nbsp;返回&amp;nbsp;Boolean&amp;nbsp;结果。 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;br /&gt;返回值：18 &lt;p /&gt;&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 18pt&quot;&gt;正则表达式语法&lt;/span&gt; &lt;br /&gt;一个正则表达式就是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。&lt;/p&gt;&lt;p&gt;这里有一些可能会遇到的正则表达式示例： &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;JScript&amp;nbsp;VBScript&amp;nbsp;匹配&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;/^\[&amp;nbsp;\t]*$/&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;^\[&amp;nbsp;\t]*$&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;匹配一个空白行。&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;/\d{&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;&lt;span&gt;}-\d{&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;5&lt;/span&gt;&lt;span&gt;}/&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;\d{2}-\d{5}&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;验证一个ID&amp;nbsp;号码是否由一个&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;&lt;span&gt;位数字，一个连字符以及一个&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;5&lt;/span&gt;&lt;span&gt;位数字组成。&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;/&amp;lt;(.*)&amp;gt;.*&amp;lt;\/\&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;&amp;gt;/&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;&amp;lt;(.*)&amp;gt;.*&amp;lt;\/\1&amp;gt;&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;匹配一个&amp;nbsp;HTML&amp;nbsp;标记。&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;下表是元字符及其在正则表达式上下文中的行为的一个完整列表：&lt;/p&gt;&lt;p&gt;字符 描述 &lt;br /&gt;\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如，'n' 匹配字符 &amp;quot;n&amp;quot;。'\n' 匹配一个换行符。序列 '\\' 匹配 &amp;quot;\&amp;quot; 而 &amp;quot;\(&amp;quot; 则匹配 &amp;quot;(&amp;quot;。 &lt;/p&gt;&lt;p&gt;^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性，^ 也匹配 '\n' 或 '\r' 之后的位置。 &lt;/p&gt;&lt;p&gt;$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性，$ 也匹配 '\n' 或 '\r' 之前的位置。 &lt;/p&gt;&lt;p&gt;* 匹配前面的子表达式零次或多次。例如，zo* 能匹配 &amp;quot;z&amp;quot; 以及 &amp;quot;zoo&amp;quot;。 * 等价于{0,}。 &lt;/p&gt;&lt;p&gt;+ 匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 &amp;quot;zo&amp;quot; 以及 &amp;quot;zoo&amp;quot;，但不能匹配 &amp;quot;z&amp;quot;。+ 等价于 {1,}。 &lt;/p&gt;&lt;p&gt;? 匹配前面的子表达式零次或一次。例如，&amp;quot;do(es)?&amp;quot; 可以匹配 &amp;quot;do&amp;quot; 或 &amp;quot;does&amp;quot; 中的&amp;quot;do&amp;quot; 。? 等价于 {0,1}。 &lt;/p&gt;&lt;p&gt;{n} n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 &amp;quot;Bob&amp;quot; 中的 'o'，但是能匹配 &amp;quot;food&amp;quot; 中的两个 o。 &lt;/p&gt;&lt;p&gt;{n,} n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 &amp;quot;Bob&amp;quot; 中的 'o'，但能匹配 &amp;quot;foooood&amp;quot; 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 &lt;/p&gt;&lt;p&gt;{n,m} m 和 n 均为非负整数，其中n &amp;lt;= m。最少匹配 n 次且最多匹配 m 次。刘， &amp;quot;o{1,3}&amp;quot; 将匹配 &amp;quot;fooooood&amp;quot; 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 &lt;/p&gt;&lt;p&gt;? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串 &amp;quot;oooo&amp;quot;，'o+?' 将匹配单个 &amp;quot;o&amp;quot;，而 'o+' 将匹配所有 'o'。 &lt;/p&gt;&lt;p&gt;. 匹配除 &amp;quot;\n&amp;quot; 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。 &lt;br /&gt;(pattern) 匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches 集合，在JScript 中则使用 $0…$9 属性。要匹配圆括号字符，请使用 '\(' 或 '\)'。 &lt;/p&gt;&lt;p&gt;(?:pattern) 匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 &amp;quot;或&amp;quot; 字符 (|) 来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 &lt;/p&gt;&lt;p&gt;(?=pattern) 正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如， 'Windows (?=95|98|NT|2000)' 能匹配 &amp;quot;Windows 2000&amp;quot; 中的 &amp;quot;Windows&amp;quot; ，但不能匹配 &amp;quot;Windows 3.1&amp;quot; 中的 &amp;quot;Windows&amp;quot;。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。 &lt;/p&gt;&lt;p&gt;(?!pattern) 负向预查，在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 &amp;quot;Windows 3.1&amp;quot; 中的 &amp;quot;Windows&amp;quot;，但不能匹配 &amp;quot;Windows 2000&amp;quot; 中的 &amp;quot;Windows&amp;quot;。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始 &lt;/p&gt;&lt;p&gt;x|y 匹配 x 或 y。例如，'z|food' 能匹配 &amp;quot;z&amp;quot; 或 &amp;quot;food&amp;quot;。'(z|f)ood' 则匹配 &amp;quot;zood&amp;quot; 或 &amp;quot;food&amp;quot;。 &lt;/p&gt;&lt;p&gt;[xyz] 字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 &amp;quot;plain&amp;quot; 中的 'a'。 &lt;/p&gt;&lt;p&gt;[^xyz] 负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 &amp;quot;plain&amp;quot; 中的'p'。 &lt;/p&gt;&lt;p&gt;[a-z] 字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 &lt;/p&gt;&lt;p&gt;[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 &lt;/p&gt;&lt;p&gt;\b 匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配&amp;quot;never&amp;quot; 中的 'er'，但不能匹配 &amp;quot;verb&amp;quot; 中的 'er'。 &lt;/p&gt;&lt;p&gt;\B 匹配非单词边界。'er\B' 能匹配 &amp;quot;verb&amp;quot; 中的 'er'，但不能匹配 &amp;quot;never&amp;quot; 中的 'er'。 &lt;/p&gt;&lt;p&gt;\cx 匹配由x指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。 &lt;/p&gt;&lt;p&gt;\d 匹配一个数字字符。等价于 [0-9]。 &lt;/p&gt;&lt;p&gt;\D 匹配一个非数字字符。等价于 [^0-9]。 &lt;/p&gt;&lt;p&gt;\f 匹配一个换页符。等价于 \x0c 和 \cL。 &lt;/p&gt;&lt;p&gt;\n 匹配一个换行符。等价于 \x0a 和 \cJ。 &lt;/p&gt;&lt;p&gt;\r 匹配一个回车符。等价于 \x0d 和 \cM。 &lt;/p&gt;&lt;p&gt;\s 匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 &lt;/p&gt;&lt;p&gt;\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 &lt;/p&gt;&lt;p&gt;\t 匹配一个制表符。等价于 \x09 和 \cI。 &lt;/p&gt;&lt;p&gt;\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 &lt;/p&gt;&lt;p&gt;\w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 &lt;/p&gt;&lt;p&gt;\W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 &lt;/p&gt;&lt;p&gt;\xn 匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如， '\x41' 匹配 &amp;quot;A&amp;quot;。'\x041' 则等价于 '\x04' &amp;amp; &amp;quot;1&amp;quot;。正则表达式中可以使用 ASCII 编码。. &lt;/p&gt;&lt;p&gt;\num 匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。 &lt;/p&gt;&lt;p&gt;\n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为后向引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。 &lt;/p&gt;&lt;p&gt;\nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式，则 nm 为后向引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足，若 n 和 m 均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。 &lt;/p&gt;&lt;p&gt;\nml 如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。 &lt;/p&gt;&lt;p&gt;\un 匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)。 &lt;/p&gt;&lt;p&gt;&lt;span style=&quot;FONT-SIZE: 18pt&quot;&gt;优先权顺序&lt;/span&gt; &lt;br /&gt;在构造正则表达式之后，就可以象数学表达式一样来求值，也就是说，可以从左至右并按照一个优先权顺序来求值。 &lt;/p&gt;&lt;p&gt;下表从最高优先级到最低优先级列出各种正则表达式操作符的优先权顺序： &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;操作符&amp;nbsp;描述&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;\&amp;nbsp;转义符&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;(),&amp;nbsp;(?:),&amp;nbsp;(?=),&amp;nbsp;[]&amp;nbsp;圆括号和方括号&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;*,&amp;nbsp;+,&amp;nbsp;?,&amp;nbsp;{n},&amp;nbsp;{n,},&amp;nbsp;{n,m}&amp;nbsp;限定符&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;^,&amp;nbsp;$,&amp;nbsp;\anymetacharacter&amp;nbsp;位置和顺序&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;|&amp;nbsp;“或”操作&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;普通字符&lt;/p&gt;&lt;p&gt;普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符，所有数字，所有标点符号以及一些符号。 &lt;/p&gt;&lt;p&gt;最简单的正则表达式是一个单独的普通字符，可以匹配所搜索字符串中的该字符本身。例如，单字符模式 'A' 可以匹配所搜索字符串中任何位置出现的字母 'A'。这里有一些单字符正则表达式模式的示例： &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;/a/ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;/&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;7&lt;/span&gt;&lt;span&gt;/ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;/M/ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;br /&gt;等价的 VBScript 单字符正则表达式为： &lt;br /&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;7&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&amp;quot;M&amp;quot;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;br /&gt;可以将多个单字符组合在一起得到一个较大的表达式。例如，下面的 JScript 正则表达式不是别的，就是通过组合单字符表达式 'a'、'7'以及 'M' 所创建出来的一个表达式。 &lt;p /&gt;&lt;p&gt;/a7M/ &lt;br /&gt;等价的 VBScript 表达式为：&lt;/p&gt;&lt;p&gt;&amp;quot;a7M&amp;quot; &lt;br /&gt;请注意这里没有连接操作符。所需要做的就是将一个字符放在了另一个字符后面。&lt;/p&gt;&lt;p /&gt;&lt;p&gt;测试是否匹配不应用exec方法，而应该用test方法。exec用于返回包含查找结果的一个数组。 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;isDigit(s) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;patrn=/^[&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;9&lt;/span&gt;&lt;span&gt;]{&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;20&lt;/span&gt;&lt;span&gt;}$/; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(!patrn.exec(s))&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;false&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;true&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;br /&gt;成为 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&lt;/div&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;function&amp;nbsp;isDigit(s) &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;var&amp;nbsp;patrn=/^[&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;9&lt;/span&gt;&lt;span&gt;]{&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;20&lt;/span&gt;&lt;span&gt;}$/; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(patrn.test(s))&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;true&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;false&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span /&gt;&lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&amp;lt;script&gt;&lt;/script&gt;&lt;p /&gt;&lt;p&gt;RegExp对象的$1...$9 属性好象没说到。&lt;/p&gt;&lt;p&gt;看起来更象《JScript中文参考手册》的读书笔记和“我佛山人”写的“Validator”结合体。&lt;/p&gt;</description><category>web开发</category><pubDate>Sat, 30 Dec 2006 17:55:30 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14498006.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14498006.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235202/1237942</fs:itemid></item><item><title>利用myeclipse 生成Hibernate Mapping文件</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235203/1237942/1/item.html</link><description>&lt;table style=&quot;TABLE-LAYOUT: fixed; WORD-WRAP: break-word&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; border=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;div class=&quot;postcontent&quot; id=&quot;show48869&quot;&gt;&lt;font size=&quot;2&quot;&gt;在hibernate中，每个数据表对应的其实是一个实体类，每个实体类有一个对应的hbm.xml配置文件和你匹配，同事们说他们用tanghan这样的插件实现mapping映射文件的生成，找了好长时间，因为我用的是eclipse3.01，所以也没有发现合适的插件，苦闷之际，发现myeclipse中其实有个M&lt;span lang=&quot;EN-US&quot;&gt;yEclipse Database Explorer&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;视图，它提供了myeclipse与数据库直接连接的内置窗口，并且通过此窗口可以生成hibernate的mapping文件。&lt;/span&gt;&lt;/font&gt; &lt;p&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp; 在原有的工程中我配置好了这些，并且可以对数据表进行浏览和数据修改了，但是在执行Generate Hibernate Mapping时，location项browser的时候，弹出窗口显示没有合适的No entries available，即没有办法选择工程文件包目录。&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp; 折腾半天，网上一篇文章提醒了我，原来需要先为应用增加&lt;span lang=&quot;EN-US&quot;&gt;Hibernate&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;特性。操作如下：&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;font size=&quot;2&quot;&gt;1.在项目上点击右键选择&lt;span lang=&quot;EN-US&quot;&gt;MyEclipse&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;选项，为应用增加&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Hibernate&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;特性.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;font size=&quot;2&quot;&gt;2.&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;在出现的配置窗口中，选中“&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Add Hibernate 2.1 libraries to project?&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;”，然后设定存放&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Hibernate&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;库文件的目录为：&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt; /WEB-INF/lib &lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;目录，默认会选择创建一个新的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Hibernate&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;配置文件&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: Arial&quot;&gt;hibernate.cfg.xml&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;。&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;font size=&quot;2&quot;&gt;3.&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;点击下一步，进入&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Hibernate&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;数据库连接配置界面，在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Connection Profile&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;选项中直接选择在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;MyEclipse Database Explorer&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;中配置的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;vipdata&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;选项，然后就会自动生成其他的配置，可以选择“&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Copy JDBC Driver and add to classpath&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;”&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;这样就会将&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;JDBC&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;驱动拷贝到&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;WEB-INF/lib&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;目录中。：&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;font size=&quot;2&quot;&gt;4.&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;点击下一步，来创建&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Hibernate&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SessionFactory&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;类，这是一个简单的集中管理&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Hibernate&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;会话的工厂类，填写类的全名称。&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;font size=&quot;2&quot;&gt;5.&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;点击完成，然后&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;MyEclipse&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;就会将&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Hibernate&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;相关的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;jar&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;包拷贝到&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;lib&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;目录下，同时会生成&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Hibernate&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的配置文件：&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;hibernate.cfg.xml&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，和&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;SessionFactory&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;类&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;现在要利用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;MyEclipse Database Explorer&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;视图中的工具来生成&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Hibernate&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的映射文件。切换到&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;MyEclipse Database Explorer&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;视图，在表&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;vipdata&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;上点击右键，选择&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Create Hibernate Mapping.&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;2&quot;&gt;6.配置生成的持久化类和映射文件。&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;2&quot;&gt;7.&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;点击&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Browse&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，选择生成的类和映射文件的包：com.xxx&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;2&quot;&gt;8.&lt;span lang=&quot;EN-US&quot;&gt;ID Generator算法&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;选项，选择&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;native&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;。（还有很多其他的选项可选，根据应用的需要具体选择,好像hibernate映射的表必须有主健，否则无法利用hibernate技术）。&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;font size=&quot;2&quot;&gt;9.&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;点击完成，这样会生成持久化类&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Vipdata&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;和它的父类&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;AbstractVipdata&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;（生成父类，有利于日后应用的扩展，工具会自动生成详细的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;equals&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;方法和&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;hashCode&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;方法）以及映射文件&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;xxx.hbm.xml&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;。同时会修改&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;Hibernate&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;的配置文件&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;hibernate.cfg.xml&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;，会增加一行.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;到此，hibernate mapping文件生成结束。：）&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;&lt;font size=&quot;2&quot;&gt;其实,eclipse对struts的支持也是很强大的，按照相似的步骤进行配置。很多的工作量就可以完全交给eclipse了。&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;br /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><category>Java</category><pubDate>Sat, 30 Dec 2006 14:47:08 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14498005.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14498005.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235203/1237942</fs:itemid></item><item><title>提高你的SQL能力</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235204/1237942/1/item.html</link><description>&lt;p&gt;公司组织SQL水平考试，看了写教材，写了点总结发上来跟大家分享。&lt;br /&gt;我公司使用的是Sybase ASE12.5，所以下面的一些特性是针对Sybase ASE的。&lt;br /&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;一：SQL Bisic&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;1：SQL(Structured Quary Language)特性：&lt;br /&gt;a：标准化&lt;br /&gt;b：非过程化的&lt;br /&gt;c：可优化的&lt;br /&gt;d：面向集合操作的&lt;br /&gt;&lt;br /&gt;2：ASE中的数据类型&lt;br /&gt;a：Numberic&lt;br /&gt;b：Character&lt;br /&gt;c：Date/Time&lt;br /&gt;d：Lobs&lt;br /&gt;&lt;br /&gt;3: convert(varchar, textColumn),如果不指定varchar(n)n那么默认是30&lt;br /&gt;&lt;br /&gt;4：where 在sql中的作用&lt;br /&gt;a：过滤数据&lt;br /&gt;b：做表连接(sql92以前)&lt;br /&gt;c：选择索引&lt;br /&gt;&lt;br /&gt;5：whare 和 having的区别&lt;br /&gt;where语句把过滤好的数据插入到work table中&lt;br /&gt;having语句从work table中对数据进行在过滤以得到最后的结果。&lt;br /&gt;&lt;br /&gt;6：一个select语句的执行顺序&lt;br /&gt;a：from clause&lt;br /&gt;b：where clause&lt;br /&gt;c：group by clause&lt;br /&gt;d：select clause&lt;br /&gt;e：having clause&lt;br /&gt;f：order by clause&lt;br /&gt;&lt;br /&gt;7：Union VS Union All&lt;br /&gt;a：Union 会把两个结果集排序，并且除去重复的元素（效率差，轻易不要用）&lt;br /&gt;b：Union All仅仅是把两个结果集合并，没有排序，也不去除重复元素（效率好）&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;二：索引和查询参数&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;1：ASE中有三种access数据方式&lt;br /&gt;a：clustered Index&lt;br /&gt;b：nonclustered Index&lt;br /&gt;c：table scan&lt;br /&gt;&lt;br /&gt;2：Covered Query&lt;br /&gt;一个Covered Query 仅仅从索引中得到数据，不用去扫描数据库表，这是最快的数据查询方式。&lt;br /&gt;限制1：只能在selece中生效&lt;br /&gt;限制2：所有被引用的列必须在同一个nonclustered index中&lt;br /&gt;&lt;br /&gt;3：functional index&lt;br /&gt;在ASE15.0以后才被支持，也就是说在ASE15.0以前的版本，下列语句是可定不会用上索引的&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;column1&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;from&lt;/span&gt;&lt;span&gt;&amp;nbsp;table1&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;where&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;upper&lt;/span&gt;&lt;span&gt;(column2)&amp;nbsp;=&amp;nbsp;'IVANL'&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;4：如何查看执行计划&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;showplan&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;on&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;go&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;your&amp;nbsp;sql&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;go&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;showplan&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;off&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;go&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;5: 如何查看IO&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;statistics&lt;/span&gt;&lt;span&gt;&amp;nbsp;io&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;on&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;statistics&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;time&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;on&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;go&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;you&amp;nbsp;sql&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;go&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;statistics&lt;/span&gt;&lt;span&gt;&amp;nbsp;io&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;off&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;statistics&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;time&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;off&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;go&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;6：使用Index的建议&lt;br /&gt;a：使用那些经常在where语句中使用的字段做index&lt;br /&gt;b：使index中包含的字段越少越好&lt;br /&gt;c：drop掉没用的index&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;三：表连接&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;1：什么是表连接&lt;br /&gt;表连接是从多表中查询数据，或者是从一个表中多次取数据。&lt;br /&gt;(A join is a Transanct-SQL operation than access rows from multi-tables or from a single talbe multi-times)&lt;br /&gt;&lt;br /&gt;2：表连接的类别&lt;br /&gt;a：inner join&lt;br /&gt;b：outer join&lt;br /&gt;c：cross join(full join)&lt;br /&gt;&lt;br /&gt;3：ASE中不支持full join但是通过union可以模拟full join&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;t1.colu1,&amp;nbsp;t2.column2&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;from&lt;/span&gt;&lt;span&gt;&amp;nbsp;t1,&amp;nbsp;t2&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;where&lt;/span&gt;&lt;span&gt;&amp;nbsp;t1.id&amp;nbsp;*=&amp;nbsp;t2.id&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;union&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;t1.colu1,&amp;nbsp;t2.column2&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;from&lt;/span&gt;&lt;span&gt;&amp;nbsp;t1,&amp;nbsp;t2&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;where&lt;/span&gt;&lt;span&gt;&amp;nbsp;t1.id&amp;nbsp;=*&amp;nbsp;t2.id&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;(不建议使用，效率很差)&lt;br /&gt;&lt;br /&gt;4：ASE中最多支持50个table做表连接，ASE的查询优化器做的不是很好，Sybase推荐join表不超过4个(-_-~!)&lt;br /&gt;&lt;br /&gt;5：数据库中有三种方式来实现表连接&lt;br /&gt;a：nested loop join&lt;br /&gt;b：merge join&lt;br /&gt;c：hash join&lt;br /&gt;(可以使用show plan来查看数据库选用哪种join来实现join语句)&lt;br /&gt;&lt;br /&gt;6：对表连接的建议：&lt;br /&gt;a：用showplan 看使用了那种用join方式&lt;br /&gt;b：在join的列上加Index&lt;br /&gt;c：把多表的join才分成几个小表的join&lt;br /&gt;d：避免产生笛卡儿积&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;四：使用Case语句&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;1：case语句的两种形式&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;a:&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;func&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;search_condition&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;expression&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;[&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;search_condition&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;expression]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;[&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;exproestion]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;b:&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;func&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;expression&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;expression&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;expression&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;[&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;exproession&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;expression]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;[&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;expression]&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;2：case的用途&lt;br /&gt;a:decoding column&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;cust_id,&amp;nbsp;cust_name&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;func&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;cust_type&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;'R'&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;'Relation'&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;'I'&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;'International'&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;'s'&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;'Small'&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;'Other'&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;as&lt;/span&gt;&lt;span&gt;&amp;nbsp;customer_type&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;b:conditionally displaying columns or values&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;title_id,&amp;nbsp;total_sales,&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;func&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;total_sales&amp;nbsp;&amp;gt;&amp;nbsp;5000&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;'hight'&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;total_sales&amp;nbsp;&amp;lt;&amp;nbsp;100&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;'low'&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;'&amp;nbsp;&amp;nbsp;&amp;nbsp;'&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;as&lt;/span&gt;&lt;span&gt;&amp;nbsp;'&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;column&lt;/span&gt;&lt;span&gt;'&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;c:horizontal frequency table and summary calculation&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;sum&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;type&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;'adv'&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;1&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;0&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;span&gt;&amp;nbsp;)&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;as&lt;/span&gt;&lt;span&gt;&amp;nbsp;adv&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;,&amp;nbsp;&lt;span class=&quot;func&quot;&gt;sum&lt;/span&gt;&lt;span&gt;(&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;type&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;'cus'&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;1&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;0&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;as&lt;/span&gt;&lt;span&gt;&amp;nbsp;cus&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;from&lt;/span&gt;&lt;span&gt;&amp;nbsp;customer&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;d:updating on variable conditions&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;update&lt;/span&gt;&lt;span&gt;&amp;nbsp;customer&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;cust_charge&amp;nbsp;=&amp;nbsp;cust_charte&amp;nbsp;+&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;cust_type&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;'d'&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;'c'&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;2&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;'e'&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;3&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;0&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;[/code]&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;e:rules&amp;nbsp;&lt;span class=&quot;op&quot;&gt;and&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;check&lt;/span&gt;&lt;span&gt;&amp;nbsp;constraints&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;[code]&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;create&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;table&lt;/span&gt;&lt;span&gt;&amp;nbsp;cust_order_info&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;(&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;order_num&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;order_taker&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt;&lt;span&gt;,&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;order_date&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt;&lt;span&gt;(7)&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;default&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;func&quot;&gt;case&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;when&lt;/span&gt;&lt;span&gt;&amp;nbsp;datepart(dw,&amp;nbsp;getDate())&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;op&quot;&gt;between&lt;/span&gt;&lt;span&gt;&amp;nbsp;2&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;op&quot;&gt;and&lt;/span&gt;&lt;span&gt;&amp;nbsp;6&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;then&lt;/span&gt;&lt;span&gt;&amp;nbsp;'weekday'&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;'weekend'&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;keyword&quot;&gt;end&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;)&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;五：事务和锁&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;1：ASE中有两种事务模式&lt;br /&gt;a: Chained Mode&lt;br /&gt;b：unChained Mode(Sybase默认)&lt;br /&gt;unchained mode显示的开始一个事务，chained隐式的开始一个事务&lt;br /&gt;unchained mode 使用'commint tran', 'rollback tran'&lt;br /&gt;chained mode 使用'commint work ', 'rollback work'&lt;br /&gt;unchained mode 支持嵌套事务，chained mode不支持&lt;br /&gt;&lt;br /&gt;2：Locking schema&lt;br /&gt;a: All pages table, will lock data and index as they are accessed(可以有clustered index)&lt;br /&gt;b: A Datapages table will lock datpages as they are accessed, index will not be locked(无clustered index)&lt;br /&gt;c: A DataRow table will lock datpages as they are accessed, index will not be locked(无clustered index)&lt;br /&gt;&lt;br /&gt;3：Locking type&lt;br /&gt;ASE中最重要的三种lock type是&lt;br /&gt;a:shared locks(select , fetch)&lt;br /&gt;b:update locks(fetch ,update, delete)&lt;br /&gt;c:exclusive locks(insert , update, delete)&lt;br /&gt;&lt;br /&gt;4：隔离级别&lt;br /&gt;ASE中一共有四种隔离级别&lt;br /&gt;a:isolation level 0 (read uncommited),允许胀读&lt;br /&gt;b:isolation level 1 (read comminted)(ASE DEFAULT), 不允许胀读&lt;br /&gt;c:isolation level 2 (repeatable read),可重复读&lt;br /&gt;d:isolation level 3 (serializable), 不允许幻影读&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;set&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;transaction&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;isolation&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;level&lt;/span&gt;&lt;span&gt;&amp;nbsp;{0|1|2|3}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;op&quot;&gt;or&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;...&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;at&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;isolation&lt;/span&gt;&lt;span&gt;&amp;nbsp;{0|1|2|3}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;5：如何编写高效的transaction&lt;br /&gt;For OLTP transaction&lt;br /&gt;a:使transaction尽可能的短&lt;br /&gt;b:使用index来随机访问数据&lt;br /&gt;c:只有在必要的时候才使用transaction&lt;br /&gt;d:选取合适的Lock type和隔离级别&lt;br /&gt;e:使用乐观锁&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;font size=&quot;4&quot;&gt;六：数据处理&lt;/font&gt;&lt;/strong&gt;&lt;br /&gt;1：除以0&lt;br /&gt;使用coalesce()和nullif()&lt;br /&gt;先使用nullif()把0转换成null,在用coalesce()处理null的情况&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;coalesce&lt;/span&gt;&lt;span&gt;(total_sales/&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;nullif&lt;/span&gt;&lt;span&gt;(sales,0),0)&amp;nbsp; &lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;--&lt;/span&gt;&lt;/span&gt; coalesce(ex1, ex2,ex3...)返回第一个不是Null的表达式&lt;br /&gt;-- nullif(expre, value)如果expre=value,则返回null &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2:找到重复的数据&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;type,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;count&lt;/span&gt;&lt;span&gt;(*)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;from&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;table&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;where&lt;/span&gt;&lt;span&gt;&amp;nbsp;..&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;group&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;by&lt;/span&gt;&lt;span&gt;&amp;nbsp;type&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;having&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;count&lt;/span&gt;&lt;span&gt;(*)&amp;nbsp;&amp;gt;&amp;nbsp;1&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;3:找出重复次数最多的数据&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;type,&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;count&lt;/span&gt;&lt;span&gt;(*)&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;from&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;table&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;where&lt;/span&gt;&lt;span&gt;&amp;nbsp;..&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;group&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;by&lt;/span&gt;&lt;span&gt;&amp;nbsp;type&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;having&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;count&lt;/span&gt;&lt;span&gt;(*)&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;max&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;count&lt;/span&gt;&lt;span&gt;(*))&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;4:数据累加&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;java 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;ol class=&quot;dp-j&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;select&amp;nbsp;t1.title_id,&amp;nbsp;t1.advice,&amp;nbsp;sum(t2.advice)&amp;nbsp;as&amp;nbsp;cumulative_total&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;from&amp;nbsp;title&amp;nbsp;t1,&amp;nbsp;title&amp;nbsp;t2&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;where&amp;nbsp;t1.title_id&amp;nbsp;&amp;gt;=&amp;nbsp;t2.title_id&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;group&amp;nbsp;by&amp;nbsp;t1.title_id,&amp;nbsp;t1.advice&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;5:ranking data&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;rank&amp;nbsp;=&amp;nbsp;identity(10),&amp;nbsp;title_id,&amp;nbsp;total_sales&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;into&lt;/span&gt;&lt;span&gt;&amp;nbsp;#&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;top&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;from&lt;/span&gt;&lt;span&gt;&amp;nbsp;titles&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;where&lt;/span&gt;&lt;span&gt;&amp;nbsp;..&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;order&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;by&lt;/span&gt;&lt;span&gt;&amp;nbsp;total_sales&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;desc&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;go&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;from&lt;/span&gt;&lt;span&gt;&amp;nbsp;#&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;top&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;go&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;drop&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;table&lt;/span&gt;&lt;span&gt;&amp;nbsp;#&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;top&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;go&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;6:conver between julian Date and gregorian date&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;datepart(yy,&amp;nbsp;@&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;date&lt;/span&gt;&lt;span&gt;)*1000+datepart(dy,&amp;nbsp;@&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;date&lt;/span&gt;&lt;span&gt;)&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;as&lt;/span&gt;&lt;span&gt;&amp;nbsp;julina_date&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;dateadd(dd,&amp;nbsp;juliandate%1000,&amp;nbsp;'12/31/'+&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;convert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt;&lt;span&gt;(4),juliandate/1000&amp;nbsp;-1))&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;as&lt;/span&gt;&lt;span&gt;&amp;nbsp;gregorian_date&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;7:计算本月有多少天&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span&gt;datepart(dd,&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;dateadd(dd,-1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;comment&quot;&gt;--last&amp;nbsp;day&amp;nbsp;of&amp;nbsp;this&amp;nbsp;month&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;datead(mm,1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;comment&quot;&gt;--add&amp;nbsp;a&amp;nbsp;month&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;dateadd(dd&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;comment&quot;&gt;--&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;,&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;1-datepart(dd,getdate()&amp;nbsp;&lt;span class=&quot;comment&quot;&gt;--1-today&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;getDate()))))&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=&quot;comment&quot;&gt;--get&amp;nbsp;today&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;8:是否是闰年&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;sql 代码&lt;/div&gt;&lt;div class=&quot;dp-highlighter&quot;&gt;&lt;div class=&quot;bar&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;ol class=&quot;dp-sql&quot;&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;keyword&quot;&gt;select&lt;/span&gt;&lt;span&gt;&amp;nbsp;datepart(dy,&amp;nbsp;'03/01/'||&lt;/span&gt;&lt;span class=&quot;func&quot;&gt;convert&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt;&lt;span&gt;(4),datepart(yy,getdate())))&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;&quot;&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;--=&amp;nbsp;61&amp;nbsp;是闰年&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;li class=&quot;alt&quot;&gt;&lt;span&gt;&lt;span class=&quot;comment&quot;&gt;--=&amp;nbsp;60&amp;nbsp;不是闰年&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;</description><category>数据库</category><pubDate>Thu, 28 Dec 2006 13:15:42 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14498004.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14498004.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235204/1237942</fs:itemid></item><item><title>Hibernate3 关系映射使用说明(二)</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235205/1237942/1/item.html</link><description>&lt;h2 style=&quot;MARGIN: 13pt 0cm&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;2.1&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 黑体; mso-ascii-font-family: Arial&quot;&gt;一对一&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 黑体; mso-ascii-font-family: Arial&quot;&gt;唯一外键关联&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;)&lt;/span&gt;&lt;/h2&gt;&lt;h2 style=&quot;MARGIN: 13pt 0cm&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.newbooks.com.cn/infos/pic/200609/60119/20069302124227715.GIF&quot; /&gt;&lt;/span&gt;&lt;/h2&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在对象方面，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的实例会参考至&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;实例，而&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;实例也参考至&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;实例&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;; &lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;使用外键来完成一对一，其实就是限制多对一关系中，「多」的一方只能有一个参考至「一」的一方，也&lt;span style=&quot;COLOR: red&quot;&gt;就是多对一关系的一个特例&lt;/span&gt;，这可以在映像文件中使用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;many-to-one&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;标签时，加上&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;quot;unique&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;属性来设定&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;shape id=&quot;_x0000_i1027&quot; style=&quot;WIDTH: 234pt; HEIGHT: 107.25pt&quot; type=&quot;#_x0000_t75&quot; alt=&quot;&quot;&gt;&lt;imagedata src=&quot;http://www.newbooks.com.cn/infos/pic/200609/60119/20069302124223581.jpg&quot; o:href=&quot;http://www.javaworld.com.tw/confluence/download/attachments/3481/OneToOneUniqueFK-1.jpg&quot;&gt;&lt;font face=&quot;Times New Roman&quot; size=&quot;3&quot;&gt;&lt;/font&gt;&lt;/imagedata&gt;&lt;/shape&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoCaption&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;strong&gt;&lt;font face=&quot;Times New Roman&quot; color=&quot;#ff0000&quot; size=&quot;3&quot;&gt;User.hbm.xml&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;many-to-one&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt; name=&amp;quot;room&amp;quot; &lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;column=&amp;quot;room_id&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;class=&amp;quot;com.fhway.Room&amp;quot;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;cascade=&amp;quot;all&amp;quot;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;outer-join=&amp;quot;true&amp;quot;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;unique=&amp;quot;true&amp;quot;/&amp;gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;到这边为止，单向一对一的映像已经完成，如果要再完成双向一对一的关系，则可以在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room.hbm.xml&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;中使用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;one-to-one&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;标签来定义：&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room.hbm.xml&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;em&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/em&gt;&lt;/span&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;one-to-one&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt; name=&amp;quot;user&amp;quot;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;class=&amp;quot;com.fhway.User&amp;quot;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;property-ref=&amp;quot;room&amp;quot;/&amp;gt;&lt;p /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;one-to-one&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;中，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;property-ref&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;告诉&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Hibernate&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，查询出&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;并将其参考至&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在这里没有用到&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Set&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;容器&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;h2 style=&quot;MARGIN: 13pt 0cm&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;2.2&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 黑体; mso-ascii-font-family: Arial&quot;&gt;一对一&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 黑体; mso-ascii-font-family: Arial&quot;&gt;主键关联&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;)&lt;/span&gt;&lt;/h2&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;图解&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;:&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.newbooks.com.cn/infos/pic/200609/60119/20069302124224119.GIF&quot; /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;shape id=&quot;_x0000_i1025&quot; style=&quot;WIDTH: 255.75pt; HEIGHT: 81pt&quot; type=&quot;#_x0000_t75&quot; alt=&quot;&quot;&gt;&lt;imagedata src=&quot;http://www.newbooks.com.cn/infos/pic/200609/60119/20069302124227475.jpg&quot; o:href=&quot;http://www.javaworld.com.tw/confluence/download/attachments/3524/OneToOnePK-1.jpg&quot;&gt;&lt;font face=&quot;Times New Roman&quot; size=&quot;3&quot;&gt;&lt;/font&gt;&lt;/imagedata&gt;&lt;/shape&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User.hbm.xml&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;one-to-one name=&amp;quot;room&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;class=&amp;quot;com.fhway.Room&amp;quot;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;cascade=&amp;quot;all&amp;quot;/&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room.hbm.xml&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;……&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;hibernate-mapping&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;class name=&amp;quot;com.fhway.Room&amp;quot; table=&amp;quot;room&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;id name=&amp;quot;id&amp;quot; column=&amp;quot;id&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;generator &lt;/strong&gt;&lt;/span&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;class=&amp;quot;foreign&amp;quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&amp;gt; &lt;p /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;param name=&amp;quot;property&amp;quot;&amp;gt;user&amp;lt;/param&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/generator&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/id&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;property name=&amp;quot;address&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;column=&amp;quot;address&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;type=&amp;quot;java.lang.String&amp;quot;/&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong&gt;&amp;lt;one-to-one name=&amp;quot;user&amp;quot;&lt;p /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;class=&amp;quot;com.fhway.User&amp;quot;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;constrained=&amp;quot;true&amp;quot;/&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&amp;gt;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/class&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;id&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;主键上，使用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;foreign&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;表示与外键共享主键，也就是与&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;实体共享主键，而&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;constrained&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;设定为&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;true&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，表示约束&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的主键必须与&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;中对应数据的主键相同。&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;&lt;font size=&quot;3&quot;&gt;一个储存的实例如下：&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User user1 = new User();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user1.setName(&amp;quot;bush&amp;quot;); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room room1 = new Room(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room1.setAddress(&amp;quot;NTU-M8-419&amp;quot;);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span&gt;&lt;font face=&quot;Times New Roman&quot;&gt;// &lt;/font&gt;互相设定关联&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user1.setRoom(room1);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room1.setUser(user1);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User user2 = new User(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span&gt;user2.setName(&amp;quot;caterpillar&amp;quot;); &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room room2 = new Room(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room2.setAddress(&amp;quot;NTU-M8-418&amp;quot;);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span&gt;&lt;font face=&quot;Times New Roman&quot;&gt;// &lt;/font&gt;互相设定关联&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user2.setRoom(room2);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;room2.setUser(user2);&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Session session = sessionFactory.openSession();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Transaction tx = session.beginTransaction();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;session.save(user1);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;session.save(user2);&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;tx.commit();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;session.close();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;MARGIN: 13pt 0cm&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;2.3&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 黑体; mso-ascii-font-family: Arial&quot;&gt;多对多&lt;/span&gt;&lt;/h2&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;图解&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;:&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.newbooks.com.cn/infos/pic/200609/60119/20069302124224365.GIF&quot; /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;shape id=&quot;_x0000_i1026&quot; style=&quot;WIDTH: 373.5pt; HEIGHT: 98.25pt&quot; type=&quot;#_x0000_t75&quot; alt=&quot;&quot;&gt;&lt;imagedata src=&quot;http://www.newbooks.com.cn/infos/pic/200609/60119/20069302124227198.jpg&quot; o:href=&quot;http://www.javaworld.com.tw/confluence/download/attachments/3526/ManyToMany-1.jpg&quot;&gt;&lt;font face=&quot;Times New Roman&quot; size=&quot;3&quot;&gt;&lt;/font&gt;&lt;/imagedata&gt;&lt;/shape&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;&lt;font size=&quot;3&quot;&gt;在数据库表格上要进行多对多对应，可以藉由一个中介表格来完成，也就是藉由多对一、一对多来完成多对多关联。&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;&lt;font size=&quot;3&quot;&gt;多对多由于使用了中介表格，在查询效率不彰，且在程序的对象模式上，多对多会使得对象与对象之间彼此依赖，并不是一个很好的设计方式，在设计上应避免使用多对多关系。&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;&lt;font size=&quot;3&quot;&gt;如果一定要使用多对多关系的话，在表格上先如下建立：&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;CREATE TABLE user (&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;id INT(11) NOT NULL auto_increment PRIMARY KEY,&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;name VARCHAR(100) NOT NULL default ''&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;CREATE TABLE user_server (&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;user_id INT(11),&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;server_id INT(11)&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;CREATE TABLE server (&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;id INT(11) NOT NULL auto_increment PRIMARY KEY,&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;address VARCHAR(100) NOT NULL default ''&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;先设计&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;类别如下：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User.java&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;package com.fhway;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;import java.util.Set;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;public class User {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;private Integer id;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;private String name;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;private Set servers;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public User() {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public Integer getId() {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return id;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;}&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public void setId(Integer id) {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this.id = id;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public String getName() {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return name;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public void setName(String name) {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this.name = name;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public Set getServers() {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return servers;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public void setServers(Set servers) {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this.servers = servers;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;再来设计&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Server&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;类别如下：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Server.java&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;package com.fhway;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;import java.util.Set;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;public class Server {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;private Integer id;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;private String address;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;private Set users;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public String getAddress() {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return address;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public void setAddress(String address) {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this.address = address;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public Integer getId() {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return id;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public void setId(Integer id) {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this.id = id;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public Set getUsers() {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return users;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public void setUsers(Set users) {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this.users = users;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在映像文件上，使用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;many-to-many&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;标签来完成映像关系：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User.hbm.xml&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;!DOCTYPE hibernate-mapping &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;PUBLIC &amp;quot;-//Hibernate/Hibernate Mapping DTD 3.0//EN&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;quot;http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;hibernate-mapping&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;class name=&amp;quot;com.fhway.User&amp;quot; table=&amp;quot;user&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;id name=&amp;quot;id&amp;quot; column=&amp;quot;id&amp;quot; type=&amp;quot;java.lang.Integer&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;generator class=&amp;quot;native&amp;quot;/&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/id&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;property name=&amp;quot;name&amp;quot; column=&amp;quot;name&amp;quot; type=&amp;quot;java.lang.String&amp;quot;/&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;set name=&amp;quot;servers&amp;quot; &lt;p /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;table=&amp;quot;user_server&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;cascade=&amp;quot;save-update&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;key column=&amp;quot;user_id&amp;quot;/&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;many-to-many class=&amp;quot;com.fhway.Server&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;column=&amp;quot;server_id&amp;quot;/&amp;gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/set&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;/class&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;注意到&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;cascade&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;是设定为&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;save-update&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，因为在多对多的关系中，很少因为删除其中之一，而所关联的实体都要一并删除的，所以设定&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;save-update&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，表示在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;save&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;或&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;update&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;时，一并对关联的对象进行对应的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;save&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;或&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;update&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Server.hbm.xml&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的定义如下：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Server.hbm.xml&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;!DOCTYPE hibernate-mapping &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;PUBLIC &amp;quot;-//Hibernate/Hibernate Mapping DTD 3.0//EN&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;quot;http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;hibernate-mapping&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;class name=&amp;quot;com.fhway.Server&amp;quot; table=&amp;quot;server&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;id name=&amp;quot;id&amp;quot; column=&amp;quot;id&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;generator class=&amp;quot;native&amp;quot;/&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/id&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;property name=&amp;quot;address&amp;quot; type=&amp;quot;java.lang.String&amp;quot;/&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;set name=&amp;quot;users&amp;quot;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;table=&amp;quot;user_server&amp;quot; &lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;inverse=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt; &lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;cascade=&amp;quot;save-update&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;key column=&amp;quot;server_id&amp;quot;/&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;many-to-many class=&amp;quot;com.fhway.User&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;column=&amp;quot;user_id&amp;quot;/&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/set&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/class&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;&lt;font size=&quot;3&quot;&gt;一个储存时的例子如下：&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Server server1 = new Server();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;server1.setAddress(&amp;quot;PC-219&amp;quot;); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;server1.setUsers(new HashSet());&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Server server2 = new Server(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;server2.setAddress(&amp;quot;PC-220&amp;quot;); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;server2.setUsers(new HashSet());&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;font face=&quot;Times New Roman&quot; size=&quot;3&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Server server3 = new Server(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;server3.setAddress(&amp;quot;PC-221&amp;quot;);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;server3.setUsers(new HashSet());&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User user1 = new User(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user1.setName(&amp;quot;caterpillar&amp;quot;);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user1.setServers(new HashSet());&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User user2 = new User(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user2.setName(&amp;quot;momor&amp;quot;);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user2.setServers(new HashSet());&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span&gt;&lt;font face=&quot;Times New Roman&quot;&gt;// &lt;/font&gt;多对多，互相参考&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user1.getServers().add(server1); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user1.getServers().add(server2); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user1.getServers().add(server3); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;server1.getUsers().add(user1); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;server2.getUsers().add(user1); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;server3.getUsers().add(user1); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user2.getServers().add(server1); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user2.getServers().add(server3); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;server1.getUsers().add(user2); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;server3.getUsers().add(user2); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Session session = sessionFactory.openSession(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Transaction tx= session.beginTransaction(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;session.save(user1); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;session.save(user2); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;tx.commit();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;session.close();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;</description><category>Java</category><pubDate>Thu, 28 Dec 2006 13:09:49 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14498003.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14498003.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235205/1237942</fs:itemid></item><item><title>Hibernate3 关系映射使用说明(一)</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235206/1237942/1/item.html</link><description>&lt;h1 style=&quot;MARGIN: 17pt 0cm 16.5pt 27.75pt; TEXT-INDENT: -27.75pt; mso-list: l11 level1 lfo27; tab-stops: list 27.75pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;一.&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;单向关系&lt;/span&gt;&lt;/h1&gt;&lt;h1 style=&quot;MARGIN: 17pt 0cm 16.5pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;shapetype id=&quot;_x0000_t75&quot; coordsize=&quot;21600,21600&quot; o:spt=&quot;75&quot; o:preferrelative=&quot;t&quot; path=&quot;m@4@5l@4@11@9@11@9@5xe&quot; filled=&quot;f&quot; stroked=&quot;f&quot;&gt;&lt;stroke joinstyle=&quot;miter&quot; /&gt;&lt;formulas&gt;&lt;f eqn=&quot;if lineDrawn pixelLineWidth 0&quot; /&gt;&lt;f eqn=&quot;sum @0 1 0&quot; /&gt;&lt;f eqn=&quot;sum 0 0 @1&quot; /&gt;&lt;f eqn=&quot;prod @2 1 2&quot; /&gt;&lt;f eqn=&quot;prod @3 21600 pixelWidth&quot; /&gt;&lt;f eqn=&quot;prod @3 21600 pixelHeight&quot; /&gt;&lt;f eqn=&quot;sum @0 0 1&quot; /&gt;&lt;f eqn=&quot;prod @6 1 2&quot; /&gt;&lt;f eqn=&quot;prod @7 21600 pixelWidth&quot; /&gt;&lt;f eqn=&quot;sum @8 21600 0&quot; /&gt;&lt;f eqn=&quot;prod @7 21600 pixelHeight&quot; /&gt;&lt;f eqn=&quot;sum @10 21600 0&quot; /&gt;&lt;/formulas&gt;&lt;path o:extrusionok=&quot;f&quot; gradientshapeok=&quot;t&quot; o:connecttype=&quot;rect&quot; /&gt;&lt;lock v:ext=&quot;edit&quot; aspectratio=&quot;t&quot; /&gt;&lt;/shapetype&gt;&lt;shape id=&quot;_x0000_i1028&quot; style=&quot;WIDTH: 233.25pt; HEIGHT: 100.5pt&quot; type=&quot;#_x0000_t75&quot;&gt;&lt;imagedata src=&quot;http://www.newbooks.com.cn/infos/pic/200609/60119/20069302124218994.gif&quot; o:title=&quot;11&quot; /&gt;&lt;/shape&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.newbooks.com.cn/infos/pic/200609/60119/20069302124213403.GIF&quot; /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;建表脚本&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;:&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;CREATE TABLE user (&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;id INT(11) NOT NULL auto_increment PRIMARY KEY,&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;name VARCHAR(100) NOT NULL default '',&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;room_id INT(11)&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;CREATE TABLE room (&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;id INT(11) NOT NULL auto_increment PRIMARY KEY,&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;address VARCHAR(100) NOT NULL default ''&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;MARGIN: 13pt 0cm&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;1.1&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 黑体; mso-ascii-font-family: Arial&quot;&gt;多对一&lt;/span&gt;&lt;/h2&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User.java&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;public class User {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;private Integer id;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;private String name;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;private Room room;&lt;p /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot; size=&quot;3&quot;&gt;…….&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot; size=&quot;3&quot;&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;配置文件&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;:&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User.hbm.xml&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;!DOCTYPE hibernate-mapping &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;PUBLIC &amp;quot;-//Hibernate/Hibernate Mapping DTD 3.0//EN&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;quot;http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;hibernate-mapping&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;class name=&amp;quot;com.fhway.User&amp;quot; table=&amp;quot;user&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;id name=&amp;quot;id&amp;quot; column=&amp;quot;id&amp;quot; type=&amp;quot;java.lang.Integer&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;generator class=&amp;quot;native&amp;quot;/&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/id&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;property name=&amp;quot;name&amp;quot; column=&amp;quot;name&amp;quot; type=&amp;quot;java.lang.String&amp;quot;/&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&amp;lt;many-to-one name=&amp;quot;room&amp;quot; &lt;p /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;column=&amp;quot;room_id&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;class=&amp;quot;com.fhway.Room&amp;quot;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;cascade=&amp;quot;all&amp;quot;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;outer-join=&amp;quot;true&amp;quot;/&amp;gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/class&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;说明&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;: &lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;关于&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的两个文件没有什么特殊说明&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font color=&quot;#000091&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;many-to-one&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的设定中，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;cascade&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;表示主控方（&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;）进行&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;save-update&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;、&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;delete&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;等相关操作时，被控方（&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;）是否也一并进行相关操作，简单的说，也就是您储存或更新&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;实例时，当中的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;实例是否一并对数据库发生储存或操作，设定为&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt; all&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，表示主控方任何操作，被控方也进行对应操作。&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;如果不设定&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;cascade&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;为&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;true&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，则您必须分别对&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;实例与&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;实例进行储存&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;. &lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;使用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;cascade&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;自动持久化时，会先检查被关联对象的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;id&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;属性，未被持久化的对象是否储存是藉由&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;id&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;属性的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;unsaved-value&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;决定，预设是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt; null&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，也就是没有参考至任何值时储存对象，如果您使用&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;int&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;、&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;long&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;这样的原生型态（&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Primitive type&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;）时，由于数据成员的初始会被设定为&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;0&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，所以您必须自行指定默认值，例如（如果&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;id&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的数据型态是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;long&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的话）&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;.&lt;span class=&quot;code-keyword2&quot;&gt;&lt;em style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span style=&quot;COLOR: blue&quot;&gt; &lt;p /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;h5 style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;FONT-WEIGHT: normal; COLOR: red; mso-bidi-font-style: normal&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room.hbm.xml&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h5&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;…….&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;id name=&amp;quot;id&amp;quot; column=&amp;quot;id&amp;quot; unsaved-value=&amp;quot;0&amp;quot;&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;generator class=&amp;quot;native&amp;quot;/&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot; size=&quot;3&quot;&gt;&amp;lt;/id&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font color=&quot;#000091&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;…..&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font color=&quot;#000091&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;注意到&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room_id &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;与&lt;/span&gt;&lt;font face=&quot;Times New Roman&quot;&gt; &lt;span lang=&quot;EN-US&quot;&gt;com.fhway.Room &lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;对应&lt;/span&gt;&lt;font face=&quot;Times New Roman&quot;&gt; &lt;/font&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;那么&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room_id&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的值为&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt; Room&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;id&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;；&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font color=&quot;#000091&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 style=&quot;MARGIN: 13pt 0cm&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;1.2&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 黑体; mso-ascii-font-family: Arial&quot;&gt;一对多&lt;/span&gt;&lt;/h2&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;多对一的反向&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;配置文件&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;:&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room.hbm.xml&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;…….&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;set name=&amp;quot;users&amp;quot; table=&amp;quot;user&amp;quot; cascade=&amp;quot;all&amp;quot;&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;key column=&amp;quot;room_id&amp;quot;/&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;one-to-many class=&amp;quot;com.fhway.User&amp;quot;/&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;/set&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;…….&lt;span class=&quot;code-keyword2&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font color=&quot;#000091&quot;&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;注意到&lt;/span&gt;&lt;font face=&quot;Times New Roman&quot;&gt; &lt;/font&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在一对多的关系中&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;为一&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;,User&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;为多&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;code-keyword2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在&lt;/span&gt;&lt;/span&gt;&lt;/font&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room.hbm.xml&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;中采用一个&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Set&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;来存放&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User; &lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;使&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;其&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;id&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;与&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room_id&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;关联&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;并在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room.java&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;中加入关联的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Set,&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;代码如下&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;:&lt;p /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;…….&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;private Set users;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;public Set getUsers() {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return users;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public void setUsers(Set users) {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;this.users = users;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;} &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public void addUser(User user) {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;users.add(user);&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;public void removeUser(User user) {&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;users.remove(user);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;}&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;……&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.75pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;于是在&lt;/span&gt;&lt;span&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;中达到操作&lt;/span&gt;&lt;span&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User&lt;/font&gt;表的目的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;.&lt;p /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;h1 style=&quot;MARGIN: 17pt 0cm 16.5pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;二&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;.&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;双向关系&lt;/span&gt;&lt;/h1&gt;&lt;h1 style=&quot;MARGIN: 17pt 0cm 16.5pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;&lt;/span&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;图解&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;:&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;shape id=&quot;_x0000_i1029&quot; style=&quot;WIDTH: 300.75pt; HEIGHT: 129pt&quot; type=&quot;#_x0000_t75&quot;&gt; &lt;imagedata src=&quot;http://www.newbooks.com.cn/infos/pic/200609/60119/20069302124218994.gif&quot; o:title=&quot;11&quot; /&gt;&lt;/shape&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;img alt=&quot;&quot; src=&quot;http://www.newbooks.com.cn/infos/pic/200609/60119/20069302124213403.GIF&quot; /&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;配置文件&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;:&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt 21pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User.hbm.xml&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;……&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;many-to-one name&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;=&amp;quot;room&amp;quot; &lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;column=&amp;quot;room_id&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;class=&amp;quot;com.fhway.Room&amp;quot;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;cascade=&amp;quot;save-update&amp;quot;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 52.5pt; mso-char-indent-count: 4.98; mso-char-indent-size: 10.5pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;outer-join=&amp;quot;true&amp;quot;/&amp;gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;……&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21.1pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.55pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room.hbm.xml&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;……&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;set name=&amp;quot;users&amp;quot; table=&amp;quot;user&amp;quot; cascade=&amp;quot;save-update&amp;quot;&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;key column=&amp;quot;room_id&amp;quot;/&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&amp;lt;one-to-many&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt; class=&amp;quot;com.fhway.User&amp;quot;/&amp;gt;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;/set&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;……&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;配置文件也体现了单向的双方组合&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;many-to-one &lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;与&lt;/span&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;one-to-many&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;,&lt;/span&gt;&lt;/font&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;由表的关系确定了&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Set&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;集合的一方&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;( [&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;一&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;] &lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的一方&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;);&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;映像文件双方都设定了&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;cascade&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;为&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;save-update&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，所以您可以用多对一的方式来维持关联&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User.java&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;中声明一个&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的类及其操作方法&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;中同样声明一个放&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Set&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;容器及其操作方法&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: red; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;于是在操作的时候可以使用任何一方操作另一方&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;;&lt;p /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User user1 = new User();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user1.setName(&amp;quot;bush&amp;quot;); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&lt;font face=&quot;Times New Roman&quot; size=&quot;3&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User user2 = new User(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user2.setName(&amp;quot;caterpillar&amp;quot;); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room room1 = new Room(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room1.setAddress(&amp;quot;NTU-M8-419&amp;quot;);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user1.setRoom(room1);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user2.setRoom(room1);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Session session = sessionFactory.openSession();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Transaction tx = session.beginTransaction();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;session.save(user1);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;session.save(user2);&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;tx.commit();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;session.close();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;&lt;font size=&quot;3&quot;&gt;或是反过来由一对多的方式来维持关联：&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User user1 = new User();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user1.setName(&amp;quot;bush&amp;quot;); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User user2 = new User(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user2.setName(&amp;quot;caterpillar&amp;quot;); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room room1 = new Room(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room1.setUsers(new HashSet());&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room1.setAddress(&amp;quot;NTU-M8-419&amp;quot;);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room1.addUser(user1);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room1.addUser(user2);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Session session = sessionFactory.openSession();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Transaction tx = session.beginTransaction();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;session.save(room1); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;tx.commit();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;session.close();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;em style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;上面的程序写法表示关联由&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;单方面维持，而主控方也是&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;不知道&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room_id&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;是多少，所以必须分别储存&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;与&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;之后，再更新&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room_id&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;在一对多、多对一形成双向关联的情况下，可以将关联维持的控制权交给多的一方，这样会比较有效率，理由不难理解，就像是在公司中，老板要记住多个员工的姓名快，还是每一个员工都记得老板的姓名快。&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;所以在一对多、多对一形成双向关联的情况下，可以在「一」的一方设定控制权反转，也就是当储存「一」的一方时，将关联维持的控制权交给「多」的一方，以上面的例子来说，可以设定&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room.hbm.xml&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;如下：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room.hbm.xml&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;!DOCTYPE hibernate-mapping &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;PUBLIC &amp;quot;-//Hibernate/Hibernate Mapping DTD 3.0//EN&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;quot;http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;hibernate-mapping&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;class name=&amp;quot;com.fhway.Room&amp;quot; table=&amp;quot;room&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;id name=&amp;quot;id&amp;quot; column=&amp;quot;id&amp;quot;&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;generator class=&amp;quot;native&amp;quot;/&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/id&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;property name=&amp;quot;address&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;column=&amp;quot;address&amp;quot; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;type=&amp;quot;java.lang.String&amp;quot;/&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;set name=&amp;quot;users&amp;quot; table=&amp;quot;user&amp;quot; cascade=&amp;quot;save-update&amp;quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: red&quot;&gt; inverse=&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&amp;gt;&lt;p /&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;key column=&amp;quot;room_id&amp;quot;/&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;one-to-many class=&amp;quot;com.fhway.User&amp;quot;/&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/set&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;lt;/class&amp;gt; &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;&lt;font size=&quot;3&quot;&gt;由于关联的控制权交给「多」的一方了，所以直接储存「一」方前，「多」的一方必须意识到「一」的存在，所以程序片段必须改为如下：&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User user1 = new User();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user1.setName(&amp;quot;bush&amp;quot;); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User user2 = new User(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user2.setName(&amp;quot;caterpillar&amp;quot;); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room room1 = new Room(); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room1.setUsers(new HashSet());&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room1.setAddress(&amp;quot;NTU-M8-419&amp;quot;);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room1.addUser(user1);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room1.addUser(user2);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;// &lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span style=&quot;COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;多方必须意识到单方的存在&lt;/span&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user1.setRoom(room1);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user2.setRoom(room1);&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Session session = sessionFactory.openSession();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Transaction tx = session.beginTransaction();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;span style=&quot;mso-spacerun: yes&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;session.save(room1); &lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;tx.commit();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;session.close();&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;上面的程序片段&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Hibernate&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;将使用以下的&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;SQL&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;：&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: #333399&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Hibernate: insert into room (address) values (?)&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: #333399&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Hibernate: insert into user (name, room_id) values (?, ?)&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: #333399&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Hibernate: insert into user (name, room_id) values (?, ?)&lt;p /&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;如果控制权交给另一方了，而另一方没有意识到对方的存在的话会如何？试着将上面的程序片段中&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user1.setRoom(room1);&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;与&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;user2.setRoom(room1);&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;移去，执行之后，您会发现数据库中&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room_id&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;会出现&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;null&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;值，这种结果就好比在多对一中，您没有分配给&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;User&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;一个&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;Room&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;，理所当然的，&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;room_id&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;会出现&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;null&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'&quot;&gt;。&lt;/span&gt;&lt;strong style=&quot;mso-bidi-font-weight: normal&quot;&gt;&lt;em style=&quot;mso-bidi-font-style: normal&quot;&gt;&lt;span lang=&quot;EN-US&quot; style=&quot;COLOR: blue&quot;&gt;&lt;p /&gt;&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p class=&quot;MsoNormal&quot; style=&quot;MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; mso-char-indent-count: 2.0; mso-char-indent-size: 10.5pt&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;/h1&gt;</description><category>Java</category><pubDate>Thu, 28 Dec 2006 13:06:10 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14498002.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14498002.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235206/1237942</fs:itemid></item><item><title>hibernate几个错误的解决关键</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235207/1237942/1/item.html</link><description>&lt;p&gt;1、&lt;br /&gt;org.springframework.orm.ObjectRetrievalFailureException: Object of class [com.xindeco.myregister.pojo.MyRegisterInfo] with identifier [14]: not found&lt;br /&gt;MyRegisterInfo在数据库没有identifier [14]对象。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2、&lt;br /&gt;org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.xindeco.myregister.pojo.MyRegisterInfo column: password (should be mapped with insert=&amp;quot;false&amp;quot; update=&amp;quot;false&amp;quot;)&lt;/p&gt;&lt;p&gt;出错原因：password 和repassword同时对应数据库表中的password一列，同时update和insert都设为true。&lt;br /&gt;xml文件如下：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;password&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type=&amp;quot;java.lang.String&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;property&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;password&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; length = &amp;quot;32&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;repassword&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type=&amp;quot;java.lang.String&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update=&amp;quot;false&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;false&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;property&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;password&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; length = &amp;quot;32&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;解决的方法：&lt;br /&gt;将repassword的insert和update设为false。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3、&lt;br /&gt;org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Initialization of bean failed; &lt;br /&gt;nested exception is org.hibernate.PropertyNotFoundException: Could not find a getter for ID in class &lt;br /&gt;&lt;br /&gt;错误原因：hibernate的映射文件中ID是大写的，而pojo的类中id是小写的&lt;br /&gt;&lt;br /&gt;注意事项：每个pojo的类都要继承abstractEntity，其中abstractEntity类有个ID的属性要重写&lt;br /&gt;&amp;nbsp;public abstract class AbstractEntity&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; implements Entity, BaseDTO {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; abstract public long getID();&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; abstract public void setID(long id);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public int hashCode() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return (int)this.getID();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public boolean equals(Object obj) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (obj == this) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (obj instanceof Entity) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return this.getID() == ( (Entity) obj).getID();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;4、&lt;br /&gt;org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition&lt;br /&gt;&lt;br /&gt;错误原因：&lt;br /&gt;在application.xml文件中deleteRegister方法以delete开头，并没有被设定为可更改的，应如下设置：&lt;br /&gt;&amp;nbsp;&amp;lt;!--为事物创建代理类，并指定方法的事物类型--&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;bean id=&amp;quot;baseTxProxy&amp;quot; lazy-init=&amp;quot;true&amp;quot; abstract=&amp;quot;true&amp;quot; class=&amp;quot;org.springframework.transaction.interceptor.TransactionProxyFactoryBean&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;transactionManager&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref bean=&amp;quot;transactionManager&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;transactionAttributes&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;props&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;prop key=&amp;quot;add*&amp;quot;&amp;gt;PROPAGATION_REQUIRED&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;prop key=&amp;quot;cancel*&amp;quot;&amp;gt;PROPAGATION_REQUIRED&amp;lt;/prop&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/props&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;加上一行&lt;br /&gt;&amp;nbsp; &amp;lt;prop key=&amp;quot;delete*&amp;quot;&amp;gt;PROPAGATION_REQUIRED&amp;lt;/prop&amp;gt;&lt;br /&gt;&lt;br /&gt;5、&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ERROR org.apache.struts.util.RequestUtils - Error creating form bean of class com.xindeco.business.web.form.GraAppInfoForm&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#ff3366&quot;&gt;public class&amp;nbsp; GraAppInfoForm&lt;/font&gt;&lt;br /&gt;extends ActionForm 错误写成&lt;br /&gt;public abstratic&amp;nbsp;class&amp;nbsp; GraAppInfoForm&lt;br /&gt;extends ActionForm &lt;br /&gt;&lt;br /&gt;6、&lt;br /&gt;2006-04-25 08:56:38,495 ERROR com.xindeco.business.web.action.GraAppAction - &lt;a href=&quot;mailto:com.xindeco.business.web.action.GraAppAction@8e2fb5&quot;&gt;com.xindeco.business.web.action.GraAppAction@8e2fb5&lt;/a&gt;&lt;br /&gt;java.lang.ClassCastException: $Proxy0&lt;br /&gt;&amp;nbsp;at com.xindeco.business.web.action.GraAppAction.newone(GraAppAction.java:30)&lt;br /&gt;&amp;nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;&amp;nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;&amp;nbsp;at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)&lt;br /&gt;&amp;nbsp;at java.lang.reflect.Method.invoke(Method.java:585)&lt;br /&gt;&amp;nbsp;at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:274)&lt;br /&gt;&amp;nbsp;at com.xindeco.core.web.action.BaseAction.dispatchMethod(BaseAction.java:153)&lt;br /&gt;&amp;nbsp;at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:194)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;actioin类中的newone方法如下：&lt;br /&gt;public&amp;nbsp; class GraAppAction&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; extends BaseAction {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ActionForward newone(ActionMapping mapping, ActionForm form,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpServletRequest request,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpServletResponse response) throws Exception {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GraAppService &amp;nbsp;graservice = (GraAppService) this.getBean(&amp;quot;GraAppService&amp;quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;applicationcontext中的GraAppService的配置如下：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean id=&amp;quot;GraAppDAO&amp;quot; class=&amp;quot;com.xindeco.business.dao.impl.GraAppDAOImpl&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;support&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref local=&amp;quot;support&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;sessionFactory&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref local=&amp;quot;sessionFactory&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;bean id=&amp;quot;GraAppService&amp;quot; parent=&amp;quot;baseTxProxy&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;target&amp;quot;&amp;gt;&lt;br /&gt;&lt;font color=&quot;#0099ff&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bean class=&amp;quot;com.xindeco.business.service.impl.GraAppServiceImpl&amp;quot; autowire=&amp;quot;byName&amp;quot;&amp;gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;baseDAO&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ref bean=&amp;quot;GraAppDAO&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/bean&amp;gt;&lt;br /&gt;&lt;br /&gt;因此this.getBean(&amp;quot;GraAppService&amp;quot;);是为了得到GraAppServicImpl类的实现。GraAppService是interface&lt;br /&gt;public class GraAppServiceImpl extends BaseServiceImpl &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color=&quot;#ff0033&quot;&gt; implements GraAppService&lt;/font&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;7、org.hibernate.hql.ast.QuerySyntaxException: Demand is not mapped. [from Demand where unitid = ? and needNum &amp;gt; usedNeedNum]&lt;br /&gt;&lt;br /&gt;hibernate.cfg.xml没有配置Demand.hbm.xml文件的目录&lt;br /&gt;&lt;br /&gt;8、org.springframework.jdbc.BadSqlGrammarException: Bad SQL grammar [] in task 'Hibernate operation'; nested exception is java.sql.SQLException: 列名 'id' 无效。&lt;br /&gt;java.sql.SQLException: 列名 'name' 无效。&lt;br /&gt;&lt;br /&gt;因为hibernate声明的id，name的columnid属性没有与数据库的字段对应，所以id，name无效。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;9、java.lang.NumberFormatException: null&lt;br /&gt;&amp;nbsp;at java.lang.Integer.parseInt(Integer.java:415)&lt;br /&gt;&amp;nbsp;at java.lang.Integer.parseInt(Integer.java:497)&lt;br /&gt;&amp;nbsp;at com.xindeco.business.service.impl.DemandServiceImpl.findDemandListByUnitId(DemandServiceImpl.java:33)&lt;br /&gt;&lt;br /&gt;错误语句为 &lt;br /&gt;&amp;nbsp;needNum = Integer.parseInt(demand.getNeedNum());&lt;br /&gt;&amp;nbsp;usedNeedNum = Integer.parseInt(demand.getUsedNeedNum());&lt;br /&gt;因为demand.getUsedNeedNum()==null,无法转化为string 类型，&lt;br /&gt;&lt;br /&gt;10、rg.apache.jasper.JasperException: /GraAppInfo/GraAppInfoNew.jsp(343,29) According to TLD, tag bean:write must be empty, but is not&lt;br /&gt;&lt;br /&gt;错误的原因：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;select name=&amp;quot;politicsID&amp;quot; &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;option value=&amp;quot;&amp;quot;&amp;gt;请选择&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;logic:notEmpty name=&amp;quot;politicsList&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;logic:iterate id=&amp;quot;politics&amp;quot; name=&amp;quot;politicsList&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/logic:notEmpty&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;option value=&amp;quot;&amp;lt;bean:write name=&amp;quot;politics&amp;quot; property=&amp;quot;codeID&amp;quot;&lt;font color=&quot;#ff3366&quot;&gt;/&lt;/font&gt;&amp;gt;&amp;quot;&amp;gt;&amp;lt;bean:write name=&amp;quot;politics&amp;quot; property=&amp;quot;codeName&lt;font color=&quot;#ff3333&quot;&gt;&amp;quot;/&lt;/font&gt;&amp;gt;&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color=&quot;#ff3333&quot;&gt;&amp;lt;/&lt;/font&gt;logic:iterate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/select&amp;gt;&lt;br /&gt;就因为少了/&amp;gt;&lt;br /&gt;以后懂得通过查找字数，来检查错误&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;11、2006-04-26 13:27:54,812 ERROR com.xindeco.core.util.BeanUtils - bean property [Nation] copy failed&lt;br /&gt;com.xindeco.core.exception.ConvertException: org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity: java.lang.String; nested exception is org.hibernate.MappingException: Unknown entity: java.lang.String&lt;br /&gt;&lt;br /&gt;beanUtil.beanCopy(grapojo,form,BizConstants.CONVERTER);&lt;br /&gt;要求：&lt;br /&gt;1、pojo类的属性只有与form属性名字相同，才能beancopy成功&lt;br /&gt;2、pojo中属性是实体，在form中一定要用int，long表示&lt;br /&gt;出现这错误的原因是pojo中的属性不是实体，而错误写成：&lt;br /&gt;string &lt;br /&gt;&amp;nbsp;private String nation;应改成 private&amp;nbsp;Syscode nation;&lt;br /&gt;&lt;br /&gt;12、&lt;br /&gt;2006-04-26 14:38:37,843 ERROR com.xindeco.business.web.action.GraAppAction - &lt;a href=&quot;mailto:com.xindeco.business.web.action.GraAppAction@fa1b2d&quot;&gt;com.xindeco.business.web.action.GraAppAction@fa1b2d&lt;/a&gt;&lt;br /&gt;java.lang.NullPointerException&lt;br /&gt;&amp;nbsp;at com.xindeco.business.web.action.GraAppAction.newone(GraAppAction.java:43)&lt;br /&gt;&amp;nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;&amp;nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)&lt;br /&gt;&lt;br /&gt;hibernate配置文件没改，程序找不到相应的类&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;many-to-one&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;FSUnit&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&amp;quot;com.xindeco.business.pojo.EmployUnitBaseInfo&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cascade=&amp;quot;none&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outer-join=&amp;quot;auto&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;property&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;fSUnit&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;&lt;br /&gt;其实FSUnit对应的类应该是FSUnit&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;many-to-one&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;FSUnit&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&amp;quot;com.xindeco.business.pojo.FSUnit&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cascade=&amp;quot;none&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outer-join=&amp;quot;auto&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;property&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;fSUnit&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;&lt;br /&gt;13、&lt;br /&gt;org.hibernate.MappingException: An association from the table GraAppInfo refers to an unmapped class: com.xindeco.business.pojo.FSUnit&lt;br /&gt;&lt;br /&gt;错误原因：hibernate.cfg.xml没有配置fsunit.hbm.xml文件的位置&lt;br /&gt;&lt;br /&gt;14、&lt;br /&gt;java.lang.ClassCastException: com.xindeco.business.dao.impl.GraAppDAOImpl&lt;br /&gt;at com.xindeco.business.service.impl.GraAppServiceImpl.addGraduateApp(GraAppServiceImpl.java:16)&lt;br /&gt;GraAppServiceImpl.java:16&lt;br /&gt;第16行： GraAppDAO dao = (GraAppDAO) this.getBaseDAO();//其实得到的是GraAppDAOImpl&lt;br /&gt;&lt;br /&gt;错误的原因是&lt;br /&gt;public class GraAppDAOImpl&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; extends BaseDAOImpl {&lt;/p&gt;&lt;p&gt;}&lt;br /&gt;没有实现GraAppDAO接口，正确的做法是&lt;br /&gt;public class GraAppDAOImpl &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; extends BaseDAOImpl implements GraAppDAO {&lt;br /&gt;}&lt;br /&gt;先继承后实现&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;15、2006-04-27 08:38:54,078 ERROR com.xindeco.business.web.action.GraAppAction - &lt;a href=&quot;mailto:com.xindeco.business.web.action.GraAppAction@1d6399b&quot;&gt;com.xindeco.business.web.action.GraAppAction@1d6399b&lt;/a&gt;&lt;br /&gt;&lt;font color=&quot;#ff3333&quot;&gt;java.lang.ClassCastException: com.xindeco.business.pojo.SysCode&lt;/font&gt;&lt;br /&gt;&amp;nbsp;at org.hibernate.type.StringType.set(StringType.java:26)&lt;br /&gt;&amp;nbsp;at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:63)&lt;br /&gt;&amp;nbsp;at org.hibernate.type.NullableType.nullSafeSet(NullableType.java:40)&lt;br /&gt;&lt;br /&gt;一般是因为hibernate声明类型和pojo类声明的类型不一样，并且前面已经出现了Hibernate: insert into TGraAppInfo (name, whereFrom, degree, college, speciality, studentRelTel, remark, higherEduLength, highSchool, studyResume, normalOrNot, proxyUnit, workPost, workPlace, studentAddress, studentPostNumber, nation, appStatus) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)&lt;br /&gt;的操作提示，查出错误的原因有：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;many-to-one&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;demand&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&amp;quot;com.xindeco.business.pojo.Syscode&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cascade=&amp;quot;none&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outer-join=&amp;quot;auto&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;property&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;demandID&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;appStatus&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type=&amp;quot;int&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;property&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;appStatus&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; length=&amp;quot;10&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;应改为&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;many-to-one&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;demand&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&amp;quot;com.xindeco.business.pojo.Demand&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cascade=&amp;quot;none&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outer-join=&amp;quot;auto&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;property&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;demandID&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;lt;many-to-one&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;nation&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&amp;quot;com.xindeco.business.pojo.SysCode&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cascade=&amp;quot;none&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outer-join=&amp;quot;auto&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;property&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;nation&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;&lt;br /&gt;16、&lt;br /&gt;org.springframework.dao.InvalidDataAccessApiUsageException: object references an unsaved transient instance - save the transient instance before flushing: com.xindeco.business.pojo.SysCode&lt;br /&gt;&amp;nbsp;at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:626)&lt;br /&gt;&amp;nbsp;at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:570)&lt;br /&gt;&amp;nbsp;at &lt;br /&gt;org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:482)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;pojo类为：&lt;br /&gt;public class GraAppInfo{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private College college;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;action 类为&lt;br /&gt;public class GraAppAction&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; extends BaseAction {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public ActionForward add(ActionMapping mapping, ActionForm form,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpServletRequest request,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpServletResponse response) throws Exception {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font style=&quot;BACKGROUND-COLOR: #ff3333&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;font color=&quot;#ff3366&quot;&gt;graInfo.setCollege(new College());\\必须从数据库找到college这个对象，而不能新生成&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color=&quot;#ff3333&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; graInfo.getCollege().setID(graForm.getCollegeID());&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; graInfo.setAppStatus(Integer.parseInt(&amp;quot;0&amp;quot;));&lt;br /&gt;&lt;font color=&quot;#ff3333&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;service.addGraduateApp(graInfo)；&lt;/font&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class GraAppServiceImpl extends BaseServiceImpl&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; implements GraAppService{&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public boolean addGraduateApp(GraAppInfo info)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&lt;font color=&quot;#ff3300&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.getBaseDAO().save(info);&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;dao类save方法为&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; getHibernateTemplate().save(obj);&lt;br /&gt;&lt;br /&gt;当cascade=&amp;quot;all&amp;quot;，插入new college 除了id和原来的记录一样，其他的字段全部都被更新，为null&lt;br /&gt;当cascase=“insert”，插入new college 只会把它的id插入grainfo表中，其他字段不变。&lt;br /&gt;&lt;br /&gt;17、java.sql.SQLException: Unable to convert between java.lang.Integer and BLOB.&lt;br /&gt;因为&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;province&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type=&amp;quot;com.xindeco.business.pojo.SysCode&amp;quot;//不能用复杂类，&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;property&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;provinceId&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;应该改为&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;many-to-one&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;province&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&amp;quot;com.xindeco.business.pojo.SysCode&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cascade=&amp;quot;none&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outer-join=&amp;quot;auto&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;property&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;provinceId&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;&lt;br /&gt;18、javax.servlet.jsp.JspException: Cannot create iterator for this collection&lt;br /&gt;&amp;nbsp;at org.apache.struts.taglib.logic.IterateTag.doStartTag(IterateTag.java:265)&lt;br /&gt;jsp文件如下：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;lt;logic:notEmpty name=&amp;quot;graduateList&amp;quot; &amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;lt;logic:iterate id=&amp;quot;graduate&amp;quot;&amp;nbsp; name=&amp;quot;graduateList&amp;quot; &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/ogic:notEmpty &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/ogic:iterat&amp;gt;&lt;br /&gt;graduateList是一个类，而logic:&lt;b style=&quot;COLOR: black; BACKGROUND-COLOR: #99ff99&quot;&gt;iterator&lt;/b&gt;要求必须是ArrayList,HashSet....这样的集合类,而graduateList中一个属性是ArrayList或HashSet的&lt;br /&gt;应改为:&lt;br /&gt;&amp;lt;logic:notEmpty name=&amp;quot;graduateList&amp;quot; property=&amp;quot;items&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;logic:iterate id=&amp;quot;graduate&amp;quot;&amp;nbsp; name=&amp;quot;graduateList&amp;quot; property=&amp;quot;items&amp;quot; &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;/ogic:notEmpty &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/ogic:iterat&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;19、2006-05-11 17:13:37,468 ERROR com.xindeco.business.web.action.GraAppAction - &lt;a href=&quot;mailto:com.xindeco.business.web.action.GraAppAction@bc22eb&quot;&gt;com.xindeco.business.web.action.GraAppAction@bc22eb&lt;/a&gt;&lt;br /&gt;org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed&lt;br /&gt;&lt;br /&gt;SysUser user= (SysUser) request.getSession().getAttribute(WebConstants.SESSION_USER);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(user.getRole().getRoleName());&lt;br /&gt;当hibernate session取出数据放到http session时，&lt;br /&gt;由于sysuser中role的lazy=“true”，所以没有将RoleName放到http session中，当System.out.println(user.getRole().getRoleName());&lt;br /&gt;时，虽然http session还开着， hibernat seesion已经关闭&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;many-to-one&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;role&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&amp;quot;com.xindeco.business.pojo.SysRole&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lazy=&amp;quot;false&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cascade=&amp;quot;none&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outer-join=&amp;quot;auto&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;true&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;property&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;roleID&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;br /&gt;20、Association references unmapped class: com.xindeco.workflow.WFNode&lt;br /&gt;因为application.xml文件中没有配置&amp;lt;mapping resource=&amp;quot;com/xindeco/workflow/WFNode.hbm.xml&amp;quot;/&amp;gt;&lt;br /&gt;系统找不到WFNode&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;set&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;name&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;nodes&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;table&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;WF_ROLENODES&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lazy&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;true&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inverse&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;false&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cascade&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;none&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sort&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;unsorted&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt; &lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;key&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;column&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;roleID&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;lt;/&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;key&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt; &lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;many&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;to&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;many&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;COLOR: #0000ff&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;com.xindeco.workflow.WFNode&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;column&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;nodeId&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;outer&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;-&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;join&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;auto&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;/&amp;gt;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&lt;br /&gt;&lt;img src=&quot;http://www.blogjava.net/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;lt;/&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;set&lt;/span&gt; &lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;gt;&lt;/span&gt; &lt;/div&gt;</description><category>Java</category><pubDate>Wed, 27 Dec 2006 09:26:12 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14498001.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14498001.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235207/1237942</fs:itemid></item><item><title>读取Properties文件的几种方法</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235208/1237942/1/item.html</link><description>&lt;span class=&quot;duanluojianju&quot;&gt;&lt;span class=&quot;style78&quot;&gt;&lt;font size=&quot;2&quot;&gt;1。使用java.util.Properties类的load()方法&amp;nbsp;&lt;br /&gt;示例：&amp;nbsp;&lt;br /&gt;InputStream&amp;nbsp;in&amp;nbsp;=&amp;nbsp;lnew&amp;nbsp;BufferedInputStream(new&amp;nbsp;FileInputStream(name));&amp;nbsp;&lt;br /&gt;Properties&amp;nbsp;p&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Properties();&amp;nbsp;&lt;br /&gt;p.load(in);&amp;nbsp;&lt;br /&gt;&lt;br /&gt;2。使用java.util.ResourceBundle类的getBundle()方法&amp;nbsp;&lt;br /&gt;示例：&lt;br /&gt;ResourceBundle&amp;nbsp;rb&amp;nbsp;=&amp;nbsp;ResourceBundle.getBundle(name,&amp;nbsp;Locale.getDefault());&amp;nbsp;&lt;br /&gt;&lt;br /&gt;3。使用java.util.PropertyResourceBundle类的构造函数&amp;nbsp;&lt;br /&gt;示例：&amp;nbsp;&lt;br /&gt;InputStream&amp;nbsp;in&amp;nbsp;=&amp;nbsp;new&amp;nbsp;BufferedInputStream(new&amp;nbsp;FileInputStream(name));&amp;nbsp;&lt;br /&gt;ResourceBundle&amp;nbsp;rb&amp;nbsp;=&amp;nbsp;new&amp;nbsp;PropertyResourceBundle(in);&amp;nbsp;&lt;br /&gt;&lt;br /&gt;4。使用class变量的getResourceAsStream()方法&amp;nbsp;&lt;br /&gt;示例：&amp;nbsp;&lt;br /&gt;InputStream&amp;nbsp;in&amp;nbsp;=&amp;nbsp;JProperties.class.getResourceAsStream(name);&amp;nbsp;&lt;br /&gt;Properties&amp;nbsp;p&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Properties();&amp;nbsp;&lt;br /&gt;p.load(in);&amp;nbsp;&lt;br /&gt;&lt;br /&gt;5。使用class.getClassLoader()所得到的java.lang.ClassLoader的getResourceAsStream()方法&amp;nbsp;&lt;br /&gt;示例：&amp;nbsp;&lt;br /&gt;InputStream&amp;nbsp;in&amp;nbsp;=&amp;nbsp;JProperties.class.getClassLoader().getResourceAsStream(name);&amp;nbsp;&lt;br /&gt;Properties&amp;nbsp;p&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Properties();&amp;nbsp;&lt;br /&gt;p.load(in);&amp;nbsp;&lt;br /&gt;&lt;br /&gt;6。使用java.lang.ClassLoader类的getSystemResourceAsStream()静态方法&amp;nbsp;&lt;br /&gt;示例：&amp;nbsp;&lt;br /&gt;InputStream&amp;nbsp;in&amp;nbsp;=&amp;nbsp;ClassLoader.getSystemResourceAsStream(name);&amp;nbsp;&lt;br /&gt;Properties&amp;nbsp;p&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Properties();&amp;nbsp;&lt;br /&gt;p.load(in);&amp;nbsp;&lt;br /&gt;&lt;br /&gt;补充&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Servlet中可以使用javax.servlet.ServletContext的getResourceAsStream()方法&amp;nbsp;&lt;br /&gt;示例：&lt;br /&gt;InputStream&amp;nbsp;in&amp;nbsp;=&amp;nbsp;context.getResourceAsStream(path);&amp;nbsp;&lt;br /&gt;Properties&amp;nbsp;p&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Properties();&amp;nbsp;&lt;br /&gt;p.load(in);&amp;nbsp;&lt;br /&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;</description><category>Java</category><pubDate>Wed, 20 Dec 2006 14:00:52 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14498000.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14498000.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235208/1237942</fs:itemid></item><item><title>如何找回mysql的root密码!!!!!!!</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235209/1237942/1/item.html</link><description>&lt;div style=&quot;FONT-SIZE: 12px&quot;&gt;在LINUX下装了MYSQL，刚装完的时候把ROOT空密码改了，当时也改了个好记的密码，没想到过了一天就忘记了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;因为MySQL密码存储于数据库mysql中的user表中&lt;br /&gt;所以只需要将我windows 2003下的MySQL中的user表拷贝过来覆盖掉就行了&lt;br /&gt;在c:\mysql\data\mysql\(linux 则一般在/var/lib/mysql/mysql/)目录下有三个user表相关文件user.frm、user.MYD、user.MYI&lt;br /&gt;user.frm //user表样式文件&lt;br /&gt;user.MYD //user表数据文件&lt;br /&gt;user.MYI //user表索引文件&lt;br /&gt;为保险起见，三个都拷贝过来，不过其实如果之前在要恢复的那个MySQL上没有更改过表结构的话，只要拷贝user.MYD就行了&lt;br /&gt;然后#. /etc/rc.d/init.d/mysql stop&lt;br /&gt;#. /etc/rc.d/init.d/mysql start&lt;br /&gt;#mysql -u root -p XXXXXX&lt;br /&gt;好了，可以用windows 2003下mysql密码登陆了&lt;br /&gt;mysql&amp;gt;use mysql&lt;br /&gt;mysql&amp;gt;update user set Password=PASSWORD('xxxxxx') where User='root';&lt;br /&gt;这时候会出错，提示user表只有读权限&lt;br /&gt;我分析了一下原因，只这样的，因为user.*文件的权限分配是windows 2003下的，在windows 2003下我ls -l一看权限是666&lt;br /&gt;在linux下我一看，拷过来后权限变成了600(其实正常情况下600就行了，只不过这里的文件属主不是mysql，拷过来后的属主变为了root,所以会出现权限不够，这时候如果你改成权限666则可以了，当然这样不好，没有解决问题的实质)，在/var/lib/mysql/mysql/下ls -l看了一下&lt;br /&gt;再&lt;br /&gt;#chown -R mysql:mysql user.*&lt;br /&gt;#chmod 600 user.*&lt;br /&gt;//OK,DONE&lt;br /&gt;重起一下MYSQL&lt;br /&gt;重新连接&lt;br /&gt;mysql&amp;gt;use mysql&lt;br /&gt;mysql&amp;gt;update user set Password=PASSWORD('xxxxxx') where User='root';&lt;br /&gt;mysql&amp;gt;FLUSH PRIVILEGES;&lt;br /&gt;有一点值得注意:如果你windows 下mysql如果是默认配置的话，注意要还要执行&lt;br /&gt;mysql&amp;gt;delete from user where User='';&lt;br /&gt;mysql&amp;gt;delete from user where Host='%';&lt;br /&gt;mysql&amp;gt;FLUSH PRIVILEGES;&lt;br /&gt;好了，到这里恢复密码过程就完成了&lt;br /&gt;这个方法么就是有点局限性，你必须也具备另外的user表文件&lt;br /&gt;&lt;br /&gt;其他还有几种方法&lt;br /&gt;其它方法一(这个是网上流传较广的方法,mysql中文参考手册上的)&lt;br /&gt;1. 向mysqld server 发送kill命令关掉mysqld server(不是 kill -9),存放进程ID的文件通常在MYSQL的数据库所在的目录中。&lt;br /&gt;killall -TERM mysqld&lt;br /&gt;你必须是UNIX的root用户或者是你所运行的SERVER上的同等用户，才能执行这个操作。&lt;br /&gt;2. 使用`--skip-grant-tables' 参数来启动 mysqld。 (LINUX下/usr/bin/safe_mysqld --skip-grant-tables , windows下c:\mysql\bin\mysqld --skip-grant-tables)&lt;br /&gt;&lt;br /&gt;3. 然后无密码登录到mysqld server ，&lt;br /&gt;&amp;gt;use mysql&lt;br /&gt;&amp;gt;update user set password=password(&amp;quot;new_pass&amp;quot;) where user=&amp;quot;root&amp;quot;;&lt;br /&gt;&amp;gt;flush privileges;&lt;br /&gt;。你也可以这样做：`mysqladmin -h hostname -u user password 'new password''。&lt;br /&gt;&lt;br /&gt;4. 载入权限表： `mysqladmin -h hostname flush-privileges' ，或者使用 SQL 命令`FLUSH PRIVILEGES'。&lt;br /&gt;5.killall -TERM mysqld&lt;br /&gt;6.用新密码登陆&lt;br /&gt;&lt;br /&gt;其它方法二&lt;br /&gt;直接用十六进制编辑器编辑user.MYD文件&lt;br /&gt;不过这个里面我要说明一点，我这里编辑的时候发现个问题，加密的密码串有些是连续存储的，有些的最后两位被切开了，后两位存储在后面其他地方.这一点我还没想明白.还有注意一点就是编辑的是加密过的密码串，也就是说你还是需要另外有user表文件。这种方法和我最上面介绍的方法的区别在于，这种方法直接编辑linux下的user表文件，就不需要重新改文件属主和权限了&lt;img alt=&quot;&quot; src=&quot;http://www.discuz.net/images/smilies/shy.gif&quot; border=&quot;0&quot; smilieid=&quot;8&quot; /&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.discuz.net/images/smilies/shy.gif&quot; border=&quot;0&quot; smilieid=&quot;8&quot; /&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.discuz.net/images/smilies/shy.gif&quot; border=&quot;0&quot; smilieid=&quot;8&quot; /&gt;:$:$&lt;/div&gt;&lt;br /&gt;</description><category>数据库</category><pubDate>Tue, 19 Dec 2006 09:50:44 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497999.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497999.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235209/1237942</fs:itemid></item><item><title>JavaScript 效果</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235210/1237942/1/item.html</link><description>&lt;p&gt;1. 遍历文件下的所有文件&lt;/p&gt;&lt;p&gt;&amp;lt;script language=&amp;quot;java script&amp;quot;&amp;gt; &lt;br /&gt;&amp;nbsp; function&amp;nbsp;&amp;nbsp; fileList(){ &lt;br /&gt;&amp;nbsp; var filePath = &amp;quot;test&amp;quot;; //文件目录&lt;br /&gt;&amp;nbsp; fso = new ActiveXObject(&amp;quot;Scripting.FileSystemObject&amp;quot;);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; fldr = fso.GetFolder(filePath);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; fc = new Enumerator(fldr.files);&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp; for(; !fc.atEnd(); fc.moveNext()) { //枚举所有文件 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; s=fc.item();&amp;nbsp;&amp;nbsp; //取文件对象&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; f = fso.GetFile(s);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; titl=s.name;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(titl);&lt;br /&gt;&amp;nbsp; }&amp;nbsp; &lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;&lt;p /&gt;&lt;p&gt;2. 选中页面上某一文本&lt;/p&gt;&lt;p&gt;&amp;lt;HTML&amp;gt;&lt;br /&gt;&amp;lt;HEAD&amp;gt;&amp;lt;TITLE&amp;gt;&amp;lt;/TITLE&amp;gt;&lt;br /&gt;&amp;lt;SCRIPT LANGUAGE=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;function selectItem() {&lt;br /&gt;&amp;nbsp;var obj = document.getElementById(&amp;quot;text&amp;quot;);&lt;br /&gt;&amp;nbsp;var rng = document.body.createTextRange();&lt;br /&gt;&amp;nbsp; rng.moveToElementText(obj);&lt;br /&gt;&amp;nbsp; rng.select();&lt;br /&gt;}&lt;br /&gt;&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;&amp;lt;/HEAD&amp;gt;&lt;br /&gt;&amp;lt;BODY&amp;gt;&lt;br /&gt;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;lt;td id=&amp;quot;text&amp;quot;&amp;gt;被选中&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;INPUT TYPE=&amp;quot;button&amp;quot; value=&amp;quot;选择&amp;quot; onclick=&amp;quot;selectItem()&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;/BODY&amp;gt;&lt;br /&gt;&amp;lt;/HTML&amp;gt;&lt;/p&gt;</description><category>web开发</category><pubDate>Thu, 07 Dec 2006 15:58:51 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497998.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497998.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235210/1237942</fs:itemid></item><item><title>JS脚本defer的作用</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235211/1237942/1/item.html</link><description>&amp;lt;script src=&amp;quot;../cgi-bin/delscript.js&amp;quot; defer&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;中的defer作用是文档加载完毕了再执行脚本,这样回避免找不到对象的问题---有点问题&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;table style=&quot;WIDTH: 320px; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot; border=&quot;1&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&amp;lt;button id=&amp;quot;myButton&amp;quot; onclick=&amp;quot;alert('ok')&amp;quot;&amp;gt;test&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;myButton.click();&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;table style=&quot;WIDTH: 320px; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot; border=&quot;1&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&amp;lt;script&amp;gt;&lt;br /&gt;myButton.click();&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;button id=&amp;quot;myButton&amp;quot; onclick=&amp;quot;alert('ok')&amp;quot;&amp;gt;test&amp;lt;/button&amp;gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;table style=&quot;WIDTH: 320px; BORDER-COLLAPSE: collapse&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot; border=&quot;1&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&amp;lt;script defer&amp;gt;&lt;br /&gt;function document.body.on load() {&lt;br /&gt;&amp;nbsp;alert(document.body.offsetHeight);&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;加上 defer 等于在页面完全在入后再执行，相当于 window.on load ，但应用上比 window.on load 更灵活！&lt;br /&gt;&lt;br /&gt;defer是脚本程序强大功能中的一个“无名英雄”。它告诉浏览器Script段包含了无需立即执行的代码，并且，与SRC属性联合使用，它还可以使这些脚本在后台被下载，前台的内容则正常显示给用户。&lt;br /&gt;--但是 文档加载完毕了再执行脚本&lt;br /&gt;&lt;br /&gt;最后请注意两点：&lt;br /&gt;1、不要在defer型的脚本程序段中调用document.write命令，因为document.write将产生直接输出效果。&lt;br /&gt;2、而且，不要在defer型脚本程序段中包括任何立即执行脚本要使用的全局变量或者函数。 &lt;br /&gt;&lt;br /&gt;一个常用的优化性能的方法是：当脚本不需要立即运行时，在&amp;lt;SCRIPT&amp;gt;标签中设置“defer”属性。 (立即脚本没有被包含在一个function块中,因此会在加载过程中执行。) 设置“defer”属性后，IE就不必等待该脚本装载和执行完毕。这样页面加载会更快。一般来说，这也表明立即脚本最好放在function块中，并在 document或者body对象的on load 句柄中处理该函数。在有一些脚本需要依赖用户操作而执行时----例如点击按钮，或者移动鼠标到某个区域----使用该属性非常有用。但当有一些脚本需要在页面加载过程中或加载完成后执行，使用defer属性得到的好处就不太大。&lt;br /&gt;&lt;/p&gt;</description><category>web开发</category><pubDate>Tue, 05 Dec 2006 16:40:10 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497997.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497997.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235211/1237942</fs:itemid></item><item><title>PostgreSQL常见问题</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235212/1237942/1/item.html</link><description>&lt;br /&gt;&lt;div&gt;&lt;h2&gt;PostgreSQL常见问题&lt;/h2&gt;&lt;/div&gt;&lt;h4&gt;&lt;a name=&quot;1.1&quot;&gt;&lt;/a&gt;1.1)PostgreSQL 是什么？该怎么发音？&lt;/h4&gt;&lt;p&gt;PostgreSQL 读作 &lt;i&gt;Post-Gres-Q-L&lt;/i&gt;，有时候也简称为&lt;i&gt;Postgres&lt;/i&gt; 。 &lt;/p&gt;&lt;p&gt;PostgreSQL 是面向目标的关系数据库系统，它具有传统商业数据库系统的所有功能，同时又含有将在下一代 DBMS 系统的使用的增强特性。 PostgreSQL 是自由免费的，并且所有源代码都可以获得。 &lt;/p&gt;&lt;p&gt;PostgreSQL 的开发队伍主要为志愿者，他们遍布世界各地并通过互联网进行联系，这是一个社区开发项目，它不被任何公司控制。 如想加入开发队伍，请参见开发人员常见问题（FAQ） &lt;a href=&quot;http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html&quot;&gt;http://www.postgresql.org/files/documentation/faqs/FAQ_DEV.html&lt;/a&gt; &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;1.2&quot;&gt;&lt;/a&gt;1.2)PostgreSQL 的版权是什么?&lt;/h4&gt;&lt;p&gt;PostgreSQL的发布遵从经典的BSD版权。关于源代码的如何使用没有任何限制，我们很喜欢这种方式并且还没有打算改变它。 &lt;/p&gt;&lt;p&gt;下面就是我们使用的BSD版权内容： &lt;/p&gt;&lt;p&gt;部分版权（c）1996-2005，PostgreSQL 全球开发小组，部分版权（c）1994-1996 加州大学董事 &lt;/p&gt;&lt;p&gt;（Portions copyright (c) 1996-2005, PostgreSQL Global Development Group Portions Copyright (c) 1994-6 Regents of the University of California） &lt;/p&gt;&lt;p&gt;允许为任何目的使用，拷贝，修改和分发这个软件和它的文档而不收取任何费用， 并且无须签署因此而产生的证明，前提是上面的版权声明和本段以及下面两段文字出现在所有拷贝中。 &lt;/p&gt;&lt;p&gt;（Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.） &lt;/p&gt;&lt;p&gt;在任何情况下，加州大学都不承担因使用此软件及其文档而导致的对任何当事人的直接的， 间接的，特殊的，附加的或者相伴而生的损坏，包括利益损失的责任，即使加州大学已经建议了这些损失的可能性时也是如此。 &lt;/p&gt;&lt;p&gt;（IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.） &lt;/p&gt;&lt;p&gt;加州大学明确放弃任何保证，包括但不局限于某一特定用途的商业和利益的隐含保证。 这里提供的这份软件是基于“当作是”的基础的，因而加州大学没有责任提供维护，支持，更新，增强或者修改的服务。 &lt;/p&gt;&lt;p&gt;（THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN &amp;quot;AS IS&amp;quot; BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.）&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;1.3&quot;&gt;&lt;/a&gt;1.3)PostgreSQL 可以运行在哪些操作系统平台上？&lt;/h4&gt;&lt;p&gt;一般说来，一个现代的 UNIX 兼容的平台都能运行 PostgreSQL 。在安装指南里列出了发布时经过明确测试的平台。 &lt;/p&gt;&lt;p&gt;PostgreSQl也可以直接运行在基于微软Windows-NT的操作系统，如Win2000，WinXP 和 Win2003，已制作完成的安装包可从 &lt;a href=&quot;http://pgfoundry.org/projects/pginstaller&quot;&gt;http://pgfoundry.org/projects/pginstaller&lt;/a&gt;下载，基于MSDOS的Windows操作系统 （Win95，Win98，WinMe）需要通过Cygwin模拟环境运行PostgreSQL。 &lt;/p&gt;&lt;p&gt;同时也有一个为Novell Netware 6开发的版本可从&lt;a href=&quot;http://forge.novell.com/&quot;&gt; http://forge.novell.com &lt;/a&gt;获取，为OS/2开发的版本可从 &lt;a href=&quot;http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&amp;button=Search&amp;key=postgreSQL&amp;stype=all&amp;sort=type&amp;dir=%2F&quot;&gt;http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&amp;amp;button=Search&amp;amp;key=postgreSQL&amp;amp;stype=all&amp;amp;sort=type&amp;amp;dir=%2F&lt;/a&gt; &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;1.4&quot;&gt;&lt;/a&gt;1.4)我从哪里能得到 PostgreSQL？&lt;/h4&gt;&lt;p&gt;通过浏览器可从&lt;a href=&quot;http://www.postgresql.org/ftp/&quot;&gt;http://www.postgresql.org/ftp/&lt;/a&gt;下载，也可通过FTP，从 &lt;a href=&quot;ftp://ftp.postgresql.org/pub/&quot;&gt;ftp://ftp.PostgreSQL.org/pub/&lt;/a&gt;站点下载。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;1.5&quot;&gt;&lt;/a&gt;1.5)我从哪里能得到对 PostgreSQL 的支持？&lt;/h4&gt;&lt;p&gt;PostgreSQL社区通过邮件列表为其大多数用户提供帮助，加入邮件列表的主站点是&lt;a href=&quot;http://www.postgresql.org/community/lists/&quot;&gt; http://www.postgresql.org/community/lists/&lt;/a&gt;，一般情况下，先加入&lt;i&gt;General&lt;/i&gt; 或 &lt;i&gt;Bug&lt;/i&gt;邮件列表是一个较好的开始。 &lt;/p&gt;&lt;p&gt;主要的IRC频道是在FreeNode(&lt;i&gt;irc.freenode.net&lt;/i&gt;)的&lt;i&gt;#postgresql&lt;/i&gt;，为了连上此频道，可以使用UNIX程序irc，其指令格式： irc -c '#postgresql' &amp;quot;$USER&amp;quot; irc.freenode.net ，或者使用其他IRC客户端程序。在此网络中还存在一个PostgreSQL的西班牙频道(&lt;i&gt;#postgersql-es&lt;/i&gt;)和法语频道 (&lt;i&gt;#postgresql-fr&lt;/i&gt;)。同样地，在EFNET上也有一个PostgreSQL的交流频道。 &lt;/p&gt;&lt;p&gt;商业支持公司的列表在&lt;a href=&quot;http://techdocs.postgresql.org/companies.php&quot;&gt; http://techdocs.postgresql.org/companies.php&lt;/a&gt;。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;1.6&quot;&gt;&lt;/a&gt;1.6)我如何提交一个BUG报告？&lt;/h4&gt;&lt;p&gt;可访问 &lt;a href=&quot;http://www.postgresql.org/support/submitbug&quot;&gt;http://www.postgresql.org/support/submitbug&lt;/a&gt;，填写Bug上报表格即可。 &lt;/p&gt;&lt;p&gt;同样也可访问ftp站点&lt;a href=&quot;ftp://ftp.postgresql.org/pub/&quot;&gt;ftp://ftp.PostgreSQL.org/pub/&lt;/a&gt; 检查有无更新的PostgreSQL版本或补丁。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;1.7&quot;&gt;&lt;/a&gt;1.7)最新版的PostgreSQL 是什么？&lt;/h4&gt;&lt;p&gt;PostgreSQL 最新的版本是版本 8.0.2 （译注：现最新版本为8.0.3）。 &lt;/p&gt;&lt;p&gt;我们计划每年发布一个主要版本，每几个月发布一个小版本。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;1.8&quot;&gt;&lt;/a&gt;1.8)能够获取的最新文档有哪些？&lt;/h4&gt;&lt;p&gt;PostgreSQL包含大量的文档，主要有一些手册，手册页和一些的测试例子。参见 /doc 目录（译注：应为 $PGHOME/doc）。 你还可以在线浏览 PostgreSQL 的手册，其地址是：&lt;a href=&quot;http://www.postgresql.org/docs&quot;&gt;http://www.PostgreSQL.org/docs&lt;/a&gt;。 &lt;/p&gt;&lt;p&gt;有两本关于 PostgreSQL 的书在线提供，在 &lt;a href=&quot;http://www.postgresql.org/docs/awbook.html&quot;&gt;http://www.PostgreSQL.org/docs/awbook.html&lt;/a&gt; 和 &lt;a href=&quot;http://www.commandprompt.com/ppbook/&quot;&gt;http://www.commandprompt.com/ppbook/&lt;/a&gt; 。 也有大量的PostgreSQL书籍可供购买，其中最为流行的一本是由Korry Douglas编写的。在 &lt;a href=&quot;http://techdocs.postgresql.org/techdocs/bookreviews.php&quot;&gt;http://techdocs.PostgreSQL.org/techdocs/bookreviews.php&lt;/a&gt;上 上有大量有关PostgreSQL书籍的简介。 在 &lt;a href=&quot;http://techdocs.postgresql.org/&quot;&gt;http://techdocs.PostgreSQL.org/&lt;/a&gt;上收集了有关 PostgreSQL 的大量技术文章。 &lt;/p&gt;&lt;p&gt;客户端的命令行程序&lt;i&gt;psql&lt;/i&gt;有一些以 \d 开头的命令，可显示关于类型，操作符，函数，汇总等的信息，使用 \? 可以显示所有可用的命令。 &lt;/p&gt;&lt;p&gt;我们的 web 站点包含更多的文档。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;1.9&quot;&gt;&lt;/a&gt;1.9)我如何了解已知的 BUG 或暂缺的功能？&lt;/h4&gt;&lt;p&gt;PostgreSQL 支持一个扩展了的 SQL-92 的子集。参阅我们的&lt;a href=&quot;http://www.postgresql.org/docs/faqs.TODO.html&quot;&gt;TODO&lt;/a&gt; 列表，获取一个已知Bug，暂缺的功能和将来的计划。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;1.10&quot;&gt;&lt;/a&gt;1.10)我应该怎样学习 SQL ？&lt;/h4&gt;&lt;p&gt;首先考虑上述提到的与PostgreSQL相关的书籍，另外一本是&lt;i&gt;Teach Yourself SQL in 21 Days, Second Edition&lt;/i&gt;， 我们的许多用户喜欢&lt;i&gt;The Practical SQL Handbook&lt;/i&gt; Bowman, Judith S., et al., Addison-Wesley，其他的则喜欢 &lt;i&gt;The Complete Reference SQL&lt;/i&gt;, Groff et al., McGraw-Hill。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;1.11&quot;&gt;&lt;/a&gt;1.11)我应该怎样加入开发队伍？&lt;/h4&gt;&lt;p&gt;详见&lt;a href=&quot;http://www.postgresql.org/docs/faqs.FAQ_DEV.html&quot;&gt; Developer's FAQ &lt;/a&gt;。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;1.12&quot;&gt;&lt;/a&gt;1.12)PostgreSQL 和其他数据库系统比起来如何？&lt;/h4&gt;&lt;p&gt;评价软件有好几种方法：特性，性能，可靠性，支持和价格。 &lt;/p&gt;&lt;dl&gt;&lt;dt&gt;&lt;b&gt;特性&lt;/b&gt; &lt;/dt&gt;&lt;dd&gt;PostgreSQL 拥有大型商用 DBMS 里大多数特性， 例如：事务，子查询，触发器，视图，外键参考完整性和复杂的锁等。 我们还有一些它们没有的特性，如用户定义类型，继承，规则和多版本并行控制以减少锁的争用等。&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;性能&lt;/b&gt; &lt;/dt&gt;&lt;dd&gt;PostgreSQL 和其他商用和开源的数据库具有类似的性能。 对某些处理它比较快，对其他一些处理它比较慢。 与其他数据库相比，我们的性能通常在 +/- 10%之间。&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;可靠性&lt;/b&gt; &lt;/dt&gt;&lt;dd&gt;我们知道 DBMS 必须是可靠的，否则它就一点用都没有。 我们努力做到发布经过认真测试的，稳定的臭虫最少的代码。每个版本至少有一个月的 beta 测试时间，并且我们的发布历史显示我们可以提供稳定的，牢固的，可用于生产使用的版本。我们相信 在这方面我们与其他的数据库软件是相当的。&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;支持&lt;/b&gt; &lt;/dt&gt;&lt;dd&gt;我们的邮件列表提供一个非常大的开发人员和用户的组以帮助解决所碰到的任何问题。 我们不能保证肯定能解决问题，相比之下，商用 DBMS 也并不是总能够提供解决方法。 直接与开发人员，用户群，手册和源程序接触令 PostgreSQL 的支持比其他 DBMS 还要好。还有一些商业性的预包装的支持，可以给提供给那些需要的人。（参阅 FAQ 条款 1.5 小节）&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;价格&lt;/b&gt; &lt;/dt&gt;&lt;dd&gt;我们对任何用途都免费，包括商用和非商用目的。 你可以不加限制地向你的产品里加入我们的代码，除了那些我们在上面的版权声明里声明的 BSD 风格的版权外。 &lt;/dd&gt;&lt;/dl&gt;&lt;h4&gt;&lt;a name=&quot;1.13&quot;&gt;&lt;/a&gt;1.13)谁控制PostgreSQL ？&lt;/h4&gt;&lt;p&gt;如果你在寻找PostgreSQL的掌门人，或是什么中央委员会，或是什么所属公司，你只能放弃了---因为一个也不存在，但我们的确有一个 委员会和CVS管理组，但这些工作组的设立主要是为了进行管理工作而不是对PostgreSQL进行控制，PostgreSQL项目是由任何人均 可参加的开发人员社区和所有用户控制的，你所需要做的就是加入邮件列表，参与讨论即可（要参与PostgreSQL的开发详见 &lt;a href=&quot;http://www.postgresql.org/docs/faqs.FAQ_DEV.html&quot;&gt;Developer's FAQ &lt;/a&gt;获取信息）。 &lt;/p&gt;&lt;hr /&gt;&lt;div&gt;&lt;h2&gt;用户客户端问题&lt;/h2&gt;&lt;/div&gt;&lt;h4&gt;&lt;a name=&quot;2.1&quot;&gt;&lt;/a&gt;2.1)我们可以用什么语言和 PostgreSQL 打交道？&lt;/h4&gt;&lt;p&gt;PostgreSQL(缺省情况)只安装有C和内嵌式C的接口，其他的接口都是独立的项目，能够分别下载，这些接口项目独立的好处 是他们可以有各自的发布计划和各自独立的开发组。 &lt;/p&gt;&lt;p&gt;一些编程语言如PHP都有访问 PostgreSQL 的接口，Perl,TCL,Python以及很多其他语言的接口在 &lt;a href=&quot;http://gborg.postgresql.org/&quot;&gt;http://gborg.postgresql.org &lt;/a&gt;上的&lt;i&gt;Drivers/Interfaces&lt;/i&gt;小节可找到， 并且通过Internet很容易搜索到。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;2.2&quot;&gt;&lt;/a&gt;2.2)有什么工具可以把 PostgreSQL 用于 Web 页面？&lt;/h4&gt;&lt;p&gt;一个介绍以数据库为后台的挺不错的站点是：&lt;a href=&quot;http://www.webreview.com/&quot;&gt;http://www.webreview.com&lt;/a&gt;。 &lt;/p&gt;&lt;p&gt;对于 Web 集成，PHP 是一个极好的接口。它在：&lt;a href=&quot;http://www.php.net/&quot;&gt;http://www.php.net/&lt;/a&gt;。 &lt;/p&gt;&lt;p&gt;对于复杂的任务，很多人采用 Perl 接口和 CGI.pm 或 mod_perl 。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;2.3&quot;&gt;&lt;/a&gt;2.3)PostgreSQL 拥有图形用户界面吗？&lt;/h4&gt;&lt;p&gt;是的，在 &lt;a href=&quot;http://techdocs.postgresql.org/guides/GUITools&quot;&gt;http://techdocs.postgresql.org/guides/GUITools&lt;/a&gt;有一个详细的列表。 &lt;/p&gt;&lt;hr /&gt;&lt;div&gt;&lt;h2&gt;系统管理问题&lt;/h2&gt;&lt;/div&gt;&lt;h4&gt;&lt;a name=&quot;3.1&quot;&gt;&lt;/a&gt;3.1)我怎样能把 PostgreSQL 装在 /usr/local/pgsql 以外的地方？&lt;/h4&gt;&lt;p&gt;在运行 configure 时加上 --prefix 选项。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;3.2&quot;&gt;&lt;/a&gt;3.2)我如何控制来自其他主机的连接？&lt;/h4&gt;&lt;p&gt;缺省时，PostgreSQL 只允许通过 unix 域套接字或TCP/IP方式且来自本机的连接。 你只有在修改了配置文件&lt;i&gt;postgresql.conf&lt;/i&gt;中的&lt;i&gt;listen_addresses&lt;/i&gt;，且也在配置文件&lt;i&gt;pg_hba.conf&lt;/i&gt;中打开了 主机为基础（ host-based ）的身份认证，并重新启动PostgreSQL，否则其他机器是不能与你的PostgreSQL服务器连接的。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;3.3&quot;&gt;&lt;/a&gt;3.3)我怎样调整数据库引擎以获得更好的性能？&lt;/h4&gt;&lt;p&gt;有三个主要方面可以提升PostgreSQL的潜能。 &lt;/p&gt;&lt;dl&gt;&lt;dt&gt;&lt;b&gt;查询方式的变化&lt;/b&gt; &lt;/dt&gt;&lt;dd&gt;这主要涉及修改查询方式以获取更好的性能: &lt;ul&gt;&lt;li&gt;创建索引，包括表达式和部分索引； &lt;/li&gt;&lt;li&gt;使用COPY语句代替多个Insert语句； &lt;/li&gt;&lt;li&gt;将多个SQL语句组成一个事务以减少提交事务的开销； &lt;/li&gt;&lt;li&gt;从一个索引中提取多条记录时使用CLUSTER； &lt;/li&gt;&lt;li&gt;从一个查询结果中取出部分记录时使用LIMIT； &lt;/li&gt;&lt;li&gt;使用预编译式查询（Prepared Query)； &lt;/li&gt;&lt;li&gt;使用ANALYZE以保持精确的优化统计； &lt;/li&gt;&lt;li&gt;定期使用 VACUUM 或 &lt;i&gt;pg_autovacuum&lt;/i&gt; &lt;/li&gt;&lt;li&gt;进行大量数据更改时先删除索引（然后重建索引） &lt;/li&gt;&lt;/ul&gt;&lt;/dd&gt;&lt;dt&gt;&lt;b&gt;服务器的配置&lt;/b&gt; &lt;/dt&gt;&lt;dd&gt;配置文件&lt;i&gt;postgres.conf&lt;/i&gt;中的很多设置都会影响性能，所有参数的列表可见： &lt;a href=&quot;http://www.postgresql.org/docs/current/static/runtime.html&quot;&gt;Administration Guide/Server Run-time Environment/Run-time Configuration&lt;/a&gt;， 有关参数的解释可见：&lt;a href=&quot;http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html&quot;&gt; http://www.varlena.com/varlena/GeneralBits/Tidbits/annotated_conf_e.html &lt;/a&gt;和 &lt;a href=&quot;http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html&quot;&gt;http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html&lt;/a&gt;。 &lt;/dd&gt;&lt;dt&gt;&lt;b&gt;硬件的选择&lt;/b&gt; &lt;/dt&gt;&lt;dd&gt;计算机硬件对性能的影响可浏览 &lt;a href=&quot;http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html&quot;&gt;http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html&lt;/a&gt; 和 &lt;a href=&quot;http://www.powerpostgresql.com/PerfList/&quot;&gt;http://www.powerpostgresql.com/PerfList/&lt;/a&gt;。 &lt;/dd&gt;&lt;/dl&gt;&lt;h4&gt;&lt;a name=&quot;3.4&quot;&gt;&lt;/a&gt;3.4)PostgreSQL 里可以获得什么样的调试特性？&lt;/h4&gt;&lt;p&gt;PostgreSQL 有很多类似&lt;i&gt; log_* &lt;/i&gt;的服务器配置变量可用于查询的打印和进程统计，而这些工作对调试和性能测试很有帮助。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;3.5&quot;&gt;&lt;/a&gt;3.5)为什么在试图连接时收到“Sorry, too many clients”消息？&lt;/h4&gt;&lt;p&gt;这表示你已达到缺省100个并发后台进程数的限制，你需要通过修改&lt;i&gt;postgresql.conf&lt;/i&gt;文件中的&lt;i&gt;max_connections&lt;/i&gt;值来 增加postmaster的后台并发处理数，修改后需重新启动&lt;i&gt;postmaster&lt;/i&gt;。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;3.6&quot;&gt;&lt;/a&gt;3.6)为什么要在升级 PostgreSQL 主要发布版本时做 dump 和 restore ？&lt;/h4&gt;&lt;p&gt;PostgreSQL 开发组对每次小的升级仅做了较少的修改，因此从 7.4.0 升级到 7.4.1 不需要 dump 和 restore。 但是主要的升级（例如从 7.3 到 7.4）通常会修改系统表和数据表的内部格式。 这些变化一般比较复杂，因此我们不维数据文件的向后兼容。 dump 将数据按照通用的格式输出，随后可以被重新加载并使用新的内部格式。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;3.7&quot;&gt;&lt;/a&gt;3.7)(使用PostgreSQL)我需要使用什么计算机硬件 ？&lt;/h4&gt;&lt;p&gt;由于计算机硬件大多数是兼容的，人们总是倾向于相信所有计算机硬件质量也是相同的。事实上不是， ECC RAM（带奇偶校验的内存），SCSI （硬盘）和优质的主板比一些便宜货要更加可靠且具有更好的性能。PostgreSQL几乎可以运行在任何硬件上， 但如果可靠性和性能对你的系统很重要，你就需要全面的研究一下你的硬件配置了。在我们的邮件列表上也有关于 硬件配置和性价比的讨论。 &lt;/p&gt;&lt;hr /&gt;&lt;div&gt;&lt;h2&gt;操作问题&lt;/h2&gt;&lt;/div&gt;&lt;h4&gt;&lt;a name=&quot;4.1&quot;&gt;&lt;/a&gt;4.1)如何只选择一个查询结果的头几行？或是随机的一行？&lt;/h4&gt;&lt;p&gt;如果你只是要提取几行数据，并且你在执行查询中知道确切的行数，你可以使用LIMIT功能。 如果有一个索引与 &lt;i&gt;ORDER BY&lt;/i&gt;中的条件匹配，PostgreSQL 可能就只处理要求的头几条记录， （否则将对整个查询进行处理直到生成需要的行）。如果在执行查询功能时不知道确切的记录数， 可使用游标(cursor)和FETCH功能。 &lt;/p&gt;&lt;p&gt;可使用以下方法提取一行随机记录的： &lt;/p&gt;&lt;pre&gt;		SELECT  cols
		FROM tab
		ORDER BY random()
		LIMIT 1 ;
&lt;/pre&gt;&lt;h4&gt;&lt;a name=&quot;4.2&quot;&gt;&lt;/a&gt;4.2)如何查看表、索引、数据库以及用户的定义？如何查看&lt;i&gt;psql&lt;/i&gt;里用到的查询指令并显示它们？&lt;/h4&gt;&lt;p&gt;在&lt;i&gt;psql&lt;/i&gt;中使用 \dt 命令来显示数据表的定义，要了解&lt;i&gt;psql&lt;/i&gt;中的完整命令列表可使用\? ，另外，你也可以阅读 &lt;i&gt;psql&lt;/i&gt; 的源代码 文件&lt;i&gt;pgsql/src/bin/psql/describe.c&lt;/i&gt;，它包括为生成&lt;i&gt;psql&lt;/i&gt;反斜杠命令的输出的所有 SQL 命令。你还可以带 &lt;i&gt;-E&lt;/i&gt; 选项启动 &lt;i&gt;psql&lt;/i&gt;， 这样它将打印出执行你在&lt;i&gt;psql&lt;/i&gt;中所给出的命令的内部实际使用的SQL查询。PostgreSQL也提供了一个兼容SQL的INFORMATION SCHEMA接口， 你可以从这里获取关于数据库的信息。 &lt;/p&gt;&lt;p&gt;在系统中有一些以&lt;i&gt;pg_&lt;/i&gt; 打头的系统表也描述了表的定义。 &lt;/p&gt;&lt;p&gt;使用 &lt;i&gt;psql -l&lt;/i&gt; 指令可以列出所有的数据库。 &lt;/p&gt;&lt;p&gt;也可以浏览一下 &lt;i&gt;pgsql/src/tutorial/syscat.source&lt;/i&gt;文件，它列举了很多可从数据库系统表中获取信息的SELECT语法。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.3&quot;&gt;&lt;/a&gt;4.3)如何更改一个字段的数据类型？&lt;/h4&gt;&lt;p&gt;在8.0版本里更改一个字段的数据类型很容易，可使用 ALTER TABLE ALTER COLUMN TYPE 。 &lt;/p&gt;&lt;p&gt;在以前的版本中，可以这样做： &lt;/p&gt;&lt;pre&gt;	BEGIN;
    ALTER TABLE tab ADD COLUMN new_col new_data_type;
    UPDATE tab SET new_col = CAST(old_col AS new_data_type);
    ALTER TABLE tab DROP COLUMN old_col;
    COMMIT;
&lt;/pre&gt;&lt;p&gt;你然后可以使用&lt;i&gt;VACUUM FULL tab &lt;/i&gt;指令来使系统收回无效数据所占用的空间。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.4&quot;&gt;&lt;/a&gt;4.4)一行记录，一个表，一个库的最大尺寸是多少？&lt;/h4&gt;&lt;p&gt;下面是一些限制： &lt;/p&gt;&lt;blockquote&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;一个数据库最大尺寸？&lt;/td&gt;&lt;td&gt;无限制（已存在有 32TB 的数据库）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;一个表的最大尺寸？&lt;/td&gt;&lt;td&gt;32 TB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;一行记录的最大尺寸？&lt;/td&gt;&lt;td&gt;1.6 TB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;一个字段的最大尺寸?&lt;/td&gt;&lt;td&gt;1 GB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;一个表里最大行数？&lt;/td&gt;&lt;td&gt;无限制&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;一个表里最大列数？&lt;/td&gt;&lt;td&gt;250-1600 （与列类型有关）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;一个表里的最大索引数量？&lt;/td&gt;&lt;td&gt;无限制&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;p&gt;当然，实际上没有真正的无限制，还是要受可用磁盘空间、可用内存/交换区的制约。 事实上，当这些数值变得异常地大时，系统性能也会受很大影响。 &lt;/p&gt;&lt;p&gt;表的最大尺寸 32 TB 不需要操作系统对大文件的支持。大表用多个 1 GB 的文件存储，因此文件系统尺寸的限制是不重要的。 &lt;/p&gt;&lt;p&gt;如果缺省的块大小增长到 32K ，最大的表尺寸和最大列数还可以增加到四倍。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.5&quot;&gt;&lt;/a&gt;4.5)存储一个典型的文本文件里的数据需要多少磁盘空间？&lt;/h4&gt;&lt;p&gt;一个 Postgres 数据库（存储一个文本文件）所占用的空间最多可能需要相当于这个文本文件自身大小5倍的磁盘空间。 &lt;/p&gt;&lt;p&gt;例如，假设有一个 100,000 行的文件，每行有一个整数和一个文本描述。 假设文本串的平均长度为20字节。文本文件占用 2.8 MB。存放这些数据的 PostgreSQL 数据库文件大约是 6.4 MB: &lt;/p&gt;&lt;pre&gt;     32 字节: 每行的头（估计值）
     24 字节: 一个整数型字段和一个文本型字段
   +  4 字节: 页面内指向元组的指针
   ----------------------------------------
     60 字节每行

   PostgreSQL 数据页的大小是 8192 字节 (8 KB)，则：

   8192 字节每页
   -------------------   =  136 行/数据页（向下取整）
     60 字节每行

   100000 数据行
   --------------------  =  735 数据页（向上取整）
      128 行每页

   735 数据页 * 8192 字节/页  =  6,021,120 字节（6 MB）
&lt;/pre&gt;&lt;p&gt;索引不需要这么多的额外消耗，但也确实包括被索引的数据，因此它们也可能很大。 &lt;/p&gt;&lt;p&gt;空值&lt;i&gt;NULL&lt;/i&gt;存放在位图中，因此占用很少的空间。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.6&quot;&gt;&lt;/a&gt;4.6)为什么我的查询很慢？为什么这些查询没有利用索引？&lt;/h4&gt;&lt;p&gt;并非每个查询都会自动使用索引。只有在表的大小超过一个最小值，并且查询只会选中表中较小比例的记录时才会采用索引。 这是因为索引扫描引起的随即磁盘存取可能比直接地读取表（顺序扫描）更慢。 &lt;/p&gt;&lt;p&gt;为了判断是否使用索引，PostgreSQL必须获得有关表的统计值。这些统计值可以使用 VACUUM ANALYZE，或 ANALYZE 获得。 使用统计值，优化器知道表中有多少行，就能够更好地判断是否利用索引。 统计值对确定优化的连接顺序和连接方法也很有用。在表的内容发生变化时，应定期进行统计值的更新收集。 &lt;/p&gt;&lt;p&gt;索引通常不用于 ORDER BY 或执行连接。对一个大表的一次顺序扫描，再做一个显式的排序通常比索引扫描要快。 &lt;/p&gt;&lt;p&gt;但是，在 LIMIT 和 ORDER BY 结合使用时经常会使用索引，因为这只会返回表的一小部分。 实际上，虽然 MAX() 和 MIN() 并不使用索引，通过对 ORDER BY 和 LLIMIT 使用索引取得最大值和最小值也是可以的： &lt;/p&gt;&lt;pre&gt;	SELECT col
	FROM tab
	ORDER BY col [ DESC ]
	LIMIT 1;
&lt;/pre&gt;&lt;p&gt;如果你确信PostgreSQL的优化器使用顺序扫描是不正确的，你可以使用&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;SET enable_seqscan TO 'off'&lt;/font&gt;&lt;/code&gt;指令， 然后再次运行查询，你就可以看出使用一个索引扫描是否确实要快一些。 &lt;/p&gt;&lt;p&gt;当使用通配符操作，例如 &lt;i&gt;LIKE&lt;/i&gt; 或 &lt;i&gt;~&lt;/i&gt; 时，索引只能在特定的情况下使用： &lt;/p&gt;&lt;ul&gt;&lt;li&gt;字符串的开始部分必须是普通字符串，也就是说： &lt;ul&gt;&lt;li&gt;&lt;i&gt;LIKE&lt;/i&gt; 模式不能以 &lt;i&gt;%&lt;/i&gt; 打头。 &lt;/li&gt;&lt;li&gt;&lt;i&gt;~&lt;/i&gt; （正则表达式）模式必须以 &lt;i&gt;^&lt;/i&gt; 打头。 &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;字符串不能以匹配多个字符的模式类打头，例如 [a-e]。 &lt;/li&gt;&lt;li&gt;大小写无关的查找，如 ILIKE 和 ~* 等不使用索引，但可以用 &lt;a href=&quot;http://www.pgsqldb.org/faqs.FAQ_chinese.html#4.8&quot;&gt;4.8&lt;/a&gt; 节描述的函数索引。 &lt;/li&gt;&lt;li&gt;在做 initdb 时必须采用缺省的本地设置 C locale，因为系统不可能知道在非C locale情况时下一个最大字符是什么。 在这种情况下，你可以创建一个特殊的&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;text_pattern_ops&lt;/font&gt;&lt;/code&gt;索引来用于&lt;small&gt;&lt;font size=&quot;2&quot;&gt;LIKE&lt;/font&gt;&lt;/small&gt;的索引。 &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;在8.0之前的版本中，除非要查询的数据类型和索引的数据类型相匹配，否则索引经常是未被用到，特别是对int2,int8和数值型的索引。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.7&quot;&gt;&lt;/a&gt;4.7)我如何才能看到查询优化器是怎样评估处理我的查询？&lt;/h4&gt;&lt;p&gt;参考 &lt;small&gt;&lt;font size=&quot;2&quot;&gt;EXPLAIN&lt;/font&gt;&lt;/small&gt; 手册页。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.8&quot;&gt;&lt;/a&gt;4.8)我怎样做正则表达式搜索和大小写无关的正则表达式查找？怎样利用索引进行大小写无关查找？&lt;/h4&gt;&lt;p&gt;操作符 &lt;i&gt;~ &lt;/i&gt;处理正则表达式匹配，而 &lt;i&gt;~*&lt;/i&gt; 处理大小写无关的正则表达式匹配。大写些无关的 LIKE 变种成为 ILIKE。 &lt;/p&gt;&lt;p&gt;大小写无关的等式比较通常写做： &lt;/p&gt;&lt;pre&gt;    SELECT *
    FROM tab
    WHERE lower(col) = 'abc';
&lt;/pre&gt;&lt;p&gt;这样将不会使用标准的索引。但是可以创建一个可被利用的函数索引: &lt;/p&gt;&lt;pre&gt;    CREATE INDEX tabindex ON tab (lower(col));
&lt;/pre&gt;&lt;h4&gt;&lt;a name=&quot;4.9&quot;&gt;&lt;/a&gt;4.9)在一个查询里，我怎样检测一个字段是否为 &lt;i&gt;NULL&lt;/i&gt; ？我如何才能准确排序而不论某字段是否含 &lt;i&gt;NULL&lt;/i&gt; 值？&lt;/h4&gt;&lt;p&gt;用 &lt;small&gt;&lt;font size=&quot;2&quot;&gt;IS NULL&lt;/font&gt;&lt;/small&gt; 和 &lt;small&gt;&lt;font size=&quot;2&quot;&gt;IS NOT NULL&lt;/font&gt;&lt;/small&gt; 测试这个字段，具体方法如下： &lt;/p&gt;&lt;pre&gt;   SELECT *
   FROM tab
   WHERE col IS NULL;

&lt;/pre&gt;&lt;p&gt;为了能对含 &lt;small&gt;&lt;font size=&quot;2&quot;&gt;NULL&lt;/font&gt;&lt;/small&gt;字段排序，可在 &lt;small&gt;&lt;font size=&quot;2&quot;&gt;ORDER BY&lt;/font&gt;&lt;/small&gt; 条件中使用 &lt;small&gt;&lt;font size=&quot;2&quot;&gt;IS NULL&lt;/font&gt;&lt;/small&gt;和 &lt;small&gt;&lt;font size=&quot;2&quot;&gt;IS NOT NULL&lt;/font&gt;&lt;/small&gt; 修饰符，条件为真 &lt;i&gt;true&lt;/i&gt; 将比条件为假&lt;i&gt;false&lt;/i&gt; 排在前面，下面的例子就会将含 NULL 的记录排在结果的上面部分： &lt;/p&gt;&lt;pre&gt;   SELECT *
   FROM tab
   ORDER BY (col IS NOT NULL)

&lt;/pre&gt;&lt;h4&gt;&lt;a name=&quot;4.10&quot;&gt;&lt;/a&gt;4.10)各种字符类型之间有什么不同？&lt;/h4&gt;&lt;blockquote&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;内部名称&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;VARCHAR(n)&lt;/td&gt;&lt;td&gt;varchar&lt;/td&gt;&lt;td&gt;指定了最大长度，变长字符串，不足定义长度的部分不补齐&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CHAR(n)&lt;/td&gt;&lt;td&gt;bpchar&lt;/td&gt;&lt;td&gt;定长字符串，实际数据不足定义长度时，以空格补齐&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TEXT&lt;/td&gt;&lt;td&gt;text&lt;/td&gt;&lt;td&gt;没有特别的上限限制（仅受行的最大长度限制）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;BYTEA&lt;/td&gt;&lt;td&gt;bytea&lt;/td&gt;&lt;td&gt;变长字节序列（使用NULL也是允许的）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;quot;char&amp;quot;&lt;/td&gt;&lt;td&gt;char&lt;/td&gt;&lt;td&gt;一个字符&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/blockquote&gt;&lt;p&gt;在系统表和在一些错误信息里你将看到内部名称。 &lt;/p&gt;&lt;p&gt;上面所列的前四种类型是&amp;quot;varlena&amp;quot;（变长）类型（也就是说，开头的四个字节是长度，后面才是数据）。 于是实际占用的空间比声明的大小要多一些。 然而这些类型都可以被压缩存储，也可以用 TOAST 脱机存储，因此磁盘空间也可能比预想的要少。 &lt;/p&gt;&lt;p&gt;&lt;small&gt;&lt;font size=&quot;2&quot;&gt;VARCHAR(n)&lt;/font&gt;&lt;/small&gt; 在存储限制了最大长度的变长字符串是最好的。 &lt;small&gt;&lt;font size=&quot;2&quot;&gt;TEXT&lt;/font&gt;&lt;/small&gt; 适用于存储最大可达 1G左右但未定义限制长度的字符串。 &lt;/p&gt;&lt;p&gt;&lt;small&gt;&lt;font size=&quot;2&quot;&gt;CHAR(n)&lt;/font&gt;&lt;/small&gt; 最适合于存储长度相同的字符串。 &lt;small&gt;&lt;font size=&quot;2&quot;&gt;CHAR(n)&lt;/font&gt;&lt;/small&gt;会根据所给定的字段长度以空格补足（不足的字段内容）， 而 &lt;small&gt;&lt;font size=&quot;2&quot;&gt;VARCHAR(n)&lt;/font&gt;&lt;/small&gt; 只存储所给定的数据内容。 &lt;small&gt;&lt;font size=&quot;2&quot;&gt;BYTEA&lt;/font&gt;&lt;/small&gt; 用于存储二进制数据，尤其是包含 NULL 字节的值。这些类型具有相似的性能特性。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.11.1&quot;&gt;&lt;/a&gt;4.11.1)我怎样创建一个序列号/自动递增的字段？&lt;/h4&gt;&lt;p&gt;PostgreSQL 支持 SERIAL 数据类型。它在字段上自动创建一个序列和索引。例如： &lt;/p&gt;&lt;pre&gt;	CREATE TABLE person ( 
		id   SERIAL, 
		name TEXT 
	);
&lt;/pre&gt;&lt;p&gt;会自动转换为： &lt;/p&gt;&lt;pre&gt;	CREATE SEQUENCE person_id_seq;
	CREATE TABLE person ( 
		id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),
		name TEXT
	);
&lt;/pre&gt;&lt;p&gt;参考 create_sequence 手册页获取关于序列的更多信息。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.11.2&quot;&gt;&lt;/a&gt;4.11.2)我如何获得一个插入的序列号的值？&lt;/h4&gt;&lt;p&gt;一种方法是在插入之前先用函数 nextval() 从序列对象里检索出下一个 SERIAL 值，然后再显式插入。使用 &lt;a href=&quot;http://www.pgsqldb.org/faqs.FAQ_chinese.html#4.11.1&quot;&gt;4.11.1&lt;/a&gt; 里的例表，可用伪码这样描述： &lt;/p&gt;&lt;pre&gt;	new_id = execute(&amp;quot;SELECT nextval('person_id_seq')&amp;quot;);
	execute(&amp;quot;INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')&amp;quot;);

&lt;/pre&gt;&lt;p&gt;这样还能在其他查询中使用存放在 new_id 里的新值（例如，作为 person 表的外键）。 注意自动创建的 SEQUENCE 对象的名称将会是 &amp;lt;&lt;i&gt;table&lt;/i&gt;&amp;gt;_&amp;lt;&lt;i&gt;serialcolumn&lt;/i&gt;&amp;gt;_&lt;i&gt;seq&lt;/i&gt;， 这里 table 和 serialcolumn 分别是你的表的名称和你的 SERIAL 字段的名称。 &lt;/p&gt;&lt;p&gt;类似的，在 SERIAL 对象缺省插入后你可以用函数 currval() 检索刚赋值的 SERIAL 值，例如： &lt;/p&gt;&lt;pre&gt;	execute(&amp;quot;INSERT INTO person (name) VALUES ('Blaise Pascal')&amp;quot;);
	new_id = execute(&amp;quot;SELECT currval('person_id_seq')&amp;quot;);
&lt;/pre&gt;&lt;h4&gt;&lt;a name=&quot;4.11.3&quot;&gt;&lt;/a&gt;4.11.3)使用 &lt;i&gt;currval()&lt;/i&gt; 会导致和其他用户的冲突情况（race condition）吗？&lt;/h4&gt;&lt;p&gt;不会。&lt;i&gt;currval()&lt;/i&gt; 返回的是你本次会话进程所赋的值而不是所有用户的当前值。&lt;br /&gt;&lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.11.4&quot;&gt;&lt;/a&gt;4.11.4)为什么不在事务异常中止后重用序列号呢？为什么在序列号字段的取值中存在间断呢？&lt;/h4&gt;&lt;p&gt;为了提高并发性，序列号在需要的时候赋予正在运行的事务，并且在事务结束之前不进行锁定， 这就会导致异常中止的事务后，序列号会出现间隔。 &lt;/p&gt;&lt;h4&gt;&lt;br /&gt;&lt;a name=&quot;4.12&quot;&gt;&lt;/a&gt;4.12)什么是 &lt;small&gt;OID&lt;/small&gt; ？什么是 &lt;small&gt;CTID&lt;/small&gt; ？&lt;/h4&gt;&lt;p&gt;PostgreSQL 里创建的每一行记录都会获得一个唯一的&lt;small&gt;&lt;font size=&quot;2&quot;&gt;OID&lt;/font&gt;&lt;/small&gt;，除非在创建表时使用&lt;small&gt;&lt;font size=&quot;2&quot;&gt;WITHOUT OIDS&lt;/font&gt;&lt;/small&gt;选项。 &lt;small&gt;&lt;font size=&quot;2&quot;&gt;OID&lt;/font&gt;&lt;/small&gt;创建时会自动生成一个4字节的整数，所有 OID 在整个 PostgreSQL 中均是唯一的。 然而，它在超过40亿时将溢出， &lt;small&gt;&lt;font size=&quot;2&quot;&gt;OID&lt;/font&gt;&lt;/small&gt;此后会出现重复。PostgreSQL 在它的内部系统表里使用 OID 在表之间建立联系。 &lt;/p&gt;&lt;p&gt;在用户的数据表中，最好是使用&lt;small&gt;&lt;font size=&quot;2&quot;&gt;SERIAl&lt;/font&gt;&lt;/small&gt;来代替&lt;small&gt;&lt;font size=&quot;2&quot;&gt;OID&lt;/font&gt;&lt;/small&gt; 因为&lt;small&gt;&lt;font size=&quot;2&quot;&gt;SERIAL&lt;/font&gt;&lt;/small&gt;只是保证在单个表中数据是唯一的，这样它溢出的可能性就非常小了， &lt;small&gt;&lt;font size=&quot;2&quot;&gt;SERIAL8&lt;/font&gt;&lt;/small&gt;可用来保存8字节的序列号字段。 &lt;/p&gt;&lt;p&gt;&lt;small&gt;&lt;font size=&quot;2&quot;&gt;CTID&lt;/font&gt;&lt;/small&gt; 用于标识带着数据块（地址）和（块内）偏移的特定的物理行。 &lt;small&gt;&lt;font size=&quot;2&quot;&gt;CTID&lt;/font&gt;&lt;/small&gt; 在记录被更改或重载后发生改变。索引入口使用它们指向物理行。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.13&quot;&gt;&lt;/a&gt;4.13)为什么我收到错误信息“&lt;i&gt;ERROR: Memory exhausted in AllocSetAlloc()&lt;/i&gt;”？&lt;/h4&gt;&lt;p&gt;这很可能是系统的虚拟内存用光了，或者内核对某些资源有较低的限制值。在启动 postmaster 之前试试下面的命令： &lt;/p&gt;&lt;pre&gt;	ulimit -d 262144
	limit datasize 256m
&lt;/pre&gt;&lt;p&gt;取决于你用的 shell，上面命令只有一条能成功，但是它将把你的进程数据段限制设得比较高， 因而也许能让查询完成。这条命令应用于当前进程，以及所有在这条命令运行后创建的子进程。 如果你是在运行SQL客户端时因为后台返回了太多的数据而出现问题，请在运行客户端之前执行上述命令。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.14&quot;&gt;&lt;/a&gt;4.14)我如何才能知道所运行的 PostgreSQL 的版本？&lt;/h4&gt;&lt;p&gt;从 psql 里，输入 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;SELECT version();&lt;/font&gt;&lt;/code&gt;指令。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.15&quot;&gt;&lt;/a&gt;4.15)我如何创建一个缺省值是当前时间的字段？&lt;/h4&gt;&lt;p&gt;使用 CURRENT_TIMESTAMP： &lt;/p&gt;&lt;pre&gt;	CREATE TABLE test (x int, modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
&lt;/pre&gt;&lt;h4&gt;&lt;a name=&quot;4.16&quot;&gt;&lt;/a&gt;4.16)我怎样进行 outer join （外连接）？&lt;/h4&gt;&lt;p&gt;PostgreSQL 采用标准的 SQL 语法支持外连接。这里是两个例子： &lt;/p&gt;&lt;pre&gt;	SELECT *
	FROM t1 LEFT OUTER JOIN t2 ON (t1.col = t2.col);

&lt;/pre&gt;&lt;p&gt;或是&lt;/p&gt;&lt;pre&gt;	SELECT *
	FROM t1 LEFT OUTER JOIN t2 USING (col);
&lt;/pre&gt;&lt;p&gt;这两个等价的查询在 t1.col 和 t2.col 上做连接，并且返回 t1 中所有未连接的行（那些在 t2 中没有匹配的行）。 右[外]连接(RIGHT OUTER JOIN)将返回 t2 中未连接的行。 完全外连接（FULL OUTER JOIN）将返回 t1 和 t2 中未连接的行。 关键字 OUTER 在左[外]连接、右[外]连接和完全[外]连接中是可选的，普通连接被称为内连接（INNER JOIN）。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.17&quot;&gt;&lt;/a&gt;4.17)如何使用涉及多个数据库的查询？&lt;/h4&gt;&lt;p&gt;没有办法查询当前数据库之外的数据库。 因为 PostgreSQL 要加载与数据库相关的系统目录（系统表），因此跨数据库的查询如何执行是不定的。 &lt;/p&gt;&lt;p&gt;附加增值模块contrib/dblink允许采用函数调用实现跨库查询。当然用户也可以同时连接到不同的数据库执行查询然后在客户端合并结果。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.18&quot;&gt;&lt;/a&gt;4.18)如何让函数返回多行或多列？&lt;/h4&gt;&lt;p&gt;在函数中返回数据记录集的功能是很容易使用的，详情参见： &lt;a href=&quot;http://techdocs.postgresql.org/guides/SetReturningFunctions&quot;&gt;http://techdocs.postgresql.org/guides/SetReturningFunctions&lt;/a&gt; &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.19&quot;&gt;&lt;/a&gt;4.19)为什么我在使用PL/PgSQL函数存取临时表时会收到错误信息“relation with OID ##### does not exist”？&lt;/h4&gt;&lt;p&gt;PL/PgSQL会缓存函数的内容，由此带来的一个不好的副作用是若一个 PL/PgSQL 函数访问了一个临时表，然后该表被删除并重建了，则再次调用该函数将失败， 因为缓存的函数内容仍然指向旧的临时表。解决的方法是在 PL/PgSQL 中用&lt;small&gt;&lt;font size=&quot;2&quot;&gt;EXECUTE&lt;/font&gt;&lt;/small&gt; 对临时表进行访问。这样会保证查询在执行前总会被重新解析。 &lt;/p&gt;&lt;h4&gt;&lt;a name=&quot;4.27&quot;&gt;&lt;/a&gt;4.27)目前有哪些数据复制方案可用？&lt;/h4&gt;&lt;p&gt;“复制”只是一个术语，有好几种复制技术可使用，每种都有优点和缺点： &lt;/p&gt;&lt;p&gt;主/从复制方式是允许一个主服务器接受读/写的申请，而多个从服务器只能接受读/&lt;small&gt;&lt;font size=&quot;2&quot;&gt;SELECT&lt;/font&gt;&lt;/small&gt;查询的申请， 目前最流行且是免费的主/从 PostgreSQL复制方案是 &lt;a href=&quot;http://gborg.postgresql.org/project/slony1/projdisplay.php&quot;&gt;Slony-I &lt;/a&gt;。 &lt;/p&gt;&lt;p&gt;多个主服务器的复制方式允许将读/写的申请发送给多台的计算机，这种方式由于需要在多台服务器之间同步数据变动 可能会带来较严重的性能损失，&lt;a href=&quot;http://pgfoundry.org/projects/pgcluster/&quot;&gt;Pgcluster&lt;/a&gt;是目前这种方案 中最好的，而且还可以免费下载。 &lt;/p&gt;&lt;p&gt;也有一些商业需付费和基于硬件的数据复制方案，支持上述各种复制模型。&lt;/p&gt;</description><category>数据库</category><pubDate>Thu, 30 Nov 2006 11:19:09 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497996.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497996.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235212/1237942</fs:itemid></item><item><title>译:DOM2中的高级事件处理</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235213/1237942/1/item.html</link><description>&lt;p dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;4&quot;&gt;&lt;strong&gt;17.2. DOM2中的高级事件处理(Advanced Event Handling with DOM Level 2)&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 迄今为止,在本章中出现的事件处理技术都是DOM0级的一部分,所有支持JavaScript的浏览器都支持DOM0的API.DOM2定义了高级的事件处理API,和DOM0的API相比,有着令人瞩目的不同(而且功能更强大).虽然DOM2标准并没有把已有的API收入其中,但是DOM0级API也没有被去除.对于基本的事件处理任务,你会觉得使用这些简单的API更自由一些.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DOM2事件模型被除了IE以外的所有浏览器支持.&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;17.2.1. 事件传播(Event Propagation)&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在DOM0级事件模型中,浏览器分派事件给发生事件的文档元素.如果那个对象有相应的事件处理程序,那么就运行该程序.再没有更多的事情发生了.情况在DOM2中就是复杂得多.在DOM2高级事件模型中,当一个文档元素(被叫做事件的目标(target)对象)触发了一个事件,这个目标对象的事件处理程序被触发,除此之外,该目标对象的每一个祖辈元素都有一个或者两个机会去处理该事件.事件传播的过程包括三个阶段.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 首先,在捕获阶段(capturing phase),事件是从文档对象(Document object)开始,沿着文档树向下一直到目标对象传播的.如果任何目标对象的祖辈(不包括目标对象本身)也有一些指定注册的捕获事件的处理程序,在事件传播的这个阶段(捕获阶段)将运行它们.(一会儿你就会看到如何注册正常事件处理程序和捕获事件处理程序.)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 事件传播的下一个阶段发生在目标对象自身:所有注册到目标对象的对应事件处理程序都被运行.这和DOM0提供的事件模型是相似的.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 事件传播的第三阶段是冒泡阶段,或者说按文档层次倒序的,从目标元素到文档对象(Document object).尽管所有的事件都受事件传播的捕获阶段(capturing phase)的影响,但是,并不是所有类型的事件都冒泡:例如,除了被定义了提交事件(submit)的form以外,把这个事件向上传播到文档元素是没有任何意义的.另一方面,像mousedown这样的一般事件对文档中的其它元素是有意义的,所以这些事件才沿着文档层次向上冒泡,并且触发目标元素的祖辈元素的相应事件的处理程序.通常情况下,原始的输入事件冒泡,而高级的语义事件不会.(稍候在本章中出现的表17-3是一个权威的列表,它指出哪些事件是冒泡的,哪些不是.)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在事件传播期间,每个事件的处理程序都可以阻止事件的进一步传播,只需通过调用表现这个事件的事件对象的stopPropagation( )方法就可以.事件对象和stopPropagation( )方法一会儿再进一步讨论.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一些事件会使浏览器执行一个与事件相关联的默认行为.例如,当点击一个链接(&amp;lt;a&amp;gt; tag)的时候,浏览器的默认行为是转向超链接.像这样的默认行为,只有事件传播的三个阶段都完成了才会执行,在事件传播过程中调用的任何处理程序都能阻止默认行为的发生,调用事件对象的preventDefault( )方法就可以了.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 尽管这种事件传播机制似乎让人难以理解,但是它有助于你集中你的事件处理代码.DOM1指出了所有的文档元素,还指出了在那些元素上允许发生的事件(如mouseover事件).这就意味着,与旧的DOM0事件模型相比,DOM1是在很多很多的地方注册事件处理程序.假设你想在鼠标经过每一个文档中的段落元素(&amp;lt;P&amp;gt;)时触发一个事件处理程序.除了在所有的段落标签(&amp;lt;p&amp;gt;tag)注册一个onmouseover事件处理程序之外,取而代之的办法是为文档对象(Document object)注册一个单独的事件处理程序,然后,或者在捕获阶段,或者在冒泡阶段,处理这些事件.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 事件传播还有一个很重要的细节.在DOM0模型中,你只能为一个特定的对象的一个特定类型的事件注册一个处理程序.而在DOM2模型中,你可以为一个特定对象的一个特定类型事件注册任意数量的事件处理程序.这也适用于事件传播时,在捕获阶段或者冒泡阶段,事件对象的祖辈的处理函数被调用的情况.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;17.2.2. 事件处理程序的注册(Event Handler Registration)&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在DOM0的API中,你通过在HTML中设置属性(attribute)或者在JavaScript中设置一个对象的属性(property)的方法注册事件.而在DOM2模型中,你通过调用那个对象的addEventListener( )方法注册事件处理程序.(DOM标准在这个API里使用了术语listener,但是在本文中,我将继续使用这个术语的同义词:handler.)这个方法有三个参数.第一个是被注册的事件类型.事件类型是一个字符串,包含小写的,去掉开头的&amp;quot;on&amp;quot;的HTML中的事件属性名.如果你在DOM0里使用HTML属性onmousedown,你在DOM2中就是使用字符串&amp;quot;mousedown&amp;quot;.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 第二个参数是指定类型的事件触发的时候应该调用的监听函数.在你的函数被调用的时候,传入了唯一的一个参数:Event对象.这个对象包含了事件的细节信息(如:哪个鼠标键被按下)和一些方法,如:stopPropagation( ).在本章后面将深入讨论事件接口和它的子接口.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addEventListener( )函数的最后一个参数是一个布尔值.如果为true,指定的事件处理程序在事件传播的捕获阶段将捕获事件.如果是false,事件处理程序就是一个正常的事件处理程序了,只有在事件直接发生在该对象上或者发生在子代对象上向上冒泡到达这个元素时,处理程序才被调用.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;举个例子,你可以像下面这样使用addEventListener( )方法给一个form元素注册一个提交事件(submit):&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;document.myform.addEventListener(&amp;quot;submit&amp;quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function(e) {return validate(e.target); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; false);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;如果你想捕获发生在一个特定名字的div中的鼠标按下(mousedown)事件,你可以这样使用addEventListener( ):&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;var mydiv = document.getElementById(&amp;quot;mydiv&amp;quot;);&lt;br /&gt;mydiv.addEventListener(&amp;quot;mousedown&amp;quot;, handleMouseDown, true);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;注意,这些例子假设你已经在你的JavaScript代码中定义了函数名为validate( )和handleMouseDown( )的函数.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;用addEventListener( )函数注册的事件监听程序运行在它们被定义的作用域.它们并不是在参数的作用域链中被调用的.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 因为在DOM2中通过调用一个方法来给对象添加事件监听器,而不是通过设置HTML属性或者JavaScript属性的方法,所以,你可以给一个指定对象的一个特定事件注册多于一个的事件监听程序.如果你通过调用addEventListener( )函数为同一对象的同一事件注册多个监听程序,当那个对象上那个类型的事件发生的时候(或者是向上冒泡,或者是捕获的),所有的处理程序都被调用.重点理解一下:DOM标准并没有保证一个对象的所有监听函数被调用的顺序,因此,你不应该依赖于函数按照被注册的顺序被执行(事实上是根本不按顺序执行).还要注意的是,如果你多次注册相同的监听程序给同一个元素,只有第一次注册的有效,其余的被忽略.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 为什么你想要在同一个对象的同一个事件上注册多个事件监听程序呢?因为这有助于将你的软件模块化.假设,你写了一个可重用的JavaScript代码模块,它使用图像上的mouseover事件执行图片轮换.现在再假设你有另一个模块也想使用mouseover事件来显示一些在HTML弹出窗体或者工具提示(Tool tip)上的附加信息.在DOM0的API中,你不得不把这两段代码合并成一个,这样才能共用一个图片对象的onmouseover属性.另一方面,在DOM2的API中,每一个模块都可以注册它需要的事件监听程序,而不必管其它的模块.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; removeEventListener( )和addEventListener( )是一对方法,它需要与addEventListener( )同样的三个参数,但它的功能是从一个对象删除一个事件监听函数,而不是添加.它常用于临时注册一个事件监听函数,然后很快就删除这个函数.例如,你得到一个mousedown事件的时候,想为mousemove和mouseup事件注册临时的捕获事件监听函数,这样就可以知道,是否用户拖拽了鼠标.然后在mouseup事件发生的时候,解除这个注册的监听程序.在这种情况下,事件监听器的删除代码如下:&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;document.removeEventListener(&amp;quot;mousemove&amp;quot;, handleMouseMove, true);&lt;br /&gt;document.removeEventListener(&amp;quot;mouseup&amp;quot;, handleMouseUp, true);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addEventListener( )方法和removeEventListener( )方法都被定义在事件目标接口中(the EventTarget interface),在支持DOM2事件模型的Web浏览器中,元素和文档节点实现了这个接口,并且提供了这些事件注册方法.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;1&quot;&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;[*] 从技术上来讲,DOM指出在文档(document)中的所有节点(包括文本节点:Text nodes)都实现了这个事件对象接口.然后事实上,web浏览器仅在元素(Element)和文档节点(Document nodes)上支持事件监听器的注册,还有窗口(Window)对象,尽管这已经超出了DOM的范围.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;17.2.3. addEventListener( )和this关键字(addEventListener( ) and the this Keyword)&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在原来的DOM0级事件模型中,当一个函数被注册给一个文档元素的某个事件监听程序时,它变成了那个文档元素的一个方法.当这个事件监听程序被调用时,它作为这个元素的一个方法被调用,在函数的内部,this关键字引用当前发生事件的元素.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DOM2是用一种与语言无关的方法写的,它指出监听器(listeners)是对象,而不是简单的函数.绑定了DOM的JavaScript用Javascript函数事件监听器取代对JavaScript对象使用的需求.( The JavaScript binding of the DOM makes JavaScript functions event handlers instead of requiring the use of a JavaScript object.)不幸的是,这个绑定关系并没有实际的指出监听函数如何被调用,也没有指出this关键字的值.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 且不去考虑标准的不足,所有已知的实现都调用用addEventListener( )方法注册的处理程序,就像这些处理程序是目标对象的方法一样.也就是说,当监听程序被调用的时候,this关键字引用这个监听程序被注册的那个对象.如果你宁愿不依赖这种未指定的行为,你可以使用传入监听程序的事件对象(Event object)的currentTarget属性.在本章稍候的讨论中你会看到,currentTarget属性引用事件监听程序被注册的对象.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;17.2.4. 把对象(Objects)注册为事件监听器(Registering Objects as Event Handlers)&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; addEventListener( )允许你注册一个事件监听函数.对于面向对象编程,你可能更喜欢定义一个客户端对象的方法作为事件监听程序,然后把它们作为那个对象的方法进行调用.对于Java程序员,DOM标准允许这样做:事件监听程序可以是实现了EvnentListener接口并且有一个名为handleEvent()的方法的对象.在Java中,当你注册一个事件监听程序时,你给addEventListener( )传入一个对象,而不是一个函数.简单的说,绑定了DOM API的JavaScript不需要你去实现EventListener接口,相反的,允许你直接给addEventListener( )传递一个函数引用.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;然而,如果你在写一个面向对象的JavaScript程序,并且更喜欢用对象作为事件监听程序,你可以用一个像下边这样的函数来注册:&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;function registerObjectEventHandler(element, eventtype, listener, captures) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; element.addEventListener(eventtype,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function(event) { listener.handleEvent(event); }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; captures);&lt;br /&gt;}&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 只要一个对象定义了handleEvent( )方法,就可以用这个函数把该对象注册为一个事件监听程序.那个方法作为监听对象的方法被调用,this关键字引用这个监听对象,而不是产生事件的文档元素.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 尽管这不是DOM标准的一部分,Firefox(和其它基于Mozilla codebase的浏览器)允许把定义了handleEvent()方法的事件监听对象直接传递给addEventListener()方法,来代替函数.对于这些浏览器,就没有必要定义一个像刚才展示的注册函数了.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;17.2.5. 事件模型和事件类型(Event Modules and Event Types)&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如我前面所说,DOM2是模块化的,所以,一个实现可以支持其中的一部分而忽略其它对其它部分的支持.事件API(Events API)就是这样一个模块.你可以像这样来测试一个浏览器是否支持这个模块:&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;document.implementation.hasFeature(&amp;quot;Events&amp;quot;, &amp;quot;2.0&amp;quot;)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 然而,事件模块只包含用于基本事件监听结构的API.子模块提供对特定类型事件的支持.每个子模块都提供对一类相关事件类型的支持,并且定义了传入事件监听程序的事件类型.例如,名为MouseEvents的子模块提供了mousedown, mouseup, click等相关事件的类型.它也定义了MouseEvent接口.实现了那个接口的对象,为任何一个被这个模块支持的事件类型,被传入事件监听程序.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 表17-2列出了每一个事件模块,它定义的接口,和被它支持的事件类型.注意,DOM2并没有把任何键盘事件标准化,因此这里没有列出键盘事件模块.然而,当前的浏览器都支持键盘事件,在本章的后面,你会了解的更多一些.(此处省略几句和MutationEvents模块相关的描述)&lt;/font&gt; &lt;/p&gt;&lt;p /&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;4&quot; rules=&quot;all&quot; width=&quot;100%&quot; frame=&quot;hsides&quot;&gt;&lt;caption&gt;&lt;h5 class=&quot;docTableTitle&quot;&gt;Table 17-2. Event modules, interfaces, and types&lt;/h5&gt;&lt;/caption&gt;&lt;colgroup span=&quot;3&quot;&gt;&lt;col /&gt;&lt;col /&gt;&lt;col /&gt;&lt;/colgroup&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class=&quot;thead&quot; scope=&quot;col&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Module name&lt;/p&gt;&lt;/th&gt;&lt;th class=&quot;thead&quot; scope=&quot;col&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event interface&lt;/p&gt;&lt;/th&gt;&lt;th class=&quot;thead&quot; scope=&quot;col&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event types&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;HTMLEvents&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;abort, blur, change, error, focus, load, reset, resize, scroll, select, submit, unload&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;MouseEvents&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;MouseEvent&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;click, mousedown, mousemove, mouseout, mouseover, mouseup&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;UIEvents&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;UIEvent&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;DOMActivate, DOMFocusIn, DOMFocusOut&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如你在表17-2中所见,HTMLEvents和MouseEvents模块定义的事件类型和DOM0的事件模块是非常相似的.UIEvents模块定义了事件类型,这和被HTML表单元素支持的focus,blur和click事件很相似,但更通用的,所以,他们能被任何可以接受焦点或者被激活的文档元素产生.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如前所述,当一个事件发生的时候,它的监听程序被传入一个实现了那个类型事件的事件接口对象.这个对象的属性提供了对事件监听程序可能有用的细节信息.表17-3再一次列出标准的事件,但这次是按事件类型组织的,而不是事件模型.对于每个事件类型,该表都指出传入它的监听程序的事件对象的种类,是否这个事件有一个可以用preventDefault()方法阻止发生的默认行为.对于HTMLEvents模块中的事件,表格中的第五列指出哪些HTML元素可以产生该事件.对于所有其它的事件类型,第五列指出事件对象的哪些属性包含了有意义的事件细节信息.注意,在这一列中列出的属性,不包括被基本事件接口定义的对所有事件类型都有意义的属性.&lt;/font&gt; &lt;/p&gt;&lt;p /&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;4&quot; rules=&quot;all&quot; width=&quot;100%&quot; frame=&quot;hsides&quot;&gt;&lt;caption&gt;&lt;h5 class=&quot;docTableTitle&quot;&gt;Table 17-3. Event types&lt;/h5&gt;&lt;/caption&gt;&lt;colgroup span=&quot;5&quot;&gt;&lt;col /&gt;&lt;col /&gt;&lt;col /&gt;&lt;col /&gt;&lt;col /&gt;&lt;/colgroup&gt;&lt;thead&gt;&lt;tr&gt;&lt;th class=&quot;thead&quot; scope=&quot;col&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event type&lt;/p&gt;&lt;/th&gt;&lt;th class=&quot;thead&quot; scope=&quot;col&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Interface&lt;/p&gt;&lt;/th&gt;&lt;th class=&quot;thead&quot; scope=&quot;col&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;B&lt;/p&gt;&lt;/th&gt;&lt;th class=&quot;thead&quot; scope=&quot;col&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;C&lt;/p&gt;&lt;/th&gt;&lt;th class=&quot;thead&quot; scope=&quot;col&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Supported by/detail properties&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;abort&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;img&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;object&amp;gt;&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;blur&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;a&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;area&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;button&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;input&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;label&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;select&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;textarea&amp;gt;&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;change&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;input&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;select&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;textarea&amp;gt;&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;click&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;MouseEvent&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;screenX&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;screenY&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;clientX&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;clientY&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;altKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;ctrlKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;shiftKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;metaKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;button&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;detail&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;error&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;body&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;frameset&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;img&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;object&amp;gt;&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;focus&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;a&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;area&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;button&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;input&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;label&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;select&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;textarea&amp;gt;&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;load&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;body&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;frameset&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;iframe&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;img&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;object&amp;gt;&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;mousedown&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;MouseEvent&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;screenX&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;screenY&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;clientX&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;clientY&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;altKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;ctrlKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;shiftKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;metaKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;button&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;detail&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;mousemove&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;MouseEvent&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;screenX&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;screenY&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;clientX&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;clientY&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;altKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;ctrlKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;shiftKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;metaKey&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;mouseout&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;MouseEvent&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;screenX&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;screenY&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;clientX&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;clientY&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;altKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;ctrlKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;shiftKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;metaKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;relatedTarget&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;mouseover&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;MouseEvent&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;screenX&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;screenY&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;clientX&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;clientY&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;altKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;ctrlKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;shiftKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;metaKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;relatedTarget&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;mouseup&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;MouseEvent&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;screenX&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;screenY&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;clientX&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;clientY&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;altKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;ctrlKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;shiftKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;metaKey&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;button&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;detail&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;reset&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;form&amp;gt;&lt;/font&gt;&lt;/tt&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;resize&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;body&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;frameset&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;iframe&amp;gt;&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;scroll&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;body&amp;gt;&lt;/font&gt;&lt;/tt&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;select&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;input&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;textarea&amp;gt;&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;submit&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;form&amp;gt;&lt;/font&gt;&lt;/tt&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;unload&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;Event&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;body&amp;gt;&lt;/font&gt;&lt;/tt&gt;, &lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;&amp;lt;frameset&amp;gt;&lt;/font&gt;&lt;/tt&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;DOMActivate&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;UIEvent&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;&lt;tt&gt;&lt;font face=&quot;新宋体&quot;&gt;detail&lt;/font&gt;&lt;/tt&gt; &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;DOMFocusIn&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;UIEvent&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;none&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;DOMFocusOut&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;UIEvent&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;yes&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;no&lt;/p&gt;&lt;/td&gt;&lt;td class=&quot;docTableCell&quot; align=&quot;left&quot;&gt;&lt;p class=&quot;docText&quot;&gt;none&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 被DOM0和DOM2支持的事件类型大体相同(UIEvents除外).DOM2标准添加了对abort,error,resize和scroll事件类型的支持,这些不是HTML 4的标准,但它不支持HTML 4标准中的键盘事件和双击事件.(取而代之的是,传入click事件处理程序的对象的细节属性指出了发生的连续点击的次数.)&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;17.2.6. 事件接口和事件细节(Event Interfaces and Event Details)&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 一个事件发生的时候,DOM2提供了关于这个事件的其它细节(例如何时何地发生的),这些信息作为传入到事件监听程序的对象的属性出现.每一个事件模块都有一个相关联的事件接口,该接口指出和那个类型事件相关的细节.表17-2列出了三种不同的事件模块和三种不同的事件接口.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 事实上这三个接口是互相关联的,并且形成了一个层次关系.事件接口是这个层次的根层;所有的事件对象都实现了它大部分基本的事件接口.UIEvent是事件接口的子接口:任何实现了UIEvent接口的事件对象都实现了Event接口的属性和方法.MouseEvent接口又是UIEvent的子接口.举个例子,这就是说,传给点击事件处理程序的事件对象实现了在MouseEvent, UIEvent, 和Event接口中定义的所有属性和方法.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;接下来的部分介绍的是事件接口,并且着重讲最重要的属性和方法.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;strong&gt;17.2.6.1. 事件(Event)&lt;/strong&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在HTMLEvents模块中定义的事件类型使用Event接口.所有其它的事件类型都使用Event的子接口,子接口被所有的事件对象实现,并且提供了应用于那个事件类型的细节信息.事件接口定义了如下属性(注意,这些属性和所有事件子接口的属性都是只读的):&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;type&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 发生的事件类型.这个属性的值是事件类型的名字,它和用于注册事件处理程序时使用的字符串是一样的(如: click 或者 mouseover).&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;target&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 事件发生的节点,可能与currentTarget不同.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;currentTarget&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正在处理事件的节点(也就是正在运行的事件处理程序所属的节点).如果在事件被捕获或者冒泡阶段被处理,这个属性的值和target属性的值是不同的.如前所述,你可以在你的事件处理程序中用这个属性代替this关键字&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;eventPhase&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 指出正在理的是事件传播的哪一个阶段的数值.该值为三个常中之一:Event.CAPTURING_PHASE, Event.AT_TARGET, 或者 Event.BUBBLING_PHASE.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;timeStamp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 指出该事件何时发生的日期对象&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;bubbles&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 指出该事件是否沿文档树向中冒泡的布尔值.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;cancelable&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 指出该事件是否有一个可以用prevertDefault()阻止的和事件相关联的默认行为的布尔值.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 除了这七个属性以外,事件接口定义了两个方法,也都被事件对象实现了,它们是:stopPropagation( ) 和 preventDefault( ).任何事件处理程序都可以调用stopPropagation( )来阻止正在被传播的事件越过正在被处理的节点.任何事件处理程序都可以调用preventDefault( )来阻止浏览器执行与该事件关联的默认行为.在DOM2中调用preventDefault( ),就像在DOM0中返回false.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;strong&gt;17.2.6.2. 用户信息事件(UIEvent)&lt;/strong&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 用户信息事件接口是Event的子接口.它定义了被传递到DOMFocusIn, DOMFocusOut和DOMActivate的事件对象的类型.这些事件类型通常是用不到的;但对于UIEvent接口来讲,比较重要的是它是MouseEvent的父接口.除了在Event中定义的属性外,UIEvent还定义了两个属性:&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;view&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 发生的事件所在的窗口对象(Window Object:known as a view in DOM terminology).&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;detail&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 可以提供附加信息的数值.对于click,mousedown和mouseup事件,这个字段代表点击计数:1代表单击,2代表双击,3代表三击.(注意,每次点击都产生一个事件,但是如果多次点击间隔足够短,detail属性就会指示出来.也就是说,detail为2的鼠标事件要优先于detail为1的鼠标事件.)对于DOMActivate事件,这个字段值为1代表正常激活,2代表极度活跃(hyperactivation),比如双击或者Shift-Enter组合键.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;strong&gt;17.2.6.3. MouseEvent&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;MouseEvent接口继承了Event和UIEvent的属性和方法,还定义了如下附加属性:&lt;br /&gt;附加属性:&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;button&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 数值类型,指出在mousedown, mouseup或者click事件期间哪一个鼠标键改变了状态.0代表左键,1代表中键,2代表右键.只有当一个按键改变状态时,才使用这个属性;例如:不能用于报告mousemove事件发生时哪个键是被按下的.注意Netscape 6得到的值为1,2,3,而不是0,1,2.这个问题在Netscape 6.1中已经修正了.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;altKey , ctrlKey, metaKey, shiftKey&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这四个布尔值代表,当一个鼠标事件发生时,是否 Alt, Ctrl, Meta或者Shift键被按下.与button属性不同,这些按键属性对于任何鼠标事件都是有效的.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;clientX, clientY&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这两个属性指出鼠标指针的X和Y坐标,相对于浏览器窗口的客户区.注意这个坐标并没有计算文档的滚动高度或者宽度在内:如果事件发生在窗口的最上边,不管这个文档已经向下滚动了多远,clientY就是0.不幸的是,DOM2并没有提供一个标准的方法去转换这个窗口坐标为文档坐标.在除了IE以外的浏览器中,你可以加上window.pageXOffset和window.pageYOffset.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;screenX, screenY&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这两个属性指出鼠标指针相对于用户显示器的左上角的坐标.如果你打算在鼠标事件发生的地点或者附近打开一个窗口,这两个属性就有用了.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;relatedTarget&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这个属性引用一个相对于事件的target节点的节点.对于mouseover事件,它引用当鼠标经过target节点时鼠标离开的那个节点.对于mouseout事件,它引用当鼠标离开目标节点时,鼠标进入的节点.对于其它事件,这两个属性是无用的.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;font size=&quot;3&quot;&gt;&lt;strong&gt;17.2.7. 混合事件模型(Mixing Event Models)&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 到现在为止,我们讨论了传统的DOM0级事件模型,和新的标准的DOM2模型.为了向后兼容,支持DOM2模型的浏览器将继续支持DOM0级事件模型.这就意味着,你可以在一个文档里混合使用这两种事件模型.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 支持DOM2级事件模型的web浏览器总是传递一个事件对象给事件监听程序,这和用DOM0级事件模型的HTML属性或者JavaScript属性注册事件处理程序是一致的,理解这一点很重要.当事件监听程序作为一个HTML属性被定义的时候,它被暗中转换成一个函数,这个函数有一个名为event的参数.这就意味着,像这样的一个事件监听程序可以用标识符event来引用事件对象.&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DOM标准承认DOM0级事件模型继续保留使用,并指出,对待DOM0事件模型的监听程序的注册方法就像用addEventListener( )注册的一样.也就是说,如果你给一个文档元素e的onclick属性赋值为函数f(或者说设置对应的HTML中的onclick属性),它和下面这种注册方法是一样的:&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;e.addEventListener(&amp;quot;click&amp;quot;, f, false);&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;当函数f被调用的时候,传入一个事件对象作为参数,尽管这个函数是用DOM0模型注册的.&lt;/font&gt; &lt;/p&gt;</description><category>web开发</category><pubDate>Thu, 30 Nov 2006 09:32:54 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497995.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497995.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235213/1237942</fs:itemid></item><item><title>Firefox 浏览器的DOM原型扩展</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235214/1237942/1/item.html</link><description>我不想挑起IE与Firefox之间的争论，我只想说说Firefox浏览器有而IE里没有的一个功能，对DOM里的对象原型的扩展。&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在DOM里的window、document、element、event等这些对象在Firefox（或者说Mozilla核心的浏览器）里都有与之对应的原型：Window、HTMLDocument、HTMLElement、Event等，对于这些原型扩展之后，那些window、document等对象就“自动”拥有某些成员属性或者成员方法了。举个简单的例子，比如在IE里都有一个 outerHTML 属性，可以取得这些元素所有的细节信息，但是这个属性不是W3C标准属性，所以那些非IE的浏览器就不会拥有这种属性了。不过因为这个属性使用起来非常方便，我想在Firefox之类的浏览器里也使用这个属性那该怎么办呢？这里就要用到原型扩展了：&lt;/p&gt;&lt;p&gt;&amp;lt;script type=&amp;quot;text/java script&amp;quot;&amp;gt;/*&amp;lt;![CDATA[*/&lt;br /&gt;if(typeof(HTMLElement)!=&amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !window.opera)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; HTMLElement.prototype.__defineGetter__(&amp;quot;outerHTML&amp;quot;,function()&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var a=this.attributes, str=&amp;quot;&amp;lt;&amp;quot;+this.tagName, i=0;for(;i&amp;lt;a.length;i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(a[i].specified) str+=&amp;quot; &amp;quot;+a[i].name+'=&amp;quot;'+a[i].value+'&amp;quot;';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(!this.canHaveChildren) return str+&amp;quot; /&amp;gt;&amp;quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return str+&amp;quot;&amp;gt;&amp;quot;+this.innerHTML+&amp;quot;&amp;lt;/&amp;quot;+this.tagName+&amp;quot;&amp;gt;&amp;quot;;&lt;br /&gt;&amp;nbsp; });&lt;br /&gt;&amp;nbsp; HTMLElement.prototype.__defineSetter__(&amp;quot;outerHTML&amp;quot;,function(s)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var r = this.ownerDocument.createRange();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; r.setStartBefore(this);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var df = r.createContextualFragment(s);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.parentNode.replaceChild(df, this);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return s;&lt;br /&gt;&amp;nbsp; });&lt;br /&gt;&amp;nbsp; HTMLElement.prototype.__defineGetter__(&amp;quot;canHaveChildren&amp;quot;,function()&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return !/^(area|base|basefont|col|frame|hr|img|br|input|isindex|link|meta|param)$/.test(this.tagName.toLowerCase());&lt;br /&gt;&amp;nbsp; });&lt;br /&gt;}&lt;br /&gt;/*]]&amp;gt;*/&amp;lt;/script&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 加了这么一段代码之后，在Firefox浏览器里再调用 document.getElementById(&amp;quot;divId&amp;quot;).outerHTML，（读取/赋值）一切正常，这一点优势是IE系列浏览器所不具有的。这一点算是 Firefox 浏览器（Mozilla核心的浏览器）的一个亮点吧！&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 下面再写两个比较有用的扩展吧：&lt;br /&gt;&amp;lt;script type=&amp;quot;text/java script&amp;quot;&amp;gt;/*&amp;lt;![CDATA[*/&lt;br /&gt;if(!window.attachEvent &amp;amp;&amp;amp; window.addEventListener)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; Window.prototype.attachEvent = HTMLDocument.prototype.attachEvent=&lt;br /&gt;&amp;nbsp; HTMLElement.prototype.attachEvent=function(en, func, cancelBubble)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var cb = cancelBubble ? true : false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.addEventListener(en.toLowerCase().substr(2), func, cb);&lt;br /&gt;&amp;nbsp; };&lt;br /&gt;&amp;nbsp; Window.prototype.detachEvent = HTMLDocument.prototype.detachEvent=&lt;br /&gt;&amp;nbsp; HTMLElement.prototype.detachEvent=function(en, func, cancelBubble)&lt;br /&gt;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var cb = cancelBubble ? true : false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.removeEventListener(en.toLowerCase().substr(2), func, cb);&lt;br /&gt;&amp;nbsp; };&lt;br /&gt;}&lt;br /&gt;if(typeof Event!=&amp;quot;undefined&amp;quot; &amp;amp;&amp;amp; !window.opera)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; var t=Event.prototype;&lt;br /&gt;&amp;nbsp; t.__defineSetter__(&amp;quot;returnValue&amp;quot;, function(b){if(!b)this.preventDefault();&amp;nbsp; return b;});&lt;br /&gt;&amp;nbsp; t.__defineSetter__(&amp;quot;cancelBubble&amp;quot;,function(b){if(b) this.stopPropagation(); return b;});&lt;br /&gt;&amp;nbsp; t.__defineGetter__(&amp;quot;offsetX&amp;quot;, function(){return this.layerX;});&lt;br /&gt;&amp;nbsp; t.__defineGetter__(&amp;quot;offsetY&amp;quot;, function(){return this.layerY;});&lt;br /&gt;&amp;nbsp; t.__defineGetter__(&amp;quot;srcElement&amp;quot;, function(){var n=this.target; while (n.nodeType!=1)n=n.parentNode;return n;}); &lt;br /&gt;}&lt;br /&gt;/*]]&amp;gt;*/&amp;lt;/script&amp;gt;&lt;/p&gt;</description><category>web开发</category><pubDate>Wed, 29 Nov 2006 16:42:33 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497994.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497994.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235214/1237942</fs:itemid></item><item><title>js中的原型</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235215/1237942/1/item.html</link><description>&lt;p&gt;前几天发现js中的原型功能实在是太强大了&lt;/p&gt;&lt;p&gt;一。创建自己的原型&lt;/p&gt;&lt;p&gt;function Root(){&lt;/p&gt;&lt;p&gt;this.id=&amp;quot;1001&amp;quot;;//为Root类定义属性，并初始化&lt;/p&gt;&lt;p&gt;this.name=&amp;quot;this is name&amp;quot;;//为Root类定义属性，并初始化&lt;/p&gt;&lt;p&gt;this.add=function (name2){&lt;/p&gt;&lt;p&gt;this.name=this.name+name2;//为Root类添加方法&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;下面来看看如何使用原型：&lt;/p&gt;&lt;p&gt;function test(){&lt;/p&gt;&lt;p&gt;var root=new Root();//可以知道function Root()相当于java中的构造函数,也相当于java中的一个类&lt;/p&gt;&lt;p&gt;alert(root.id);//得到js对象的属性&lt;/p&gt;&lt;p&gt;alert(root.name);//得到js对象的属性&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;还有别的方式:&lt;/p&gt;&lt;pre class=&quot;programlisting&quot;&gt;Robot.prototype.hasJetpack = false;Robot.prototype.actionValue = &amp;quot;Intruders beware!&amp;quot;;Robot.prototype.doAction = function() { alert(this.actionValue); };function Robot(flying, action) {   if (flying == true)      this.hasJetpack = true;   if (action)      this.actionValue = action;}&lt;/pre&gt;&lt;p&gt;二。为已有的js数据类型加上函数&lt;/p&gt;&lt;p&gt;这是原型的另一个使用&lt;/p&gt;&lt;p&gt;String.prototype.getThirdChar = function() &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp; return this.charAt(2);&lt;br /&gt;}&lt;/p&gt;</description><category>web开发</category><pubDate>Wed, 29 Nov 2006 16:42:05 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497993.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497993.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235215/1237942</fs:itemid></item><item><title>如何得到 DOM 对象的所有属性和方法</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235216/1237942/1/item.html</link><description>&lt;p&gt;可以得到各种浏览器的DOM对象属性方法&lt;/p&gt;&lt;p&gt;&amp;lt;table id=&amp;quot;table&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;script language=&amp;quot;java script&amp;quot;&amp;gt;&lt;br /&gt;function showObject(obj) {&lt;br /&gt;&amp;nbsp;var ms = []&lt;br /&gt;&amp;nbsp;for(var m in obj) ms.push(m)&lt;br /&gt;&amp;nbsp;ms.sort()&lt;br /&gt;&amp;nbsp;var html = &amp;quot;&amp;quot;&lt;br /&gt;&amp;nbsp;for (var i in ms) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;var m = ms[i]&lt;br /&gt;&amp;nbsp;&amp;nbsp;html += m + &amp;quot;: &amp;quot; + obj[m] + &amp;quot;&amp;lt;br&amp;gt;\n&amp;quot;&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;html += &amp;quot;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;&amp;nbsp;document.write(html)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var o = document.getElementById(&amp;quot;table&amp;quot;)&lt;br /&gt;showObject(o)&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/p&gt;&lt;br /&gt;</description><category>web开发</category><pubDate>Wed, 29 Nov 2006 16:41:34 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497992.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497992.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235216/1237942</fs:itemid></item><item><title>mozilla中的event</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235217/1237942/1/item.html</link><description>1，W3C（ff）不支持windows.event，在ie下window.event作为一个全局变量，任何时刻都可以直接访问，如event.srcElement,event.x,等，但在ff下必须要定义event事件，方法如下：&lt;br /&gt;&lt;div class=&quot;code&quot;&gt;&lt;br /&gt;function getEvent(evt){&lt;br /&gt;&amp;nbsp; &amp;nbsp; ev=evt||window.event；&lt;br /&gt;//在ie下由于获取不到evt的内容所以将window.event赋给ev，在ff下，浏览器可以通过外部参数evt获取evt，因此将evt赋给ev&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;这样就可以ev变量使用event事件了。&lt;br /&gt;&lt;br /&gt;2，W3C(ff)的event不存在srcElement属性，等同于srcElement的属性为target,因此在ff下要用event.target代替ie下的event.srcElement。&lt;br /&gt;&lt;br /&gt;3，在ie下获取鼠标的相对于窗体坐标用event.x/event.y,event.clientX/event.clientY,而在ff下用event.pageX/event.pageY.&lt;br /&gt;&lt;br /&gt;4,在ff下为xx.style.top和xx.style.left赋值必须要加上px单位，如xx.style.top=a+&amp;quot;px&amp;quot;;否则不能正常显示。在ie下则可以省略px。</description><category>web开发</category><pubDate>Wed, 29 Nov 2006 16:33:05 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497991.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497991.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235217/1237942</fs:itemid></item><item><title>Mozilla 中的__defineSetters__ 和 __defineGetters__的意义</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235218/1237942/1/item.html</link><description>&lt;div class=&quot;textbox-content&quot; id=&quot;zoomtext&quot;&gt;来源:&lt;a href=&quot;http://developer.mozilla.org/cn/docs/Core_JavaScript_1.5_Guide:Creating_New_Objects:Defining_Getters_and_Setters&quot; target=&quot;_blank&quot;&gt;http://developer.mozilla.org/cn/docs/Core_JavaScript_1.5_Guide:Creating_New_Objects:Defining_Getters_and_Setters&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A getter is a method that gets the value of a specific property. A setter is a method that sets the value of a specific property. You can define getters and setters on any predefined core object or user-defined object that supports the addition of new properties. The syntax for defining getters and setters uses the object literal syntax. Getter是一种获取原型值的方法（method），setter是一种设定原型值的方法。开发人员可以获取和设定任何核心的对象（object）以及自定义的对象。使用Getters和Setters 的语法就和使用对象一样。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The following JS shell session illustrates how getters and setters could work for a user-defined object o. The JS shell is an application that allows developers to test JavaScript code in batch mode or interactively. 这段JS代码很好的说明了开发人员如何使用Getters和Setters定义对象“o”。开发人员可以在环境下进行调试。 &lt;br /&gt;&lt;br /&gt;The o object's properties are: 对象“o”的原型如下。 &lt;br /&gt;&lt;br /&gt;o.a - a number &lt;br /&gt;一个数字 &lt;br /&gt;&lt;br /&gt;o.b - a getter that returns o.a plus 1 &lt;br /&gt;返回o.a加1的值 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; * o.c - a setter that sets the value of o.a to half of its value &lt;br /&gt;设定o.a的值为o.c的一半 &lt;br /&gt;&lt;br /&gt;o = new Object; o = {a:7, get b() {return this.a+1; }, set c(x) {this.a = x/2}}; o.a o.b o.c = 50 o.a &lt;br /&gt;&lt;br /&gt;This JavaScript shell session illustrates how getters and setters can extend the Date prototype to add a year property to all instances of the predefined Date class. It uses the Date class's existing getFullYear and setFullYear methods to support the year property's getter and setter. 这个代码向我们演示了如何使用Getters和Setters继承原型中的数据，然后添加一个 “year”原型成为这个日期类的一个实例。其中使用到了日期类中已有的两个方法：getFullYear 和 setFullYear。 &lt;br /&gt;&lt;br /&gt;These statements define a getter and setter for the year property: 以下代码使用getter 和 setter声明了一个“year”原型： &lt;br /&gt;&lt;br /&gt;var d = Date.prototype; d.__defineGetter__(&amp;quot;year&amp;quot;, function() { return this.getFullYear(); }); d.__defineSetter__(&amp;quot;year&amp;quot;, function(y) { this.setFullYear(y); }); &lt;br /&gt;&lt;br /&gt;These statements use the getter and setter in a Date object: 以下代码使用getter 和 sette操作这个类对象。 &lt;br /&gt;&lt;br /&gt;var now = new Date; alert(now.year); now.year=2001; alert(now); &lt;br /&gt;&lt;br /&gt;During development of JavaScript 1.5, there was a brief period in which expressions including getter = or setter = were used to define new getters or setters on existing objects. This syntax is highly deprecated now, will cause a warning in current JS 1.5 engines, and will become a syntax error in the future. It should be avoided. 在JavaScript 1.5的开发过程中，有一种简短的使用类似getter = 或者 setter = 定义对象的方法。这样的语法在JavaScript 1.5版本中会获得一个警告，以后的版本也不会支持，所以我们要避免这样的语法出现。 &lt;br /&gt;&lt;br /&gt;Summary 摘要 &lt;br /&gt;&lt;br /&gt;In principle, getters and setters can be either 原则上getters 和 setters 都可以实现 &lt;br /&gt;&lt;br /&gt;defined using object initializers, or &lt;br /&gt;定义使用初始化对象 &lt;br /&gt;&lt;br /&gt;&amp;nbsp; * added later to any object at any time using a getter or setter adding method. &lt;br /&gt;给现有的对象添加新的方法 &lt;br /&gt;&lt;br /&gt;When defining getters and setters using object initializers all you need to do is to prefix a getter method with get and a setter method with set. Of course, the getter method must not expect a parameter, while the setter method expects exactly one parameter (the new value to set). For instance: 定义使用的初始化对象只需要在语句前加上get和set分别实现getter方法和setter方法。当然，getter方法不能获取到任何参数，而sette则需要给予一个参数（需要新设定的值）。距离如下： &lt;br /&gt;&lt;br /&gt;o = { &lt;br /&gt;&lt;br /&gt;a:7,&lt;br /&gt;get b() { return this.a+1; },&lt;br /&gt;set c(x) { this.a = x/2; }&lt;br /&gt;}; &lt;br /&gt;&lt;br /&gt;Getters and setters can also be added to an object at any time after creation using two special methods called __defineGetter__ and __defineSetter__. Both methods expect the name of the getter or setter as their first parameter, in form of a string. The second parameter is the function to call as the getter or setter. For instance (following the previous example): Getters 和 setters还可以通过 __defineGetter__ 和 __defineSetter__ 这两个特殊的方法实现对对象的添加。这两种方法都需要把方法的名字作为第一个字符串形式的参数，第二个参数是getter 和 setter需要调用的函数，举例如下（和上面的例子功能相同）： &lt;br /&gt;&lt;br /&gt;o.__defineGetter__(&amp;quot;b&amp;quot;, function() { return this.a+1; }); o.__defineSetter__(&amp;quot;c&amp;quot;, function(x) { this.a = x/2; }); &lt;br /&gt;&lt;br /&gt;Which of the two forms to choose depends on your programming style and task at hand. If you already go for the object initializer when defining a prototype you will probably most of the time choose the first form. This form is more compact and natural. However, if you need to add getters and setters later – because you did not write the prototype or particular object – then the second form is the only possible form. The second form probably best represents the dynamic nature of JavaScript – but it can make the code hard to read and understand. 使用哪一种方式取决于你项目的形式和需要实现的功能。如果你在定义一个原型时需要初始化一个对象，一般都会选择第一种，形式会更加自然。如果你并不急着需要使用这两个方法（并不初始化原型和对象），那么只能使用第二种方法。第二种方法更好的体现出了JS语法的特点，但是有时候也会使代码变得难以阅读和理解。 &lt;div class=&quot;tags&quot; style=&quot;DISPLAY: none&quot;&gt;&lt;/div&gt;&lt;/div&gt;</description><category>web开发</category><pubDate>Wed, 29 Nov 2006 16:31:10 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497990.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497990.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235218/1237942</fs:itemid></item><item><title>XML文档对象模型</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235219/1237942/1/item.html</link><description>&lt;table class=&quot;t_msg&quot; cellspacing=&quot;0&quot; cellpadding=&quot;4&quot; border=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;line&quot; style=&quot;PADDING-TOP: 10px&quot; valign=&quot;top&quot; height=&quot;100%&quot;&gt;&lt;a title=&quot;评分 0&quot; href=&quot;http://bbs.51js.com/misc.php?action=viewratings&amp;tid=14147&amp;pid=76983&quot; name=&quot;pid76983&quot;&gt;&lt;/a&gt;&lt;span class=&quot;bold&quot;&gt;【推荐】 XML文档对象模型手册1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;FONT-SIZE: 12px&quot;&gt;XML 对象模型&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------&lt;br /&gt;来源：节选自 实战XML第二版（ScriptXML)：Appendix A XML 对象模型&lt;br /&gt;整理: FREETA&lt;br /&gt;日期: 2003-10-25&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;第5 章谈论了如何使用Script 在HTML 网页中与组件互相整合，以及如何与XML 对象模型合作。这个附录将详细地探究XML 对象模型，包括组成模型的对象、它们的属性与方法，和他们如何被应用在应用程序中。&lt;br /&gt;&lt;br /&gt;对象模型结构&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;正如同我们在第3 章所讨论的，对象是一种树状结构的组织。树的主干便是Document 对象，其它的对象便由此对象分支而来。&lt;br /&gt;&lt;br /&gt;XML 对象模型由四种基本的对象所组成：&lt;br /&gt;&lt;br /&gt;. document 对象－XML 数据来源&lt;br /&gt;. node 对象－一个父节点或其中的一个子节点&lt;br /&gt;. nodeList 对象—兄弟节点的清单&lt;br /&gt;. parseError 对象—一个无内容的对象，用来接收解析错误的讯息&lt;br /&gt;&lt;br /&gt;图A-1 显示了这些对象间的关系。&lt;br /&gt;&lt;br /&gt;DOCUMENT&lt;br /&gt;&amp;nbsp; &amp;nbsp;|&lt;br /&gt;&amp;nbsp; &amp;nbsp;|&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;|------------NODE&lt;br /&gt;&amp;nbsp; &amp;nbsp;|-------NODE-------|------------NODE&lt;br /&gt;&amp;nbsp; &amp;nbsp;|&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;|------------NODE&lt;br /&gt;&amp;nbsp; &amp;nbsp;|&lt;br /&gt;&amp;nbsp; &amp;nbsp;|--------------NODE&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;|--------------NODE&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;|--------------NODE&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;|--------------NODE&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;图A-1：XML 对象模型&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;在对象模型中的每个对象拥有特定的属性或方法，或两者都有。若使用Script 程序代码，内容作者可以直接地使用这些属性和方法来取得信息并运用XML 数据。这个附录将完整地介绍XML对象模型，并检视这些对象和相关的属性与方法。&lt;br /&gt;&amp;nbsp; &amp;nbsp;既然本书是讨论如何运用XML 的，就必须深入了解对象模型的运作。稍后在这附录中，有一些如何在对象模型中使用对象的范例。要使用这些范例，您将需要列在A-1 中的文字码，也可以在随书光盘中找到它（Appxa\LastA_1.xml）。&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml version＝&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE EMAIL SYSTEM &amp;quot;LstA_2.dtd&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;EMAIL PRIORITY＝&amp;quot;HIGH&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;TO&amp;gt;&lt;a href=&quot;mailto:Jodie@msn.com&quot;&gt;Jodie@msn.com&lt;/a&gt;&amp;lt;/TO&amp;gt;&lt;br /&gt;&amp;lt;FROM&amp;gt;&lt;a href=&quot;mailto:Bill@msn.com&quot;&gt;Bill@msn.com&lt;/a&gt;&amp;lt;/FROM&amp;gt;&lt;br /&gt;&amp;lt;CC&amp;gt;&lt;a href=&quot;mailto:Philip@msn.com&quot;&gt;Philip@msn.com&lt;/a&gt;&amp;lt;/CC&amp;gt;&lt;br /&gt;&amp;lt;BCC&amp;gt;&lt;a href=&quot;mailto:Naomi@msn.com&quot;&gt;Naomi@msn.com&lt;/a&gt;&amp;lt;/BCC&amp;gt;&lt;br /&gt;&amp;lt;SUBJECT&amp;gt;My document is a tree.&amp;lt;/SUBJECT&amp;gt;&lt;br /&gt;&amp;lt;BODY&amp;gt;This is an example of a tree structure.&amp;lt;/BODY&amp;gt;&lt;br /&gt;&amp;lt;/EMAIL&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; [文字码A-1]&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;您可以从文件类型宣告中看到，这份文件使用了DTD。这份DTD 文件如文字码A-2 所示，您也可以在随书光盘中的AppxA\LstA_2.dtd 找到它。&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- This is an XML document that could be used as an email template. --&amp;gt;&lt;br /&gt;&amp;lt;!ELEMENT EMAIL (TO+, FROM, CC*, BCC*, SUBJECT?, BODY?)&amp;gt;&lt;br /&gt;&amp;lt;!ATTLIST EMAIL&lt;br /&gt;LANGUAGE (Western|Greek|Latin|Universal) &amp;quot;Western&amp;quot;&lt;br /&gt;ENCRYPTED CDATA #IMPLIED&lt;br /&gt;PRIORITY (NORMAL|LOW|HIGH) &amp;quot;NORMAL&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;!ELEMENT TO (#PCDATA)&amp;gt;&lt;br /&gt;&amp;lt;!ELEMENT FROM (#PCDATA)&amp;gt;&lt;br /&gt;&amp;lt;!ELEMENT CC (#PCDATA)&amp;gt;&lt;br /&gt;&amp;lt;!ELEMENT BCC (#PCDATA)&amp;gt;&lt;br /&gt;&amp;lt;!ATTLIST BCC&lt;br /&gt;HIDDEN CDATA #FIXED &amp;quot;TRUE&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;!ELEMENT SUBJECT (#PCDATA)&amp;gt;&lt;br /&gt;&amp;lt;!ELEMENT BODY (#PCDATA)&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; [文字码A-2]&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;最后，XML 文件将透过HTML 网页来显示，下面便是HTML 的文字码（在随书光盘AppxA\LstA_3.htm 中）。&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE HTML PUBLIC &amp;quot;_//W3C//DTD HTML 3.2 Final//EN&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;HTML&amp;gt;&lt;br /&gt;&amp;lt;HEAD&amp;gt;&lt;br /&gt;&amp;lt;SCRIPT LANGUAGE＝&amp;quot;JavaScrip&amp;quot;_ FOR＝window EVENT＝on load&amp;gt;&lt;br /&gt;showMe();&lt;br /&gt;&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;&amp;lt;SCRIPT LANGUAGE＝&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;var xmlDoc ＝ new ActiveXObject(&amp;quot;microsoft.xmldom&amp;quot;);&lt;br /&gt;xmlDoc.load(&amp;quot;LstA_1.xml&amp;quot;);&lt;br /&gt;function showMe()&lt;br /&gt;{&lt;br /&gt;// Insert sample code here.&lt;br /&gt;}&lt;br /&gt;&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;&amp;lt;TITLE&amp;gt;Code Listing A-3&amp;lt;/TITLE&amp;gt;&lt;br /&gt;&amp;lt;/HEAD&amp;gt;&lt;br /&gt;&amp;lt;BODY&amp;gt;&lt;br /&gt;&amp;lt;/BODY&amp;gt;&lt;br /&gt;&amp;lt;/HTML&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;[文字码A-3]&lt;br /&gt;&lt;br /&gt;请注意在A-3 文字码中，showMe 函式并没有包含程序代码。因为要插入什么程序代码是由您来决定的，这个程序片段只是要让您了解showMe 函式的功用。&lt;br /&gt;---------------------------------------------------------------------------------&lt;br /&gt;[Note]&lt;br /&gt;使用附录中的范例时，您可以在LstA_3.htm 的showMe 函式中输入片断程序代码，也可以使用随书光盘中AppxA 目录中的HTML 档案。&lt;br /&gt;---------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;一、Document 物件&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;如同前面所提到的，这Document 对象代表这份文件的数据来源。这个对象模型允许文件作者使用任何支持XML 处理器的浏览器或应用程序，透过script 程序代码来加载XML 文件。&lt;br /&gt;举例来说，一个文件能藉由建立一个ActiveX control 的实例，并且呼叫load 方法（稍后讨论）来加载文件，如同范例中的HTML 码：&lt;br /&gt;&lt;br /&gt;var xmlDoc ＝ new ActiveXObject(&amp;quot;microsoft.xmldom&amp;quot;);&lt;br /&gt;xmlDoc.load(&amp;quot;LstA_1.xml&amp;quot;);&lt;br /&gt;&lt;br /&gt;加载也可借着使用Java applet 来完成，如下所示：&lt;br /&gt;&lt;br /&gt;&amp;lt;SCRIPT&amp;gt;&lt;br /&gt;xmldso.load(&amp;quot;LstA_1.xml&amp;quot;);&lt;br /&gt;&amp;lt;/SCRIPT&amp;gt;&lt;br /&gt;&amp;lt;BODY&amp;gt;&lt;br /&gt;&amp;lt;APPLET CODE＝com.ms.xml.dso.XMLDSO.class&lt;br /&gt;WIDTH＝100% HEIGHT＝0 ID＝xmldso MAYSCRIPT＝true&amp;gt;&lt;br /&gt;&amp;lt;/APPLET&amp;gt;&lt;br /&gt;&amp;lt;/BODY&amp;gt;&lt;br /&gt;&lt;br /&gt;因为对象模型预期将会使用load 方法，因此，程序代码与控件被加载后的程序代码是相同的。重要的是，一旦数据来源被建立后，对象模型便会提供一致的方式来浏览及处理XML 资料。&lt;br /&gt;---------------------------------------------------------------------------------&lt;br /&gt;[Note]&lt;br /&gt;Msxml 延伸基本的Document 对象模型（DOM)，来包含XML 特定的界面。讨论DOM 的概念超出本书的范围。所以，下面的单元只把焦点集中在XML DOM 的一般性使用。&lt;br /&gt;---------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;（一）、Document 对象属性&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以下所列是可用的Document 对象属性：&lt;br /&gt;1. async&lt;br /&gt;2. attributes&lt;br /&gt;3. childNodes&lt;br /&gt;4. doctype&lt;br /&gt;5. documentElement&lt;br /&gt;6. firstChild&lt;br /&gt;7. implementation&lt;br /&gt;8. lastChild&lt;br /&gt;9. nextSibling&lt;br /&gt;10. nodeName&lt;br /&gt;11. nodeType&lt;br /&gt;12. nodeValue&lt;br /&gt;13. ondataavailable&lt;br /&gt;14. onreadystatechange&lt;br /&gt;15. ownerDocument&lt;br /&gt;16. parentNode&lt;br /&gt;17. parseError&lt;br /&gt;18. previousSibling&lt;br /&gt;19. readyState&lt;br /&gt;20. url&lt;br /&gt;21. validateOnParse&lt;br /&gt;22. xml&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;async 属性&lt;br /&gt;------------------&lt;br /&gt;&lt;br /&gt;async 属性表示是否允许异步的下载。&lt;br /&gt;&lt;br /&gt;基本语法：&lt;br /&gt;&lt;br /&gt;boolValue ＝ XMLDocument.async;XMLDocument.async ＝ boolValue;&lt;br /&gt;-&lt;br /&gt;说明：布尔值是可擦写的（read/write），如果准许异步下载，值为True；反之则为False。&lt;br /&gt;&lt;br /&gt;使用范例：&lt;br /&gt;&lt;br /&gt;以下的范例请参照随书光盘的AppxA\LstA_4.htm：&lt;br /&gt;xmlDoc.async ＝ &amp;quot;false&amp;quot;;&lt;br /&gt;alert(xmlDoc.async);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;attribute 属性&lt;br /&gt;-------------------&lt;br /&gt;&lt;br /&gt;传回目前节点的属性列表。&lt;br /&gt;&lt;br /&gt;基本语法：&lt;br /&gt;&lt;br /&gt;objAttributeList = xmlNode.attributes;&lt;br /&gt;说明：传回一个物件。如果此节点不能包含属性，则传回空值。&lt;br /&gt;&lt;br /&gt;使用范例：&lt;br /&gt;&lt;br /&gt;以下的范例请参照随书光盘的AppxA\LstA_5.htm：&lt;br /&gt;objAttList ＝ xmlDoc.documentElement.attributes;&lt;br /&gt;alert(objAttList);&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;[Note]&lt;br /&gt;例子以[object]为结果传回。这是由于被传回的对象，若不使用其它的对象属性，就不能以文字来表示，在本附录中包含数个这样的例子。尽管很多对象属性本身似乎不是很有用，但您将会在附录中看到如何组合属性和方法得到您要的结果。&lt;br /&gt;------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;childNodes 属性&lt;br /&gt;-----------------&lt;br /&gt;&lt;br /&gt;传回一个节点清单，包含该节点所有可用的子节点。&lt;br /&gt;&lt;br /&gt;基本语法：&lt;br /&gt;&lt;br /&gt;objNodeList=node.childNodes;&lt;br /&gt;说明：传回一个物件。假如这节点没有子节点，传回null。&lt;br /&gt;&lt;br /&gt;使用范例：&lt;br /&gt;&lt;br /&gt;以下的例子请参照随书光盘中的AppxA\LstA_6.htm：&lt;br /&gt;objNodeList ＝ xmlDoc.childNodes;&lt;br /&gt;alert(objNodeList);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;doctype 属性&lt;br /&gt;-----------------&lt;br /&gt;&lt;br /&gt;传回文件型态节点，包含目前文件的DTD。这节点是一般的文件型态宣告，例如，节点&amp;lt;!DOCTYPE EMAIL SYSTEM &amp;quot;LstA_2.dtd&amp;quot;&amp;gt;，名为EMAIL 的节点物件会被传回。&lt;br /&gt;&lt;br /&gt;基本语法：&lt;br /&gt;&lt;br /&gt;objDocType=xmlDocument.doctype;&lt;br /&gt;说明：传回一个对象，这个属性是只读的。假如这文件不包含DTD，会传回null。&lt;br /&gt;&lt;br /&gt;使用范例：&lt;br /&gt;&lt;br /&gt;以下的例子请参照随书光盘AppxA\LstA_7.htm：&lt;br /&gt;objDocType ＝ xmlDoc.doctype;&lt;br /&gt;alert(objDocType.nodeName);&lt;br /&gt;documentElement 属性&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;确认XML 文件的根（Root）节点。&lt;br /&gt;----------------------------&lt;br /&gt;&lt;br /&gt;基本语法：&lt;br /&gt;&lt;br /&gt;objDoc=xmlDocument.documentElement;&lt;br /&gt;说明：回一个在单一根文件元素中包含数据的对象。此属性可读/写，如果文件中不包含根节点，将传回null。&lt;br /&gt;&lt;br /&gt;使用范例：&lt;br /&gt;&lt;br /&gt;以下的范例请参照随书光盘中的AppxA\LstA_8.htm：&lt;br /&gt;objDocRoot ＝ xmlDoc.documentElement;&lt;br /&gt;alert(objDocRoot);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;firstChild 属性&lt;br /&gt;-----------------&lt;br /&gt;&lt;br /&gt;确认在目前节点中的第一个子元素。&lt;br /&gt;&lt;br /&gt;基本语法：&lt;br /&gt;&lt;br /&gt;objFirstChild ＝ xmlDocNode.firstChild ;&lt;br /&gt;说明：此属性只读且会传回一对象，如果节点中没有包含第一个子元素，将传回null。&lt;br /&gt;&lt;br /&gt;使用范例：&lt;br /&gt;&lt;br /&gt;以下的范例请参照随书光盘中的AppxA\LstA_9.htm：&lt;br /&gt;objFirstChild ＝ xmlDoc.documentElement.firstChild;&lt;br /&gt;alert(objFirstChild);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;implementation 属性&lt;br /&gt;---------------------&lt;br /&gt;&lt;br /&gt;DOM 应用程序能使用其它实作中的对象。implementation 属性确认目前XML 文件的DOMimplementation 对象。&lt;br /&gt;&lt;br /&gt;基本语法：&lt;br /&gt;&lt;br /&gt;objImplementation ＝ xmlDocument.implementation;&lt;br /&gt;说明：此属性只读且传回一个对象。&lt;br /&gt;&lt;br /&gt;使用范例：&lt;br /&gt;&lt;br /&gt;以下的范例请参照随书光盘中的AppxA\LstA_10.htm：&lt;br /&gt;objImp ＝ xmlDoc.implementation;&lt;br /&gt;alert(objImp);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;lastChild 属性&lt;br /&gt;---------------&lt;br /&gt;&lt;br /&gt;确认目前节点中最后的子元素。&lt;br /&gt;&lt;br /&gt;基本语法：&lt;br /&gt;&lt;br /&gt;objLastChild ＝ xmlDocNode.lastChild;&lt;br /&gt;说明：此属性只读且传回一个对象。如果节点中没有包含最后子元素，将传回null。&lt;br /&gt;&lt;br /&gt;使用范例：&lt;br /&gt;&lt;br /&gt;以下的范例请参照随书光盘中的AppxA\LstA_11.htm：&lt;br /&gt;objLastChild ＝ xmlDoc.documentElement.lastChild;&lt;br /&gt;alert(objLastChild);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;nextSibling 属性&lt;br /&gt;------------------&lt;br /&gt;&lt;br /&gt;在目前文件节点的子节点列表中传回下一个兄弟节点。&lt;br /&gt;&lt;br /&gt;基本语法：&lt;br /&gt;&lt;br /&gt;objNextSibling ＝ xmlDocNode.nextSibling;&lt;br /&gt;说明：此属性是只读且传回一个对象。如果节点中没有包含其它的相关节点，会传回null。&lt;br /&gt;&lt;br /&gt;使用范例：&lt;br /&gt;&lt;br /&gt;以下的范例请参照随书光盘中的AppxA\LstA_12.htm：&lt;br /&gt;objSibling ＝ xmlDoc.documentElement.childNodes.item(1) .nextSibling;&lt;br /&gt;alert(objSibling);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;nodeName 属性&lt;br /&gt;---------------&lt;br /&gt;&lt;br /&gt;传回代表目前节点名称的字符串。&lt;br /&gt;&lt;br /&gt;基本语法：&lt;br /&gt;&lt;br /&gt;strNodeName ＝ xmlDocNode.nodeName ;&lt;br /&gt;说明：传回一个字符串。这个属性是只读的，传回元素名称、属性或实体参照。&lt;br /&gt;&lt;br /&gt;使用范例：&lt;br /&gt;&lt;br /&gt;以下的范例请参照随书光盘中的AppxA\LstA_13.htm：&lt;br /&gt;strNodeName ＝ xmlDoc.documentElement.nodeName;&lt;br /&gt;alert(strNodeName);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;nodeType 属性&lt;br /&gt;---------------&lt;br /&gt;&lt;br /&gt;辨识节点的DOM 型态。&lt;br /&gt;&lt;br /&gt;基本语法：&lt;br /&gt;numNodeType ＝ xmlDocNode.nodeType ;&lt;br /&gt;说明：此属性只读且传回一个数值。&lt;br /&gt;&lt;br /&gt;有效的数值符合以下的型别：&lt;br /&gt;1-ELEMENT&lt;br /&gt;2-ATTRIBUTE&lt;br /&gt;3-TEXT&lt;br /&gt;4-CDATA&lt;br /&gt;5-ENTITY REFERENCE&lt;br /&gt;6-ENTITY&lt;br /&gt;7-PI (processing instruction)&lt;br /&gt;8-COMMENT&lt;br /&gt;9-DOCUMENT&lt;br /&gt;10-DOCUMENT TYPE&lt;br /&gt;11-DOCUMENT FRAGMENT&lt;br /&gt;12-NOTATION&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;[Note]&lt;br /&gt;上述的数据型态将在附录B 中有更深入的介绍。&lt;br /&gt;-------------------------------------------------------------------------------&lt;br /&gt;使用范例：&lt;br /&gt;&lt;br /&gt;以下的范例请参照随书光盘中的AppxA\LstA_14.htm：&lt;br /&gt;numNodeType ＝ xmlDoc.documentElement.nodeType;&lt;br /&gt;alert(numNodeType);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;right&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><category>web开发</category><pubDate>Wed, 29 Nov 2006 09:10:16 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497989.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497989.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235219/1237942</fs:itemid></item><item><title>有用的网站</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235220/1237942/1/item.html</link><description>&lt;a href=&quot;http://man.lupaworld.com/content/develop/&quot;&gt;手册中心&lt;/a&gt;</description><category>收藏</category><pubDate>Sat, 25 Nov 2006 13:13:35 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497988.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497988.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235220/1237942</fs:itemid></item><item><title>IE与Mozilla下DHTML的一些区别</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235221/1237942/1/item.html</link><description>&lt;p&gt;Mozilla网站上讲的：&lt;a href=&quot;http://developer.mozilla.org/cn/docs/Migrate_apps_from_Internet_Explorer_to_Mozilla&quot;&gt;http://developer.mozilla.org/cn/docs/Migrate_apps_from_Internet_Explorer_to_Mozilla&lt;/a&gt;&lt;/p&gt;&lt;p&gt;IBM develop：&lt;a href=&quot;http://www-128.ibm.com/developerworks/web/library/wa-ie2mozgd/&quot;&gt;http://www-128.ibm.com/developerworks/web/library/wa-ie2mozgd/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;1.DOM上的接口基本上还是一致的，但经测试发现mozilla下的DOM更标准些,就算些法一样，IE下会有一些微小的区别，但无关要紧&lt;br /&gt;&lt;br /&gt;2.事件模型上，这方面区别算比较大.&lt;br /&gt;mozilla下的e.target 相当于 ie下的event.srcElement,但细节上有区别，后者是返回一个html element&lt;br /&gt;而e.target返回的是个节点，也就是说包括文本节点，方法可以这样&lt;br /&gt;var trg = e.target;&lt;br /&gt;while(trg.nodeType!=1)trg=trg.parentNode;&lt;br /&gt;&lt;br /&gt;mozilla下的e.which与ie下的event.keyCode相当&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;相对应的还有e.layerX,e.layerY,e.pageX,e.pageY...&lt;br /&gt;可以看看&lt;a href=&quot;http://fason.nease.net/mozilla/dom/&quot; target=&quot;_blank&quot;&gt;http://fason.nease.net/moz...&lt;/a&gt; &amp;nbsp; &amp;nbsp;event部份&lt;br /&gt;&lt;br /&gt;事件绑定上mozilla用addEventListener,removeEventListener,对应ie的attachEvent,detatchEvent&lt;br /&gt;&lt;br /&gt;3.对象引用上就直接document.getElementById就行了，如果还要兼容ie4,可以再加上document.all判断&lt;br /&gt;form element的引用要标准些var oInput = document.formName.elements[&amp;quot;input1&amp;quot;]&lt;br /&gt;&lt;br /&gt;4.XML的应用上区别更大些，因为IE下是通过activex来创建，而mozilla已经是有这些对象的（需要dom2支持）&lt;br /&gt;Xmldomdocument: &amp;nbsp; var doc = document.inplementation.createDocument(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,null)&lt;br /&gt;xmlhttp: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; var req = new XMLHttpRequest()&lt;br /&gt;&lt;br /&gt;5.innerText就在mozilla不支持了，需要用些range的技巧来取得它的text&lt;br /&gt;&lt;br /&gt;6.insertAdjacentHTML是个比较好用的方法，mozilla可以用DOM的方法insertBefore来兼容&lt;br /&gt;&lt;br /&gt;7.更细微的，如Array,Date的一些方法ie和mozilla也会有一些微小的区别，具体不提到了。。。&lt;br /&gt;&lt;br /&gt;8.删除一个对象，用DOM的做法是&lt;br /&gt;var p = obj.parentNode;&lt;br /&gt;p.removeChild(obj);&lt;br /&gt;&lt;br /&gt;9.select 的option增加和删除看看,不用add和remove&lt;br /&gt;&lt;a href=&quot;http://fason.nease.net/samples/js/moveoptions.html&quot; target=&quot;_blank&quot;&gt;http://fason.nease.net/sam...&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;10.mozilla中处理右键问题，dom2已经支持oncontextmenu,不用e.which == 2来判断&lt;br /&gt;&lt;br /&gt;11.ie下的opacity,mozilla怎么处理？？&lt;br /&gt;&lt;br /&gt;答：&lt;br /&gt;obj.style.MozOpacity = 0.5;// &amp;nbsp;.opacity-css { -moz-opacity:0.5 }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;12.&amp;lt;script src=&quot;XX.js&quot;&gt;&lt;/script&gt; &lt;br /&gt;在ie下改变script的src可以直接obj.src=&amp;quot;XXX.js&amp;quot;,mozilla不行，要remove掉再create一个才能生效.&lt;br /&gt;&lt;br /&gt;13.ie下的obj.currentStyle.xxx，mozilla下用&lt;br /&gt;document.defaultView.getComputedStyle(obj, '').getPropertyValue(&amp;quot;xxx&amp;quot;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;写了两个例子:&lt;br /&gt;1. 对于通过ID取对象&lt;br /&gt;function getObjectById(id)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;if (typeof(id) != &amp;quot;string&amp;quot; || id == &amp;quot;&amp;quot;) return null;&lt;br /&gt;&amp;nbsp;if (document.all) return document.all(id);&lt;br /&gt;&amp;nbsp;if (document.getElementById) return document.getElementById(id);&lt;br /&gt;&amp;nbsp;try {return eval(id);} catch(e){ return null;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;2. 对事件附加处理函数&lt;br /&gt;&amp;nbsp;if(document.attachEvent)&lt;br /&gt;&amp;nbsp; &amp;nbsp;window.attachEvent(&amp;quot;onresize&amp;quot;, function(){reinsert();});&lt;br /&gt;&amp;nbsp;else&lt;br /&gt;&amp;nbsp; &amp;nbsp;window.addEventListener('resize', function(){reinsert();}, false);&lt;br /&gt;注意在IE里是 onclick 而在firefox NS 里则是 click !&lt;br /&gt;动态更改CSS IE跟Mozilla可以这样&lt;br /&gt;给link设定id，&lt;br /&gt;&lt;link id=&quot;pagestyle&quot; rev=&quot;stylesheet&quot; media=&quot;screen&quot; href=&quot;template/gray/xmas.css&quot; type=&quot;text/css&quot; charset=&quot;UTF-8&quot; rel=&quot;stylesheet&quot; /&gt;&lt;br /&gt;然后通过脚本来设置&lt;br /&gt;&amp;lt;script language=&quot;JavaScript&quot; type=&quot;text/JavaScript&quot;&gt;&lt;/script&gt;&lt;br /&gt;引用&lt;br /&gt;&lt;a onclick=&quot;function anonymous()
{
function anonymous()
{
setStyle('template/gray/gq.css');return false;
}
}&quot; href=&quot;http://www.myhorde.net/blog/read.php?53#&quot;&gt;国庆样式&lt;/a&gt;&lt;br /&gt;&lt;a onclick=&quot;function anonymous()
{
function anonymous()
{
setStyle('template/gray/xmas.css');return false;
}
}&quot; href=&quot;http://www.myhorde.net/blog/read.php?53#&quot;&gt;圣诞样式&lt;/a&gt;&lt;br /&gt;处理XML的方法&lt;br /&gt;&lt;br /&gt;var FCKXml = function()&lt;br /&gt;{}&lt;br /&gt;&lt;br /&gt;FCKXml.prototype.GetHttpRequest = function()&lt;br /&gt;{&lt;br /&gt;if ( window.XMLHttpRequest )// Gecko&lt;br /&gt;return new XMLHttpRequest() ;&lt;br /&gt;else if ( window.ActiveXObject )// IE&lt;br /&gt;return new ActiveXObject(&amp;quot;MsXml2.XmlHttp&amp;quot;) ;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;FCKXml.prototype.LoadUrl = function( urlToCall, asyncFunctionPointer )&lt;br /&gt;{&lt;br /&gt;var oFCKXml = this ;&lt;br /&gt;&lt;br /&gt;var bAsync = ( typeof(asyncFunctionPointer) == 'function' ) ;&lt;br /&gt;&lt;br /&gt;var oXmlHttp = this.GetHttpRequest() ;&lt;br /&gt;&lt;br /&gt;oXmlHttp.open( &amp;quot;GET&amp;quot;, urlToCall, bAsync ) ;&lt;br /&gt;&lt;br /&gt;if ( bAsync )&lt;br /&gt;{&lt;br /&gt;oXmlHttp.onreadystatechange = function() &lt;br /&gt;{&lt;br /&gt;if ( oXmlHttp.readyState == 4 )&lt;br /&gt;{&lt;br /&gt;oFCKXml.DOMDocument = oXmlHttp.responseXML ;&lt;br /&gt;asyncFunctionPointer( oFCKXml ) ;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;oXmlHttp.send( null ) ;&lt;br /&gt;&lt;br /&gt;if ( ! bAsync &amp;amp;&amp;amp; oXmlHttp.status &amp;amp;&amp;amp; oXmlHttp.status == 200 )&lt;br /&gt;this.DOMDocument = oXmlHttp.responseXML ;&lt;br /&gt;else&lt;br /&gt;throw( 'Error loading &amp;quot;' + urlToCall + '&amp;quot;' ) ;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;FCKXml.prototype.SelectNodes = function( xpath, contextNode )&lt;br /&gt;{&lt;br /&gt;if ( document.all )// IE&lt;br /&gt;{&lt;br /&gt;if ( contextNode )&lt;br /&gt;return contextNode.selectNodes( xpath ) ;&lt;br /&gt;else&lt;br /&gt;return this.DOMDocument.selectNodes( xpath ) ;&lt;br /&gt;}&lt;br /&gt;else// Gecko&lt;br /&gt;{&lt;br /&gt;var aNodeArray = new Array();&lt;br /&gt;&lt;br /&gt;var xPathResult = this.DOMDocument.evaluate( xpath, contextNode ? contextNode : this.DOMDocument, &lt;br /&gt;this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), XPathResult.ORDERED_NODE_ITERATOR_TYPE, null) ;&lt;br /&gt;if ( xPathResult ) &lt;br /&gt;{&lt;br /&gt;var oNode = xPathResult.iterateNext() ;&lt;br /&gt;while( oNode )&lt;br /&gt;{&lt;br /&gt;aNodeArray[aNodeArray.length] = oNode ;&lt;br /&gt;oNode = xPathResult.iterateNext();&lt;br /&gt;}&lt;br /&gt;} &lt;br /&gt;return aNodeArray ;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;FCKXml.prototype.SelectSingleNode = function( xpath, contextNode ) &lt;br /&gt;{&lt;br /&gt;if ( document.all )// IE&lt;br /&gt;{&lt;br /&gt;if ( contextNode )&lt;br /&gt;return contextNode.selectSingleNode( xpath ) ;&lt;br /&gt;else&lt;br /&gt;return this.DOMDocument.selectSingleNode( xpath ) ;&lt;br /&gt;}&lt;br /&gt;else// Gecko&lt;br /&gt;{&lt;br /&gt;var xPathResult = this.DOMDocument.evaluate( xpath, contextNode ? contextNode : this.DOMDocument,&lt;br /&gt;this.DOMDocument.createNSResolver(this.DOMDocument.documentElement), 9, null);&lt;br /&gt;&lt;br /&gt;if ( xPathResult &amp;amp;&amp;amp; xPathResult.singleNodeValue )&lt;br /&gt;return xPathResult.singleNodeValue ;&lt;br /&gt;else&lt;br /&gt;return null ;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;XML应用上区别还有&lt;br /&gt;if(ie){&lt;br /&gt;&amp;nbsp; &amp;nbsp;var xmlDoc = new ActiveXObject(&amp;quot;Microsoft.XMLDOM&amp;quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp;xmlDoc.async = &amp;quot;false&amp;quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp;xmlDoc.loadXML(xmlText);&lt;br /&gt;}&lt;br /&gt;else{ //mozilla&lt;br /&gt;&amp;nbsp; &amp;nbsp;var parser = new DOMParser();&lt;br /&gt;&amp;nbsp; &amp;nbsp;var xmldoc = parser.parseFromString(xmlText,&amp;quot;text/xml&amp;quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;这些是几个mozilla下没有的属性。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;HTMLElement.prototype.__defineGetter__&lt;br /&gt;&amp;nbsp;(&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;quot;outerHTML&amp;quot;, &lt;br /&gt;&amp;nbsp; &amp;nbsp;function()&lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;var str = &amp;quot;&amp;lt;&amp;quot; + this.tagName; &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;for (var i=0; i&lt;this.attributes.length; i++)&lt;br=&quot;&quot; /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var attr = this.attributes[i];&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str += &amp;quot; &amp;quot;;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;str += attr.nodeName + &amp;quot;=&amp;quot; + '&amp;quot;' + attr.nodeValue + '&amp;quot;';&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;str += &amp;quot;&amp;gt;&amp;quot; + this.innerHTML + &amp;quot;&lt;/&quot; +=&quot;&quot; ?=&quot;&quot; this.tagname=&quot;&quot; /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;return str;&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;HTMLElement.prototype.__defineSetter__&lt;br /&gt;&amp;nbsp;(&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;quot;innerText&amp;quot;, &lt;br /&gt;&amp;nbsp; &amp;nbsp;function (anything) &lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;this.innerHTML = &amp;quot;&amp;quot;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;var sText = String(anything);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;var textS = sText.split(&amp;quot;\n&amp;quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;for(var i=0; i&lt;texts.length; i++)&lt;br=&quot;&quot; /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var txtNode = null;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;var retNode = null;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(textS[i].length)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;txtNode = document.createTextNode(textS[i]);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(i&lt;texts.length-1)&lt;br /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;retNode = document.createElement(&amp;quot;BR&amp;quot;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(txtNode)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.appendChild(txtNode);&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(retNode)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.appendChild(retNode);&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;HTMLElement.prototype.__defineGetter__&lt;br /&gt;&amp;nbsp;(&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;quot;innerText&amp;quot;, &lt;br /&gt;&amp;nbsp; &amp;nbsp;function () &lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;var anyString = &amp;quot;&amp;quot;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;var childS = this.childNodes;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;for(var i=0; i&lt;childs.length; i++)&lt;br=&quot;&quot; /&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(childS[i].nodeType==1)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;anyString += childS[i].tagName==&amp;quot;BR&amp;quot; ? '\n' : childS[i].innerText;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else if(childS[i].nodeType==3)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;anyString += childS[i].nodeValue;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return anyString;&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;HTMLElement.prototype.__defineGetter__&lt;br /&gt;&amp;nbsp;(&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;quot;text&amp;quot;, &lt;br /&gt;&amp;nbsp; &amp;nbsp;function () &lt;br /&gt;&amp;nbsp; &amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return this.innerText;&lt;br /&gt;&amp;nbsp; &amp;nbsp;}&lt;br /&gt;&amp;nbsp;);&lt;br /&gt;&lt;br /&gt;mozilla 不支持 element.customAttribute 的。&lt;br /&gt;一定要用 setAttribute(&amp;quot;customAttribute&amp;quot;,value) , getAttribute(&amp;quot;customAttribute&amp;quot;)&lt;br /&gt;（这个是最麻烦的地方）&lt;br /&gt;&lt;br /&gt;我自己是写了这个全局函数来添加删除事件的：&lt;br /&gt;&lt;br /&gt;function AttachDomEvent(obj,name,func)&lt;br /&gt;{&lt;br /&gt;if(obj.attachEvent)&lt;br /&gt;&amp;nbsp;obj.attachEvent(&amp;quot;on&amp;quot;+name,func);&lt;br /&gt;if(obj.addEventListener)&lt;br /&gt;&amp;nbsp;obj.addEventListener(name,func,true);&lt;br /&gt;}&lt;br /&gt;function DetachDomEvent(obj,name,func)&lt;br /&gt;{&lt;br /&gt;if(obj.detachEvent)&lt;br /&gt;&amp;nbsp;obj.detachEvent(&amp;quot;on&amp;quot;+name,func);&lt;br /&gt;if(obj.removeEventListener)&lt;br /&gt;&amp;nbsp;obj.removeEventListener(name,func,true);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;例如&lt;br /&gt;AttachDomEvent(window,&amp;quot;click&amp;quot;,handle_click);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;有时候mozilla不认某写元素的id,如果你不想用getElementById，那么可以在后加这一段代码：&lt;br /&gt;if(document.addEventListener)&lt;br /&gt;{&lt;br /&gt;var tagcoll=document.getElementsByTagName(&amp;quot;*&amp;quot;);&lt;br /&gt;for(var i=0;i&lt;tagcoll.length;i++)&lt;br /&gt; {&lt;br /&gt;&amp;nbsp;if(tagcoll[i].id)&lt;br /&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; eval(&amp;quot;var &amp;quot;+tagcoll[i].id+&amp;quot;=document.getElementById('&amp;quot;+tagcoll[i].id+&amp;quot;')&amp;quot;);&lt;br /&gt;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;不过这段代码与 iframe/frame 的有冲突的地方。&lt;br /&gt;&lt;br /&gt;我平时用到的比较常见的问题是&lt;br /&gt;table.insertRow(-1);&lt;br /&gt;row.insertCell(-1);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;事件方面还有一点非常有用的，的就是事件的重定向&lt;br /&gt;IE5.5+用obj.fireEvent(eventName, eventObj)&lt;br /&gt;ns下用obj.dispatchEvent(eventObj);&lt;br /&gt;事实上事件重定向的频繁使用是会使浏览器崩溃的特别在ns下，避免这样可以自己模拟事件的重定向和触发，有兴趣的去看看bindows的application.js中的核心代码，设计思想还是比较简单的&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description><category>web开发</category><pubDate>Sat, 25 Nov 2006 09:51:48 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497987.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497987.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235221/1237942</fs:itemid></item><item><title>中英文字符串长度判断</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235222/1237942/1/item.html</link><description>&lt;span id=&quot;zoom&quot;&gt;&amp;nbsp;&lt;p&gt;java中:&lt;br /&gt;&lt;br /&gt;用getBytes()方法将字符串转化为一个字节数组,这样得到的数组的长度就该字符串的字节长度了.&lt;br /&gt;ASCII码字符占一个字节,中文两个字节&lt;br /&gt;&lt;br /&gt;&lt;table style=&quot;FONT-SIZE: 8pt&quot; cellspacing=&quot;0&quot; cellpadding=&quot;4&quot; width=&quot;90%&quot; align=&quot;center&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;代码&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;BORDER-RIGHT: #cccccc 1px solid; BORDER-TOP: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; BORDER-BOTTOM: #cccccc 1px solid; FONT-FAMILY: Courier New&quot;&gt;String s=&amp;quot;残酷飞机大反对432423&amp;quot;&lt;br /&gt;System.out.print(s.length()); &amp;nbsp; &lt;br /&gt;byte []b=s.getBytes();&lt;br /&gt;System.out.print(b.length);&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;java script中:&lt;/p&gt;&lt;p&gt;一个中文识别为2 &lt;br /&gt;&lt;br /&gt;检验值是否小于指定长度 &lt;br /&gt;varField--值 &lt;br /&gt;limit_len--长度 &lt;br /&gt;返回值:数字 &lt;br /&gt;如&amp;gt;=0则符合 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function getLeftChars(varField,limit_len) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var i = 0; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var counter = 0; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var cap = limit_len;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var j=0; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i = 0; i&amp;lt; varField.value.length; i++) { &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (varField.value.charCodeAt(i) &amp;gt; 127 &amp;amp;line;&amp;amp;line; varField.value.charCodeAt(i) == 94) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j=j+2;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j=j+1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;//结束FOR循环 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//var leftchars = cap - varField.value.length;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var leftchars = cap - j;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return (leftchars); &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function onCharsChange(varField,a_str,a_limit) { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var leftChars = getLeftChars(varField,a_limit); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( leftChars &amp;gt;= 0) { &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return true; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } else { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ls_str = a_str + &amp;quot;超过字数(&amp;quot; + a_limit + &amp;quot;个)限制!&amp;quot;; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;window.alert(ls_str); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//var len = document.thform.ti.value.length + leftChars;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//document.login.message.value = document.login.ti.value.substring(0, len); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;varField.value=&amp;quot;&amp;quot; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return false;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;un&amp;quot; size=15 onblur=&amp;quot;onCharsChange(this,'用户名',20)&amp;quot; onchange=&amp;quot;onCharsChange(this,'用户名',20)&amp;quot;&amp;gt; &lt;table width=&quot;100%&quot; align=&quot;right&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;LINE-HEIGHT: 150%&quot; align=&quot;right&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;/span&gt;</description><category>web开发</category><pubDate>Tue, 14 Nov 2006 19:54:00 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497986.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497986.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235222/1237942</fs:itemid></item><item><title>cvs错误列表</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235223/1237942/1/item.html</link><description>&lt;p&gt;这里是你从 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 看到的部分错误消息列表。它不是一个完整的列表 –&lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 可以打印很多很多的错误消息，其中一部分通常由操作系统提供，这里是要列出通用和/或易误解的错误消息。 &lt;/p&gt;&lt;p&gt;这些消息按字母顺序排列，但是指导文字如 `&lt;samp&gt;&lt;span class=&quot;samp&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs update: &lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;' 不按这种次序。 &lt;/p&gt;&lt;p&gt;某些情况下列表包含了旧版本 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; (部分原因是因为用户在特定时刻无法确认所使用的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 版本) 打印的消息。 &lt;!-- If we want to start retiring messages, perhaps we --&gt;&lt;!-- should pick a cutoff version (for example, no more --&gt;&lt;!-- messages which are specific to versions before 1.9) --&gt;&lt;!-- and then move the old messages to an &quot;old messages&quot; --&gt;&lt;!-- node rather than deleting them completely. --&gt;&lt;/p&gt;&lt;dl&gt;&lt;!-- FIXME: What is the correct way to format a multiline --&gt;&lt;!-- error message here?  Maybe @table is the wrong --&gt;&lt;!-- choice?  Texinfo gurus? --&gt;&lt;dt&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;:&lt;/font&gt;&lt;/code&gt;&lt;var&gt;line&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;: Assertion '&lt;/font&gt;&lt;/code&gt;&lt;var&gt;text&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;' failed&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;准确的消息格式会因不同的系统而变。它指出 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 里面有 bug，参见 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/BUGS.html#BUGS&quot;&gt;BUGS&lt;/a&gt; 了解如何处理。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs &lt;/font&gt;&lt;/code&gt;&lt;var&gt;command&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;: authorization failed: server &lt;/font&gt;&lt;/code&gt;&lt;var&gt;host&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt; rejected access&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;连接 pserver 服务器，认证失败时的一般的响应。检查用户名与密码是否正确，在 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;inetd.conf&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 的 `&lt;samp&gt;&lt;span class=&quot;samp&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;--allow-root&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;' 是否允许 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;CVSROOT&lt;/font&gt;&lt;/code&gt;。参见 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/Password-authenticated.html#Password-authenticated&quot;&gt;Password authenticated&lt;/a&gt;。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs &lt;/font&gt;&lt;/code&gt;&lt;var&gt;command&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;: conflict: removed &lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt; was modified by second party&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;此消息显示你删除了一个文件，但同时另外有人还在修改它。要解决此冲突，首先要运行 `&lt;samp&gt;&lt;font face=&quot;新宋体&quot;&gt;&lt;span class=&quot;samp&quot;&gt;cvs add &lt;/span&gt;&lt;var&gt;file&lt;/var&gt;&lt;/font&gt;&lt;/samp&gt;'。如果需要，查看别人的修改以决定是否仍旧删除。如果不再删除，结束。如果仍要删除，继续执行 `&lt;samp&gt;&lt;font face=&quot;新宋体&quot;&gt;&lt;span class=&quot;samp&quot;&gt;cvs remove &lt;/span&gt;&lt;var&gt;file&lt;/var&gt;&lt;/font&gt;&lt;/samp&gt;' 命令并提交。 &lt;!-- Tests conflicts2-142b* in sanity.sh test for this. --&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cannot change permissions on temporary directory&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;&lt;pre class=&quot;example&quot;&gt;          Operation not permitted
     &lt;/pre&gt;&lt;p&gt;当我们在 Red Hat Linux 3.0.3 和 4.1 上测试客户机/服务器测试套件时，此消息以不重现和偶然的方式出现。我们不清楚造成的原因，也无法知道是否仅在 Linux (甚至是仅在某个特定的机器)上出现。如果问题出现在其他 Unix 机器上， `&lt;samp&gt;&lt;span class=&quot;samp&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;Operation not permitted&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;' 可能是读了 `&lt;samp&gt;&lt;span class=&quot;samp&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;Not owner&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;' 或者是有问题系统使用了 unix &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;EPERM&lt;/font&gt;&lt;/code&gt; 错误。如果你有其他信息补充，请参考 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/BUGS.html#BUGS&quot;&gt;BUGS&lt;/a&gt; 然后让我们知道。使用 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 时，你碰到这个错误，再执行操作应该可以工作良好。 &lt;!-- This has been seen in a variety of tests, including --&gt;&lt;!-- multibranch-2, multibranch-5, and basic1-24-rm-rm, --&gt;&lt;!-- so it doesn't seem particularly specific to any one --&gt;&lt;!-- test. --&gt;&lt;br /&gt;&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [server aborted]: Cannot check out files into the repository itself&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;产生这个消息明显的原因(特别是非客户机/服务器 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt;)，是由于 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 的根为，比如，&lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;/usr/local/cvsroot&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;，但你要检出到它的子目录，像 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;/usr/local/cvsroot/test&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;。但还有一种微妙的原因，是将服务器上的临时目录设为根的子目录(这也是不允许的)。如果这就是原因，将临时目录改成其他地方，例如 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;/var/tmp&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;; 参考 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/Environment-variables.html#Environment-variables&quot;&gt;Environment variables&lt;/a&gt; 里面的 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;TMPDIR&lt;/font&gt;&lt;/code&gt;，了解如何设置临时目录。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cannot commit files as 'root'&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;参阅 `&lt;samp&gt;&lt;span class=&quot;samp&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;'root' is not allowed to commit files&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;'. &lt;!-- For one example see basica-1a10 in the testsuite --&gt;&lt;!-- For another example, &quot;cvs co .&quot; on NT; see comment --&gt;&lt;!-- at windows-NT/filesubr.c (expand_wild). --&gt;&lt;!-- For another example, &quot;cvs co foo/bar&quot; where foo exists. --&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cannot open CVS/Entries for reading: No such file or directory&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;通常这是一个 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 内部错误，需要通过解决其他 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; bug 处理(参阅 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/BUGS.html#BUGS&quot;&gt;BUGS&lt;/a&gt;)。一般情况下有一个工作环境–性质决定于状态，但希望能指出。 &lt;!-- This is more obscure than it might sound; it only --&gt;&lt;!-- happens if you run &quot;cvs init&quot; from a directory which --&gt;&lt;!-- contains a CVS/Root file at the start. --&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [init aborted]: cannot open CVS/Root: No such file or directory&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;此消息是无害的。无其他错误时，操作可以成功执行。此消息不会出现在现在的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 版本里面，写在这里是为 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.9 和之前的版本。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs server: cannot open /root/.cvsignore: Permission denied&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [server aborted]: can't chdir(/root): Permission denied&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;参阅 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/Connection.html#Connection&quot;&gt;Connection&lt;/a&gt;. &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [checkout aborted]: cannot rename file &lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt; to CVS/,,&lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;: Invalid argument&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;该消息在 Solaris 2.5 的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.9 上偶尔会出现。原因不明; 如果你知道造成的原因请让我们知道，见 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/BUGS.html#BUGS&quot;&gt;BUGS&lt;/a&gt;。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [&lt;/font&gt;&lt;/code&gt;&lt;var&gt;command&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt; aborted]: cannot start server via rcmd&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;很不幸，如果你运行的客户端是 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.9，这是相对非特异性的错误消息，并在连接服务器时有错误。当前版本的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 应该显示更多特定的错误消息。如果你看到这个消息，并没有打算作为客户端，你应该指定 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;:local:&lt;/font&gt;&lt;/code&gt;，参考 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/Repository.html#Repository&quot;&gt;Repository&lt;/a&gt;。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;ci: &lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;,v: bad diff output line: Binary files - and /tmp/T2a22651 differ&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;在 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.9 和更早版本中，如果 &lt;span class=&quot;sc&quot;&gt;rcs&lt;/span&gt; 没有正确安装，提交二进制文件，将显示此消息。请再读一次 &lt;span class=&quot;sc&quot;&gt;rcs&lt;/span&gt; 发布版的指示以及 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 发布版的 &lt;span class=&quot;sc&quot;&gt;install&lt;/span&gt; 文件。或者，升级到当前的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 版本，它不会使用 &lt;span class=&quot;sc&quot;&gt;rcs&lt;/span&gt;，而是自己提交文件。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs checkout: could not check out &lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt; &lt;/dt&gt;&lt;dd&gt;在 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.9 中，这意味着 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;co&lt;/font&gt;&lt;/code&gt; 程序(&lt;span class=&quot;sc&quot;&gt;rcs&lt;/span&gt; 的一部分)返回错误。在此之前应该还有其他的错误消息，但没看到其他错误消息会让这个信息难以理解。在当前版本的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 中，因为不再使用 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;co&lt;/font&gt;&lt;/code&gt;，如果没有伴随其他错误消息，可以说是 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 的 bug (参阅 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/BUGS.html#BUGS&quot;&gt;BUGS&lt;/a&gt;)。 &lt;!-- My current suspicion is that the RCS in the rcs (not --&gt;&lt;!-- cvs/winnt/rcs57nt.zip) directory on the _Practical_ --&gt;&lt;!-- CD is bad (remains to be confirmed). --&gt;&lt;!-- There is also a report of something which looks --&gt;&lt;!-- very similar on SGI, Irix 5.2, so I dunno. --&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [login aborted]: could not find out home directory&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;意思是你需要设置环境变量，使得 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 可以找到 home 目录。参见 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/Environment-variables.html#Environment-variables&quot;&gt;Environment variables&lt;/a&gt; 里面的 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;HOME&lt;/font&gt;&lt;/code&gt;，&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;HOMEDRIVE&lt;/font&gt;&lt;/code&gt; 和 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;HOMEPATH&lt;/font&gt;&lt;/code&gt; 讨论。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs update: could not merge revision &lt;/font&gt;&lt;/code&gt;&lt;var&gt;rev&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt; of &lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;: No such file or directory&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;在 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.9 和更早的版本中，如果搜索 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;rcsmerge&lt;/font&gt;&lt;/code&gt; 程序有问题，将显示此消息。请确保它在你的 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;PATH&lt;/font&gt;&lt;/code&gt; 之中，或者更新到现在的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 版本，因为它不再使用外部的 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;rcsmerge&lt;/font&gt;&lt;/code&gt; 程序。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [update aborted]: could not patch &lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;: No such file or directory&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;意思是搜索 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;patch&lt;/font&gt;&lt;/code&gt; 程序遇到问题。请确保它在你的 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;PATH&lt;/font&gt;&lt;/code&gt; 之中。注意，尽管显示的消息不是指是否可以找到 &lt;var&gt;file&lt;/var&gt;。如果客户端和服务器都运行当前版本的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt;，它们不使用外部的 patch 程序，所以也不会有这样的消息。但如果客户端或服务器运行的是 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.9，那么你就要使用 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;patch&lt;/font&gt;&lt;/code&gt; 程序。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs update: could not patch &lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;; will refetch&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;这意味着客户端无论如何也不会打服务器发来的补丁。因为不能打补丁，只会降低速度，对 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 也没有影响，所以消息是无关紧要的。 &lt;!-- xref to update output.  Or File status? --&gt;&lt;!-- Or some place else that --&gt;&lt;!-- explains this whole &quot;patch&quot;/P/Needs Patch thing? --&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;dying gasps from &lt;/font&gt;&lt;/code&gt;&lt;var&gt;server&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt; unexpected&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;在 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.9.18 和更早的版本中，这是一个已知的 bug。我使用 `&lt;samp&gt;&lt;span class=&quot;samp&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;-t&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;' 全局选项时会重现。如果有人想了解情况，它已经被 Andy Piper 于 1997 年 11 月 14 日更改 src/filesubr.c 而修复。如果你见到这个消息，可在执行一次失败的操作，并让我们知道，见 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/BUGS.html#BUGS&quot;&gt;BUGS&lt;/a&gt;。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;end of file from server (consult above messages if any)&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;通常造成的原因是你使用了外部 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;rsh&lt;/font&gt;&lt;/code&gt; 程序，并返回一个错误。在这种情况下， &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;rsh&lt;/font&gt;&lt;/code&gt; 程序应该在上面消息前面打印一个错误消息。了解建立 CVS 客户机和服务器的更多信息，见 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/Remote-repositories.html#Remote-repositories&quot;&gt;Remote repositories&lt;/a&gt;。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [update aborted]: EOF in key in RCS file &lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;,v&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [checkout aborted]: EOF while looking for end of string in RCS file &lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;,v&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;这意味着在 &lt;span class=&quot;sc&quot;&gt;rcs&lt;/span&gt; 文件里面有语法错误。注意，即使 &lt;span class=&quot;sc&quot;&gt;rcs&lt;/span&gt; 可以正确读取这个文件; &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 要对 &lt;span class=&quot;sc&quot;&gt;rcs&lt;/span&gt; 文件做更多的错误检测。这也是从 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.9 升级到 1.10 时看到这个消息的原因。可能是硬件、操作系统或者类似的因素造成错误。当然，如果你发现是 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 造成的，请报告(参阅 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/BUGS.html#BUGS&quot;&gt;BUGS&lt;/a&gt;)。这个错误消息会因 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 在 &lt;span class=&quot;sc&quot;&gt;rcs&lt;/span&gt; 文件里面发现的不同语法错误，有其他一些变化。 &lt;p&gt;&lt;a name=&quot;index-mkmodules-806&quot;&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs commit: Executing 'mkmodules'&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;这个消息意味着你的参考是在 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.8 之前的版本下建立的。当使用 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.8 以后的版本，这个消息前会有 &lt;pre class=&quot;example&quot;&gt;          cvs commit: Rebuilding administrative file database
     &lt;/pre&gt;&lt;p&gt;如果你看到所有的两条消息，数据库重建了两次，虽没有必要，但是无害。如果你希望避免重复，并且没有使用 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.7 和更早的版本，对每个出现的 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;modules&lt;/font&gt;&lt;/code&gt; 文件，用删除 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;-i mkmodules&lt;/font&gt;&lt;/code&gt;。&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;modules&lt;/font&gt;&lt;/code&gt; 文件的更多信息，见 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/modules.html#modules&quot;&gt;modules&lt;/a&gt;。 &lt;!-- This message comes from &quot;co&quot;, and I believe is --&gt;&lt;!-- possible only with older versions of CVS which call --&gt;&lt;!-- co.  The problem with being able to create the bogus --&gt;&lt;!-- RCS file still exists, though (and I think maybe --&gt;&lt;!-- there is a different symptom(s) now). --&gt;&lt;!-- FIXME: Would be nice to have a more exact wording --&gt;&lt;!-- for this message. --&gt;&lt;br /&gt;&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;missing author&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;当你创建 RCS 文件时将用户名设为空，这条消息将显示。&lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 将假装创建一个作者字段没有值的非法的 RCS。解决方法是确保用户名非空并重新建立 RCS 文件。 &lt;!-- &quot;make sure your username is set&quot; is complicated in --&gt;&lt;!-- and of itself, as there are the environment --&gt;&lt;!-- variables the system login name, &amp;c, and it depends --&gt;&lt;!-- on the version of CVS. --&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [checkout aborted]: no such tag &lt;/font&gt;&lt;/code&gt;&lt;var&gt;tag&lt;/var&gt; &lt;/dt&gt;&lt;dd&gt;此消息的意思是 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 不知道 &lt;var&gt;tag&lt;/var&gt; 标签。经常是由于你打错了标签名。偶尔也会因创建的标签的用户没有权限写 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;CVSROOT/val-tags&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 文件(参考参阅 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/File-permissions.html#File-permissions&quot;&gt;File permissions&lt;/a&gt; 了解更多情况)。 &lt;p&gt;在 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.12.10 之前的版本里面，有时是一些隐含的原因造成，其中标签是在仓库里面的档案文件中创建，但是 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 要求用户试用其他的涉及此标签的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; &lt;!-- Search sanity.sh for &quot;no such tag&quot; to see some of --&gt;&lt;!-- the relatively obscure cases. --&gt;&lt;a name=&quot;index-CVSROOT_002fval_002dtags-file_002c-forcing-tags-into-807&quot;&gt;&lt;/a&gt;&lt;a name=&quot;index-val_002dtags-file_002c-forcing-tags-into-808&quot;&gt;&lt;/a&gt;命令，直到发现让 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 更新 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;val-tags&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 文件的命令，然后最初失败的命令才能工作。同样可以修理因前面权限造成 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;val-tags&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 过期的问题。每个标签只需要更新一次 - 一旦标签列入 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;val-tags&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 文件，它就留在那里。 &lt;/p&gt;&lt;p&gt;注意使用 `&lt;samp&gt;&lt;span class=&quot;samp&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;tag -f&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;' 不要求标签匹配，也不覆盖此检查(参阅 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/Common-options.html#Common-options&quot;&gt;Common options&lt;/a&gt;)。 &lt;br /&gt;&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;*PANIC* administration files missing&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;一般这是因为名为 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 的目录下并没有包含 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 使用的管理文件。如果这个问题是因为该 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 目录是由非 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 程序创建，那么简单的处理方法是将它改成其他名字。如果不是上述原因，这意味着是 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 的 bug (参阅 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/BUGS.html#BUGS&quot;&gt;BUGS&lt;/a&gt;)。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;rcs error: Unknown option: -x,v/&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;这条消息之后会紧跟着 &lt;span class=&quot;sc&quot;&gt;rcs&lt;/span&gt; 的使用方法。这意味着你使用的是旧版本的 &lt;span class=&quot;sc&quot;&gt;rcs&lt;/span&gt; (也许是你的操作系统提供的)，和旧版本的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt;。在 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.9.18 和更早的版本只与 &lt;span class=&quot;sc&quot;&gt;rcs&lt;/span&gt; 5 及以后的版本一起工作; 当前版本的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 不再需要运行 &lt;span class=&quot;sc&quot;&gt;rcs&lt;/span&gt; 程序。 &lt;!-- For more information on installing @sc{cvs}, see --&gt;&lt;!-- (FIXME: where?  it depends on whether you are --&gt;&lt;!-- getting binaries or sources or what). --&gt;&lt;!-- The message can also say &quot;ci error&quot; or something --&gt;&lt;!-- instead of &quot;rcs error&quot;, I suspect. --&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [server aborted]: received broken pipe signal&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;这条消息是因为 loginfo 程序从标准输入读取所有的日志信息失败造成。如果你发现它在其他环境下产生，请让我们知道，见 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/BUGS.html#BUGS&quot;&gt;BUGS&lt;/a&gt;。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;'root' is not allowed to commit files&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;当提交一个永久性的更改，&lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 会为提交修改的人建立一个日志条目。如果你的提交被当作 &amp;quot;root&amp;quot; (不是使用 &amp;quot;su&amp;quot; 或者其他具有 root 授权的程序) 记录，&lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 将无法判断是谁做了真正的修改。正因为此，CVS 默认不允许登录为 &amp;quot;root&amp;quot; 来提交。(你可以在 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;configure&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 里面加上 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;--enable-rootcommit&lt;/font&gt;&lt;/code&gt; 选项并重新编译来禁止此选项。在有些系统上面需要在编译 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 前修改对应的 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;config.h&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 文件)。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [server aborted]: Secondary out of sync with primary!&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;这通常出现在 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 运行在一个第二服务器上面，并且与第一服务器的版本不兼容 (参阅 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/Write-proxies.html#Write-proxies&quot;&gt;Write proxies&lt;/a&gt;)。如果客户端支持重定向，将不会发生。 &lt;p&gt;这里版本号并不重要，但是支持列表需要服务器提供给客户端。例如，即使两台服务器使用相同的版本，如果第二服务器编译的有 GSSAPI 支持，然而第一服务器没有，那么两个服务器提供的支持列表会不同，并且第二服务器将不能作为第一服务器的传输代理。反之，如果两个服务器版本不同，但都提供相同的客户端请求支持，那么传输代理可以成功。 &lt;br /&gt;&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;Terminated with fatal signal 11&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;该信息表示 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; (服务器，如果你使用的是客户端/服务器模式) (虚拟)内存溢出。虽然 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 尽力捕获错误并给出有意义的信息，在有些条件下仍无法获得。如果你有大量的系统内存，这个问题可能存在于系统对单一进程或类似限制可以使用的内存。显示和设置这种限制的方法因系统而不同，如果你不知道如何处理，请询问你所使用系统的专家。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;Too many arguments!&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;一般该消息是 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;log.pl&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 脚本打印，此脚本位于 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 源码发布版的 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;contrib&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 目录下面。在某些版本的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 中，&lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;log.pl&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 是 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 默认安装的一部分。&lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;log.pl&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 脚本从 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;loginfo&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 管理文件里面调用。请检查传递给 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;loginfo&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 的参数是否匹配你所用的 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;log.pl&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 脚本。特别是 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.3 和更早的版本里面的 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;log.pl&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 用日志文件作为参数，而 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 1.5 和更新的版本的 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;log.pl&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 需要用 `&lt;samp&gt;&lt;span class=&quot;samp&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;-f&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;' 来指定日志文件。当然，如果你不需要 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;log.pl&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;，请从 &lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;loginfo&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 里面将其注释掉。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [update aborted]: unexpected EOF reading &lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;,v&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;参见 `&lt;samp&gt;&lt;span class=&quot;samp&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;EOF in key in RCS file&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;'. &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs [login aborted]: unrecognized auth response from &lt;/font&gt;&lt;/code&gt;&lt;var&gt;server&lt;/var&gt; &lt;/dt&gt;&lt;dd&gt;这个消息一般是指服务器没有正确建立。例如，&lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;inetd.conf&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 指向了一个不存在的 cvs 执行文件。为了进一步调试，请查找 inetd 的日志文件(&lt;samp&gt;&lt;span class=&quot;file&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;/var/log/messages&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt; 或者其他你系统里面 inetd 所采用的)。详细情况，参阅 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/Connection.html#Connection&quot;&gt;Connection&lt;/a&gt;，和 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/Password-authentication-server.html#Password-authentication-server&quot;&gt;Password authentication server&lt;/a&gt;。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs commit: Up-to-date check failed for `&lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;'&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;它的意思是自从你上次 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs update&lt;/font&gt;&lt;/code&gt; 以后，有人提交了这个文件的修改。所以，在进行 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs commit&lt;/font&gt;&lt;/code&gt; 之前需要先 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs update&lt;/font&gt;&lt;/code&gt;。&lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 将合并你与他人所做的修改。如果没有检测到冲突，将提示 `&lt;samp&gt;&lt;font face=&quot;新宋体&quot;&gt;&lt;span class=&quot;samp&quot;&gt;M &lt;/span&gt;&lt;var&gt;file&lt;/var&gt;&lt;/font&gt;&lt;/samp&gt;'，你可以进行 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs commit&lt;/font&gt;&lt;/code&gt;。如果发现冲突，将打印 `&lt;samp&gt;&lt;font face=&quot;新宋体&quot;&gt;&lt;span class=&quot;samp&quot;&gt;C &lt;/span&gt;&lt;var&gt;file&lt;/var&gt;&lt;/font&gt;&lt;/samp&gt;'，你需要手动解决冲突。要了解更详细的处理过程，见 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/Conflicts-example.html#Conflicts-example&quot;&gt;Conflicts example&lt;/a&gt;。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;Usage: diff3 [-exEX3 [-i | -m] [-L label1 -L label3]] file1 file2 file3&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;&lt;pre class=&quot;example&quot;&gt;          Only one of [exEX3] allowed
     &lt;/pre&gt;&lt;p&gt;这指明了安装 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;diff3&lt;/font&gt;&lt;/code&gt; 和 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;rcsmerge&lt;/font&gt;&lt;/code&gt; 的问题。特别是 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;rcsmerge&lt;/font&gt;&lt;/code&gt; 编译需要寻找 GNU diff3，但由搜索到的 unix diff3 替代。确切的消息内容会根据不同的系统变化。最简单的解决方法是升级当前的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 版本，它不再需要使用外部的 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;rcsmerge&lt;/font&gt;&lt;/code&gt; 或 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;diff3&lt;/font&gt;&lt;/code&gt; 程序。 &lt;br /&gt;&lt;/p&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;warning: unrecognized response `&lt;/font&gt;&lt;/code&gt;&lt;var&gt;text&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;' from cvs server&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;假如 &lt;var&gt;text&lt;/var&gt; 包含有意义的回答(像 `&lt;samp&gt;&lt;span class=&quot;samp&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;ok&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;')，跟随着一个额外的回车符(在某些系统上，这会使第二部分的消息覆盖第一部分)，那么也许是你用 `&lt;samp&gt;&lt;span class=&quot;samp&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;:ext:&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;' 访问方式所采用的 rsh 程序，如非 unix 的 rsh 版本，它们默认不提供传输数据报文。在这种情况下，你也许需要采用 `&lt;samp&gt;&lt;span class=&quot;samp&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;:server:&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;' 替代 `&lt;samp&gt;&lt;span class=&quot;samp&quot;&gt;&lt;font face=&quot;新宋体&quot;&gt;:ext:&lt;/font&gt;&lt;/span&gt;&lt;/samp&gt;'。如果 &lt;var&gt;text&lt;/var&gt; 是其他内容，它预示着你的 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 服务器有问题。请再次确认安装是否符合 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 服务器架设的要求。 &lt;!-- FIXCVS: should be printing CR as \r or \015 or some --&gt;&lt;!-- such, probably. --&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs commit: [&lt;/font&gt;&lt;/code&gt;&lt;var&gt;time&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;] waiting for &lt;/font&gt;&lt;/code&gt;&lt;var&gt;user&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;'s lock in &lt;/font&gt;&lt;/code&gt;&lt;var&gt;directory&lt;/var&gt; &lt;/dt&gt;&lt;dd&gt;这是一条普通消息，不是错误。参见 &lt;a href=&quot;http://www.soforge.com/cvsdoc/zh_CN/Concurrency.html#Concurrency&quot;&gt;Concurrency&lt;/a&gt; 了解详细情况。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs commit: warning: editor session failed&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;&lt;a name=&quot;index-Exit-status_002c-of-editor-809&quot;&gt;&lt;/a&gt;这是指 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 使用的编辑器返回了非零状态。一些版本的 vi 即使编辑正常也会这样。那么将 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;CVSEDITOR&lt;/font&gt;&lt;/code&gt; 环境变量指向一个小的脚本，如: &lt;pre class=&quot;example&quot;&gt;          #!/bin/sh
          vi $*
          exit 0
     &lt;/pre&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs update: warning: &lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt; was lost&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;这意味着 &lt;var&gt;file&lt;/var&gt; 的工作副本被删除，但并没有从 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 清除。不必担心，update 将从仓库重建本地文件。(这也是放弃本地更改的常用方法: 删除它，然后执行 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs update&lt;/font&gt;&lt;/code&gt;)。 &lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;cvs update: warning: &lt;/font&gt;&lt;/code&gt;&lt;var&gt;file&lt;/var&gt;&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt; is not (any longer) pertinent&lt;/font&gt;&lt;/code&gt; &lt;/dt&gt;&lt;dd&gt;这意味着 &lt;var&gt;file&lt;/var&gt; 的工作副本已经删除，但在当前的工作目录里面没有使用 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 删除，但却在其他的工作目录中用 &lt;span class=&quot;sc&quot;&gt;cvs&lt;/span&gt; 删除。不必担心，update 将彻底删除本地的文件。 &lt;/dd&gt;&lt;/dl&gt;</description><category>解决方案</category><pubDate>Tue, 14 Nov 2006 17:33:01 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497985.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497985.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235223/1237942</fs:itemid></item><item><title>英特尔迅驰(R)移动计算技术详述</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235224/1237942/1/item.html</link><description>&lt;h4 class=&quot;TextColor1&quot; id=&quot;subjcns!A9B9A893A778D4CA!131&quot; style=&quot;MARGIN-BOTTOM: 0px&quot;&gt;英特尔迅驰(R)移动计算技术详述&lt;/h4&gt;&lt;div id=&quot;msgcns!A9B9A893A778D4CA!131&quot;&gt;&lt;div&gt;随着笔记本电脑性能的不断提升，价格的不断下降，越来越多的消费者把笔记本电脑列入采购计划中。但是，面对众多的品牌和型号，该如何选择呢？相信很多网站和媒体都给出了各种各样的选购指南。本文将对读者在阅读这些选购指南时经常听到的“迅驰”（图1）做一个详细的解释和叙述。 &lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;/div&gt;&lt;p align=&quot;center&quot; /&gt;&lt;div&gt;&amp;nbsp;　　现在对于迅驰的叫法五花八门，有人说“迅驰笔记本”，有人说“迅驰技术”，有人说“迅驰平台”，更有人说“迅驰处理器”。有些消费者面对这么多名称，再加上稍微知道英特尔公司的主要产品是处理器，就以为迅驰是笔记本电脑处理器的名称。实际上“迅驰处理器”的说法是错误的。“迅驰”的完整名称是“英特尔&amp;reg;迅驰&amp;#8482;移动计算技术”，这种技术是一个平台技术。所谓平台，就是指由多个部件共同组成的一个整体，该整体取代了原先分立的部件，成为产品的基本组成部分。那么，迅驰作为一个用于笔记本电脑的平台技术，是由三个部件组成的。这三个部件包括一颗中央处理器（CPU）(图2)、一套主板芯片组（图3）和一块无线网卡（图4）。所以，前面提到的迅驰笔记本、迅驰技术、迅驰平台都是合理的说法，所表示的意思也都一致，即如果说一台笔记本采用了英特尔&amp;reg;迅驰&amp;#8482;移动计算技术，则这台笔记本一定是采用了指定的处理器、主板芯片组和无线网卡。如果缺少其中任何一个部件，则这台笔记本不能冠以“迅驰”的称号。&lt;/div&gt;&lt;p&gt;　　说到这里，许多人会问，这“指定的”处理器、主板芯片组和无线网卡具体是什么型号的？怎么辨别呢？要回答这个问题，那就需要了解“迅驰”的发展历程。&lt;/p&gt;&lt;p&gt;　　英特尔&amp;reg;迅驰&amp;#8482;移动计算技术最早于2003年1月9日由英特尔公司推出。至今已经发展到第三代。根据前文所述，迅驰是一个平台技术，由三个部件组成。这三代迅驰平台所采用的组件各不相同，越新的平台，其所采用的组件性能越好，而功耗则基本保持不变甚至有所降低。下面，本文对这三代迅驰平台所采用的组件分别进行介绍。&lt;/p&gt;&lt;p&gt;　　第一代迅驰：2003年1月9日所推出的迅驰是第一代，在英特尔内部，它的研发代号叫Carmel，其正式的商用名就是“英特尔&amp;reg;迅驰&amp;#8482;移动计算技术”。第一代迅驰所采用的三个组件是：“英特尔&amp;reg;奔腾&amp;reg;M处理器”（图5）、“英特尔&amp;reg;855芯片组”和“英特尔&amp;reg;PRO/无线2100网卡”。&lt;/p&gt;&lt;p align=&quot;left&quot;&gt;　　其中的CPU——“英特尔&amp;reg;奔腾&amp;reg;M处理器”——在当时是一款全新架构的处理器，与同一时期市场上普遍使用的英特尔&amp;reg;奔腾&amp;reg;4-M处理器完全不同。这款英特尔&amp;reg;奔腾&amp;reg;M处理器的内部研发代号是Banias。当时笔记本所采用的移动式英特尔&amp;reg;奔腾&amp;reg;4-M处理器（图6）与台式机所使用的英特尔&amp;reg;奔腾&amp;reg;4处理器在架构上完全相同，都是NetBurst架构。而这款新推出的英特尔&amp;reg;奔腾&amp;reg;M处理器采用了全新的架构。英特尔并没有为这种架构起一个新的名字，当时官方的叫法就是“奔腾-M处理器微体系结构”。根据当时官方的说法，这种“奔腾-M处理器微体系结构旨在通过增加每周期执行的指令数实现高性能和低功耗，同时满足笔记本电脑的散热要求。” 有一定技术背景的读者看到这里，可以发现，这种说法与今天全新的英特尔&amp;reg;酷睿&amp;#8482;2处理器所采用酷睿微架构有几分相似之处。由此可见，早在2003年初，英特尔就已经提出了能耗比的概念，并且应用在产品中。所以，今天推出的“极速之魔”——英特尔&amp;reg;酷睿&amp;#8482;2处理器并不是突然蹦出来的，也不是迫于竞争压力搞什么突击攻关抢出来的，而是在已有的产品线中，挑选出具有发展潜力的一部分，再经过长期的深入研发和市场考验，综合市场需求与技术实力所推出的。这似乎又印证了王选教授的那句话：“没有市场眼光，就不可能看到什么样的技术有价值；如果不占领技术制高点，也不会夺得更高的市场份额。”这也反映出英特尔作为世界领先的芯片创新企业，在市场运作与技术研发上的强大实力。&lt;/p&gt;&lt;p align=&quot;center&quot; /&gt;&lt;p&gt;&amp;nbsp;　让我们再看一下第一代迅驰的其他组件。“英特尔&amp;reg;855芯片组”是笔记本电脑主板上所使用芯片组（图7）。这款芯片组主要分两种，一种是集成显卡的，一种是非集成显卡的。集成显卡的芯片组包括英特尔&amp;reg; 855GM芯片组和英特尔&amp;reg; 855GME芯片组，这两种芯片组都集成了英特尔&amp;reg;极速图形引擎2（Intel&amp;reg; Extreme Graphics 2）显卡。它们之间的区别是：英特尔&amp;reg; 855GME芯片组在与DDR 333内存组合使用时，可带来比855GM更高的集成显卡性能。没有集成显卡的芯片组叫做英特尔&amp;reg; 855PM 芯片组，这款芯片组提供了一个AGP4X接口，可以连接一块独立显卡。&lt;/p&gt;&lt;p&gt;　 “英特尔&amp;reg;PRO/无线2100网卡”（图8）在当时是一个全新的组件。普通网卡都是通过网线连接到网络上的。所以在以前，尽管笔记本电脑可以拔掉电源线，使用电池工作，但是想上网，绝大部分都要插上网线才行。这大大限制了笔记本电脑的移动性。而无线网卡能够通过微波信号传输数据，可以不用网线就连接到网络，使用非常方便。在当时已经有一些PCMCIA或USB接口的无线网卡，但是由于兼容性和电源管理上的问题，应用受到较大限制。英特尔&amp;reg;PRO/无线2100网卡是一款内置的无线网卡，它插在笔记本电脑内部的一个叫作mini-PCI的插槽上。通过精心设计，这款内置的无线网卡与整个系统之间具有良好的兼容性，并能实时根据需求进行功耗调节，从而延长了电池的使用寿命。英特尔&amp;reg;PRO/无线2100网卡只支持802.11b协议。实际上，还有一款支持802.11a协议的“英特尔&amp;reg;PRO/无线2100A网卡”，但这款无线网卡国内很少见到。关于这里所说的802.11b协议、802.11a协议，已经了解的读者可以跳过下面的介绍，不了解的读者可以继续往下看。前面说过无线网络使用微波信号传输数据，那么，必须制定一套协议来对所使用的微波信号做出规定，否则，各个厂商之间的产品就无法互相联通。这套协议就叫作IEEE 802.11协议。802.11协议又有许多子协议，例如刚才提到的802.11a、802.11b等。这两个子协议都是用来规定微波信号的细节的。802.11a协议规定所使用的微波信号的载波频率是5GHz（注意这里的5GHz与描述CPU主频的3GHz或5GHz等是不同的）。在12米半径内，两个802.11a设备之间的最大数据传输速率是54Mbps，而在12米到91米半径之间，其数据传输速率随半径的增大而降低，最低为6Mbps。超过91米则基本上无法进行通信。注意上述数据都是指在空旷的室内环境，设备之间没有任何障碍。802.11b协议规定所使用的微波信号的载波频率是2.4GHz（同样，这里的2.4GHz与描述CPU主频的2.4GHz等是不同的，同时，也并不意味着使用2.4GHz载波频率的协议一定比使用5GHz的协议传输速度慢，载波频率与数据传输速度之间的关系很复杂，并不是简单的单调递增关系）。在30米半径内，两个802.11b设备之间的最大数据传输速率是11Mbps，而在30米到91米半径之间，其数据传输速率随半径的增大而降低，最低为1Mbps。超过91米则基本上无法进行通信。这时可以看出，802.11b协议比802.11a协议所规定的数据传输速度慢。但是由于采用802.11b协议设备成本低，所以得到了更加广泛的应用。为了进一步提高802.11b协议的速度，后来人们提出了802.11g协议。802.11g协议使用的微波信号的载波频率与802.11b协议完全相同，均为2.4GHz，但其最大数据传输速度得到了较大的提升。在30米半径内，两个802.11g设备之间的最大数据传输速率是54Mbps，而在30米到91米半径之间，其数据传输速率随半径的增大而降低，最低为1Mbps。超过91米则基本上无法进行通信。可以看到，802.11g协议实现了与802.11a协议相同的最大数据传输速度。而采用802.11g协议的设备与802.11b设备一样具有较低的成本，且与802.11b协议兼容。这意味着任何一个支持802.11g协议的设备，都可以同时支持802.11b设备。因此，现在802.11g协议得到了更为广泛的应用。但802.11a协议与802.11b/g协议不兼容，因而现在使用802.11a协议的设备，尤其是无线接入点和无线路由器，在国内还是非常少见。为了方便读者查询，本文将上述对这三种协议的描述列于表一。&lt;/p&gt;&lt;p&gt;　　第一代迅驰平台发布后，凭借着“突破的移动计算性能”、“延长的电池使用时间”、“轻薄的外形”和“集成的无线局域网能力”这四大设计目标，很快取代了之前的基于英特尔&amp;reg;奔腾&amp;reg;4-M处理器的笔记本电脑，获得了消费者的青睐。不过，随着英特尔&amp;reg;迅驰&amp;#8482;移动计算技术的不断发展，以及后续产品价格的不断降低，第一代迅驰已经渐渐淡出市场，事实上，第一代迅驰在技术上也已经相对落后了。但是，迅驰的理念和设计目标却一直延续下来，并且得到不断的创新和发展。&lt;/p&gt;&lt;p&gt;　　第二代迅驰：2005年1月19日，第二代迅驰发布了。第二代迅驰的内部研发代号叫Sonoma。第二代迅驰的正式商用名称与第一代迅驰一样，仍然叫“英特尔&amp;reg;迅驰&amp;#8482;移动计算技术”。虽然名称一样，但三大组件发生了变化。第二代迅驰所用的CPU也叫“英特尔&amp;reg;奔腾&amp;reg;M处理器”，但与第一代迅驰所用的英特尔&amp;reg;奔腾&amp;reg;M处理器有较大的不同，性能得到提高。第二代迅驰所用的主板芯片组是“移动式英特尔&amp;reg;915高速芯片组”，无线网卡是“英特尔&amp;reg;PRO/无线2200bg网卡”或“英特尔&amp;reg;PRO/无线2915abg网卡”。下面分别对第二代迅驰所用的这些组件进行介绍。&lt;/p&gt;&lt;p&gt;　　第二代迅驰所用的英特尔&amp;reg;奔腾&amp;reg;M处理器的内部研发代号叫作Dothan（现在，英特尔&amp;reg;奔腾&amp;reg;M处理器的标志已经更换，见图9）。比起第一代迅驰所采用的CPU——Banias，Dothon的性能更高，功耗却没有增加。主要体现在以下三方面：第一，Dothon采用了90nm工艺和应变硅技术，在性能提高的同时，能够保持功耗不变；第二，相比Banias的400MHz前端总线，Dothon的前端总线提升到533MHz，使得CPU与内存之间的数据交换更快。第三，Dothon具有最大2MB的二级高速缓存，比Banias的1MB二级高速缓存提高了一倍。根据英特尔官方提供的数据，MobileMark 2002的性能测试中，Dothon的性能比Banias最大提高了25%，而电池使用时间却并没有缩短。看到这里，许多读者会有一个疑问，那就是Banias和Dothon的商用名都叫作“英特尔&amp;reg;奔腾&amp;reg;M处理器”，那么拿到一台笔记本电脑后，怎么区分这两种处理器呢？要准确区分这两种处理器，可以看制作工艺和二级缓存。使用90nm工艺的，具有2MB二级缓存的英特尔&amp;reg;奔腾&amp;reg;M处理器就是Dothon，使用130nm工艺的，具有1MB二级缓存的英特尔&amp;reg;奔腾&amp;reg;M处理器则是Banias。不能通过前端总线是533MHz还是400MHz来区分这两种处理器，这是因为Dothon这款CPU的发布时间要早于第二代迅驰平台Sonoma的发布时间。而当时第一代迅驰平台所采用的855芯片组不支持533MHz前端总线，所以为了能让消费者早日体验Dothon处理器的强大性能，当时首先推出的Dothon处理器仍旧采用400MHz前端总线，可以安装在使用855芯片组的主板上（当然也可以安装在第二代迅驰所采用的915主板上）。现在这种400MHz前端总线的Dothon处理器虽然较少，但仍在市面上可以看到。400MHz前端总线Dothon处理器的性能要略微低于主频相同的533MHz前端总线Dothon处理器，当然，前者的价格也要略低于后者。而二者的功耗基本相同。所以消费者在选购的时候可以根据需要选择。另外，也可以从处理器号上来区分这两种Dothon处理器。处理器号个位是0的，例如“英特尔&amp;reg;奔腾&amp;reg;M处理器730”是533MHz前端总线的Dothon处理器，而处理器号各位是5的，例如“英特尔&amp;reg;奔腾&amp;reg;M处理器725”是400MHz前端总线的Dothon处理器。英特尔官方网站上给出了每种处理器号所对应的制造工艺、二级高速缓存等参数。但由于前面所说的Dothon、Banias都是内部研发代号，所以在网站的正式介绍中是不会提到的。只要读者根据上文所说的辨别方法，即可区分这两种处理器。另外，当拿到一台笔记本电脑后，除了可以根据配置清单上的型号知道这台笔记本到底使用了什么处理器之外，也可以利用Intel&amp;reg; Processor Identification Utility或CPU-Z等小软件在电脑上运行一下，即可检测出CPU的参数和类型。&lt;/p&gt;&lt;p align=&quot;center&quot; /&gt;&lt;p align=&quot;center&quot; /&gt;&lt;p&gt;　　第二代迅驰所采用的主板芯片组——“移动式英特尔&amp;reg;915高速芯片组”——是一款革命性的全新芯片组（图10）。之所以说它是“革命性”的，是因为这款芯片组引入了太多的新技术。第一，915芯片组引入了PCI Express总线结构，简称PCI-E总线。相比起之前的PCI总线以及AGP总线，PCI-E总线的速度得到极大提高。所以，现在需要高带宽的显卡纷纷采用了PCI-E接口，以提高性能。第二，915芯片组开始支持DDR2内存。DDR2内存具有实现更高读写速度的潜力。虽然在DDR2内存规范刚推出时，评测显示与同样外部工作频率的DDR内存相比，DDR2内存的性能并没有明显提升，反而会稍微落后，但是由于在相同外部工作频率下，DDR2内存的内部工作频率可以降低到DDR内存的一半，所以DDR2内存具有进一步提高工作频率的潜力，而DDR内存已经没有更大的发展空间了。由此可以看到，作为世界领先的芯片创新企业，英特尔公司是在主动地推动技术向前发展的。在一种技术失去发展前途后，英特尔公司主动与业界相关企业联合制定新的标准和规范，从而取代旧的技术，推动技术的向前发展。第三，915芯片组支持串行ATA设备（Serial ATA，简称SATA）。实际上，在台式机主板上，早在865芯片组时期就已经支持SATA设备了。而在笔记本上，从915芯片组开始才支持SATA设备。目前，已经有多个厂商开始使用笔记本专用的2.5英寸SATA接口硬盘了。第四，915芯片组支持高清晰音频。英特尔公司同多个厂商合作，共同推出了高清晰音频规范，来取代使用多年的AC’97音频规范。高清晰音频支持杜比的一系列技术。在采用915芯片组的笔记本电脑上，插上杜比环绕立体声耳机，便可以享受环绕立体声的音频效果。当然，笔记本电脑上的高清晰音频与台式机电脑上的高清晰音频还是有一定差别的。台式机电脑上的音频模拟信号输出接口有3到4个，分别对应前置喇叭、后置喇叭、环绕喇叭、中置喇叭和低音炮。而笔记本电脑上的音频模拟信号输出接口只有一个，必须配合杜比环绕立体声耳机才能享受高清晰音频。第五，移动式英特尔&amp;reg;915高速芯片组仍然分为两种，一种是集成显卡的，一种是不集成显卡的。集成显卡的有两款，分别叫做“移动式英特尔&amp;reg;915GM高速芯片组”和“移动式英特尔&amp;reg;915GMS高速芯片组”。这两款集成显卡的915芯片组所集成的显卡叫做“英特尔&amp;reg;图形媒体加速器900”（Intel&amp;reg; GMA900）显卡。这款集成显卡性能比上一代855GM芯片组集成的英特尔&amp;reg;极速图形引擎2（Intel&amp;reg; Extreme Graphics 2）显卡大为提升。英特尔官方给出的评测数据显示，3DMark 2001 SE Pro性能测试中，GMA900集成显卡的性能是Extreme Graphics 2集成显卡的211%（整体结果）。另外，GMA900集成显卡支持高清晰视频，可以流畅播放高达1080线的影片，并且支持宽屏显示效果。再加上集成显卡非常好的省电效果，使得使用集成显卡的笔记本电脑的电池使用时间大为延长。所以，对于许多消费者，这种集成显卡的笔记本电脑成为他们的最佳选择。915GM芯片组是用来配合主流处理器使用的，而915GMS芯片组是配合低电压版处理器使用的，所以性能比915GM芯片组低，但功耗更低。不集成显卡的915芯片组叫做“移动式英特尔&amp;reg;915PM高速芯片组”，支持PCI-Express接口，可以连接一款独立显卡。通过上述几大特点的介绍，可以看到移动式英特尔&amp;reg;915高速芯片组对于笔记本电脑来说的确是一款革命性的产品，大大提高了笔记本电脑的性能和应用范围。&lt;/p&gt;&lt;p&gt;　　第二代迅驰所采用的无线网卡有两种，分别是“英特尔&amp;reg;PRO/无线2200bg网卡”（图11）或“英特尔&amp;reg;PRO/无线2915abg网卡”（图12）。英特尔&amp;reg;PRO/无线2200bg网卡支持802.11b和802.11g两种协议。根据前文的叙述，这种网卡应该工作在2.4GHz载波频率下，最大传输速率为11Mbps（802.11b）或54Mbps（802.11g）。那么到底在实际使用时工作在802.11b协议下还是802.11g协议下呢？实际情况会比较复杂。简单说主要取决于无线局域网的接入点的类型。如果接入点支持802.11g协议，则网卡一般可以工作在802.11g协议下，实现最大54Mbps的传输速率。否则，只能工作在802.11b协议下，传输速度为11Mbps。另外一款无线网卡——英特尔&amp;reg;PRO/无线2915abg网卡——支持802.11a、802.11b和802.11g三种协议。在实际使用时工作在哪种协议下也主要取决于与之互联的无线设备的类型。这里需要提到的是，借助第二代迅驰强大的无线联网能力，两台或多台笔记本之间不需要任何设备和线缆就能进行点对点网络连接。在没有无线网卡的时代，两台电脑之间想要不借助集线器或交换机等第三方设备进行网络互联的话，必须使用交叉以太网线（Crosslink Ethernet Cable），俗称双机对联线。有了无线网卡，两台电脑之间可以使用无线网卡的“Ad hoc”模式直接实现点对点连接，进而可以互相共享文件夹或使用FTP软件在两台电脑之间传输数据。但是第一代迅驰所使用的英特尔&amp;reg;PRO/无线2100网卡只支持最大11Mbps的传输速度，远远慢于有线网的100Mbps的传输速度，这使得两台电脑之间在传送大文件时需时很长。而第二代迅驰所使用的无线网卡都支持最大54Mbps的传输速度，完全可以满足数据传输的要求。加之这种无线点对点连接不需要任何其他设备或线缆，使用起来非常方便。&lt;/p&gt;&lt;p&gt;　　第二代迅驰凭借着多项革命性的创新，大大拓宽了笔记本电脑在各个领域的应用，尤其是在娱乐方面性能得到明显提升，可以同主流台式机产品抗衡。其优秀的功耗控制使得笔记本电脑的外型可以做的更加轻薄，电池使用时间大为延长，许多机型都可以达到最大十个多小时的电池使用时间。加之更加方便、快速的无线局域网连接，使得第二代迅驰，即Sonoma平台在市场上经久不衰。随着产量的增大，单一部件成本不断降低，采用Sonoma平台的笔记本电脑的价格不断下降，一线厂商主流产品的价位已经逼近台式机，从而使得Sonoma笔记本成为许多消费者的选购目标。&lt;/p&gt;&lt;p&gt;　　第三代迅驰：第三代迅驰发布于2006年1月9日，它的内部研发代号为“Napa”。第三代迅驰的发布代表着笔记本电脑领域双核时代的到来，是标志性的产品，因此，英特尔给第三代迅驰一个新的商品名：“英特尔&amp;reg;迅驰&amp;#8482;双核移动计算技术”，并且设计了一个新标志（图12）。英特尔&amp;reg;迅驰&amp;#8482;双核移动计算技术仍然是一种平台技术，仍然由三大组件组成。但这三大组件与第二代迅驰相比又发生了许多变化。英特尔&amp;reg;迅驰&amp;#8482;双核移动计算技术（简称为“迅驰双核”）所采用的CPU叫做“英特尔&amp;reg;酷睿&amp;#8482;双核处理器”（简称为酷睿双核）。可以看到，英特尔为这款全新的CPU起了一个全新的名字，足见其跨时代的意义。迅驰双核所采用的芯片组是“移动式英特尔&amp;reg;945高速芯片组”，新的无线网卡是“英特尔&amp;reg;PRO/无线3945abg网卡”。当然，也可以在第三代迅驰上使用“英特尔&amp;reg;PRO/无线2200bg网卡”或“英特尔&amp;reg;PRO/无线2915abg网卡”，同样叫做迅驰双核。另外，在酷睿双核处理器发布的同时，英特尔还发布了另一款处理器，叫做“英特尔&amp;reg;酷睿&amp;#8482;单核处理器”（简称为酷睿单核）。酷睿单核处理器只有一个物理核心，它的架构与酷睿双核处理器类似，却与代号Dothon的奔腾M处理器有较大的不同。如果把上述迅驰双核的三大组件中的“英特尔&amp;reg;酷睿&amp;#8482;双核处理器”替换成“英特尔&amp;reg;酷睿&amp;#8482;单核处理器”，其他组件不变，则这种迅驰平台的商品名叫做“英特尔&amp;reg;迅驰&amp;#8482;移动计算技术”，与第二代迅驰的商品名相同（但标志不同，见图13）。不过鉴于主要部件与第二代迅驰有很大不同，所谓我们把这种采用酷睿单核处理器的英特尔&amp;reg;迅驰&amp;#8482;移动计算技术仍然归类于第三代迅驰，简称为迅驰单核，以区别于迅驰双核。&lt;/p&gt;&lt;p&gt;　　迅驰双核的CPU——“英特尔&amp;reg;酷睿&amp;#8482;双核处理器”（图13）——是第一款移动双内核处理器。酷睿双核的内部研发代号是“Yonah”，它使用了更先进的65nm工艺，进一步缩小了核心面积，因而可以把两个相同的物理核心做到一个芯片上。这两个核心共享同一个二级高速缓存。这意味着两个核心之间可以通过二级高速缓存交换数据，大大加快了核心间的数据交换速度。根据英特尔官方提供的数据，凭借着酷睿双核处理器的强大性能和更低功耗，迅驰双核平台比上一代Sonoma平台的整体性能提高了68%，而平均功耗下降了28%。有的读者可能会有疑问，虽然双核处理器性能如此强大，但双内核是否需要特殊的软件支持呢？要回答这个问题，首先需要了解日常应用中的两种典型模式。一种应用模式是一个程序采用了线程级并行编程，那么这个程序在运行时可以把并行的线程同时交付给两个核心分别处理，因而程序运行速度得到极大提高。这类程序有的是为多路工作站或服务器设计的专业程序，例如专业图像处理程序、非线视频编缉程序、动画制作程序或科学计算程序等。对于这类程序，两个物理核心和两颗处理器基本上是等价的，所以，这些程序往往可以不作任何改动就直接运行在双核电脑上。还有一些更常见的日常应用程序，例如Office、IE等，它们同样也是采用线程级并行编程，可以在运行时同时调用多个线程协同工作，所以在双核处理器上的运行速度也会得到较大提升。例如，打开IE浏览器上网。看似简单的一个操作，实际上浏览器进程会调用代码解析、Flash播放、多媒体播放、Java、脚本解析等一系列线程，这些线程可以并行地被双核处理器处理，因而运行速度大大加快（实际上IE浏览器的运行还涉及到许多进程级的交互通信，这里不再详述）。由此可见，对于已经采用并行编程的软件，不管是专业软件，还是日常应用软件，在酷睿双核处理器上的运行速度都会大大提高。日常应用中的另一种模式是同时运行多个程序。许多程序没有采用并行编程，例如一些文件压缩软件、部分游戏软件等等。对于这些单线程的程序，单独运行在双核处理器上与单独运行在同样参数的单核处理器上没有明显的差别。但是，由于日常使用的最最基本的程序——操作系统——是支持并行处理的，所以，当我们在双核处理器上同时运行两个单线程程序的时候，操作系统会把两个程序的指令分别发送给两个核心，从而使得同时完成两个程序的速度大大加快。例如，在进行文件压缩的同时，可以观看视频；在进行杀毒的同时，可以玩游戏；在进行视频编辑或图象渲染的同时，可以制作Flash动画；在打开多个浏览器页面上网的同时，可以边下载文件，边听音乐，边使用聊天软件进行视频聊天。所以，即便是对于从来不使用并行编程软件那些消费者，只要他们同时运行两个或更多的程序，酷睿双核处理器依然可以更快地处理完所有程序。另外，虽然单一的单线程程序无法体现出双核处理器的优势，但是双核处理器依然为程序设计者提供了一个很好的平台，使得他们可以通过对原有的单县城程序进行并行设计优化，以实现更好的程序运行效果。例如，众多的游戏厂商正在对原来的一些单线程游戏进行优化，采用并行编程使得游戏运行得更快。有的游戏可以使用一个线程实现人物动画，而使用另一个线程来载入地图信息。或者使用一个线程来实现图像渲染中的矩阵运算，而使用另一个来实现更高的人工智能运算。相信在不久的将来，大量的支持双核心的游戏会涌现出来，从而使得酷睿双核处理器的强大性能进一步得以发挥。&lt;/p&gt;&lt;p&gt;　　对于酷睿单核处理器（图14），由于其只有一个核心，所以性能低于酷睿双核处理器。但是由于成本的降低，使得采用酷睿单核处理器的迅驰单核平台具有较低的价格，更容易被中低端用户接受。其实对于酷睿单核处理器，由于其采用了65nm工艺，前端总线提升到667MHz，同时采用了动态功率调节以及增强型更深度睡眠等众多新技术，性能比上一代Dothon处理器更高，功耗更低。&lt;/p&gt;&lt;p align=&quot;center&quot; /&gt;&lt;p align=&quot;center&quot; /&gt;&lt;p&gt;　　第三代迅驰所使用的主板芯片组是“移动式英特尔&amp;reg;945高速芯片组”（图15）。比起第二代迅驰——即Sonoma——所使用的移动式英特尔&amp;reg;915高速芯片组，945芯片组的最大特点就是能够支持双核CPU。这同时也意味着酷睿双核处理器必须与945芯片组配合使用。另外，由于945芯片组增加了多种节能技术，使得平均功耗比915芯片组进一步降低。945芯片组也分为集成显卡和不集成显卡两种。集成显卡的945芯片组有两款，分别叫做“移动式英特尔&amp;reg;945GM高速芯片组”和“移动式英特尔&amp;reg;945GMS高速芯片组”。它们集成的显卡叫做“英特尔&amp;reg;图形媒体加速器950”（Intel&amp;reg; GMA950）显卡，比前一代的GMA900显卡性能进一步提升，支持划分512MB或更多的内存作为显存使用，满足微软Vista操作系统Capable PC计划的全部相关需求。945GM芯片组配合主流处理器使用，包括酷睿双核和酷睿单核，而945GMS芯片组配合酷睿单核低电压版处理器使用，不支持酷睿双核。虽然性能降低了，但功耗也变得更小，以满足特殊的需求。不集成显卡的945芯片组叫做“移动式英特尔&amp;reg;945PM高速芯片组”，支持PCI-Express接口，可以连接一块独立显卡，获得更高的性能。&lt;/p&gt;&lt;p&gt;　　第三代迅驰可以使用“英特尔&amp;reg;PRO/无线3945abg网卡”、“英特尔&amp;reg;PRO/无线2915abg网卡”或“英特尔&amp;reg;PRO/无线2200bg网卡”中的任意一款。新增加的“英特尔&amp;reg;PRO/无线3945abg网卡”（图16）同样支持802.11a、802.11b和802.11g三种协议。与2915abg无线网卡相比，3945abg采用PCI-Express x1接口，无线网卡尺寸更小，并且支持增强的VoIP质量、最佳接入点选择、Cisco兼容扩展v4、无线网络唤醒等新技术，能够提供更加可靠、安全的无线网络连接。&lt;/p&gt;&lt;p&gt;　　从单一核心发展到双核心，是一次质的飞跃。看似简单的两个核心的组合，实际上需要多种关键技术的支撑。首先需要解决的就是两个核心之间协同工作和数据交换的问题。英特尔&amp;reg;智能高速缓存等新技术允许两个核心通过二级高速缓存直接交换数据，很好的解决了这个问题。其次，核心虽然变为两个，但功耗却不能变为原先的两倍。反而要比单核心的更低。这必须依靠众多的节能技术来实现。增强型英特尔&amp;reg;SpeedStep&amp;reg;技术、英特尔&amp;reg;动态功率调节技术、增强型英特尔&amp;reg;更深度睡眠技术、英特尔&amp;reg;高级热量管理技术等等一系列的功耗控制方面的技术保证了酷睿双核更低的功耗。当然，性能的增强和功耗的降低还要依赖于制作工艺、核心架构等多方面的改进才能最终得以实现。由此可见，采用酷睿双核处理器的第三代迅驰——迅驰双核平台（Napa）——标志着笔记本电脑新时代的到来，是消费者目前的最佳选择之一。&lt;/p&gt;&lt;p&gt;　　这三代迅驰平台就介绍完了。第二代Sonoma和第三代Napa迅驰平台是市面上的主流产品。为了方便读者查询，本文将这三代产品的主要参数列于表二。&lt;/p&gt;&lt;p&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;616&quot; border=&quot;1&quot;&gt;&lt;tbody&gt;&lt;tr style=&quot;HEIGHT: 46.5pt&quot;&gt;&lt;td width=&quot;60&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;代&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;71&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;商品名称&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;61&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;内部代号&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;67&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;CPU&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;商品名&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;61&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;CPU&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;内部代号&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;72&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;主板芯片组&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;160&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;无线网卡&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;HEIGHT: 45.7pt&quot;&gt;&lt;td width=&quot;60&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;第一代&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;71&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;迅驰&amp;#8482;移动计算技术&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;61&quot;&gt;&lt;p&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Carmel&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;67&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;奔腾&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;M&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;处理器&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;61&quot;&gt;&lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;2&quot;&gt;Banias&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;72&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;855&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;芯片组&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;160&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;PRO/&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;无线&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;2100&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;网卡&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;HEIGHT: 40.5pt&quot;&gt;&lt;td width=&quot;60&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;第二代&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;71&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;迅驰&amp;#8482;移动计算技术&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;61&quot;&gt;&lt;p&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Sonoma&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;67&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;奔腾&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;M&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;处理器&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;61&quot;&gt;&lt;p&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Dothan&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;72&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;移动式英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;915&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;高速芯片组&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;160&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;PRO/&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;无线&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;2200bg&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;网卡&lt;/span&gt;&lt;/font&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;PRO/&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;无线&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;2915abg&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;网卡&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;HEIGHT: 40pt&quot;&gt;&lt;td width=&quot;60&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;第三代&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;71&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;迅驰&amp;#8482;双核移动计算技术&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;61&quot;&gt;&lt;p&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;2&quot;&gt;&lt;span lang=&quot;EN-US&quot;&gt;Napa&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;67&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;酷睿&amp;#8482;双核处理器&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;61&quot;&gt;&lt;p&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&lt;font size=&quot;2&quot;&gt;Yonah&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;72&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;移动式英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg; 945&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;高速芯片组&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;160&quot;&gt;&lt;p&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;PRO/&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;无线&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;3945abg&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;网卡&lt;/span&gt;&lt;/font&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;PRO/&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;无线&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;2915abg&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;网卡&lt;/span&gt;&lt;/font&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;font size=&quot;2&quot;&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;英特尔&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;&amp;reg;PRO/&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;无线&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;font face=&quot;Times New Roman&quot;&gt;2200bg&lt;/font&gt;&lt;/span&gt;&lt;span style=&quot;FONT-FAMILY: 宋体&quot;&gt;网卡&lt;/span&gt;&lt;span lang=&quot;EN-US&quot;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;　　英特尔官方网站还提供了一个软件可以用来测试仪台笔记本电脑是否采用了英特尔&amp;reg;迅驰&amp;#8482;移动计算技术或英特尔&amp;reg;迅驰&amp;#8482;双核移动计算技术。读者可以访问下面的网址来下载这个软件：&lt;/p&gt;&lt;p&gt;　　&lt;a href=&quot;http://downloadfinder.intel.com/scripts-df-external/confirm.aspx?httpDown=http://downloadmirror.intel.com/df-support/7594/zho/ctcchs08.msi&amp;agr=&amp;ProductID=1697&amp;DwnldId=7594&amp;strOSs=&amp;OSFullName=&amp;lang=eng&quot;&gt;&lt;u&gt;&lt;font color=&quot;#0000ff&quot;&gt;http://downloadfinder.intel.com/scripts-df-external/confirm.aspx?httpDown=http://downloadmirror.intel.com/df-support/7594/zho/ctcchs08.msi&amp;amp;agr=&amp;amp;ProductID=1697&amp;amp;DwnldId=7594&amp;amp;strOSs=&amp;amp;OSFullName=&amp;amp;lang=eng&lt;/font&gt;&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;　　下载完毕后在电脑上运行一下，软件就会给对三大组件进行测试，从而判定是否符合迅驰的要求。&lt;/p&gt;&lt;p&gt;　　未来展望：英特尔&amp;reg;酷睿&amp;#8482;2 双核处理器已经发布了（图17）。英特尔&amp;reg;酷睿&amp;#8482;2 双核处理器是新一代台式机处理器和笔记本电脑处理器的统称。用于笔记本电脑的酷睿2双核处理器的内部研发代号叫Merom。官方给出的测试数据显示，在保持功耗不变的情况下，酷睿2双核处理器（Merom）的性能比酷睿双核（Yonah）又提升了20%以上。前文曾经提到，实际上英特尔&amp;reg;酷睿&amp;#8482;2 双核处理器是从最早的Banias处理器一路发展下来的，到现在已经具有了成熟的微体系架构，实现了很高的性能功耗比，因此，从酷睿2处理器开始，英特尔把这种微体系架构叫做“酷睿微体系架构”，正式区分于奔腾4处理器的“NetBurst微体系架构”。对于台式机来讲，英特尔&amp;reg;酷睿&amp;#8482;2 双核处理器比奔腾4或奔腾D处理器强大太多了，足以促成台式机的革命。但是对于笔记本电脑来讲，酷睿2 双核处理器可以看作是酷睿双核处理器的一次升级，为消费者提供了一款更强大的处理器以供选择。目前酷睿2双核处理器仍然需要与945芯片组配合使用。对于一些消费者来讲，酷睿2双核处理器开始支持EM64T——英特尔&amp;reg;64位内存扩展技术——可能是他们最为关注的。虽然现在64位的应用很少，但是许多消费者都希望自己的产品能够支持未来的技术，在若干年之内，如果出现64位的应用程序，而自己的电脑到时候统统可以运行，那是最理想的。不过每一项新技术都会增加产品的成本，况且未来的技术会如何发展很难准确的预测，所以选择支持64位还是不支持64位，是一个见仁见智的问题，还要消费者根据自身的需求决定。&lt;/p&gt;&lt;p align=&quot;center&quot; /&gt;&lt;p align=&quot;center&quot; /&gt;&lt;p&gt;　　比起笔记本电脑所使用的英特尔&amp;reg;酷睿&amp;#8482;2 双核处理器，明年要发布的代号“Santa Rosa”的全新迅驰平台或许更加值得期待。Santa Rosa平台同样会采用三大组件，分别是英特尔&amp;reg;酷睿&amp;#8482;2 双核处理器（Merom）、代号“Crestine”的主板芯片组和和代号“Kedron”的无线网卡。目前这些组件的细节还不是很确定。有兴趣的读者可以查阅相关的新闻和报道，以获取更详细的信息。&lt;/p&gt;&lt;p&gt;　　可以肯定的一点是，无论迅驰平台如何升级，其采用的组件如何发展变化，迅驰平台的目标是确定的，即“突破的移动计算性能”、“延长的电池使用时间”、“轻薄的外形”和“集成的无线局域网能力”这四个方向。计算性能当然是越强大越好，什么时候能够实现几分钟之内把一部DVD转换成RM电影，或者实现虚拟现实，甚至能够进行人机对话……。人们对性能的追求永无止境。电池使用时间越长越好。如果一台笔记本电脑能够像手机一样，一块电池连续使用一个星期甚至一个月，甚至还能通过太阳能电池供电，那将会大大提高笔记本电脑的便携性。外形当然越小越好。假设一台笔记本可以小到跟手机一样大，加上强大的智能，那人们就可以随时随地工作或娱乐。无线网络连接当然是越强大越好。不仅有极快的速度，例如能够快速下载一部高清晰影片，还能够承载所有的无线连接规范，例如无线1394、无线USB、蓝牙、无线局域网和无线广域网等等都用一种技术承载，使得笔记本电脑与所有设备之间都可以无线互联，并且只需要简单的几步操作就可以连接上。例如与数码相机、数码摄像机、投影仪、移动硬盘、甚至智能家电等都能够无线高速连接。这样，消费者就可以拿着一个手机大小且功能强大的笔记本电脑，躺在沙发上，直接与无线投影仪连接，享受在线播放的高清晰视频影片。当然，丝毫不用担心电脑会突然没电。实际上，现在的技术已经能让我们看到上述设想的雏形。性能自不必说，英特尔会不断地推动性能的提升。电池使用寿命已经从3、4年前的一个多小时提高到现在的十个多小时，更可以使用燃料电池进行持续供电。外形上已经出现了“超便携电脑”，在具有笔记本电脑完整功能的同时，只比掌上电脑大一点，可以塞到裤兜里面。而无线网络连接方面除了正在发展的速度高达300~540Mbps的802.11n协议外，还有能够承载无线USB、蓝牙、无线1394等协议的超宽带(UWB)技术。由此可见，英特尔&amp;reg;迅驰&amp;#8482;移动计算技术自打2003年1月9日诞生以来，就为笔记本电脑的发展指明了一个目标，并且不断向这个目标努力前进。时间证明，这个目标是符合消费者需求的。不管是昨天，今天，还是明天，选择迅驰，一定会让您的移动体验更加激动人心！&lt;/p&gt;&lt;/div&gt;</description><category>解决方案</category><pubDate>Sat, 04 Nov 2006 16:49:21 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497984.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497984.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235224/1237942</fs:itemid></item><item><title>呼叫转移设置</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235225/1237942/1/item.html</link><description>&lt;table class=&quot;line_height20&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;532&quot; border=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr valign=&quot;top&quot;&gt;&lt;td valign=&quot;middle&quot; height=&quot;30&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign=&quot;top&quot;&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td valign=&quot;top&quot;&gt;&lt;table cellspacing=&quot;1&quot; cellpadding=&quot;0&quot; width=&quot;427&quot; border=&quot;1&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width=&quot;336&quot; bgcolor=&quot;#e6dab2&quot;&gt;&lt;div align=&quot;center&quot;&gt;转 移 号 码 &lt;/div&gt;&lt;/td&gt;&lt;td width=&quot;82&quot; bgcolor=&quot;#e6dab2&quot;&gt;&lt;p align=&quot;center&quot;&gt;呼转基本费 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=&quot;center&quot;&gt;网内呼转（呼转至中国移动手机号码） &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;center&quot;&gt;0.15元/分钟 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=&quot;center&quot;&gt;网间呼转（呼转至其他通信运营商号码） &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;center&quot;&gt;0.35元/分钟 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=&quot;center&quot;&gt;呼转至中国移动特服号（包括12580、12591、13800371506、13800371166等特殊号码 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;center&quot;&gt;0.10元/分钟 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign=&quot;top&quot;&gt;&lt;td height=&quot;86&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td valign=&quot;middle&quot;&gt;1、如果您开通了12580移动秘书（或语音信箱）业务，月功能使用费中包括您呼转到12580（或语音信箱）所产生的呼转基本费；如未开通则按0.1元/分钟的呼转基本费收取。 &lt;br /&gt;2、当您设置呼转时，若产生有长途费用正常收取。 &lt;/td&gt;&lt;/tr&gt;&lt;tr valign=&quot;top&quot;&gt;&lt;td height=&quot;40&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td valign=&quot;middle&quot;&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;300&quot; border=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width=&quot;128&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td width=&quot;172&quot; height=&quot;30&quot;&gt;&lt;a href=&quot;http://www.ha.chinamobile.com/countfile/CountClick.aspx?id=23&quot; target=&quot;_blank&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign=&quot;top&quot;&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;p&gt;1.您可以在手机上直接设置：进入呼叫转移的相应菜单，根据提示进行设置； &lt;br /&gt;2.登录河南移动网站或10086进行设置：目前网站上仅提供了无条件转移。&lt;br /&gt;3.在手机上直接输入下面快捷编码进行设置，除无条件转移只能单独使用外，其他三项呼叫转移可同时使用。 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign=&quot;top&quot;&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&lt;table cellspacing=&quot;1&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width=&quot;67&quot; rowspan=&quot;2&quot;&gt;&lt;p align=&quot;center&quot;&gt;&lt;strong&gt;转移方式&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; colspan=&quot;2&quot;&gt;&lt;p align=&quot;center&quot;&gt;快捷指令 &lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;186&quot; rowspan=&quot;2&quot;&gt;&lt;p align=&quot;center&quot;&gt;说明 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;79&quot;&gt;&lt;p align=&quot;center&quot;&gt;启用 &lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;83&quot;&gt;&lt;p align=&quot;center&quot;&gt;取消 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=&quot;center&quot;&gt;&lt;strong&gt;关机及不可及转移&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;left&quot;&gt;**62*要转移到的电话号码#　按发送键 &amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;left&quot;&gt;##62#按发送键 &amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;left&quot;&gt;此功能设置后，当您不开机、无SIM卡、无线链路拥塞或超出覆盖区时，所有其它呼叫您手机的来电均将被转移至预先设置的另一号码。 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=&quot;center&quot;&gt;&lt;strong&gt;遇忙转移&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;left&quot;&gt;**67*要转移到的电话号码#　按发送键 &amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;left&quot;&gt;##67#按发送键 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;left&quot;&gt;当您正在使用手机通话时，另一个打入的电话会自动转移到您预先设定的另一个号码上。 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=&quot;center&quot;&gt;&lt;strong&gt;无应答转移&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;left&quot;&gt;**61*要转移到的电话号码#　按发送键 &amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;left&quot;&gt;##61#按发送键 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;left&quot;&gt;当您的手机处于开机状态时,打入的电话接通但无人接听，来电会自动转移到您预先设定的另一个号码上。 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align=&quot;center&quot;&gt;&lt;strong&gt;无条件转移&lt;/strong&gt; &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;left&quot;&gt;**21*要转移到的电话号码#　按发送键 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;left&quot;&gt;##21#按发送键 &lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;left&quot;&gt;将所有呼叫您手机的号码全部转移到您预先设置的另一手机、移动秘书、语音信箱或市话，您的手机不再振铃 &lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign=&quot;top&quot;&gt;&lt;td height=&quot;26&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td valign=&quot;middle&quot;&gt;4、如果您要取消所有呼叫转移，在待机状态输入“##002#”按发送键即可。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;</description><category>我的生活</category><pubDate>Fri, 03 Nov 2006 13:42:08 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497983.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497983.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235225/1237942</fs:itemid></item><item><title>hibernate总结</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235226/1237942/1/item.html</link><description>&lt;h4 class=&quot;TextColor1&quot; id=&quot;subjcns!C32EF4499382277!109&quot; style=&quot;MARGIN-BOTTOM: 0px&quot;&gt;hibernate总结&lt;/h4&gt;&lt;div id=&quot;msgcns!C32EF4499382277!109&quot;&gt;&lt;div&gt;文件&lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE hibernate-mapping PUBLIC&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;-//Hibernate/Hibernate Mapping DTD 2.0//EN&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;&lt;a href=&quot;http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd&quot;&gt;&lt;font color=&quot;#0066a7&quot;&gt;http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd&lt;/font&gt;&lt;/a&gt;&amp;quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;lt;hibernate-mapping package=&amp;quot;eg&amp;quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;class name=&amp;quot;Cat&amp;quot; table=&amp;quot;CATS&amp;quot; discriminator-value=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;id name=&amp;quot;id&amp;quot; column=&amp;quot;uid&amp;quot; type=&amp;quot;long&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;generator class=&amp;quot;hilo&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/id&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;discriminator column=&amp;quot;subclass&amp;quot; type=&amp;quot;character&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;birthdate&amp;quot; type=&amp;quot;date&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;color&amp;quot; not-null=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;sex&amp;quot; not-null=&amp;quot;true&amp;quot; update=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;weight&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;many-to-one name=&amp;quot;mate&amp;quot; column=&amp;quot;mate_id&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;set name=&amp;quot;kittens&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;key column=&amp;quot;mother_id&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;one-to-many class=&amp;quot;Cat&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/set&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;subclass name=&amp;quot;DomesticCat&amp;quot; discriminator-value=&amp;quot;D&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property name=&amp;quot;name&amp;quot; type=&amp;quot;string&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/subclass&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/class&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;class name=&amp;quot;Dog&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!-- mapping for Dog could go here --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/class&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;lt;/hibernate-mapping&amp;gt;&lt;br /&gt;1,&lt;br /&gt;&amp;lt;hibernate-mapping&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; schema=&amp;quot;schemaName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default-cascade=&amp;quot;none|save-update&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; auto-import=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; package=&amp;quot;package.name&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;/&amp;gt;&lt;br /&gt;schema (可选): 数据库schema名称。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;default-cascade (可选 - 默认为 none): 默认的级联风格。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;auto-import (可选 - 默认为 true): 指定是否我们可以在查询语言中使用非全限定的类名（仅限于本映射文件中的类）。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;package (可选): 指定一个包前缀，如果在映射文档中没有指定全限定名，就使用这个包名。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;2,&lt;br /&gt;&amp;lt;class&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;ClassName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; table=&amp;quot;tableName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; discriminator-value=&amp;quot;discriminator_value&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mutable=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; schema=&amp;quot;owner&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy=&amp;quot;ProxyInterface&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dynamic-update=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dynamic-insert=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select-before-update=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; polymorphism=&amp;quot;implicit|explicit&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where=&amp;quot;arbitrary sql where condition&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; persister=&amp;quot;PersisterClass&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; batch-size=&amp;quot;N&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; optimistic-lock=&amp;quot;none|version|dirty|all&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lazy=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;name: 持久化类（或者接口）的Java全限定名。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;table: 对应的数据库表名。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;discriminator-value（辨别值） （可选 - 默认和类名一样）：一个用于区分不同的子类的值，在多态行为时使用。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;mutable（可变） (可选, 默认值为 true): 表明该类的实例可变（不可变）。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;schema (可选): 覆盖在根&amp;lt;hibernate-mapping&amp;gt;元素中指定的schema名字。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;proxy (可选): 指定一个接口，在延迟装载时作为代理使用。你可以在这里使用该类自己的名字。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;dynamic-update（动态更新） (可选，默认为false): 指定用于UPDATE 的SQL将会在运行时动态生成，并且只更新那些改变过的字段。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;dynamic-insert（动态插入） (可选, 默认为false): 指定用于INSERT的 SQL 将会在运行时动态生成，并且只包含那些非空值字段。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;select-before-update (可选，默认值为false): 指定Hibernate除非确定对象的确被修改了，不会执行SQL UPDATE操作。在特定场合（实际上，只会发生在一个临时对象关联到一个新的session中去，执行update()的时候），这说明Hibernate会在UPDATE之前执行一次额外的SQL SELECT操作，来决定是否应该进行UPDATE。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;polymorphism（多形，多态） (可选, 默认值为 implicit (隐式)): 界定是隐式还是显式的使用查询多态。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;where (可选) 指定一个附加的SQLWHERE 条件，在抓取这个类的对象时会一直增加这个条件。 &lt;/div&gt;&lt;div&gt;&amp;nbsp;persister (可选): 指定一个定制的ClassPersister。 &lt;/div&gt;&lt;div&gt;&amp;nbsp;batch-size (可选,默认是1) 指定一个用于根据标识符抓取实例时使用的&amp;quot;batch size&amp;quot;（批次抓取数量）。 &lt;/div&gt;&lt;div&gt;&amp;nbsp;optimistic-lock（乐观锁定） (可选，默认是version): 决定乐观锁定的策略。 &lt;/div&gt;&lt;div&gt;&amp;nbsp;lazy（延迟） (可选): 假若设置 lazy=&amp;quot;true&amp;quot;，就是设置这个类自己的名字作为proxy接口的一种等价快捷形式。&lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;3,&lt;br /&gt;&amp;lt;id&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;propertyName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type=&amp;quot;typename&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;column_name&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsaved-value=&amp;quot;any|none|null|id_value&amp;quot;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;field|property|ClassName&amp;quot;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;generator class=&amp;quot;generatorClass&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;nbsp;name (可选): 标识属性的名字。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;type (可选): 标识Hibernate类型的名字。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;column (可选 - 默认为属性名): 主键字段的名字。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;unsaved-value (可选 - 默认为null): 一个特定的标识属性值，用来标志该实例是刚刚创建的，尚未保存。这可以把这种实例和从以前的session中装载过（可能又做过修改--译者注）但未再次持久化的实例区分开来。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;access (可选 - 默认为property): Hibernate用来访问属性值的策略。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;4,composite-id 联合ID&lt;br /&gt;&amp;lt;composite-id&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;propertyName&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&amp;quot;ClassName&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsaved-value=&amp;quot;any|none&amp;quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;key-property name=&amp;quot;propertyName&amp;quot; type=&amp;quot;typename&amp;quot; column=&amp;quot;column_name&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;key-many-to-one name=&amp;quot;propertyName&amp;quot; class=&amp;quot;ClassName&amp;quot; column=&amp;quot;column_name&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ......&lt;br /&gt;&amp;lt;/composite-id&amp;gt;&lt;br /&gt;5,&lt;br /&gt;&amp;lt;discriminator&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;discriminator_column&amp;quot;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type=&amp;quot;discriminator_type&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; force=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;column (可选 - 默认为 class) 识别器字段的名字 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;type (可选 - 默认为 string) 一个Hibernate字段类型的名字 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;force(强制) (可选 - 默认为 false) &amp;quot;强制&amp;quot;Hibernate指定允许的识别器值,就算取得的所有实例都是根类的。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;6,&lt;br /&gt;&amp;lt;version&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;version_column&amp;quot;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;propertyName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type=&amp;quot;typename&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;field|property|ClassName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsaved-value=&amp;quot;null|negative|undefined&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;column (可选 - 默认为属性名): 指定持有版本号的字段名。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;name: 持久化类的属性名。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;type (可选 - 默认是 integer): 版本号的类型。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;access (可选 - 默认是 property): Hibernate用于访问属性值的策略。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;unsaved-value (可选 - 默认是undefined): 用于标明某个实例时刚刚被实例化的（尚未保存）版本属性值，依靠这个值就可以把这种情况和已经在先前的session中保存或装载的实例区分开来。（undefined指明使用标识属性值进行这种判断。） &lt;br /&gt;版本号必须是以下类型：long, integer, short, timestamp或者calendar。 &lt;br /&gt;7,&lt;br /&gt;&amp;lt;timestamp&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;timestamp_column&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;propertyName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;field|property|ClassName&amp;quot;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsaved-value=&amp;quot;null|undefined&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;column (可选 - 默认为属性名): 持有时间戳的字段名。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;name: 在持久化类中的JavaBeans风格的属性名，其Java类型是 Date 或者 Timestamp的。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;access (可选 - 默认是 property): Hibernate用于访问属性值的策略。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;unsaved-value (可选 - 默认是null): 用于标明某个实例时刚刚被实例化的（尚未保存）版本属性值，依靠这个值就可以把这种情况和已经在先前的session中保存或装载的实例区分开来。（undefined指明使用标识属性值进行这种判断。） &lt;br /&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;注意，&amp;lt;timestamp&amp;gt; 和&amp;lt;version type=&amp;quot;timestamp&amp;quot;&amp;gt;是等价的。 &lt;/div&gt;&lt;div&gt;8,&lt;br /&gt;&amp;lt;property&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;propertyName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;column_name&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type=&amp;quot;typename&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; formula=&amp;quot;arbitrary SQL expression&amp;quot;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;field|property|ClassName&amp;quot;&amp;nbsp;&amp;nbsp; &lt;br /&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;name: 属性的名字,以小写字母开头。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;column (可选 - 默认为属性名字): 对应的数据库字段名。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;type (可选): 一个Hibernate类型的名字。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;update, insert (可选 - 默认为 true) :表明在用于UPDATE 和/或 INSERT的SQL语句中是否包含这个字段。这二者如果都设置为false则表明这是一个“外源性（derived）”的属性，它的值来源于映射到同一个（或多个）字段的某些其他属性，或者通过一个trigger(触发器），或者其他程序。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;formula (可选): 一个SQL表达式，定义了这个计算（computed） 属性的值。计算属性没有和它对应的数据库字段。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;access (可选 - 默认值为 property): Hibernate用来访问属性值的策略。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;9,&lt;br /&gt;&amp;lt;many-to-one&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;propertyName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; column=&amp;quot;column_name&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&amp;quot;ClassName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cascade=&amp;quot;all|none|save-update|delete&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outer-join=&amp;quot;true|false|auto&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; update=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; property-ref=&amp;quot;propertyNameFromAssociatedClass&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;field|property|ClassName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;name: 属性名。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;column (可选): 字段名。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;class (可选 - 默认是通过反射得到属性类型): 关联的类的名字。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;cascade（级联） (可选): 指明哪些操作会从父对象级联到关联的对象。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;outer-join（外连接） (可选 - 默认为 自动): 当设置hibernate.use_outer_join的时候，对这个关联允许外连接抓取。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;update, insert (可选 - defaults to true) 指定对应的字段是否在用于UPDATE 和/或 INSERT的SQL语句中包含。如果二者都是false,则这是一个纯粹的“外源性（derived）”关联，它的值是通过映射到同一个（或多个）字段的某些其他属性得到的，或者通过trigger(除法器），或者是其他程序。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;property-ref: (可选) 指定关联类的一个属性，这个属性将会和本外键相对应。如果没有指定，会使用对方关联类的主键。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;access (可选 - 默认是 property): Hibernate用来访问属性的策略。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;10,&lt;br /&gt;&amp;lt;one-to-one&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;propertyName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&amp;quot;ClassName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cascade=&amp;quot;all|none|save-update|delete&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; constrained=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outer-join=&amp;quot;true|false|auto&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; property-ref=&amp;quot;propertyNameFromAssociatedClass&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;field|property|ClassName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;/&amp;gt;&lt;br /&gt;&amp;nbsp;name: 属性的名字。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;class (可选 - 默认是通过反射得到的属性类型)：被关联的类的名字。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;cascade(级联) (可选) 表明操作是否从父对象级联到被关联的对象。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;constrained（约束） (可选) 表明该类对应的表对应的数据库表，和被关联的对象所对应的数据库表之间，通过一个外键引用对主键进行约束。这个选项影响save()和delete()在级联执行时的先后顺序（也在schema export tool中被使用）。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;outer-join（外连接） (可选 - 默认为 自动): 当设置hibernate.use_outer_join的时候，对这个关联允许外连接抓取。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;property-ref: (可选) 指定关联类的一个属性，这个属性将会和本外键相对应。如果没有指定，会使用对方关联类的主键。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;access (可选 - 默认是 property): Hibernate用来访问属性的策略。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;11,&lt;br /&gt;&amp;lt;component &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;propertyName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class=&amp;quot;className&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; insert=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; upate=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; access=&amp;quot;field|property|ClassName&amp;quot;&amp;gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property ...../&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;many-to-one .... /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ........&lt;br /&gt;&amp;lt;/component&amp;gt;&lt;br /&gt;&amp;nbsp;name: 属性名 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;class (可选 - 默认为通过反射得到的属性类型):组件（子）类的名字。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;insert: 被映射的字段是否出现在SQL的INSERT语句中? &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;update: 被映射的字段是否出现在SQL的UPDATE语句中? &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;access (可选 - 默认是 property): Hibernate用来访问属性的策略。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;12,&lt;br /&gt;&amp;lt;subclass&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;ClassName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; discriminator-value=&amp;quot;discriminator_value&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy=&amp;quot;ProxyInterface&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lazy=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dynamic-update=&amp;quot;true|false&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dynamic-insert=&amp;quot;true|false&amp;quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property .... /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .....&lt;br /&gt;&amp;lt;/subclass&amp;gt;&lt;br /&gt;&amp;nbsp;name: 子类的全限定名。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;discriminator-value(辨别标志） (可选 - 默认为类名):一个用于区分每个独立的子类的值。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;proxy（代理） (可选): 指定一个类或者接口，在延迟装载时作为代理使用。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;lazy（延迟装载） (可选): 设置lazy=&amp;quot;true&amp;quot;是把自己的名字作为proxy接口的一种等价快捷方式。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;13,&lt;br /&gt;&amp;lt;joined-subclass&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&amp;quot;ClassName&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy=&amp;quot;ProxyInterface&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lazy=&amp;quot;true|false&amp;quot;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dynamic-update=&amp;quot;true|false&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dynamic-insert=&amp;quot;true|false&amp;quot;&amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;key .... &amp;gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;property .... /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .....&lt;br /&gt;&amp;lt;/subclass&amp;gt;&lt;br /&gt;&amp;nbsp;name: 子类的全限定名。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;proxy (可选): 指定一个类或者接口，在延迟装载时作为代理使用。 &lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;lazy（延迟装载） (可选): 设置lazy=&amp;quot;true&amp;quot;是把自己的名字作为proxy接口的一种等价快捷方式。&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</description><category>Java</category><pubDate>Thu, 02 Nov 2006 11:07:02 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497982.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497982.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235226/1237942</fs:itemid></item><item><title>Java Script 经典文章收藏</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235227/1237942/1/item.html</link><description>&lt;div style=&quot;FONT-SIZE: 12px&quot;&gt;NirvanaStudio 对于 JavaScript 的研究还是比较深刻的，对于想深入学习 JavaScript 的朋友们来说下面的文章应该是不错的内容。&lt;br /&gt;&lt;br /&gt;1. 如何优化JavaScript脚本的性能&lt;br /&gt;&lt;a href=&quot;http://www.nirvanastudio.org/java script/improve-java script-performance.html&quot; target=&quot;_blank&quot;&gt;http://www.nirvanastudio.org/jav ... pt-performance.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. JavaScript = C + Lisp&lt;br /&gt;&lt;a href=&quot;http://www.nirvanastudio.org/java script/java script-c-lisp.html&quot; target=&quot;_blank&quot;&gt;http://www.nirvanastudio.org/java script/java script-c-lisp.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. 函数式JavaScript编程指南&lt;br /&gt;&lt;a href=&quot;http://www.nirvanastudio.org/wp-content/uploads/2006/04/Functional_JavaScript_Programming.htm&quot; target=&quot;_blank&quot;&gt;http://www.nirvanastudio.org/wp- ... ipt_Programming.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4. JavaScript中的类继承&lt;br /&gt;&lt;a href=&quot;http://www.nirvanastudio.org/java script/classical-inheritance-in-java script.html&quot; target=&quot;_blank&quot;&gt;http://www.nirvanastudio.org/jav ... -in-java script.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5. JavaScript Templates&lt;br /&gt;&lt;a href=&quot;http://www.nirvanastudio.org/java script/java script-templates.html&quot; target=&quot;_blank&quot;&gt;http://www.nirvanastudio.org/java script/java script-templates.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6. JavaScript中的私有成员&lt;br /&gt;&lt;a href=&quot;http://www.nirvanastudio.org/java script/private-members-in-java script.html&quot; target=&quot;_blank&quot;&gt;http://www.nirvanastudio.org/jav ... -in-java script.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;7. JavaScript：世界上最被误解的语言&lt;br /&gt;&lt;a href=&quot;http://www.nirvanastudio.org/java script/java script-the-worlds-most-misunderstood-programming-language.html&quot; target=&quot;_blank&quot;&gt;http://www.nirvanastudio.org/jav ... mming-language.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;8. 编写自己的dojo扩展&lt;br /&gt;&lt;a href=&quot;http://www.nirvanastudio.org/java script/&amp;ccedil;&amp;frac14;&amp;#150;&amp;aring;&amp;#134;&amp;#153;è&amp;#135;&amp;ordf;&amp;aring;·±&amp;ccedil;&amp;#154;&amp;#132;dojo&amp;aelig;&amp;#137;&amp;copy;&amp;aring;±&amp;#149;.html&quot; target=&quot;_blank&quot;&gt;http://www.nirvanastudio.org/jav ... 89%a9%e5%b1%95.html&lt;/a&gt;&lt;/div&gt;</description><category>web开发</category><pubDate>Wed, 01 Nov 2006 16:35:12 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497981.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497981.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235227/1237942</fs:itemid></item><item><title>Javascript的IE和Firefox兼容性汇编</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235228/1237942/1/item.html</link><description>&lt;p&gt;以下以 IE 代替 Internet Explorer，以 MF 代替 Mozzila Firefox&lt;br /&gt;&lt;br /&gt;1. document.form.item 问题&lt;br /&gt;&amp;nbsp; &amp;nbsp; (1)现有问题：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;现有代码中存在许多 document.formName.item(&amp;quot;itemName&amp;quot;) 这样的语句，不能在 MF 下运行&lt;br /&gt;&amp;nbsp; &amp;nbsp; (2)解决方法：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;改用 document.formName.elements[&amp;quot;elementName&amp;quot;]&lt;br /&gt;&amp;nbsp; &amp;nbsp; (3)其它&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;参见 2&lt;br /&gt;&lt;br /&gt;2. 集合类对象问题&lt;br /&gt;&amp;nbsp; &amp;nbsp; (1)现有问题：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;现有代码中许多集合类对象取用时使用 ()，IE 能接受，MF 不能。&lt;br /&gt;&amp;nbsp; &amp;nbsp; (2)解决方法：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;改用 [] 作为下标运算。如：document.forms(&amp;quot;formName&amp;quot;) 改为 document.forms[&amp;quot;formName&amp;quot;]。&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;又如：document.getElementsByName(&amp;quot;inputName&amp;quot;)(1) 改为 document.getElementsByName(&amp;quot;inputName&amp;quot;)[1]&lt;br /&gt;&amp;nbsp; &amp;nbsp; (3)其它&lt;br /&gt;&lt;br /&gt;3. window.event&lt;br /&gt;&amp;nbsp; &amp;nbsp; (1)现有问题：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;使用 window.event 无法在 MF 上运行&lt;br /&gt;&amp;nbsp; &amp;nbsp; (2)解决方法：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;MF 的 event 只能在事件发生的现场使用，此问题暂无法解决。可以这样变通：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;原代码(可在IE中运行)：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;input type=&amp;quot;button&amp;quot; name=&amp;quot;someButton&amp;quot; value=&amp;quot;提交&amp;quot; onclick=&amp;quot;java script:gotoSubmit()&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;...&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;script language=&amp;quot;java script&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; function gotoSubmit() {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;alert(window.event);&amp;nbsp; &amp;nbsp; // use window.event&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;新代码(可在IE和MF中运行)：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;input type=&amp;quot;button&amp;quot; name=&amp;quot;someButton&amp;quot; value=&amp;quot;提交&amp;quot; onclick=&amp;quot;java script:gotoSubmit(event)&amp;quot;/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;...&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;script language=&amp;quot;java script&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; function gotoSubmit(evt) {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;evt = evt ? evt : (window.event ? window.event : null);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;alert(evt);&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; // use evt&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;...&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;此外，如果新代码中第一行不改，与老代码一样的话(即 gotoSubmit 调用没有给参数)，则仍然只能在IE中运行，但不会出错。所以，这种方案 tpl 部分仍与老代码兼容。&lt;br /&gt;&lt;br /&gt;4. HTML 对象的 id 作为对象名的问题&lt;br /&gt;&amp;nbsp; &amp;nbsp; (1)现有问题&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;在 IE 中，HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。&lt;br /&gt;&amp;nbsp; &amp;nbsp; (2)解决方法&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;用 getElementById(&amp;quot;idName&amp;quot;) 代替 idName 作为对象变量使用。&lt;br /&gt;&lt;br /&gt;5. 用idName字符串取得对象的问题&lt;br /&gt;&amp;nbsp; &amp;nbsp; (1)现有问题&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;在IE中，利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象，在MF 中不能。&lt;br /&gt;&amp;nbsp; &amp;nbsp; (2)解决方法&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;用 getElementById(idName) 代替 eval(idName)。&lt;br /&gt;&lt;br /&gt;6. 变量名与某 HTML 对象 id 相同的问题&lt;br /&gt;&amp;nbsp; &amp;nbsp; (1)现有问题&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;在 MF 中，因为对象 id 不作为 HTML 对象的名称，所以可以使用与 HTML 对象 id 相同的变量名，IE 中不能。&lt;br /&gt;&amp;nbsp; &amp;nbsp; (2)解决方法&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;在声明变量时，一律加上 var ，以避免歧义，这样在 IE 中亦可正常运行。&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;此外，最好不要取与 HTML 对象 id 相同的变量名，以减少错误。&lt;br /&gt;&amp;nbsp; &amp;nbsp; (3)其它&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;参见 问题4&lt;br /&gt;&lt;br /&gt;7. event.x 与 event.y 问题&lt;br /&gt;&amp;nbsp; &amp;nbsp; (1)现有问题&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;在IE 中，event 对象有 x, y 属性，MF中没有。&lt;br /&gt;&amp;nbsp; &amp;nbsp; (2)解决方法&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;在MF中，与event.x 等效的是 event.pageX。但event.pageX IE中没有。&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;故采用 event.clientX 代替 event.x。在IE 中也有这个变量。&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;event.clientX 与 event.pageX 有微妙的差别（当整个页面有滚动条的时候），不过大多数时候是等效的。&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;如果要完全一样，可以稍麻烦些：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;mX = event.x ? event.x : event.pageX;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;然后用 mX 代替 event.x&lt;br /&gt;&amp;nbsp; &amp;nbsp; (3)其它&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;event.layerX 在 IE 与 MF 中都有，具体意义有无差别尚未试验。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;8. 关于frame&lt;br /&gt;&amp;nbsp; &amp;nbsp;(1)现有问题&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;在 IE中 可以用window.testFrame取得该frame，mf中不行&lt;br /&gt;&amp;nbsp; &amp;nbsp;(2)解决方法&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;在frame的使用方面mf和ie的最主要的区别是：&lt;br /&gt;如果在frame标签中书写了以下属性：&lt;br /&gt;&amp;lt;frame src=&amp;quot;/xx.htm&amp;quot; id=&amp;quot;frameId&amp;quot; name=&amp;quot;frameName&amp;quot; /&amp;gt;&lt;br /&gt;那么ie可以通过id或者name访问这个frame对应的window对象&lt;br /&gt;而mf只可以通过name来访问这个frame对应的window对象&lt;br /&gt;例如如果上述frame标签写在最上层的window里面的htm里面，那么可以这样访问&lt;br /&gt;ie： window.top.frameId或者window.top.frameName来访问这个window对象&lt;br /&gt;mf： 只能这样window.top.frameName来访问这个window对象&lt;br /&gt;&lt;br /&gt;另外，在mf和ie中都可以使用window.top.document.getElementById(&amp;quot;frameId&amp;quot;)来访问frame标签&lt;br /&gt;并且可以通过window.top.document.getElementById(&amp;quot;testFrame&amp;quot;).src = 'xx.htm'来切换frame的内容&lt;br /&gt;也都可以通过window.top.frameName.location = 'xx.htm'来切换frame的内容&lt;br /&gt;关于frame和window的描述可以参见bbs的‘window与frame’文章&lt;br /&gt;以及/test/js/test_frame/目录下面的测试&lt;br /&gt;----adun 2004.12.09修改&lt;br /&gt;&lt;br /&gt;9. 在mf中，自己定义的属性必须getAttribute()取得&lt;br /&gt;10.在mf中没有&amp;nbsp;&amp;nbsp;parentElement parement.children&amp;nbsp;&amp;nbsp;而用&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;parentNode parentNode.childNodes&lt;br /&gt;&amp;nbsp; &amp;nbsp;childNodes的下标的含义在IE和MF中不同，MF使用DOM规范，childNodes中会插入空白文本节点。&lt;br /&gt;&amp;nbsp;&amp;nbsp;一般可以通过node.getElementsByTagName()来回避这个问题。&lt;br /&gt;&amp;nbsp; &amp;nbsp;当html中节点缺失时，IE和MF对parentNode的解释不同，例如&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;lt;form&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;lt;table&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input/&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/form&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;MF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;MF中节点没有removeNode方法，必须使用如下方法 node.parentNode.removeChild(node)&lt;br /&gt;&lt;br /&gt;11.const 问题&lt;br /&gt;&amp;nbsp;&amp;nbsp;(1)现有问题:&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。&lt;br /&gt;&amp;nbsp;&amp;nbsp;(2)解决方法:&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;不使用 const ，以 var 代替。&lt;br /&gt;&lt;br /&gt;12. body 对象&lt;br /&gt;&amp;nbsp; &amp;nbsp;MF的body在body标签没有被浏览器完全读入之前就存在，而IE则必须在body完全被读入之后才存在&lt;br /&gt;&lt;br /&gt;13. url encoding&lt;br /&gt;在js中如果书写url就直接写&amp;amp;不要写&amp;amp;例如var url = 'xx.jsp?objectName=xx&amp;amp;objectEvent=xxx';&lt;br /&gt;frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器&lt;br /&gt;一般会服务器报错参数没有找到&lt;br /&gt;当然如果是在tpl中例外，因为tpl中符合xml规范，要求&amp;amp;书写为&amp;amp;&lt;br /&gt;一般MF无法识别js中的&amp;amp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;14. nodeName 和 tagName 问题&lt;br /&gt;&amp;nbsp;&amp;nbsp;(1)现有问题：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;在MF中，所有节点均有 nodeName 值，但 textNode 没有 tagName 值。在 IE 中，nodeName 的使用好象&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;有问题（具体情况没有测试，但我的IE已经死了好几次）。&lt;br /&gt;&amp;nbsp;&amp;nbsp;(2)解决方法：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;使用 tagName，但应检测其是否为空。&lt;br /&gt;&lt;br /&gt;15. 元素属性&lt;br /&gt;&amp;nbsp; &amp;nbsp;IE下 input.type属性为只读，但是MF下可以修改&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;16. document.getElementsByName() 和 document.all[name] 的问题&lt;br /&gt;&amp;nbsp;&amp;nbsp;(1)现有问题：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;在 IE 中，getElementsByName()、document.all[name] 均不能用来取得 div 元素（是否还有其它不能取的元素还不知道）。&lt;/p&gt;&lt;p&gt;3)其它&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;event.layerX 在 IE 与 MF 中都有，具体意义有无差别尚未试验。&lt;br /&gt;&lt;br /&gt;这点问题了，event.layerx只有MF有，IE 是没有的。IE的对应是offsetX&lt;/p&gt;</description><category>web开发</category><pubDate>Wed, 01 Nov 2006 16:01:28 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497980.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497980.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235228/1237942</fs:itemid></item><item><title>Exception in Stutrs</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235229/1237942/1/item.html</link><description>&lt;p&gt;--------------------------------------------------------------------------- &lt;br /&gt;Must specify type attribute if name is specified &lt;br /&gt;============================================================================- &lt;br /&gt;ApplicationDispatcher[]: Servlet.service() for servlet debugjsp threw exception &lt;/p&gt;&lt;p&gt;javax.servlet.ServletException: Must specify type attribute if name is specified&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:471)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.jsp.lst_0005farticle$jsp._jspService(lst_0005farticle$jsp.java:754)&lt;/p&gt;&lt;p&gt;&amp;nbsp;at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107).................. &lt;br /&gt;============================================================================= &lt;br /&gt;看struts-config.xml没有用. &lt;br /&gt;你看看你的jsp页面中&amp;lt;html:form/&amp;gt;标签中是否定义了name属性，如果定义了，那么type属性一定要 &lt;br /&gt;定义.一般删除就可以了,name属性值就是你struts-config.xml中定义的action的name的值. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------- &lt;br /&gt;下边的这些是在&amp;nbsp;&lt;a class=&quot;HeaderMainTitle&quot; id=&quot;Header1_HeaderTitle&quot; href=&quot;http://www.cnblogs.com/bjzhanghao/&quot;&gt;&lt;font style=&quot;COLOR: #0000ff&quot; color=&quot;#ffffff&quot; size=&quot;4&quot;&gt;八进制&lt;/font&gt;&lt;/a&gt; 的blog上看到的，感觉不错，copy过来&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、“No bean found under attribute key XXX”&lt;br /&gt;&lt;/strong&gt;在struts-config.xml里定义了一个ActionForm，但type属性指定的类不存在，type属性的值应该是Form类的全名。或者是，在Action的定义中，name或attribute属性指定的ActionForm不存在。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、“Cannot find bean&amp;nbsp;XXX in any scope”&lt;/strong&gt;&lt;br /&gt;在Action里一般会request.setAttribute()一些对象，然后在转向的jsp文件里（用tag或request.getAttribute()方法）得到这些对象并显示出来。这个异常是说jsp要得到一个对象，但前面的Action里并没有将对象设置到request（也可以是session、servletContext）里。&lt;br /&gt;可能是名字错了，请检查jsp里的tag的一般是name属性，或getAttribute()方法的参数值；或者是Action逻辑有问题没有执行setAttribute()方法就先转向了。&lt;br /&gt;还有另外一个可能，纯粹是jsp文件的问题，例如&amp;lt;logic:iterate&amp;gt;会指定一个id值，然后在循环里&amp;lt;bean:write&amp;gt;使用这个值作为name的值，如果这两个值不同，也会出现此异常。（都是一个道理，request里没有对应的对象。）&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3、“Missing message for key &amp;quot;XXX&amp;quot;”&lt;/strong&gt;&lt;br /&gt;缺少所需的资源，检查ApplicationResources.properties文件里是否有jsp文件里需要的资源，例如：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style=&quot;BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid&quot;&gt;&lt;div&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;bean:message&amp;nbsp;key&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;msg.name.prompt&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这行代码会找msg.name.prompt资源，如果AppliationResources.properties里没有这个资源就会出现本异常。在使用多模块时，要注意在模块的struts-config-xxx.xml里指定要使用的资源文件名称，否则当然什么资源也找不到，这也是一个很容易犯的错误。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4、“No getter method for property&amp;nbsp;XXX of bean teacher”&lt;/strong&gt;&lt;br /&gt;这条异常信息说得很明白，jsp里要取一个bean的属性出来，但这个bean并没有这个属性。你应该检查jsp中某个标签的property属性的值。例如下面代码中的cade应该改为code才对：&lt;/p&gt;&lt;div style=&quot;BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid&quot;&gt;&lt;div&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;bean:write&amp;nbsp;name&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;teacher&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;property&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;cade&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;nbsp;filter&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p /&gt;&lt;p&gt;&lt;strong&gt;5、“Cannot find ActionMappings or ActionFormBeans collection”&lt;br /&gt;&lt;/strong&gt;待解决。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6、“Cannot retrieve mapping for action XXX”&lt;br /&gt;&lt;/strong&gt;在.jsp的&amp;lt;form&amp;gt;标签里指定action='/XXX'，但这个Action并未在struts-config.xml里设置过。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7、HTTP Status 404 - /xxx/xxx.jsp&lt;br /&gt;&lt;/strong&gt;Forward的path属性指向的jsp页面不存在，请检查路径和模块，对于同一模块中的Action转向，path中不应包含模块名；模块间转向，记住使用contextRelative=&amp;quot;true&amp;quot;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;8、没有任何异常信息，显示空白页面&lt;/strong&gt;&lt;br /&gt;可能是Action里使用的forward与struts-config.xml里定义的forward名称不匹配。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9、“The element type &amp;quot;XXX&amp;quot; must be terminated by the matching end-tag &amp;quot;XXX&amp;quot;.”&lt;br /&gt;&lt;/strong&gt;这个是struts-config.xml文件的格式错误，仔细检查它是否是良构的xml文件，关于xml文件的格式这里就不赘述了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10、“Servlet.init() for servlet action threw exception”&lt;/strong&gt;&lt;br /&gt;一般出现这种异常在后面会显示一个关于ActionServlet的异常堆栈信息，其中指出了异常具体出现在代码的哪一行。我曾经遇到的一次提示如下：&lt;/p&gt;&lt;div style=&quot;BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid&quot;&gt;&lt;div&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;java.lang.NullPointerException&lt;br /&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;org.apache.struts.action.ActionServlet.parseModuleConfigFile(ActionServlet.java:&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;1003&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;)&lt;br /&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;at&amp;nbsp;org.apache.struts.action.ActionServlet.initModuleConfig(ActionServlet.java:&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;955&lt;/span&gt;&lt;span style=&quot;COLOR: #000000&quot;&gt;)&lt;br /&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/OutliningIndicators/None.gif&quot; align=&quot;top&quot; /&gt;&lt;img src=&quot;http://www.cnblogs.com/Images/dot.gif&quot; /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;为解决问题，先下载struts的源码包，然后在ActionServlet.java的第1003行插入断点，并对各变量进行监视。很丢人，我竟然把struts-config.xml文件弄丢了，因此出现了上面的异常，应该是和CVS同步时不小心删除的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;11、“Resources not defined for Validator”&lt;/strong&gt;&lt;br /&gt;这个是利用Validator插件做验证时可能出现的异常，这时你要检查validation.xml文件，看里面使用的资源是否确实有定义，form的名称是否正确，等等。&lt;/p&gt;&lt;p&gt;上面这些是我在用Struts做项目时遇到过的问题，其中一些曾困绕我不少时间，其实大部分都是自己不细心造成的。希望这篇文章能对你的开发有所帮助，并欢迎继续补充。&lt;/p&gt;</description><category>Java</category><pubDate>Thu, 26 Oct 2006 17:18:40 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497979.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497979.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235229/1237942</fs:itemid></item><item><title>DWR学习</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235230/1237942/1/item.html</link><description>&lt;table width=&quot;100%&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;p&gt;http://getahead.ltd.uk/dwr/ &lt;br /&gt;这段时间较闲,研究了一番dwr.发现dwr实现的AJAX有些地方确实很是先进.比如动态生成java script代码;隐藏的http协议;java script于java代码交互的是java script对象(或字符串)等. &lt;br /&gt;以下是我临时译的一些东西.本来想全译,发现dwr实在是简单,就随便写了.英文居差,现一把.&lt;/p&gt;&lt;p&gt;1、DWR: Easy AJAX for JAVA&lt;/p&gt;&lt;p&gt;作为一个java open source library,DWR可以帮助开发人员完成应用AJAX技术的web程序。它可以让浏览器上的java script方法调用运行在web服务器上java方法。&lt;/p&gt;&lt;p&gt;DWR主要由两部门组成。java script与web服务器通信并更新web页；运行在web服务器的Servlet处理请求并把响应发回浏览器。&lt;/p&gt;&lt;p&gt;DWR采用新颖的方法实现了AJAX(本来也没有确切的定义)，在java代码基础上动态的生成java script代码。web开发者可以直接调用这些java script代码，然而真正的代码是运行在web服务器上的java code。出与安全考虑，开发者必须配置哪些java class暴露给DWR.(dwr.xml)&lt;/p&gt;&lt;p&gt;这种从(java到java script)调用机制给用户一种感觉，好象常规的RPC机制，或RMI or SOAP.但是它运行在web上，不需要任何浏览器插件。&lt;/p&gt;&lt;p&gt;DWR不认为浏览器和web服务器之间协议重要，把系统界面放在首位。最大挑战是java method call的同步特征与ajax异步特性之间的矛盾。在异步模型里，结果只有在方法结束后才有效。DWR解决了这个问题，把回调函数当成参数传给方法，处理完成后，自动调用回调方法。&lt;/p&gt;&lt;p&gt;这个图表显示了，通过java script事件，DWR能改变select的内容，当然这些内容由java代码返回。 java script函数Data.getOptions(populateList)由DWR动态生成，这个函数会调用java class Data类的方法。DWR处理如何远程调用，包括转换所有的参数和返回的结果（java script\java）。java方法执行完后，执行回调方法populateList。在整个过程中我们就想在用本地的方法一样。&lt;/p&gt;&lt;p&gt;2、Getting Started&lt;/p&gt;&lt;p&gt;废话少说，试试就ok了。 &lt;br /&gt;web.xml&lt;/p&gt;&lt;p&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;ISO-8859-1&amp;quot;?&amp;gt; &lt;br /&gt;&amp;lt;!DOCTYPE web-app PUBLIC &amp;quot;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&amp;quot; &amp;quot;http://java.sun.com/dtd/web-app_2_3.dtd&amp;quot;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;web-app id=&amp;quot;dwr&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;servlet&amp;gt; &lt;br /&gt;&amp;lt;servlet-name&amp;gt;dwr-invoker&amp;lt;/servlet-name&amp;gt; &lt;br /&gt;&amp;lt;servlet-class&amp;gt;uk.ltd.getahead.dwr.DWRServlet&amp;lt;/servlet-class&amp;gt; &lt;br /&gt;&amp;lt;/servlet&amp;gt; &lt;br /&gt;&amp;lt;servlet-mapping&amp;gt; &lt;br /&gt;&amp;lt;servlet-name&amp;gt;dwr-invoker&amp;lt;/servlet-name&amp;gt; &lt;br /&gt;&amp;lt;url-pattern&amp;gt;/dwr/*&amp;lt;/url-pattern&amp;gt; &lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt; &lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;/p&gt;&lt;p&gt;dwr.xml 与web.xml同目录 &lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt; &lt;br /&gt;&amp;lt;!DOCTYPE dwr PUBLIC &amp;quot;-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN&amp;quot; &amp;quot;http://www.getahead.ltd.uk/dwr/dwr10.dtd&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;dwr&amp;gt; &lt;br /&gt;&amp;lt;allow&amp;gt; &lt;br /&gt;&amp;lt;create creator=&amp;quot;new&amp;quot; java script=&amp;quot;JDate&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;param name=&amp;quot;class&amp;quot; value=&amp;quot;java.util.Date&amp;quot;/&amp;gt; &lt;br /&gt;&amp;lt;/create&amp;gt; &lt;br /&gt;&amp;lt;/allow&amp;gt; &lt;br /&gt;&amp;lt;/dwr&amp;gt;&lt;/p&gt;&lt;p&gt;index.html &lt;br /&gt;&amp;lt;html&amp;gt; &lt;br /&gt;&amp;lt;head&amp;gt; &lt;br /&gt;&amp;lt;title&amp;gt;DWR - Test Home&amp;lt;/title&amp;gt; &lt;br /&gt;&amp;lt;script type='text/java script' src='dwr/interface/JDate.js'&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;script type='text/java script' src='dwr/engine.js'&amp;gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;script&amp;gt; &lt;br /&gt;function init(){ &lt;br /&gt;JDate.getYear(load); &lt;br /&gt;} &lt;br /&gt;function load(data){ &lt;br /&gt;alert(data+1900+'年') &lt;br /&gt;} &lt;br /&gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&amp;lt;/head&amp;gt; &lt;br /&gt;&amp;lt;body on load=&amp;quot;init()&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;/body&amp;gt; &lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;&lt;p&gt;dwr.jar 下载放lib下&lt;/p&gt;&lt;p&gt;完了，什么，够了，就这些。访问ok! &lt;br /&gt;3、Examples &lt;br /&gt;http://www.aboutmyhealth.org/ 这不是Google Suggest吗!ok. &lt;br /&gt;4、源码浅析 &lt;br /&gt;dwr的设计很象webwork2的设计,隐藏http协议,扩展性，兼容性及强。&lt;/p&gt;&lt;p&gt;通过研究uk.ltd.getahead.dwr.DWRServlet这个servlet来研究下dwr到底是如何工作滴。&lt;/p&gt;&lt;p /&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;pre&gt; &lt;span class=&quot;ident&quot;&gt;web&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;xml配置&lt;/span&gt;
&lt;br /&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;    &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;invoker&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;servlet-name&amp;gt;
&lt;br /&gt;    &amp;lt;servlet-class&amp;gt;uk.ltd.getahead.dwr.DWRServlet&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;  &lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;servlet&amp;gt;
&lt;br /&gt;  &amp;lt;servlet-mapping&amp;gt;
&lt;br /&gt;    &amp;lt;servlet-name&amp;gt;dwr-invoker&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;    &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;pattern&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/*&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;url-pattern&amp;gt;
&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;mapping&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;这样所有的/dwr/*所有请求都由这个servlet来处理，它到底处理了些什么能。我们还以上面最简单的例子来看。 &lt;br /&gt;1、 web服务器启动，DWRServlet init()方法调用，init主要做了以下工作。 &lt;br /&gt;设置日志级别、实例化DWR用到的单例类（这些类在jvm中只有一个实例对象）、读去配置文件（包括dwr.jar包中的dwr.xml,WEB-INF/dwr.xml. config*.xml）。 &lt;br /&gt;2、请求处理 &lt;br /&gt;DWRServlet.doGet, doPost方法都调用processor.handle(req, resp)方法处理。Processor对象在init()方法中已经初始化了。 &lt;br /&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;pre&gt; &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;handle&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;HttpServletRequest&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;HttpServletResponse&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;)&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;keyword&quot;&gt;throws&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;IOException&lt;/span&gt;
&lt;br /&gt;    &lt;span class=&quot;punct&quot;&gt;{&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;constant&quot;&gt;String&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;getPathInfo&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;();&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;equals&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;))&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;{&lt;/span&gt;
&lt;br /&gt;            &lt;span class=&quot;ident&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;sendRedirect&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;getContextPath&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;getServletPath&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;'&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;index.html&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;);&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;equalsIgnoreCase&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;/index.html&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;))&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;{&lt;/span&gt;
&lt;br /&gt;            &lt;span class=&quot;ident&quot;&gt;doIndex&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;);&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;/test/&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;))&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;{&lt;/span&gt;
&lt;br /&gt;            &lt;span class=&quot;ident&quot;&gt;doTest&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;);&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;equalsIgnoreCase&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;/engine.js&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;))&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;{&lt;/span&gt;
&lt;br /&gt;            &lt;span class=&quot;ident&quot;&gt;doFile&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;engine.js&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;,&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;text/java script&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;);&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;equalsIgnoreCase&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;/util.js&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;))&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;{&lt;/span&gt;
&lt;br /&gt;            &lt;span class=&quot;ident&quot;&gt;doFile&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;util.js&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;,&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;text/java script&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;);&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;equalsIgnoreCase&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;/deprecated.js&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;))&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;{&lt;/span&gt;
&lt;br /&gt;            &lt;span class=&quot;ident&quot;&gt;doFile&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;deprecated.js&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;,&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;text/java script&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;);&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;/interface/&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;))&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;{&lt;/span&gt;
&lt;br /&gt;            &lt;span class=&quot;ident&quot;&gt;doInterface&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;);&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;punct&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;pathinfo&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;startsWith&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;/exec&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;))&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;{&lt;/span&gt;
&lt;br /&gt;            &lt;span class=&quot;ident&quot;&gt;doExec&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;ident&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;);&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;{&lt;/span&gt;
&lt;br /&gt;            &lt;span class=&quot;ident&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;warn&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&amp;quot;&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;Page not found. In debug/test mode try viewing /[WEB-APP]/dwr/&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;quot;);&lt;/span&gt;
&lt;br /&gt;            &lt;span class=&quot;ident&quot;&gt;resp&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;sendError&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;404&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;);&lt;/span&gt;
&lt;br /&gt;        &lt;span class=&quot;punct&quot;&gt;}&lt;/span&gt;
&lt;br /&gt;    &lt;span class=&quot;punct&quot;&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;哦。这些恍然大悟。dwr/*处理的请求也就这几种。 &lt;br /&gt;（1）dwr/index.html，dwr/test/这种只能在debug模式下使用，调试用。 &lt;br /&gt;dwr/engine.js，dwr/util.js，dwr/deprecated.js当这个请求到达，从dwr.jar包中读取文件流，响应回去。（重复请求有缓存） &lt;br /&gt;（2）当dwr/interface/这种请求到来，（例如我们在index.html中的 &amp;lt;script type='text/java script' src='dwr/interface/JDate.js'&amp;gt;&amp;lt;/script&amp;gt;）DWR做一件伟大的事。把我们在WEB-INF/dwr.xml中的 &lt;br /&gt;&amp;lt;create creator=&amp;quot;new&amp;quot; java script=&amp;quot;JDate&amp;quot;&amp;gt; &lt;br /&gt;&amp;lt;param name=&amp;quot;class&amp;quot; value=&amp;quot;java.util.Date&amp;quot;/&amp;gt; &lt;br /&gt;&amp;lt;/create&amp;gt; &lt;br /&gt;java.util.Date转化为java script函数。 &lt;br /&gt;http://localhost:port/simpledwr/dwr/interface/JDate.js看看吧。 &lt;br /&gt;细节也比较简单，通过java反射，把方法都写成java script特定的方法。（我觉得这些转换可以放到缓存里，下次调用没必要再生成一遍，不知道作者为什么没这样做）。 &lt;br /&gt;（3）dwr/exec &lt;br /&gt;java script调用方法时发送这种请求，可能是XMLHttpRequest或IFrame发送。 &lt;br /&gt;当然，java script调用的方法签名与java代码一致，包括参数，还有java script的回调方法也传到了服务器端，在服务器端很容易实现。回调方法的java的执行结果 返回类似 &amp;lt;script&amp;gt;callMethod(结果)&amp;lt;script&amp;gt;的java script字符串,在浏览器执行。哈，一切就这么简单，巧妙。 &lt;p /&gt;&lt;p&gt;dwr的设计构思很是巧妙。 &lt;br /&gt;第一、把java类转化为java script类由dwr自动完成，只需简单的配置。 &lt;br /&gt;第二、应用起来极其简单。开发者不要该服务器代码就可以集成。 &lt;br /&gt;第三、容易测试。和webwork一样，隐藏的http协议。 &lt;br /&gt;第四、及强扩展性。例如与spring集成，只需修改一点代码。 &lt;br /&gt;第五、性能。就我与jason,等简单比较，dwr性能可能是最好的。 &lt;br /&gt;第六、自动把java对象转化为java script对象，并且及易扩展。[/code]&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style=&quot;PADDING-RIGHT: 10px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 15px 0px 0px 10px; PADDING-TOP: 10px&quot;&gt;&lt;table class=&quot;attach&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;95%&quot; align=&quot;center&quot; border=&quot;1&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;attachrow&quot; style=&quot;BACKGROUND: #d1d7dc&quot; align=&quot;center&quot; width=&quot;100%&quot; colspan=&quot;3&quot;&gt;&lt;b&gt;&lt;span class=&quot;gen&quot;&gt;simpledwr.rar&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;attachrow&quot; width=&quot;15%&quot;&gt;&lt;span class=&quot;genmed&quot;&gt;&amp;nbsp;描述:&lt;/span&gt;&lt;/td&gt;&lt;td class=&quot;attachrow&quot; width=&quot;75%&quot;&gt;&amp;nbsp;最简单的一个例子. &lt;/td&gt;&lt;td class=&quot;attachrow&quot; align=&quot;center&quot; width=&quot;10%&quot; rowspan=&quot;4&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;http://www.javaeye.com/images/forum/icon_clip.gif&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.javaeye.com/topics/download/e957cb27-8233-4606-85e3-e59f307ab0ee&quot;&gt;&lt;b&gt;下载&lt;/b&gt;&lt;/a&gt; &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;attachrow&quot; width=&quot;15%&quot;&gt;&lt;span class=&quot;genmed&quot;&gt;&amp;nbsp;文件名:&lt;/span&gt;&lt;/td&gt;&lt;td class=&quot;attachrow&quot; width=&quot;75%&quot;&gt;&lt;span class=&quot;genmed&quot;&gt;&amp;nbsp;simpledwr.rar&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;attachrow&quot; width=&quot;15%&quot;&gt;&lt;span class=&quot;genmed&quot;&gt;&amp;nbsp;文件大小:&lt;/span&gt;&lt;/td&gt;&lt;td class=&quot;attachrow&quot; width=&quot;75%&quot;&gt;&lt;span class=&quot;genmed&quot;&gt;&amp;nbsp;137 KB&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;attachrow&quot; width=&quot;15%&quot;&gt;&lt;span class=&quot;genmed&quot;&gt;&amp;nbsp;下载过的:&lt;/span&gt;&lt;/td&gt;&lt;td class=&quot;attachrow&quot; width=&quot;75%&quot;&gt;&lt;span class=&quot;genmed&quot;&gt;&amp;nbsp;文件被下载或查看 459 次&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div style=&quot;PADDING-RIGHT: 10px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 15px 0px 0px 10px; PADDING-TOP: 10px&quot;&gt;&lt;table class=&quot;attach&quot; cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;95%&quot; align=&quot;center&quot; border=&quot;1&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class=&quot;attachrow&quot; style=&quot;BACKGROUND: #d1d7dc&quot; align=&quot;center&quot; width=&quot;100%&quot; colspan=&quot;2&quot;&gt;&lt;b&gt;&lt;span class=&quot;gen&quot;&gt;howitworks.png&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;attachrow&quot; width=&quot;15%&quot;&gt;&lt;span class=&quot;genmed&quot;&gt;&amp;nbsp;描述:&lt;/span&gt;&lt;/td&gt;&lt;td class=&quot;attachrow&quot; width=&quot;75%&quot;&gt;&amp;nbsp; &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;attachrow&quot; width=&quot;15%&quot;&gt;&lt;span class=&quot;genmed&quot;&gt;&amp;nbsp;文件大小:&lt;/span&gt;&lt;/td&gt;&lt;td class=&quot;attachrow&quot; width=&quot;75%&quot;&gt;&lt;span class=&quot;genmed&quot;&gt;&amp;nbsp;31 KB&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class=&quot;attachrow&quot; width=&quot;15%&quot;&gt;&lt;span class=&quot;genmed&quot;&gt;&amp;nbsp;看过的:&lt;/span&gt;&lt;/td&gt;&lt;td class=&quot;attachrow&quot; width=&quot;75%&quot;&gt;&lt;span class=&quot;genmed&quot;&gt;&amp;nbsp;文件被下载或查看 410 次&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; colspan=&quot;2&quot;&gt;&lt;br /&gt;&lt;a href=&quot;http://www.javaeye.com/topics/download/76d1fbfb-3ed6-4bf3-86cf-83dd4cec9ed1&quot; target=&quot;_blank&quot;&gt;&lt;img alt=&quot;howitworks.png&quot; src=&quot;http://www.javaeye.com/upload/attachment/pic/1464/9197aafa-d2d1-435c-9f92-d1a91fda79c6-thumb.png&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; &lt;br /&gt;&lt;a href=&quot;http://www.javaeye.com/topics/download/76d1fbfb-3ed6-4bf3-86cf-83dd4cec9ed1?disposition=attachment&quot;&gt;&lt;b&gt;下载&lt;/b&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;1 dwr支持的java类型于java script类型如何转化. &lt;br /&gt;2 dwr配置说明. &lt;br /&gt;3 于spring,struts,webwork的集成. &lt;br /&gt;4 dwr是如何解决我的那些疑问的. &lt;br /&gt;http://forum.javaeye.com/viewtopic.php?t=14083 &lt;br /&gt;5 见 http://forum.javaeye.com/viewtopic.php?t=13995.现在我自己倾向于用java script代替xml.毕竟浏览器消费最好是java script对象. &lt;br /&gt;&lt;p&gt;1、最小配置 &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;pre&gt; &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;  &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;invoker&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;servlet-name&amp;gt;
&lt;br /&gt;  &amp;lt;servlet-class&amp;gt;uk.ltd.getahead.dwr.DWRServlet&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;servlet&amp;gt;
&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;
&lt;br /&gt;  &amp;lt;servlet-name&amp;gt;dwr-invoker&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;  &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;pattern&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/*&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;url-pattern&amp;gt;
&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;mapping&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;br /&gt;2、当我们想看DWR自动生成的测试页（Using debug/test mode）时，可在 &lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;pre&gt; &lt;span class=&quot;ident&quot;&gt;servlet中加&lt;/span&gt;
&lt;br /&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;  &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;param-name&amp;gt;
&lt;br /&gt;  &amp;lt;param-value&amp;gt;true&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;init-param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;这个参数DWR默认是false.如果选择true.我们可以通过url http://localhost:port/app/dwr ,你就可以看到你部署的每个DWR class。并且可以测试java代码的每个方法是否运行正常。为了安全考虑，在正式环境下你一定把这个参数设为false. &lt;br /&gt;3、logging信息配置。 &lt;br /&gt;在无java.util.logging的jdk1.3下运行DWR,我们不希望强制用户加一个logging包，而是用HttpServlet.log()方法来输出日志。如果classpath中包括logging jar包，DWR自动切换用logging输出日志。 &lt;br /&gt;如果用HttpServlet.log()方法，以下配置是有效的。 &lt;br /&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;pre&gt; &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt; &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;logLevel&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;param-name&amp;gt;
&lt;br /&gt; &amp;lt;param-value&amp;gt;DEBUG&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;init-param&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;有效的值是 FATAL, ERROR, WARN (the default), INFO and DEBUG &lt;p /&gt;&lt;p&gt;我是喜欢用log4j输出日志，那么在log4j.properties下加，log4j.logger.uk.ltd.getahead.dwr = debug。这样可以看DWR的调试日志。 &lt;br /&gt;4、多dwr.xml文件的配置 &lt;br /&gt;可能有几种情况，我们一一列举。 一个servlet,多个dwr.xml配置文件；多个servlet，每个servlet对应一个或多个dwr.xml. &lt;br /&gt;一个servlet,多个dwr.xml配置文件； &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;pre&gt; &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;    &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;invoker&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;servlet-name&amp;gt;
&lt;br /&gt;    &amp;lt;servlet-class&amp;gt;uk.ltd.getahead.dwr.DWRServlet&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt; 
&lt;br /&gt;    &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;      &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;param-name&amp;gt;
&lt;br /&gt;      &amp;lt;param-value&amp;gt;WEB-INF&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr1&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;xml&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;param-value&amp;gt;
&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;    &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;      &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;param-name&amp;gt;
&lt;br /&gt;      &amp;lt;param-value&amp;gt;WEB-INF&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr2&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;xml&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;param-value&amp;gt;
&lt;br /&gt;    &amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;servlet&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;在这种配置下，param-name的值必须以config开头。param-name可以有&amp;gt;=0个。如果没有param-name，那么将会读取WEB-INF/dwr.xml。如果有大于零个param-name，那么WEB-INF/dwr.xml文件将不会被读取。 &lt;p /&gt;&lt;p&gt;多个servlet，每个servlet对应一个或多个dwr.xml &lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;pre&gt; &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;   &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;invoker&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;servlet-name&amp;gt;
&lt;br /&gt;    &amp;lt;servlet-class&amp;gt;uk.ltd.getahead.dwr.DWRServlet&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt; 
&lt;br /&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;!--用&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;classes&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;xml&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;--&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;servlet&amp;gt;
&lt;br /&gt;&amp;lt;servlet&amp;gt;
&lt;br /&gt;   &amp;lt;servlet-name&amp;gt;dwr-invoker1&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;   &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;uk&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;ltd&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;getahead&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;DWRServlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;servlet-class&amp;gt; 
&lt;br /&gt;   &amp;lt;init-param&amp;gt;
&lt;br /&gt;     &amp;lt;param-name&amp;gt;config-admin&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;     &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;WEB&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;INF&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr1&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;xml&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;param-value&amp;gt;
&lt;br /&gt;   &amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;   &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;     &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;param-name&amp;gt;
&lt;br /&gt;     &amp;lt;param-value&amp;gt;true&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;param&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;   &lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;init-param&amp;gt;
&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;mapping&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;   &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;invoker&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;servlet-name&amp;gt;
&lt;br /&gt;   &amp;lt;url-pattern&amp;gt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/*&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;url-pattern&amp;gt;
&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;mapping&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;mapping&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;
&lt;br /&gt;   &lt;span class=&quot;punct&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;invoker1&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;servlet-name&amp;gt;
&lt;br /&gt;   &amp;lt;url-pattern&amp;gt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr1&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/*&amp;lt;/&lt;/span&gt;&lt;span class=&quot;regex&quot;&gt;url-pattern&amp;gt;
&lt;br /&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;servlet&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;mapping&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;在这种情况下，我们可以根据J2EE security来控制权限，针对不同url,加不同的角色。 &lt;br /&gt;5、dwr的几个扩展点（Plug-ins） &lt;br /&gt;DWR对以下接口提供的默认的实现，用户可以继承DWR的默认实现类来达到我们想要的效果。但这至少需要我们读了DWR源码才能做这些工作(dwr源码很是清晰，有兴趣可以学习一下)，以后可能补存这部分。 &lt;br /&gt;&lt;div class=&quot;code_title&quot;&gt;代码&lt;/div&gt;&lt;div class=&quot;code_div&quot;&gt;&lt;pre&gt; &lt;span class=&quot;ident&quot;&gt;uk&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;ltd&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;getahead&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;AccessControl&lt;/span&gt;    
&lt;br /&gt;&lt;span class=&quot;ident&quot;&gt;uk&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;ltd&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;getahead&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;Configuration&lt;/span&gt; 
&lt;br /&gt;&lt;span class=&quot;ident&quot;&gt;uk&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;ltd&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;getahead&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;ConverterManager&lt;/span&gt; 
&lt;br /&gt;&lt;span class=&quot;ident&quot;&gt;uk&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;ltd&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;getahead&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;CreatorManager&lt;/span&gt; 
&lt;br /&gt;&lt;span class=&quot;ident&quot;&gt;uk&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;ltd&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;getahead&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;Processor&lt;/span&gt; 
&lt;br /&gt;&lt;span class=&quot;ident&quot;&gt;uk&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;ltd&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;getahead&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;dwr&lt;/span&gt;&lt;span class=&quot;punct&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;ident&quot;&gt;ExecutionContext&lt;/span&gt; &lt;/pre&gt;&lt;/div&gt;</description><category>web开发</category><pubDate>Mon, 23 Oct 2006 11:21:09 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497978.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497978.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235230/1237942</fs:itemid></item><item><title>Eclipse 启动参数配置</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235231/1237942/1/item.html</link><description>&lt;p&gt;eclipse.exe -vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=20M -Xms64M -Xmx256M&lt;/p&gt;&lt;h3&gt;将工作空间位置设置为在当前工作目录内&lt;/h3&gt;&lt;p&gt;在此方案中，工作空间位置将是当前工作目录中称为 &lt;samp&gt;&lt;font face=&quot;新宋体&quot;&gt;workspace&lt;/font&gt;&lt;/samp&gt; 的目录。&lt;/p&gt;&lt;p&gt;实现此目的最容易的方法可能是使用下列步骤来创建快捷方式：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;浏览至 Windows 资源管理器中的 eclipse.exe 并使用右键拖动来创建 eclipse.exe 的快捷方式。 &lt;/li&gt;&lt;li&gt;编辑快捷方式的属性，以使&lt;b&gt;启动位置：&lt;/b&gt;字段标识工作空间位置的父目录（例如，&lt;samp&gt;&lt;font face=&quot;新宋体&quot;&gt;c:\users\robert&lt;/font&gt;&lt;/samp&gt;）。 &lt;/li&gt;&lt;li&gt;关闭属性对话框并双击快捷方式（如果提供的目录为 &lt;samp&gt;&lt;font face=&quot;新宋体&quot;&gt;c:\users\robert&lt;/font&gt;&lt;/samp&gt;，则工作空间位置将为 &lt;samp&gt;&lt;font face=&quot;新宋体&quot;&gt;c:\users\robert\workspace&lt;/font&gt;&lt;/samp&gt;）。 &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;当然，您也可以使用命令提示符（通过将目录切换为工作空间父目录然后运行 eclipse.exe）来获得同样的效果。&lt;/p&gt;&lt;h3&gt;使用 -data 设置工作空间的特定位置&lt;/h3&gt;&lt;p&gt;要使用 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;-data&lt;/font&gt;&lt;/code&gt; 命令行自变量，只要将 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;-data &lt;var&gt;your_workspace_location&lt;/var&gt;&lt;/font&gt;&lt;/code&gt;（例如，&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;-data c:\users\robert\myworkspace&lt;/font&gt;&lt;/code&gt;）添加至快捷方式属性中的&lt;b&gt;目标&lt;/b&gt;字段或显式地将它包括在命令行上。&lt;/p&gt;&lt;h3&gt;使用 -vm 设置 java VM&lt;/h3&gt;&lt;p&gt;建议显式指定在运行 Eclipse 时要使用哪个 Java VM。使用 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;-vm&lt;/font&gt;&lt;/code&gt; 命令行自变量（例如，&lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;-vm c:\jre\bin\javaw.exe&lt;/font&gt;&lt;/code&gt;）可以实现此目的。如果不使用 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;-vm&lt;/font&gt;&lt;/code&gt;，则 Eclipse 将使用在 O/S 路径上找到的一个 Java VM。当安装其它产品时，它们可更改您的路径，导致在下一次启动 Eclipse 时使用另一 Java VM。&lt;/p&gt;&lt;h2&gt;运行 Eclipse 中的高级主题&lt;/h2&gt;&lt;p&gt;Eclipse 可执行文件及平台本身提供了人们感兴趣的开发或调试 Eclipse 各部件的许多执行选项。这是常用选项列表，有关完整列表，请参阅 Platform Plug-in Developer Guide 中的 Eclipse 运行时选项页面。运行 Eclipse 可执行文件的一般格式是：&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;eclipse [platform options] [-vmargs [Java VM arguments]]&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;table height=&quot;2005&quot; width=&quot;90%&quot; border=&quot;1&quot;&gt;&lt;caption&gt;&lt;b&gt;Eclipse 启动参数&lt;/b&gt; &lt;/caption&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th width=&quot;33%&quot;&gt;&lt;b&gt;命令&lt;/b&gt;&lt;/th&gt;&lt;th width=&quot;65%&quot;&gt;&lt;b&gt;描述&lt;/b&gt;&lt;/th&gt;&lt;td width=&quot;2%&quot;&gt;&lt;b&gt;原因&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-arch&lt;/b&gt; &lt;var&gt;architecture&lt;/var&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;定义 Eclipse 平台在其上运行的处理器体系结构。Eclipse 平台通常使用 Java &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;os.arch&lt;/font&gt;&lt;/code&gt; 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOSArch() 用于插件。示例值有：“x86”、“sparc”、“PA-RISC”和“ppc”。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;2.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-application&lt;/b&gt; &lt;var&gt;applicationId&lt;/var&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;要运行的应用程序。应用程序由向 org.eclipse.core.runtime.applications 扩展点提供扩展的插件来声明。通常不需要此自变量。如果指定了此项，则该值会覆盖配置提供的值。如果不指定此项，则会运行“Eclipse 工作台”。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-configuration&lt;/b&gt; &lt;var&gt;configurationFileURL&lt;/var&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;Eclipse 平台配置文件的位置，表示为 URL。配置文件确定 Eclipse 平台、可用插件集和主要功能部件的位置。注意，不允许使用相对 URL。当安装或更新 Eclipse 平台时配置文件被写至此位置。 &lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;2.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-consolelog&lt;/b&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;将 Eclipse 平台的错误日志镜像到用来运行 Eclipse 的控制台。与 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;-debug&lt;/font&gt;&lt;/code&gt; 组合时很方便使用。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-data&lt;/b&gt; &lt;var&gt;workspacePath&lt;/var&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;要运行 Eclipse 平台的工作空间的路径。工作空间位置也是项目的缺省位置。相对于从中启动 eclipse 的目录来解释相对路径。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-debug&lt;/b&gt; [&lt;var&gt;optionsFile&lt;/var&gt;]&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;将平台置于调试方式，并从给定位置处的文件装入调试选项（如果指定的话）。此文件指示哪些调试点可用于插件以及是否已启用它们。如果未给出文件位置，则平台在启动 eclipse 的目录中查找称为“.options”的文件。URL 和文件系统路径都可作为文件位置。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot; height=&quot;133&quot;&gt;&lt;pre&gt;&lt;b&gt;-dev&lt;/b&gt; [&lt;var&gt;classpathEntries&lt;/var&gt;]&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;将平台置于开发方式。将可选类路径条目（用逗号分隔的列表）添加至每个插件的运行时类路径。例如，当工作空间包含要开发的插件时，指定 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;-dev bin&lt;/font&gt;&lt;/code&gt; 会为每个插件项目的名为 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;bin&lt;/font&gt;&lt;/code&gt; 的目录添加类路径条目，允许在其中存储最新生成的类文件。除去了冗余或不存在的类路径条目。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-keyring&lt;/b&gt; &lt;var&gt;keyringFilePath&lt;/var&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;磁盘上授权数据库（或“密钥环”文件）的位置。此自变量必须与 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;-password&lt;/font&gt;&lt;/code&gt; 选项配合使用。相对于从中启动 eclipse 的目录来解释相对路径。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-nl&lt;/b&gt; &lt;var&gt;locale&lt;/var&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;定义 Eclipse 平台在其上运行的语言环境的名称。Eclipse 平台通常自动计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getNL() 用于插件。示例值有：“en_US”和“fr_FR_EURO”。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;2.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-nosplash&lt;/b&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;运行平台而不显示启动屏幕。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-os&lt;/b&gt; &lt;var&gt;operatingSystem&lt;/var&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;定义 Eclipse 平台在其上运行的操作系统。Eclipse 平台通常使用 Java &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;os.name&lt;/font&gt;&lt;/code&gt; 属性的常用值来计算最佳设置。如果在此处指定该项，则这是 Eclipse 平台使用的值。此处指定的值可作为 BootLoader.getOS() 用于插件，并用于解析插件清单文件中提及的路径中 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;$os$&lt;/font&gt;&lt;/code&gt; 变量的出现。示例值有：“win32”、“linux”、“hpux”、“solaris”和“aix”。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-password&lt;/b&gt; &lt;var&gt;password&lt;/var&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;授权数据库的密码。与 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;-keyring&lt;/font&gt;&lt;/code&gt; 选项配合使用。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-perspective&lt;/b&gt; &lt;var&gt;perspectiveId&lt;/var&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;启动时要在活动工作台窗口中打开的透视图。如果没有指定该参数，则将打开关闭时活动的透视图。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-plugincustomization&lt;/b&gt;
	  &lt;var&gt;propertiesFile&lt;/var&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;包含插件首选项缺省设置的属性文件的位置。这些缺省设置覆盖在主要功能部件中指定的缺省设置。相对于从中启动 eclipse 的目录来解释相对路径。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;2.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;pre&gt;&lt;b&gt;-product&lt;/b&gt; &lt;em&gt;productId&lt;/em&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td height=&quot;16&quot;&gt;要运行的产品的标识。该产品为 Eclipse 的已启动实例提供了产品个性并确定使用的产品定制信息。此项替换 -feature，由于兼容性方面的原因，仍然支持后者。&lt;/td&gt;&lt;td height=&quot;16&quot;&gt;3.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot; height=&quot;16&quot;&gt;&lt;pre&gt;&lt;b&gt;-refresh&lt;/b&gt; &lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot; height=&quot;16&quot;&gt;启动时执行工作空间的全局刷新的选项。这将使从上次平台运行以来在文件系统中所做的任何更改一致。&lt;/td&gt;&lt;td width=&quot;2%&quot; height=&quot;16&quot;&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot; height=&quot;16&quot;&gt;&lt;pre&gt;&lt;b&gt;-showlocation&lt;/b&gt; &lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot; height=&quot;16&quot;&gt;用于在窗口标题栏中显示工作空间的位置的选项。在发行版 2.0 中，此选项仅与 -data 命令行自变量一起使用。&lt;/td&gt;&lt;td width=&quot;2%&quot; height=&quot;16&quot;&gt;2.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;pre&gt;&lt;b&gt;-vm&lt;/b&gt; &lt;var&gt;vmPath&lt;/var&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td width=&quot;65%&quot;&gt;要用来运行 Eclipse 平台的“Java 运行时环境”（JRE）的位置。如果不指定此项，则 JRE 位于 &lt;code&gt;&lt;font face=&quot;新宋体&quot;&gt;jre&lt;/font&gt;&lt;/code&gt;（它是 Eclipse 可执行文件的兄弟目录）。相对于从中启动 eclipse 的目录来解释相对路径。&lt;/td&gt;&lt;td width=&quot;2%&quot;&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot;&gt;&lt;pre&gt;&lt;b&gt;-vm&lt;/b&gt;&lt;strong&gt;args&lt;/strong&gt; &lt;em&gt;args&lt;/em&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td&gt;当传递至 Eclipse 时，此选项用来定制用来运行 Eclipse 的 Java VM 的操作。如果指定此项，则它必须在命令行的末尾。给定的自变量依赖于要运行的 VM。&lt;/td&gt;&lt;td&gt;1.0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;将 -vmargs 条目后面的所有自变量（但不包括 -vmargs）作为虚拟机自变量（即，在要运行的类的前面）直接传递到所指示的 Java VM。&lt;b&gt;注意：&lt;/b&gt;如果 Eclipse 启动在 Java vm 自变量（-vmargs）之后提供的自变量（例如，-data），则 Eclipse 将不会启动并且您将接收到“JVM 已终止。退出代码为 1”的错误。&lt;/p&gt;&lt;h2&gt;在不同的 VM 上运行&amp;nbsp;&lt;/h2&gt;&lt;h3&gt;在 J9 上运行 Eclipse&lt;/h3&gt;&lt;p&gt;当在 J9 版本 1.5 上运行 Eclipse 时，建议使用以下 VM 选项： &lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;eclipse.exe [eclipse arguments] -vm &lt;var&gt;path_to_j9w.exe&lt;/var&gt; 
            -vmargs -ms:32 -mm:2048 -mo:32768 -moi:32768 -mca:32 -mco:128 -mx:2000000&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;当在 J9 版本 2.0 上运行 Eclipse 时，J9W 选择的缺省自变量应为合适的选项。但是，要覆盖 Eclipse 可执行文件以内部方式自动设置的参数，必须指定 -vmargs 不带任何参数，如下所示： &lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;eclipse.exe [eclipse arguments] -vm &lt;var&gt;path_to_j9w.exe&lt;/var&gt; -vmargs&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;有关进一步信息，参考 J9 VM 文档和帮助。&lt;/p&gt;&lt;h3&gt;在 IBM Developer Kit, Java(TM) Technology Edition VM 上运行 Eclipse&lt;/h3&gt;&lt;p&gt;IBM Developer Kit, Java(TM) Technology Edition 1.3 Linux 的缺省 VM 设置适合进行初期研究工作，但在进行大型开发时是不够的。对于大型开发，应修改 VM 自变量以使有更多的堆可用。例如，下列设置将允许 Java 堆增大为 256MB：&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;-vmargs -Xmx256M &lt;/pre&gt;&lt;/blockquote&gt;</description><category>Java</category><pubDate>Wed, 18 Oct 2006 13:31:18 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497977.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497977.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235231/1237942</fs:itemid></item><item><title>获奖了</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235232/1237942/1/item.html</link><description>&lt;p&gt;前几天去领了个奖《河南省信息技术优秀成果奖》，特等的，虚荣心满足了一下。呵呵。&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot; 证书封面&quot; src=&quot;http://photo.blog.163.com/photo/WdoZu4ctSQb0JQMebw04dg==/1696168209658458710.jpg&quot; on load=&quot;java script: img_auto_size(this,450,true);&quot; align=&quot;baseline&quot; /&gt;&lt;/p&gt;</description><category>我的生活</category><pubDate>Fri, 13 Oct 2006 14:04:01 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497976.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497976.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235232/1237942</fs:itemid></item><item><title>意外</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235233/1237942/1/item.html</link><description>&lt;p&gt;10月2日晚7时许，于郑大球场打篮球时不慎摔伤胳膊肘关节，疼！&lt;/p&gt;&lt;p&gt;10月2日晚7时30分，郑大校医院，无骨科医生，无X光设备，一外科医生检查后：可能没伤着骨头，去大医院看看。忍！（当晚梦里仍感觉疼痛）&lt;/p&gt;&lt;p&gt;10月3日早7时，发现胳膊快有腿粗，仍疼，遂去省中医院。&lt;/p&gt;&lt;p&gt;10月3日上午10时，省中医院，照完X光，盼到片子出来后，发现没有大碍，庆幸中。医生开中华跌打丸三盒。先服一周再说。&lt;/p&gt;&lt;p&gt;10月4日，疼，稍消肿。&lt;/p&gt;&lt;p&gt;10月5日，疼，稍消肿。&lt;/p&gt;&lt;p&gt;10月6日，稍疼，肿减轻。&lt;/p&gt;&lt;p&gt;10月7日，稍疼，持续昨天症状。&lt;/p&gt;&lt;p&gt;10月8日，仍有些疼，上班，顾不了恁多，活命要紧。&lt;/p&gt;&lt;p&gt;。。。。。。&lt;/p&gt;&lt;p /&gt;</description><category>我的生活</category><pubDate>Mon, 09 Oct 2006 13:22:46 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497975.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497975.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235233/1237942</fs:itemid></item><item><title>一个SVG做的地图网站：ChinaQuest</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235234/1237942/1/item.html</link><description>其实很早以前就去过ChinaQuest了，那时候可能用的还是插件式的，所以一直对他不感兴趣也不看好。今天偶然再去，发现竟然用SVG做了。&lt;br /&gt;安装了Adobe的SVG浏览器，终于可以看了。还不错，想不到用的这么好。&lt;br /&gt;查看了下他们的代码，下了个上海的全图，可惜再进去就没有了。好像是一个全图，然后放大一个范围或者拖动的时候他会生成一个SVG到他服务器的CACHE。&lt;br /&gt;但不解的是SVGZ是SVG的压缩格式，他在服务端直接从XML或者数据库动态生成SVG后压缩成SVGZ？而且SVGZ里竟然可以包含JS代码？&lt;br /&gt;其实我的目的很单纯，只是想看看他们的SVG里的元数据(包括名称和坐标，可惜这些坐标都不是真实坐标)，再了解一下他们对地图的显示方式。&lt;br /&gt;不懂JS也不懂SVG，喜欢的朋友多多研究。&lt;br /&gt;下面贴两个有点用处的连接：&lt;br /&gt;1。使用SVG的一个简单WebGis：&lt;a href=&quot;http://songsgroup.cnblogs.com/archive/2005/09/26/243983.html&quot; target=&quot;_blank&quot;&gt;http://songsgroup.cnblogs.com/archive/2005/09/26/243983.html&lt;/a&gt;。这个大哥竟然开博到现在只发了一篇经典的文章，狂晕中。不过还是觉得很值得研究。&lt;br /&gt;2。MetaMap：&lt;a href=&quot;http://www.mapageweb.umontreal.ca/turner/meta/chinois/metamap_chi.html&quot; target=&quot;_blank&quot;&gt;http://www.mapageweb.umontreal.ca/turner/meta/chinois/metamap_chi.html&lt;/a&gt;，说是用SVG做的地铁示意图以及让大家了解元数据。看了左侧的菜单是用SVG做的，地图也是SVG做的，还有Tip框。&lt;br /&gt;看来这个GIS真是繁荣了那，插件式的，java小程序式的，SVG式的，栅格式的，VML式的。</description><category>GIS技术</category><pubDate>Sun, 08 Oct 2006 13:26:58 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497974.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497974.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235234/1237942</fs:itemid></item><item><title>通过两个点的经纬度计算距离</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235235/1237942/1/item.html</link><description>&lt;div class=&quot;postText&quot;&gt;&lt;p&gt;从google maps的脚本里扒了段代码，没准啥时会用上。大家一块看看是怎么算的。&lt;br /&gt;&lt;br /&gt;private const double EARTH_RADIUS = 6378.137;&lt;br /&gt;private static double rad(double d)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return d * Math.PI / 180.0;&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;public static double GetDistance(double lat1, double lng1, double lat2, double lng2)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;double radLat1 = rad(lat1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;double radLat2 = rad(lat2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;double a = radLat1 - radLat2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;double b = rad(lng1) - rad(lng2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;double s = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a/2),2) + &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Math.Cos(radLat1)*Math.Cos(radLat2)*Math.Pow(Math.Sin(b/2),2)));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;s = s * EARTH_RADIUS;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;s = Math.Round(s * 10000) / 10000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return s;&lt;br /&gt;}&lt;/p&gt;&lt;p /&gt;&lt;p&gt;非常感谢，帮了我大忙了：） &lt;br /&gt;虽然我也没看明白到底原理是什么，但验算了A（60，30），B（60，90）两点之间，此段代码和我用余弦定理算出来的结果很一致。 &lt;br /&gt;余弦定理的步骤是：1、算A、B弦长：地球半径R*cos（经度差60）=R/2； &lt;br /&gt;2、算角AOB,O为地球圆心，利用余弦定理， &lt;br /&gt;cosAOB=(2R*R-(R/2)^2) /2*R*R=7/8; &lt;br /&gt;3、弧AB的长为：R*arc cos(7/8);求毕&amp;nbsp;&lt;/p&gt;&lt;/div&gt;</description><category>GIS技术</category><pubDate>Sun, 08 Oct 2006 13:15:25 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497973.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497973.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235235/1237942</fs:itemid></item><item><title>html上各种距离表示的换算</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235236/1237942/1/item.html</link><description>&lt;ul&gt;&lt;li&gt;&lt;font size=&quot;5&quot;&gt;1pt=1.25px&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size=&quot;5&quot;&gt;1pc=15px&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size=&quot;5&quot;&gt;1mm≈3.543307px&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size=&quot;5&quot;&gt;1cm=35.43307px&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size=&quot;5&quot;&gt;1in=90px&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font size=&quot;5&quot;&gt;1px ≈ 0.2822222mm&lt;/font&gt;&lt;/li&gt;&lt;/ul&gt;</description><category>web开发</category><pubDate>Fri, 29 Sep 2006 15:19:33 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497972.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497972.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235236/1237942</fs:itemid></item><item><title>这才是房价狂涨的惟一原因</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235237/1237942/1/item.html</link><description>为什么房价能够不断攀生？为什么房地产商敢喊出根本没有消费市场的冲天房价？答案非常简单，因为有一个无论房价多高、无论房屋多少，均“照价付款”、“全部笑纳”的天字号“愚蠢购房者”（其实并不蠢）——银行。 &lt;br /&gt;　　 &lt;p&gt;　　按照国家规定，只要购房者首付20%的购房款（现在改为房屋面积超过90平方米者首付30%），银行将支付其余80%的购房款给房地产商。因此，房地产商只须将想要获取的巨额利润与开发成本（包括土地、建安、税费等）相加后除以0.8即可（首付30%的房屋除以0.7或者把由房地产商替购房者支付的10%首付款与利润及开发成本相加后除以0.8，使真正的购房者仍然只须支付20%的首付款）。如： 　　 &lt;/p&gt;&lt;p&gt;　　假定房屋开发成本每平方米2500元（除北京、上海等少数城市的黄金地段外，其余城市的房屋开发成本鲜有超过每平方米2500元），如果房地产商每平方米想要获取的利润是2500元，则：（开发成本2500元/平方米+利润2500元/平方米）/0.8=6250元/平方米，即房价须定为6250元/每平方米； 　　 &lt;/p&gt;&lt;p&gt;　　如果更贪婪的房地产商每平方米想要获取的利润是16700元/平方米，则：（开发成本2500元/平方米+利润16700元/平方米）/0.8=24000元/每平方米，即房价须定为24000元/平方米（如上海“申江名园”，同一地点，房价从每平方米6000元直涨到每平方米24000元）。 　 &lt;/p&gt;&lt;p&gt;　　你可能要问：房地产商将房价定的这么高，谁买呢？ 　　 &lt;/p&gt;&lt;p&gt;　　答案很简单，有一个天字号“愚蠢购房者”（其实并不蠢）——银行。因为银行将按照房地产商自己制定的房价的80%向房地产商支付购房款！ 　 &lt;/p&gt;&lt;p&gt;　　如上例中，一套100平方米房屋的开发成本是25万元，贪婪的房地产商想从此套房屋获取暴利167万元，因此该套房屋的售价应该是192万元，然而，他并没有将该套房屋的售价定为192万元，而是将售价定为240万元（即每平方米24000元）。 　　 &lt;/p&gt;&lt;p&gt;　　他先搞一个“假按揭”：找一个虚假“购房人”，做一个该假“购房人”已付20%首付48万元的假购房合同，然后以该假“购房人”的名义向银行申请房贷，并在只对房地产商落实“提高效率，优质服务”的银行的“大力协助”下，迅速从银行获得80%的房贷192万元（通常仅需一周左右），使一套100平方米房子瞬间获取暴利167万元！ &lt;/p&gt;&lt;p&gt;　　你可能又要问：虚假“购房人”总是要每月向银行还贷的，那如何办？ &lt;/p&gt;&lt;p&gt;　　不用“担心”，房地产商通常会从银行套出的房贷中，拿出一小部分资金，作为每月向银行还贷的“解套期”流动资金（即用所骗贷的银行的钱向银行还贷）。而此时也正是房地产商的“解套期”（所有的“骗购”宣传将达到高潮），因为他须找一个“冤大头”，找一个真正的购房者替他向银行还贷，更重要的是真正的购房者还将向房地产商支付另外的20%的购房款48万元（这是超出房地产商期望的额外暴利）。 &lt;/p&gt;&lt;p&gt;　　你又要问：如果在“解套期”中，由于虚高的房价和购房者的理智，房地产商并没有找到替他“解套”的“冤大头”，那如何办？ 　　 &lt;/p&gt;&lt;p&gt;　　如果房地产商使尽各种花招，始终没人上当而没能“解套”（遗憾地是，总会有人上当，成为“房奴”），而且被拿出来用于向银行还贷的“解套期流动资金”已用尽时，则房地产商就会果断地使出“最后一招”——“断供”（尽管他们银行的朋友一再叮嘱，“不到万不得已，千万别出此招”）！此时，银行将通过法院收回房屋的全部所有权，成为货真价实的“购房人”和“房东”！！ &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 你可能要问：银行收回房屋后如何办？ 　 &lt;/p&gt;&lt;p&gt;　　收回房屋全部所有权后，银行会将房屋作为二手房进行拍卖，一个众所周知的结果是银行通常无法收回所贷出的本金。而对于无法收回的本金（即大众存款），银行创造性的称其为“呆帐”或“不良贷款”。 　　 &lt;/p&gt;&lt;p&gt;　　你又要问：银行如果产生“不良贷款”怎么办？ &lt;/p&gt;&lt;p&gt;　　你如果办一个企业，因决策失误造成亏损，那你只能是继续“掏腰包”投资或“关门倒闭”，但银行不需要对自己造成的损失负责！因为我们国家发明了一种叫做“不良贷款剥离”的“银行解套法”。银行如果产生“不良贷款”，可通过所谓的“剥离”，而直接转移给专门为了“银行解套”而设立的华融、东方、信达、长城等四大资产管理公司（四大资产管理公司无偿接收银行的“不良贷款”，然后廉价抛售或核销），银行既不需要以其利润弥补“不良贷款”造成的储蓄款亏损，更不需要“掏腰包”，以其自有资产弥补“不良贷款”的亏损（注：1999年“剥离”不良贷款1.4万亿元，其后每年又不断对新老不良贷款进行“剥离”，至2005年累计又剥离不良贷款约1万多亿元，目前又有待剥离不良资产约1.2万亿元）。 　　 &lt;/p&gt;&lt;p&gt;　　正因为银行不需要对自己造成的“不良贷款”负责，使银行可以肆无忌惮向房地产商大肆贷款——反正造成“呆帐”时，只需“大笔一挥”，勾销即可！ 　　 &lt;/p&gt;&lt;p&gt;　　上有政策支持“房贷”，下有房贷产生利润，而且靠房贷赚取的利润又不必拿去弥补房贷本金的损失，这样的“无本万利”，100%稳赚不赔的生意，哪个银行不抢着做啊！ 　　 &lt;/p&gt;&lt;p&gt;　　更重要的是，房地产贷款是银行可以按照贷款人自己信口胡扯的抵押物价值（即房地产商虚构的房屋价值）向个人及私营企业大规模发放贷款的唯一通道——即：大众资产可以通过极其荒唐、拙劣的骗贷手法，被合法、迅速地大规模转移至极少数人手中的唯一通道！ &lt;/p&gt;&lt;p&gt;　　（真的无法想象，那些最精明的银行专业人士，居然对如此简单且人尽皆知的骗贷手法视而不见？！也许是这个“金融大挪移”的过程太“引人入胜”了，以至于沉浸在“机不可失，时不再来”的乐趣中？） 　　 &lt;/p&gt;&lt;p&gt;　　请看一下银行发放房贷的速度，想象一下银行“成就”了多少个“亿万房地产开发商”： 　　 &lt;/p&gt;&lt;p&gt;　　1998年房贷总额426亿元； 　　 &lt;/p&gt;&lt;p&gt;　　1999年房贷总额1358亿元； 　　 &lt;/p&gt;&lt;p&gt;　　2000年房贷总额3377亿元； 　　 &lt;/p&gt;&lt;p&gt;　　2001年房贷总额5598亿元； 　 &lt;/p&gt;&lt;p&gt;　　2002年房贷总额8258亿元； 　　 &lt;/p&gt;&lt;p&gt;　　2003年房贷总额11780亿元； 　　 &lt;/p&gt;&lt;p&gt;　　2004年房贷总额16000亿元； 　 &lt;/p&gt;&lt;p&gt;　　2005年房贷总额急升至49100亿元； 　　 &lt;/p&gt;&lt;p&gt;　　2006年仅仅上半年，房贷总额已达34000亿元！ &lt;/p&gt;&lt;p&gt;　　——银行着急的说：“赶快成立房地产公司，你可以不费吹灰之力，在我们的帮助下，合法地抢走我们保管的钱！但记着一定要把房贷利息这个蝇头小利给我们留下，这是我们的利润”； 　　 &lt;/p&gt;&lt;p&gt;　　——银行内的腐败分子（如果有）更着急：“赶快成立房地产公司，在我的帮助下，你能够抢更多的钱！反正我们银行（包括国家）也没有规定一次可以抢多少钱！！” &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp; 虚拟对话： 　　 &lt;/p&gt;&lt;p&gt;　　房地产开发商说：“按照您的旨意和英明策划，我们已经顺利地完成了贷款买地、建房等“空手套白狼”N部曲，在此期间，我们按照现代化的科学管理，将我们所开发的这个10万平方米住宅小区的开发成本成功地控制在了每平方米不到2000元，我准备按每平方米10000元的价格销售，从银行抢出8亿元，扣除2亿元开发成本，我们至少可以赚6亿元！” &lt;/p&gt;&lt;p&gt;　　腐败分子说：你脑子有病啊，我们忙活了这一、二年，动用了我多少关系，多少人等着分赃，只赚6亿元？！你知不知道像这种在银行的帮助下，个人可以大张旗鼓地合法抢劫银行的机会是千载难逢、万年不遇呀，给我至少按每平方米30000元的价格销售，从银行至少抢出24亿元！但是，要注意抢的有技巧，先不要一下子从银行将24亿元全部抢出，要密切注意其它“抢钱同行”的动向，一旦我们推出的30000元的价格被其它“抢钱同行”持续“接力”炒高，我们将按被“抢钱同行”炒高的房价从银行少量套现并继续炒高，只要我们与“抢钱同行”的炒高步伐保持一致，高度团结，心往一处想，劲往一处使，我就不信每平方米11万元的房价只能在它上海出现？！！我相信在各“抢钱同行”心照不宣的共同努力下，我们最终能按照每平方米超过10万元的价格从银行将钱抢出！！！ &lt;/p&gt;&lt;p&gt;　　银行内的腐败分子说：“人有多大胆，地有多高产”！XXXXXX万亿元现金早已装箱完毕，随时恭候诸位来抢！&amp;gt; &lt;/p&gt;&lt;p&gt;　　现在你明白了： 　 &lt;/p&gt;&lt;p&gt;　　1、现在所谓的“房价”，根本是与房屋价值毫不相干、由“抢钱一族”任意捏造出来的数字，是“抢钱一族”为了从银行抢出更多的钱，而玩弄的数字游戏。千万不要为任意抬高的所谓“房价”付首付,使自己沦为为房地产商“解套”的“房奴”。 　　 &lt;/p&gt;&lt;p&gt;　　2、只要国家规定银行贷款不能超过房地产开发成本。如：银行贷款不能超过房地产开发成本的80%，而不是“抢钱一族”随意捏造的“房价”的80%（这样也将大大降低大众储蓄金所面对的风险），则“抢钱一族”就无法通过玩弄“房价数字游戏”而随心所欲的大肆抬高房价，使银行变成“照价付款”的天字号“购房者”。 　　 &lt;/p&gt;&lt;p&gt;　　同时，国家发布房地产开发成本，让大众监督银行（事实上，福州市物价部门已尝试公布了福州市的房价成本清单，浙江、江苏两省也有意跟进，但最终难敌众“抢钱一族”强大的操控力，刚一出世，即被扼杀于襁褓中）。 　　 &lt;/p&gt;&lt;p&gt;　　当然，而为了防止“抢钱一族”虚列房地产开发成本，国家须规定相关建材的最高限价。否则，“抢钱一族”为了继续抢钱，必定与建材供应商相勾结，那时，我们将见识到1万元一吨的水泥、10万元一吨的钢筋！ 　　 &lt;/p&gt;&lt;p&gt;　　另外，值得注意的是，掌控万亿元公积金房贷的同志们也对自己远远落后于银行同行们状态十分不满，个别同志甚至对某些银行同行通过“开门揶盗”而改变了生活质量十分眼红。为了吸引“抢钱一族”的注意，也为了表示自己乐意“被抢”的诚意，掌控公积金房贷的同志们开始“自废武功”，积极地将各种“防抢措施”逐一废除，并将“可被抢总额”不断提高，以期尽快在“被抢游击战”中取得优势（因其规模尚无法与掌控数十万亿元的银行相抗衡）。 &lt;/p&gt;</description><category>收藏</category><pubDate>Thu, 28 Sep 2006 23:07:47 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497971.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497971.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235237/1237942</fs:itemid></item><item><title>Java开发工具配置－UltraEdit</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235238/1237942/1/item.html</link><description>&lt;span class=&quot;tpc_content&quot;&gt;确定你的jdk环境变量配置是正确的。&lt;br /&gt;对于java初学者来说，编译和运行java程序是一件很头疼的东西。&lt;br /&gt;显然，在命令方式下编译和运行java程序用久了，确实是很麻烦，&lt;br /&gt;而我们又不想使用大型的开发工具时，UltraEdit是一个不错的选择，&lt;br /&gt;很多初学者都是用它来编写java源文件的，可以高亮度显示关键字。&lt;br /&gt;1。关键字高亮度显示。&lt;br /&gt;打开UltraEdit－&amp;gt;视图－&amp;gt;高亮显示类型-&amp;gt;java;&lt;br /&gt;此时在UltraEdit输入java程序时，关键字和java包下的类可以高亮度显示，&lt;br /&gt;还有注释也是啊，如果你不喜欢它的默认色彩，可以自己更改。&lt;br /&gt;在顶层的菜单栏中选择 高级-&amp;gt;配置-&amp;gt;语法高亮（对话框的一个选项卡）-&amp;gt;语言-&amp;gt;java&lt;br /&gt;你就可以配子你自己喜欢的色彩了。&lt;br /&gt;2.javac和java集成到UltraEdit工具栏上。&lt;br /&gt;把javac和java集成到UltraEdit上，你不用每次都到dos下去执行你的java程序&lt;br /&gt;，可以像VC那样写完C++程序直接Build和run一下就可以了。我们开始了！&lt;br /&gt;高级－&amp;gt;工具配置 //弹出一个对话框，为 工具配置&lt;br /&gt;在 命令行输入 javac %n%e//%n表示当前路径，%e表示执行的当前文件名。&lt;br /&gt;工作目录下输入 %p&lt;br /&gt;菜单项目名称，自己起一个好听的。&lt;br /&gt;复选框和单选框选三个：保存活动文件，输出到列表方块，捕捉输出&lt;br /&gt;注意：javac %n%e编译那些不是默认包的java程序时是不会生成相应的文件夹的，要这样才可以 javac -d . %n%e&lt;br /&gt;好了，你可以按 “插入”按钮了，这时你已经可以Build你的java程序了，但是还不能Run你的java程序，在配置Run java程序的工具了&lt;br /&gt;命令行：java %n&lt;br /&gt;工作目录：%p&lt;br /&gt;其他的一样了。&lt;br /&gt;现在你可以看看高级菜单的下面多了什么东东没有。&lt;br /&gt;可是现在只有在菜单啊，我要把它放在工具栏怎么办啊&lt;br /&gt;可以的。在工具栏-&amp;gt;鼠标右键-&amp;gt;自定义&lt;br /&gt;&amp;nbsp; 选择 工具栏 新建工具栏（可以不用）&lt;br /&gt;&amp;nbsp; 选择 命令 -&amp;gt;高级 找到你自定义的 用户工具1和用户工具2，把它们拖到你的自定义工具栏上，但是图标不是很好看啊，不要紧啊，将就把，可以自己换图标的。我们来换图标：还记得刚才你的Build和Run是怎么来的吗？&lt;br /&gt;高级－》工具配置&lt;br /&gt;选中java或javac 再点击 高级 看到弹出的对话框，你就知道要干什么得了，给你的工具找一个好看的图标了，不要太大了，如果没有现成的话可以用VC来制作几个啊。&lt;br /&gt;到现在还是有很多java初学者要问，我再VC里面可以按什么F5啊F11啊进行编译和运行，这里可不可以啊，可以的，我们就来配置把：&lt;br /&gt;高级－》配置－》热键映射 找到 高级－用户工具1和用户工具2，自己可以分配自己喜欢的热键了。&lt;br /&gt;3.这个功能对大家来说不是什么陌生的东西了，再delphi，vc，jbuilder等工具里面，你输入一个变量的时候，就会弹出一个框框来然你选择你需要的函数。但本人认为这个很不适合初学者。 还是在热键映射那里，找到 编辑－自动完成就可以分配热键了。分配完成后。重启你的UltraEdit，但你输入Sys的时候，按一些你的热键，看看是什么样子，不过没有vc，delphi那么高级啊。&lt;/span&gt;</description><category>Java</category><pubDate>Mon, 25 Sep 2006 10:05:53 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497970.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497970.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235238/1237942</fs:itemid></item><item><title>使用开源项目打造GIS应用系统</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235239/1237942/1/item.html</link><description>本文讲述如何使用国际开源项目构建一个完整的GIS（地理信息）应用系统。&lt;br /&gt;&lt;br /&gt;通常的GIS应用系统包括：GIS内核、空间数据导入/转换、空间数据引擎、应用服务器、桌面应用程序、Web应用程序、（移动设备应用程序），实际应用中可以根据需要进行取舍。 &lt;br /&gt;1、GIS内核 Geotools Geotools是一套基于Java平台的开源GIS API中间件，实现了完整的GIS底层功能。&lt;br /&gt;2、空间数据导入/转换地理数据的获取 地理数据来自文件、数据库和WMS/WFS服务器。&lt;br /&gt;文件方式：支持读取的地理数据文件：ESRI Shape、Mapinfo Tab/Mif、Geomedia Access等，建议使用Shape文件格式，Oracle和PostgreSQL提供Shape文件导入数据库的程序。&lt;br /&gt;WMS/WFS服务器：Internet上有很多开放的GIS应用服务器，例如NASA、InterGraph、TerraServer等，通过它们获取各种免费地图资源。 &lt;br /&gt;Google Map资源：Google Map没有采用标准的WMS/WFS协议，可以通过调用开放的Google Map API，附加自定义的WMS/WFS图层，实现应用目的。例如：通过Google Map可以免费获取高分辨的Google Map卫星地图。&lt;br /&gt;3、空间数据引擎&lt;br /&gt;开源：PostgreSQL（PostGIS）、MySQL（4.1以上） &lt;br /&gt;商业：Oracle、DB2、ArcSDE &lt;br /&gt;开源商业空间数据库推荐使用PostgreSQL。&lt;br /&gt;使用商业空间数据库引擎，例如Oracle Spatial、ArcSDE，可以非常方便的处理地理数据，更好的处理海量数据，以及与现有商业软件共享数据。 &lt;br /&gt;4、应用服务器 Geoserver Geoserver是一个基于J2EE的开放的GIS应用服务器，实现了OGC(Open Geospatial Consortium)制定的WMS和WFS（WFS-T）规范，Geoserver是整个GIS应用系统的中枢部分，承担大部分业务处理任务。（新版本（1.3.3）增加了对Google Earth KML/KMZ的支持。）&lt;br /&gt;需要注意的是，Geoserver不只是WebGIS服务器，它可以为桌面应用程序（Udig、Mapinfo）或移动设备（支持J2ME的PDA、手机）提供地图支持。&lt;br /&gt;5、桌面应用程序（C/S） Udig、GVSig &lt;br /&gt;Udig是一个使用Eclipse RCP和GeoTools构建的桌面地理信息系统，采用Eclipse SWT图形组件，具有更快的运行速度。Udig可以直接读取Shape文件，访问DB2或Oracle空间数据库，访问OGC WMS/WFS服务器。 Udig提供浏览、查询、编辑、测量等基本的GIS操作功能。 &lt;br /&gt;6、Web应用程序（B/S） Mapbuilder Mapbuilder是一个采用AJAX(Asynchronous JavaScript and XML)技术开发的WebGIS客户端，它的内部结构基于MVC(Model-View-Controller)，具有良好的可读性和可扩展性，兼容Firefox 1.0+, Internet Explorer 6.0+, Mozilla 1.3+, Navigator 6+等浏览器。 &lt;br /&gt;7、移动客户端 Spot Spot是一款基于移动设备的地图和定位软件，地图通过OGC WMS获取，并且提供了蓝牙GPS接口。该软件属于共享软件，使用GPS接口需要付费。</description><category>GIS技术</category><pubDate>Sat, 23 Sep 2006 11:20:12 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497969.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497969.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235239/1237942</fs:itemid></item><item><title>Geoserver的工程部署说明</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235240/1237942/1/item.html</link><description>安装环境：Windows 2003 Server SP1+Sun Java 2 SDK 1_4_2_11+Tomcat 5.0.28&lt;br /&gt;如果你希望试用Geoserver，建议下载Windows Installer文件geoserver-1.3.3.exe，安装程序中包含&lt;br /&gt;Jetty应用服务器，将为你自动创建测试环境。&lt;br /&gt;&lt;br /&gt;部署一个Geoserver项目（WAR文件包），大致需要以下六个步骤：&lt;br /&gt;1、安装Sun Java 2 SDK，到sun网站下载j2sdk-1_4_2_11-windows-i586-p.exe(版本可能有变化)。&lt;br /&gt;注意：必须下载JDK，而不是JRE。你也可以使用IBM或BEA公司的JDK，经过测试表明BEA的&lt;font size=&quot;3&quot;&gt;Jrocket在Windows x86平台上&lt;/font&gt;比Sun的JVM有更快的速度。 &lt;br /&gt;（安装JDK 5.0可能遇到问题，请参考Geoserver帮助文档。）&lt;br /&gt;2、安装Sun Java Advance Image SDK，到sun网站下载jai-1_1_2_01-lib-windows-i586-jdk.exe(版本可能有变化)，安装程序自动将Java Advance Image安装到Sun Java 2 SDK所在目录。&lt;br /&gt;注意：必须安装JDK版本。&lt;br /&gt;3、安装Sun Java Advance ImageIO SDK，到sun网站下载jai_imageio-1_0_01-lib-windows-i586-jdk.exe(版本可能有变化)，安装程序自动将Java Advance ImageIO安装到Sun Java 2 SDK所在目录。&lt;br /&gt;注意：必须安装JDK版本。&lt;br /&gt;4、安装Tomcat应用服务器，到Apache网站下载jakarta-tomcat-5.0.28.exe，安装到指定目录，默认使用8080端口。你也可以安装其他J2EE应用服务器，经过Geoserver项目组测试的应用服务器包括：JBoss、Jetty、Tomcat、Resin。&lt;br /&gt;注意：Tomcat 5.5需要JDK 5.0支持。&lt;br /&gt;5、安装Apache服务器，到Apache网站下载apache_2.2.3-win32-x86-no_ssl.msi，安装到指定目录，服务器名为本机IP地址，默认使用80端口。如果Apache Server无法正常启动，检查你的系统上是否正在运行IIS服务器。&lt;br /&gt;（该步骤可选，我们使用Apache处理普通http请求，Tomcat处理OGC WMS，WFS-T地图服务请求，这样做的目的是分担Tomcat的工作压力，提高Geoserver的地图处理速度。）&lt;br /&gt;6、关闭Tomcat，复制geoserver.war包到Tomcat的webapp目录，启动Tomcat。Tomcat将自动部署geoserver。启动完毕，使用http://ip:8080/geoserver进入geoserver图形配置页面。第一次进入geoserver，应用服务器需要编译jsp，请耐心等待。&lt;br /&gt;提示：geoserver需要高速CPU和大量内存才能流畅运行，建议配置至少为P4 1.6A 512M内存。在低配置的机器上运行速度将非常缓慢，参见以下的测试报告。&lt;br /&gt;&lt;br /&gt;测试中我们同时渲染了15个地图图层，数据全部取自Oracle数据库，记录每次地图刷新所需时间。&lt;br /&gt;服务器A P4 1.7(2级Cache 256K) 内存 512M(DDR266) 耗时6-8秒&lt;br /&gt;服务器B P4 1.6A(2级Cache 512K) 内存 1G(DDR400) 耗时3-5秒&lt;br /&gt;服务器C P4 2.8E(2级Cache 1M) 内存 512M(DDR400) 耗时1-2秒&lt;br /&gt;</description><category>GIS技术</category><pubDate>Sat, 23 Sep 2006 11:10:12 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497968.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497968.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235240/1237942</fs:itemid></item><item><title>GIS资源汇集(陆续更新中.....)</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235241/1237942/1/item.html</link><description>&lt;div class=&quot;postbody&quot;&gt;&lt;h2&gt;在线GIS资料阅读&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;h2&gt;&lt;a class=&quot;cateNavLink&quot; href=&quot;http://wangjifeng.cnblogs.com/Special/Subject/GZDL/DLBL/XXXTDL2/&quot;&gt;地理信息系统导论&lt;/a&gt;&lt;/h2&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;br /&gt;GIS网络资源&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://sms.webmap.cn/default.asp&quot;&gt;测绘科学数据共享服务网&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;blockquote dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;p&gt;目前共发布95个数据集的信息，涉及的总数据量超过25GB (不包括遥感影像数据集)。大部分数据为带密级的数据，不能通过网络直接获取。其中共有49个数据集的数据和24个样例数据可以直接免费下载，数据量达210MB。对于其中带密级的数据，分别给出了数据获取途径、程序以及需要遵照的法规。&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;地理信息系统论坛 &lt;a href=&quot;http://www.gisforum.net/&quot;&gt;http://www.gisforum.net/&lt;/a&gt; &lt;/li&gt;&lt;li&gt;中国GIS咨询网 &lt;a href=&quot;http://www.gissky.com/index.asp&quot;&gt;http://www.gissky.com/index.asp&lt;/a&gt; &lt;/li&gt;&lt;li&gt;资源大联盟 &lt;a href=&quot;http://zydlm.wxhc.com.cn/main.asp&quot;&gt;http://zydlm.wxhc.com.cn/main.asp&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#ef3333&quot;&gt;FreeGIS组织 &lt;/font&gt;&lt;a href=&quot;http://www.freegis.org/&quot;&gt;http://www.freegis.org&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;blockquote dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;p&gt;该网站提供FreeGIS平台索引，国际上主要的FreeGIS平台都可以在这里找到&lt;/p&gt;&lt;/blockquote&gt;&lt;ul dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;li&gt;&lt;font color=&quot;#ef3333&quot;&gt;MapTools组织 &lt;/font&gt;&lt;a href=&quot;http://www.maptools.org/&quot;&gt;http://www.maptools.org&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;blockquote dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;p&gt;该网站提供开放源代码的GIS资源&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;font color=&quot;#ef3333&quot;&gt;OGC组织 &lt;/font&gt;&lt;a href=&quot;http://www.opengeospatial.org/&quot;&gt;http://www.opengeospatial.org&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;blockquote dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;p&gt;国际开放GIS标准的制订者，ESRI,Intergraph,Mapinfo,Oracle,Sun,BEA等都是OGC成员&lt;/p&gt;&lt;/blockquote&gt;&lt;ul dir=&quot;ltr&quot;&gt;&lt;li&gt;&lt;font color=&quot;#ef3333&quot;&gt;MySQL数据库 &lt;/font&gt;&lt;a href=&quot;http://www.mysql.com/&quot;&gt;http://www.mysql.com&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;blockquote dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;p&gt;MySQL从4.1开始支持空间数据库，遵循OGC规范，目前正式版本是5.0&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;&lt;font color=&quot;#ef3333&quot;&gt;PostgreSQL &lt;/font&gt;&lt;a href=&quot;http://www.postgresql.org/&quot;&gt;http://www.postgresql.org&lt;/a&gt; 中文&lt;a href=&quot;http://www.pgsqldb.org/&quot;&gt;http://www.pgsqldb.org&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;blockquote dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;p&gt;PostgreSQL是和MySQL齐名的开放源码数据库，最新版本8.0，通过PostGIS中间件可以让PostgreSQL(7.4及以下版本)支持空间数据库&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;PostGIS也是一个开放源码项目 &lt;a href=&quot;http://postgis.refractions.net/&quot;&gt;http://postgis.refractions.net&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#ef3333&quot;&gt;Oracle数据库和应用软件 &lt;/font&gt;&lt;a href=&quot;http://www.oracle.com/&quot;&gt;http://www.oracle.com&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;blockquote dir=&quot;ltr&quot; style=&quot;MARGIN-RIGHT: 0px&quot;&gt;&lt;p&gt;Oracle从8i开始支持空间数据库，目前在商业空间数据库领域占有绝对优势。&lt;br /&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;&amp;nbsp; &lt;/h2&gt;&lt;h2&gt;几种流行WebGIS软件的比较&lt;/h2&gt;&lt;h2&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width=&quot;10%&quot;&gt;&lt;p align=&quot;center&quot;&gt;&lt;b&gt;&lt;span&gt;产品名称&lt;/span&gt;&lt;/b&gt;&lt;b /&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;15%&quot;&gt;&lt;p align=&quot;center&quot;&gt;&lt;b&gt;&lt;span&gt;Mapxtrem&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;17%&quot;&gt;&lt;p align=&quot;center&quot;&gt;&lt;b&gt;&lt;span&gt;GeoMedia Web Map, GeoMedia Web Enterprese&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;18%&quot;&gt;&lt;p align=&quot;center&quot;&gt;&lt;b&gt;&lt;span&gt;Arc IMS, MapObjects IMS&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;18%&quot;&gt;&lt;p align=&quot;center&quot;&gt;&lt;b&gt;&lt;span&gt;MapGuide&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width=&quot;18%&quot;&gt;&lt;p align=&quot;center&quot;&gt;&lt;b&gt;&lt;span&gt;GeoSurf&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;span&gt;客户端是否需要插件或控键&lt;/span&gt;&lt;/b&gt;&lt;b /&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;15%&quot;&gt;&lt;p&gt;&lt;span&gt;不需要&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;17%&quot;&gt;&lt;p&gt;&lt;span&gt;需要&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;不需要&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;需要&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;不需要&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;span&gt;网络传递的图像格式&lt;/span&gt;&lt;/b&gt;&lt;b /&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;15%&quot;&gt;&lt;p&gt;&lt;span&gt;JPEG(&lt;/span&gt;&lt;span&gt;栅格图&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;17%&quot;&gt;&lt;p&gt;&lt;span&gt;ActiveCGM(&lt;/span&gt;&lt;span&gt;栅格图或矢量图&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;ActiveCGM(&lt;/span&gt;&lt;span&gt;栅格图或矢量图&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;MpaGuide SDF&lt;/span&gt;&lt;span&gt;矢量数据或&lt;/span&gt;&lt;span&gt;JPEG&lt;/span&gt;&lt;span&gt;栅格图&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;GeoSurf DH M&lt;/span&gt;&lt;span&gt;矢量数据&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;span&gt;与数据库连接方式&lt;/span&gt;&lt;/b&gt;&lt;b /&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;15%&quot;&gt;&lt;p&gt;&lt;span&gt;ODBC&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;17%&quot;&gt;&lt;p&gt;&lt;span&gt;ODBC&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;ODBC&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;ODBC&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;JDBC&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;span&gt;地图预出版处理&lt;/span&gt;&lt;/b&gt;&lt;b /&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;15%&quot;&gt;&lt;p&gt;&lt;span&gt;动态生成地图&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;17%&quot;&gt;&lt;p&gt;&lt;span&gt;动态生成地图&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;动态生成地图&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;需要进行数据格式转换处理&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;需要进行数据格式转换处理&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;10%&quot;&gt;&lt;p&gt;&lt;b&gt;&lt;span&gt;可发布的数据格式&lt;/span&gt;&lt;/b&gt;&lt;b /&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;15%&quot;&gt;&lt;p&gt;&lt;span&gt;MapInfo&lt;/span&gt;&lt;span&gt;地图文件&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;17%&quot;&gt;&lt;p&gt;&lt;span&gt;MGE&lt;/span&gt;&lt;span&gt;工程&lt;/span&gt;&lt;span&gt;,MicroStation DGN&lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;span&gt;, Frame&lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;span&gt;,MGEDM&lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;span&gt;,ArcView Shape&lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;span&gt;,ArcInfo Coverage,Autodesk DWG&lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;span&gt;,Mapinfo TAB&lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;ArcView Shape &lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;span&gt;,AecInfo Coverage,SDE&lt;/span&gt;&lt;span&gt;地图&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;ArcView Shape &lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;span&gt;,AecInfo Coverage,SDE&lt;/span&gt;&lt;span&gt;地图&lt;/span&gt;&lt;span&gt;, ,Autodesk DWG&lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;span&gt;, MicroStation DGN&lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;span&gt;, Mapinfo TAB&lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;18%&quot;&gt;&lt;p&gt;&lt;span&gt;ArcView Shape &lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;span&gt;,AecInfo Coverage,SDE&lt;/span&gt;&lt;span&gt;地图&lt;/span&gt;&lt;span&gt;, ,Autodesk DWG&lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;span&gt;, MicroStation DGN&lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;span&gt;, Mapinfo TAB&lt;/span&gt;&lt;span&gt;文件&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/h2&gt;&lt;h2 align=&quot;center&quot;&gt;&amp;nbsp;&lt;/h2&gt;&lt;h2&gt;地图服务观摩&amp;nbsp;&lt;/h2&gt;&lt;p&gt;&lt;table style=&quot;WIDTH: 724px; BORDER-COLLAPSE: collapse; HEIGHT: 520px&quot; cellspacing=&quot;0&quot; cellpadding=&quot;3&quot; border=&quot;1&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;FONT-SIZE: 10pt; WIDTH: 113px; HEIGHT: 42px&quot;&gt;&lt;strong&gt;名称&lt;/strong&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;strong&gt;数据格式&lt;/strong&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;strong&gt;客户端&lt;/strong&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;strong&gt;网址&lt;/strong&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;strong&gt;备注&lt;/strong&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;strong&gt;公司&lt;/strong&gt; &lt;/td&gt;&lt;/tr&gt;&lt;tr bgcolor=&quot;#ccffff&quot;&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot; colspan=&quot;6&quot;&gt;国外&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Google Earth&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;卫星影像&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;p align=&quot;center&quot;&gt;胖&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;a href=&quot;http://earth.google.com/&quot;&gt;http://earth.google.com/&lt;/a&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;估计是java技术&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Google&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Microsoft Live Local&lt;/td&gt;&lt;td&gt;卫星影像、栅格&lt;/td&gt;&lt;td&gt;胖&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://preview.local.live.com/&quot;&gt;http://preview.local.live.com/&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Microsoft&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;WorldWind&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;卫星影像&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;p align=&quot;center&quot;&gt;胖&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;a href=&quot;http://worldwind.arc.nasa.gov/&quot;&gt;http://worldwind.arc.nasa.gov/&lt;/a&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;智能客户端技术&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;NASA&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Google Map&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;栅格地图&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;p align=&quot;center&quot;&gt;瘦&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;a href=&quot;http://maps.google.com/&quot;&gt;http://maps.google.com&lt;/a&gt; &lt;br /&gt;&lt;a href=&quot;http://www.google.com/apis/maps/&quot;&gt;http://www.google.com/apis/maps/&lt;/a&gt;&lt;a href=&quot;http://www.google.com/apis/maps/&quot;&gt;&lt;/a&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;可叠加卫星影像,提供API&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Google&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Yahoo&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;栅格地图&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;p align=&quot;center&quot;&gt;瘦&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;a href=&quot;http://developer.yahoo.net/maps/&quot;&gt;http://developer.yahoo.net/maps/&lt;/a&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;提供API&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Yahoo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;MSN Virtual Earth&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;未知&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;p align=&quot;center&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;a href=&quot;http://www.virtualearth.com/&quot;&gt;http://www.virtualearth.com/&lt;/a&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Microsoft&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;feedmap&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;栅格地图&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;p align=&quot;center&quot;&gt;瘦&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;a href=&quot;http://www.feedmap.net/BlogMap/&quot;&gt;http://www.feedmap.net/BlogMap/&lt;/a&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr bgcolor=&quot;#ccffff&quot;&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot; colspan=&quot;6&quot;&gt;国内&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Go2Map&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;栅格地图&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;p align=&quot;center&quot;&gt;瘦&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;a href=&quot;http://www.go2map.com/down/freemap/&quot;&gt;http://www.go2map.com/down/freemap/&lt;/a&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;提供城市地图服务和API&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Sohu&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;新浪爱问&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;栅格地图&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;p align=&quot;center&quot;&gt;瘦&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;a href=&quot;http://local.sina.com.cn/&quot;&gt;http://local.sina.com.cn/&lt;/a&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;地图搜索服务&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Sina&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Mapabc&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;栅格地图&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;p align=&quot;center&quot;&gt;胖&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;a href=&quot;http://www.mapabc.com/&quot;&gt;http://www.mapabc.com&lt;/a&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;地图搜索服务，提供地图名片&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Mapbar&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;栅格地图&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;p align=&quot;center&quot;&gt;瘦&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;a href=&quot;http://www.mapbar.com/&quot;&gt;http://www.mapbar.com&lt;/a&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;地图搜索服务，提供博客地图&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;我要地图&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;栅格地图&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;p align=&quot;center&quot;&gt;瘦&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;font face=&quot;Times New Roman&quot; color=&quot;#000000&quot; size=&quot;3&quot;&gt;&lt;a href=&quot;http://www.51ditu.com/&quot;&gt;http://www.51ditu.com&lt;/a&gt;&lt;/font&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;地图搜索服务&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;搜狗地图&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;栅格地图&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;p align=&quot;center&quot;&gt;瘦&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;a href=&quot;http://map.sogou.com/&quot;&gt;http://map.sogou.com/&lt;/a&gt; &lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Sohu收购Go2Map后推出的地图搜索服务&lt;/td&gt;&lt;td style=&quot;FONT-SIZE: 10pt&quot;&gt;Sohu&amp;nbsp;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;baidu&lt;/td&gt;&lt;td&gt;栅格地图&lt;/td&gt;&lt;td&gt;&lt;p align=&quot;center&quot;&gt;瘦&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://map.baidu.com/&quot;&gt;http://map.baidu.com&lt;/a&gt;&lt;/td&gt;&lt;td&gt;MapBar为baidu提供地图服务&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;!--startfragment --&gt;&lt;/p&gt;&lt;h2&gt;开源WebGIS平台&lt;/h2&gt;&lt;p&gt;向您介绍国际开源WebGIS项目，它们具有共同特点：免费使用，开放源代码（具体使用规则请参看各个平台的 Lisense文件），希望借此带您进入广阔的开源GIS世界。&lt;/p&gt;&lt;p&gt;采用Java开发的几个主要开源WEBGIS项目列表（由于时间有限，只选取部分）&lt;br /&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;100%&quot; border=&quot;1&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;center&quot; rowspan=&quot;2&quot;&gt;平台&lt;/td&gt;&lt;td align=&quot;center&quot; rowspan=&quot;2&quot;&gt;当前版本&lt;/td&gt;&lt;td align=&quot;center&quot; rowspan=&quot;2&quot;&gt;生成日期&lt;/td&gt;&lt;td align=&quot;center&quot; rowspan=&quot;2&quot;&gt;项目地址&lt;/td&gt;&lt;td align=&quot;center&quot; rowspan=&quot;2&quot;&gt;授权协议&lt;/td&gt;&lt;td align=&quot;center&quot; colspan=&quot;10&quot;&gt;支持格式和接口&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ESRI Shape&lt;/td&gt;&lt;td&gt;Mapinfo MID/MIF&lt;/td&gt;&lt;td&gt;Oracle&lt;/td&gt;&lt;td&gt;MySQL&lt;/td&gt;&lt;td&gt;PostGIS&lt;/td&gt;&lt;td&gt;其他格式*2&lt;/td&gt;&lt;td&gt;OGC*8 WMS*9 Server&lt;/td&gt;&lt;td&gt;OGC WFS*10 Server&lt;/td&gt;&lt;td&gt;OGC WCS*11 Server&lt;/td&gt;&lt;td&gt;MS .Net&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Deegree&lt;/td&gt;&lt;td&gt;2.0&lt;/td&gt;&lt;td&gt;2005-2-3&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://deegree.sourceforge.net/&quot;&gt;http://deegree.sourceforge.net&lt;/a&gt;&lt;/td&gt;&lt;td&gt;LGPL&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;GML2.1.1&lt;/td&gt;&lt;td&gt;√*4&lt;/td&gt;&lt;td&gt;√*5&lt;/td&gt;&lt;td&gt;√*6&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenMap&lt;/td&gt;&lt;td&gt;4.6.3&lt;/td&gt;&lt;td&gt;2006-2-1&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://openmap.bbn.com/&quot;&gt;http://openmap.bbn.com&lt;/a&gt;&lt;/td&gt;&lt;td&gt;OpenMap License&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√*1&lt;/td&gt;&lt;td&gt;√*3&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;VPF RPF DTED&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;√*7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GeoServer*14&lt;/td&gt;&lt;td&gt;1.3&lt;/td&gt;&lt;td&gt;2006-2-16&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://docs.codehaus.org/display/GEOS/Home&quot;&gt;http://docs.codehaus.org/display/GEOS/Home&lt;/a&gt;&lt;/td&gt;&lt;td&gt;GPL 2.0&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;GML2.1.1 ArcSDE DB2 VPF&lt;/td&gt;&lt;td&gt;√*9&lt;/td&gt;&lt;td&gt;√*10&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GeoTools&lt;/td&gt;&lt;td&gt;2.1.1&lt;/td&gt;&lt;td&gt;2006-1-26&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://www.geotools.org/&quot;&gt;http://www.geotools.org&lt;/a&gt;&lt;/td&gt;&lt;td&gt;LGPL&lt;/td&gt;&lt;td&gt;√ &lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;GML2.1.1 ArcSDE&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;uDig*12&lt;/td&gt;&lt;td&gt;1.0.6&lt;/td&gt;&lt;td&gt;2005&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://udig.refractions.net/confluence/display/UDIG/Home&quot;&gt;http://udig.refractions.net/confluence/display/UDIG/Home&lt;/a&gt;&lt;/td&gt;&lt;td&gt;LGPL&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;GML2.1.1 ArcSDE DB2&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;mapbuilder-lib*13&lt;/td&gt;&lt;td&gt;1.0rc1&lt;/td&gt;&lt;td&gt;2005-12&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://mapbuilder.sourceforge.net/&quot;&gt;http://mapbuilder.sourceforge.net/&lt;/a&gt;&lt;/td&gt;&lt;td&gt;LGPL&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;td&gt;GML&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;√&lt;/td&gt;&lt;td&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;*1 仅支持点实体&lt;br /&gt;*2 光栅格式JPEG, GIF, PNG, (Geo)TIFF, PNM , BMP没有列出&lt;br /&gt;*3 需要单独的支持类&lt;br /&gt;*4 兼容OGC WMS 1.1.1&lt;br /&gt;*5 兼容OGC WFS 1.0.0&lt;br /&gt;*6 兼容OGC WCS 1.0.0&lt;br /&gt;*7 有限支持&lt;br /&gt;*8 Open Geospatial Consortium（OGC）&lt;br /&gt;*9 Web Map Service (WMS) 基于Web的光栅和矢量图形服务&lt;br /&gt;*10 Web Feature Service (WFS) 基于Web采用GML格式传输的矢量图形数据服务&lt;br /&gt;*11 Web Coverage Service (WCS) 基于Web采用光栅格式传输的光栅图形数据服务&lt;br /&gt;*12 采用Eclipse框架开发的桌面GIS软件&lt;br /&gt;*13 基于AJAX模型的WEBGIS客户端软件，支持GeoServer, MapServer, quickWMS服务器&lt;br /&gt;*14 基于J2EE架构的WEBGIS服务器，已测试JBoss, Jetty, Tomcat, Resin&lt;br /&gt;&lt;br /&gt;Deegree示例（读取、显示、格式转换 支持SHP、GML、数据库、WMS、WFS C/S）下载 &lt;a href=&quot;http://chungking.glwb.info/viewer.jar&quot;&gt;程序包(V0.91)&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;http://chungking.glwb.info/cn.rar&quot;&gt;GML测试文件&lt;/a&gt;&lt;br /&gt;OpenMap示例（中国铁路 B/S）&lt;a href=&quot;http://chungking.glwb.info/map.htm&quot;&gt;网页浏览(非宽带用户请勿访问)&lt;/a&gt;&lt;br /&gt;&lt;font color=&quot;#ff0000&quot;&gt;注: 以上示例需要安装Sun J2SE 1.4以上版本才能正常运行&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;采用C/C++开发的开放源代码的GIS平台列表（由于时间有限，只选取部分平台）&lt;br /&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; width=&quot;99%&quot; border=&quot;1&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;平台&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;当前版本&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;生成日期&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;项目地址&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;授权协议&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;支持格式和接口&lt;/td&gt;&lt;td align=&quot;center&quot;&gt;开发语言&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GRASS&lt;/td&gt;&lt;td&gt;6.0.2&lt;/td&gt;&lt;td&gt;2006-2-22&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://grass.itc.it/&quot;&gt;http://grass.itc.it&lt;/a&gt;&lt;/td&gt;&lt;td&gt;GPL&lt;/td&gt;&lt;td&gt;ESRI E00, Shape, DXF, GPS-ASCII, USGS-DEM,IDRISI, OSS, MapInfo MIF,TIGER, RML Raster ARC/GRID, E00, GIF,TIF, PNG, ERDAS LAN&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MapServer&lt;/td&gt;&lt;td&gt;4.6&lt;/td&gt;&lt;td&gt;2005-6-14&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;http://mapserver.gis.umn.edu/index.html&quot;&gt;http://mapserver.gis.umn.edu/index.html&lt;/a&gt;&lt;/td&gt;&lt;td&gt;MapServer License&lt;/td&gt;&lt;td&gt;ESRI Shape, Mapinfo, PostGIS, ArcSDE (通过OGR*1支持) TIFF/GeoTIFF, EPPL7（通过GDAL*2支持）WMS (client/server), WFS (client/server)&lt;/td&gt;&lt;td&gt;C&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;*1 OGR &lt;a href=&quot;http://gdal.velocet.ca/projects/opengis/&quot;&gt;http://gdal.velocet.ca/projects/opengis&lt;/a&gt; 提供读取ESRI Shape, Mapinfo mid/mif and TAB的C++库，属于GDAL项目的子集&lt;br /&gt;*2 GDAL &lt;a href=&quot;http://www.gdal.org/index.html&quot;&gt;http://www.gdal.org/index.html&lt;/a&gt; C/C++编写的光栅地理数据格式转换库 &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;</description><category>GIS技术</category><pubDate>Sat, 23 Sep 2006 10:57:14 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497967.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497967.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235241/1237942</fs:itemid></item><item><title>backbase for java edition crack</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235242/1237942/1/item.html</link><description>&lt;p&gt;&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;3&quot; width=&quot;100%&quot; border=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width=&quot;1%&quot;&gt;&lt;a href=&quot;http://bbs.chinajavaworld.com/servlet/CjwServlet/download/73-723284-727632-383/backbase-jse-1.1.3-crack.zip&quot;&gt;&lt;img alt=&quot;附件&quot; src=&quot;http://bbs.chinajavaworld.com/servlet/CjwServlet?attachImage=true&amp;contentType=application%2Foctet-stream&amp;attachment=383&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;jive-description&quot; width=&quot;98%&quot;&gt;&lt;a href=&quot;http://bbs.chinajavaworld.com/servlet/CjwServlet/download/73-723284-727632-383/backbase-jse-1.1.3-crack.zip&quot;&gt;backbase-jse-1.1.3-crack.zip&lt;/a&gt; (385.2 K) &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width=&quot;1%&quot;&gt;&lt;a href=&quot;http://bbs.chinajavaworld.com/servlet/CjwServlet/download/73-723284-727632-719/backbase-jse-1.2-crack.jar&quot;&gt;&lt;img alt=&quot;附件&quot; src=&quot;http://bbs.chinajavaworld.com/servlet/CjwServlet?attachImage=true&amp;contentType=application%2Foctet-stream&amp;attachment=719&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;jive-description&quot; width=&quot;98%&quot;&gt;&lt;a href=&quot;http://bbs.chinajavaworld.com/servlet/CjwServlet/download/73-723284-727632-719/backbase-jse-1.2-crack.jar&quot;&gt;backbase-jse-1.2-crack.jar&lt;/a&gt; (6.8 K) &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;第一次patch JAVA商业程序，有问题请多多指教！ &lt;br /&gt;&lt;br /&gt;这个东东号称要$5000 per CPU(Basic License) or $7000 per CPU(base license+2 yearupgrades)让他见鬼去吧。 &lt;br /&gt;&lt;br /&gt;本来只关心了1.1，后来有一些朋友发email问我要1.2的，昨天又收了两个外国朋友的信，只好用家里的宽带拖下来重新又处理了一遍。 &lt;br /&gt;&lt;br /&gt;由于它是用xml验证，我可没有他的私钥，故不能生成完善的lic文件，不过没关系，现在patch了后已经不妨碍使用了。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;bjs-1.1.3 方法 &lt;br /&gt;&lt;br /&gt;解压到lib目录替换原来的文件即可！ &lt;br /&gt;启动的时候提示License file not found. Please upload a valid license，不管他启动完后就可以正常使用了。 &lt;br /&gt;BY lightwiter 2006-07-04 &lt;br /&gt;jhwxjx@yahoo.com.cn &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;bjs-1.2 使用方法 &lt;br /&gt;将jar放入WEB-INF/lib下面 &lt;br /&gt;然后运行 &lt;br /&gt;java -jar backbase-jse-1.2-crack.jar &lt;br /&gt;这次是比较完善的处理。启动和使用时不会有其它的提示了。 &lt;br /&gt;&lt;br /&gt;BY lightwiter 2006-09-11 &lt;br /&gt;jhwxjx@yahoo.com.cn &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果谁要用Optimizeit Enterprise 2006而又找不到方法的话，也可以发email与我联系。 &lt;br /&gt;&lt;/p&gt;</description><category>web开发</category><pubDate>Wed, 20 Sep 2006 13:29:02 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497966.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497966.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235242/1237942</fs:itemid></item><item><title>老外写的javascript tooltip</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235243/1237942/1/item.html</link><description>&lt;a href=&quot;http://www.walterzorn.com/tooltip/tooltip_e.htm&quot;&gt;http://www.walterzorn.com/tooltip/tooltip_e.htm&lt;/a&gt;</description><category>web开发</category><pubDate>Wed, 20 Sep 2006 09:56:01 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497965.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497965.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235243/1237942</fs:itemid></item><item><title>用javascript开发字典探测用户名或密码工具</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235244/1237942/1/item.html</link><description>&lt;strong&gt;文章作者：&lt;/strong&gt;翟振凯 (小琦)&lt;br /&gt;&lt;b&gt;作者网站：&lt;/b&gt;http://www.xiaoqi.net &lt;br /&gt;&lt;b&gt;作者论坛：&lt;/b&gt;http://www.tdqy.com&lt;br /&gt;&lt;b&gt;QQ：&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/b&gt;22336848 53353866&lt;br /&gt;&lt;b&gt;演示地址：&lt;/b&gt;&lt;a href=&quot;http://www.xiaoqi.net/zuopin/js_user_swf.htm&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#800080&quot;&gt;http://www.xiaoqi.net/zuopin/js_user_swf.htm&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;打包下载：&lt;/b&gt;&lt;a href=&quot;http://www.xiaoqi.net/zuopin/js_user.rar&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#0000ff&quot;&gt;http://www.xiaoqi.net/zuopin/js_user.rar&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;　&lt;br /&gt;授人予鱼，不如授人予渔。本文注重讲述作者的开发思路与程序的实现方法，目地是让大家了解一个程序的开发过程和这个程序功能的实现原理，而不仅仅是给大家提供一个这样的工具。希望看过本文后的朋友会有所收获，能和我共同分享用java script编写程序的乐趣。&lt;br /&gt;为了便于大家的理解，本程序在实现过程中，简洁的使用了多种java script技术，并且在每一步，都有详细的注解，就算您是个WEB程序开发新手，也能比较容易理解本文，并相信本文会对您将来的WEB程序开发生涯有所帮助。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;核心技术：&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;xmlhttp获取数据 java script对文本数据处理 &lt;/li&gt;&lt;li&gt;java script对数组循环读取(两种方法) &lt;/li&gt;&lt;li&gt;xmlhttp取中文值乱码转换&lt;/li&gt;&lt;/ul&gt;&lt;ol /&gt;　&lt;br /&gt;&lt;b&gt;主要功能：&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;网站可用用户名探测 &lt;li&gt;使用用户名字典批量探测户名字 &lt;/li&gt;&lt;li&gt;用户名密码暴力破解&lt;br /&gt;&lt;br /&gt;　&lt;/li&gt;&lt;/ul&gt;&lt;ol /&gt;&lt;b&gt;特色：&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;采用AJAX技术，无刷新操作、呈现结果 可以载入本地字典文件或网络字典文件 脱离后台动态语言依赖，B/S模式C/S界面，纯java script编写功能代码，完美运行于所有IE内核浏览器 实时显示探测结果，探测进度，成功结果与失败结果分开显示 支持暂停探测和继续探测 &lt;/li&gt;&lt;li&gt;代码简洁仅1K &lt;/li&gt;&lt;li&gt;支持多线程探测，可设定缓冲时间&lt;br /&gt;　&lt;/li&gt;&lt;/ul&gt;&lt;ol /&gt;　&lt;br /&gt;&lt;b&gt;开发思路及原理：&lt;br /&gt;　&lt;/b&gt;&lt;br /&gt;&lt;b&gt;一、基本探测&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;用xmlhttp向被探测页面地址发送要探测数据 &lt;/li&gt;&lt;li&gt;对xmlhttp返回值进行判断 &lt;/li&gt;&lt;li&gt;将判断结果以追加的方式呈现在页面上&lt;br /&gt;　&lt;/li&gt;&lt;/ul&gt;&lt;ol /&gt;&lt;b&gt;二、批量探测&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;用xmlhttp载入字典文件 &lt;/li&gt;&lt;li&gt;用java script将字典文件以换行符(\r\n)为分隔，转化为数组 &lt;/li&gt;&lt;li&gt;按照字典数组顺序循环向探测地址发送数据并且对返回数据进行判断处理&lt;br /&gt;　&lt;/li&gt;&lt;/ul&gt;&lt;ol /&gt;&lt;b&gt;三、功能强化&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;取得字典数组大小(即：要探测的次数)，返回给用户 将探测次数依次累加，呈现给用户当前探测进度 设定探测进程，即：每探测多少个数据，才向用户返回一次结果 &lt;/li&gt;&lt;li&gt;设定缓冲时间，即：设定探测时间间隔，防止浏览器在大数据量探测时停止响应 &lt;/li&gt;&lt;li&gt;探测暂停或继续探测&lt;/li&gt;&lt;/ul&gt;&lt;ol /&gt;　&lt;br /&gt;　&lt;br /&gt;&lt;b&gt;四、开发背景：&lt;/b&gt;&lt;br /&gt;前些天，想在百度空间上注册一个简短而又有意义的用户名，发现自己喜欢的很多用户名都被占用了，而进行一个个的手工用户名探测又太麻烦了。&lt;br /&gt;因为我是一个喜欢运用自己掌握的技术来解决问题(或困难)的人，于是就写了这个程序。&lt;br /&gt;为了使它给使用起来比较方便，也为了让它更加实用，我又在它的通用性上做了些加强。&lt;br /&gt;比如：&lt;br /&gt;可以探测大部分不需要验证码检测用户名是否被占用的网站。&lt;br /&gt;可以探测一些网站用户的密码。&lt;br /&gt;可以探测一些网站用户的密码取回问题。&lt;br /&gt;可以向WEB服务器批量提交指定数据&lt;br /&gt;　&lt;br /&gt;起初我是用ASP脚本来实现的，但ASP程序只能运行于支持ASP的WEB服务器上，无法直接在浏览器上执行，使用起来没有那么方便，于是就写了这个java script的版本的程序。&lt;br /&gt;　&lt;br /&gt;&lt;b&gt;五、实现过程：&lt;br /&gt;　&lt;/b&gt;&lt;br /&gt;1、使用try-catch异常处理创建XMLHTTPRequest对象&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;smalltxt&quot; style=&quot;MARGIN-TOP: 1em; FONT-WEIGHT: bold; MARGIN-BOTTOM: 1em&quot;&gt;&lt;div style=&quot;FLOAT: left&quot;&gt;CODE:&lt;/div&gt;&lt;div style=&quot;FLOAT: right; TEXT-ALIGN: right&quot;&gt;&lt;a class=&quot;smalltxt&quot; onclick=&quot;function anonymous()
{
copycode(findobj('code0'));
}&quot; href=&quot;http://bbs.blueidea.com/thread-2677544-1-1.html###&quot;&gt;&lt;font color=&quot;#333366&quot;&gt;[Copy to clipboard]&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;altbg2&quot; id=&quot;code0&quot; style=&quot;CLEAR: both; BORDER-RIGHT: #666688 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #666688 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #666688 1px solid; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #666688 1px solid&quot;&gt;&lt;br /&gt;//尝试用IE浏览器的方式创建XMLHttpRequest对象&lt;br /&gt;var xmlhttp = null; &lt;br /&gt;try &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp; xmlhttp = new ActiveXObject(&amp;quot;MSXML2.XMLHTTP&amp;quot;);&amp;nbsp;&amp;nbsp;&lt;br /&gt;} &lt;br /&gt;catch(e) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp; &amp;nbsp; try &lt;br /&gt;&amp;nbsp; &amp;nbsp; { &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;xmlhttp = new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; } &lt;br /&gt;&amp;nbsp; &amp;nbsp; catch(e){&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;alert(&amp;quot;您的浏览器不能创建XMLHttpRequest对象，无法使用此程序!&amp;quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp; } &lt;br /&gt;} &lt;br /&gt;//尝试用IE浏览器的方式创建XMLHttpRequest对象结束&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;翟振凯注：MSXML2.XMLHTTP 和 Microsoft.XMLHTTP 都是微软的XMLHTTP控件，只是版本不同。&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;IE的安全级别如果不是太高，微软的XMLHTTP控件是可以跨域获取数据的。&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;因为 Mozilla Firefox 浏览器的 XMLHttpRequest() 不能跨域获取数据，我们就不用 XMLHttpRequest() 方法创建XMLHTTP对象了。&lt;br /&gt;*/&lt;/div&gt;2、对返回的中文编码处理&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;smalltxt&quot; style=&quot;MARGIN-TOP: 1em; FONT-WEIGHT: bold; MARGIN-BOTTOM: 1em&quot;&gt;&lt;div style=&quot;FLOAT: left&quot;&gt;CODE:&lt;/div&gt;&lt;div style=&quot;FLOAT: right; TEXT-ALIGN: right&quot;&gt;&lt;a class=&quot;smalltxt&quot; onclick=&quot;function anonymous()
{
copycode(findobj('code1'));
}&quot; href=&quot;http://bbs.blueidea.com/thread-2677544-1-1.html###&quot;&gt;&lt;font color=&quot;#333366&quot;&gt;[Copy to clipboard]&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;altbg2&quot; id=&quot;code1&quot; style=&quot;CLEAR: both; BORDER-RIGHT: #666688 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #666688 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #666688 1px solid; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #666688 1px solid&quot;&gt;&lt;br /&gt;//对返回的中文编码处理&lt;br /&gt;function Rec_Html(Html)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;var Rec=new ActiveXObject(&amp;quot;ADODB.RecordSet&amp;quot;);&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Rec.Fields.Append(&amp;quot;DDD&amp;quot;,201,1);&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Rec.Open();&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Rec.AddNew();&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Rec(0).AppendChunk(Html);&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Rec.Update();&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;return Rec(0).Value;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Rec.Close();&lt;br /&gt;}&lt;br /&gt;//对返回的中文编码处理结束&lt;/div&gt;3、检查判断依据中是否需要中文编码处理&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;smalltxt&quot; style=&quot;MARGIN-TOP: 1em; FONT-WEIGHT: bold; MARGIN-BOTTOM: 1em&quot;&gt;&lt;div style=&quot;FLOAT: left&quot;&gt;CODE:&lt;/div&gt;&lt;div style=&quot;FLOAT: right; TEXT-ALIGN: right&quot;&gt;&lt;a class=&quot;smalltxt&quot; onclick=&quot;function anonymous()
{
copycode(findobj('code2'));
}&quot; href=&quot;http://bbs.blueidea.com/thread-2677544-1-1.html###&quot;&gt;&lt;font color=&quot;#333366&quot;&gt;[Copy to clipboard]&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;altbg2&quot; id=&quot;code2&quot; style=&quot;CLEAR: both; BORDER-RIGHT: #666688 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #666688 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #666688 1px solid; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #666688 1px solid&quot;&gt;&lt;br /&gt;if(err.value.replace(/[^\W]/g,'').length=0)&lt;br /&gt;//用正则替换掉任何非单词和数字字符后，如果值大于0，说明判断依据中可能含有中文或其它字符，就进行编码转换。&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; Html=xmlhttp.responseText;//不转换&lt;br /&gt;}&lt;br /&gt;else &lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; Html=Rec_Html(xmlhttp.responseBody);//转换&lt;br /&gt;}&lt;/div&gt;4、进行探测，对结果进行判断并输出&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;smalltxt&quot; style=&quot;MARGIN-TOP: 1em; FONT-WEIGHT: bold; MARGIN-BOTTOM: 1em&quot;&gt;&lt;div style=&quot;FLOAT: left&quot;&gt;CODE:&lt;/div&gt;&lt;div style=&quot;FLOAT: right; TEXT-ALIGN: right&quot;&gt;&lt;a class=&quot;smalltxt&quot; onclick=&quot;function anonymous()
{
copycode(findobj('code3'));
}&quot; href=&quot;http://bbs.blueidea.com/thread-2677544-1-1.html###&quot;&gt;&lt;font color=&quot;#333366&quot;&gt;[Copy to clipboard]&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;altbg2&quot; id=&quot;code3&quot; style=&quot;CLEAR: both; BORDER-RIGHT: #666688 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #666688 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #666688 1px solid; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #666688 1px solid&quot;&gt;&lt;br /&gt;//开始探测 参数为要探测的当前值&lt;br /&gt;function geturl(id)&lt;br /&gt;{&lt;br /&gt;try{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;xmlhttp.open(&amp;quot;GET&amp;quot;,url.value+id,false);//定义数据传送方式，服务网页的URL(探测地址+探测值)，是否同步执行&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;xmlhttp.onreadystatechange = function() {//xmlhttp 触发事件&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(xmlhttp.readyState==4)//xmlhttp对象状态如果为完成&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; if(xmlhttp.status==200)&amp;nbsp; &amp;nbsp;//如果服务器返回的状态码为200(成功)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;//对结果的中文编码转换判断&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;if(err.value.replace(/[^\W]/g,'').length=0)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;/*关于转换判断的注：&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 例如:&amp;quot;翟振凯&amp;quot;.replace(/[^\W]/g,'').length&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; 返回结果 3 &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;quot;翟振凯22336848&amp;quot;.replace(/[^\W]/g,'').length&amp;nbsp;&amp;nbsp;返回结果 3&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;quot;xiaoqi22336848&amp;quot;.replace(/[^\W]/g,'').length&amp;nbsp;&amp;nbsp;返回结果 0&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;quot;小琦22336848&amp;quot;.replace(/[^\W]/g,'').length&amp;nbsp; &amp;nbsp; 返回结果 2&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; replace(/[^\W]/g,'')的功能是把字符串里的英文和数字都清除掉。&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Html=xmlhttp.responseText;//不转换&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;else &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Html=Rec_Html(xmlhttp.responseBody);//转换&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;//对结果的中文编码转换判断结束&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;// 根据判断依据区分可用或不可用的值!&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;if(Html.indexOf(err.value,0)&amp;lt;0)&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;x_1.innerHTML=x_1.innerHTML+&amp;quot;&amp;lt;nobr&amp;gt;　&amp;quot;+id;//输出可用值&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;else &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;x_2.innerHTML=x_2.innerHTML+&amp;quot;&amp;lt;nobr&amp;gt;　&amp;quot;+id;//输出不可用值&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;// 根据判断依据区分可用或不可用的值!&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;xmlhttp.send();&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&amp;nbsp;&amp;nbsp;&lt;br /&gt;catch(e)&amp;nbsp;&amp;nbsp;&lt;br /&gt;{ &lt;br /&gt;x_2.innerHTML=x_2.innerHTML+&amp;quot;&amp;lt;nobr&amp;gt;　&amp;quot;+id+&amp;quot;超时!&amp;quot;;//输出异常或超时的值。&lt;br /&gt;}&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;//开始探测结束&lt;/div&gt;5、载入字典文件，并把内容定义为数组&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;smalltxt&quot; style=&quot;MARGIN-TOP: 1em; FONT-WEIGHT: bold; MARGIN-BOTTOM: 1em&quot;&gt;&lt;div style=&quot;FLOAT: left&quot;&gt;CODE:&lt;/div&gt;&lt;div style=&quot;FLOAT: right; TEXT-ALIGN: right&quot;&gt;&lt;a class=&quot;smalltxt&quot; onclick=&quot;function anonymous()
{
copycode(findobj('code4'));
}&quot; href=&quot;http://bbs.blueidea.com/thread-2677544-1-1.html###&quot;&gt;&lt;font color=&quot;#333366&quot;&gt;[Copy to clipboard]&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;altbg2&quot; id=&quot;code4&quot; style=&quot;CLEAR: both; BORDER-RIGHT: #666688 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #666688 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #666688 1px solid; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #666688 1px solid&quot;&gt;&lt;br /&gt;//载入本地字典文件，并把内容定义为数组&lt;br /&gt;function kaishi(){ &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;fileFullPath=dic_url.value;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;xmlhttp.open(&amp;quot;GET&amp;quot;,fileFullPath,false);//载入字典文件方法&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;xmlhttp.send();&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;Html=Rec_Html(xmlhttp.responseBody);//中文编码转换&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;dic=Html.split('\r\n');//以换行符将载入的字典内容转换为数组&amp;nbsp; &amp;nbsp; &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;sl.value=dic.length;//告诉用户要探测的次数(数组大小)&lt;br /&gt;&lt;br /&gt;xunhuan()//成功载入后开始循环探测。&lt;br /&gt;}&lt;br /&gt;//载入本地字典文件，并把内容定义为数组结束&lt;/div&gt;6、循环探测&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;smalltxt&quot; style=&quot;MARGIN-TOP: 1em; FONT-WEIGHT: bold; MARGIN-BOTTOM: 1em&quot;&gt;&lt;div style=&quot;FLOAT: left&quot;&gt;CODE:&lt;/div&gt;&lt;div style=&quot;FLOAT: right; TEXT-ALIGN: right&quot;&gt;&lt;a class=&quot;smalltxt&quot; onclick=&quot;function anonymous()
{
copycode(findobj('code5'));
}&quot; href=&quot;http://bbs.blueidea.com/thread-2677544-1-1.html###&quot;&gt;&lt;font color=&quot;#333366&quot;&gt;[Copy to clipboard]&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;altbg2&quot; id=&quot;code5&quot; style=&quot;CLEAR: both; BORDER-RIGHT: #666688 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #666688 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #666688 1px solid; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #666688 1px solid&quot;&gt;&lt;br /&gt;//循环探测&lt;br /&gt;function xunhuan()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;bar=parseInt(jd.value);//将进度值转换为整数&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;if(bar&amp;lt;sl.value)//判断是否探测完&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; for(i=0;i&amp;lt;parseInt(jc.value);i++){//设定探测线程&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;geturl(dic[bar+i]);//从数组内取值进行探测&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; jd.value=bar+parseInt(jc.value);//累加探测进度，并向用户呈现当前进度&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; setTimeout(&amp;quot;xunhuan()&amp;quot;,parseInt(hc.value*1000));//根据缓冲时间来进行重复循环探测&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;else//如果进度不小于要探测的次数，就向用户返回探测完成的结果。&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; alert(&amp;quot;探测完成!&amp;quot;);&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;//循环探测结束&lt;/div&gt;7、为了使用方便，增加一个暂停的功能&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;smalltxt&quot; style=&quot;MARGIN-TOP: 1em; FONT-WEIGHT: bold; MARGIN-BOTTOM: 1em&quot;&gt;&lt;div style=&quot;FLOAT: left&quot;&gt;CODE:&lt;/div&gt;&lt;div style=&quot;FLOAT: right; TEXT-ALIGN: right&quot;&gt;&lt;a class=&quot;smalltxt&quot; onclick=&quot;function anonymous()
{
copycode(findobj('code6'));
}&quot; href=&quot;http://bbs.blueidea.com/thread-2677544-1-1.html###&quot;&gt;&lt;font color=&quot;#333366&quot;&gt;[Copy to clipboard]&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;altbg2&quot; id=&quot;code6&quot; style=&quot;CLEAR: both; BORDER-RIGHT: #666688 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #666688 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #666688 1px solid; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #666688 1px solid&quot;&gt;&lt;br /&gt;//暂停探测函数&lt;br /&gt;function pause(obj)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;if(obj.value=='暂停')&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; obj.temp=hc.value;//记忆原来的缓冲时间。&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; hc.value=5000;//将缓冲时间设置为5000秒，这个值自己可以修改。&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; obj.value='继续';//改变按钮显示状态&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; } &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;else &lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; {&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; hc.value=obj.temp;//提取原来的缓冲时间。&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; obj.value='暂停';//改变按钮显示状态&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; kaishi()//继续探测&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;//暂停探测函数结束&lt;/div&gt;8、在开始探测前先执行排错验证&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;smalltxt&quot; style=&quot;MARGIN-TOP: 1em; FONT-WEIGHT: bold; MARGIN-BOTTOM: 1em&quot;&gt;&lt;div style=&quot;FLOAT: left&quot;&gt;CODE:&lt;/div&gt;&lt;div style=&quot;FLOAT: right; TEXT-ALIGN: right&quot;&gt;&lt;a class=&quot;smalltxt&quot; onclick=&quot;function anonymous()
{
copycode(findobj('code7'));
}&quot; href=&quot;http://bbs.blueidea.com/thread-2677544-1-1.html###&quot;&gt;&lt;font color=&quot;#333366&quot;&gt;[Copy to clipboard]&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;altbg2&quot; id=&quot;code7&quot; style=&quot;CLEAR: both; BORDER-RIGHT: #666688 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #666688 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #666688 1px solid; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #666688 1px solid&quot;&gt;&lt;br /&gt;function ck()//单个值探测验证检查&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (url.value.length&amp;lt;5){alert('请输入要探测地址!');return};&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (id_one.value.length&amp;lt;1){alert('请输入要探测的值!');return};&lt;br /&gt;&amp;nbsp; &amp;nbsp; geturl(id_one.value)&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function ck1()//批量值探测验证检查&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (url.value.length&amp;lt;5){alert(&amp;quot;请输入要探测地址!&amp;quot;);return}&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (err.value.length&amp;lt;1){alert(&amp;quot;请输入不可用标记!&amp;quot;);return}&lt;br /&gt;&amp;nbsp; &amp;nbsp; if (dic_url.value.length&amp;lt;5){alert(&amp;quot;请先选择字典文件!&amp;quot;);return}&lt;br /&gt;&amp;nbsp; &amp;nbsp; jd.value=0;&lt;br /&gt;&amp;nbsp; &amp;nbsp; kaishi()&lt;br /&gt;}&lt;/div&gt;9、程序介面&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;smalltxt&quot; style=&quot;MARGIN-TOP: 1em; FONT-WEIGHT: bold; MARGIN-BOTTOM: 1em&quot;&gt;&lt;div style=&quot;FLOAT: left&quot;&gt;CODE:&lt;/div&gt;&lt;div style=&quot;FLOAT: right; TEXT-ALIGN: right&quot;&gt;&lt;a class=&quot;smalltxt&quot; onclick=&quot;function anonymous()
{
copycode(findobj('code8'));
}&quot; href=&quot;http://bbs.blueidea.com/thread-2677544-1-1.html###&quot;&gt;&lt;font color=&quot;#333366&quot;&gt;[Copy to clipboard]&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;altbg2&quot; id=&quot;code8&quot; style=&quot;CLEAR: both; BORDER-RIGHT: #666688 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #666688 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #666688 1px solid; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #666688 1px solid&quot;&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;p&amp;gt;&lt;br /&gt;程序作者：翟振凯&amp;nbsp; &amp;nbsp;QQ:22336848&amp;nbsp; &amp;nbsp;开发日期：2006年8月 &amp;lt;br&amp;gt;&lt;br /&gt;网站：&amp;lt;a href=&amp;quot;http://www.xiaoqi.net&amp;quot;&amp;gt;http://www.xiaoqi.net&amp;lt;/a&amp;gt;&amp;nbsp; &amp;nbsp;&lt;br /&gt;程序打包下载地址：&amp;lt;a href=&amp;quot;http://www.xiaoqi.net/zuopin/js_user.rar&amp;quot;&amp;gt;http://www.xiaoqi.net/zuopin/js_user.rar&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;lt;fieldset &amp;gt;&lt;br /&gt;&amp;lt;legend&amp;gt;探测设置&amp;lt;/legend&amp;gt;&lt;br /&gt;&amp;lt;table border=&amp;quot;1&amp;quot; width=&amp;quot;100%&amp;quot; bordercolorlight=&amp;quot;#E6E6E6&amp;quot; cellspacing=&amp;quot;0&amp;quot; bordercolordark=&amp;quot;#D4D0C8&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;探测地址&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;url&amp;quot; size=&amp;quot;63&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;失败包涵标记 &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;err&amp;quot; size=&amp;quot;63&amp;quot; value=&amp;quot;&amp;quot;&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;测试单个值&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;id_one&amp;quot; size=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;探测&amp;quot; onclick=&amp;quot;ck();&amp;quot;&amp;gt; &amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;选择字典文件&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;input type=&amp;quot;file&amp;quot; name=&amp;quot;dic_url&amp;quot; size=&amp;quot;20&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;开始&amp;quot; onclick=&amp;quot;ck1();&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;暂停&amp;quot; temp=&amp;quot;&amp;quot; onclick=&amp;quot;pause(this)&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;清除可用结果&amp;quot; onclick=&amp;quot;x_1.innerHTML=''&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;清除不可用结果&amp;quot; onclick=&amp;quot;x_2.innerHTML=''&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;高级参数&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&lt;br /&gt;每次探测：&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;jc&amp;quot; value=&amp;quot;1&amp;quot; size=&amp;quot;3&amp;quot;&amp;gt; 个&amp;nbsp;&amp;nbsp;&lt;br /&gt;缓冲时间：&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;hc&amp;quot; value=&amp;quot;0.1&amp;quot; size=&amp;quot;3&amp;quot;&amp;gt; 秒&amp;nbsp;&amp;nbsp;&lt;br /&gt;进度：&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;jd&amp;quot; value=&amp;quot;0&amp;quot; size=&amp;quot;12&amp;quot;&amp;gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;探测数量：&amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;sl&amp;quot; size=&amp;quot;13&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/fieldset&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;fieldset&amp;gt;&lt;br /&gt;&amp;lt;legend&amp;gt;可用值：&amp;lt;/legend&amp;gt;&lt;br /&gt;&amp;lt;div style=&amp;quot;height:100px;width:100%;overflow:auto;&amp;quot;&amp;gt;&amp;lt;span id=&amp;quot;x_1&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;fieldset&amp;gt;&lt;br /&gt;&amp;lt;legend&amp;gt;不可用值：&amp;lt;/legend&amp;gt;&lt;br /&gt;&amp;lt;div style=&amp;quot;height:100px;width:100%;overflow:auto;&amp;quot;&amp;gt;&amp;lt;span id=&amp;quot;x_2&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/fieldset&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/div&gt;&lt;b&gt;六、参考资料：&lt;/b&gt;&lt;br /&gt;&lt;b&gt;1、使用try-catch-finally处理异常&lt;/b&gt;&lt;br /&gt;用户可以使用该结构处理可能发生异常的代码，如果发生异常，则由catch捕获并进行处理，其语法如下：&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;smalltxt&quot; style=&quot;MARGIN-TOP: 1em; FONT-WEIGHT: bold; MARGIN-BOTTOM: 1em&quot;&gt;&lt;div style=&quot;FLOAT: left&quot;&gt;CODE:&lt;/div&gt;&lt;div style=&quot;FLOAT: right; TEXT-ALIGN: right&quot;&gt;&lt;a class=&quot;smalltxt&quot; onclick=&quot;function anonymous()
{
copycode(findobj('code9'));
}&quot; href=&quot;http://bbs.blueidea.com/thread-2677544-1-1.html###&quot;&gt;&lt;font color=&quot;#333366&quot;&gt;[Copy to clipboard]&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;altbg2&quot; id=&quot;code9&quot; style=&quot;CLEAR: both; BORDER-RIGHT: #666688 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #666688 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #666688 1px solid; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #666688 1px solid&quot;&gt;try{&lt;br /&gt;//要执行的代码&lt;br /&gt;}&lt;br /&gt;catch(e){&lt;br /&gt;//处理异常的代码&lt;br /&gt;}&lt;br /&gt;finally{&lt;br /&gt;//无论异常发生与否，都会执行的代码&lt;br /&gt;}&lt;/div&gt;通过异常处理，可以避免程序停止运行，从而具有了一定的自我修复能力。&lt;br /&gt;在Ajax开发中，利用异常处理的一个典型应用就是创建XMLHttpRequest对象，不同浏览器创建它的方式是不一样的，为了使代码能够跨浏览器运行，就可以利用异常，一种方法不行，再用另一种方法，直到不发生异常为止，例如：&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;smalltxt&quot; style=&quot;MARGIN-TOP: 1em; FONT-WEIGHT: bold; MARGIN-BOTTOM: 1em&quot;&gt;&lt;div style=&quot;FLOAT: left&quot;&gt;CODE:&lt;/div&gt;&lt;div style=&quot;FLOAT: right; TEXT-ALIGN: right&quot;&gt;&lt;a class=&quot;smalltxt&quot; onclick=&quot;function anonymous()
{
copycode(findobj('code10'));
}&quot; href=&quot;http://bbs.blueidea.com/thread-2677544-1-1.html###&quot;&gt;&lt;font color=&quot;#333366&quot;&gt;[Copy to clipboard]&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;altbg2&quot; id=&quot;code10&quot; style=&quot;CLEAR: both; BORDER-RIGHT: #666688 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #666688 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 3px 2em 2em; BORDER-LEFT: #666688 1px solid; WORD-BREAK: break-all; PADDING-TOP: 5px; BORDER-BOTTOM: #666688 1px solid&quot;&gt;&amp;lt;script language=&amp;quot;JavaScript&amp;quot; type=&amp;quot;text/java script&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;var xmlhttp;&lt;br /&gt;try{&lt;br /&gt;//尝试用IE浏览器的方式创建XMLHttpRequest对象&lt;br /&gt;xmlhttp=new ActiveXObject(&amp;quot;Microsoft.XMLHTTP&amp;quot;);&lt;br /&gt;}catch(e){&lt;br /&gt;try{&lt;br /&gt;//尝试用非IE浏览器的方式常见XMLHttpRequest对象&lt;br /&gt;xmlhttp=new XMLHttpRequest();&lt;br /&gt;}catch(e){}&lt;br /&gt;}&lt;br /&gt;//--&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;/div&gt;　&lt;br /&gt;　&lt;br /&gt;&lt;b&gt;2、Append 方法&lt;/b&gt;&lt;br /&gt;Append 方法&lt;br /&gt;将对象追加到集合中。如果集合是 Fields，可以先创建新的 Field 对象然后再将其追加到集合中。&lt;br /&gt;语法&lt;br /&gt;collection.Append object&lt;br /&gt;fields.Append Name, Type, DefinedSize, Attrib&lt;br /&gt;参数&lt;br /&gt;collection 集合对象。&lt;br /&gt;fields Fields 集合。&lt;br /&gt;object 对象变量，代表所要追加对象。&lt;br /&gt;Name 字符串，新 Field 对象的名称，不得与 fields 中的任何其他对象同名。 &lt;br /&gt;Type DataTypeEnum 类型，其默认值为 adEmpty。新字段的数据类型。 &lt;br /&gt;DefinedSize 可选，长整型，指示新字段的定义大小（以字符或字节为单位）。该参数的默认值源于 Type （默认的 Type 为 adEmpty，默认的 DefinedSize 未指定）。&lt;br /&gt;Attrib 可选，FieldAttributeEnum，其默认值是 adFldDefault。指定新字段的属性。如果该值未指定，字段将包含源于 Type 的属性。&lt;br /&gt;　&lt;br /&gt;&lt;b&gt;3、XmlHttpRequest对象属性&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;onreadystatechange&lt;br /&gt;每次状态改变所触发事件的事件处理程序&lt;br /&gt;readyState&lt;br /&gt;对象状态值： &lt;br /&gt;0 = 未初始化（uninitialized） &lt;br /&gt;1 = 正在加载（loading） &lt;br /&gt;2 = 加载完毕（loaded） &lt;br /&gt;3 = 交互（interactive） &lt;br /&gt;4 = 完成（complete） &lt;br /&gt;responseText&lt;br /&gt;从服务器进程返回的数据的字符串形式&lt;br /&gt;responseXML&lt;br /&gt;从服务器进程返回的DOM兼容的文档数据对象&lt;br /&gt;status&lt;br /&gt;从服务器返回的数字代码，比如404（未找到）或200（就绪）&lt;br /&gt;statusText&lt;br /&gt;伴随状态码的字符串信息</description><category>web开发</category><pubDate>Wed, 20 Sep 2006 08:58:42 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497964.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497964.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235244/1237942</fs:itemid></item><item><title>Java2D - Application - 时钟实例</title><link>http://item.feedsky.com/~feedsky/null/~1290732/95235245/1237942/1/item.html</link><description>&lt;p&gt;import java.awt.*;&lt;br /&gt;import java.awt.event.*;&lt;br /&gt;import java.awt.geom.*;&lt;br /&gt;import java.util.Calendar;&lt;br /&gt;import javax.swing.*;&lt;/p&gt;&lt;p&gt;public class Clock2DPanel extends JPanel implements ActionListener {&lt;br /&gt;// 创建时钟表面&lt;br /&gt;// public abstract class Ellipse2D extends RectangularShape&lt;br /&gt;// protected Ellipse2D() 不能直接实例化，可以通过子类来实例化&lt;br /&gt;// public static class Ellipse2D.Float extends Ellipse2D&lt;br /&gt;// Ellipse2D.Float(左上角坐标x,y,高,宽)&lt;br /&gt;protected static Ellipse2D face = new Ellipse2D.Float(3, 3, 94, 94);&lt;/p&gt;&lt;p&gt;// Create a path that represents a tick mark&lt;br /&gt;// 创建路径核对(嘀嗒)符号&lt;br /&gt;protected static GeneralPath tick = new GeneralPath();&lt;/p&gt;&lt;p&gt;static {&lt;br /&gt;// void moveTo(float x, float y) &lt;br /&gt;// 通过移动到指定坐标实现增加一个点到路径&lt;br /&gt;tick.moveTo(100, 100);&lt;br /&gt;tick.moveTo(49, 0);&lt;br /&gt;// 通过从当前坐标到新指定坐标绘制一条直线到路径中 &lt;br /&gt;tick.lineTo(51, 0);&lt;br /&gt;tick.lineTo(51, 6);&lt;br /&gt;tick.lineTo(49, 6);&lt;br /&gt;tick.lineTo(49, 0);&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;// Create a cool hour hand&lt;br /&gt;// 创建时手柄&lt;br /&gt;protected static GeneralPath hourHand = new GeneralPath();&lt;/p&gt;&lt;p&gt;static {&lt;br /&gt;hourHand.moveTo(50, 15);&lt;br /&gt;hourHand.lineTo(53, 50);&lt;br /&gt;hourHand.lineTo(50, 53);&lt;br /&gt;hourHand.lineTo(47, 50);&lt;br /&gt;hourHand.lineTo(50, 15);&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;// Create a cool minute hand&lt;br /&gt;// 分手柄&lt;br /&gt;protected static GeneralPath minuteHand = new GeneralPath();&lt;/p&gt;&lt;p&gt;static {&lt;br /&gt;minuteHand.moveTo(50, 2);&lt;br /&gt;minuteHand.lineTo(53, 50);&lt;br /&gt;minuteHand.lineTo(50, 58);&lt;br /&gt;minuteHand.lineTo(47, 50);&lt;br /&gt;minuteHand.lineTo(50, 2);&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;// And a cool second hand&lt;br /&gt;// 秒手柄&lt;br /&gt;protected static GeneralPath secondHand = new GeneralPath();&lt;/p&gt;&lt;p&gt;static {&lt;br /&gt;secondHand.moveTo(49, 5);&lt;br /&gt;secondHand.lineTo(51, 5);&lt;br /&gt;secondHand.lineTo(51, 62);&lt;br /&gt;secondHand.lineTo(49, 62);&lt;br /&gt;secondHand.lineTo(49, 5);&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;// Create some colors for the pieces of the clock&lt;br /&gt;// 创建时钟块颜色&lt;br /&gt;// Color 's Field :static Color red，blue，gray&lt;br /&gt;// 域继承了 java.awt.Transparency 接口 &lt;br /&gt;// Color darker() : 创建当前颜色的发暗版本&lt;br /&gt;protected static Color faceColor = new Color(220, 220, 220);&lt;br /&gt;protected static Color hourColor = Color.red.darker();&lt;br /&gt;protected static Color minuteColor = Color.blue.darker();&lt;br /&gt;protected static Color secondColor = new Color(180, 180, 0);&lt;br /&gt;protected static Color pinColor = Color.gray.brighter();&lt;/p&gt;&lt;p&gt;// Create circles for the pivot and center pin&lt;br /&gt;// 创建作为枢轴的中心圆圈&lt;br /&gt;protected Ellipse2D pivot = new Ellipse2D.Float(47, 47, 6, 6);&lt;br /&gt;protected Ellipse2D centerPin = new Ellipse2D.Float(49, 49, 2, 2);&lt;/p&gt;&lt;p&gt;// Create three transforms that center around the pivot point&lt;br /&gt;// 创建以枢轴点为中心的三个转换&lt;br /&gt;// AffineTransform 仿射平移&lt;br /&gt;// getRotateInstance(旋转弧度,定位点坐标)&lt;br /&gt;// 返回一个定位点周围的旋转坐标的转换&lt;br /&gt;protected AffineTransform hourTransform =&lt;br /&gt;AffineTransform.getRotateInstance(0, 50, 50);&lt;br /&gt;protected AffineTransform minuteTransform =&lt;br /&gt;AffineTransform.getRotateInstance(0, 50, 50);&lt;br /&gt;protected AffineTransform secondTransform =&lt;br /&gt;AffineTransform.getRotateInstance(0, 50, 50);&lt;/p&gt;&lt;p&gt;// Create a timer that fires once a second and a Calendar&lt;br /&gt;// instance for getting the time values&lt;br /&gt;// 创建计时器，每秒运行一次&lt;br /&gt;// 日历实例产生时间值&lt;br /&gt;// java.util.Timer 开头并没有 import 但这里可以运行 ？！？！&lt;br /&gt;// public Timer(boolean isDaemon) 创建作为精灵线程运行的关联线程&lt;br /&gt;// api 中没有 Time(int,Object)的构造器？！？！&lt;br /&gt;protected Timer timer = new Timer(1000, this);&lt;br /&gt;protected Calendar calendar = Calendar.getInstance();&lt;/p&gt;&lt;p&gt;// Constructor - hardcode a preferred size of 100x100&lt;br /&gt;// 创建首选尺寸 Dimension(宽, 高)&lt;br /&gt;public Clock2DPanel() {&lt;br /&gt;setPreferredSize(new Dimension(100, 100));&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;// Invoked when panel is added to a container&lt;br /&gt;// 当这个时钟面板被添加到一个容器中&lt;br /&gt;// 在本类父类层次中发现这个方法&lt;br /&gt;// java.awt.Container : void addNotify() &lt;br /&gt;// Makes this Container displayable by connecting it to &lt;br /&gt;// a native screen resource.&lt;br /&gt;// 通过连接他到本地屏幕资源中使他可显示&lt;br /&gt;// 而 void removeNotify() &lt;br /&gt;// Makes this Container undisplayable by removing its &lt;br /&gt;// connection to its native screen resource. &lt;br /&gt;// 通过删除连接使他不可显示&lt;br /&gt;public void addNotify() {&lt;br /&gt;// Call the superclass and start the timer&lt;br /&gt;// 这里的 super 是父类层次，不是绝对父类&lt;br /&gt;super.addNotify();&lt;br /&gt;// Timer 计时器是个线程，具有 start,stop 方法&lt;br /&gt;timer.start();&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;// Invoked when panel is removed from a container&lt;br /&gt;// 当这个时钟面板从一个容器中删除&lt;br /&gt;public void removeNotify() {&lt;br /&gt;// Call the superclass and stop the timer&lt;br /&gt;timer.stop();&lt;br /&gt;super.removeNotify();&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;// 计时器动作事件&lt;br /&gt;public void actionPerformed(ActionEvent event) {&lt;br /&gt;// Update the calendar's time&lt;br /&gt;// 取得日历时间&lt;br /&gt;this.calendar.setTime(new java.util.Date());&lt;/p&gt;&lt;p&gt;// Extract the hours minutes and seconds&lt;br /&gt;// public int get(int field) : field - the given time field&lt;br /&gt;// Field Summary : static int HOUR,MINUTE,SECOND&lt;br /&gt;// 分别取得日历中时分秒&lt;br /&gt;int hours = this.calendar.get(Calendar.HOUR);&lt;br /&gt;int minutes = this.calendar.get(Calendar.MINUTE);&lt;br /&gt;int seconds = this.calendar.get(Calendar.SECOND);&lt;/p&gt;&lt;p&gt;// Using a little trigonometry, set the transforms to rotate&lt;br /&gt;// each hand into the proper position. Center the rotation&lt;br /&gt;// around the pivot point (50, 50) instead of the origin&lt;br /&gt;// 以时针为例:&lt;br /&gt;// 走满12格为 2 PI&lt;br /&gt;// 所以转换弧度 = 当前时数/12格 * 2 PI = 当前时数 / 6 * PI&lt;br /&gt;// 分针秒针均 60 格&lt;br /&gt;hourTransform.setToRotation(((double) hours) *&lt;br /&gt;(Math.PI / 6.0), 50, 50);&lt;br /&gt;minuteTransform.setToRotation(((double) minutes) *&lt;br /&gt;(Math.PI / 30.0), 50, 50);&lt;br /&gt;secondTransform.setToRotation(((double) seconds) *&lt;br /&gt;(Math.PI / 30.0), 50, 50);&lt;/p&gt;&lt;p&gt;// Force the component to repaint ASAP&lt;br /&gt;repaint();&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;// This is an alternative to creating a UI delegate. Since JPanel's&lt;br /&gt;// paint() method only paints the border and backgound, we can just&lt;br /&gt;// override the paint method of the component to do the graphics.&lt;br /&gt;public void paint(Graphics g) {&lt;br /&gt;// Call the superclass first to paint the border (if one is assigned)&lt;br /&gt;super.paint(g);&lt;/p&gt;&lt;p&gt;// Get the graphics context and turn on anti-aliasing&lt;br /&gt;Graphics2D g2 = (Graphics2D) g;&lt;br /&gt;// 开启反锯齿&lt;br /&gt;g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,&lt;br /&gt;RenderingHints.VALUE_ANTIALIAS_ON);&lt;/p&gt;&lt;p&gt;// Set the paint for the clock face and fill it in&lt;br /&gt;// 时钟表面颜色设置和填充&lt;br /&gt;g2.setPaint(faceColor);&lt;br /&gt;g2.fill(face);&lt;/p&gt;&lt;p&gt;// Set the paint to black and draw the clock's outline&lt;br /&gt;// 黑色绘画时钟轮廓&lt;br /&gt;g2.setPaint(Color.black);&lt;br /&gt;g2.draw(face);&lt;/p&gt;&lt;p&gt;// Fill in the 12 ticks around the face of the clock&lt;br /&gt;// 填充 12 个嘀嗒记号&lt;br /&gt;for (double p = 0.0; p &amp;lt; 12.0; p += 1.0) {&lt;br /&gt;// This is probably terribly inefficient and should be&lt;br /&gt;// done statically or in the constructor - draw the&lt;br /&gt;// tick as a transformed shape that is rotated.&lt;/p&gt;&lt;p&gt;// Shape createTransformedShape(Shape pSrc) &lt;br /&gt;// 创建由指定的形状转换后的新形状对象&lt;br /&gt;g2.fill(tick.createTransformedShape(&lt;br /&gt;// 获取转换对象&lt;br /&gt;AffineTransform.getRotateInstance((Math.PI / 6.0) * p,&lt;br /&gt;50, 50)));&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;// Set the paint and draw the hour hand. It is lowest in the&lt;br /&gt;// 'z-order' so will appear underneath the other hands. Notice&lt;br /&gt;// how each hand is transformed by a different .&lt;br /&gt;// 绘画时针&lt;br /&gt;g2.setPaint(hourColor);&lt;br /&gt;g2.fill(hourHand.createTransformedShape(hourTransform));&lt;/p&gt;&lt;p&gt;// Set the paint and draw the minute hand, the second hand,&lt;br /&gt;// the pivot and the center pin&lt;br /&gt;// 绘画分针&lt;br /&gt;g2.setPaint(minuteColor);&lt;br /&gt;g2.fill(minuteHand.createTransformedShape(minuteTransform));&lt;br /&gt;// 绘画秒针&lt;br /&gt;g2.setPaint(secondColor);&lt;br /&gt;g2.fill(secondHand.createTransformedShape(secondTransform));&lt;br /&gt;// 绘画枢轴，与秒针同色&lt;br /&gt;g2.fill(pivot);&lt;br /&gt;g2.setPaint(pinColor);&lt;br /&gt;// 绘画表面颜色&lt;br /&gt;g2.fill(centerPin);&lt;br /&gt;}&lt;/p&gt;&lt;p&gt;// A little test frame to show off our fancy clock&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;JFrame frame = new JFrame();&lt;br /&gt;frame.setLocation(700, 400);&lt;br /&gt;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);&lt;br /&gt;frame.getContentPane().add(new Clock2DPanel());&lt;br /&gt;frame.pack();&lt;br /&gt;frame.show();&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/p&gt;</description><category>Java</category><pubDate>Tue, 19 Sep 2006 10:38:59 +0800</pubDate><author>letle.bokee.com</author><guid isPermaLink="false">http://letle.bokee.com/viewdiary.14497963.html</guid><dc:creator>letle.bokee.com</dc:creator><fs:srclink>http://letle.bokee.com/viewdiary.14497963.html</fs:srclink><fs:srcfeed>http://letle.bokee.com/rss2.b</fs:srcfeed><fs:itemid>feedsky/null/~1290732/95235245/1237942</fs:itemid></item></channel></rss>
