﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-走好脚下的路,让别人去说吧!</title><link>http://www.blogjava.net/human2008/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 30 Apr 2026 09:54:23 GMT</lastBuildDate><pubDate>Thu, 30 Apr 2026 09:54:23 GMT</pubDate><ttl>60</ttl><item><title>MyEclipse使用技巧</title><link>http://www.blogjava.net/human2008/archive/2008/02/18/180537.html</link><dc:creator>灵!</dc:creator><author>灵!</author><pubDate>Mon, 18 Feb 2008 13:09:00 GMT</pubDate><guid>http://www.blogjava.net/human2008/archive/2008/02/18/180537.html</guid><wfw:comment>http://www.blogjava.net/human2008/comments/180537.html</wfw:comment><comments>http://www.blogjava.net/human2008/archive/2008/02/18/180537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/human2008/comments/commentRss/180537.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/human2008/services/trackbacks/180537.html</trackback:ping><description><![CDATA[<p>程序代码自动排版：Ctrl+Shift+F，会自动把代码进行格式化的排版，非常方便<br />
快速执行程序：Ctrl&nbsp;+&nbsp;F11第一次执行时，它会询问您执行模式，设置好后，以后只要按这个热键，它就会快速执行。</p>
<p>Ctrl+Shift+/ 加上段注释/**/</p>
<p>Ctrl+Shift+\ 取消段注释/**/</p>
<p>Ctrl+/ 加上行注释或取消行注释</p>
<p>自动汇入所需要的类别：Ctrl+Shift+O</p>
<p>取消自动validation：<br />
取消方法：&nbsp;windows--&gt;perferences--&gt;myeclipse--&gt;validation&nbsp;<br />
除开Manual下面的复选框全部选中之外，其他全部不选&nbsp;<br />
手工验证方法：&nbsp;<br />
在要验证的文件上，单击鼠标右键--&gt;myeclipse--&gt;run&nbsp;validation&nbsp;</p>
<p>按new Remote Site,Name填 <strong>svn</strong> , URL填<a href="http://subclipse.tigris.org/update">http://subclipse.tigris.org/update</a>,一直next到finished为止</p>
<img src ="http://www.blogjava.net/human2008/aggbug/180537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/human2008/" target="_blank">灵!</a> 2008-02-18 21:09 <a href="http://www.blogjava.net/human2008/archive/2008/02/18/180537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几个提高代码质量,检查代码规范的工具 </title><link>http://www.blogjava.net/human2008/archive/2008/01/11/174509.html</link><dc:creator>灵!</dc:creator><author>灵!</author><pubDate>Fri, 11 Jan 2008 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/human2008/archive/2008/01/11/174509.html</guid><wfw:comment>http://www.blogjava.net/human2008/comments/174509.html</wfw:comment><comments>http://www.blogjava.net/human2008/archive/2008/01/11/174509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/human2008/comments/commentRss/174509.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/human2008/services/trackbacks/174509.html</trackback:ping><description><![CDATA[<strong>1.FindBugs:查错</strong><br />
&nbsp;目前版本0.9.1,有for eclipse的插件. 网址是<a href="http://findbugs.sourceforge.net/">http://findbugs.sourceforge.net</a>.<br />
&nbsp;<br />
&nbsp;工作原理:检查程序生成的class的工具.<br />
&nbsp;<br />
&nbsp;界面:独立运行的提供图形界面,很友好,有bug报告.<br />
&nbsp;<br />
&nbsp;可用性:大多数提示有用,值得改<br />
&nbsp;<br />
&nbsp;插件:<br />
&nbsp;&nbsp;可以设置基本和检查的错误类别.<br />
&nbsp;&nbsp;插件保存设置有问题,我是关闭项目后台修改了配置文件,在装入才成功改了配置的. <br />
&nbsp;&nbsp;bug临时解决: 使用独立的findbugs设置规则,然后到C:\Documents and Settings\XXX\下找.Findbugs_prefs,然后改名覆盖eclipse project下的.fbprefs (先关闭你的project)<br />
&nbsp;<br />
&nbsp;配置没有查找功能,不过缩写能让我们很快找到某个规则<br />
&nbsp;<br />
<strong>2.PMD:主要是查错</strong><br />
&nbsp;目前版本3.2,有for eclipse以及其他ide的插件.网址是<a href="http://pmd.sourceforge.net/">http://pmd.sourceforge.net</a><br />
&nbsp;工作原理:检查源码 <br />
&nbsp;可用性:一部分值得修改,有些过于严格<br />
&nbsp;界面:独立运行的是命令行界面,命令比较简单.<br />
&nbsp;插件:可以配置规则,有一个独立的窗口显示提示,分5级提示,很友好<br />
&nbsp;<br />
&nbsp;使用:建立自己的规范,然后用于实际使用中.<br />
&nbsp;<br />
<strong>3.CheckStyle:主要查代码规范</strong><br />
&nbsp;目前版本4.0 beta 5,有for eclipse的插件.网址是<a href="http://checkstyle.sourceforge.net/">http://checkstyle.sourceforge.net</a>.<br />
&nbsp;工作原理:检查源码,对javadoc,书写格式等进行检查.<br />
&nbsp;规则定义:默认的规则是sun的编码规范.不过按照sun的规则则过于严格,而且每个公司也有自己的规范,和sun的不同,所以需要自定义规范.&nbsp;
<p><strong>4.JTest 重量级的商业工具</strong><br />
&nbsp;目前版本7.0.7,有for eclipse的插件.网址是<a href="http://www.parasoft.com/">http://www.parasoft.com/</a><br />
&nbsp;<br />
&nbsp;不推荐使用,不过功能强大,可以进行代码检查,可以自动生成单元测试和进行单元测试.(不过就是太慢了,而且生成的单元测试没太大用途)<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;</p>
<p><strong>使用感觉:</strong></p>
<p>&nbsp;安装上插件后,对自己的项目进行检查,发现警告太多了,有点发蒙的感觉.不过把警告看一遍,觉得都很有道理,有些也确实是一些错误.<br />
&nbsp;当然PMD和CheckStyle的规范太严格,最后还是配置了一下.<br />
&nbsp;<br />
&nbsp;通过改正警告,感觉还是不错,至少可以说自己的代码可以通过工具的检测了.<br />
&nbsp;<br />
&nbsp;当然基础代码和项目代码还是不一样的,基础代码往往比较复杂,所以和普通项目代码的规范应该有所不同.有些规则只能用在普通代码上,用在基础类代码上往往没法处理.<br />
&nbsp;<br />
<strong>其他</strong></p>
<p>代码查错推荐使用Findbugs和PMD,代码书写规范推荐使用CheckStyle进行检查.这样不仅能查出一些基本的错误,也能提高项目的代码质量.对提高自己的代码水平也是非常好.</p>
<p>推荐项目组建立统一的规则,代码复查的时候就使用这些工具,省时省力.</p>
<p>实乃居家旅行,杀人越货必备之工具也.(因为肯定有人要骂你,呵呵,也是你找"差"的工具)</p>
<img src ="http://www.blogjava.net/human2008/aggbug/174509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/human2008/" target="_blank">灵!</a> 2008-01-11 09:48 <a href="http://www.blogjava.net/human2008/archive/2008/01/11/174509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Lucene进行全文检索(一)---处理索引 </title><link>http://www.blogjava.net/human2008/archive/2008/01/11/174507.html</link><dc:creator>灵!</dc:creator><author>灵!</author><pubDate>Fri, 11 Jan 2008 01:47:00 GMT</pubDate><guid>http://www.blogjava.net/human2008/archive/2008/01/11/174507.html</guid><wfw:comment>http://www.blogjava.net/human2008/comments/174507.html</wfw:comment><comments>http://www.blogjava.net/human2008/archive/2008/01/11/174507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/human2008/comments/commentRss/174507.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/human2008/services/trackbacks/174507.html</trackback:ping><description><![CDATA[&nbsp;Lucene是一个全文检索的引擎,目前有Java和.Net 等几个版本.Java版本的网址是<a href="http://lucene.apache.org/">http://lucene.apache.org</a>.相关的一个项目是车东的WebLucene: <a href="http://sourceforge.net/projects/weblucene">http://sourceforge.net/projects/weblucene</a>.
<p>&nbsp;首先,基于一个简单的新闻系统,要想做全文检索.新闻系统的管理等在这里不在具体提出,下面列出新闻对象的类:<br />
&nbsp;<br />
&nbsp;注:程序用会到一些工具类,不在此列出,用户可以自己实现.<br />
&nbsp;<br />
&nbsp;</p>
<p>
<table class="code" cellspacing="1" cellpadding="1" width="80%" align="center" border="0">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;package com.jscud.website.newsinfo.bean;<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;import java.sql.Timestamp;<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;import com.jscud.util.DateTime;<br />
            &nbsp;&nbsp;import com.jscud.util.StringFunc;<br />
            &nbsp;&nbsp;import com.jscud.website.newsinfo.NewsConst;<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;/**<br />
            &nbsp;&nbsp; * 一个新闻.<br />
            &nbsp;&nbsp; * <br />
            &nbsp;&nbsp; * @author scud(飞云小侠) <a href="http://www.jscud.com/">http://www.jscud.com</a><br />
            &nbsp;&nbsp; *&nbsp; <br />
            &nbsp;&nbsp; */<br />
            &nbsp;&nbsp;public class NewsItem<br />
            &nbsp;&nbsp;{<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int nid; //新闻编号<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int cid; //类别编号<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String title;//标题<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int showtype; //内容类型:目前支持url和html<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String content;//内容<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String url;//对应网址,如果内容类型是url的话<br />
            &nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Timestamp addtime; //增加时间<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int click; //点击数<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //对应的get,set函数,较多不在列出,可以使用工具生成<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //......<br />
            &nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 按照类型格式化<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getShowContent()<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sRes = content;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(showtype == NewsConst.ShowType_HTML)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sRes;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getTarget()<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(showtype == NewsConst.ShowType_URL)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "_blank";<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 静态Html文件的路径及其名字<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getHtmlFileName()<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nYear = DateTime.getYear_Date(getAddtime());<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nMonth =&nbsp; DateTime.getMonth_Date(getAddtime());<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sGeneFileName = <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;"/news/" + getCid() + "/" + nYear + "/" + nMonth +"/" + getNid() + ".htm";<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sGeneFileName;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 静态Html文件的路径<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getHtmlFilePath()<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nYear = DateTime.getYear_Date(getAddtime());<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nMonth =&nbsp; DateTime.getMonth_Date(getAddtime());<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sGeneFilePath = <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;getCid() + "_" + nYear + "_" + nMonth;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sGeneFilePath;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;}&nbsp;<br />
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><br />
&nbsp;<br />
&nbsp;可以看到,我们需要对标题和内容进行检索,为了这个目的,我们首先需要来研究一下lucene.<br />
&nbsp;<br />
&nbsp;在Lucene中,如果要进行全文检索,必须要先建立索引然后才能进行检索,当然实际工作中还会有删除索引和更新索引的工作.<br />
&nbsp;<br />
&nbsp;在此之前,介绍一个最基本的类(摘抄自<a href="http://www.blogjava.net/cap/archive/2005/07/17/7849.html">http://www.blogjava.net/cap/archive/2005/07/17/7849.html</a>):<br />
&nbsp;<br />
&nbsp;Analyzer 文件的分析器（听起来别扭，还是叫Analyzer好了)的抽象，这个类用来处理分词(对中文尤其重要，转换大小写(Computer-&gt;computer,实现查询大小写无关)，转换词根(computers-&gt;computer),消除stop words等,还负责把其他格式文档转换为纯文本等.<br />
&nbsp;<br />
&nbsp;在lucene中,一般会使用StandardAnalyzer来分析内容,它支持中文等多字节语言,当然可以自己实现特殊的解析器.StandardAnalyzer目前对中文的处理是按照单字来处理的,这是最简单的办法,但是也有缺点,会组合出一些没有意义的结果来.&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;首先我们来了解建立索引,建立索引包含2种情况,一种是给一条新闻建立索引,另外的情况是在开始或者一定的时间给批量的新闻建立索引,所以为了通用,我们写一个通用的建立索引的函数:<br />
&nbsp;<br />
&nbsp;(一般一类的索引都放在一个目录下,这个配置可以在函数中定义,也可以写在配置文件中,通过参数传递给函数.)<br />
</p>
<p>
<table class="code" cellspacing="1" cellpadding="1" width="80%" align="center" border="0">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 生成索引.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * <br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param doc 目标文档<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param indexDir 索引目录<br />
            &nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp; public static void makeIndex(Document doc, String indexDir)<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List aList = new ArrayList();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aList.add(doc);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makeIndex(aList, indexDir);<br />
            &nbsp;&nbsp;&nbsp; }<br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 生成索引.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * <br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param doc 生成的document.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param indexDir 索引目录<br />
            &nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp; public static void makeIndex(List docs, String indexDir)<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null == docs)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean indexExist = indexExist(indexDir);
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IndexWriter writer = null;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StandardAnalyzer analyzer = new StandardAnalyzer();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //如果索引存在,就追加.如果不存在,就建立新的索引.lucene要是自动判决就好了.<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(indexExist) <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer = new IndexWriter(indexDir, analyzer, false);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer = new IndexWriter(indexDir, analyzer, true);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //添加一条文档<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; docs.size(); i++)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document doc = (Document) docs.get(i);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null != doc)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.addDocument(doc);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //索引完成后的处理<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.optimize();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (IOException e)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LogMan.warn("Error in Make Index", e);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null != writer)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writer.close();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (IOException e)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LogMan.warn("Close writer Error");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp; }<br />
            </p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><br />
