<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>chxkyy</title>
    <description></description>
    <link>http://chxkyy.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>最小化(minify)js文件</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/213867" style="color:red;">http://chxkyy.javaeye.com/blog/213867</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在 <a href="http://developer.yahoo.com/performance/rules.html#minify">http://developer.yahoo.com/performance/rules.html#minify</a>

</p>
<p>中介绍了有两种最小化js文件的工具。</p>
<p>一种是JSMin http://crockford.com/javascript/jsmin<br />

另一种是 YUI Compressor http://developer.yahoo.com/yui/compressor/<br />

<br />

1.JSMin使用很简单 它提供一个在MS-Dos下能直接运行的.exe程序 jsmin.exe<br />

&nbsp;直接运行命令即可:</p>
<p>jsmin jsmin &lt;Ajax.js&gt; ajaxmin.js <br />
&nbsp; Ajax.js是没有最小化的js文件，当中包含很多空格与换行符<br />
&nbsp; ajaxmin.js是被jsmin最小化过的文件<br />
2.首先下载最新版的<a href="http://www.julienlecomte.net/yuicompressor/">YUI Compressor</a>
</p>
<p>我下载的是2.3.6版<br />
&nbsp;它提供的是Jar架包。<br />
&nbsp;我们也有两种方法使用它。<br />
&nbsp;1)如其\doc\README所说的直接用:<br />
&nbsp; java -jar yuicompressor-x.y.z.jar [options] [input file]<br />
&nbsp; java -jar yuicom*.jar --type js -o ajaxmin.js Ajax.js<br />
&nbsp;2)用ant来操作：<br />
&nbsp; 新建一个Java Project :YUI_Compressor<br />
&nbsp; 新建一个build.xml</p>
<p>&nbsp;</p>
<pre name="code" class="xml">&lt;project name=&quot;YUI_Compressor&quot; default=&quot;css.minify&quot; basedir=&quot;./..&quot;&gt;
		&lt;property name=&quot;project.dir&quot; value=&quot;${basedir}&quot;&gt;
		&lt;/property&gt;
		&lt;property name=&quot;project.src.dir&quot; value=&quot;${project.dir}\src&quot;&gt;
		&lt;/property&gt;
		&lt;!-- 最小化css文件 --&gt;
		&lt;target name=&quot;css.minify&quot;&gt;
			&lt;java jar=&quot;${project.dir}/lib/yuicompressor-2.3.6.jar&quot; fork=&quot;true&quot; failonerror=&quot;true&quot;&gt;
				&lt;arg line=&quot;${project.src.dir}/index.css&quot; /&gt;
				&lt;arg line=&quot;-o ${project.src.dir}/indexmin.css&quot; /&gt;
			&lt;/java&gt;
		&lt;/target&gt;
		
		&lt;!-- 最小化js文件 --&gt;
		&lt;target name=&quot;js.minify&quot;&gt;
			&lt;java jar=&quot;${project.dir}/lib/yuicompressor-2.3.6.jar&quot; fork=&quot;true&quot; failonerror=&quot;true&quot;&gt;
				&lt;arg line=&quot;${project.src.dir}/Ajax.js&quot; /&gt;
				&lt;arg line=&quot;-o ${project.src.dir}/ajaxmin.js&quot; /&gt;
			&lt;/java&gt;
		&lt;/target&gt;
		&lt;target name=&quot;css.concat&quot;&gt;
			&lt;concat destfile=&quot;${war.dir}/css/my-concat.css&quot;&gt;
				&lt;filelist dir=&quot;${war.dir}/css/&quot; files=&quot;screen.css, specialA.css, spcialB.css&quot; /&gt;
			&lt;/concat&gt;
		&lt;/target&gt;
		&lt;target name=&quot;js.concat&quot;&gt;
			&lt;concat destfile=&quot;${war.dir}/script/my-concat.js&quot;&gt;
				&lt;filelist dir=&quot;${war.dir}/script/jquery&quot; files=&quot;jquery.js, jqueryPlugins.js&quot; /&gt;
				&lt;filelist dir=&quot;${war.dir}/script/&quot; files=&quot;remote.js, ..., my.js&quot; /&gt;
			&lt;/concat&gt;
		&lt;/target&gt;
	&lt;/project&gt;</pre>
<p>&nbsp;运行相应的target即可</p>
<p>&nbsp;</p>
<p>最后创建出来的文件目录为：<br />
&nbsp;&nbsp;&nbsp; │&nbsp; .classpath<br />
&nbsp;&nbsp;&nbsp; │&nbsp; .project<br />
&nbsp;&nbsp;&nbsp; │&nbsp; list.txt<br />
&nbsp;&nbsp;&nbsp; │&nbsp; <br />
&nbsp;&nbsp;&nbsp; ├─bin<br />
&nbsp;&nbsp;&nbsp; │&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ajax.js<br />
&nbsp;&nbsp;&nbsp; │&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ajaxmin.js<br />
&nbsp;&nbsp;&nbsp; │&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; build.xml<br />
&nbsp;&nbsp;&nbsp; │&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index.css<br />
&nbsp;&nbsp;&nbsp; │&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; indexmin.css<br />
&nbsp;&nbsp;&nbsp; │&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yuicompressor-2.3.6.jar<br />
&nbsp;&nbsp;&nbsp; │&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ├─lib<br />
&nbsp;&nbsp;&nbsp; │&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; yuicompressor-2.3.6.jar<br />
&nbsp;&nbsp;&nbsp; │&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; └─src<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ajax.js<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ajaxmin.js<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; build.xml<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; index.css<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; indexmin.css</p>
<p>&nbsp;</p>
<p>参考文档:</p>
<p><a href="http://developer.yahoo.com/yui/compressor/">http://developer.yahoo.com/yui/compressor/</a>
</p>
<p><a href="http://www.seamframework.org/Community/SeamPerformanceSomeIdeas">http://www.seamframework.org/Community/SeamPerformanceSomeIdeas</a></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/213867#comments" 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, 11 Jul 2008 12:00:35 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/213867</link>
        <guid>http://chxkyy.javaeye.com/blog/213867</guid>
      </item>
      <item>
        <title>如何导出文件目录树</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/213864" style="color:red;">http://chxkyy.javaeye.com/blog/213864</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>用MS-Dos下的tree命令:</p>
<p>1,在windows 的&ldquo;运行&rdquo;中输入&ldquo;cmd&rdquo;打开命令行窗口
<br />
（类似于dos界面）
<br />
2,进入你想要列出目录下面
<br />
3，命令提示符下运行 tree /f &gt;文件名（例如：daochu.txt）
<br />
4，刚才输出的文件daochu.txt就是你想要的东西
<br />
<br />
补充：tree /f /a &gt;文件名（使用ASCII导出，可以实现树形）
<br />
      tree /?(察看帮助)</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/213864#comments" 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, 11 Jul 2008 11:54:10 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/213864</link>
        <guid>http://chxkyy.javaeye.com/blog/213864</guid>
      </item>
      <item>
        <title>将java.sql.Blob对象存储成文件</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/213601" style="color:red;">http://chxkyy.javaeye.com/blog/213601</a>&nbsp;
          发表时间: 2008年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Blob;

	private void saveFile(String filePath, Blob content) throws Exception {
		FileOutputStream fos = null;
		BufferedOutputStream bos = null;
		InputStream is = null;
		BufferedInputStream bis = null;
		try {
			File file = new File(filePath);
			fos = new FileOutputStream(file);
			bos = new BufferedOutputStream(fos);
			is = content.getBinaryStream();
			bis = new BufferedInputStream(is);
			int b1 = 0;
			while ((b1 = bis.read()) != -1) {
				bos.write(b1);
				bos.flush();
			}
		} catch (Exception e) {
			throw e;
		} finally {
			if(is!=null){
				is.close();
			}
			if (bis != null) {
				bis.close();
			}
			if (fos != null) {
				fos.close();
			}
			if (bos != null) {
				bos.close();
			}
		}
	}</pre>
