浏览器选择语句

星期一, 18 五月 2009 15:58 by lyboy99

1. <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]-->
2. <!--[if IE]> 所有的IE可识别 <![endif]-->
3. <!--[if IE 5.0]> 只有IE5.0可以识别 <![endif]-->
4. <!--[if IE 5]> 仅IE5.0与IE5.5可以识别 <![endif]-->
5. <!--[if gt IE 5.0]> IE5.0以及IE5.0以上版本都可以识别 <![endif]-->
6. <!--[if IE 6]> 仅IE6可识别 <![endif]-->
7. <!--[if lt IE 6]> IE6以及IE6以下版本可识别 <![endif]-->
8. <!--[if gte IE 6]> IE6以及IE6以上版本可识别 <![endif]-->
9. <!--[if IE 7]> 仅IE7可识别 <![endif]-->
10. <!--[if lt IE 7]> IE7以及IE7以下版本可识别 <![endif]-->
11. <!--[if gte IE 7]> IE7以及IE7以上版本可识别 <![endif]-->

 

<!--[if lte IE 6]>……<![endif]-->

Ite:less than or equal to意思是小于或等于IE6浏览器,用于IE浏览器的条件注释,常用于CSShack,针对IE的JS等。

在进行WEB标准网页的学习和应用过程中,网页对浏览器的兼容性是经常接触到的一个问题。其中因微软公司的Internet Explorer(简称IE)占据浏览器市场的大半江山,此外还有Firefox、Opera等。需要对这些浏览器进行兼容。

同时,单就IE而言,因IE版本的升级更替,目前浏览者使用的主要停留在 IE5(IE5.5)、IE6和IE7这三个版本中。而这3个版本对于我们制作的WEB标准网页(XHTML+CSS)解释执行的显示状况不尽相同。并且,其他非IE浏览器与IE对某些CSS解释也不一样。所以,通过IE浏览器中的专有条件注释可有针对性的进行相关属性的定义。

条件注释只能用于Explorer 5+ Windows(以下简称IE)(条件注释从IE5开始被支持)。如果你安装了多个IE,条件注释(Conditional comments)将会以最高版本的IE为标准(目前为IE 7)。

条件注释只能在windows Internet Explorer(以下简称IE)下使用,因此我们可以通过条件注释来为IE添加特别的指令。

通俗点,条件注释就是一些if判断,但这些判断不是在脚本里执行的,而是直接在html代码里执行的,比如:


<!--[if IE]>

这里是正常的html代码

<![endif]-->

 

1,条件注释的基本结构和HTML的注释(<!-- -->)是一样的。因此IE以外的浏览器将会把它们看作是普通的注释而完全忽略它们。

2,IE将会根据if条件来判断是否如解析普通的页面内容一样解析条件注释里的内容。

3,条件注释使用的是HTML的注释结构,因此他们只能使用在HTML文件里,而不能在CSS文件中使用。

可使用如下代码检测当前IE浏览器的版本(注意:在非IE浏览器中是看不到效果的)

<!--[if IE]>

      <h1>您正在使用IE浏览器</h1>

      <!--[if IE 5]>

          <h2>版本 5</h2>

      <![endif]-->

      <!--[if IE 5.0]>

          <h2>版本 5.0</h2>

      <![endif]-->

      <!--[if IE 5.5]>

          <h2>版本 5.5</h2>

      <![endif]-->

      <!--[if IE 6]>

          <h2>版本 6</h2>

      <![endif]-->

      <!--[if IE 7]>

          <h2>版本 7</h2>

      <![endif]-->

<![endif]-->

那如果当前的浏览器是IE,但版本比IE5还低,该怎么办呢,可以使用<!--[if ls IE 5]>,当然,根据条件注释只能在IE5+的环境之下,所以<!--[if ls IE 5]>根本不会被执行。

lte:就是Less than or equal to的简写,也就是小于或等于的意思。

lt :就是Less than的简写,也就是小于的意思。

gte:就是Greater than or equal to的简写,也就是大于或等于的意思。

gt :就是Greater than的简写,也就是大于的意思。

! :就是不等于的意思,跟javascript里的不等于判断符相同

 

Conditional comments属于CSS hack? 条件判断属于CSS hack吗?

严格地说是属于CSS hack。因为就好象其他真正的css hack一样,它使得我们可以给一些浏览器赋予特殊的样式,再则它不依赖于某个浏览器的BUG来控制另外一个浏览器(的样式)。除此之外,条件判断还能用来做一些超出CSS HACK范围的事情(虽然这种情况很少发生)。

因为条件判断不依赖于某个浏览器的hack,而是一个经过深思熟虑的特色功能,所以我相信它是可以被放心地使用的。当然,其他浏览器也有可能支持条件判断(到目前为止还没有),但是看起来,他们应该不会使用如<!--[if IE]>这样的语法。

应该如何应用条件注释

本文一开始就说明了,因为IE各版本的浏览器对我们制作的WEB标准的页面解释不一样,具体就是对CSS的解释不同,我们为了兼容这些,可运用条件注释来各自定义,最终达到兼容的目的。比如:

<!-- 默认先调用css.css样式表 -->

<link rel="stylesheet" type="text/css" href="css.css" />

<!--[if IE 7]>

<!-- 如果IE浏览器版是7,调用ie7.css样式表 -->

<link rel="stylesheet" type="text/css" href="ie7.css" />

<![endif]-->

<!--[if lte IE 6]>

<!-- 如果IE浏览器版本小于等于6,调用ie.css样式表 -->

<link rel="stylesheet" type="text/css" href="ie.css" />

<![endif]-->


这其中就区分了IE7和IE6向下的浏览器对CSS的执行,达到兼容的目的。同时,首行默认的css.css还能与其他非IE浏览器实现兼容。

注意:默认的CSS样式应该位于HTML文档的首行,进行条件注释判断的所有内容必须位于该默认样式之后。

比如如下代码,在IE浏览器下执行显示为红色,而在非IE浏览器下显示为黑色。如果把条件注释判断放在首行,则不能实现。该例题很能说明网页对IE浏览器和非IE浏览器间的兼容性问题解决。

<style type="text/css">

body{

background-color: #000;

}

</style>

<!--[if IE]>

<style type="text/css">

body{

background-color: #F00;

}

</style>

<![endif]-->

同时,有人会试图使用<!--[if !IE]>来定义非IE浏览器下的状况,但注意:条件注释只有在IE浏览器下才能执行,这个代码在非IE浏览下非单不是执行该条件下的定义,而是当做注释视而不见。

正常就是默认的样式,对IE浏览器需要特殊处理的,才进行条件注释。

在HTML文件里,而不能在CSS文件中使用。

第一个打分

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Categories:   Asp.net技术
Actions:   E-mail | Permalink | 评论 (0) | Comment RSSRSS comment feed

利用条件注解+IE6兼容性 写2级带连接纯css菜单

星期一, 18 五月 2009 11:37 by lyboy99

css2级菜单大部分是用css+js写的。主要原因是应为IE6这个占用户群特大的浏览器对css2.0的伪类支持不是很理想。IE6.0只支持A标签的伪类,其他标签都不支持伪类。而IE7,FF,OPERA都支持。比如说一下代码:

 

