<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>Java论坛最新讨论 - JavaEye</title>
    <description>Java编程、Java Web开发、Java企业应用、Java设计模式、Java开源框架、Java应用服务器 <br/>
圈子: 
<a href="http://android.group.javaeye.com/" target="_blank">Android</a>
<a href="http://jbpm.group.javaeye.com/" target="_blank">JBPM</a>
<a href="http://jsfgroup.group.javaeye.com/" target="_blank">JSF</a>
<a href="http://seam.group.javaeye.com/" target="_blank">Seam</a>
<a href="http://tapestrying.group.javaeye.com/" target="_blank">Tapestry</a>
<a href="http://grails.group.javaeye.com" target="_blank">Groovy</a>
<a href="http://lucene-group.group.javaeye.com/" target="_blank">Lucene</a>
<a href="http://ecside.group.javaeye.com/" target="_blank">GT-Grid</a>

 - Java编程，Ruby编程，微软.net，AJAX，敏捷软件开发，综合软件技术</description>
    <link>http://www.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Java能实现类的适配器模式吗？</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hroger.javaeye.com">HRoger</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/239594" style="color:red;">http://www.javaeye.com/topic/239594</a>&nbsp;
          发表时间: 2008年09月09日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          大家都知道适配器模式分为：类的适配器模式和对象的适配器模式，而且在多本书中都强调类的适配器模式是通过多重继承来实现的，而java只支持单继承，所以就有类的适配器实现了，但是今天看了阎宏的《java与模式》一书，觉得它的类的适配器模式实现也有一定道理，所谓类的适配器模式就是通过继承来实现，而对象的适配器模式主要是通过委派来实现的，还有我个人觉得不论类的适配器模式还是对象的适配器模式都解决同样的问题，真的有必要去区分它们吗？更有多本书（head first，大话设计模式）注明说java不支持类的适配器模式，搞不懂为什么这么说！
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/239594" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 09 Sep 2008 00:17:38 +0800</pubDate>
        <link>http://www.javaeye.com/topic/239594</link>
        <guid>http://www.javaeye.com/topic/239594</guid>
      </item>
      <item>
        <title>讨论：BS应用系统中，大家在界面上以什么方式选择关联对象？比如为产品选择厂家、类别</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://bergman.javaeye.com">bergman</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237893" style="color:red;">http://www.javaeye.com/topic/237893</a>&nbsp;
          发表时间: 2008年09月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          过去做BS结构系统时，比如录入产品时需要选择厂家、类别、产地等，有的域选择值范围较小，有的则非常多，界面上选择关联对象大概有三种形式：<br />1、下拉框，通常选择项较少时使用<br />2、弹出窗口，针对较多的选择项时采用，弹出窗口上有查询域及翻页；还有一种弹出窗口实现多选，弹开的窗口分左右栏，中间则有双向的箭头，点击左栏复选框后点箭头使选中项移到右栏<br />3、ajax方式的组合框，跟随录入的前几个字符进行查询，把接近的放在前面供下拉框形式选择。但组合框通常用于既可选也可以新录的情况，如果限制只能从已有记录中选择，使用组合框有些别扭。<br /><br />这些选择关联对象的方式其实很重要，往往决定系统的实现模式，比如下拉框需要在这个页面上读取所有的关联数据而组成，而弹出窗口则不需要，可以单独写一个页面通过JS回传。而ajax方式则需要更多的技术来实现。<br /><br />对于从大量已有记录中选择关联对象，在IE一统天下时经常用弹出模式对话框的方式，但是现在firefox不支持，而用window.open()，在IE7下会打开一个新标签，并且容易被禁用。现在我很头疼，不知该用何种方式好。<br /><br />此外还有哪些选择关联对象的形式呢？请讨论一下最佳的选择关联对象的界面操作模式！
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237893" style="color:red;">已有 <strong>4</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 06 Sep 2008 14:06:54 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237893</link>
        <guid>http://www.javaeye.com/topic/237893</guid>
      </item>
      <item>
        <title>对commons-dbcp连接池的分析</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chillwarmoon.javaeye.com">chillwarmoon</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/239565" style="color:red;">http://www.javaeye.com/topic/239565</a>&nbsp;
          发表时间: 2008年09月08日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转载请注明出处http://chillwarmoon.javaeye.com<br />Apache的commons-pool提供了编写对象池的API，将用完的对象返回对象池中以便于下次利用，从而减少了对象创建时间。这对于创建对象相对耗时的应用来说，能够提高应用的性能。<br /><br />commons-dbcp数据库连接池正是使用commons-pool来创建和数据库之间的连接对象，在对象池中保存这些对象，从而减少了频繁建立连接对象所造成的性能损耗。本文讲述了commons-dbcp是怎样利用commons-pool来建立对象池的。<br /><br />例如在tomcat中，利用JNDI来查找到资源javax.sql.DataSource的实现，如果使用dbcp连接池，则该实现为org.apache.commons.dbcp.BasicDataSource。我们可以从这个称为“数据源”的类中调用getConnection方法来获得与数据库的连接。但内部是如何实现的呢？对象池在其中占据什么位置呢？这一切对于外部使用者来说是透明的。<br /><br />BasicDataSource的getConnection首先建立了PoolingDataSource对象来getConnection。这个PoolingDataSource对象中引用了ObjectPool，在getConnection()时，是从ObjectPool中借用了一个对象，既调用ObjectPool.borrowObject()方法。而对于熟悉commons-pool的程序员来说，ObjectPool肯定有与之对应的Factory创建对象，并放到池中。因此dbcp通过实现了接口org.apache.commons.pool.PoolableObjectFactory的类org.apache.commons.dbcp.PoolableConnectionFactory的makeObject方法来创建连接Connection对象。然而PoolableConnectionFactory持有对ConnectionFactory的引用，ConnectionFactory可以有3种策略来创建Connection对象。其中DriverConnectionFactory调用了数据库厂商提供的Driver来获得Connection。如图所示。<br /><br />在创建连接时，是创建的DelegatingConnection实例，该对象持有对池的引用，对于java.sql.Connectionl.close()方法来说是调用的对象池的returnObject方法来返回池，而不是真正的把连接关掉。而我们在外界调用这个方法时，并未发现这一点。而对于调用Connection的其他方法而言，都是委派到由Driver得到的Connection相对应的方法。即PoolableConnection-->Connection，前者实现了DelegatingConnection。<br /><br />在用dbcp连接池的时候，若设置了poolPreparedStatements属性为true，则PoolableConnectionFactory在makeObject时，建立的连接存在的委派关系如下：PoolableConnection-->PoolingConnection-->Connection。PoolingConnection实现了KeyedPoolableObjectFactory，从而为与之对应的对象池keyedObjectPool形成双向关联。在对象池中，以PStmtKey(包含有sql等属性)来标示该池中的一类对象。因此在使用dbcp连接池时，若配置了poolPreparedStatements属性，注意尽量保持相同功能的sql写法一致，来充分利用对象池。
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/239565" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 08 Sep 2008 22:20:26 +0800</pubDate>
        <link>http://www.javaeye.com/topic/239565</link>
        <guid>http://www.javaeye.com/topic/239565</guid>
      </item>
      <item>
        <title>java Socket编程，收不到包问题 </title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://realcs.javaeye.com">realcs</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/239549" style="color:red;">http://www.javaeye.com/topic/239549</a>&nbsp;
          发表时间: 2008年09月08日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          问题描述：一个服务端，一个客户端。客户端往服务端传文件，具体细节不说了，客户端发给服务端的是文件处理后的定长数据报文（由数据报文头和数据报文体组成，其中报文头里约定了客户端发送多少个定长报文后，服务端要往回发一个确认包，然后客户端才继续发送定长报文）。服务端每接收一个数据报文先对其处理（拆包，写入文件等），然后接收下一包，如果到了约定发送确认包的数量时发送一个确认包给客户端。 <br /><br />问题：在传小文件的时候没问题，但是在文件稍大一些的时候（4-10M）就出问题。我现在发送的报文是两包一个确认，问题出现在服务器接收每批第2包的时候，收不到数据，但是客户端那边显示已经发送，正等待确认，所以陷入了阻塞。但是这个问题不是一直出现，每次出现也不是在固定的位置。不知问题出现在哪儿？ <br />抓包工具抓出来了截图： <br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/realcsrealcs/459693/o_%e6%8a%93%e5%8c%85.jpg" />
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/239549" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 08 Sep 2008 21:10:59 +0800</pubDate>
        <link>http://www.javaeye.com/topic/239549</link>
        <guid>http://www.javaeye.com/topic/239549</guid>
      </item>
      <item>
        <title>使用ant 自定义复制指定文件</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://michales003.javaeye.com">michales003</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/238680" style="color:red;">http://www.javaeye.com/topic/238680</a>&nbsp;
          发表时间: 2008年09月08日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>//CopyFile.java类文件</p>