<p>&nbsp;主要原因是我需要把Blob对象取出来作为邮件的附件发送。</p>
<p>本来还想直接在javamail中用Blob取出InputStream作为附件直接发送。</p>
<p>但是javamail不支持这种方法。</p>
<p>我用的javamail版本是1.4.1</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/213601#comments" 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, 10 Jul 2008 18:12:42 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/213601</link>
        <guid>http://chxkyy.javaeye.com/blog/213601</guid>
      </item>
      <item>
        <title>java中的io系统总结  </title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/213055" style="color:red;">http://chxkyy.javaeye.com/blog/213055</a>&nbsp;
          发表时间: 2008年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>java中的io中的（input/output）stream无非就是包括基于字符的stream、基于字节的stream和把字节导向的stream转换 <br />
 字符为导向的stream的stream。（很难理解么？） <br />
 以字节为导向的stream------InputStream/OutputStream <br />
 InputStream 和 OutputStream是两个abstact类，对于字节为导向的stream都扩展这两个鸡肋（基类^_^）; <br />
 --InputStream <br />
 ByteArrayInputStream -- 把内存中的一个缓冲区作为InputStream使用. <br />
  <br />
 construct---ByteArrayInputStream(byte[])创建一个新字节数组输入流，它从指定字节数组中读取数据。 <br />
 ---ByteArrayInputStream(byte[], int, int) 创建一个新字节数组输入流，它从指定字节数组中读取数据。 <br />
 ---mark::该字节数组未被复制。 <br />
  <br />
 StringBufferInputStream -- 把一个String对象作为InputStream . <br />
 注释：不推荐使用 StringBufferInputStream 方法。 此类不能将字符正确的转换为字节。 <br />
 同 JDK 1.1 版中的类似，从一个串创建一个流的最佳方法是采用 StringReader 类。  <br />
  <br />
 construct---StringBufferInputStream(String) 据指定串创建一个读取数据的输入流串。 <br />
  <br />
 FileInputStream -- 把一个文件作为InputStream，实现对文件的读取操作  <br />
  <br />
 construct---FileInputStream(File) 创建一个输入文件流，从指定的 File 对象读取数据。 <br />
 ---FileInputStream(FileDescriptor) 创建一个输入文件流，从指定的文件描述器读取数据。 <br />
 ---FileInputStream(String) 创建一个输入文件流，从指定名称的文件读取数据。 <br />
  <br />
 method ---- read() 从当前输入流中读取一字节数据。  <br />
 read(byte[]) 将当前输入流中 b.length 个字节数据读到一个字节数组中。  <br />
 read(byte[], int, int) 将输入流中 len 个字节数据读入一个字节数组中。 <br />
  <br />
 PipedInputStream：实现了pipe的概念，主要在线程中使用. 管道输入流是指一个通讯管道的接收端。 <br />
 一个线程通过管道输出流发送数据，而另一个线程通过管道输入流读取数据， <br />
 这样可实现两个线程间的通讯。 <br />
  <br />
 PipedInputStream() 创建一个管道输入流，它还未与一个管道输出流连接。  <br />
 PipedInputStream(PipedOutputStream) 创建一个管道输入流, 它已连接到一个管道输出流。  <br />
  <br />
 SequenceInputStream：把多个InputStream合并为一个InputStream .&ldquo;序列输入流&rdquo;类允许应用程序把几个输入流连续地合并起来， <br />
 并且使它们像单个输入流一样出现。每个输入流依次被读取，直到到达该流的末尾。 <br />
 然后&ldquo;序列输入流&rdquo;类关闭这个流并自动地切换到下一个输入流。  <br />
 SequenceInputStream(Enumeration) 创建一个新的序列输入流，并用指定的输入流的枚举值初始化它。  <br />
 SequenceInputStream(InputStream, InputStream) 创建一个新的序列输入流，初始化为首先 读输入流 s1, 然后读输入流 s2。 <br />
  <br />
 --OutputSteam <br />
  <br />
 ByteArrayOutputStream：把信息存入内存中的一个缓冲区中.该类实现一个以字节数组形式写入数据的输出流。 <br />
 当数据写入缓冲区时，它自动扩大。用 toByteArray() 和 toString() 能检索数据。  <br />
  <br />
 construct --- ByteArrayOutputStream() 创建一个新的字节数组输出流。 <br />
 --- ByteArrayOutputStream() 创建一个新的字节数组输出流。  <br />
 --- ByteArrayOutputStream(int) 创建一个新的字节数组输出流，并带有指定大小字节的缓冲区容量。  <br />
 toString(String) 根据指定字符编码将缓冲区内容转换为字符串，并将字节转换为字符。  <br />
 write(byte[], int, int) 将指定字节数组中从偏移量 off 开始的 len 个字节写入该字节数组输出流。  <br />
 write(int) 将指定字节写入该字节数组输出流。  <br />
 writeTo(OutputStream) 用 out.write(buf, 0, count) 调用输出流的写方法将该字节数组输出流的全部内容写入指定的输出流参数。  <br />
  <br />
 FileOutputStream:文件输出流是向 File 或 FileDescriptor 输出数据的一个输出流。 <br />
  <br />
 FileOutputStream(File) 创建一个文件输出流，向指定的 File 对象输出数据。  <br />
 FileOutputStream(FileDescriptor) 创建一个文件输出流，向指定的文件描述器输出数据。  <br />
 FileOutputStream(String) 创建一个文件输出流，向指定名称的文件输出数据。  <br />
 FileOutputStream(String, boolean) 用指定系统的文件名，创建一个输出文件。 <br />
  <br />
 PipedOutputStream:管道输出流是指一个通讯管道的发送端。 一个线程通过管道输出流发送数据， <br />
 而另一个线程通过管道输入流读取数据，这样可实现两个线程间的通讯。 <br />
  <br />
 PipedOutputStream() 创建一个管道输出流，它还未与一个管道输入流连接。  <br />
 PipedOutputStream(PipedInputStream) 创建一个管道输出流，它已连接到一个管道输入流。 <br />
  <br />
  <br />
 以字符为导向的stream Reader/Writer <br />
  <br />
 以Unicode字符为导向的stream，表示以Unicode字符为单位从stream中读取或往stream 中写入信息。 <br />
 Reader/Writer 为abstact类 <br />
 以Unicode字符为导向的stream包括下面几种类型：  <br />
  <br />
 －－ Reader <br />
  <br />
 1) CharArrayReader：与ByteArrayInputStream对应  <br />
 CharArrayReader(char[]) 用指定字符数组创建一个 CharArrayReader。 <br />
 CharArrayReader(char[], int, int) 用指定字符数组创建一个 CharArrayReader。 <br />
  <br />
 2) StringReader：与StringBufferInputStream对应  <br />
 StringReader(String) 创建一新的串读取者。 <br />
 3) FileReader：与FileInputStream对应  <br />
  <br />
 4) PipedReader：与PipedInputStream对应  <br />
  <br />
 －－ Writer <br />
  <br />
 1) CharArrayWrite：与ByteArrayOutputStream对应  <br />
 2) StringWrite：无与之对应的以字节为导向的stream  <br />
 3) FileWrite：与FileOutputStream对应  <br />
 4) PipedWrite：与PipedOutputStream对应  <br />
  <br />
 两种不现导向的stream之间的转换 <br />
 InputStreamReader和OutputStreamReader：把一个以字节为导向的stream转换成一个以字符为导向的stream。 <br />
 一个 InputStreamReader 类是从字节流到字符流的桥梁：它读入字节，并根据指定的编码方式，将之转换为字符流。 <br />
 使用的编码方式可能由名称指定，或平台可接受的缺省编码方式。 <br />
  <br />
 InputStreamReader 的 read() 方法之一的每次调用，可能促使从基本字节输入流中读取一个或多个字节。 <br />
 为了达到更高效率，考虑用 BufferedReader 封装 InputStreamReader， <br />
 BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); <br />
  <br />
 InputStreamReader(InputStream) 用缺省的字符编码方式，创建一个 InputStreamReader。  <br />
 InputStreamReader(InputStream, String) 用已命名的字符编码方式，创建一个 InputStreamReader。 <br />
  <br />
 OutputStreamWriter 将多个字符写入到一个输出流，根据指定的字符编码将多个字符转换为字节。  <br />
 每个 OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是从字符流到字节流的桥梁。 <br />
  <br />
 FilterInputStream、RandomAccessFile 见例子。 <br />
 ObjectInputStream 、 ObjectOutputStream见另外blog。 <br />
  <br />
  <br />
 Java IO的一般使用原则： <br />
  <br />
 一、按数据来源（去向）分类： <br />
 1、是文件： FileInputStream, FileOutputStream, FileReader, FileWriter <br />
 2、是byte[]：ByteArrayInputStream, ByteArrayOutputStream <br />
 3、是Char[]: CharArrayReader, CharArrayWriter <br />
 4、是String: StringBufferInputStream, StringReader, StringWriter <br />
 5、网络数据流：InputStream, OutputStream, Reader, Writer <br />
  <br />
 二、按是否格式化输出分： <br />
 1、要格式化输出：PrintStream, PrintWriter <br />
  <br />
 三、按是否要缓冲分： <br />
 1、要缓冲：BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter <br />
  <br />
 四、按数据格式分： <br />
 1、二进制格式（只要不能确定是纯文本的）: InputStream, OutputStream及其所有带Stream结束的子类 <br />
 2、纯文本格式（含纯英文与汉字或其他编码方式）；Reader, Writer及其所有带Reader, Writer的子类 <br />
  <br />
 五、按输入输出分： <br />
 1、输入：Reader, InputStream类型的子类 <br />
 2、输出：Writer, OutputStream类型的子类 <br />
  <br />
 六、特殊需要： <br />
 1、从Stream到Reader,Writer的转换类：InputStreamReader, OutputStreamWriter <br />
 2、对象输入输出：ObjectInputStream, ObjectOutputStream <br />
 3、进程间通信：PipeInputStream, PipeOutputStream, PipeReader, PipeWriter <br />
 4、合并输入：SequenceInputStream <br />
 5、更特殊的需要：PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader <br />
  <br />
 决定使用哪个类以及它的构造进程的一般准则如下（不考虑特殊需要）： <br />
 首先，考虑最原始的数据格式是什么： 原则四 <br />
 第二，是输入还是输出：原则五 <br />
 第三，是否需要转换流：原则六第1点 <br />
 第四，数据来源（去向）是什么：原则一 <br />
 第五，是否要缓冲：原则三 （特别注明：一定要注意的是readLine()是否有定义，有什么比read, write更特殊的输入或输出方法） <br />
 第六，是否要格式化输出：原则二 </p>
<p>&nbsp;</p>
<p>转自 <a href="http://topic.csdn.net/u/20080619/10/30ead5c6-8410-46c4-b9a1-f14522983eac.html">http://topic.csdn.net/u/20080619/10/30ead5c6-8410-46c4-b9a1-f14522983eac.html</a></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/213055#comments" 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>Wed, 09 Jul 2008 13:34:32 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/213055</link>
        <guid>http://chxkyy.javaeye.com/blog/213055</guid>
      </item>
      <item>
        <title> 为什么 Java 接口中不允许定义变量</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/208784" style="color:red;">http://chxkyy.javaeye.com/blog/208784</a>&nbsp;
          发表时间: 2008年06月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>转自：<a href="http://www.chixiang.org/?p=93">http://www.chixiang.org/?p=93</a></p>
<p>大家都知道，<a href="http://www.chixiang.org/?tag=java" title="Posts tagged with Java" class="st_tag internal_tag">Java</a>
 中接口里定义的成员变量都自动是 final static 的，为什么？这样有什么好处？为什么不能定义变量？</p>
<p style="text-indent: 2em;">接口就是提供一种统一的&rdquo;协议&rdquo;，而接口中的属性也属于&ldquo;协议&rdquo;中的成员。它们是公共的，静态的，最终的常量。相当于全局常量。抽象类是不&ldquo;完全&rdquo;的类，相当于是接口和具体类的一个中间层。即满足接口的抽象，也满足具体的实现。<br />
如果接口可以定义变量，但是接口中的方法又都是抽象的，在接口中无法通过行为来修改属性。有的人会说了，没有关系，可以通过实现接口的对象的行为来修改接
口中的属性。这当然没有问题，但是考虑这样的情况。如果接口 A 中有一个public 访问权限的静态变量 a。按照 <a href="http://www.chixiang.org/?tag=java" title="Posts tagged with Java" class="st_tag internal_tag">Java</a>
的语义，我们可以不通过实现接口的对象来访问变量 a，通过 A.a = xxx; 就可以改变接口中的变量 a
的值了。正如抽象类中是可以这样做的，那么实现接口 A 的所有对象也都会自动拥有这一改变后的 a 的值了，也就是说一个地方改变了
a，所有这些对象中 a
的值也都跟着变了。这和抽象类有什么区别呢，怎么体现接口更高的抽象级别呢，怎么体现接口提供的统一的协议呢，那还要接口这种抽象来做什么呢？所以接口中
不能出现变量，如果有变量，就和接口提供的统一的抽象这种思想是抵触的。所以接口中的属性必然是常量，只能读不能改，这样才能为实现接口的对象提供一个统
一的属性。</p>
<p style="text-indent: 2em;">通俗的讲，你认为是要变化的东西，就放在你自己的实现中，不能放在接口中去，接口只是对一类事物的属性和行为更高层次的抽象。对修改关闭，对扩展（不同的实现 implements）开放，接口是对开闭原则的一种体现。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/208784#comments" 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, 27 Jun 2008 18:51:16 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/208784</link>
        <guid>http://chxkyy.javaeye.com/blog/208784</guid>
      </item>
      <item>
        <title>richfaces ajax特性的一点小提示(为什么数据传不到后台去？)</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/207790" style="color:red;">http://chxkyy.javaeye.com/blog/207790</a>&nbsp;
          发表时间: 2008年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>问题描述：</p>
<p>页面文件：</p>
<pre name="code" class="html">&lt;h:outputText value=&quot;类型：&quot; id=&quot;assessType_inputtext&quot;&gt;&lt;/h:outputText&gt;
&lt;h:selectOneListbox size=&quot;1&quot; id=&quot;assessTypeId&quot;
	value=&quot;#{agcExceptionDataBackBean.assessTypeId}&quot;&gt;
	&lt;f:selectItems value=&quot;#{agcExceptionDataBackBean.agcSelectItems}&quot;/&gt;
	&lt;a4j:support event=&quot;onchange&quot; reRender=&quot;outputPanelId&quot; /&gt;
&lt;/h:selectOneListbox&gt;
&lt;h:panelGrid columns=&quot;3&quot;
	rendered=&quot;#{agcExceptionDataBackBean.view}&quot;&gt;
	&lt;h:outputText value=&quot;容量：&quot; id=&quot;realAdjustCapacity_outputtext&quot; /&gt;
	&lt;h:inputText id=&quot;realAdjustCapacity_inputtext&quot;
		value=&quot;#{agcExceptionDataBackBean.currentAgcExceptionData.realAdjustCapacity}&quot;&gt;
		&lt;a4j:support  ajaxSingle=&quot;true&quot;
			event=&quot;onblur&quot; reRender=&quot;realAdjustCapacity_message&quot; /&gt;
	&lt;/h:inputText&gt;
	&lt;a4j:outputPanel id=&quot;realAdjustCapacity_message&quot;
		ajaxRendered=&quot;true&quot; styleClass=&quot;pfoutpanel&quot;&gt;
		&lt;h:message for=&quot;realAdjustCapacity_inputtext&quot;&gt;&lt;/h:message&gt;
	&lt;/a4j:outputPanel&gt;
&lt;/h:panelGrid&gt;
&lt;a4j:commandButton value=&quot;保存&quot;
	action=&quot;#{agcExceptionDataBackBean.createAgcExceptionData}&quot;
	styleClass=&quot;pfbutton&quot;&gt;
&lt;/a4j:commandButton&gt;
</pre>
<p>&nbsp;<br />
ManagerBean的方法:</p>
<pre name="code" class="java">public boolean isView() {
	if (getAssessTypeId() != null) {
		AssessType type = assessTypeService.get(assessTypeId);
		CommonGenerator gen = commonGeneratorService
				.getByGeneratorCode(generatorCode);
		if (type != null
				&amp;&amp; type.getAssessTypeName().equals(&quot;不达标&quot;)) {
			return true;
		}
	}
	return false;
}