XML/HTML代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />  
  5. <title>测试文档</title>  
  6. <style type="text/css" media="all">  
  7. p:hover { background:#999999;}   
  8. </style>  
  9. </head>  
  10. <body>  
  11. <p>这里的背景可以在:hover状态下变色(IE7.opera,firefox),但是IE6面就没反映。应为IE6不支持P标签的hover伪类。</p>  
  12. </body>  
  13. </html>  

做纯CSS2级别菜单,的原理是 父标签有A连接,然后同时用hover来实现显示隐藏子标签。并且,子标签也得带A连接。但是A标签是不能嵌套的。而hover在IE6里面又只能在A标签实现,所以,在ie6里面需要实现2级带连接的CSS菜单按照一般的想法是不可能的。

但是发现了下面一段代码之后就改变了整个状况:

XML/HTML代码
  1. <body>  
  2. <a href="http://www.hudong123.com/index.html">这里是连接一   
  3. <table>  
  4.   <tr>  
  5.     <td><a href="http://www.hudong123.com">这里是连接2</a></td>  
  6.   </tr>  
  7. </table>  
  8. </a>  
  9. </body>  

测试发现,a标签里面嵌套table,再在table的单元格里面写a连接是可以的。这个连接依旧会在FF,opera和IE7生效。

之后我们给他加上css测试hover下面的效果缺发现,table的只有对IE起效,对其他的不管用。代码如下。

XML/HTML代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />  
  5. <title>测试文档</title>  
  6. <style type="text/css" media="all">  
  7. #jing1 table { display:none;}   
  8. #jing1:hover { _border:none;}   
  9. #jing1:hover table { display:block;}   
  10. </style>  
  11. </head>  
  12. <body>  
  13. <a href="http://www.hudong123.com/index.html" id="jing1">这里是连接一   
  14. <table>  
  15.   <tr>  
  16.     <td><a href="http://www.hudong123.com">这里是连接2</a></td>  
  17.   </tr>  
  18. </table>  
  19. </a>  
  20. </body>  
  21. </html>  

所以我们的解决方法是把把IE6和其他浏览器独立起来。其他浏览器不用a表亲的hover做显示应藏,只有A标签用。于是我们把菜单写成这样。

 

XML/HTML代码
  1. <body>  
  2. <ul id="caidan">  
  3. <li><a href="http://www.hudong123.com">主菜单   
  4. <!--[if IE 7]><!--></a><!--<![endif]-->    
  5. <!--[if IE 6]><table><tr><td><![endif]-->  
  6. <dl>  
  7. <dd><a href="http://www.hudong123.com/jing">子菜单</a></dd>  
  8. <dd><a href="http://www.hudong123.com/jing">子菜单</a></dd>  
  9. </dl>  
  10. <!--[if IE 6]></td></tr></table></a><![endif]-->  
  11. </li>  
  12. </ul>  
  13. </body>  

这个主要是利用条件注解,让浏览器生成不同的代码。

这里只有IE6生成table,具体生成的代码如下:

XML/HTML代码
  1. <ul id="caidan">  
  2. <li><a href="http://www.hudong123.com">主菜单   
  3. <table><tr><td>  
  4. <dl>  
  5. <dd><a href="http://www.hudong123.com/jing">子菜单</a></dd>  
  6. <dd><a href="http://www.hudong123.com/jing">子菜单</a></dd>  
  7. </dl>  
  8. </td></tr></table></a>  
  9. </li>  
  10. </ul>  

其他浏览器生成的代码是

XML/HTML代码
  1. <ul id="caidan">  
  2. <li><a href="http://www.hudong123.com">主菜单</a>  
  3. <dl>  
  4. <dd><a href="http://www.hudong123.com/jing">子菜单</a></dd>  
  5. <dd><a href="http://www.hudong123.com/jing">子菜单</a></dd>  
  6. </dl>  
  7. </li>  
  8. </ul>  

其中这句<!--[if IE 7]><!--></a><!--<![endif]-->  IE6读到 <!--[if IE 7]> 的时候就会把 从<!--[if IE 7]>到<![endif]--> 中间的内容全部忽略掉,而IE7会读取<!--></a><!-- 由于<!--><!--  这个都是<!开始的所以IE7会视为无效代码。FF浏览器读取的时候确不认识<!--[if IE 7]> 只是把它解释成为普通的注解,于是就变成 <!--  [if IE 7]><!    -->这是一部分注解,然后读取</a> <!-- <![endif]  -->后面又是一部分注解。这样 就只是除了IE6不认识这个</a>以外,其他的都认识。

稍微给他加点点CSS。这样就基本上原理都解说完了,以后怎么美化就和普通菜单没多大区别。

 

XML/HTML代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />  
  5. <title>测试文档</title>  
  6. <style type="text/css"><!--   
  7. *{ margin:0; padding:0;}   
  8. body{ font-size:12px;}   
  9. ul { list-style:none;}   
  10. #caidan li { position:relative;  }   
  11. #caidan dl { position:absolute; display:none; }   
  12. #caidan li:hover dl { display:block;  }   
  13. --></style>  
  14. <!--[if IE 6]>  
  15. <style type="text/css">  
  16. #caidan li a:hover {border:none;}   
  17. #caidan li a table dl{display:none;}   
  18. #caidan li a:hover table dl {display:block; width:82px;}   
  19. </style>  
  20. <![endif]-->  
  21. </head>  
  22.   
  23. <body>  
  24. <ul id="caidan">  
  25. <li><a href="http://www.hudong123.com">主菜单   
  26. <!--[if IE 7]><!--></a><!--<![endif]-->    
  27. <!--[if IE 6]><table><tr><td><![endif]-->  
  28. <dl>  
  29. <dd><a href="http://www.hudong123.com/jing">子菜单</a></dd>  
  30. <dd><a href="http://www.hudong123.com/jing">子菜单</a></dd>  
  31. </dl>  
  32. <!--[if IE 6]></td></tr></table></a><![endif]-->  
  33. </li>  
  34. </ul>  
  35. </body>  
  36. </html>  

下面是网上找来的这种方法的菜单。这种方法有点牵强,就如同某某人画的css房子一样的。我还是建议大家用JS写2级菜单,等IE6淘汰了,2级菜单就再也要用JS了。

 

XML/HTML代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html>  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />  
  5. <title>菜单</title>  
  6. <style type="text/css">  
  7. *{margin:0;padding:0;}   
  8. .menu{font-size:12px;position:relative;z-index:100;}   
  9. .menu ul{list-style:none;}   
  10. .menu li {float:left;position:relative;}   
  11. .menu ul ul {visibility:hidden;position:absolute;left:3px;top:23px;}   
  12. .menu table {position:absolute; top:0; left:0;}   
  13. .menu ul li:hover ul,   
  14. .menu ul a:hover ul{visibility:visible;}   
  15. .menu a{display:block;border:1px solid #aaa;background:red;padding:2px 10px;margin:3px;color:#fff;text-decoration:none;}   
  16. .menu a:hover{background:#f2cdb0;color:#f00;border:1px solid red;}   
  17. .menu ul ul{}   
  18. .menu ul ul li {clear:both;text-align:left;font-size:12px;}   
  19. .menu ul ul li a{display:block;width:100px;height:13px;margin:0;border:0;border-bottom:1px solid red;}   
  20. .menu ul ul li a:hover{border:0;background:#f2cdb0;border-bottom:1px solid #fff;}   
  21. </style>  
  22. </head>  
  23. <body>  
  24. <div class="menu">  
  25.     <ul>  
  26.         <li><a href="">主菜单1   
  27.             <!--[if IE 7]><!--></a><!--<![endif]-->  
  28.             <!--[if lte IE 6]><table><tr><td><![endif]-->  
  29.             <ul>  
  30.                 <li><a href="">子菜单</a></li>  
  31.                 <li><a href="">子菜单</a></li>  
  32.                 <li><a href="">子菜单</a></li>  
  33.                 <li><a href="">子菜单</a></li>  
  34.                 <li><a href="">子菜单</a></li>  
  35.                 <li><a href="">子菜单</a></li>  
  36.                 <li><a href="">子菜单</a></li>  
  37.                 <li><a href="">子菜单</a></li>  
  38.                 <li><a href="">子菜单</a></li>  
  39.                 <li><a href="">子菜单</a></li>  
  40.             </ul>  
  41.             <!--[if lte IE 6]></td></tr></table></a><![endif]-->  
  42.         </li>  
  43.         <li><a href="">主菜单2   
  44.             <!--[if IE 7]><!--></a><!--<![endif]-->  
  45.             <!--[if lte IE 6]><table><tr><td><![endif]-->  
  46.             <ul>  
  47.                 <li><a href="">子菜单</a></li>  
  48.                 <li><a href="">子菜单</a></li>  
  49.             </ul>  
  50.             <!--[if lte IE 6]></td></tr></table></a><![endif]-->  
  51.         </li>  
  52.         <li><a href="">主菜单3   
  53.             <!--[if IE 7]><!--></a><!--<![endif]-->  
  54.             <!--[if lte IE 6]><table><tr><td><![endif]-->  
  55.             <ul>  
  56.                 <li><a href="">子菜单</a></li>  
  57.                 <li><a href="">子菜单</a></li>  
  58.             </ul>  
  59.             <!--[if lte IE 6]></td></tr></table></a><![endif]-->  
  60.         </li>  
  61.         <li><a href="">子菜单</a></li>  
  62.         <li><a href="">子菜单</a></li>  
  63.         <li><a href="">子菜单   
  64.             <!--[if IE 7]><!--></a><!--<![endif]-->  
  65.             <!--[if lte IE 6]><table><tr><td><![endif]-->  
  66.             <ul>  
  67.                 <li><a href="">子菜单</a></li>  
  68.                 <li><a href="">子菜单</a></li>  
  69.             </ul>  
  70.             <!--[if lte IE 6]></td></tr></table></a><![endif]-->  
  71.         </li>  
  72.         <li><a href="">子菜单</a></li>  
  73.         <li><a href="">子菜单</a></li>  
  74.         <li><a href="">主菜单9   
  75.             <!--[if IE 7]><!--></a><!--<![endif]-->  
  76.             <!--[if lte IE 6]><table><tr><td><![endif]-->  
  77.             <ul>  
  78.                 <li><a href="">子菜单</a></li>  
  79.                 <li><a href="">子菜单</a></li>  
  80.                 <li><a href="">子菜单</a></li>  
  81.                 <li><a href="">子菜单</a></li>  
  82.                 <li><a href="">子菜单</a></li>  
  83.                 <li><a href="">子菜单</a></li>  
  84.                 <li><a href="">子菜单</a></li>  
  85.             </ul>  
  86.             <!--[if lte IE 6]></td></tr></table></a><![endif]-->  
  87.         </li>  
  88.     </ul>  
  89. </div>  
  90. </body>  
  91. </html>  

 

XML/HTML代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"   
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
  3. <html xmlns="http://www.w3.org/1999/xhtml">  
  4. <head>     
  5. <meta http-equiv="Content-Type" content="text/html; charset=GB2312" />     
  6. <title>纯CSS菜单</title>     
  7. <style type="text/css">  
  8. <!-- /* */   
  9. * {font-family:"宋体";margin:0;padding:0;}   
  10. body {padding:15px;}   
  11.   
  12. /* 设置table宽度、边框为0、(IE6) */   
  13. .nav ul table {width:100%;border-collapse:collapse;border:0;}   
  14. /* 默认隐藏下一级ul列表 */   
  15. .nav ul li ul {display:none;}   
  16. /* 当鼠标经过时显示下一级ul列表 */   
  17. .nav ul li:hover ul,   
  18. .nav ul li a:hover ul {display:block;width:100%;}   
  19. /* 好久没玩...结果不知道哪出错了,不加粗就是不行。哪位有深入研究滴请详解~谢 */   
  20. .nav li a:hover {font-weight:bold;}   
  21.   
  22. /* ====================== 以上为关键属性 ====================== */   
  23.   
  24.   
  25. /* ====================== 以下各位随意发挥 ====================== */   
  26. /* 修饰样式一 */   
  27. .nav {float:left;_height:22px;min-height:22px;border:solid #ccc;border-width:1px 0;}   
  28. .nav li {float:left;width:120px;display:block;font-size:0;}   
  29.   
  30. .nav li a {width:120px;display:block;height:22px;line-height:22px;font-size:12px;text-align:center;color:#555;text-decoration:none;background:#f7f7f7;}   
  31.   
  32. .nav li:hover a,   
  33. .nav li a:hover {border-bottom:0;background:#eee;font-weight:bold;color:red;}   
  34.   
  35. .nav li:hover li a,   
  36. .nav li a:hover a {color:#555;background:#f7f7f7;font-weight:normal;border-bottom:0;}   
  37.   
  38. .nav li:hover li a:hover,   
  39. .nav li a:hover a:hover {background:#fff;color:#333;}   
  40.   
  41. -->  
  42. </style>     
  43. </head>     
  44.   
  45. <body>     
  46. <div class="nav">  
  47. <ul>  
  48. <li class="up"><a href="####">首页   
  49. <!--[if IE 7]><!--></a><!--<![endif]--><table><tr><td>  
  50. <ul>  
  51. <li><a href="####">111112</a></li>  
  52. <li><a href="####">111112</a></li>  
  53. <li><a href="####">111112</a></li>  
  54. </ul>  
  55. </td></tr></table><!--[if lte IE 6]></a><![endif]-->  
  56. </li>  
  57. <li><a href="####">导航2   
  58. <!--[if IE 7]><!--></a><!--<![endif]--><table><tr><td>  
  59. <ul>  
  60. <li><a href="####">222221</a></li>  
  61. <li><a href="####">222221</a></li>  
  62. <li><a href="####">222221</a></li>  
  63. </ul>  
  64. </td></tr></table><!--[if lte IE 6]></a><![endif]-->  
  65. </li>  
  66. <li><a href="####">导航3   
  67. <!--[if IE 7]><!--></a><!--<![endif]--><table><tr><td>  
  68. <ul>  
  69. <li><a href="####">333331</a></li>  
  70. <li><a href="####">333331</a></li>  
  71. <li><a href="####">333331</a></li>  
  72. </ul>  
  73. </td></tr></table><!--[if lte IE 6]></a><![endif]-->  
  74. </li>  
  75. <li><a href="####">导航4   
  76. <!--[if IE 7]><!--></a><!--<![endif]--><table><tr><td>  
  77. <ul>  
  78. <li><a href="####">444441</a></li>  
  79. <li><a href="####">444441</a></li>  
  80. <li><a href="####">444441</a></li>  
  81. </ul>  
  82. </td></tr></table><!--[if lte IE 6]></a><![endif]-->  
  83. </li>  
  84. <li><a href="####">导航5   
  85. <!--[if IE 7]><!--></a><!--<![endif]--><table><tr><td>  
  86. <ul>  
  87. <li><a href="####">555551</a></li>  
  88. <li><a href="####">555551</a></li>  
  89. <li><a href="####">555551</a></li>  
  90. </ul>  
  91. </td></tr></table><!--[if lte IE 6]></a><![endif]-->  
  92. </li>  
  93. <li><a href="####">导航6   
  94. <!--[if IE 7]><!--></a><!--<![endif]--><table><tr><td>  
  95. <ul>  
  96. <li><a href="####">666661</a></li>  
  97. <li><a href="####">666661</a></li>  
  98. <li><a href="####">666661</a></li>  
  99. </ul>  
  100. </td></tr></table><!--[if lte IE 6]></a><![endif]-->  
  101. </li>  
  102. </ul>  
  103. </div>  
  104. </body>     
  105. </html>  

直接复制就可以用了。原理我已经详细解释过了,至于怎么发挥就得看个人的经验了。至少我不喜欢这种菜单方式。

第一个打分

  • Currently 0/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Categories:   Asp.net技术
Actions:   E-mail | Permalink | 评论 (0) | Comment RSSRSS comment feed

SQL 查找重复记录

星期一, 9 三月 2009 17:35 by lyboy99
Sql代码
  1. CREATE TABLE product   
  2. (   
  3.  ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL,   
  4.  Pid INT NOT NULL,   
  5.  Pname VARCHAR(50) NOT NULL,   
  6.  Punit CHAR(10) NOT NULL,   
  7.  Pspec VARCHAR(50),   
  8.  PbarCode VARCHAR(20),   
  9. )   
  10.   
  11. INSERT INTO product(Pid,Pname,Punit,Pspec,PbarCode) VALUES(10000,'欧莱雅日间修复','瓶','50ML','1975126589653')   
  12. INSERT INTO product(Pid,Pname,Punit,Pspec,PbarCode) VALUES(10001,'欧莱雅夜间修复','瓶','50ML','1975126589643')   
  13. INSERT INTO product(Pid,Pname,Punit,Pspec,PbarCode) VALUES(10002,'倩碧','盒','150ML','1545126589653')   
  14. INSERT INTO product(Pid,Pname,Punit,Pspec,PbarCode) VALUES(10003,'百分百','瓶','250ML','2575126589653')   
  15. INSERT INTO product(Pid,Pname,Punit,Pspec,PbarCode) VALUES(10004,'欧本洗面脸','瓶','80ML','1275126589653')   
  16. INSERT INTO product(Pid,Pname,Punit,Pspec,PbarCode) VALUES(10005,'艾迪达斯','瓶','40ML','1975126589653')   
  17. INSERT INTO product(Pid,Pname,Punit,Pspec,PbarCode) VALUES(10006,'SK2','瓶','20ML','1975126589653')  



查找:
1、--查某一列(或多列)的重复值(只能查出重复记录的值,不能整个记录的信息)
--如:查找barCode 重复的记录

Sql代码
  1. select PbarCode from product   
  2. group by PbarCode   
  3. having(count(*))>1  


2、--查找重复条形码商品

Sql代码
  1. select * from product   
  2. where PbarCode in (   
  3. select PbarCode from product   
  4. group by PbarCode   
  5. having(count(*))>1   
  6. order by Pid  


--下面这个可以查询有多少条关键字相同的

Sql代码
  1. select PbarCode,count(PbarCode) from product   
  2. group by PbarCode having count(PbarCode)>=2;  


3、--查找重复条形码商品二,跟上面的结果是一样的  by 李全

Sql代码
  1. select * from product where PbarCode in  
  2. (select PbarCode from  
  3. (select p1.PbarCode,count(p1.PbarCode) number from product p1,(select distinct(PbarCode) from product) p2 where  
  4. p1.PbarCode=p2.PbarCode group by p1.PbarCode) a1 where number>1)  

当前评分 5.0 , 共有 1 人参与

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Categories:   Oracle技术
Actions:   E-mail | Permalink | 评论 (0) | Comment RSSRSS comment feed

URL重写,服务器设置方法

星期四, 30 十月 2008 11:49 by lyboy99

URL重写,服务器设置方法
避免出现无法找到该页
解决办法:请打开IIS(Internet服务器),找到Web服务器扩展,设置Asp.Net为允许。
另一个可能的原因 可能是因为你在后台启用了Url重写功能,如果你设置了非aspx扩展名的文件扩展名,那么你需要手动在IIS(即Internet信息管理器)里边进行设置,具体方法如下:
首先在左边栏里需要设置的网站或虚拟目录上边点击右键并选择\"属性\",在\"虚拟目录\"选项卡中点击\"配置\",在打开的\"应用程序配置\"窗口中点击\"添加\",在可执行文件里边填写处理aspx文件的Dll文件路径,一般为c:\\windows\\microsoft.net\\framework\\v2.0.50727\\aspnet_isapi.dll,在扩展名里边填写你要模拟的文件扩展名,如.html.将\"动作\"限制为 GET,POST,并勾掉\"确认文件是否存在\"前边的勾即可。

当前评分 2.7 , 共有 6 人参与

  • Currently 2.666667/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Categories:   Asp.net技术
Actions:   E-mail | Permalink | 评论 (0) | Comment RSSRSS comment feed

SQLServer2005里对使用with encryption选项创建的存储过程解密

星期四, 4 九月 2008 23:41 by lyboy99

SQLServer2005里对使用with encryption选项创建的存储过程解密


SQLServer2005里使用with encryption选项创建的存储过程仍然和sqlserver2000里一样,都是使用XOR进行了的加密。和2000不一样的是,在2005的系统表syscomments里已经查不到加密过的密文了。要查密文必须使用DAC(专用管理员连接)连接到数据库后,在系统表sys.sysobjvalues查询,该表的列imageval存储了相应的密文。具体可以使用下面的查询:

SELECT imageval FROM sys.sysobjvalues WHERE objid = object_id(@procedure) AND
valclass = 1 AND subobjid = 1

下面是解密的存储过程,具体代码如下:

CREATE PROCEDURE dbo.sp__procedure$decrypt
(@procedure sysname = NULL, @revfl int = 1)
AS

/*


exec dbo.sp__procedure$decrypt @procedure,0

如果第二个参数使用1的话,会给出该存储过程的一些提示。

*/

SET NOCOUNT ON
IF @revfl = 1
BEGIN
PRINT '警告:该存储过程会删除并重建原始的存储过程。'
PRINT ' 在运行该存储过程之前确保你的数据库有一个备份。'
PRINT ' 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。'
PRINT ' 为了运行这个存储过程,将参数@refl的值更改为0。'
RETURN 0
END
DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@intEncrypted
tinyint,@procNameLength int
select @maxColID = max(subobjid),@intEncrypted = imageval FROM
sys.sysobjvalues WHERE objid = object_id(@procedure)
GROUP BY imageval
--select @maxColID as 'Rows in sys.sysobjvalues'
select @procNameLength = datalength(@procedure) + 29
DECLARE @real_01 nvarchar(max)
DECLARE @fake_01 nvarchar(max)
DECLARE @fake_encrypt_01 nvarchar(max)
DECLARE @real_decrypt_01 nvarchar(max),@real_decrypt_01a nvarchar(max)
select @real_decrypt_01a = ''
-- 从sys.sysobjvalues里提出加密的imageval记录
SET @real_01=(SELECT imageval FROM sys.sysobjvalues WHERE objid =
object_id(@procedure) and valclass = 1 and subobjid = 1 )
--创建一个临时表
create table #output ( [ident] [int] IDENTITY (1, 1) NOT NULL ,
[real_decrypt] NVARCHAR(MAX) )
--开始一个事务,稍后回滚
BEGIN TRAN
--更改原始的存储过程,用短横线替换
SET @fake_01='ALTER PROCEDURE '+ @procedure +' WITH ENCRYPTION AS
'+REPLICATE('-', 40003 - @procNameLength)
EXECUTE (@fake_01)
--从sys.sysobjvalues里提出加密的假的
SET @fake_encrypt_01=(SELECT imageval FROM sys.sysobjvalues WHERE objid =
object_id(@procedure) and valclass = 1 and subobjid = 1)

SET @fake_01='CREATE PROCEDURE '+ @procedure +' WITH ENCRYPTION AS
'+REPLICATE('-', 40003 - @procNameLength)
--开始计数
SET @intProcSpace=1
--使用字符填充临时变量
SET @real_decrypt_01 = replicate(N'A', (datalength(@real_01) /2 ))
--循环设置每一个变量,创建真正的变量
--每次一个字节
SET @intProcSpace=1
--如有必要,遍历每个@real_xx变量并解密
WHILE @intProcSpace<=(datalength(@real_01)/2)
BEGIN
--真的和假的和加密的假的进行异或处理
SET @real_decrypt_01 = stuff(@real_decrypt_01, @intProcSpace, 1,
NCHAR(UNICODE(substring(@real_01, @intProcSpace, 1)) ^
(UNICODE(substring(@fake_01, @intProcSpace, 1)) ^
UNICODE(substring(@fake_encrypt_01, @intProcSpace, 1)))))
SET @intProcSpace=@intProcSpace+1
END

--通过sp_helptext逻辑向表#output里插入变量
insert #output (real_decrypt) select @real_decrypt_01
-- select real_decrypt AS '#output chek' from #output --测试
-- -------------------------------------
--开始从sp_helptext提取
-- -------------------------------------
declare @dbname sysname
,@BlankSpaceAdded int
,@BasePos int
,@CurrentPos int
,@TextLength int
,@LineId int
,@AddOnLen int
,@LFCR int --回车换行的长度
,@DefinedLength int
,@SyscomText nvarchar(4000)
,@Line nvarchar(255)

Select @DefinedLength = 255
SELECT @BlankSpaceAdded = 0 --跟踪行结束的空格。注意Len函数忽略了多余的空格
CREATE TABLE #CommentText
(LineId int
,Text nvarchar(255) collate database_default)

--使用#output代替sys.sysobjvalues
DECLARE ms_crs_syscom CURSOR LOCAL
FOR SELECT real_decrypt from #output
ORDER BY ident
FOR READ ONLY

--获取文本
SELECT @LFCR = 2
SELECT @LineId = 1

OPEN ms_crs_syscom
FETCH NEXT FROM ms_crs_syscom into @SyscomText
WHILE @@fetch_status >= 0
BEGIN
SELECT @BasePos = 1
SELECT @CurrentPos = 1
SELECT @TextLength = LEN(@SyscomText)
WHILE @CurrentPos != 0
BEGIN
--通过回车查找行的结束
SELECT @CurrentPos = CHARINDEX(char(13)+char(10), @SyscomText,
@BasePos)
--如果找到回车
IF @CurrentPos != 0
BEGIN
--如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +
@CurrentPos-@BasePos + @LFCR) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength-(isnull(LEN(@Line),0) +
@BlankSpaceAdded)
INSERT #CommentText VALUES
( @LineId,
isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,
@BasePos, @AddOnLen), N''))
SELECT @Line = NULL, @LineId = @LineId + 1,
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0
END
SELECT @Line = isnull(@Line, N'') +
isnull(SUBSTRING(@SyscomText, @BasePos, @CurrentPos-@BasePos + @LFCR), N'')
SELECT @BasePos = @CurrentPos+2
INSERT #CommentText VALUES( @LineId, @Line )
SELECT @LineId = @LineId + 1
SELECT @Line = NULL
END
ELSE
--如果回车没找到
BEGIN
IF @BasePos <= @TextLength
BEGIN
--如果@Lines长度的新值大于定义的长度
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +
@TextLength-@BasePos+1 ) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength -
(isnull(LEN(@Line),0) + @BlankSpaceAdded)
INSERT #CommentText VALUES
( @LineId,
isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,
@BasePos, @AddOnLen), N''))
SELECT @Line = NULL, @LineId = @LineId + 1,
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded =
0
END
SELECT @Line = isnull(@Line, N'') +
isnull(SUBSTRING(@SyscomText, @BasePos, @TextLength-@BasePos+1 ), N'')
if LEN(@Line) < @DefinedLength and charindex(' ',
@SyscomText, @TextLength+1 ) > 0
BEGIN
SELECT @Line = @Line + ' ', @BlankSpaceAdded = 1
END
END
END
END
FETCH NEXT FROM ms_crs_syscom into @SyscomText
END
IF @Line is NOT NULL
INSERT #CommentText VALUES( @LineId, @Line )
select Text from #CommentText order by LineId
CLOSE ms_crs_syscom
DEALLOCATE ms_crs_syscom
DROP TABLE #CommentText
-- -------------------------------------
--结束从sp_helptext提取
-- -------------------------------------
--删除用短横线创建的存储过程并重建原始的存储过程
--版本1.1,重建不必要的存储过程
ROLLBACK TRAN
DROP TABLE #output
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

 

--------------------

解密函数的存储过程可以依葫芦画瓢,具体如下:

Create PROCEDURE dbo.sp__function$decrypt
(@function sysname = NULL, @revfl int = 1)
AS
/*
exec dbo.sp__function$decrypt @function,0
如果第二个参数使用1的话,会给出该存储过程的一些提示。
*/
SET NOCOUNT ON
IF @revfl = 1
BEGIN
PRINT '警告:该存储过程会删除并重建原始的存储过程。'
PRINT ' 在运行该存储过程之前确保你的数据库有一个备份。'
PRINT ' 该存储过程通常应该运行在产品环境的一个备份的非产品环境下。'
PRINT ' 为了运行这个存储过程,将参数@refl的值更改为0。'
RETURN 0
END
DECLARE @intProcSpace bigint, @t bigint, @maxColID smallint,@intEncrypted
tinyint,@procNameLength int
select @maxColID = max(subobjid),@intEncrypted = imageval FROM
sys.sysobjvalues WHERE objid = object_id(@function)
GROUP BY imageval
--select @maxColID as 'Rows in sys.sysobjvalues'
select @procNameLength = datalength(@function) + 29
DECLARE @real_01 nvarchar(max)
DECLARE @fake_01 nvarchar(max)
DECLARE @fake_encrypt_01 nvarchar(max)
DECLARE @real_decrypt_01 nvarchar(max),@real_decrypt_01a nvarchar(max)
select @real_decrypt_01a = ''
-- 从sys.sysobjvalues里提出加密的imageval记录
SET @real_01=(SELECT imageval FROM sys.sysobjvalues WHERE objid =
object_id(@function) and valclass = 1 and subobjid = 0 )
--创建一个临时表
create table #output ( [ident] [int] IDENTITY (1, 1) NOT NULL ,
[real_decrypt] NVARCHAR(MAX) )
--开始一个事务,稍后回滚
BEGIN TRAN
--更改原始的存储过程,用短横线替换
SET @fake_01='ALTER FUNCTION '+ @function +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
/*'+REPLICATE('*', datalength(@real_01) /2 - @procNameLength)+'*/ END'
EXECUTE (@fake_01)
--从sys.sysobjvalues里提出加密的假的
SET @fake_encrypt_01=(SELECT imageval FROM sys.sysobjvalues WHERE objid =
object_id(@function) and valclass = 1 and subobjid = 0)
SET @fake_01='CREATE FUNCTION '+ @function +'() RETURNS INT WITH ENCRYPTION AS BEGIN RETURN 1
/*'+REPLICATE('*', datalength(@real_01) /2 - @procNameLength)+'*/ END'
--开始计数
SET @intProcSpace=1
--使用字符填充临时变量
SET @real_decrypt_01 = replicate(N'A', (datalength(@real_01) /2 ))
--循环设置每一个变量,创建真正的变量
--每次一个字节
SET @intProcSpace=1
--如有必要,遍历每个@real_xx变量并解密
WHILE @intProcSpace<=(datalength(@real_01)/2)
BEGIN
--真的和假的和加密的假的进行异或处理
SET @real_decrypt_01 = stuff(@real_decrypt_01, @intProcSpace, 1,
NCHAR(UNICODE(substring(@real_01, @intProcSpace, 1)) ^
(UNICODE(substring(@fake_01, @intProcSpace, 1)) ^
UNICODE(substring(@fake_encrypt_01, @intProcSpace, 1)))))
SET @intProcSpace=@intProcSpace+1
END
--通过sp_helptext逻辑向表#output里插入变量
insert #output (real_decrypt) select @real_decrypt_01
-- select real_decrypt AS '#output chek' from #output --测试
-- -------------------------------------
--开始从sp_helptext提取
-- -------------------------------------
declare @dbname sysname
,@BlankSpaceAdded int
,@BasePos int
,@CurrentPos int
,@TextLength int
,@LineId int
,@AddOnLen int
,@LFCR int --回车换行的长度
,@DefinedLength int
,@SyscomText nvarchar(4000)
,@Line nvarchar(255)
Select @DefinedLength = 255
SELECT @BlankSpaceAdded = 0 --跟踪行结束的空格。注意Len函数忽略了多余的空格
CREATE TABLE #CommentText
(LineId int
,Text nvarchar(255) collate database_default)
--使用#output代替sys.sysobjvalues
DECLARE ms_crs_syscom CURSOR LOCAL
FOR SELECT real_decrypt from #output
ORDER BY ident
FOR READ ONLY
--获取文本
SELECT @LFCR = 2
SELECT @LineId = 1
OPEN ms_crs_syscom
FETCH NEXT FROM ms_crs_syscom into @SyscomText
WHILE @@fetch_status >= 0
BEGIN
SELECT @BasePos = 1
SELECT @CurrentPos = 1
SELECT @TextLength = LEN(@SyscomText)
WHILE @CurrentPos != 0
BEGIN
--通过回车查找行的结束
SELECT @CurrentPos = CHARINDEX(char(13)+char(10), @SyscomText,
@BasePos)
--如果找到回车
IF @CurrentPos != 0
BEGIN
--如果@Lines的长度的新值比设置的大就插入@Lines目前的内容并继续
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +
@CurrentPos-@BasePos + @LFCR) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength-(isnull(LEN(@Line),0) +
@BlankSpaceAdded)
INSERT #CommentText VALUES
( @LineId,
isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,
@BasePos, @AddOnLen), N''))
SELECT @Line = NULL, @LineId = @LineId + 1,
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded = 0
END
SELECT @Line = isnull(@Line, N'') +
isnull(SUBSTRING(@SyscomText, @BasePos, @CurrentPos-@BasePos + @LFCR), N'')
SELECT @BasePos = @CurrentPos+2
INSERT #CommentText VALUES( @LineId, @Line )
SELECT @LineId = @LineId + 1
SELECT @Line = NULL
END
ELSE
--如果回车没找到
BEGIN
IF @BasePos <= @TextLength
BEGIN
--如果@Lines长度的新值大于定义的长度
While (isnull(LEN(@Line),0) + @BlankSpaceAdded +
@TextLength-@BasePos+1 ) > @DefinedLength
BEGIN
SELECT @AddOnLen = @DefinedLength -
(isnull(LEN(@Line),0) + @BlankSpaceAdded)
INSERT #CommentText VALUES
( @LineId,
isnull(@Line, N'') + isnull(SUBSTRING(@SyscomText,
@BasePos, @AddOnLen), N''))
SELECT @Line = NULL, @LineId = @LineId + 1,
@BasePos = @BasePos + @AddOnLen, @BlankSpaceAdded =
0
END
SELECT @Line = isnull(@Line, N'') +
isnull(SUBSTRING(@SyscomText, @BasePos, @TextLength-@BasePos+1 ), N'')
if LEN(@Line) < @DefinedLength and charindex(' ',
@SyscomText, @TextLength+1 ) > 0
BEGIN
SELECT @Line = @Line + ' ', @BlankSpaceAdded = 1
END
END
END
END
FETCH NEXT FROM ms_crs_syscom into @SyscomText
END
IF @Line is NOT NULL
INSERT #CommentText VALUES( @LineId, @Line )
select Text from #CommentText order by LineId
CLOSE ms_crs_syscom
DEALLOCATE ms_crs_syscom
DROP TABLE #CommentText
-- -------------------------------------
--结束从sp_helptext提取
-- -------------------------------------
--删除用短横线创建的存储过程并重建原始的存储过程
--版本1.1,重建不必要的存储过程
ROLLBACK TRAN
DROP TABLE #output
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