<p>import java.io.BufferedInputStream;<br />import java.io.BufferedOutputStream;<br />import java.io.BufferedReader;<br />import java.io.File;<br />import java.io.FileInputStream;<br />import java.io.FileOutputStream;<br />import java.io.FileReader;<br />import java.util.ArrayList;<br />import java.util.List;</p>
<p>import org.apache.tools.ant.BuildException;<br />import org.apache.tools.ant.Task;</p>
<p><br />/**<br />&nbsp;* @author heyigang<br />&nbsp;*<br />&nbsp;*/<br />public class CopyFile extends Task{<br />&nbsp;<br />&nbsp;private File src;<br />&nbsp;private File toDir;<br />&nbsp;private File filter;<br />&nbsp;<br />&nbsp;private List srcDirs = new ArrayList(); //存放源目录的路径<br />&nbsp;private List distDirs = new ArrayList(); //存放目的目录的路径 <br />&nbsp;<br />&nbsp;//默认的文件过滤路径<br />&nbsp;private String DEFAULT_FILTER_PATH = "filter.ini";<br />&nbsp;<br />&nbsp;/*<br />&nbsp; * 构造方法<br />&nbsp; * */<br />&nbsp;public CopyFile() {<br />&nbsp;}<br />&nbsp;<br />&nbsp;/*<br />&nbsp; * 加载默认的过滤拷贝的文件路径<br />&nbsp; * */<br />&nbsp;public void loadFilter() {<br />&nbsp;&nbsp;loadFilter(new File(DEFAULT_FILTER_PATH));<br />&nbsp;}<br />&nbsp;<br />&nbsp;/*<br />&nbsp; * 加载配置文件中的过滤拷贝的文件路径<br />&nbsp; * */<br />&nbsp;public void loadFilter(File fiter) {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;BufferedReader reader = new BufferedReader(new FileReader(filter));<br />&nbsp;&nbsp;&nbsp;String line = null;<br />&nbsp;&nbsp;&nbsp;while(null!=(line=reader.readLine())) {<br />&nbsp;&nbsp;&nbsp;&nbsp;//拼接路径<br />&nbsp;&nbsp;&nbsp;&nbsp;String srcPath = new StringBuffer(src.getPath())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(line.trim()).toString();<br />&nbsp;&nbsp;&nbsp;&nbsp;String distPath = new StringBuffer(toDir.getPath())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(line.trim()).toString(); <br />&nbsp;&nbsp;&nbsp;&nbsp;//判断是否位正确的路径或目录<br />&nbsp;&nbsp;&nbsp;&nbsp;File tempsrcDir= new File(srcPath);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(!tempsrcDir.isDirectory() || !tempsrcDir.exists()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(srcPath + " 不是目录或者目录不存在!");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//将正确的目录添加到list中<br />&nbsp;&nbsp;&nbsp;&nbsp;srcDirs.add(srcPath);<br />&nbsp;&nbsp;&nbsp;&nbsp;distDirs.add(distPath); <br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;reader.close();<br />&nbsp;&nbsp;}catch(Exception ex) {<br />&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;<br />&nbsp;/*<br />&nbsp; * 从一个文件目录到另外一个文件目录<br />&nbsp; * */<br />&nbsp;public void copyDir(File srcDir,File distDir) {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;//创建目标文件目录 <br />&nbsp;&nbsp;&nbsp;if(!distDir.exists()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;distDir.mkdirs();<br />&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;File[] files = srcDir.listFiles();<br />&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; files.length; i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;File tempFile = files[i]; <br />&nbsp;&nbsp;&nbsp;&nbsp;if(!tempFile.getName().equals(".svn")) { &nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!tempFile.isDirectory()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//是文件开始复制...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copyFile(tempFile,new File(getDistPath(tempFile)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//是路径继续调用本身<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;copyDir(tempFile,new File(getDistPath(tempFile)));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}catch(Exception ex) {<br />&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;<br />&nbsp;/*<br />&nbsp; * 根据源文件获得目标文件目录的路径或者全文件名称<br />&nbsp; * */<br />&nbsp;public String getDistPath(File srcFile) {<br />&nbsp;&nbsp;return new StringBuffer(srcFile.getAbsolutePath())<br />&nbsp;&nbsp;&nbsp;.replace(0, src.getPath().length(), toDir.getPath()).toString();<br />&nbsp;}<br />&nbsp;<br />&nbsp;/*<br />&nbsp; * 从一个文件复制该文件到另外一个目录下面<br />&nbsp; * */<br />&nbsp;public void copyFile(File srcFile,File distFile) {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;if(!distFile.exists()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;srcFile.createNewFile();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;BufferedInputStream in = new BufferedInputStream(new FileInputStream(srcFile));<br />&nbsp;&nbsp;&nbsp;BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(distFile));<br />&nbsp;&nbsp;&nbsp;byte[] buffer = new byte[1024];<br />&nbsp;&nbsp;&nbsp;int len = -1;<br />&nbsp;&nbsp;&nbsp;while(-1!=(len=in.read(buffer))) { <br />&nbsp;&nbsp;&nbsp;&nbsp;out.write(buffer, 0, len);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;out.close();<br />&nbsp;&nbsp;&nbsp;in.close(); <br />&nbsp;&nbsp;}catch(Exception ex) {<br />&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;<br />&nbsp;/*<br />&nbsp; * Task的可执行方法...<br />&nbsp; * */<br />&nbsp;public void execute() throws BuildException {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;loadFilter();<br />&nbsp;&nbsp;&nbsp;System.out.println("开始复制文件，请稍候...");<br />&nbsp;&nbsp;&nbsp;System.out.println("从目录：" + src.getAbsolutePath());<br />&nbsp;&nbsp;&nbsp;System.out.println("到目录：" + toDir.getAbsolutePath());<br />&nbsp;&nbsp;&nbsp;long start = System.currentTimeMillis();<br />&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; srcDirs.size(); i++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;copyDir(new File((String)srcDirs.get(i)), new File((String)distDirs.get(i)));<br />&nbsp;&nbsp;&nbsp;} <br />&nbsp;&nbsp;&nbsp;double time = (double)(System.currentTimeMillis() - start) / 1000; <br />&nbsp;&nbsp;&nbsp;System.out.println("复制文件完成!总共用时" + time + "秒.");<br />&nbsp;&nbsp;}catch(Exception ex) {<br />&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;<br />&nbsp;public File getFilter() {<br />&nbsp;&nbsp;return filter;<br />&nbsp;}<br />&nbsp;public void setFilter(File filter) {<br />&nbsp;&nbsp;this.filter = filter;<br />&nbsp;}<br />&nbsp;public File getSrc() {<br />&nbsp;&nbsp;return src;<br />&nbsp;}<br />&nbsp;public void setSrc(File src) {<br />&nbsp;&nbsp;this.src = src;<br />&nbsp;}<br />&nbsp;public File getToDir() {<br />&nbsp;&nbsp;return toDir;<br />&nbsp;}<br />&nbsp;public void setToDir(File toDir) {<br />&nbsp;&nbsp;this.toDir = toDir;<br />&nbsp;} </p>
<p>}</p>
<p>&nbsp;</p>
<p>//build.xml 配置文件如下</p>
<p>&lt;?xml version="1.0" encoding="GB2312"?&gt;<br />&lt;project name="CopyFiles" default="copyfiles"&gt;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;target name="help"&gt;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="Available targets are:"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="copefiles&nbsp;&nbsp;&nbsp; --&gt; copy files from src to dist"/&gt;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="-----------------------------------"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="ant.home&nbsp;&nbsp;&nbsp;&nbsp; --&gt; ${ant.home}"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message="ant.version&nbsp; --&gt; ${ant.version}"/&gt;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo message=""/&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/target&gt; <br />&nbsp;<br />&nbsp;&nbsp;&nbsp; &lt;taskdef name="copefiles" classname="CopyFile" classpath="."&gt;&lt;/taskdef&gt;<br />&nbsp;<br />&nbsp;&lt;target name="copyfiles" depends="help"&gt;<br />&nbsp;&nbsp; &lt;!-- <br />&nbsp;&nbsp;&nbsp;&nbsp; 从源目录src复制filter.ini中文件夹下的目录到制定的todir文件目录下<br />&nbsp;&nbsp;&nbsp;&nbsp; 配置文件需要<br />&nbsp;&nbsp; //--&gt;<br />&nbsp;&nbsp;&lt;copefiles src="D:/EIP/trunk/Src/Service/erp" todir="D:/Source_V1.2" filter="Source_V1.2.txt"/&gt;<br />&nbsp;&nbsp;&lt;copefiles src="D:/EIP/trunk/Src/Service/erp" todir="D:/Source_V2.1" filter="Source_V2.1.txt"/&gt;<br />&nbsp;&lt;/target&gt;<br />&lt;/project&gt;</p>
<p>&nbsp;</p>
<p>//Source_V1.2.txt 制定需要配置的文件路径</p>
<p>/ot/com/SC_OT_QueryResponsibility<br />/ot/com/SC_OT_RequestReturnStatusSrv<br />/ot/com/SC_OT_VerifyAPInvoiceCurrencySvr<br />/ot/com/SC_OT_VerifyCurrencySvr<br />/ot/com/SC_OT_COM_VerifyAPInvoiceCurrencySvr</p>
<p>&nbsp;</p>
<p>//command.bat 可执行文件</p>
<p>set classpath=%classpath%;%ANT_HOME%\lib\ant.jar;<br />call javac CopyFile.java<br />call ant&nbsp; <br />cd D:\JAVA\apache-ant-1.7.0\hyg <br />cmd</p>
<p>&nbsp;</p>
<p>//所有的配置做好之后，运行command.bat就可以开始进行复制了。</p>
<p>//项目开发过程好过程中，在部署包的时候取包不方便，便有了这个需求，发了10分钟写了CopyFile.java这个核心类。感觉还挺好用。</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/238680" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 08 Sep 2008 15:19:41 +0800</pubDate>
        <link>http://www.javaeye.com/topic/238680</link>
        <guid>http://www.javaeye.com/topic/238680</guid>
      </item>
      <item>
        <title>反向造型</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhaidp-java.javaeye.com">zhaidp_java</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/236987" style="color:red;">http://www.javaeye.com/topic/236987</a>&nbsp;
          发表时间: 2008年09月04日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近开发中遇到一个问题，关于“反向造型”。<br /><br /><br /><pre name="code" class="java">package workflow.fun_logic;  

public interface IFunLogic {  
    public boolean logic(Object arg1 , Object arg2);  
}  
  
  
package workflow.fun_logic;  
  
public class FunLogic_is implements IFunLogic {  
  
    public boolean logic(Object arg1, Object arg2) {  
  
/* 
将arg1，arg2还原，去调用logic(String arg1, String arg2) or logic(Integer arg1, Integer arg2);？？？？
*/  

        return logic(arg1,arg2);  
          
    }  
      
    public boolean logic(String arg1, String arg2) {  
          
        if(null == arg1){return false;}  
        if(null == arg2){return false;}  
          
        return arg1.equals(arg2);  
    }  
      
    public boolean logic(Integer arg1, Integer arg2) {  
          
        if(null == arg1){return false;}  
        if(null == arg2){return false;}  
          
        return arg1.intValue() == arg2.intValue();  
    }  
      
}  
  
//测试  
package workflow.fun_logic;  
  
public class text {  
    public static void main(String[] arg){  
          
        IFunLogic obj = new FunLogic_is();  
          
        System.out.println(obj.logic("q","q")); //调用logic(String arg1, String arg2) 
          
    }  
      
}  
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/236987" style="color:red;">已有 <strong>7</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 04 Sep 2008 16:54:18 +0800</pubDate>
        <link>http://www.javaeye.com/topic/236987</link>
        <guid>http://www.javaeye.com/topic/236987</guid>
      </item>
      <item>
        <title>我实现的一个dao助手类</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://donyee.javaeye.com">donyee</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/238144" style="color:red;">http://www.javaeye.com/topic/238144</a>&nbsp;
          发表时间: 2008年09月07日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p class="MsoNormal" style="text-indent: 15.75pt;"><span style="font-family: 宋体;">这个类蛮实用的，我在几个项目中都使用。接口如下：</span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><strong><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #7f0055;">public</span>