public Long getAssessTypeId() {
	return assessTypeId;
}</pre>
<p>&nbsp;根据&rdquo;类型&ldquo;来判断&rdquo;容量&ldquo;这个panelGrid是否显示<br />
当容量显示时，并输入数据如:100<br />
当点保存，照理说会把容量的数据100传到后台去。<br />
但是它并没有传。<br />
跟了一下代码，原来在ApplyRequestValue这个生命周期中h:panelGrid 的processDecode<br />
系统会先去检查h:panelGrid是否渲染,而此时的类型数据assessTypeId还没更新到模型中去（是在UpdateModel生命周期执行）。<br />
所以getAssessTypeId()返回null<br />
isView()也有返回false<br />
因此就不会processDecode容量,因此它的数据也就不会传到后台</p>
<p>&nbsp;</p>
<p>解决方法：</p>
<p>可以改变getAssessTypeId()方法：</p>
<pre name="code" class="java">public Long getAssessTypeId() {
	if (assessTypeId == null) {
		String temp = FacesContext.getCurrentInstance()
				.getExternalContext().getRequestParameterMap().get(
						&quot;formId:assessTypeId&quot;);
		if (temp != null) {
			assessTypeId = Long.valueOf(temp);
		}
	}
	return assessTypeId;
}</pre>
<p>&nbsp;上面的方法，把数据提前取出来。<br />
我觉得不是王道，不知道有没有更好的方法？</p>
<p>&nbsp;</p>
<p>生命周期图：</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/207790#comments" 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>Wed, 25 Jun 2008 11:22:53 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/207790</link>
        <guid>http://chxkyy.javaeye.com/blog/207790</guid>
      </item>
      <item>
        <title>Java反射机制的小尝试</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/207424" style="color:red;">http://chxkyy.javaeye.com/blog/207424</a>&nbsp;
          发表时间: 2008年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>com.mycompany.reflect.Reflect类:</p>
<pre name="code" class="java">public class Reflect {
	public void showMeTheMoney(String money){
		System.out.println(&quot;give you &quot;+money+&quot; dollars!&quot;);
	}
}</pre>
<p>&nbsp;这个类中的方法即将被调用。</p>
<p>&nbsp;</p>
<p>com.mycompany.reflect.Main类:</p>
<pre name="code" class="java">public class Main {

	/**
	 * @param args
	 */
	@SuppressWarnings(&quot;unchecked&quot;)
	public static void main(String[] args) {
		try {
			Class&lt;Reflect&gt; clazz = (Class&lt;Reflect&gt;) Class.forName(&quot;com.mycompany.reflect.Reflect&quot;);
			Reflect r = clazz.newInstance();
			Method showMeTheMoney = clazz.getDeclaredMethod(&quot;showMeTheMoney&quot;, new Class[]{String.class});
			showMeTheMoney.invoke(r, &quot;five&quot;);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SecurityException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} catch (InstantiationException e) {
			e.printStackTrace();
		}
	}
}</pre>
<p>&nbsp;</p>
<p>运行的结果是:</p>
<p>give you five dollars!</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/207424#comments" 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, 24 Jun 2008 12:35:27 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/207424</link>
        <guid>http://chxkyy.javaeye.com/blog/207424</guid>
      </item>
      <item>
        <title>&lt;f:selectItems&gt;空值问题</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/207402" style="color:red;">http://chxkyy.javaeye.com/blog/207402</a>&nbsp;
          发表时间: 2008年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>报错的代码：</p>
<pre name="code" class="java">java.lang.NullPointerException
        at com.sun.facelets.util.FastWriter.write(FastWriter.java:77)
        at com.sun.facelets.StateWriter.write(StateWriter.java:116)
        at com.sun.faces.renderkit.html_basic.HtmlResponseWriter.write(HtmlRespo
nseWriter.java:524)
        at com.sun.faces.renderkit.html_basic.MenuRenderer.renderOption(MenuRend
erer.java:561)
        at com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRen
derer.java:739)
        at com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRend
erer.java:794)
        at com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRendere
r.java:279)
        at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:
850)</pre>
<p>&nbsp;报错的原因是SelectItem里有itemValue或itemLable为空<br />
请检查&lt;f:selectItems&gt;,&lt;f:selectItem&gt;的value属性内容是否有空指针<br />
<br />
参见：<br />
<a href="http://forum.java.sun.com/thread.jspa?threadID=5305544&amp;tstart=0">http://forum.java.sun.com/thread.jspa?threadID=5305544&amp;tstart=0</a></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/207402#comments" 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>Tue, 24 Jun 2008 11:49:50 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/207402</link>
        <guid>http://chxkyy.javaeye.com/blog/207402</guid>
      </item>
      <item>
        <title>Firefox 3没办法用QZone?</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/207071" style="color:red;">http://chxkyy.javaeye.com/blog/207071</a>&nbsp;
          发表时间: 2008年06月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Firefox 3下打开一个<a href="http://user.qzone.qq.com/181418404">QZone</a>
的页面就弹出一个添加书签的对话框，然后页面就不在刷新，什么数据都看不见。</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/207071#comments" style="color:red;">已有 <strong>12</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, 23 Jun 2008 12:59:47 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/207071</link>
        <guid>http://chxkyy.javaeye.com/blog/207071</guid>
      </item>
      <item>
        <title>爱情是一种微笑的荒凉</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/207068" style="color:red;">http://chxkyy.javaeye.com/blog/207068</a>&nbsp;
          发表时间: 2008年06月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: 14px;">人群中，望见往日爱过，分手后许久一段时间里纠缠了记忆的那个人。<br />
<br />
&nbsp; &nbsp; 在人潮汹涌的街头彼此对视，浅浅微笑，互道你好后短暂的沉默。然后温柔地笑着，互说：&ldquo;再见！&rdquo;曾经深深相爱，曾经分手时以为伤痕累累，曾经告诉自己一生都无法磨灭记忆的两个人，再见面时竟都已无话可说。<br />
<br />
&nbsp; &nbsp;
也许大家都还记得分手的原因，只是没有人会再对谁提起当初刻骨铭心如今云淡风轻的那些爱恨。然而，虽然可以绝口不提，却不代表就真的是忘记。或许，彼此之
间仍是有一种时间洗不掉的隐隐幽怨。曾经以为是一生的至爱，再相见的时候，竟沦落到语言能力都是如此的贫瘠。古往今来，多少传奇故事记载着爱情的神话？多
少文人*士传诵着爱情的伟大？爱情，似乎千古永恒的话题，只要人类还存在，爱就会被一直颂扬下去。可，爱情，真有我们所歌所颂的那么美好吗？在爱里，我们
尝试宽容，却也难免嫉妒；试图原谅，却也想过报复；一心记仇，却又脆弱不忍。爱永远与其作为对立端的恨走在一起，交织着在挣扎的情绪里沉沉浮浮。最终在时
间的指缝细沙般流失，一直到某一天，茫茫人海中蓦地再见当初那人，惊觉一切早已烟消云散，熟悉的容颜隐匿在岁月中模糊难辩。我们能做的仅仅只有互相微笑、
说一声你好、道一句再见！<br />
<br />
&nbsp; &nbsp;
其实，没有人可以忘记曾经爱过的或曾经伤过的。告诉自己已经忘记，只是因为没有人愿意再提起。人都是这样吗？认为谁在相逢的时候先提起过往的种种，谁就是
比较在乎的那个人。我为什么要让你知道我在乎？我为什么要告诉你我还记得？我该忘记的！转身时，突然想起曾经在某本书或杂志上读过的一句话：&ldquo;爱不过是无
聊沙漠中的危险绿洲。&rdquo;精神的沙漠是荒芜的，爱是希望也是出口。可正因为对爱的渴求和奢望，让这片被唤做、爱的绿洲危机四伏。无心的一句话，一个眼神，一
个细微的动作，就有随时将绿洲颠覆的可能！有些爱情在结束之后无爱也无恨，那不过掌心中握着的书本，被翻过去的前一页。我们会记得爱过的人曾经的某个微
笑，某个亲昵的碰触，就如记得书本中，某句翻起心潮的文字。有些爱情轰轰烈烈天翻地覆，可结束时终究还是要化云成烟。除了你自己，没有谁会记得曾经爱有多
深恨有多重痛有多难熬。爱和恨最终也随着时间被冲淡，没有谁会一直爱下去一直恨下去。在追逐爱情的荒漠中，无论你付出过多少得到过多少，总难免有一天蓦然
发现自己落了单。<br />
<br />
&nbsp; &nbsp;
从此一个人在漫无人烟的荒野里，踽踽独行。但，谁能忘记爱与被爱的每一个时刻？那些逝去日子也曾璀璨过人生的某一段旅程，照亮我们枯燥索然的生命，在燃烧
中点起回忆的灯火，如同干渴的大漠，一道闪亮的清泉。怎能不记得呵？那些甘甜清爽的滋味！可光阴如梭，流年似水。爱在时间的穿针引线下一点点被织成往日的
情怀，恨在点滴的川流不息中逐渐被淡成河滩底沉淀的流沙。多少年后再相见，爱也渺渺恨也茫茫，我们竟只能浅浅地微笑，问候一句：&ldquo;你好！&rdquo;互道一声：&ldquo;再
见！&rdquo;那淡然的微笑下，曾经有过多少泪眼婆娑？曾经有过多少爱恨纠缠？所有的欲诉还休，一个人时的挣扎与不甘心，多年后竟只剩下淡然一笑。微笑底下，隐忍
着天知地知，我知你不知的荒凉，却又有谁人能读懂？<br />
<br />
&nbsp; &nbsp; 千帆过尽往昔沉淀后，终于承认了曾经有人说过的一句话：爱情，是一种微笑的荒凉。</span>
</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/207068#comments" 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, 23 Jun 2008 12:47:16 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/207068</link>
        <guid>http://chxkyy.javaeye.com/blog/207068</guid>
      </item>
      <item>
        <title>我们无处安放的爱情</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/207067" style="color:red;">http://chxkyy.javaeye.com/blog/207067</a>&nbsp;
          发表时间: 2008年06月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<div id="blogContainer">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有些时候不得不相信命中注定，就象那首歌中唱的&ldquo;为什么相爱的人不能够在一起..&rdquo; 
没有理由，只是命运一直和我们开玩笑，而我们的爱情并不象想像中那么无坚不摧，在一次次的折腾中，平淡的只剩下形式。<br />
我们的青春一直放在等待上，我们的话题一直是&ldquo;等我们在一起了，我们就...&quot;，但我们总挥不去那个前提...欲望在现实中跌跌撞撞，最后累了，痛了，失望了，还徘徊在绝望和燃起新的希望之间...<br />
真正的爱情是否应该是彼此心灵的避风港，在彼此的需要的时候相互抚慰心伤，如果爱情只剩下责任和习惯，我们是否应该在只剩下伤害的回忆之前把它埋藏起来，永远地沉淀下去，至少偶尔想起的时候，我们都会不自已地扬起嘴角，那证明我们曾经深爱过..<br />
</div>
<p><img src="http://imgcache.qq.com/ac/qzone_v4/b.gif" id="paperPicArea1" alt="" style="display: none; position: relative;" />
</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/207067#comments" 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, 23 Jun 2008 12:42:31 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/207067</link>
        <guid>http://chxkyy.javaeye.com/blog/207067</guid>
      </item>
      <item>
        <title>推荐使用Firefox3</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/205721" style="color:red;">http://chxkyy.javaeye.com/blog/205721</a>&nbsp;
          发表时间: 2008年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>浏览器测试页面</p>
<p>&nbsp;</p>
<p><a href="http://acid2.acidtests.org/#top">http://acid2.acidtests.org/#top</a>
</p>
<p>&nbsp;</p>
<p><a href="http://acid3.acidtests.org/#top">http://acid3.acidtests.org/#top</a>
</p>
<p>&nbsp;</p>
<p class="titel"><a href="http://news.ccidnet.com/art/951/20080619/1478309_1.html"><span style="font-family: 宋体;">Firefox 3发布 中国军团布局校园和通讯市场</span>
</a>
</p>
<p class="titel">&nbsp;</p>
<p class="titel"><a href="http://pcedu.pconline.com.cn/pingce/pingcesystem/0806/1327801.html"><span style="font-family: 宋体;"><span class="art_title f18">全国首发：Firefox 3 正式版试用评测</span>
</span>
</a>
</p>
<p class="titel">&nbsp;</p>
<p class="titel">而且Firefox3对应的FireBug的版本也有了,不必担心FireBug的升级问题</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/205721#comments" 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, 19 Jun 2008 12:52:12 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/205721</link>
        <guid>http://chxkyy.javaeye.com/blog/205721</guid>
      </item>
      <item>
        <title>java.sql.BatchUpdateException: Overflow Exception</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/202143" style="color:red;">http://chxkyy.javaeye.com/blog/202143</a>&nbsp;
          发表时间: 2008年06月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://forum.java.sun.com/thread.jspa?threadID=657022&amp;messageID=3861113" title="http://forum.java.sun.com/thread.jspa?threadID=657022&amp;messageID=3861113">http://forum.java.sun.com/thread.jspa?threadID=657022&amp;messageID=3861113</a>