当前评分 3.2 , 共有 6 人参与

  • Currently 3.166667/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

C#实现“新华网头条的图片新闻”

星期六, 26 七月 2008 21:54 by lyboy99

源码如下:

......

using System.Drawing.Drawing2D;

......

 private void MakeImg(string text, int width, int height, Color color, string outPath)
        {
            FontFamily fontFamily = new FontFamily("文鼎特粗黑简");
            GraphicsPath path = new GraphicsPath();

            path.AddString(text, fontFamily, (int)FontStyle.Regular, 47, new Point(-9, 0), new StringFormat());  //字体大小为60 ,根据要生成图片的高度而定

            PointF[] dataPoints = path.PathPoints;  //获取路径的点信息

            byte[] pTypes = path.PathTypes;    //获取路径的点类型信息

            double widthpara = (double)width /( (height + 0.5) * text.Length);    //计算宽度参数
            Matrix matrix = new Matrix((float)widthpara, 0.0f, 0.0f, 1f, 0.0f, 0.0f);  //将文本在水平方向上缩小,在垂直方向上不变

            matrix.TransformPoints(dataPoints); //对points数据中的每一个成员进行矩形运算

            GraphicsPath newpath = new GraphicsPath(dataPoints, pTypes); //根据计算后的点重新构造路径

            Bitmap bmap = new Bitmap(width, height);
            Graphics g = Graphics.FromImage(bmap);
            g.Clear(Color.White);   //设置图片的背景
            g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;   //设置文本输出质量
            g.SmoothingMode = SmoothingMode.AntiAlias;
            SolidBrush redBrush = new SolidBrush(color);

            g.FillPath(redBrush, newpath);  //填充路径
            bmap.Save(outPath, System.Drawing.Imaging.ImageFormat.Png);
            g.Dispose();
            redBrush.Dispose();
        }

 

生成的时候,调用此函数即可。

当前评分 3.2 , 共有 6 人参与

  • Currently 3.166667/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Categories:   Asp.net技术
Actions:   E-mail | Permalink | 评论 (0) | Comment RSSRSS comment feed

常用英语900句

星期日, 13 七月 2008 11:33 by lyboy99

