﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Java Architect</title><link>http://www.blogjava.net/zrq/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:03:42 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:03:42 GMT</pubDate><ttl>60</ttl><item><title>关于SAAS平台的一点想法</title><link>http://www.blogjava.net/zrq/archive/2008/06/19/209038.html</link><dc:creator>zrq</dc:creator><author>zrq</author><pubDate>Wed, 18 Jun 2008 21:54:00 GMT</pubDate><guid>http://www.blogjava.net/zrq/archive/2008/06/19/209038.html</guid><wfw:comment>http://www.blogjava.net/zrq/comments/209038.html</wfw:comment><comments>http://www.blogjava.net/zrq/archive/2008/06/19/209038.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zrq/comments/commentRss/209038.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zrq/services/trackbacks/209038.html</trackback:ping><description><![CDATA[最近研究了几个ERP,CRM的产品 象Sales force, Compeire, sugarCRM，觉得SAAS平台无非需要提供以下可以高度定制的功能。<br />
<br />
<ol>
    <li>&nbsp;GUI</li>
    <ul>
        <li>CSS</li>
        <li>resources</li>
        <li>menu/link</li>
        <li>message i18n</li>
        <li>form</li>
        <li>GUI EventListener<br />
        </li>
    </ul>
    <li>Business Object</li>
    <ul>
        <li>business logic or call back<br />
        </li>
        <li>email <br />
        </li>
        <li>report charts</li>
        <li>job scheduler</li>
        <li>business rule</li>
        <li>work flow</li>
        <li>access control</li>
        <li>asynchronous request.<br />
        </li>
    </ul>
    <li>Database</li>
</ol>
&nbsp; <br />
我觉得这里面最难的应属GUI的高度可定制化。本人正在想用GWT来做一个基于上面想法的SASS平台，届时软件可真正实现快速按需打造。欢迎JAVA界的同仁多提宝贵建议。<br />
<ol>
    <br />
    <br />
    <br />