</strong>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"> </span>
<strong><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #7f0055;">interface</span>
</strong>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"> DaoHelper {</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
</span>
<strong><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #7f0055;">boolean</span>
</strong>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"> add(String sql, Object... args);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
</span>
<strong><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #7f0055;">boolean</span>
</strong>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"> add(String sql, Connection conn, Object... args);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
</span>
<strong><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #7f0055;">int</span>
</strong>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"> update(String sql, Object... args);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
</span>
<strong><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #7f0055;">int</span>
</strong>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"> update(String sql, Connection conn, Object... args);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
</span>
<strong><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #7f0055;">boolean</span>
</strong>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"> delete(String sql, Object... args);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
</span>
<strong><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #7f0055;">boolean</span>
</strong>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"> delete(String sql, Connection conn, Object... args);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
Object getObject(String sql, Class obj, Object... args);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
Object getObject(String sql, Connection conn, Class obj,
Object... args);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
List&lt;Object&gt; getList(String sql, Class obj, Object...
args);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
String queryForString(String sql, Object... args);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
Long queryForLong(String sql, Object... args);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
Boolean queryForBoolean(String sql, Object... args);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
Connection <span style="background: silver none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">getConn</span>
();</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
</span>
<strong><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #7f0055;">void</span>
</strong>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"> returnConnection(Connection conn);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" align="left" style="text-align: left;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"><span>&nbsp;&nbsp;&nbsp; </span>
</span>
<strong><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: #7f0055;">void</span>
</strong>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"> rollBack(Connection conn);</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;;"></span>
</p>
<p class="MsoNormal" style="text-indent: 15pt;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">}</span>
</p>
<p class="MsoNormal" style="margin-left: 51.75pt; text-indent: -36pt;"><!-- [if !supportLists]--><span lang="EN-US"><span>（1）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</span>
<!-- [endif]--><span style="font-family: 宋体;">第一个</span>
<span lang="EN-US">add</span>
<span style="font-family: 宋体;">方法用来执行</span>
<span lang="EN-US">insert</span>
<span style="font-family: 宋体;">语句，并且提交事务；</span>
<span lang="EN-US">sql</span>
<span style="font-family: 宋体;">为数据库语句，</span>
<span lang="EN-US">args</span>
<span style="font-family: 宋体;">为数据库参数，要和数据库语句里的&ldquo;？&rdquo;对应。</span>
</p>
<p class="MsoNormal" style="margin-left: 51.75pt; text-indent: -36pt;"><!-- [if !supportLists]--><span lang="EN-US"><span>（2）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</span>
<!-- [endif]--><span style="font-family: 宋体;">第二个</span>
<span lang="EN-US">add</span>
<span style="font-family: 宋体;">方法多了一个</span>
<span lang="EN-US">Connetion</span>
<span style="font-family: 宋体;">参数，该方法将使用这个</span>
<span lang="EN-US">Conn</span>
<span style="font-family: 宋体;">来创建</span>
<span lang="EN-US">PreparedStatement</span>
<span style="font-family: 宋体;">，但是执行结束后不提交，需要手动提交。</span>
</p>
<p class="MsoNormal" style="margin-left: 51.75pt; text-indent: -36pt;"><!-- [if !supportLists]--><span lang="EN-US"><span>（3）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</span>
<!-- [endif]--><span style="font-family: 宋体;">其他</span>
<span lang="EN-US">update</span>
<span style="font-family: 宋体;">、</span>
<span lang="EN-US">delete</span>
<span style="font-family: 宋体;">同上</span>
</p>
<p class="MsoNormal" style="margin-left: 51.75pt; text-indent: -36pt;"><!-- [if !supportLists]--><span lang="EN-US"><span>（4）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</span>
<!-- [endif]--><span lang="EN-US"><span>&nbsp;</span>
getObject</span>
<span style="font-family: 宋体;">方法返回一个</span>
<span lang="EN-US">bean</span>
<span style="font-family: 宋体;">，把</span>
<span lang="EN-US">ResultSet</span>
<span style="font-family: 宋体;">转化为</span>
<span lang="EN-US">Bean</span>
<span style="font-family: 宋体;">，</span>
<span lang="EN-US">bean</span>
<span style="font-family: 宋体;">的属性必须和数据库列名称相同。</span>
</p>
<p class="MsoNormal" style="margin-left: 51.75pt; text-indent: -36pt;"><!-- [if !supportLists]--><span lang="EN-US"><span>（5）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</span>
<!-- [endif]--><span lang="EN-US"><span>&nbsp;</span>
getList</span>
<span style="font-family: 宋体;">方法返回一个</span>
<span lang="EN-US">List</span>
<span style="font-family: 宋体;">，将</span>
<span lang="EN-US">ResultSet</span>
<span style="font-family: 宋体;">处理为一个</span>
<span lang="EN-US">List</span>
<span style="font-family: 宋体;">返回</span>
</p>
<p class="MsoNormal" style="margin-left: 51.75pt; text-indent: -36pt;"><!-- [if !supportLists]--><span lang="EN-US"><span>（6）<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>
</span>
</span>
<!-- [endif]--><span lang="EN-US"><span>&nbsp;</span>
queryForString</span>
<span style="font-family: 宋体;">，</span>
<span lang="EN-US">queryForLong</span>
<span style="font-family: 宋体;">，</span>
<span lang="EN-US">queryForBoolean</span>
<span style="font-family: 宋体;">将分别返回</span>
<span lang="EN-US">String</span>
<span style="font-family: 宋体;">、</span>
<span lang="EN-US">Long</span>
<span style="font-family: 宋体;">、</span>
<span lang="EN-US">Boolean</span>
<span style="font-family: 宋体;">结果。</span>
</p>
<p class="MsoNormal" style="margin-left: 15.75pt;"><span style="font-family: 宋体;">实现我使用了</span>
<span lang="EN-US">apache common</span>
<span style="font-family: 宋体;">里的</span>
<span lang="EN-US" style="background: silver none repeat scroll 0%; font-size: 10pt; font-family: &quot;Courier New&quot;; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">dbutils</span>
<span style="font-size: 10pt; font-family: 宋体; color: black;">包，另外由</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">DataSource</span>
<span style="font-size: 10pt; font-family: 宋体; color: black;">提供数据库</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">Connection</span>
<span style="font-size: 10pt; font-family: 宋体; color: black;">，我使用的是</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">c3p0</span>
<span style="font-size: 10pt; font-family: 宋体; color: black;">的实现，用</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">spring bean set </span>
<span style="font-size: 10pt; font-family: 宋体; color: black;">注入的。代码参考附件。</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"></span>
</p>
<p class="MsoNormal" style="margin-left: 15.75pt;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">&nbsp;</span>
</p>
<p class="MsoNormal" style="margin-left: 15.75pt;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">PS:</span>
<span style="font-size: 10pt; font-family: 宋体; color: black;">抛砖引玉，大家要是有更好的方法的话，可以拿出来共享一下，提高代码质量、加快开发速度。</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;"></span>
</p>
<p class="MsoNormal" style="margin-left: 15.75pt;"><span lang="EN-US" style="font-size: 10pt; font-family: &quot;Courier New&quot;; color: black;">&nbsp;</span>
</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/238144" style="color:red;">已有 <strong>6</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Sep 2008 19:41:12 +0800</pubDate>
        <link>http://www.javaeye.com/topic/238144</link>
        <guid>http://www.javaeye.com/topic/238144</guid>
      </item>
      <item>
        <title>你的查询语句怎么写？</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://devezhao.javaeye.com">javaTo</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237808" style="color:red;">http://www.javaeye.com/topic/237808</a>&nbsp;
          发表时间: 2008年09月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在日常开发中经常需要编写大量的查询语句，但是，语句应该怎样写才<strong>更快（这里的快指的是编写速度），更直观，更不易出错</strong>呢！<br /><br />看看下面场景，查询某客户的主要联系人及其联系人所在国家<br /><img src="http://devezhao.javaeye.com/upload/picture/pic/21373/f536610e-1d30-3b2d-90ba-e0f050972c5f.gif" /><br /><pre name="code" class="sql">
select 
    _t0.accountName as _c0,
    _t1.contactName as _c1,
    _t2.countryName as _c2
from Account as _t0
    left join(Contact     as _t1
        left join Country as _t2
        on  _t1.countryId    = _t2.countryId)
    on  _t0.primaryContactId = _t1.contactId
</pre><br />上面的例子你可以说非常的简单明了，你可以一气呵成，并保证不会出错。但在日益复杂的业务逻辑上，汇集十张甚至几十张表格的需求相信还是很多的，这时你还那么自信吗？<br /><br />OK，切入我们的主题，<span style="color: blue">简单直观的查询语句</span><br /><pre name="code" class="sql">
select
    accountName                 ,
    primaryContactId.contactName,
    primaryContactId.countryId.countryName
from Account
where ...
</pre><br />看看吧，是不是更直观，更利于编写呢？<br />更值得高兴的是他还不仅限于上述优点<br /><pre name="code" class="sql">
...
from Account
primaryContactId.contactName &lt;> '' limit(0, 100)
</pre><br />看到<span style="color: red">limit(0, 100)</span>了吗，对，他就是我们实现的自定义函数，可以利用Dialect轻松的实现跨数据库的语句！<br /><br /><br />当然，这样的语句是不能直接运行的，需要一套程序把他解析成最终的可执行SQL代码。<br />首先，经由语法分析器扫描后得到以下语法树（以二元式表示每个节点）<br /><pre name="code" class="java">
### Fields ---------------------------------
(EXPRESSION, [(FIELD, accountName)])
(EXPRESSION, [(FIELD, primaryContactId.contactName)])
(EXPRESSION, [(FIELD, primaryContactId.countryId.countryName)])

### Criteria -------------------------------
(FIELD, primaryContactId.countryId)
(OPERATOR, &lt;>)
(TEXT, )
(FUNCTION, limit([(EXPRESSION, [(DIGIT, 0)]), (EXPRESSION, [(DIGIT, 100)])]))
</pre><br /><pre name="code" class="java">
// 节点接口
public interface ASTNode {
	ASTNode getFirstChild();
	List&lt;ASTNode> getChildren();
	String getText();
	NodeType getType();
	void addChild(ASTNode node);
	// ...
}
</pre><br /><br />仅有一个语法树是不够的，我们还需要知道字段与实体的关系，实体与实体的关系，以便JOIN<br /><pre name="code" class="java">
// 实体
public interface Entity extends MetaObject {
	Field getPrimaryField();
	Set&lt;Field> getFieldSet();
	Field getField(String fieldName);
	// ...
}
// 字段
public interface Field extends MetaObject {
	Entity getOwningEntity();
	Type getType();
	Set&lt;Entity> getReferenceEntitySet();
	// ...
}
public interface MetaObject {
	String getName();
	String getSchemaName();
	String getLabel();
	// ...
}

// 关系定义
&lt;entity name="Account">
	&lt;field name="accountId" type="primary" />
	&lt;field name="accountName" type="string" length="200" nullable="false" />
	&lt;field name="primaryContactId" type="reference" ref-entity="Contact" />
&lt;/entity>
&lt;entity name="Contact">
	&lt;field name="contactId" type="primary" />
	&lt;field name="contactName" type="string" length="200" nullable="false" />
	&lt;field name="owningAccount" type="reference" ref-entity="Country" />
&lt;/entity>
&lt;entity name="Country">
	&lt;field name="countryId" type="primary" />
	&lt;field name="countryCode" type="string" />
	&lt;field name="countryName" type="string" />
&lt;/entity>
</pre><br /><br />一切准备完成，现在只需把外键字段指向实体join起来<br /><pre name="code" class="java">
public interface JoinTree {
	JoinNode getRootJoinNode();
	void addChildJoin(JoinNode node);
	JoinNode addChildJoin(String table, String joinOnLeft, String joinOnRight);
	void addChildJoin(JoinNode node, JoinNode parentNode);
	JoinNode addChildJoin(String table, String joinOnLeft, String joinOnRight, JoinNode parentNode);
}


// (EXPRESSION, [(FIELD, primaryContactId.contactName)])
// 对于一个这样的字段节点，我们可以轻松的获取其引用自哪个实体，并加入JoinTree
Field field = accountEntity.getField("primaryContactId");
Entity contactEntity = field.getReferenceEntitySet().iterator().next();
joinTree.addChildJoin(
	currentJoinEntity.getSchemaName(),
	currentJoinField.getSchemaName(),
	currentJoinEntity.getPrimaryField().getSchemaName());