1. I see. 我明白了。
2. I quit! 我不干了!
3. Let go! 放手!
4. Me too. 我也是。
5. My god! 天哪!
6. No way! 不行!
7. Come on. 来吧(赶快)
8. Hold on. 等一等。
9. I agree。 我同意。
10. Not bad. 还不错。
11. Not yet. 还没。
12. See you. 再见。
13. Shut up! 闭嘴!
14. So long. 再见。
15. Why not? 好呀! (为什么不呢?)
16. Allow me. 让我来。
17. Be quiet! 安静点!
18. Cheer up! 振作起来!
19. Good job! 做得好!
20. Have fun! 玩得开心!
21. How much? 多少钱?
22. I'm full. 我饱了。
23. I'm home. 我回来了。
24. I'm lost. 我迷路了。
25. My treat. 我请客。
26. So do I. 我也一样。
27. This way。 这边请。
28. After you. 您先。
29. Bless you! 祝福你!
30. Follow me. 跟我来。
31. Forget it! 休想! (算了!)
32. Good luck! 祝好运!
33. I decline! 我拒绝!
34. I promise. 我保证。
35. Of course! 当然了!
36. Slow down! 慢点!
37. Take care! 保重!
38. They hurt. (伤口)疼。
39. Try again. 再试试。
40. Watch out! 当心。
41. What's up? 有什么事吗?
42. Be careful! 注意!
43. Bottoms up! 干杯(见底)!
44. Don't move! 不许动!
45. Guess what? 猜猜看?
46. I doubt it 我怀疑。
47. I think so. 我也这么想。
48. I'm single. 我是单身贵族。
49. Keep it up! 坚持下去!
50. Let me see.让我想想。
51. Never mind.不要紧。
52. No problem! 没问题!
53. That's all! 就这样!
54. Time is up. 时间快到了。
55. What's new? 有什么新鲜事吗?
56. Count me on 算上我。
57. Don't worry. 别担心。
58. Feel better? 好点了吗?
59. I love you! 我爱你!
60. I'm his fan。 我是他的影迷。
61. Is it yours? 这是你的吗?
62. That's neat. 这很好。
63. Are you sure? 你肯定吗?
64. Do l have to 非做不可吗?
65. He is my age. 他和我同岁。
66. Here you are. 给你。
67. No one knows . 没有人知道。
68. Take it easy. 别紧张。
69. What a pity! 太遗憾了!
70. Any thing else? 还要别的吗?
71. To be careful! 一定要小心!
72. Do me a favor? 帮个忙,好吗?
73. Help yourself. 别客气。
74. I'm on a diet. 我在节食。
75. Keep in Touch. 保持联络。
76. Time is money. 时间就是金钱。
77. Who's calling? 是哪一位?
78. You did right. 你做得对。
79. You set me up! 你出卖我!
80. Can I help you? 我能帮你吗?
81. Enjoy yourself! 祝你玩得开心!
82. Excuse me,Sir. 先生,对不起。
83. Give me a hand! 帮帮我!
84. How's it going? 怎么样?
85. I have no idea. 我没有头绪。
86. I just made it! 我做到了!
87. I'll see to it 我会留意的。
88. I'm in a hurry! 我在赶时间!
89. It's her field. 这是她的本行。
90. It's up to you. 由你决定。
91. Just wonderful! 简直太棒了!
92. What about you? 你呢?
93. You owe me one.你欠我一个人情。
94. You're welcome. 不客气。
95. Any day will do. 哪一天都行夕
96. Are you kidding? 你在开玩笑吧!
97. Congratulations! 祝贺你!
98. T can't help it. 我情不自禁。
99. I don't mean it. 我不是故意的。
100. I'll fix you Up. 我会帮你打点的。
101. It sounds great!. 听起来很不错。
102. It's a fine day。 今天是个好天。
103. So far,So good. 目前还不错。
104. What time is it? 几点了?
105. You can make it! 你能做到!
106. Control yourself! 克制一下!
107. He came by train. 他乘火车来。
108. He is ill in bed. 他卧病在床。
109. He lacks courage. 他缺乏勇气。
110. How's everything? 一切还好吧?
111. I have no choice. 我别无选择。
112. I like ice-cream. 我喜欢吃冰淇淋。
113. I love this game. 我钟爱这项运动。
114. I'll try my best. 我尽力而为。
115. I'm On your side. 我全力支持你。
116. Long time no see! 好久不见!
117. No pain,no gain. 不劳无获。
118. Well,it depends 噢,这得看情况。
119. We're all for it. 我们全都同意。
120. What a good deal! 真便宜!
121. What should I do? 我该怎么办?
122. You asked for it! 你自讨苦吃!
123. You have my word. 我保证。
124. Believe it or not! 信不信由你!
125. Don't count on me.别指望我。
126. Don't fall for it! 别上当!
127. Don't let me down. 别让我失望。
128. Easy come easy go. 来得容易,去得快。
129. I beg your pardon. 请你原谅。
130. I beg your pardon? 请您再说一遍(我没有听清)。
131. I'll be back soon. 我马上回来。
132. I'll check it out. 我去查查看。
133. It’s a long story. 说来话长。
134. It’s Sunday today. 今天是星期天。
135. Just wait and see! 等着瞧!
136. Make up your mind. 做个决定吧。
137. That's all I need. 我就要这些。
138. The view is great. 景色多么漂亮!
139. The wall has ears. 隔墙有耳。
140. There comes a bus. 汽车来了。
141. What day is today? 今天星期几?
142. What do you think? 你怎么认为?
143. Who told you that? 谁告诉你的?
144. Who's kicking off? 现在是谁在开球?
145. Yes,I suppose So. 是的,我也这么认为。
146. You can't miss it 你一定能找到的。
147. Any messages for me? 有我的留言吗?
148. Don't be so modest. 别谦虚了。
149. Don't give me that! 少来这套!
150. He is a smart boy. 他是个小机灵鬼。
151. He is just a child. 他只是个孩子。
152. I can't follow you. 我不懂你说的。
153. I felt sort of ill. 我感觉有点不适。
154. I have a good idea! 我有一个好主意。
155. It is growing cool. 天气渐渐凉爽起来。
156. It seems all right. 看来这没问题。
157. It's going too far. 太离谱了。
158. May I use your pen? 我可以用你的笔吗?
159. She had a bad cold. 她患了重感冒。
160. That's a good idea. 这个主意真不错。
161. The answer is zero. 白忙了。
162. What does she like? 她喜欢什么?
163. As soon as possible! 越快越好!
164. He can hardly speak. 他几乎说不出话来。
165. He always talks big. 他总是吹牛。
166. He won an election. 他在选举中获胜。
167. I am a football fan. 我是个足球迷。
168. If only I could fly. 要是我能飞就好了。
169. I'll be right there. 我马上就到。
170. I'll see you at six. 我六点钟见你。
171. IS it true or false? 这是对的还是错的?
172. Just read it for me. 就读给我听好了。
173. Knowledge is power. 知识就是力量。
174. Move out of my way! 让开!
175. Time is running out. 没时间了。
176. We are good friends. 我们是好朋友。
177. What's your trouble? 你哪儿不舒服?
178. You did fairly well! 你干得相当不错1
179. Clothes make the man. 人要衣装。
180. Did you miss the bus? 你错过公共汽车了?
181. Don't lose your head。 不要惊慌失措。
182. He can't take a joke. 他开不得玩笑。
183. He owes my uncle $100.他欠我叔叔100美元。
184. How are things going? 事情进展得怎样?
185. How are you recently? 最近怎么样?
186. I know all about it. 我知道有关它的一切。
187. It really takes time. 这样太耽误时间了。
188. It's against the law. 这是违法的。
189. Love me,love my dog. (谚语)爱屋及乌。
190. My mouth is watering. 我要流口水了。
191. Speak louder,please. 说话请大声点儿。
192. This boy has no job. 这个男孩没有工作。
193. This house is my own. 这所房子是我自己的。
194. What happened to you? 你怎么了?
195. You are just in time. 你来得正是时候。
196. You need to workout. 你需要去运动锻炼一下。
197. Your hand feels cold. 你的手摸起来很冷。。
198. Don't be so childish. 别这么孩子气。
199. Don't trust to chance! 不要碰运气。
200. Fasten your seat belt. 系好你的安全带。
201. He has a large income. 他有很高的收入。
202. He looks very healthy. 他看来很健康。
203. He paused for a reply. 他停下来等着·回答。
204. He repaired his house. 他修理了他的房子。
205. He suggested a picnic. 他建议搞一次野餐。
206. Here's a gift for you. 这里有个礼物送给你。
207. How much does it cost? 多少钱?
208. I caught the last bus. 我赶上了最后一班车。
209. I could hardly speak. 我简直说不出话来。
210. I'll have to try that. 我得试试这么做。
211. I'm very proud of you. 我为你感到非常骄傲。
212. It doesn't make sense. 这没有意义(不合常理)。
213. Make yourself at home. 请不要拘礼。
214. My car needs washing. 我的车需要洗一洗。
215. None of your business! 与你无关!
216. Not a sound was heard. 一点声音也没有。
217. That's always the case. 习以为常了。
218. The road divides here. 这条路在这里分岔。
219. Those are watermelons. 那些是西瓜。
220. What a nice day it is! 今天天气真好!
221. What's wrong with you? 你哪里不对劲?
222. You are a chicken. 你是个胆小鬼。
223. A lovely day,isn't it? 好天气,是吗?
224. He is collecting money. 他在筹集资金。
225. He was born in New York. 他出生在纽约。
226. He was not a bit tired. 他一点也不累。
227. I will be more careful. 我会小心一些的,
228. I will never forget it. 我会记着的。
229. It is Just what I need. 这正是我所需要的。
230. It rather surprised me. 那事使我颇感惊讶。
231. Just around the comer. 就在附近。
232. Just for entertainment. 只是为了消遣一下。
233. Let bygones be bygones. 过去的,就让它过去吧。
234. Mother doesn't make up. 妈妈不化妆。
235. Oh,you are kidding me. 哦,你别拿我开玩笑了。
236. She has been to school. 她上学去了。
237. Skating is interesting. 滑冰很有趣。
238. Supper is ready at six. 晚餐六点钟就好了。
239. That's a terrific idea! 真是好主意!
240. What horrible weather! 这鬼天气!
241. Which would you prefer? 你要选哪个?
242. Does she like ice-cream? 她喜欢吃冰淇淋吗?
243. First come first served. 先到先得。
244. Great minds think alike. 英雄所见略同。
245. He has a sense of humor. 他有幽默感。
246. He is acting an old man. 他正扮演一个老人。
247. He is looking for a job. 他正在找工作。
248. He doesn't care about me. 他并不在乎我。
249. I develop films myself. 我自己冲洗照片。
250. I felt no regret for it. 对这件事我不觉得后悔。
251. I get up at six o'clock. 我六点起床。
252. I meet the boss himself. 我见到了老板本人。
253. I owe you for my dinner. 我欠你晚餐的钱。
254. I really enjoyed myself. 我玩得很开心。
255. I'm fed up with my work! 我对工作烦死了!
256. It's no use complaining. 发牢骚没什么用。
257. She's under the weather. 她心情·不好。
258. The child sobbed sadly. 小孩伤心地抽泣着。
259. The rumor had no basis. 那谣言没有·根据。
260. They praised him highly. 他们大大地表扬了他。
261. Winter is a cold season. 冬天是一个,寒冷的季节。
262. You can call me any time. 你可以随时打电话给我。
263. 15 divided by3 equals 5. 15除以3等于5。
264. All for one,one for all. 我为人人,人人为我。
265. East,west,home is best. 金窝,银窝,不如自己的草窝。
266. He grasped both my hands. 他紧握住我的双手。
267. He is physically mature. 他身体己发育成熟。
268. I am so sorry about this. 对此我非常抱歉(遗憾)。
269. I can't afford a new car. 我买不起一部新车。
270. I do want to see him now. 我现在确实很想去见他。
271. I have the right to know. 我有权知道。
272. I heard some one laughing. 我听见有人在笑。
273. I suppose you dance much. 我想你常常跳舞吧。
274. I walked across the park. 我穿过了公园。
275. I'll just play it by ear. 我到时随机应变。
276. I'm not sure I can do it. 恐怕这事我干不了。
277. I'm not used to drinking. 我不习惯喝酒。
278. Is the cut still painful? 伤口还在痛吗?
279. It's too good to be true! 好得难以置信。
280. Jean is a blue-eyed girl. 珍是个蓝眼睛的女孩。
281. Let's not waste our time. 咱们别浪费时间了。
282. May I ask some questions? 我可以问几个问题吗?
283. Money is not everything. 金钱不是一切。
284. Neither of the men spoke. 两个人都没说过话。
285. Stop making such a noise. 别吵了。
286. That makes no difference. 没什么区别。
287. The price is reasonable. 价格还算合理。
288. They crowned him king. 他们拥立他为国王。
289. They're in red and white. 他们穿着红白相间的衣服。
290. We all desire happiness. 我们都想要幸福。
291. We just caught the plane 我们刚好赶上了飞机。
292. What shall we do tonight? 我们今天晚上去干点儿什么呢?
293. What's your goal in life 你的人生目标是什么?
294. When was the house built? 这幢房子是什么时候建造的?
295. Why did you stay at home? 为什么呆在家里?
296. Would you like some help? 今天真漂亮!
297. You mustn't aim too high 你不可好高骛远。
298. You're really killing me! 真是笑死我了!
299. You've got a point there. 你说得挺有道理的。
300. Being criticized is awful! 被人批评真是痛苦!
301. Did you enter the contest? 你参加比赛了吗?
302. Do you accept credit cards? 你们收信用卡吗?
303. Don't cry over spilt milk. 不要做无益的后悔。
304. Don't let chances pass by. 不要让机遇从我们身边溜走。
305. He owned himself defeated. 他承认自己失败了。
306. He seems at little nervous. 他显得有点紧张。
307. He strolls about the town. 他在镇上四处遛达。
308. Her tooth ached all night. 她牙疼了一整夜。
309. How about a drink tonight? 今晚喝一杯怎样?
310. I can do nothing but that. 我只会做那件事。
311. I get hold of you at last. 我终于找到你了。
312. I have a surprise for you. 我有一个意想不到的东西给你看。
313. I like all kinds of fruit. 我喜欢各种各样的水果。
314. I saw it with my own eyes. 我亲眼所见。
315. I will arrange everything. 我会安排一切的。
316. I wish I knew my neighbor. 我很想认识我的邻居。
317. I would like to check out. 我想结帐。
318. It has be come much cooler. 天气变得凉爽多了。
319. It's time you went to bed. 你早就该睡觉了。
320. No spitting on the street. 禁止在大街上吐痰。
321. She was totally exhausted. 她累垮了。
322. Show your tickets,please. 请出示你的票。
323. Thank you for your advice. 谢谢你的建议。
324. That's the latest fashion. 这是最流行的款式。
325. The train arrived on time. 火车准时到达。
326. There go the house lights. 剧院的灯光灭了。
327. They are paid by the hour. 他们按时取酬。
328. Things are getting better. 情况正在好转。
329. Wake me up at five thirty. 请在五点半叫醒我。
330. We are all busy with work. 我们都忙于工作。
331. Where do you want to meet? 你想在哪儿见面?
332. You can get what you want. 你能得到你想要的。
333. A barking dog doesn't bite! 吠犬不咬人。
334. Are you free this Saturday? 你这个星期六有空吗?
335. Be careful not to fall ill. 注意不要生病了。
336. Being a mother is not easy. 做一个母亲是不容易的。
337. Brevity is the soul of wit. 简洁是智慧的精华。
338. Cancer is a deadly disease. 癌症是一种致命的疾病。
339. Did you fight with others? 你又和别人打架了吗?
340. Don't dream away your time. 不要虚度光阴。
341. Don't keep me waiting long. 不要让我等得太久。
342. He has a remarkable memory. 他有惊人的记忆力。
343. He has completed the task. 他完成了这个任务。
344. He has quite a few friends. 他有不少的朋友。
345. He is capable of any crime. 他什么样的坏事都能干得出来。
346. He walks with a quick pace. 他快步走路。
347. He was not a little tired. 他很累。
348. His looks are always funny. 他的样子总是滑稽可笑。
349. How about going to a movie? 去看场电影怎么样?
350. I think I've caught a cold. 我想我得了感冒。
351. I was taking care of Sally. 我在照顾萨莉。
352. I wish I lived in NEWYORK. 我希望住在纽约。
353. I'm very glad to hear that. 很高兴听你这样说。
354. I'm your lucky fellow then. 我就是你的幸运舞伴啦!
355. It's none of your business! 这不关你的事儿!
356. No littering on the campus. 在校园内不准乱丢废物。
357. She is a good-looking girl. 她是一个漂亮女孩。
358. She mended the broken doll. 她修补了破了的洋娃娃。
359. So I just take what I want. 那么我只拿我所需要的东西。
360. Spring is a pretty season, 春天是一个好季节。
361. The figure seems all Right. 数目看起来是对的。
362. The stars are too far away. 星星太遥远了。
363. The whole world knows that. 全世界都知道。
364. Tomorrow will be a holiday. 明天放假。
365. We walk on the garden path. 我们走在花园小径上。
366. What you need is just rest. 你需要的就是休息。
367. What's your favorite steps? 你最喜欢跳什么舞?
368. You'd better let her alone. 你们最好是让她一个人呆会儿。
369. A lost chance never returns. 错过的机会永不再来。
370. Don't let this get you down. 不要为此灰心丧气。
371. He shot the lion with a gun. 他用枪把狮子打死了。
372. I don't think you are right. 我认为你是不对的。
373. I have never seen the movie. 我从未看过那部电影。
374. I haven't seen you for ages. 我好久没见到你了。
375. I was alone,but not lonely. 我独自一人,但并不觉得寂寞。
376. I went there three days ago. 我三天前去过那儿。
377. It's a friendly competition. 这是一场友谊赛。
378. It's very thoughtful of you. 你想得真周到。
379. May I speak to Lora,please? 我能和劳拉说话吗?
380. Mr.Wang is fixing his bike. 王先生在修他的自行车。
381. My brother is see king a job. 我弟弟正在找工作。
382. Nancy will retire next year. 南希明年就退休了。
383. Neither you nor he is wrong. 你没错,他也没错。
384. Opportunity knocks but once. 机不可失,时不再来。
385. She dressed herself hastily. 她匆忙穿上衣服。
386. She hired a car by the hour. 她租了一辆按钟点计费的汽车。
387. Someone is ringing the bell. 有人在按门铃。
388. The Smiths are my neighbors. 史密斯一家是我的邻居。
389. These shoes don't fit right. 这双鞋不太合适。
390. This is only the first half. 这才是上半场呢。
391. This pen doesn't write well. 这钢笔不好写。
392. Would you like a cup of tea? 你想喝杯茶吗?
393. You really look sharp today. 你今天真漂亮。
394. Another cat came to my house. 又有一只猫来到我家了。
395. Check your answers with mine. 把你的答案跟我的核对一下。
396. Don't keep the truth from me. 别瞒着我事实真相。
397. Everything has its beginning. 凡事都有开端。
398. He came to the point at once. 他一下子就说到了点子上。
399. He fell behind with his work. 他工作落后了。
400. He is the happiest man alive. 他是世界上最快乐的人。
401. He neither smokes nor drinks. 他既不抽烟也不喝酒。
402. He ran his horse up the hill. 他策马跑上小山。
403. He reminds me of his brother. 他使我想起了他的弟弟。
404. He was efficient in his work. 他工作效率高。
405. He will do anything but work. 只要不是干活,他干什么都行。
406. His father runs a restaurant. 他的父亲经营一家餐馆。
407. I have something to tell you. 我有事要告诉你。
408. I smelled a smell of cooking. 我闻到了烧菜做饭的味道。
409. I want to see the film again. 我真想再看一遍。
410. I've got too much work to do. 我要做的工作太多了。
411. Let's go for a walk,shall we? 咱们出去走走,好吗?
412. Please let me check the bill. 请让我核对一下帐单。
413. Plenty of sleep is healthful. 充足的睡眠有益于健康。
414. The sun comes up in the east. 太阳从东方升起。
415. This is because we feel pain. 这是因为我们能感到疼痛。
416. What do you desire me to do? 你想要我做什么?
417. What you said was quite true. 你所说的完全符合事实。
418. You can either stay or leave. 你或者留下或者离开。
419. Your life is your own affair. 你的生活是你自己的事。
420. All that glitters is not gold. 发闪光的不全是黄金。
421. Are you going to have a party? 你要举行聚会吗?
422. Aren't you concerned about it? 难道你不担心吗?
423. Don't forget to keep in touch. 别忘了保持联系。
424. He broke his words once again. 他又一次违背了诺言。
425. He is in his everyday clothes. 他穿着平常的衣服。
426. He is taller than I by ahead. 他比我高一头。
427. He led them down the mountain. 他带他们下山。
428. He was trained to be a lawyer. 他被培养成一名律师。
429. I am that l have to go. 我要走了。
430. I don't have any cash with me. 我身上没带现金。
431. I have been putting on weight. 我开始发胖了。
432. I have just finished the book. 我刚刚读完这本书。
433. I was late for work yesterday, 我昨天上班迟到了。
434. It appears to be a true story. 这故事似乎是真的。
435. I've got to start working out. 我必须开始做健身运动了。
436. Japan is to the east of China. 日本在中国的东部。
437. John asked Grace to marry him, 约翰向格雷斯求婚。
438. My watch is faster than yours. 我的表比你的表快。
439. New China was founded in l949. 1949年新中国成立。
440. Thanks for your flattering me. 多谢你的夸奖。
441. They charged the fault on him. 他们把过失归咎于他。
442. This car is in good condition. 这车性能很好。
443. This work itself is very easy. 这件工作本身很容易。
444. Truth is the daughter of time. 时间见真理。
445. We look forward to your visit. 期待您的光临。
446. What do you think of this one? 您觉得这个怎么样子
447. What's the weather like to day? 今天天气怎么样?
448. A red tie will match that suit. 红领带会配那件衣服。
449. A wet road is usually slippery. 潮湿的路往往是滑的。
450. Example is better than precept。 身教胜于言传。
451. Go right back to the beginning. 直接回到起始位置。
452. He does everything without aim. 他做事都漫无目标。
453. He is respectful to his elders. 他对长辈很恭敬。
454. He knows English better than I. 他比我懂英语。
455. He resolved to give up smoking. 他决心戒烟。
456. His talk covered many subjects. 他的报告涉及很多课题。
457. I fear that he drinks too much. 我担心他喝的酒太多了。
458. I have my hair cut every month. 我每个月都理发。
459. I want to have a part-time job. 我想有一份兼职工作。
460. I'm sorry to have bothered you. 对不起,打扰你了。
461. It is not so easy as you think. 这事没有你想象的那么简单。
462. Keep your temper under control. 不要发脾气。 .
463. Lying and stealing are immoral. 说谎和偷窃都是不道德的。
464. My efforts resulted in nothing. 我的努力毫无结果。
465. My false teeth are stuck to it. 我的假牙还在上边呢!
466. She is a composer for the harp. 她是位写竖琴曲的作曲家
467. Take me to the airport,please. 请送我去机场。
468. Talking with you is a pleasure. 和你谈话很愉快
469. The eggs are sold by the dozen. 鸡蛋按打卖。
470. The price just covers the cost. 这个价格正好抵消成本。
471. The sweater is of good quality. 这件毛衣质地很好。
472. The teacher got a little angry. 老师有点生气了。
473. Think carefully before you act. 三思而后行。
474. Walt invented the steam engine. 瓦特发明了蒸汽机。
475. We are divided in our opinions. 我们意见分歧。
476. What ever I said,he'd disagree. 不论我说什么他都不同意。
477. Who ever comes will be welcomed. 来的人我们都欢迎。
478. You look as if you didn't care. 你看上去好像满不在乎。
479. You should look at it yourself. 你应该亲自看看它。
480. Draw your chair up to the table. 把你的椅子拉到桌子旁边来。
481. He covered himself with a quilt. 他给自己盖上一条被。
482. He found my lecture interesting. 他觉得我讲课有趣。
483. He had a good many friends here. 他在这儿有很多朋友。
484. He is only about five feet high. 他大概只有五英尺高。
485. Her family are all music lovers. 她全家人都是音乐爱好者。
486. I am busy.How is your business? 我很忙。你的生意做得怎样?
487. I don't think much of the movie. 我认为那电影不怎么样。
488. I feel like eating an ice-cream. 我想吃一个冰淇淋。
489. I found him seated on the bench. 我发现他在椅子上坐着
490. I gave much time to the old car. 我在这辆破车上花了不少时间。
491. I lost the door key about here. 我在这附近掉了门钥匙。
492. I'm not guessing,I really know. 我不是在猜想,我真的知道。
493. It's time to tell her the truth. 是该告诉她真相的时候了。
494. Let's watch TV with a candle on. 咱们点上蜡烛看电视吧。
495. Most games cost about that much. 大部分游戏差不多都是这个价钱。
496. My parents want me to go abroad. 我父母想让我出国。
497. She has been collecting stamps. 她一直收集邮票。
498. There are many stars in the sky. 天上有很多星星。
499. We get to London this afternoon. 我们是今天下午到达伦敦的。
500. What about having a pizza first? 先吃点比萨饼怎么样?
701. His cake is three times bigger than mine.他的蛋糕比我的大三倍。
702. I am looking forward to your early reply. 希望早日得到你的答复。
703. I could say nothing but that I was sorry.我除了说“对不起”之外,什么也说不出来。
704. I don't know how to express my gratitude. 我不知道怎样来表达我的感激之情。我要赶飞机
705. I have to catch a plane. Could you hurry?你能快点吗?我好久没有她的消息了。
706. I haven't heard from her for a long time.我好久没有她的消息了。
707. I would like to wash the clothes for you. 我愿意帮你洗这些衣服。
708. Let me see your driver's license, please. 请让我看看你的驾驶执照。
709. She goes to work every day except Sunday. 除星期天外,他每天去上班。
710. Take a seat please, make yourself at home.请坐,随便一点。
711. The damage was caused by external forces. 损害是由外力引起的。
712. The doctor advised me to give up smoking.医生建议我戒烟。
713. The flowers make the room more beautiful.花使房间变得更加美了。
714. There is a good restaurant on the street.那条大街上有一个很好的餐馆。
715. They covered 120 miles in a single night.他们仅一夜就走了120英里路。
716. Try to look on the bright side of things.尽量从好的方面看。
717. What's your plan for the summer vacation?你暑假打算干什么?
718. You may pick whichever one you like best.你可以挑你最喜欢的。
719. You're welcome to stay with us next time.欢迎您下次再光临我们的饭店。
720. There was a murder in London yesterday. 昨天伦敦发生了一起谋杀案。
721. They stared at the huge tiger with awe. 他们敬畏地看着那头巨虎。
722. He never misses a chance to see a movie.他从不错过看电影的机会。
723. I cannot put up with my noisy roommates.我受不了我那些吵闹的室友了。
724. I will be back by the end of next month.我下个月底会回来。
725. I'm good at free and breast stroke.我擅长自由泳和蛙泳。
726. It was your turn to wash them yesterday. 昨天轮到你把它们洗干净。
727. Let's go out to have a dinner, shall we?咱们出去吃饭吧,好吗?
728. Please push the ladder against the wall.请把梯子靠在墙壁上。
729. She is standing in the front of the bus.她站在公共汽车的前部。
730. The doctor asked me to watch what I eat.医生要我注意饮食。
731. The grass is moist early in the morning.清晨的草地湿漉漉的。
732. The test finished. We began our holiday.考试结束了,我们开始放假。
733. This question is too complicated for me.这个问题对我说来太复杂了。
734. Tony speaks English and he plays tennis.托尼会说英语,打网球。
735. What is worth doing is worth doing well.只要你觉得某事值得去做,就一定要把它做好。
736. Would you like to go to a party with me?你想不想和我一起去参加一个聚会?
737. All at once, a rabbit came out of a hole.突然,一只兔子从一个洞中跑了出来。
738. All characters in the book are imaginary.书中所有的人物都是虚构的。
739. Do you feel like going to that new disco? 你想去那个新开的迪厅
740. Ducks know how to swim when they are born.鸭子天生会游泳
741. He spent most of his life gathering money.他一生大部分时间用来积聚钱财。
742. He usually stays at home with his pet dog.他通常跟他的爱犬待在家里。
743. How peaceful and beautiful the country is!多么平静美丽的国家呀!
744. I am told that you dance wonderfully well.我听说你的舞跳得特棒。
745. I have had several conversations with him.我已经和他谈过几次了。
746. It is the best film that I have ever seen.这是我所看过的最好的电影。
747. It's only a party in honor of my birthday.这只是为了庆祝我的生日而举行的晚会。
748. Learning English is like building a house.学英语象盖房子。
749. Listening with your heart is good for you.专心聆听别人说话对你有好处。
750. My grandpa died of hunger in the old days. 我爷爷在旧社会死于饥饿。
751. She feared staying alone in the farmhouse. 她害怕一个人留在农舍里。
752. She guided the tourists around the castle.她引导旅游者参观了这座城堡。
753. She runs everyday in order to lose weight.她每天都跑步是为了减肥。
754. She sang perfectly in the hall last night.她昨晚在大厅唱得非常好。
755. Somebody is always complaining to others.有人总是向别人抱怨。
756. They don't often have a bad day this year.他们今年的运气还不错。
757. We regard the matter as nothing important. 我们认为这件事情不重要。
758. We'll take our holiday sometime in August. 我们将在八月份的某个时候休假。
759. Could you direct me to the station, please?请问到车站怎么走?
760. Have you cleared your luggage with customs ?你的行李通关了吗?
761. He bothered me with a great many questions.他对我提了一大堆问题,真烦!
762. He does exercises every day in the morning.他每天早上锻练身体。
763. How do I control myself? I can't calm down.我怎能控制我自己?我无法冷静下来。
764. I dig songs and I like pop music very much.我特别喜欢歌曲和流行音乐。
765. I'd like to cash a traveler's check please.我想兑换旅行支票。
766. I'd like to pick sea shells this afternoon.今天下午我想去捡贝壳。
767. It's odd that they didn't reply our letter.他们没有给我们回信,这真奇怪。
768. John seldom gets together with his friends.约翰很少与朋友聚在一起。
769. Many people have been out of work recently.最近有许多人失业。
770. Please give my best regards to your family.请代我向你们全家致以最诚挚的问候。
771. Some people have compared books to friends.有些人把书比作朋友。
772. The bat together with the balls was stolen.球拍和球全被偷了。
773. The color of her dress suits her very well.她衣服的颜色很适合她。
774. The days get longer and the nights get shorter.白天变长了,黑夜变短了。
775. The dress doesn't fit her. She is too thin.这件衣服不适合她,她太瘦了。
776. The examination put a lot of stress on him.那次考试给了他很大的压力。
777. The mother sat the child at a little table.母亲安排孩子坐到小桌旁。
778. There is some difference between the twins.这对双胞胎有点儿不一样。
779. They insisted on staying rather than going.他们坚持留下来,而不愿意走
780. Trust me, the game is really worth playing.相信我,这游戏确实值得一玩。
781. Unlike her friends, she never gave up hope.与她的朋友的不同之处是,她从不放弃希望。
782. Well done! You are always doing a good job!干得不错!你总是干得很出色!
783. We're planning a tour to Italy this summer.我们计划今年夏天到意大利去旅行。
784. Were there any letters for me this morning?今天早上有我的信吗?
785. Why isn't Mrs. Lee's cat catching the mice?李太太的猫为何不在抓这些老鼠呢?
786. Your English is improving little by little.你的英语正在渐渐提高。
787. Could you tell me where I can wash my hands?请问洗手间怎么走?
788. Do you have any plans for the long weekend?你有办法打发这个漫长的周末吗?
789. He decided to bring a suit against his boss.他决定起诉他的老板。
790. He devoted his life to the study of science.他把毕生献给科学研究。
791. He had to choose between death and dishonor.他不得不在死亡和耻辱之间选择。
792. His previous attempts had been unsuccessful.他以前的尝试没有成功。
793. I determined that nothing should be changed.我决定什么都不改变。
794. I don't think it will lead to a good result.我认为这事不会有什么好结果。
795. I have 4 books and 2 magazines to check out.我有4本书和2本杂志要借。
796. I think I've filled in everything correctly.我想各项都填对了。
797. I'm not sure whether I have locked the door.我没把握是否锁了门。
798. It took him a little time to fix that watch.他很快就把表修理好了。
799. My father is at home looking for the ticket.我爸爸正在家里找票呢!
800. Not until last week did I get a work permit.直到上周我才拿到工作许可证。
801. She intends to make teaching her profession.她想以教书为职业。
802. The letter "x" stands for an unknown number.字母x代表未知数。
803. The sight of the dead body scared him stiff.看到尸体把他吓僵了。
804. There are lots of huge buildings in Beijing.在北京有许多高大的建筑物。
805. There is an interesting film on Channel one.在一频道有一部有趣的电影。
806. They plan to immigrate to Finland next year.他们计划明年移居芬兰。
807. We enjoyed driving along the new expressway.我们喜欢沿着新建的高速公路开车。
808. We need to cooperate perfectly to win the game.要想赢得比赛,我们需要密切配合。
809. We need more than listening. We need action!我们需要的不光是听得进意见,我们要的是行动。
810. Yes. I wouldn't go home early if I were you.是的,如果我是你,我不会早回家。
811. Your answer is satisfying. I feel satisfied.你的答案是令人满意的。我感到很满意。
812. Betty and Susan are talking on the telephone.贝蒂和苏珊正在通电话。
813. Great efforts ensure the success of our work.巨大的努力确保了我们工作的成功。
814. He has tasted the sweets and bitters of life.他已尝遍了人生的甜酸苦辣。
815. He said he was educated in the United States.他说他是在美国受的教育。
816. How do you like our English literature Prof.?你觉得我们的英国文学课的教授怎么样?
817. I am looking forward to your visit next week.我期待着你下周来访。
818. I feel I am the happiest person in the world.我觉得自己是世界上最幸福的人了。
819. I had to sit up all night writing the report.我不得不熬通宵写报告。
820. I hope we can see each other again some time.希望还能有相见的机会。
821. I saw him playing football on the playground.我看见他在操场上踢足球。
822. It is tomorrow that they will have a meeting.就在明天(而不是在别的某一天)他们要开会。
823. Let me tell you some details about clearance.让我告诉你一些通关的细节。
824. The brain needs a continuous supply of blood.大脑需要连续不断地供血。
825. The doctor's words made him feel comfortable.医生的话让他感觉很舒服。
826. The truth is quite other than what you think.事实真相和你所想的完全不同。
827. They stopped talking when their boss came in.当老板进来的时候;他们停止了交谈。
828. They were glad of the examination being over.他们为考试结束了而高兴。
829. This is by far the largest cake in the world.这是目前世界上最大的蛋糕了。
830. Whichever you choose, you won't be satisfied.不论你选择哪一个,你都不会满意。
831. Will you connect this wire to the television ?你把这根电线和电视机连上好吗?
832. His words are strongly impressed on my memory.他的话深深地铭记在我的心头。
833. Is this the fight bus for the Capital Library?这辆车到首都图书馆吗?
834. One third of this area is covered with forest.这一地区三分之一的地方都是森林。
835. They are arguing over who should pay the bill.他们为谁应该付款而争论不休。
836. Wait a moment, I'll be with you in an instant.等一下,我立刻就来。
837. You'll save time not waiting for the elevator.你可以节省等电梯的时间。
838. A clear conscience laughs at false accusation.只要问心无愧,无端的指责可以一笑置之。
839. I have a headache, and she has a stomachache.我头疼,她胃疼。
840. He glared at Bill, ready to teach him a lesson.他怒视着比尔,准备教训他一顿。
841. I assure you that you will feel no pain at all.我保证你根本不会觉得疼的。
842. I can't afford to go to a restaurant every day.每天都去餐馆吃饭,我真是支付不起。
843. I left at 6:00 so that I could catch the train.我六点钟出门,以便赶上火车。
844. I'm I have some rather bad news for you.我恐怕有些很坏的消息要告诉你。
845. Learn to say the fight thing at the fight time.学会在适当的时候说适当的话。
846. No wonder you can't sleep when you eat so much.你吃这么多难怪睡不着。
847. Please ask her to call me back when she's back.她回来时请让她给我回个电话。
848. There are a lot of people in the swimming pool.游泳池里挤满了人。
849. They have to work hard to support their family.他们必须努力工作来支持他们的家。
850. This way, he can kill two birds with one stone.这样他就能两全其美。
851. We are all taking medicine against the disease.我们都服药治疗疾病。
852. Would you please go to a dancing party with me?请你跟我一起去参加一个舞会好吗?
853. He usually drops in at my place on his way home.他常常在回家的路上顺便来看看我。
854. His vanity was hurt by their talking so frankly.他们坦率的谈话伤害了他的虚荣心。
855. How would you go to Beijing, by air or by train?你怎样去北京,是乘飞机还是坐火车?
856. I cannot express how glad I am to hear from him.我无法表达我接到他的信时有多高兴。
857. If Tom cannot keep his promise, he'll lose face.如果汤姆不能信守诺言,他就会丢面子。
858. I'll still love her even if she doesn't love me.即使她不爱我,我还仍然爱她。
859. I received an invitation, but I did not accept it.我收到-份请帖,但没有接受。
860. If I were you, I would not be bothered by English.如果我是你,就不会为英语烦恼了。
861. If you don't work, you will fail to pass the exam.如果你不学习,你考试就会不及格。
862. I'm thinking of hanging the lamp from the ceiling.我打算把灯吊在天花板上。
863. It is more important to be healthy than bony slim.健康永远比皮包骨头好。
864. Long ago, people believed that the world was flat.很久以前人们相信地球是平的。
865. Old tunes are sweetest and old friends are surest.老调最甜美,老友最可靠。
866. She makes it clear that she doesn't like swimming.她明确地表示她不喜欢游泳。
867. The constitution guards the liberty of the people.宪法保护人民的自由。
868. The doctor examined the soldier's wound carefully.大夫仔细检查了战士的伤口。
869. The harder I study, the better my English will be.我越努力,我的英语就会越好。
870. The sun was shining and the sky was crystal clear.阳光闪烁,天空湛蓝。
871. This cellar room is very damp in the rainy season.这间地下室在雨季非常潮湿。
872. Computers are becoming a part of our everyday life.电子计算机正渐渐成为我们日常生活的一部分。
873. Every man is fool sometimes, but none at all times.每个人都有愚蠢的时候,但是没有一个人永远愚蠢。
874. He dreamed of traveling to remote South Sea Islands.他曾梦想到遥远的南海诸岛去旅游。
875. How can I climb up that wall! I wish I were a bird!我怎么能够爬得上那堵墙?我要是一只鸟就好了!
876. However, Susan has not really made up her mind yet.然而,苏珊却还没有决定。
877. I really think a little exercise would do you good.我真的觉得做点运动对你有好处。
878. I will never forget the days that I spent with you.我永远都不会忘记和你一起度过的日子。
879. we got a bad headache, and my nose is running.我头痛得厉害,还流鼻涕。
880. Many young girls dream of being a fashion model.许多年轻女孩梦想成为时装模特儿。
881. Most of the earth's surface is covered by water.大部分的地球表面被水覆盖着。
882. Somebody's knocking at the door. I'll answer it.有人在敲门,我去开。
883. The number 13 bus will take you to the hospital.13路车会带你去医院。
884. They celebrated his birthday with a dance party.也们举办舞会来祝贺他的生日。
885. They misplaced this book under other categories.他们把它错放到另一个类别去了。
886. They played a shameful part in the whole affair.他们在这一事件中扮演了可耻的角色。
887. As a matter of fact, he was pretending to be ill.实际上,他是在装病。
888. I will speak against anything I know to be wrong.我会对所有我认为不对的事情直言不讳。
889. In spite of the heavy rain, she went to the shop.尽管下着大雨,她还是去了商店。
890. No matter what happened, he would not say a word.不管发生什么事,他也不会说一句话。
891. No one knows the location of the hidden treasure.谁也不知道藏宝地点在哪里。
892. The old lady enjoys a quiet life with her family.老太太和她的家人安享宁静的生活。
893. The population of the city is close to a million.这个城市的人口接近一百万。
894. We are prohibited from smoking on school grounds.我们被禁止在校园内抽烟。
895. Growth, however, brings new problems and concerns.不过,发展也带来了新的问题和顾虑。
896. He appears to be your friend but I doubt if he is.他看上去像是你的朋友,但我怀疑他是否是真心的。
897. I am so full that I would burst with another bite.我吃得如此之饱,我感觉我再吃一口肚子就要胀破了。
898. I have two cats. One is white, the other is black.我有两只猫,一只是白猫,另一只是黑猫。
899. I'm sorry, these 2 books are 3 days overdue.小姐,对不起,这两本书已经过期3天了。
900. Jalu has forgotten falling off his bicycle.詹露早忘掉他从白行车上摔下来这件事了。

