﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Java海阔天空</title><link>http://www.blogjava.net/lzhidj/</link><description>编程是我的生活，但生活不仅仅是编程。</description><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 18:56:30 GMT</lastBuildDate><pubDate>Tue, 28 Apr 2026 18:56:30 GMT</pubDate><ttl>60</ttl><item><title>最新发布：《Android自定义组件开发详解》</title><link>http://www.blogjava.net/lzhidj/archive/2016/02/27/429461.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Sat, 27 Feb 2016 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2016/02/27/429461.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/429461.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2016/02/27/429461.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/429461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/429461.html</trackback:ping><description><![CDATA[<div>继两年前发布《轻松搞定extjs》之后，本人的第二个作品。<br /><br />下载地址：http://download.csdn.net/detail/lifenote/9445898<br /><br /><br /><br />封面 1</div><div>序<span style="white-space:pre">	</span>2</div><div>捐助说明<span style="white-space:pre">	</span>5</div><div>目 录<span style="white-space:pre">	</span>7</div><div>第一章 &nbsp;View的绘图流程<span style="white-space:pre">	</span>12</div><div>1.1、概述<span style="white-space:pre">	</span>12</div><div>1.2、Activity的组成结构<span style="white-space:pre">	</span>13</div><div>1.3、View树的绘图流程<span style="white-space:pre">	</span>15</div><div>1.3.1 测量组件大小<span style="white-space:pre">	</span>16</div><div>1.3.2 确定子组件的位置<span style="white-space:pre">	</span>17</div><div>1.3.3 绘制组件<span style="white-space:pre">	</span>18</div><div>1.4、说点别的<span style="white-space:pre">	</span>22</div><div>1.5 练习作业<span style="white-space:pre">	</span>22</div><div></div><div>第二章 &nbsp;Graphics2D API<span style="white-space:pre">	</span>23</div><div>2.1、概述<span style="white-space:pre">	</span>23</div><div>2.2、Point类和PointF类<span style="white-space:pre">	</span>23</div><div>2.3、Rect类和RectF类<span style="white-space:pre">	</span>25</div><div>2.4、Bitmap类和BitmapDrawable类<span style="white-space:pre">	</span>32</div><div>2.5、Canvas类与Paint类<span style="white-space:pre">	</span>34</div><div>2.5.1 绘图概述<span style="white-space:pre">	</span>34</div><div>2.5.2 Paint类<span style="white-space:pre">	</span>34</div><div>2.5.3 Canvas类<span style="white-space:pre">	</span>39</div><div>2.6 练习作业<span style="white-space:pre">	</span>63</div><div></div><div>第三章 &nbsp;使用Graphics2D实现动态效果<span style="white-space:pre">	</span>64</div><div>3.1 概述<span style="white-space:pre">	</span>64</div><div>3.2 invalidate()方法<span style="white-space:pre">	</span>65</div><div>3.3 坐标转换<span style="white-space:pre">	</span>69</div><div>3.4 剪切区（Clip）<span style="white-space:pre">	</span>73</div><div>3.5 案例：指针走动的手表<span style="white-space:pre">	</span>82</div><div>3.6 练习作业<span style="white-space:pre">	</span>88</div><div></div><div>第四章 &nbsp;双缓存技术<span style="white-space:pre">	</span>89</div><div>4.1 双缓存<span style="white-space:pre">	</span>89</div><div>4.2 在屏幕上绘制曲线<span style="white-space:pre">	</span>90</div><div>4.3 在屏幕上绘制矩形<span style="white-space:pre">	</span>99</div><div>4.4 案例：绘图App<span style="white-space:pre">	</span>104</div><div>4.4.1 绘图属性<span style="white-space:pre">	</span>106</div><div>4.4.2 软件参数<span style="white-space:pre">	</span>108</div><div>4.4.3 绘图缓冲区<span style="white-space:pre">	</span>109</div><div>4.4.4 撤消操作<span style="white-space:pre">	</span>111</div><div>4.4.5 图形绘制<span style="white-space:pre">	</span>113</div><div>4.4.6 绘图区<span style="white-space:pre">	</span>118</div><div>4.4.7 主界面<span style="white-space:pre">	</span>119</div><div>4.5 练习作业<span style="white-space:pre">	</span>122</div><div></div><div>第五章 &nbsp;阴影、渐变和位图运算<span style="white-space:pre">	</span>123</div><div>5.1 概述<span style="white-space:pre">	</span>123</div><div>5.2 阴影<span style="white-space:pre">	</span>123</div><div>5.3 渐变<span style="white-space:pre">	</span>125</div><div>5.3.1 线性渐变（LinearGradient）<span style="white-space:pre">	</span>126</div><div>5.3.2 径向渐变（RadialGradient）<span style="white-space:pre">	</span>130</div><div>5.3.3 扫描渐变（SweepGradient）<span style="white-space:pre">	</span>135</div><div>5.3.4 位图渐变（BitmapShader）<span style="white-space:pre">	</span>138</div><div>5.3.5 混合渐变（ComposeShader）<span style="white-space:pre">	</span>140</div><div>5.3.6 渐变与Matrix<span style="white-space:pre">	</span>142</div><div>5.4 位图运算<span style="white-space:pre">	</span>143</div><div>5.4.1 PorterDuffXfermode<span style="white-space:pre">	</span>143</div><div>5.4.2 图层（Layer）<span style="white-space:pre">	</span>146</div><div>5.4.3 位图运算技巧<span style="white-space:pre">	</span>148</div><div>5.5 案例1：圆形头像<span style="white-space:pre">	</span>152</div><div>5.6 案例2：刮刮乐<span style="white-space:pre">	</span>156</div><div>5.7 练习作业<span style="white-space:pre">	</span>161</div><div></div><div>第六章 &nbsp;自定义组件<span style="white-space:pre">	</span>163</div><div>6.1 概述<span style="white-space:pre">	</span>163</div><div>6.2 自定义组件的基本结构<span style="white-space:pre">	</span>164</div><div>6.3 重写onMeasure方法<span style="white-space:pre">	</span>166</div><div>6.4 组件属性<span style="white-space:pre">	</span>175</div><div>6.4.1 属性的基本定义<span style="white-space:pre">	</span>175</div><div>6.4.2 读取来自style和theme中的属性<span style="white-space:pre">	</span>181</div><div>6.5 案例1：圆形ImageView组件<span style="white-space:pre">	</span>186</div><div>6.6 案例2：验证码组件CodeView<span style="white-space:pre">	</span>190</div><div>6.7 练习作业<span style="white-space:pre">	</span>202</div><div></div><div>第七章 &nbsp;自定义容器<span style="white-space:pre">	</span>204</div><div>7.1 概述<span style="white-space:pre">	</span>204</div><div>7.2 ViewGroup类<span style="white-space:pre">	</span>205</div><div>7.2.1 ViewGroup常用方法<span style="white-space:pre">	</span>205</div><div>7.2.2 ViewGroup的工作原理<span style="white-space:pre">	</span>208</div><div>7.2.3 重写onLayout()方法<span style="white-space:pre">	</span>213</div><div>7.3 CornerLayout布局<span style="white-space:pre">	</span>217</div><div>7.3.1 基本实现<span style="white-space:pre">	</span>217</div><div>7.3.2 内边距padding<span style="white-space:pre">	</span>224</div><div>7.3.3 外边距margin<span style="white-space:pre">	</span>228</div><div>7.3.4 自定义LayoutParams<span style="white-space:pre">	</span>238</div><div>7.4 案例：流式布局（FlowLayout）<span style="white-space:pre">	</span>246</div><div>7.5 练习作业<span style="white-space:pre">	</span>256</div><div></div><div>第八章 &nbsp;Scroller与平滑滚动<span style="white-space:pre">	</span>257</div><div>8.1 概述<span style="white-space:pre">	</span>257</div><div>8.2 认识scrollTo()和scrollBy()方法<span style="white-space:pre">	</span>258</div><div>8.3 Scroller类<span style="white-space:pre">	</span>264</div><div>8.4 平滑滚动的工作原理<span style="white-space:pre">	</span>271</div><div>8.5 案例：触摸滑屏<span style="white-space:pre">	</span>272</div><div>8.5.1 触摸滑屏的技术分析<span style="white-space:pre">	</span>272</div><div>8.5.2 速度跟踪器VelocityTracker<span style="white-space:pre">	</span>273</div><div>8.5.3 触摸滑屏的分步实现<span style="white-space:pre">	</span>274</div><div>8.6 练习作业<span style="white-space:pre">	</span>285</div><div></div><div>第九章 &nbsp;侧边栏<span style="white-space:pre">	</span>287</div><div>9.1 概述<span style="white-space:pre">	</span>287</div><div>9.2 使用二进制保存标识数据<span style="white-space:pre">	</span>289</div><div>9.2.1 位运算符<span style="white-space:pre">	</span>289</div><div>9.2.2 位运算的常用功能<span style="white-space:pre">	</span>292</div><div>9.3 继承自ViewGroup的侧边栏<span style="white-space:pre">	</span>293</div><div>9.4 继承自HorizontalScrollView的侧边栏<span style="white-space:pre">	</span>304</div><div>9.5 练习作业<span style="white-space:pre">	</span>312</div><div></div><div>第十章 &nbsp;加强版ListView<span style="white-space:pre">	</span>313</div><div>10.1 概述<span style="white-space:pre">	</span>313</div><div>10.2 ListView的基本使用<span style="white-space:pre">	</span>314</div><div>10.3 ListItem随手指左右滑动<span style="white-space:pre">	</span>318</div><div>10.4 向右滑动删除ListItem<span style="white-space:pre">	</span>326</div><div>10.5 滑动ListItem出现删除按钮<span style="white-space:pre">	</span>336</div><div>10.5.1 列表项专用容器ExtendLayout<span style="white-space:pre">	</span>337</div><div>10.5.2 列表项能滑出删除按钮的ListView<span style="white-space:pre">	</span>342</div><div>10.5.3 定义布局文件<span style="white-space:pre">	</span>350</div><div>10.5.4 显示ListView<span style="white-space:pre">	</span>351</div><div>10.6练习作业<span style="white-space:pre">	</span>353</div><div></div><div>案例代码说明<span style="white-space:pre">	</span>354</div><div></div><img src ="http://www.blogjava.net/lzhidj/aggbug/429461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2016-02-27 16:08 <a href="http://www.blogjava.net/lzhidj/archive/2016/02/27/429461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我们，来谈谈界面设计之一：重心</title><link>http://www.blogjava.net/lzhidj/archive/2014/03/04/UEUI.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Tue, 04 Mar 2014 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2014/03/04/UEUI.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/410572.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2014/03/04/UEUI.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/410572.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/410572.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 界面设计是一个锈花工作，大到整体布局，小到一个像素的宽度，一个地方做得不到位都会让设计失去价值。关注开发中的方方面面，这是一种习惯，一种信仰，一种生活态度。这不仅仅是工作。&nbsp;&nbsp;<a href='http://www.blogjava.net/lzhidj/archive/2014/03/04/UEUI.html'>阅读全文</a><img src ="http://www.blogjava.net/lzhidj/aggbug/410572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2014-03-04 10:43 <a href="http://www.blogjava.net/lzhidj/archive/2014/03/04/UEUI.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于SSH2框架构建JavaEE应用程序（3）</title><link>http://www.blogjava.net/lzhidj/archive/2011/02/26/345219.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Sat, 26 Feb 2011 00:27:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2011/02/26/345219.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/345219.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2011/02/26/345219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/345219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/345219.html</trackback:ping><description><![CDATA[<span  style="color: #2c2c2c; font-family: Arial, Helvetica, sans-serif; font-size: 14px; line-height: 22px; ">
<h2 style="line-height: 33px; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: 33px; font-weight: bold; font-size: 16pt; font-family: 黑体; ">五、</span><span style="line-height: 33px; font-weight: bold; font-size: 16pt; font-family: 黑体; ">面向接口编程</span></h2>
<div style="line-height: 22px; "><span style="line-height: 33px; font-weight: bold; font-size: 16pt; font-family: 黑体; "><br style="line-height: 33px; " />
</span></div>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><span style="line-height: 22px; font-size: 10.5pt; font-family: 宋体; ">在我看来，面向对象编程（<font face="Times New Roman" style="line-height: 22px; ">OOP</font><font face="宋体" style="line-height: 22px; ">）最有魅力对开发技术改进最有影响力的就是接口，接口定义一套规范或标准，如何实现取决于他的实现类，这给开发人员提供了足够的灵活性，大大增强了系统的可塑性，为开发人员提供了更加先进有效的扩展性能。</font><font face="Times New Roman" style="line-height: 22px; ">JDBC</font><font face="宋体" style="line-height: 22px; ">是接口应用最典型的示例之一，</font><font face="Times New Roman" style="line-height: 22px; ">Java&nbsp;JDK</font><font face="宋体" style="line-height: 22px; ">定义了一组接口，如</font><font face="Times New Roman" style="line-height: 22px; ">Connection</font><font face="宋体" style="line-height: 22px; ">、</font><font face="Times New Roman" style="line-height: 22px; ">Statement</font><font face="宋体" style="line-height: 22px; ">、</font><font face="Times New Roman" style="line-height: 22px; ">ResultSet</font><font face="宋体" style="line-height: 22px; ">等，但并不作出具体的实现，事实上，</font><font face="Times New Roman" style="line-height: 22px; ">sun</font><font face="宋体" style="line-height: 22px; ">公司也没有能力去实现，因为不同的</font><font face="Times New Roman" style="line-height: 22px; ">DBMS</font><font face="宋体" style="line-height: 22px; ">有不同的数据组织格式，如何连接数据库、如何执行</font><font face="Times New Roman" style="line-height: 22px; ">SQL</font><font face="宋体" style="line-height: 22px; ">语句、如何处理返回的结果集，</font><font face="Times New Roman" style="line-height: 22px; ">sun</font><font face="宋体" style="line-height: 22px; ">公司无从知晓，所以，通过接口实现数据访问的工作巧妙地转移到了数据库提供商，不得不说这招实在高明。</font></span></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><span style="line-height: 22px; font-size: 10.5pt; font-family: 宋体; "><font face="宋体" style="line-height: 22px; "><br style="line-height: 22px; " />
</font></span></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><span style="line-height: 22px; font-size: 10.5pt; font-family: 宋体; ">在我们的系统中，合理利用接口的特征能有效提高系统的扩展性和灵活性，尤其<font face="Times New Roman" style="line-height: 22px; ">Spring</font><font face="宋体" style="line-height: 22px; ">的出现，通过对</font><font face="Times New Roman" style="line-height: 22px; ">IOC</font><font face="宋体" style="line-height: 22px; ">的强化，更加突出了接口的作用，学习者更容易从代码级别理解接口的意义。</font><font face="Times New Roman" style="line-height: 22px; ">Spring</font><font face="宋体" style="line-height: 22px; ">无污染非侵入式的设计，降低了组件替换和功能扩展的成本，为开发人员打开了程序开发的另一扇窗。</font></span></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><span style="line-height: 22px; font-size: 10.5pt; font-family: 宋体; "><font face="宋体" style="line-height: 22px; "><br style="line-height: 22px; " />
</font></span></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><span style="line-height: 22px; font-size: 10.5pt; font-family: 宋体; ">并不是系统中的所有组件都需要提供接口，定义接口时应该先明确功能扩展点，对于那些比较固定有一定格式的代码则无需定义接口，通常情况下，为业务类定义一个接口是不错的选择，业务变更是家常便饭，为业务类提供接口有利于我们主动适应业务的变化。</span></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><span style="line-height: 22px; font-size: 10.5pt; font-family: 宋体; "><br style="line-height: 22px; " />
</span></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><span style="line-height: 22px; font-size: 10.5pt; font-family: 宋体; ">Eclipse<font face="宋体" style="line-height: 22px; ">将&#8220;重构&#8221;做得比较强大了，如果你的业务类还没有接口，通过&#8220;</font><font face="Times New Roman" style="line-height: 22px; ">Refactor-&gt;Extract&nbsp;Interface</font><font face="宋体" style="line-height: 22px; ">&#8221;菜单可以自动为业务类生成相应的业务接口。</font></span></p>
</span>
<img src ="http://www.blogjava.net/lzhidj/aggbug/345219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2011-02-26 08:27 <a href="http://www.blogjava.net/lzhidj/archive/2011/02/26/345219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于SSH2框架构建JavaEE应用程序（2）</title><link>http://www.blogjava.net/lzhidj/archive/2011/02/21/344754.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Mon, 21 Feb 2011 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2011/02/21/344754.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/344754.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2011/02/21/344754.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/344754.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/344754.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 四、数据传输、数据模型与Dozer数据传输是程序员实现各种功能时刻需要考虑的问题，从数据模型的建立，到数据模型的转换，从数据的合法性验证，到数据类型的转化，我们要时刻小心，精心设计与组织。数据模型与数据传输可简单可复杂，完全取决于设计者的经验与意图，当然，项目的规模也是我们应该考虑的因素，一个小型项目实在没必要将问题复杂化。我们首先考虑数据从视图（View）传输到数据库（DB）...&nbsp;&nbsp;<a href='http://www.blogjava.net/lzhidj/archive/2011/02/21/344754.html'>阅读全文</a><img src ="http://www.blogjava.net/lzhidj/aggbug/344754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2011-02-21 11:43 <a href="http://www.blogjava.net/lzhidj/archive/2011/02/21/344754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于SSH2框架构建JavaEE应用程序（1）</title><link>http://www.blogjava.net/lzhidj/archive/2011/02/18/344613.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Fri, 18 Feb 2011 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2011/02/18/344613.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/344613.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2011/02/18/344613.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/344613.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/344613.html</trackback:ping><description><![CDATA[<span style="color: #2c2c2c; font-size: 14px; line-height: 22px; font-family: Arial, Helvetica, sans-serif; ">
<h1 style="line-height: 44px; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: 33px; font-family: 黑体; font-size: 21px; ">一、前言</span></h1>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; "></font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">虽然Struts2+Spring3+Hibernate3三大框架上市已久，但廉颇未老，目前仍然是众多JavaEE应用程序的首选技术。本文将向您详细阐述SSH2应用程序的构架、思想、技术与技巧，打通JavaEE的任督二脉，行文力求通畅简洁，希望能让读者豁然开朗，快速掌握JavaEE应用程序的开发流程与关键技术。</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; "><br style="line-height: 25px; " />
</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">本文并非面向无Java基础的读者，您需要掌握一定的编程思想、Java技术和Struts2、Spring3与Hibernate3等框架技术，并了解Oracle等DBMS。</font></p>
<p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><span style="line-height: 22px; font-size: 10.5pt; font-family: 宋体; "><font face="宋体" style="line-height: 22px; "><br style="line-height: 22px; " />
</font></span></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "></p>
<h2 style="line-height: 33px; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: 33px; font-weight: bold; font-size: 16pt; font-family: 黑体; ">二、<font face="Arial" style="line-height: 33px; ">JavaEE</font><font face="黑体" style="line-height: 33px; ">体系架构</font></span></h2>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">JavaEE体系架构采用传统的MVC设计模式，分为Model、View、Controller三层，其中：Model即模型层，定义数据模型和业务逻辑。为了将数据访问与业务逻辑分离，提高业务精度，降低代码之间的耦合，模型层又细分为DAO层与业务层，DAO全称为Data Access Object（数据访问对象），将数据库访问代码封闭起来，Hibernate API也在此封装，不再出现在其他层或向其他层暴露；业务层是整个系统最核心也最具价值的一层，该层封装应用程序的业务逻辑，处理数据，关注客户需求，在业务处理过程中会访问原始数据或产生新数据，或者需要持久化数据，DAO层提供的DAO类能很好地帮助业务层完成数据处理，业务层本身则侧重于对客户需求的理解和业务规则的适应，自然也包括大部分的计算，总体说来，DAO不处理业务逻辑，只为业务层提供辅助，获取原始数据或持久化数据等操作。View即视图层，为最终用户提供一个友好的交互界面，用户可以查看请求结果，也可以通过表单等交互手段实现数据录入。Controller层即控制器，控制器是Model与View的桥梁，将二者很好的衔接，通过View接收用户数据，Controller将数据传输给Model，Model对数据进行处理；或者Model读取数据后，Controller将数据传递给View，View向用户展示数据。一来一往，Controller成了Model与View之间的快乐使者。</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><span style="line-height: 22px; font-family: 宋体; "><font face="宋体" size="3" style="line-height: 25px; "><br style="line-height: 25px; " />
</font></span></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font size="3" style="line-height: 25px; "></font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font size="3" style="line-height: 25px; "><span style="line-height: 25px; font-family: 宋体; ">关于<font face="Times New Roman" style="line-height: 25px; ">MVC</font><font face="宋体" style="line-height: 25px; ">更多的解释请参考百度百科链接（</font></span><span style="line-height: 25px; "><a href="http://baike.baidu.com/view/31.htm" style="color: #2c2c2c; line-height: 25px; text-decoration: none; "><span style="line-height: 25px; color: #0000ff; text-decoration: underline; font-family: 'Times New Roman'; ">http://baike.baidu.com/view/31.htm</span></a></span><span style="line-height: 25px; font-family: 宋体; ">），下图展示了<font face="Times New Roman" style="line-height: 25px; ">MVC</font><font face="宋体" style="line-height: 25px; ">的结构：</font></span></font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><br style="line-height: 22px; " />
</p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "></p>
<div style="line-height: 22px; "><img src="http://www.blogjava.net/images/blogjava_net/lzhidj/MVC.png" width="880" height="374" alt="" /><br />
</div>
&nbsp;
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; "></font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">从调用关系上看，左为高层，右为低层，下为高层，上为低层，高层可以调用低层，但低层不能调用高层，层与层之间的调用是单向的。</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; "><br style="line-height: 25px; " />
</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">从数据传输上看，数据可以从视图层传输到DAO进而保存到数据库，也可以从数据库中读取数据进行处理或者显示，所以，数据的传输是双向的。</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; "><br style="line-height: 25px; " />
</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">从技术实现上看，视图层使用HTML/JSP组件实现，控制器使用Servlet或Action组件实现，模型层使用JavaBean组件或EJB技术实现。</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; "><br style="line-height: 25px; " />
</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">Hibernate封装在DAO层，负责数据访问操作；Struts充当控制器角色，对用户数据进行合法性检验和类型转换，为视图层提供标签简化页面显示，提供国际化支持等等；Spring是应用程序的管家，DAO、Service（业务）、Action等对象由Spring创建并维护各对象之间关系，同时提供声明式事务管理，简化事务编程。</font></p>
<p style="line-height: 22px; margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><span style="line-height: 22px; font-size: 10.5pt; font-family: 宋体; "><font face="宋体" style="line-height: 22px; "><br style="line-height: 22px; " />
</font></span></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "></p>
<h2 style="line-height: 33px; margin-bottom: 0pt; margin-top: 0pt; "><span style="line-height: 33px; font-weight: bold; font-size: 16pt; font-family: 黑体; ">三、如何理解业务？</span></h2>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; "></font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">软件工程中的业务与日常生活中的业务不同，平常的业务偏指销售，指需要处理的事务。这里的业务涉及一个以上组织，按某一共同的目标、通过信息交换实现的一系列过程，其中每个过程都有明确的目的，并延续一段时间。将范围更局限一点，业务是指为完成某个事务而进行的一系列活动，需要对象的参与并按照一定的规则触发一系列行为。</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; "><br style="line-height: 25px; " />
</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">业务包含三大元素：对象、行为和业务规则。</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; "><br style="line-height: 25px; " />
</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">对象是主体，是行为的触发者，这里的对象可能是用户、订单、产品或DAO对象，也可能是外部系统，比如支付系统。一个业务的完成，可能需要一个对象参与，也可能是多个对象参与，这取决于业务本身。行为是对象的动作，多个行为按照一定的顺序执行，构成业务完整的执行能力。业务规则是对业务的一种约束，每一个行为所产生的结果必须对规则负责，规则监视对象、行为以及业务执行的结果，保证业务的正确性和准确性。</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; "><br style="line-height: 25px; " />
</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">我们以取款业务为例，来分析本业务中涉及的对象、行为和规则。</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; "><br style="line-height: 25px; " />
</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">取款业务描述：输入用户账号（银行刷卡完成），提醒用户输入密码，银行系统核对密码是否正确，如果正确，用户输入取款金额，系统更改账户金额并记录取款信息，打印票据，取款完成。</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; "><br style="line-height: 25px; " />
</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">这是一个司空见惯的业务，从这个业务中，我们提取出如下的元素信息：</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">对象：账号，交易，打印机；</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">行为：核对卡号和密码，更改账户余额，记录取款交易信息，打印票据；</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">规则：一次最多只能取2000元，一天最多只能取5次，取款金额大于50000需要预约；</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">&nbsp;</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; ">根据以上的分析，我们很容易转变成源代码。很多时候，我们遇到的业务比这个要复杂得多，项目的规模也很大，这就要求我们具备全局观，控制全场，运筹帷幄，仔细分析，辅助建模，达到最理想的效果。</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" size="3" style="line-height: 25px; "><br style="line-height: 25px; " />
</font></p>
<p style="line-height: 22px; margin-top: 0pt; margin-right: 0px; margin-bottom: 0pt; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-indent: 21pt; "><font face="宋体" color="#C0C0C0" size="2" style="line-height: 20px; ">——作者：李赞红 （lifenote@21cn.com），转载请保留版权！</font></p>
</span>
<img src ="http://www.blogjava.net/lzhidj/aggbug/344613.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2011-02-18 13:26 <a href="http://www.blogjava.net/lzhidj/archive/2011/02/18/344613.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BBS开发日志(每日更新)</title><link>http://www.blogjava.net/lzhidj/archive/2010/03/23/316225.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Mon, 22 Mar 2010 16:31:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2010/03/23/316225.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/316225.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2010/03/23/316225.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/316225.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/316225.html</trackback:ping><description><![CDATA[<p>2010-3-23<br />
+ 查看帖子后浏览数自动+1<br />
+ 完成引用回复,修改了回复跳转逻辑(以前没有跳转到原始帖子)<br />
* 显示帖子时只在第一页显示楼主的帖子,后面的页不再显示<br />
* 分页标签添加"上一页"和"下一页"功能<br />
* 完善添加子版块的界面,主版块使用ajax动态读出<br />
* 发现并解决主贴没有回复时显示为"共0页"的BUG<br />
* 解决如果只有一页时分页标签显示不完整的BUG<br />
<br />
<br />
2010-3-22<br />
+ 开始加入异常处理机制,还没做好(与动态代理的整合出了点问题),将来整合Spring后再彻底搞好.<br />
+ 主帖及回帖右下角的"回复"链接指向帖子最底部的"快速回复"<br />
* 解决阅读帖子及回帖时添加新帖没有指定版块的BUG<br />
* 优化快速回复,解决不换行问题<br />
</p>
<p><br />
2010-3-21<br />
+ 完成帖子显示部分,包括回帖列表显示(这个花了整整6个小时)<br />
+ 使用ajax(jQuery)实现快速回复<br />
* ojdbc14驱动有问题,无法读取CLOB类型的数据,换成classes12问题解决<br />
* 优化发新帖和回复帖子的页面<br />
* 继续优化帖子列表的页面效果<br />
* 优化标签样式,更适应浏览器窗口的大小<br />
- 删除帖子标题后面的"回帖"链接<br />
&nbsp;</p>
<p>2010-3-20<br />
+ 帖子列表添加了分页<br />
+ 定义分页标签<br />
* 重写了查询帖子列表的SQL语句,使用视图实现了,前面使用HQL语句有BUG,分页时会出现问题<br />
* 置顶,精华,推荐,锁定的页面呈现不再使用文字,而是使用图标<br />
* 优化了帖子列表的页面效果<br />
* eWebEditor-4.6编辑器不兼容chrome浏览器,替换成kindeditor-3.4.1<br />
- 删除了集合排序帖子列表的功能,这种做法有BUG,达不到正常使用的要求</p><img src ="http://www.blogjava.net/lzhidj/aggbug/316225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2010-03-23 00:31 <a href="http://www.blogjava.net/lzhidj/archive/2010/03/23/316225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发布一个JavaBean一键生成插件:JavaBeanAssistant(2010-3-12更新,正式版)</title><link>http://www.blogjava.net/lzhidj/archive/2010/03/10/315023.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Wed, 10 Mar 2010 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2010/03/10/315023.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/315023.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2010/03/10/315023.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/315023.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/315023.html</trackback:ping><description><![CDATA[<p>直接将JavaBeanAssistants_1.0.0.201003100826.jar复制到&lt;eclipse&gt;/plugins目录下,在编辑器中弹出右键菜单就可以看到了.</p>
主要功能:<br />
<br />
&nbsp;* 三个构造方法(无参,半参,全参)<br />
&nbsp;* getter和setter方法<br />
&nbsp;* toString方法<br />
&nbsp;* equals方法<br />
&nbsp;* hashCode方法<br />
<br />
这是正式版,用于替换自带的功能,可以一键生成,减少很多操作.<br />
<br />
下载:<br />
<br />
<a title="下载(2010-3-13)" href="/Files/lzhidj/JavaBeanAssistants_1.0.0.2.zip">下载(2010-3-13)</a>&nbsp; Ver1.0.0.2<br />
<br />
<img height="67" alt="" src="http://www.blogjava.net/images/blogjava_net/lzhidj/menu.png" width="304" border="0" />&nbsp;<br />
<br />
<img height="553" alt="" src="http://www.blogjava.net/images/blogjava_net/lzhidj/preference.png" width="631" border="0" />&nbsp;<br />
<br />
1.0.0.2版:<br />
1.新增"构造方法中不包含集合类型的属性"<br />
2.新增"hashCode()和equals()方法中不包含集合类型的属性"<br />
3.修改"自动生成无id的构造方法"为"自动生成无第一个属性的构造方法"<br />
<img height="573" alt="" src="http://www.blogjava.net/images/blogjava_net/lzhidj/preference1.0.0.2.png" width="627" border="0" />
<img src ="http://www.blogjava.net/lzhidj/aggbug/315023.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2010-03-10 10:34 <a href="http://www.blogjava.net/lzhidj/archive/2010/03/10/315023.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>下载：eclipse插件开发-铺设一条插件开发普及之路(1-5章)</title><link>http://www.blogjava.net/lzhidj/archive/2010/02/24/313782.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Wed, 24 Feb 2010 05:46:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2010/02/24/313782.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/313782.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2010/02/24/313782.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/313782.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/313782.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
前言&nbsp;2<br />
目 录&nbsp;3<br />
第一章 Eclipse插件概述&nbsp;5<br />
一、Eclipse概述&nbsp;5<br />
二、Eclipse插件（plug-in）概述&nbsp;6<br />
三、Eclipse插件开发环境与开发入门&nbsp;8<br />
1.3.1 创建工程及设置环境&nbsp;8<br />
1.3.2 Activator类&nbsp;13<br />
1.3.3 plugin.xml与org.eclipse.ui.actionSets扩展点&nbsp;15<br />
1.3.4 menubarPath属性&nbsp;23<br />
1.3.5 groupMarker标记&nbsp;26<br />
1.3.6 separator标记&nbsp;30<br />
四、插件开发调试&nbsp;34<br />
五、小结&nbsp;35<br />
第二章 SWT/jFace简介&nbsp;36<br />
一、SWT/jFace概述&nbsp;36<br />
二、SWT使用入门&nbsp;38<br />
三、插件环境下的Dialog&nbsp;41<br />
2.3.1 Dialog概述与典型结构&nbsp;41<br />
2.3.1 与主调程序交互&nbsp;51<br />
四、小结&nbsp;53<br />
第三章 TitleAreaDialog与布局&nbsp;54<br />
一、TitleAreaDialog&nbsp;54<br />
3.1.1 概述&nbsp;54<br />
3.1.2 标题区域（Title Area）&nbsp;56<br />
3.1.3 DialogTray&nbsp;58<br />
二、布局概述&nbsp;61<br />
三、FillLayout&nbsp;62<br />
四、RowLayout&nbsp;65<br />
五、GridLayout&nbsp;68<br />
六、FormLayout&nbsp;79<br />
3.6.1 FormLayout基本概念&nbsp;79<br />
3.6.2 参照物&nbsp;83<br />
七、小结&nbsp;86<br />
第四章 WizardDialog与标准对话框&nbsp;87<br />
一、向导对话框&nbsp;87<br />
4.1.1 WizardDialog概述&nbsp;87<br />
4.1.2 WizardPage&nbsp;90<br />
4.1.3 Wizard&nbsp;95<br />
4.1.4 org.eclipse.ui.newWizards扩展点&nbsp;97<br />
4.1.5 org.eclipse.ui.importWizards扩展点&nbsp;101<br />
4.1.6 org.eclipse.ui.exportWizards扩展点&nbsp;104<br />
4.1.7 用户档案输入向导&nbsp;105<br />
二、内置对话框&nbsp;105<br />
4.3.1 消息框&nbsp;105<br />
4.3.2 询问框&nbsp;106<br />
4.3.3 错误消息框&nbsp;108<br />
4.3.4 输入框&nbsp;108<br />
4.3.5 进度条监视对话框&nbsp;109<br />
三、文件与目录选择对话框&nbsp;111<br />
4.3.1 文件选择对话框FileDialog&nbsp;111<br />
4.3.2 目录选择对话框&nbsp;112<br />
四、小结&nbsp;117<br />
第五章 Label、Text、Button、List与Combo&nbsp;119<br />
一、Label&nbsp;119<br />
二、Text&nbsp;122<br />
三、Button&nbsp;126<br />
四、List&nbsp;134<br />
五、Combo&nbsp;136<br />
<br />
下载1：<br />
&nbsp;&nbsp;&nbsp;&nbsp;<a title="下载" href="http://www.blogjava.net/Files/lzhidj/eclipse%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91-%E9%93%BA%E8%AE%BE%E4%B8%80%E6%9D%A1%E6%8F%92%E4%BB%B6%E5%BC%80%E5%8F%91%E6%99%AE%E5%8F%8A%E4%B9%8B%E8%B7%AF(1-5%E7%AB%A0).rar">下载</a><br />
下载2：<br />
&nbsp;&nbsp;&nbsp;&nbsp;<a title="下载" href="http://download.csdn.net/source/2075808">下载</a>
<img src ="http://www.blogjava.net/lzhidj/aggbug/313782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2010-02-24 13:46 <a href="http://www.blogjava.net/lzhidj/archive/2010/02/24/313782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 PPT下载</title><link>http://www.blogjava.net/lzhidj/archive/2010/02/20/313437.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Sat, 20 Feb 2010 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2010/02/20/313437.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/313437.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2010/02/20/313437.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/313437.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/313437.html</trackback:ping><description><![CDATA[看了<a title="刘长炯" href="http://www.blogjava.net/beansoft/">刘长炯</a>老师的BLOG，他共享了他的Struts2 PPT，涉及到版权问题，他提供的是SWF格式，我把我自己做的PPT分享出来给大家，说不定您能用得上。<br />
<br />
我把名字敲上去了，您在使用的时候最好别删了。这是对别人劳动成果的尊重。<br />
<br />
下载<br />
<a title="下载PPT" href="/Files/lzhidj/Struts2_PPT.rar">Struts2_PPT.rar</a> <br />
<br />
内容：<br />
<br />
<p>1 Struts2与控制器<br />
&nbsp;1.1 Struts2介绍与环境搭建<br />
&nbsp;1.2 StrutsPrepareAndExecuteFilter过滤器<br />
&nbsp;1.3 Action,ActionSupport及配置<br />
&nbsp;1.4 Action与Servlet API (XXXAware, ActionContext, ServletActionContext)<br />
&nbsp;1.5 Action控制逻辑<br />
&nbsp;1.6 Action与请求参数<br />
&nbsp;1.7 结果处理(result)&nbsp; </p>
<p>2 类型转换与输入验证<br />
&nbsp;2.1 类型转换<br />
&nbsp;2.2 输入验证<br />
&nbsp;2.3 fielderror标签</p>
<p>3 截拦器<br />
&nbsp;3.1 截拦器的作用和意义<br />
&nbsp;3.2 截拦器的定义与配置<br />
&nbsp;3.3 默认截拦器分析<br />
&nbsp;3.4 截拦器栈<br />
&nbsp;3.5 截拦器示例-访问控制</p>
<p>4 ONGL与标签库(1)<br />
&nbsp;4.1 ONGL<br />
&nbsp;4.2 Struts2标签分类<br />
&nbsp;4.3 控制标签(if, elseif, else, iterator, append, merge, generator,&nbsp; subset, sort)<br />
&nbsp;4.4 数据标签(bean, param, date, debug, include, set, url, push)</p>
<p>5 标签库(2)<br />
&nbsp;5.1 表单标签(简单标签, checkboxlist, combobox, datetimepicker, doubleselect, optiontranserselect, select,<br />
&nbsp;radio,updownselect)<br />
&nbsp;5.2 Ajax标签(div, a, submit, tabbedPanel)</p>
<p>6 Struts2高级<br />
&nbsp;6.1 异常处理<br />
&nbsp;6.2 国际化<br />
&nbsp;6.3 文件上传与下载(单文件与多文件上传)<br />
&nbsp;6.4 与Spring整合</p>
<p><br />
&nbsp;</p>
<img src ="http://www.blogjava.net/lzhidj/aggbug/313437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2010-02-20 11:25 <a href="http://www.blogjava.net/lzhidj/archive/2010/02/20/313437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开始撰写电子图书：《Eclipse插件开发 —— 一条插件开发的普及之路》</title><link>http://www.blogjava.net/lzhidj/archive/2010/02/20/313436.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Sat, 20 Feb 2010 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2010/02/20/313436.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/313436.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2010/02/20/313436.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/313436.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/313436.html</trackback:ping><description><![CDATA[最近开始撰写原创电子图书：《Eclipse插件开发 —— 一条插件开发的普及之路》，意在降低初学者开发插件的门槛，让更多的人体验到Eclipse的强大和魅力，因为考虑到初学者，所以配备了大量的图片，并尽量减少专业术语性的描述。<br />
<br />
市面上已有不少这方面的图书，但收费高昂，内容不完善，印刷成纸质图书之后无法有效更新，希望我的这本书能给大家带来帮助。图书的定位是插件开发初学者，但是对OOP和Java要有一定程度的了解，必须明白什么是插件。当然，作为参考书也是不错的。<br />
<br />
本书共18章，每章30页左右，共计540页左右，时间大概3个月，现在的进度是已完成第3章，正在写第4章。<br />
<br />
目录结构：<br />
&nbsp;&nbsp;&nbsp;&nbsp;1.eclipse插件概述<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.swt简介<br />
&nbsp;&nbsp;&nbsp;&nbsp;3.TitleAreaDialog对话框与布局<br />
&nbsp;&nbsp;&nbsp;&nbsp;4.向导对话框与消息框<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;文件,目录<br />
&nbsp;&nbsp;&nbsp;&nbsp;5.Label与Button<br />
&nbsp;&nbsp;&nbsp;&nbsp;6.Text与List<br />
&nbsp;&nbsp;&nbsp;&nbsp;7.TabFolder与xxxx<br />
&nbsp;&nbsp;&nbsp;&nbsp;8.Table与TableViewer<br />
&nbsp;&nbsp;&nbsp;&nbsp;9.Tree与TreeViewer<br />
&nbsp;&nbsp;&nbsp;&nbsp;10.其他组件<br />
&nbsp;&nbsp;&nbsp;&nbsp;11.首选项页<br />
&nbsp;&nbsp;&nbsp;&nbsp;12.透视图<br />
&nbsp;&nbsp;&nbsp;&nbsp;13.视图<br />
&nbsp;&nbsp;&nbsp;&nbsp;14.菜单与工具栏<br />
&nbsp;&nbsp;&nbsp;&nbsp;15.Java工程结构分析与API<br />
&nbsp;&nbsp;&nbsp;&nbsp;16.AST API应用<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;访问者模式<br />
&nbsp;&nbsp;&nbsp;&nbsp;17.RCP-脱离eclipse的应用程序<br />
&nbsp;&nbsp;&nbsp;&nbsp;18.插件实例-JavaBean Creator plugin(JBC)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;打包与发布<br />
<br />
上次的JBPM没有履行承诺，真是对不起大家，因为后来觉得JBPM4都发布那么久了，没必要再去研究老的版本，不想耽误大家的时间。《轻松搞定Extjs》获得了很好的反响，谢谢大家的支持。<br />
<br />
我是一名IT老师，工作挺累的，以前的娱乐爱好全部被磨光了，幸好对技术还有一种深深的热爱，所以过得也还充实。最近在读李开复先生的自传，他的经历让人钦佩，高山仰止。昨晚湖南卫视《天天向上》做了一期有关百度的节目，掌门人李彦宏年轻有为，居然还有粉丝（中国人貌似喜欢盲目崇拜，无语），遗憾的是，我一直以为百度掌门人的名字叫李宏彦。惊喜的是，音调上我和名字和李彦宏只有一字之差。
<img src ="http://www.blogjava.net/lzhidj/aggbug/313436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2010-02-20 11:03 <a href="http://www.blogjava.net/lzhidj/archive/2010/02/20/313436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse插件开发:使用AST生成类(源码)</title><link>http://www.blogjava.net/lzhidj/archive/2010/02/12/312602.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Thu, 11 Feb 2010 17:56:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2010/02/12/312602.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/312602.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2010/02/12/312602.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/312602.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/312602.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本代码演示如何通过AST生成一个完整的类, 最终生成的代码比较乱, 编译无法通过,重点在于对AST的使用, 无需考虑最后生成的结果.以下是最终生成的代码(语法有严重错误, 请不要计较这些):package&nbsp;com.aptech.lzh;import&nbsp;java.util.Date;import&nbsp;java.util.Random;publi...&nbsp;&nbsp;<a href='http://www.blogjava.net/lzhidj/archive/2010/02/12/312602.html'>阅读全文</a><img src ="http://www.blogjava.net/lzhidj/aggbug/312602.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2010-02-12 01:56 <a href="http://www.blogjava.net/lzhidj/archive/2010/02/12/312602.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>eclipse插件开发：手动创建一个Java工程，只适合你我有缘者</title><link>http://www.blogjava.net/lzhidj/archive/2010/02/10/312458.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Tue, 09 Feb 2010 17:20:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2010/02/10/312458.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/312458.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2010/02/10/312458.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/312458.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/312458.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这是些用来留作笔记的代码，只适合有缘者。功能包括：&nbsp;&nbsp;&nbsp;&nbsp;创建新的java工程&nbsp;&nbsp;&nbsp;&nbsp;设置默认的JRE库&nbsp;&nbsp;&nbsp;&nbsp;创建源文件夹&nbsp;&nbsp;&nbsp;&nbsp;创建输出文件夹&nbsp;&nbsp;&nbsp;&nbsp;创建包&nbs...&nbsp;&nbsp;<a href='http://www.blogjava.net/lzhidj/archive/2010/02/10/312458.html'>阅读全文</a><img src ="http://www.blogjava.net/lzhidj/aggbug/312458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2010-02-10 01:20 <a href="http://www.blogjava.net/lzhidj/archive/2010/02/10/312458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[翻译]eclipse插件开发(1-1):action</title><link>http://www.blogjava.net/lzhidj/archive/2010/02/06/312177.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Sat, 06 Feb 2010 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2010/02/06/312177.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/312177.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2010/02/06/312177.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/312177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/312177.html</trackback:ping><description><![CDATA[<span style="font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif">
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">eclipse</span>平台允许我们通过插件扩展出另一个插件，与平台紧密集成为用户提供更好的体验，本文将向您阐述如何向视图和编辑器中添加动作<span lang="EN-US">(上下文菜单<span lang="EN-US">)</span>，并且允许为您自己定义的视图和编辑器添加其他新的动作。文中的每一个示例将详细的向您展示每一种不同应用的特征。</span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><img style="width: 762px; height: 682px" height="682" alt="" src="http://www.blogjava.net/images/blogjava_net/lzhidj/sss.PNG" width="762" border="0" /><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt">上面的图片显示了插件中能添加动作的众多区域：<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px 10px 39pt; text-indent: -18pt"><span lang="EN-US">1、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;</span></span>在视图和编辑器中添加上下文菜单<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px 10px 39pt; text-indent: -18pt"><span lang="EN-US">2、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;</span></span>在视图上添加工具栏和下拉菜单<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px 10px 39pt; text-indent: -18pt"><span lang="EN-US">3、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;</span></span>在工作台窗口的主工具栏和菜单上添加动作<span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px 10px 21pt">本文将对上面的种种进行演示，并通过实例形式向您详细讲解。<span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt">我们假设您有插件开发的基础，如果想获得在<span lang="EN-US">eclipse平台上开发插件的更多信息，请阅读<span lang="EN-US">Jim Amsden</span>的入门文章&#8220;<span lang="EN-US">Your First Plug-in</span>&#8221;，该示例的运行结果，请点击&#8220;<span lang="EN-US">running the examples</span>&#8221;。</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><strong><span style="font-size: 11.5pt">在上下文菜单中添加动作</span></strong><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt">可以在视图和编辑器的上下文菜单中添加动作并紧密集成，比如，<span lang="EN-US">VCM插件在存在的视图如<span lang="EN-US">Navigator</span>或<span lang="EN-US">Packages</span>中添加了许多新的动作，对资源进行版本管理<span lang="EN-US">.</span>为了在上下文菜单中添加新的动作<span lang="EN-US">,eclipse</span>提供了插件点<span lang="EN-US">org.eclipse.ui.popupMenus,</span>包括两种类型的动作<span lang="EN-US">,</span>即能添加到视图或编辑器的上下文菜单中<span lang="EN-US">,</span>也能为指定的对象类型添加上下文菜单。下面的三个示例将为您详细说明。</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt">示例一：为默认的文本编辑器添加新的动作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;让我们看看如何向默认的文本编辑器添加一个动作：<br />
&nbsp;&nbsp;&nbsp;&nbsp;①<span lang="EN-US">&lt;viewerContribution<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id="org.eclipse.ui.articles.action.contribution.popup.editor"<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;②<span lang="EN-US">&nbsp;&nbsp;&nbsp;targetID="#TextEditorContext"&gt;<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;③<span lang="EN-US">&nbsp;&nbsp;&nbsp;&lt;action<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id="org.eclipse.ui.articles.action.contribution.editor.action1"<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label="Editor Action 1"<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon="icons/red_dot.gif"<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;④<span lang="EN-US">&nbsp;&nbsp;menubarPath="additions"<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;⑤<span lang="EN-US">&nbsp;&nbsp;class="first.plugin.action.ContextMenuAction"&gt;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/viewerContribution&gt;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&lt;/extension&gt;<o:p></o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US"><o:p>&nbsp;</o:p></span>上面的<span lang="EN-US">xml向指定编辑器添加了一个上下文菜单，该扩展叫<span lang="EN-US">viewerContribution</span>（①），可以用于视图和编辑器。</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">targetID</span>属性（②）指定上下文菜单所依附的目标视图和编辑器标识符，官方文档提供了可用的标识符列表，如果您设置的标识符不存在，则上下文菜单不被注册。一个视图或编辑器可以有不只一个上下文菜单。<span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">action</span>（③）标记用于定义一个动作，<span lang="EN-US">id是该动作的标识符，<span lang="EN-US">label</span>和<span lang="EN-US">icon</span>表示菜单项的显示文本和图标，<span lang="EN-US">icon</span>为可选项。<span lang="EN-US">menubarPath</span>（④）属性指定动作菜单项的位置，从上下文菜单的根开始，<span lang="EN-US">action</span>将被添加到这里。在本示例中，&#8220;<span lang="EN-US">additions</span>&#8221;其实是<span lang="EN-US">org.eclipse.ui.IWorkbenchActionConstants</span>类的一个常量值（<span lang="EN-US">MB_ADDITIONS</span>）。添加的动作独立成组，在上述情况下，如果<span lang="EN-US">menubarPath</span>属性没有指定，工作台将首先添加到&#8220;<span lang="EN-US">additions</span>&#8221;组中，如果<span lang="EN-US">additions</span>不存在，动作将被添加到上下文菜单的末尾。</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">class</span>（⑤）属性是一个菜单项被用户选中后将要执行的动作的类，如果是编辑器的上下文菜单，该类必须实现<span lang="EN-US">org.eclipse.ui.IEditorActionDelegate接口，如果是视图的上下文菜单，则实现<span lang="EN-US">org.eclipse.ui.IViewActionDelegate</span>接口。有一个非常重要的情况就是只有当用户选择了菜单项后该类才被工作台加载，这就意味着很多初始化的逻辑必须在<span lang="EN-US">XML</span>文件中描述。一旦该类被工作台加载，该类将可以控制动作的启用与禁用。如果动作被选中，将执行<span lang="EN-US">run()</span>方法完成需要的功能。</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt">下面是一个典型的实现类：<span lang="EN-US"><o:p>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</o:p></span><span lang="EN-US">package first.plugin.action;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;import org.eclipse.jface.action.IAction;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;import org.eclipse.jface.dialogs.MessageDialog;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;import org.eclipse.jface.viewers.ISelection;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;import org.eclipse.ui.IEditorActionDelegate;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;import org.eclipse.ui.IEditorPart;</span><span lang="EN-US"><o:p>&nbsp;<br />
</o:p></span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;public class ContextMenuAction implements IEditorActionDelegate {</span><span lang="EN-US"><o:p>&nbsp;<br />
</o:p></span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void setActiveEditor(IAction action, IEditorPart targetEditor) {<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void run(IAction action) {<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDialog.openInformation(null, "", "</span>我是上下文菜单<span lang="EN-US">");<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void selectionChanged(IAction action, ISelection selection) {<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<o:p></o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">}</span></p>
</span>
<img src ="http://www.blogjava.net/lzhidj/aggbug/312177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2010-02-06 10:37 <a href="http://www.blogjava.net/lzhidj/archive/2010/02/06/312177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用二进制实现标志叠加</title><link>http://www.blogjava.net/lzhidj/archive/2010/01/29/311250.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Fri, 29 Jan 2010 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2010/01/29/311250.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/311250.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2010/01/29/311250.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/311250.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/311250.html</trackback:ping><description><![CDATA[<font size="2">&nbsp; </font>
<p><font size="2"><span style="font-family: 宋体">每一个标志都使用一个以</span>1<span style="font-family: 宋体">开头</span>,<span style="font-family: 宋体">后面全部接</span>0<span style="font-family: 宋体">的二进制表示</span>,<span style="font-family: 宋体">长度不限</span>,<span style="font-family: 宋体">如</span>:</font> </p>
<p><font size="2">int x = 0x8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000</font> </p>
<p><font size="2">int y = 0x10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10000</font> </p>
<p><font size="2">int z = 0x20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 100000</font> </p>
<p><font size="2"><span style="font-family: 宋体">叠加的结果是</span>:int a = x | y | z.&nbsp;&nbsp;&nbsp; -&gt;&nbsp;111000</font> </p>
<p><font size="2"><span style="font-family: 宋体">判断是否有</span>x<span style="font-family: 宋体">标志</span>:</font> </p>
<p><font size="2">if(<span style="color: red">(a &amp; x) == x)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt;&nbsp;</span><span style="font-family: 宋体">如果返回值为真</span>,<span style="font-family: 宋体">表示确实包含了</span>x<span style="font-family: 宋体">标记</span>.</font> </p>
<p><font size="2"><span style="font-family: 宋体">代码</span>:</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x1 = 0x8;</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int y1 = 0x10;</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int z1 = 0x20;</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int rrr = x1 | z1;</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((rrr &amp; x1) == x1)</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("<span style="font-family: 宋体">有</span>x<span style="font-family: 宋体">标记</span>"n");</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((rrr &amp; y1) == y1)</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("<span style="font-family: 宋体">有</span>y<span style="font-family: 宋体">标记</span>"n");</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((rrr &amp; z1) == z1)</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("<span style="font-family: 宋体">有</span>z<span style="font-family: 宋体">标记</span>"n");</font> </p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
示例:<br />
<br />
</font></p>
<p><font size="2">package com.aptechb;</font> </p>
<p><font size="2">import java.util.Scanner;</font> </p>
<p><font size="2">/**<br />
&nbsp;* 应用一:保存状态<br />
&nbsp;* &lt;hr&gt;<br />
&nbsp;* 比如在描述一个人的爱好时,会用多个复选框标识出选项:阅读,看电视,交际等,如何保存到数据库比较好呢?<br />
&nbsp;*/</font> </p>
<p><font size="2">public class Binary {</font> </p>
<p><font size="2">&nbsp;public static void saveStatus() {<br />
&nbsp;&nbsp;int status = 0x0; // 用于保存爱好,如果爱好项目很多,可以用long等.每一位保存一个爱好.<br />
&nbsp;&nbsp;// 假设:<br />
&nbsp;&nbsp;// 0000 0000 0000 0000 0000 0000 0000 1111<br />
&nbsp;&nbsp;// 从低位到高位分别保存阅读,交际,电影,喝咖啡,即<br />
&nbsp;&nbsp;// 0000 0000 0000 0000 0000 0000 0000 1(喝咖啡)1(电影)1(交际)1(阅读)<br />
&nbsp;&nbsp;// 如果为0表示没有该爱好.</font> </p>
<p><font size="2">&nbsp;&nbsp;// 比如我的爱好有:电影,阅读,则<br />
&nbsp;&nbsp;// status = 0x5;<br />
&nbsp;&nbsp;// 将0x5与0x1做&amp;运算,如果结果为0x1,则表示阅读是我的爱好<br />
&nbsp;&nbsp;// 将0x5与0x10做&amp;运算,如果结果为0x10,则表示交际是我的爱好<br />
&nbsp;&nbsp;// 将0x5与0x100做&amp;运算,如果结果为0x100,则表示电影是我的爱好<br />
&nbsp;&nbsp;// 将0x5与0x1000做&amp;运算,如果结果为0x1000,则表示喝咖啡是我的爱好<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;//接收输入<br />
&nbsp;&nbsp;System.out.println("请输入对应数字:\n1.阅读\n2.交际\n4.电影\n8.喝咖啡\n\n0.结束输入\n");<br />
&nbsp;&nbsp;Scanner scanner = new Scanner(System.in);<br />
&nbsp;&nbsp;int input = scanner.nextInt();<br />
&nbsp;&nbsp;while(input != 0){<br />
&nbsp;&nbsp;&nbsp;status |= input;<br />
&nbsp;&nbsp;&nbsp;input = scanner.nextInt();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;System.out.println("您输入的结果计算后的二进制表示:" + Integer.toBinaryString(status));</font> </p>
<p><font size="2">&nbsp;&nbsp;System.out.println("\n-----------------\n您的爱好有:");<br />
&nbsp;&nbsp;for (Hobby hobby : Hobby.values()) {<br />
&nbsp;&nbsp;&nbsp;if ((status &amp; hobby.getFlag()) == hobby.getFlag()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(hobby);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;}</font> </p>
<p><font size="2">&nbsp;public static void main(String[] args) {<br />
&nbsp;&nbsp;saveStatus();<br />
&nbsp;}<br />
}<br />
</font></p>
<br />
<font size="2">示例中用到的枚举:<br />
<br />
</font>
<p><font size="2">package com.aptechb;</font> </p>
<p><font size="2">public enum Hobby {<br />
&nbsp;阅读(0x1), 交际(0x2), 电影(0x4), 喝咖啡(0x8);<br />
&nbsp;<br />
&nbsp;private int flag;<br />
&nbsp;<br />
&nbsp;private Hobby(int flag){<br />
&nbsp;&nbsp;this.flag = flag;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public int getFlag() {<br />
&nbsp;&nbsp;return flag;<br />
&nbsp;}<br />
}<br />
</font></p>
<br />
<img src ="http://www.blogjava.net/lzhidj/aggbug/311250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2010-01-29 17:36 <a href="http://www.blogjava.net/lzhidj/archive/2010/01/29/311250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二进制最简单的运算过程解析</title><link>http://www.blogjava.net/lzhidj/archive/2010/01/29/311248.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Fri, 29 Jan 2010 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2010/01/29/311248.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/311248.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2010/01/29/311248.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/311248.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/311248.html</trackback:ping><description><![CDATA[<p><br />
3 &amp; 4</p>
<p>&amp;:同为1结果为1,否则为0<br />
0000 0000 0000 0000 0000 0000 0000 0011<br />
0000 0000 0000 0000 0000 0000 0000 0100<br />
---------------------------------------<br />
0000 0000 0000 0000 0000 0000 0000 0000&nbsp;-&gt; 0</p>
<p>4 | 8<br />
|: 一方为1结果便为1,否则为0<br />
0000 0000 0000 0000 0000 0000 0000 0100<br />
0000 0000 0000 0000 0000 0000 0000 1000<br />
---------------------------------------<br />
0000 0000 0000 0000 0000 0000 0000 1100 -&gt; 12</p>
<p><br />
~9<br />
~:取反,0变成1,1变成0 -&gt;要得到最后结果必须再计算补码(反码+1)<br />
0000 0000 0000 0000 0000 0000 0000 1001<br />
---------------------------------------<br />
1111 1111 1111 1111 1111 1111 1111 0110 -&gt;得到反码,下面回算补码(即减1取反)<br />
---------------------------------------<br />
1111 1111 1111 1111 1111 1111 1111 0101 -&gt;-1<br />
---------------------------------------<br />
0000 0000 0000 0000 0000 0000 0000 1010 -&gt;取反结果为10,取反码的时候以1开头,即为负数,所以结果为-10</p>
<p>下面是-10在java中的表示:<br />
0000 0000 0000 0000 0000 0000 0000 1010<br />
1111 1111 1111 1111 1111 1111 1111 0101 +1<br />
1111 1111 1111 1111 1111 1111 1111 0110</p>
<p>8 ^ 23<br />
^:异或, 不同为1,相同为0<br />
0000 0000 0000 0000 0000 0000 0000 1000<br />
0000 0000 0000 0000 0000 0000 0001 0111<br />
---------------------------------------<br />
0000 0000 0000 0000 0000 0000 0001 1111 -&gt; 31</p>
<p>4 &lt;&lt; 3<br />
&lt;&lt;:左位移,4的二进制向左移动3位,右边补0<br />
0000 0000 0000 0000 0000 0000 0000 0100<br />
---------------------------------------<br />
0000 0000 0000 0000 0000 0000 0010 0000 -&gt; 32</p>
<p>5 &gt;&gt; 9<br />
&gt;&gt;:右位移, 5的二进制向右移动9位,左边补0<br />
0000 0000 0000 0000 0000 0000 0000 0101<br />
---------------------------------------<br />
0000 0000 0000 0000 0000 0000 0000 0000 -&gt; 0</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/lzhidj/aggbug/311248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2010-01-29 17:35 <a href="http://www.blogjava.net/lzhidj/archive/2010/01/29/311248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>