</pre><br /><br />OK，经由上述步骤，再稍加修饰就可以得到最终的完整的可执行SQL代码。<br /><br />PS：写的比较粗糙，欢迎广大同志拍砖
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237808" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 06 Sep 2008 00:15:07 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237808</link>
        <guid>http://www.javaeye.com/topic/237808</guid>
      </item>
      <item>
        <title>给H2这样的内存数据实现类似于memcached这样缓存失效算法！</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://arden.javaeye.com">Arden</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/238129" style="color:red;">http://www.javaeye.com/topic/238129</a>&nbsp;
          发表时间: 2008年09月07日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          这段时间参考了memcached/h2等这样的缓存框架，可是发现很多时候他们各有各的优势，比如：用memcached实现<br /><br />session存储的话不能很好的实现遍历及在线用户统计，但是可以很好的实现session失效处理。而用h2的话可以很好<br /><br />的实现session遍历和在线用户统计，但是在处理session失效的话还要自己写个后台线程来专门扫描所有的元素看哪<br /><br />些session已经过期，这样很不方便。能不能有好的办法把两者结合起来，就是能否做在h2的基础上对指定的内存表加<br /><br />上类似于memcached的过期元素处理的缓存算法？
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/238129" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Sep 2008 18:13:27 +0800</pubDate>
        <link>http://www.javaeye.com/topic/238129</link>
        <guid>http://www.javaeye.com/topic/238129</guid>
      </item>
      <item>
        <title>FCKeditor-2.3中文化问题解决补充</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://songxh2.javaeye.com">songxh2</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237511" style="color:red;">http://www.javaeye.com/topic/237511</a>&nbsp;
          发表时间: 2008年09月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>为了整合FCKeditor到我的项目中去,对FCKeditor做了些研究.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我的web服务器是tomcat4.1.34,而最新FCKeditor-java-2.4的版本需要servlet2.4及jsp2.0以上支持,也就是说FCKeditor-java-2.4版本只适合tomcat5.0以上.后来发现有2.3的版本,下下来试了下.参考了网络上已有的一些文章<a href="http://gemini.javaeye.com/blog/135858"><span style="color: #006600;"><span class="hilite1"><span style="background-color: #ffff00;">FCKeditor</span></span><span class="hilite2"><span style="background-color: #55ff55;">中文</span></span>乱码及上传</span></a>&nbsp;然后自己整理,发现在上传文件及上传目录创建时出现中文问题.根据参考文章,涉及到中文目录问题时,需要修改tomcat的conf文件server.xml文件的url中文编码设置,我觉得这种办法虽然解决了FCKeditor中文问题,但会给软件其他部分带来编码问题,所以我想应该可以找出不修改server.xml配置文件的办法来.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 经过测试,解决中文问题总体来讲需要修改一下FCKeditor-java-2.3的服务器端代码.修改如下:</p>
<p>&nbsp;</p>
<p>1.创建及浏览中文目录问题,修改ConnectorServlet.java文件:</p>
<p>&nbsp;</p>
<p>&nbsp; (原)</p>
<p>&nbsp;&nbsp;<span style="background-color: #c0c0c0;">String currentFolderStr=request.getParameter("CurrentFolder");</span>&nbsp; </p>
<p>&nbsp;</p>
<p>修改为</p>
<p>&nbsp;&nbsp;(新)</p>
<p><span style="background-color: #ffff99;">&nbsp;&nbsp;String currentFolderStr=null;</span></p>
<p><span style="background-color: #ffff99;">&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;currentFolderStr=new String(request.getParameter("CurrentFolder").getBytes("iso-8859-1"),"utf-8");<br />&nbsp;&nbsp;} catch (RuntimeException e) {}</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp; (原)</p>
<p>&nbsp;&nbsp;<span style="background-color: #ffff99;">String newFolderStr=request.getParameter("newFolderStr");</span>&nbsp; </p>
<p>&nbsp;</p>
<p>修改为</p>
<p>&nbsp;&nbsp;(新)</p>
<p><span style="background-color: #ffff99;">&nbsp;&nbsp;&nbsp;String newFolderStr=null;<br />&nbsp;&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;&nbsp;newFolderStr=new String(request.getParameter("NewFolderName").getBytes("iso-8859-1"),"utf-8");<br />&nbsp;&nbsp;&nbsp;} catch (RuntimeException e) {}</span></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237511" style="color:red;">已有 <strong>3</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 12:49:11 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237511</link>
        <guid>http://www.javaeye.com/topic/237511</guid>
      </item>
      <item>
        <title>javaMail 群发探讨</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://tou3921.javaeye.com">tou3921</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/236255" style="color:red;">http://www.javaeye.com/topic/236255</a>&nbsp;
          发表时间: 2008年09月03日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近才接触到邮件群发，用于包揽公司的海量客户。<br />现在遇到了几个问题:<br />1:邮件地址无效，并非格式无效，会导致错误之后的其他地址发送不成功。<br />2：smtp服务器有限制。<br /><br />第一个经过努力已经基本解决，可以捕获一个SendFailedException 异常，从异常类中获取然：e.getValidUnsentAddresses()，之后递归一下。<br /><br />第二个问题是存在的，并且我反复检查程序也没发现什么问题，每次密抄15个，20秒执行一次，根据服务提供的信息，应该不会受到smtp服务器限制。可还是发上14左右后就抛异常了。<br /><br /><pre name="code" class="java">javax.mail.MessagingException: 451 Out of recipients limit for this sender  .......</pre><br />有时抛socket 异常。<br /><br />有经验的分享下，一起探讨探讨。
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/236255" style="color:red;">已有 <strong>7</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 03 Sep 2008 17:20:37 +0800</pubDate>
        <link>http://www.javaeye.com/topic/236255</link>
        <guid>http://www.javaeye.com/topic/236255</guid>
      </item>
      <item>
        <title>如果通过CSS样式设置单元格显示内容的长度</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://code.javaeye.com">jiasongmao</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/238081" style="color:red;">http://www.javaeye.com/topic/238081</a>&nbsp;
          发表时间: 2008年09月07日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在实际开发的过程中，我们所使用的table的内容列中的内容往往太长，我们只想让它显示一部分内容该怎么办呢？<br />当然你可以通过程序后台对内容字段进行截断并加…来实现，但是那样效率肯定不如通过样式来控制！<br />在给出源码之前还是让我们先来了解一个跟本文要使用的技术有关的知识吧：<br />table的样式属性table-layout:<br /> table-layout  版本：CSS2　 兼容性：IE5+　继承性：无<br /> 语法：<br /> table-layout : auto | fixed <br /> 取值：<br />   auto : 默认值。默认的自动算法。布局将基于各单元格的内容。表格在每一单元格内所有内容读取计算之后才会显示出来<br />   fixed : 固定布局的算法。在这种算法中，表格和列的宽度取决于 col 对象的宽度总和，假如没有指定，则会取决于第一行每个单元格的宽度。假如表格没有指定宽度( width )属性，则表格被呈递的默认宽度为 100% 。<br />[自己总结]<br />如果指定了table的百分比，并且第一行的每个单元格的宽度之和小于table指定的百分比宽度，则按百分比显示；但是如果指定了table的百分比，并且第一行的每个单元格的宽度之和要大于table指定的百分比宽度，则按第一行的每个单元格的宽度之和显示；同理，如果table指定了固定值，也是同上面一样的呈现。<br />说明：(说明部分转载)<br /> 设置或检索表格的布局算法。<br /> 你可以通过此属性改善表格呈递性能。此属性导致IE以一次一行的方式呈递表格内容从而提供给信息用户更快的速度。此属性依据此下顺序使用其中一种方式  布置表格栏宽度：<br /><br />使用 col 或 colGroup 对象的宽度( width )属性信息。<br /><br />使用表格第一行内的单元格的宽度( width )信息。<br /><br />依据表格列数等分表格宽度。而不考虑表格内容的实际宽度。 <br />假如单元格的内容超过了列宽度，内容将会被换行。假如无法换行，则内容会被裁切。假如此属性被设置为 fixed ，则 overflow 能够被用于控制处理溢出单元格( td )宽度的内容。假如表格行高度被指定了，那么换行的内容如果超出了指定表格行高度也会在纵向上被裁切。 <br />设置此属性值为 fixed ，有助于提高表格性能。对于长表格效果尤其显著。<br />设置表格行高可以进一步提高呈递速度，浏览器不需要检测行内每一个单元格内容去确定行高就可以开始解析以及呈递。<br />此属性对于 currentStyle 对象而言是只读的。对于其他对象而言是可读写的。<br />对应的脚本特性为 tableLayout 。<br /><br />&lt;table bgcolor="red" style="table-layout:fixed"><br />&lt;tr><br />&lt;td  style="width:100px;overflow: hidden; text-overflow:ellipsis;word-break:keep-all" ><br />这就是你看到的效果了，如果你没有看到的话就对了，如果所有的都看到了那你肯定是什么地方弄错了，没关系，再试试！<br />&lt;/td><br />&lt;/tr><br />&lt;/table>
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/238081" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 07 Sep 2008 13:50:42 +0800</pubDate>
        <link>http://www.javaeye.com/topic/238081</link>
        <guid>http://www.javaeye.com/topic/238081</guid>
      </item>
      <item>
        <title>HADOOP的初次尝试</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://limimgjie.javaeye.com">LIMIMGJIE</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237629" style="color:red;">http://www.javaeye.com/topic/237629</a>&nbsp;
          发表时间: 2008年09月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Hadoop的下载地址：<br />http://www.apache.org/dyn/closer.cgi/hadoop/core/<br />版本：hadoop0.17.1<br /><br />JDK的安装：<br />要求必须安装jdk1.5.07以上的版本。<br /><br /><br />分步式环境的搭建：<br />1、	硬件环境<br />我们采用了3台机器来构建,都安装的是Red Hat 4.1.2-42系统，并且都有一个名为“mingjie“的帐号，如下：<br />           主机名称：hdfs1    ip:192.168.0.221        功能：NameNode,JobTracker<br />           主机名称：hdfs2    ip:192.168.0.227       功能：DataNode,TaskTracker<br />主机名称：hdfs3    ip:192.168.0.228       功能：DataNode,TaskTracker<br /><br />重点：修改3台机器的/etc/hosts,让彼此的主机名称和ip都能顺利解析<br />         127.0.0.1       localhost<br />          192.168.0.37    hdfs1<br />          192.168.0.43    hdfs2<br />          192.168.0.53    hdfs3<br />2、	每台机器都要安装java环境，我们的路径统一为“/opt/modules/jdk1.6“,并添加到系统环境变量sudo vi /etc/profile<br /><br />JAVA_HOME=/opt/modules/jdk1.6<br />PATH=$JAVA_HOME/bin:$PATH:$CATALINA_HOME/bin<br />CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/tools.jar<br />export JAVA_HOME<br />3、	下载hadoop0.17.1，将hadoop解压到/home/mingjie/,建议最好也将hadoop的目录添加到环境变量里面去:<br /><br />HADOOP_HOME=/home/mingjie/hadoop-0.17.1 	#这是hadoop的主目录   <br />export HADOOP_HOME<br />HADOOP_CONF_DIR=$HADOOP_HOME/conf   #这是hadoop的配置文件目录<br />export HADOOP_CONF_DIR<br />HADOOP_LOG_DIR=/home/mingjie/hadoop-0.17.1/log    ＃存放运行日志目录   <br />export HADOOP_LOG_DIR   <br />export PATH=$PATH:$HADOOP_HOME/bin<br /><br />4、	安装ssh,并生成公钥和私钥<br />	运行 ssh-keygen -t rsa，根据屏幕提示直接选择“回车”<br />	会在用户目录~/.ssh/产生两个文件，id_rsa，id_rsa.pub<br />	cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys  <br />以上配置完成后，执行一下ssh localhsot,确认你的每台机器都可以使用ssh<br /><br />5、	将master服务器上的authorized_keys的内容加到slave两台机器的authorized_keys文件中。让master也可以不需要密码访问2台slave服务器。<br /><br />sudo scp authorized_keys hdfs2:/home/mingjie/.ssh/   <br />sudo scp authorized_keys hdfs3:/home/mingjie/.ssh/    <br />ssh hdfs2   <br />ssh hdfs3  <br />6、	接下来，我们要修改hadoop的[conf/masters]、[conf/slaves]这2个文件：<br />       Master设置(&lt;HADOOP_HOME>/conf/masters):hdfs1<br />       Slave设置(&lt;HADOOP_HOME>/conf/slaves):hdfs2 hdfs3<br />7、	修改［conf/hadoop-env.sh］：<br />       export JAVA_HOME=/opt/jdk1.6.0_03<br />8、	修改［conf/hadoop-site.xml],这里只是几个常用的属性配置，有关hadoop的性能优化调整，需要研究hadoop-default.xml:<br />&lt;configuration><br />   &lt;property>   <br />      &lt;name>fs.default.name&lt;/name>//你的namenode的配置，机器名加端口   <br />      &lt;value>hdfs://hdfs1:54310/&lt;/value><br />   &lt;/property><br />   &lt;property><br />     &lt;name>mapred.job.tracker&lt;/name>//你的JobTracker的配置，机器名加端口   <br />      &lt;value>hdfs://hdfs1:54311&lt;/value><br />   &lt;/property><br />   &lt;property><br />      &lt;name>dfs.replication&lt;/name>//数据需要备份的数量，默认是三   <br />      &lt;value>1&lt;/value><br />   &lt;/property><br />   &lt;property><br />      &lt;name>hadoop.tmp.dir&lt;/name>//Hadoop的默认临时路径，这个最好配置，如果在新增节点或者其他情况下莫名其妙的DataNode启动不了，就删除此文件中的tmp目录即可。不过如果删除了NameNode机器的此目录，那么就需要重新执行NameNode格式化的命令。    <br />      &lt;value>/home/mingjie/hadoop-0.17.1/tmp/&lt;/value><br />   &lt;/property><br />   &lt;property>   <br />      &lt;name>mapred.child.java.opts&lt;/name>//java虚拟机的一些参数可以参照配置   <br />      &lt;value>-Xmx512m&lt;/value><br />   &lt;/property><br />   &lt;property>  <br />      &lt;name>dfs.block.size&lt;/name>//block的大小，单位字节，后面会提到用处，必须是512的倍数，因为采用crc作文件完整性校验，默认配置512是checksum的最小单元。  <br />      &lt;value>5120000&lt;/value><br />      &lt;description>The default block size for new files.&lt;/description><br />   &lt;/property><br />&lt;/configuration><br />9、	 然后将hadoop的整体环境拷贝到hdfs2、hdfs3上面去<br />    scp -r /home/mingjie/hadoop.0.17.1 hdfs2:/home/mingjie/ hadoop.0.17.1<br />    scp -r /home/mingjie/ hadoop.0.17.1 hdfs3:/home/mingjie/ hadoop.0.17.1<br />10、	在hdfs1这个namenode上面格式化一个新的分布式文件系统HDFS，就是hadoop-site.xml文件中指定的hadoop.tmp.dir路径<br />         &lt;HADOOP_HOME>/bin/hadoop namenode –format<br /><br />到此大致上就完成了hadoop环境布署<br />        启动hadoop：&lt;HADOOP_HOME>/bin/start-all.sh<br />停止hadoop：&lt;HADOOP_HOME>/bin/stop-all.sh<br /><br />说明：<br />    (1) 执行启动Hadoop进程后，<br />	在master服务器会启动3个java进程,分别的NameNode,SecondNameNode,JobTracker,在LOG目录下会产生2个文件，分别对应NameNode的运行日志和JobTracker的运行日志，<br />	在slave服务器会启动2个java进程，分别为DataNode,TaskTracker，,在LOG目录下会产生2个文件，分别对应DataNode的运行日志和TaskTracker的运行日志，可以通过查看日志分析hadoop的启动是否正确。<br /> (2) 通过IE浏览分布式文件系统中的文件<br />	访问 http://hdfs1:50030 可以查看JobTracker的运行状态。<br />	访问 http://360quan-1:50060可以查看 TaskTracker的运行状态。<br />	访问 http://360quan-1:50070可以查看NameNode以及整个分布式文件系统的状态。
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237629" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 15:19:15 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237629</link>
        <guid>http://www.javaeye.com/topic/237629</guid>
      </item>
      <item>
        <title>Java 调用数码相机的拍照功能</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lpeitu.javaeye.com">lpeitu</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237773" style="color:red;">http://www.javaeye.com/topic/237773</a>&nbsp;
          发表时间: 2008年09月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近在做一个项目的时候，要求从纸质材料变成电子档的过程，客户提了一中方式：数码相机。而我们又没这方面的开发经验（关键是时间紧迫），而我给客户提出使用扫描仪的方案。客户马上对扫描速度提出质疑（使用的是普通扫描仪）。有没有人有关于用Java实现调用数码相机的经验，拿出来供大家学习下。最好能提供具体数码相机的型号和脚本接口。</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237773" style="color:red;">已有 <strong>3</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 21:10:45 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237773</link>
        <guid>http://www.javaeye.com/topic/237773</guid>
      </item>
      <item>
        <title>Rete算法的rete network和pattern match</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chillwarmoon.javaeye.com">chillwarmoon</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237883" style="color:red;">http://www.javaeye.com/topic/237883</a>&nbsp;
          发表时间: 2008年09月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          毕业论文发表了半年多了，现在将论文中关于rete算法的部分截取出来，希望对大家有所帮助。论文中都是原创，转载请注明出处http://chillwarmoon.javaeye.com
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237883" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 06 Sep 2008 13:01:51 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237883</link>
        <guid>http://www.javaeye.com/topic/237883</guid>
      </item>
      <item>
        <title>大家看看这种拦截器的注解方式是否可行</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://stworthy.javaeye.com">stworthy</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237857" style="color:red;">http://www.javaeye.com/topic/237857</a>&nbsp;
          发表时间: 2008年09月06日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>想在自已的ET-MVC项目中加入拦截器功能，并想用注解的方式解决问题，目前实现了BeforeFilter,AfterFilter,AroundFilter,BeforeFilters,AfterFilters,AroundFilters这六个。</p>
