﻿<?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-龙屠日的技术及股票博客-随笔分类-交易系统</title><link>http://www.blogjava.net/longturi/category/43982.html</link><description>The secret of greatness is simple: do better work than any other man in your field - and keep on doing it</description><language>zh-cn</language><lastBuildDate>Wed, 07 Apr 2010 06:28:25 GMT</lastBuildDate><pubDate>Wed, 07 Apr 2010 06:28:25 GMT</pubDate><ttl>60</ttl><item><title>如何在JTable中显示图片</title><link>http://www.blogjava.net/longturi/archive/2010/02/28/314108.html</link><dc:creator>龙屠日</dc:creator><author>龙屠日</author><pubDate>Sun, 28 Feb 2010 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/longturi/archive/2010/02/28/314108.html</guid><wfw:comment>http://www.blogjava.net/longturi/comments/314108.html</wfw:comment><comments>http://www.blogjava.net/longturi/archive/2010/02/28/314108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/longturi/comments/commentRss/314108.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/longturi/services/trackbacks/314108.html</trackback:ping><description><![CDATA[<strong>使用DefaultTableCellRenderer改变JTable的默认渲染</strong><br />
<br />
要想改变Jtable的默认显示状态，如由默然的文本显示改变为图片，组件等，你只需要从DefaultTableCellRenderer继承出一个自己的实现类，在其中根据行列值等返回特定的渲染组件即可，当然这个渲染组件必须是Component的子类。完成之后，可以通过如下的方式将这个渲染器施加于JTable上。<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">JTable&nbsp;table</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;JTable();<br />
<img src="http://www.blogjava.net/Images/dot.gif" alt="" />.<br />
TableCellRenderer&nbsp;render</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;MyTableCellRenderer();<br />
<br />
</span><span style="color: rgb(0, 0, 255);">try</span><span style="color: rgb(0, 0, 0);">{<br />
&nbsp;&nbsp;table.setDefaultRenderer(Class.forName(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">java.lang.Object</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">),&nbsp;render);<br />
}<br />
</span><span style="color: rgb(0, 0, 255);">catch</span><span style="color: rgb(0, 0, 0);">(Exception&nbsp;ex){<br />
&nbsp;&nbsp;ex.printStackTrace();<br />
}</span></div>
<br />
<br />
下面是一个例子：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;PictureTableRender&nbsp;</span><span style="color: rgb(0, 0, 255);">extends</span><span style="color: rgb(0, 0, 0);">&nbsp;DefaultTableCellRenderer&nbsp;{<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;Component&nbsp;getTableCellRendererComponent(JTable&nbsp;table,&nbsp;Object&nbsp;value,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;isSelected,&nbsp;</span><span style="color: rgb(0, 0, 255);">boolean</span><span style="color: rgb(0, 0, 0);">&nbsp;hasFocus,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;row,&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;column)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Component&nbsp;cell&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">super</span><span style="color: rgb(0, 0, 0);">.getTableCellRendererComponent(table,&nbsp;value,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isSelected,&nbsp;hasFocus,&nbsp;row,&nbsp;column);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">(column</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;url</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">(String)value&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PicturePanel&nbsp;p</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;PicturePanel();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.showPicture(url);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;p;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">return</span><span style="color: rgb(0, 0, 0);">&nbsp;cell;<br />
&nbsp;&nbsp;}<br />
}</span></div>
<br />
<br />
<strong>PictureTableRender说明</strong><br />
<br />
这个渲染器判断当前列的下标，如果是4则使用一个面板代替默认的cell返回，这个面板会取得这个单元格的值—一张网络图片的URL，然后在自身上描绘出来。效果如下：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/longturi/TableCellRenderer.jpg" width="856" height="224" /><br />
<br />
加上渲染器的效果图<br />
<br />
<strong>最后对表格做的一点特殊处理</strong><br />
<br />
Jtable默然的列是可拖动的，如果是这样我们的渲染器就会失去作用，这时采用table.getTableHeader().setReorderingAllowed(false);<br />
让列不可拖动就可以。<br />
当然也可以在渲染器中通过列得到TableHeader，再取得表头的值，如果判断是&#8220;照片&#8221;二字的话再进行渲染，这部分工作就留待读者完成吧。<br />
<br />
<img src ="http://www.blogjava.net/longturi/aggbug/314108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/longturi/" target="_blank">龙屠日</a> 2010-02-28 16:05 <a href="http://www.blogjava.net/longturi/archive/2010/02/28/314108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何通过XFire Webservice上传文件并访问到该文件</title><link>http://www.blogjava.net/longturi/archive/2010/02/27/314057.html</link><dc:creator>龙屠日</dc:creator><author>龙屠日</author><pubDate>Sat, 27 Feb 2010 05:09:00 GMT</pubDate><guid>http://www.blogjava.net/longturi/archive/2010/02/27/314057.html</guid><wfw:comment>http://www.blogjava.net/longturi/comments/314057.html</wfw:comment><comments>http://www.blogjava.net/longturi/archive/2010/02/27/314057.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/longturi/comments/commentRss/314057.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/longturi/services/trackbacks/314057.html</trackback:ping><description><![CDATA[<strong>通过WebService上传文件的原理</strong><br />
<br />
我们都知道如何通过WebService把一个字符串形式的参数传递到服务器端的一个函数并取得返回的结果，而通过WebService上传文件的原理和上传一个字符串在根本上是一样的。<br />
唯一不同的是，我们需要多做一点额外的工作，即先读取文件到一个字节数组中，再通过Base64将其转化为字符串。详情请看下面的代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;客户端读取文件然后用Base64将其转化为字符串的函数</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;String&nbsp;getFileByteString(File&nbsp;file)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception{<br />
&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;in&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileInputStream(file);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;取得文件大小</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;length&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;file.length();<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;根据大小创建字节数组</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;bytes&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)&nbsp;length];<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;读取文件内容到字节数组</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;offset&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;numRead&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(offset&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;bytes.length<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;(numRead&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;in.read(bytes,&nbsp;offset,&nbsp;bytes.length&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;offset))&nbsp;</span><span style="color: #000000;">&gt;=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;offset&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;numRead;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;读取完毕的校验&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(offset&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;bytes.length)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IOException(</span><span style="color: #000000;">"</span><span style="color: #000000;">不能完全讀取文件：</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;file.getName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;in.close();<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;encodedFileString&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Base64.encode(bytes);<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;encodedFileString;<br />
}</span></div>
<br />
<strong>服务器端如何将接收到的字符串还原成文件</strong><br />
有了上页函数的帮助，我相信你将它传递到WebSercvice端某函数是必能做到的事，剩下的问题是，如何将接收到的字符串还原成文件呢？<br />
答案是再用Base64将字符串还原成字节数组再将它写入一个文件即可，这样写出来的文件能保证内容和你上传的原文件一致，下面是示例程序：<br />
<br />
WebService服务器端将接收来的字符串还原的文件的过程<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;uploadedFileString是传过来的包含你上传的文件内容的字符串</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">byte</span><span style="color: #000000;">[]&nbsp;bytes&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Base64.decode(uploadedFileString);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;存储路径</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">String&nbsp;path</span><span style="color: #000000;">=</span><span style="color: #000000;">CommonUtil.getUploadPath();<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;存储的文件名</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">String&nbsp;localFileName</span><span style="color: #000000;">=</span><span style="color: #000000;">getLocalFileName(parser.getUserid(),parser.getFileName());<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;写入新文件</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">FileOutputStream&nbsp;out&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileOutputStream(path</span><span style="color: #000000;">+</span><span style="color: #000000;">localFileName);<br />
out.write(bytes);<br />
out.flush();<br />
out.close();</span></div>
<br />
<strong>客户端如何访问已上传的文件</strong><br />
<br />
上传只是手段，我们上传的真正目的其实是下载，就我们刚才上传的文件而言，如何能让人访问到它呢？我们可以如下办理：<br />
1.将上传文件书写在WebService所在Web应用下的某目录中，如upload"1.jpg,这样客户就可以通过这样的URL访问到这个文件http://209.205.177.42:8080/webApp/upload/1.jpg. 上面IP地址是WebSercice应用所在机器的公网地址，webApp是该应用名。<br />
2.在客户端上传文件完毕后，将上述地址以函数返回值的形式告知客户，客户就可以通过网络来访问它了。<br />
<br />
<strong>如何得到WebApp下的upload目录</strong><br />
书写一个在WebApp启动时就启动的Servlet，在其init函数就能得知Webapp所在目录，得到upload目录再往下走一层就行了。下面的InitServlet的示例代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;InitialSystemServlet&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;HttpServlet&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">7444606086930580188L</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;doPost(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;ServletException,&nbsp;java.io.IOException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;doGet(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;ServletException,&nbsp;java.io.IOException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doPost(request,&nbsp;response);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;init(ServletConfig&nbsp;config)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;ServletException&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;设置上传路径</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CommonUtil.setUploadPath(config.getServletContext().getRealPath(</span><span style="color: #000000;">"</span><span style="color: #000000;">/</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
<strong>其它问题</strong><br />
1.如何防止文件被覆盖：在生成文件时采用时间+用户ID+随机数的文件名，这样重名几率就大大降低，还不放心可以在写文件之间检验文件是否已存在了。<br />
2.如何要把文件不放在服务器而是放到数据库怎么办：你可以把文件内容甚至字符串直接存储到数据库，需要下载时再取出来。
<img src ="http://www.blogjava.net/longturi/aggbug/314057.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/longturi/" target="_blank">龙屠日</a> 2010-02-27 13:09 <a href="http://www.blogjava.net/longturi/archive/2010/02/27/314057.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个用于显示本地及网络图片的图片面板类</title><link>http://www.blogjava.net/longturi/archive/2010/02/26/313979.html</link><dc:creator>龙屠日</dc:creator><author>龙屠日</author><pubDate>Fri, 26 Feb 2010 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/longturi/archive/2010/02/26/313979.html</guid><wfw:comment>http://www.blogjava.net/longturi/comments/313979.html</wfw:comment><comments>http://www.blogjava.net/longturi/archive/2010/02/26/313979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/longturi/comments/commentRss/313979.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/longturi/services/trackbacks/313979.html</trackback:ping><description><![CDATA[当图片上传到服务器端的某目录下后，假设是webapp/upload,图片名为1.jpg，那么我们可以使用这样的url来访问到它：<br />
http://localhost:8080/webapp/upload/1.jpg,如果要在Swing程序中显示它，将它交给一个ImageICon类进行处理，得到其image后在面板上绘制即可。<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.awt.Graphics;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.awt.Image;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.net.MalformedURLException;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.net.URL;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.swing.ImageIcon;<br />
<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;用于显示图片的面板<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PicturePanel&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;JPanel{<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">64343434343L</span><span style="color: #000000;">;<br />
<br />
&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;用于展示图片</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Image&nbsp;pictureImage</span><span style="color: #000000;">=</span><span style="color: #000000;">ResourceUtil.SplashWindow_BackgroundImage;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;paintComponent(Graphics&nbsp;g)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(pictureImage</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g.drawImage(pictureImage,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;getWidth(),&nbsp;getHeight(),&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;pictureImage<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getWidth(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">),&nbsp;pictureImage.getHeight(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">),&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;*&nbsp;用于显示本地图片<br />
&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;说明：<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;pictureImage<br />
&nbsp;&nbsp;&nbsp;*&nbsp;创建时间：2010-2-24&nbsp;上午08:22:47<br />
&nbsp;&nbsp;&nbsp;*&nbsp;修改时间：2010-2-24&nbsp;上午08:22:47<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;showPicture(Image&nbsp;pictureImage){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pictureImage</span><span style="color: #000000;">=</span><span style="color: #000000;">pictureImage;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;进行重绘</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;repaint();<br />
&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;*&nbsp;用于显示网络图片<br />
&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;*&nbsp;说明：<br />
&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;pictureUrl<br />
&nbsp;&nbsp;&nbsp;*&nbsp;创建时间：2010-2-25&nbsp;下午10:37:57<br />
&nbsp;&nbsp;&nbsp;*&nbsp;修改时间：2010-2-25&nbsp;下午10:37:57<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;showPicture(String&nbsp;pictureUrl){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pictureImage</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ImageIcon(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;URL(pictureUrl)).getImage();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;进行重绘</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repaint();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(MalformedURLException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
}</span></div>
<br />
<img src ="http://www.blogjava.net/longturi/aggbug/313979.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/longturi/" target="_blank">龙屠日</a> 2010-02-26 12:46 <a href="http://www.blogjava.net/longturi/archive/2010/02/26/313979.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>“交易系统”规划简要说明</title><link>http://www.blogjava.net/longturi/archive/2010/02/25/313873.html</link><dc:creator>龙屠日</dc:creator><author>龙屠日</author><pubDate>Thu, 25 Feb 2010 04:15:00 GMT</pubDate><guid>http://www.blogjava.net/longturi/archive/2010/02/25/313873.html</guid><wfw:comment>http://www.blogjava.net/longturi/comments/313873.html</wfw:comment><comments>http://www.blogjava.net/longturi/archive/2010/02/25/313873.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/longturi/comments/commentRss/313873.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/longturi/services/trackbacks/313873.html</trackback:ping><description><![CDATA[<strong>预想的交易系统要做到什么？</strong><br />
1.信息传递方面--确保供求信息准确迅速的到达需求方。<br />
2.信息展示方面--能充分展示商家的供给和需求。<br />
3.信息交流方面--充分保证供求双方信息的传递。<br />
4.信息搜索方面—使别人能够准确快速找到商家，了解商家。<br />
<br />
<strong>四大能力被那些软件实现了？</strong><br />
1.信息传递方面—动态供求信息网站,大站点的广告。<br />
2.信息展示方面—企业动态静态网站,淘宝,当当.<br />
3.信息交流方面—QQ,MSN,Skype.<br />
4.信息搜索方面—google/baidu.<br />
<br />
<strong>我们的交易系统初步目标</strong><br />
淘宝+QQ<br />
<br />
淘宝能展示商品,但只是被动等客上门的形式,缺乏主动性;淘宝可以进行交流,但受限于网络形式.<br />
QQ能迅速传递信息(仅聊天),形式也较丰富,其形式风格适合我们的需求.<br />
淘宝和QQ已经被广泛接受,如果我们各取所长,对用户来说容易接受.<br />
<br />
<strong>我们的交易系统远景目标</strong><br />
<br />
除了签订纸面合同和面谈,进行交易所需要的步骤都可以在交易系统中运行.<br />
<br />
供求信息可以直接通过系统传递.<br />
产品展示在系统内就可完成,系统负责其网站的同步.<br />
谈判交流方式有文字,语音,视频等多种.<br />
信息搜索像使用搜索引擎一样简便,但更准确.<br />
提供类比,同好,相似联系等帮助手段.<br />
<br />
<strong>交易系统各程序组成</strong><br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/longturi/TPpartS2010225121016.jpg" width="676" height="426" /><br />
<br />
<strong>交易系统各程序说明</strong><br />
NC:最终用户使用的客户端程序.<br />
WS:为用户存取业务数据的WebService服务器<br />
IM:为客户端之间及服务器客户端之间提供即时信息服务的程序<br />
Admin:管理业务数据及广播即时消息的程序.<br />
DB:数据管理程序<br />
<br />
<strong>交易系统各程序联系说明</strong><br />
1:客户端NC之间可以通过TCP/UDP进行即时通信,此项无须通过IM服务器中转.<br />
2.3:客户端NC定时向即时信息服务器端IM索取信息,即时信息服务器IM也可主动将信息传递到客户端NC,此项也是通过的TCP/UDP.<br />
4:客户端程序NC可以通过WebService调用向业务数据服务器WS存取信息.<br />
5:系统管理程序Admin和WebService服务器可以向信息服务器发出广播信息.<br />
6:系统管理程序Admin可以直接处理数据库中的数据.<br />
7:业务数据服务器WS通过Hibernate和存储过程操作数据库中的数据.<br />
8.数据库管理程序DB通过JDBCTemplate及存储过程操作数据库中的数据.<br />
<br />
<br />
<img src ="http://www.blogjava.net/longturi/aggbug/313873.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/longturi/" target="_blank">龙屠日</a> 2010-02-25 12:15 <a href="http://www.blogjava.net/longturi/archive/2010/02/25/313873.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>“交易系统”中几个关键的领域对象</title><link>http://www.blogjava.net/longturi/archive/2010/02/24/313808.html</link><dc:creator>龙屠日</dc:creator><author>龙屠日</author><pubDate>Wed, 24 Feb 2010 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/longturi/archive/2010/02/24/313808.html</guid><wfw:comment>http://www.blogjava.net/longturi/comments/313808.html</wfw:comment><comments>http://www.blogjava.net/longturi/archive/2010/02/24/313808.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/longturi/comments/commentRss/313808.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/longturi/services/trackbacks/313808.html</trackback:ping><description><![CDATA[1.目录（Folder）：用以容纳供求信息。它包含对父目录的引用，子目录的集合和所包含的供求信息的集合。<br />
2.供求信息（SupplyDemandInfo）：表示对商品的供应或是需求信息，供求信息=求购者+商品+数量+地点+有效截止日期。<br />
3.商品（Commodity）：用以容纳对一个商品的描述信息，包括名称，规格，产地，厂家，描述等。<br />
4.用户（User）：登录到系统的用户。<br />
5.公司（Company）：这是用户的附加信息。<br />
<br />
<img src ="http://www.blogjava.net/longturi/aggbug/313808.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/longturi/" target="_blank">龙屠日</a> 2010-02-24 16:31 <a href="http://www.blogjava.net/longturi/archive/2010/02/24/313808.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分页功能中“页标签”的实现</title><link>http://www.blogjava.net/longturi/archive/2010/02/23/313707.html</link><dc:creator>龙屠日</dc:creator><author>龙屠日</author><pubDate>Tue, 23 Feb 2010 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/longturi/archive/2010/02/23/313707.html</guid><wfw:comment>http://www.blogjava.net/longturi/comments/313707.html</wfw:comment><comments>http://www.blogjava.net/longturi/archive/2010/02/23/313707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/longturi/comments/commentRss/313707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/longturi/services/trackbacks/313707.html</trackback:ping><description><![CDATA[有查询必有分页，天下程序无论C/S还是B/S都是如此。只要有分页就需要用到分页标签，在网页中可以用span或是div来实现，而在Swing中，我们可以从JLabel中扩展出一个自己的页标签类来实现它。<br />
<br />
首先看看这个页标签类的外在表现是怎样的：<br />
1.鼠标移动上去高亮，移出来恢复成灰色或是黑色。<br />
2.鼠标点击时能产生事件响应，即产生翻页效果。<br />
3.当标签处于失能（disable）状态时，上述两个效果无效。<br />
<br />
基本就是这样，要求不高，下面是我们的应对之策：<br />
1.让页标签实现MouseListener接口，当mouseEntered时让标签前景色变红，当mouseExited时让标签前景色变黑。<br />
2.在页标签内部制作一个成员变量List&lt;ActionListener&gt; actionListenerList，再实现一个addActionListener方法，这样，外界的监听者就能被加入到这个链表中。同样是理由上面的接口，当mouseReleased（mouseClicked事件也可）时让所有的监听者的actionPerformed事件触发，这样，事件响应就能完成了。<br />
3.在鼠标事件产生时（mouseEntered，mouseExited，mouseReleased），检查标签的enable状态，是false则不进行处理。<br />
<br />
下面请看详细代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.awt.Color;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.awt.event.ActionListener;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.awt.event.MouseEvent;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.awt.event.MouseListener;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.List;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Vector;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.swing.JLabel;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;用于分页的标签，鼠标移动上去变色<br />
&nbsp;*&nbsp;说明：<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;创建时间：2010-2-22&nbsp;下午01:35:56<br />
&nbsp;*&nbsp;修改时间：2010-2-22&nbsp;下午01:35:56<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PagedLabel&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;JLabel&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;MouseListener{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3136812079192762420L</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;监听者列表</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ActionListener</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;actionListenerList;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;构造函数<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;text<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;PagedLabel(String&nbsp;text){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(text);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.setForeground(Color.black);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actionListenerList</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Vector</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ActionListener</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.addMouseListener(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;添加事件监听器<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;actionListener<br />
&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addActionListener(ActionListener&nbsp;actionListener){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actionListenerList.add(actionListener);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;鼠标移入时变成红色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;mouseEntered(MouseEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.isEnabled()&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.isVisible()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.setForeground(Color.red);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;鼠标移出时变成黑色<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;mouseExited(MouseEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.isEnabled()&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.isVisible()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.setForeground(Color.black);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在点击松开后通知所有监听者<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;mouseReleased(MouseEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(e.getButton()</span><span style="color: #000000;">==</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.isEnabled()&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.isVisible()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(ActionListener&nbsp;actionListener:actionListenerList){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actionListener.actionPerformed(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;mousePressed(MouseEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;do&nbsp;nothing</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;mouseClicked(MouseEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;do&nbsp;nothing</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
使用这个标签的示例代码如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PagedLabel&nbsp;refreshBtn</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;PagedLabel(</span><span style="color: #000000;">"</span><span style="color: #000000;">刷新</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refreshBtn.addActionListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ActionListener()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings(</span><span style="color: #000000;">"</span><span style="color: #000000;">deprecation</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;actionPerformed(ActionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pageSearch(currentPage,url,serviceName,methodName,args,cls);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;&nbsp; <br />
</span></div>
这里赘述一下，虽然也可以再次捕获标签的鼠标按下抬起事件作为点击的响应，但上面做法无疑减少了外部代码的复杂度和使用的难度，将他们降低到了使用按钮的层次。简单方便实用，这是每一个框架组件功能的设计者应该为客户程序员着想的地方。在多人合作的环境中，帮助别人就等于帮助自己。<br />
<br />
<br />
最后分页的效果请看：<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/longturi/FengYeLabel.jpg" width="872" height="601" /><br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/longturi/aggbug/313707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/longturi/" target="_blank">龙屠日</a> 2010-02-23 13:26 <a href="http://www.blogjava.net/longturi/archive/2010/02/23/313707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用标注对于缓存设计的改进</title><link>http://www.blogjava.net/longturi/archive/2010/02/22/313576.html</link><dc:creator>龙屠日</dc:creator><author>龙屠日</author><pubDate>Mon, 22 Feb 2010 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/longturi/archive/2010/02/22/313576.html</guid><wfw:comment>http://www.blogjava.net/longturi/comments/313576.html</wfw:comment><comments>http://www.blogjava.net/longturi/archive/2010/02/22/313576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/longturi/comments/commentRss/313576.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/longturi/services/trackbacks/313576.html</trackback:ping><description><![CDATA[在上一篇&#8220;<a id="viewpost1_TitleUrl" href="../archive/2010/02/21/313540.html">交易系统中WebService服务器端缓存的设计</a>&#8221;中，有一个潜在的问题，请看下面代码：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(mothodName.contains(</span><span style="color: #000000;">"</span><span style="color: #000000;">add</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;mothodName.contains(</span><span style="color: #000000;">"</span><span style="color: #000000;">update</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;mothodName.contains(</span><span style="color: #000000;">"</span><span style="color: #000000;">delete</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;写方法来了,这意味着数据变更了,缓存可能不可靠,为安全起见需要重新来过</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />..<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;来的是读方法</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
上面的判断里，对写方法的判断作成了硬编码的形式，这对系统可不是件好事，我们可以用Java1.5中新生的Annotation把它消除掉。<br />
<br />
首先，我们可以制作一个自己的标注：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.lang.annotation.ElementType;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.lang.annotation.Retention;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.lang.annotation.RetentionPolicy;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.lang.annotation.Target;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;用于标识方法对缓存影响的标注,如果isRead=true表示这个方法是读方法，需要缓存；否则是写方法，需要清空缓存<br />
&nbsp;*&nbsp;说明：<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;创建时间：2010-2-22&nbsp;上午08:54:54<br />
&nbsp;*&nbsp;修改时间：2010-2-22&nbsp;上午08:54:54<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
@Target(ElementType.METHOD)<br />
@Retention(RetentionPolicy.RUNTIME)<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;@</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ReadWriteAnnotation{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;isRead();<br />
}</span></div>
<br />
这个标注可以用来注释方法，在程序运行期有效，我们可以在标注方法时给isRead方法附上true和false两个值，这样，具体方法是读方法（查询数据库中的一条或者多条记录）还是写方法（更新数据库的一条或者多条记录）就能通过它标识出来了。<br />
<br />
下面是做出了标识的接口ITmpService：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.dalpha.service.anno.ReadWriteAnnotation;<br />
<br />
</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;TmpService实现类之接口<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;创建时间：2010-2-19&nbsp;下午10:04:34<br />
&nbsp;*&nbsp;修改时间：2010-2-19&nbsp;下午10:04:34<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;ITmpService{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解析参数数组，组合成一个领域对象，然后添加到数据库（写方法）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;@ReadWriteAnnotation(isRead</span><span style="color: #000000;">=</span><span style="color: #0000ff;">false</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;add(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解析参数数组,更新领域对象的一个或多个属性,然后更新数据库中的对应记录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;@ReadWriteAnnotation(isRead</span><span style="color: #000000;">=</span><span style="color: #0000ff;">false</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;update(String[]&nbsp;args)</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解析参数数组得到要删除的领域对象的Id,然后根据它删除数据库中的对应记录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;@ReadWriteAnnotation(isRead</span><span style="color: #000000;">=</span><span style="color: #0000ff;">false</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;delete(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;解析参数数组得到要取得的领域对象的Id,然后根据它渠道数据库中的对应记录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;@ReadWriteAnnotation(isRead</span><span style="color: #000000;">=</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getById(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;按条件进行分页查询<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;注意这里的条件最好写全,最好根据数组内容走不同的分支,不要写各种各样的查询函数,这样不方便缓存的处理<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;@ReadWriteAnnotation(isRead</span><span style="color: #000000;">=</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;pagedSearchBy(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;按条件进行查询,除了不分页要求和上面函数(pagedSearchBy)一致<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;@ReadWriteAnnotation(isRead</span><span style="color: #000000;">=</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;search(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;按ID取得信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@throws</span><span style="color: #008000;">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;@ReadWriteAnnotation(isRead</span><span style="color: #000000;">=</span><span style="color: #0000ff;">true</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getInfoById(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception;<br />
}</span></div>
<br />
对于实现类我们是不需要标识的，这也是使用接口编程的好处之一。<br />
<br />
剩下来，我们在拦截器中取出标识并判断即可，请看下面的代码的粗体部分：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;*&nbsp;Service方法的拦截器<br />
&nbsp;*&nbsp;此拦截器用作缓存使用，每个Service配置一个。<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;创建时间：2010-2-19&nbsp;下午10:42:42<br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;修改时间：2010-2-19&nbsp;下午10:42:42<br />
&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ServiceMethodInterceptor&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;MethodInterceptor{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;日志记录器</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Logger&nbsp;logger&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Logger.getLogger(ServiceMethodInterceptor.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;作为缓存的哈希表</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Map</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String,Object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;cacheMap</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Hashtable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String,Object</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;invoke(MethodInvocation&nbsp;invocation)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Throwable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;className</span><span style="color: #000000;">=</span><span style="color: #000000;">invocation.getClass().getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;mothodName</span><span style="color: #000000;">=</span><span style="color: #000000;">invocation.getMethod().getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span style="color: #000000;">"</span><span style="color: #000000;">类'</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">className</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">'的方法'</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">mothodName</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">'将得到调用!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;取得在方法上的标注</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>ReadWriteAnnotation&nbsp;anno</strong></span><strong><span style="color: #000000;">=</span><span style="color: #000000;">invocation.getMethod().getAnnotation(ReadWriteAnnotation.</span><span style="color: #0000ff;">class</span></strong><span style="color: #000000;"><strong>);</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(<strong>anno.isRead()</strong></span><strong><span style="color: #000000;">==</span><span style="color: #0000ff;">false</span></strong><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;写方法来了,这意味着数据变更了,缓存可能不可靠,为安全起见需要重新来过</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cacheMap.clear();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result</span><span style="color: #000000;">=</span><span style="color: #000000;">invocation.proceed();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span style="color: #000000;">"</span><span style="color: #000000;">类'</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">className</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">'的方法'</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">mothodName</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">'调用完毕!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;来的是读方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;通过组合方法名和参数来得到key</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sb</span><span style="color: #000000;">=</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;StringBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(mothodName</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;arr</span><span style="color: #000000;">=</span><span style="color: #000000;">invocation.getArguments();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;arr2</span><span style="color: #000000;">=</span><span style="color: #000000;">(String[])arr[</span><span style="color: #000000;">0</span><span style="color: #000000;">];</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;这一步的转化是很重要的</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(Object&nbsp;obj:arr2){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(obj</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key</span><span style="color: #000000;">=</span><span style="color: #000000;">sb.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;拿Key查看缓存中是否有内容,有则直接返回即可</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(cacheMap.containsKey(key)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span style="color: #000000;">"</span><span style="color: #000000;">直接得到缓存中的结果!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;cacheMap.get(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result</span><span style="color: #000000;">=</span><span style="color: #000000;">invocation.proceed();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cacheMap.put(key,&nbsp;result);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span style="color: #000000;">"</span><span style="color: #000000;">类'</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">className</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">'的方法'</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">mothodName</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">'调用完毕!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
这样，判断方法是读还是写的硬编码就消除了。虽然说花费了一些工夫，但&#8220;勿以恶小而为之，勿以善小而不为&#8221;，只要是对系统有利的事，我们还是要去做的，只要对系统不利的事，我们必须多家防范，小心杜绝。<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/longturi/aggbug/313576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/longturi/" target="_blank">龙屠日</a> 2010-02-22 09:22 <a href="http://www.blogjava.net/longturi/archive/2010/02/22/313576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>交易系统中数据WebService服务器输出输出的设计(待续)</title><link>http://www.blogjava.net/longturi/archive/2010/02/21/313550.html</link><dc:creator>龙屠日</dc:creator><author>龙屠日</author><pubDate>Sun, 21 Feb 2010 08:57:00 GMT</pubDate><guid>http://www.blogjava.net/longturi/archive/2010/02/21/313550.html</guid><wfw:comment>http://www.blogjava.net/longturi/comments/313550.html</wfw:comment><comments>http://www.blogjava.net/longturi/archive/2010/02/21/313550.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/longturi/comments/commentRss/313550.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/longturi/services/trackbacks/313550.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一.为什么采取WebService作为客户端和服务器之间的桥梁.&nbsp;&nbsp;在交易系统中,一般不会让客户端直接对数据库进行操作,这样做的原因一是为了安全性,客户端能连接到数据库太让人不放心了;二是为了适用性,一般客户端和数据库服务器物理距离很远,难以达成有效连接;三是为了效率,用户很多常见操作都是相同的,如果缓存起来将大为提高系统的响应速度.综合以上,我觉得让WebSe...&nbsp;&nbsp;<a href='http://www.blogjava.net/longturi/archive/2010/02/21/313550.html'>阅读全文</a><img src ="http://www.blogjava.net/longturi/aggbug/313550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/longturi/" target="_blank">龙屠日</a> 2010-02-21 16:57 <a href="http://www.blogjava.net/longturi/archive/2010/02/21/313550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>交易系统中WebService服务器端缓存的设计</title><link>http://www.blogjava.net/longturi/archive/2010/02/21/313540.html</link><dc:creator>龙屠日</dc:creator><author>龙屠日</author><pubDate>Sun, 21 Feb 2010 08:16:00 GMT</pubDate><guid>http://www.blogjava.net/longturi/archive/2010/02/21/313540.html</guid><wfw:comment>http://www.blogjava.net/longturi/comments/313540.html</wfw:comment><comments>http://www.blogjava.net/longturi/archive/2010/02/21/313540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/longturi/comments/commentRss/313540.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/longturi/services/trackbacks/313540.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 对一个成规模的系统来说，缓存总是不可或缺的一个环节，甚至会成为系统成功的重要因素。从原理来讲，缓存并不神秘，它本质上只是一个哈希表，内部包含许多提取关键字和缓存内容的键值对，当有读操作（如search）新的查询到来时，系统先到这个哈希表中看看是否有同样的关键字存在，是则取出对应的值返回，否则进行查询，并把新的查询条件和结果存储进哈希表，以便下次提取；当有写操作（如add，delete，up...&nbsp;&nbsp;<a href='http://www.blogjava.net/longturi/archive/2010/02/21/313540.html'>阅读全文</a><img src ="http://www.blogjava.net/longturi/aggbug/313540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/longturi/" target="_blank">龙屠日</a> 2010-02-21 16:16 <a href="http://www.blogjava.net/longturi/archive/2010/02/21/313540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>交易系统客户端程序中所采用的MVC2模式</title><link>http://www.blogjava.net/longturi/archive/2010/02/20/313452.html</link><dc:creator>龙屠日</dc:creator><author>龙屠日</author><pubDate>Sat, 20 Feb 2010 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/longturi/archive/2010/02/20/313452.html</guid><wfw:comment>http://www.blogjava.net/longturi/comments/313452.html</wfw:comment><comments>http://www.blogjava.net/longturi/archive/2010/02/20/313452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/longturi/comments/commentRss/313452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/longturi/services/trackbacks/313452.html</trackback:ping><description><![CDATA[<strong>为什么要采用MVC模式来书写程序的功能。<br />
</strong>&nbsp;&nbsp;&nbsp; 因为一个成熟的交易系统一定会涉及相当多的功能，界面表现，用户交互和数据处理都会随着程序的发展而变得越来越复杂，如果不在一开始就对它们进行分开处理，最后只能导致不可维护的结果，届时悔之晚矣。只有迈出了这坚实稳固的一步，后面的成功才有可靠的保证。<strong><br />
<br />
一.MVC2模式的来源</strong><br />
&nbsp;&nbsp;
这种模式首见于网络程序，起初因为Model无法通知到Web程序的界面而发明.这种模式采用Controller做中介者，一方面取得View的输入，然后交由Model层处理，之后再把返回的数据传递到View。<br />
<br />
在Web程序（典型例子如Struts1）中各层任务如下：<br />
View接受用户输入,并在并传递到Controller.<br />
Controller统一进行处理命令,交由Model处理具体的业务.<br />
进过处理Model更新后,Controller会选一个View并把Model内容传递(request,session)给它(forward).<br />
然后View进行显示.<br />
<br />
<strong>二.MVC2的优缺点</strong><br />
&nbsp;&nbsp;
MVC2相对MVC1优势很明显，首先Model和View无需继承别的类，其次Model和View无需了解对方的存在，只需准备相应的接口而已，最主要的是，是进行了数据部分，视图部分和控制部分三层的区分，程序的耦合度将大为降低，而可读性和可修改性将随之提高；缺点对于规模较小的程序或是组件，MVC2有些过度设计。<br />
<br />
<strong>三.在客户端程序中MVC各层担负的职责</strong><br />
<br />
<u>视图View：它担任数据的显示并接受用户的输入，其中不包括业务逻辑，但可以包含显示逻辑。</u><br />
<br />
<u>数据中心Model：它保存数据层和控制层所需要的数据并提供操作这些数据的方法。</u><br />
<br />
<u>控制器Ctrl：它是一个中介者，负责实例化视图和数据中心，由此View和Model并不需要知道对方的存在。View的事件在Ctrl中注册，这样当事件发生时Ctrl能调用Model取得相应的数据并显示在View中。Ctrl中包含处理逻辑。</u><br />
<br />
下面的UML图形您可以参考：<br />
MVC2静态类图<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/longturi/MVC2StaticClassDiagram.jpg" width="319" height="275" /><br />
<br />
MVC2顺序图<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/longturi/MVC2SequenceDiagram.jpg" width="386" height="414" /><br />
<br />
下面是最简化的MVC三层次代码示例：<br />
控制类 <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Mvc2Ctrl&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Mvc2View&nbsp;view;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Mvc2Model&nbsp;model;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Mvc2Ctrl()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Mvc2View();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Mvc2Model();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handleEvents();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;处理事件响应</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;handleEvents()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addCloseLintener();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addButtonListener();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addButtonListener2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;窗体关闭事件相应</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addCloseLintener()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.addWindowListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;WindowAdapter()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;windowClosing(WindowEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Exit&nbsp;MVC2</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addButtonListener()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.getButton().addActionListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ActionListener()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;actionPerformed(ActionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.getLabel().setText(model.getText());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;addButtonListener2()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.getButton2().addActionListener(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ActionListener()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;actionPerformed(ActionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;view.getLabel2().setText(model.getText2());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
&nbsp;
<br />
<br />
视图类 <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Mvc2View&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;JFrame&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">621145935910133202L</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JButton&nbsp;button;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JLabel&nbsp;label;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JButton&nbsp;button2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;JLabel&nbsp;label2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Mvc2View()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;locateView(</span><span style="color: #000000;">300</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">200</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.setTitle(</span><span style="color: #000000;">"</span><span style="color: #000000;">MVC2&nbsp;Program</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setupComponents();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.setVisible(</span><span style="color: #0000ff;">true</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;定位程序在屏幕正中并设置程序大小</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;locateView(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;width,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;height)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dimension&nbsp;screenSize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Toolkit.getDefaultToolkit().getScreenSize();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.setSize(width,&nbsp;height);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.setLocation(screenSize.width&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;width&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;screenSize.height<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;height&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;初始化内部组件</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setupComponents()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JButton(</span><span style="color: #000000;">"</span><span style="color: #000000;">点击响应事件1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JLabel(</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;等待事件响应1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;button2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JButton(</span><span style="color: #000000;">"</span><span style="color: #000000;">点击响应事件2</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label2&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;JLabel(</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;等待事件响应2</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setLayout(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;GridLayout(</span><span style="color: #000000;">2</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add(button);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add(label);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add(button2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add(label2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;JButton&nbsp;getButton()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;button;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;JButton&nbsp;getButton2()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;button2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;JLabel&nbsp;getLabel()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;label;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;JLabel&nbsp;getLabel2()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;label2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
} <br />
</span></div>
<br />
模块类 <br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Mvc2Model{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getText(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;事件1响应完毕</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getText2(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;&nbsp;事件2响应完毕</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
} <br />
</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/longturi/aggbug/313452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/longturi/" target="_blank">龙屠日</a> 2010-02-20 14:13 <a href="http://www.blogjava.net/longturi/archive/2010/02/20/313452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>“交易系统”目录索引(内容补全中)</title><link>http://www.blogjava.net/longturi/archive/2010/02/09/312447.html</link><dc:creator>龙屠日</dc:creator><author>龙屠日</author><pubDate>Tue, 09 Feb 2010 13:43:00 GMT</pubDate><guid>http://www.blogjava.net/longturi/archive/2010/02/09/312447.html</guid><description><![CDATA[说明:交易系统是本人制作的一个系统,目前处于起步阶段,写出来希望和大家共同探讨.<br />
<br />
一.需求分析<br />
&nbsp;&nbsp; 1.系统能提供的东西<br />
<br />
二.系统规划<br />
&nbsp;&nbsp; 1.<a title="&#8220;交易系统&#8221;规划简要说明" href="../../longturi/archive/2010/02/25/313873.html">&#8220;交易系统&#8221;规划简要说明</a><br />
<br />
三.系统设计<br />
&nbsp;&nbsp; 1.<a href="../../longturi/archive/2010/02/20/313452.html">客户端MVC方案的设计</a>.<br />
&nbsp;&nbsp; 2.<a title="数据WebService服务器输出输出的设计" href="../../longturi/archive/2010/02/21/313550.html">数据WebService服务器输出输出的设计</a>.<br />
&nbsp;&nbsp; 3.<a title="数据WebService服务器端缓存的设计." href="../../longturi/archive/2010/02/21/313540.html">数据WebService服务器端缓存的设计</a>.<br />
&nbsp;&nbsp;&nbsp;&nbsp; 3.1 <a title="缓存改进之一--使用标注消除判断方法是读方法还是写方法" href="../../longturi/archive/2010/02/22/313576.html">缓存改进之一--使用标注消除判断方法是读方法还是写方法</a>.<br />
<br />
四.解决方案<br />
&nbsp;&nbsp;
1.分页功能的实现<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1.1 <a title="分页功能中&#8220;页标签&#8221;的实现" href="../../longturi/archive/2010/02/23/313707.html">分页功能中&#8220;页标签&#8221;的实现</a><br />
&nbsp;&nbsp; 2.图片上传功能<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1.1 <a title="图片上传的实现" href="http://www.blogjava.net/longturi/archive/2010/02/27/314057.html">图片上传的实现</a><br />
&nbsp;&nbsp;&nbsp;&nbsp; 1.2 <a title="图片显示的实现" href="../../longturi/archive/2010/02/26/313979.html">图片显示的实现</a><br />
&nbsp;&nbsp;&nbsp;&nbsp; 1.3 <a title="在表格中显示网络图片" href="http://www.blogjava.net/longturi/archive/2010/02/28/314108.html">在表格中显示网络图片</a><br />
<img src ="http://www.blogjava.net/longturi/aggbug/312447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/longturi/" target="_blank">龙屠日</a> 2010-02-09 21:43 <a href="http://www.blogjava.net/longturi/archive/2010/02/09/312447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>