当前评分 3.6 , 共有 12 人参与

  • Currently 3.583333/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5
Categories:   E语惊人
Actions:   E-mail | Permalink | 评论 (0) | Comment RSSRSS comment feed

基于XML的三层结构的WebGIS系统

星期三, 28 五月 2008 22:18 by lyboy99

基于XML的三层结构的WebGIS系统
1 引言
WebGIS是Intemet技术应用于GIS开发的产物, Intemet用户可以从
WWW的任意一个节点浏览WebGIS站点的空间数据,并且能够进行各种
空间检索、分析和制作专题图。到目前为止,WebGIS的处理模型主要有
三种:(1)基于GIS服务器的模型,这种模型是由客户端浏览器向通用网关
接口(Cn)发出服务请求,CGI接到服务请求后调用GIS服务器的地理空间数
据进行处理,最后将处理结果以静态HTML页面的形式发送到客户端。这
是典型的瘦客户、胖服务器模型。(2)基于客户端的模型,这种模型一般采
用配套的服务器端和客户端软件,把需要的地理空间数据从服务器端下载
到客户端,由客户端软件进行处理。(3)部分基于客户端的模型,这种模型
采用前端插件技术(Plug-in,ActiveX,JavaApplets等)将WebGIS服务器上
的部分处理功能移植到客户端。通过利用客户端的处理能力,平衡客户和
服务器两端的数据处理量,减轻网络传输负担。
以上几种都是C/S主从模型,对于GIS系统而言,由于是海量数据,
且由于其空间信息的复杂性,如果是基于GIS服务器的模型,虽然简化了
客户端,但把所有处理集中在服务器端,加大了服务器端处理的数据量和
网络传输负担;如果是基于客户端的模型,它虽然增强了客户端处理能力,
减少了服务器端处理的数据量和网络传输负担,但是由于客户端软件功能
有限,对于地理空间数据标准有局限性,需要及时对地理空间数据进行更
新;如果是部分基于客户端的模型,需要确定哪些数据和操作在服务器端
执行,哪些在客户端执行,软件的设计复杂,成本较高。
因此本文提出了利用XML的技术来实现三层网络结构的WebGIS系
统。该系统与传统的客户/服务器应用或是采用一般的数据传输方式(如
HFML等)的系统相比具有减少了网络流量、更有利于检索、可从多种不同
的数据源集成数据、开放性、可扩充性、可重用性等一系列特点。
2 XML及三层网络结构
2.1 XML,XSL和DOM
由于超文本标记语言(HyperText Markup Language, HTML)将文档
的内容及展现融合在一起使互操作性和可扩展性日益成为WWW的瓶颈,
推动了可扩展标记语言(eXtensibleMarkuplanguage,XML)的产生和发展。
XML是标准通用标记语言(Standard Generalized Markup Language,
SGML)的一个受限子集,继承了SGML的可扩充性、结构性和形式化,同
时却比SGML简单得多。它将文档的内容、展现和操纵分离开来,使得
SGML能在 Intenet上自如应用;能方便地定义文件类型;方便地制作和管
理用SGML定义的文件以及在网上方便地传输和共享这些文件。
文档在Web上进行交换,不仅要交换其内容,而且要交换其结构,这
就要求文档具有相同的体系结构。文档体系结构是由表示模型、展现模型、
操作模型和内核组成,其中内核包括内容组件及结构。XML用于表示文档
数据的内容、结构,它主要处于文档体系结构中表示模型的地位;可扩展
样式语言(eXtensibleStyle Language, XSL)用于表示数据的格式、展现,
即数据是如何向用户显示的,它处于文档体系结构中展现模型的地位;文
档对象模型(DocumentObiectModel,DOM)用于向用户提供一个操作的接
口,用户可以通过它对文档施行创建、存取、更新等操作,它处于文档体
系结构中操纵模型的地位。XML,XSL和DOM分别处于Web文档体系结构
中的不同位置,具有不同的作用;它们分工合作,共同构成 Web上的文
档支持系统,以给人们提供更大的方便。
2.2 三层网络架构
随着计算机在各行各业中的普遍应用,传统的客户/服务器模型已经
很难应付越来越复杂的应用和急速增长的数据交换。因为客户机端控制了
大量的信息,而数据需要在客户机与服务器之间不断交流,使网络系统变
得十分紧张;此外日益增多的客户连接数和系统用于管理、协调所有客户
连接的开销也需要服务器耗费一部分 CPU、内存资源;同时应用系统的
分散也导致了系统维护的困难,维护费用大大增加。因此需要一种新的模
型来解决这一问题,三层网络模型即客户机/应用服务器/数据服务器模
型就这样应运而生。事实上,每个应用,从个人计算机上的电子制表软件
到大型机上的账目支付系统都包含三个组件:展现组件、应用逻辑组件和
数据组件。展现组件集中于跟用户进行交互;应用逻辑组件执行计算并决
定应用的流向;数据组件管理信息使其必须在会话期间、计划关机及系统
失败的情况下都能持续。在三层网络架构中,展现组件、应用逻辑组件及
数据组件被分成截然不同的单元,如图1所示。


