﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-用程序来创造财富-文章分类-java</title><link>http://www.blogjava.net/ioriqw/category/10448.html</link><description>在中国商界、尤其是互联网界，另一群“80后”青年正在集体浮出水面，以你可能想都想不到的方式崛起。</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 23:20:37 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 23:20:37 GMT</pubDate><ttl>60</ttl><item><title>hibernate数据源</title><link>http://www.blogjava.net/ioriqw/articles/51136.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Wed, 07 Jun 2006 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/51136.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/51136.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/51136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/51136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/51136.html</trackback:ping><description><![CDATA[
		<div class="postbody">
				<p>Hibernate内嵌了对C3P0,Proxool,JNDI数据源等数据库连接池的支持。但当我们需要使用除了这几个数据源外的其他数据源的时候就有问题了，例如我们需要用Apache的开源连接池项目DBCP，或者说我们想要使用多数JDBC驱动程序中自带的XxxxDataSource时，Hibernate就没有提供对这方面的支持。庆幸的是Hibernate做为一个强大的数据持久层组件，它在实现数据库连接方面的扩展性也是非常强大的。本文将介绍两种如何在Hibernate项目中使用自定义数据源的方法。</p>
				<p>本文假设你已经有Hibernate的开发经验。</p>
				<p>在开始之前应该先明确你的项目中的具体情况，也就是确认Hibernate内嵌的组件是否真的无法支持你的应用需要。例如C3P0或者Proxool已经可以满足大部分数据库的需要，又或者你的数据源是在应用服务器中配置的，那么你也没有必要进行扩展，你可以直接使用DatasourceConnectionProvider来让Hibernate使用你所定义的数据源。</p>
				<p>那么什么时候你需要扩展Hibernate对数据源的支持呢？可能你永远也用不上，但我一直在用。我用的原因可能不能成为正当的理由，因为C3P0或者Proxool总有些小地方的不足让我不爽，个人更偏向于DBCP连接池。或许本文应该改名为《让Hibernate支持DBCP数据源》，其实DBCP只不过是我的一个具体的例子，本文具有更普遍的应用意义。下面我们具体介绍两种不同的扩展思路。</p>
				<p>
						<a name="IDAHCOIB">
								<span class="atitle">
										<font color="#1d58d1">
												<font face="Arial">思路一：使用外部定义数据源</font>
										</font>
								</span>
						</a>
				</p>
				<p>假设我们已经有了一个WEB项目，该项目采用了Struts框架，而且我们已经在Struts中配置了数据源，也有不少的代码是依赖这个数据源运行的。现在我们需要给项目中加入对Hibernate的支持，但又不想去修改旧的已经成功稳定运行的代码了。那我们该怎么办？如果同样在Hibernate配置一个数据源指到同一个数据库，相信你也不乐意这样干，因为一旦配置上有修改那么Struts和Hibernate的配置都需要修改，这个也只是麻烦一点而已，最要命的是没法让原有的代码和Hibernate共用一个数据库连接，因此事务处理也就无从谈起。</p>
				<p>说那么多理由，无非就是为了让Hibernate可以使用Struts中配置的数据源，而我们暂且不去考虑这是否是最好的解决方法。</p>
				<p>在Hibernate中有一个UserSuppliedConnectionProvider类，其实这个类什么也不干，你一旦让它干点啥吧，它还净出异常，搞得你很是恼火。在Hibernate中，这个类的含义是要求用户自己来提供数据库连接的获取方法，同时当然也要自己负责关闭连接。</p>
				<p>为了使用Struts中配置的数据源，我们就不能直接调用SessionFactory.openSession()方法来获取Session实例，因为你如果没有在Hibernate中配置任何的数据库连接，那Hibernate会默认让UserSuppliedConnectionProvider类来跟你捣乱，你会收到很多异常信息，反复提醒我们必须自己提供数据库连接！我们要做还是调用openSession方法，不同的是需要先从Struts的数据源中获取数据库连接，然后传递该连接给openSession方法（参照 SessionFactory.openSession(Connection) 方法）。</p>
				<p>下面是我写的一个代码片断</p>
				<br />
				<a name="IDARCOIB">
						<b>
						</b>
				</a>
				<br />
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">//获取Session实例
public Session getSession(){
	ServletContext contxt = ....
	SessionFactory sessions = ....

	DataSource ds = (DataSource)context.getAttribute(Globals.DATA_SOURCE_KEY);
	final Connection conn = ds.getConnection();
	return sessions.openSession(conn);
}

//释放Session
public void closeSession(Session ssn){
	ssn.connection().close();
	ssn.close();
}
</font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>需要提醒大家注意的是closeSession方法，在该方法中我们必须手工去关闭session对应的数据库连接，我们前面已经提到了，UserSuppliedConnectionProvider类就是要求用户自己提供数据库连接已经连接的关闭。如果没有调用ssn.connection().close()方法，这会导致Struts的数据源的连接没有被释放。</p>
				<p>同理，上面提到的Struts只是一个应用普遍的例子，实际中你可以使用任何的外部连接池，你只需要将获取到的数据库连接传递给openSession方法，并自行负责释放数据库连接即可。应该说这是一种最简单的思路，好处是对系统的变动最小，兼容原来的代码。</p>
				<br />
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="567" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<img height="16" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-hibernate/#main">
																						<b>
																								<font color="#996699">回页首</font>
																								<font color="#1d58d1">
																								</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="IDA0COIB">
								<span class="atitle">
										<font color="#1d58d1">
												<font face="Arial">思路二：扩展ConnectionProvider</font>
										</font>
								</span>
						</a>
				</p>
				<p>Hibernate本身是通过ConnectionProvider接口来实现管理数据库连接的。例如其自带的C3P0ConnectionProvider，ProxoolConnectionProvider等。</p>
				<p>在这个思路中，我们希望可以直接在Hibernate的配置文件中配置数据库连接，也就是让Hibernate独揽数据库的管理，真正做到各司其职。为了更了解该接口的使用，你不妨阅读一下Hibernate提供的上面几个类的源码。</p>
				<p>接下来我们需要编写一个实现了ConnectionProvider接口的类，要求这个类能支持任何的符合DataSource接口规范的数据源，同时在Hibernate的配置文件中进行参数的设定。首先我们假定我们的类名是DataSourceConnProvider，那我们的配置信息在hibernate.cfg.xml中看起来应该像下面一样</p>
				<br />
				<a name="IDACDOIB">
						<b>
						</b>
				</a>
				<br />
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">        	&lt;!-- Connection Pool settings --&gt;
&lt;property name="connection.provider_class"&gt;
com.liusoft.dlog4j.db.DataSourceConnProvider&lt;/property&gt;
        &lt;property name="dscp.datasource"&gt;org.apache.commons.dbcp.BasicDataSource&lt;/property&gt;
        &lt;property name="dscp.driverClassName"&gt;sun.jdbc.odbc.JdbcOdbcDriver&lt;/property&gt;
        &lt;property name="dscp.url"&gt;jdbc:odbc:dlog4j&lt;/property&gt;
        &lt;property name="dscp.username"&gt;admin&lt;/property&gt;
        &lt;property name="dscp.password"&gt;&lt;/property&gt;
        &lt;property name="dscp.initialSize"&gt;1&lt;/property&gt;
        &lt;property name="dscp.maxActive"&gt;200&lt;/property&gt;
        &lt;property name="dscp.maxWait"&gt;2000&lt;/property&gt;
        &lt;property name="dscp.defaultAutoCommit"&gt;false&lt;/property&gt;
        &lt;property name="dscp.defaultReadOnly"&gt;false&lt;/property&gt;
        &lt;property name="dscp.removeAbandoned"&gt;true&lt;/property&gt;
        &lt;property name="dscp.removeAbandonedTimeout"&gt;120&lt;/property&gt;
	&lt;!--
        &lt;property name="dscp.defaultTransactionIsolation"&gt;1&lt;/property&gt;
	--&gt;
        &lt;property name="dscp.poolPreparedStatements"&gt;true&lt;/property&gt;
        &lt;property name="dscp.maxOpenPreparedStatements"&gt;1000&lt;/property&gt; 
        </font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>在上面的配置信息中，connection.provider_class是Hibernate本身用来指定不同ConnectionProvider实现类。接下来我们规定了我们的扩展所使用的配置键值都是以dscp.开头，同时我们使用dscp.datasource来指定具体实现了DataSource接口的类名，例如如果使用DBCP这个连接池，那么这个类名应该是org.apache.commons.dbcp.BasicDataSource。对于其他以dscp.开头的且不是dscp.datasource的配置信息都会直接赋值给DataSource的实现类。例如上面的配置中，driverClassName、url、username、password等配置信息都是BasicDataSource类的属性。</p>
				<p>下面是我们所实现的DataSourceConnProvider类的源码。</p>
				<br />
				<a name="IDALDOIB">
						<b>
						</b>
				</a>
				<br />
				<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
						<tbody>
								<tr>
										<td>
												<pre>
														<code class="section">
																<font face="Lucida Console">package com.liusoft.dlog4j.db;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.beanutils.BeanUtils;
import org.hibernate.HibernateException;
import org.hibernate.connection.ConnectionProvider;

import com.liusoft.dlog4j.Globals;
import com.liusoft.dlog4j.util.StringUtils;

/**
 * 让Hibernate支持各种数据源
 * @author Winter Lau
 */
public class DataSourceConnProvider implements ConnectionProvider {
	
	private final static String BASE_KEY = "dscp.";
	private final static String ENCODING_KEY = "dscp.encoding";
	private final static String DATASOURCE_KEY = "dscp.datasource";
	
	protected DataSource dataSource;
	
	/* (non-Javadoc)
	 * @see org.hibernate.connection.ConnectionProvider#configure(java.util.Properties)
	 */
	public void configure(Properties props) throws HibernateException {
		String dataSourceClass = null;
		Properties new_props = new Properties();
		Iterator keys = props.keySet().iterator();
		while(keys.hasNext()){
			String key = (String)keys.next();
			if(DATASOURCE_KEY.equalsIgnoreCase(key)){
				dataSourceClass = props.getProperty(key);
			}
			else if(key.startsWith(BASE_KEY)){
				String value = props.getProperty(key);
				value = StringUtils.replace(value, "{DLOG4J}", Globals.WEBAPP_PATH);
				new_props.setProperty(key.substring(BASE_KEY.length()), value);
			}
		}
		if(dataSourceClass == null)
			throw new HibernateException("Property 'dscp.datasource' no defined.");
		try {
			dataSource = (DataSource)Class.forName(dataSourceClass).newInstance();
			BeanUtils.populate(dataSource, new_props);
		} catch (Exception e) {
			throw new HibernateException(e);
		}
	}

	/* (non-Javadoc)
	 * @see org.hibernate.connection.ConnectionProvider#getConnection()
	 */
	public Connection getConnection() throws SQLException {		
		final Connection conn = dataSource.getConnection();
		if(useProxy &amp;&amp; conn!=null){
			return (new _Connection(conn,encoding)).getConnection();
		}
		return conn;
	}

	/* (non-Javadoc)
	 * @see org.hibernate.connection.ConnectionProvider#closeConnection(java.sql.Connection)
	 */
	public void closeConnection(Connection conn) throws SQLException {
		if(conn!=null &amp;&amp; !conn.isClosed())
			conn.close();
	}

	/* (non-Javadoc)
	 * @see org.hibernate.connection.ConnectionProvider#close()
	 */
	public void close() throws HibernateException {
		if(dataSource != null)
		try {
			Method mClose = dataSource.getClass().getMethod("close",null);
			mClose.invoke(dataSource, null);
		} catch (Exception e) {
			throw new HibernateException(e);
		}
		dataSource = null;
	}

	/* (non-Javadoc)
	 * @see org.hibernate.connection.ConnectionProvider#supportsAggressiveRelease()
	 */
	public boolean supportsAggressiveRelease() {
		return false;
	}

}
</font>
														</code>
												</pre>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>在DataSourceConnProvider类中，configure方法会在Hibernate进行初始化的过程中被调用，我们根据配置的DataSource类名创建数据源实例，并将配置参数赋值给该实例后即完成了数据源的初始化。接下来就是实现了getConnection和closeConnection方法分别是获取数据库连接和关闭连接的方法。方法close用来关闭整个数据源，该方法会在Hibernate释放时被调用。</p>
				<p>你也可以使用其他一些不同的数据源而不一定非是DBCP数据源。配置完毕后接下来的事情就简单了，直接调用SessionFactory.openSession()方法获取Session实例，直接调用session.close()释放该实例，无需再手工去关闭session所封装的connection接口。</p>
				<p>相比较上面两种思路而言，各有千秋。如果你真的有必要扩展Hibernate对数据源的支持，如果你没有兼容旧代码这个问题需要考虑的话，那我更倾向于第二种思路。因为它使得整个项目的各个层次分工非常清晰，而且除了ConnectionProvider 类以外应用的代码也相对简单。</p>
		</div>
