<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>lokki</title>
    <description></description>
    <link>http://lokki.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>docbook经验记录</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/205555" style="color:red;">http://lokki.javaeye.com/blog/205555</a>&nbsp;
          发表时间: 2008年06月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="postbody">
<p>今天学到一点docbook经验：</p>
<p>（1）一个比较全面的docbook样式指引： DocBook XSL: The Complete Guide <a href="http://www.sagehill.net/docbookxsl/index.html">http://www.sagehill.net/docbookxsl/index.html</a>
 
</p>
<p>（2）如果图片过大，超出PDF右边界，有时候可以简单地设置图片居中让图片显示全: </p>
<p>&lt;imagedata fileref=&quot;images/status/cs_status.png&quot; align=&quot;center&quot; /&gt;</p>
<p>或者更好的办法：</p>
<p class="MsoPlainText"><!--  [if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:TrackMoves/>
  <w:TrackFormatting/>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:DoNotPromoteQF/>
  <w:LidThemeOther>EN-US</w:LidThemeOther>
  <w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:SplitPgBreakAndParaMark/>
   <w:DontVertAlignCellWithSp/>
   <w:DontBreakConstrainedForcedTables/>
   <w:DontVertAlignInTxbx/>
   <w:Word11KerningPairs/>
   <w:CachedColBalance/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:DoNotOptimizeForBrowser/>
  <m:mathPr>
   <m:mathFont m:val="Cambria Math"/>
   <m:brkBin m:val="before"/>
   <m:brkBinSub m:val="&#45;-"/>
   <m:smallFrac m:val="off"/>
   <m:dispDef/>
   <m:lMargin m:val="0"/>
   <m:rMargin m:val="0"/>
   <m:defJc m:val="centerGroup"/>
   <m:wrapIndent m:val="1440"/>
   <m:intLim m:val="subSup"/>
   <m:naryLim m:val="undOvr"/>
  </m:mathPr></w:WordDocument>
</xml><![endif]--><!--  [if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267">
  <w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 1"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 2"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 3"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 4"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 5"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 6"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 7"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 8"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 9"/>
  <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
  <w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/>
  <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
  <w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
  <w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
  <w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
  <w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
  <w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
  <w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
  <w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
  <w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
  <w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
  <w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
  <w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
  <w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
  <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
  <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
 </w:LatentStyles>
</xml><![endif]--><span style="font-family: 宋体;">对任何会超过</span>
<span lang="EN-US">PDF</span>
<span style="font-family: 宋体;">宽度的图片都可以这样把图片限制在宽度内</span>
<span lang="EN-US">:</span>
</p>
<p class="MsoPlainText"><span lang="EN-US">&lt;imagedata
fileref=&quot;images/api_jbpm.png&quot; align=&quot;center&quot;
width=&quot;100%&quot; scalefit=&quot;1&quot; /&gt;</span>
</p>
<p>&nbsp;</p>
<p>（3）自定义表格宽度： 
colwidth=&quot;1*&quot;表示此column为标准长度1倍，colwidth=&quot;4*&quot;表示此column为标准列长度的4倍：</p>
<pre name="code" class="xml">&lt;title&gt;状态变化表&lt;/title&gt;
&lt;table&gt;
 &lt;tgroup cols=&quot;3&quot;&gt;
  &lt;colspec colnum=&quot;1&quot; colname=&quot;col1&quot; colwidth=&quot;4*&quot; /&gt;
  &lt;colspec colnum=&quot;2&quot; colname=&quot;col2&quot; colwidth=&quot;6*&quot; /&gt;
  &lt;colspec colnum=&quot;3&quot; colname=&quot;col3&quot; colwidth=&quot;1*&quot; /&gt;    
  &lt;thead&gt;
   &lt;row&gt;</pre>
&nbsp;
<p>&nbsp;</p>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/205555#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 18 Jun 2008 22:23:58 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/205555</link>
        <guid>http://lokki.javaeye.com/blog/205555</guid>
      </item>
      <item>
        <title>用杀手应用开拓电子产品市场</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/198897" style="color:red;">http://lokki.javaeye.com/blog/198897</a>&nbsp;
          发表时间: 2008年05月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          title: 用杀手应用开拓电子产品市场<br />我们这个网络世界和电子世界还有很多有趣的功能还没实现。<br />索尼爱立信的音乐/摄影手机，任天堂的wii，apple都是靠一个有趣的杀手应用，靠这些有名堂的杀手应用在很短几年时间内就赢得了市场。<br /><br />同样，还有很多有趣的功能待开发。<br />比如手机也可仿照wii开发人体参与的手机游戏。<br />比如手机上，可利用最新的GPS技术，手机技术和无线网络开发GPS追逐网络游戏和传宝游戏等。解析一下，传宝不是传销，是在GPS手机物理位置和周围的手机传输一个宝物，令人觉得新鲜有趣，觉得在参与。“追逐网络”也可以设想到类似侦探或其他群体活动这样一些有趣刺激的词。<br /><br />现在有很多很有钱的小公司能过得很滋润，办公环境超好，福利令人眼馋，是因为他用很少的人，为大公司提供头脑服务，而这些头脑服务的输出经过整合到大公司中，大公司也收入不菲，比如广告公司，比如开发功能和服务原型的公司，提供创意服务就是他们的杀手应用，他们不和大公司挤同一个门。<br /><br />你能不能开发一个手机应用，构建一个手机网络的平台，收获了很多用户，让一些只能在网络(就是非常多人的环境)上才能体现新奇有趣的应用得到一轮一轮地持续地推广？ 你将会“钱”途无量。
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/198897#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 31 May 2008 02:29:52 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/198897</link>
        <guid>http://lokki.javaeye.com/blog/198897</guid>
      </item>
      <item>
        <title>instance holder原理和plug-in平台的思考</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/188242" style="color:red;">http://lokki.javaeye.com/blog/188242</a>&nbsp;
          发表时间: 2008年04月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看这个代码:<br />String str2;<br />do{<br />  String str1 = new String("abc");<br />  str2 = new String("cde");<br />}while(false);<br />String str3 = str2;<br />出了以上代码块，str1指向的instance就没有地方hold住了，没办法操作那instance了，这个instance就消失了等待垃圾回收。<br />而出了以上代码块后，str2指向的instance被两个地方hold住了，一个是str2，一个是str3。<br />这是java简单的语法和规则。<br />java简单到可以只缩为“代码”，“内存”和“线程”几个概念，线程是cpu时间片的承载，代码可以通过JNI调用C library和系统调用。“instance1.method1()”中点号可以看作将执行流程和控制切换给这个instance，同时以上这句话不会模糊线程和cpu时间片的概念。<br />在JVM进程里，所有instance对象，都可以看作处在同一个平坦的内存中，包括你web app里的instance或被spring hold住的instance，还是tomcat本身的instance，weblogic也一样。<br />在JMX里注册了一个MBean，JMX能改变web app的参数，web app能接受JMX的改变要求，是因为同一个instance被两个地方hold住了。<br />所以JNDI, JMX, Spring等其中一个基本原理都可看作 : instance holder mechanism for connect(contact) or a container to holder instances<br />Java/J2EE的世界就是container的世界。<br /><br />touch function: shift thread cpu time & control flow to another instance<br />由以上看清jvm内都是一个强关联的整体，关键是你有没有路径去寻址，有时候你只有个接口对象，但没实现类，而你需要的instance其实是被实现类 hold住的，所以你访问不到没暴露给你的东西，你没办法寻址，所以所谓“平台”通过接口将你封闭住了。如果你想设计弱关联的plug-in机制，或许可以从这个角度去想想。弱关联，只是在plug-in内部弱关联而已，你让某plugin内部代码只能通过一条路径寻址到其他plug-in的 instance，那就达到一种比较好的封装性，这条寻址路径也是受你控制的。<br />更具体一点是，某plugin通过一字符串lookup()到另一服务(这其中的过程是，cpu片切换到一个container去执行，container会返回另一服务的instance给你)，就可以与另一服务通讯，如果某时间lookup不到就只有暂时忍忍了，要不就NullPointerException了。如果你想控制plugin间的通讯，可以在返回 instance时加个代理插一脚。如果终端instance没准备好时，平台可能会给一个dummy instance代理，让plugin干不成事，也不会出错。plugin平台肯定是要设计interface的。<br />与lookup()主动式概念类似，Spring或其它instance container或plugin平台会根据某些规则自动组织(注入)instance给你，对象网就是这样组织的，plugin平台就是这样组织的。<br />更弱关联的plugin机制是，调用与平台沟通的方法后不返回另一plugin的instance，只是由平台调用另一plugin的instance后返回执行后数据的instance，比如是XmlBus或SDO这样中间格式的instance。<br />以下给出一个最终化的plugin体系示意图：<br /><img src="http://www.javaeye.com/upload/picture/pic/13219/9a9ef868-20e1-3344-b179-cb1a5fa2ef6b.png?1209487712" /><br />OSGi也脱离不了这样的结构，可以从这个原理思考OSGi中的问题。OSGi还利用上ClassLoader机制。<br /><br />request是个holder, session是个holder, servletcontext也是个holder，tomcat也是个holder，所有对象都是个holder，有reference就是holder/container<br />不知道tomcat context.xml中crossContext="false"是不是也可以用这个原理进行思考。<br />不知道JBoss 5.0从JMX微内核结构转到POJO微内核结构，是不是可以这个原理思考一下，并研究源代码充分吸收JBoss的技术。<br /><br />instance是不能跨越jvm和进程的，jvm间只有通过操作系统机制和tcp port间关联<br /><br />plugin平台还有个欲望是“控制”，或许有人想用AOP来控制，Spring AOP是用动态代理，在其中插入了一个代理Instance，所以是有两个Instance，所以在终端Instance内部调用本Instance其他 method时，不被拦截住。而AspectJ AOP改变了字节码，只有一个Instance
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/188242#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Apr 2008 00:51:17 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/188242</link>
        <guid>http://lokki.javaeye.com/blog/188242</guid>
      </item>
      <item>
        <title>虎奔 </title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/186580" style="color:red;">http://lokki.javaeye.com/blog/186580</a>&nbsp;
          发表时间: 2008年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这是2003年写的一段文字了，今天偶尔翻出来还觉得很有意思便贴了出来:<br />昨天睡得很好，在桌子上睡了，在椅子上睡了，在沙发上睡了，在车上睡了，在sameul梦语的床上睡了，凌晨2点起来，收拾好自己，刷了牙剃了胡子，脚不沾地的下了楼梯，看着小区里清爽的林荫晨道，顿时飞扬的感觉来了，便甩开双袖和衣翼，像猛虎一般奔到公司，各道关卡的保安亦为之侧目<br />来到公司，趁着虎奔的余威，为自己增加了个性签名(从很久以前的longen上抄的)：<br /><br />Longen号启锚驶向了未知而广阔的Internet之海，船上满载着许多奇珍异宝，船员们兴奋地站在甲板上眺望着远方的海天之间的朝阳，银色的浪花在船首分开，与船体磨擦时的声音令人心醉，船长骄傲在站在Longen的舰桥上，仰望飞鸥，俯看神秘的Internet海。一位老者站在船长身边，在船长耳边低声警告说：<br />“荣誉马上会过去的”<br /><br />我以自己的方式和激情实现年轻人的冲动和创造力<br /><br />不过如果没有个性和技能，一个纯真的人很难在这个社会上生存<br /><br />btw: javaeye发新贴时，会将linux/firefox下一个空行变成两个空行，但编辑保存时不会有这个现象。
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/186580#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 Apr 2008 04:02:57 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/186580</link>
        <guid>http://lokki.javaeye.com/blog/186580</guid>
      </item>
      <item>
        <title>用开源软件简单实现的java website cluster结构</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/170549" style="color:red;">http://lokki.javaeye.com/blog/170549</a>&nbsp;
          发表时间: 2008年03月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <img src="http://lokki.javaeye.com/upload/picture/pic/9196/8d6df944-2bf0-30c8-b73b-b3ab4e6d95d8.png" /><br />见上图，用开源软件简单实现的java website cluster结构。这个结构其实是很简易试验的，其中在apache和tomcat这部分，只要熟读tomcat cluster和mod_jk的文档后，并且你是懂得用httpd.conf的话，只要花1,2天的时间就可试验，并用一小jsp程序进行试验。<br />同时，即使用不上完整和大型cluster结构，同一server 硬件内进行单apache+双tomcat的运行结构对小型系统的生产运行环境也是有好处的：<br />更新application classes/lib时，可先停掉一个tomcat，将现时登录用户无缝切换至另一tomcat服务，更新停掉tomcat的classes/lib代码后重新投入服务，再停掉另一tomcat更新代码。tomcat的SimpleTcpCluster其实只是实现简单的在各tomcat间序列化session复制机制，而各tomcat内部还是独立运行的，如果session中变量代码不发生变化的话，问题不大。而用户是感觉不到后台tomcat的切换，对用户来说服务没有停止。这种结构可以处理大部分tomcat需要停止而不希望停止用户服务的问题。<br />注意: 最新版本的mod_jk的配置格式和旧版本(现在网络上搜索到大多数还是旧配置格式)是不同的，建议直接看mod_jk文档。<br /><br />以下是简单配置提示:<br />(1)直接下载tomcat/httpd版本对应的mod_jk.so<br /><br />(2)httpd.conf中加入:<br />LoadModule jk_module modules/mod_jk.so<br /><br />JkWorkersFile /home/apache/conf/workers.properties<br />JkShmFile     /home/apache/logs/mod_jk.shm<br />JkLogFile     /home/apache/logs/mod_jk.log<br />JkLogLevel    info<br />JkMount  /*.jsp lb<br />JkMount /jkstatus/* jkstatus<br /><br />(2)workers.properties配置:<br />worker.list=lb, jkstatus<br />worker.lb.type=lb<br />worker.lb.balance_workers=tomcat01, tomcat02<br /><br />worker.jkstatus.type=status<br /><br />worker.tomcat01.type=ajp13<br />worker.tomcat01.host=localhost<br />worker.tomcat01.port=8009<br /><br />worker.tomcat02.type=ajp13<br />worker.tomcat02.host=localhost<br />worker.tomcat02.port=9009<br /><br />(3)tomcat01/tomcat02的server.xml中配置jvmRoute、AJP端口、Cluster:<br />&lt;Engine name="Catalina" defaultHost="localhost"  jvmRoute="tomcat01"><br /><br />&lt;Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/><br /><br />(4)cluster application web.xml中配置:<br />&lt;distributable /><br /><br />btw: javaeye blog显示将unix下的CRLF显示成两行回车换行。
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/170549#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Mar 2008 15:33:59 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/170549</link>
        <guid>http://lokki.javaeye.com/blog/170549</guid>
      </item>
      <item>
        <title>推荐ubuntu 7.10的stardict星际译王</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/158876" style="color:red;">http://lokki.javaeye.com/blog/158876</a>&nbsp;
          发表时间: 2008年01月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          推荐ubuntu 7.10的stardict星际译王<br /><br />ubuntu 7.10的stardict支持了"选择词典分组>>开启网络词典"功能，其中的&lt;--- Gucharmap --->词典 能显示utf-8/utf-16的值，非常方便web开发。<br />比如"千"字的Gucharmap解析如下:<br /><br />千<br /><br />U+5343 CJK UNIFIED IDEOGRAPH-5343<br /><br />字符常规属性<br /><br />Unicode 分类： 字母，其它<br /><br />其它有用的表示<br /><br />UTF-8: 0xE5 0x8D 0x83<br />UTF-16: 0x5343<br /><br />C 八进制转码的 UTF-8： \345\215\203<br />XML 十进制实体： &#21315;<br />XML 十六进制实体： &#x5343;<br /><br />CJK 表意字符信息<br /><br />英文定义： thousand; many, numerous; very; (Cant.) a cheater, swindler<br />普通话发音： QIAN1<br />粤语发音： cin1<br />日文On发音： SEN<br />日文Kun发音： CHI<br />唐音·古中国发音： *tsen<br />韩语发音： CHEN
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/158876#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 24 Jan 2008 04:43:00 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/158876</link>
        <guid>http://lokki.javaeye.com/blog/158876</guid>
      </item>
      <item>
        <title>ubuntu下手机连接到蓝牙局域网pan/pand</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/153439" style="color:red;">http://lokki.javaeye.com/blog/153439</a>&nbsp;
          发表时间: 2008年01月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ubuntu下手机连接到蓝牙局域网pan/pand<br /><br />这篇文章是专门面向懂得玩ubuntu linux和手机的技术人士<br /><br />索爱在K550以后的主流手机和M608/W958后的智能手机都支持利用蓝牙局域网技术PAN通过蓝牙连接到电脑，通过电脑的网络上互联网，从而享受到了手机免费玩互联网的乐趣，比如PlayNow，可以随便和快速地试听歌曲而不用花费用(仅限试听)，或从mp3百度下载mp3，或收取blog在手机查看。速度比gprs/edge快上几十倍(如果是蓝牙2.0，速度只受你的ADSL和手机处理器限制)，而又没什么什么包月500元封顶这样的费用。PlayNow会给你轻松的感受，程序员的你可以想象出建立一个手机上的P2P音乐网络。<br /><br />PAN在windows下配置很容易，要靠安装蓝牙软件和点鼠标，但出了问题就无法查找，难解决。在ubuntu下掌握了工作原理后就很容易了，配置好后，就非常透明和自动了，手机在每次想开始使用时可以随时连接网络，而不用点任何鼠标开任何软件，是一个free的世界，在windows下则要忍受蹩脚的蓝牙软件，如果你是程序员，甚至感觉到蓝牙软件搞乱了你的系统。<br /><br />我尝试配置了一天下午，搞通了这个，就很畅快了。给我指引和启示主要是如下两篇网上文章，A篇给了一个配置的整体结构，B篇避免了前篇的缺点和复杂，要结合两篇配置的优点才做到一个更好的配置：<br />A篇: http://www.howtoforge.com/bluetooth_pand_debian_etch<br />B篇: http://linux.chinaunix.net/bbs/viewthread.php?tid=884562<br />C篇: 从这篇了解蓝牙PAN NAP网络模式是怎样的, 但其它内容都算复杂，不需深究: http://bluez.sourceforge.net/contrib/HOWTO-PAN<br /> <br />同时，按A篇的说明，配置时和试验单个部分时经常查看 tail -n 100 /var/log/messages 会对Troubleshooting和了解原理非常有好处。<br />有一个比较重要的原理是: 蓝牙网络连接bnep0，只有手机连接上来时，才会生效/可见，手机断开时，bnep0就会消失，这和有线eth0或wifi是不同的。<br /><br /><br />(1)前提准备:首先将你的手机和ubuntu配置起来支持基本的蓝牙连接，即是能搜索到，能输入匹配密码，如果已经能互传文件就是更好了。<br /><br />(2)桌面电脑需要的额外软件: 先按A篇，安装好dhcp3-server:<br />install apt-get install dhcp3-server<br /><br />(3)按A篇在/etc/dhcp3/dhcpd.conf配置好，让手机自动获取ip地址:<br /><br />option domain-name "example.org";(这个无所谓)<br />option domain-name-servers 202.96.128.166, 202.96.134.133;(这个为你的dns server ip)<br /><br />subnet 10.0.254.0 netmask 255.255.255.0 {<br />  authoritative; (这个是A篇的设置没提示的，但手机能连上来，并发出dhcp包后，dhcp server的/var/log/message会提示)<br />  range 10.0.254.1 10.0.254.10;<br />  option domain-name-servers 202.96.128.166;<br />  option domain-name "cache-b.guangzhou.gd.cn";<br />  option routers 10.0.254.1;<br />  option broadcast-address 10.0.254.255;<br />  default-lease-time 600;<br />  max-lease-time 7200;<br />}<br /><br />此时手机没连接上来，没配置好蓝牙网络连接bnep0 ip为10.0.254.1，/etc/init.d/dhcp3-server restart是fail的，因为根本还没这个10.0.254.1这个ip和subnet 10.0.254.0<br /><br />(4)按A篇在/etc/bluetooth/hcid.conf设置: lm accept, master;<br /><br />(5)按A篇在/etc/default/bluetooth设置:<br />PAND_ENABLED=1<br />PAND_OPTIONS="--listen --role=NAP --devup /etc/bluetooth/pan/dev-up" (手机蓝牙pan连接上来时bnep0就会生效，并会自动启动dev-up执行)<br /><br />配置好后，记得:<br />/etc/init.d/bluetooth restart<br /><br />(6)不按A篇在/etc/network/interfaces作任何配置，由B篇的启示，直接在/etc/bluetooth/pan/dev-up设置bnep0的ip地址和nat路由:<br />mkdir /etc/bluetooth/pan<br />vi /etc/bluetooth/pan/dev-up<br />chmod +x /etc/bluetooth/pan/dev-up<br /><br />dev-up内容:<br />#!/bin/sh<br />echo 1 > /proc/sys/net/ipv4/ip_forward<br />ifconfig $1 10.0.254.1 netmask 255.255.255.240 mtu 900<br />iptables -t nat -A POSTROUTING -s 10.0.254.0/24 -j MASQUERADE<br />iptables -A FORWARD -i bnep0 -o eth0 -j ACCEPT<br />iptables -A FORWARD -o bnep0 -i eth0 -j ACCEPT<br />sleep 2<br />/etc/init.d/dhcp3-server restart<br /><br />(7)此时就可以按网上其它文章在手机上建立蓝牙PAN连接上来就可以了就算配置结束和成功了，手机tcp/ip/dns都用默认的自动配置。<br /><br />可以通过tail -n 100 /var/log/messages看到dhcp分配给手机的IP地址，并能ping得通。<br />手机有了IP地址并能以TCP/IP网络的方式运行，会给做软件的你很多想象，你能以你熟悉的socket编程方式开发你的手机应用程序了。
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/153439#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Jan 2008 08:46:26 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/153439</link>
        <guid>http://lokki.javaeye.com/blog/153439</guid>
      </item>
      <item>
        <title>google不翻页UI技术</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/140386" style="color:red;">http://lokki.javaeye.com/blog/140386</a>&nbsp;
          发表时间: 2007年11月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          google reader是不采用翻页UI的，而是动态滚动条和动态AJAX获取数据，差不多滚到底下时，又加载数据，这种方式更好, 少了上一页下一页的点击和等待, 向上滚时，又能回到第一条，而对客户端&amp;服务器端性能没什么影响，因为采用数据显示窗口来做，显示数据也不会多，也可以充分利用客户端来缓存数据，让服务器端接收请求的次数少了<br />
相信这种方式不是google发明的，但我今天才注意到，或许google还有很多我未注意到的东西
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/140386#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 Nov 2007 04:01:23 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/140386</link>
        <guid>http://lokki.javaeye.com/blog/140386</guid>
      </item>
      <item>
        <title>我性格丑陋的一面</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/128051" style="color:red;">http://lokki.javaeye.com/blog/128051</a>&nbsp;
          发表时间: 2007年09月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天晚上的自省时间，发现自己存在一些很可怕的性格和丑陋的一面，或许这如刀子一般伤害了别人的心，而不自觉，我需要改正这一点，也希望被我蒙蔽的人看到这一点。<br />
<br />
我发现自己是一个爱虚荣，想引起别人注目，想在环境中突出自己，想别人看到自己的成绩，喜欢别人给高帽自己戴，&ldquo;想向上司献媚&rdquo;的一个人。或许以前就有发觉的，但今天能到位的用具体词语表达了出来。<br />
<br />
这在一般的情形下可能看不出来，但我回忆最近的言行和思想，向上司作出了许多承诺，希望上司见到一幅美好的景象，因此这些就会控制一个人的脑子，潜潜地让我在言行方面放大自己在工作任务上的作用，有了这个控制了大脑，在另一方面自不然地就会缩小别的同事在任务上的作用，希望别的同事作用不突出，在上司眼里缩小，更甚之，会在好的事情上让自己获得光环，在做得达不到上司要求时，就会让别的同事承担部分责任。我是很想自己承担全部责任的，但脑子被我所不知道的坏思想控制了，就会在自己不知觉时犯错。<br />
<br />
这是一个很可怕的事情，虽然不影响我品德的全部，但会如刀子一般伤害到别人的心，特别的是，我脑子是聪明的，会掩饰言行，不会太突出我潜脑里的欲望，不突出，就造成被我伤害的人无从分辩，吃了苦又无从表达出来，这是一个令人更痛苦，伤害更深的事情。<br />
<br />
性格上的爱慕虚荣，享受高帽，追逐名利，是一时难以改变和会复发的事情。<br />
或许我要真正明白&ldquo;宁静以致远，淡泊以明志&rdquo;，并持之以恒地自省和在心胸胸怀上实际的改变，才能改变这个性格。<br />
显然，我不能出世地改变这个性格，而需要在工作环境中去执行&ldquo;改变自己&rdquo;这种愿望。<br />
<br />
在此推荐一篇文章:<br />
<a href="http://www.lishou.com/2002/njzydpmz.htm" target="_blank">http://www.lishou.com/2002/njzydpmz.htm</a><br />
我把它存到我&ldquo;修身&rdquo;的文件夹里。<br />
<br />
推荐一个blog:<br />
<a href="http://blog.csdn.net/shuangtixi" target="_blank">http://blog.csdn.net/shuangtixi</a><br />
从其中这篇blog文章来看，博主简单的词语和总结，却是很到位很真切的:<br />
<a href="http://blog.csdn.net/shuangtixi/archive/2007/09/24/1798212.aspx" target="_blank">http://blog.csdn.net/shuangtixi/archive/2007/09/24/1798212.aspx</a>
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/128051#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 29 Sep 2007 02:26:18 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/128051</link>
        <guid>http://lokki.javaeye.com/blog/128051</guid>
      </item>
      <item>
        <title>打好手边小工具基础</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/126294" style="color:red;">http://lokki.javaeye.com/blog/126294</a>&nbsp;
          发表时间: 2007年09月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          做什么事情之前，都得先打好基础<br />
<br />
离开旧公司，离开了开发多年的框架后，就没有了基础。<br />
但显然事情不是就此终结，我会有新的开始，新的事情。<br />
需要测试和学习新的知识、脑里存疑的问题、关键的技术点，我需要建立属于自己的小工具套件去作为测试和学习的基础。<br />
在java方面的学习，<br />
第一个建立的小工具是web+spring+hibernate的web模型套件<br />
现在没有什么新技术不是需要通过80端口来进行的，比如webservice, webdav, ajax，想测试这些技术需要一个运行在tomcat里的webapp。<br />
spring是个好东西，已经到了不想舍弃的地步，无入侵变成了全面入侵。<br />
hibernate可以测试hibernate小知识和数据库操作基础，疑难问题，如想将产品技术从jdbc/sql转换至hibernate就需要对复杂的jdbc/sql操作入手用hibernate试一试。<br />
试想一下，一个组员向你请教一个webservice或webdav的问题，要回答就要先测试，总不能先在一个庞大的现成系统里进行测试吧，在现成的系统里测试是下一步。<br />
<br />
这个小工具的关键点是，只有一个默认页面，没有用户表，没有权限等这些东西，而可以让你建立一个没有干扰的环境，很轻便地研究这些技术的细节。同时结合spring，可以扩展到很多技术的研究，当想研究cxf时，是不需要acegi的是不是，当研究jbpm时是不需要cxf的。它的目标是: simple, ant driven, more and more ant target for various template. 它是作为我研究web技术的starter, 每一个研究都从这个小starter配置起。<br />
<br />
在细节实现的关键点是继承和修改自springside的manager和controller建立一个自己的简单的manager和controller父类。<br />
<br />
struts要不要都无所谓吧，作为一个plugin_template吧，在该灵活的地方不灵活，在不该灵活的地方要多处配对让成本和学习曲线变高，又不优雅，它的优点是只是有很多网上经验形成了整套的解决方案，但spring mvc也有整套的方案，有了这个小工具，再去研究一下spring的整套web方案，比如客户端校验、服务器端校验、界面装饰等，然后就掌握了整套结合的细节。WebMVC应该是一个系统里的很小部分，没必要为这个花费大量的精力和成本，并且牺牲了许多，当你觉得这是很重的一部分并成为负累时就要毅然抛弃它，要不它还会跟随你许多年，想一下一个每月发3w工资的测试团队在测试了一/二/三年后，发现需要在新技术下重新测试过，这是多大的成本呀，所以一开始就要认真选择。我庆幸的是从servlet+javabean+jsp直接跳到了spring mvc，而不是02年被当时的主流struts套牢，也没选择当时的。把代码从servlet转到spring mvc是一个很轻松的事情。<br />
<br />
第二个是让我学习和检验我的测试技术的测试套件<br />
我的思想和条件允许已让我从以前的单一地关注功能实现上升到关注代码质量和健壮性的层次，我需要掌握和控制test技术。<br />
<br />
第三个是standalone+spring+hibernate程序套件<br />
这是应对我职业规划的需要，其实搞standalone+multiple threads程序比一个不高不低web应用架构师赚钱多了，关键要真正有这方面的经验和能力，你可以想象那些专门搞算法/分布式结构/并行结构的人都不会web技术的。操练好了，show出qualification来，就不信拿不到好offer。<br />
<br />
第四个是osgi模型套件<br />
在standalone上要拿到好offer，这样的企业和职位曲高和寡，我不一定有这个能力，也不一定能碰上，因此我还需要学习其它杀手锏。因此比standalone+算法/网络分布运算存在更多需求的是在系统健壮性和结构方面，这个技术模型我先选择osgi。<br />
我需要研究这些知识并化为自己的文档:<br />
osgi+web, osgi+spring, osgi+spring+hibernate, osgi+multiple threads<br />
<br />
为了达到少说多做，我坚持了每天一定抽出业余时间的1小时coding，做了三个星期先完成了WebAppStarter和test for WebAppStarter(即本文的第一个目标和第二个目标), 才把本blog发表出来, 并准备把WebAppStarter上传至sf.net上。
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/126294#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 23 Sep 2007 14:45:50 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/126294</link>
        <guid>http://lokki.javaeye.com/blog/126294</guid>
      </item>
      <item>
        <title>lazy password beyond systems</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/111408" style="color:red;">http://lokki.javaeye.com/blog/111408</a>&nbsp;
          发表时间: 2007年08月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          lazy password beyond systems<br />
<br />
在星期六晚进行thinking travel之旅时(对不起,夹杂了英语, 最近在学习英文中), 享受了一把, 其中令我神经跳动灵光一闪的是 lazy password.<br />
lazy password 不是我发明的, 而是我发觉&ldquo;它&rdquo;是奇妙的, 想未认识的人也认识它, 或许对你构思web2.0网站时有用, 如果你认识了, 并有更多的认识, 也请和我们分享.<br />
<br />
其时, 从徐昊的blog trace到李默的blog, 再到ThoughtWorks, 到studios.thoughtworks.com, 到studios后, 我想到了一个比知识管理大一点的东西&quot;employees centre&quot;员工平台, 在想employees centre能不能像google services那样同一帐号, 不同角色的workbench在不同窗口里(题外话).<br />
employees centre中有blog的功能, 我想在employees centre中发布一篇blog时, 也自动地发布到我javaeye上的blog去, 要怎么开发呢, 这两个系统并不能无缝连接. 我想javaeye可以提供一个URL, employees centre中保存blog时, 同时也post到这个URL里, 在这个URL里把要保存的blog内容显示出来, 同时也要求你输入javaeye id和密码, 然后再保存. 这就是lazy password了.<br />
唬住了吧.<br />
<br />
&quot;lazy password&quot;们不是我发明的, 你仔细想一想, 会发现它存在于生活和网络的点点滴滴当中, 比如想下载文件时它才叫你输入密码或注册, 被引导发了几条短信后, 它才告知你月租要几毛钱一个月. lazy password 的作用是让你先做你想做的, 然后再输入密码时就不觉得烦了, 而是觉得有必要的, 同时它不会阻碍你的思想, 它给了你轻快的网络体验.否则, 或许你的思想闪光已经失去了兴致.<br />
<br />
lazy password也许不能给你启示了, 但还有beyond systems.<br />
你想在一家提供商的blog里copy一篇blog到另一家的论坛里时, 或许你要先登录到这个系统&gt;&gt;找到&quot;发表&quot;菜单&gt;&gt;打开&gt;&gt;从原system复制&gt;&gt;在目标 system粘贴, 这多烦啊. 如果在employees centre能简便地发布blog到javaeye的blog上去, 我会先使用employees centre的blog功能.<br />
<br />
javaeye提供了一个URL, &quot;URL&quot;是REST的一个关键字, &quot;REST&quot;是Web2.0的一个关键字.<br />
如果一个website提供了多多这样的URL, 此website能更多通道地和另一个website/system连接, 网络上不同提供商的website不再是一个个孤立的website, 而是连接了在一起.<br />
<br />
&quot;beyond systems&quot;, &quot;beyond somethings&quot;, &quot;beyond bounds&quot;也在网络上随时可见, 比如&quot;推荐这篇文章给您的朋友&quot;, 让web功能与email功能无边界, 让你和你的同志同好无边界, 让此软件和那软件无边界.<br />
<br />
与&quot;lazy password&quot;概念类似的就是&quot;lazy confirm&quot;, google在他很多的service的界面操作时,不是如旧思想那样previous confirm, 而是删除了, 然后再给一个不惊动你的小提示, 说&quot;该邮件已移至已删除邮件,想了解更多信息? 想撤消?&quot;.<br />
<br />
lazy password beyond systems, 当然终极目标就是类似google的no password beyond systems, 这需要在设计你的systems, 一开始就要将一些数据放入到cookies里去.<br />
<br />
真希望web2.0是一个无边界的世界, 轻快的世界.<br />
<br />
google在break borders, 潜潜地包围世界(题外话).
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/111408#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 12 Aug 2007 07:06:05 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/111408</link>
        <guid>http://lokki.javaeye.com/blog/111408</guid>
      </item>
      <item>
        <title>div+css应用in手机终端</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/107821" style="color:red;">http://lokki.javaeye.com/blog/107821</a>&nbsp;
          发表时间: 2007年08月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一些新的企业应用想法在我心里产生，而一些有过的J2ME梦想，也想和朋友们分享。<br />
<br />
现在新的W3C网页标准成为了PC Web上的标准和趋势，世界的网页格式都已经向这个标准靠拢，这个趋势是web朝着语义网发展的一小步， <br />
在W3C新标准里发挥最大作用、给网页设计师最轻松开发体验的是div+css技术。 <br />
通过div+css技术，让网页代码结构变得更简单更清新，并且把人们最需要的内容信息与排版格式分离开来，从而让处理器更方便地把内容呈现在我们的面前。 <br />
&nbsp;<br />
这些内容和网页也能方便地在手机上显示，只不过手机开发者在这上面只进行了第一步，现在手机用户还在忍受着糟糕的界面体验。 <br />
&nbsp;<br />
比如：如新浪网、infoq.com/cn/、javaeye这样大信息量的网站，页面上的内容都是分块， <br />
但一般手机浏览器是和PC上的浏览器一样地工作，一般显示全页面+滚动条，而更好的用户体验方式的将每块的信息显示成清晰的一页，同时只需要将用户需要的那块信息显示。 <br />
&nbsp;<br />
比如：在手机上浏览PDF文件时，手机屏幕上仍然按PDF的印刷格式和字体显示，无论怎样放大都不能给用户清晰的影像，而其实开发者要不拘一格，只要转换一下显示的样式，让PDF文字用清晰的文本字体和格式显示就会美妙很多。 <br />
&nbsp;<br />
是的，显示的内容只要变一下样式和布局，就能很清晰地显示在手机屏幕上。 <br />
&nbsp;<br />
我的一个愿望是想让手机在320X240以上的分辩率时，web体验和手机界面体验就很爽，很轻快，同时能帮到繁忙的商务人士和终日需要坐在计算机面前的开发者。 <br />
&nbsp;<br />
要达到以上显示的转换或只显示用户需要的那一块内容，可以直接开发手机浏览器的相关代码或注入和替换所采用的css。 <br />
&nbsp;<br />
同时，不直接开发手机web浏览器，也有多种用注入和替换的方式变换网页在手机上的显示。 <br />
&nbsp;<br />
同时，新的PC软件界面技术xul、xaml也给我很多提示和参考。 <br />
&nbsp;<br />
决定手机屏幕的是用户而不是程序员生硬的思想，正如，PC上的浏览器，正向多样化特色化发展，非官方的浏览器界面(Opera/Maxthon/GoSurf)占据了普通用户的屏幕，手机上的浏览器同样会出现这个趋势，会出现多功能和特色化，从一个简单的浏览器会发展成多能浏览器：web、RSS、pdf、Wap，这将会成为需要浏览广泛文本信息商务人士的至爱。&nbsp; <br />
我是一个终日需要坐在计算机面前的开发者，觉得坐在电脑前开发是一件很高效率和投入的事情，然而我也喜欢在微波炉旁工作，快乐工作，这会让我保持灵感和创新的源泉。 <br />
我想开发一个能在如索爱M608c QVGA这样的设备上能有很清晰显示体验的highlightEditor@mobile，并配予与桌面开发环境轻松的连接方式，正如Apple公司的ipod与ibook笔记本无缝相连和操作那样，只要用一根方便的数据线相连上，在ipod里解码mp3，在ibook的扬声器就可以播放出来。<br />
<br />
同时，推荐一下&ldquo;发小&rdquo;果子的一篇文章，他最近在推荐我看《智能简史》<br />
<a href="http://aamissile.spaces.live.com/Blog/cns%218F19F848CF76C336%21594.entry" target="_blank">http://aamissile.spaces.live.com/Blog/cns%218F19F848CF76C336%21594.entry</a>
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/107821#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Aug 2007 17:11:53 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/107821</link>
        <guid>http://lokki.javaeye.com/blog/107821</guid>
      </item>
      <item>
        <title>ubuntu中避免google笔记本(notebook)与在firefox右下角点鼠标右键冲突</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/107366" style="color:red;">http://lokki.javaeye.com/blog/107366</a>&nbsp;
          发表时间: 2007年07月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ubuntu下的firefox中，安装google笔记本(notebook)后，在右键菜单中，加入了&ldquo;设为笔记(google笔记本)&rdquo;功能，然而需要在右下角(和google笔记本在右下角要打开窗口大小的位置)click右键想打开新页面或copy时，系统就自动click中了，并将本页面加入到google笔记本中。<br />
目前想避免这个问题，在按右键时，不要click，只按下，不放开，等出现右键菜单后再操作。
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/107366#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 31 Jul 2007 14:03:00 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/107366</link>
        <guid>http://lokki.javaeye.com/blog/107366</guid>
      </item>
      <item>
        <title>让视频广告做到每个人的手机上</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/106892" style="color:red;">http://lokki.javaeye.com/blog/106892</a>&nbsp;
          发表时间: 2007年07月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          让视频广告做到每个人的手机上<br />
<br />
在公共汽车上放置一个蓝牙视频文件传输器，让公共汽车上的人用蓝牙手机连接上这个文件传输器，浏览里面共享的视频文件，并选择下载到自己手机上播放。<br />
在四大城市里，坐公车的人在公车上呆上20分钟，而用蓝牙下载一段视频不到3分钟(蓝牙1.1下载一首mp3是4分钟)。没有电脑或不懂电脑而经常上网吧的人，是最喜欢乐趣的，最喜欢玩手机的，坐公车时能下载视频到手机上，会让他们投入到这个乐趣中。<br />
在播放短篇英语课程或56.com短片前的15秒商家广告，和受众是一对一的关系，并且停留在受众的手机里。<br />
只要在公车上放置一叠名片式下载说明书，会有人进行尝试并传播。<br />
同时，也可在超市外面休息区域放置这种视频文件传输器。蓝牙1.1的传输距离是10~100米。<br />
<br />
蓝牙视频文件传输器是一个采用Geode x86 CPU的嵌入式Linux系统盒子，采用闪存作硬盘，连接7~12个蓝牙端口，可以同时为多人服务。这个盒子的硬件成本为700~1500元。<br />
<br />
关键问题是，手机怎么浏览文件传输器里的内容，因为手机上的蓝牙功能并没有浏览其它机器内容的功能。这需要在手机上运行一个可以显示文件传输器视频目录的J2ME程序BlueCast，通过该程序，手机用户可以选择视频并下载。<br />
文件传输器里运行一个C语言写的程序等待来自下载BlueCast专用功能的蓝牙端口的连接，如果有手机连接上这个端口，就为其发送BlueCast程序，并在说明书里指导手机用户安装运行。<br />
BlueCast运行了，就能连接上视频下载蓝牙端口显示共享的文件，并下载。该手机已安装有BlueCast程序了，下次只需运行即可。<br />
<br />
需要解决的安全问题：需要用综合方案解决乘客连接上错误的端口下载传播病毒的伪BlueCast程序。<br />
<br />
开发这套系统的原型出来，只要两个月的时间，因为Linux盒子、蓝牙API、J2ME蓝牙API都是成熟的技术。<br />
<br />
以上看起来很美丽，似乎会吸引到像分众这样的传媒，将广告的覆盖面更加深入，但实际上是不是这样？<br />
<br />
以下是一段关于这个想法的对话：<br />
<br />
==============================================<br />
<br />
(2007-07-27 13:06:47)&nbsp;&nbsp; 黄 <br />
你那想法，我想了一下 <br />
<br />
(2007-07-27 13:07:17)&nbsp;&nbsp; 黄 <br />
１．在手机电视发展起来后，这个市场很小 <br />
<br />
(2007-07-27 13:08:08)&nbsp;&nbsp; 黄 <br />
２．内容服务器在公车上，内容如何更新？ <br />
<br />
(2007-07-27 13:12:24)&nbsp;&nbsp; 黄 <br />
还有一点，就是下载等待的时间用户能否接受？ <br />
&nbsp; <br />
(2007-07-27 13:17:04)&nbsp;&nbsp; 黄 <br />
我觉得ｉｄｅａ还是不错的，关键是市场有多大，个人认为利用手机做一些视频应用还是十分有市场的，尤其是３ｇ网络启用后，前提是基于大网络的 <br />
&nbsp;<br />
(2007-07-27 13:18:31)&nbsp;&nbsp; 黄 <br />
其实，你说的公车局部的应用，不一定只作视频广告方面的，可以想些其他创新应用 <br />
<br />
(2007-07-27 13:19:00)&nbsp;&nbsp; 枫 <br />
我说一说，3G市场太大，需要等待的时间太久，资费太贵，而且是现在不能确定的，所以不要等待这个。手机电视，不能vod短片。 <br />
同时以上两个都不能在受众手机中停留 <br />
&nbsp; <br />
(2007-07-27 13:20:00)&nbsp;&nbsp; 枫 <br />
这个比较简单，比较能快实现，而且广告效果好，关键是解决用户操作的方便性问题 <br />
&nbsp; <br />
(2007-07-27 13:20:33)&nbsp;&nbsp; 黄 <br />
是有这个优点 <br />
<br />
(2007-07-27 13:21:17)&nbsp;&nbsp; 枫 <br />
我觉得蓝牙发布视频、手机电视、3G串流，有如此多的不同点，每一个都不冲突，都会有其市场 <br />
<br />
(2007-07-27 13:22:36)&nbsp;&nbsp; 黄 <br />
嗯，但要方便性和实用性结合 <br />
&nbsp; <br />
(2007-07-27 13:26:58)&nbsp;&nbsp; 枫 <br />
版权问题能用钱解决，我想关键问题是政策问题和广电的管理。比如广电说他要在公车或公众地方搞，别人就搞不过，因为里面不但有广告，而且有内容，有视频内容就受广电规管，比如现在公车上私营公司的视频播放器都被广电的移动TV取代了，竞争不过。 <br />
&nbsp; <br />
(2007-07-27 13:28:37)&nbsp;&nbsp; 枫 <br />
而分众和框架传媒的，都是广告，没有内容，所以不会和广电冲突 <br />
&nbsp; <br />
(2007-07-27 13:32:40)&nbsp;&nbsp; 黄 <br />
是 <br />
<br />
(2007-07-27 13:35:19)&nbsp;&nbsp; 枫 <br />
内容服务器在公车上，内容如何更新--&gt;更新内容每天用蓝牙或wifi更新，视频都是3M~5M的内容，这个内容和移动电视是不同的，因为是在手机上播放，而不是连续播放。所以不要用移动电视的操作看待这个，不过可以比较，比较就明白概念了 <br />
比如里面已经有200个视频短片，那一天只更新10个就可，车到总站时，蓝牙2.0只要3分钟就能更新完了。 <br />
<br />
(2007-07-27 13:37:59)&nbsp;&nbsp; 黄 <br />
分众是广播式强迫接受的 <br />
&nbsp; <br />
(2007-07-27 13:39:06)&nbsp;&nbsp; 黄 <br />
和你这个不同，属于点播的，广告客户会不会买单也是个问题 <br />
<br />
(2007-07-27 13:39:39)&nbsp;&nbsp; 枫 <br />
除了google搜索式广告外，其它都是强迫式的，大小不同而已 <br />
&nbsp; <br />
(2007-07-27 13:40:53)&nbsp;&nbsp; 枫 <br />
方式是不同，广告的方式是不同的，关键是量是多少，统计数据是多少，投资回报是多少，客户是根据这个买单 <br />
&nbsp; <br />
(2007-07-27 13:42:15)&nbsp;&nbsp; 黄 <br />
就是啊，其实播客网站就存在这个问题 <br />
<br />
(2007-07-27 13:44:00)&nbsp;&nbsp; 枫 <br />
点播有点播的好处，比如这个：在游泳视频前放体育用品或健康用品的广告，而不会放家居用品广告。广播也有广播的好处，但缺少交互式，是广播push，而不是用户自己去&quot;拉poll&quot; <br />
<br />
(2007-07-27 13:45:05)&nbsp;&nbsp; 枫 <br />
现在视频网站都不放广告，是为了培育观众，而不杀鸡取卵<br />
<br />
=============================================<br />
<br />
<br />
除了以上对话中说到的问题，对话后认真考究了黄的意见，对这个方案缺点的认识加深了：<br />
（1）需要改变用户习惯，需要用户按说明书做4步技术操作，而根据传媒专业知识，&ldquo;广告&rdquo;在一种方式上可以说，不要用户做任何操作，广告就能摆在用户面前。<br />
<br />
（2）明显的受众量少：在一个户外平面广告，从现代广告的角度来看也有很多缺点，但在它面前走过的人数，总能以千以万来计算，而一个靠用户操作而获得的广告形式，一天只能有上千的受众。<br />
<br />
（3）手机播放广告视频分辨率低压缩大，影像效果不好，影响品牌形象 <br />
<br />
（4）政策问题影响特别大：<br />
<a href="http://tech.sina.com.cn/t/2007-07-28/13021643402.shtml" target="_blank">http://tech.sina.com.cn/t/2007-07-28/13021643402.shtml</a><br />
7月25日,广电总局下发了&lt;关于加强移动数字电视管理的通知&gt;,要求各地广电局对移动电视内容制作和播放方式加强监管,特别对通过CF卡、硬盘和局域网等方式播出节目的内容安全性加强监管。<br />
<br />
相信某种蓝牙应用会得到美妙的商用前景，因为蓝牙和手机一起，手机的用户数量非常庞大。 比如应用在酒吧设备上。
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/106892#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jul 2007 07:12:11 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/106892</link>
        <guid>http://lokki.javaeye.com/blog/106892</guid>
      </item>
      <item>
        <title>ubuntu7.04下Sun WTK Emulator运行出错</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/104632" style="color:red;">http://lokki.javaeye.com/blog/104632</a>&nbsp;
          发表时间: 2007年07月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ubuntu7.04下Sun WTK Emulator运行出错，已通过妥协的方式解决，而未解决中文问题。<br />
<br />
ubuntu7.04下安装了jrockit1.6、eclipse3.3、EclipseMe1.7.3、Sun WTK2.5.1，新建j2me项目能正常编译，但在eclipse中以非root用户运行project时Emulator出错，同时独立用WTK ktoolbar运行WTK中的example也出错，错误信息如下：<br />
Exception in thread &quot;AWT-EventQueue-0&quot; java.lang.NullPointerException: <br />
&nbsp;&nbsp;&nbsp; at com.sun.java.swing.plaf.gtk.GTKLookAndFeel.initSystemColorDefaults(GTKLookAndFeel.java:1258)<br />
&nbsp;&nbsp;&nbsp; at com.sun.java.swing.plaf.gtk.GTKLookAndFeel.loadStyles(GTKLookAndFeel.java:1500)<br />
&nbsp;&nbsp;&nbsp; at com.sun.java.swing.plaf.gtk.GTKLookAndFeel.access$000(GTKLookAndFeel.java:37)<br />
......<br />
<br />
而以root用户运行不会出错。调整了一些目录的权限和变换了jdk1.6、jrockit1.5后都是这样子。<br />
<br />
搜索到了以下相关资料：<br />
<a href="http://jira.jboss.com/jira/browse/JBINSTALL-232" target="_blank">http://jira.jboss.com/jira/browse/JBINSTALL-232</a><br />
<a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6389282" target="_blank">http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6389282</a><br />
因为ubuntu7.04中，root用户以&ldquo;C&rdquo;locale运行不会出错，而桌面用户以&ldquo;zh_CN.UTF-8&rdquo;运行因为jre的bug或环境配合的问题而出错。<br />
<br />
现在建立starteclipsewtk设置locale为&quot;en_US.UTF-8&quot;让emulator正常运行： <br />
#!/bin/bash<br />
declare -x LANG=&quot;en_US.UTF-8&quot;<br />
declare -x LANGUAGE=&quot;en_US&quot;<br />
/home/eclipse/eclipse<br />
<br />
但emulator中的中文显示成方块。
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/104632#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 24 Jul 2007 06:22:01 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/104632</link>
        <guid>http://lokki.javaeye.com/blog/104632</guid>
      </item>
      <item>
        <title>用自定义getter在EL表达式中检测HibernateEntityBean中的ObjectNotFound数据丢失异常</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/80247" style="color:red;">http://lokki.javaeye.com/blog/80247</a>&nbsp;
          发表时间: 2007年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用自定义getter在EL表达式中检测HibernateEntityBean中的ObjectNotFound数据丢失异常<br />
<br />
在Hibernate中，Restaurant对象建立many-to-one关联到Street对象，当Street数据被删除时，可以用双向关联设置级联将Restaurant.street设置为null。<br />
如果不是双向关联，则不能设置为null，删除Street时如无做动作，Restaurant表的streetDataId字段不为null，但Street表已没对应数据。<br />
而Restaurant.getStreet()不为null，Restaurant.getStreet().getDataId()仍可操作(只是用Restaurant表的streetDataId字段,不会进行数据库操作)，<br />
但Restaurant.getStreet().getStreetName()会出现ObjectNotFound异常，<br />
<br />
在.java中可捕捉任何异常进行处理，但当PO不经过转换成VO就传递至jsp时，jsp的EL表达式${restaurant.street.streetName}只能处理null异常，<br />
不能处理ObjectNotFound异常，以致用户见到一堆乱码无法进行任何挽救的操作。如果没特殊处理，EL表达式不能作这样的检测。<br />
<br />
有些人会在Restaurant.street的getter里写检测代码或者作更多的处理，比如会new一个非null的Street返回：<br />
public Street getStreet()<br />
{<br />
&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(street==null)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; street=new Street();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; street.getStreetName();//检测Street数据是否能访问。<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; catch(Exception ex)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; street=new Street();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return street;<br />
}<br />
但这种做法是错误的，因为会改变数据库字段getter/setter的通常用法，不可预料和控制。<br />
<br />
这时，不妨可以写个另外不和数据库字段关联的不同名字的getter，既不会让代码混乱，又可在需要检测时方便使用：<br />
public boolean getStreetAvailable()<br />
{<br />
&nbsp;&nbsp;&nbsp; boolean available=true;<br />
&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; street.getArea().getCity();//检测关联的数据是否能访问。<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; catch(Exception ex)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; available=false;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return available;<br />
}<br />
<br />
灵活利用getter，让您的程序更健壮。
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/80247#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 May 2007 02:52:29 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/80247</link>
        <guid>http://lokki.javaeye.com/blog/80247</guid>
      </item>
      <item>
        <title>对象(Object)、数据对象、功能对象与JavaBean，HibernateEntityBean的命名经验</title>
        <author>lokki</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lokki.javaeye.com">lokki</a>&nbsp;
          链接：<a href="http://lokki.javaeye.com/blog/77192" style="color:red;">http://lokki.javaeye.com/blog/77192</a>&nbsp;
          发表时间: 2007年05月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对象(Object)、数据对象、功能对象与JavaBean，HibernateEntityBean的命名经验<br />
<br />
为了不引起用途的混乱，将Object根据用途划分为数据对象和功能对象。<br />
<br />
一种数据类型，一个系统可以有很多不同应用层次的数据对象，比如HibernatePOJO/PO、DTO、FormBean、VO。<br />
<br />
在某高效的B/S系统中，将数据对象的各个应用层次数据对象设计成只有HibernateEntityBean。<br />
<br />
什么是HibernateEnitiyBean： Object概念 &gt; JavaBean概念，JavaBean有JavaBean的属性、getter/setter命名规则，Hibernate支持POJO，而符合JavaBean属性、getter/setter的HibernatePOJO，称之HibernateEntityBean。<br />
<br />
为什么高效：<br />
JavaBean使用、命名规则和使用规限，在Java世界广泛存在，所以Object属性和方法的命名要尽量符合JavaBean的规则，才能流畅通行。<br />
<br />
为什么高效：<br />
不在各个层次的类型转换来转换去，从而省大量代码。<br />
不用在各个层次的类型转换来转换去，怎样兼顾成本和扩展性：<br />
HibernateEntityBean或一些内部能正常使用的Bean/Object不能在远过程调用(WebService/RMI/Corba/RPC)中直接传输，所以需要转换<br />
在内部使用和与外部联系的重要性中，以内部使用为重要和使用频繁，所以内部以HibernateEntityBean为主，而另外定义远过程调用所用的DTO，成本也不大，而不用全盘根据远过程调用的需要而定义大量的DTO。<br />
而在MVC内部结构中，大多数可以直接采用HibernateEntityBean在MVC各层次内传输，除非您设计得不能直接传输或您采用的MVC技术有限制。<br />
<br />
怎样更高效：<br />
在只有一层数据对象状况下的HibernateEntityBean要承担起对象的一些概念，而其功能不只拘泥于数据表字段。<br />
比如remark的数据表功能有public int getScore()对应与字段score<br />
不妨可以有：<br />
public String getScoreDesc()<br />
{<br />
&nbsp;&nbsp;&nbsp; String scoreDesc=&quot;&quot;;<br />
&nbsp;&nbsp;&nbsp; if(score==5)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; scoreDesc=&quot;中评&quot;;<br />
&nbsp;&nbsp;&nbsp; else if(score=8)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; scoreDesc=&quot;好评&quot;;<br />
&nbsp;&nbsp;&nbsp; else if(score=3)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; scoreDesc=&quot;差评&quot;;<br />
&nbsp;&nbsp;&nbsp; return scoreDesc;<br />
}<br />
<br />
兼顾不同需要或不同角色的角度，不妨加多一个函数：<br />
public String getScoreDesc2()<br />
{<br />
&nbsp;&nbsp;&nbsp; String scoreDesc=&quot;&quot;;<br />
&nbsp;&nbsp;&nbsp; if(score&lt;=3)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; scoreDesc=&quot;不及格&quot;;<br />
&nbsp;&nbsp;&nbsp; else if(score&gt;=3 &amp;&amp; score&lt;=6)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; scoreDesc=&quot;及格&quot;;<br />
&nbsp;&nbsp;&nbsp; else if(score&gt;6)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; scoreDesc=&quot;优秀&quot;;<br />
&nbsp;&nbsp;&nbsp; return scoreDesc;<br />
}<br />
<br />
这样可以在View层和EL中省大量代码，如果remark.scoreDesc/remark.scoreDesc2不合要求，直接用remark.score进行自主处理也是可以的。<br />
<br />
这些不从数据表由来的方法，应不要输入参数，只利用到内部field和硬编码，应符合对象的概念，不要操作数据群体，即只有getXXX()，getXXX()里不要再发出数据库操作(如果处理得好，为了高效也是可以的)<br />
这些方法要符合JavaBean的属性命名规则，让其更广泛通用。<br />
<br />
更多：<br />
在getXXX()不进行数据库操作时，也可以这样处理，比如Restaurant只关联到userId，而没关联到user对象，不妨增加：<br />
private String userName=&quot;&quot;;<br />
public String getUserName()<br />
public void setUserName(String userName)<br />
<br />
在Controller方法里取得restaurantList后，不妨对该列表的每个元素通过数据库操作取用户名后调用setUserName()。<br />
View层对同一个restaurantList操作就能显示结果。<br />
这样也省下处理更复杂数据结构的时间，而且代码也算规整。<br />
<br />
如上userName，有时候不妨给field赋个初始化值，避免null异常，因为试用人员看到没显示好数据时会直接指出哪个数据没显示好，而当他看到一堆异常时，则他的意见是帮不到具体的。<br />
<br />
总之，在代码大结构不会乱、能受控制的情况下，思想不妨活一些。
          <br/>
          <span style="color:red;">
            <a href="http://lokki.javaeye.com/blog/77192#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 May 2007 17:08:11 +0800</pubDate>
        <link>http://lokki.javaeye.com/blog/77192</link>
        <guid>http://lokki.javaeye.com/blog/77192</guid>
      </item>
  </channel>
</rss>