﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-别昨非</title><link>http://www.blogjava.net/zuofei-bie/</link><description>java and php</description><language>zh-cn</language><lastBuildDate>Sun, 12 Apr 2026 06:03:18 GMT</lastBuildDate><pubDate>Sun, 12 Apr 2026 06:03:18 GMT</pubDate><ttl>60</ttl><item><title>在Linux上部署Apache James</title><link>http://www.blogjava.net/zuofei-bie/archive/2011/03/24/346980.html</link><dc:creator>别昨非</dc:creator><author>别昨非</author><pubDate>Thu, 24 Mar 2011 12:35:00 GMT</pubDate><guid>http://www.blogjava.net/zuofei-bie/archive/2011/03/24/346980.html</guid><wfw:comment>http://www.blogjava.net/zuofei-bie/comments/346980.html</wfw:comment><comments>http://www.blogjava.net/zuofei-bie/archive/2011/03/24/346980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuofei-bie/comments/commentRss/346980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuofei-bie/services/trackbacks/346980.html</trackback:ping><description><![CDATA[<p>　　由于项目需要部署在Linux上，而又使用到Apache James作邮件服务器，因此总结了一下在Linux上部署Apache James的步骤，写得比较凌乱。</p>
<p>在Linux上部署Apache James</p>
<p>前提工作：</p>
<p>1）由于Apache James邮件服务需要用到1024以下的端口，因此请用root用户登录进行部署。</p>
<p>2）需要先安装JDK1.5或以上版本，部署前请确保您的JDK环境变量如JAVA_HOME等已经设置好。</p>
<p>3）James 启动时，其SMTP 服务默认在 25 端口启动，POP3 服务默认在 110 端口启动， NNTP 服务默认在 119 端口启动, 请确保这些端口未被占用。Linux下查过这些端口是否被占用的命令是：lsof -i:端口号，例如：</p>
<p>[root@nhslj-app ~]# lsof -i:25</p>
<p>COMMAND&nbsp;&nbsp; PID USER&nbsp;&nbsp; FD&nbsp;&nbsp; TYPE DEVICE SIZE NODE NAME</p>
<p>sendmail 3268 root&nbsp;&nbsp;&nbsp; 4u&nbsp; IPv4&nbsp;&nbsp; 8650&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TCP nhslj-app:smtp (LISTEN)</p>
<p>这表示25端口正在被sendmail服务占用。</p>
<p>关闭SendMail服务：</p>
<p>一般RedHat的系统安装时都会默认安装了sendmail邮件服务，因此在部署Apache James时，需要把sendmail关闭。可以通过以下方法来关闭sendmail，以防止系统重启时又自动启动sendmail服务。</p>
<p>1）用chkconfig --list sendmail命令查看sendmail的情况：</p>
<p>[root@susun177 ~]# chkconfig --list sendmail</p>
<p>sendmail&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:关闭&nbsp; 1:关闭&nbsp; 2:启用&nbsp; 3:关闭&nbsp; 4:启用&nbsp; 5:启用&nbsp; 6:关闭</p>
<p>2）通过chkconfig sendmail off命令来关闭sendmail的启动：</p>
<p>[root@susun177 ~]# chkconfig sendmail off</p>
<p>3）这时再用chkconfig --list sendmail命令可以查看到sendmail的所有启动级别都已经关闭了：</p>
<p>[root@susun177 ~]# chkconfig --list sendmail</p>
<p>sendmail&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:关闭&nbsp; 1:关闭&nbsp; 2:关闭&nbsp; 3:关闭&nbsp; 4:关闭&nbsp; 5:关闭&nbsp; 6:关闭</p>
<p>这样，即使重新启动Linux系统，sendmail服务也不会自动启动了。</p>
<p>前期工作做完了，接下来就是部署Apache&nbsp; James了。</p>
<p>1）解压Apache James包（apache-james-2.3.2.tar.gz）：</p>
<p>[root@susun177 local]# tar zxvf apache-james-2.3.2.tar.gz</p>
<p>解压后，会多了一个目录james-2.3.2</p>
<p>2）进入james-2.3.2/bin目录，运行run.sh，生成james的配置文件config.xml：</p>
<p>[root@susun177 bin]# sh run.sh </p>
<p>run.sh: line 37: /usr/local/james-2.3.2/bin/phoenix.sh: 权限不够</p>
<p>权限不够（估计是解压后run.sh文件没有赋予执行权限），可以执行以下命令：</p>
<p>[root@susun177 bin]# chmod +x run.sh phoenix.sh</p>
<p>然后再次运行run.sh命令：</p>
<p>[root@susun177 bin]# sh run.sh</p>
<p>Using PHOENIX_HOME:&nbsp;&nbsp; /usr/local/james-2.3.2</p>
<p>Using PHOENIX_TMPDIR: /usr/local/james-2.3.2/temp</p>
<p>Using JAVA_HOME:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/java/jdk1.5.0</p>
<p>Running Phoenix: </p>
<p>Phoenix 4.2</p>
<p>James Mail Server 2.3.2</p>
<p>Remote Manager Service started plain:4555</p>
<p>POP3 Service started plain:110</p>
<p>SMTP Service started plain:25</p>
<p>NNTP Service started plain:119</p>
<p>FetchMail Disabled</p>
<p>说明James启动成功。</p>
<p>3）按Ctrl +
C退出James，编辑config.xml文件。生成的config.xml放置在../james-2.3.2/apps/james/SAR-
INF目录下。关于James的config.xml的修改，网上很多资料，请自行查阅。在这里，只写关键的修改：</p>
<p>A）找到&lt;servernames autodetect="true" autodetectIP="true"&gt; 设成&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; autodetect="false" autodetectIP="false" </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; autodetct设为true会自动侦测你的主机名,设成false会用你指定的server name。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; autodetectIP设为true会为你的servername加上ip。</p>
<p>B）设置servername 将默认的为localhost改成你的server名字 如king.cn： </p>
<p>&lt;servername&gt;king.cn&lt;/servername&gt;</p>
<p>然后修改Linux的hosts主机设置文件：</p>
<p>[root@susun177 SAR-INF]# vi /etc/hosts</p>
<p>在打开的文件添加一行，然后保存：</p>
<p>192.168.1.177&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; king.cn&nbsp;&nbsp; king</p>
<p>注意：第一个为IP地址&nbsp; 第二个为主机域名&nbsp; 第三个为主机名称</p>
<p>提示：名字后面应该要加上.com或者.cn这样163等邮件服务器才不会拒绝的。</p>
<p>C）注释掉</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;processor&gt; relay-denied &lt;/processor&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;notice&gt;550 - Requested action not taken: relaying denied&lt;/notice&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/mailet&gt;</p>
<p>D）配置DNS Server，先通过netstat命令查看dns配置</p>
<p>[root@susun177 SAR-INF]# netstat -rn</p>
<p>Kernel IP routing table</p>
<p>Destination&nbsp;&nbsp;&nbsp;&nbsp; Gateway&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Genmask&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Flags&nbsp;&nbsp; MSS Window&nbsp; irtt Iface</p>
<p>192.168.1.0&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 255.255.255.0&nbsp;&nbsp; U&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 eth0</p>
<p>169.254.0.0&nbsp;&nbsp;&nbsp;&nbsp; 0.0.0.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 255.255.0.0&nbsp;&nbsp;&nbsp;&nbsp; U&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 eth0</p>
<p>找到&lt;dnsserver&gt;，在&lt;servers&gt;里最前面添加一行： &lt;server&gt;192.168.1.0&lt;/server&gt; ，&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同时设置autodiscover为false。</p>
<p>&nbsp;&nbsp; &lt;dnsserver&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servers&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--Enter ip address of your DNS server, one IP address per server --&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- element. --&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;server&gt;127.0.0.1&lt;/server&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;server&gt;10.168.0.10&lt;/server&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servers&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Change autodiscover to false if you would like to turn off autodiscovery --&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- and set the DNS servers manually in the &lt;servers&gt; section --&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;autodiscover&gt;false&lt;/autodiscover&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;authoritative&gt;false&lt;/authoritative&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- Maximum number of entries to maintain in the DNS cache --&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;maxcachesize&gt;50000&lt;/maxcachesize&gt;</p>
<p>&nbsp;&nbsp; &lt;/dnsserver&gt;</p>
<p>E）修改James数据库连接字符串：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;data-source name="maildb" class="org.apache.james.util.dbcp.JdbcDataSource"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;driver&gt;oracle.jdbc.driver.OracleDriver&lt;/driver&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dburl&gt;jdbc:oracle:thin:@192.168.1.17:1521:hello&lt;/dburl&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;user&gt;hello&lt;/user&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;password&gt;kitty&lt;/password&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;keep-alive&gt;select 1 from dual&lt;/keep-alive&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;testOnBorrow&gt;true&lt;/testOnBorrow&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;testOnReturn&gt;true&lt;/testOnReturn&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;max&gt;50&lt;/max&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/data-source&gt;</p>
<p>以上用的是oracle数据库，如果是其他数据库，则需要修改为对应的数据库连接驱动，以及数据库用户信息。</p>
<p>注意：一定要记得配置&lt;keep-alive&gt;，该参数的意思是，在使用连接池的连接之前，是否需要验证该连接是否有效。之前，我没有设置该参数，结果总是出现收不到邮件的问题。</p>
<p>4）优化一下James内存，在../james-2.3.2/bi/phoenix.sh加入：</p>
<p># Set Heap Size 2007-0818,fix OutOfMemory bug while transporting big mail</p>
<p>PHOENIX_JVM_OPTS="$PHOENIX_JVM_OPTS -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M"</p>
<p>修改../james-2.3.2/conf/wrapper.conf的jvm配置，设置初始内存128M,最大内存512M </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Initial Java Heap Size (in MB) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #wrapper.java.initmemory=16 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wrapper.java.initmemory=128 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Maximum Java Heap Size (in MB) </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #wrapper.java.maxmemory=64 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wrapper.java.maxmemory=512</p>
<p>5） 复制数据库驱动到../james-2.3.2/lib目录下，我用的是oracle数据库，驱动包为：ojdbc14.jar</p>
<p>6）重启Apache James服务。</p>
<p>7）最后，进入邮件系统全局管理，将系统的域名改为上述的server name。</p>
<p>8）如无意外一切OK。</p>
<img src ="http://www.blogjava.net/zuofei-bie/aggbug/346980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuofei-bie/" target="_blank">别昨非</a> 2011-03-24 20:35 <a href="http://www.blogjava.net/zuofei-bie/archive/2011/03/24/346980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最简单的Map遍历的写法</title><link>http://www.blogjava.net/zuofei-bie/archive/2011/03/24/346922.html</link><dc:creator>别昨非</dc:creator><author>别昨非</author><pubDate>Thu, 24 Mar 2011 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/zuofei-bie/archive/2011/03/24/346922.html</guid><wfw:comment>http://www.blogjava.net/zuofei-bie/comments/346922.html</wfw:comment><comments>http://www.blogjava.net/zuofei-bie/archive/2011/03/24/346922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuofei-bie/comments/commentRss/346922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuofei-bie/services/trackbacks/346922.html</trackback:ping><description><![CDATA[<ol class="dp-j" start="1">
    <li><span><span>Map&lt;String,String&gt;&nbsp;map&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;HashMap&lt;String,String&gt;();&nbsp;&nbsp;</span></span></li>
    <li><span><span class="keyword">for</span><span>(Map.Entry&lt;String,&nbsp;String&gt;&nbsp;entry&nbsp;:&nbsp;map.entrySet()){&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;entry.getValue();&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;entry.getKey();&nbsp;&nbsp;</span></li>
    <li><span>}</span></li>
