﻿<?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-happyfish-随笔分类-The Persistence Layer</title><link>http://www.blogjava.net/happyfish/category/556.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 08:49:09 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 08:49:09 GMT</pubDate><ttl>60</ttl><item><title>jdbc连接各种数据库  (fr www.cybercorlin.net)</title><link>http://www.blogjava.net/happyfish/archive/2005/04/29/3931.html</link><dc:creator>小鱼儿</dc:creator><author>小鱼儿</author><pubDate>Fri, 29 Apr 2005 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/happyfish/archive/2005/04/29/3931.html</guid><wfw:comment>http://www.blogjava.net/happyfish/comments/3931.html</wfw:comment><comments>http://www.blogjava.net/happyfish/archive/2005/04/29/3931.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyfish/comments/commentRss/3931.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyfish/services/trackbacks/3931.html</trackback:ping><description><![CDATA[/* MySQL With MM JDBC */<BR>driver = "org.gjt.mm.mysql.Driver";<BR>url = "jdbc:mysql://localhost/junit_test";<BR>/*Sybase jconnect2.jar */<BR>url = "jdbc:sybase:Tds:host:port";<BR>driver = "com.sybase.jdbc2.SybDriver";<BR>/*Oracle JDBC Thin Driver classes12.zip */<BR>url = "jdbc:oracle:thin:@host:port:sid";<BR>driver = "oracle.jdbc.driver.OracleDriver";<BR>/*Oracle OCI Driver classes12.zip*/<BR>url = "jdbc:oracle:thin:@host:port:sid";<BR>driver = "oracle.jdbc.driver.OracleDriver";<BR>/* OpenBase OpenBaseJDBC.jar (download from <A href="http://www.openbase.com/">www.openbase.com</A>) */<BR>url = "jdbc:openbase://host/database";<BR>driver = "com.openbase.jdbc.ObDriver";<BR>/* MySQL Connector/J from MySql (<A href="http://www.mysql.com/">www.mysql.com</A>)<BR>jdbc classes: mysql-connector-java-2.0.14-bin.jar (download from <A href="http://www.mysql.com/">www.mysql.com</A>) */<BR>url = "jdbc:mysql://host/database";<BR>driver = "com.mysql.jdbc.Driver";<BR>/*JDBC Drivers from Microsoft MSSQL 2000<BR>jdbc classes: msbase.jar, sqlserver.jar, msutil.jar */<BR>url = "jdbc:microsoft:sqlserver://host:port";<BR>driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";<BR>/*JSQLConnect from JDBC Drivers from Microsoft MSSQL 2000<BR>jdbc classes: msbase.jar, sqlserver.jar, msutil.jar */<BR>url = "jdbc:microsoft:sqlserver://host:port";<BR>driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";<BR>/*DB2 Universal JDBC Driver from IBM<BR>jdbc classes: db2java.zip */<BR>url = "jdbc:db2:host";<BR>driver = "COM.ibm.db2.jdbc.app.DB2Driver"; <BR><BR><BR>可以用开源项目实现轻量级连接池<BR>import com.devdaily.opensource.database.DDConnectionBroker;<BR>String driver = null;<BR>String url = null;<BR>String username = null;<BR>String password = null;<BR>int minConnections = 0;<BR>int maxConnections = 0;<BR>long timeout = 0;<BR>long leaseTime = 0;<BR>String logFile = null;<BR>DDConnectionBroker broker = null;<BR><BR>void setUp() {<BR>/* MySQL With MM JDBC */<BR>driver = "org.gjt.mm.mysql.Driver";<BR>url = "jdbc:mysql://localhost/junit_test";<BR>/*Sybase jconnect2.jar */<BR>url = "jdbc:sybase:Tds:host:port";<BR>driver = "com.sybase.jdbc2.SybDriver";<BR>/*Oracle OCI Driver classes12.zip*/<BR>url = "jdbc:oracle:thin:@host:port:sid";<BR>driver = "oracle.jdbc.driver.OracleDriver";<BR>/* OpenBase OpenBaseJDBC.jar (download from <A href="http://www.openbase.com/">www.openbase.com</A>) */<BR>url = "jdbc:openbase://host/database";<BR>driver = "com.openbase.jdbc.ObDriver";<BR>/* MySQL Connector/J from MySql (<A href="http://www.mysql.com/">www.mysql.com</A>)<BR>jdbc classes: mysql-connector-java-2.0.14-bin.jar (download from <A href="http://www.mysql.com/">www.mysql.com</A>) */<BR>url = "jdbc:mysql://host/database";<BR>driver = "com.mysql.jdbc.Driver";<BR>/*JDBC Drivers from Microsoft MSSQL 2000<BR>jdbc classes: msbase.jar, sqlserver.jar, msutil.jar */<BR>url = "jdbc:microsoft:sqlserver://host:port";<BR>driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";<BR>/*JSQLConnect from JDBC Drivers from Microsoft MSSQL 2000<BR>jdbc classes: msbase.jar, sqlserver.jar, msutil.jar */<BR>url = "jdbc:microsoft:sqlserver://host:port";<BR>driver = "com.microsoft.jdbc.sqlserver.SQLServerDriver";<BR>/*DB2 Universal JDBC Driver from IBM<BR>jdbc classes: db2java.zip */<BR>url = "jdbc:db2:host";<BR>driver = "COM.ibm.db2.jdbc.app.DB2Driver";<BR>/*Oracle JDBC Thin Driver classes12.zip */<BR>url = "jdbc:oracle:thin:@host:port:sid";<BR>driver = "oracle.jdbc.driver.OracleDriver";<BR><BR>username = "";<BR>password = "";<BR>minConnections = 1;<BR>maxConnections = 1;<BR>timeout = 100;<BR>leaseTime = 60000;<BR>logFile = "queryconn.log";<BR>broker = null;<BR>}<BR><BR>try {<BR>// construct the broker<BR>broker = new DDConnectionBroker(driver,<BR>url,<BR>username,<BR>password,<BR>minConnections,<BR>maxConnections,<BR>timeout,<BR>leaseTime,<BR>logFile);<BR>}<BR>catch (SQLException se) {<BR>// could not get a broker; not much reason to go on<BR>System.err.println(se.getMessage());<BR>System.err.println("Could not construct a broker, quitting.");<BR>System.exit( -1);<BR>}<BR><BR>db2有4种jdbc连接方式,我用的是type4(只支持8以上的版本),也是直接通过jdbc连接,其他的客户端好象还要安装客户端工具，<BR>type4的JDBC驱动:com.ibm.db2.jcc.DB2Driver<BR>url的格式:jdbc:db2://{host}:50000/{database name}<BR>包名:db2jcc.jar<BR>还有连接程序一定要用ibm的jdk来运行，要不然出错!<BR><img src ="http://www.blogjava.net/happyfish/aggbug/3931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyfish/" target="_blank">小鱼儿</a> 2005-04-29 11:14 <a href="http://www.blogjava.net/happyfish/archive/2005/04/29/3931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC+Hibernate将Blob数据写入Oracle </title><link>http://www.blogjava.net/happyfish/archive/2005/03/02/1625.html</link><dc:creator>小鱼儿</dc:creator><author>小鱼儿</author><pubDate>Wed, 02 Mar 2005 15:04:00 GMT</pubDate><guid>http://www.blogjava.net/happyfish/archive/2005/03/02/1625.html</guid><wfw:comment>http://www.blogjava.net/happyfish/comments/1625.html</wfw:comment><comments>http://www.blogjava.net/happyfish/archive/2005/03/02/1625.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyfish/comments/commentRss/1625.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyfish/services/trackbacks/1625.html</trackback:ping><description><![CDATA[Oracle的Blob字段比较特殊，他比long字段的性能要好很多，可以用来保存例如图片之类的二进制数据。 <BR><BR>　　写入Blob字段和写入其它类型字段的方式非常不同，因为Blob自身有一个cursor，你必须使用cursor对blob进行操作，因而你在写入Blob之前，必须获得cursor才能进行写入，那么如何获得Blob的cursor呢？<BR><BR>　　这需要你先插入一个empty的blob，这将创建一个blob的cursor，然后你再把这个empty的blob的cursor用select查询出来，这样通过两步操作，你就获得了blob的cursor，可以真正的写入blob数据了。<BR><BR>　　看下面的JDBC的demo，把oraclejdbc.jar这个二进制文件写入数据库表javatest的content字段(这是一个blob型字段)<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>import java.sql.*;<BR>import java.io.*;<BR>import oracle.sql.*;<BR>public class WriteBlob {<BR><BR>public static void main(String[] args) {<BR><BR>　try {<BR>　　DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());<BR>　　Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","fankai","fankai");<BR>　　conn.setAutoCommit(false);<BR><BR>　　BLOB blob = null;<BR><BR>　　PreparedStatement pstmt = conn.prepareStatement("insert into javatest(name,content) values(?,empty_blob())");<BR>　　pstmt.setString(1,"fankai");<BR>　　pstmt.executeUpdate();<BR>　　pstmt.close();<BR><BR>　　pstmt = conn.prepareStatement("select content from javatest where name= ? for update");<BR>　　pstmt.setString(1,"fankai");<BR>　　ResultSet rset = pstmt.executeQuery();<BR>　　if (rset.next()) blob = (BLOB) rset.getBlob(1);<BR><BR>　　String fileName = "oraclejdbc.jar";<BR>　　File f = new File(fileName);<BR>　　FileInputStream fin = new FileInputStream(f);<BR>　　System.out.println("file size = " + fin.available());<BR><BR>　　pstmt = conn.prepareStatement("update javatest set content=? where name=?");<BR><BR>　　OutputStream out = blob.getBinaryOutputStream();<BR><BR>　　int count = -1, total = 0;<BR>　　byte[] data = new byte[(int)fin.available()];<BR>　　fin.read(data);<BR>　　out.write(data);<BR>　　/*<BR>　　byte[] data = new byte[blob.getBufferSize()]; 另一种实现方法,节省内存<BR>　　while ((count = fin.read(data)) != -1) {<BR>　　　total += count;<BR>　　　out.write(data, 0, count);<BR>　　}<BR>　　*/<BR><BR>　　fin.close();<BR>　　out.close();<BR><BR>　　pstmt.setBlob(1,blob);<BR>　　pstmt.setString(2,"fankai");<BR><BR>　　pstmt.executeUpdate();<BR>　　pstmt.close();<BR><BR>　　conn.commit();<BR>　　conn.close();<BR>　} catch (SQLException e) {<BR>　 　System.err.println(e.getMessage());<BR>　　e.printStackTrace();<BR>　} catch (IOException e) {<BR>　　System.err.println(e.getMessage());<BR>　}<BR>}<BR><BR>}</TD></TR></TBODY></TABLE><BR>　　仔细看上例，分三步：<BR><BR>　　1、插入空blob<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>into javatest(name,content) values(?,empty_blob());</TD></TR></TBODY></TABLE><BR>　　2、获得blob的cursor<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>select content from javatest where name= ? for update;</TD></TR></TBODY></TABLE><BR>　　注意！！！必须加for update，这将锁定该行，直至该行被修改完毕，保证不产生并发冲突。<BR><BR>　　3、update javatest set content=? where name=<BR><BR>　　用cursor往数据库写数据<BR><BR>　　这里面还有一点要提醒大家：<BR><BR>　　JDK1.3带的JDBC2.0规范是不完善的，只有读Blob的接口，而没有写Blob的接口，JDK1.4带的JDBC3.0加入了写Blob的接口。你可以使用JDBC3.0的接口，也可以直接使用Oracle的JDBC的API，我在上例中使用了Oracle的JDBC的API。<BR><BR>　　另外要注意的是：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>java.sql.Blob<BR><BR>oracle.sql.BLOB</TD></TR></TBODY></TABLE><BR>　　注意看blob的大小写，是不一样的。写程序的时候不要搞混了。<BR><BR>　　下面看看用Hibernate怎么写，原理是一样的，也要分三步，但是代码简单很多<BR><BR>　　这是Cat对象定义<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>package com.fankai;<BR><BR>import java.sql.Blob;<BR><BR>public class Cat {<BR>　private String id;<BR>　private String name;<BR>　private char sex;<BR>　private float weight;<BR>　private Blob image;<BR>　public Cat() { }<BR><BR>　public String getId() { return id; }<BR>　public void setId(String id) { this.id = id; }<BR><BR>　public String getName() { return name; }<BR>　public void setName(String name) { this.name = name; }<BR><BR>　public char getSex() { return sex; }<BR>　public void setSex(char sex) { this.sex = sex; }<BR><BR>　public float getWeight() { return weight; }<BR>　public void setWeight(float weight) { this.weight = weight; }<BR><BR>　public Blob getImage() { return image; }<BR>　public void setImage(Blob image) { this.image = image;}<BR>}<BR></TD></TR></TBODY></TABLE><BR>　　这是Cat.hbm.xml<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>＜?xml version="1.0"?＞<BR>＜!DOCTYPE hibernate-mapping SYSTEM "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"＞<BR><BR>＜hibernate-mapping＞<BR>＜class name="com.fankai.Cat" table="cat"＞<BR>＜!--jcs-cache usage="read-only"/--＞<BR>＜id name="id" unsaved-value="null"＞<BR>＜generator class="uuid.hex"/＞<BR>＜/id＞<BR>＜property name="name" length="16" not-null="true"/＞<BR>＜property name="sex" length="1" not-null="true"/＞<BR>＜property name="weight" /＞<BR>＜property name="image" /＞<BR>＜/class＞<BR>＜/hibernate-mapping＞</TD></TR></TBODY></TABLE><BR>　　下面是完整的用Hibernate写入Blob的例子，相比JDBC，已经简单轻松多了，也不用写那些Oracle特殊的sql了：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#e6e4dd border=1>
<TBODY>
<TR>
<TD>package com.fankai;<BR><BR>import java.sql.Blob;<BR>import net.sf.hibernate.*;<BR>import oracle.sql.*;<BR>import java.io.*;<BR><BR>public class TestCatHibernate { <BR>　public static void testBlob() {<BR>　　Session s = null; <BR>　　byte[] buffer = new byte[1];<BR>　　buffer[0] = 1;<BR>　　try {<BR>　　　SessionFactory sf = HibernateSessionFactory.getSessionFactory();<BR>　　　s = sf.openSession(); <BR>　　　Transaction tx = s.beginTransaction();<BR>　　　Cat c = new Cat();<BR>　　　c.setName("Robbin");<BR>　　　c.setImage(Hibernate.createBlob(buffer));<BR>　　　s.save(c);<BR>　　　s.flush();<BR>　　　s.refresh(c, LockMode.UPGRADE); <BR>　　　BLOB blob = (BLOB) c.getImage(); <BR>　　　OutputStream out = blob.getBinaryOutputStream(); <BR>　　　String fileName = "oraclejdbc.jar";<BR>　　　File f = new File(fileName);<BR>　　　FileInputStream fin = new FileInputStream(f); <BR>　　　int count = -1, total = 0;<BR>　　　byte[] data = new byte[(int)fin.available()];<BR>　　　fin.read(data);<BR>　　　out.write(data); <BR>　　　fin.close();<BR>　　　out.close();<BR>　　　s.flush();<BR>　　　tx.commit();<BR><BR>　　} catch (Exception e) {<BR>　　　System.out.println(e.getMessage());<BR>　　} finally {<BR>　　　if (s != null)<BR>　　　try {<BR>　　　　s.close();<BR>　　　} catch (Exception e) {}<BR>　　} <BR>　}<BR>}</TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/happyfish/aggbug/1625.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyfish/" target="_blank">小鱼儿</a> 2005-03-02 23:04 <a href="http://www.blogjava.net/happyfish/archive/2005/03/02/1625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让Struts与Hibernate顺利协同工作 </title><link>http://www.blogjava.net/happyfish/archive/2005/03/02/1624.html</link><dc:creator>小鱼儿</dc:creator><author>小鱼儿</author><pubDate>Wed, 02 Mar 2005 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/happyfish/archive/2005/03/02/1624.html</guid><wfw:comment>http://www.blogjava.net/happyfish/comments/1624.html</wfw:comment><comments>http://www.blogjava.net/happyfish/archive/2005/03/02/1624.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/happyfish/comments/commentRss/1624.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/happyfish/services/trackbacks/1624.html</trackback:ping><description><![CDATA[摘自<A href="http://www.99college.com/">久久学院</A><BR>　<B><FONT color=#990000>安装篇</FONT></B><BR><BR>　　一，下载安装 j2sdk1.4（www.sun.com)）或以上,设置 CLASSPATH，java_home。 <BR><BR>　　二，下载服务器，免费版本的有 tomcat,resin,当然也还有 weblogic之类的巨无霸，不过得看你电脑的配置是否承受的了!<BR><BR>　　这里只以resin来说明，其他的配置都差不多，可以查看各个服务器自带的说明文件。<BR><BR>　　resin 服务器可以在 caucho.com下载，选择合适的版本，下载解压缩就可以直接使用。<BR><BR>　　这里resin有一个 resin-ee版本，这个主要是带ejb功能支持的。 如果用不到ejb，一般的就足够了。 <BR>　　三，然后就是数据库，有很多数据库产品可以选择，DB2,Oracle,MSSQL,MySQL等等太多了。这里我选择MySQL，不仅因为它是免费的，而且它的4.0版本在继承以前版本的快速稳定的基础上，整合了InnoDB(http://www.innodb.com)先进的事务处理机制。相信伴随着Linux的壮大，它将在商业数据库市场占的一席之地。不过就数据库本身，它还缺少子查询等强大功能的支持。<BR>安装就不多说了，配置好用户名，密码。 然后就可以下载 MySQL-Front 来可视化操作数据库。 <BR><BR>　　四，在Java编程上，一个IDE的功能显然不可缺少，现在流行的IDE很多，有JBuilder,Eclipse,IntellJ IDEA,JCreator等等，其中 eclipse借着开源东风，依靠强大的插件功能被誉为最有前途的工具，JBuilder从来都最强大功能的java工具，不过大到我的电脑实在运行不了，穷啊，可没钱配新电脑。所以我还是喜欢JCreator，小巧而又功能不俗，应付小规模的应用绰绰有余。编译开发时要想获得提示支持，需要在 configure--option--JDK Profiles 导入jar文件。<BR><BR>　　五，一个站点前台的界面开发，当然离不开大名鼎鼎的 Dreamweaver 了，它支持jsp，asp等很多语言的开发。特别是最近的Dreamweaver MX 2004 增强了站点的功能，可以方便的对一个站点进行控制。面对struts的前台自定义标签，有一个mxp插件可以用来支持显示sturts的标签。使用前还要在编辑--标签库 里面导入.tld文件，目前只支持html，和bean 两个标签。<BR><BR>　　<B><FONT color=#990000>配置篇</FONT></B><BR><BR>　　一，resin虚拟站点配置 <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>＜host id='yourweb:8080' app-dir='e:\blog\' class-update-interval='2'＞<BR>＜web-app id='/'＞<BR>＜directory-servlet id='false'/＞ <BR>＜/web-app＞<BR>＜error-log id='log/web-error.log'/＞ <BR>＜host＞</TD></TR></TBODY></TABLE><BR>　　然后在定义的目录下面建立站点。 <BR><BR>　　二，Dreamweaver站点的配置就不多说了。<BR><BR>　　三，Struts的配置<BR><BR>　　这里我们使用的是struts1.1,下载并解压缩到临时文件夹，就假设是tem文件夹吧。<BR><BR>　　首先拷贝tem/lib/下面所有的.tld文件到站点的/WEB-INF/目录下，再拷贝所有的.jar文件到/WEB-INF/lib/目录下，最后web.xml文件中的配置差不多如下： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>＜?xml version="1.0" encoding="ISO-8859-1"?＞ <BR>＜!DOCTYPE web-app<BR>PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"<BR>"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd"＞<BR><BR>＜web-app＞<BR><BR>＜servlet＞<BR>＜servlet-name＞action＜/servlet-name＞<BR>＜servlet-class＞org.apache.struts.action.ActionServlet＜/servlet-class＞<BR>＜init-param＞<BR>＜param-name＞config＜/param-name＞<BR>＜param-value＞/WEB-INF/struts-config.xml＜/param-value＞<BR>＜/init-param＞<BR>＜init-param＞<BR>＜param-name＞debug＜/param-name＞<BR>＜param-value＞2＜/param-value＞<BR>＜/init-param＞<BR>＜init-param＞<BR>＜param-name＞detail＜/param-name＞<BR>＜param-value＞2＜/param-value＞<BR>＜/init-param＞<BR>＜load-on-startup＞2＜/load-on-startup＞<BR>＜/servlet＞<BR><BR>＜servlet-mapping＞<BR>＜servlet-name＞action＜/servlet-name＞<BR>＜url-pattern＞*.do＜/url-pattern＞<BR>＜/servlet-mapping＞<BR><BR><BR>＜!-- The Usual Welcome File List --＞<BR>＜welcome-file-list＞<BR>＜welcome-file＞index.jsp＜/welcome-file＞<BR>＜/welcome-file-list＞<BR><BR><BR>＜!-- Struts Tag Library Descriptors --＞<BR>＜taglib＞<BR>＜taglib-uri＞/tags/struts-bean＜/taglib-uri＞<BR>＜taglib-location＞/WEB-INF/struts-bean.tld＜/taglib-location＞<BR>＜/taglib＞<BR><BR>＜taglib＞<BR>＜taglib-uri＞/tags/struts-html＜/taglib-uri＞<BR>＜taglib-location＞/WEB-INF/struts-html.tld＜/taglib-location＞<BR>＜/taglib＞<BR><BR>＜taglib＞<BR>＜taglib-uri＞/tags/struts-logic＜/taglib-uri＞<BR>＜taglib-location＞/WEB-INF/struts-logic.tld＜/taglib-location＞<BR>＜/taglib＞<BR><BR>＜taglib＞<BR>＜taglib-uri＞/tags/struts-nested＜/taglib-uri＞<BR>＜taglib-location＞/WEB-INF/struts-nested.tld＜/taglib-location＞<BR>＜/taglib＞<BR><BR>＜taglib＞<BR>＜taglib-uri＞/tags/struts-tiles＜/taglib-uri＞<BR>＜taglib-location＞/WEB-INF/struts-tiles.tld＜/taglib-location＞<BR>＜/taglib＞<BR><BR>＜/web-app＞</TD></TR></TBODY></TABLE><BR>　　四，Hibernate配置<BR><BR>　　下载并拷贝/lib目录下的<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>hibernate2.jar <BR>commons-beanutils.jar <BR>commons-collections.jar <BR>commons-dbcp.jar <BR>commons-lang.jar <BR>commons-logging.jar <BR>commons-pool.jar <BR>dom4j.jar <BR>cglib-asm.jar <BR>connector.jar </TD></TR></TBODY></TABLE><BR>　　到应用站点的/lib目录下。接下来配置 hibernate.cfg.xml文件 <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>＜?xml version='1.0' encoding='utf-8'?＞<BR>＜!DOCTYPE hibernate-configuration<BR>PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"<BR>"http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"＞ <BR>＜hibernate-configuration＞<BR>＜session-factory＞<BR><BR>＜property name="hibernate.connection.url"＞<BR>jdbc:mysql://localhost:3306/yourdatabase<BR>＜/property＞<BR>＜property name="hibernate.connection.driver_class"＞<BR>org.gjt.mm.mysql.Driver<BR>＜/property＞<BR>＜property name="hibernate.connection.username"＞<BR>yourname<BR>＜/property＞<BR>＜property name="hibernate.connection.password"＞<BR>youyrpassword<BR>＜/property＞<BR><BR>＜!?- 是否将运行期生成的SQL输出到日志以供调试--＞<BR>＜property name="show_sql"＞false＜/property＞<BR><BR>＜!--dialect ，每个数据库都有其对应的Dialet以匹配其平台特性--＞<BR>＜propertyname="dialect"＞net.sf.hibernate.dialect.MySQLDialect＜/property＞<BR>＜!?- 事务管理类型，这里我们使用JDBC Transaction --＞<BR>＜property name="transaction.factory_class"＞<BR>net.sf.hibernate.transaction.JDBCTransactionFactory＜/property＞<BR><BR>＜property name="jdbc.batch_size"＞10＜/property＞<BR>＜property name="jdbc.use_scrollable_resultset"＞true＜/property＞<BR><BR>＜!?映射文件配置，注意配置文件名必须包含其相对于根的全路径--＞<BR>＜mapping resource="net/seerlog/hbm/Cat.hbm.xml"/＞<BR><BR>＜/session-factory＞<BR><BR>＜/hibernate-configuration＞</TD></TR></TBODY></TABLE><BR>　　以上配置了数据库连接所用的地址和用户名，密码等。具体参数的含义请参考官方文档。<BR><BR>　　映射文件的内容可以手工来写，也可通过一些工具来自动生成。 <BR><BR>　　整个需要两种文件： .hbm.xml配置文件 和 .java持久化对象 , 两者是相互关联的，.hbm.xml 对数据库的映射还需要 .java这个bean来操作。所以整个过程需要首先设计好数据库，然后根据数据库导出 .hbm.xml文件 ,然后再导出 .java 文件。 有很多工具可以实现这个工程，我们这里采用 Middlegen-Hibernate来实现 数据库到.hbm.xml文件的转化，用Hibernate-Extension工具包中的 hbm2java 来实现 .hbm.xml 到 .java 文件的转化！<BR><BR>&nbsp; <IMG height=455 src="http://www.yesky.com/image20010518/237769.gif" width=599 useMap=#Map2 border=0> <MAP name=Map2><AREA shape=RECT target=_blank coords=281,253,534,270 href="http://dev.yesky.com/SoftChannel/72342371961929728/index.shtml"></MAP><MAP name=Map><AREA shape=RECT target=_blank coords=281,253,532,267 href="http://dev.yesky.com/SoftChannel/72342371961929728/index.shtml"></MAP><BR><BR>　　查找关键字”<FONT color=#ff0000>!ENTITY</FONT>”，得到：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>＜!DOCTYPE project [<BR>＜!ENTITY database SYSTEM<BR>"file:./config/database/<FONT color=#ff0000>hsqldb.xml</FONT>"＞<BR>]＞</TD></TR></TBODY></TABLE><BR>　　b) Application name<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>＜property name="name" value="<FONT color=#ff0000>airline</FONT>"/＞ </TD></TR></TBODY></TABLE><BR>　　c) 输出目录<BR><BR>　　查找关键字“name="build.gen-src.dir"”，得到：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>＜property name="build.gen-src.dir" value="<FONT color=#ff0000>${build.dir}/gen-src</FONT>"/＞ </TD></TR></TBODY></TABLE><BR>　　d) 对应代码的Package name<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>＜hibernate<BR>destination="${build.gen-src.dir}"<BR>package="<FONT color=#ff0000>${name}.hibernate</FONT>"<BR>genXDocletTags="false"<BR>genIntergratedCompositeKeys="false"<BR>javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"<BR>/＞ </TD></TR></TBODY></TABLE><BR>　　配置完成后，在MiddleGen 根目录下运行ant，就将出现MiddleGen的界面：<BR><BR>　　选择需要的表，单击窗口顶部的Generate 按钮，MiddleGen 即为我们生成这些数据库表所对应的Hibernate映射文件。 <BR><BR>　　接下来的工作通过Hibernate Extension 来完成，Hibernate Extension 的tools\bin目录下包含三个工具：<BR><BR>　　1． hbm2java.bat<BR><BR>　　根据映射文件生成对应的POJO。通过MiddleGen 我们已经得到了映射文件，下一步就是通过hbm2java.bat工具生成对应的POJO。<BR><BR>　　2． class2hbm.bat<BR><BR>　　根据POJO class 生成映射文件，这个工具很少用到，这里也就不再详细介绍。<BR><BR>　　3． ddl2hbm.bat<BR><BR>　　由数据库导出库表结构，并生成映射文件以及POJO。这个功能与MiddleGen的功能重叠，但由于目前还不够成熟（实际上已经被废弃，不再维护），提供的功能也有限，所以我们还是采用MiddleGen生成映射文件，之后由hbm2java根据映射文件生成POJO 的方式。 <BR><BR>　　这里我们使用第一个hbm2java.bat，利用刚才生成的.hbm.xml文件自动生成 java 文件。 <BR><BR>　　为了使用这个工具，首先我们需要配置一些参数，打开tools\bin\setenv.bat 文件，修改其中的JDBC_DRIVER和HIBERNATE_HOME环境变量，使其指向我们的实际JDBC Driver文件和Hibernate所在目录。同时检查一下环境变量CP中的各个项目中是否实际存在，特别是%CORELIB%下的jar文件，某些版本的发行包中，默认配置中的文件名与实际的文件名有所出入（如%CORELIB%\commons-logging.jar, 在Hibernate 发行包中，可能实际的文件名是commons-logging-1.0.3.jar，诸如此类）。 <BR><BR>　　使用hbm2java，根据MiddleGen生成的映射文件生成Java 代码：<BR><BR>　　打开Command Window，在tools\bin目录下执行：<BR><BR>hbm2java c:\sample\org\hibernate\sample\*.xml --output=c:\sample\ <BR><BR>　　通过以上步骤我们就生成了所需要的所有基本配置文件。接下来就可以来初始化这些配置啦。 <BR>
<TABLE cellSpacing=0 cellPadding=0 width=776 border=0>
<TBODY>
<TR>
<TD vAlign=top bgColor=#f0f2fb height=10></TD></TR>
<TR>
<TD vAlign=top bgColor=#f0f2fb>
<TABLE cellSpacing=0 cellPadding=0 width=590 align=center border=0>
<TBODY>
<TR>
<TD><SPAN class=f14>　　<FONT color=#990000><B>实战篇</B></FONT><BR><BR>　　在这一节我们要配置一个完整的应用配置。其实每一个单独拿出来都能写本书，不过我只是侧重对自己总结，在以后我会不断地把学习的经验教训写下来。<BR><BR>　　一，Log4j 的初始化 <BR><BR>　　配置log4j.properties <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>### direct log messages to stdout ###<BR>#log4j.appender.stdout=org.apache.log4j.ConsoleAppender<BR>#log4j.appender.stdout.Target=System.out<BR>#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<BR>%c{1}:%L - %m%n<BR>#log4j.appender.stdout.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n <BR>log4j.logger.seerlog=DEBUG,A2<BR>log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender<BR>log4j.appender.A2.file=d:\\log\\applog.txt<BR>log4j.appender.A2.DatePattern='.'yyyy-MM-dd<BR>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A2.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %m%n<BR><BR>#log4j.logger.ALL=DEBUG,A1<BR>log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender<BR>log4j.appender.A1.file=d:\\log\\all.log<BR>log4j.appender.A1.DatePattern='.'yyyy-MM-dd<BR>log4j.appender.A1.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A1.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n<BR><BR>### direct messages to file hibernate.log ###<BR>#log4j.appender.file=org.apache.log4j.FileAppender<BR>#log4j.appender.file.File=hibernate.log<BR>#log4j.appender.file.layout=org.apache.log4j.PatternLayout<BR>#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n<BR><BR>### set log levels - for more verbose logging change 'info' to 'debug' ###<BR><BR>###log4j.rootLogger=warn, stdout<BR>log4j.rootLogger=info, A1<BR><BR>#以下是hibernate API需要的配置<BR><BR>log4j.logger.net.sf.hibernate=info<BR><BR>### log just the SQL<BR>#log4j.logger.net.sf.hibernate.SQL=debug<BR><BR>### log JDBC bind parameters ###<BR>log4j.logger.net.sf.hibernate.type=info<BR><BR>### log schema export/update ###<BR>log4j.logger.net.sf.hibernate.tool.hbm2ddl=debug<BR><BR>### log cache activity ###<BR>#log4j.logger.net.sf.hibernate.cache=debug<BR><BR>### enable the following line if you want to track down connection ###<BR>### leakages when using DriverManagerConnectionProvider ###<BR>#log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider=trac</TD></TR></TBODY></TABLE><BR>　　配置后如下来调用,首先需要初始化配置文件，这个过程只需要一次，所以我们可以在ServletContextListener中来进行。<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>String prefix = context.getRealPath("/");<BR>PropertyConfigurator.configure(prefix+"/WEB-INF/classes/log4j.properties"); </TD></TR></TBODY></TABLE><BR>　　这里需要你的配置文件的路径来初始化。<BR><BR>　　初始化完成后，我们在以后的action中就可以 象下面一样来调用：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>static Logger log=Logger.getLogger("seerlog");<BR>log.warn("it's log4j warn");<BR>log.info("it's log4j info"); </TD></TR></TBODY></TABLE><BR>　　关于 log4j 的完全使用方法，偶会在以后做详细的说明！ <BR><BR>　　二，hibernate 的初始化 <BR><BR>　　首先我们要把hibernate.cfg.xml 放到应用的 classes 目录中，然后可以使用hibernate参考文档提供的例子来封装对后台的使用。<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>public class Hi{<BR><BR>private static final SessionFactory sessionFactory;<BR>private static Connection conn;<BR>static {<BR>　try {<BR>　　sessionFactory = new Configuration().configure().buildSessionFactory();<BR>　} catch (HibernateException ex) {<BR>　　throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage(), ex);<BR>　}<BR>}<BR><BR>public static final ThreadLocal session = new ThreadLocal();<BR>public static Session getSession() throws HibernateException {<BR>　Session s = (Session) session.get();<BR>　// 假如没有一个可用的线程，开启一个新 Session,<BR>　if (s == null) {<BR>　　conn=DBConnectionManager.getConnection();<BR>　　s = sessionFactory.openSession(conn);<BR>　　session.set(s);<BR>　}<BR>　return s;<BR>}<BR><BR>public static void closeSession() throws HibernateException {<BR>　Session s = (Session) session.get();<BR>　session.set(null);<BR>　if (s != null)<BR>　　s.close();<BR>　if(conn!=null)<BR>　　DBConnectionManager.returnConnection(conn);<BR>　}<BR>}</TD></TR></TBODY></TABLE><BR>　　文中DBConnectionManager.getConnection()是一个DAO类，提供连接池的实现。 <BR><BR>　　我们使用这个con连接来创建一个 session ，sission是一个数据库连接操作的会话周期，它提供了强大的管理数据的能力。 <BR><BR>　　以后我们在action的 execute 方法中就可以使用 Hi.getSession()来获得一个会话支持。典型的应用如下： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>try{<BR>　//开启一个会话，并启动事务回滚能力<BR>　Session session = Hi.getSession();<BR>　Transaction tx= session.beginTransaction();<BR><BR>　//查询数据库，使用HQL<BR>　Query q = session.createQuery("from Topic as topic order by topic.id desc");<BR>　q.setFirstResult(0);<BR>　q.setMaxResults(5);<BR><BR>　//得到一个List类型的数据 <BR>　List newTopicList = q.list();<BR><BR>　// 业务处理 <BR>　NewTopicList ntlBean=new NewTopicList();<BR>　ntlBean.setList(newTopicList);<BR>　req.setAttribute("newtopiclist",ntlBean);<BR><BR>　//事务提交，记得关闭会话！ <BR>　tx.commit();<BR>　Hi.closeSession();<BR><BR>}//因为整个会话会抛出异常，所以需要用try--catch来包裹<BR>catch(HibernateException e){<BR><BR>　//日志记录 <BR>　Log.error(e.toString());<BR>}</TD></TR></TBODY></TABLE><BR>　　其中的HQL 可以参考 hibernate 官方文档来学习。 <BR></SPAN></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width=776 border=0>
<TBODY>
<TR>
<TD vAlign=top bgColor=#f0f2fb height=10></TD></TR>
<TR>
<TD vAlign=top bgColor=#f0f2fb>
<TABLE cellSpacing=0 cellPadding=0 width=590 align=center border=0>
<TBODY>
<TR>
<TD><SPAN class=f14>　　<FONT color=#990000><B>实战篇</B></FONT><BR><BR>　　在这一节我们要配置一个完整的应用配置。其实每一个单独拿出来都能写本书，不过我只是侧重对自己总结，在以后我会不断地把学习的经验教训写下来。<BR><BR>　　一，Log4j 的初始化 <BR><BR>　　配置log4j.properties <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>### direct log messages to stdout ###<BR>#log4j.appender.stdout=org.apache.log4j.ConsoleAppender<BR>#log4j.appender.stdout.Target=System.out<BR>#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<BR>%c{1}:%L - %m%n<BR>#log4j.appender.stdout.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n <BR>log4j.logger.seerlog=DEBUG,A2<BR>log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender<BR>log4j.appender.A2.file=d:\\log\\applog.txt<BR>log4j.appender.A2.DatePattern='.'yyyy-MM-dd<BR>log4j.appender.A2.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A2.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %m%n<BR><BR>#log4j.logger.ALL=DEBUG,A1<BR>log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender<BR>log4j.appender.A1.file=d:\\log\\all.log<BR>log4j.appender.A1.DatePattern='.'yyyy-MM-dd<BR>log4j.appender.A1.layout=org.apache.log4j.PatternLayout<BR>log4j.appender.A1.layout.ConversionPattern=%-5p %d{yyyy-MM-dd HH:mm:ss} %l%n%m%n<BR><BR>### direct messages to file hibernate.log ###<BR>#log4j.appender.file=org.apache.log4j.FileAppender<BR>#log4j.appender.file.File=hibernate.log<BR>#log4j.appender.file.layout=org.apache.log4j.PatternLayout<BR>#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n<BR><BR>### set log levels - for more verbose logging change 'info' to 'debug' ###<BR><BR>###log4j.rootLogger=warn, stdout<BR>log4j.rootLogger=info, A1<BR><BR>#以下是hibernate API需要的配置<BR><BR>log4j.logger.net.sf.hibernate=info<BR><BR>### log just the SQL<BR>#log4j.logger.net.sf.hibernate.SQL=debug<BR><BR>### log JDBC bind parameters ###<BR>log4j.logger.net.sf.hibernate.type=info<BR><BR>### log schema export/update ###<BR>log4j.logger.net.sf.hibernate.tool.hbm2ddl=debug<BR><BR>### log cache activity ###<BR>#log4j.logger.net.sf.hibernate.cache=debug<BR><BR>### enable the following line if you want to track down connection ###<BR>### leakages when using DriverManagerConnectionProvider ###<BR>#log4j.logger.net.sf.hibernate.connection.DriverManagerConnectionProvider=trac</TD></TR></TBODY></TABLE><BR>　　配置后如下来调用,首先需要初始化配置文件，这个过程只需要一次，所以我们可以在ServletContextListener中来进行。<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>String prefix = context.getRealPath("/");<BR>PropertyConfigurator.configure(prefix+"/WEB-INF/classes/log4j.properties"); </TD></TR></TBODY></TABLE><BR>　　这里需要你的配置文件的路径来初始化。<BR><BR>　　初始化完成后，我们在以后的action中就可以 象下面一样来调用：<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>static Logger log=Logger.getLogger("seerlog");<BR>log.warn("it's log4j warn");<BR>log.info("it's log4j info"); </TD></TR></TBODY></TABLE><BR>　　关于 log4j 的完全使用方法，偶会在以后做详细的说明！ <BR><BR>　　二，hibernate 的初始化 <BR><BR>　　首先我们要把hibernate.cfg.xml 放到应用的 classes 目录中，然后可以使用hibernate参考文档提供的例子来封装对后台的使用。<BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>public class Hi{<BR><BR>private static final SessionFactory sessionFactory;<BR>private static Connection conn;<BR>static {<BR>　try {<BR>　　sessionFactory = new Configuration().configure().buildSessionFactory();<BR>　} catch (HibernateException ex) {<BR>　　throw new RuntimeException("Exception building SessionFactory: " + ex.getMessage(), ex);<BR>　}<BR>}<BR><BR>public static final ThreadLocal session = new ThreadLocal();<BR>public static Session getSession() throws HibernateException {<BR>　Session s = (Session) session.get();<BR>　// 假如没有一个可用的线程，开启一个新 Session,<BR>　if (s == null) {<BR>　　conn=DBConnectionManager.getConnection();<BR>　　s = sessionFactory.openSession(conn);<BR>　　session.set(s);<BR>　}<BR>　return s;<BR>}<BR><BR>public static void closeSession() throws HibernateException {<BR>　Session s = (Session) session.get();<BR>　session.set(null);<BR>　if (s != null)<BR>　　s.close();<BR>　if(conn!=null)<BR>　　DBConnectionManager.returnConnection(conn);<BR>　}<BR>}</TD></TR></TBODY></TABLE><BR>　　文中DBConnectionManager.getConnection()是一个DAO类，提供连接池的实现。 <BR><BR>　　我们使用这个con连接来创建一个 session ，sission是一个数据库连接操作的会话周期，它提供了强大的管理数据的能力。 <BR><BR>　　以后我们在action的 execute 方法中就可以使用 Hi.getSession()来获得一个会话支持。典型的应用如下： <BR><BR>
<TABLE borderColor=#ffcc66 width="90%" align=center bgColor=#dadacf border=1>
<TBODY>
<TR>
<TD>try{<BR>　//开启一个会话，并启动事务回滚能力<BR>　Session session = Hi.getSession();<BR>　Transaction tx= session.beginTransaction();<BR><BR>　//查询数据库，使用HQL<BR>　Query q = session.createQuery("from Topic as topic order by topic.id desc");<BR>　q.setFirstResult(0);<BR>　q.setMaxResults(5);<BR><BR>　//得到一个List类型的数据 <BR>　List newTopicList = q.list();<BR><BR>　// 业务处理 <BR>　NewTopicList ntlBean=new NewTopicList();<BR>　ntlBean.setList(newTopicList);<BR>　req.setAttribute("newtopiclist",ntlBean);<BR><BR>　//事务提交，记得关闭会话！ <BR>　tx.commit();<BR>　Hi.closeSession();<BR><BR>}//因为整个会话会抛出异常，所以需要用try--catch来包裹<BR>catch(HibernateException e){<BR><BR>　//日志记录 <BR>　Log.error(e.toString());<BR>}</TD></TR></TBODY></TABLE><BR>　　其中的HQL 可以参考 hibernate 官方文档来学习。 </SPAN></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><img src ="http://www.blogjava.net/happyfish/aggbug/1624.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/happyfish/" target="_blank">小鱼儿</a> 2005-03-02 23:02 <a href="http://www.blogjava.net/happyfish/archive/2005/03/02/1624.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>