<p>大概的用法想是这样：</p>
<pre name="code" class="java">@BeforeFilter(execute="beforeFilter1")
@AfterFilter(execute="afterFilter1",except={"show"})
@AroundFilters({@AroundFilter(execute=TestAroundFilter1.class),@AroundFilter(execute=TestAroundFilter2.class)})
public class UserController extends ApplicationController{
    public TextView index(){
        System.out.println("execute index action");
        return new TextView("hello,index");
    }
    
    public TextView show(){
        System.out.println("execute show action");
        return new TextView("user info");
    }
    
    private boolean beforeFilter1(){
        System.out.println("user beforeFilter1");
        return true;
    }
    private boolean afterFilter1(){
        System.out.println("user afterFilter1");
        return true;
    }
}
</pre>
<p>TestAroundFilter1.java的代码如下：</p>
<pre name="code" class="java">public class TestAroundFilter1 implements AroundHandler{
    public boolean before(BaseController controller){
        System.out.println("around before1");
        return true;
    }
    public boolean after(BaseController controller){
        System.out.println("around after1");
        return true;
    }
}
</pre>
&nbsp;
<p>在浏览器中输入http://localhost:8084/myweb/user/index.do，可以看到TOMCAT中输出：</p>
<p>user beforeFilter1<br />around before1<br />around before2<br />execute index action<br />around after2<br />around after1<br />user afterFilter1</p>
<p>&nbsp;</p>
<p>现在正在考虑这样的注解是否合适，有没有更好的注解方式，是放在类一级好还是放在方法一级好。望大家能给个意见。</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237857" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 06 Sep 2008 11:20:17 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237857</link>
        <guid>http://www.javaeye.com/topic/237857</guid>
      </item>
      <item>
        <title>使用Mina出现的JNI OutOfMemory的解决方法</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhao3546.javaeye.com">zhao3546</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237802" style="color:red;">http://www.javaeye.com/topic/237802</a>&nbsp;
          发表时间: 2008年09月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最新在使用MINA作了UDP服务器和UDP客户端，在最后性能测试时，总是遇到OutOfMemory的问题，很是郁闷，定位了三天，后来终于找到了解决方法。和大家分享一下，以免大家再走同样的弯路。<br /><br />我们性能测试场景如下：<br />Client起100个线程同时向Server发UDP消息，Server接收到请求后立即向Client回响应；<br />在前10秒内，服务器响应特别快，大概每秒可以达到4000个消息，但到了10多秒后，服务器的响应就越来越慢，后来基本上就不响应，又或者直接OutOfMemory，并出现下面的错：<br />request &lt;size> bytes for &lt;reason>. Out of swap space?<br /><br />一开始我们一直以为是缓存中的对象未清理掉而导致的问题，定位了一段时间后，发现缓存中的内容已经及时清理了。打开GC日志，也没有发现问题。<br /><br />后来，我们就开始上网狂找资料，发现原来Java内存分为两种，Heap内存和JVM使用的内存，<br />Heap内存就是一般的JAVA对象使用内存；<br />JVM使用的内存，就是指JVM在运行过程中要使用的内存，JVM最终要通过调用JNI，本地方法运行也是需要内存的，这部分内存JVM直接向OS申请。<br /><br />既然我们自己的代码中使用的JAVA对象已经及时清理，那是不是JNI内存泄漏了？可是我们的代码，基本上没有使用JNI啊。难道是MINA的问题？大概看了下MINA的源码，MINA是使用Java的NIO包下的类来实现的，打开Java的-verbose:jni选项，可以看出，NIO中的类很多都是通过JNI来实现的。<br /><br />好了，继续定位，发现我们的代码中，大量使用了MINA提供的IoBuffer类，MINA为我们构造了大量的IoBuffer对象，我们自己也构造了大量的IoBuffer对象，会不会这个类的对象没有及时清理？<br /><br />带着疑问，我看了IoBuffer的所有方法，其中有个free()方法，看了注释，是用来清理内存的。<br />于是尝试在所有使用完IoBuffer的代码处都加上了调用free()方法的代码，再进行测试，终于OK了。<br /><br />UDP服务器稳定运行后，内存最大只使用了200多M，问题搞定。<br /><br />所有使用Java的NIO包下的类，最好都多注意下JDK文档，看是否需要主动调用某方法来释放内容。
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237802" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 23:53:43 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237802</link>
        <guid>http://www.javaeye.com/topic/237802</guid>
      </item>
      <item>
        <title>配置继承模式</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mikab.javaeye.com">mikab</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237134" style="color:red;">http://www.javaeye.com/topic/237134</a>&nbsp;
          发表时间: 2008年09月04日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本人曾供职于一家国内的还算比较大MIS系统开发商，工作的主要内容是用一套有默认实现的模板式框架去开发一些业务应用系统。在开发的过程中，开发工作的绝大部分内容是配置和写展示用的jsp(没有其他的模板技术)。搞jsp我不在行，于是我就把目标放在了如何减少配置的工作量。这也就是配置继承模式的来源了。到今天算是小有所成，本着请共享和求教的愿望，把我的东西贴出来，希望各位JE大牛帮忙给点意见，本人不甚感激。<br />	话归正题，所谓配置继承呢，准确的应该叫配置信息继承，是指从功能对配置信息的需要出发，按照功能、模块、系统划分建立对应的树形配置域，仿照类继承的方式（系统域是最顶层的父类，功能是最底层的子类）而配置信息获取和管理的模式。在配置继承中，强调功能对配置信息具有控制权：可添加、覆盖、删除配置项；同时配置信息又是可从父域继承而来的：共性信息可以在上级配置以达到共享的目的。除此之外，在其中还加上了以正则表达式为基础的模式的使用，有点像struts1.2以后的通配符的使用。<br />	举例来说，假设在一个比较简单的web系统内有四个功能分别是功能1、功能2、功能3、功能4，其中功能1、功能2是属于模块A的，功能3、功能4是属于模块B的，系统数据源在JNDI中的名字是需要配置的，而且系统在现阶段只是访问一个数据库实例。我们过去的做法是直接建立一个全局共享的配置，里面写明数据源的jndi名。但是世界总是在进步，突然有一天，我们发现一个数据库已经满足不了性能的需要了，需要将一部分功能移植到另外一个新的数据库上面去。首先移的是功能4，数据库的移植和数据的交互先且不说，功能4的程序如何来改呢？我们痛苦的改了一下，凑合着能用了。但是发现移植了功能4的数据访问后还不能满足需要，打算也把功能3移植过去，于是我们又受尽了折磨的把功能3代码改的凑合能用了。但是突然有一天，我们客户对硬件做了个大升级，上了一个无比NIU的数据库，于是我们又需把所有的功能的数据库访问代码改到访问新的数据库上去，这下我们崩溃了，以前不就是白白折腾了嘛。<br />	如果使用配置继承来说，我们首先是在系统域上配置好数据源的名字就可以，通过继承全系统使用这个数据源。到需要移植功能4的时候，我们只需要在功能4的配置信息里覆盖默认继承来的数据源的名字就可以了。移植完了功能3之后呢，我们只需要在模块B那里配置使用新的数据源，把功能4的特殊配置去掉就可以了。如果是完全的移植数据库，那么我们只需要将系统域的配置修改，并且去掉了模块B的特殊配置就可以。可以看到，配置继承是兼顾灵活和共享的一种配置信息的管理模式，特别使用于各个功能的实现的大部分配置信息是相同的情况。当然，要使用配置继承，在功能实现的时候，就需要按照功能去取配置信息的集合，而不是直接引用全局配置信息的集合，这一点和原来的编程方式是有很大的区别。<br />	我做了个配置继承的实现，但是弄了之后个人觉得实现的太糙，而且在实现对spring、struts、hibernate的支持时由于不熟觉得有点摸不着边，因此特别希望有大牛能给一些指导意见，最好是能有感兴趣的朋友跟我一起把他做下去。我把我的实现的代码都已经传到http://code.google.com/p/pyramid/上了,现在主要实现了对XML格式的配置文件的支持，请大家多多指教。<br />	个人MSN:mikabpeng@msn.com,欢迎大家交流。
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237134" style="color:red;">已有 <strong>2</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 04 Sep 2008 18:19:38 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237134</link>
        <guid>http://www.javaeye.com/topic/237134</guid>
      </item>
      <item>
        <title>ibatis中的事物传播机制</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://the3oooo.javaeye.com">Joo</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237245" style="color:red;">http://www.javaeye.com/topic/237245</a>&nbsp;
          发表时间: 2008年09月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我们这边在使用ibatis进行事务管理的时候遇到的了一个问题：IBATIS中好像不能设置事务的传播机制。<br /><br />当存在方法foo（）和doo（），并且在此两方法上都加上了事务管理。在foo（）方法代码中调用了doo（）方法，运行时就会报错提示已经存在一个事务。我记得在EJB中是可以设置事务的传播机制的比如Requirs、RequiresNew等让控制权在到达一个新的方法的事务中的时候选择继续沿用之前的额事务还是另外开启一个等。所以我们现在在比较底层的方法比如DAO和领域对象的方法上都没有添加事务，而是把事务加在了Action一层的方法上，但是感觉这样比较奇怪啊，不知道大家一般如何解决的？ 谢谢!!!<br /><br /><br />抑或本来就不应该由ibatis来管理事务?但是当前的情况是不能用Hibernate,不能用Spring,没有EJB...-_-|||
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237245" style="color:red;">已有 <strong>4</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 02:53:39 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237245</link>
        <guid>http://www.javaeye.com/topic/237245</guid>
      </item>
      <item>
        <title>struts2 的一二三</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jonson.javaeye.com">jonson</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237799" style="color:red;">http://www.javaeye.com/topic/237799</a>&nbsp;
          发表时间: 2008年09月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近由于项目需要，对strusts2做了一些学习。和大家分享下学习的心得。<br />  发现struts2和webwork有着惊人的相似。struts2其实用的还是webwork包里的拦截器。原理上来说struts2是对http请求在容器的filter层做了拦截。并且对servlet层做了包装。我们可以不需要提供serlet了，而是只要提供一个方法就可以了。只要方法符合它的要求就可以了。其实要求也比较宽泛，只要方法返回一个字符串，如果需要传递数据，则提供一个数据容器bean及bean的属性代理方法。这样子就可以和页面传递数据了。 还有一个需要注意的是，struts2现在的页面数据是在页面上通过tag 来 pull出来的。对 EL没有支持。即原来struts1里面 我们去数据可以 <pre name="code" class="java">${&lt;the var in the request>}</pre>，通过tag，但是原理上差别不大。觉得这样子可以比较专注于业务逻辑处理。<br />  还是来段代码把，嘴上说的太虚，还是真刀真枪的干才是真理啊。<br />  <pre name="code" class="java">
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.yqg;