</p>
<p>JDBC操作偶尔碰到这样的异常：&nbsp;java.sql.BatchUpdateException: Overflow Exception trying to bind NaN<br />
在Sun的Java论坛上有人解释，当把一个非法的数字（如&ldquo;0f/0f&rdquo;）绑定到一个字段，执行Update操作就会报这样的错误，如下：</p>
<p>It looks like you did some bad arithmetic, resulting in a &quot;Not A Number&quot; (NaN) result. For example:</p>
<p>&nbsp;</p>
<pre name="code" class="java">public class Nan {
   public static void main(String[] args) {
      float nan = 0f / 0f;
      System.out.println(nan);
   }
}</pre>
&nbsp;
<p>
When you then try to store that value in a floating point column, the
database complains. So the problem is in your Java logic, and the
database is trying to prevent you from corrupting the column!<br />
<br />
It's not specific to the BatchUpdate, it just happened to occur in one, and so the BatchUpdate had to report the error.</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/202143#comments" 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>Wed, 11 Jun 2008 14:44:00 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/202143</link>
        <guid>http://chxkyy.javaeye.com/blog/202143</guid>
      </item>
      <item>
        <title>richfaces3.1.2升级到3.2.1中遇到的问题。</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/200457" style="color:red;">http://chxkyy.javaeye.com/blog/200457</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1。org.richfaces.component.UIDatascroller.getPageIndex() deprecated掉了。<br />
&nbsp;&nbsp;&nbsp; 它的函数被写成<br />
&nbsp;&nbsp;&nbsp; public int getPageIndex() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;return getPageIndex();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; 因此若在程序中用到这个方法的话，会一直递归循环，只要堆栈溢出<br />
2。版本升级过程中很可能出现Javascript错误，<br />
&nbsp;&nbsp;&nbsp; 首先检测你自己引用的Js架包文件是否与Richfaces本身的Js文件冲突，如果冲突应考虑<br />
&nbsp;&nbsp;&nbsp; 去掉自己引用的js架包，并调用Richfaces的js架包。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/200457#comments" 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, 05 Jun 2008 11:55:07 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/200457</link>
        <guid>http://chxkyy.javaeye.com/blog/200457</guid>
      </item>
      <item>
        <title>第一次用JProbe的体会</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/198357" style="color:red;">http://chxkyy.javaeye.com/blog/198357</a>&nbsp;
          发表时间: 2008年05月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Probe在金山词霸的解释是：<br />
[prEub]<br />
n.<br />
探针, 探测器<br />
vt.<br />
(以探针等)探查, 查明<br />
<br />
公司用Richfaces做项目，但随着项目慢慢变大，速度也越来越慢，<br />
一个Ajax请求也要将进一秒（用FireBug看），更不用说普通的form提交或跳转。<br />
实在受不了！<br />
<br />
安装就不用说了。<br />
从官方网站可以下试用版<br />
<a href="http://www.quest.com/jprobe/">http://www.quest.com/jprobe/</a>
<br />
<br />
在网站的右边有一个view a product demo是个非常好的学习资料。<br />
这个一个Flash教程，看完这个就能掌握基本的功能。<br />
<br />
我想实现的一个目标是：看到一个方法在某次请求所用的时间<br />
可以在Performance中看到。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/198357#comments" 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>Thu, 29 May 2008 16:45:24 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/198357</link>
        <guid>http://chxkyy.javaeye.com/blog/198357</guid>
      </item>
      <item>
        <title>rich:modalPanel 与 form的关系</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/197516" style="color:red;">http://chxkyy.javaeye.com/blog/197516</a>&nbsp;
          发表时间: 2008年05月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&lt;rich:modalPanel&gt;不能放在form中<br />
如&lt;h:form&gt;,&lt;a4j:form&gt;<br />
否则在&lt;rich:modalPanel&gt;中进行操作，不会把数据提交到后台去。<br />
<br />
而&lt;rich:modalPanel&gt;内必须放form，否则会报一个javascript错误：</p>
<pre name="code" class="js">this._form has no properties
<a href="http://localhost:88/pro/a4j_3_1_2.GAorg.ajax4jsf.javascript.AjaxScript.jsf" target="_blank">http://localhost:88/pro/a4j_3_1_2.GAorg.ajax4jsf.javascript.AjaxScript.jsf</a>
Line 1691</pre>
&nbsp;
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/197516#comments" 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, 27 May 2008 17:00:20 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/197516</link>
        <guid>http://chxkyy.javaeye.com/blog/197516</guid>
      </item>
      <item>
        <title>richfaces3.1.2 modalPanel文档的一点小bug</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/197463" style="color:red;">http://chxkyy.javaeye.com/blog/197463</a>&nbsp;
          发表时间: 2008年05月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在richfaces_reference.pdf P298</p>
<p>原来的例子：</p>
<pre name="code" class="xml">&lt;rich:modalPanel id=&quot;panel&quot;&gt;
&lt;f:facet name=&quot;header&quot;&gt;
&lt;h:outputText value=&quot;header&quot;&gt;
&lt;/f:facet&gt;
...
&lt;!--Any Content inside--&gt;
...
&lt;a href=&quot;javascript:RichFaces.hideModalPanel('form:panel')&quot;&gt;Hide&lt;/a&gt;
&lt;/rich:modalpanel&gt;
...
&lt;a href=&quot;javascript:RichFaces.showModalPanel('form:panel')&quot;&gt;Show&lt;/a&gt;</pre>
<p>&nbsp;在Firebug中提示<span style="color: #ff0000;">RichFaces.showModalPanel is not a function</span>
<br />
&nbsp;&nbsp;&nbsp; javascript:RichFaces.showModalPanel('form:panel') Line 1</p>
<p>我还以为是在页面引入不对，就一个一个js文件找。</p>
<p>/a4j_3_1_2.GAorg.ajax4jsf.javascript.AjaxScript.jsf</p>
<p>/a4j_3_1_2.GAorg/richfaces/renderkit/html/scripts/modalPanel.js.jsf</p>
<p>/a4j_3_1_2.GAorg/richfaces/renderkit/html/scripts/utils.js.jsf</p>
<p>都没发现什么问题，倒是把javascript的类及对象的知识又巩固了一遍。</p>
<p>最后偶然发现原来在声明的对象是Richfaces.而不是RichFaces注意大小写。</p>
<p>在utils.js.jsf中是这样写的：</p>
<pre name="code" class="js">if (!window.Richfaces) {
	window.Richfaces = {};
}</pre>
<p>这个小问题花了我一个上午的时间。</p>
<p>&nbsp;改正大小写后就没问题了。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/197463#comments" 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>Tue, 27 May 2008 14:57:13 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/197463</link>
        <guid>http://chxkyy.javaeye.com/blog/197463</guid>
      </item>
      <item>
        <title>MyEclipse EJB 3.0 Development Overview</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/195337" style="color:red;">http://chxkyy.javaeye.com/blog/195337</a>&nbsp;
          发表时间: 2008年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1><span>My</span>
Eclipse EJB 3.0 Development Overview</h1>
<h2>EJB 3 Support | Editing and Validation Tools | EJB 3.0 Overview<br />
</h2>
<p> <br />
							This page presents an overview of EJB 3.0 features available 
							in MyEclipse 6.0. 
							<br />
 
							<br />
 
							To get a better feel for MyEclipse and learning more about it, 
							please check out our product 
							<a href="http://www.myeclipseide.com/ContentExpress-display-ceid-67.html" title="MyEclipse Documentation">Documentation</a>
 for more 
							material. 
							&nbsp; 
							</p>
<table border="0" align="center" width="700">
<tbody>
<tr>
<td align="left" valign="top" width="215"><strong>
						</strong>

<ul>
<strong>							
							</strong>
<li>
<strong>								<a href="http://www.myeclipseide.com/module-htmlpages-display-pid-220.html#project" title="Project Configuration">EJB 3.0
									Project Creation</a>
							</strong>
</li>
<strong>							</strong>
<li>
<strong>								<a href="http://www.myeclipseide.com/module-htmlpages-display-pid-220.html#reverse" title="Reverse Engineering"> Reverse
									Engineering Entities and Facades from Databases</a>
							</strong>
</li>
<strong>							</strong>
<li><strong> 
								<a href="http://www.myeclipseide.com/module-htmlpages-display-pid-220.html#editing">Advanced Entity Editing and Validation 
									Tools</a>
</strong>
</li>
<li><strong><a href="http://www.myeclipseide.com/module-htmlpages-display-pid-220.html#resources">Resources</a>
</strong>
</li>
<strong>							
						</strong>

</ul>
<strong>					</strong>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<hr />
<p>&nbsp;</p>
<h1> 
							<a name="Content">EJB 3.0 Project Creation</a>
						</h1>
<p>
							Use the File &gt; EJB Project menu item to invoke the EJB project
							wizard. Alternatively, you can invoke the EJB project wizard from
							the New project wizard (File &gt; New &gt; Other).<br />
<br />
<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/ejb3-new-project-menu.gif" alt="" />
						<br />
<em><span class="figure">Creating a new EJB 3.0 
										project</span>
</em>
<span class="figure"><br />
<br />
</span>
</p>
<p>
<span class="figure">							Create an EJB 3.0 project by selecting the Java EE 5.0 - EJB3
							radio button. Optionally add persistence support.
						</span>
</p>
<p>
<span class="figure">						
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/ejb3-new-project-page1.gif" alt="" />
								
									<em><span class="figure"><br />
New EJB Project wizard 
										- Page 1</span>
</em>
								<br />
<br />
						</span>
</p>
<p>
<span class="figure">							Specify the runtime JNDI data source and select a MyEclipse
							database driver and schema for design time support.
						</span>
</p>
<p>
<span class="figure">						
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/ejb3-new-project-page2.gif" alt="" />
								
									<em><span class="figure"><br />
New EJB Project wizard - Page 2 </span>
</em>
								
						</span>
</p>
<p><span class="figure"><br />
							You may change the EJB 3.0 project's design time driver
							association at any time using the
							<strong>Java Persistence</strong>
 properties page. To invoke this
							page, right click on the project and select Properties from the
							context menu. From the Properties dialog shown below, expand the
							MyEclipse node and select Java Persistence.<br />
<br />
						</span>
</p>
<p><span class="figure"><img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/jpa-projectprops.gif" alt="" />
						
									<em><span class="figure"><br />
Java Persistence 
										properties page</span>
</em>
					
						<br />
</span>
</p>
<hr />
<p><span class="figure"><br />
</span>
</p>
<h1><span class="figure"> 
							<a name="reverse">Reverse Engineering Entities and Facades
								from Databases</a>
						</span>
</h1>
<p>
<span class="figure">						</span>
</p>
<p><span class="figure"><br />
							Initiate Entity generation from the context menu of an EJB 3.0
							project. This will launch the EJB3 Reverse Engineering Wizard.
						</span>
</p>
<p>
<span class="figure">						
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/ejb3-gen-entities.gif" alt="" />
								
									<em><span class="figure"><br />
Entity generation from 
										an EJB 3.0 project<br />
<br />
</span>
</em>
								
						</span>
</p>
<p>
<span class="figure">							Entity generation can also be initiated from the Database Browser
							view.<br />
						</span>
</p>
<p>
<span class="figure">						
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/ejb3-browser-re.gif" alt="" />
								<em><span class="figure"><br />
Entity generation from 
										a DB Table<br />
<br />
</span>
</em>
								
						</span>
</p>
<p>
<span class="figure">							The reverse engineering process is fully customizable. Using the
							EJB3 Reverse Engineering Wizard you can choose the artifacts to
							generate and the database tables from which the artifacts will be
							based.<br />
						</span>