</ol>
<br />
<br />
<br />
<img src ="http://www.blogjava.net/zrq/aggbug/209038.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zrq/" target="_blank">zrq</a> 2008-06-19 05:54 <a href="http://www.blogjava.net/zrq/archive/2008/06/19/209038.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql statement</title><link>http://www.blogjava.net/zrq/archive/2007/09/08/143547.html</link><dc:creator>zrq</dc:creator><author>zrq</author><pubDate>Fri, 07 Sep 2007 18:50:00 GMT</pubDate><guid>http://www.blogjava.net/zrq/archive/2007/09/08/143547.html</guid><wfw:comment>http://www.blogjava.net/zrq/comments/143547.html</wfw:comment><comments>http://www.blogjava.net/zrq/archive/2007/09/08/143547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zrq/comments/commentRss/143547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zrq/services/trackbacks/143547.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">&nbsp; Select</span><span style="color: #000000;">&nbsp;obj<br />
&nbsp; </span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;CommDeductionType&nbsp;obj<br />
&nbsp;&nbsp; </span><span style="color: #0000ff;">where</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #808080;">=</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;"><br />
&nbsp; &nbsp; #</span><span style="color: #0000ff;">if</span><span style="color: #000000;">($obj)<br />
&nbsp;&nbsp; &nbsp;&nbsp; </span><span style="color: #808080;">and</span><span style="color: #000000;">&nbsp;obj.deductionTypeCode&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;#{obj.deductionTypeCode}<br />
&nbsp; &nbsp; #</span><span style="color: #0000ff;">end</span></div>
<img src ="http://www.blogjava.net/zrq/aggbug/143547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zrq/" target="_blank">zrq</a> 2007-09-08 02:50 <a href="http://www.blogjava.net/zrq/archive/2007/09/08/143547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Open laszlo</title><link>http://www.blogjava.net/zrq/archive/2007/07/27/132668.html</link><dc:creator>zrq</dc:creator><author>zrq</author><pubDate>Thu, 26 Jul 2007 19:18:00 GMT</pubDate><guid>http://www.blogjava.net/zrq/archive/2007/07/27/132668.html</guid><wfw:comment>http://www.blogjava.net/zrq/comments/132668.html</wfw:comment><comments>http://www.blogjava.net/zrq/archive/2007/07/27/132668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zrq/comments/commentRss/132668.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zrq/services/trackbacks/132668.html</trackback:ping><description><![CDATA[<br>Datapointers are not bound to views like datapaths are, but they do have a place in the view hierarchy—that is, they "know
about" parents and children.<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">datapointer&nbsp;</span><span style="color: #ff0000;">xpath</span><span style="color: #0000ff;">="myData:/"</span><span style="color: #ff0000;">&nbsp;ondata</span><span style="color: #0000ff;">="processData()"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">method&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="processData"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.selectChild(2);&nbsp;<br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;{<br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this.xpathQuery(&nbsp;'@show'&nbsp;)&nbsp;==&nbsp;'south&nbsp;park')&nbsp;{<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug.write(this.xpathQuery('firstName/text()'));<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while&nbsp;(this.selectNext());&nbsp;<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">method</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">datapointer</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;"></span></div>
<br>Create data set at runtime <br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">LzDataset:&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;dset&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;LzDataset(</span><span style="color: #0000ff;">null</span><span style="color: #000000;">,&nbsp;{name:&nbsp;'mydset'})</span></div>
<br>$path{} limitations<br>A
limitation of the <tt class="literal">$path{}</tt> constraint is that the expression it contains is evaluated only at the
initialization time, that is, an expression such as <tt class="literal">$path{'mynode[' + i + ']/@attr'}</tt> will behave like a
<tt class="literal">$once{}</tt> constraint.Custome<br><br>Customize the data binding <br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008080;">1</span>&nbsp;<span style="color: #0000ff;">&lt;</span><span style="color: #800000;">view&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="swatch"</span><span style="color: #ff0000;">&nbsp;width</span><span style="color: #0000ff;">="200"</span><span style="color: #ff0000;">&nbsp;height</span><span style="color: #0000ff;">="30"</span><span style="color: #ff0000;">&nbsp;<br></span><span style="color: #008080;">2</span>&nbsp;<span style="color: #ff0000;">&nbsp;&nbsp;datapath</span><span style="color: #0000ff;">="colors:/value[1]/text()"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">3</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">method&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="applyData"</span><span style="color: #ff0000;">&nbsp;args</span><span style="color: #0000ff;">="v"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">4</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setBGColor(eval(v))<br></span><span style="color: #008080;">5</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display.setText(v)<br></span><span style="color: #008080;">6</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">method</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">7</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">view</span><span style="color: #0000ff;">&gt;</span></div>
<br>$path{} <br><br><br>datapath.setdatapointer<br><br>
<pre class="programlisting">&lt;canvas height="150"&gt;<br>  &lt;dataset name="phonebook" src="resources/phonebook.xml"/&gt;<br>  &lt;simplelayout axis="x" spacing="20"/&gt;<br>  <br>  &lt;view name="contacts" height="150" width="100"&gt;<br>    &lt;view bgcolor="0xe0e0e0" datapath="phonebook:/contacts/contact"<br>          onmouseover="setBGColor(0xc0c0c0)" onmouseout="setBGColor(0xe0e0e0)"<br>          <span style="background-color: yellow;" class="em">onclick="details.datapath.setPointer(this.datapath.p)"</span>&gt;<br>      &lt;simplelayout axis="x" spacing="5"/&gt;<br>      &lt;text datapath="@firstName" resize="true"/&gt;<br>      &lt;text datapath="@lastName" resize="true"/&gt;<br>    &lt;/view&gt;<br>    &lt;simplelayout spacing="5"/&gt;<br>  &lt;/view&gt;<br>  <br>  &lt;view id="details" width="150" height="150" bgcolor="0xe0e0e0" fgcolor="blue"&gt;<br>    &lt;datapath/&gt;<br>    &lt;text datapath="@firstName"/&gt;<br>    &lt;text datapath="@lastName"/&gt;<br>    &lt;text datapath="@phone"/&gt;<br>    &lt;text datapath="@email"/&gt;<br>    &lt;simplelayout spacing="5"/&gt;<br>  &lt;/view&gt;<br>&lt;/canvas&gt;</pre>
<br><br><br> <img src ="http://www.blogjava.net/zrq/aggbug/132668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zrq/" target="_blank">zrq</a> 2007-07-27 03:18 <a href="http://www.blogjava.net/zrq/archive/2007/07/27/132668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DAO終結者</title><link>http://www.blogjava.net/zrq/archive/2006/08/13/63286.html</link><dc:creator>zrq</dc:creator><author>zrq</author><pubDate>Sun, 13 Aug 2006 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/zrq/archive/2006/08/13/63286.html</guid><wfw:comment>http://www.blogjava.net/zrq/comments/63286.html</wfw:comment><comments>http://www.blogjava.net/zrq/archive/2006/08/13/63286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zrq/comments/commentRss/63286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zrq/services/trackbacks/63286.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal">動態組裝SQL是實際應用中的一個常見問題,我發現在很多論壇中的解決方案都不干淨,下面是我在很多項目中使用的方案,簡洁有效.<br /><br />
基本概念如下:<br /><br />
1. 使用模板技術,如Velocity,FreeMarker;<br />
2. 在SQL中不要使用?,使用自己的place holder ,such as #{variableName};<br /><br />
象下面的SQL語句<br />
select firstName <br />
      ,lastName <br />