3 系统设计
3.1 应用XML于三层网络架构
三层客户/服务器架构并不是最近提出的,但是在三层架构上用XML
比起用HTML具有许多优越性。如果可获得的信息是以HTML的形式存在
的,那就很难自动地从不同的数据源比较和聚合数据。然而,如果相同的
数据以XML(在数据层)的形式获得,那么就可以将它们聚合在一起(在逻辑
应用层),然后为终端用户编辑有用的、想要的XML(通过展现层)展现给终
端用户。图2显示了XML应用于三层架构。中间层从多个数据源取得信息,
这些信息可以是XML形式的,也可以是其他数据库信息。中间层取得的信
息是简洁的、个人化的和精确的。与HTML不同,这种信息包含的是实际
的抽象数据,而不是显示出来的式样;至于数据的显示或者说是输出形式,
则可以根据用户的需要定制;如输出到浏览器、光盘、打印机等。中间层
服务器负责在正确的时候组装并交付正确的信息,这将WWW的流量减到
最小,并提供了高度的用户交互能力和满意程度。


图2 基于XML的三层网络模型
使用中间层来生成XML文档的原因有以下几点:
(1)由此生成的XML文档能包含从多个独立的数据库中所取得的数据;
(2)中间层采用一致的方法来识别数据的语义,将数据统一起来(如
XML),从而使数据的访问更加方便;
(3)可以从多个数据源生成XML数据。
事实上,在不同的应用系统中,中间层服务器的作用也有可能不同,
一般来说,中间层的作用有以下几点:
(1)暂时性地对数据聚集和规范化处理;
(2)永久存储元数据;
(3)使用对象模式来代替数据模式。
3.2 总体架构
本文是利用XML实现三层网络结构的WebGIS系统模型。XML不一定
是数据库的存储方式,但不管是什么数据库,都要转换为XML,让数据以
XML的形式在三层网络上传输。此外由于DOM主要是为用户提供一个操纵
XML文档的接口,所以它处于三层网络架构的中间服务器层。图3显示了
利用XML实现三层网络结构的 WebGIS系统的总体架构。


(1)客户端
在客户端只要求浏览器具有支持XML的功能。所谓的支持XML功能是
指能解析XML文件并在有格式文件如XSL的配合下将XML文件展现给用
户。
(2)中间层服务器
主要包含解析器(Parser)、文档存取接口(Document Access)、文档格
式(XSLFormat)以及其他文档或数据与 XML文档或数据的互转换器,用于
完成文档的解析、有效性校验、文档树型对象的生成和维护、XML文档的
格式化以及完成XML与其他文档或数据的互转换等功能。由于任何XML文
档都要通过解析器解析,所以图中没把解析器画出来,但解析器是不能少
的。因为系统需要提供标准的DOM接口,所以系统的内部数据组织必须是
对象化组织,每个节点都有其属性和行为,而在逻辑上, XML文档和
DTD(Document Type Definition,规定XML文档的语法)文档都是树型的。
文档存取接口(Document Access):向外界应用提供输出窗口,接口符合
DOMl.0,应用程序可以不管内部的具体实现,只需按照标准接口就可对
文档进行遍历和修改。Document Access是核心组件的中心协调机构,它
用内部数据形式(通常是树型结构)保存着由Parser传送来的XML文档和
DTD文档的结构信息,同时响应外界应用的调用信息。
XSL格式,也是存取组件的重要部分,因为XML并不是面向表现的,
它只是数据组织和交换的手段,其表现必须要结合XSL来实现。
XML与HTML,SGML及其他数据库间的互转换工具:HTML是当前
Web的主流标记语言,网上存在亿万用其组织的信息资源;SGML规范是
结构化文档的通用描述语言,也是文档内容保存的最为全面的一种描述形
式,相当的信息资源是用SGML储存的,因此我们必须尽可能地利用这些
已有的资源。HTML到XML的转换主要完成结构良好的工作和XSL生成工
作。XML到HTML的转换需要用户的定制(要素间的对应)和XSL描述。因为
XML是SGML的受限子集,所以XML与SGML间的转换可以由它们DTD的
变换来自动完成。XML与数据库的转换是现在研究的热点,具有良好结构
性的同时作为元语言的XML具有强大的描述能力,它可以声明一个要素的
数据类型,同时支持类的继承机制,其自描述的能力可以使其成为机器可
读的(Machine-readable)结构化文档,并可在少量的用户定制下方便地实
现与RDB和文档DB的转换。
(3)数据库端
数据库端就可以不止有一种数据库。中间层可以通过各种转换器将不
同的数据过滤成XML,然后进行处理。因而,数据库端事实上可以有各种
各样的数据库资源,如:Sybase,Oracle,Informix,MS SQL Server,
DB2以及 SGML,XML数据库,甚至可以将WWW上的HTML转换为XML
后存人数据库。
3.3 用XML描述空间数据
在上述的系统模型中,将其他格式的空间数据转换为XML格式或者空
间数据的XML描述是个很关键的问题。必须注意以下两个方面:
(1)确保XML文件的结构良好性和合法性。按照 W3C制定的XML标准
和OGC的规范严谨地书写和交换 XML文件,用DTD或Schema描述和定
义XML中使用的所有标志符,使得处理器获知XML的来源以及其中的空间
数据类型、属性和相互关系等有关地理信息。
(2)保持GIS数据格式的统一。尽管XML允许设计者自行定义自己的
XML标志,但保持WebGIS-XML定义的一致性是有利于数据处理和交互
的。
将其他格式的空间数据转换为XML格式由该系统的中间层来实现,由
于空间数据的格式的多样性,转换器最好利用面向对象的软件设计方法来
实现。就目前来说,很多空间数据的格式是商业秘密,这就很难将它们转
换为XML格式,因此需要GIS厂商提供自己的XML接口,最好符合上面两
点。下面是一个用XML描述的地图实例:
<map>
<area name=〃A省〃 capital=〃B市〃 population=〃30000000〃
Vdata=〃M20,20,L20,200,C20,200,200,250,250,200,a10,
5,10 0,0,-100,-120 a10,5 10 0, 0, -100, -50z〃/>
<city name =〃B市〃class=〃省会〃belong=〃A省〃population=〃
3000000〃cx=〃50〃cy=〃50〃
r=〃5〃/>
<river name=〃C河〃length=〃300km〃Vdata=〃M50,150,c50,
50,125,75 125,120 s200,150 200,100〃/>
</map>
这段文档描述了一个人口为三千万的区域A省,其省会为B市;一个人
口为三百万的省会城市B市,隶属于A省;一条长度为300km的河流。其中
A省和C河的地图数据存放在Vdata=后面的双引号中,B图的地理数据则有
其地理坐标(cx,cy)和半径为r来存储。通过编写专用程序,A省、B市、C
河可以矢量图形对象的形式在地图上表示为一个区域、点和曲线。而GIS
中最基本的图元对象就是点、曲线和区域。所以用XML描述地理信息是完
全可行的,并且更利于信息的检索。例如用户要查询人口大于一千万的省
或者省会为B市的省的名称,直接通过页面就可以检索到有关的信息。
4 系统特点
该应用系统与基于传统的客户/服务器和一般的数据库的应用系统相
比具有很多优势,采用三层网络架构及XML来构筑该系统很有必要,其系
统具有如下优点:
(1)减少了网络流量
在三层网络架构中,中间层软件一次性从远程数据库中获取满足客户
需要的信息,然后中间层软件与远程服务器之间的连接可以中止了。丰富
的数据发送给客户端之后,客户应用就可以直接使用这些数据,这时客户
端与中间层服务器之间的连接就可以中止了。此后,所有的计算都是基于
客户端的,这就减少了网络流量。
(2)更有利于检索
由于XML的标签能表示它所标志的内容的含义,这是计算机能理解
的,因而对这样的文档进行检索也更容易。
(3)可以从多种不同的数据源集成数据
虽然目前只是从XML数据源提取数据,但必要的时候也可以从其他数
据源提取,并在中间层将它们统一成 XML,然后再传送到客户端。这也
是该应用系统具有开放性和可扩充性的一个体现。
(4)开放性
该系统是以DOM国际标准接口向外 界提供操纵XML文档功能的,所
以是Web开放系统的一员。
(5)可扩充性
Web用户可以该系统为基础系统,添加各种自己需要或感兴趣的应用
程序,从而形成了一个符合用户需求的可部分定制的扩展支持系统。
(6)组件化
分离了系统和Web文档的展现组件、应用逻辑组件和数据组件。该系
统的这三个组件的分离是通过基于三层网络架构实现的,而Web文档的这
三个组件的分离是通过XML实现的。
(7)重用性
这里指的重用性不仅指应用组件具有的重用性,还,指信息的重用性。
可以通过复制中间层的应用逻辑于不同的系统实现应用的重用性,而信息
是以XML方式存放和传输的,计算机能够理解,重用性高。
5 结束语
XML技术作为一种网络系统中通用的数据表达、交换格式在WebGIS
中的研究和应用将会越来越深入和广泛。在本文中,空间数据采用XML的
标准和规范进行描述,由于XML的数据内容和表现形式是分开的,这样就
易于交互和检索。在系统结构上,采用三层网络结构,减少了网络流量。
空间数据的XML描述规范和标准是一个重要的研究方向,因为它是将其他
的数据格式转换为XML的基础。

 