<br />
&nbsp;可以看到,建立索引用到类是IndexWrite,它可以新建索引或者追加索引,但是需要自己判断.判断是通过IndexReader这个类来实现的,函数如下:</p>
<p>&nbsp;</p>
<p>
<table class="code" cellspacing="1" cellpadding="1" width="80%" align="center" border="0">
    <tbody>
        <tr>
            <td>&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 检查索引是否存在.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param indexDir<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @return<br />
            &nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp; public static boolean indexExist(String indexDir)<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return IndexReader.indexExists(indexDir);<br />
            &nbsp;&nbsp;&nbsp; }<br />
            &nbsp;</td>
        </tr>
    </tbody>
</table>
</p>
<p><br />
&nbsp;如果每次都是新建索引的话,会把原来的记录删除,我在使用的时候一开始就没有注意到,后来观察了一下索引文件,才发现这个问题.<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;还可以看到,建立索引是给用户的Document对象建立索引,Document表示索引中的一条文档记录.那么我们如何建立一个文档那?以新闻系统为例,代码如下:<br />
&nbsp;</p>
<p>
<table class="code" cellspacing="1" cellpadding="1" width="80%" align="center" border="0">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 生成新闻的Document.<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @param aNews 一条新闻.<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * @return lucene的文档对象<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp;&nbsp; public static Document makeNewsSearchDocument(NewsItem aNews)<br />
            &nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Document doc = new Document();<br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.Keyword("nid", String.valueOf(aNews.getNid())));<br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.Text("title", aNews.getTitle()));<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //对Html进行解析,如果不是html,则不需要解析.或者根据格式调用自己的解析方法<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String content = parseHtmlContent(aNews.getContent());<br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.UnStored("content", content));<br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.Keyword("addtime", aNews.getAddtime()));<br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //可以加入其他的内容:例如新闻的评论等<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.UnStored("other", ""));<br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //访问url<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String newsUrl = "/srun/news/viewhtml/" + aNews.getHtmlFilePath() + "/" + aNews.getNid()<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + ".htm";<br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doc.add(Field.UnIndexed("visiturl", newsUrl));<br />
            &nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return doc;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; }<br />
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><br />
&nbsp;<br />
&nbsp;通过上面的代码,我们把一条新闻转换为lucene的Document对象,从而进行索引工作.在上面的代码中,我们又引入了lucene中的Field(字段)类.Document文档就像数据库中的一条记录,它有很多字段,每个字段是一个Field对象.<br />
&nbsp;<br />
&nbsp;从别的文章摘抄一段关于Field的说明(摘抄自<a href="http://www.blogjava.net/cap/archive/2005/07/17/7849.html">http://www.blogjava.net/cap/archive/2005/07/17/7849.html</a>):<br />
&nbsp;[quote]<br />
&nbsp;&nbsp;&nbsp; 类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Analyzed Indexed Stored 说明 <br />
&nbsp;&nbsp;&nbsp; Field.Keyword(String,String/Date)&nbsp; N Y Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个Field用来储存会直接用来检索的比如(编号,姓名,日期等) <br />
&nbsp;&nbsp;&nbsp; Field.UnIndexed(String,String)&nbsp;&nbsp;&nbsp;&nbsp; N N Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不会用来检索的信息,但是检索后需要显示的,比如,硬件序列号,文档的url地址 <br />
&nbsp;&nbsp;&nbsp; Field.UnStored(String,String)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y Y N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大段文本内容,会用来检索,但是检索后不需要从index中取内容,可以根据url去load真实的内容 <br />
&nbsp;&nbsp;&nbsp; Field.Text(String,String)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y Y Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 检索,获取都需要的内容,直接放index中,不过这样会增大index <br />
&nbsp;&nbsp;&nbsp; Field.Text(String,Reader)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y Y N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果是一个Reader, lucene猜测内容比较多,会采用Unstored的策略. <br />
&nbsp;[/quote]<br />
&nbsp;<br />
&nbsp;我们可以看到新闻的编号是直接用来检索的,所以是Keyword类型的字段,新闻的标题是需要检索和显示用的,所以是Text类型,而新闻的内容因为是Html格式的,所以在经过解析器的处理用,使用的UnStored的格式,而新闻的时间是直接用来检索的,所以是KeyWord类型.为了在新闻索引后用户可以访问到完整的新闻页面,还设置了一个UnIndexed类型的访问地址字段.<br />
&nbsp;<br />
&nbsp;(对Html进行解析的处理稍后在进行讲解)<br />
&nbsp;<br />
&nbsp;为一条新闻建立索引需要两个步骤:获取Document,传给makeIndex函数,代码如下:<br />
</p>
<p>
<table class="code" cellspacing="1" cellpadding="1" width="80%" align="center" border="0">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;&nbsp; public static void makeNewsInfoIndex(NewsItem aNews)<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null == aNews)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makeIndex(makeNewsSearchDocument(aNews),indexDir);<br />
            &nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;</td>
        </tr>
    </tbody>