</p>
<p>
<span class="figure">						
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/ejb3-gen-2.gif" alt="" />
								
									<em><span class="figure"><br />
Select artifacts to be 
										reverse engineered<br />
<br />
</span>
</em>
								
						</span>
</p>
<p>
<span class="figure">							Following are several sample snippets of the code generated by
							the Reverse Engineering process.<br />
						</span>
</p>
<p>
<span class="figure">						
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/ejb3-generated.gif" alt="" />
								
									<em><span class="figure"><br />
Snippets of generated 
										code</span>
</em>
<br />
</span>
</p>
<hr />
<p><span class="figure"><br />
</span>
</p>
<h1><span class="figure"> 
							<a name="editing">Advanced Entity Editing Tools<br />
 </a>
						</span>
</h1>
<p><span class="figure"><br />
						</span>
</p>
<h3><span class="figure"> 
							MyEclipse Java Persistence Perspective 
						</span>
</h3>
<p>
<span class="figure">						</span>
<span class="figure">						
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/jpa-persistence-perspective-clipped.gif" alt="" />
								
									<em><span class="figure"><br />
MyEclipse Java 
										Persistence perspective</span>
</em>
</span>
</p>
<p>
<span class="figure">								
						</span>
</p>
<h3><span class="figure"> 
 
							JPA Details View 
						</span>
</h3>
<p><span class="figure"><br />
						</span>
</p>
<p>
<span class="figure">							The JPA Details view makes it easy to edit entity annotations.
						</span>
</p>
<p>
<span class="figure">						
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/jpa-table-details.gif" alt="" />
								
									<em><span class="figure"><br />
JPA Details view - 
										Editing table details</span>
</em>
<br />
<br />
								
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/jpa-column-details.gif" alt="" />
								
									<em><span class="figure"><br />
JPA Details view - 
										Editing column details</span>
</em>
<br />
<br />
								
							
						</span>
</p>
<h3><span class="figure"> 
 
							JPA Annotation Table and Column Content Assist 
						</span>
</h3>
<p><span class="figure"><br />
						
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/jpa-table-assist.gif" alt="" />
								
									<em><span class="figure"><br />
Table content assist</span>
</em>
<br />
<br />
								
							
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/jpa-column-assist.gif" alt="" />
								
									<em><span class="figure"><br />
JPA column content 
										assist</span>
</em>
<br />
<br />
								
						</span>
</p>
<h3><span class="figure"> 
 
							JPA Entity Validation 
							<br />
						</span>
</h3>
<p>
<span class="figure">						</span>
</p>
<p>
<span class="figure">							Errors in your mapping are detected and displayed in the editor
							and problems view.
						<br />
<br />
						
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/jpa-column-validation.gif" alt="" />
 <em><span class="figure"><br />
Column validation in the 
										Java editor</span>
</em>
<br />
<br />
								
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/jpa-mappedby-validation.gif" alt="" />
								
									<em><span class="figure"><br />
Mapped by validation in 
										the Java editor</span>
</em>
<br />
<br />
								
										<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/jpa-mappedby-validation.gif" alt="" />
									
										<em><span class="figure"><br />
JPA validation errors 
											shown in Java editor</span>
 
										</em>
<br />
<br />
									
						</span>
</p>
<p>
<span class="figure">							The
							<strong>JPA Entity Validator</strong>
 can be enabled or disabled
							at the project level.<br />
						</span>
</p>
<p>
<span class="figure">						
									<img src="http://www.myeclipseide.com/documentation/quickstarts/ejb3_overview/images/jpa-validation-props.gif" alt="" />
								<em><span class="figure"><br />
JPA validation  
										preferences</span>
</em>
</span>
</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/195337#comments" 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>Wed, 21 May 2008 16:21:52 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/195337</link>
        <guid>http://chxkyy.javaeye.com/blog/195337</guid>
      </item>
      <item>
        <title>JSF Validation Error: Value is not valid错误</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/186848" style="color:red;">http://chxkyy.javaeye.com/blog/186848</a>&nbsp;
          发表时间: 2008年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>问题提出：</p>
<p>平台：Richfaces,Jsf,Spring,Ejb3.0</p>
<ul>
<li>页面文件:</li>
</ul>
<pre name="code" class="html">&lt;h:selectOneListbox size=&quot;1&quot;

	value=&quot;#{coalDailyBackBean.currentEntity.coalDaily.coalTS}&quot; converter=&quot;com.mycompany.CoalTransportStyleConverter&quot;&gt;

	&lt;f:selectItems value=&quot;#{coalDailyBackBean.allTSs}&quot;&gt;

	&lt;/f:selectItems&gt;

&lt;/h:selectOneListbox&gt;</pre>
<p>&nbsp;&nbsp;&nbsp; coalTS是一个CoalTransportStyle的对象</p>
<p>&nbsp;&nbsp;&nbsp; allTSs是一个CoalTransportStyle的List</p>
<p>&nbsp;</p>
<ul>
<li>&nbsp;JSF配置文件faces-config.xml:</li>
</ul>
<pre name="code" class="xml">&lt;converter&gt;

	&lt;converter-id&gt;

		com.mycompany.CoalTransportStyleConverter

	&lt;/converter-id&gt;

	&lt;converter-class&gt;		com.mycompany

.parameter.plantinfo.web.converter.CoalTransportStyleConverter

	&lt;/converter-class&gt;

&lt;/converter&gt;</pre>
<p>&nbsp;&nbsp;&nbsp; CoalTransportStyle.java</p>
<pre name="code" class="java">@Entity

@Table(name = &quot;T_CoalTransportStyle&quot;)

public class CoalTransportStyle implements Serializable {



	/**

	 * 

	 */

	private static final long serialVersionUID = -5090574246490412429L;

	private Long id;	

	private String paraName;

	@Id

	@GeneratedValue(strategy=GenerationType.AUTO)

	public Long getId() {

		return id;

	}

	public void setId(Long id) {

		this.id = id;

	}

	@Column(unique=true,nullable=false)

	public String getParaName() {

		return paraName;

	}

	public void setParaName(String paraName) {

		this.paraName = paraName;

	}

}</pre>
&nbsp;
<pre name="code" class="java">public class CoalTransportStyleConverter implements Converter {

	public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {

		CoalTransportStyle style = new CoalTransportStyle();

		String strs[] = arg2.split(&quot;:&quot;);

		style.setId(new Long(strs[0]));

		style.setParaName(strs[1]);

		return style;

	}



	public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {

		CoalTransportStyle style = (CoalTransportStyle) arg2;

		return style.getId() + &quot;:&quot; + style.getParaName();

	}

}</pre>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; 定义了一个converter</p>
<ul>
<li>后台支撑Bean:<br />
<pre name="code" class="java">/**

 * 获得所有的运输方式

 * 

 * @return the allTSs

 */

public List&lt;SelectItem&gt; getAllTSs() {

	allTSs = new ArrayList&lt;SelectItem&gt;();

	List&lt;CoalTransportStyle&gt; list = coalTransportStyleService.queryAll(

			&quot;paraName&quot;, true);

	for (CoalTransportStyle style : list) {

		allTSs.add(new SelectItem(style, style.getParaName()));

	}

	return allTSs;

}</pre>
&nbsp;
<pre name="code" class="java">/**

 * @return the currentEntity

 */

public CoalDailyEntity getCurrentEntity() {

	if (getCoalDailyId() != null) {

		currentEntity = new CoalDailyEntity();

		currentEntity.setPlant(plant);

		currentEntity.setT_Date(date);// 设置时间

		currentEntity.setCoalDaily(coal);

	}

	return currentEntity;

}</pre>
&nbsp;初始页面显示时，h:selectOneListbox显示没有问题,但是当数据提交时，就报了一个错：Validation Error: Value is not valid　上网找了半天也没找到答案，后来自己调试了一下。</li>
<li>当数据提交时，是调用了CoalTransportStyleConverter的getAsObject说明这个对象已经创建起来了。但是为什么还报这个错误呢？</li>
<li>于是我找了Messages_en.properties错误信息文件。
<pre name="code" class="java">javax.faces.component.UISelectOne.INVALID={0}: Validation Error: Value is not valid</pre>
</li>
<li>又找到UISelectOne的validateValue方法。
<pre name="code" class="java">protected void validateValue(FacesContext context, Object value) {



        // Skip validation if it is not necessary

        super.validateValue(context, value);



        if (!isValid() || (value == null)) {

            return;

        }



        // Ensure that the value matches one of the available options

        boolean found = matchValue(value, new SelectItemsIterator(this));



        // Enqueue an error message if an invalid value was specified

        if (!found) {

            FacesMessage message =

                MessageFactory.getMessage(context, INVALID_MESSAGE_ID,

                     MessageFactory.getLabel(context, this));

            context.addMessage(getClientId(context), message);

            setValid(false);

        }

    }





    // --------------------------------------------------------- Private Methods





    /**

     * &lt;p&gt;Return &lt;code&gt;true&lt;/code&gt; if the specified value matches one of the

     * available options, performing a recursive search if if a

     * {@link SelectItemGroup} instance is detected.&lt;/p&gt;

     *

     * @param value {@link UIComponent} value to be tested

     * @param items Iterator over the {@link SelectItem}s to be checked

     */

    private boolean matchValue(Object value, Iterator items) {



        while (items.hasNext()) {

            SelectItem item = (SelectItem) items.next();

            if (item instanceof SelectItemGroup) {

                SelectItem subitems[] =

                    ((SelectItemGroup) item).getSelectItems();

                if ((subitems != null) &amp;&amp; (subitems.length &gt; 0)) {

                    if (matchValue(value, new ArrayIterator(subitems))) {

                        return (true);

                    }

                }

            } else {

                //Coerce the item value type before comparing values.

                Class type = value.getClass();

                Object newValue;

                try {

                    newValue = getFacesContext().getApplication().

                        getExpressionFactory().coerceToType(item.getValue(), type);

                } catch (ELException ele) {

                    newValue = item.getValue();

                } catch (IllegalArgumentException iae) {

                    // If coerceToType fails, per the docs it should throw

                    // an ELException, however, GF 9.0 and 9.0u1 will throw

                    // an IllegalArgumentException instead (see GF issue 1527).                    

                    newValue = item.getValue();

                }

                if (value.<span style="color: #ff0000;">equals</span>
(newValue)) {

                    return (true);

                }

            }

        }

        return (false);



    }</pre>
&nbsp;这里调用了equals方法，结果是不行，所以抛出了这个异常。</li>
<li>重写CoalTransportStype的equals方法即可:
<pre name="code" class="java">@Entity

@Table(name = &quot;T_CoalTransportStyle&quot;)

public class CoalTransportStyle implements Serializable {



	/**

	 * 

	 */

	private static final long serialVersionUID = -5090574246490412429L;

	private Long id;	

	private String paraName;

	@Id

	@GeneratedValue(strategy=GenerationType.AUTO)

	public Long getId() {

		return id;

	}

	public void setId(Long id) {

		this.id = id;

	}

	@Column(unique=true,nullable=false)

	public String getParaName() {

		return paraName;

	}

	public void setParaName(String paraName) {

		this.paraName = paraName;

	}

	

	public boolean equals(Object obj) {

		if (this == obj)

			return true;

		if (obj == null)

			return false;

		if (getClass() != obj.getClass())

			return false;

		final CoalTransportStyle other = (CoalTransportStyle) obj;

		if (id == null) {

			if (other.id != null)

				return false;

		} else if (!id.equals(other.id))

			return false;

		if (paraName == null) {

			if (other.paraName != null)

				return false;

		} else if (!paraName.equals(other.paraName))

			return false;

		return true;

	}

}</pre>
&nbsp;</li>
</ul>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/186848#comments" 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, 25 Apr 2008 16:32:52 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/186848</link>
        <guid>http://chxkyy.javaeye.com/blog/186848</guid>
      </item>
      <item>
        <title>GWT中*-compile.cmd批处理文件的意思</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/186266" style="color:red;">http://chxkyy.javaeye.com/blog/186266</a>&nbsp;
          发表时间: 2008年04月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>@java -cp &quot;%~dp0\src;D:/Java/gwt/gwt-windows-1.4.62/gwt-user.jar;D:/Java/gwt/gwt-windows-1.4.62/gwt-dev-windows.jar&quot; com.google.gwt.dev.GWTCompiler -out &quot;%~dp0\www&quot; %* com.sample.myProject.client.DemoClient</p>