from users u<br />
where  u.userId= #{userId}<br /><br />
#if($companyId)<br />
  and u.companyId=#{companyId}<br />
#end <br /><br />
處理過程如下:<br /><br />
1.將所有變量放進一個MAP中;<br />
2.用VELOCITY進行MERGE,將得到以下的SQL,假定companyId 不為空;<br />
  select firstName <br />
      ,lastName <br />
from users u<br />
where  u.userId= #{userId}<br />
  and u.companyId=#{companyId}<br />
3.再將上面的SQL進一步處理,根據SQL語句中的placeHolder順序和MAP中的變量,生成一個變量的LIST,同時將變量的placeHolder轉換成?;<br />
4.將變量LIST的數值依次注入到preparedStatement中<span style="">;<o:p></o:p></span></p>
		<p class="MsoNormal">
				<span style="">
						<span style="">  </span>Tips:</span>
				<span style="font-family: 宋体;" lang="ZH-CN">這里還可生成一個完全可執行的</span>
				<span style="">SQL</span>
				<span style="font-family: 宋体;" lang="ZH-CN">語句輸出到</span>
				<span style="">LOG</span>
				<span style="font-family: 宋体;" lang="ZH-CN">中</span>
				<span style="">,</span>
				<span style="font-family: 宋体;" lang="ZH-CN">以便進行除錯</span>;<br />