<img src ="http://www.blogjava.net/ioriqw/aggbug/51136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-06-07 15:20 <a href="http://www.blogjava.net/ioriqw/articles/51136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无需容器的对象关系映射</title><link>http://www.blogjava.net/ioriqw/articles/46885.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Thu, 18 May 2006 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/46885.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/46885.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/46885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/46885.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/46885.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如果关心开发人员的最新热点，那么您可能听说过 IOC （控制倒置，Inversion of Control）容器和 AOP （面向方面编程）。不过，像许多开发人员一样，您可能不清楚在自己的开发工作中如何使用这些技术。在本文中，通过具体介绍使用 Hibernate 和 Spring 在企业应用程序中构建一个事务持久层，您会认识到这些技术。								Hibernate 是 Java ...&nbsp;&nbsp;<a href='http://www.blogjava.net/ioriqw/articles/46885.html'>阅读全文</a><img src ="http://www.blogjava.net/ioriqw/aggbug/46885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-05-18 20:03 <a href="http://www.blogjava.net/ioriqw/articles/46885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HibernateSessionFactory properties文件的加载</title><link>http://www.blogjava.net/ioriqw/articles/46857.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Thu, 18 May 2006 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/46857.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/46857.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/46857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/46857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/46857.html</trackback:ping><description><![CDATA[
		<p>package com.zte.hibernate.dao;</p>
		<p>import java.io.FileInputStream;<br />import java.io.FileNotFoundException;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.util.Properties;</p>
		<p>import org.hibernate.HibernateException;<br />import org.hibernate.Session;<br />import org.hibernate.cfg.Configuration;</p>
		<p>import com.zte.hibernate.domain.Dept;<br />import com.zte.hibernate.domain.Emp;</p>
		<p>/**<br /> * Configures and provides access to Hibernate sessions, tied to the<br /> * current thread of execution.  Follows the Thread Local Session<br /> * pattern, see <a href="mailto:{@link">{@link</a><a href="http://hibernate.org/42.html">http://hibernate.org/42.html</a>}.<br /> */<br />public class HibernateSessionFactory {</p>
		<p>    /** <br />     * Location of hibernate.cfg.xml file.<br />     * NOTICE: Location should be on the classpath as Hibernate uses<br />     * #resourceAsStream style lookup for its configuration file. That<br />     * is place the config file in a Java package - the default location<br />     * is the default Java package.&lt;br&gt;&lt;br&gt;<br />     * Examples: &lt;br&gt;<br />     * &lt;code&gt;CONFIG_FILE_LOCATION = "/hibernate.conf.xml". <br />     * CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".&lt;/code&gt; <br />     */<br />    private static String CONFIG_FILE_LOCATION = "/com/zte/hibernate/dao/hibernate.cfg.xml";</p>
		<p>    /** Holds a single instance of Session */<br /> private static final ThreadLocal threadLocal = new ThreadLocal();</p>
		<p>    /** The single instance of hibernate configuration */<br />    private static final Configuration cfg = new Configuration();</p>
		<p>    /** The single instance of hibernate SessionFactory */<br />    private static org.hibernate.SessionFactory sessionFactory;</p>
		<p>    /**<br />     * Returns the ThreadLocal Session instance.  Lazy initialize<br />     * the &lt;code&gt;SessionFactory&lt;/code&gt; if needed.<br />     *<br />     *  @return Session<br />     *  @throws HibernateException<br />     */<br />    public static Session currentSession() throws HibernateException {<br />        Session session = (Session) threadLocal.get();<br />        Properties p = new Properties();<br />        InputStream in;<br />  try {<br />   in = new FileInputStream("src/hibernate.properties");<br />   p.load(in);<br />  } catch (FileNotFoundException e1) {<br />   // TODO Auto-generated catch block<br />   e1.printStackTrace();<br />  } catch (IOException e) {<br />   // TODO Auto-generated catch block<br />   e.printStackTrace();<br />  }<br />        <br />  if (session == null || !session.isOpen()) {<br />   if (sessionFactory == null) {<br />    try {<br />     cfg.setProperties(p);<br />     cfg.addClass(Dept.class);<br />     cfg.addClass(Emp.class);<br />     //cfg.configure(CONFIG_FILE_LOCATION);<br />     sessionFactory = cfg.buildSessionFactory();<br />    } catch (Exception e) {<br />     System.err<br />       .println("%%%% Error Creating SessionFactory %%%%");<br />     e.printStackTrace();<br />    }<br />   }<br />   session = (sessionFactory != null) ? sessionFactory.openSession()<br />     : null;<br />   threadLocal.set(session);<br />  }</p>
		<p>        return session;<br />    }</p>
		<p>    /**<br />     *  Close the single hibernate session instance.<br />     *<br />     *  @throws HibernateException<br />     */<br />    public static void closeSession() throws HibernateException {<br />        Session session = (Session) threadLocal.get();<br />        threadLocal.set(null);</p>
		<p>        if (session != null) {<br />            session.close();<br />        }<br />    }</p>
		<p>    /**<br />     * Default constructor.<br />     */<br />    private HibernateSessionFactory() {<br />    }</p>
		<p>}<br /></p>
<img src ="http://www.blogjava.net/ioriqw/aggbug/46857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-05-18 16:50 <a href="http://www.blogjava.net/ioriqw/articles/46857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate.cglib.use_reflection_optimizer=false</title><link>http://www.blogjava.net/ioriqw/articles/46853.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Thu, 18 May 2006 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/46853.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/46853.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/46853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/46853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/46853.html</trackback:ping><description><![CDATA[
		<h2 class="diaryTitle">hibernate.cglib.use_reflection_optimizer=false - -</h2>                                       
<p></p><p>set hibernate.cglib.use_reflection_optimizer=false for more info</p><p>今天碰到</p><p>HibernateDBModel Error: exception setting property value with CGLIB </p><p>(set hibernate.cglib.use_reflection_optimizer=false for more info) </p><p>setter of com.belief.po.Good.setTuijian</p><p><hibernatedbmodel value="" of="" setter="" info)="" more="" for="" hibernate.cglib.use_reflection_optimizer="false" (set="" with="" property="" setting="" exception="" error:="" cglib="" com.belief.po.good.settuijian="" /></p><p>解决办法</p><p>你的数据库里的某个字段的值为NULL，而事情本不该这样的。解决的办法就是把这个字段的NULL值改为非NULL值，就是查找数据库，看看是否又字段为null，改成非null即可。（i use sqlserver）</p><img src ="http://www.blogjava.net/ioriqw/aggbug/46853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-05-18 16:34 <a href="http://www.blogjava.net/ioriqw/articles/46853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图解eclipse+myelcipse开发EJB </title><link>http://www.blogjava.net/ioriqw/articles/46662.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Wed, 17 May 2006 09:43:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/46662.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/46662.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/46662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/46662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/46662.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a class="postTitle2" id="viewpost1_TitleUrl" href="/rickhunter/articles/25484.html">
						<font color="#646464">图解eclipse+myelcipse开发EJB</font>
				</a>
		</div>    在开发ejb之前，我们先得配置好服务器，我使用的是Weblogic9.0中文版，关于Weblogic9.0配置请看我的另一片文章。<a class="singleposttitle" id="viewpost1_TitleUrl" href="/rickhunter/articles/25479.html"><font color="#6fbc4c">配置Weblogic9.0</font></a><br />    <br />    首先需要配置好eclipse。我这里主要说明weblogic的配置。<br />    <img height="524" alt="ejb19.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb19.jpg" width="744" border="0" /><br /><br />    <font color="#ee82ee">注意JDK选择JDK5.0的版本。</font><br />    <br />    顺便将weblogic8的配置也贴上来，供大家比较参考<br />    <img height="524" alt="ejb18.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb18.jpg" width="702" border="0" /><br />    <br />    <font color="#ee82ee">注意weblogic8的JDK版本必须是JDK1.4。</font><br />    <br />    接下来就开始我们的开发了。<br /><hr width="100%" size="2" /><img height="500" alt="ejb1.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb1.jpg" width="525" border="0" /><br /><br /><img height="500" alt="ejb2.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb2.jpg" width="525" border="0" /><br /><br /><img height="234" alt="ejb3.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb3.jpg" width="221" border="0" /><br /><br /><img height="274" alt="ejb4.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb4.jpg" width="585" border="0" /><br /><br /><img height="578" alt="ejb5.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb5.jpg" width="525" border="0" /><br /><br />下面就是SessionBean的代码<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><img id="Code_Closed_Image" onclick="this.style.display='none'; Code_Closed_Text.style.display='none'; Code_Open_Image.style.display='inline'; Code_Open_Text.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image" style="DISPLAY: none" onclick="this.style.display='none'; Code_Open_Text.style.display='none'; Code_Closed_Image.style.display='inline'; Code_Closed_Text.style.display='inline';" height="16" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Closed_Text" style="BORDER-RIGHT: rgb(128,128,128) 1px solid; BORDER-TOP: rgb(128,128,128) 1px solid; BORDER-LEFT: rgb(128,128,128) 1px solid; BORDER-BOTTOM: rgb(128,128,128) 1px solid; BACKGROUND-COLOR: rgb(255,255,255)">30</span><span id="Code_Open_Text" style="DISPLAY: none"><br /><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,128,128)"> 1</span> <span style="COLOR: rgb(0,0,255)">package</span><span style="COLOR: rgb(0,0,0)"> com.ejb;<br /></span><span style="COLOR: rgb(0,128,128)"> 2</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 3</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> java.rmi.RemoteException;<br /></span><span style="COLOR: rgb(0,128,128)"> 4</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 5</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> javax.ejb.EJBException;<br /></span><span style="COLOR: rgb(0,128,128)"> 6</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> javax.ejb.SessionBean;<br /></span><span style="COLOR: rgb(0,128,128)"> 7</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> javax.ejb.SessionContext;<br /></span><span style="COLOR: rgb(0,128,128)"> 8</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 9</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,128,0)">/**</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">10</span> <span style="COLOR: rgb(0,128,0)"> * XDoclet-based session bean.  The class must be declared<br /></span><span style="COLOR: rgb(0,128,128)">11</span> <span style="COLOR: rgb(0,128,0)"> * public according to the EJB specification.<br /></span><span style="COLOR: rgb(0,128,128)">12</span> <span style="COLOR: rgb(0,128,0)"> *<br /></span><span style="COLOR: rgb(0,128,128)">13</span> <span style="COLOR: rgb(0,128,0)"> * To generate the EJB related files to this EJB:<br /></span><span style="COLOR: rgb(0,128,128)">14</span> <span style="COLOR: rgb(0,128,0)"> *        - Add Standard EJB module to XDoclet project properties<br /></span><span style="COLOR: rgb(0,128,128)">15</span> <span style="COLOR: rgb(0,128,0)"> *        - Customize XDoclet configuration for your appserver<br /></span><span style="COLOR: rgb(0,128,128)">16</span> <span style="COLOR: rgb(0,128,0)"> *        - Run XDoclet<br /></span><span style="COLOR: rgb(0,128,128)">17</span> <span style="COLOR: rgb(0,128,0)"> *<br /></span><span style="COLOR: rgb(0,128,128)">18</span> <span style="COLOR: rgb(0,128,0)"> * Below are the xdoclet-related tags needed for this EJB.<br /></span><span style="COLOR: rgb(0,128,128)">19</span> <span style="COLOR: rgb(0,128,0)"> * <br /></span><span style="COLOR: rgb(0,128,128)">20</span> <span style="COLOR: rgb(0,128,0)"> * @ejb.bean name="HelloWorld"<br /></span><span style="COLOR: rgb(0,128,128)">21</span> <span style="COLOR: rgb(0,128,0)"> *           display-name="Name for HelloWorld"<br /></span><span style="COLOR: rgb(0,128,128)">22</span> <span style="COLOR: rgb(0,128,0)"> *           description="Description for HelloWorld"<br /></span><span style="COLOR: rgb(0,128,128)">23</span> <span style="COLOR: rgb(0,128,0)"> *           jndi-name="ejb/HelloWorld"<br /></span><span style="COLOR: rgb(0,128,128)">24</span> <span style="COLOR: rgb(0,128,0)"> *           type="Stateless"<br /></span><span style="COLOR: rgb(0,128,128)">25</span> <span style="COLOR: rgb(0,128,0)"> *           view-type="remote"<br /></span><span style="COLOR: rgb(0,128,128)">26</span> <span style="COLOR: rgb(0,128,0)"> </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">27</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">class</span><span style="COLOR: rgb(0,0,0)"> HelloWorld </span><span style="COLOR: rgb(0,0,255)">implements</span><span style="COLOR: rgb(0,0,0)"> SessionBean {<br /></span><span style="COLOR: rgb(0,128,128)">28</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">29</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,128,0)">/**</span><span style="COLOR: rgb(0,128,0)"> The session context </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">30</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">private</span><span style="COLOR: rgb(0,0,0)"> SessionContext context;<br /></span><span style="COLOR: rgb(0,128,128)">31</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">32</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> HelloWorld() {<br /></span><span style="COLOR: rgb(0,128,128)">33</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">super</span><span style="COLOR: rgb(0,0,0)">();<br /></span><span style="COLOR: rgb(0,128,128)">34</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> TODO 自动生成构造函数存根</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">35</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">    }<br /></span><span style="COLOR: rgb(0,128,128)">36</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">37</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,128,0)">/**</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">38</span> <span style="COLOR: rgb(0,128,0)">     * Set the associated session context. The container calls this method <br /></span><span style="COLOR: rgb(0,128,128)">39</span> <span style="COLOR: rgb(0,128,0)">     * after the instance creation.<br /></span><span style="COLOR: rgb(0,128,128)">40</span> <span style="COLOR: rgb(0,128,0)">     * <br /></span><span style="COLOR: rgb(0,128,128)">41</span> <span style="COLOR: rgb(0,128,0)">     * The enterprise bean instance should store the reference to the context <br /></span><span style="COLOR: rgb(0,128,128)">42</span> <span style="COLOR: rgb(0,128,0)">     * object in an instance variable.<br /></span><span style="COLOR: rgb(0,128,128)">43</span> <span style="COLOR: rgb(0,128,0)">     * <br /></span><span style="COLOR: rgb(0,128,128)">44</span> <span style="COLOR: rgb(0,128,0)">     * This method is called with no transaction context. <br /></span><span style="COLOR: rgb(0,128,128)">45</span> <span style="COLOR: rgb(0,128,0)">     * <br /></span><span style="COLOR: rgb(0,128,128)">46</span> <span style="COLOR: rgb(0,128,0)">     * </span><span style="COLOR: rgb(128,128,128)">@throws</span><span style="COLOR: rgb(0,128,0)"> EJBException Thrown if method fails due to system-level error.<br /></span><span style="COLOR: rgb(0,128,128)">47</span> <span style="COLOR: rgb(0,128,0)">     </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">48</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">void</span><span style="COLOR: rgb(0,0,0)"> setSessionContext(SessionContext newContext)<br /></span><span style="COLOR: rgb(0,128,128)">49</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">throws</span><span style="COLOR: rgb(0,0,0)"> EJBException {<br /></span><span style="COLOR: rgb(0,128,128)">50</span> <span style="COLOR: rgb(0,0,0)">        context </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> newContext;<br /></span><span style="COLOR: rgb(0,128,128)">51</span> <span style="COLOR: rgb(0,0,0)">    }<br /></span><span style="COLOR: rgb(0,128,128)">52</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">53</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">void</span><span style="COLOR: rgb(0,0,0)"> ejbRemove() </span><span style="COLOR: rgb(0,0,255)">throws</span><span style="COLOR: rgb(0,0,0)"> EJBException, RemoteException {<br /></span><span style="COLOR: rgb(0,128,128)">54</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> TODO 自动生成方法存根</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">55</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">56</span> <span style="COLOR: rgb(0,0,0)">    }<br /></span><span style="COLOR: rgb(0,128,128)">57</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">58</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">void</span><span style="COLOR: rgb(0,0,0)"> ejbActivate() </span><span style="COLOR: rgb(0,0,255)">throws</span><span style="COLOR: rgb(0,0,0)"> EJBException, RemoteException {<br /></span><span style="COLOR: rgb(0,128,128)">59</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> TODO 自动生成方法存根</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">60</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">61</span> <span style="COLOR: rgb(0,0,0)">    }<br /></span><span style="COLOR: rgb(0,128,128)">62</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">63</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">void</span><span style="COLOR: rgb(0,0,0)"> ejbPassivate() </span><span style="COLOR: rgb(0,0,255)">throws</span><span style="COLOR: rgb(0,0,0)"> EJBException, RemoteException {<br /></span><span style="COLOR: rgb(0,128,128)">64</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> TODO 自动生成方法存根</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">65</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">66</span> <span style="COLOR: rgb(0,0,0)">    }<br /></span><span style="COLOR: rgb(0,128,128)">67</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">68</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,128,0)">/**</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">69</span> <span style="COLOR: rgb(0,128,0)">     * An example business method<br /></span><span style="COLOR: rgb(0,128,128)">70</span> <span style="COLOR: rgb(0,128,0)">     *<br /></span><span style="COLOR: rgb(0,128,128)">71</span> <span style="COLOR: rgb(0,128,0)">     * @ejb.interface-method view-type = "remote"<br /></span><span style="COLOR: rgb(0,128,128)">72</span> <span style="COLOR: rgb(0,128,0)">     * <br /></span><span style="COLOR: rgb(0,128,128)">73</span> <span style="COLOR: rgb(0,128,0)">     * </span><span style="COLOR: rgb(128,128,128)">@throws</span><span style="COLOR: rgb(0,128,0)"> EJBException Thrown if method fails due to system-level error.<br /></span><span style="COLOR: rgb(0,128,128)">74</span> <span style="COLOR: rgb(0,128,0)">     </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">75</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> String hello() </span><span style="COLOR: rgb(0,0,255)">throws</span><span style="COLOR: rgb(0,0,0)"> EJBException {<br /></span><span style="COLOR: rgb(0,128,128)">76</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> rename and start putting your business logic here</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">77</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">return</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> String(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">HelloEJBWorld!</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">);<br /></span><span style="COLOR: rgb(0,128,128)">78</span> <span style="COLOR: rgb(0,0,0)">    }<br /></span><span style="COLOR: rgb(0,128,128)">79</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">80</span> <span style="COLOR: rgb(0,0,0)">}<br /></span><span style="COLOR: rgb(0,128,128)">81</span> <span style="COLOR: rgb(0,0,0)"></span></span></div><br />其实就是修改了其中的一个方法： 
<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,128,128)"> 1</span> <span style="COLOR: rgb(0,128,0)">/**</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 2</span> <span style="COLOR: rgb(0,128,0)">     * An example business method<br /></span><span style="COLOR: rgb(0,128,128)"> 3</span> <span style="COLOR: rgb(0,128,0)">     *<br /></span><span style="COLOR: rgb(0,128,128)"> 4</span> <span style="COLOR: rgb(0,128,0)">     * @ejb.interface-method view-type = "remote"<br /></span><span style="COLOR: rgb(0,128,128)"> 5</span> <span style="COLOR: rgb(0,128,0)">     * <br /></span><span style="COLOR: rgb(0,128,128)"> 6</span> <span style="COLOR: rgb(0,128,0)">     * </span><span style="COLOR: rgb(128,128,128)">@throws</span><span style="COLOR: rgb(0,128,0)"> EJBException Thrown if method fails due to system-level error.<br /></span><span style="COLOR: rgb(0,128,128)"> 7</span> <span style="COLOR: rgb(0,128,0)">     </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 8</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> String hello() </span><span style="COLOR: rgb(0,0,255)">throws</span><span style="COLOR: rgb(0,0,0)"> EJBException {<br /></span><span style="COLOR: rgb(0,128,128)"> 9</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> rename and start putting your business logic here</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">10</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">return</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> String(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">HelloEJBWorld!</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">);<br /></span><span style="COLOR: rgb(0,128,128)">11</span> <span style="COLOR: rgb(0,0,0)">    }</span></div><font color="#ff1493"><u>注意：代码中的解释文字不要删除，因为XDoclet需要。</u></font><br /><br />配置属性<br /><img height="488" alt="ejb6.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb6.jpg" width="334" border="0" /><br /><br />添加weblogic.jar。我的路径是：bea\weblogic90\server\lib\weblogic.jar<br /><img height="524" alt="ejb16.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb16.jpg" width="726" border="0" /><br /><br /><img height="548" alt="ejb7.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb7.jpg" width="719" border="0" /><br /><br /><img height="171" alt="ejb8.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb8.jpg" width="220" border="0" /><br /><br /><img height="548" alt="ejb9.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb9.jpg" width="719" border="0" /><br /><br /><img height="548" alt="ejb10.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb10.jpg" width="719" border="0" /><br /><br /><img height="591" alt="ejb11.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb11.jpg" width="220" border="0" /><br /><br /><img height="548" alt="ejb12.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb12.jpg" width="719" border="0" /><br /><br /><img height="546" alt="ejb13.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb13.jpg" width="718" border="0" /><br /><br /><img height="622" alt="ejb14.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb14.jpg" width="600" border="0" /><br /><br /><img height="348" alt="ejb15.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb15.jpg" width="217" border="0" /><br /><br />就下来写EJBTest类：<br /><div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: rgb(0,128,128)"> 1</span> <span style="COLOR: rgb(0,0,255)">package</span><span style="COLOR: rgb(0,0,0)"> com;<br /></span><span style="COLOR: rgb(0,128,128)"> 2</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 3</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> java.rmi.RemoteException;<br /></span><span style="COLOR: rgb(0,128,128)"> 4</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> java.util.Properties;<br /></span><span style="COLOR: rgb(0,128,128)"> 5</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)"> 6</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> javax.ejb.CreateException;<br /></span><span style="COLOR: rgb(0,128,128)"> 7</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> javax.naming.Context;<br /></span><span style="COLOR: rgb(0,128,128)"> 8</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> javax.naming.InitialContext;<br /></span><span style="COLOR: rgb(0,128,128)"> 9</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> javax.naming.NamingException;<br /></span><span style="COLOR: rgb(0,128,128)">10</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">11</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> com.interfaces.HelloWorld;<br /></span><span style="COLOR: rgb(0,128,128)">12</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">import</span><span style="COLOR: rgb(0,0,0)"> com.interfaces.HelloWorldHome;<br /></span><span style="COLOR: rgb(0,128,128)">13</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">14</span> <span style="COLOR: rgb(0,0,0)"></span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">class</span><span style="COLOR: rgb(0,0,0)"> EJBTest {<br /></span><span style="COLOR: rgb(0,128,128)">15</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">16</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,128,0)">/**</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">17</span> <span style="COLOR: rgb(0,128,0)">     * </span><span style="COLOR: rgb(128,128,128)">@param</span><span style="COLOR: rgb(0,128,0)"> args<br /></span><span style="COLOR: rgb(0,128,128)">18</span> <span style="COLOR: rgb(0,128,0)">     </span><span style="COLOR: rgb(0,128,0)">*/</span><span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">19</span> <span style="COLOR: rgb(0,0,0)">    </span><span style="COLOR: rgb(0,0,255)">public</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">static</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">void</span><span style="COLOR: rgb(0,0,0)"> main(String[] args) {<br /></span><span style="COLOR: rgb(0,128,128)">20</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> TODO 自动生成方法存根</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">21</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">        Properties properties</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> Properties();<br /></span><span style="COLOR: rgb(0,128,128)">22</span> <span style="COLOR: rgb(0,0,0)">        properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">weblogic.jndi.WLInitialContextFactory</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">);<br /></span><span style="COLOR: rgb(0,128,128)">23</span> <span style="COLOR: rgb(0,0,0)">        properties.setProperty(Context.PROVIDER_URL,</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">t3://localhost:7001</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">);<br /></span><span style="COLOR: rgb(0,128,128)">24</span> <span style="COLOR: rgb(0,0,0)">        <br /></span><span style="COLOR: rgb(0,128,128)">25</span> <span style="COLOR: rgb(0,0,0)">        Context context;<br /></span><span style="COLOR: rgb(0,128,128)">26</span> <span style="COLOR: rgb(0,0,0)">        </span><span style="COLOR: rgb(0,0,255)">try</span><span style="COLOR: rgb(0,0,0)"> {<br /></span><span style="COLOR: rgb(0,128,128)">27</span> <span style="COLOR: rgb(0,0,0)">            context </span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)"> </span><span style="COLOR: rgb(0,0,255)">new</span><span style="COLOR: rgb(0,0,0)"> InitialContext(properties);<br /></span><span style="COLOR: rgb(0,128,128)">28</span> <span style="COLOR: rgb(0,0,0)">            HelloWorldHome hwh</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">(HelloWorldHome)context.lookup(</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">ejb/HelloWorld</span><span style="COLOR: rgb(0,0,0)">"</span><span style="COLOR: rgb(0,0,0)">);<br /></span><span style="COLOR: rgb(0,128,128)">29</span> <span style="COLOR: rgb(0,0,0)">            HelloWorld hw</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">hwh.create();<br /></span><span style="COLOR: rgb(0,128,128)">30</span> <span style="COLOR: rgb(0,0,0)">            String s</span><span style="COLOR: rgb(0,0,0)">=</span><span style="COLOR: rgb(0,0,0)">hw.hello();<br /></span><span style="COLOR: rgb(0,128,128)">31</span> <span style="COLOR: rgb(0,0,0)">            System.out.println(s);<br /></span><span style="COLOR: rgb(0,128,128)">32</span> <span style="COLOR: rgb(0,0,0)">        } </span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)"> (NamingException e) {<br /></span><span style="COLOR: rgb(0,128,128)">33</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> TODO 自动生成 catch 块</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">34</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            e.printStackTrace();<br /></span><span style="COLOR: rgb(0,128,128)">35</span> <span style="COLOR: rgb(0,0,0)">        } </span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)"> (RemoteException e) {<br /></span><span style="COLOR: rgb(0,128,128)">36</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> TODO 自动生成 catch 块</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">37</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            e.printStackTrace();<br /></span><span style="COLOR: rgb(0,128,128)">38</span> <span style="COLOR: rgb(0,0,0)">        } </span><span style="COLOR: rgb(0,0,255)">catch</span><span style="COLOR: rgb(0,0,0)"> (CreateException e) {<br /></span><span style="COLOR: rgb(0,128,128)">39</span> <span style="COLOR: rgb(0,0,0)">            </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)"> TODO 自动生成 catch 块</span><span style="COLOR: rgb(0,128,0)"><br /></span><span style="COLOR: rgb(0,128,128)">40</span> <span style="COLOR: rgb(0,128,0)"></span><span style="COLOR: rgb(0,0,0)">            e.printStackTrace();<br /></span><span style="COLOR: rgb(0,128,128)">41</span> <span style="COLOR: rgb(0,0,0)">        }<br /></span><span style="COLOR: rgb(0,128,128)">42</span> <span style="COLOR: rgb(0,0,0)">        <br /></span><span style="COLOR: rgb(0,128,128)">43</span> <span style="COLOR: rgb(0,0,0)">    }<br /></span><span style="COLOR: rgb(0,128,128)">44</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">45</span> <span style="COLOR: rgb(0,0,0)"><br /></span><span style="COLOR: rgb(0,128,128)">46</span> <span style="COLOR: rgb(0,0,0)">}<br /></span><span style="COLOR: rgb(0,128,128)">47</span> <span style="COLOR: rgb(0,0,0)"></span></div><br /><hr width="100%" size="2" />
最后就是看结果了，先启动weblogic，然后运行EJBTest程序。<br /><br /><img height="203" alt="ejb17.jpg" src="http://www.blogjava.net/images/blogjava_net/rickhunter/ejb_myeclipse/ejb17.jpg" width="790" border="0" /><br /><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/ioriqw/aggbug/46662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-05-17 17:43 <a href="http://www.blogjava.net/ioriqw/articles/46662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDBC+Hibernate将Blob数据写入Oracle </title><link>http://www.blogjava.net/ioriqw/articles/46451.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Tue, 16 May 2006 09:57:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/46451.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/46451.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/46451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/46451.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/46451.html</trackback:ping><description><![CDATA[
		<span id="LblContent">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></span>
		<dl>
				<dt>作者的其他文章 
</dt>
				<dd>
						<ul>
								<li>
										<a id="RepAuthor__ctl0_HyperArticle" href="http://kb.csdn.net/java/Articles/200509/e125be6d-4968-40fe-86b4-9b4522f1a78e.html">我为什么要学习Hibernate?</a>
								</li>
								<li>
										<a id="RepAuthor__ctl1_HyperArticle" href="http://kb.csdn.net/java/Articles/200509/ae44cd4a-05c9-4bc3-9139-1e90c1fa75db.html">Hibernate入门 - 基础配置</a>
								</li>
								<li>
										<a id="RepAuthor__ctl2_HyperArticle" href="http://kb.csdn.net/java/Articles/200509/3bba2882-7f69-4a53-b507-dd98ea77e08e.html">Hibernate入门 - 包作用详解</a>
								</li>
								<li>
										<a id="RepAuthor__ctl3_HyperArticle" href="http://kb.csdn.net/java/Articles/200601/4b4e5f5d-e3e6-4bc5-962e-33d61442d3f3.html">Hibernate获得成功的十大理由</a>
								</li>
								<li>
										<a id="RepAuthor__ctl4_HyperArticle" href="http://kb.csdn.net/java/Articles/200601/487b32b9-8bdb-44fe-b659-7823cf066470.html">Hibernate的JNDI绑定分析</a>
								</li>
								<li>
										<a id="RepAuthor__ctl5_HyperArticle" href="http://kb.csdn.net/java/Articles/200601/6d0665aa-b7f5-4b58-acfa-6c9050bf2539.html">Weblogic上配置Hibernate为JNDI</a>
								</li>
								<li>
										<a id="RepAuthor__ctl6_HyperArticle" href="http://kb.csdn.net/java/Articles/200601/a2686d2e-b5b7-4656-9955-6750b07d4b2f.html">Hibernate分页查询原理解读</a>
								</li>
								<li>
										<a id="RepAuthor__ctl7_HyperArticle" href="http://kb.csdn.net/java/Articles/200601/74a28f24-a883-4b41-987f-09ac444e8043.html">JDBC+Hibernate将Blob数据写入Oracle</a>
								</li>
								<li>
										<a id="RepAuthor__ctl8_HyperArticle" href="http://kb.csdn.net/java/Articles/200601/c3ad72bb-fd37-4e3a-81b6-49b62b75b9ff.html">Struts+Hibernate数据表示</a>
								</li>
								<li>
										<a id="RepAuthor__ctl9_HyperArticle" href="http://kb.csdn.net/java/Articles/200506/b9c2b770-f066-48c1-a2eb-e2e4973c546f.html">Struts+Hibernate谈J2EE的数据表示</a>
								</li>
						</ul>
				</dd>
				<dd class="More">
						<a id="HyperMore" href="http://kb.csdn.net/java/ArticleAuthor.aspx?author=robbin">more..</a>
				</dd>
		</dl>
		<dl>
				<dt>其他相关文章 
</dt>
				<dd>
						<ul>
								<li>
										<a id="RepAbout__ctl0_HyperArticle1" href="http://kb.csdn.net/java/Articles/200601/74a28f24-a883-4b41-987f-09ac444e8043.html">JDBC+Hibernate将Blob数据写入Oracle</a>
								</li>
						</ul>
				</dd>
				<dd class="More">
						<a href="http://kb.csdn.net/" target="_blank">more...</a>
				</dd>
		</dl>
		<div id="listSideBar">
				<div id="KeywordsSideBar">
						<dl>
								<dt>搜索 
</dt>
								<dd style="PADDING-RIGHT: 1px; PADDING-LEFT: 1px; PADDING-BOTTOM: 1px; PADDING-TOP: 1px">
										<iframe style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; WIDTH: 156px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: none; HEIGHT: 22px; BORDER-BOTTOM-STYLE: none" src="http://java.csdn.net/search.htm" frameborder="0" scrolling="no">
										</iframe>
								</dd>
						</dl>
						<dl>
								<dt>本文关键字 
</dt>
								<dd>
										<ul>
												<li>技术： <span id="LblTechnic"><a href="http://kb.csdn.net/java/keyword/java/%22JDBC%22.html">"JDBC"</a><a href="http://kb.csdn.net/java/keyword/java/%22JDK%22.html">"JDK"</a><a href="http://kb.csdn.net/java/keyword/java/%22XML%22.html">"XML"</a><a href="http://kb.csdn.net/java/keyword/java/%22JAR%22.html">"JAR"</a><a href="http://kb.csdn.net/java/keyword/java/%22cache%22.html">"cache"</a><a href="http://kb.csdn.net/java/keyword/java/%22%d0%d4%c4%dc%22.html">"性能"</a><a href="http://kb.csdn.net/java/keyword/java/%22%ca%fd%be%dd%bf%e2%22.html">"数据库"</a><a href="http://kb.csdn.net/java/keyword/java/%22transaction%22.html">"transaction"</a></span></li>
												<li>产品：<span id="LblProduct"><a href="http://kb.csdn.net/java/keyword/java/%22JCS%22.html">"JCS"</a><a href="http://kb.csdn.net/java/keyword/java/%22Hibernate%22.html">"Hibernate"</a></span></li>
												<li>人物：<span id="LblPerson"></span></li>
												<li>企业：<span id="LblCompany"><a href="http://kb.csdn.net/java/keyword/java/%22Oracle%22.html">"Oracle"</a></span></li>
										</ul>
								</dd>
								<dt>热门关键字 
</dt>
								<dd>
										<script src="http://java.csdn.net/FPKeywords/MainKeywords.js" type="text/javascript">
										</script>
										<h4>技术</h4>
										<ul style="LIST-STYLE-TYPE: none">
												<li>  <a href="http://kb.csdn.net/keyword/java/%e6%95%b0%e6%8d%ae%e5%ba%93.html" target="_blank">数据库</a>  <a href="http://kb.csdn.net/keyword/java/XML.html" target="_blank">XML</a>  <a href="http://kb.csdn.net/keyword/java/JSP.html" target="_blank">JSP</a>  <a href="http://kb.csdn.net/keyword/java/%e6%a8%a1%e5%bc%8f.html" target="_blank">模式</a></li>
												<li>  <a href="http://kb.csdn.net/keyword/java/%e6%b5%8b%e8%af%95.html" target="_blank">测试</a>  <a href="http://kb.csdn.net/keyword/java/Servlet.html" target="_blank">Servlet</a></li>
										</ul>
										<h4>产品</h4>
										<ul style="LIST-STYLE-TYPE: none">
												<li>  <a href="http://kb.csdn.net/keyword/java/Tomcat.html" target="_blank">Tomcat</a>  <a href="http://kb.csdn.net/keyword/java/Struts.html" target="_blank">Struts</a></li>
												<li>  <a href="http://kb.csdn.net/keyword/java/WebLogic.html" target="_blank">WebLogic</a>  <a href="http://kb.csdn.net/keyword/java/Eclipse.html" target="_blank">Eclipse</a>  <a href="http://kb.csdn.net/keyword/java/Ant.html" target="_blank">Ant</a></li>
										</ul>
										<h4>企业</h4>
										<ul style="LIST-STYLE-TYPE: none">
												<li>  <a href="http://kb.csdn.net/keyword/java/SUN.html" target="_blank">SUN</a>  <a href="http://kb.csdn.net/keyword/java/Apache.html" target="_blank">Apache</a>  <a href="http://kb.csdn.net/keyword/java/IBM.html" target="_blank">IBM</a>  <a href="http://kb.csdn.net/keyword/java/Oracle.html" target="_blank">Oracle</a></li>
												<li>  <a href="http://kb.csdn.net/keyword/java/microsoft.html" target="_blank">microsoft</a></li>
										</ul>
								</dd>
						</dl>
				</div>
				<dl>
						<dt>热点文章 
</dt>
						<dd>
								<ol>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl0_Hyperlink6" title="玩玩Spring之struts+hibernate+spring添删改查示例(一) " href="http://kb.csdn.net/java/Articles/200605/e91e72c4-1df5-44b6-82cb-6defd45a2919.html">玩玩Spring之struts+hibernate+spring添删改查示例(一) </a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl1_Hyperlink6" title="照虎画猫用三个星期写了个blog程序" href="http://kb.csdn.net/java/Articles/200605/d5bf5c9a-c7fe-4b77-a5b4-7e8d272a89fa.html">照虎画猫用三个星期写了个blog程序</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl2_Hyperlink6" title="用AJAX+J2EE实现一个网上会议室系统 " href="http://kb.csdn.net/java/Articles/200605/7e67cea1-ed8d-4b7e-9f57-d5caaad72fa1.html">用AJAX+J2EE实现一个网上会议室系统 </a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl3_Hyperlink6" title="JDBC2/3.0的特征点滴 " href="http://kb.csdn.net/java/Articles/200605/e89237d6-92fe-4938-865e-88c22be7d5c2.html">JDBC2/3.0的特征点滴 </a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl4_Hyperlink6" title="Rich Internet Applications with Adobe Flex 2 and Java" href="http://kb.csdn.net/java/Articles/200605/ea440ea5-0187-4738-b012-f7496bb7a9ad.html">Rich Internet Applications with Adobe Flex 2 and Java</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl5_Hyperlink6" title="使用 Java 平台管理 bean" href="http://kb.csdn.net/java/Articles/200605/87834cd2-e977-44b0-b799-21fe38a6b6c1.html">使用 Java 平台管理 bean</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl6_Hyperlink6" title="把 Java 开发环境从中文 Windows 迁移到 Ubuntu" href="http://kb.csdn.net/java/Articles/200605/168246a2-4ab7-4126-ba5b-1a2b3439c9ef.html">把 Java 开发环境从中文 Windows 迁移到 Ubuntu</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl7_Hyperlink6" title="玩玩Spring之struts+hibernate+spring添删改查示例(二) " href="http://kb.csdn.net/java/Articles/200605/eb033926-362d-436e-95b2-1bbacef02887.html">玩玩Spring之struts+hibernate+spring添删改查示例(二) </a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl8_Hyperlink6" title="XMLBeans帮助业务流程开发" href="http://kb.csdn.net/java/Articles/200605/8a3b3b26-330f-4473-b98b-d967c3b2743d.html">XMLBeans帮助业务流程开发</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl9_Hyperlink6" title="如何将.war包中的文件读取到服务器硬盘" href="http://kb.csdn.net/java/Articles/200605/73cad54f-c56b-4f56-a039-d72450f651ea.html">如何将.war包中的文件读取到服务器硬盘</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl10_Hyperlink6" title="prototype.js  dojo 中 javascript继承实现" href="http://kb.csdn.net/java/Articles/200605/4ca56280-a82b-4a16-8685-ab771c9cad91.html">prototype.js dojo 中 javascript继承实现</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl11_Hyperlink6" title="容器，Connection，事务，DAO模式（侧重JDBC分析）" href="http://kb.csdn.net/java/Articles/200605/22e60826-b5b5-4cc2-8ae2-7aa482456b4a.html">容器，Connection，事务，DAO模式（侧重JDBC分析）</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl12_Hyperlink6" title="[原创]提供两个Ajax综合范例下载" href="http://kb.csdn.net/java/Articles/200605/8b52bf9b-38b3-4592-bb3b-9c086d5a12bf.html">[原创]提供两个Ajax综合范例下载</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl13_Hyperlink6" title="玩玩Spring之hibernate+ webwork+ spring添删改查示例 " href="http://kb.csdn.net/java/Articles/200605/25ab7bf5-cbb9-46dd-94d4-3806738b9a4d.html">玩玩Spring之hibernate+ webwork+ spring添删改查示例 </a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLHot__ctl14_Hyperlink6" title="select下拉列表动态显示选择公司及部门信息——级联" href="http://kb.csdn.net/java/Articles/200605/bab6c3bb-b8f3-409f-89c9-28e886cfb7c3.html">select下拉列表动态显示选择公司及部门信息——级联</a>
														</nobr>
												</div>
										</li>
								</ol>
						</dd>
				</dl>
				<dl>
						<dt>最新文章 
</dt>
						<dd>
								<ol>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl0_Hyperlink5" title="把 Java 开发环境从中文 Windows 迁移到 Ubuntu" href="http://kb.csdn.net/java/Articles/200605/168246a2-4ab7-4126-ba5b-1a2b3439c9ef.html">把 Java 开发环境从中文 Windows 迁移到 Ubuntu</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl1_Hyperlink5" title="Ubuntu 上利用 subclipse 访问 SVN" href="http://kb.csdn.net/java/Articles/200605/636b905a-1c93-490e-837d-75fdbb880ad8.html">Ubuntu 上利用 subclipse 访问 SVN</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl2_Hyperlink5" title="一步一步破解JIRA3.6" href="http://kb.csdn.net/java/Articles/200605/7adf12e9-c612-405d-8348-9b1c721b120c.html">一步一步破解JIRA3.6</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl3_Hyperlink5" title="Ajax 之DWR发布说明（试翻译）" href="http://kb.csdn.net/java/Articles/200605/10940c89-40c0-4c81-a4c1-63784c48d864.html">Ajax 之DWR发布说明（试翻译）</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl4_Hyperlink5" title="Looking for part-time Java developer, $300 (US dollars) project" href="http://kb.csdn.net/java/Articles/200605/05c8e6cc-7034-4d0f-b332-484d9e52c1ec.html">Looking for part-time Java developer, $300 (US dollars) project</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl5_Hyperlink5" title="GeoServer 1.3.1 beta 发布（重大更新）" href="http://kb.csdn.net/java/Articles/200605/60af4787-5882-420e-8f4b-86fdbf6aab43.html">GeoServer 1.3.1 beta 发布（重大更新）</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl6_Hyperlink5" title="select下拉列表动态显示选择公司及部门信息——级联" href="http://kb.csdn.net/java/Articles/200605/bab6c3bb-b8f3-409f-89c9-28e886cfb7c3.html">select下拉列表动态显示选择公司及部门信息——级联</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl7_Hyperlink5" title="用AJAX+J2EE实现一个网上会议室系统 " href="http://kb.csdn.net/java/Articles/200605/7e67cea1-ed8d-4b7e-9f57-d5caaad72fa1.html">用AJAX+J2EE实现一个网上会议室系统 </a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl8_Hyperlink5" title="关于用SVNWebClient提交中文文件名出错的问题" href="http://kb.csdn.net/java/Articles/200605/516a84fa-cf56-4fda-bbc3-7e5733684143.html">关于用SVNWebClient提交中文文件名出错的问题</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl9_Hyperlink5" title="EMF编程使用" href="http://kb.csdn.net/java/Articles/200605/40a4090d-2cff-4c7d-8fd4-f88e61673872.html">EMF编程使用</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl10_Hyperlink5" title="10秒为任意数据库增加执行日志功能:JDBMonitor全攻略" href="http://kb.csdn.net/java/Articles/200605/67cb7a8c-c286-4a0b-8acd-1359018c5d02.html">10秒为任意数据库增加执行日志功能:JDBMonitor全攻略</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl11_Hyperlink5" title="Java EE 5 Specification Approved by the JCP in Perfect Time for JavaOne" href="http://kb.csdn.net/java/Articles/200605/88dce2eb-67f1-4f33-a43c-08bccd82e04e.html">Java EE 5 Specification Approved by the JCP in Perfect Time for JavaOne</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl12_Hyperlink5" title="Checked Exception VS UnChecked Excetion (续)" href="http://kb.csdn.net/java/Articles/200605/af4b4577-5af8-4d75-b0d1-21b6b95af5f8.html">Checked Exception VS UnChecked Excetion (续)</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl13_Hyperlink5" title="我眼中的OO特点" href="http://kb.csdn.net/java/Articles/200605/83330462-681e-47e8-97b5-1bba405db8ae.html">我眼中的OO特点</a>
														</nobr>
												</div>
										</li>
										<li>
												<div class="newsTitle">
														<nobr>
																<a id="DLNew__ctl14_Hyperlink5" title="自娱自乐的代码" href="http://kb.csdn.net/java/Articles/200605/76df1d41-661d-46b1-94b2-299c0e2e8439.html">自娱自乐的代码</a>
														</nobr>
												</div>
										</li>
								</ol>
						</dd>
				</dl>
		</div>
<img src ="http://www.blogjava.net/ioriqw/aggbug/46451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-05-16 17:57 <a href="http://www.blogjava.net/ioriqw/articles/46451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MD5加密算法</title><link>http://www.blogjava.net/ioriqw/articles/46398.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Tue, 16 May 2006 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/46398.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/46398.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/46398.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/46398.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/46398.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Arial" size="2">介绍MD5加密算法基本情况MD5的全称是Message-Digest Algorithm 5，在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明，经MD2、MD3和MD4发展而来。<br />Message-Digest泛指字节串(Message)的Hash变换，就是把一个任意长度的字节串变换成一定长的大整数。请注意我使用了"字节串"而不是"字符串"这个词，是因为这种变换只与字节的值有关，与字符集或编码方式无关。 </font>
		</p>
		<p>
				<font face="Arial" size="2">MD5将任意长度的"字节串"变换成一个128bit的大整数，并且它是一个不可逆的字符串变换算法，换句话说就是，即使你看到源程序和算法描述，也无法将一个MD5的值变换回原始的字符串，从数学原理上说，是因为原始的字符串有无穷多个，这有点象不存在反函数的数学函数。</font>
		</p>
		<p>
				<font face="Arial" size="2">MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹)，以防止被"篡改"。举个例子，你将一段话写在一个叫readme.txt文件中，并对这个readme.txt产生一个MD5的值并记录在案，然后你可以传播这个文件给别人，别人如果修改了文件中的任何内容，你对这个文件重新计算MD5时就会发现。如果再有一个第三方的认证机构，用MD5还可以防止文件作者的"抵赖"，这就是所谓的数字签名应用。</font>
		</p>
		<p>
				<font face="Arial" size="2">MD5还广泛用于加密和解密技术上，在很多操作系统中，用户的密码是以MD5值（或类似的其它算法）的方式保存的，用户Login的时候，系统是把用户输入的密码计算成MD5值，然后再去和系统中保存的MD5值进行比较，而系统并不"知道"用户的密码是什么。</font>
		</p>
		<p>
				<font face="Arial" size="2">一些黑客破获这种密码的方法是一种被称为"跑字典"的方法。有两种方法得到字典，一种是日常搜集的用做密码的字符串表，另一种是用排列组合方法生成的，先用MD5程序计算出这些字典项的MD5值，然后再用目标的MD5值在这个字典中检索。</font>
		</p>
		<p>
				<font face="Arial" size="2">即使假设密码的最大长度为8，同时密码只能是字母和数字，共26+26+10=62个字符，排列组合出的字典的项数则是P(62,1)+P(62,2)....+P(62,8)，那也已经是一个很天文的数字了，存储这个字典就需要TB级的磁盘组，而且这种方法还有一个前提，就是能获得目标账户的密码MD5值的情况下才可以。</font>
		</p>
		<p>
				<font face="Arial" size="2">在很多电子商务和社区应用中，管理用户的Account是一种最常用的基本功能，尽管很多Application Server提供了这些基本组件，但很多应用开发者为了管理的更大的灵活性还是喜欢采用关系数据库来管理用户，懒惰的做法是用户的密码往往使用明文或简单的变换后直接保存在数据库中，因此这些用户的密码对软件开发者或系统管理员来说可以说毫无保密可言，本文的目的是介绍MD5的Java Bean的实现，同时给出用MD5来处理用户的Account密码的例子，这种方法使得管理员和程序设计者都无法看到用户的密码，尽管他们可以初始化它们。但重要的一点是对于用户密码设置习惯的保护</font>
		</p>
		<p>
				<font face="Arial" size="2">MD加密算法的JAVA描述为：</font>
		</p>
		<p>
				<font face="Arial" size="2">import java.security.*; <br />import java.security.spec.*;  </font>
		</p>
		<p>
				<font face="Arial" size="2">
				</font> </p>
		<p>
				<font face="Arial" size="2">class Md5{<br />public final static String MD5(String s){ <br />char hexDigits[] = { <br />'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; <br />try { <br />byte[] strTemp = s.getBytes(); <br />MessageDigest mdTemp = MessageDigest.getInstance("MD5"); <br />mdTemp.update(strTemp); <br />byte[] md = mdTemp.digest(); <br />int j = md.length; <br />char str[] = new char[j * 2]; <br />int k = 0; <br />for (int i = 0; i &lt; j; i++) { <br />byte byte0 = md[i]; <br />str[k++] = hexDigits[byte0 &gt;&gt;&gt; 4 &amp; 0xf]; <br />str[k++] = hexDigits[byte0 &amp; 0xf]; <br />} <br />return new String(str); <br />} <br />catch (Exception e){ <br />return null; <br />} <br />} <br />public static void main(String[] args){ <br />System.out.print(MD5.Md5("XX")); <br />}</font>
		</p>
<img src ="http://www.blogjava.net/ioriqw/aggbug/46398.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-05-16 14:29 <a href="http://www.blogjava.net/ioriqw/articles/46398.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWT-Designer4.2.0注册码</title><link>http://www.blogjava.net/ioriqw/articles/44079.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Sat, 29 Apr 2006 12:47:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/44079.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/44079.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/44079.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/44079.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/44079.html</trackback:ping><description><![CDATA[
		<strong>
				<br />
		</strong>
		<font face="Arial" size="2">注册码: <br />SN:WindowBuilderPro-H5AB8-4J5D5-64P34<br />AK:WindowBuilderPro-1F3HF-FM0QY-74X53</font>
<img src ="http://www.blogjava.net/ioriqw/aggbug/44079.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-29 20:47 <a href="http://www.blogjava.net/ioriqw/articles/44079.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无堵塞代理服务器-使用channle双通道技术</title><link>http://www.blogjava.net/ioriqw/articles/43743.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Fri, 28 Apr 2006 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/43743.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/43743.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/43743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/43743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/43743.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Arial" color="#808080" size="2">public class ProxyServer<br />{</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    private static final int PORT = 9999;</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    private ByteBuffer buffer = ByteBuffer.allocate(10240);</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    private ProxyUtil proxyUtil = new ProxyUtil();</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    private static String remoteHost = "";</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    private static int remotePort = 80;</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    private Logger log = ZXLogger.getLogger(ProxyServer.class.getName());</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    //private Log log = LogFactory.getLog(ProxyServer.class);</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    public ProxyServer()<br />    {<br />        //PropertyConfigurator.configure("src/log4j.properties");<br />    }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    /**<br />     * 方法名称：start &lt;p&gt;<br />     * 方法功能：运行代理服务器 &lt;p&gt;<br />     * 参数说明：&lt;p&gt;<br />     * 返回：void &lt;p&gt;<br />     * 作者：李明 &lt;p&gt;<br />     * 日期：2006年3月23日 &lt;p&gt;<br />     */<br />    public void runServer()<br />    {</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">        ServerSocket sSocket = null;<br />        ServerSocketChannel ssc = null;</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">        // 代理服务器监听开启</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">        Selector selector = null;<br />        try<br />        {<br />            ssc = ServerSocketChannel.open();<br />            sSocket = ssc.socket();<br />            sSocket.bind(new InetSocketAddress(PORT));</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">            selector = Selector.open();</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">            System.err.println("Listening Port is " + PORT);</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">            ssc.configureBlocking(false);<br />            ssc.register(selector, SelectionKey.OP_ACCEPT);<br />        }<br />        catch(ClosedChannelException e1)<br />        {<br />            // TODO Auto-generated catch block<br />            e1.printStackTrace();<br />        }<br />        catch(IOException e1)<br />        {<br />            // TODO Auto-generated catch block<br />            e1.printStackTrace();<br />        }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">        try<br />        {<br />            while(true)<br />            {</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                int n = selector.select();</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                if(n == 0)<br />                {<br />                    continue; // nothing to do<br />                }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                Set set = selector.selectedKeys();</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                Iterator iter = set.iterator();</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                while(iter.hasNext())<br />                {<br />                    SelectionKey key = (SelectionKey)iter.next();</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                    if(key.isAcceptable())<br />                    {<br />                        ServerSocketChannel svrSocketChannel = (ServerSocketChannel)key.channel();<br />                        SocketChannel clientChannel = null;<br />                        try<br />                        {<br />                            clientChannel = svrSocketChannel.accept();<br />                        }<br />                        catch(IOException e)<br />                        {<br />                            // TODO Auto-generated catch block<br />                            if(clientChannel != null)<br />                            {</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                                clientChannel.close();<br />                            }<br />                            if(key != null)<br />                            {<br />                                key.cancel();<br />                            }<br />                        }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                        send(clientChannel);</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                    }<br />                    iter.remove();<br />                    log.info("************SEND  END*************");<br />                }<br />            }<br />        }<br />        catch(IOException e)<br />        {<br />            // TODO Auto-generated catch block<br />            log.info("ServerSocketChannel总体迭代发生核心异常\r\n" + e.getMessage());<br />            e.printStackTrace();<br />        }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    /**<br />     * 方法名称：send &lt;p&gt;<br />     * 方法功能：发送给客户信息 &lt;p&gt;<br />     * 参数说明：SocketChannel, String &lt;p&gt;<br />     * 返回：void &lt;p&gt;<br />     * 作者：李明 &lt;p&gt;<br />     * 日期：2006年3月23日 &lt;p&gt;<br />     *<br />     * @param channel<br />     * @param key<br />     * @throws IOException<br />     */<br />    public void send(SocketChannel clientChannel)<br />    {</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">        SocketChannel remoteSvrChannel = null;</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">        buffer.clear();<br />        int count;</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">        log.info("************SEND START*************");</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">        try<br />        {<br />            while((count = clientChannel.read(buffer)) &gt; 0)<br />            {<br />                buffer.flip();</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                byte[] bytebuffer = new byte[count];<br />                buffer.get(bytebuffer, 0, count);</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                ByteBuffer bufferWrite = ByteBuffer.wrap(bytebuffer);</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                byte[] b = new byte[bufferWrite.limit()];<br />                bufferWrite.get(b);<br />                String context = new String(b);</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                // 打印客户请求代理服务器信息<br />                log.info(context);</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                // 解析客户信息，得到远程主机和端口。<br />                proxyUtil.setUrl(context);<br />                setRemoteHost(proxyUtil.getHost());<br />                setRemotePort(proxyUtil.getPort());</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                log.info("Remote Host " + getRemoteHost());<br />                log.info("Remote Port " + getRemotePort());</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                if(remoteSvrChannel == null)<br />                {<br />                    InetSocketAddress inet = new InetSocketAddress(getRemoteHost(), getRemotePort());<br />                    try<br />                    {<br />                        remoteSvrChannel = SocketChannel.open(inet);<br />                        // remoteSvrChannel.configureBlocking(false);<br />                        // Socket remoteSvr = remoteSvrChannel.socket();<br />                        // remoteSvr.setSoTimeout(1000);<br />                        bufferWrite.flip();<br />                        remoteSvrChannel.write(bufferWrite);<br />                        buffer.clear();<br />                        int n;<br />                        while((n = remoteSvrChannel.read(buffer)) &gt; 0)<br />                        {<br />                            log.info("n=" + n);<br />                            buffer.flip();<br />                            log.info("buffer.limit=" + buffer.limit());<br />                            clientChannel.write(buffer);<br />                        }<br />                    }<br />                    catch(java.nio.channels.UnresolvedAddressException ex)<br />                    {<br />                        log.info("主机地址访问无效\r\n" + ex.getMessage());<br />                    }<br />                    catch(IOException e)<br />                    {<br />                        // TODO Auto-generated catch block<br />                        try<br />                        {<br />                            if(remoteSvrChannel != null)<br />                            {<br />                                remoteSvrChannel.close();<br />                            }<br />                        }<br />                        catch(IOException e1)<br />                        {<br />                            // TODO Auto-generated catch block<br />                            e1.printStackTrace();<br />                        }<br />                    }<br />                }<br />            }<br />        }<br />        catch(IOException e1)<br />        {<br />            // TODO Auto-generated catch block<br />            try<br />            {<br />                if(clientChannel != null)<br />                {<br />                    clientChannel.close();<br />                }<br />            }<br />            catch(IOException e)<br />            {<br />                // TODO Auto-generated catch block<br />                e.printStackTrace();<br />            }<br />        }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">        finally<br />        {<br />            try<br />            {<br />                if(remoteSvrChannel != null)<br />                {<br />                    remoteSvrChannel.close();<br />                }<br />                if(clientChannel != null)<br />                {<br />                    clientChannel.close();<br />                }<br />            }<br />            catch(IOException e)<br />            {<br />                // TODO Auto-generated catch block<br />                e.printStackTrace();<br />            }<br />        }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">        // 打印远程服务器返回给客户端信息<br />//        buffer.flip();<br />//        byte[] b2 = new byte[buffer.limit()];<br />//        buffer.get(b2);<br />//        log.info(new String(b2));</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">        // 关闭远程和客户的连接</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    }</font>
		</p>
		<p>
				<br />
				<font face="Arial" color="#808080" size="2">    public static String getRemoteHost()<br />    {<br />        return remoteHost;<br />    }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    public static void setRemoteHost(String remoteHost)<br />    {<br />        ProxyServer.remoteHost = remoteHost;<br />    }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    public static int getRemotePort()<br />    {<br />        return remotePort;<br />    }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    public static void setRemotePort(int remotePort)<br />    {<br />        ProxyServer.remotePort = remotePort;<br />    }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    public ByteBuffer getBuffer()<br />    {<br />        return buffer;<br />    }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    public void setBuffer(ByteBuffer buffer)<br />    {<br />        this.buffer = buffer;<br />    }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    /**<br />     * @param args<br />     */<br />    public static void main(String[] args)<br />    {<br />        // TODO Auto-generated method stub<br />        ProxyServer p = new ProxyServer();<br />        p.runServer();<br />    }<br />}</font>
		</p>
<img src ="http://www.blogjava.net/ioriqw/aggbug/43743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-28 11:26 <a href="http://www.blogjava.net/ioriqw/articles/43743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>堵塞代理服务器-未使用channel</title><link>http://www.blogjava.net/ioriqw/articles/43742.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Fri, 28 Apr 2006 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/43742.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/43742.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/43742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/43742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/43742.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Arial" color="#808080" size="2">    /**<br />     * 方法名称：runServer&lt;p&gt;<br />     * 方法功能：运行代理服务器&lt;p&gt;<br />     * 参数说明： &lt;p&gt;<br />     * 返回：void &lt;p&gt;<br />     * 作者：李明<br />     * 日期：2006年3月9日<br />     * @throws IOException<br />     */<br />    public void runServer() throws IOException<br />    {<br />        // 创建代理服务器监听,端口默认为9999(可以通过属性文档修改其他端口)<br />        ServerSocket ss = new ServerSocket(localport);<br />        final com.zte.ums.zxnm01.cpe.common.http.ProxyUtil proxyUtil = new com.zte.ums.zxnm01.cpe.common.http.ProxyUtil();<br />        final byte[] request = new byte[1024];<br />        byte[] reply = new byte[4096];</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">        while(true)<br />        {<br />            Socket client = null, server = null;<br />            try<br />            {<br />                // 等待客户连接<br />                client = ss.accept();<br />                log.info("*******Client logon*******");<br />                log.info(client);<br />                final InputStream streamFromClient = client.getInputStream();<br />                final OutputStream streamToClient = client.getOutputStream();</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                // 连接真实的服务器,如果不能连接成功,将向客户发送错误信息,断开本次连接<br />                // 并且继续等待连接.<br />                try<br />                {<br />                    server = new Socket(host, remoteport);<br />                }<br />                catch(IOException e)<br />                {<br />                    PrintWriter out = new PrintWriter(streamToClient);<br />                    out.print("Proxy server cannot connect to " + host + ":" + remoteport + ":\n" + e + "\n");<br />                    out.flush();<br />                    client.close();<br />                    continue;<br />                }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                // 得到连接服务器的输入输出流.<br />                final InputStream streamFromServer = server.getInputStream();<br />                final OutputStream streamToServer = server.getOutputStream();</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                // 构建一个单独线程读客户请求并传给服务器,此线程为异步.<br />                Thread t = new Thread()<br />                {<br />                    public void run()<br />                    {<br />                        int bytesRead;<br />                        String context = null;<br />                        try<br />                        {<br />                            while((bytesRead = streamFromClient.read(request)) != -1)<br />                            {<br />                                streamToServer.write(request, 0, bytesRead);<br />                                context = new String(request).trim();<br />                                streamToServer.flush();<br />                            }<br />                            // 打印客户浏览器发来的信息<br />                            log.info("#################S##############");<br />                            log.info(context);<br />                            log.info("#################E##############");<br />                            // 解析发来的信息,获取请求的主机地址和端口.<br />                            proxyUtil.setUrl(context);<br />                            host = proxyUtil.getHost();<br />                            remoteport = proxyUtil.getPort();<br />                            log.info("host : '" + host + "'" + " port : '" + remoteport + "'");</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                        }<br />                        catch(IOException e)<br />                        {<br />                            // e.printStackTrace();<br />                        }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                        // 关闭请求服务器连接,屏蔽无意义的异常,减少代理服务器负担.<br />                        try<br />                        {<br />                            streamToServer.close();<br />                        }<br />                        catch(IOException e)<br />                        {<br />                            // e.printStackTrace();<br />                        }<br />                    }<br />                };</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                // 开启客户端到服务器请求线程<br />                t.start();</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                // 读服务器的请求,成功后返回信息给客户端.<br />                int bytesRead;<br />                try<br />                {<br />                    while((bytesRead = streamFromServer.read(reply)) != -1)<br />                    {<br />                        streamToClient.write(reply, 0, bytesRead);<br />                        streamToClient.flush();<br />                    }<br />                }<br />                catch(IOException e)<br />                {<br />                    // e.printStackTrace();<br />                }</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">                // 关闭客户连接.<br />                streamToClient.close();<br />            }<br />            catch(IOException e)<br />            {<br />                System.err.println(e);<br />            }<br />            finally<br />            {<br />                try<br />                {<br />                    if(server != null)<br />                    {<br />                        server.close();<br />                    }<br />                    if(client != null)<br />                    {<br />                        client.close();<br />                    }<br />                }<br />                catch(IOException e)<br />                {<br />                    e.printStackTrace();<br />                }<br />            }<br />        }<br />    }</font>
		</p>
<img src ="http://www.blogjava.net/ioriqw/aggbug/43742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-28 11:24 <a href="http://www.blogjava.net/ioriqw/articles/43742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SWT技巧荟萃1-设置居中</title><link>http://www.blogjava.net/ioriqw/articles/43739.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Fri, 28 Apr 2006 03:21:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/43739.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/43739.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/43739.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/43739.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/43739.html</trackback:ping><description><![CDATA[
		<font face="Arial" color="#0000ff" size="2">    /**<br />     * 方法名称：setShell&lt;p&gt;<br />     * 方法功能：设置浏览器显示居中和浏览器的大小,默认为800*600&lt;p&gt;<br />     * 参数说明：Shell&lt;p&gt;<br />     * 返回：&lt;p&gt;<br />     * 作者：李明<br />     * 日期：2006年3月10日<br />     */<br />    public void setShell(Shell shell)<br />    {<br />        shell.setSize(800, 600);<br />        int width = shell.getMonitor().getClientArea().width;<br />        int height = shell.getMonitor().getClientArea().height;<br />        int x = shell.getSize().x;<br />        int y = shell.getSize().y;<br />        if(x &gt; width)<br />        {<br />            shell.getSize().x = width;<br />        }<br />        if(y &gt; height)<br />        {<br />            shell.getSize().y = height;<br />        }<br />        shell.setLocation((width - x) / 2, (height - y) / 2);<br />    }</font>
<img src ="http://www.blogjava.net/ioriqw/aggbug/43739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-28 11:21 <a href="http://www.blogjava.net/ioriqw/articles/43739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自动登录请求页面</title><link>http://www.blogjava.net/ioriqw/articles/43738.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Fri, 28 Apr 2006 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/43738.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/43738.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/43738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/43738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/43738.html</trackback:ping><description><![CDATA[
		<p>
				<font face="Arial" color="#808080" size="2">    /**<br />     * 方法名称：getPostPage&lt;p&gt;<br />     * 方法功能：自动登录请求页面&lt;p&gt;<br />     * 参数说明：登陆主机的ip地址, 端口号&lt;p&gt;<br />     * 返回：&lt;p&gt;<br />     * 作者：李明<br />     * 日期：2006年3月13日<br />     */<br />    public void getPostPage(String host, int port)<br />    {<br />        HttpClient httpClient = new HttpClient();<br />        httpClient.getHostConfiguration().setHost(host, port);<br />        // 创建POST方法的实例<br />        PostMethod postMethod = new PostMethod(url);<br />        // 使用系统提供的默认的恢复策略<br />        postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());<br />        // 填入各个表单域的值<br />        NameValuePair[] data =<br />            {new NameValuePair("tUsername", "admin"), new NameValuePair("tPassword", "admin")};<br />        // 将表单的值放入postMethod中<br />        postMethod.setRequestBody(data);<br />        try<br />        {<br />            // 执行postMethod<br />            int statusCode = httpClient.executeMethod(postMethod);<br />            System.out.println("statusCode " + statusCode);<br />            // HttpClient对于要求接受后继服务的请求，象POST和PUT等不能自动处理转发<br />            // 301或者302<br />            if(statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_MOVED_TEMPORARILY)<br />            {<br />                // 从头中取出转向的地址<br />                Header locationHeader = postMethod.getResponseHeader("location");<br />                String location = null;<br />                if(locationHeader != null)<br />                {<br />                    location = locationHeader.getValue();<br />                    System.out.println("The page was redirected to:" + location);<br />                }<br />                else<br />                {<br />                    System.err.println("Location field value is null.");<br />                }<br />                return;<br />            }<br />            if(statusCode != HttpStatus.SC_OK)<br />            {<br />                System.err.println("Method failed: " + postMethod.getStatusLine());<br />            }<br />            System.out.println(statusCode);<br />            /*<br />             * //如果所请求的页面已设定cookie那么无需返回内容，可直接使用url访问登陆成功页面。<br />             * // 读取内容<br />             *  byte[] responseBody = postMethod.getResponseBody();<br />             * // 处理内容<br />             *  System.out.println(new String(responseBody));<br />             */<br />        }<br />        catch(HttpException e)<br />        {<br />            // 发生致命的异常，可能是协议不对或者返回的内容有问题<br />            System.out.println("Please check your provided http address!");<br />            e.printStackTrace();<br />        }<br />        catch(IOException e)<br />        {<br />            // 发生网络异常<br />            e.printStackTrace();<br />        }<br />        finally<br />        {<br />            // 释放连接<br />            postMethod.releaseConnection();<br />        }<br />    }<br /><br />    /**<br />     * 方法名称：getPostPage163&lt;p&gt;<br />     * 方法功能：返回163信箱自动登陆页面&lt;p&gt;<br />     * 参数说明：163邮箱用户名和密码&lt;p&gt;<br />     * 返回：String 登陆成功后的页面&lt;p&gt;<br />     * 作者：李明<br />     * 日期：2006年3月13日<br />     */<br />    public static String getPostPage163(String userid, String passid)<br />    {<br />        HttpClient httpClient = new HttpClient();<br />        httpClient.getHostConfiguration().setProxy("proxynj.zte.com.cn", 80);<br />        String url = "<a href="http://reg.163.com/CheckUser.jsp">http://reg.163.com/CheckUser.jsp</a>";<br />        String buff = null;<br />        // 创建POST方法的实例<br />        PostMethod postMethod = new PostMethod(url);<br />        // 使用系统提供的默认的恢复策略<br />        postMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());<br />        // 填入各个表单域的值<br />        NameValuePair[] data =<br />            {new NameValuePair("username", userid), new NameValuePair("password", passid)};<br />        // 将表单的值放入postMethod中<br />        postMethod.setRequestBody(data);<br />        try<br />        {<br />            // 执行postMethod<br />            int statusCode = httpClient.executeMethod(postMethod);<br />            // HttpClient对于要求接受后继服务的请求，象POST和PUT等不能自动处理转发<br />            // 301或者302<br />            if(statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_MOVED_TEMPORARILY)<br />            {<br />                // 从头中取出转向的地址<br />                Header locationHeader = postMethod.getResponseHeader("location");<br />                String location = null;<br />                if(locationHeader != null)<br />                {<br />                    location = locationHeader.getValue();<br />                    System.out.println("The page was redirected to:" + location);<br />                }<br />                else<br />                {<br />                    System.err.println("Location field value is null.");<br />                }<br />                return null;<br />            }<br />            if(statusCode != HttpStatus.SC_OK)<br />            {<br />                System.err.println("Method failed: " + postMethod.getStatusLine());<br />            }<br />            // 读取内容<br />            byte[] responseBody = postMethod.getResponseBody();<br />            // 处理内容<br />            System.out.println(new String(responseBody));<br />            String redirect = new String(responseBody);</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">            System.out.println(redirect.lastIndexOf("&gt;&lt;/HEAD&gt;"));<br />            System.out.println(redirect.substring(redirect.indexOf("URL") + 4, redirect.lastIndexOf("&gt;&lt;/HEAD&gt;") - 1));<br />            redirect = redirect.substring(redirect.indexOf("URL") + 4, redirect.lastIndexOf("&gt;&lt;/HEAD&gt;") - 1);<br />            GetMethod getMethod = new GetMethod("<a href="http://reg.163.com/">http://reg.163.com/</a>" + redirect);<br />            httpClient.executeMethod(getMethod);<br />            buff = getMethod.getResponseBodyAsString();<br />        }<br />        catch(HttpException e)<br />        {<br />            // 发生致命的异常，可能是协议不对或者返回的内容有问题<br />            System.out.println("Please check your provided http address!");<br />            e.printStackTrace();<br />        }<br />        catch(IOException e)<br />        {<br />            // 发生网络异常<br />            e.printStackTrace();<br />        }<br />        finally<br />        {<br />            // 释放连接<br />            postMethod.releaseConnection();<br />        }<br />        return buff;</font>
		</p>
		<p>
				<font face="Arial" color="#808080" size="2">    }</font>
		</p>
<img src ="http://www.blogjava.net/ioriqw/aggbug/43738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-28 11:19 <a href="http://www.blogjava.net/ioriqw/articles/43738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate应用配置说明-middlegen和hbm2java的配置 </title><link>http://www.blogjava.net/ioriqw/articles/43491.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Thu, 27 Apr 2006 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/43491.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/43491.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/43491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/43491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/43491.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<a href="http://blog.csdn.net/whoopee/archive/2006/04/26/678615.aspx">
						<font face="Arial" size="2">
								<img height="13" src="http://blog.csdn.net/images/zhuan.gif" width="15" border="0" /> hibernate应用配置说明-middlegen和hbm2java的配置</font>
				</a>
				<script language="javascript"><![CDATA[ocument.title="hibernate应用配置说明-middlegen和hbm2java的配置 - "+document.title]]&gt;</script>
				<font face="Arial" size="2">
				</font>
		</div>
		<div class="postText">
				<font face="Arial" size="2">--  hibernate应用配置说明 -- Middlegen<br />************************************<br />ant配置<br />************************************<br />下载ant，解压<br />将ant考到c:跟目录<br />环境变量里加上ANT_HOME=c:\\ant<br />PATH=c:\\ant\\bin;<br />进入命令行模式，输入： ant<br />如：<br />C:\\&gt;ant<br />Buildfile: build.xml does not exist!<br />Build failed<br />出现该显示，说明ant已配置成功<br /><br />************************************<br />Middlegen hibernate配置<br />************************************<br />是hibernate的O/R Mapping工具<br /></font>
				<a href="http://hibernate.bluemars.net/98.html" target="_blank">
						<font face="Arial" color="#004080" size="2">http://hibernate.bluemars.net/98.html</font>
				</a>
				<br />
				<font face="Arial" size="2">可以生成*.hbm.xml文件，是hibernate所需的映射文件<br />下载Middlegen Hibernate，解压，如D:\\hiber\\Middlegen-Hibernate-r1\\<br />进入目录，<br />【配置数据库，以MS SQLSERVER为例，JDBC驱动为JSQL Connect（www.j-netdirect.com）】<br />1、进入/config/database/目录<br />2、将JSQLConnect.jar驱动考到/lib/目录<br />3、编辑mssql.xml文件，如下<br />&lt;property name="database.script.file" value=""/&gt;<br />&lt;property name="database.driver.file" value="${lib.dir}/JSQLConnect.jar"/&gt;<br />&lt;property name="database.driver" value="com.jnetdirect.jsql.JSQLDriver"/&gt;<br />&lt;property name="database.url" value="jdbc:JSQLConnect://数据库服务器名或IP/database=要操作的数据库名"/&gt;<br />&lt;property name="database.userid" value="数据库用户名"/&gt;<br />&lt;property name="database.password" value="数据库密码"/&gt;<br />&lt;property name="database.schema" value=""/&gt;<br />&lt;property name="database.catalog" value=""/&gt;<br />&lt;property name="jboss.datasource.mapping" value="MS SQLSERVER2000"/&gt;<br /><br />【编辑Middlegen hibernate配置】<br />1、编辑build.xml<br />2、修改数据库默认文件，找到这行，大概在22行左右<br />&lt;!DOCTYPE project [<br />&lt;!--ENTITY database SYSTEM "file:./config/database/hsqldb.xml"--&gt;//原内容，注解掉<br />&lt;!ENTITY database SYSTEM "file:./config/database/mssql.xml"&gt;//加上<br />]&gt;<br /><br />3、编辑输出的根目录名，找到该行，大概在30行左右<br />&lt;!--property name="name" value="airline"/--&gt;//原内容，注解掉<br />&lt;property name="name" value="com"/&gt;//加上,value为你想要的，如com<br /><br />4、编辑输出的包名，找到该行，大概在210行左右<br />&lt;!--hibernate<br />destination="${build.gen-src.dir}"<br />package="${name}.hibernate"<br />/--&gt;//原内容，注解掉<br />&lt;hibernate<br />destination="${build.gen-src.dir}"<br />package="${name}.test"<br />/&gt;//加上，生成的xml文件里，会以com.test作为你的package<br />输出目录为/build/gen-src/com/test/*.hbm.xml（*为对应的表，命名为你自己所定义的名称）<br /><br />5、定义输出的目录，找到该行，在文档最后<br />&lt;target name="validate"&gt;<br />&lt;xmlvalidate failonerror="no" lenient="no" warn="yes"&gt;<br />   &lt;fileset dir="${build.gen-src.dir}/com/test" includes="*.xml" /&gt;改成你要输出的目录结构，最好以你的包的结构作为目录结构<br />&lt;/xmlvalidate&gt;<br />&lt;/target&gt;<br /><br />6、在连接Sql server时，提示数据库连接成功，但说没有表，找到该行<br />&lt;middlegen<br />appname="${name}"<br />prefsdir="${src.dir}"<br />gui="${gui}"<br />databaseurl="${database.url}"<br />initialContextFactory="${java.naming.factory.initial}"<br />providerURL="${java.naming.provider.url}"<br />datasourceJNDIName="${datasource.jndi.name}"<br />driver="${database.driver}"<br />username="${database.userid}"<br />password="${database.password}"<br /><br />schema="${database.schema}"//去掉<br />catalog="${database.catalog}" //去掉，这样就可以了<br />&gt;<br /><br />【配置完毕】<br />配置完毕后，在根目录下运行ant<br />则会出现一个可视化的操作界面，如图<br />默认会根据表名和字段名对应生成相应的名称，当然你也可以自己定义，对应没问题，则可以点击【Generate】，在可发现<br />/build/gen-src/com/test/*.hbm.xml，会生成相应XML文件<br /><br />************************************<br />hibernate-extensions-2.0应用配置<br />************************************<br />这是hibernate的工具,/tools下有3个工具<br />class2hbm.bat 根据你自己对应表所写的java文件，生成相应的*.hbm.xml文件<br />ddl2hbm.bat 根据你的数据库表，自动生成*.hbm.xml和*.java文件（如果不需要详细的配置，建议用这种方式生成*.xml和*.java文件）<br />hbm2java.bat 根据*.hbm.xml生成相应的*.java文件<br /><br />用之前，首先得用ant编译<br />【注意的地方】<br />build.xml<br />&lt;property name="hibernate-core.home" value="../../hibernate-2.0"/&gt;//找到该行，40行左右<br />value为你得hibernate解压目录<br /><br />【编译完毕】<br />编译完的文件存放在/tools/target/hibernate-tools-2.0/<br />现在可以用编译完的执行文件进行映射转化了<br /><br />【应用】<br />hbm2java.bat<br />1、进入命令行模式，进入hibernate-tools-2.0目录，进入/bin<br />2、首先执行setenv.bat，设置一下环境变量，运行前，先检查一下setenv.bat文件，用文本编辑器打开，找到如下行：<br />set JDBC_DRIVER=C:\\Progra~1\\SQLLIB\\java\\db2java.zip;C:\\mm.mysql-2.0.14\\mm.mysql-2.0.14-bin.jar;D:\\j2sdk1.4.1\\lib\\JSQLConnect.jar<br />//将你的JDBC驱动添加进去<br />rem set HIBERNATE_HOME=..\\..\\hibernate-2.0//原来的<br />set HIBERNATE_HOME=D:\\hiber\\hibernate-2.0//改成你当前hibernate-2.0所在目录<br />3、执行hbm2java.bat D:\\hiber\\com\\test\\*.xml //后面所跟的是你用Middlegen Hibernate所生成的*.hbm.xml文件<br /><br />ddl2hbm.bat<br />1、2步骤如hbm2java<br />3、运行ddl2hbm，会弹开一个图形界面<br />4、在Connection面板里，输入JDBC驱动的相关信息，如：<br />DriverClass：com.jnetdirect.jsql.JSQLDriver<br />ConnectionUrl：jdbc:JSQLConnect://服务器名/database=数据库名&amp;user=用户名&amp;password=密码（注意这是我所用的驱动支持将用户名和密码放在后面这种格式）<br />UserName：用户名（我的ConnectionUrl已填写该信息，这里可不填）<br />PassWord：密码（我的ConnectionUrl已填写该信息，这里可不填）<br />5、在Code面板里，可以定义包名<br />6、在Output面板里，可以定义文件输出路径<br />7、设置好后，进入Table面板，点击tables…按钮，如果数据库连接成功，则会弹开一个小面板，选择你要映射的数据库，点击确定即可，此时<br />Table面板里就会显示该数据库的所有表格，选择你需要的表，点击“Generate”，则在输出路径里生成*.hbm.xml和*.java文件<br /><br />【注意的地方】<br />因为Sqlserver不支持hibernate里的sequences类型，在测试代码时会出错，你打开生成的*.hbm.xml<br />将<br />&lt;id column="test_id" name="id" type="java.lang.Long"&gt;<br />&lt;generator class="identity"/&gt;//这里改成identity即可<br />&lt;/id&gt;<br /><br /></font>
				<p id="TBPingURL">
						<font face="Arial" size="2">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=678615</font>
				</p>
		</div>
<img src ="http://www.blogjava.net/ioriqw/aggbug/43491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-27 10:27 <a href="http://www.blogjava.net/ioriqw/articles/43491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的内存泄漏</title><link>http://www.blogjava.net/ioriqw/articles/43485.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Thu, 27 Apr 2006 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/43485.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/43485.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/43485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/43485.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/43485.html</trackback:ping><description><![CDATA[
		<div background-color:#c0c0c0="">
				<a href="http://blog.csdn.net/psyl/archive/2006/04/26/678260.aspx">
						<font size="2">
								<font face="Arial">
										<img height="13" src="http://blog.csdn.net/images/zhuan.gif" width="15" border="0" /> Java的内存泄漏</font>
						</font>
				</a>
				<script language="javascript"><![CDATA[ocument.title="Java的内存泄漏 - "+document.title]]&gt;</script>
				<font face="Arial">
				</font>
		</div>
		<div class="postText">
				<font face="Arial" size="2">出自：ibm:developerworks中国网站 欧阳辰周欣 <br />一 问题的提出<br /><br />Java的一个重要优点就是通过垃圾收集器(Garbage Collection，GC)自动管理内存的回收，程序员不需要通过调用函数来释放内存。因此，很多程序员认为Java不存在内存泄漏问题，或者认为即使有内存泄漏也不是程序的责任，而是GC或JVM的问题。其实，这种想法是不正确的，因为Java也存在内存泄露，但它的表现与C++不同。<br /><br />随着越来越多的服务器程序采用Java技术，例如JSP，Servlet， EJB等，服务器程序往往长期运行。另外，在很多嵌入式系统中，内存的总量非常有限。内存泄露问题也就变得十分关键，即使每次运行少量泄漏，长期运行之后，系统也是面临崩溃的危险。<br /><br />二 Java是如何管理内存<br /><br />为了判断Java中是否有内存泄露，我们首先必须了解Java是如何管理内存的。Java的内存管理就是对象的分配和释放问题。在Java中，程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外)，所有的对象都在堆 (Heap)中分配空间。另外，对象的释放是由GC决定和执行的。在Java中，内存的分配是由程序完成的，而内存的释放是有GC完成的，这种收支两条线的方法确实简化了程序员的工作。但同时，它也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。因为，GC为了能够正确释放对象，GC必须监控每一个对象的运行状态，包括对象的申请、引用、被引用、赋值等，GC都需要进行监控。<br /><br />监视对象状态是为了更加准确地、及时地释放对象，而释放对象的根本原则就是该对象不再被引用。<br /><br />为了更好理解GC的工作原理，我们可以将对象考虑为有向图的顶点，将引用关系考虑为图的有向边，有向边从引用者指向被引对象。另外，每个线程对象可以作为一个图的起始顶点，例如大多程序从main进程开始执行，那么该图就是以main进程顶点开始的一棵根树。在这个有向图中，根顶点可达的对象都是有效对象，GC将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意，该图为有向图)，那么我们认为这个(这些)对象不再被引用，可以被GC回收。<br /><br />以下，我们举一个例子说明如何用有向图表示内存管理。对于程序的每一个时刻，我们都有一个有向图表示JVM的内存分配情况。以下右图，就是左边程序运行到第6行的示意图。<br /><br /><br />Java使用有向图的方式进行内存管理，可以消除引用循环的问题，例如有三个对象，相互引用，只要它们和根进程不可达的，那么GC也是可以回收它们的。这种方式的优点是管理内存的精度很高，但是效率较低。另外一种常用的内存管理技术是使用计数器，例如COM模型采用计数器方式管理构件，它与有向图相比，精度行低(很难处理循环引用的问题)，但执行效率很高。<br /><br />三 什么是Java中的内存泄露<br /><br />下面，我们就可以描述什么是内存泄漏。在Java中，内存泄漏就是存在一些被分配的对象，这些对象有下面两个特点，首先，这些对象是可达的，即在有向图中，存在通路可以与其相连；其次，这些对象是无用的，即程序以后不会再使用这些对象。如果对象满足这两个条件，这些对象就可以判定为Java中的内存泄漏，这些对象不会被GC所回收，然而它却占用内存。<br /><br />在C++中，内存泄漏的范围更大一些。有些对象被分配了内存空间，然后却不可达，由于C++中没有GC，这些内存将永远收不回来。在Java中，这些不可达的对象都由GC负责回收，因此程序员不需要考虑这部分的内存泄露。<br /><br />通过分析，我们得知，对于C++，程序员需要自己管理边和顶点，而对于Java程序员只需要管理边就可以了(不需要管理顶点的释放)。通过这种方式，Java提高了编程的效率。<br /><br />因此，通过以上分析，我们知道在Java中也有内存泄漏，但范围比C++要小一些。因为Java从语言上保证，任何对象都是可达的，所有的不可达对象都由GC管理。<br /><br />对于程序员来说，GC基本是透明的，不可见的。虽然，我们只有几个函数可以访问GC，例如运行GC的函数System.gc()，但是根据Java语言规范定义， 该函数不保证JVM的垃圾收集器一定会执行。因为，不同的JVM实现者可能使用不同的算法管理GC。通常，GC的线程的优先级别较低。JVM调用GC的策略也有很多种，有的是内存使用到达一定程度时，GC才开始工作，也有定时执行的，有的是平缓执行GC，有的是中断式执行GC。但通常来说，我们不需要关心这些。除非在一些特定的场合，GC的执行影响应用程序的性能，例如对于基于Web的实时系统，如网络游戏等，用户不希望GC突然中断应用程序执行而进行垃圾回收，那么我们需要调整GC的参数，让GC能够通过平缓的方式释放内存，例如将垃圾回收分解为一系列的小步骤执行，Sun提供的HotSpot JVM就支持这一特性。<br /><br />下面给出了一个简单的内存泄露的例子。在这个例子中，我们循环申请Object对象，并将所申请的对象放入一个Vector中，如果我们仅仅释放引用本身，那么Vector仍然引用该对象，所以这个对象对GC来说是不可回收的。因此，如果对象加入到Vector后，还必须从Vector中删除，最简单的方法就是将Vector对象设置为null。<br /><br />Vector v=new Vector(10);<br />for (int i=1;i&lt;100; i++)<br />{<br />Object o=new Object();<br />v.add(o);<br />o=null;<br />}<br />//此时，所有的Object对象都没有被释放，因为变量v引用这些对象。<br /><br />四 如何检测内存泄漏<br /><br />最后一个重要的问题，就是如何检测Java的内存泄漏。目前，我们通常使用一些工具来检查Java程序的内存泄漏问题。市场上已有几种专业检查Java内存泄漏的工具，它们的基本工作原理大同小异，都是通过监测Java程序运行时，所有对象的申请、释放等动作，将内存管理的所有信息进行统计、分析、可视化。开发人员将根据这些信息判断程序是否有内存泄漏问题。这些工具包括Optimizeit Profiler，JProbe Profiler，JinSight , Rational 公司的Purify等。<br /><br />下面，我们将简单介绍Optimizeit的基本功能和工作原理。<br /><br />Optimizeit Profiler版本4.11支持Application，Applet，Servlet和Romote Application四类应用，并且可以支持大多数类型的JVM，包括SUN JDK系列，IBM的JDK系列，和Jbuilder的JVM等。并且，该软件是由Java编写，因此它支持多种操作系统。Optimizeit系列还包括Thread Debugger和Code Coverage两个工具，分别用于监测运行时的线程状态和代码覆盖面。<br /><br />当设置好所有的参数了，我们就可以在OptimizeIt环境下运行被测程序，在程序运行过程中，Optimizeit可以监视内存的使用曲线(如下图)，包括JVM申请的堆(heap)的大小，和实际使用的内存大小。另外，在运行过程中，我们可以随时暂停程序的运行，甚至强行调用GC，让GC进行内存回收。通过内存使用曲线，我们可以整体了解程序使用内存的情况。这种监测对于长期运行的应用程序非常有必要，也很容易发现内存泄露。<br /><br /><br />在运行过程中，我们还可以从不同视角观查内存的使用情况，Optimizeit提供了四种方式：<br /><br />堆视角。 这是一个全面的视角，我们可以了解堆中的所有的对象信息(数量和种类)，并进行统计、排序，过滤。了解相关对象的变化情况。 <br />方法视角。通过方法视角，我们可以得知每一种类的对象，都分配在哪些方法中，以及它们的数量。 <br />对象视角。给定一个对象，通过对象视角，我们可以显示它的所有出引用和入引用对象，我们可以了解这个对象的所有引用关系。 <br />引用图。 给定一个根，通过引用图，我们可以显示从该顶点出发的所有出引用。 <br /><br />在运行过程中，我们可以随时观察内存的使用情况，通过这种方式，我们可以很快找到那些长期不被释放，并且不再使用的对象。我们通过检查这些对象的生存周期，确认其是否为内存泄露。在实践当中，寻找内存泄露是一件非常麻烦的事情，它需要程序员对整个程序的代码比较清楚，并且需要丰富的调试经验，但是这个过程对于很多关键的Java程序都是十分重要的。<br /><br />综上所述，Java也存在内存泄露问题，其原因主要是一些对象虽然不再被使用，但它们仍然被引用。为了解决这些问题，我们可以通过软件工具来检查内存泄露，检查的主要原理就是暴露出所有堆中的对象，让程序员寻找那些无用但仍被引用的对象。<br /><br />相关资源:<br /><br />文章:<br />Jim Patrick, Handling memory leaks in Java programs,<br /></font>
				<a href="http://www-106.ibm.com/developerWorks/library/j-leaks/index.html">
						<font size="2">
								<font face="Arial">http://www-106.ibm.com/developerWorks/library/j-leaks/index.html</font>
						</font>
				</a>
				<br />
				<font face="Arial" size="2">Ed Lycklama, Does Java Technology Have Memory Leaks?<br /></font>
				<a href="http://www.klgroup.com/javaone">
						<font size="2">
								<font face="Arial">http://www.klgroup.com/javaone</font>
						</font>
				</a>
				<br />
				<font size="2">
						<font face="Arial">Sun, The Java HotSpot Virtual Machine, Technical White Paper<br /><br />软件：<br />Sitraka Software's Jprobe </font>
				</font>
				<a href="http://www.sitraka.com/">
						<font size="2">
								<font face="Arial">http://www.sitraka.com</font>
						</font>
				</a>
				<br />
				<font size="2">
						<font face="Arial">Boland Software's Optimizeit </font>
				</font>
				<a href="http://optimizeit/">
						<font size="2">
								<font face="Arial">http://optimizeit</font>
						</font>
				</a>
				<br />
				<font size="2">
						<font face="Arial">IBM alphaWorks' Jinsight </font>
				</font>
				<a href="http://www.alphaworks.ibm.com/tech/jinsight">
						<font size="2">
								<font face="Arial">http://www.alphaworks.ibm.com/tech/jinsight</font>
						</font>
				</a>
				<br />
				<br />
				<font face="Arial" size="2">关于作者 <br />欧阳辰，北京大学计算机硕士毕业，98年起开始研究基于java的软件开发、测试，参与开发、测试过多个基于Java的应用程序和Web服务项目。联系方式yeekee@sina.com<br />周欣，北京大学计算机系在读博士生，主要研究方向：程序理解、逆向工程及软件度量，联系方式 zhouxin@sei.pku.edu.cn <br /><br /></font>
				<p id="TBPingURL">
						<font size="2">
								<font face="Arial">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=678260</font>
						</font>
				</p>
		</div>
<img src ="http://www.blogjava.net/ioriqw/aggbug/43485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-27 10:16 <a href="http://www.blogjava.net/ioriqw/articles/43485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TextMDBBean</title><link>http://www.blogjava.net/ioriqw/articles/42880.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Mon, 24 Apr 2006 11:17:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/42880.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/42880.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/42880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/42880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/42880.html</trackback:ping><description><![CDATA[
		<p>package com.zte.mbean;</p>
		<p>import javax.ejb.MessageDrivenBean;<br />import javax.ejb.MessageDrivenContext;<br />import javax.ejb.EJBException;<br />import javax.jms.JMSException;<br />import javax.jms.Message;<br />import javax.jms.MessageListener;<br />import javax.jms.Queue;<br />import javax.jms.QueueConnection;<br />import javax.jms.QueueConnectionFactory;<br />import javax.jms.QueueSender;<br />import javax.jms.QueueSession;<br />import javax.jms.TextMessage;<br />import javax.naming.InitialContext;<br />import javax.naming.NamingException;</p>
		<p>public class TextMDBBean<br />    implements MessageDrivenBean, MessageListener {<br />  private MessageDrivenContext ctx = null;<br />  private QueueConnection conn;<br />  private QueueSession session;</p>
		<p>  public TextMDBBean() {<br />    System.out.println("TextMDB.ctor, this=" + hashCode());<br />  }</p>
		<p>  public void setMessageDrivenContext(MessageDrivenContext ctx) {<br />    this.ctx = ctx;<br />    System.out.println("TextMDB.setMessageDrivenContext, this=" +<br />                       hashCode());<br />  }</p>
		<p>  public void ejbCreate() {<br />    System.out.println("TextMDB.ejbCreate, this=" + hashCode());<br />    try {<br />      setupPTP();<br />    }<br />    catch (Exception e) {<br />      throw new EJBException("Failed to init TextMDB", e);<br />    }<br />  }</p>
		<p>  public void ejbRemove() {<br />    System.out.println("TextMDB.ejbRemove, this=" + hashCode());<br />    ctx = null;<br />    try {<br />      if (session != null) {<br />        session.close();<br />      }<br />      if (conn != null) {<br />        conn.close();<br />      }<br />    }<br />    catch (JMSException e) {<br />      e.printStackTrace();<br />    }<br />  }</p>
		<p>  public void onMessage(Message msg) {<br />    System.out.println("TextMDB.onMessage, this=" + hashCode());<br />    try {<br />      TextMessage tm = (TextMessage) msg;<br />      String text = tm.getText() + "processed by: " + hashCode();<br />      Queue dest = (Queue) msg.getJMSReplyTo();<br />      sendReply(text, dest);<br />    }<br />    catch (Throwable t) {<br />      t.printStackTrace();<br />    }<br />  }</p>
		<p>  private void setupPTP() throws JMSException, NamingException {<br />    InitialContext iniCtx = new InitialContext();<br />    Object tmp = iniCtx.lookup("java:comp/env/jms/QCF");<br />    QueueConnectionFactory qcf = (QueueConnectionFactory) tmp;<br />    conn = qcf.createQueueConnection();<br />    session = conn.createQueueSession(false,<br />                                      QueueSession.AUTO_ACKNOWLEDGE);<br />    conn.start();<br />  }</p>
		<p>  private void sendReply(String text, Queue dest) throws JMSException {<br />    System.out.println("TextMDB.sendReply, this=" +<br />                       hashCode() + ", dest=" + dest);<br />    QueueSender sender = session.createSender(dest);<br />    TextMessage tm = session.createTextMessage(text);<br />    sender.send(tm);<br />    sender.close();<br />  }</p>
		<p>}<br /></p>
<img src ="http://www.blogjava.net/ioriqw/aggbug/42880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-24 19:17 <a href="http://www.blogjava.net/ioriqw/articles/42880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ejb-jar.xml</title><link>http://www.blogjava.net/ioriqw/articles/42881.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Mon, 24 Apr 2006 11:17:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/42881.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/42881.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/42881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/42881.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/42881.html</trackback:ping><description><![CDATA[
		<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;ejb-jar xmlns="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>" xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>" xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a><a href="http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd">http://java.sun.com/xml/ns/j2ee/ejb-jar_2_1.xsd</a>" version="2.1"&gt;<br />  &lt;display-name&gt;TextMDB&lt;/display-name&gt;<br />  &lt;enterprise-beans&gt;<br />    &lt;message-driven&gt;<br />      &lt;ejb-name&gt;TextMDB&lt;/ejb-name&gt;<br />      &lt;ejb-class&gt;com.zte.mbean.TextMDBBean&lt;/ejb-class&gt;<br />      &lt;messaging-type&gt;javax.jms.MessageListener&lt;/messaging-type&gt;<br />      &lt;transaction-type&gt;Container&lt;/transaction-type&gt;<br />      &lt;message-destination-type&gt;javax.jms.Queue&lt;/message-destination-type&gt;<br />      &lt;activation-config&gt;<br />        &lt;activation-config-property&gt;<br />          &lt;activation-config-property-name&gt;destinationType&lt;/activation-config-property-name&gt;<br />          &lt;activation-config-property-value&gt;javax.jms.Queue&lt;/activation-config-property-value&gt;<br />        &lt;/activation-config-property&gt;<br />      &lt;/activation-config&gt;<br />      &lt;resource-ref&gt;<br />        &lt;res-ref-name&gt;jms/QCF&lt;/res-ref-name&gt;<br />        &lt;res-type&gt;javax.jms.QueueConnectionFactory&lt;/res-type&gt;<br />        &lt;res-auth&gt;Container&lt;/res-auth&gt;<br />      &lt;/resource-ref&gt;<br />    &lt;/message-driven&gt;<br />  &lt;/enterprise-beans&gt;<br />  &lt;assembly-descriptor&gt;<br />    &lt;container-transaction&gt;<br />      &lt;method&gt;<br />        &lt;ejb-name&gt;TextMDB&lt;/ejb-name&gt;<br />        &lt;method-name&gt;*&lt;/method-name&gt;<br />      &lt;/method&gt;<br />      &lt;trans-attribute&gt;Required&lt;/trans-attribute&gt;<br />    &lt;/container-transaction&gt;<br />  &lt;/assembly-descriptor&gt;<br />&lt;/ejb-jar&gt;</p>
		<p> </p>
<img src ="http://www.blogjava.net/ioriqw/aggbug/42881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-24 19:17 <a href="http://www.blogjava.net/ioriqw/articles/42881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jboss.xml</title><link>http://www.blogjava.net/ioriqw/articles/42882.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Mon, 24 Apr 2006 11:17:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/42882.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/42882.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/42882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/42882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/42882.html</trackback:ping><description><![CDATA[
		<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN" "<a href="http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd">http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd</a>"&gt;</p>
		<p>&lt;jboss&gt;<br />  &lt;enterprise-beans&gt;<br />    &lt;message-driven&gt;<br />      &lt;ejb-name&gt;TextMDB&lt;/ejb-name&gt;<br />      &lt;destination-jndi-name&gt;queue/B&lt;/destination-jndi-name&gt;<br />      &lt;resource-ref&gt;<br />        &lt;res-ref-name&gt;jms/QCF&lt;/res-ref-name&gt;<br />        &lt;jndi-name&gt;ConnectionFactory&lt;/jndi-name&gt;<br />      &lt;/resource-ref&gt;<br />    &lt;/message-driven&gt;<br />  &lt;/enterprise-beans&gt;<br />&lt;/jboss&gt;</p>
		<p> </p>
<img src ="http://www.blogjava.net/ioriqw/aggbug/42882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-24 19:17 <a href="http://www.blogjava.net/ioriqw/articles/42882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SendRecvClient </title><link>http://www.blogjava.net/ioriqw/articles/42879.html</link><dc:creator>崛起的程序员</dc:creator><author>崛起的程序员</author><pubDate>Mon, 24 Apr 2006 11:16:00 GMT</pubDate><guid>http://www.blogjava.net/ioriqw/articles/42879.html</guid><wfw:comment>http://www.blogjava.net/ioriqw/comments/42879.html</wfw:comment><comments>http://www.blogjava.net/ioriqw/articles/42879.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ioriqw/comments/commentRss/42879.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ioriqw/services/trackbacks/42879.html</trackback:ping><description><![CDATA[
		<p>package com.zte.jms;</p>
		<p>import javax.jms.JMSException;<br />import javax.jms.Message;<br />import javax.jms.MessageListener;<br />import javax.jms.Queue;<br />import javax.jms.QueueConnection;<br />import javax.jms.QueueConnectionFactory;<br />import javax.jms.QueueReceiver;<br />import javax.jms.QueueSender;<br />import javax.jms.QueueSession;<br />import javax.jms.TextMessage;<br />import javax.naming.InitialContext;<br />import javax.naming.NamingException;</p>
		<p>import EDU.oswego.cs.dl.util.concurrent.CountDown;</p>
		<p>/**<br /> * A complete JMS client example program that sends N TextMessages to a Queue B<br /> * and asynchronously receives the messages as modified by TextMDB from Queue A.<br /> * <br /> * @author <a href="mailto:Scott.Stark@jboss.org">Scott.Stark@jboss.org</a><br /> * @version $Revision: 1.9 $<br /> */<br />public class SendRecvClient {<br /> static final int N = 10;</p>
		<p> static CountDown done = new CountDown(N);</p>
		<p> QueueConnection conn;</p>
		<p> QueueSession session;</p>
		<p> Queue queA;</p>
		<p> Queue queB;</p>
		<p> public static class ExListener implements MessageListener {<br />  public void onMessage(Message msg) {<br />   done.release();<br />   TextMessage tm = (TextMessage) msg;<br />   try {<br />    System.out.println("onMessage, recv text=" + tm.getText());<br />   } catch (Throwable t) {<br />    t.printStackTrace();<br />   }<br />  }<br /> }</p>
		<p> public void setupPTP() throws JMSException, NamingException {<br />  InitialContext iniCtx = InitContext.getInitContext();<br />  Object tmp = iniCtx.lookup("ConnectionFactory");<br />  QueueConnectionFactory qcf = (QueueConnectionFactory) tmp;<br />  conn = qcf.createQueueConnection();<br />  queA = (Queue) iniCtx.lookup("queue/A");<br />  queB = (Queue) iniCtx.lookup("queue/B");<br />  session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);<br />  conn.start();<br /> }</p>
		<p> public void sendRecvAsync(String textBase) throws JMSException,<br />   NamingException, InterruptedException {<br />  System.out.println("Begin sendRecvAsync");</p>
		<p>  // Setup the PTP connection, session<br />  setupPTP();</p>
		<p>  // Set the async listener for queA<br />  QueueReceiver recv = session.createReceiver(queA);<br />  recv.setMessageListener(new ExListener());</p>
		<p>  // Send a few text msgs to queB<br />  QueueSender send = session.createSender(queB);</p>
		<p>  for (int m = 0; m &lt; 10; m++) {<br />   TextMessage tm = session.createTextMessage(textBase + "#" + m);<br />   tm.setJMSReplyTo(queA);<br />   send.send(tm);<br />   System.out.println("sendRecvAsync, sent text=" + tm.getText());<br />  }<br />  System.out.println("End sendRecvAsync");<br /> }</p>
		<p> public void stop() throws JMSException {<br />  conn.stop();<br />  session.close();<br />  conn.close();<br /> }</p>
		<p> public static void main(String args[]) throws Exception {<br />  System.out.println("Begin SendRecvClient,now="<br />    + System.currentTimeMillis());<br />  SendRecvClient client = new SendRecvClient();<br />  client.sendRecvAsync("A text msg");<br />  client.done.acquire();<br />  client.stop();<br />  System.exit(0);<br />  System.out.println("End SendRecvClient");<br /> }</p>
		<p>}</p>
<img src ="http://www.blogjava.net/ioriqw/aggbug/42879.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ioriqw/" target="_blank">崛起的程序员</a> 2006-04-24 19:16 <a href="http://www.blogjava.net/ioriqw/articles/42879.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>