<ol>
<li>@表示不显示当前输入的命令。</li>
<li>java就不用解释了。</li>
<li>%~dp0表示当前目录 所以%~dp0\src表示当前目录下的src子目录</li>
<li>-out The directory to write output files into (defaults to current)　输出目录</li>
</ol>
<p>GWTCompiler命令解释：</p>
<p>Google Web Toolkit 1.4.62<br />
GWTCompiler [-logLevel level] [-gen dir] [-out dir] [-treeLogger] [-style style] module <br />
<br />
where <br />
&nbsp; -logLevel&nbsp;&nbsp;&nbsp; The level of logging detail: ERROR, WARN, INFO, TRACE, DEBUG, SPAM, or ALL<br />
&nbsp; -gen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The directory into which generated files will be written for review<br />
&nbsp; -out&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The directory to write output files into (defaults to current)<br />
&nbsp; -treeLogger&nbsp; Logs output in a graphical tree view<br />
&nbsp; -style&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Script output style: OBF[USCATED], PRETTY, or DETAILED (defaults to OBF)<br />
and <br />
&nbsp; module&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Specifies the name of the module to compile</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/186266#comments" 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>Thu, 24 Apr 2008 10:25:06 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/186266</link>
        <guid>http://chxkyy.javaeye.com/blog/186266</guid>
      </item>
      <item>
        <title>&lt;f:convertDateTime&gt; 时间显示不对问题</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/184765" style="color:red;">http://chxkyy.javaeye.com/blog/184765</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在输出日期时,在Java里java.util.Date类型的对象都有带时间TimeZone</p>
<p>我们用</p>
<pre name="code" class="xml">&lt;h:outputText value=&quot;#{data.t_Date}&quot;&gt;
								&lt;f:convertDateTime pattern=&quot;yyyy年MM月dd日&quot; locale=&quot;cn&quot; /&gt;
							&lt;/h:outputText&gt;</pre>
<p>&nbsp;输出的时间与原来的时间差8个小时,原因是没加上时间的属性,改成:</p>
<pre name="code" class="xml">&lt;h:outputText value=&quot;#{data.t_Date}&quot;&gt;
								&lt;f:convertDateTime pattern=&quot;yyyy年MM月dd日&quot; timeZone=&quot;GMT+8&quot; locale=&quot;cn&quot; /&gt;
							&lt;/h:outputText&gt;</pre>
<p>&nbsp;显示的时间就对了.</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/184765#comments" 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, 21 Apr 2008 10:49:49 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/184765</link>
        <guid>http://chxkyy.javaeye.com/blog/184765</guid>
      </item>
      <item>
        <title>JPA Best Practices</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/183423" style="color:red;">http://chxkyy.javaeye.com/blog/183423</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1>JPA Best Practices [1]</h1>
<p>转自：<a href="http://dev2dev.bea.com.cn/blog/mikecool/200711/jpa_persistence_22_699.html">http://dev2dev.bea.com.cn/blog/mikecool/200711/jpa_persistence_22_699.html</a>
</p>
<p>
 这是一些我从个人收集和整理的一些JPA Best Practices，部分内容引自Java EE Blueprint和Patrick Linskey(OpenJPA Dev Leader)在Spring One的演讲。</p>
<div id="div_content">
<h3>分离ORM MetaData</h3>
<p>JPA Metadata有两大类，一类是描述Entity之间的关系，而另一类是描述Entity到数据库的映射关系。</p>
<p>众所周知，应用JPA的Metadata有两个途径：Annotation和XML。在这里我不对两者的优劣进行比较。我们着眼的是JPA，JPA在Spec中强调的一点是可移植性的应用，这就意味着使用JPA的应用程序要有比较强的移植能力。如何达到这一点呢？</p>
<p>Patrick的建议是用Annotation描述Entity关系，用XML描述数据库映射。好处很明显，即通过不同的XML增强了应用程序的可移植性。也没有丢失Annnotation的自释性，让开发者在开发过程中一目了然。</p>
<p>不过，我想补充的是，Annotation相对于XML效验的限制性相对小，所以灵活性会更大。例子是尝试在Embedded
Object里面用GeneratedValue，这个在XML里面是无法完成的，Annotation是支持的，至少我常用的OpenJPA也能够在功
能上完全支持。</p>
<p>&nbsp;</p>
<h3>使用em.getReference减少不必要的操作</h3>
<p>Patrick提到这个方法可以在某些特定的场景下减少不必要的数据库操作，以达到提高性能的目的。</p>
<p>首先看getReference做了什么，在JavaDoc中定义了&quot;获取一个实例，其状态是延迟读取的&quot;。我一开始也没有注意到这个方法，因为我没有想到什么地方可以用这个。Patrick提供了一些很好的例子：</p>
<ul>
<li>em.remove(em.getReference(Entity.class, EntityId))</li>
<li>em.lock(em.getRefenece(Entity.class, EntityId), LockMode)</li>
</ul>
<p>相比较传统的em.find，其作用不言而喻。em.getReference不会真正去做数据库的select，而是假装把Entity的实例给
你了。等你真正去做相应操作的时候由JPA
Implementation决定如何去读。就上面的例子来说，OpenJPA就不会去做Select了。相比较SQL就会看到：</p>
<table cellspacing="0" border="1" width="667" cellpadding="2">
<tbody>
<tr>
<td valign="top" width="348">操作</td>
<td valign="top" width="317">SQL</td>
</tr>
<tr>
<td valign="top" width="348">em.remove(em.getReference(Entity.class, EntityId))</td>
<td valign="top" width="317">delete from Entity where id = EntityId.</td>
</tr>
<tr>
<td valign="top" width="348">em.remove(em.find(Entity.class, EntityId))</td>
<td valign="top" width="317">select * from Entity where id = EntityId <br />
            delete from Entity where id = EntityId.</td>
</tr>
</tbody>
</table>
<p>而SELECT对于remove来说这是不怎么必要，当Entity比较大的时候相当明显。</p>
<p>应当注意到getReference也不能乱用，因为潜在的EntityNotFoundException会在第一次访问的时候抛出来，这就会增
加系统的复杂性，有时候得不偿失。另外对于将用于Detached状态的Instance，getReference也不适用。</p>
<p>&nbsp;</p>
<h3>使用JPA乐观锁定</h3>
<p>在JPA中定义了乐观锁定的规则，也就是用@Version。JPA中没有定义悲观锁定的要求，JPA的实现是可以自己实现的。</p>
<p>乐观锁定可能说所有的ORM都是&quot;居家旅行，必备良药&quot;，所以我也不在这里罗嗦了，总之好处相当之多。</p>
<p>&nbsp;</p>
<h3>使用Entity Facade</h3>
<p>这个我在<a href="http://dev2dev.bea.com.cn/blog/mikecool/200711/jpa_cmp_07_641.html">关于对现有CMP进行的JPA升迁</a>
中描述过，通过Facade模式减少了业务代码中对于JPA代码的依赖。</p>
<p>&nbsp;</p>
<h3>NamedQuery的命名规范</h3>
<p>这是因为JPA的对于NamedQuery的界定造成的，在单一Persistence
Unit当中，NamedQuery是全局性的。如果两个Entity同时使用了相同的名字会产生冲突，而具体会用到哪个将由JPA实现来决定，这样就会
产生非所期待的结果。强烈建议所有的NamedQuery同一命名规范，我自己常用的是EntityName.NamedQuery，这样把重名的风险降
低到Entity一个级别，而且要求定义在Class里面，不允许动态创建NamedQuery。</p>
<p>&nbsp;</p>
<p>我将在JPA Best Practices[2]中介绍在设计和代码中的一些Bast Practices。</p>
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/183423#comments" 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>Wed, 16 Apr 2008 15:59:18 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/183423</link>
        <guid>http://chxkyy.javaeye.com/blog/183423</guid>
      </item>
      <item>
        <title>xhtml下用jsp标签方法</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/183357" style="color:red;">http://chxkyy.javaeye.com/blog/183357</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1- use f:verbatim jsf tag
<br />
2- use h:outputText jsf tag with &quot;escape&quot; property set to &quot;false&quot;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/183357#comments" 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>Wed, 16 Apr 2008 13:41:10 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/183357</link>
        <guid>http://chxkyy.javaeye.com/blog/183357</guid>
      </item>
      <item>
        <title>JSF VS Tapestry 全面比较</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/183346" style="color:red;">http://chxkyy.javaeye.com/blog/183346</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table cellspacing="0" border="0" width="651" cellpadding="0" style="height: 92px;">
<tbody>
<tr>
<td valign="top" width="342">目
前应用很广泛而且也很成熟的Struts应用开发框架，在未来几年里将会逐渐淡出，其基于Action(action-based)的开发模型也将被活跃
的java社区所推崇的新的开发模型所替代，对于java开源社区来说，追求完美是很多人的理想。在2000年初诞生的Struts以及其他类似的
MVC(Model View
Controler)框架主要都是以操作为中心，且都是无状态的开发模型，而现在，基于组件(component-based)和事件驱动(event-
driven)的开发模型逐渐流行起来，在很多时候都成了Struts的有利竞争者，这其中来自jcp的jsr127-JavaServer
Faces(JSF)以及来自apache的Tapestry是其中的佼佼者。<br />
</td>
</tr>
</tbody>
</table>
<p>　
　
在这篇文章中，我们将把这两种框架JSF和Tapestry进行详细的对比。我们的比较将涉及到两种框架的设计、运行环境以及如何开发。比较的目的在于让
读者了解这两种框架各自的优缺点，以便于在自己的项目中，根据实际情况，选择合适的框架。该文章的内容基于JSF1.1和Tapestry3.0.3
(在个别地方由于需要会谈到Tapestry4.0)。<br />
　　
<span style="text-decoration: underline;">JSF和Tapestry简介</span>
&nbsp;<br />
　　 JSF源于JCP(Java Community
Process)的JSR127规范。Sun公司自己同时也对该规范提供了一个实现，目前的版本是1.1，而且该项目的设计者之一正是Struts的作者
Craig
McClanahan。另外一个JSF的实现，就是Apache的一个项目MyFaces。目前，几个主流的java开发工具厂商都在其java
ide中提供了对jsf的支持，比如Sun、Oracle、IBM、Borland等，而且JSF的后续版本JSF1.2也将成为J2EE5.0的一个组
成部分。&nbsp;&nbsp; &nbsp;<br />
　　 Tapestry最初于2000年在SourceForge注册，来自于Apple
WebObjects，随后，于2003年成为Apache的一个项目。与JSF不同的是，Tapestry并不是某一个jsr规范的实现，它仅仅是一个
开源项目，当前版本是3.0.3。4.0版本预计也将在后面的一段时间内推出。<br />
　　 JSF和Tapestry作为MVC框架，在一些基本特性上是非常类似的：</p>
<ul>
<li>&nbsp;&nbsp;&nbsp; 它们都让开发者不再直接与Servlet API打交道，而是让开发者在一个更高的抽象层上思考问题； 
                    </li>
<li>&nbsp;&nbsp;&nbsp; 它们都将web页面上的显示元素绑定到一个java对象的某个属性上，这些属性可能是字符串、数字、日期或者其他类型，并且由该对象来维护其状态。用户在页面上的交互行为（比如用鼠标点击一个按钮或者链接）都直接映射为java类中的一个事件处理方法； 
    
                </li>
<li>&nbsp;&nbsp;&nbsp; 两种框架都支持组件式的开发方式，并且开发的组件可被其他开发者重用。两种框架都自带一个标准组件库，提供web开发的常见通用功能。 </li>
</ul>
<p>
                  　　 在下面的章节里面，我们将会看见这两个框架在各自的实现方式上是有很大区别的。对于大多数程序员来说，基于两种框架做开发，将是非常不同的两种体验。&nbsp; </p>