</table>
</p>
<p><br />
&nbsp;<br />
<br />
&nbsp;<br />
&nbsp;<br />
&nbsp;建立索引的工作就进行完了,只要在增加新闻后调用 makeNewsInfoIndex(newsitem); 就可以建立索引了.<br />
&nbsp;<br />
&nbsp;如果需要删除新闻,那么也要删除对应的索引,删除索引是通过IndexReader类来完成的:<br />
&nbsp;<br />
</p>
<p>
<table class="code" cellspacing="1" cellpadding="1" width="80%" align="center" border="0">
    <tbody>
        <tr>
            <td><br />
            &nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 删除索引.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param aTerm 索引删除条件<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param indexDir 索引目录<br />
            &nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp; public static void deleteIndex(Term aTerm, String indexDir)<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List aList = new ArrayList();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aList.add(aTerm);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleteIndex(aList, indexDir);<br />
            &nbsp;&nbsp;&nbsp; }
            <p>&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 删除索引.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * <br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param aTerm 索引删除条件.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param indexDir 索引目录<br />
            &nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp; public static void deleteIndex(List terms, String indexDir)<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null == terms)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!indexExist(indexDir)) { return; }</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IndexReader reader = null;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader = IndexReader.open(indexDir);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; terms.size(); i++)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Term aTerm = (Term) terms.get(i);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null != aTerm)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader.delete(aTerm);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (IOException e)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LogMan.warn("Error in Delete Index", e);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null != reader)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader.close();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (IOException e)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LogMan.warn("Close reader Error");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp; }&nbsp;<br />
            </p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p><br />
&nbsp;<br />
&nbsp;删除索引需要一个条件,类似数据库中的字段条件,例如删除一条新闻的代码如下:<br />
&nbsp;<br />
</p>
<p>
<table class="code" cellspacing="1" cellpadding="1" width="80%" align="center" border="0">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;&nbsp;&nbsp; public static void deleteNewsInfoIndex(int nid)<br />
            &nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Term aTerm = new Term("nid", String.valueOf(nid));<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleteIndex(aTerm,indexDir);<br />
            &nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;</td>
        </tr>
    </tbody>
</table>
</p>
<p><br />
<br />
<br />
&nbsp;通过新闻的ID,就可以删除一条新闻.<br />
&nbsp;<br />
&nbsp;如果需要更新新闻,如何更新索引哪? 更新索引需要先删除索引然后新建索引2个步骤,其实就是把上面的代码组合起来,例如更新一条新闻:</p>
<p>
<table class="code" cellspacing="1" cellpadding="1" width="80%" align="center" border="0">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;&nbsp;&nbsp; public static void updateNewsInfoIndex(NewsItem aNews)<br />
            &nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null == aNews)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleteNewsInfoIndex(aNews.getNid());<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makeNewsInfoIndex(aNews);<br />
            &nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br />
            &nbsp;</td>
        </tr>
    </tbody>
</table>
</p>
<p><br />
<br />
&nbsp;<br />
&nbsp;至此,索引的建立更新和删除就告一段落了.其中批量更新新闻的代码如下:<br />
&nbsp;(批量更新应该在访问人数少或者后台程序在夜间执行)</p>
<p>
<table class="code" cellspacing="1" cellpadding="1" width="80%" align="center" border="0">
    <tbody>
        <tr>
            <td>&nbsp;&nbsp;&nbsp; public static void makeAllNewsInfoIndex(List newsList)<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List terms = new ArrayList();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List docs = new ArrayList();
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; newsList.size(); i++)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NewsItem aitem = (NewsItem) newsList.get(i);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null != aitem)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; terms.add(new Term("nid", String.valueOf(aitem.getNid())));<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; docs.add(makeNewsSearchDocument(aitem));<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deleteIndex(terms,indexDir);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; makeIndex(docs,indexDir);<br />
            &nbsp;&nbsp;&nbsp; }&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.blogjava.net/human2008/aggbug/174507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/human2008/" target="_blank">灵!</a> 2008-01-11 09:47 <a href="http://www.blogjava.net/human2008/archive/2008/01/11/174507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分析/解析Html页面:HTML Parser的试用 </title><link>http://www.blogjava.net/human2008/archive/2008/01/11/174505.html</link><dc:creator>灵!</dc:creator><author>灵!</author><pubDate>Fri, 11 Jan 2008 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/human2008/archive/2008/01/11/174505.html</guid><wfw:comment>http://www.blogjava.net/human2008/comments/174505.html</wfw:comment><comments>http://www.blogjava.net/human2008/archive/2008/01/11/174505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/human2008/comments/commentRss/174505.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/human2008/services/trackbacks/174505.html</trackback:ping><description><![CDATA[<p>最近在研究lucene的全文检索,在很多地方需要解析或者说分析Html内容或者Html页面,Lucene本身的演示程序中也提供了一个Html Parser,但是不是纯Java的解决方案.于是到处搜索,在网上找到了一个"HTMLParser".</p>