当前评分 2.9 , 共有 7 人参与

  • Currently 2.857143/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

基于中间件的分布式系统开发过程

星期三, 28 五月 2008 22:10 by lyboy99

近年来,随着计算机技术,Intenet/Intranet的不断发展及企业对计算
成本的不断要求,计算机应用系统由集中式向分布式计算发展。软件的体
系结构也从C/S模式转向了多层应用体系结构。这种结构必然需要中间件
支持,而面向对象分析方法是当今软件开发的主要方法,所以,分布式对
象中间件成为一个主要的发展方向。运用这种技术,开发者可以将运行在
网络中的分布对象集成为分布式应用,面向对象分析方法中的继承和复用
技术有助于软件复用和控制系统的改动,降低维护的费用,使得系统的改
动可以快速准确的予以实现。
为了使开发者更专注于业务逻辑的实现,在分布式对象中间件的基础
上又实现了一些分布式应用所必需的服务:目录管理、安全管理、分布式
事务管理等。这就是所谓的“应用服务器”,它极大方便了多层分布式应用
系统的开发,促进了中间件应用的发展。因而,也使得中间件技术受到人
们广泛的关注,对软件业产生了巨大的影响。基于中间件的多层分布式体
系结构,符合软件工程的化整为零的原则,同时满足方法论的要求。
1 软件构件和中间件
一个构件是一个系统中最重要的、基本上独立的、可替换的部分,在
已定义好的软件体系中执行清楚的功能,适合提供一系列接口的物理实现。
中间件是基于构件技术,处于两种或多种软件之间 (通常是在应用程
序和操作系统、网络操作系统或数据库管理系统之间)传递信息的软件;它
使用户能使用一种脚本语言来选择和连接已有的服务,从而生成简单程序
的软件开发工具。中间件涉及软件的各个领域,是供公用应用程序编程接
口的软件。中间件在操作系统、网络和数据库之上,应用软件的下层,总
的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵
活、高效地开发和集成复杂的应用软件。
中间件应具有以下的特点:
(1)中间件的平台无关性。中间件是用来解决应用之间的互连性,它提
供了一个公共的应用通信机制和数据接口,以屏蔽各类通信协议之间的差
异和实现通信协议间尽可能地完全映射。除此之外,还用来控制数据传输
过程中的流量、加密、并发等问题。数据接口用来实现分布式环境中异构
系统之间数据的共享,从而做到平台无关性。
(2)中间件具有良好的可靠性。良好的可靠性是中间件技术开始以来就
追求的目标,随着技术标准的形成,中间件已经可以提供可靠的稳定性。
(3)中间件具有较高的效率。中间件的工作机制为:当客户端的应用程
序需要调用分布式环境下某个服务器的数据或服务时,中间件系统负责接
收客户端的请求,查找数据源或服务,并建立相应服务或数据同相应服务
器之间的对应关系。完成连接后,还要负责结果的返回。因此,中间件实
现了客户和服务器透明性,所以要求必须减少请求响应时间。因此中间件
提供的对服务或数据的查询效率是比较高的。
中间件技术的应用非常广泛。目前主要的分布式中间件技术标准有:
Microsoft的以COM/DCOM为基础的COM+,Java的JavaBeans和EJB,
OMG组织的CORBA等。可以说,计算机界很久以前就有用分布式构件集
成处于分布式环境中的各种应用系统的想法,但一直未能真正实现,其中
的一个主要原因是分布式中间件技术标准的缺乏。正是由于出现了以上较
为成熟的标准,才使得分布式系统通过分布式中间件开发构造由梦想走向
现实。
2 基于中间件的分布式系统开发过程
基于中间件的分布式系统开发过程隶属于基于构件的软件工程
(CBSE)范畴。


CBSE(Component-Based Software Engineering)是指用装配可重用
软件构件的方法来构造应用程序。CBSE不仅仅是简单地应用对象要求代
理建立一个代码库,或从Internet上下载相关控件,还需要策略而系统地进
行全局考虑和规划。它包含了系统分析、构造、维护和扩展等各个方面。
它具有即插即用,以接口为核心及标准化等特点,CBSE开发过程如图1
所示。
基于中间件的分布式系统开发过程在需求分析等各个过程中有其自身
的特点,本文就这些方面予以探讨。
2.1 基于中间件的分布式系统开发过程可行性研究
相对于传统软件工程早期的可行性研究,增加了对软件工作的分布式
环境的研究、软件工作平台的配置研究以及所涉及的原有系统的改造问题,
并且逐步过渡到以体系结构为指南的可行性研究,这与CBSE的特点是分
不开的。
20世纪80年代以来,大部分应用系统采用的是两层的C/S模式。其
中,一个客户机负责数据的表示、采集和处理工作,而服务器负责数据的
集中存储。这种“胖客户”的C/S体系结构只能工作在有限的环境中,但是,
当客户数目过多或未知时,该结构就无能为力了。同时,应用程序庞大,
应用逻辑无法复用。除此之外,系统修改要将所有的程序版本发给每一个
客户机,成本较高。
于是,从“胖客户”C/S结构出发,人们把部分“业务逻辑”转移到数据
库服务器上进行,演变成一种“胖服务器”的C/S结构。但是,该体系结构
性能仍不能满足分布式应用程序的要求,应用逻辑的复用度也很有限。
由此可以看出,这种C/S结构当业务规则很复杂时,系统很难管理,
业务规则的更改也将变得异常困难,甚至不得不重新开发,这是该类体系
结构不能适应大型分布式应用的主要原因。因此,人们又在客户端和服务
器中间抽象出应用逻辑层,组成三层(多层)分布式体系结构,将企业的业
务过程实现集中在该层中。所谓的多层应用体系结构,就是将在客户机和
服务器之间增加某些应用逻辑层,将业务规则封装在这些层中。它们可能
分布在一个或多个物理服务器上,甚至客户机,使得业务规则的改变比较
容易实现。这种多层的体系结构必然要利用中间件技术,将企业的业务规
则分别实现于各个组件中,数据和实现细节予以安全隐藏,仅展示其提供
的服务接口。该体系结构如图2所示。
分布式系统的可行性研究主要侧重于某一种体系结构能否满足于企业
需求,这是不同于传统软件工程的。对于开发分布式应用系统而言,就是
考虑三层(多层)应用体系结构能否满足分布式需求,技术上是否可行。实
际上,也是选择分布式中间件的过程(图3)。


2.2 基于中间件的分布式系统开发过程需求分析
对于基于中间件的分布式应用,需求分析和软件设计阶段由原来的从
头开发产品变成了体系结构的选择、中间件的选择和开发工具的选择。系
统分析员必须在系统需求和使用的分布式中间件之间进行权衡,并且作出
折中的考虑。除此之外,同时还要在体系结构和接口之间进行权衡。
一般而言,分布式应用采用面向对象分析方法。因为该方法已被软件
工程界公认为是具有发展潜力的重要的需求分析方法。而且,目前分布式
中间件技术基本上也是分布式技术与面向对象分析设计相互作用的产物。
面向对象分析是分布式系统开发过程中的问题定义阶段,输出的是对问题
域清晰和精确的定义。传统软件工程的系统分析产生一组面向过程的文档,
用于定义目标系统的功能。面向对象分析主要产生一种描述系统功能及问
题域特征的综合文档。后者在更大的问题域中考虑问题,是对现实问题更
高层的抽象。因此,在分布式环境下分析其应用,就是将问题抽象为一组
相互作用的实体和各实体之间的关系。从而,系统分析将产生一个能够控
制的方式运行的模型。
(1)识别分布式对象。即从问题抽象出分布式系统中包含的组件,遵循
如下原则:①使用分布式问题域中单个名词或名词短语。②分布式对象名
称必须简洁、精确,而且易于理解。③尽量使用用户熟悉的标准词汇。④
尽量使组件的复用度较高。
最后,可以提取类似组件间相同点,进行“泛化”。泛化后还要寻找类
似组件间差异,即“特化”,以提高软件复用度。需要指出的是,对分布式
对象的识别是一个主观的过程,因人而异,会产生不同的结果。但是,在
对象的物理分布上,要遵循简洁、有效和复用的原则,并不是所有的应用
逻辑组件都分布在服务器上。有时,为了更好地解决问题,一些只针对极
少数客户机的逻辑组件也可能放在客户机上,这正是多层体系结构的体现。
(2)用例设计。所谓用例(Use Case)就是用户与系统,系统内部各部分
之间相互交互、对话的场景。它描述了系统工作机制,从而揭示需要建造
的系统模型,并检验可否满足需求。对于分布式系统而言,应该从分布式
环境出发,找出系统的用例来,它对系统的功能设计及最后的测试都有很
大的意义,这方面应该请教有关应用领域的专家。
(3)对象的设计与调整。这是标志对象后更进一步的设计,对标志出的
对象(组件)确定属性和行为,也就是数据成员和方法。这样,整个分布式
系统的运作可看成处于分布式环境中的各对象之间的相互通信及其引发的
动作。
属性是问题域中对象性质的刻画,行为为分布式对象应该展现的外部
服务之总和。可以通过提取外部服务名称及大致功能,标志分布式对象间
消息传递予以识别。最后,要通过实际运行的场景中的事件顺序对对象的
设计予以调整。


2.3 基于中间件的分布式系统开发过程的设计
三层分布式体系结构上面已经介绍,其表示层、应用逻辑层和数据存
储层是彼此分离的。其优点如下:
具有可伸缩性,这是因为它的数据库连接之类的资源可以共享,每一
个消耗资源的客户应用程序并不直接访问数据库服务器,而是由客户应用
程序与业务逻辑层进行通信。一个应用逻辑实例可以向多个客户提供服务,
降低了资源消耗,提高了伸缩性。
应用逻辑实体可以独立于任何客户应用程序来设计。这样对于很多应
用程序来说,就提供了非常的灵活性和重复使用的潜力。定义公共接口之
后的业务逻辑的封装,使得开发者可以创建可重复使用的服务的一个载体。
当然,也可以用新的应用逻辑来组合,以创建新的应用程序。此外,公共
功能也很容易更新,以适应商业规则的变化。
三层的体系结构使得现有的旧系统更容易地被集成:只需将现有系统
封装在业务逻辑中,客户程序只需关心怎样访问业务逻辑,不必关心依赖
的各种不同应用系统。
(1)表示层的设计。表示层向用户提供数据输入输出和响应用户动作并
控制用户的界面。一般而言,目前主要有两种:图形用户界面和基于Web
的用户界面。
(2)应用逻辑层。该层主要用来实施业务规则和数据完整性规则等。它
向表示层提供服务,这些服务具有通用性,即服务适合于所有的应用程序。
只有这样设计,才能达到高效复用的目标。但是,它并不清楚数据以何种
方式存储及存储的地方,这要依赖于数据存储层。所以,应用逻辑层还要
提供数据访问服务,以执行数据的检索和存储。
(3)数据存储层。主要负责数据的存储,因此,它的设计主要是数据存
取的设计,必须确定上面分析中对象 (组件)模型到关系模型的映射。一般
有三种策略:①只把超类转换成表:超类把所有子类的属性和子类与其他
实体间的关系都收集起来,并加入一个辨别属性。这种方法便于查询所有
的子类的信息,但也会造成存储空间的浪费。②只把子类转换成表:把各
个子类分别转换成互补相关的表,而超类中的属性及其他实体的关系都由
各个表收集。这种方法是最容易理解及编码的,但超类更新比较困难,超
类的改动将影响到所有涉及到的子类的表的改动,而且查询所有子类信息
也不方便。③一对一关联。将子类和超类都转移成表,并在它们之间建立
一对一的关联。该方法概念清晰,超类更新与上一种方法一样,但可以查
询所有子类信息,只是不得不进行连接操作,速度较慢。然而,它的概念
较为清晰。
除了上面所讨论的之外,还应该注意层间接口的设计、安全控制和事
务管理。一般而言,目前的中间件基本上都提供安全控制和事务管理。但
开发人员必须细心地设计接口,因为体系结构本来就是具有长期影响的系
统接口的集合。
2.4 基于中间件的分布式系统的测试和维护
用中间件来建造一个分布式应用系统,测试是必不可少的工作。软件
工程中测试可分为三种形式:单元测试、集成测试和系统测试。对于分布
式系统而言,就是组件的单独测试、组件集成和系统的最后测试,方法不
外乎黑盒子法和白盒子法。相对而言,组件的测试黑盒子法用得多一些,
因为有些组件源码不公开。而且,由于开始系统并未建立,所以可能会写
一些桩模块,这些测试概念可详见资料。
基于中间件的分布式系统的后期维护,主要就是业务规则变化的维护。
如前所述,该维护比较简单。而且,改动较为容易。
3 结束语
基于中间件的分布式系统开发过程具有适用范围广、应用效率高的特
点,但其效率的发挥必须要有大量标准的中间件或中间件技术来支持。同
时,必须要在充分进行领域分析的基础上,构造并生成大量的基本构件。
只有中间件技术标准比较成熟的情况下,才可能通过中间件生成分布式应
用系统。

当前评分 3.0 , 共有 5 人参与

  • Currently 3/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

基于极限编程的测试分析