/**
 *
 * @author jonson_yu
 */
public class HelloWorld {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
    
    public String doWork(){
        //TODO  do you own work
        
        //传递name数据到页面上。当然这个string类型的bean可以是任意的你自定义的bean。
        setName("your name!");
        //返回的字符串要符合默认规则。success会默认的找到配置文件里的第一配置的跳转页面
        //作为跳转页。  也可以自己定义跳转名字，要在配置文件里配置。
        if(false){
            return "goOtherPage";
        }
        return "success";
    }
}

</pre><br /><pre name="code" class="java">
&lt;actions package=""...>
    &lt;action name="dowork" class="com.yqg.HelloWorld" method="doWork">
        &lt;result name="goOtherPage">/otherPage.jsp&lt;/result>
    &lt;/action>
&lt;/actions>
</pre><br /><br />  关于具体配置的网上文章比较多，可以看 <a href="http://xuliangyong.javaeye.com/blog/72862" target="_blank">http://xuliangyong.javaeye.com/blog/72862</a> 这里。整个用下来感觉struts2还是非常不错的一个框架。让我们更专注于业务逻辑。但是在开发过程中发现，大量的发射调用，在性能上有所下降。没有做具体的测试，不知有没有哪位有比较深入的研究性能的。
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237799" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 23:18:37 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237799</link>
        <guid>http://www.javaeye.com/topic/237799</guid>
      </item>
      <item>
        <title>【问题】如何在spring-aop中用@DeclareParents 扩展接口，调用被扩展类的对象</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://nlslzf.javaeye.com">nlslzf</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237570" style="color:red;">http://www.javaeye.com/topic/237570</a>&nbsp;
          发表时间: 2008年09月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://forum.springframework.org/showthread.php?t=59770" target="_blank">http://forum.springframework.org/showthread.php?t=59770</a><br />希望能够动态的给user类增加接口getContent,该接口直接返回User的toString方法的结果<br /><br />据说基于spring aop达不到访问adviced object的目标，于是，将问题通过aspectj得到解决<br /><pre name="code" class="java">
package com.yyhy.java.search.compass;

import org.aspectj.lang.JoinPoint;

public aspect CompassAOP {

	declare parents: com.yyhy.java.GenericCoder.* extends DefaultCompassableImpl;
    declare parents: com.yyhy.java.Privilege.* extends DefaultCompassableImpl;
    declare parents: com.yyhy.hx.zcdfk.* extends DefaultCompassableImpl;
    declare parents: com.yyhy.hx.jgpmk.* extends DefaultCompassableImpl;
    declare parents: com.yyhy.log.* extends DefaultCompassableImpl;

public pointcut compass():execution(* *.getContent(..));
Object around():compass(){
   return thisJoinPoint.getThis().toString();
}
}
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237570" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 13:58:22 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237570</link>
        <guid>http://www.javaeye.com/topic/237570</guid>
      </item>
      <item>
        <title>关于SAAS软件的设计讨论</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://he--bei.javaeye.com">he__bei</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237549" style="color:red;">http://www.javaeye.com/topic/237549</a>&nbsp;
          发表时间: 2008年09月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本人今天无意中看到了阿里软件的公共平台（孤陋寡闻），也在上面使用了一个下的软件，想就使用时的一些软件设计的疑问听听大家的意见<br /><br />就拿最简单的一个人事系统而言，放在阿里这种公共平台上面发布时，先不说数据安全性的问题，多个用户之间的数据隔离性的问题怎么在软件设计是预先考虑<br /><br />也想听听大家在这方面的经验
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237549" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 13:37:40 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237549</link>
        <guid>http://www.javaeye.com/topic/237549</guid>
      </item>
      <item>
        <title>各种数组排序方法总结</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://javajack.javaeye.com">javajack</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237517" style="color:red;">http://www.javaeye.com/topic/237517</a>&nbsp;
          发表时间: 2008年09月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>前一段时间面试，经常遇到有关排序的面试题，闲了无事，将各种排序方法用java写了一下。</p>
<p>代码如下：</p>
<pre name="code" class="java">import java.lang.Math;
import java.util.Random;

/**
 * 排序
 * 
 * @author javajack  
 */
public class OrderTest {

	public static void main(String args[]) {
		OrderTest.ExecOrder(2);
	}

	/**
	 * 交换值，交换数组的两个值
	 * @param array
	 * @param i
	 * @param j
	 */
	private static void swap(int[] array,int i, int j)
	{
		int tmp = array[i];
		array[i] = array[j];
		array[j] = tmp;
	}	
	
	/**
	 * 
	 * @param method
	 *            1为升序，2为降序
	 */
	public static void ExecOrder(int method) {
		int[] array = null;
		array = initArray(10, 210, 10);
		
		 //int[] orderarray = bubbleOrder(array,method);
		int[] orderarray = doubleBubbleOrder(array,method);
		//int[] orderarray = insertOrder(array, method);
		//int [] orderarray = quickOrder(array,method);
		//int[] orderarray = selectOrder(array, method);
		for (int i = 0; i &lt; orderarray.length; i++) {
			System.out.println(orderarray[i]);
		}
	}