<p><strong>Sidebar: 例子程序</strong>
<br />
　　 在下面本文提供了一个例子程序，该程序的代码大部分都将在这片文章中做出详细的描述。这个程序主要就是一个管理个人假期的工具，它的主要功能包括：<br />
　　 * 一个home界面， 列出所有登记的假期，包括假期开始时间、天数以及一下描述信息；<br />
　　 * 一个detail界面，用于浏览某一登记假期的详细信息；<br />
　　 * 一个new界面，用于添加一个假期信息。<br />
<br />
　　 下面这幅图展示了该程序的主体流程和功能：<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/images/app.jpg" border="0" onmouseover="if(this.alt) this.style.cursor='hand';" height="301" alt="" width="537" />
<br />
<br />
　　 你可以从下列地址下载该程序基于不同框架的源代码：<br />
　　
<a href="http://www.theserverside.com/articles/content/JSFTapestry/jsf.zip" target="_blank">JSF version</a>
<br />
　　
<a href="http://www.theserverside.com/articles/content/JSFTapestry/tapestry.zip" target="_blank">Tapestry version</a>
<br />
<br />
　　
<strong>对比1： 页面开发(Page Development)</strong>
<br />
　　
一个web应用实际上就是后端用java代码获取相应数据，并将数据传递给前端表现层代码，然后最终返回给终端用户。因此，在一个开发人员看来，当他初次
接触JSF和Tapestry时，最直接的感觉就是JSF的表现层是基于JSP的模板技术，而Ta
pestry的表现层模板基本就可以看作是一个HTML。 <br />
<br />
　　 JSF<br />
　　 JSF采用JSP的技术作为其表现层技术。与标准兼容的JSF实现必须实现一个核心组件的JSP标签集。下面的代码就是一个使用了JSF组件标签的Html代码：</p>
<div>
<div>代码:</div>
<div>
<pre name="code" class="html">&lt;h:form&gt;      <br />


  &lt;h:panelGrid columns=&quot;2&quot; border = &quot;1&quot;&gt;<br />


        &lt;h:outputText styleClass = &quot;label&quot; value=&quot;No&quot;/&gt;<br />


        &lt;h:outputText value=&quot;#{holidaySession.currentHolidayBooking.holidayID}&quot;/&gt;<br />


        &lt;h:outputText styleClass = &quot;label&quot; value=&quot;Date&quot;/&gt;<br />


        &lt;h:outputText value=&quot;#{holidaySession.currentHolidayBooking.date}&quot;/&gt;<br />


        &lt;h:outputText styleClass = &quot;label&quot; value=&quot;Number of days&quot;/&gt;<br />


        &lt;h:outputText value=&quot;#{holidaySession.currentHolidayBooking.amount.value}&quot;/&gt;<br />


        &lt;h:outputText styleClass = &quot;label&quot; value=&quot;Description&quot;/&gt;<br />


        &lt;h:outputText value=&quot;#{holidaySession.currentHolidayBooking.description}&quot;/&gt;<br />


 &lt;/h:panelGrid&gt;<br />


 &lt;BR&gt;<br />


 &lt;h:commandButton value=&quot;Back&quot; action=&quot;#{holidaydetail_backing.home}&quot; immediate = &quot;true&quot;/<br />


&lt;/h:form&gt;</pre>
</div>
</div>
<p>　含有JSF标签的html页面不能在标准浏览器中预览。要想浏览，必须使用JSF设计工具或者直接部署到应用中，在真实运行环境中浏览。<br />
                      　　 对于JSF技术来说，其表现层技术就是JSP，但是这不是唯一的解决方法。Hans Bergsten的文章介绍了可供选择的其他的方法，读者可阅读该文章获取详细信息，<a href="http://www.onjava.com/pub/a/onjava/2004/06/09/jsf.html" target="_blank">Improving JSF by Dumping JSP</a>
。 Bergsten的文章中指出了混合JSF和JSP标签暴露出的一些问题。当然，这些问题在JSF1.2和JSP2.1中会得到解决。<br />
  <br />
  　　 Tapestry<br />
  　　 对于大多数的Tapestry应用来说，Tapestry的表现层模板看起来就是一个简单的规则的Html，只不过其中加入了一些Tapestry的属性。下面是一段例子代码：</p>
<div>
<div>代码:
<pre name="code" class="html">&lt;span jwcid = &quot;@Conditional&quot; condition = &quot;ognl:currentHolidayBooking&quot;&gt;  <br />

        &lt;p&gt;&lt;strong&gt;Holiday Details&lt;/strong&gt;&lt;/p&gt;<br />

        &lt;table&gt;<br />

        &lt;tr&gt;<br />

                &lt;td class = &quot;label&quot;&gt;No&lt;/td&gt;<br />

                &lt;td&gt;&lt;span jwcid = &quot;@Insert&quot; <br />

                        value = &quot;ognl:currentHolidayBooking.holidayID&quot;&gt;1&lt;/span&gt;<br />

                &lt;/td&gt;<br />

        &lt;/tr&gt;<br />

        &lt;tr&gt;                      <br />

            &lt;td class = &quot;label&quot;&gt;Start date&lt;/td&gt;<br />

                &lt;td&gt;&lt;span jwcid = &quot;@Insert&quot; <br />

                        value = &quot;ognl:currentHolidayBooking.date&quot; format = &quot;ognl:dateFormat&quot;&gt;1&lt;/span&gt;<br />

                &lt;/td&gt;<br />

        &lt;/tr&gt;<br />

        &lt;tr&gt;<br />

            &lt;td class = &quot;label&quot;&gt;Number of days&lt;/td&gt;<br />

                &lt;td&gt;&lt;span jwcid = &quot;@Insert&quot; <br />

                        value = &quot;ognl:currentHolidayBooking.amount.value&quot;&gt;1&lt;/span&gt;<br />

                &lt;/td&gt;<br />

        &lt;/tr&gt; <br />

        &lt;tr&gt;               <br />

            &lt;td class = &quot;label&quot;&gt;Description&lt;/td&gt;    <br />

                &lt;td&gt;&lt;span jwcid = &quot;@Insert&quot; <br />

                        value = &quot;ognl:currentHolidayBooking.description&quot;&gt;1&lt;/span&gt;<br />

                &lt;/td&gt;<br />

        &lt;/tr&gt;<br />

        &lt;/table&gt;<br />

&lt;/span&gt;</pre>
&nbsp;</div>
</div>
<p>　　大家可以尝试把这段代码放入一个Html的body标签当中，你会发现浏览器可以正常的观看它。<br />
                      　　 上面的例子中，jwcid = &quot;@componentName&quot;属性就是定义了一个Tapestry标签。<br />
　　
Tapestry的模板不仅仅可以用HTML作为载体，它也支持其他的一些标记语言，Tapestry标签是具有良好格式的标签，即必须成对出现。
Tapestry模板技术支持的标记语言典型的就是HTML以及用于无线应用的WML。其最大的一个特点 就是，可脱离Servlet容器，直接预览。<br />
  　　 事实上JSF标签由于不是标准的html标签，使得它对于初学者来说，是难于使用的。而对于很多java程序员来说，他们喜欢编辑HTML代码，至少是乐意编写html代码。<br />
　　
JSF技术宣称的一个技术优点就是，可使用同一个模板编写运行在不同设备上的应用，由此带来很大的灵活性。然而，这样做，由于要协调不同设备间的表现差异
性，那么很可能同一个模板，将不能正好表现你的输出。同时，你不得不学习新的标签库的使用方法，并且搞懂它们是怎样映射到html的。随着时间的推移，
JSF标签的简洁可帮助你很快的编写表现层代码，同时也降低了开发者对jsf设计工具的依赖。<br />
　　
本文认为，JSF的学习成本高于其技术优点。在大多数情况下，我们并不需要编写适应于不同设备的应用。尽管JSF设计工具提供了简单的图形化的方法来构建
和预览JSF应用，但是在一个开发中，页面设计人员更多的是喜欢用流行的HTML设计工具来编写和预览页面，这就发生了一个冲突，即只有将更多的页面工作
转移到java程序员身上，因为一个页面设计人员通常情况下是不乐意去操作JSF设计工具的。<br />
  　　 JSF开发者一直在寻找一种解决这些问题的方法。JSF技术设计良好的扩展体系，使得这成为可能，其中一个技术浮现出来，那就是表现层控制器。一个非常有前途的表现层控制器的实现就是<a href="https://facelets.dev.java.net/" target="_blank">Facelets</a>
,由java.net创建的开放源代码项目。Facelets的灵感就来源于Tapestry的模板模型，这使得JSF不再依赖于JSP技术。Facelets允许开发者创建Tapestry风格的标签，就像下面这段代码一样：</p>
<div>
<div>代码:</div>
<pre>    &lt;input id=&quot;bar&quot; type=&quot;text&quot; jsfc=&quot;h:inputText&quot; value=&quot;#{foo.bar}&quot;/&gt;</pre>
</div>
<p>　　在未来的一段时间内，Facelets将会被开发者所采用，或许会影响JSF未来的版本。<br />
                      　　
                      <span style="color: #800080;">和JSF比较，Tapestry在表现层方面基于HTML代码,可被标准浏览器所浏览，这正是它在表现层上的优势所在。</span>
<br />
                      　　
                      <strong>比较2： java编程模型(Java Programming Model)</strong>
<br />
  　　 在前面我们提到Tapestry和JSF都允许表现层的模板直接和一个Java类中的属性和方法进行交互，那这些类的实例在运行时是怎么创建和管理的呢？<br />
  　　 Tapestry<br />
　　
Tapestry的一个完整过程通常都要包括三个部分：用于显示的页面模板(一般就是html)，带有相关属性和方法的java类，用于定义页面模板上的
控制元素和java类的关系的页面定义文件。Tapestry有着一套特殊的访问HttpSess ion、ServletContext的体系。<br />
　　
在一个页面定义文件中描述所有的数据绑定是可以的，但是一个页面控制元素却不能在request周期内，绑定一个java类。在request周期内只能
通过一个page类访问一些属性和方法。这其中最主要的限制就是关于page类的问题，一个pag
e类必须是BasePage或者AbstractPage的派生类。从另一方面来说，这就意味着你所编写的表现层逻辑的代码将会和框架本身的实现有着非常
紧密的耦合。不过，Tapestry未来的版本就会减少这种耦合，努力成为一个松耦合的编程模型。</p>
<p>　　 JSF<br />
　　 在JSF应用中没有页面定义文件。它只有一个全局的配置文件，命名为：faces-config.xml，里面通常都定义了一堆&quot;managed
beans&quot;。这些managed beans都是带有属性和事件监听器的定义良好的java
bean。在faces-config.xml中定义的后端bean都有三个参数：一个标识符、一个java类名、一个bean的生存周期，生存周期可以
是request、session、application中的一种。一旦在 faces-config.xml中定义好了一个managed
bean,那一个前端页面上的显示控制元素就可以使用标识符来关联这个bean。managed bean也可以配置为引用另外一个managed
bean。<br />
  　　 JSF和Tapestry都可以方便的与其他的中间层技术整合，比如Spring。<a href="http://www.oracle.com/technology/tech/java/newsletter/articles/jsf_pojo/index.html" target="_blank">JSF managed bean facility</a>
是一个IoC（Inversion of Control）。通过诸如<a href="http://jsf-spring.sourceforge.net/" target="_blank"> JSF-Spring </a>
这
样的扩展技术，我们可以方便将其和Spring很好的整合在一起，使得JSF的表达式可以调用Spring的bean的方法。虽然Spring可以与
Tapestry3.0整合，但是在Tapestry4.0当中才能更好的充分发挥IoC特性；Tape stry的领导Howard Lewis
Ship已经在Tapestry启动了IoC框架的工作。Spring的bean将会很轻松的注入到Tapestry应用的类中。<br />
  　　 JSF的编程模型提供了更大的灵活型，因为你可以通过组合的方式来丰富你的代码功能。比如，你可以设定一个指定的managed bean完成页面的某些功能，同时，你也可以在这些bean里引用其他的managed bena,从而可在页面间共享一些功能。<br />
  而Tapestry必须使用类继承的方法，也就是说，Tapestry应用中的一个页面类必须从框架指定的基类中派生(包含一大堆框架指定的状态)，这并不是一个理想的方法。<br />
JSF能够非常直观的管理session和application周期内的状态： 页面代码可以方便的访问managed
bean，而不管其生命周期是request、session还是application。而Tapestry在这方面就相对差点，不过，
Tapestry4.0在这方面做了很大的改进，引入了类似于JSF managed bean的技术，同时,还支持Java
5.0的annotaions技术，减少对XML配置文件的依赖，从而降低应用配置的复杂性。<br />
  　　
  <span style="color: #800080;"> JSF在编程模型上来看，与Tapestry相比具有更大的灵活性。</span>
 </p>
