﻿<?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-Dev Zone</title><link>http://www.blogjava.net/dev/</link><description>&lt;table width="40%"&gt;
&lt;tr&gt;&lt;td width="100%" align="right"&gt;
   &lt;nobr&gt;&lt;i&gt;
偏执狂才能生存，人生/事业的路上需要再坚持一下&lt;br&gt;
但是又怎么说得清坚持的结果，道得尽坚持的含义
   &lt;/i&gt;&lt;/nobr&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description><language>zh-cn</language><lastBuildDate>Sat, 18 Apr 2026 11:09:19 GMT</lastBuildDate><pubDate>Sat, 18 Apr 2026 11:09:19 GMT</pubDate><ttl>60</ttl><item><title>struts上传文件，验证失败表单数据丢失的原因</title><link>http://www.blogjava.net/dev/archive/2006/03/15/35337.html</link><dc:creator>dev</dc:creator><author>dev</author><pubDate>Tue, 14 Mar 2006 22:10:00 GMT</pubDate><guid>http://www.blogjava.net/dev/archive/2006/03/15/35337.html</guid><wfw:comment>http://www.blogjava.net/dev/comments/35337.html</wfw:comment><comments>http://www.blogjava.net/dev/archive/2006/03/15/35337.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/dev/comments/commentRss/35337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dev/services/trackbacks/35337.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 发现一个问题，使用struts进行文件上传，如果有些参数没有完全定义在ActionForm中，需要从request.getParameter获取，在表单提交并且validate失败返回input页面时，这部分需要从request.getPrameter获取的参数数据都丢失了，即使再对request进行multipart解析也不能得到。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; 经过分析，发现struts的ActionServlet在接收到multipart请求之后，在RequestProcessor中会对request进行封装：MultiRequestWrapper，然后在Action执行完之后，又将已经封装的request重新还原。以下是部分代码，截直RequestProcessor：<BR><BR>封装：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">protected</SPAN><SPAN style="COLOR: #000000">&nbsp;HttpServletRequest&nbsp;processMultipart(HttpServletRequest&nbsp;request)&nbsp;</SPAN><SPAN id=Codehighlighter1_78_465_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></SPAN><SPAN id=Codehighlighter1_78_465_Open_Text><SPAN style="COLOR: #000000">{<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #000000">!</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">POST</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">.equalsIgnoreCase(request.getMethod()))&nbsp;</SPAN><SPAN id=Codehighlighter1_140_180_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></SPAN><SPAN id=Codehighlighter1_140_180_Open_Text><SPAN style="COLOR: #000000">{<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;(request);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;contentType&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;request.getContentType();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;((contentType&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN style="COLOR: #000000">&amp;&amp;</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contentType.startsWith(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">multipart/form-data</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">))&nbsp;</SPAN><SPAN id=Codehighlighter1_342_411_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></SPAN><SPAN id=Codehighlighter1_342_411_Open_Text><SPAN style="COLOR: #000000">{<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;(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;MultipartRequestWrapper(request));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN id=Codehighlighter1_418_458_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></SPAN><SPAN id=Codehighlighter1_418_458_Open_Text><SPAN style="COLOR: #000000">{<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;(request);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN></DIV><BR>还原：<BR>&nbsp;&nbsp; 在doForward和doInclude中在forward和include之前都执行了下面的代码：<BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(request&nbsp;</SPAN><SPAN style="COLOR: #0000ff">instanceof</SPAN><SPAN style="COLOR: #000000">&nbsp;MultipartRequestWrapper)&nbsp;</SPAN><SPAN id=Codehighlighter1_56_138_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></SPAN><SPAN id=Codehighlighter1_56_138_Open_Text><SPAN style="COLOR: #000000">{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;((MultipartRequestWrapper)&nbsp;request).getRequest();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN></DIV><BR><BR>&nbsp;&nbsp;&nbsp;&nbsp; 问题就出现在这儿。在经过测试之后，发现request只能进行一次multipart解析，这或许和解析request的时候调用了request.inputStream有关，第一次调用之后再调用就不能获取其中的有效内容了。因此发现request在调用CommonsMultipartRequestHandler.handleRequest进行解析后并还原后，调用common-upload对request进行解析已经得不到任何得提交内容了，因此当Form验证失败，返回input页面时，即使再进行multpart解析，也不能通过request.getPrameter取到你想要的数据。而此时，表单中的数据却不会丢失（定义在ActionForm中的表单域），这是因为struts的html系列tag在redisplay时值都是从ActionForm获取的。<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在将RequestProcessor.doForward和doInclude中还原request的语句注释后，问题得到了解决。到目前还不清楚为什么struts要还原request，难道是因为chain的原因？<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; webwork中应该不会出现这个问题，因为webwork中无论ServletDispatcher还是FilterDispatcher在对request wrap之后都没有再还原。<img src ="http://www.blogjava.net/dev/aggbug/35337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dev/" target="_blank">dev</a> 2006-03-15 06:10 <a href="http://www.blogjava.net/dev/archive/2006/03/15/35337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The output format must have a '{http://xml.apache.org/xalan}content-handler' property！</title><link>http://www.blogjava.net/dev/archive/2006/03/03/33534.html</link><dc:creator>dev</dc:creator><author>dev</author><pubDate>Fri, 03 Mar 2006 11:46:00 GMT</pubDate><guid>http://www.blogjava.net/dev/archive/2006/03/03/33534.html</guid><wfw:comment>http://www.blogjava.net/dev/comments/33534.html</wfw:comment><comments>http://www.blogjava.net/dev/archive/2006/03/03/33534.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/dev/comments/commentRss/33534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dev/services/trackbacks/33534.html</trackback:ping><description><![CDATA[tomcat、jdk1.4下出现The output format must have a '{http://xml.apache.org/xalan}content-handler' property!的原因：<BR>&nbsp;&nbsp;&nbsp; 这是因为系统、tomcat或者jdk使用了老版本的xalan.jar。系统如果本身没有使用，而tomcat/common/lib、tomcat/common/endorsed/lib、tomcat/shared/lib下又没有xalan.jar的话，那就是jdk使用了老版本的xalan.jar——在jre\lib\rt.jar里面。下载最新的xalan.jar然后放到tomcat/common/endorsed下即可解决这一问题。<img src ="http://www.blogjava.net/dev/aggbug/33534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dev/" target="_blank">dev</a> 2006-03-03 19:46 <a href="http://www.blogjava.net/dev/archive/2006/03/03/33534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于企业发展的4个阶段和企业管理的4个阶段</title><link>http://www.blogjava.net/dev/archive/2006/02/21/31723.html</link><dc:creator>dev</dc:creator><author>dev</author><pubDate>Mon, 20 Feb 2006 18:13:00 GMT</pubDate><guid>http://www.blogjava.net/dev/archive/2006/02/21/31723.html</guid><wfw:comment>http://www.blogjava.net/dev/comments/31723.html</wfw:comment><comments>http://www.blogjava.net/dev/archive/2006/02/21/31723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dev/comments/commentRss/31723.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dev/services/trackbacks/31723.html</trackback:ping><description><![CDATA[暂时记下，没想透彻，思考所得、个人见解以后再加入。<BR><BR>企业发展的4个阶段： 