	/**
	 * 取随机数据，初始化一个数组
	 * 
	 * @param min
	 *            随机数的最小值
	 * @param max
	 *            最大值
	 * @param size
	 *            取得随机数的数量
	 * @return
	 */
	public static int[] initArray(int min, int max, int size) {
		int[] init = new int[size];

		for (int i = 0; i &lt; size; i++) {
			Random ra = new Random();
			init[i] = min + (int) (Math.random() * (max - min + 1));
			System.out.println(i + "-------" + init[i]);
		}
		return init;
	}

	/**
	 * 交换排序方法
	 * 原理：依次交换值
	 * @param array
	 * @return
	 */
	public static int[] convertOrder(int[] array, int method) {
		for (int i = 0; i &lt; array.length; i++) {
			for (int j = i + 1; j &lt; array.length; j++) 
			{
				if (method==2)
				{
					if (array[i] &lt; array[j]) 
						swap(array,i,j);
				}else if (method == 1) {
					if (array[i] &gt; array[j]) 
						swap(array,i,j);
				}
			}
		}
		return array;
	}

	/**冒泡排序方法
	 * 原理：从最后一个开始将小的或大的逐渐冒出
	 * @param array
	 * @param method
	 * @return
	 */
	public static int[] bubbleOrder(int[] array,int method)
	{
		for(int i=0;i&lt;array.length;i++)
		{
			for (int j=array.length -1 ;j&gt;i;j--)
			{
				if (method==2)
				{
					if (array[i] &lt; array[j])
						swap(array,i,j);
				}else if (method==1)
					if (array[i] &gt; array[j])
						swap(array,i,j);
			}
		}
		return array;
	}
	
	/**
	 * 双向冒泡排序
	 * 原理：类似于冒泡排序，只不过是双向的
	 * @param array
	 * @param method
	 * @return
	 */
	public static int[] doubleBubbleOrder(int[] array,int method)
	{
		int left = 0;
		int right = array.length -1 ;
		while (left &lt; right)
		{
			for(int i=left;i&lt;=right;i++)
			{
				if (method==1)
				{
					if (array[left] &gt; array[i])
						swap(array,left,i);
				}else
				{
					if (array[left] &lt; array[i])
						swap(array,left,i);
				}
			}
			
			for (int i=left+1;i&lt;=right;i++)
			{
				if (method==1)
				{
					if (array[right] &lt; array[i])
						swap(array,right,i);
				}else
				{
					if (array[right] &gt; array[i])
						swap(array,right,i);
					
				}
			}
			left++;
			right--;
		}
		return array;
	}
	
	/**
	 * 快速排序方法，运用到递归
	 * 排序原理：随机找到一个值，然后以此值大小进行分为两个数组，大的放左边，小的放右边，
	 * 然后再对左右两侧的数据依次排序根据
	 * @param array
	 * @param method
	 * @return
	 */
	public static int[] quickOrder(int[] array, int method) 
	{
		quickDeal(array,0,array.length - 1,method);
		return array;
	}

	/**
	 * 
	 * @param array
	 * @param begin
	 *            开始位置
	 * @param end
	 *            结束位置
	 */
	private static void quickDeal(int[] array, int begin, int end,int method) {
		if (end &gt; begin) {
			int pos = begin + (int) (Math.random() * (end - begin + 1)); // 计算分隔位置
			int posvalue = array[pos]; // 取得分隔位置的值
			swap(array,pos,end); //将posvalue放到最end的位置
			pos=begin; //初始化pos
			for (int i=begin; i &lt; end; i++) {
				if (method==1)
				{	
					if (array[i] &lt; posvalue) { //当小于posvalue时，将此值移动到pos位置，也就是向前移动
						swap(array,pos,i); 
						pos++; //移动后pos增1
					}
				}else if(method == 2)
				{
					if (array[i] &gt; posvalue) { //当小于posvalue时，将此值移动到pos位置，也就是向前移动
						swap(array,pos,i); 
						pos++; //移动后pos增1
					}
				}
			}
			swap(array,pos,end); //end位置的值前移
			quickDeal(array,begin,pos -1,method);
			quickDeal(array,pos+1,end,method);
		}

	}

	/**
	 * 插入排序方法
	 * 排序原理：抽出一个数，做为排序基序列，然后依次抽出其它数与，与此序列中的数进行比较，放入合适的位置
	 * @param array
	 * @param method
	 * @return
	 */
	public static int[] insertOrder(int[] array, int method) {

		for (int i = 1; i &lt; array.length; i++) {
			if (method == 1) {
				if (array[i - 1] &gt; array[i]) {
					int tmp = array[i]; //
					int j = i - 1;
					do {
						array[j + 1] = array[j];
						j--;
					} while (j &gt;= 0 &amp;&amp; tmp &lt; array[j]); //当j&gt;=0并且 当前值大于数据中j位置的值时移动
					array[j + 1] = tmp; //插入排序值
				}
			} else if (method == 2) {
				if (array[i - 1] &lt; array[i]) {
					int tmp = array[i]; 
					int j = i - 1;
					do {
						array[j + 1] = array[j];
						j--;
					} while (j &gt;= 0 &amp;&amp; tmp &gt; array[j]);
					array[j + 1] = tmp;
				}
			}
		}
		return array;
	}

	/**
	 * 选择排序方法
	 * 排序原理：每次选择一个最大的或最小的数放到已排序序列中
	 * @param array
	 * @param method
	 * @return
	 */
    public static int[] selectOrder(int[] array,int method)
    {
    	for (int i=0;i&lt;array.length - 1;i++) 
    	{
    		int tmp = array[i];
    		int pos = i+1; //记录大值或小值的位置　
    		for (int j=i+1;j&lt;array.length;j++)
    		{
    			if (method==1)
    			{
        			if (array[j]&lt;tmp)
        			{
        				tmp = array[j];
        				pos= j ;//记录大值或小值的位置
        			}
    			}else if (method==2)
    			{
        			if (array[j]&gt;tmp)
        			{
        				tmp = array[j];
        				pos= j ;//记录大值或小值的位置
        			}
    			}
    		}
    		if (tmp != array[i])
    			swap(array,i,pos); //不相同时交换
    	}
    	return array;
    }

    
}
</pre>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237517" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 13:04:17 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237517</link>
        <guid>http://www.javaeye.com/topic/237517</guid>
      </item>
      <item>
        <title>SNA方案之session炒冷饭</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ronghao.javaeye.com">ronghao</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/236866" style="color:red;">http://www.javaeye.com/topic/236866</a>&nbsp;
          发表时间: 2008年09月04日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p style="margin-left: 42pt; text-indent: 0cm;"><br />SNA方案中，session的处理是一个重要方面。<br /><br />原帖见这里：<a href="../../../topic/200611">http://www.javaeye.com/topic/200611</a><br /><br />原帖里提到的两种方案都需要hack代码。<br /><br />下面是我的方案：<br /><br />1、使用会话cookie保存web服务器产生的sessionid<br />&nbsp;&nbsp; 为什么是sessionid而不是userid，原因在于谁也不知道除去登录外其他人会在httpsession里干些什么<br /><br />2、自定义SessionMap&lt;String,Serializable&gt;同步保存httpsession内的信息<br />&nbsp;&nbsp; 自定义SessionMap同步httpsession，在操作httpsession时不用改变调用接口，不用东张西望<br /><br />3、使用分布式缓存memcached保存自定义SessionMap&lt;String,Serializable&gt;<br /><br />4、会话胶粘<br />&nbsp;&nbsp; 未失败转发的情况下没必要在memcached和httpsession之间复制来复制去，眉来眼去<br /><br />5、使用SnaFilter处理失败转发<br /><br />6、使用HttpSessionListener实现SessionMap&lt;String,Serializable&gt;的过期<br />&nbsp;&nbsp; 利用容器session 机制的好处,httpsession过期的时候干掉memecached里的SessionMap</p>