星期三, 28 五月 2008 22:01 by lyboy99
基于极限编程的测试分析
1 引言
一套软件开发方法是由一系列用来生产软件的规则和实际操作组成。
传统的方法拥有过多的规则、操作和文档,要正确地实施,需要制定出相
应的制度标准作保证。而极限编程则属于易于实施的轻量级的软件开发方
法。
极限编程(eXtreme Programming, XP)是一个简明的工作平台,
它是基于对影响软件开发速度的因素进行考查而发展起来的。这种开发方
式适用于经常面临需求不明确或者需求快速变化的小到中型的软件开发团
队。相对于现有的编程方式,XP有两个明显的变化:
(1)XP的实践规则是“适应性”(Adaptive),这使得我们能适应并
勇于面对开发过程中的各种变化。
( 2 ) XP 不仅仅强调测试,而且更要求实现高效的自动化测试
(Automated Test)。
另外,XP要求以清晰易懂且容易扩展的方式写代码,而且源代码的质
量比以往显得更加重要,这就对开发人员的素质提出更高的要求。
XP去掉了传统“重量级”软件开发方法中一些妨碍进度甚至干扰开发
人员的部分,归纳出四个要素一― ― 沟通、简洁、反馈、勇气,即用XP
的价值准则来指导软件工程师编写程序。对如今的软件行业来说,XP跨出
了极其重要的一步。极限编程本身的内容相当丰富,本文将从测试实践方
面对XP进行讨论。
2 极限编程的测试
在XP实现中有四步解决策略——-计划、设计、测试、开发。与任何
一种软件开发方式一样,测试是一个相当重要的环节。
对于测试,XP要求体现出测试先行(Test First)的特点,这也是测
试驱动开发方式的核心所在。开发人员在编写代码之前和开发过程中设计
单元测试代码,客户在确定功能之后就进行功能测试的设计。
测试主要分为两种:(1)程序员编写的单元测试(Unit Test)利用
这些测试确保程序以他们所期望的方式运行;(2)客户提供的满意度功
能测试(Functional Test),用来确保系统整体上以他们期望的方式运行。
另外,单元测试中要求体现集成测试的原则,即持续集成的测试。
2.1 单元测试
单元测试的设计过程实际上就是项目设计的过程。对初步的交互接口
和数据接口类中将被使用的方法以及相关的重要接口编写测试,一旦单元
测试设计完成,类的接口也就自然实现。当用户需求改变时,相应的测试
需要改变或者增加相应的测试模块。
单元测试是XP中的主要的测试实践。由一系列实践组成,增强了项目
代码的可靠性。
(1)所有代码必须有相应的单元测试——类单元。
(2)单元测试的设计是在开发前或编码的过程中实施。
(3)单元测试模块的设计尽可能的简单和直接,有利于测试的进行。
(4)每个可能出错的方法都要实现对应的单元测试,发现了错误必须要
增加相应的测试。
(5)同一个项目的开发人员共同使用该单元测试模块。
(6)单元测试必须自动化,并且可以以清楚的信息表示测试通过或失
败。
(7)软件项目同时验证和维护单元测试。
在开发的每个阶段都要通过单元测试,否则不能加入版本控管。通过
单元测试让开发人员确信所写的程序代码是可行的,并且留下线索和注释
给其他开发人员帮助理解原作者的思想。单元测试的失败可以让开发人员
下决心重整程序代码。
2.2 功能测试
测试除了单元测试之外还有客户的功能测试,也可以称之为满意度测
试。在我们实际应用中,我们可能会提供给用户多个版本的系统(如α ,β
版),而针对不同版本的目标不同,客户端的测试用例也有所区别,主要体
现客户不同的测试要求。
客户为每个功能编写满意度测试,这些测试也说明整个系统该有什么
样的功能,通常满意度测试的编写需要开发人员的协助。理想情况下,客
户的满意度测试必须在程序编写的最后一个阶段性迭代之前完成。满意度
测试是用来帮助客户评估设计的完成度,同时让客户知道某个部份是不是
可以发布,因而不是所有的满意度测试都非要通过不可——重要的是把握
所能容忍的缺陷级别。
2.3 持续集成的测试
对于集成而言,我们要求尽量频繁进行,而集成的测试当然也是要同
步的。实际上,集成测试是在单元测试中体现的,因为集成测试是属于开
发过程中的小阶段迭代的结果。
持续集成的环境中,自动测试是必要的前提。对于实现一个足够快的
集成支持来说,就需要一个足够级别的自动测试,即获得一个确切的工具
环境。
我们在开发过程中尽量在每个工作日对系统都至少进行一次集成测
试,而且是用专用计算机来做这项工作。减少了其他的干扰,更利用结对
开发人员的检测,如果无法完全通过测试,就重新更改相应的集成,直到
完全通过。
集成离不开自动测试,自动测试中同样需要持续集成。
(1)始终拥有一个稳定的可执行系统,即使失败,也可以回溯到上一
次集成。
(2)可以把代码尽快集成到系统中进行测试,尽早并持续获得各种反
馈,并作出相应的调整。
(3)由于测试与开发同步进行,因而减少了最终测试的前导时间,提高
项目进展效率。
3 测试对其他实践的支持
XP具体的需求和实践规则包括计划游戏(Planning Game)、小版本发
布(Small Release) 、简单设计(Simple Design) 、结对开发(Pair
Programming)、测试(Test-First)、重构(Refactoring)、现场客户(On-site
Customer) 、持续集成 (ContinuousIntegration) 、代码公有(Collective
Ownership)、编码标准(Coding Standard)。
XP把所有的实践结合起来,而且必须把各种实践结合起来才能确保其
最有效地彻底执行。就测试而言, XP要求实现自动化测试(Automated
Test),主要涉及持续集成和重构,为其他实践提供了相当的支持,在迭代
过程中有充分体现。
3.1 迭代式开发
迭代式开发(Iteration)是极限编程的关键,它是贯穿于整个开发过程的
原则。迭代必须及时进行测试,验证迭代效果和促使迭代的合理规划。每
次迭代都需要完整的测试体系来确保迭代计划的完成,否则失败的测试需
要重新进入下一次迭代计划及时地进行调整(图1描述了迭代过程)。
将开发进度划分为多个迭代,每次迭代给出确定的时间(最好少于20
天)。不要太早对开发任务进行计划,而应该在每个迭代开始前计划确定本
次迭代要完成的任务,不要过早增加任何功能,应该着眼于目前所急需的
部分,额外增加的任何东西都会延缓进度。
3.2 持续集成
持续集成是团队或者个人控制向系统交付代码,而且每次迭代更需要
集成和测试,一次集成也可能需要多次很小的迭代,这样我们就可以使得
测试过程变得简单,而开发过程也变得容易控制。
持续集成是通过频繁的构造来实现的。每次集成需要花费一定的时间,
因为新的代码集成会引入一些错误或冲突,会带来破坏原系统的可能性。
而高效的测试和重构可以减少集成的更改量和冲突的可能性。集成测试同
样要求要100%通过,否则就应该放弃相应的更改,这也表明对当前集成
的功能还没有足够的理解,因而测试和集成同样是密不可分的。
3.3 重构
伴随着测试开发过程,我们经常需要进行重构,重构是不改变系统行
为的系统更改,是一项改变代码而不至于改变功能的技巧,但是开发人员
通过修改来提高一些非功能性的质量,简单性、灵活性、易懂性和性能。
如果开发人员发现可重用的代码,也会重构代码以抽出重复部分。
重构就是测试、更改、再测试、再更改、…。
XP要求用最简单的代码实现可运作的程序,但这是需要坚持的边做边
学。重构是从自己的程序代码中学到的东西,它使得代码的生命周期更久,
保持代码的简洁,让接手的人更不容易出错。
4 测试先行的应用开发
传统的测试设计都是在系统开发基础上进行的,而极限编程中的开发
方式就是测试驱动的模式——测试先行。测试先行要求在测试对应的系统
模块的开发前进行该模块测试的设计,更重要的是,仅当不能通过测试时
才对代码进行重新编写。下面我们就讨论XP中主要的测试实践——单元测
试。
4.1 测试框架
在XP的测试中我们利用了测试框架这个概念。利用测试框架对测试进
行自动验收,可以让开发测试人员简单地进入测试接口,输入相关的输入
并得到期望的输出。测试框架也可以将输入转换成XML文件或者其他文件
形式,然后运行文件中的测试,进而为每个测试显示结果——通过或失败。
实质上就是一种自动化的黑箱测试,一切单元测试都在测试框架中实现。
针对测试集把相应的测试用例送入测试接口进行测试,得到反馈的测
试结果,或者通过,或者失败,通过则进行下一步测试,失败则根据相关
错误信息进行更正修改,然后再进入测试集用相应的用例进行测试。图2
所示为国外应用较广泛的JUnit框架结构。
特定的开发平台需要特定的测试框架,我们可以利用现有比较成熟的
测试框架,如JUnit,CppUnit,PerlUnit以及VBUnit等。尽管测试框架在
不同语言平台内实现,但是它们在语言允许限度内的工作方式是相同的。
4.2 测试先行的应用实例
有了测试框架之后,我们就要建立测试类的子类来存储相关测试,这
些测试就是用来检测要被测试的对象。测试用例包括所需的所有测试方法,
测试框架收集所有测试,并逐个执行它们,这样可以确保每次测试都在清
晰的环境下进行,一个测试中的错误也不会影响其他测试。 设计和实
现之间通常存在着一个空隙。我们通过用户素材得到一个接口层次上的初
步设计,然后进行单元测试的设计,确切地说我们是边考虑测试设计边进
行项目分析。
我们同样还利用JUnit来对实例进行分析。一个公司员工的基本资料在
网页上显示。
先写类测试:
public void testClerk( ){
Clerk c=new Clerk("Luis",”1”);
assertEquals ("Luis”, c。getName())
assertEquals(1,c。getLevel());
}
编译无法通过,我们需要创建类的实现:
public clas Clerk {
String name;
int level=-1;
public Clerk(String name, int level){
this.Name=name;
this.level=level;
}
public String getName(){return name;}
public int getLevel(){return level;}
}
再运行testClerk(),通过测试,接下来,再创建一个测试:
public void testtoXml(){
Clerk c=new Clerk("Tom”,-1);
assertEquals("<name>Tom</name>",c.toXml());
}
编译没有通过,因为我们还没有声明实现Clerk中的toXml()方法:
public String toXml(){return null;}
编译运行,测试失败:
public String toXml(){
return "<name>”十name + "</name>";
}
测试通过。我们接着加入另一个测试:
Clerk c1=new Clerk ("Jane",1); .
assertEquals("<name level= \ ”1 \ ”>Jane< / name>” ,
c1.toXml ());
编译通过,然后运行,失败。因为在toXml()中缺少了相关的功能,我
们继续增加相应的功能代码:
public String toXml(){
retnm” <namee”+ (level<0 ?””:”level=\””+level+”\””) + “>”
+ name + “</name>”;
{
最后我们开始考查自己的代码,分析重构的必要性。实际最终我
们可能会把代码重整为下面的结构,这也是代码清晰简洁的原则要求。
Private String toLevel(){
if(level<0)
return””;
else
return” level=\””+level+”\ ””;
}
public String toXml(){
return” <name” + toLevel() + ”>” + name + ”</name>”;
}
接着我们就可以继续下一步的测试设计,也就是对于类的其他相关方
法的设计过程,该方法测试通过的同时,还要保证所有的原有测试完全能
够通过。该实例的实现过程实质上也体现了一点:只有当一个失败的测试
时才写新的程序代码。
4.3 测试的特性分析
在开发过程中进行测试的设计所需的时间花费要比对系统相关错误的
修复少得多。使用先行测试代替死板的CASE工具使得详细设计的过程变
得互动、迭代和平滑。把单元测试作为文档交给项目程序员,也可以加强
团队交流学习,有助于后期的开发协作。
测试过程给我们同样带来了很多反馈,指导我们继续写出更多的单元
测试。用户功能的变更要求相应的测试设计的改进,然后在迭代开始时,
对项目要进行全面测试,而且在每次集成的时候测试模块也要相应的更新。
这种测试先行的设计思路不但最真实地记录了详细设计的过程,同时
也填补了接口层次设计和实现之间的空隙。当我们完成了单元测试的设计,
真正要实现类变得非常容易,相应的接口参数变得一目了然,类接口和状
态很自然地呈现了出来。把系统生产代码从测试代码中分离出来,简化了
以往复杂的开发过程。
如图3所示,利用独立管理和接口来简化设计。对象的复杂程度直接
关系到完全测试它的难度系数。从设计的角度来说,当无法做到完全测试
这条规则时,我们就应该考虑重新设计,因为原先的设计包含了太多的职
责状态。在测试提出不合适的接口要求时,我们就要利用重构来设计新的
接口进行测试。
另外,对于非接口方法的测试实现需要做一些改进。对非接口方法的
测试意味着测试依赖于类的实现而非类的接口,也就是说,即使类的接口
不变,该类的实现的变化也会造成测试的变化。要解决这个问题就需要把
这些非接口方法接口化。或者直接接口化这些方法,或者为这些方法和状
态建立独立的类来实现接口。这样就可以确保:测试依赖接口而不是依赖
实现。对象的接口是稳定的,它封装了实现,而实现是相对可变的。
5 测试先行与传统测试的比较
5.1 测试先行优于传统测试
传统测试理论的目标和相关的工具最关心的问题是程序的正确性,它
们的目的是寻找代码中存在的Bug。它们的测试对象是已经存在的代码。
而在XP中相关的单元测试并不完全是一种质量保证体系和发现Bug的工
具,一定程度上应当说是一种设计方法。
在XP项目的设计中,单元测试的设计过程其实就是表达项目设计的过
程,接着所写的代码则是为了测试单元测试是否正确,换句话说,也就是
代码的实现是否能够符合项目设计的过程。在重构的过程中,单元测试不
破坏程序的可观察行为:不产生新的Bug和不破环原 先的设计。
在XP项目的开发过程中,以测试先行的驱动方式来实现单元测试,从
而测试可以不受实现的干扰,独立地表达各自的意图,而代码则是来实现
这个目标。通过这样处理我们可以有最完整的测试,得到最简洁的运行代
码,以及一个目标明确的成品。而如果使用后测试(Test-last)的方式,那么
这两个方面很容易融合成一个问题,因为目的性受到了实现的干扰。
显然,XP中单元测试的思想和传统的单元测试是一个颠倒的过程。传
统思路是用单元测试来测试代码,而XP中则是让代码来测试单元测试——
编写单元测试 (各接口声明)、编写代码通过单元测试、重构、重新运行测
试。
5.2 现有的测试先行方法的不足
任何开发方式存在优点的同时也必然有其不足之处,极限编程也同样
存在着一些问题:
(1)XP要求程序员开发单元测试,但是没有明确指出测试用例的选材。
(2)XP表明何时开始写单元测试用例,但是没有指导何时开始测试。
(3)XP要求写尽能想到的所有测试,但是无法判断测试用例是否足够。
不论在系统级还是单元中都要利用测试来确保集成的系统依然继续正
确运作。测试的增长主要面对新的功能设计,同时避免重复,如果发现反
馈的是低质代码,就需要我们扩大测试覆盖面。在实际应用中,我们需要
不断积累经验,来提高测试效率,这也是当前针对不足的最有效的方式。
6 结论
测试既是一种资源也是一种职责,极限编程中的先行测试刚刚起步,
尤其在国内,开发人员正在考虑覆盖所有功能的基本测试的必要性。利用
开发测试的平行,解决了功能测试和设计同步。而在某些情况下还不能完
全建立自动的单元测试和功能测试,开发中缺乏一定的预见性,易造成结
构性的质量问题,但是XP也正在考虑让测试用例来代替更多的功能说明。
编程和测试的结合有利于赢得更高的生产效率,节省调试时间。作为
一种新的软件工艺, XP 的一个中心理念是以适应式,而非预测式
(Predictive)的方式开发软件。在实际开发应用过程中应该认真学习和理解
XP的思想,特别注意和认识XP的对策。

当前评分 2.8 , 共有 6 人参与

  • Currently 2.833333/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5