<p>网址是: <a href="http://htmlparser.sourceforge.net/">http://htmlparser.sourceforge.net</a>&nbsp;,当前版本为1.5. </p>
<p>下载下来,试用一番,感觉不错,完全能满足lucene解析Html的需求.</p>
<p>过几天贴出lucene进行全文检索的代码.(检索本站的文章等).</p>
<p>试用代码如下,供大家参考:</p>
<p>
<table class="code" cellspacing="1" cellpadding="1" width="80%" align="center" border="0">
    <tbody>
        <tr>
            <td>
            <p>package com.jscud.test;</p>
            <p>import java.io.BufferedReader;<br />
            import java.io.File;<br />
            import java.io.FileInputStream;<br />
            import java.io.InputStreamReader;</p>
            <p>import org.htmlparser.Node;<br />
            import org.htmlparser.NodeFilter;<br />
            import org.htmlparser.Parser;<br />
            import org.htmlparser.filters.NodeClassFilter;<br />
            import org.htmlparser.filters.OrFilter;<br />
            import org.htmlparser.nodes.TextNode;<br />
            import org.htmlparser.tags.LinkTag;<br />
            import org.htmlparser.util.NodeList;<br />
            import org.htmlparser.util.ParserException;<br />
            import org.htmlparser.visitors.HtmlPage;<br />
            import org.htmlparser.visitors.TextExtractingVisitor;</p>
            <p>import com.jscud.util.LogMan; //一个日志记录类</p>
            <p>/**<br />
            &nbsp;* 演示了Html Parse的应用.<br />
            &nbsp;* <br />
            &nbsp;* @author scud <a href="http://www.jscud.com/">http://www.jscud.com</a><br />
            &nbsp;*/</p>
            <p>public class ParseHtmlTest<br />
            {</p>
            <p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String aFile = "e:/jscud/temp/test.htm";</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String content = readTextFile(aFile, "GBK");</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test1(content);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("====================================");</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test2(content);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("====================================");</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test3(content);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("====================================");</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test4(content);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("====================================");</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test5(aFile);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("====================================");</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //访问外部资源,相对慢<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test5("<a href="http://www.jscud.com/">http://www.jscud.com</a>"); <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("====================================");</p>
            <p>&nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 读取文件的方式来分析内容.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * filePath也可以是一个Url.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * <br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param resource 文件/Url<br />
            &nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp; public static void test5(String resource) throws Exception<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Parser myParser = new Parser(resource);</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置编码<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myParser.setEncoding("GBK");</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HtmlPage visitor = new HtmlPage(myParser);</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myParser.visitAllNodesWith(visitor);</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String textInPage = visitor.getTitle();</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(textInPage);<br />
            &nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 按页面方式处理.对一个标准的Html页面,推荐使用此种方式.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp; public static void test4(String content) throws Exception<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Parser myParser;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myParser = Parser.createParser(content, "GBK");</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HtmlPage visitor = new HtmlPage(myParser);</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myParser.visitAllNodesWith(visitor);</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String textInPage = visitor.getTitle();</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(textInPage);<br />
            &nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 利用Visitor模式解析html页面.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; *<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 小优点:翻译了&lt;&gt;等符号 <br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 缺点:好多空格,无法提取link<br />
            &nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; <br />
            &nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp; public static void test3(String content) throws Exception<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Parser myParser;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myParser = Parser.createParser(content, "GBK");</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextExtractingVisitor visitor = new TextExtractingVisitor();</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myParser.visitAllNodesWith(visitor);</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String textInPage = visitor.getExtractedText();</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(textInPage);<br />
            &nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 得到普通文本和链接的内容.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * <br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 使用了过滤条件.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp; public static void test2(String content) throws ParserException<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Parser myParser;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NodeList nodeList = null;</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myParser = Parser.createParser(content, "GBK");</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NodeFilter textFilter = new NodeClassFilter(TextNode.class);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NodeFilter linkFilter = new NodeClassFilter(LinkTag.class);</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //暂时不处理 meta<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //NodeFilter metaFilter = new NodeClassFilter(MetaTag.class);</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OrFilter lastFilter = new OrFilter();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lastFilter.setPredicates(new NodeFilter[] { textFilter, linkFilter });</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nodeList = myParser.parse(lastFilter);</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Node[] nodes = nodeList.toNodeArray();</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; nodes.length; i++)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Node anode = (Node) nodes[i];</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String line = "";<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (anode instanceof TextNode)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextNode textnode = (TextNode) anode;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //line = textnode.toPlainTextString().trim();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line = textnode.getText();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (anode instanceof LinkTag)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinkTag linknode = (LinkTag) anode;</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line = linknode.getLink();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a>//@todo</a> 过滤jsp标签:可以自己实现这个函数<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //line = StringFunc.replace(line, "&lt;%.*%&gt;", "");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (isTrimEmpty(line))<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(line);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 解析普通文本节点.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * <br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param content<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @throws ParserException<br />
            &nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp; public static void test1(String content) throws ParserException<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Parser myParser;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Node[] nodes = null;</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myParser = Parser.createParser(content, null);</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nodes = myParser.extractAllNodesThatAre(TextNode.class); //exception could be thrown here</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; nodes.length; i++)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextNode textnode = (TextNode) nodes[i];<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String line = textnode.toPlainTextString().trim();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (line.equals(""))<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(line);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 读取一个文件到字符串里.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * <br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param sFileName&nbsp; 文件名<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param sEncode&nbsp;&nbsp; String<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @return 文件内容<br />
            &nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp; public static String readTextFile(String sFileName, String sEncode)<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sbStr = new StringBuffer();</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File ff = new File(sFileName);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStreamReader read = new InputStreamReader(new FileInputStream(ff),<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sEncode);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader ins = new BufferedReader(read);</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String dataLine = "";<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (null != (dataLine = ins.readLine()))<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sbStr.append(dataLine);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sbStr.append("\r\n");<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ins.close();<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (Exception e)<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LogMan.error("read Text File Error", e);<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sbStr.toString();<br />
            &nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 去掉左右空格后字符串是否为空<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param astr String<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br />
            &nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp; public static boolean isTrimEmpty(String astr)<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((null == astr) || (astr.length() == 0))<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (isBlank(astr.trim()))<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
            &nbsp;&nbsp;&nbsp; }</p>
            <p>&nbsp;&nbsp;&nbsp; /**<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * 字符串是否为空:null或者长度为0.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @param astr 源字符串.<br />
            &nbsp;&nbsp;&nbsp;&nbsp; * @return boolean<br />
            &nbsp;&nbsp;&nbsp;&nbsp; */<br />
            &nbsp;&nbsp;&nbsp; public static boolean isBlank(String astr)<br />
            &nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((null == astr) || (astr.length() == 0))<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
            &nbsp;&nbsp;&nbsp; }</p>
            <p>}</p>
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<br />
</p>
<img src ="http://www.blogjava.net/human2008/aggbug/174505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/human2008/" target="_blank">灵!</a> 2008-01-11 09:45 <a href="http://www.blogjava.net/human2008/archive/2008/01/11/174505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaEE事务扫盲笔记之一扫扫到尾  </title><link>http://www.blogjava.net/human2008/archive/2008/01/11/174503.html</link><dc:creator>灵!</dc:creator><author>灵!</author><pubDate>Fri, 11 Jan 2008 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/human2008/archive/2008/01/11/174503.html</guid><wfw:comment>http://www.blogjava.net/human2008/comments/174503.html</wfw:comment><comments>http://www.blogjava.net/human2008/archive/2008/01/11/174503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/human2008/comments/commentRss/174503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/human2008/services/trackbacks/174503.html</trackback:ping><description><![CDATA[<h2>1.资料</h2>
<ul>
    <li><span class="nobr"><a title="Visit page outside Confluence" href="http://www.infoq.com/minibooks/JTDS" rel="nofollow" mce_href="http://www.infoq.com/minibooks/JTDS" linktype="raw" linktext="《Java Transaction Design Strategies》|http://www.infoq.com/minibooks/JTDS">《Java Transaction Design Strategies》<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" mce_src="http://www.blogjava.net/images/icons/linkext7.gif" /></sup></a></span>&#8201;&nbsp;InfoQ minibook，最好的电子文档，对Java事务处于懵懂状态的必读。
    <li>《Expert One on one J2EE Development Without EJB 中文版》与<span class="nobr"><a title="Visit page outside Confluence" href="http://www.redsaga.com/spring_ref/2.0/html/transaction.html" rel="nofollow" mce_href="http://www.redsaga.com/spring_ref/2.0/html/transaction.html" linktype="raw" linktext="Spring参考手册中文版|http://www.redsaga.com/spring_ref/2.0/html/transaction.html">Spring参考手册中文版<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" mce_src="http://www.blogjava.net/images/icons/linkext7.gif" /></sup></a></span>&#8201; 中的相关章节可以看到spring guys的意见。</li>
</ul>
<h2><a class="" name="Transaction-2.%E6%9C%AC%E5%9C%B0%E4%BA%8B%E5%8A%A1%E4%B8%8E%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1"></a>2.本地事务与分布式事务</h2>
<ul>
    <li><strong>本地事务</strong><br />
    完全依赖于DB、JMS自身，，如直接调用jdbc中的conn.commit();这里没应用服务器什么事，所以也不支持多数据源的全局事务。
    <li><strong>分布式事务</strong><br />
    在JavaEE世界的事务在JTA、JTS规范和XA Sources之上实现。<br />
    JTA是用户编程接口，JTS是服务器底层服务，两者一般由应用服务器自带实现，而<span class="nobr"><a title="Visit page outside Confluence" href="http://www.atomikos.com/" rel="nofollow" mce_href="http://www.atomikos.com/" linktype="raw" linktext="atomikos|http://www.atomikos.com/">atomikos<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" mce_src="http://www.blogjava.net/images/icons/linkext7.gif" /></sup></a></span>&#8201;、<span class="nobr"><a title="Visit page outside Confluence" href="http://jotm.objectweb.org/" rel="nofollow" mce_href="http://jotm.objectweb.org/" linktype="raw" linktext="JOTM|http://jotm.objectweb.org/">JOTM<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" mce_src="http://www.blogjava.net/images/icons/linkext7.gif" /></sup></a></span>&#8201;和<span class="nobr"><a title="Visit page outside Confluence" href="http://labs.jboss.com/jbosstm" rel="nofollow" mce_href="http://labs.jboss.com/jbosstm" linktype="raw" linktext="JBoss Transaction|http://labs.jboss.com/jbosstm">JBoss Transaction<sup><img class="rendericon" height="7" alt="" src="http://wiki.springside.org.cn/images/icons/linkext7.gif" width="7" align="absMiddle" border="0" mce_src="http://www.blogjava.net/images/icons/linkext7.gif" /></sup></a></span>&#8201;是专门搞局抢生意的。<br />
    XA Sources其实先于JavaEE而存在，JDBC driver必须有javax.sql.XADataSource接口的实现类，否则所谓二阶段提交就是个伪能力。<br />
    JavaEE除了支持JDBC和JMS外，还引入了JCA模型。JCA可以说是目前唯一可移植的插入JavaEE事务的资源模型，因此像JDO这类框架/Server就是靠乖乖出自己的JCA连接器来参与JavaEE事务的。</li>