<p><strong>对比3： 请求处理生命周期(Request Processing Life Cycle)</strong>
<br />
　　 请求处理生命周期在一个web应用中是很重要的，它反映了一个请求从提交到将信息返回给客户端的处理过程。当然，请求处理生命周期必须能以某种优雅的方式，在正确的地方插入用户定制的请求处理操纵逻辑。<br />
　　
<span style="text-decoration: underline;">JSF</span>
 <br />
　　 JSF的请求处理生命周期清晰的定义成六个步骤：Restore View、Apply Request Values、 Process
Validations、 Update Model Values、 Invoke Application 和 Render
Response。从第二步Apply Request Values开始，可以直接跳到最后一步Render
Response，甚至可以直接返回给客户端并且通知JSF运行时，响应操作已经完成了。有些方法要访问JSF的FacesContext对象，比如状态
监听器(phase listeners)、事件操纵器(event
handlers)、转换器(converters)、验证器(validators)等，这都可能忽略请求处理生命周期中的某些步骤。<br />
　　
<span style="text-decoration: underline;">Tapestry</span>
<br />
　　 JSF有一个单一的生命周期模型，而Tapestry的生命周期依赖于其调用的引擎服务(engine service)。
每一个引擎服务(engine service)都有其自己的生命周期。比如，Tapestry中的Direct
Service控制标单的提交，而Page Service用于渲染页面，并且不需要额外的服务端操作。每一个引擎服务(engine
service)都被设计成在自身的生命周期内完成一些特定的任务。这就意味着，对于一个特定的需求，你可以创建一个对应的引擎服务(engine
service),并且可自己定制生命周期。<br />
　　
<span style="color: #800080;">JSF的生命周期概念更容易理解，而Tapestry可对一个特定的操作定义一个生命周期，这在某些问题的解决上，可能会提供更优雅的解决方案。</span>
<br />
　　
<strong>对比4： 页面导航(Navigation)</strong>
<br />
　　 在web应用中，通常有两种方式进行页面间的跳转，一种是通过HTTP
POST方式提交一个表单，然后跳转到我们的目的页面；一种是通过点击某个链接，通过url带参数的方式跳转页面。JSF和Tapestry都大量的使用
了postback机制，即在服务端处理页面间跳转，尽管如此，这两种框架在具体的实现上还是有很大的 差别的。<br />
　　
<span style="text-decoration: underline;">Tapestry</span>
<br />
　　
在一个Tapestry应用中，当用户点击一个链接或者提交一个表单时，一个服务器端的监听方法就会被调用。这个监听方法中就包含了页面间的跳转逻辑。并
且，页面跳转逻辑是定义在代码中的，而不是写在一个配置文件中。页面间的跳转，使用的是IRequ
estCycle.activate()方法。下面将会在例子中说明Tapestry是如何去做的。<br />
　　 让我们来看看holiday booking程序例子：<br />
<img src="http://www.java3z.com/cwbwebhome/article/article2/images/tapestry-home.jpg" border="0" onmouseover="if(this.alt) this.style.cursor='hand';" height="158" alt="" width="488" />
 <br />
　　 在home page中包含了下面的代码： </p>
<div>
<div>代码:</div>
<pre>&lt;input jwcid = &quot;new@Submit&quot; listener = &quot;ognl:listeners.newSubmit&quot; name=&quot;new_submit&quot; type=&quot;submit&quot; value=&quot;New&quot; /&gt;</pre>
</div>
<p>
                  　　 在page类中把submit按钮绑定到了newSubmit()方法。<br />
                  　　 在page类中，newSubmit()方法又调用了IRequestCycle's activate()方法来操纵页面跳转逻辑。
                  </p>
<div>
<div>代码:
<pre name="code" class="java">public void newSubmit(IRequestCycle cycle)<br />

{
        cycle.activate(&quot;NewHoliday&quot;)
}</pre>
&nbsp;</div>
</div>
<p>
　　
Tapestry的这种机制可以用于简单的页面跳转或者表单提交(通过使用DirectLink组件)。同时，也提供了另外一种机制，即在page类中实
现IExternalPage接口，然后使用ExternalLink组件直接跳转到另外一个页面 。<br />
　　 而对于应用指定的参数，可编码在URL当中，被目标页面以Object数组的形式接收（这比用一个名字/值对的字符串来接收要好）。但是这也意味着你的activateExternalPage()方法的实现必须要以正确的顺序读取这些参数。<br />
　　
ExternalLink组件可用于书签类型的导航页面，因为所要跳转的目标页面并不依赖于HttpSession的状态。但是在Tapestry中
URL类型的请求格式不是很友好，诸如：
<a href="http://localhost:8080/tapestry/app?service=external" target="_blank">http://localhost:8080/tapestry/app?service=external</a>/HolidayDetails&amp;sp=4
这种形式的URL,在Tapestry4.0中将会改善这种形式，增加可读性。<br />
　　 Tapestry还提供了一种页面转接的形式，可以抛出一个RedirectException，具体情形，可阅读 <a href="http://www.theserverside.com/articles/article.tss?l=RedirectAfterPost" target="_blank">Redirect After Post </a>
这篇文章。<br />
　　
<span style="text-decoration: underline;">JSF</span>
<br />
　　 在JSF中，你必须同时利用代码和配置文件来控制页面跳转流程，为此，你必须做到下面几件事情：<br />
　　 * 你的表单控制元素(HtmlCommandButton 或者 HtmlCommandLink)必须与managed bean的事件控制单元相绑定。事件控制器(event handler)里面必须有如下形式的定义：
</p>
<div>
<div>代码:</div>
<pre>public String actionName();</pre>
</div>
<p>
　　 在初始化的时候，为了把事件控制器和动作监听器(action listener)联系起来，在后者的代码里面会有这样一个方法：
</p>
<div>
<div>代码:</div>
<pre>public void actionListenerName(FacesContext context);</pre>
</div>
<p>
　　 * 在一个action里面返回的字符串实际上就对应 faces-config.xml 里面配置的页面跳转规则，大家来看看下面的配置：
</p>
<div>
<div>代码:
<pre name="code" class="xml">&lt;navigation-rule&gt;<br />

        &lt;from-view-id&gt;/home.jsp&lt;/from-view-id&gt;<br />

        &lt;navigation-case&gt;<br />

                &lt;from-outcome&gt;newHoliday&lt;/from-outcome&gt;<br />

                &lt;to-view-id&gt;/newholiday.jsp&lt;/to-view-id&gt;<br />

        &lt;/navigation-case&gt;<br />

        &lt;navigation-case&gt;<br />

                &lt;from-outcome&gt;detail&lt;/from-outcome&gt;<br />

                &lt;to-view-id&gt;/holidaydetail.jsp&lt;/to-view-id&gt;<br />

        &lt;/navigation-case&gt;<br />

        &lt;navigation-case&gt;<br />

                &lt;from-outcome&gt;delete&lt;/from-outcome&gt;<br />

                &lt;to-view-id&gt;/home.jsp&lt;/to-view-id&gt;<br />

        &lt;/navigation-case&gt;<br />

&lt;/navigation-rule&gt;</pre>
&nbsp;</div>
</div>
<p>
　　 struts的使用者在这里会发现同struts-config.xml类似的配置方法，在JSF中通过navigation-rule来定义页面跳转。<br />
　　 * 作为一个捷径，你也可以直接跳转到一个页面。比如：</p>
<p>
代码:</p>
<div>
<pre>&lt;h:commandButton value=&quot;next&quot; action=&quot;next&quot; /
</pre>
</div>
<p>
　　
在JSF当中，也有通过URL形式做页面跳转的方法。HtmlOutputLink可以用来替换HtmlCommandLink。URL后面的参数被封装
成HttpServletRequest的参数，在目标页面通过FacesContext来接收这
些参数，不过，你需要自己将这个字符串类型的参数转换成对应的数据类型。而这个在Tapestry当中，却是不需要的。<br />
　　 以本文的观点来看，页面间的跳转实际上也是一个应用的流程控制问题，属于应用本身的逻辑，所以，将这个跳转的控制从应用逻辑中剥离出来，用配置文件的形式来控制，有点过渡设计的意味。<br />
　　 在URL形式的页面跳转中，Tapestry的IExternalLink机制尽管也不是那么完美，但相比JSF而言，它至少保证了所传递参数的类型安全，并且提供了一个定义良好的机制来解析这些传递的参数。<br />
<br />
　　
<span style="color: #800080;">以本文的观点来看，更倾向于使用Tapestry的那种在代码中控制页面跳转逻辑的方式，而不是使用一个配置文件。</span>
</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/183346#comments" 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>Wed, 16 Apr 2008 13:26:12 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/183346</link>
        <guid>http://chxkyy.javaeye.com/blog/183346</guid>
      </item>
      <item>
        <title>JavaMail java.lang.NullPointerException</title>
        <author>chxkyy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://chxkyy.javaeye.com">chxkyy</a>&nbsp;
          链接：<a href="http://chxkyy.javaeye.com/blog/183340" style="color:red;">http://chxkyy.javaeye.com/blog/183340</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>使用JavaMail发送邮件出现如下的错误：</p>
<pre name="code" class="java">[ERROR,DispatcherServlet,http-88-6] Could not complete request<br />
java.lang.NullPointerException<br />
        at com.sun.mail.handlers.text_plain.writeTo(text_plain.java:140)<br />
        at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:89<br />
7)<br />
        at javax.activation.DataHandler.writeTo(DataHandler.java:330)<br />
        at javax.mail.internet.MimeUtility.getEncoding(MimeUtility.java:261)<br />
        at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1321<br />
)<br />
        at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1030<br />
)<br />
        at javax.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:41<br />
6)<br />
        at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1307<br />
)<br />
        at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2074)<br />
        at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2042)<br />
        at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1742)<br />
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:636)<br />
        at com.dongyun.publ.util.SendMail.send(SendMail.java:147)<br />
        at com.dongyun.publ.service.publish.PublishBean.sendMails(PublishBean.ja<br />
va:100)<br />
        at com.dongyun.publ.service.publish.PublishBean.publishDocByMap(PublishB<br />
ean.java:132)<br />
        at com.dongyun.publ.action.ArchivesAction.handleRequest(ArchivesAction.j<br />
ava:277)<br />
        at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.ha<br />
ndle(SimpleControllerHandlerAdapter.java:44)<br />
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(Dispatch<br />
erServlet.java:717)<br />
        at org.springframework.web.servlet.DispatcherServlet.doService(Dispatche<br />
rServlet.java:658)<br />
        at org.springframework.web.servlet.FrameworkServlet.processRequest(Frame<br />
workServlet.java:392)<br />
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServ<br />
let.java:357)<br />
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)<br />
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)<br />
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl<br />
icationFilterChain.java:290)<br />
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF<br />
ilterChain.java:206)<br />
        at com.dongyun.publ.util.CharacterEncodingFilter.doFilter(CharacterEncod<br />
ingFilter.java:23)<br />
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl<br />
icationFilterChain.java:235)<br />
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF<br />
ilterChain.java:206)<br />
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV<br />
alve.java:233)<br />
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV<br />
alve.java:175)<br />
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j<br />
ava:128)<br />
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j<br />
ava:102)<br />
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal<br />
ve.java:109)<br />
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav<br />
a:263)<br />
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java<br />
:844)<br />
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce<br />
ss(Http11Protocol.java:584)<br />
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:44<br />
7)<br />
        at java.lang.Thread.run(Thread.java:595)</pre>
<p>&nbsp;我在网上找了半天也没找到答案，把JavaMail版本更新到1.4.1也有问题。</p>
<p>后来终于找到，原来自己给MimeMessage的content设成null</p>
<p>所以报错，但JavaMail提示也不准确。</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://chxkyy.javaeye.com/blog/183340#comments" 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, 16 Apr 2008 13:14:07 +0800</pubDate>
        <link>http://chxkyy.javaeye.com/blog/183340</link>
        <guid>http://chxkyy.javaeye.com/blog/183340</guid>
      </item>
  </channel>
</rss>