</ol>
<img src ="http://www.blogjava.net/zuofei-bie/aggbug/346922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuofei-bie/" target="_blank">别昨非</a> 2011-03-24 11:08 <a href="http://www.blogjava.net/zuofei-bie/archive/2011/03/24/346922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP数据类型转换 （转）</title><link>http://www.blogjava.net/zuofei-bie/archive/2010/03/31/317092.html</link><dc:creator>别昨非</dc:creator><author>别昨非</author><pubDate>Wed, 31 Mar 2010 12:25:00 GMT</pubDate><guid>http://www.blogjava.net/zuofei-bie/archive/2010/03/31/317092.html</guid><wfw:comment>http://www.blogjava.net/zuofei-bie/comments/317092.html</wfw:comment><comments>http://www.blogjava.net/zuofei-bie/archive/2010/03/31/317092.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/zuofei-bie/comments/commentRss/317092.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuofei-bie/services/trackbacks/317092.html</trackback:ping><description><![CDATA[<p>PHP数据类型转换</p>
<p>PHP的数据类型转换属于强制转换，允许转换的PHP数据类型有：</p>
<p>&#8226;（int）、（integer）：转换成整形 <br />
&#8226;（float）、（double）、（real）：转换成浮点型 <br />
&#8226;（string）：转换成字符串 <br />
&#8226;（bool）、（boolean）：转换成布尔类型 <br />
&#8226;（array）：转换成数组 <br />
&#8226;（object）：转换成对象 <br />
PHP数据类型有三种转换方式：</p>
<p>&#8226;在要转换的变量之前加上用括号括起来的目标类型 <br />
&#8226;使用3个具体类型的转换函数，intval()、floatval()、strval() <br />
&#8226;使用通用类型转换函数settype(mixed var,string type) <br />
&nbsp;第一种转换方式： (int)&nbsp; (bool)&nbsp; (float)&nbsp; (string)&nbsp; (array) (object)</p>
<p>&nbsp;<br />
1.&lt;?php&nbsp;&nbsp;&nbsp; <br />
2.$num1=3.14;&nbsp;&nbsp;&nbsp; <br />
3.$num2=(int)$num1;&nbsp;&nbsp;&nbsp; <br />
4.var_dump($num1); //输出float(3.14)&nbsp;&nbsp;&nbsp; <br />
5.var_dump($num2); //输出int(3)&nbsp;&nbsp;&nbsp; <br />
6.?&gt;&nbsp;&nbsp; <br />
第二种转换方式：&nbsp; intval()&nbsp; floatval()&nbsp; strval()</p>
<p>&nbsp;<br />
1.&lt;?php&nbsp;&nbsp;&nbsp; <br />
2.$str="123.9abc";&nbsp;&nbsp;&nbsp; <br />
3.$int=intval($str);&nbsp;&nbsp;&nbsp;&nbsp; //转换后数值：123&nbsp;&nbsp;&nbsp; <br />
4.$float=floatval($str); //转换后数值：123.9&nbsp;&nbsp;&nbsp; <br />
5.$str=strval($float);&nbsp;&nbsp; //转换后字符串："123.9"&nbsp;&nbsp;&nbsp;&nbsp; <br />
6.?&gt;&nbsp;&nbsp; <br />
第三种转换方式：&nbsp; settype();</p>
<p>&nbsp;<br />
1.&lt;?php&nbsp;&nbsp;&nbsp; <br />
2.$num4=12.8;&nbsp;&nbsp;&nbsp; <br />
3.$flg=settype($num4,"int");&nbsp;&nbsp;&nbsp; <br />
4.var_dump($flg);&nbsp; //输出bool(true)&nbsp;&nbsp;&nbsp; <br />
5.var_dump($num4); //输出int(12)&nbsp;&nbsp;&nbsp; <br />
6.?&gt;&nbsp; </p>
<img src ="http://www.blogjava.net/zuofei-bie/aggbug/317092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuofei-bie/" target="_blank">别昨非</a> 2010-03-31 20:25 <a href="http://www.blogjava.net/zuofei-bie/archive/2010/03/31/317092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jquery validate (引用)</title><link>http://www.blogjava.net/zuofei-bie/archive/2010/03/31/317062.html</link><dc:creator>别昨非</dc:creator><author>别昨非</author><pubDate>Wed, 31 Mar 2010 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/zuofei-bie/archive/2010/03/31/317062.html</guid><wfw:comment>http://www.blogjava.net/zuofei-bie/comments/317062.html</wfw:comment><comments>http://www.blogjava.net/zuofei-bie/archive/2010/03/31/317062.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuofei-bie/comments/commentRss/317062.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuofei-bie/services/trackbacks/317062.html</trackback:ping><description><![CDATA[<ol class="dp-j">
    <li><span><span>$(document).ready(function(){&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">/*&nbsp;设置默认属性&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>$.validator.setDefaults({&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;submitHandler:&nbsp;function(form)&nbsp;{&nbsp;form.submit();&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>});&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;中文字两个字节&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="hilite1">jQuery</span>.validator.addMethod(</span><span class="string">"byteRangeLength"</span><span>,&nbsp;function(value,&nbsp;element,&nbsp;param)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;var&nbsp;length&nbsp;=&nbsp;value.length;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">for</span><span>(var&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;value.length;&nbsp;i++){&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(value.charCodeAt(i)&nbsp;&gt;&nbsp;</span><span class="number">127</span><span>){&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;length++;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.optional(element)&nbsp;||&nbsp;(&nbsp;length&nbsp;&gt;=&nbsp;param[</span><span class="number">0</span><span>]&nbsp;&amp;&amp;&nbsp;length&nbsp;&lt;=&nbsp;param[</span><span class="number">1</span><span>]&nbsp;);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>},&nbsp;</span><span class="string">"请确保输入的值在3-15个字节之间(一个中文字算2个字节)"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">/*&nbsp;追加自定义验证方法&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span class="comment">//&nbsp;身份证号码验证&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="hilite1">jQuery</span>.validator.addMethod(</span><span class="string">"isIdCardNo"</span><span>,&nbsp;function(value,&nbsp;element)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.optional(element)&nbsp;||&nbsp;isIdCardNo(value);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>},&nbsp;</span><span class="string">"请正确输入您的身份证号码"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;字符验证&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="hilite1">jQuery</span>.validator.addMethod(</span><span class="string">"userName"</span><span>,&nbsp;function(value,&nbsp;element)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.optional(element)&nbsp;||&nbsp;/^[\u0391-\uFFE5\w]+$/.test(value);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>},&nbsp;</span><span class="string">"用户名只能包括中文字、英文字母、数字和下划线"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;手机号码验证&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="hilite1">jQuery</span>.validator.addMethod(</span><span class="string">"isMobile"</span><span>,&nbsp;function(value,&nbsp;element)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;var&nbsp;length&nbsp;=&nbsp;value.length;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.optional(element)&nbsp;||&nbsp;(length&nbsp;==&nbsp;</span><span class="number">11</span><span>&nbsp;&amp;&amp;&nbsp;/^(((</span><span class="number">13</span><span>[</span><span class="number">0</span><span>-</span><span class="number">9</span><span>]{</span><span class="number">1</span><span>})|(</span><span class="number">15</span><span>[</span><span class="number">0</span><span>-</span><span class="number">9</span><span>]{</span><span class="number">1</span><span>}))+\d{</span><span class="number">8</span><span>})$/.test(value));&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>},&nbsp;</span><span class="string">"请正确填写您的手机号码"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;电话号码验证&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="hilite1">jQuery</span>.validator.addMethod(</span><span class="string">"isPhone"</span><span>,&nbsp;function(value,&nbsp;element)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;var&nbsp;tel&nbsp;=&nbsp;/^(\d{</span><span class="number">3</span><span>,</span><span class="number">4</span><span>}-?)?\d{</span><span class="number">7</span><span>,</span><span class="number">9</span><span>}$/g;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.optional(element)&nbsp;||&nbsp;(tel.test(value));&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>},&nbsp;</span><span class="string">"请正确填写您的电话号码"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;邮政编码验证&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span><span class="hilite1">jQuery</span>.validator.addMethod(</span><span class="string">"isZipCode"</span><span>,&nbsp;function(value,&nbsp;element)&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;var&nbsp;tel&nbsp;=&nbsp;/^[</span><span class="number">0</span><span>-</span><span class="number">9</span><span>]{</span><span class="number">6</span><span>}$/;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.optional(element)&nbsp;||&nbsp;(tel.test(value));&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>},&nbsp;</span><span class="string">"请正确填写您的邮政编码"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>$(regFrom).<span class="hilite2">validate</span>({&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="comment">/*&nbsp;设置验证规则&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;rules:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;userName:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="keyword">true</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;userName:&nbsp;</span><span class="keyword">true</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;byteRangeLength:&nbsp;[</span><span class="number">3</span><span>,</span><span class="number">15</span><span>]&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;password:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="keyword">true</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;minLength:&nbsp;</span><span class="number">5</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;repassword:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="keyword">true</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;minLength:&nbsp;</span><span class="number">5</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;equalTo:&nbsp;</span><span class="string">"#password"</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;question:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="keyword">true</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;answer:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="keyword">true</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;realName:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="keyword">true</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;cardNumber:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;isIdCardNo:&nbsp;</span><span class="keyword">true</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;mobilePhone:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;isMobile:&nbsp;</span><span class="keyword">true</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;phone:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;isPhone:&nbsp;</span><span class="keyword">true</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;email:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="keyword">true</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;email:&nbsp;</span><span class="keyword">true</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;zipCode:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;isZipCode:</span><span class="keyword">true</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="comment">/*&nbsp;设置错误信息&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;messages:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;userName:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="string">"请填写用户名"</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;byteRangeLength:&nbsp;</span><span class="string">"用户名必须在3-15个字符之间(一个中文字算2个字符)"</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;password:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="string">"请填写密码"</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;minlength:&nbsp;<span class="hilite1">jQuery</span>.format(</span><span class="string">"输入{0}."</span><span>)&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;repassword:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="string">"请填写确认密码"</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;equalTo:&nbsp;</span><span class="string">"两次密码输入不相同"</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;question:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="string">"请填写您的密码提示问题"</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;answer:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="string">"请填写您的密码提示答案"</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;realName:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="string">"请填写您的真实姓名"</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;email:&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;required:&nbsp;</span><span class="string">"请输入一个Email地址"</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;email:&nbsp;</span><span class="string">"请输入一个有效的Email地址"</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="comment">/*&nbsp;错误信息的显示位置&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;errorPlacement:&nbsp;function(error,&nbsp;element)&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;error.appendTo(&nbsp;element.parent()&nbsp;);&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="comment">/*&nbsp;验证通过时的处理&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;success:&nbsp;function(label)&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;set&nbsp;&nbsp;&nbsp;as&nbsp;text&nbsp;for&nbsp;IE&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;label.html(</span><span class="string">"&nbsp;"</span><span>).addClass(</span><span class="string">"checked"</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;},&nbsp; &nbsp;&nbsp;</span></li>
    <li><span class="comment">/*&nbsp;获得焦点时不验证&nbsp;*/</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;focusInvalid:&nbsp;</span><span class="keyword">false</span><span>,&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;onkeyup:&nbsp;</span><span class="keyword">false</span><span>&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>});&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;输入框获得焦点时，样式设置&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>$(</span><span class="string">'input'</span><span>).focus(function(){&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">if</span><span>($(</span><span class="keyword">this</span><span>).is(</span><span class="string">":text"</span><span>)&nbsp;||&nbsp;$(</span><span class="keyword">this</span><span>).is(</span><span class="string">":password"</span><span>))&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;$(</span><span class="keyword">this</span><span>).addClass(</span><span class="string">'focus'</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;($(</span><span class="keyword">this</span><span>).hasClass(</span><span class="string">'have_tooltip'</span><span>))&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;$(</span><span class="keyword">this</span><span>).parent().parent().removeClass(</span><span class="string">'field_normal'</span><span>).addClass(</span><span class="string">'field_focus'</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>});&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li><span class="comment">//&nbsp;输入框失去焦点时，样式设置&nbsp; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>$(</span><span class="string">'input'</span><span>).blur(function()&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;$(</span><span class="keyword">this</span><span>).removeClass(</span><span class="string">'focus'</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;($(</span><span class="keyword">this</span><span>).hasClass(</span><span class="string">'have_tooltip'</span><span>))&nbsp;{&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;&nbsp;$(</span><span class="keyword">this</span><span>).parent().parent().removeClass(</span><span class="string">'field_focus'</span><span>).addClass(</span><span class="string">'field_normal'</span><span>);&nbsp; &nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>});&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>});&nbsp;&nbsp;&nbsp;</span></li>
</ol>
<img src ="http://www.blogjava.net/zuofei-bie/aggbug/317062.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuofei-bie/" target="_blank">别昨非</a> 2010-03-31 15:27 <a href="http://www.blogjava.net/zuofei-bie/archive/2010/03/31/317062.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jquery validate demo</title><link>http://www.blogjava.net/zuofei-bie/archive/2010/03/31/317063.html</link><dc:creator>别昨非</dc:creator><author>别昨非</author><pubDate>Wed, 31 Mar 2010 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/zuofei-bie/archive/2010/03/31/317063.html</guid><wfw:comment>http://www.blogjava.net/zuofei-bie/comments/317063.html</wfw:comment><comments>http://www.blogjava.net/zuofei-bie/archive/2010/03/31/317063.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/zuofei-bie/comments/commentRss/317063.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuofei-bie/services/trackbacks/317063.html</trackback:ping><description><![CDATA[<p>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;<br />
&lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;<br />
&lt;head&gt;<br />
&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /&gt;<br />
&lt;title&gt;jQuery validation plug-in - main demo&lt;/title&gt;</p>
<p>&lt;link rel="stylesheet" type="text/css" media="screen" href="css/screen.css" /&gt;</p>
<p>&lt;script src="../lib/jquery.js" type="text/javascript"&gt;&lt;/script&gt;<br />
&lt;script src="../jquery.validate.js" type="text/javascript"&gt;&lt;/script&gt;</p>
<p>&lt;script type="text/javascript"&gt;<br />
$.validator.setDefaults({<br />
&nbsp;submitHandler: function() { alert("submitted!"); }<br />
});</p>
<p>$().ready(function() {<br />
&nbsp;// validate the comment form when it is submitted<br />
&nbsp;$("#commentForm").validate();<br />
&nbsp;<br />
&nbsp;// validate signup form on keyup and submit<br />
&nbsp;$("#signupForm").validate({<br />
&nbsp;&nbsp;rules: {<br />
&nbsp;&nbsp;&nbsp;firstname: "required",<br />
&nbsp;&nbsp;&nbsp;lastname: "required",<br />
&nbsp;&nbsp;&nbsp;username: {<br />
&nbsp;&nbsp;&nbsp;&nbsp;required: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;minlength: 2<br />
&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;password: {<br />
&nbsp;&nbsp;&nbsp;&nbsp;required: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;minlength: 5<br />
&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;confirm_password: {<br />
&nbsp;&nbsp;&nbsp;&nbsp;required: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;minlength: 5,<br />
&nbsp;&nbsp;&nbsp;&nbsp;equalTo: "#password"<br />
&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;email: {<br />
&nbsp;&nbsp;&nbsp;&nbsp;required: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;email: true<br />
&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;topic: {<br />
&nbsp;&nbsp;&nbsp;&nbsp;required: "#newsletter:checked",<br />
&nbsp;&nbsp;&nbsp;&nbsp;minlength: 2<br />
&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;agree: "required"<br />
&nbsp;&nbsp;},<br />
&nbsp;&nbsp;messages: {<br />
&nbsp;&nbsp;&nbsp;firstname: "Please enter your firstname",<br />
&nbsp;&nbsp;&nbsp;lastname: "Please enter your lastname",<br />
&nbsp;&nbsp;&nbsp;username: {<br />
&nbsp;&nbsp;&nbsp;&nbsp;required: "Please enter a username",<br />
&nbsp;&nbsp;&nbsp;&nbsp;minlength: "Your username must consist of at least 2 characters"<br />
&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;password: {<br />
&nbsp;&nbsp;&nbsp;&nbsp;required: "Please provide a password",<br />
&nbsp;&nbsp;&nbsp;&nbsp;minlength: "Your password must be at least 5 characters long"<br />
&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;confirm_password: {<br />
&nbsp;&nbsp;&nbsp;&nbsp;required: "Please provide a password",<br />
&nbsp;&nbsp;&nbsp;&nbsp;minlength: "Your password must be at least 5 characters long",<br />
&nbsp;&nbsp;&nbsp;&nbsp;equalTo: "Please enter the same password as above"<br />
&nbsp;&nbsp;&nbsp;},<br />
&nbsp;&nbsp;&nbsp;email: "Please enter a valid email address",<br />
&nbsp;&nbsp;&nbsp;agree: "Please accept our policy"<br />
&nbsp;&nbsp;}<br />
&nbsp;});<br />
&nbsp;<br />
&nbsp;// propose username by combining first- and lastname<br />
&nbsp;$("#username").focus(function() {<br />
&nbsp;&nbsp;var firstname = $("#firstname").val();<br />
&nbsp;&nbsp;var lastname = $("#lastname").val();<br />
&nbsp;&nbsp;if(firstname &amp;&amp; lastname &amp;&amp; !this.value) {<br />
&nbsp;&nbsp;&nbsp;this.value = firstname + "." + lastname;<br />
&nbsp;&nbsp;}<br />
&nbsp;});<br />
&nbsp;<br />
&nbsp;//code to hide topic selection, disable for demo<br />
&nbsp;var newsletter = $("#newsletter");<br />
&nbsp;// newsletter topics are optional, hide at first<br />
&nbsp;var inital = newsletter.is(":checked");<br />
&nbsp;var topics = $("#newsletter_topics")[inital ? "removeClass" : "addClass"]("gray");<br />
&nbsp;var topicInputs = topics.find("input").attr("disabled", !inital);<br />
&nbsp;// show when newsletter is checked<br />
&nbsp;newsletter.click(function() {<br />
&nbsp;&nbsp;topics[this.checked ? "removeClass" : "addClass"]("gray");<br />
&nbsp;&nbsp;topicInputs.attr("disabled", !this.checked);<br />
&nbsp;});<br />
});<br />
&lt;/script&gt;</p>
<p>&lt;style type="text/css"&gt;<br />
#commentForm { width: 500px; }<br />
#commentForm label { width: 250px; }<br />
#commentForm label.error, #commentForm input.submit { margin-left: 253px; }<br />
#signupForm { width: 670px; }<br />
#signupForm label.error {<br />
&nbsp;margin-left: 10px;<br />
&nbsp;width: auto;<br />
&nbsp;display: inline;<br />
}<br />
#newsletter_topics label.error {<br />
&nbsp;display: none;<br />
&nbsp;margin-left: 103px;<br />
}<br />
&lt;/style&gt;</p>
<p>&lt;/head&gt;<br />
&lt;body&gt;</p>
<p>&lt;h1 id="banner"&gt;&lt;a href="http://bassistance.de/jquery-plugins/jquery-plugin-validation/"&gt;jQuery Validation Plugin&lt;/a&gt; Demo&lt;/h1&gt;<br />
&lt;div id="main"&gt;</p>
<p>&lt;p&gt;Default submitHandler is set to display an alert into of submitting the form&lt;/p&gt;</p>
<p>&lt;form class="cmxform" id="commentForm" method="get" action=""&gt;<br />
&nbsp;&lt;fieldset&gt;<br />
&nbsp;&nbsp;&lt;legend&gt;Please provide your name, email address (won't be published) and a comment&lt;/legend&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="cname"&gt;Name (required, at least 2 characters)&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;input id="cname" name="name" class="required" minlength="2" /&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="cemail"&gt;E-Mail (required)&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;input id="cemail" name="email" class="required email" /&gt;<br />
&nbsp;&nbsp;&lt;/p&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="curl"&gt;URL (optional)&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;input id="curl" name="url" class="url" value="" /&gt;<br />
&nbsp;&nbsp;&lt;/p&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="ccomment"&gt;Your comment (required)&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;textarea id="ccomment" name="comment" class="required"&gt;&lt;/textarea&gt;<br />
&nbsp;&nbsp;&lt;/p&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;input class="submit" type="submit" value="Submit"/&gt;<br />
&nbsp;&nbsp;&lt;/p&gt;<br />
&nbsp;&lt;/fieldset&gt;<br />
&lt;/form&gt;</p>
<p>&lt;form class="cmxform" id="signupForm" method="get" action=""&gt;<br />
&nbsp;&lt;fieldset&gt;<br />
&nbsp;&nbsp;&lt;legend&gt;Validating a complete form&lt;/legend&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="firstname"&gt;Firstname&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;input id="firstname" name="firstname" /&gt;<br />
&nbsp;&nbsp;&lt;/p&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="lastname"&gt;Lastname&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;input id="lastname" name="lastname" /&gt;<br />
&nbsp;&nbsp;&lt;/p&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="username"&gt;Username&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;input id="username" name="username" /&gt;<br />
&nbsp;&nbsp;&lt;/p&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="password"&gt;Password&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;input id="password" name="password" type="password" /&gt;<br />
&nbsp;&nbsp;&lt;/p&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="confirm_password"&gt;Confirm password&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;input id="confirm_password" name="confirm_password" type="password" /&gt;<br />
&nbsp;&nbsp;&lt;/p&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="email"&gt;Email&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;input id="email" name="email" /&gt;<br />
&nbsp;&nbsp;&lt;/p&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="agree"&gt;Please agree to our policy&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;input type="checkbox" class="checkbox" id="agree" name="agree" /&gt;<br />
&nbsp;&nbsp;&lt;/p&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="newsletter"&gt;I'd like to receive the newsletter&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;input type="checkbox" class="checkbox" id="newsletter" name="newsletter" /&gt;<br />
&nbsp;&nbsp;&lt;/p&gt;<br />
&nbsp;&nbsp;&lt;fieldset id="newsletter_topics"&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;legend&gt;Topics (select at least two) - note: would be hidden when newsletter isn't selected, but is visible here for the demo&lt;/legend&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="topic_marketflash"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;input type="checkbox" id="topic_marketflash" value="marketflash" name="topic" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Marketflash<br />
&nbsp;&nbsp;&nbsp;&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="topic_fuzz"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;input type="checkbox" id="topic_fuzz" value="fuzz" name="topic" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Latest fuzz<br />
&nbsp;&nbsp;&nbsp;&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="topic_digester"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;input type="checkbox" id="topic_digester" value="digester" name="topic" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Mailing list digester<br />
&nbsp;&nbsp;&nbsp;&lt;/label&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;label for="topic" class="error"&gt;Please select at least two topics you'd like to receive.&lt;/label&gt;<br />
&nbsp;&nbsp;&lt;/fieldset&gt;<br />
&nbsp;&nbsp;&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;input class="submit" type="submit" value="Submit"/&gt;<br />
&nbsp;&nbsp;&lt;/p&gt;<br />
&nbsp;&lt;/fieldset&gt;<br />
&lt;/form&gt;</p>
<p>&lt;h3&gt;Syntetic examples&lt;/h3&gt;<br />
&lt;ul&gt;<br />
&nbsp;&lt;li&gt;&lt;a href="errorcontainer-demo.html"&gt;Error message containers in action&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&lt;li&gt;&lt;a href="custom-messages-metadata-demo.html"&gt;Custom Messages as Metadata&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&lt;li&gt;&lt;a href="radio-checkbox-select-demo.html"&gt;Radio and checkbox buttons and selects&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&lt;li&gt;&lt;a href="ajaxSubmit-intergration-demo.html"&gt;Integration with Form Plugin (AJAX submit)&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&lt;li&gt;&lt;a href="custom-methods-demo.html"&gt;Custom methods and message display.&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&lt;li&gt;&lt;a href="dynamic-totals.html"&gt;Dynamic forms&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&lt;li&gt;&lt;a href="themerollered.html"&gt;Forms styled with jQuery UI Themeroller&lt;/a&gt;&lt;/li&gt;<br />
&lt;/ul&gt;<br />
&lt;h3&gt;Real-world examples&lt;/h3&gt;<br />
&lt;ul&gt;<br />
&nbsp;&lt;li&gt;&lt;a href="milk/"&gt;Remember The Milk signup form&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&lt;li&gt;&lt;a href="marketo/"&gt;Marketo signup form&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&lt;li&gt;&lt;a href="multipart/"&gt;Buy and Sell a House multipart form&lt;/a&gt;&lt;/li&gt;<br />
&nbsp;&lt;li&gt;&lt;a href="captcha/"&gt;Remote captcha validation&lt;/a&gt;&lt;/li&gt;<br />
&lt;/ul&gt;</p>
<p>&lt;h3&gt;Testsuite&lt;/h3&gt;<br />
&lt;ul&gt;<br />
&nbsp;&lt;li&gt;&lt;a href="../test/"&gt;Validation Testsuite&lt;/a&gt;&lt;/li&gt;<br />
&lt;/ul&gt;&nbsp;</p>
<p>&lt;/div&gt;</p>
<p>&lt;script src="http://www.google-analytics.com/urchin.js" type="text/javascript"&gt;<br />
&lt;/script&gt;<br />
&lt;script type="text/javascript"&gt;<br />
_uacct = "UA-2623402-1";<br />
urchinTracker();<br />
&lt;/script&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;</p>
<img src ="http://www.blogjava.net/zuofei-bie/aggbug/317063.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuofei-bie/" target="_blank">别昨非</a> 2010-03-31 15:27 <a href="http://www.blogjava.net/zuofei-bie/archive/2010/03/31/317063.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] 常用 JPA annotation 参考 </title><link>http://www.blogjava.net/zuofei-bie/archive/2010/03/24/316474.html</link><dc:creator>别昨非</dc:creator><author>别昨非</author><pubDate>Wed, 24 Mar 2010 13:07:00 GMT</pubDate><guid>http://www.blogjava.net/zuofei-bie/archive/2010/03/24/316474.html</guid><wfw:comment>http://www.blogjava.net/zuofei-bie/comments/316474.html</wfw:comment><comments>http://www.blogjava.net/zuofei-bie/archive/2010/03/24/316474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuofei-bie/comments/commentRss/316474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuofei-bie/services/trackbacks/316474.html</trackback:ping><description><![CDATA[<p><strong>Table <br />
</strong>Table用来定义entity主表的name，catalog，schema等属性。 <br />
元数据属性说明： <br />
&#183;&nbsp;name: 表名 <br />
&#183;&nbsp;catalog: 对应关系数据库中的catalog <br />
&#183;&nbsp;schema：对应关系数据库中的schema <br />
&#183;&nbsp;UniqueConstraints:定义一个UniqueConstraint数组，指定需要建唯一约束的列 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity<br />
@Table(name="CUST")<br />
public class Customer { ... }<br />
　　<br />
<strong>SecondaryTable</strong> <br />
一个entity class可以映射到多表，SecondaryTable用来定义单个从表的名字，主键名字等属性。 <br />
元数据属性说明： <br />
&#183;&nbsp;name: 表名 <br />
&#183;&nbsp;catalog: 对应关系数据库中的catalog <br />
&#183;&nbsp;schema：对应关系数据库中的schema <br />
&#183;&nbsp;pkJoin: 定义一个PrimaryKeyJoinColumn数组，指定从表的主键列 <br />
&#183;&nbsp;UniqueConstraints:定义一个UniqueConstraint数组，指定需要建唯一约束的列 <br />
下面的代码说明Customer类映射到两个表，主表名是CUSTOMER，从表名是CUST_DETAIL，从表的主键列和主表的主键列类型相同，列名为CUST_ID。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity<br />
@Table(name="CUSTOMER")<br />
@SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"))<br />
public class Customer { ... }</p>
<p><strong>SecondaryTables </strong><br />
当一个entity class映射到一个主表和多个从表时，用SecondaryTables来定义各个从表的属性。 <br />
元数据属性说明： <br />
&#183;&nbsp;value： 定义一个SecondaryTable数组，指定每个从表的属性。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Table(name = "CUSTOMER")<br />
@SecondaryTables( value = {<br />
@SecondaryTable(name = "CUST_NAME", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }),<br />
@SecondaryTable(name = "CUST_ADDRESS", pkJoin = { @PrimaryKeyJoinColumn(name = "STMO_ID", referencedColumnName = "id") }) })<br />
public class Customer {}</p>
<p>UniqueConstraint <br />
UniqueConstraint定义在Table或SecondaryTable元数据里，用来指定建表时需要建唯一约束的列。 <br />
元数据属性说明： <br />
&#183;&nbsp;columnNames:定义一个字符串数组，指定要建唯一约束的列名。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity<br />
@Table(name="EMPLOYEE",<br />
uniqueConstraints={@UniqueConstraint(columnNames={"EMP_ID", "EMP_NAME"})}<br />
)<br />
public class Employee { ... }</p>
<p><strong>Column <br />
</strong>Column元数据定义了映射到数据库的列的所有属性：列名，是否唯一，是否允许为空，是否允许更新等。 <br />
元数据属性说明： <br />
&#183;&nbsp;name:列名。 <br />
&#183;&nbsp;unique: 是否唯一 <br />
&#183;&nbsp;nullable: 是否允许为空 <br />
&#183;&nbsp;insertable: 是否允许插入 <br />
&#183;&nbsp;updatable: 是否允许更新 <br />
&#183;&nbsp;columnDefinition: 定义建表时创建此列的DDL <br />
&#183;&nbsp;secondaryTable: 从表名。如果此列不建在主表上（默认建在主表），该属性定义该列所在从表的名字。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
public class Person {<br />
@Column(name = "PERSONNAME", unique = true, nullable = false, updatable = true)<br />
private String name;<br />
@Column(name = "PHOTO", columnDefinition = "BLOB NOT NULL", secondaryTable="PER_PHOTO")<br />
private byte[] picture;</p>
<p><strong>JoinColumn <br />
</strong>如果在entity class的field上定义了关系（one2one或one2many等），我们通过JoinColumn来定义关系的属性。JoinColumn的大部分属性和Column类似。 <br />
元数据属性说明： <br />
&#183;&nbsp;name:列名。 <br />
&#183;&nbsp;referencedColumnName:该列指向列的列名（建表时该列作为外键列指向关系另一端的指定列） <br />
&#183;&nbsp;unique: 是否唯一 <br />
&#183;&nbsp;nullable: 是否允许为空 <br />
&#183;&nbsp;insertable: 是否允许插入 <br />
&#183;&nbsp;updatable: 是否允许更新 <br />
&#183;&nbsp;columnDefinition: 定义建表时创建此列的DDL <br />
&#183;&nbsp;secondaryTable: 从表名。如果此列不建在主表上（默认建在主表），该属性定义该列所在从表的名字。 <br />
下面的代码说明Custom和Order是一对一关系。在Order对应的映射表建一个名为CUST_ID的列，该列作为外键指向Custom对应表中名为ID的列。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
public class Custom {<br />
@OneToOne<br />
@JoinColumn(<br />
name="CUST_ID", referencedColumnName="ID", unique=true, nullable=true, updatable=true)<br />
public Order getOrder() {<br />
return order;<br />
}</p>
<p><strong>JoinColumns</strong> <br />
如果在entity class的field上定义了关系（one2one或one2many等），并且关系存在多个JoinColumn，用JoinColumns定义多个JoinColumn的属性。 <br />
元数据属性说明： <br />
&#183;&nbsp;value: 定义JoinColumn数组，指定每个JoinColumn的属性。 <br />
下面的代码说明Custom和Order是一对一关系。在Order对应的映射表建两列，一列名为CUST_ID，该列作为外键指向Custom对应表中名为ID的列,另一列名为CUST_NAME，该列作为外键指向Custom对应表中名为NAME的列。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
public class Custom {<br />
@OneToOne<br />
@JoinColumns({<br />
@JoinColumn(name="CUST_ID", referencedColumnName="ID"),<br />
@JoinColumn(name="CUST_NAME", referencedColumnName="NAME")<br />
})<br />
public Order getOrder() {<br />
return order;<br />
}</p>
<p><strong>Id </strong><br />
声明当前field为映射表中的主键列。id值的获取方式有五种：TABLE, SEQUENCE, IDENTITY, AUTO, NONE。Oracle和DB2支持SEQUENCE，SQL Server和Sybase支持IDENTITY,mysql支持AUTO。所有的数据库都可以指定为AUTO，我们会根据不同数据库做转换。NONE (默认)需要用户自己指定Id的值。元数据属性说明： <br />
&#183;&nbsp;generate():主键值的获取类型 <br />
&#183;&nbsp;generator():TableGenerator的名字（当generate=GeneratorType.TABLE才需要指定该属性） <br />
下面的代码声明Task的主键列id是自动增长的。(Oracle和DB2从默认的SEQUENCE取值，SQL Server和Sybase该列建成IDENTITY，mysql该列建成auto increment。) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity<br />
@Table(name = "OTASK")<br />
public class Task {<br />
@Id(generate = GeneratorType.AUTO)<br />
public Integer getId() {<br />
return id;<br />
}<br />
}</p>
<p><strong>IdClass</strong> <br />
当entity class使用复合主键时，需要定义一个类作为id class。id class必须符合以下要求:类必须声明为public，并提供一个声明为public的空构造函数。必须实现Serializable接，覆写 equals()和hashCode（）方法。entity class的所有id field在id class都要定义，且类型一样。 <br />
元数据属性说明： <br />
&#183;&nbsp;value: id class的类名 <br />
&nbsp;&nbsp; public class EmployeePK implements <a title="Java爱好者" href="http://www.blogjava.net/rain1102">Java</a>.io.Serializable{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String empName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Integer empAge;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public EmployeePK(){}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public boolean equals(Object obj){ ......}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int hashCode(){......}<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; @IdClass(value=com.acme.EmployeePK.class)<br />
&nbsp;&nbsp;&nbsp; @Entity(access=FIELD)<br />
&nbsp;&nbsp;&nbsp; public class Employee {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Id String empName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Id Integer empAge;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<strong>MapKey</strong> <br />
在一对多，多对多关系中，我们可以用Map来保存集合对象。默认用主键值做key，如果使用复合主键，则用id class的实例做key，如果指定了name属性，就用指定的field的值做key。 <br />
元数据属性说明： <br />
&#183;&nbsp;name: 用来做key的field名字 <br />
下面的代码说明Person和Book之间是一对多关系。Person的books字段是Map类型，用Book的isbn字段的值作为Map的key。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>@Table(name = "PERSON")<br />
public class Person {<br />
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")<br />
@MapKey(name = "isbn")<br />
private Map books = new HashMap();<br />
}</p>
<p><br />
<strong>OrderBy <br />
</strong>在一对多，多对多关系中，有时我们希望从数据库加载出来的集合对象是按一定方式排序的，这可以通过OrderBy来实现，默认是按对象的主键升序排列。 <br />
元数据属性说明： <br />
&#183;&nbsp;value: 字符串类型，指定排序方式。格式为"fieldName1 [ASC|DESC],fieldName2 [ASC|DESC],......",排序类型可以不指定，默认是ASC。 <br />
下面的代码说明Person和Book之间是一对多关系。集合books按照Book的isbn升序，name降序排列。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>@Table(name = "MAPKEY_PERSON")<br />
public class Person {<br />
@OneToMany(targetEntity = Book.class, cascade = CascadeType.ALL, mappedBy = "person")<br />
@OrderBy(name = "isbn ASC, name DESC")<br />
private List books = new ArrayList();<br />
}</p>
<p><br />
<strong>PrimaryKeyJoinColumn</strong> <br />
在三种情况下会用到PrimaryKeyJoinColumn。 <br />
&#183;&nbsp;继承。 <br />
&#183;&nbsp;entity class映射到一个或多个从表。从表根据主表的主键列（列名为referencedColumnName值的列），建立一个类型一样的主键列，列名由name属性定义。 <br />
&#183;&nbsp;one2one关系，关系维护端的主键作为外键指向关系被维护端的主键，不再新建一个外键列。 <br />
元数据属性说明： <br />
&#183;&nbsp;name:列名。 <br />
&#183;&nbsp;referencedColumnName:该列引用列的列名 <br />
&#183;&nbsp;columnDefinition: 定义建表时创建此列的DDL <br />
下面的代码说明Customer映射到两个表，主表CUSTOMER,从表CUST_DETAIL，从表需要建立主键列CUST_ID，该列和主表的主键列id除了列名不同，其他定义一样。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Entity<br />
@Table(name="CUSTOMER")<br />
@SecondaryTable(name="CUST_DETAIL",pkJoin=@PrimaryKeyJoinColumn(name="CUST_ID"，referencedColumnName="id"))<br />
public class Customer {<br />
@Id(generate = GeneratorType.AUTO)<br />
public Integer getId() {<br />
return id;<br />
}<br />
}</p>
<p>下面的代码说明Employee和EmployeeInfo是一对一关系，Employee的主键列id作为外键指向EmployeeInfo的主键列INFO_ID。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Table(name = "Employee")<br />
public class Employee {<br />
@OneToOne<br />
@PrimaryKeyJoinColumn(name = "id", referencedColumnName="INFO_ID")<br />
EmployeeInfo info;<br />
}</p>
<p><strong>PrimaryKeyJoinColumns</strong> <br />
如果entity class使用了复合主键，指定单个PrimaryKeyJoinColumn不能满足要求时，可以用PrimaryKeyJoinColumns来定义多个PrimaryKeyJoinColumn。 <br />
元数据属性说明： <br />
&#183;&nbsp;value: 一个PrimaryKeyJoinColumn数组，包含所有PrimaryKeyJoinColumn。 <br />
下面的代码说明了Employee和EmployeeInfo是一对一关系。他们都使用复合主键，建表时需要在Employee表建立一个外键，从Employee的主键列id,name指向EmployeeInfo的主键列INFO_ID和INFO_NAME. <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity<br />
@IdClass(EmpPK.class)<br />
@Table(name = "EMPLOYEE")<br />
public class Employee {<br />
private int id;<br />
private String name;<br />
private String address;<br />
@OneToOne(cascade = CascadeType.ALL)<br />
@PrimaryKeyJoinColumns({<br />
@PrimaryKeyJoinColumn(name="id", referencedColumnName="INFO_ID"),<br />
@PrimaryKeyJoinColumn(name="name" , referencedColumnName="INFO_NAME")})<br />
EmployeeInfo info;<br />
}<br />
@Entity<br />
@IdClass(EmpPK.class)<br />
@Table(name = "EMPLOYEE_INFO")<br />
public class EmployeeInfo {<br />
@Id<br />
@Column(name = "INFO_ID")<br />
private int id;<br />
@Id<br />
@Column(name = "INFO_NAME")<br />
private String name;<br />
}</p>
<p><strong>Transient <br />
</strong>Transient用来注释entity的属性，指定的这些属性不会被持久化，也不会为这些属性建表。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Transient<br />
private String name;</p>
<p><strong>Version </strong><br />
Version指定实体类在乐观事务中的version属性。在实体类重新由EntityManager管理并且加入到乐观事务中时，保证完整性。每一个类只能有一个属性被指定为version，version属性应该映射到实体类的主表上。 <br />
下面的代码说明versionNum属性作为这个类的version，映射到数据库中主表的列名是OPTLOCK。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Version<br />
@Column("OPTLOCK")<br />
protected int getVersionNum() { return versionNum; }</p>
<p><strong>Lob</strong> <br />
Lob指定一个属性作为数据库支持的大对象类型在数据库中存储。使用LobType这个枚举来定义Lob是二进制类型还是字符类型。 <br />
LobType枚举类型说明： <br />
&#183;&nbsp;BLOB 二进制大对象，Byte[]或者Serializable的类型可以指定为BLOB。 <br />
&#183;&nbsp;CLOB 字符型大对象，char[]、Character[]或String类型可以指定为CLOB。 <br />
元数据属性说明： <br />
&#183;&nbsp;fetch： 定义这个字段是lazy loaded还是eagerly fetched。数据类型是FetchType枚举，默认为LAZY,即lazy loaded. <br />
&#183;&nbsp;type： 定义这个字段在数据库中的JDBC数据类型。数据类型是LobType枚举，默认为BLOB。 <br />
下面的代码定义了一个BLOB类型的属性和一个CLOB类型的属性。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Lob<br />
@Column(name="PHOTO" columnDefinition="BLOB NOT NULL")<br />
protected JPEGImage picture;<br />
@Lob(fetch=EAGER, type=CLOB)<br />
@Column(name="REPORT")<br />
protected String report;</p>
<p><strong>JoinTable</strong> <br />
JoinTable在many-to-many关系的所有者一边定义。如果没有定义JoinTable，使用JoinTable的默认值。 <br />
元数据属性说明： <br />
&#183;&nbsp;table:这个join table的Table定义。 <br />
&#183;&nbsp;joinColumns:定义指向所有者主表的外键列，数据类型是JoinColumn数组。 <br />
&#183;&nbsp;inverseJoinColumns:定义指向非所有者主表的外键列，数据类型是JoinColumn数组。 <br />
下面的代码定义了一个连接表CUST和PHONE的join table。join table的表名是CUST_PHONE，包含两个外键，一个外键是CUST_ID，指向表CUST的主键ID，另一个外键是PHONE_ID，指向表PHONE的主键ID。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@JoinTable(<br />
table=@Table(name=CUST_PHONE),<br />
joinColumns=@JoinColumn(name="CUST_ID", referencedColumnName="ID"),<br />
inverseJoinColumns=@JoinColumn(name="PHONE_ID", referencedColumnName="ID")<br />
)</p>
<p><strong>TableGenerator</strong> <br />
TableGenerator定义一个主键值生成器，在Id这个元数据的generate＝TABLE时，generator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义。 <br />
生成器是为多个实体类提供连续的ID值的表，每一行为一个类提供ID值，ID值通常是整数。 <br />
元数据属性说明： <br />
&#183;&nbsp;name:生成器的唯一名字，可以被Id元数据使用。 <br />
&#183;&nbsp;table:生成器用来存储id值的Table定义。 <br />
&#183;&nbsp;pkColumnName:生成器表的主键名称。 <br />
&#183;&nbsp;valueColumnName:生成器表的ID值的列名称。 <br />
&#183;&nbsp;pkColumnValue:生成器表中的一行数据的主键值。 <br />
&#183;&nbsp;initialValue:id值的初始值。 <br />
&#183;&nbsp;allocationSize:id值的增量。 <br />
下面的代码定义了两个生成器empGen和addressGen，生成器的表是ID_GEN。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity public class Employee {<br />
...<br />
@TableGenerator(name="empGen",<br />
table=@Table(name="ID_GEN"),<br />
pkColumnName="GEN_KEY",<br />
valueColumnName="GEN_VALUE",<br />
pkColumnValue="EMP_ID",<br />
allocationSize=1)<br />
@Id(generate=TABLE, generator="empGen")<br />
public int id;<br />
...<br />
}<br />
@Entity public class Address {<br />
...<br />
@TableGenerator(name="addressGen",<br />
table=@Table(name="ID_GEN"),<br />
pkColumnValue="ADDR_ID")<br />
@Id(generate=TABLE, generator="addressGen")<br />
public int id;<br />
...<br />
}</p>
<p><strong>SequenceGenerator</strong> <br />
SequenceGenerator定义一个主键值生成器，在Id这个元数据的generator属性中可以使用生成器的名字。生成器可以在类、方法或者属性上定义。生成器是数据库支持的sequence对象。 <br />
元数据属性说明： <br />
&#183;&nbsp;name:生成器的唯一名字，可以被Id元数据使用。 <br />
&#183;&nbsp;sequenceName:数据库中，sequence对象的名称。如果不指定，会使用提供商指定的默认名称。 <br />
&#183;&nbsp;initialValue:id值的初始值。 <br />
&#183;&nbsp;allocationSize:id值的增量。 <br />
下面的代码定义了一个使用提供商默认名称的sequence生成器。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@SequenceGenerator(name="EMP_SEQ", allocationSize=25)</p>
<p><strong>DiscriminatorColumn </strong><br />
DiscriminatorColumn定义在使用SINGLE_TABLE或JOINED继承策略的表中区别不继承层次的列。 <br />
元数据属性说明： <br />
&#183;&nbsp;name:column的名字。默认值为TYPE。 <br />
&#183;&nbsp;columnDefinition:生成DDL的sql片断。 <br />
&#183;&nbsp;length:String类型的column的长度，其他类型使用默认值10。 <br />
下面的代码定义了一个列名为DISC，长度为20的String类型的区别列。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
@Entity<br />
@Table(name="CUST")<br />
@Inheritance(strategy=SINGLE_TABLE,<br />
discriminatorType=STRING,<br />
discriminatorValue="CUSTOMER")<br />
@DiscriminatorColumn(name="DISC", length=20)<br />
public class Customer { ... }</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/zuofei-bie/aggbug/316474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuofei-bie/" target="_blank">别昨非</a> 2010-03-24 21:07 <a href="http://www.blogjava.net/zuofei-bie/archive/2010/03/24/316474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>List and  ArrayList and LinkList 区别与用法</title><link>http://www.blogjava.net/zuofei-bie/archive/2010/03/22/316159.html</link><dc:creator>别昨非</dc:creator><author>别昨非</author><pubDate>Mon, 22 Mar 2010 06:46:00 GMT</pubDate><guid>http://www.blogjava.net/zuofei-bie/archive/2010/03/22/316159.html</guid><wfw:comment>http://www.blogjava.net/zuofei-bie/comments/316159.html</wfw:comment><comments>http://www.blogjava.net/zuofei-bie/archive/2010/03/22/316159.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuofei-bie/comments/commentRss/316159.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuofei-bie/services/trackbacks/316159.html</trackback:ping><description><![CDATA[List and&nbsp; ArrayList: <br />
1、List是一个接口，ArrayList是一个实现了List接口的具体类。 他们是父子关系，我们常用的是ArrayList,但常用List的引用去操作ArrayList 这是一个简单的面向接口编程的一种，如：List myList = new ArrayList(); <br />
2、他们主要是用来保存对象的集合，记得是保存对象的哦，你可别传个int进去啊 <br />
3、要取出它里面保存的对象可以用下标，如：Object aaa = myList.get(0); 这样我们就把保存在myList里的第一个对象取出来给了 aaa 啦。<br />
<br />
&nbsp;ArrayList:<br />
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">ArrayList其实是包装了一个<font color="#800000"><span style="background-color: rgb(255,255,255)">数组</font></span>Object[]，当实例化一个ArrayList时，一个数组也被实例化，当向ArrayList中添加对象是，数组的大小也相应的改变。这样就带来以下有特点：</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><strong>快速随即访问</strong> 你可以随即访问每个元素而不用考虑性能问题，通过调用get(i)方法来访问下标为i的数组元素。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><strong>向其中添加对象速度慢</strong> 当你创建数组是并不能确定其容量，所以当改变这个数组时就必须在内存中做很多事情。</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><strong>操作其中对象的速度慢</strong> 当你要想数组中任意两个元素中间添加对象时，数组需要移动所有后面的对象。 <br />
<br />
LinkList:<br />
</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal">LinkedList是通过<font color="#ff0000">节点直接彼此连接</font>来实现的。每一个节点都包含前一个节点的引用，后一个节点的引用和节点存储的值。当一个新节点插入时，只需要修改其中保持先后关系的节点的引用即可，当删除记录时也一样。这样就带来以下有特点：</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><strong>操作其中对象的速度快 </strong>只需要改变连接，新的节点可以在内存中的任何地方</p>
<p style="margin: 0cm 0cm 0pt" class="MsoNormal"><strong>不能随即访问</strong> 虽然存在get()方法，但是这个方法是通过遍历接点来定位的所以速度慢。<br />
<br />
<strong><span>一些结论：</span></strong><br />
<span>当一些被定义好的数据需要放到与数组对应的</span><span lang="EN-US">List</span><span>中，</span><span lang="EN-US"><span class="hilite1">ArrayList</span></span><span>是很好的选择，因为它可以动态变化，但是不要在整个应用程序中频繁的使用。<br />
你要很方便的操作其中的数据而不用随即访问时;<span lang="EN-US">LinkList</span><span>是很好的选择。如果你要频繁随机访问建议使用ArrayList。</span></span></p>
<br />
<img src ="http://www.blogjava.net/zuofei-bie/aggbug/316159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuofei-bie/" target="_blank">别昨非</a> 2010-03-22 14:46 <a href="http://www.blogjava.net/zuofei-bie/archive/2010/03/22/316159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lang compare</title><link>http://www.blogjava.net/zuofei-bie/archive/2010/03/22/316153.html</link><dc:creator>别昨非</dc:creator><author>别昨非</author><pubDate>Mon, 22 Mar 2010 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/zuofei-bie/archive/2010/03/22/316153.html</guid><wfw:comment>http://www.blogjava.net/zuofei-bie/comments/316153.html</wfw:comment><comments>http://www.blogjava.net/zuofei-bie/archive/2010/03/22/316153.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zuofei-bie/comments/commentRss/316153.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zuofei-bie/services/trackbacks/316153.html</trackback:ping><description><![CDATA[PHP 就是： Quick and Dirty
Java 就是： Beauty and Slowly
Ruby 就是： Quick and Beauty 
python 就是： Quick and Simple
如果PHP要实现跨请求的持有内存资源，这意味着PHP必须实现对象内存分配机制和垃圾收集器，而这将意味着PHP语言的复杂性上升，PHP内存泄露的危险大大增加，最终将得不偿失。 

其实我们应该跳出编程语言的简单对比，而比较一下不同的编程模型背后的哲学： 

1、Java － controll whole world模型 单进程运行，进程内部多线程调度，所有的资源都自己提供。 

2、Ruby － controll process模型 多进程运行，进程内部可以持有资源，带有GC，部分依赖外部资源实现（例如Cache）功能 

3、PHP － controll request模型 多进程运行，进程不持有任何资源，不带GC，完全依赖外部资源实现扩展功能 

比较和探讨一下3种不同的模型，以及他们的优势，劣势，长处，短处，适合做什么，不适合做什么。这才是一个有意思的话题。 <img src ="http://www.blogjava.net/zuofei-bie/aggbug/316153.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zuofei-bie/" target="_blank">别昨非</a> 2010-03-22 13:56 <a href="http://www.blogjava.net/zuofei-bie/archive/2010/03/22/316153.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>