</ul>
<h2><a class="" name="Transaction-3.%E7%BC%96%E7%A8%8B%E5%BC%8F%E6%A8%A1%E5%9E%8B"></a>3.编程式模型</h2>
<p>&nbsp;&nbsp;&nbsp; 手工调用jdbc的connection事务方法和使用JTA接口都属于编程式开发，在EJB中叫BMT(Bean管理事务)。<br />
&nbsp;&nbsp;&nbsp; JTA最重要的接口就是UserTransaction和它的六个方法-begin，commit，rollback，getStatus，setRollbackonly，setTransactionTimeout。<br />
&nbsp;&nbsp;&nbsp; 程序需要UserTransaction时可以从JNDI领取，不过JNDI名随应用服务器不同而不同。EJB3里可以直接用个@Resource注入。</p>
<h2><a class="" name="Transaction-4.%E5%AE%A3%E5%91%8A%E5%BC%8F%E6%A8%A1%E5%9E%8B"></a>4.宣告式模型</h2>
<p>&nbsp;&nbsp;&nbsp; 前面都是铺垫，这个才是主打的事务模型，如EJB的CMT(容器管理事务)和Sprin。</p>
<p>&nbsp;&nbsp;&nbsp; 其中EJB2.0，Spring1.0在部署描述符和applicationContext.xml中定义，而EJB3.0和Spring2.0则采用annotation。</p>
<h3><a class="" name="Transaction-4.1%E4%BA%8B%E5%8A%A1%E7%B1%BB%E5%9E%8B"></a>4.1 事务类型</h3>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这里JavaEE与Spring的定义基本相同：</p>
<ul>
    <li>Required：如果Context中有事务就加入，没有就自己创建一个。(最常用设置)
    <li>Mandatory：永远加入一个事务。如果当前Context没有事务，抛出异常。(那些不打算自己负责rollback事务的方法，必须加入到别人的事务，由别人来控制rollback)
    <li>RequiresNew：永远新建一个事务。(那些不管别人如何，自己必须提交事务的方法，比如审计信息是一定要写的)
    <li>Supports：如果有事务就加入，如果没有就算了。永远不会创建新事务。(一般用于只读方法，不会主动创建事务，但如果当前有事务就加入，以读到事务中未提交的数据)
    <li>NotSupported：永远不使用事务，如果当前有事务，挂起事务。(那些有可能抛异常但异常并不影响全局的方法)
    <li>Never：不能在有当前事务的情况下调用本方法。（生人勿近?)</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可见，Required是默认的设置，Supports是只读方法的最佳选择。</p>
<h3><a class="" name="Transaction-4.2%E4%BA%8B%E5%8A%A1%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB"></a>4.2 事务隔离级别</h3>
<ul>
    <li>ReadUncommited：本事务可以看到另一事务未提交的数据。脏读。
    <li>ReadCommited：本事务只可以看到另一事务已提交的数据。不可重复读。
    <li>RepeatableRead：可重复读。在一个事务内，第一次读到的数据，在本事务没有提交前，无论另一个事务如何提交数据，本事务读到的数据都是不变的。
    <li>Serializable：串行化，同时只有一个事务能读相同的数据。</li>