<LI>产品阶段 
<LI>资产阶段 
<LI>资本阶段 
<LI>品牌阶段<BR><BR>企业管理的4个阶段： 
<LI>人治，嘴上说 
<LI>法治，建立制度 
<LI>企业文化 
<LI>目标管理，充分发挥员工的积极主动型，自我管理</LI>
<P>&nbsp;</P><img src ="http://www.blogjava.net/dev/aggbug/31723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dev/" target="_blank">dev</a> 2006-02-21 02:13 <a href="http://www.blogjava.net/dev/archive/2006/02/21/31723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDK1.5给GUI开发带来的一点欣喜</title><link>http://www.blogjava.net/dev/archive/2005/05/17/4453.html</link><dc:creator>dev</dc:creator><author>dev</author><pubDate>Tue, 17 May 2005 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/dev/archive/2005/05/17/4453.html</guid><wfw:comment>http://www.blogjava.net/dev/comments/4453.html</wfw:comment><comments>http://www.blogjava.net/dev/archive/2005/05/17/4453.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dev/comments/commentRss/4453.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dev/services/trackbacks/4453.html</trackback:ping><description><![CDATA[<P>　　JDK1.5出来很久了，一直没有研究。这倒不是没有时间，而是觉得J2EE服务器要支持JDK1.5还需要一段时间，而多数客户还在使用JDK1.4，因此要基于JDK1.5开发Web应用程序还不现实，因此一直没有去弄这玩意。</P>
<P>　　今天由于研究Desktop的开发，装了1.5，发现1.5中Java程序已经可以获得本地系统的外观，我试着不断的变换了xp的theme，Java程序始终能够保持和系统的外观一致；而且以前使用SkinLF后，在web start程序中JOptionPane的窗体经常出不来的问题也解决了。这可是一个非常好的消息。</P>
<P>　　另一个好消息是JDK的下一个版本将对Swing/AWT组件进行增强。</P>
<P>　　为Java感到高兴！</P><img src ="http://www.blogjava.net/dev/aggbug/4453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dev/" target="_blank">dev</a> 2005-05-17 22:12 <a href="http://www.blogjava.net/dev/archive/2005/05/17/4453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Desktop开发资源</title><link>http://www.blogjava.net/dev/archive/2005/05/17/4452.html</link><dc:creator>dev</dc:creator><author>dev</author><pubDate>Tue, 17 May 2005 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/dev/archive/2005/05/17/4452.html</guid><wfw:comment>http://www.blogjava.net/dev/comments/4452.html</wfw:comment><comments>http://www.blogjava.net/dev/archive/2005/05/17/4452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dev/comments/commentRss/4452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dev/services/trackbacks/4452.html</trackback:ping><description><![CDATA[<P>这里列出一部分Java Desktop的开发资源。</P>
<P><STRONG>1。</STRONG><A href="http://community.java.net/javadesktop/"><STRONG>A java.net community for JavaDeskTop</STRONG></A></P>
<P>　　这是sun主持的资源很全的社区，有很多关于JavaDeskTop开发的资源。</P>
<P><STRONG>2。</STRONG><A href="https://jdic.dev.java.net/"><STRONG>JDIC</STRONG></A><STRONG>（Java Desktop Integration Components）</STRONG></P>
<P>　　Sun主持的致力于java和本地应用程序集成、交互的组件集，非常棒。目前有5大组件。</P>
<P>　　Desktop</P>
<P>　　FileTypes</P>
<P>　　Brower</P>
<P>　　System Tray Icon</P>
<P>　　Packager</P>
<P><STRONG>3。</STRONG><A href="http://jdnc.dev.java.net/"><STRONG>JDNC</STRONG></A><STRONG>（Java Desktop Network Component）</STRONG></P>
<P><STRONG>4。</STRONG><A href="http://www.duckware.com/jexepack/index.html"><STRONG>JExePack</STRONG></A></P>
<P>　　一个将Java程序转化为Exe程序的组件。</P>
<P><STRONG>5。</STRONG><A href="http://jsmooth.sourceforge.net/"><STRONG>JSmooth</STRONG></A></P>
<P>　　作用同JExePack。</P>
<P><STRONG>6。</STRONG><A href="http://javaservice.objectweb.org/"><STRONG>JavaService</STRONG></A></P>
<P>　　一个将Java程序转化为NT Service的组件。</P>
<P><STRONG>7。</STRONG><A href="http://www.l2fprod.com/"><STRONG>SKinLF</STRONG></A></P>
<P>　　非常棒的Java LookAndFeel实现，采用配置包的形式定义Java的LookAndFeel，可以很方便的定义自己的LookAndFeel。它的网站上提供了大量Skin下载，其中不乏精品。</P>
<P><STRONG>8。</STRONG><A href="http://www.jgoodies.com/"><STRONG>JGoodies</STRONG></A></P>
<P>　　JGoodies最出名的是它的FormLayout，它使swing和AWT应用程序的布局变得非常简单。由于它的影响，已经有专门针对它的DESIGNER出现，Eclipse也有相应的插件支持。FormLayout使Java的几个默认Layout相形见绌。</P>
<P>　　JGoodies还有一组Swing/Awt组件，可以很方便的创建Wizard、对话框、Splash窗体、About窗体等GUI部件。</P>
<P><STRONG>9。</STRONG><A href="http://rachel.sourceforge.net/"><STRONG>Rachel</STRONG></A><STRONG>（Open Source Resource Loading Toolkit for Java Web Start ）</STRONG></P>
<P>　　和WebStart打过交道的人可能知道，要在webstart中读取解析zip或者jar资源是一件非常困难的事，然而有些资源又必须以zip或者jar的形式存在，比如SKinLF就是这样。Rachel使你不再为这种事情烦恼。它提供两种解决方案：采用class://的协议装载URL资源，内嵌一个小型的多线程http server。</P>
<P><STRONG>10。</STRONG><A href="http://java.sun.com/products/javahelp/"><STRONG>JavaHelper</STRONG></A><STRONG>（JavaHelp System）</STRONG></P>
<P>　　Sun提供的制作Java Help制作系统。允许你在GUI应用程序、Applet中提供Online Help功能。</P>
<P><STRONG>11。</STRONG><A href="http://www.ej-technologies.com/products/exe4j/overview.html"><STRONG>Exe4j</STRONG></A></P>
<P>　　Java 安装程序制作工具。</P>
<P><STRONG>12。</STRONG><A href="http://www.jgraph.com/"><STRONG>JGraph</STRONG></A></P>
<P>　　非常出名的Java 图形编辑框架。</P>
<P><STRONG>13。</STRONG><A href="http://gef.tigris.org/"><STRONG>GEF</STRONG></A><STRONG>（Graphic Edit Framework）</STRONG></P>
<P>　　非常好的图形编辑框架，虽然没有JGraph出名，但是我始终觉得它的结构和API都比JGraph好，扩展性非常好。</P>
<P><STRONG>14。</STRONG><A href="http://www.yworks.com/"><STRONG>yworks</STRONG></A></P>
<P>　　它的<A href="http://www.yworks.com/en/products_yguard_about.htm">YGuard</A>是一个非常棒的混淆器，免费的，功能很强。除了YGuard它还有几个非常好的组件。</P>
<P><STRONG>15。</STRONG><A href="http://java.sun.com/docs/books/tutorial/uiswing/index.html"><STRONG>Create GUI with JFC/Swing</STRONG></A></P>
<P>　　Sun的JFC/Swing编程初学者指南。</P>
<P><STRONG>16。</STRONG><A href="http://java.sun.com/docs/books/tutorial/dnd/index.html"><STRONG>Drag and Drop</STRONG></A></P>
<P>　　Sun的关于在GUI中实现拖放操作的教学文章。</P>
<P><STRONG>17。</STRONG><A href="http://today.java.net/pub/au/79"><STRONG>Joshua Marinacci</STRONG></A><STRONG>的Blog</STRONG></P>
<P>　　有很多介绍GUI编程的好文章。</P>
<P><STRONG>18。</STRONG><A href="http://www.javaworld.com/javaworld/jw-09-2004/jw-0906-tabbedpane.html"><STRONG>CloseAndMaxTabbedPane An enhanced JTabbedPane</STRONG></A></P>
<P>　　JavaWorld上一篇关于如何在JTabbedPane的Tab上添加Close按钮、Maximize 按钮和PopupMenu的文章，有源代码下载。还可以。</P>
<P><STRONG>19。</STRONG><A href="http://java.sun.com/developer/technicalArticles/GUI/swing/wizard/index.html"><STRONG>Creating Wizard Dialogs with Java Swing</STRONG></A></P>
<P>　　Sun上的介绍用Swing创建类似Elipse Wizard对话框的文章。</P><img src ="http://www.blogjava.net/dev/aggbug/4452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dev/" target="_blank">dev</a> 2005-05-17 22:11 <a href="http://www.blogjava.net/dev/archive/2005/05/17/4452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SkinLF乱码问题的分析与解决</title><link>http://www.blogjava.net/dev/archive/2005/05/17/4451.html</link><dc:creator>dev</dc:creator><author>dev</author><pubDate>Tue, 17 May 2005 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/dev/archive/2005/05/17/4451.html</guid><wfw:comment>http://www.blogjava.net/dev/comments/4451.html</wfw:comment><comments>http://www.blogjava.net/dev/archive/2005/05/17/4451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dev/comments/commentRss/4451.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dev/services/trackbacks/4451.html</trackback:ping><description><![CDATA[<P>　　SkinLF（<A href="http://www.l2fprod.com/">http://www.l2fprod.com/</A>）是一个非常漂亮的Java LookAndFee组件，它的外观可以配置，由一组小图片和一个skinlf-themepack.xml构成。SkinLF的网站上提供了很多Skin下载，这里<A href="http://www.l2fprod.com/software/skinlf/jnlp/demo.jnlp">http://www.l2fprod.com/software/skinlf/jnlp/demo.jnlp</A>可以看到SkinLF和这些外观的演示。可惜的是除了默认的themepack.zip之外，其他外观（好像有很少几个除外）都有中文乱码的问题。其实这是这些外观使用的字体导致的。</P>
<P>　　打开外观zip文件中的skinlf-themepack.xml，你会发现其他外观的配置文件比themepack.zip中的配置文件多了一些地方：</P>
<DIV class=k><SPAN class=c><SPAN class=m><FONT color=#0000ff><!--</font></span></span>&nbsp;<font face="新宋体">&nbsp;&nbsp;&nbsp; Fonts&nbsp;&nbsp;</font><span class="b"><strong><font face="Courier New" color="#ff0000">&nbsp;</font></strong></span> <font color="#0000ff"><span class="m">--></FONT></SPAN>
<SCRIPT></SCRIPT>
</SPAN></DIV>
<DIV class=e>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"><SPAN class=b><STRONG><FONT face="Courier New" color=#ff0000>&nbsp;</FONT></STRONG></SPAN> <SPAN class=m><FONT color=#0000ff>&lt;</FONT></SPAN><SPAN class=t><FONT color=#990000>font</FONT></SPAN> <SPAN class=t><FONT color=#990000>name</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>Global</B><SPAN class=m><FONT color=#0000ff>"</FONT></SPAN><SPAN class=t><FONT color=#990000> value</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>SansSerif,0,11</B><FONT color=#0000ff><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN></FONT> </DIV></DIV>
<DIV class=e>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"><SPAN class=b><STRONG><FONT face="Courier New" color=#ff0000>&nbsp;</FONT></STRONG></SPAN> <SPAN class=m><FONT color=#0000ff>&lt;</FONT></SPAN><SPAN class=t><FONT color=#990000>font</FONT></SPAN> <SPAN class=t><FONT color=#990000>name</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>InternalFrame.titleFont</B><SPAN class=m><FONT color=#0000ff>"</FONT></SPAN><SPAN class=t><FONT color=#990000> value</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>Trebuchet MS,1,11</B><FONT color=#0000ff><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN></FONT> </DIV></DIV>
<DIV class=e>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"><SPAN class=b><STRONG><FONT face="Courier New" color=#ff0000>&nbsp;</FONT></STRONG></SPAN> <SPAN class=m><FONT color=#0000ff>&lt;</FONT></SPAN><SPAN class=t><FONT color=#990000>font</FONT></SPAN> <SPAN class=t><FONT color=#990000>name</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>TabbedPane.font</B><SPAN class=m><FONT color=#0000ff>"</FONT></SPAN><SPAN class=t><FONT color=#990000> value</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>Tahoma,0,11</B><FONT color=#0000ff><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN></FONT> </DIV></DIV>
<DIV class=e>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"><SPAN class=b><STRONG><FONT face="Courier New" color=#ff0000>&nbsp;</FONT></STRONG></SPAN> <SPAN class=m><FONT color=#0000ff>&lt;</FONT></SPAN><SPAN class=t><FONT color=#990000>font</FONT></SPAN> <SPAN class=t><FONT color=#990000>name</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>MenuBar.font</B><SPAN class=m><FONT color=#0000ff>"</FONT></SPAN><SPAN class=t><FONT color=#990000> value</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>Tahoma,0,11</B><FONT color=#0000ff><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN></FONT> </DIV></DIV>
<DIV class=e>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"><SPAN class=b><STRONG><FONT face="Courier New" color=#ff0000>&nbsp;</FONT></STRONG></SPAN> <SPAN class=m><FONT color=#0000ff>&lt;</FONT></SPAN><SPAN class=t><FONT color=#990000>font</FONT></SPAN> <SPAN class=t><FONT color=#990000>name</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>MenuItem.font</B><SPAN class=m><FONT color=#0000ff>"</FONT></SPAN><SPAN class=t><FONT color=#990000> value</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>Tahoma,0,11</B><FONT color=#0000ff><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN></FONT> </DIV></DIV>
<DIV class=e>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"><SPAN class=b><STRONG><FONT face="Courier New" color=#ff0000>&nbsp;</FONT></STRONG></SPAN> <SPAN class=m><FONT color=#0000ff>&lt;</FONT></SPAN><SPAN class=t><FONT color=#990000>font</FONT></SPAN> <SPAN class=t><FONT color=#990000>name</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>PopupMenu.font</B><SPAN class=m><FONT color=#0000ff>"</FONT></SPAN><SPAN class=t><FONT color=#990000> value</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>Tahoma,0,11</B><FONT color=#0000ff><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN></FONT> </DIV></DIV>
<DIV class=e>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"><SPAN class=b><STRONG><FONT face="Courier New" color=#ff0000>&nbsp;</FONT></STRONG></SPAN> <SPAN class=m><FONT color=#0000ff>&lt;</FONT></SPAN><SPAN class=t><FONT color=#990000>font</FONT></SPAN> <SPAN class=t><FONT color=#990000>name</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>Menu.font</B><SPAN class=m><FONT color=#0000ff>"</FONT></SPAN><SPAN class=t><FONT color=#990000> value</FONT></SPAN><SPAN class=m><FONT color=#0000ff>="</FONT></SPAN><B>Tahoma,0,11</B><FONT color=#0000ff><SPAN class=m>"</SPAN><SPAN class=m> /&gt;</SPAN></FONT> </DIV>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"></DIV>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"></DIV>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"></DIV>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em">　把这些注释掉，然后把配置文件放回到zip文件中就可以了。当然你还可以尝试采用其他的字体。</DIV>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"></DIV>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em">　</DIV>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em">　采用JGoodies的LookAndFeel出现乱码，我曾经以为是UTF-8的问题，现在看来可能也是字体导致的。可惜的是，JGoodies的LookAndFeel不能配置。</DIV>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"></DIV>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"></DIV>
<DIV style="MARGIN-LEFT: 1em; TEXT-INDENT: -2em"></DIV></DIV><img src ="http://www.blogjava.net/dev/aggbug/4451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dev/" target="_blank">dev</a> 2005-05-17 22:11 <a href="http://www.blogjava.net/dev/archive/2005/05/17/4451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Rachel轻松解决Web Start装载资源难的问题</title><link>http://www.blogjava.net/dev/archive/2005/05/17/4450.html</link><dc:creator>dev</dc:creator><author>dev</author><pubDate>Tue, 17 May 2005 14:11:00 GMT</pubDate><guid>http://www.blogjava.net/dev/archive/2005/05/17/4450.html</guid><wfw:comment>http://www.blogjava.net/dev/comments/4450.html</wfw:comment><comments>http://www.blogjava.net/dev/archive/2005/05/17/4450.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/dev/comments/commentRss/4450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dev/services/trackbacks/4450.html</trackback:ping><description><![CDATA[<P><FONT size=2>　　下午，试用了SkinLF（<A href="http://www.l2fprod.com/">http://www.l2fprod.com</A>），感觉非常好，程序的外观得到了很大的改善，还可以根据自己的需要随意调整得到自己想要的外观，但是要将SkinLF应用到Web Start中还有点问题。这是因为，web start使用到的资源必须包装成jar文件，以<JAR href="jarfilename.jar" /><JAR href="jarfile.jar" />的形式定义到jnlp资源文件中，而SkinLF的外观配置文件是zip形式的。也许有人会说，把zip转化成jar文件就可以了。是的，想象中这应当是可以的，可是实际情况不是如此，你会发现使用ClassLoader.getResourceStream("themepack.jar")的时候返回了Null，SkinLookAndFeel.loadLookAndFeel()会异常Stream closed.</FONT></P>
<P><FONT size=2>　　调试之后发现，即使是在客户端，在Eclipse中运行的时候，如果不把themepack.jar定义到ClassPath中，也是无法加载的。</FONT></P>
<P><FONT size=2>　　我想这是一个普遍的问题，根据我的理解，如果其他资源，比如图片、xml文件、属性文件等等能够被加载，themepack.jar也应该被加载。事实上应该是这样，但是关键在于SkinLF需要采用ZipInputStream解析zip（jar）文件，这时情况就不一样了。具体的原因目前没有搞清楚。</FONT></P>
<P><FONT size=2>　　在网上找了半天，终于发现一个Open Source的组件：Rachel，使用它很轻易就可以解决上面提到的问题。</FONT></P>
<P><FONT size=2>　　<STRONG><FONT color=#3366cc>Rachel</FONT></STRONG>（</FONT><A href="http://rachel.sourceforge.net/"><FONT size=2>http://rachel.sourceforge.net</FONT></A><FONT size=2>）是一个为解决Web start装载资源困难而开发的组件。它提供了两种方法解决资源装载问题。</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp; </FONT><FONT size=2><STRONG><FONT size=3>方法一，使用class://URL Handler。</FONT><BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个方法采用新的URL协议：class://从jar文件中获取资源。</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>Step 1</STRONG>，注册新的URL Handler，以支持class://协议(protocal)。<BR>&nbsp;&nbsp;&nbsp;&nbsp; 例子：java.net.URL.setURLStreamHandlerFactory( new RachelUrlFactory() );</FONT></P>
<P><FONT size=2>&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>Step 2</STRONG>，采用class://协议构造URL，从jar文件中读取资源。<BR>　　语法：class://<CLASS /><CLASS />/<PATH /><PATH /><BR>　　例子：<BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">:</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">test.LookAndFeelTest/themepack.zip</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">:</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">com.l2fprod.gui.plaf.skin.SkinLookAndFeel/themepack.zip</SPAN></DIV></DIV>
<P><BR>　　<EM>注意：</EM>这里，<CLASS /><CLASS />是Rachel用来定义资源文件所在的jar的，后面的<PATH />相对于jar中的根目录而言。上述例子中的jar的结构如下：<BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test.jar:<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">LookAndFeelTest.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">l2fprod</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">gui</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">plaf</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">skin</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">SkinLookAndFeel.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000"><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;themepack.zip<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;images</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">example.png<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;html</SPAN><SPAN style="COLOR: #000000">/</SPAN><SPAN style="COLOR: #000000">index.htm<BR></SPAN></DIV></DIV>
<P></FONT><FONT size=2>　　<STRONG>Step 3</STRONG>，采用java.net.URL获取资源。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp; URL&nbsp;url&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;URL(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">class://test.LookAndFeelTest/themepack.zip</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;url&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;URL(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">class://test.LookAndFeelTest/html/index.html</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;url&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;URL(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">class://test.LookAndFeelTest/images/example.png</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;URL&nbsp;url&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;URL(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">class://com.l2fprod.gui.plaf.skin.SkinLookAndFeel/themepack.zip</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;SkinLookAndFeel.setSkin(&nbsp;SkinLookAndFeel.loadThemePack(url)&nbsp;);</SPAN></DIV></DIV>
<P></FONT><FONT size=2>　　</FONT><FONT size=3><STRONG>方法二，在程序中嵌入多线程的，小型的http server。</STRONG></FONT></P>
<P><FONT size=2>　　<STRONG>Step 1</STRONG>，把你的资源放到jar中。</FONT></P>
<P><FONT size=2>　　<STRONG>Step 2</STRONG>，在每一个jar中增加一个anchor class，帮组server定位资源所在的jar文件，这点类似于方法一class://<CLASS /><CLASS />/<PATH /><PATH />的的<CLASS /><CLASS />。<BR>　　例子：<BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #000000">　　　</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;CrossRefAnchor<BR>　　　{<BR>　　　　　</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;CrossRefAnchor()&nbsp;{}<BR>　　　}<BR></SPAN></DIV></DIV>
<P>　　CrossRefAnchor没有任何的实际意义，只是为了帮组定义资源所在的jar。</FONT></P>
<P><FONT size=2>　　<STRONG>Step 3</STRONG>，为每一个包含资源的jar用ClassResourceLoader注册到WebResourceManager。<BR>　　例子：<BR></FONT></P>
<P><FONT size=2></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #000000">　　　WebResourceManager&nbsp;roots&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;WebResourceManager.getInstance();<BR>　　　roots.addResourceLoader(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ClassResourceLoader(&nbsp;CrossRefAnchor.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;)&nbsp;);<BR>　　　roots.addResourceLoader(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ClassResourceLoader(&nbsp;JavaDocAnchor.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;)&nbsp;);<BR></SPAN></DIV></DIV>
<P>　　<STRONG>Step 4</STRONG>，启动Server。<BR>　　例子：<BR></FONT><FONT size=2></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #000000">　　　</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR>　　　{<BR>　　　　　WebServer&nbsp;http&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;WebServer(&nbsp;</SPAN><SPAN style="COLOR: #000000">7272</SPAN><SPAN style="COLOR: #000000">,&nbsp;roots&nbsp;);<BR>　　　　　http.start();<BR>　　　}<BR>　　　</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">(&nbsp;IOException&nbsp;e&nbsp;)<BR>　　　{<BR>　　　　　e.printStackTrace();<BR>　　　}<BR></SPAN></DIV></DIV>
<P>　　<STRONG>Step 5</STRONG>，采用URL从server获取资源。<BR>　　例子：<BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #000000">　　　URL&nbsp;crossRefUrl&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;URL(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://localhost:7272/crossref/index.html</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR>　　　URL&nbsp;url&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;URL(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://localhost:7272/test.LookAndFeelTest/themepack.zip</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR>　　　URL&nbsp;url&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;URL(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://localhost:7272/test.LookAndFeelTest/html/index.html</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR>　　　URL&nbsp;url&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;URL(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">http://localhost:7272/test.LookAndFeelTest/images/example.png</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;);<BR></SPAN></DIV></DIV></FONT><img src ="http://www.blogjava.net/dev/aggbug/4450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dev/" target="_blank">dev</a> 2005-05-17 22:11 <a href="http://www.blogjava.net/dev/archive/2005/05/17/4450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GEF的弹出式菜单闪烁的问题</title><link>http://www.blogjava.net/dev/archive/2005/05/17/4449.html</link><dc:creator>dev</dc:creator><author>dev</author><pubDate>Tue, 17 May 2005 14:10:00 GMT</pubDate><guid>http://www.blogjava.net/dev/archive/2005/05/17/4449.html</guid><wfw:comment>http://www.blogjava.net/dev/comments/4449.html</wfw:comment><comments>http://www.blogjava.net/dev/archive/2005/05/17/4449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dev/comments/commentRss/4449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dev/services/trackbacks/4449.html</trackback:ping><description><![CDATA[<P>我使用的是GEF0.10(<A href="http://gef.tigris.org">http://gef.tigris.org</A>)，在某一个Fig上点击鼠标右键弹出PopupMenu时，发现有闪烁的现象，经过追查发现，一个鼠标右击动作会分别触发Editor.mousePressed(e)、mouseReleased(e)、mouseClicked(e)三个事件，这些事件最终都要流经ModeManager，而ModeManager采取的是广播的方式分发这些事件，把这些事件依次转发给mode对列中的所有Mode。ModePopup是默认的一个Mode之一，负责提供Fig的弹出菜单功能。而ModePopup中的这三个事件都作了如下的判断：&nbsp;</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #000000">&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;me)&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;popUpDisplayed&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">false</SPAN><SPAN style="COLOR: #000000">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff"><FONT color=#ff6600>if(me.isPopupTrigger() || me.getModifiers() == InputEvent.BUTTON3_MASK)</FONT></SPAN><SPAN style="COLOR: #000000">&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;popUpDisplayed&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;showPopup(me);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(LOG.isDebugEnabled())&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(popUpDisplayed)&nbsp;LOG.debug(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">MousePressed&nbsp;detected&nbsp;as&nbsp;a&nbsp;popup&nbsp;and&nbsp;popup&nbsp;displayed&nbsp;and&nbsp;event&nbsp;consumed</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">else</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;LOG.debug(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">MousePressed&nbsp;detected&nbsp;as&nbsp;a&nbsp;popup&nbsp;but&nbsp;no&nbsp;popup&nbsp;to&nbsp;display</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">;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.debug(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">MousePressed&nbsp;is&nbsp;not&nbsp;a&nbsp;popup&nbsp;trigger</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR></SPAN></DIV></DIV>
<P>&nbsp;</P>
<P>其中加红的这段不知道为什么要作<FONT color=#ff6600>me.getModifiers() == InputEvent.BUTTON3_MASK</FONT><FONT color=#000000>的判断，加上这个判断后只要是鼠标右击动作，ModePopup的mousePressed、mouseReleased和mouseClicked事件中showPopup的代码都要被执行，这样在一个鼠标右击动作中实际上弹出了三次PopupMenu，因此造成了闪烁。解决办法是extend默认的ModePopup，覆盖这三个方法，将判断改成</FONT><FONT color=#ff6600>if ( me.isPopupTrigger())</FONT>即可。</P><img src ="http://www.blogjava.net/dev/aggbug/4449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dev/" target="_blank">dev</a> 2005-05-17 22:10 <a href="http://www.blogjava.net/dev/archive/2005/05/17/4449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的dynamic-update</title><link>http://www.blogjava.net/dev/archive/2005/05/17/4448.html</link><dc:creator>dev</dc:creator><author>dev</author><pubDate>Tue, 17 May 2005 14:10:00 GMT</pubDate><guid>http://www.blogjava.net/dev/archive/2005/05/17/4448.html</guid><wfw:comment>http://www.blogjava.net/dev/comments/4448.html</wfw:comment><comments>http://www.blogjava.net/dev/archive/2005/05/17/4448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dev/comments/commentRss/4448.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dev/services/trackbacks/4448.html</trackback:ping><description><![CDATA[<P>今天做了一个测试，发现Hibernate的dynamic-update只在两种条件下生效：</P>
<P>1。同一session内，对已经persisit的对象进行update，这里的“已经persist”是指update之前先进行了create或者load调用。代码示例：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #000000">Session&nbsp;session&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;openSession();<BR>User&nbsp;user&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(User)session.load(User.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Long(</SPAN><SPAN style="COLOR: #000000">12</SPAN><SPAN style="COLOR: #000000">));<BR>user.setAddress(</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">);<BR>session.update(user);<BR>session.flush();<BR><BR></SPAN></DIV></DIV>
<P>将hibernate配置成show_sql=true，可以看到update产生的sql语句。</P>
<P>2。不同session之间，update传入的对象是另一个session中的persist对象（对该对象调用了create或者load方法）。代码示例：<BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #000000">Session&nbsp;session1&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;openSession();<BR>User&nbsp;user&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;(User)session1.load(User.</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">,</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Long(</SPAN><SPAN style="COLOR: #000000">12</SPAN><SPAN style="COLOR: #000000">));<BR><BR>Session&nbsp;session2&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;openSession();<BR>user.setAddress(</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">);<BR>session2.merge(user);<BR>session2.flush();<BR><BR></SPAN></DIV></DIV>
<P><BR>如果将session2.merge(..)改成update，则会更新所有可更新的属性。<BR></P><img src ="http://www.blogjava.net/dev/aggbug/4448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dev/" target="_blank">dev</a> 2005-05-17 22:10 <a href="http://www.blogjava.net/dev/archive/2005/05/17/4448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PDCA理论与项目管理</title><link>http://www.blogjava.net/dev/archive/2005/05/17/4447.html</link><dc:creator>dev</dc:creator><author>dev</author><pubDate>Tue, 17 May 2005 14:09:00 GMT</pubDate><guid>http://www.blogjava.net/dev/archive/2005/05/17/4447.html</guid><wfw:comment>http://www.blogjava.net/dev/comments/4447.html</wfw:comment><comments>http://www.blogjava.net/dev/archive/2005/05/17/4447.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/dev/comments/commentRss/4447.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/dev/services/trackbacks/4447.html</trackback:ping><description><![CDATA[<P>今天在csdn上看到了一篇介绍PDCA理论在项目管理中应用的blog，很是感慨，想想才到公司的时候老总也给我们做过相关培训，一年下来，要是没有看到这篇blog，铁定是想不起来了。PDCA（计划、实施、检察、优化）是一个很好的理论，现摘录这篇blog的内容如下，以为珍藏。</P>
<P>以下内容出自：<A href="http://blog.csdn.net/wwwxuhong/archive/2004/12/20/222804.aspx">http://blog.csdn.net/wwwxuhong/archive/2004/12/20/222804.aspx</A>&nbsp;</P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>项目管理是个很大的课题<BR>所有的事物都有其规律<BR><BR>项目管理的规律是什么？<BR>前几天看到一个理论让我眼睛一亮，陈述如下，希望对大家有点启发<BR><BR>PDCA循环是由美国统计学家戴明博士提出来的，它反映了质量管理活动的规律。P（Plan）表示计划；D（Do）表示执行；C（Check）表示检查；A（Action）表示处理。PDCA循环是提高产品质量，改善企业经营管理的重要方法，是质量保证体系运转的基本方式。<BR><BR>项目管理的PDCA环。<BR>PDCA是指以下四个阶段，这四个阶段是环环相扣的，这个周期是周而复始的<BR>P&nbsp; Plan&nbsp; 计划<BR>D&nbsp; Do&nbsp;&nbsp;&nbsp;&nbsp;实施<BR>C Check 检查<BR>A Action 总结、再优化<BR><BR>不管是多大的项目，还是多小的任务，如果都用PDCA环实施，环环相扣，就可以大大提高管理的质量，最大程度地保障项目的成功实施。<BR><BR>PDCA分以下八上步骤<BR>计划阶段<BR>&nbsp;&nbsp;&nbsp;&nbsp;1、分析现状<BR>&nbsp;&nbsp;&nbsp;&nbsp;2、找出问题的原因<BR>&nbsp;&nbsp;&nbsp;&nbsp;3、分析产生问题的原因<BR>&nbsp;&nbsp;&nbsp;&nbsp;4、找出其中的主要原因<BR>&nbsp;&nbsp;&nbsp;&nbsp;5、拟订措施计划<BR>实施阶段<BR>&nbsp;&nbsp;&nbsp;&nbsp;6、执行技术组织措施计划<BR>检查阶段<BR>&nbsp;&nbsp;&nbsp;&nbsp;7、把执行结果与预定目标对比<BR>总结、再优化阶段<BR>&nbsp;&nbsp;&nbsp;&nbsp;8、巩固成绩，进行标准化<BR><BR>转贴一篇相关文章<BR>&nbsp; 在企业中，通过众多小小的变革可能实现对整个企业的持久改善，从而获得巨大的成效。这在日语中叫做“改善”（kaizen），每一步都很小，这儿一个小变化，那儿一个小改进，但几年后就能发展出完全不同的产品、工序或服务。<BR>　　PDCA循环是由美国统计学家戴明博士提出来的，它反映了质量管理活动的规律。P（Plan）表示计划；D（Do）表示执行；C（Check）表示检查；A（Action）表示处理。PDCA循环是提高产品质量，改善企业经营管理的重要方法，是质量保证体系运转的基本方式。 </FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　PDCA循环的特点PDCA表明了质量管理活动的四个阶段，每个阶段又分为若干步骤。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　在计划阶段，要通过市场调查、用户访问等，摸清用户对产品质量的要求，确定质量政策、质量目标和质量计划等。它包括现状调查、原因分析、确定要因和制定计划四个步骤。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　在执行阶段，要实施上一阶段所规定的内容，如根据质量标准进行产品设计、试制、试验，其中包括计划执行前的人员培训。它只有一个步骤：执行计划。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　在检查阶段，主要是在计划执行过程之中或执行之后，检查执行情况，看是否符合计划的预期结果。该阶段也只有一个步骤：效果检查。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　在处理阶段，主要是根据检查结果，采取相应的措施。巩固成绩，把成功的经验尽可能纳入标准，进行标准化，遗留问题则转入下一个PDCA循环去解决。它包括两个步骤：巩固措施和下一步的打算。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　PDCA循环四阶段各步骤。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　1.PDCA循环一定要按顺序进行，它靠组织的力量来推动，像车轮一样向前滚进，周而复始，不断循环。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　2.企业每个科室、车间、工段、班组，直至个人的工作，均有一个PDCA循环，这样一层一层地解决问题，而且大环套小环，一环扣一环，小环保大环，推动大循环。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　这里，大环与小环的关系，主要是通过质量计划指标连接起来，上一级的管理循环是下一级管理循环的根据，下一级的管理循环又是上一级管理循环的组成部分和具体保证。通过各个小循环的不断转动，推动上一级循环，以至整个企业循环不停转动。通过各方面的循环，把企业各项工作有机地组织起来，纳入企业质量保证体系，实现总的预定质量目标。因此，PDCA循环的转动，不是哪一个人的力量，而是组织的力量、集体的力量，是整个企业全体职工推动的结果。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　3.每通过一次PDCA循环，都要进行总结，提出新目标，再进行第二次PDCA循环，使质量管理的车轮滚滚向前。PDCA每循环一次，质量水平和管理水平均提高一步。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　PDCA循环不仅是质量管理活动规律的科学总结，是开展质量管理活动的科学程序，也是一种科学管理的工作方法。它同样可以在质量管理活动以外发挥重要效用。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　PDCA管理法在营销中的运用在运用PDCA循环进行市场营销管理方面，已经有一些优秀企业走在了前头。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　海尔集团纯熟地采用PDCA管理法来实施销售任务的计划、组织和控制。每年年终，集团商流、各产品本部根据本年度的销售额完成情况，结合各产品的发展趋势及竞争对手分析等信息，制定下一年度的销售计划，然后将这一计划分解至全国11个销售事业部。销售事业部长根据各工贸上年的完成情况、市场状况分析等信息再将销售额计划分解至其下属各工贸公司。工贸公司总经理将任务分解至各区域经理，由他们将任务下达至区域代表，区域代表将自己的销售额任务分解至其所管辖的营销网络。同时，海尔还从时间纬度上进行分解：年度计划分解至月度，月度计划分解至每日。这样，处于管理层的每位管理者都可以对下属每日的工作状况进行监督，并及时实施纠偏，最终控制每一个具体网点。海尔集团在新产品开发、新品上市等所有方面都遵循PDCA管理方法。这种做法可以保证“人人都管事，事事有人管”，避免出现管理的真空。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　PDCA管理法运用于每日的事务管理，就形成了独具海尔特色的OEC日清体系。每人均处于相应的岗位上，每一岗位均有不同的职责，并分配相应的指标，员工的激励直接与指标挂钩。指标又可分为主项指标与辅项指标以及临时任务指标等。每人在当日晚上分析一天的各项任务完成情况，并找出差距原因及纠偏办法，以使今后的工作质量得到提高，由此构成了持续不断的改进过程。员工在做完当日总结后，对明日工作做出计划，然后将OEC日清表交至主管领导处，由主管领导进行审核控制并对下属的当日工作进行评价和激励。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　OEC管理法的主要理念，海尔认为是“坚持两个原则，最大限度地对待两种人”，即坚持闭环原则，坚持优化原则，最大限度地关心员工的生活，最大限度地满足用户的需求。所谓闭环原则，指凡事要善始善终，都必须遵循PDCA循环，而且是螺旋上升。所谓优化原则，指根据木桶理论，找出薄弱项，及时整改，提高全系统的水平。在一个企业的运营过程中，必然存在着许多环节，只要找出制约企业经济效益提高的某一关键环节，把首要矛盾解决了，其他矛盾就可以迎刃而解。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　张瑞敏说，海尔生产线每天要出大大小小几万台家电产品，我们不能考虑出了问题如何处理，而要追求不出任何问题。OEC管理法把质量互变规律作为基本思想，坚持日事日清，积沙成塔，使员工素养、企业素质与管理水平的提高寓于每日工作之中，通过日积月累的管理进步，使生产力诸要素的组合与运行达到合理优化的状态，不增加投入就可使现实生产力获得尽可能大的提高，从而令管理收到事半功倍的效果。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　海尔把PDCA运用到企业内部的营销队伍管理上，那么，这种管理方法对外部营销是否适用呢？</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　上海通用汽车公司成功地把此方法应用于自己的经销体系中，极大地改善了经销商的服务。在其近100家经销商中，上海通用奉行的政策是，对一些业务表现不好、不能完成上海通用的要求、不能在市场上进行有效的开拓，或者在售后服务方面不能够完全按照上海通用的理念和规范去操作的经销商，会先给他们做一个PDCA改进计划。完成了这个计划性的四部曲后，经销商的整个市场营销的管理工作应该会随之步入一个良性循环的轨道。如果还是不行，经销商就会被淘汰掉。</FONT></P>
<P><FONT face=宋体,sans-serif color=#006666 size=1>　　由上可知，PDCA管理法的核心在于通过持续不断的改进，使企业的各项事务在有效控制的状态下向预定目标发展。</FONT></P><img src ="http://www.blogjava.net/dev/aggbug/4447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/dev/" target="_blank">dev</a> 2005-05-17 22:09 <a href="http://www.blogjava.net/dev/archive/2005/05/17/4447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>