5.<span style="font-family: 宋体;" lang="ZH-CN">執行</span><span style="">SQL, </span><span style="font-family: 宋体;" lang="ZH-CN">用</span><span style="">reflection</span><span style="font-family: 宋体;" lang="ZH-CN">技術將</span><span style="">ResultSet</span><span style="font-family: 宋体;" lang="ZH-CN">轉換成</span><span style="">voList;<o:p></o:p></span></p>
		<p class="MsoNormal">
				<span style="">
						<!--[if !supportEmptyParas]--> <!--[endif]--><o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;" lang="ZH-CN">將上面的過程封裝成一個</span>
				<span style="">Class , </span>
				<span style="font-family: 宋体;" lang="ZH-CN">只需將</span>
				<span style="">sqlName,parameterMap,voClass</span>
				<span style="font-family: 宋体;" lang="ZH-CN">傳入便可返回一個</span>
				<span style="">voList</span>
				<span style="font-family: 宋体;" lang="ZH-CN">或數組</span>
				<span style="">. </span>
				<span style="font-family: 宋体;" lang="ZH-CN">此舉將大大減化</span>
				<span style="">DAO</span>
				<span style="font-family: 宋体;" lang="ZH-CN">的代碼</span>
				<span style="">,</span>
				<span style="font-family: 宋体;" lang="ZH-CN">根據我的經驗</span>
				<span style="">,</span>
				<span style="font-family: 宋体;" lang="ZH-CN">代碼最起碼減少</span>
				<span style="">70%,</span>
				<span style="font-family: 宋体;" lang="ZH-CN">更為重要的是查詢非常容易維護</span>
				<span style="">, </span>
				<span style="font-family: 宋体;" lang="ZH-CN">極大地減少了出錯的概率</span>
				<span style="">,SQL</span>
				<span style="font-family: 宋体;" lang="ZH-CN">語句清晰易懂</span>
				<span style="">,</span>
				<span style="font-family: 宋体;" lang="ZH-CN">不再是醜陋的</span>
				<span style="">criteria,</span>
				<span style="font-family: 宋体;" lang="ZH-CN">也不再是將一個個的分散的</span>
				<span style="">SQL</span>
				<span style="font-family: 宋体;" lang="ZH-CN">片斷</span>
				<span style="">,</span>
				<span style="font-family: 宋体;" lang="ZH-CN">我們的程序員將會有更多的時間來寫</span>
				<span style="">SQL,</span>
				<span style="font-family: 宋体;" lang="ZH-CN">而不是做其它讓人厭煩的工作</span>
				<span style="">,</span>
				<span style="font-family: 宋体;" lang="ZH-CN">排錯也變得异常簡單</span>
				<span style="">,</span>
				<span style="font-family: 宋体;" lang="ZH-CN">唯一可能出錯的地方只能在</span>
				<span style="">SQL</span>
				<span style="font-family: 宋体;" lang="ZH-CN">上</span>
				<span style="">, </span>
				<span style="font-family: 宋体;" lang="ZH-CN">只要將</span>
				<span style="">LOG</span>
				<span style="font-family: 宋体;" lang="ZH-CN">輸出的完整可執行</span>
				<span style="">SQL</span>
				<span style="font-family: 宋体;" lang="ZH-CN">放在</span>
				<span style="">database client</span>
				<span style="font-family: 宋体;" lang="ZH-CN">中執行一下</span>
				<span style="">,</span>
				<span style="font-family: 宋体;" lang="ZH-CN">問題在哪兒</span>
				<span style="">,</span>
				<span style="font-family: 宋体;" lang="ZH-CN">一目了然</span>
				<span style="">.<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span style="font-family: 宋体;" lang="ZH-CN">我相信此方法</span>
				<span style="" lang="ZH-CN">
				</span>
				<span style="font-family: 宋体;" lang="ZH-CN">比起</span>
				<span style="">iBatis, Spring</span>
				<span style="font-family: 宋体;" lang="ZH-CN">的</span>
				<span style="">jdbcTemplate,Hibernate </span>
				<span style="font-family: 宋体;" lang="ZH-CN">的</span>
				<span style="">Criteria</span>
				<span style="font-family: 宋体;" lang="ZH-CN">要容易使用得多</span>
				<span style="">.</span>
				<span style="font-family: 宋体;" lang="ZH-CN">其實</span>
				<span style="">Hibernate</span>
				<span style="font-family: 宋体;" lang="ZH-CN">的</span>
				<span style="">HQL,</span>
				<span style="font-family: 宋体;" lang="ZH-CN">也可以用此方法來動態生成</span>
				<span style="">HQL.</span>
				<br />
 <br style="" /><!--[if !supportLineBreakNewLine]--><br style="" /><!--[endif]--></p>
<img src ="http://www.blogjava.net/zrq/aggbug/63286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zrq/" target="_blank">zrq</a> 2006-08-13 09:35 <a href="http://www.blogjava.net/zrq/archive/2006/08/13/63286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>