</ul>
<p>&nbsp;&nbsp;&nbsp; 级别越低越安全效率也越低。隔离级别需要相关资源支持，如重复读在Oracle里会降级为ReadCommited。Spring里默认的Default级别完全看数据源的脸色行事。</p>
<h3><a class="" name="Transaction-4.3%E5%85%B3%E4%BA%8ERollback"></a>4.3 关于Rollback</h3>
<p>&nbsp;&nbsp;&nbsp; EJB里，想rollback只能sessionContext.setRollbackOnly()，或者抛出EJBException。(EJB3还可以annotation设置某些自定义Exception可以触发rollback)</p>
<p>&nbsp;&nbsp;&nbsp; 在Spring里，同样只会rollback unchecked exception(RuntimeExcption及子类)，而checked exception(Exception及子类)是不会rollback的，除非你特别声明。</p>
<div class="macro" macrotext="{code}" command="code">
<div class="code">
<div class="codeContent">
<pre class="code-java">&nbsp;&nbsp;&nbsp;@Transactional(readOnly = <span class="code-keyword">false</span>, propagation = Propagation.REQUIRES_NEW,rollbackFor = {MyException1.class,MyException2.class})</pre>
</div>
</div>
</div>
<p>&#8201;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;因此所有在service层方法中用throws定义的Exception，都必须在事务定义中进行rollback设定。(请勿善忘)</p>
<p>&nbsp;&nbsp;&nbsp; 所有在service层方法中c被atch处理了的异常，又希望容器辅助rollback的话，必须重抛一个预定义的RuntimeException的子类。(请勿回望)</p>
<h3><a class="" name="Transaction-4.4%E5%85%B3%E4%BA%8ESpring"></a>4.4 关于Spring</h3>
<p>&nbsp;&nbsp;&nbsp; Spring不希望编程式事务管理。<br />
&nbsp;&nbsp;&nbsp; Spring也不希望使用EJB CMT--CMT依赖于EJB而无法用于POJO，依赖于JTA全局事务对单数据源场景造成了浪费，而且rollback机制比较麻烦（必须为EJBException或手工setRollbackOnly())。<br />
&nbsp;&nbsp;&nbsp; 因此Spring通过AOP实现了对POJO的整套宣告式事务体系；对jdbc,hibernate,jpa,jms等local数据源和JTA实现了统一的事务管理机制，而且支持本地资源与JTA在配置文件级的切换，而且改进了rollback机制。</p>
<p>&nbsp;&nbsp; 1）一个本地事务管理器：</p>
<div class="macro" macrotext="{code}" command="code">
<div class="code">
<div class="codeContent">
<pre class="code-java">&lt;bean id=<span class="code-quote">"transactionManager"</span>&nbsp;&nbsp;class=<span class="code-quote">"org.springframework.orm.jpa.JpaTransactionManager"</span>&gt;&nbsp;&nbsp;&lt;property name=<span class="code-quote">"entityManagerFactory"</span> ref=<span class="code-quote">"entityManagerFactory"</span> /&gt;&nbsp;&lt;/bean&gt;</pre>
</div>
</div>
</div>
<p>&#8201;</p>
<p>&nbsp;&nbsp; 2）Spring就会把请求都转发到应用服务器的JTA对象上（注意此时数据源也需要改为用JNDI从应用服务器获取)。</p>
<div class="macro" macrotext="{code}" command="code">
<div class="code">
<div class="codeContent">
<pre class="code-java">&lt;bean id=<span class="code-quote">"myTxManager"</span> class=<span class="code-quote">"org.springframework.transaction.jta.JtaTransactionManager"</span>/&gt;</pre>
</div>
</div>
</div>
<p>&#8201;</p>
<p>&nbsp;&nbsp; 3）应用服务器专有的类型的JTA事务管理器：</p>
<div class="macro" macrotext="{code}" command="code">
<div class="code">
<div class="codeContent">
<pre class="code-java">&lt;bean id=<span class="code-quote">"myTxManager"</span> class=<span class="code-quote">"org.springframework.transaction.jta.WebLogicJtaTransactionManager"</span>/&gt;</pre>
</div>
</div>
</div>
<p>&#8201;</p>
<img src ="http://www.blogjava.net/human2008/aggbug/174503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/human2008/" target="_blank">灵!</a> 2008-01-11 09:44 <a href="http://www.blogjava.net/human2008/archive/2008/01/11/174503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>包装你的Session，使Session对象化 </title><link>http://www.blogjava.net/human2008/archive/2008/01/11/174498.html</link><dc:creator>灵!</dc:creator><author>灵!</author><pubDate>Fri, 11 Jan 2008 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/human2008/archive/2008/01/11/174498.html</guid><wfw:comment>http://www.blogjava.net/human2008/comments/174498.html</wfw:comment><comments>http://www.blogjava.net/human2008/archive/2008/01/11/174498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/human2008/comments/commentRss/174498.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/human2008/services/trackbacks/174498.html</trackback:ping><description><![CDATA[&nbsp;在Web开发中，经常需要使用Session来保存特定用户的信息，在我们的程序中很多地方散落着类似下面的语句：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;userAge&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">)</span><span style="color: #0000ff">this</span><span style="color: #000000">.Session[</span><span style="color: #000000">"</span><span style="color: #000000">UserAge</span><span style="color: #000000">"</span><span style="color: #000000">];</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; 我们知道，Session中存放的是键值对，键是string类型的，如果我们一不小心把上面的语句写成这样：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;userAge&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">)</span><span style="color: #0000ff">this</span><span style="color: #000000">.Session[</span><span style="color: #000000">"</span><span style="color: #000000"><span style="color: red"><span style="color: red">Use</span></span>Age</span><span style="color: #000000">"</span><span style="color: #000000">];</span></div>
&nbsp;&nbsp;&nbsp; 编译期不会发现这个错误，但运行时一定会抛出异常，这是在程序中直接操作Session可能引发的问题之一。另外，每次获取userAge的时候都要写代码进行强制转换，感觉很繁琐。我们需要一个解决方案来解决这些问题。我的做法是引入一个Session的包装，使之对象化、强类型化。就像接下来的例子一样：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SessionHelper<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;HttpSessionState&nbsp;curSession;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;SessionHelper(HttpSessionState&nbsp;session)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.curSession&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;SessionHelper&nbsp;CreateInstance(HttpSessionState&nbsp;session)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SessionHelper(session);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;UserID<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.curSession[</span><span style="color: #000000">"</span><span style="color: #000000">UserID</span><span style="color: #000000">"</span><span style="color: #000000">].ToString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.curSession[</span><span style="color: #000000">"</span><span style="color: #000000">UserID</span><span style="color: #000000">"</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;UserAge<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">)</span><span style="color: #0000ff">this</span><span style="color: #000000">.curSession[</span><span style="color: #000000">"</span><span style="color: #000000">UserAge</span><span style="color: #000000">"</span><span style="color: #000000">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.curSession[</span><span style="color: #000000">"</span><span style="color: #000000">UserAge</span><span style="color: #000000">"</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">某用户上传的所有图片</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ArrayList&nbsp;PicList<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">.curSession[</span><span style="color: #000000">"</span><span style="color: #000000">PicList</span><span style="color: #000000">"</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.curSession[</span><span style="color: #000000">"</span><span style="color: #000000">PicList</span><span style="color: #000000">"</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(ArraayList)</span><span style="color: #0000ff">this</span><span style="color: #000000">.curSession[</span><span style="color: #000000">"</span><span style="color: #000000">PicList</span><span style="color: #000000">"</span><span style="color: #000000">];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">清空图片列表</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;ClearAllPics()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.PicList.Clear();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
}</span></div>
<br />
&nbsp;&nbsp;&nbsp; 这样，我们用起来就非常方便了：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionHelper&nbsp;sessionHelper&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SessionHelper.CreateInstance(</span><span style="color: #0000ff">this</span><span style="color: #000000">.Session);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&nbsp;picList&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sessionHelper.PicList;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"  alt="" />&nbsp;&nbsp;处理picList中的图片</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sessionHelper.ClearAllPics();&nbsp;&nbsp;</span></div>
<br />
&nbsp;&nbsp;&nbsp; 引入这一层包装，可以使我们的程序的可读性、可维护性更好，而且将原来的一些运行期的错误提前到了编译期，这也是强类型带来的好处。<br />
<img src ="http://www.blogjava.net/human2008/aggbug/174498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/human2008/" target="_blank">灵!</a> 2008-01-11 09:36 <a href="http://www.blogjava.net/human2008/archive/2008/01/11/174498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java －－ 在Eclipse上使用Hibernate </title><link>http://www.blogjava.net/human2008/archive/2008/01/11/174496.html</link><dc:creator>灵!</dc:creator><author>灵!</author><pubDate>Fri, 11 Jan 2008 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/human2008/archive/2008/01/11/174496.html</guid><wfw:comment>http://www.blogjava.net/human2008/comments/174496.html</wfw:comment><comments>http://www.blogjava.net/human2008/archive/2008/01/11/174496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/human2008/comments/commentRss/174496.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/human2008/services/trackbacks/174496.html</trackback:ping><description><![CDATA[&nbsp; 最近一个项目要用Java做，一点都不熟啊。没办法，只好硬着头皮啃了，花了大半天的时间，终于在Eclipse上完成了第一个Hibernate例子。下面记录关键的步骤，权作笔记，以备日后查看。<br />
<br />
&nbsp;（1）下载Hibernate，并向项目中导入Hibernate。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Project-&gt;Properies-&gt;Java Build Path-&gt;Libraries-&gt;Add External JARs...，选择Hibernate根目录下的hibernate3.jar，添加到项目中。<br />
&nbsp;&nbsp;&nbsp;&nbsp;接着，要将Hibernate下的lib文件夹下的所有文件都作为一个User Library添加到项目中，否则，如果仅仅添加hibernate3.jar，编译可以通过，运行却会抛出ClassNotDef的异常，因为hibernate3.jar依赖于Hibernate下的lib文件夹下的文件。<br />
<br />
&nbsp;2）我们的应用的后台数据库使用的是Oracle，所以首先要在例子项目中引入含有Oracle jdbc driver的包，classes12.jar。该jar文件位于oracle安装目录的jdbc\lib目录下。<br />
&nbsp;&nbsp;&nbsp;&nbsp;在Eclipse中，Project-&gt;Properies-&gt;Java Build Path-&gt;Libraries-&gt;Add External JARs...，选择classes12.jar，将其添加到项目中。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
（3）生成hibernate.cfg.xml文件。<br />
&nbsp;&nbsp;&nbsp; 通常Hibernate的配置文件和.hbm.xml文件都可以自动生成，这种自动生成的工具很多，我使用的是HibernateSynchronizer，它可以作为一个插件添加到Eclipse中。当HibernateSynchronizer插件正确加载后，我们可以向当前项目中添加Hibernate配置文件：File-&gt;New-&gt;Other-&gt;Hibernate-&gt;Hibernate Configuration File，出现如下界面：<br />
<img style="width: 561px; height: 493px" height="493" alt="" src="http://www.cnblogs.com/images/cnblogs_com/zhuweisky/Hibernate01.JPG" width="561" border="0" /><br />
<br />
&nbsp; 注意，Driver Class要选择针对Oracle的oracle.jdbc.driver.OracleDriver，而且Database&nbsp;URL的格式也要正确，如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">jdbc:oracle:thin:@</span><span style="color: #000000">10.8</span><span style="color: #000000">.</span><span style="color: #000000">8.221</span><span style="color: #000000">:</span><span style="color: #000000">1521</span><span style="color: #000000">:ORCL</span></div>
<br />
<p>&nbsp;&nbsp;&nbsp;&nbsp;最好将hibernate.cfg.xml文件存放于项目的根目录下。<br />
<br />
&nbsp;4）生成.hbm.xml文件。File-&gt;New-&gt;Other-&gt;Hibernate-&gt;Hibernate Mapping File，出现如下界面：<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/zhuweisky/Hibernate02.JPG" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp; 在填写完Password后，点击Refresh按钮，就会在Tables中列出所有可以访问的数据库表，然后选中要为其生成.hbm.xml文件的表，点击Finish，即会生成对应的.hbm.xml文件，比如我上面选择的是Mobileuser表，就会生成Mobileuser.hbm.xml文件。<br />
<br />
（5）从.hbm.xml文件自动生成实体类。<br />
&nbsp;&nbsp;&nbsp; 在Package Explorer中选中Mobileuser.hbm.xml文件，右键-&gt;Hibernate Synchronizer-&gt;Synchronize Files&nbsp;，即可生成对应的实体类和DAO类。如果你仅仅想要实体类，那么可以在Project-&gt;Properies-&gt;Hibernate Synchronizer-&gt;Data Access Objects&nbsp;，将&#8220;I would like to have DAOs created for me&#8221;的钩选项去掉即可。<br />
<br />
（6）在hibernate.cfg.xml文件中添加对应的mapping resource。<br />
&nbsp;&nbsp;&nbsp;&nbsp;在Package Explorer中选中Mobileuser.hbm.xml文件，右键-&gt;Hibernate Synchronizer-&gt;Add Mapping Reference，即会在<br />
hibernate.cfg.xml中自动生成如下配置：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;</span><span style="color: #000000">mapping&nbsp;resource</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">HibernateTest/Mobileuser.hbm.xml</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span></div>
<p>（7）修改自动生成的hibernate.cfg.xml文件。需要在hibernate.cfg.xml文件的首部添加：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;!</span><span style="color: #000000">DOCTYPE&nbsp;hibernate</span><span style="color: #000000">-</span><span style="color: #000000">configuration&nbsp;PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">-//Hibernate/Hibernate&nbsp;Configuration&nbsp;DTD&nbsp;3.0//EN</span><span style="color: #000000">"</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;比较繁琐的是，每次自动修改hibernate.cfg.xml文件后，都要重新添加这个xml片断。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;万事具备，现在可以写个测试来检验一下了：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">&nbsp;&nbsp;&nbsp; //</span><span style="color: #008000">仅仅作为示例，没有进行异常处理</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Configuration&nbsp;cfg&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Configuration().configure()&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SessionFactory&nbsp;&nbsp;sFactory&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cfg.buildSessionFactory()&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sFactory.openSession()&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;session.beginTransaction();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mobileuser&nbsp;user&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Mobileuser)session.load(Mobileuser.</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(</span><span style="color: #000000">2</span><span style="color: #000000">))&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;user.getMobilenumber()&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><span style="color: #0000ff">out</span><span style="color: #000000">.println(age)&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.commit();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close()&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<img src ="http://www.blogjava.net/human2008/aggbug/174496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/human2008/" target="_blank">灵!</a> 2008-01-11 09:34 <a href="http://www.blogjava.net/human2008/archive/2008/01/11/174496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java －－ 在Eclipse上使用Spring </title><link>http://www.blogjava.net/human2008/archive/2008/01/11/174495.html</link><dc:creator>灵!</dc:creator><author>灵!</author><pubDate>Fri, 11 Jan 2008 01:33:00 GMT</pubDate><guid>http://www.blogjava.net/human2008/archive/2008/01/11/174495.html</guid><wfw:comment>http://www.blogjava.net/human2008/comments/174495.html</wfw:comment><comments>http://www.blogjava.net/human2008/archive/2008/01/11/174495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/human2008/comments/commentRss/174495.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/human2008/services/trackbacks/174495.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 在.NET上用的VS.NET+Spring.net+Nhibernate，到了Java平台上，自然对应着Eclipse+Spring+Hibernate。<a href="http://zhuweisky.cnblogs.com/archive/2006/05/30/413045.html">上一篇文章</a>介绍了如何在Eclipse上使用Hibernate的入门，本文就简单介绍一下如何在Eclipse使用Spring。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;（1）首先，是下载Spring，可以从sourceforge上下载，<a href="http://sourceforge.net/projects/springframework">http://sourceforge.net/projects/springframework</a>。目前的最新的可以下载 spring-framework-1.2.8-with-dependencies.zip 。<br />
<br />
&nbsp;&nbsp;&nbsp; （2）然后，可以将Spring引入到你的项目中。<br />
&nbsp;&nbsp;&nbsp; 先将spring-framework-1.2.8-with-dependencies.zip解压，将其中的spring.jar（dist目录中）、commons-logging.jar（lib\jakarta-commons目录）、log4j-1.2.13.jar（lib\log4j目录）这三个文件复制到的&#8221;D:\java\Spring\lib" 目录中，然后在Eclipse中建立一个&#8220;Spring&#8221;库，将那三个文件添加进&#8220;Spring&#8221;库中。<br />
<br />
&nbsp;&nbsp;&nbsp; （3）测试一下：<br />
&nbsp;&nbsp;&nbsp; 新建两个类，Student和Book。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Book&nbsp;<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;bookName&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getBookName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;bookName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setBookName(String&nbsp;bookName)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.bookName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bookName;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getId()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setId(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.id&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;id;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Student&nbsp;<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;name&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Book&nbsp;book&nbsp;;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getAge()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setAge(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.age&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getName()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setName(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Book&nbsp;getBook()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;book;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setBook(Book&nbsp;book)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.book&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;book;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;GetBookName()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.book.getBookName()&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
}</span></div>
<br />
&nbsp;&nbsp;&nbsp; 然后添加Spring配置文件bean.xml（bean.xml必须在CLASSPATH可以存取到的目录中）：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;?</span><span style="color: #000000">xml&nbsp;version</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">1.0</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;encoding</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&lt;!</span><span style="color: #000000">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">-//SPRING/DTD&nbsp;BEAN/EN</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br />
</span><span style="color: #000000">"</span><span style="color: #000000">http://www.springframework.org/dtd/spring-beans.dtd</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #000000">&lt;</span><span style="color: #000000">beans</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">student</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.springTest.Student</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">age</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">22</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">Sky</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">book</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">ref</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">book</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">book</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">com.springTest.Book</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">id</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">1000</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">bookName</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000">战争与和平</span><span style="color: #000000">&lt;/</span><span style="color: #000000">value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">property</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">bean</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&lt;/</span><span style="color: #000000">beans</span><span style="color: #000000">&gt;</span></div>
<br />
&nbsp;&nbsp;&nbsp; 最后的主程序：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">&nbsp;&nbsp;&nbsp; public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Resource&nbsp;res&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassPathResource(</span><span style="color: #000000">"</span><span style="color: #000000">bean.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanFactory&nbsp;factory&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;XmlBeanFactory(res);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Student&nbsp;stu&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Student)&nbsp;factory.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">student</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><span style="color: #0000ff">out</span><span style="color: #000000">.println(stu.GetBookName());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
&nbsp;&nbsp;&nbsp; 运行后可以看到控制台输出－－&#8220;战争与和平&#8221;。<br />
<br />
&nbsp;&nbsp;&nbsp; 与Spring.net的使用基本完全一致（包括配置文件、BeanFactory的获取等），所以熟悉Spring.net的你过渡到Spring是非常平滑的。<br />
&nbsp;&nbsp;&nbsp; 最后，Java中的属性实在是没有C#中的简洁，呵呵。<br />
<img src ="http://www.blogjava.net/human2008/aggbug/174495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/human2008/" target="_blank">灵!</a> 2008-01-11 09:33 <a href="http://www.blogjava.net/human2008/archive/2008/01/11/174495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java －－ 在Eclipse上使用XFire开发WebService </title><link>http://www.blogjava.net/human2008/archive/2008/01/11/174493.html</link><dc:creator>灵!</dc:creator><author>灵!</author><pubDate>Fri, 11 Jan 2008 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/human2008/archive/2008/01/11/174493.html</guid><wfw:comment>http://www.blogjava.net/human2008/comments/174493.html</wfw:comment><comments>http://www.blogjava.net/human2008/archive/2008/01/11/174493.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/human2008/comments/commentRss/174493.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/human2008/services/trackbacks/174493.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 终于，使用Java完成了一个WebService的例子，其中的一个非常小的问题，折腾了我将近一天的时间。下面给出步骤，说明在Java平台上如何开发WebService。<br />
<br />
&nbsp;&nbsp;&nbsp; 采用的工具：Eclipse3.1.2 + Tomcat5.5 + XFire1.1 。使用XFire开发WebService应该说非常的容易，只需要按照下面例子的步骤来做：<br />
<br />
（1）在Eclipse中新建一个dynamic Web Project ，假设名为XFireZhuweiTest。<br />
<br />
（2）导入XFire用户库。该库中应包含xfire-1.1目录下的xfire-all-1.1.jar文件，以及<strong>xfire-1.1\lib</strong>目录下的所有文件。<br />
<br />
（3）将上述的XFire用户库中的所有文件拷贝到XFireZhuweiTest项目的<strong>WebContent\WEB-INF\lib</strong>目录下。<br />
<br />
（4）修改<strong>WebContent\WEB-INF\web.xml</strong>配置文件的内容，下面是修改后web.xml：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee">&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br />
&lt;web-app&nbsp;id="WebApp_ID"&nbsp;version="2.4"&nbsp;xmlns="http://java.sun.com/xml/ns/j2ee"&nbsp;xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&nbsp;xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;display-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;XFireZhuweiTest&lt;/display-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file-list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.htm&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;default.html&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;default.htm&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/welcome-file-list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.codehaus.xfire.transport.http.XFireConfigurableServlet<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/servlet/XFireServlet<span style="color: red">/*&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-mapping&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&lt;/web-app&gt;<br />
</span></div>
<p>&nbsp;&nbsp;&nbsp; web.xml中添加的servlet映射表明，所有匹配&#8220;/services/*&#8221;的url请求全部交给org.codehaus.xfire.transport.http.XFireConfigurableServlet来处理。<br />
<br />
（5）编写需要发布为WebService的Java类，这个例子中是一个非常简单的MathService.java。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">package&nbsp;com.zhuweisky.xfireDemo;<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MathService&nbsp;<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Add(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a&nbsp;,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b)<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;a</span><span style="color: #000000">+</span><span style="color: #000000">b&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<p>（6）在<strong>WebContent\META-INF</strong>目录下新建<strong>xfire文件夹</strong>，然后在xfire目录下添加一个XFire使用的配置文件services.xml，该配置文件中的内容反映了要将哪些java类发布为web服务。本例中的services.xml内容如下：<br />
<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;?</span><span style="color: #000000">xml&nbsp;version</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">1.0</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;encoding</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&lt;</span><span style="color: #000000">beans&nbsp;xmlns</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">http://xfire.codehaus.org/config/1.0</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">service</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000">MathService</span><span style="color: #000000">&lt;/</span><span style="color: #000000">name</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&gt;</span><span style="color: #000000">http:</span><span style="color: #008000">//</span><span style="color: #008000">com.zhuweisky.xfireDemo/MathService&lt;/namespace&gt;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">serviceClass</span><span style="color: #000000">&gt;</span><span style="color: #000000">com.zhuweisky.xfireDemo.MathService</span><span style="color: #000000">&lt;/</span><span style="color: #000000">serviceClass</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">service</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&lt;/</span><span style="color: #000000">beans</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
&nbsp;&nbsp;&nbsp; XFire会借助Spring来解析services.xml，从中提取需要发布为WebService的配置信息。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;很多文章介绍到这里就完了，然而当我按照他们所说的启动WebService&nbsp;，然后通过<a href="http://localhost:8080/XFireZhuweiTest/services/MathService?wsdl">http://localhost:8080/XFireZhuweiTest/services/MathService?wsdl</a>&nbsp;来访问服务描述时，却抛出了异常，说services.xml文件不存在－－<br />
&#8220;org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [META-INF/xfire/services.xml]; nested exception is java.io.FileNotFoundException: class path resource [META-INF/xfire/services.xml] cannot be opened because it does not exist&#8221;。&nbsp;&nbsp; <br />
<br />
（7）非常关键的一点，就是这个小难题花费了我将近一天的时间。<br />
&nbsp;&nbsp;&nbsp; 在<strong>WebContent\WEB-INF</strong>目录下新建<strong>classes</strong>文件夹，然后需要将<strong>WebContent</strong>下的整个<strong>META-INF</strong>文件夹剪切到新建的classes文件夹下。<br />
&nbsp;&nbsp;&nbsp; 到这里，项目的完整目录结构如下：<br />
<br />
<img height="336" alt="" src="http://www.cnblogs.com/images/cnblogs_com/zhuweisky/xfireTest.JPG" width="232" border="0" /><br />
<br />
（8）在Package Explorer中选中XFireZhuweiTest项目，右键-&gt;Run As -&gt;Run On Server，关联到你机器上的TomCat，然后会启动Tomcat，以启动web服务。（注意，在进行此步骤之前，请先停止TomCat）&nbsp;
<p>（9）在IE中输入 <a href="http://localhost:8080/XFireZhuweiTest/services/MathService?wsdl">http://localhost:8080/XFireZhuweiTest/services/MathService?wsdl</a>&nbsp;会得到正确的web服务描述文档。</p>
<p>（10）测试刚发布的webService。我使用C#动态调用Web服务：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span><span style="color: #008000">C#</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;url&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:8080/XFireZhuweiTest/services/MathService</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">[]&nbsp;args&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">{</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">2</span><span style="color: #000000">}&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ESFramework.WebService.WebServiceHelper.InvokeWebService(url&nbsp;,</span><span style="color: #000000">"</span><span style="color: #000000">Add</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;,args)&nbsp;;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show(result.ToString());</span></div>
<br />
<p>&nbsp;&nbsp;&nbsp;&nbsp;（关于C#动态调用Web服务，请参见<a href="http://zhuweisky.cnblogs.com/archive/2005/12/07/292472.html">这里</a>）<br />
<br />
&nbsp;&nbsp;&nbsp; 执行后，弹出对话框，显示结果是3。 <br />
</p>
<img src ="http://www.blogjava.net/human2008/aggbug/174493.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/human2008/" target="_blank">灵!</a> 2008-01-11 09:31 <a href="http://www.blogjava.net/human2008/archive/2008/01/11/174493.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通用分页存储过程(原创)</title><link>http://www.blogjava.net/human2008/archive/2008/01/10/174353.html</link><dc:creator>灵!</dc:creator><author>灵!</author><pubDate>Thu, 10 Jan 2008 09:08:00 GMT</pubDate><guid>http://www.blogjava.net/human2008/archive/2008/01/10/174353.html</guid><wfw:comment>http://www.blogjava.net/human2008/comments/174353.html</wfw:comment><comments>http://www.blogjava.net/human2008/archive/2008/01/10/174353.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/human2008/comments/commentRss/174353.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/human2008/services/trackbacks/174353.html</trackback:ping><description><![CDATA[&nbsp;这是我项目中使用的一个分页存储过程，具有很强的通用性。配合前台ASP.NET使用50万条数据基本感不到延迟。数据库为SQLServer2000。
<p align="left">1.分页存储过程</p>
<p>CREATE&nbsp;&nbsp; procedure pagination</p>
<p>&nbsp;@str_sql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar(1000) = '*',&nbsp;&nbsp;&nbsp;&nbsp; -- 执行的SQL 不含Order by 内容 &nbsp;<br />
&nbsp;@str_orderfield&nbsp;&nbsp;&nbsp; varchar(255)='''',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 排序的字段名&nbsp;<br />
&nbsp;@page_size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int = 10,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;-- 页大小&nbsp;<br />
&nbsp;@page_index&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int = 0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 页码<br />
&nbsp;@order_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; -- 设置排序类型, 非 -1 值则降序&nbsp;<br />
&nbsp;@total_count&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp; output&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 返回记录总数, 非 0 值则返回&nbsp;<br />
as</p>
<p>---------------------<br />
-- 获取指定页的数据--<br />
---------------------</p>
<p>declare @strsql&nbsp;&nbsp; varchar(5000)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 主语句<br />
declare @strtmp&nbsp;&nbsp; varchar(5000)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 临时变量<br />
declare @strorder varchar(400)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 排序字串<br />
declare @cruRow&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; -- 当前行号<br />
&nbsp;</p>
<p>--执行总数统计<br />
exec getRowCount @str_sql,@total_count output</p>
<p>set @strtmp =&nbsp; ' select * from ' + <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (select top ' + convert(varchar(10),@page_size) + ' * from ' +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (select top ' + convert(varchar(10),(@page_index + 1) * @page_size)&nbsp; +' * from '+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- N+1页<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ('+ @str_sql +') Src '</p>
<p>--排序方向<br />
if @order_type !=0<br />
&nbsp;begin<br />
&nbsp;set @strsql= @strtmp +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; order by @str_orderfield asc) a ' +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; order by&nbsp;@str_orderfield desc)b' +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' order by @str_orderfield asc'<br />
&nbsp;end<br />
else<br />
&nbsp;begin<br />
&nbsp;set @strsql= @strtmp +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; order by @str_orderfield desc) a ' +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; order by&nbsp; @str_orderfieldasc)b' +<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' order by&nbsp; @str_orderfield desc'<br />
&nbsp;end</p>
<p>exec (@strsql)<br />
<br />
GO</p>
<p>----------------------------------------------------------------------------</p>
<p>2.分页存储过程执行中用到的行数统计</p>
<p>create&nbsp; procedure getRowCount<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @sql&nbsp;&nbsp;&nbsp; nvarchar(2000),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @count&nbsp; int output<br />
as<br />
begin</p>
<p>--------------------<br />
-- 获取数据总行数 --<br />
--------------------</p>
<p>&nbsp; declare @tmpsql nvarchar(2000)<br />
&nbsp; set @tmpsql='select @count=count(*)&nbsp; from ('+ @sql +') a'</p>
<p>&nbsp; execute sp_executesql @tmpsql,N'@count int output',@count output<br />
&nbsp; <br />
end</p>
<p>GO</p>
<img src ="http://www.blogjava.net/human2008/aggbug/174353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/human2008/" target="_blank">灵!</a> 2008-01-10 17:08 <a href="http://www.blogjava.net/human2008/archive/2008/01/10/174353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>