<p style="margin-left: 42pt; text-indent: 0cm;">&nbsp;</p>
<p style="margin-left: 42pt; text-indent: 0cm;"><span style="font-family: 宋体;">下面根据</span>web<span style="font-family: 宋体;">请求的过程分情况讨论该方案：</span></p>
<p style="margin-left: 60pt; text-indent: -18pt;"><strong><span style="font-family: 宋体;">A、登录</span></strong></p>
<p style="margin-left: 60pt; text-indent: -18pt;"><strong><span style="font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/login1.gif" border="0" height="420" alt="" width="567" /><br />
</span></strong></p>
<p style="margin-left: 60pt; text-indent: 0cm;"><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p style="margin-left: 60pt; text-indent: 0cm;"><span style="font-family: 宋体;">根据请求的</span>url<span style="font-family: 宋体;">判断是否是登录请求</span></p>
<p style="margin-left: 60pt; text-indent: 0cm;"><span style="font-family: 宋体;">在线人数保存在</span>memcached<span style="font-family: 宋体;">里</span></p>
<p style="margin-left: 60pt; text-indent: -18pt;"><strong><span style="font-size: 12pt;">B、&nbsp;</span><span style="font-family: 宋体;">正常请求</span></strong></p>
<p style="margin-left: 60pt; text-indent: -18pt;"><strong><span style="font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/normal1.gif" border="0" height="445" alt="" width="567" /><br />
</span></strong></p>
<p style="margin-left: 60pt; text-indent: 0cm;"><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p style="margin-left: 60pt; text-indent: -18pt;"><strong><span style="font-size: 12pt;">C、&nbsp;</span><span style="font-family: 宋体;">失败转发</span></strong></p>
<p style="margin-left: 60pt; text-indent: -18pt;"><strong><span style="font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/fail1.gif" border="0" height="424" alt="" width="581" /><br />
</span></strong></p>
<p style="margin-left: 60pt; text-indent: 0cm;"><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p style="margin-left: 60pt; text-indent: -18pt;"><strong><span style="font-size: 12pt;">D、</span><span style="font-family: 宋体;">登出</span></strong></p>
<p style="margin-left: 60pt; text-indent: -18pt;"><strong><span style="font-family: 宋体;"><img src="http://www.blogjava.net/images/blogjava_net/ronghao/logout1.gif" border="0" height="458" alt="" width="567" /><br />
</span></strong></p>
<p style="margin-left: 60pt; text-indent: 0cm;"><span><!--[if gte vml 1]>
<![endif]--></span></p>
<p style="margin-left: 60pt; text-indent: 0cm;"><span style="font-family: 宋体;">根据请求的</span>url<span style="font-family: 宋体;">判断是否是登出请求</span></p>
<p style="margin-left: 60pt; text-indent: -18pt;"><strong>E、HttpSession<span style="font-family: 宋体;">过期</span></strong></p>
<p style="margin-left: 60pt; text-indent: 0cm;"><span style="font-family: 宋体;">不</span>hack memcached<span style="font-family: 宋体;">，使用</span>HttpSessionListener<span style="font-family: 宋体;">，</span>sessionDestroyed<span style="font-family: 宋体;">事件时根据</span>sessionid<span style="font-family: 宋体;">删除</span>memcached<span style="font-family: 宋体;">里的</span>sessionMap<span style="font-family: 宋体;">（如果存在）</span></p>
<p style="margin-left: 60pt; text-indent: 0cm;">&nbsp;</p>
<p style="margin-left: 21pt; text-indent: 0cm;"><span style="font-family: 宋体;">关于在线人数的统计：在线人数存储在</span>memcached<span style="font-family: 宋体;">里，将在线人数与</span>sessionMap<span style="font-family: 宋体;">绑定，往</span>memcached<span style="font-family: 宋体;">里增加</span>sessionMap<span style="font-family: 宋体;">时在线人数</span>+1<span style="font-family: 宋体;">，删除时</span>-1.</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/236866" style="color:red;">已有 <strong>5</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 04 Sep 2008 14:49:19 +0800</pubDate>
        <link>http://www.javaeye.com/topic/236866</link>
        <guid>http://www.javaeye.com/topic/236866</guid>
      </item>
      <item>
        <title>JIMI、JAI和ImageIO的一些感想</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yipsilon.javaeye.com">yipsilon</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237248" style="color:red;">http://www.javaeye.com/topic/237248</a>&nbsp;
          发表时间: 2008年09月05日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近研究个项目，涉及到多页TIFF分页保存问题。于是就研究呀研究....找到了三个库JIMI、JAI和JAI-ImageIO，于是开始测试啦。<br /><br />首先，想着ImageIO是未来的发展方向，所以就把这个库列在前面。把JAI-ImageIO库加到classpath和librarypath中，用ImageIO写了代码，结果运行出错，打印出ImageReader所支持的后缀和格式名称，发现居然没有TIFF的支持，而ImageWriter有。很奇怪都是JAI为什么ImageIO不支持。<br /><br />接着，用JAI库来写。同样配置好后，写完代码测试很完美。通过！！<br /><br />然后呢，在网上看到文章说JIMI比JAI处理图片速度快，于是又写了一个JIMI库的代码。发现效率都差不多嘛。可能是我用的地方不对吧，但是JIMI有个好处就是没有那些DLL文件，纯Java的，挺爽...<br /><br />后来，在官方网站上看到一些消息，让我彻底放弃了JIMI。因为那上面说JIMI是Java 1.1的时候作为扩展图像库使用的，目前已经不怎么开发了。而JAI是从Java 2以后SUN重点研发的扩展图像操作库。ImageIO则是从 Java 1.4 之后引入的图像操作包，目前它的API已经集成在JRE中了。不过可惜的是，JAI-ImageIO连GIF动画都能读，居然不支持读取TIFF文件。<br /><br />没办法只能使用JAI了。不过还好，在我们的大规模测试过程中，JAI的性能已经跟JIMI差不多了，这说明SUN的开发人员们在不断地优化这套类库。<br /><br />最后，希望SUN的开发人员们赶紧把JAI现有的功能加到ImageIO上，毕竟我感觉ImageIO才是最通用的方法。
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237248" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Sep 2008 03:52:42 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237248</link>
        <guid>http://www.javaeye.com/topic/237248</guid>
      </item>
      <item>
        <title>ibatis dao的封装讨论（欢迎拍装）</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://kiki.javaeye.com">kiki</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/235989" style="color:red;">http://www.javaeye.com/topic/235989</a>&nbsp;
          发表时间: 2008年09月03日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">public interface iBatisDao extends Dao{
	
	public void insert(String map, IValueObject vo)  throws DataAccessException;

	public int update(String map, IValueObject vo)  throws DataAccessException;

	public int delete(String map, IValueObject vo) throws DataAccessException;

	public List find(String map, IValueObject vo) throws DataAccessException;
	
	public IValueObject get(String map,IValueObject vo) throws DataAccessException;
	
	public int count(String map,IValueObject vo) throws DataAccessException;
	
	public String sequence(String map,IValueObject vo) throws DataAccessException;
	
	public String sequence(String seqName) throws DataAccessException;
	public String sequence()  throws DataAccessException;

	/**
	 * 
	 * @param map
	 * @param vo
	 * @param startRow ��ʼȡ��ݵ�Row
	 * @param rowPerPage ÿҳ������
	 * @return
	 */
	public List pageQuery(String map, IValueObject vo,int startRow,int rowPerPage)  throws DataAccessException;</pre><br /><pre name="code" class="java">public class iBatisDaoImpl extends SqlMapClientDaoSupport implements iBatisDao {
	private final String DOT = ".";

	private static final String INSERT = "insert";
	private static final String DELETE = "delete";
	private static final String FIND = "find";
	private static final String UPDATE = "update";
	private static final String DEFAULT_SYSTEM_SQLMAP_NAMESPACE = "cn.com.pansky.domain.System";
	private static final String DEFAULT_SYSTEM_SEQENCE = "ccs_system_seq";

	protected final Log logger = LogFactory.getLog(iBatisDaoImpl.class);
	public String statementName;

	private String getStatementName() {
		return this.statementName;
	}

	/**
	 * 把命名空间和ibatis sqlmap的ID关联。
	 * 例 cn.com.pansky.domain.Users.insertUsers
	 * @param statementname
	 * @param vo
	 */
	private void setStatementName(String statementname, IValueObject vo) {
		Assert.hasText(statementname);
		if (vo instanceof IValueObject) {
			this.statementName = StringUtils.hasText(vo.getNameSpace()) ? (vo
					.getNameSpace()
					+ DOT + statementname) : statementname;
		} else {
			this.statementName = vo.getClass().getName() + DOT + statementname;
		}
		if (logger.isDebugEnabled())
			logger.debug("setStatementName->" + this.statementName);
	}

	public int delete(String map, IValueObject vo) throws DataAccessException {
		setStatementName(map, vo);
		int record = getSqlMapClientTemplate().delete(getStatementName(), vo);
		if (logger.isDebugEnabled()) {
			logger.debug("共删除" + vo.getNameSpace() + " " + record + " 条记录");
		}
		return record;

	}

	public List find(String map, IValueObject vo) throws DataAccessException {
		setStatementName(map, vo);
		return getSqlMapClientTemplate().queryForList(getStatementName(), vo);
	}

	public void insert(String map, IValueObject vo) {
		setStatementName(map, vo);
		getSqlMapClientTemplate().insert(getStatementName(), vo);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see cn.com.pansky.dao.IbatisDao#pageQuery(java.lang.String,
	 * cn.com.pansky.dao.IValueObject, int, int)
	 */
	public List pageQuery(String map, IValueObject vo, int startRow,
			int rowPerPage) throws DataAccessException {
		setStatementName(map, vo);
		return getSqlMapClientTemplate().queryForList(getStatementName(), vo,
				startRow, rowPerPage);
	}

	public int update(String map, IValueObject vo) throws DataAccessException {
		setStatementName(map, vo);
		int record = getSqlMapClientTemplate().update(getStatementName(), vo);
		if (logger.isDebugEnabled()) {
			logger.debug("共更新" + vo.getNameSpace() + " " + record + " 条记录");
		}
		return record;
	}

	public IValueObject get(String map, IValueObject vo)
			throws DataAccessException {
		setStatementName(map, vo);
		return (IValueObject) getSqlMapClientTemplate().queryForObject(
				getStatementName(), vo);
	}

	public int count(String map, IValueObject vo) throws DataAccessException {
		setStatementName(map, vo);
		Integer result = (Integer) getSqlMapClientTemplate().queryForObject(
				getStatementName(), vo);
		return result.intValue();
	}

	/**
	 * DefaultService默认使用
	 */
	public int delete(Object vo) throws DataAccessException {
		return this.delete(DELETE, (IValueObject) vo);
	}

	public List find(Object vo) throws DataAccessException {
		return this.find(FIND, (IValueObject) vo);
	}

	public void insert(Object vo) throws DataAccessException {
		this.insert(INSERT, (IValueObject) vo);
	}

	public int update(Object vo) throws DataAccessException {
		return this.update(UPDATE, (IValueObject) vo);
	}

	/**
	 * sequence使用
	 */
	public String sequence(String map, IValueObject vo)
			throws DataAccessException {
		return (String) this.getSqlMapClientTemplate().queryForObject(map,
				vo.getSequence());
	}

	/**
	 * 通过seqName使用Sequence
	 * 
	 * @param seqName
	 * @return
	 */
	public String sequence(String seqName) throws DataAccessException {
		return (String) this.getSqlMapClientTemplate().queryForObject(
				DEFAULT_SYSTEM_SQLMAP_NAMESPACE + DOT + "sequence", seqName);
	}

	/**
	 * 使用系统默认的sequence
	 * 
	 * @return
	 */
	public String sequence() throws DataAccessException {
		return sequence(DEFAULT_SYSTEM_SEQENCE);
	}

}</pre><br /><br /><br /><pre name="code" class="java">public interface IValueObject {
	
	public  String getNameSpace();
	
	public String getSequence();
}</pre><br /><br />封装后，在service层只用DI一个Dao就行了，减少了写，Dao接口，Dao实现及Service层要DI N个Dao的问题。
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/235989" style="color:red;">已有 <strong>1</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 03 Sep 2008 10:03:03 +0800</pubDate>
        <link>http://www.javaeye.com/topic/235989</link>
        <guid>http://www.javaeye.com/topic/235989</guid>
      </item>
      <item>
        <title>由线程安全引起的一个有关Realm问题</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://grandboy.javaeye.com">grandboy</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237173" style="color:red;">http://www.javaeye.com/topic/237173</a>&nbsp;
          发表时间: 2008年09月04日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我的项目里需要给Tomcat写一个 Realm，大家都知道Realm接口里简化如下:<br /><pre name="code" class="java">
public interface Realm {
    public Principal authenticate(String username, String credentials);
    ...
    public SecurityConstraint [] findSecurityConstraints(Request request, Context context);
    ...
}
</pre><br />   为了节省篇幅，把Realm接口简化了一下。 由于项目需要必须要在authenticate方法里使用request, 而通过摸索在Realm里只有findSecurityConstraints方法里能得到这个request. 于是我就写了Realm如下:<br /><pre name="code" class="java">
public class MyRealm extends JAASRealm {
    protected HttpServletRequest request;
    public Principal authenticate(String username, String credentials){
    //在这里使用request。
    }
    ...
    public SecurityConstraint [] findSecurityConstraints(Request request, Context context){
        this.request = request;
        return super.findSecurityConstraints(request, context);
    }
}
</pre><br /><br />这样测试"良好", 似乎是可行的。 功能也都能过。 <br />    但是高手一看就会发现问题，因为request对象是变化的，并且Realm在整个Tomcat里只有一个实例(至少在只配置一个Realm的时候是这样的，配置多个Realm我还没有试)。这样就导致了request方法对多线程不安全，甚至混乱。<br />    请高手帮着看一下:<br /><strong><br />1. 是不是有其他更好的办法在Realm访问request对象?<br />2. 如果第一个问题是否定的，看有没有办法使这个request安全的被访问?</strong> (我知道用ThreadLocal来解决，还有没有其他办法)<br />请大家帮忙了。谢谢。
          <br/><br/>
          <span style="color:red;">
            <a href="http://gzer.group.javaeye.com/topic/237173" style="color:red;">已有 <strong>0</strong> 人发表回复，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 04 Sep 2008 21:05:37 +0800</pubDate>
        <link>http://www.javaeye.com/topic/237173</link>
        <guid>http://www.javaeye.com/topic/237173</guid>
      </item>
      <item>
        <title>框架整合</title>
        <author>JavaEye网站</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://adolf506.javaeye.com">adolf506</a>&nbsp;
          链接：<a href="http://www.javaeye.com/topic/237153" style="color:red;">http://www.javaeye.com/topic/237153</a>&nbsp;
          发表时间: 2008年09月04日
          <br/>
          声明：本文系JavaEye网站发布的原创文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任