﻿<?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/xiachang88/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 04:32:21 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 04:32:21 GMT</pubDate><ttl>60</ttl><item><title>WID由下至上的开发模型</title><link>http://www.blogjava.net/xiachang88/archive/2010/06/06/322880.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Sun, 06 Jun 2010 04:42:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2010/06/06/322880.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/322880.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2010/06/06/322880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/322880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/322880.html</trackback:ping><description><![CDATA[这种开发流程相对来说更为简单。首先从单个的子系统入手，通过分析该业务流程的数据结构，接口类型，以及需要使用到的组件类型，逐个对这些对象进行设计和实现。最终把他们拖拽到组装图编辑器中连接起来，形成一个完成的子业务流程。然后把其他的子系统的Import文件导入到组装图编辑器中，通过该Import来体现了该子系统和其他的系统之间的交互。通过这种方式得到的每一个子系统就是一个独立的可部署运行的实体。
<img src ="http://www.blogjava.net/xiachang88/aggbug/322880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2010-06-06 12:42 <a href="http://www.blogjava.net/xiachang88/archive/2010/06/06/322880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM JDK JRE </title><link>http://www.blogjava.net/xiachang88/archive/2009/12/16/306096.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Wed, 16 Dec 2009 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/12/16/306096.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/306096.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/12/16/306096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/306096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/306096.html</trackback:ping><description><![CDATA[jdk 把.java文件编译成为.class字节码文件<br />
然后JRE调用JVM将字节码文件翻译成可供机器执行的程序。<br />
(jvm 是java虚拟机，将java的class字节码文件翻译成二进制可执行程序。)
<img src ="http://www.blogjava.net/xiachang88/aggbug/306096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-12-16 09:28 <a href="http://www.blogjava.net/xiachang88/archive/2009/12/16/306096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype.js</title><link>http://www.blogjava.net/xiachang88/archive/2009/12/14/305929.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Mon, 14 Dec 2009 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/12/14/305929.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/305929.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/12/14/305929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/305929.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/305929.html</trackback:ping><description><![CDATA[<div class="ns_content">
<p><a href="http://prototype.conio.net/">prototype.js</a>是一个很强大的Javascript函数库,它可以让你很轻松的使用一些特效,实现AJAX的功能.虽然prototype.js是为了Ruby On Rails开发的,它的纯Javascript的性质也使得它很容易用在其他的网络程序中.可惜的是,Prototype.js还没有强大的文档解释,尽管它的代码非常有条理,但是也给初学者造成了一定的麻烦.作者在README里说:</p>
<p><em>Prototype is embarrassingly lacking in documentation. (The source code should be fairly easy to comprehend; I&#8217;m committed to using a clean style with meaningful identifiers. But I know that only goes so far.) </em></p>
<pre>基本用法:以Element Class为例,prototype给每个主要的分类都分成了一个Class,使用起来很方便,要产生特定的效果的话只要用new Class.function(&lt;argument&gt;)就可以了.比如:</pre>
<pre>&lt;DIV id="div1"&gt;&lt;a href="#" onclick="new Element.toggle(''div2'')"&gt;Click Me&lt;/a&gt;&lt;/DIV&gt;<br />
&lt;DIV id="div2"&gt;Hello!&lt;/DIV&gt;</pre>
<p>当点击Click Me的时候,div2就会交替隐藏或显示.注意,你可以给toggle加上无限个parameter,比如Element.toggle(''div2'',''div3'',''div4'')...</p>
<p>下面是每个重要的类和函数的解释:</p>
<p>&nbsp;</p>
<table border="1" cellspacing="0" cellpadding="0" width="943" height="1194">
    <caption>prototype 1.2.0 的函数简介 </caption>
    <tbody>
        <tr>
            <td width="208">函数名</td>
            <td width="385">解释</td>
            <td width="340">举例</td>
        </tr>
        <tr>
            <td>Element.toggle</td>
            <td>交替隐藏或显示</td>
            <td>"Element.toggle(''div1'',''div2'')</td>
        </tr>
        <tr>
            <td>Element.hide</td>
            <td>隐藏</td>
            <td>"Element.hide(''div1'',''div2'')</td>
        </tr>
        <tr>
            <td>Element.show</td>
            <td>显示</td>
            <td>"Element.show(''div1'',''div2'')</td>
        </tr>
        <tr>
            <td>Element.remove</td>
            <td>删除</td>
            <td>"Element.remove(''div1'',''div2'')</td>
        </tr>
        <tr>
            <td>Element.getHeight</td>
            <td>取得高度</td>
            <td>"Element.getHeight(''div1'')</td>
        </tr>
        <tr>
            <td>Toggle.display</td>
            <td>和Element.toggle相同</td>
            <td>"Toggle.display(''div1'',''div2'')</td>
        </tr>
        <tr>
            <td>Insertion.Before</td>
            <td>在DIV前插入文字</td>
            <td>"Insertion.Before(''div1'',''my content'')</td>
        </tr>
        <tr>
            <td>Insertion.After</td>
            <td>在DIV后插入文字</td>
            <td>"Insertion.After(''div1'',''my content'')</td>
        </tr>
        <tr>
            <td>Insertion.Top</td>
            <td>在DIV里最前插入文字</td>
            <td>"Insertion.Top(''div1'',''this is a text'')</td>
        </tr>
        <tr>
            <td>Insertion.Bottom</td>
            <td>在DIV里最后插入文字</td>
            <td>"Insertion.Bottom(''div1'',''this is a text'')</td>
        </tr>
        <tr>
            <td>PeriodicalExecuter</td>
            <td>以给定频率调用一段JavaScript</td>
            <td>"PeridicalExecutor(test, 1)"这里test是Javascript的函数,1是频率(1秒).</td>
        </tr>
        <tr>
            <td>$</td>
            <td>取得一个DIV, 相当于getElementById()</td>
            <td>$(''div1'')</td>
        </tr>
        <tr>
            <td>Field.clear</td>
            <td>清空一个输入框</td>
            <td>"Field.clear(''textfield1'')</td>
        </tr>
        <tr>
            <td>Field.focus</td>
            <td>把 焦点集中在输入框上</td>
            <td>"Field.focus(''select1'')</td>
        </tr>
        <tr>
            <td>Field.present</td>
            <td>判断内容是否为空</td>
            <td>"alert(Field.present(''textfield1''))"</td>
        </tr>
        <tr>
            <td>Field.select</td>
            <td>选择输入框的内容</td>
            <td>"Field.select(''textfield1'')"</td>
        </tr>
        <tr>
            <td>Field.activate</td>
            <td>把 焦点集中在输入框上并选择输入框的内容</td>
            <td>"Field.activate(''textfield1'')"</td>
        </tr>
        <tr>
            <td>Form.serialize</td>
            <td>把表格内容转化成string</td>
            <td></td>
        </tr>
        <tr>
            <td>Form.getElements</td>
            <td>取得表格内容为数组形式</td>
            <td></td>
        </tr>
        <tr>
            <td>Form.disable</td>
            <td>disable表格所有内容</td>
            <td>Form.disable(''form1'') (这个好象不work)</td>
        </tr>
        <tr>
            <td>Form.focusFirstElement</td>
            <td>把焦点集中在表格第一个元素上</td>
            <td>Form.focusFirstElement(''form1'')</td>
        </tr>
        <tr>
            <td>Form.reset</td>
            <td>Reset表格</td>
            <td>Form.reset(''form1'')</td>
        </tr>
        <tr>
            <td>Form.Element.getValue</td>
            <td>取得表格输入框的值</td>
            <td>Form.Element.getValue(''text1'')</td>
        </tr>
        <tr>
            <td>Form.Element.serialize</td>
            <td>&nbsp;&nbsp; 把表格中输入框内容转化成string</td>
            <td>Form.Element.serialize(''text1'')</td>
        </tr>
        <tr>
            <td>$F</td>
            <td>等同于Form.Element.getValue()</td>
            <td>$F(''text1'')</td>
        </tr>
        <tr>
            <td>Effect.Highlight</td>
            <td>高亮特效.</td>
            <td>Effect.Highlight(''text1'')</td>
        </tr>
        <tr>
            <td>Effect.Fade</td>
            <td>褪色特效</td>
            <td></td>
        </tr>
        <tr>
            <td>Effect.Scale</td>
            <td>放大缩小(百分比）</td>
            <td>
            <p>Effect.Scale(''text1'', 200)<br />
            这里200 = 200%, 即两倍</p>
            </td>
        </tr>
        <tr>
            <td>Effect.Squish</td>
            <td>消失特效．文字缩小后消失</td>
            <td>Effect.Squish(''text1'')</td>
        </tr>
        <tr>
            <td>Effect.Puff</td>
            <td>消失特效．文字放大后消失</td>
            <td>Effect.Puff(''text1'')</td>
        </tr>
        <tr>
            <td>Effect.Appear</td>
            <td>出现特效</td>
            <td></td>
        </tr>
        <tr>
            <td>Effect.ContentZoom</td>
            <td>ZOOM特效．</td>
            <td></td>
        </tr>
        <tr>
            <td>Ajax.Request</td>
            <td>传送Ajax请求给服务器</td>
            <td>Ajax.Request(''http://server/s.php'')</td>
        </tr>
        <tr>
            <td>Ajax.Updater</td>
            <td>传送Ajax请求给服务器并用答复的结果更新指定的Container</td>
            <td>Ajax.Updater(''text1'',''http://server/s.php'')</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Ajax的函数实际上还有一个可选参数,就是options.在未指明的情况下,Ajax使用的是''POST''发送请求,而且是异步执行,如果想要改用''GET''和同步,就可以用Ajax.Request(''http://server/s.php'',''get'','''',''a=1&amp;b=2'')来执行.</p>
<p>在Rails中Ajax的函数被封装成Ruby的函数,所以不必直接采用Ajax.Request,Ajax.Updater.但是知道它是怎么工作的也很有用.</p>
</div>
<img src ="http://www.blogjava.net/xiachang88/aggbug/305929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-12-14 17:23 <a href="http://www.blogjava.net/xiachang88/archive/2009/12/14/305929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DIV+CSS布局中自适应高度和宽度 </title><link>http://www.blogjava.net/xiachang88/archive/2009/12/14/305922.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Mon, 14 Dec 2009 09:14:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/12/14/305922.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/305922.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/12/14/305922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/305922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/305922.html</trackback:ping><description><![CDATA[<span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;HTML&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;HTML&nbsp;4.01&nbsp;Transitional//EN"<br />
"http://www.w3.org/TR/html4/loose.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">meta&nbsp;</span><span style="color: #ff0000">http-equiv</span><span style="color: #0000ff">="Content-Type"</span><span style="color: #ff0000">&nbsp;content</span><span style="color: #0000ff">="text/html;&nbsp;charset=utf-8"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">New&nbsp;Web&nbsp;Project</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">link&nbsp;</span><span style="color: #ff0000">rel</span><span style="color: #0000ff">="stylesheet"</span><span style="color: #ff0000">&nbsp;type</span><span style="color: #0000ff">="text/css"</span><span style="color: #ff0000">&nbsp;href</span><span style="color: #0000ff">="index.css"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">div&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="container"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">div&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="header"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">div&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="middleBody"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">div&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="sider"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="column"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">心梦帆影</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">心梦帆影</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">div&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="content"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="column"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://www.blogjava.net/rongxh7</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://www.blogjava.net/rongxh7</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://www.blogjava.net/rongxh7</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://www.blogjava.net/rongxh7</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://www.blogjava.net/rongxh7</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://www.blogjava.net/rongxh7</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://www.blogjava.net/rongxh7</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://www.blogjava.net/rongxh7</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://www.blogjava.net/rongxh7</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">http://www.blogjava.net/rongxh7</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">p</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">div&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="footer"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">div</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span>
<p><br />
</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #800000">body&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;margin-top</span><span style="color: #000000">:</span><span style="color: #0000ff">0px</span><span style="color: #000000">;</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;去除网页上边空白&nbsp;</span><span style="color: #008000">*/</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;大容器，包含下面所有层&nbsp;</span><span style="color: #008000">*/</span><span style="color: #800000"><br />
#container&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="color: #000000">:</span><span style="color: #0000ff">800px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;margin</span><span style="color: #000000">:</span><span style="color: #0000ff">0px&nbsp;auto</span><span style="color: #000000">;</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;居中&nbsp;</span><span style="color: #008000">*/</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;头部&nbsp;</span><span style="color: #008000">*/</span><span style="color: #800000"><br />
#header&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="color: #000000">:</span><span style="color: #0000ff">100%</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;height</span><span style="color: #000000">:</span><span style="color: #0000ff">100px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;background</span><span style="color: #000000">:</span><span style="color: #0000ff">#FFE1FF</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;中部，包括左边区(sider)和右边内容区(content)&nbsp;</span><span style="color: #008000">*/</span><span style="color: #800000"><br />
#middleBody&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="color: #000000">:</span><span style="color: #0000ff">100%</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;overflow</span><span style="color: #000000">:</span><span style="color: #0000ff">hidden</span><span style="color: #000000">;</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;隐藏超出的部分&nbsp;</span><span style="color: #008000">*/</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;左边&nbsp;</span><span style="color: #008000">*/</span><span style="color: #800000"><br />
#sider&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="color: #000000">:</span><span style="color: #0000ff">200px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;float</span><span style="color: #000000">:</span><span style="color: #0000ff">left</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;background</span><span style="color: #000000">:</span><span style="color: #0000ff">#FFE4E1</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;右边主内容区&nbsp;</span><span style="color: #008000">*/</span><span style="color: #800000"><br />
#content&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;此两行是#content自适应宽度的关键，旨在与右边界对齐，且不被挤到下面去&nbsp;</span><span style="color: #008000">*/</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;padding-right</span><span style="color: #000000">:</span><span style="color: #0000ff">10000px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;margin-right</span><span style="color: #000000">:</span><span style="color: #0000ff">-10000px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;float</span><span style="color: #000000">:</span><span style="color: #0000ff">left</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;background</span><span style="color: #000000">:</span><span style="color: #0000ff">#FFFAF0</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;#sider和#content共同属性，此为自适应高度的关键，旨在#sider和#content下边界对齐，且不会露白</span><span style="color: #008000">*/</span><span style="color: #800000"><br />
.column&nbsp;</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;padding-bottom</span><span style="color: #000000">:</span><span style="color: #0000ff">20000px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;margin-bottom</span><span style="color: #000000">:</span><span style="color: #0000ff">-20000px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;底部&nbsp;</span><span style="color: #008000">*/</span><span style="color: #800000"><br />
#footer</span><span style="color: #000000">{</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;clear</span><span style="color: #000000">:</span><span style="color: #0000ff">left</span><span style="color: #000000">;</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;防止float:left对footer的影响&nbsp;</span><span style="color: #008000">*/</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;width</span><span style="color: #000000">:</span><span style="color: #0000ff">100%</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;height</span><span style="color: #000000">:</span><span style="color: #0000ff">80px</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;background</span><span style="color: #000000">:</span><span style="color: #0000ff">#FFE4B5</span><span style="color: #000000">;</span><span style="color: #ff0000"><br />
</span><span style="color: #000000">}</span><span style="color: #800000"><br />
<br />
</span></div>
<p>运行截图如下：</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/rongxh7/WindowsLiveWriter/DIVCSS_112A/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://www.blogjava.net/images/blogjava_net/rongxh7/WindowsLiveWriter/DIVCSS_112A/image_thumb.png" width="641" height="472" /></a></p>
<br />
column 可以不用<br />
middleBody 和sider 使用同样的背景颜色<br />
sider和content分别使用20%和80%的宽度属性，基本可以达到同样的效果
<img src ="http://www.blogjava.net/xiachang88/aggbug/305922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-12-14 17:14 <a href="http://www.blogjava.net/xiachang88/archive/2009/12/14/305922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle数据库导入导出</title><link>http://www.blogjava.net/xiachang88/archive/2009/11/16/302544.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Mon, 16 Nov 2009 05:07:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/11/16/302544.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/302544.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/11/16/302544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/302544.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/302544.html</trackback:ping><description><![CDATA[1 将数据库TEST完全导出,用户名system 密码manager 导出到D:daochu.dmp中<br />
&nbsp;&nbsp; exp system/manager@TEST file=d:daochu.dmp full=y<br />
<br />
2 将数据库中system用户与sys用户的表导出<br />
&nbsp;&nbsp;<span style="color: red">&nbsp;exp system/manager@TEST file=d:daochu.dmp owner=(system,sys)</span><br />
语法是：exp&nbsp;登入数据库名/登入数据库密码@服务名&nbsp;file=文件存放路径&nbsp;owner=导出用户名下的所有表结构和数据&nbsp;&nbsp;<br />
<br />
1 将D:daochu.dmp 中的数据导入 TEST数据库中。<br />
&nbsp;&nbsp; imp system/manager@TEST&nbsp; file=d:daochu.dmp<br />
// imp <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#116;&#101;&#109;&#47;&#109;&#97;&#110;&#97;&#103;&#101;&#114;&#64;&#84;&#69;&#83;&#84;">system/manager@TEST</a>&nbsp;&nbsp;full=y file=d:daochu.dmp ignore=y <br />
// imp help=y<br />
<span><span style="color: red">imp&nbsp;system/manager@TEST file=d:daoru.dmp <span class="hilite2">fromuser</span>=&#8217;kk&#8217;&nbsp;touser=&#8217;testkk&#8217;//</span></span><br />
语法是imp&nbsp;登入数据库名/登入数据库密码@服务名&nbsp;file=需要导入的文件&nbsp;<span class="hilite2">fromuser</span>=需要导入的那个文件是属于哪个用户的&nbsp;touser=要导入的用户名&nbsp;&nbsp; <br />
<span><span style="color: red">imp&nbsp;<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#121;&#115;&#116;&#101;&#109;&#47;&#109;&#97;&#110;&#97;&#103;&#101;&#114;&#64;&#84;&#69;&#83;&#84;">system/manager@TEST</a> <span class="keyword">full</span><span>=y</span> file=d:daoru.dmp <span class="hilite2">fromuser</span>=&#8217;kk&#8217;&nbsp;touser=&#8217;testkk&#8217; <span class="keyword">ignore</span><span>=y&nbsp;</span></span></span>
<img src ="http://www.blogjava.net/xiachang88/aggbug/302544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-11-16 13:07 <a href="http://www.blogjava.net/xiachang88/archive/2009/11/16/302544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tag</title><link>http://www.blogjava.net/xiachang88/articles/301048.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Wed, 04 Nov 2009 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/301048.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/301048.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/301048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/301048.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/301048.html</trackback:ping><description><![CDATA[如果 JSP 容器在转换时遇到了自定义标签，那么它就检查 标签库描述符（tag library descriptor） （TLD） 文件以查询相应的标签处理程序
<img src ="http://www.blogjava.net/xiachang88/aggbug/301048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-11-04 14:10 <a href="http://www.blogjava.net/xiachang88/articles/301048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用自定义标签实现JSP页面和代码的分离 - Q.yuhen</title><link>http://www.blogjava.net/xiachang88/articles/301041.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Wed, 04 Nov 2009 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/301041.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/301041.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/301041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/301041.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/301041.html</trackback:ping><description><![CDATA[在上篇<a title="article.asp?id=240" href="http://blog.163.com/public/article.asp?id=240" target="_blank">使用JavaBean实现JSP页面和代码分离</a>中，我们使用JavaBean来达到分离的目的至于本文要使用的自定义标签并不新鲜，此处我也不过是照本宣科地走一遭罢了只是某些细节处，还应当多注意些<br />
<br />
Test.jsp
<div>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;html&gt;<br />
&nbsp;&nbsp;&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;My JSP 'Test.jsp' starting page&lt;/title&gt;<br />
&nbsp;&nbsp;&lt;/head&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;This is my JSP page. &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Date : &lt;%= new java.util.Date().toString() %&gt; &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;File : &lt;input value="&lt;%= request.getServletPath() %&gt;" /&gt; <br />
&nbsp;&nbsp;&lt;/body&gt;<br />
&lt;/html&gt;</div>
<br />
为了将这个这个Test.jsp改成自定义标签方法，我们分别使用简单标签和内容标签两种不同的方式实现<br />
<br />
<strong>1. 简单标签</strong><br />
<br />
由于我们需要输出两个内容(日期和文件名)，因此我们为标签创建一个参数具体代码：<br />
<br />
DemoTag.java
<div>package com.mycompany;<br />
<br />
import java.util.Date;<br />
<br />
import javax.servlet.http.*;<br />
import javax.servlet.jsp.*;<br />
import javax.servlet.jsp.tagext.*;<br />
<br />
public class DemoTag extends TagSupport {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;public int doStartTag() throws JspException {&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JspWriter out = pageContext.getOut();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (parameter.compareToIgnoreCase("filename") == 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.print(request.getServletPath());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.print(new Date());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;} catch (java.io.IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new JspTagException(e.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return SKIP_BODY;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;private String parameter = "date";<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;public void setParameter(String parameter) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.parameter = parameter;<br />
&nbsp;&nbsp;} <br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;public String getParameter() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return parameter;<br />
&nbsp;&nbsp;}<br />
}</div>
<br />
接下来，我们创建标签文件 MyTagLib.tld标签文件其实只是一个XML格式的说明文件，内容也很简单<br />
<br />
MyTagLib.tld
<div>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />
&lt;taglib&gt;<br />
&lt;tlib-version&gt;1.0&lt;/tlib-version&gt;<br />
&lt;jsp-version&gt;1.2&lt;/jsp-version&gt;<br />
<br />
&lt;tag&gt;<br />
&nbsp;&nbsp;&lt;name&gt;demo&lt;/name&gt;<br />
&nbsp;&nbsp;&lt;tag-class&gt;com.mycompany.DemoTag&lt;/tag-class&gt;<br />
&nbsp;&nbsp;&lt;body-content&gt;empty&lt;/body-content&gt;<br />
&nbsp;&nbsp;&lt;attribute&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;parameter&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;required&gt;false&lt;/required&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;<br />
&nbsp;&nbsp;&lt;/attribute&gt;<br />
&lt;/tag&gt;<br />
<br />
&lt;/taglib&gt;</div>
<br />
在这个标签文件中，我们将我们创建的标签取名 demo，并声明了类型和参数(parameter)将该文件保存在 /WEB-INF 下面<br />
当然，我们还需要将我们自定义的标签添加到 web.xml 中，否则还是无法使用<br />
<br />
web.xml
<div>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;<br />
<br />
&nbsp;&nbsp;&lt;jsp-config&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib-uri&gt;/WEB-INF/MyTagLib&lt;/taglib-uri&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;taglib-location&gt;/WEB-INF/MyTagLib.tld&lt;/taglib-location&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/taglib&gt;<br />
&nbsp;&nbsp;&lt;/jsp-config&gt;<br />
<br />
&lt;/web-app&gt;</div>
<br />
你可能在别处看到过类似的声明，只是没有外面的 jsp-config，但是我们使用的是DTD 2.4，如果不加，Eclipse 会提示出错<br />
<br />
到此为止，我们的自定义标签算是创建完毕接下来，我们可以开始改写那个JSP文件来分离代码了<br />
<br />
Test.jsp
<div>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;%@taglib uri="/WEB-INF/MyTagLib" prefix="mytag"%&gt;<br />
&lt;html&gt;<br />
&nbsp;&nbsp;&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;My JSP 'Test.jsp' starting page&lt;/title&gt;<br />
&nbsp;&nbsp;&lt;/head&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;This is my JSP page. &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Date : &lt;mytag:demo parameter="date" /&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;File : &lt;mytag:demo parameter="filename" /&gt;<br />
&nbsp;&nbsp;&lt;/body&gt;<br />
&lt;/html&gt;</div>
<br />
上面这些想必你已经很熟悉，我就不做多说了<br />
<br />
<strong>2. 内容标签</strong><br />
<br />
创建过程和上面大抵相同，只是程序文件和配置内容有些差异<br />
<br />
DemoTag2.java
<div>package com.mycompany;<br />
<br />
import java.io.IOException;<br />
import java.util.Date;<br />
<br />
import javax.servlet.http.*;<br />
import javax.servlet.jsp.*;<br />
import javax.servlet.jsp.tagext.*;<br />
<br />
public class DemoTag2 extends BodyTagSupport {<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;public int doStartTag() throws JspTagException {&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return EVAL_BODY_BUFFERED;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;public int doEndTag() throws JspTagException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;String body = this.getBodyContent().getString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;body = body.replace("$date", new Date().toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;body = body.replace("$filename", request.getServletPath());<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pageContext.getOut().print(body);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new JspTagException(e.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return SKIP_BODY;<br />
&nbsp;&nbsp;}<br />
}</div>
<br />
我们将新的标签 DemoTag2 加入到上面的标签文件中<br />
<br />
MyTagLib.tld
<div>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;<br />
&lt;taglib&gt;<br />
&lt;tlib-version&gt;1.0&lt;/tlib-version&gt;<br />
&lt;jsp-version&gt;1.2&lt;/jsp-version&gt;<br />
<br />
&lt;tag&gt;<br />
&nbsp;&nbsp;&lt;name&gt;demo&lt;/name&gt;<br />
&nbsp;&nbsp;&lt;tag-class&gt;com.mycompany.DemoTag&lt;/tag-class&gt;<br />
&nbsp;&nbsp;&lt;body-content&gt;empty&lt;/body-content&gt;<br />
&nbsp;&nbsp;&lt;attribute&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;parameter&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;required&gt;false&lt;/required&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;<br />
&nbsp;&nbsp;&lt;/attribute&gt;<br />
&lt;/tag&gt;<br />
<br />
&lt;tag&gt;<br />
&nbsp;&nbsp;&lt;name&gt;demo2&lt;/name&gt;<br />
&nbsp;&nbsp;&lt;tag-class&gt;com.mycompany.DemoTag2&lt;/tag-class&gt;<br />
&nbsp;&nbsp;&lt;body-content&gt;jsp&lt;/body-content&gt;<br />
&lt;/tag&gt;<br />
<br />
&lt;/taglib&gt;</div>
<br />
web.xml 文件无需修改<br />
<br />
看看同时使用两种标签的Test.jsp效果<br />
<br />
Test.jsp
<div>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;%@taglib uri="/WEB-INF/MyTagLib" prefix="mytag"%&gt;<br />
&lt;html&gt;<br />
&nbsp;&nbsp;&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;title&gt;My JSP 'Test.jsp' starting page&lt;/title&gt;<br />
&nbsp;&nbsp;&lt;/head&gt;<br />
&nbsp;<br />
&nbsp;&nbsp;&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;This is my JSP page. &lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Date : &lt;mytag:demo parameter="date" /&gt;&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;File : &lt;mytag:demo parameter="filename" /&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;hr&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;mytag:demo2&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Date: $date&lt;br&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;File: $filename<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mytag:demo2&gt;<br />
&nbsp;&nbsp;&lt;/body&gt;<br />
&lt;/html&gt;</div>
<br />
至此，两种标签方式都完成<br />
本文并没有就相关技术细节做出说明，建议您看看Sun有关JSP自定义标签的官方文档<br />
<br />
无论是用自定义标签，还是使用JavaBean，都没有太大的区别，各人或者团队可以根据自己的习惯使用如果需要在独立类库中封装一些供页面使用的单元，自定义标签应该更适合些不过现在的IDE环境(MyEclipse)在编写自定义标签的时候可能有些不太舒服的情况，界面开发人员使用JavaBean方式可能更方便些，免得莫名其妙的提示干扰您的工作<br />
<img src ="http://www.blogjava.net/xiachang88/aggbug/301041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-11-04 13:53 <a href="http://www.blogjava.net/xiachang88/articles/301041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sports</title><link>http://www.blogjava.net/xiachang88/archive/2009/10/29/300164.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Thu, 29 Oct 2009 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/10/29/300164.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/300164.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/10/29/300164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/300164.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/300164.html</trackback:ping><description><![CDATA[<p><img alt="" src="http://www.blogjava.net/images/blogjava_net/xiachang88/sport.jpg" border="0" /></p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/300164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-29 13:14 <a href="http://www.blogjava.net/xiachang88/archive/2009/10/29/300164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript:alert(parent.work.MAINFORM.FEE_NUMBER.value);</title><link>http://www.blogjava.net/xiachang88/archive/2009/10/22/299342.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Thu, 22 Oct 2009 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/10/22/299342.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/299342.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/10/22/299342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/299342.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/299342.html</trackback:ping><description><![CDATA[javascript:alert(parent.work.MAINFORM.FEE_NUMBER.value);
<img src ="http://www.blogjava.net/xiachang88/aggbug/299342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-22 13:36 <a href="http://www.blogjava.net/xiachang88/archive/2009/10/22/299342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javascript--innerHTML用法 </title><link>http://www.blogjava.net/xiachang88/articles/299211.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Wed, 21 Oct 2009 07:51:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/299211.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/299211.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/299211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/299211.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/299211.html</trackback:ping><description><![CDATA[1、write() 方法可向文档写入 HTML 表达式或 JavaScript 代码。 <br />
innerHTML是对象的属性，可用于读取、写入对象的内容。 <br />
这里是因为需将内容写在&lt;span&gt;&lt;/span&gt;标签体内 <br />
2、一般用法： <br />
（1）document.write("HTML 表达式或 JavaScript 代码") <br />
（2）写入内容：对象名称.innerHTML="内容" <br />
读取内容：变量=对象名称.innerHTML <br />
3、innerHTML是对象的属性。 <br />
<br />
<img src ="http://www.blogjava.net/xiachang88/aggbug/299211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-21 15:51 <a href="http://www.blogjava.net/xiachang88/articles/299211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>js清除select的值</title><link>http://www.blogjava.net/xiachang88/articles/299068.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 20 Oct 2009 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/299068.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/299068.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/299068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/299068.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/299068.html</trackback:ping><description><![CDATA[<p>&lt;select id=a1&gt;<br />
&lt;option&gt;1<br />
&lt;option&gt;2<br />
&lt;option&gt;3<br />
&lt;/select&gt;<br />
&lt;script&gt;<br />
a1.options[2].removeNode(true); //删除第三个，如果删除第二个，就用options[1]<br />
&lt;/script&gt;//删除某下拉框中的某一项</p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/299068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-20 16:58 <a href="http://www.blogjava.net/xiachang88/articles/299068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个不错的sql站点</title><link>http://www.blogjava.net/xiachang88/articles/299057.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 20 Oct 2009 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/299057.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/299057.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/299057.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/299057.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/299057.html</trackback:ping><description><![CDATA[http://www.jb51.net/w3school/sql/
<img src ="http://www.blogjava.net/xiachang88/aggbug/299057.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-20 16:21 <a href="http://www.blogjava.net/xiachang88/articles/299057.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>会计上借贷</title><link>http://www.blogjava.net/xiachang88/archive/2009/10/13/298039.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 13 Oct 2009 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/10/13/298039.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/298039.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/10/13/298039.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/298039.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/298039.html</trackback:ping><description><![CDATA[1、借和贷：是借贷记帐法中的记帐符号。
<p>2、从借贷记帐法的帐户结构看 <br />
借贷帐户的基本结构是：左方为借方，右方为贷方，但哪一方登记增加，哪一方登记减少，则要根据帐户反映的经济内容决定。可以分为四类： <br />
(1)资产类帐户：增加额记借方，减少额记贷方，期末如有余额在借方。 <br />
(2)权益(负债及所有者权益)类帐户：增加额记贷方，减少额记借方，期末如有余额在贷方。 <br />
(3)成本费用类帐户：增加额记借方，减少或转销额记贷方，费用结转后一般无余额，如有余额在借方。 <br />
(4)收入、利润类帐户：增加额记贷方，减少或转销额记借方，收入、利润结转后期末应无余额。
<p>3、从借贷记帐法的记帐规则看 <br />
借贷记帐法的记帐规则是&#8220;有借必有贷，借贷必相等&#8221;。
<p>4、从借贷记帐法的试算平衡看 <br />
根据这一原理和记帐规则的要求，每一笔经济业务的会计分录都是借贷相等，因而当全部经济都记入帐户后，所有帐户的本期借方发生额合计与本期贷方发生额合计，必定相等；所有帐户的期末借方余额合计与期末贷方合计也必定相等。</p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/298039.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-13 11:29 <a href="http://www.blogjava.net/xiachang88/archive/2009/10/13/298039.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vi编辑器使用  命令</title><link>http://www.blogjava.net/xiachang88/articles/297715.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Sat, 10 Oct 2009 09:33:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/297715.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/297715.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/297715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/297715.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/297715.html</trackback:ping><description><![CDATA[<strong>关键字: linux vi</strong>
<div class="blog_content">一、Unix编辑器概述 <br />
<br />
编辑器是使用计算机的重要工具之一，在各种操作系统中，编辑器都是必不可少的部件。Unix及其相似的ix操作系统系列中，为方便各种用户在各个不同的环境中使用，提供了一系列的ex编辑器，包括 ex, edit,ed 和vi.其中ex,edit,ed都是行编辑器，现在已很少有人使用，Unix提供他们的原因是考虑到满足各种用户特别是某些终端用户的需要。 <br />
<br />
值得庆幸的是，Unix提供了全屏幕的Vi编辑器，这使我们的工作轻松不少。不少DOS用户抱怨Vi编辑器不象DOS下的编辑器如edit那么好用，这是因为Vi考虑到各种用户的需要，没有使用某些通用的编辑键（在各个不同的终端机上他们的定义是不同的，在某些终端机上甚至没有这些键）。而是采用状态切换的方法，但这只是习惯的问题，一旦你熟练的使用上了vi你就会觉得它其实也很好用。虽然 Vi采用了状态切换的方法，但电脑的硬件及操作系统多种多样，某些电脑的键盘上没有特定的几个功能键！那麽不就有某些功能不能用了？这个问题在 Unix 系统上也一样，几乎各大电脑厂商都有自己的Unix 系统，而 vi 的操作方法也会随之有点出入。这里我们采用 PC 的键盘来说明 vi 的操作，但在具体的环境中还要参考相应的资料，这一点是值得注意的。 <br />
<br />
二、Vi入门 <br />
<br />
（一）、进入vi <br />
<br />
在系统提示字符(如$、#)下敲入vi ＜档案名称＞，vi 可以自动帮你载入所要编辑的文件或是开启一个新文件（如果该文件不存在或缺少文件名）。进入 vi 后萤幕左方会出现波浪符号，凡是列首有该符号就代表此列目前是空的。 <br />
<br />
(二）、两种模式 <br />
<br />
如上所述，vi存在两种模式：指令模式和输入模式。在指令模式下输入的按键将做为指令来处理：如输入a，vi即认为是在当前位置插入字符。而在输入模式下，vi则把输入的按键当作插入的字符来处理。指令模式切换到输入模式只需键入相应的输入命令即可（如a,A），而要从输入模式切换到指令模式，则需在输入模式下键入ESC键，如果不晓得现在是处於什麽模式，可以多按几次 [ESC]，系统如发出哔哔声就表示已处于指令模式下了。 <br />
<br />
付：有指令模式进入输入模式的指令： <br />
<br />
新增 (append) <br />
<br />
a ：从光标所在位置後面开始新增资料，光标後的资料随新增资料向後移动。 <br />
<br />
A： 从光标所在列最後面的地方开始新增资料。 <br />
<br />
插入 (insert) <br />
<br />
i： 从光标所在位置前面开始插入资料，光标後的资料随新增资料向後移动。 <br />
<br />
I ：从光标所在列的第一个非空白字元前面开始插入资料。 <br />
<br />
开始 (open) <br />
<br />
o ：在光标所在列下新增一列并进入输入模式。 <br />
<br />
O: 在光标所在列上方新增一列并进入输入模式。 <br />
<br />
（三）、退出vi <br />
<br />
在指令模式下键入:q,:q!,:wq或:x(注意:号），就会退出vi。其中:wq和:x是存盘退出，而:q是直接退出，如果文件已有新的变化，vi会提示你保存文件而:q命令也会失效，这时你可以用:w命令保存文件后再用:q退出，或用:wq或:x命令退出，如果你不想保存改变后的文件，你就需要用:q!命令，这个命令将不保存文件而直接退出vi。 <br />
<br />
（四）、基本编辑 <br />
<br />
配合一般键盘上的功能键，像是方向键、[Insert] 、[Delete] 等等，现在你应该已经可以利用 vi 来编辑文件了。当然 vi 还提供其他许许多多功能让文字的处理更为方便。 <br />
<br />
何谓编辑？一般认为是文字的新增、修改以及删除，甚至包括文字区块的搬移、复制等等。先这里介绍 vi的如何做删除与修改。（注意：在 vi 的原始观念里，输入跟编辑是两码子事。编辑是在指令模式下操作的，先利用指令移动光标来定位要进行编辑的地方，然後才下指令做编辑。） <br />
<br />
删除与修改文件的命令： <br />
<br />
x： 删除光标所在字符。 <br />
<br />
dd ：删除光标所在的列。 <br />
<br />
r ：修改光标所在字元，r 後接著要修正的字符。 <br />
<br />
R： 进入取替换状态，新增文字会覆盖原先文字，直到按 [ESC] 回到指令模式下为止。 <br />
<br />
s： 删除光标所在字元，并进入输入模式。 <br />
<br />
S： 删除光标所在的列，并进入输入模式。 <br />
<br />
其实呢，在PC上根本没有这麽麻烦！输入跟编辑都可以在输入模式下完成。例如要删除字元，直接按[Delete] 不就得了。而插入状态与取代状态可以直接用 [Insert] 切换，犯不著用什麽指令模式的编辑指令。不过就如前面所提到的，这些指令几乎是每台终端机都能用，而不是仅仅在 PC 上。 <br />
在指令模式下移动光标的基本指令是 h, j, k, l 。想来各位现在也应该能猜到只要直接用 PC 的方向键就可以了，而且无论在指令模式或输入模式下都可以。多容易不是。 <br />
当然 PC 键盘也有不足之处。有个很好用的指令 u 可以恢复被删除的文字，而 U 指令则可以恢复光标所在列的所有改变。这与某些电脑上的 [Undo] 按键功能相同。 <br />
三、附件：vi详细指令表 <br />
（一）、基本编辑指令： <br />
新增 (append) <br />
<br />
a ：从光标所在位置後面开始新增资料，光标後的资料随新增资料向後移动。 <br />
<br />
A： 从光标所在列最後面的地方开始新增资料。 <br />
<br />
插入 (insert) <br />
<br />
i： 从光标所在位置前面开始插入资料，光标後的资料随新增资料向後移动。 <br />
<br />
I ：从光标所在列的第一个非空白字元前面开始插入资料。 <br />
<br />
开始 (open) <br />
<br />
o ：在光标所在列下新增一列并进入输入模式。 <br />
<br />
O: 在光标所在列上方新增一列并进入输入模式。 <br />
<br />
x： 删除光标所在字符。 <br />
<br />
dd ：删除光标所在的列。 <br />
<br />
r ：修改光标所在字元，r 後接著要修正的字符。 <br />
<br />
R： 进入取替换状态，新增文字会覆盖原先文字，直到按 [ESC] 回到指令模式下为止。 <br />
<br />
s： 删除光标所在字元，并进入输入模式。 <br />
<br />
S： 删除光标所在的列，并进入输入模式。 <br />
<br />
（二）、光标移动指令： <br />
由於许多编辑工作是藉由光标来定位，所以 vi 提供许多移动光标的方式，这个我们列 <br />
几张简表来说明（这些当然是指令模式下的指令）： <br />
<br />
指令? ?说明 ?????? 功能键 <br />
0 移动到光标所在列的最前面 [Home]? <br />
$ ? 移动到光标所在列的最後面 [End] <br />
[CTRL][d] 向下半页 ? [PageDown] <br />
[CTRL][f] 向下一页 <br />
[CTRL][u] 向上半页? <br />
[CTRL][b] 向上一页 [PageUp] <br />
<br />
指令 说明 <br />
H 移动到视窗的第一列 <br />
M 移动到视窗的中间列 <br />
L 移动到视窗的最後列 <br />
b 移动到下个字的第一个字母 <br />
w 移缴细鲎值牡谝桓鲎帜?nbsp; ?? <br />
e 移动到下个字的最後一个字母 <br />
^ 移动到光标所在列的第一个非空白字元 <br />
<br />
指令 说明 ??? <br />
n- 减号移动到上一列的第一个非空白字元前面加上数字可以指定移动到以上 n 列 <br />
n+ 加号移动到下一列的第一个非空白字元前面加上数字可以指定移动到以下 n 列 <br />
nG 直接用数字 n 加上大写 G 移动到第 n 列 <br />
指令 说明 <br />
fx <br />
往右移动到 x 字元上 <br />
Fx 往左移动到 x 字元上 ? <br />
tx 往右移动到 x 字元前??? <br />
Tx 往左移动到 x 字元前 <br />
; 配合 f&amp;t 使用，重复一次?? <br />
,?? 配合 f&amp;t 使用，反方向重复一次 <br />
/string 往右移动到有 string 的地方 <br />
?string 往左移动到有 string 的地方 <br />
n ? 配合 /&amp;? 使用，重复一次 <br />
N ? 配合 /&amp;? 使用，反方向重复一次 <br />
<br />
指令 说明 ?备注 <br />
n( <br />
左括号移动到句子的最前面句子是以前面加上数字可以指定往前移动 n 个句子 ! . ? 三种符号来界定 <br />
n)? 右括号移动到下个句子的最前面前面加上数字可以指定往後移动 n 个句子 ! . ? 三种符号来界定 <br />
n{ ?? 左括弧移动到段落的最前面 段落是以段落间的空白列界定 <br />
n} 前面加上数字可以指定往前移动 n 个段落右括弧移动到下个段落的最前面前面加上数字可以指定往後移动 n 个段落 段落是以段落间的空白列界定 <br />
<br />
（三）、更多的编辑指令 <br />
这些编辑指令非常有弹性，基本上可以说是由指令与范围所构成。例如 dw 怯缮境噶?nbsp;d 与范围 w 所组成，代表删除一个字 d(elete) w(ord) 。 <br />
指令列表如下： <br />
d 删除(delete) <br />
y 复制(yank) <br />
p 放置(put) <br />
c 修改(change) <br />
范围可以是下列几个： <br />
e 光晁谖恢玫礁米值淖钺嵋桓鲎帜?br&gt; w 光标所在位置到下个字的第一个字母 <br />
b 光标所在位置到上个字的第一个字母 <br />
$ 光标所在位置到该列的最後一个字母 <br />
0 光标所在位置到该列的第一个字母 <br />
) 光标所在位置到下个句子的第一个字母 <br />
( 光标所在位置到该句子的第一个字母 <br />
} 光标所在位置到该段落的最後一个字母 <br />
{ 光标所在位置到该段落的第一个字母 <br />
说实在的，组合这些指令来编辑文件有一点点艺术气息。不管怎麽样，它们提供更多编辑文字的能力。值得注意的一点是删除与复制都会将指定范围的内容放到暂存区里，然後就可以用指令 p 贴到其它地方去，这是 vi 用来处理区段拷贝与搬移的办法。 <br />
某些 vi 版本，例如 Linux 所用的 elvis 可以大幅简化这一坨指令。如果稍微观察一下这些编辑指令就会发现问题其实是定范围的方式有点杂，实际上只有四个指令罢了。指令 v 非常好用，只要按下 v 键，光标所在的位置就会反白，然後就可以移动光标来设定范围，接著再直接下指令进行编辑即可。对於整列操作， vi 另外提供了更方便的编辑指令。前面曾经提到过删除整列文字的指令 dd 就是其中一个；cc 可以修改整列文字；而 yy 则是复制整列文字；指令 D 则可以删除光标到该列结束为止所有的文字。 <br />
（四）、文件操作指令 <br />
文件操作指令多以 : 开头，这跟编辑指令有点区别。 <br />
:q 结束编辑(quit) <br />
:q! 不存档而要放弃编辑过的文件。 <br />
:w 保存文件(write)其後可加所要存档的档名。 <br />
:wq 即存档後离开。 <br />
zz 功能与 :wq 相同。 <br />
:x 与:wq相同 </div>
<script type="text/javascript"><!-- google_ad_client="pub-4348265167276910" ;
/* 468x60, 个人博客 */ google_ad_slot="2046406163" ; google_ad_width="468;
google_ad_height" = 60;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</script>
<img src ="http://www.blogjava.net/xiachang88/aggbug/297715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-10 17:33 <a href="http://www.blogjava.net/xiachang88/articles/297715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate的批量处理</title><link>http://www.blogjava.net/xiachang88/articles/297713.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Sat, 10 Oct 2009 09:26:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/297713.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/297713.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/297713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/297713.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/297713.html</trackback:ping><description><![CDATA[<div>
<p style="text-indent: 21.25pt; line-height: 15.75pt">Hibernate 完全以面向对象的方式来操作数据库，当程序里以面向对象的方式操作持久化对象时，将被自动转换为对数据库的操作。例如调用Session的 delete()方法来删除持久化对象，Hibernate将负责删除对应的数据记录；当执行持久化对象的set方法时，Hibernate将自动转换为对应的update方法，修改数据库的对应记录。</p>
<p style="text-indent: 21.25pt; line-height: 15.75pt">问题是如果需要同时更新100 000条记录，是不是要逐一加载100 000条记录，然后依次调用set方法——这样不仅繁琐，数据访问的性能也十分糟糕。对这种批量处理的场景，Hibernate提供了批量处理的解决方案，下面分别从批量插入、批量更新和批量删除3个方面介绍如何面对这种批量处理的情形。</p>
<h3>4.2.1 批量插入</h3>
<p style="text-indent: 21.25pt; line-height: 15.75pt">如果需要将100 000条记录插入数据库，通常Hibernate可能会采用如下做法：</p>
<div>
<ol>
    <li>Session&nbsp;session&nbsp;=&nbsp;sessionFactory.openSession(); &nbsp;&nbsp;</li>
    <li>Transaction&nbsp;tx&nbsp;=&nbsp;session.beginTransaction(); &nbsp;&nbsp;</li>
    <li>for&nbsp;(&nbsp;int&nbsp;i=0;&nbsp;i&lt;100000;&nbsp;i++&nbsp;)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;u&nbsp;=&nbsp;new&nbsp;User&nbsp;(.....); &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;session.save(customer); &nbsp;&nbsp;</li>
    <li>} &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>tx.commit(); &nbsp;&nbsp;</li>
    <li>session.close();&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none" name="code">Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i&lt;100000; i++ ) {
User u = new User (.....);
session.save(customer);
}
tx.commit();
session.close();</pre>
<p style="text-indent: 21.25pt; line-height: 15.75pt">但随着这个程序的运行，总会在某个时候运行失败，并且抛出OutOfMemoryException（内存溢出异常）。这是因为Hibernate的Session持有一个必选的一级缓存，所有的User实例都将在Session级别的缓存区进行了缓存的缘故。</p>
<p style="text-indent: 21.25pt; line-height: 15.75pt">为了解决这个问题，有个非常简单的思路：定时将Session缓存的数据刷新入数据库，而不是一直在Session级别缓存。可以考虑设计一个累加器，每保存一个User实例，累加器增加1。根据累加器的值决定是否需要将Session缓存中的数据刷入数据库。</p>
<p style="text-indent: 21.25pt; line-height: 15.75pt">下面是增加100 000个User实例的代码片段：</p>
<div>
<ol>
    <li>private&nbsp;void&nbsp;testUser()throws&nbsp;Exception &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>{ &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//打开Session &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;=&nbsp;HibernateUtil.currentSession(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//开始事务 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tx&nbsp;=&nbsp;session.beginTransaction(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//循环100&nbsp;000次，插入100&nbsp;000条记录 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0&nbsp;;&nbsp;i&nbsp;&lt;&nbsp;1000000&nbsp;;&nbsp;i++&nbsp;) &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建User实例 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;u1&nbsp;=&nbsp;new&nbsp;User(); &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u1.setName("xxxxx"&nbsp;+&nbsp;i); &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u1.setAge(i); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u1.setNationality("china"); &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在Session级别缓存User实例 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.save(u1); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//每当累加器是20的倍数时，将Session中的数据刷入数据库，并清空Session缓存 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(i&nbsp;%&nbsp;20&nbsp;==&nbsp;0) &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.flush(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.clear(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.commit(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx&nbsp;=&nbsp;session.beginTransaction(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//提交事务 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;tx.commit(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//关闭事务 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;HibernateUtil.closeSession(); &nbsp;&nbsp;</li>
    <li>}&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none" name="code">private void testUser()throws Exception
{
//打开Session
Session session = HibernateUtil.currentSession();
//开始事务
Transaction tx = session.beginTransaction();
//循环100 000次，插入100 000条记录
for (int i = 0 ; i &lt; 1000000 ; i++ )
{
//创建User实例
User u1 = new User();
u1.setName("xxxxx" + i);
u1.setAge(i);
u1.setNationality("china");
//在Session级别缓存User实例
session.save(u1);
//每当累加器是20的倍数时，将Session中的数据刷入数据库，并清空Session缓存
if (i % 20 == 0)
{
session.flush();
session.clear();
tx.commit();
tx = session.beginTransaction();
}
}
//提交事务
tx.commit();
//关闭事务
HibernateUtil.closeSession();
}
</pre>
<p style="text-indent: 21.25pt; line-height: 15.75pt">上面代码中，当i%20 == 0时，手动将Session处的缓存数据写入数据库，并手动提交事务。如果不提交事务，数据将依然缓存在事务处——未进入数据库，也将引起内存溢出的异常。</p>
<p style="text-indent: 21.25pt; line-height: 15.75pt">这是对Session级别缓存的处理，还应该通过如下配置来关闭SessionFactory的二级&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缓存。</p>
<p>hibernate.cache.use_second_level_cache false</p>
<p>注意：除了要手动清空Session级别的缓存外，最好关闭SessionFactory级别的二级缓存。否则，即使手动清空Session级别的缓存，但因为在SessionFactory级别还有缓存，也可能引发异常。</p>
<h3>4.2.2 批量更新</h3>
<p style="text-indent: 21.25pt; line-height: 15.75pt">上面介绍的方法同样适用于批量更新数据，如果需要返回多行数据，可以使用scroll()方法，从而可充分利用服务器端游标所带来的性能优势。下面是进行批量更新的代码片段：</p>
<div>
<ol>
    <li>private&nbsp;void&nbsp;testUser()throws&nbsp;Exception &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>{ &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//打开Session &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;=&nbsp;HibernateUtil.currentSession(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//开始事务 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tx&nbsp;=&nbsp;session.beginTransaction(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//查询出User表中的所有记录 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;ScrollableResults&nbsp;users&nbsp;=&nbsp;session.createQuery("from&nbsp;User") &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setCacheMode(CacheMode.IGNORE) &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.scroll(ScrollMode.FORWARD_ONLY); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;count=0; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//遍历User表中的全部记录 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(&nbsp;users.next()&nbsp;) &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;u&nbsp;=&nbsp;(User)&nbsp;users.get(0); &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;u.setName("新用户名"&nbsp;+&nbsp;count); &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当count为20的倍数时，将更新的结果从Session中flush到数据库 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;++count&nbsp;%&nbsp;20&nbsp;==&nbsp;0&nbsp;) &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.flush(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.clear(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;tx.commit(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;HibernateUtil.closeSession(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>}&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none" name="code">private void testUser()throws Exception
{
//打开Session
Session session = HibernateUtil.currentSession();
//开始事务
Transaction tx = session.beginTransaction();
//查询出User表中的所有记录
ScrollableResults users = session.createQuery("from User")
.setCacheMode(CacheMode.IGNORE)
.scroll(ScrollMode.FORWARD_ONLY);
int count=0;
//遍历User表中的全部记录
while ( users.next() )
{
User u = (User) users.get(0);
u.setName("新用户名" + count);
//当count为20的倍数时，将更新的结果从Session中flush到数据库
if ( ++count % 20 == 0 )
{
session.flush();
session.clear();
}
}
tx.commit();
HibernateUtil.closeSession();
}
</pre>
<p style="text-indent: 21.25pt; line-height: 15.75pt">通过这种方式，虽然可以执行批量更新，但效果非常不好。执行效率不高，而且需要先执行数据查询，然后再执行数据更新，并且这种更新将是逐行更新，即每更新一行记录，都需要执行一条update语句，性能非常低下。</p>
<p style="text-indent: 21.25pt; line-height: 15.75pt">为了避免这种情况，Hibernate提供了一种类似于SQL的批量更新和批量删除的HQL语法。</p>
<h3>4.2.3 SQL风格的批量更新/删除</h3>
<p style="text-indent: 21.25pt; line-height: 15.75pt">Hibernate提供的HQL语句也支持批量的UPDATE和DELETE语法。</p>
<p style="text-indent: 21.25pt; line-height: 15.75pt">批量UPDATE和DELETE语句的语法格式如下：</p>
<p style="text-indent: 21.25pt; line-height: 15.75pt">UPDATE | DELETE FROM? ClassName [WHERE WHERE_CONDITIONS]</p>
<p style="text-indent: 21.25pt; line-height: 15.75pt">关于上面的语法格式有以下四点值得注意：</p>
<p>&nbsp;&nbsp; ● 在FROM子句中，FROM关键字是可选的。即完全可以不写FROM关键字。</p>
<p>&nbsp;&nbsp; ● 在FROM子句中只能有一个类名，该类名不能有别名。</p>
<p>&nbsp;&nbsp; ● 不能在批量HQL语句中使用连接，显式的或隐式的都不行。但可以在WHERE子句中使用子查询。</p>
<p>&nbsp;&nbsp; ● 整个WHERE子句是可选的。</p>
<p style="text-indent: 21.25pt; line-height: 15.75pt">假设，需要批量更改User类实例的name属性，可以采用如下代码片段完成：</p>
<div>
<ol>
    <li>private&nbsp;void&nbsp;testUser()throws&nbsp;Exception &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>{ &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//打开Session &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;=&nbsp;HibernateUtil.currentSession(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//开始事务 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tx&nbsp;=&nbsp;session.beginTransaction(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//定义批量更新的HQL语句 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;hqlUpdate&nbsp;=&nbsp;"update&nbsp;User&nbsp;set&nbsp;name&nbsp;=&nbsp;:newName"; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//执行更新 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;updatedEntities&nbsp;=&nbsp;session.createQuery(&nbsp;hqlUpdate&nbsp;) &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&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;.setString(&nbsp;"newName",&nbsp;"新名字"&nbsp;) &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&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;.executeUpdate(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//提交事务 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;tx.commit(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;HibernateUtil.closeSession(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>}&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none" name="code">private void testUser()throws Exception
{
//打开Session
Session session = HibernateUtil.currentSession();
//开始事务
Transaction tx = session.beginTransaction();
//定义批量更新的HQL语句
String hqlUpdate = "update User set name = :newName";
//执行更新
int updatedEntities = session.createQuery( hqlUpdate )
.setString( "newName", "新名字" )
.executeUpdate();
//提交事务
tx.commit();
HibernateUtil.closeSession();
}
</pre>
<p style="text-indent: 21.25pt; line-height: 15.75pt">从上面代码中可以看出，这种语法非常类似于PreparedStatement的executeUpdate语法。实际上，HQL的这种批量更新就是直接借鉴了SQL语法的UPDATE语句。</p>
<p>注意：使用这种批量更新语法时，通常只需要执行一次SQL的UPDATE语句，就可以完成所有满足条件记录的更新。但也可能需要执行多条UPDATE语句，这是因为有继承映射等特殊情况，例如有一个Person实例，它有Customer的子类实例。当批量更新Person实例时，也需要更新Customer实例。如果采用joined-subclass或union-subclass映射策略，Person和Customer实例保存在不同的表中，因此可能需要多条UPDATE语句。</p>
<p style="text-indent: 21.25pt; line-height: 15.75pt">执行一个HQL DELETE，同样使用 Query.executeUpdate() 方法，下面是一次删除上面全部记录的代码片段：</p>
<div>
<ol>
    <li>private&nbsp;void&nbsp;testUser()throws&nbsp;Exception &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>{ &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//打开Session实例 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;Session&nbsp;session&nbsp;=&nbsp;HibernateUtil.currentSession(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//开始事务 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;Transaction&nbsp;tx&nbsp;=&nbsp;session.beginTransaction(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//定义批量删除的HQL语句 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;hqlUpdate&nbsp;=&nbsp;"delete&nbsp;User"; &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//执行批量删除 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;updatedEntities&nbsp;=&nbsp;session.createQuery(&nbsp;hqlUpdate&nbsp;) &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&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;.executeUpdate(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//提交事务 &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;tx.commit(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;//关闭Session &nbsp;&nbsp;</span></li>
    <li>&nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;&nbsp;&nbsp;HibernateUtil.closeSession(); &nbsp;&nbsp;</li>
    <li>&nbsp;&nbsp;</li>
    <li>}&nbsp;&nbsp;</li>
</ol>
</div>
<pre style="display: none" name="code">private void testUser()throws Exception
{
//打开Session实例
Session session = HibernateUtil.currentSession();
//开始事务
Transaction tx = session.beginTransaction();
//定义批量删除的HQL语句
String hqlUpdate = "delete User";
//执行批量删除
int updatedEntities = session.createQuery( hqlUpdate )
.executeUpdate();
//提交事务
tx.commit();
//关闭Session
HibernateUtil.closeSession();
}
</pre>
<p style="text-indent: 21.25pt; line-height: 15.75pt">由 Query.executeUpdate()方法返回一个整型值，该值是受此操作影响的记录数量。实际上，Hibernate的底层操作是通过JDBC完成的。因此，如果有批量的UPDATE或DELETE操作被转换成多条UPDATE或DELETE语句，该方法返回的是最后一条SQL语句影响的记录行数。</p>
</div>
<img src ="http://www.blogjava.net/xiachang88/aggbug/297713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-10 17:26 <a href="http://www.blogjava.net/xiachang88/articles/297713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>框架</title><link>http://www.blogjava.net/xiachang88/articles/297710.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Sat, 10 Oct 2009 09:11:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/297710.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/297710.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/297710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/297710.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/297710.html</trackback:ping><description><![CDATA[有位高手的形象比喻： <br />
Struts是web开发框剪（负责表单提交）（相当于电脑显卡） <br />
Hibernate负责对数据库的操作（相当于电脑CPU） <br />
Spring相当于一个主板（将显卡和CPU组装在一起） <br />
<img src ="http://www.blogjava.net/xiachang88/aggbug/297710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-10 17:11 <a href="http://www.blogjava.net/xiachang88/articles/297710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用工作流的目的</title><link>http://www.blogjava.net/xiachang88/articles/297696.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Sat, 10 Oct 2009 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/297696.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/297696.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/297696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/297696.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/297696.html</trackback:ping><description><![CDATA[<strong>关键字: 工作流，企业应用</strong>
<div>
<p style="margin: 0cm 0cm 0pt; text-indent: 15pt"><span style="font-size: small">企业之所以使用工作流管理系统的目的，不外乎有三个：一是作为企业应用系统集成（<span style="font-family: Times New Roman">EAI</span>）的平台。二是协助涉及多人相关任务工作流软件的开发。三是将工作流引擎嵌入到其他应用中。实际上当前国内大部分知名工作流是以这些作为功能的核心，代表产品如工作流开发软件<span style="font-family: Times New Roman">intelliFlow</span>、<span style="font-family: Times New Roman">myApps（天翎）</span>、<span style="font-family: Times New Roman">AquaLogic</span>以及工作流应用软件<span style="font-size: 11.5pt"><span style="font-family: Times New Roman">BizFocus-Design</span></span><strong>、</strong><span style="font-size: 9pt; font-family: Tahoma">SynchroFLOW</span>等等。</span></p>
<p><span style="font-size: small">在当今大部分企业IT架构中，企业内网中运行着各种各样的结构应用和数据库。在这些系统被应用到组织时，都有一个清晰的目标。例如，客户管理、财务管理、物料管理、仓库管理、生产管理等等等。这些系统即为专门应用。当企业为某种目的而结合所有的专门应用时，就可以使用工作流系统构建一个EAI平台。这是第一个目的。</span><br />
<span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: small">当企业（如系统开发商）在开发维护产品时会涉及到很多相关任务流程，为了协助涉及多人相关任务工作流软件的开发，企业一般都要用上工作流系统管理，而大部分工作流系统都有一个方便的机制，来生成执行任务的表单。另外对于专注于ISO 或者CMM认证的组织，采用这种方式使用工作流系统能够显著提高生产率。不用将过程用文字的形式写在纸上，工作流系统使你通过流程定义建模实现过程的自动化，这工作流系统第二个目的：</span><br />
<span style="font-size: small">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: small">一个公司的内部系统运行往往牵涉多多种的专门应用软件，为了整合这些应用软件，企业可以将工作流引擎嵌入到其他应用中。当然开发专门应用的公司也可以将工作流引擎嵌入到他们的软件中。在这里，工作流引擎只是作为一个软件组件，对于应用的最终用户是不可见的。将工作流引擎嵌入到应用中的主要原因是为了应用软件的可维护性及整合性。</span></p>
</div>
<img src ="http://www.blogjava.net/xiachang88/aggbug/297696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-10 16:24 <a href="http://www.blogjava.net/xiachang88/articles/297696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE程序员应该掌握的Linux系统的知识 </title><link>http://www.blogjava.net/xiachang88/articles/297692.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Sat, 10 Oct 2009 08:12:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/297692.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/297692.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/297692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/297692.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/297692.html</trackback:ping><description><![CDATA[　大型J2EE应用都在建构在linux环境下的。开发环境下我们可以通过samba映射成本地的网络驱动器，直接在windows环境下进行编程调试。但是最后的发布还是要到linux环境，同时我们对网上web服务器和数据库服务器的应用管理(比如自动脚本发布等），应用监控（web服务是否正常、mysql数据库的使用情况）、系统监控（监控磁盘空间的使用情况等）都要求程序员熟悉必要的linux知识。
<p>　　当然程序员不必对整个linux系统样样精通。下面列出程序员基本需要掌握的linux知识。</p>
<p>　　一、linux的基本命令</p>
<p>　　1、用户管理</p>
<p>　　userdel 删除用户帐号</p>
<p>　　useradd 增加用户账号</p>
<p>　　su 改变当前用户的ID</p>
<p>　　2、文件目录管理</p>
<p>　　ls 浏览目录，查看当前目录下的文件和文件名</p>
<p>　　chmod 修改文件权限</p>
<p>　　chown 改变文件所有者</p>
<p>　　cp 复制文件</p>
<p>　　cd 改变当前目录</p>
<p>　　mv 重命名文件或移动文件</p>
<p>　　rm 删除文件或者目录</p>
<p>　　pwd 当前目录</p>
<p>　　scp 远程拷贝</p>
<p>　　alias 别名</p>
<p>　　3、其他命令</p>
<p>　　ln 在文件之间建立链接</p>
<p>　　tail 输出文件内容后面的部分，一般我们会通过tail -f 实时查看当前程序打印的日志。</p>
<p>　　type 查看一个命令所在路径</p>
<p>　　wc 查看行数</p>
<p>　　grep 在文件内容中查找</p>
<p>　　find 查找文件</p>
<p>　　date 查看日期</p>
<p>　　crontab 制定计划任务，通常用于系统监控。</p>
<p>　　df 查看磁盘剩余空间，你最好在crontab中写个脚本监控磁盘的空间。超过90％就给相关的人员发email。</p>
<p>　　ps 查看进程状态</p>
<p>　　top 查看CPU的使用率</p>
<p>　　kill 终止进程</p>
<p>　　killall java程序员最喜欢用killall -9 java吧</p>
<p>　　w 查看登录用户和他们正在做什么，也可以看看系统的load。load太高，就该找找原因了。</p>
<p>　　who 查看当前用户的便当情况</p>
<p>　　tar 解压或压缩文件</p>
<p>　　echo 控制台输出</p>
<p>　　wget http访问</p>
<p>　　rpm rpm包管理</p>
<p>　　4、重定向、管道</p>
<p>　　5、标准输出、标准错误</p>
<p>　　6、使用屏蔽一个特殊字符的含义</p>
<p>　　7、正则表达式</p>
<p>　　二、熟练掌握vim编辑器</p>
<p>　　三、liunx环境下shell脚本、perl脚本的编写</p>
<p>　　为了对网上服务器应用进行管理，通常需要编写一些脚本。</p>
<p>　　脚本的编写重点掌握下面几点：</p>
<p>　　1、理解双引号、单引号、反引号的含义。</p>
<p>　　2、反斜线的使用。</p>
<p>　　3、shell脚本赋值语句左边的变量名不要加上$，常写perl脚本的常犯此错误。</p>
<p>　　4、字符串比较长，含有空格的时候，作为一个参数时脚本出错，用双引号把字符串括起来。</p>
<p>　　5、掌握好awk和sed的用法。</p>
<p>　　四、基本软件包的安装</p>
<p>　　apache、resin、mysql</p>
<p>　　一般的步骤就是：</p>
<p>　　configure</p>
<p>　　make</p>
<p>　　make install</p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/297692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-10 16:12 <a href="http://www.blogjava.net/xiachang88/articles/297692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>构建高性能J2EE应用的十个技巧</title><link>http://www.blogjava.net/xiachang88/articles/297691.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Sat, 10 Oct 2009 08:10:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/297691.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/297691.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/297691.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/297691.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/297691.html</trackback:ping><description><![CDATA[<h1 style="color: #000000">&nbsp;构建高性能的J2EE应用不但需要了解常用的实施技巧。下面介绍最常用的10种有效方法，可帮助架构设计师们快速成为这方面的专家。<br />
[关键字] <a class="cyewunder" href="http://www.enet.com.cn/esoftware/list/index.jsp?_keyword_=J2EE" target="_blank">J2EE</a>
<hr />
<div class="contenttxt">　　Java性能的基础—内存管理 <br />
<br />
　　任何Java应用，单机的或J2EE的性能基础都可归结到你的应用是如何管理内存的问题。Java的内存管理包括两个重要任务：内存的分配和内存的回收。在内存的分配中，目标是要减少需要创建的对象。 <br />
<br />
　　内存回收是导致性能下降的普遍原因。也就是说，内存中的对象越多，垃圾回收越困难。所以我们对创建对象的态度应该越保守越好。 <br />
<br />
　　在J2EE应用中常见的两个内存有关的问题是：游离的对象（也被称为内存泄露）和对象循环（指大量频繁创建和删除-在Java中体现为解除引用---对象）。 <br />
<br />
　　我们应注意确保所有可到达的对象实际是活的，即这些对象不但在内存中，而且也要在执行的代码中是存在的。当对象在应用中已经没有用了，而我们却忘记了删除对该对象的引用时，游离的对象就出现了。 <br />
<br />
　　我们知道垃圾回收会占用CPU时间。短期对象的大量创建增加了垃圾回收的频率会造成性能下降。 <br />
<br />
　　不要在Servlet中实现业务逻辑 <br />
<br />
　　在构建J2EE应用时，架构工程师通常会使用到J2EE的基本部分——Servlet。如果架构师不使用Session Beans, Entity Beans, 或 Message Beans, 那么改进性能的方法就很少。只能采用增加CPU或更多的物理服务器等方法。EJB使用了缓存（cache）和资源池等方法可以提高性能和扩展性。 <br />
<br />
　　尽可能使用本地接口访问EJB <br />
<br />
　　在早期的J2EE （遵循EJB1.X规范）应用中，访问EJB是`通过RMI使用远程接口实现的。随着EJB2.0的出现，可以通过本地接口访问EJB，不再使用RMI，在同一个JVM中使用远程方法已经少多了。但是现在还是有一些使用EJB1.X实现的应用和不知道使用本地接口的一些EJB新手。为说明这点，我们作个比较： <br />
<br />
　　1、客户端应用调用本地Stub <br />
<br />
　　2、该Stub装配参数 <br />
<br />
　　3、该Stub传到skeleton <br />
<br />
　　4、该skeleton分解参数 <br />
<br />
　　5、该skeleton调用EJB对象 <br />
<br />
　　6、EJB对象执行容器服务 <br />
<br />
　　7、EJB对象调用企业BEAN实例 <br />
<br />
　　8、企业BEA执行操作 <br />
<br />
　　9、执行组装/分解步骤然后返回 <br />
<br />
　　与远程接口处理相比较，本地接口的EJB方法是： <br />
<br />
　　1、客户端调用本地对象 <br />
<br />
　　2、本地对象执行容器服务 <br />
<br />
　　3、本地对象调用企业Bean实例 <br />
<br />
　　4、企业Bean实例执行操作 <br />
<br />
　　5、没有其他返回步骤！ <br />
<br />
　　如果你不需要从远程的客户端访问一个特殊EJB，就应该使用本地方法。 <br />
<br />
　　在实现Session Bean的服务中封装对实体EJB的访问 <br />
<br />
　　从Servlet访问实体EJB不但效率低而且难于维护。使用Session Facade（会话外观）模式可把对实体EJB的访问封装在会话EJB中，在该会话EJB中通过使用本地接口访问实体EJB而避免过多的远程调用。 <br />
<br />
　　这项技术会有额外的性能和扩展方面的好处，这是因为会话和实体EJB可以使用缓存和资源池技术来进行改进。另外，由于负载的需要，会话和实体EJB可被扩展部署到其他硬件设备上，这比将Servlet层复制扩展到其他硬件设备上要简单的多。 <br />
<br />
　　尽量粗粒度访问远程EJB <br />
<br />
　　当访问远程EJB时，调用set/get方法将产生过多的网络请求，同时也导致远程接口处理的过载。为避免这种情况，可考虑将数据属性集中在一个对象中，这样通过一次对远程EJB的调用就可以传递所有数据。这项技术就是数据传输对象（Data Transfer Object）模式。 <br />
<br />
　　优化SQL <br />
<br />
　　J2EE的架构设计工程师和开发人员通常不是SQL专家或经验丰富的数据库管理员。首先应该确保SQL使用了数据库提供的索引支持。在某些情况下，将数据库的索引和数据分开存放会提高性能。但要知道，增加额外的索引可以提高SELECT性能但也会降低INSERT的性能。对于某些数据库，关联表之间的排序会严重影响性能。可以多向数据库管理员咨询。 <br />
<br />
　　避免在实体EJB中过多执行SQL <br />
<br />
　　有时候，通过实体EJB访问数据会执行多个SQL语句。根据J2EE 规范，第一步，将调用实体Bean的find(发现)方法；第二步，在第一次调用实体EJB的业务方法时，容器会调用ejbLoad()从数据库中获得信息。 <br />
<br />
　　很多CMP(容器管理持久性)在调用发现方法时就缓存了实体数据，所以在调用ejbLoad()时就不再访问数据库了。应该避免使用BMP(Bean管理的持久性)或者自己实现缓存算法避免二次访问数据库。 <br />
<br />
　　使用Fast Lane Reader 模式访问只读数据 <br />
<br />
　　J2EE应用经常要以只读方式访问大量长时间不变的数据，而不是访问单个实体，例如浏览在线产品目录。在这种只读情况下，使用实体EJB访问数据会导致严重过载并且实现很麻烦。实体EJB 适合于对单个实体的粗粒度访问，访问大量的列表只读数据时效率不高。不管是使用CMP还是BMP，一定需要编写代码操作多个实体EJB及其关联。这将导致访问多个数据库并存在大量的也是不必要的事务开销。 <br />
<br />
　　利用Java Messaging Servce(消息服务) <br />
<br />
　　J2EE规范在JMS中提供了内置的异步处理服务。当涉及到系统需求时，应该了解在什么情况下应该采用JMS进行异步处理的设计。一旦确定要执行一些异步处理，那么同步处理的任务就应该越少越好，将数据库密集的操作安排在稍后的异步处理中完成。 <br />
<br />
　　缓存JNDI Lookup查找 <br />
<br />
　　很多操作在进行JNDI查找时要消耗大量资源。通常应该缓存JNDI资源避免网络调用和某些处理的过载。可以缓存的JNDI查找包括： <br />
<br />
　　EJB Home Interfaces <br />
<br />
　　Data Sources <br />
<br />
　　JMS Connection Factories <br />
<br />
　　MS Destinations/Topics <br />
<br />
　　一些JNDI包实现了缓存功能。但是调用对EJB主接口的narrow方法时，这种功能作用有限。缓存查找的设计应该使用共享的IntialContext 实例，尽管构建它很麻烦。这是因为需要访问多种数据源，包括应用资源文件JNDI.properties,系统属性的各项参数,传入到构造函数的各项参数。</div>
</h1>
<img src ="http://www.blogjava.net/xiachang88/aggbug/297691.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-10 16:10 <a href="http://www.blogjava.net/xiachang88/articles/297691.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java7新特性四大体验</title><link>http://www.blogjava.net/xiachang88/articles/297634.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Sat, 10 Oct 2009 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/297634.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/297634.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/297634.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/297634.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/297634.html</trackback:ping><description><![CDATA[<p>距离Java7的MR版本发布有段时间了，通过安装试用之后的总体感觉是：速度又快了。仔细阅读了Java7的相关文档发现，Java7拥有如下的一些新的特性。</p>
<p><strong>首先是模块化特性：</strong>如果您安装和使用过NetBeans6.7的话，是不是会有一个很大的感觉，就是NetBeans6.7的启动速度比以前快了很多，当然并不是NetBeans已经使用了Java7，而是NetBeans将以前一启动就加载的功能划分成了很多的模块，第一次安装启动的时候，很多模块都没有加载，只是加载了一些最基本的功能模块，在随后的使用过程中，如果用到了某一种功能，就启用相应的模块，这样形成了一个按需加载的特点，当然随着加载的模块数量增加，启动的速度也会随之变慢。不过除非你要用其中的所有模块，否则总是比之前的版本速度要快。现在的 Java7也是采用了模块的划分方式来提速，一些不是必须的模块并没有下载和安装，因此在使用全新的Java7的虚拟机的时候会发现真的很快，当虚拟机需要用到某些功能的时候，再下载和启用相应的模块，这样使得最初需要下载的虚拟机大小得到了有效的控制。同时对启动速度也有了很大的改善。如果你对 OpenJDK的架构比较熟悉，你甚至可以定制JDK的模块。</p>
<p><strong>其次是多语言支持：</strong>这里的多语言不是指中文英文之类的语言，而是说Java7的虚拟机对多种动态程序语言增加了支持，比如：Rubby、 Python等等。对这些动态语言的支持极大地扩展了Java虚拟机的能力。对于那些熟悉这些动态语言的程序员而言，在使用Java虚拟机的过程中同样可以使用它们熟悉的语言进行功能的编写，而这些语言是跑在功能强大的JVM之上的。</p>
<p><strong>再有是开发者的开发效率得到了改善：</strong>Java7通过多种特性来增强开发效率。比如对语言本身做了一些细小的改变来简化程序的编写，在多线程并发与控制方面：轻量级的分离与合并框架，一个支持并发访问的HashMap等等。通过注解增强程序的静态检查。提供了一些新的API用于文件系统的访问、异步的输入输出操作、Socket通道的配置与绑定、多点数据包的传送等等。</p>
<p><strong>最后是执行效率的提高，也是给人感觉最真切体验的特性：</strong>压缩了64位的对象指针，Java7通过对对象指针由64位压缩到与32位指针相匹配的技术使得内存和内存带块的消耗得到了很大的降低因而提高了执行效率。此外还提供了新的垃圾回收机制（G1）来降低垃圾回收的负载和增强垃圾回收的效果。G1垃圾回收机制拥有更低的暂停率和更好的可预测性。</p>
<p>其实如上的这些特性是在告诉我们，Java7改善了什么，速度为什么快了，当然这些特性将随着Java7的正式版发布而继续凸显其优势。</p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/297634.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-10 10:04 <a href="http://www.blogjava.net/xiachang88/articles/297634.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Building a Simple Web Service ?</title><link>http://www.blogjava.net/xiachang88/articles/297631.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Sat, 10 Oct 2009 01:57:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/297631.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/297631.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/297631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/297631.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/297631.html</trackback:ping><description><![CDATA[<strong>Setting up</strong>
<ol style="margin-top: 0in" type="1">
    <li style="color: black; tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Set up the installed JRE in eclipse (Windows -&gt; Preferences -&gt; Java -&gt; Installed JREs) </font></span></li>
</ol>
<p style="margin-left: 0.25in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; <img height="525" src="http://www.roseindia.net/webservices/buildi1.jpg" width="580" border="0" v:shapes="_x0000_i1025"  alt="" /> </font></span></p>
<ol style="margin-top: 0in" type="1" start="2">
    <li style="color: black; tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Set up the installed runtime for server in eclipse (Windows -&gt; Preferences -&gt; Server -&gt; Installed Runtimes) </font></span></li>
</ol>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; <img height="525" src="http://www.roseindia.net/webservices/buildi2.jpg" width="580" border="0" v:shapes="_x0000_i1026"  alt="" /> </font></span></p>
<p style="margin: 0in 0in 0pt"><font color="#000080">&nbsp; </font></p>
<ol style="margin-top: 0in" type="1" start="3">
    <li style="color: black; tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Set up the Server view in eclipse (Windows -&gt; Show View -&gt; Other) </font></span></li>
</ol>
<p style="margin-left: 0.5in"><font color="#000080"><span style="font-size: 10pt; font-family: Arial">&nbsp;<img height="414" src="http://www.roseindia.net/webservices/buildi3.jpg" width="296" border="0" v:shapes="_x0000_i1027"  alt="" /> </span></font></p>
<ol style="margin-top: 0in" type="1" start="4">
    <li style="color: black; tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Set up the Tomcat Server by right clicking and selecting New -&gt; Server option from the Server view in eclipse </font></span></li>
</ol>
<p style="margin-left: 0.25in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080"><img height="192" src="http://www.roseindia.net/webservices/buildi4.jpg" width="447" border="0" v:shapes="_x0000_i1028"  alt="" /> </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080"><img height="531" src="http://www.roseindia.net/webservices/buildi5.jpg" width="540" border="0" v:shapes="_x0000_i1029"  alt="" /> </font></span></p>
<p><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<p style="margin-left: 0.25in; text-indent: -0.25in; tab-stops: list .25in"><font color="#000080"><span style="font-weight: normal; font-family: Symbol">?span style="font:7.0pt "Times New Roman""&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>Creating a Web service</strong></font></p>
<ol style="margin-top: 0in" type="1">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Create a new Dynamic Web Project in eclipse (File -&gt; New -&gt; Other) </font></span></li>
</ol>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080"><img height="500" src="http://www.roseindia.net/webservices/buildi6.jpg" width="500" border="0" v:shapes="_x0000_i1030"  alt="" /> </font></span></p>
<p><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<ol style="margin-top: 0in" type="1" start="2">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Enter name as 揥ebServiceTutorial? select project location as 揈:"Test? and select Apache Tomcat v5.5 as the Target server. </font></span></li>
</ol>
<p style="margin-left: 0.5in"><font color="#000080"><span style="font-size: 10pt; font-family: Arial">&nbsp; <img height="488" src="http://www.roseindia.net/webservices/buildi7.jpg" width="513" border="0" v:shapes="_x0000_i1031"  alt="" /> </span></font></p>
<ol style="margin-top: 0in" type="1" start="3">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Now create a new Java class from the Project Explorer (Dynamic Web Projects -&gt; Java Source -&gt; New -&gt; Class) </font></span></li>
</ol>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; <img height="241" src="http://www.roseindia.net/webservices/buildi8.jpg" width="527" border="0" v:shapes="_x0000_i1032"  alt="" /> </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<ol style="margin-top: 0in" type="1" start="4">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Enter name as 揌ello?and package as 揷om.tutorial? </font></span></li>
</ol>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; <img height="592" src="http://www.roseindia.net/webservices/buildi9.jpg" width="495" border="0" v:shapes="_x0000_i1033"  alt="" /> </font></span></p>
<ol style="margin-top: 0in" type="1" start="5">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Add a simple method in the 揌ello?class as below. </font></span></li>
</ol>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#000080">public String sayHello(String name){ </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#000080">return "Hello " + name; </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font color="#000080">} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></p>
<p style="margin-left: 0.25in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height="180" src="http://www.roseindia.net/webservices/buildi10.jpg" width="361" border="0" v:shapes="_x0000_i1034"  alt="" /> </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<ol style="margin-top: 0in" type="1" start="6">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Save and build the project. </font></span>
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Create a new Web service in eclipse (File -&gt; New -&gt; Other) </font></span></li>
</ol>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; <img height="500" src="http://www.roseindia.net/webservices/buildi11.jpg" width="500" border="0" v:shapes="_x0000_i1035"  alt="" /> </font></span></p>
<ol style="margin-top: 0in" type="1" start="8">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Select Generate a proxy. </font></span>
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Select Test the Web service. </font></span>
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Select Overwrite files without warning. </font></span></li>
</ol>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080"><img height="540" src="http://www.roseindia.net/webservices/buildi12.jpg" width="500" border="0" v:shapes="_x0000_i1036"  alt="" /> </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<ol style="margin-top: 0in" type="1" start="11">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Select or enter the Bean name as 揷om.tutorial.Hello? This is the java class that we just now created. </font></span></li>
</ol>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080"><img height="540" src="http://www.roseindia.net/webservices/buildi13.jpg" width="500" border="0" v:shapes="_x0000_i1037"  alt="" /> </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<ol style="margin-top: 0in" type="1" start="12">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Continue the wizard by clicking Next and finish. </font></span>
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">On Finish, the Tomcat server starts up and launches the Test client. </font></span>
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Verify the generated contents. Look for Hello.class and the generated JSPs as below. </font></span></li>
</ol>
<p><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080"><img height="541" src="http://www.roseindia.net/webservices/buildi14.jpg" width="349" border="0" v:shapes="_x0000_i1038"  alt="" /> </font></span></p>
<p><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<ol style="margin-top: 0in" type="1" start="15">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Verify the Tomcat folder and ensure the newly created web applications ? WebServiceTutorial, WebServiceTutorialClient. </font></span></li>
</ol>
<p><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080"><img height="227" src="http://www.roseindia.net/webservices/buildi15.jpg" width="268" border="0" v:shapes="_x0000_i1039"  alt="" /> </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<ol style="margin-top: 0in" type="1" start="16">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">We can also run the following url from the browser to access/test the Web service. </font></span></li>
</ol>
<p style="margin-left: 0.5in"><font color="#000080"><span style="font-size: 10pt; font-family: Arial"><a href="http://localhost:8080/WebServiceTutorialClient/sampleHelloProxy/TestClient.jsp">http://localhost:8080/WebServiceTutorialClient/sampleHelloProxy/TestClient.jsp</a> </span></font></p>
<ol style="margin-top: 0in" type="1" start="17">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">If servlet error 搊rg.eclipse.jst.ws.util.JspUtils cannot be resolved or is not a type?is thrown on the browser, then copy the webserviceutils.jar file from the E:"Eclipse3.1"eclipse"plugins"org.eclipse.jst.ws.consumption_0.7.0 into the WEB-INF"lib folder of the WebServiceTutorialClient application and restart the Tomcat server. </font></span></li>
</ol>
<ol style="margin-top: 0in" type="1" start="18">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">The browser displays the methods available in the web service. </font></span></li>
</ol>
<p style="margin-left: 0.5in"><font color="#000080"><span style="font-size: 10pt; font-family: Arial"><img height="379" src="http://www.roseindia.net/webservices/buildi16.jpg" width="577" border="0" v:shapes="_x0000_i1040"  alt="" /></span></font></p>
<p><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<ol style="margin-top: 0in" type="1" start="19">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Click on the <strong>sayHello(..)</strong> method, enter your name (for e.g. 揓eeva? in the inputs section and click 揑nvoke? </font></span></li>
</ol>
<p style="margin-left: 0.25in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<p style="margin-left: 0.5in"><font color="#000080"><span style="font-size: 10pt; font-family: Arial"><img height="379" src="http://www.roseindia.net/webservices/buildi17.jpg" width="577" border="0" v:shapes="_x0000_i1044"  alt="" /></span></font></p>
<p style="margin-left: 0.25in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<ol style="margin-top: 0in" type="1" start="20">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">The browser greets using the web service. </font></span></li>
</ol>
<p style="margin-left: 0.5in"><font color="#000080"><span style="font-size: 10pt; font-family: Arial"><img height="379" src="http://www.roseindia.net/webservices/buildi18.jpg" width="577" border="0" v:shapes="_x0000_i1041"  alt="" /></span></font></p>
<p><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<ol style="margin-top: 0in" type="1" start="21">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">The WSDL for the Hello Web service can be found in E:"Test"WebServiceTutorial"WebContent"wsdl"Hello.wsdl. On double-click, the WSDL opens in a graphical editor. </font></span></li>
</ol>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; <img height="500" src="http://www.roseindia.net/webservices/buildi19.jpg" width="600" border="0" v:shapes="_x0000_i1042"  alt="" /> </font></span></p>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<ol style="margin-top: 0in" type="1" start="22">
    <li style="tab-stops: list .5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">Right-click on the WSDL file and explore the options to test the web service / publish the WSDL file / generate client / etc. </font></span></li>
</ol>
<p style="margin-left: 0.5in"><span style="font-size: 10pt; font-family: Arial"><font color="#000080">&nbsp; </font></span></p>
<p style="margin-left: 0.5in"><font color="#000080"><span style="font-size: 10pt; font-family: Arial"><img height="491" src="http://www.roseindia.net/webservices/buildi20.jpg" width="454" border="0" v:shapes="_x0000_i1043"  alt="" /></span></font></p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/297631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-10-10 09:57 <a href="http://www.blogjava.net/xiachang88/articles/297631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>web测试总结 </title><link>http://www.blogjava.net/xiachang88/articles/296662.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Sun, 27 Sep 2009 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/296662.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/296662.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/296662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/296662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/296662.html</trackback:ping><description><![CDATA[在Web工程过程中，基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同，它不但需要检查和验证是否按照设计的要求运行，而且还要测试系统在不同用户的浏览器端的显示是否合适。重要的是，还要从最终用户的角度进行安全性和可用性测试。然而，Internet和Web媒体的不可预见性使测试基于Web的系统变得困难。因此，我们必须为测试和评估复杂的基于Web的系统研究新的方法和技术。
<p style="font-size: 18pt" goog_ds_charindex="212"><font size="2" goog_ds_charindex="213">本文将 web 测试分为 6 个部分：</font> </p>
<p goog_ds_charindex="236"><font size="2" goog_ds_charindex="237">1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 功能测试 </font></p>
<p goog_ds_charindex="254"><font size="2" goog_ds_charindex="255">2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 性能测试（包括负载/压力测试）</font> </p>
<p goog_ds_charindex="283"><font size="2" goog_ds_charindex="284">3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户界面测试</font> </p>
<p goog_ds_charindex="303"><font size="2" goog_ds_charindex="304">4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 兼容性测试</font> </p>
<p goog_ds_charindex="322"><font size="2" goog_ds_charindex="323">5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安全测试</font> </p>
<p goog_ds_charindex="340"><font size="2" goog_ds_charindex="341">6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接口测试 </font></p>
<p goog_ds_charindex="358"><font size="2" goog_ds_charindex="359">本文的目的是覆盖 web 测试的各个方面，未就某一主题进行深入说明。</font> </p>
<p goog_ds_charindex="397"><font size="2" goog_ds_charindex="398">1 功能测试</font> </p>
<p goog_ds_charindex="408"><font size="2" goog_ds_charindex="409">1.1 链接测试</font> </p>
<p goog_ds_charindex="421"><font size="2" goog_ds_charindex="422">链接是Web应用系统的一个主要特征，它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先，测试所有链接是否按指示的那样确实链接到了该链接的页面；其次，测试所链接的页面是否存在；最后，保证Web应用系统上没有孤立的页面，所谓孤立页面是指没有链接指向该页面，只有知道正确的URL地址才能访问。 </font></p>
<p goog_ds_charindex="589"><font size="2" goog_ds_charindex="590">链接测试可以自动进行，现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成，也就是说，在整个Web应用系统的所有页面开发完成之后进行链接测试。</font> </p>
<p goog_ds_charindex="668"><font size="2" goog_ds_charindex="669">采取措施：采用自动检测网站链接的软件来进行。</font> </p>
<p goog_ds_charindex="695"><font size="2" goog_ds_charindex="696">推荐软件：</font> </p>
<p goog_ds_charindex="705"><font size="2" goog_ds_charindex="706">Xenu Link Sleuth 免费 绿色免安装软件</font> </p>
<p goog_ds_charindex="737"><font size="2" goog_ds_charindex="738">HTML Link Validator 共享（30天试用）</font> </p>
<p goog_ds_charindex="771"><font size="2" goog_ds_charindex="772">1.2 表单测试 </font></p>
<p goog_ds_charindex="784"><font size="2" goog_ds_charindex="785">当用户通过表单提交信息的时候，都希望表单能正常工作。</font> </p>
<p goog_ds_charindex="815"><font size="2" goog_ds_charindex="816">如果使用表单来进行在线注册，要确保提交按钮能正常工作，当注册完成后应返回注册成功的消息。如果使用表单收集配送信息，应确保程序能够正确处理这些数据，最后能让顾客能让客户收到包裹。要测试这些程序，需要验证服务器能正确保存这些数据，而且后台运行的程序能正确解释和使用这些信息。</font> </p>
<p goog_ds_charindex="955"><font size="2" goog_ds_charindex="956">当用户使用表单进行用户注册、登陆、信息提交等操作时，我们必须测试提交操作的完整性，以校验提交给服务器的信息的正确性。例如：用户填写的出生日期与职业是否恰当，填写的所属省份与所在城市是否匹配等。如果使用了默认值，还要检验默认值的正确性。如果表单只能接受指定的某些值，则也要进行测试。例如：只能接受某些字符，测试时可以跳过这些字符，看系统是否会报错。</font> </p>
<p goog_ds_charindex="1133"><font size="2" goog_ds_charindex="1134">1.3 数据校验</font> </p>
<p goog_ds_charindex="1146"><font size="2" goog_ds_charindex="1147">如果系根据业务规则需要对用户输入进行校验，需要保证这些校验功能正常工作。例如，省份的字段可以用一个有效列表进行校验。在这种情况下，需要验证列表完整而且程序正确调用了该列表(例如在列表中添加一个测试值，确定系统能够接受这个测试值)。</font> </p>
<p goog_ds_charindex="1266"><font size="2" goog_ds_charindex="1267">在测试表单时，该项测试和表单测试可能会有一些重复。</font> </p>
<p goog_ds_charindex="1296"><font size="2" goog_ds_charindex="1297">1.2和1.3的采取措施：第一个完整的版本采用手动检查，同时形成WinRunner（QTP）脚本；回归测试以及升级版本主要靠WinRunner（QTP）自动回放测试。</font> </p>
<p goog_ds_charindex="1384"><font size="2" goog_ds_charindex="1385">1.4 cookies测试</font> </p>
<p goog_ds_charindex="1402"><font size="2" goog_ds_charindex="1403">Cookies通常用来存储用户信息和用户在某应用系统的操作，当一个用户使用Cookies访问了某一个应用系统时，Web服务器将发送关于用户的信息，把该信息以Cookies的形式存储在客户端计算机上，这可用来创建动态和自定义页面或者存储登陆等信息。<br goog_ds_charindex="1527" />
如果Web应用系统使用了Cookies，就必须检查Cookies是否能正常工作。测试的内容可包括Cookies是否起作用，是否按预定的时间进行保存，刷新对Cookies有什么影响等。如果在 cookies 中保存了注册信息，请确认该 cookie能够正常工作而且已对这些信息已经加密。如果使用 cookie 来统计次数，需要验证次数累计正确。</font> </p>
<p goog_ds_charindex="1702"><font size="2" goog_ds_charindex="1703">采取措施：</font> </p>
<p goog_ds_charindex="1712"><font size="2" goog_ds_charindex="1713">&nbsp;&nbsp;&nbsp;&nbsp; 1 采用黑盒测试：采用上面提到的方法进行测试</font> </p>
<p goog_ds_charindex="1744"><font size="2" goog_ds_charindex="1745">2 采用查看cookies的软件进行（初步的想法）</font> </p>
<p goog_ds_charindex="1774"><font size="2" goog_ds_charindex="1775">可以选择采用的软件</font> </p>
<p goog_ds_charindex="1788"><font size="2" goog_ds_charindex="1789">IECookiesView v1.50 </font></p>
<p goog_ds_charindex="1812"><font size="2" goog_ds_charindex="1813">Cookies Manager v1.1</font> </p>
<p goog_ds_charindex="1837"><font size="2" goog_ds_charindex="1838">1.5 数据库测试</font> </p>
<p goog_ds_charindex="1851"><font size="2" goog_ds_charindex="1852">在Web应用技术中，数据库起着重要的作用，数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中，最常用的数据库类型是关系型数据库，可以使用SQL对信息进行处理。</font> </p>
<p goog_ds_charindex="1956"><font size="2" goog_ds_charindex="1957">在使用了数据库的Web应用系统中，一般情况下，可能发生两种错误，分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的，而输出错误主要是由于网络速度或程序设计问题等引起的，针对这两种情况，可分别进行测试。</font> </p>
<p goog_ds_charindex="2080"><font size="2" goog_ds_charindex="2081">采取措施：暂时没有更好的测试方法</font> </p>
<p goog_ds_charindex="2101"><font size="2" goog_ds_charindex="2102">&nbsp;&nbsp;&nbsp;&nbsp; 考虑结合到1.2和1.3的测试中</font> </p>
<p goog_ds_charindex="2127"><font size="2" goog_ds_charindex="2128">1.6 应用程序特定的功能需求</font> </p>
<p goog_ds_charindex="2147"><font size="2" goog_ds_charindex="2148">最重要的是，测试人员需要对应用程序特定的功能需求进行验证。尝试用户可能进行的所有操作：下订单、更改订单、取消订单、核对订单状态、在货物发送之前更改送货信息、在线支付等等。这是用户之所以使用网站的原因，一定要确认网站能像广告宣传的那样神奇。</font> </p>
<p goog_ds_charindex="2271"><font size="2" goog_ds_charindex="2272">采取措施：深刻理解需求说明文档</font> </p>
<p goog_ds_charindex="2291"><font size="2" goog_ds_charindex="2292">1.7 设计语言测试 </font></p>
<p goog_ds_charindex="2306"><font size="2" goog_ds_charindex="2307">Web设计语言版本的差异可以引起客户端或服务器端严重的问题，例如使用哪种版本的HTML等。当在分布式环境中开发时，开发人员都不在一起，这个问题就显得尤为重要。除了HTML的版本问题外，不同的脚本语言，例如Java、JavaScript、 ActiveX、VBScript或Perl等也要进行验证。</font> </p>
<p goog_ds_charindex="2459"><font size="2" goog_ds_charindex="2460">暂时没有方法测试，可以多参考一点讨论组内的更新信息</font></p>
<font size="2" goog_ds_charindex="2460">
<p goog_ds_charindex="2488"><font size="2" goog_ds_charindex="2489">2 性能测试 </font></p>
<p goog_ds_charindex="2499"><font size="2" goog_ds_charindex="2500">2.1 连接速度测试</font></p>
<p goog_ds_charindex="2513"><font size="2" goog_ds_charindex="2514">用户连接到Web应用系统的速度根据上网方式的变化而变化，他们或许是电话拨号，或是宽带上网。当下载一个程序时，用户可以等较长的时间，但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长（例如超过5秒钟），用户就会因没有耐心等待而离开。 </font></p>
<p goog_ds_charindex="2638"><font size="2" goog_ds_charindex="2639">另外，有些页面有超时的限制，如果响应速度太慢，用户可能还没来得及浏览内容，就需要重新登陆了。而且，连接速度太慢，还可能引起数据丢失，使用户得不到真实的页面。 </font></p>
<p goog_ds_charindex="2721"><font size="2" goog_ds_charindex="2722">2.2 负载测试 </font></p>
<p goog_ds_charindex="2734"><font size="2" goog_ds_charindex="2735">负载测试是为了测量Web系统在某一负载级别上的性能，以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量，也可以是在线数据处理的数量。例如：Web应用系统能允许多少个用户同时在线？如果超过了这个数量，会出现什么现象？Web应用系统能否处理大量用户对同一个页面的请求？ </font></p>
<p goog_ds_charindex="2891"><font size="2" goog_ds_charindex="2892">2.3 压力测试</font></p>
<p goog_ds_charindex="2903"><font size="2" goog_ds_charindex="2904">负载测试应该安排在Web系统发布以后，在实际的网络环境中进行测试。因为一个企业内部员工，特别是项目组人员总是有限的，而一个Web系统能同时处理的请求数量将远远超出这个限度，所以，只有放在Internet上，接受负载测试，其结果才是正确可信的。 </font></p>
<p goog_ds_charindex="3029"><font size="2" goog_ds_charindex="3030">进行压力测试是指实际破坏一个Web应用系统，测试系统的反映。压力测试是测试系统的限制和故障恢复能力，也就是测试Web应用系统会不会崩溃，在什么情况下会崩溃。黑客常常提供错误的数据负载，直到Web应用系统崩溃，接着当系统重新启动时获得存取权。</font></p>
<p goog_ds_charindex="3153"><font size="2" goog_ds_charindex="3154">压力测试的区域包括表单、登陆和其他信息传输页面等。</font></p>
<p goog_ds_charindex="3182"><font size="2" goog_ds_charindex="3183">负载/压力测试应该关注什么</font></p>
<p goog_ds_charindex="3199"><font size="2" goog_ds_charindex="3200">测试需要验证系统能否在同一时间响应大量的用户，在用户传送大量数据的时候能否响应，系统能否长时间运行。可访问性对用户来说是极其重要的。如果用户得到&#8220;系统忙&#8221;的信息，他们可能放弃，并转向竞争对手。系统检测不仅要使用户能够正常访问站点，在很多情况下，可能会有黑客试图通过发送大量数据包来攻击服务器。出于安全的原因，测试人员应该知道当系统过载时，需要采取哪些措施，而不是简单地提升系统性能。</font></p>
<p goog_ds_charindex="3394"><font size="2" goog_ds_charindex="3395">瞬间访问高峰</font></p>
<p goog_ds_charindex="3404"><font size="2" goog_ds_charindex="3405">如果您的站点用于公布彩票的抽奖结果，最好使系统在中奖号码公布后的一段时间内能够响应上百万的请求。负载测试工具能够模拟 X 个用户同时访问测试站点。</font></p>
<p goog_ds_charindex="3481"><font size="2" goog_ds_charindex="3482">每个用户传送大量数据</font></p>
<p goog_ds_charindex="3495"><font size="2" goog_ds_charindex="3496">网上书店的多数用户可能只订购 1-5 书，但是大学书店可能会订购 5000 本有关心理学介绍的课本? 或者一个祖母为她的 50 个儿孙购买圣诞礼物(当然每个孩子都有自己的邮件地址) 系统能处理单个用户的大量数据吗?</font></p>
<p goog_ds_charindex="3606"><font size="2" goog_ds_charindex="3607">长时间的使用</font></p>
<p goog_ds_charindex="3616"><font size="2" goog_ds_charindex="3617">如果站点用于处理鲜花订单，那么至少希望它在母亲节前的一周内能持续运行。如果站点提供基于 web 的 email 服务，那么点最好能持续运行几个月，甚至几年。可能需要使用自动测试工具来完成这种类型的测试，因为很难通过手工完成这些测试。你可以想象组织100 个人同时点击某个站点。但是同时组织 100000 个人呢。通常，测试工具在第二次使用的时候，它创造的效益，就足以支付成本。而且，测试工具安装完成之后，再次使用的时候，只要点击几下。</font></p>
<p goog_ds_charindex="3837"><font size="2" goog_ds_charindex="3838">采取措施：采用测试工具WAS、ACT协助进行测试</font></p>
<p goog_ds_charindex="3865">&nbsp;</p>
<p goog_ds_charindex="3866"><font size="2" goog_ds_charindex="3867">3 用户界面测试 </font></p>
<p goog_ds_charindex="3879"><font size="2" goog_ds_charindex="3880">3.1 导航测试 </font></p>
<p goog_ds_charindex="3892"><font size="2" goog_ds_charindex="3893">导航描述了用户在一个页面内操作的方式，在不同的用户接口控制之间，例如按钮、对话框、列表和窗口等；或在不同的连接页面之间。通过考虑下列问题，可以决定一个Web应用系统是否易于导航：导航是否直观？Web系统的主要部分是否可通过主页存取？Web系统是否需要站点地图、搜索引擎或其他的导航帮助？</font></p>
<p goog_ds_charindex="4039"><font size="2" goog_ds_charindex="4040">在一个页面上放太多的信息往往起到与预期相反的效果。Web应用系统的用户趋向于目的驱动，很快地扫描一个Web应用系统，看是否有满足自己需要的信息，如果没有，就会很快地离开。很少有用户愿意花时间去熟悉Web应用系统的结构，因此，Web应用系统导航帮助要尽可能地准确。 </font></p>
<p goog_ds_charindex="4175"><font size="2" goog_ds_charindex="4176">导航的另一个重要方面是Web应用系统的页面结构、导航、菜单、连接的风格是否一致。确保用户凭直觉就知道Web应用系统里面是否还有内容，内容在什么地方。 </font></p>
<p goog_ds_charindex="4254"><font size="2" goog_ds_charindex="4255">Web应用系统的层次一旦决定，就要着手测试用户导航功能，让最终用户参与这种测试，效果将更加明显。 </font></p>
<p goog_ds_charindex="4307"><font size="2" goog_ds_charindex="4308">3.2 图形测试</font></p>
<p goog_ds_charindex="4319"><font size="2" goog_ds_charindex="4320">在Web应用系统中，适当的图片和动画既能起到广告宣传的作用，又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有： </font></p>
<p goog_ds_charindex="4413"><font size="2" goog_ds_charindex="4414">（1）要确保图形有明确的用途，图片或动画不要胡乱地堆在一起，以免浪费传输时间。Web应用系统的图片尺寸要尽量地小，并且要能清楚地说明某件事情，一般都链接到某个具体的页面。</font></p>
<p goog_ds_charindex="4502"><font size="2" goog_ds_charindex="4503">（2）验证所有页面字体的风格是否一致。</font></p>
<p goog_ds_charindex="4525"><font size="2" goog_ds_charindex="4526">（3）背景颜色应该与字体颜色和前景颜色相搭配。</font></p>
<p goog_ds_charindex="4552"><font size="2" goog_ds_charindex="4553">（4）图片的大小和质量也是一个很重要的因素，一般采用JPG或GIF压缩，最好能使图片的大小减小到 30k 以下</font></p>
<p goog_ds_charindex="4611"><font size="2" goog_ds_charindex="4612">（5）最后，需要验证的是文字回绕是否正确。如果说明文字指向右边的图片，应该确保该图片出现在右边。不要因为使用图片而使窗口和段落排列古怪或者出现孤行。</font></p>
<p goog_ds_charindex="4689"><font size="2" goog_ds_charindex="4690">通常来说，使用少许或尽量不使用背景是个不错的选择。如果您想用背景，那么最好使用单色的，和导航条一起放在页面的左边。另外，图案和图片可能会转移用户的注意力。</font></p>
<p goog_ds_charindex="4770"><font size="2" goog_ds_charindex="4771">3.3内容测试 </font></p>
<p goog_ds_charindex="4782"><font size="2" goog_ds_charindex="4783">内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。</font></p>
<p goog_ds_charindex="4818"><font size="2" goog_ds_charindex="4819">信息的正确性是指信息是可靠的还是误传的。例如，在商品价格列表中，错误的价格可能引起财政问题甚至导致法律纠纷；信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行，例如使用Microsoft Word的"拼音与语法检查"功能；信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的信息列表或入口，也就是一般Web站点中的所谓"相关文章列表"。</font></p>
<p goog_ds_charindex="5006"><font size="2" goog_ds_charindex="5007">对于开发人员来说，可能先有功能然后才对这个功能进行描述。大家坐在一起讨论一些新的功能，然后开始开发，在开发的时候，开发人员可能不注重文字表达，他们添加文字可能只是为了对齐页面。不幸的是，这样出来的产品可能产生严重的误解。因此测试人员和公关部门一起检查内容的文字表达是否恰当。否则，公司可能陷入麻烦之中，也可能引起法律方面的问题。测试人员应确保站点看起来更专业些。过分地使用粗体字、大字体和下划线可能会让用户感到不舒服。在进行用户可用性方面的测试时，最好先请图形设计专家对站点进行评估。你可能不希望看到一篇到处是黑体字的文章，所以相信您也希望自己的站点能更专业一些。最后，需要确定是否列出了相关站点的链接。很多站点希望用户将邮件发到一个特定的地址，或者从某个站点下载浏览器。但是如果用户无法点击这些地址，他们可能会觉得很迷惑。</font></p>
<p goog_ds_charindex="5372"><font size="2" goog_ds_charindex="5373">3.4 表格测试 </font></p>
<p goog_ds_charindex="5385"><font size="2" goog_ds_charindex="5386">需要验证表格是否设置正确。用户是否需要向右滚动页面才能看见产品的价格？把价格放在左边，而把产品细节放在右边是否更有效? 每一栏的宽度是否足够宽，表格里的文字是否都有折行？是否有因为某一格的内容太多，而将整行的内容拉长?</font></p>
<p goog_ds_charindex="5498"><font size="2" goog_ds_charindex="5499">3.5 整体界面测试 </font></p>
<p goog_ds_charindex="5513"><font size="2" goog_ds_charindex="5514">整体界面是指整个Web应用系统的页面结构设计，是给用户的一个整体感。例如：当用户浏览Web应用系统时是否感到舒适，是否凭直觉就知道要找的信息在什么地方？整个Web应用系统的设计风格是否一致？ </font></p>
<p goog_ds_charindex="5613"><font size="2" goog_ds_charindex="5614">对整体界面的测试过程，其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式，来得到最终用户的反馈信息。</font></p>
<p goog_ds_charindex="5685"><font size="2" goog_ds_charindex="5686">对所有的用户界面测试来说，都需要有外部人员（与Web应用系统开发没有联系或联系很少的人员）的参与，最好是最终用户的参与。</font></p>
<p goog_ds_charindex="5749"><font size="2" goog_ds_charindex="5750">采取措施：手动测试，参与人员最好有外部人员</font></p>
<font size="2" goog_ds_charindex="5750">
<p goog_ds_charindex="5774"><font size="2" goog_ds_charindex="5775">4 兼容性测试 </font></p>
<p goog_ds_charindex="5786"><font size="2" goog_ds_charindex="5787">4.1 平台测试</font></p>
<p goog_ds_charindex="5798"><font size="2" goog_ds_charindex="5799">市场上有很多不同的操作系统类型，最常见的有Windows、Unix、Macintosh、Linux等。Web应用系统的最终用户究竟使用哪一种操作系统，取决于用户系统的配置。这样，就可能会发生兼容性问题，同一个应用可能在某些操作系统下能正常运行，但在另外的操作系统下可能会运行失败。 </font></p>
<p goog_ds_charindex="5943"><font size="2" goog_ds_charindex="5944">因此，在Web系统发布之前，需要在各种操作系统下对Web系统进行兼容性测试。 </font></p>
<p goog_ds_charindex="5986"><font size="2" goog_ds_charindex="5987">4.2 浏览器测试 </font></p>
<p goog_ds_charindex="6000"><font size="2" goog_ds_charindex="6001">浏览器是Web客户端最核心的构件，来自不同厂商的浏览器对Java，、JavaScript、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如，ActiveX是Microsoft的产品，是为Internet Explorer而设计的，JavaScript是Netscape的产品，Java是Sun的产品等等。另外，框架和层次结构风格在不同的浏览器中也有不同的显示，甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。</font></p>
<p goog_ds_charindex="6228"><font size="2" goog_ds_charindex="6229">测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中，测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。 </font></p>
<p goog_ds_charindex="6292"><font size="2" goog_ds_charindex="6293">4.3 分辨率测试</font></p>
<p goog_ds_charindex="6305"><font size="2" goog_ds_charindex="6306">页面版式在 640x400、600x800 或 1024x768 的分辨率模式下是否显示正常? 字体是否太小以至于无法浏览? 或者是太大? 文本和图片是否对齐?</font></p>
<p goog_ds_charindex="6389"><font size="2" goog_ds_charindex="6390">4.4 Modem/连接速率</font></p>
<p goog_ds_charindex="6407"><font size="2" goog_ds_charindex="6408">是否有这种情况，用户使用 28.8 modem下载一个页面需要 10 分钟，但测试人员在测试的时候使用的是 T1 专线? 用户在下载文章或演示的时候，可能会等待比较长的时间，但却不会耐心等待首页的出现。最后，需要确认图片不会太大。</font></p>
<p goog_ds_charindex="6526"><font size="2" goog_ds_charindex="6527">4.5 打印机</font></p>
<p goog_ds_charindex="6537"><font size="2" goog_ds_charindex="6538">用户可能会将网页打印下来。因此网也在设计的时候要考虑到打印问题，注意节约纸张和油墨。有不少用户喜欢阅读而不是盯着屏幕，因此需要验证网页打印是否正常。有时在屏幕上显示的图片和文本的对齐方式可能与打印出来的东西不一样。测试人员至少需要验证订单确认页面打印是正常的。</font></p>
<p goog_ds_charindex="6671"><font size="2" goog_ds_charindex="6672">4.6 组合测试</font></p>
<p goog_ds_charindex="6683"><font size="2" goog_ds_charindex="6684">最后需要进行组合测试。600x800 的分辨率在 MAC 机上可能不错，但是在 IBM 兼容机上却很难看。在 IBM 机器上使用 Netscape 能正常显示，但却无法使用 Lynx 来浏览。如果是内部使用的 web 站点，测试可能会轻松一些。如果公司指定使用某个类型的浏览器，那么只需在该浏览器上进行测试。如果所有的人都使用 T1 专线，可能不需要测试下载施加。(但需要注意的是，可能会有员工从家里拨号进入系统) 有些内部应用程序，开发部门可能在系统需求中声明不支持某些系统而只支持一些那些已设置的系统。但是，理想的情况是，系统能在所有机器上运行，这样就不会限制将来的发展和变动。</font></p>
<p goog_ds_charindex="6978"><font size="2" goog_ds_charindex="6979">采取措施：根据实际情况，采取等价划分的方法，列出兼容性矩阵</font></p>
<p goog_ds_charindex="7011">&nbsp;</p>
<p goog_ds_charindex="7012"><font size="2" goog_ds_charindex="7013">5 安全测试</font></p>
<p goog_ds_charindex="7022"><font size="2" goog_ds_charindex="7023">即使站点不接受信用卡支付，安全问题也是非常重要的。Web 站点收集的用户资料只能在公司内部使用。如果用户信息被黑客泄露，客户在进行交易时，就不会有安全感。</font></p>
<p goog_ds_charindex="7103"><font size="2" goog_ds_charindex="7104">5.1 目录设置</font></p>
<p goog_ds_charindex="7115"><font size="2" goog_ds_charindex="7116">Web 安全的第一步就是正确设置目录。每个目录下应该有 index.html 或 main.html 页面，这样就不会显示该目录下的所有内容。我服务的一个公司没有执行这条规则。我选中一幅图片，单击鼠标右键，找到该图片所在的路径"&#8230;com/objects/images"。然后在浏览器地址栏中手工输入该路径，发现该站点所有图片的列表。这可能没什么关系。我进入下一级目录 "&#8230;com/objects" ，点击 jackpot。在该目录下有很多资料，其中引起我注意的是已过期页面。该公司每个月都要更改产品价格，并且保存过期页面。我翻看了一下这些记录，就可以估计他们的边际利润以及他们为了争取一个合同还有多大的降价空间。如果某个客户在谈判之前查看了这些信息，他们在谈判桌上肯定处于上风。</font></p>
<p goog_ds_charindex="7458"><font size="2" goog_ds_charindex="7459">5.2 SSL</font></p>
<p goog_ds_charindex="7469"><font size="2" goog_ds_charindex="7470">很多站点使用 SSL 进行安全传送。你知道你进入一个 SSL 站点是因为浏览器出现了警告消息，而且在地址栏中的 HTTP 变成 HTTPS。如果开发部门使用了SSL，测试人员需要确定是否有相应的替代页面(适用于3.0 以下版本的浏览器，这些浏览器不支持SSL。当用户进入或离开安全站点的时候，请确认有相应的提示信息。是否有连接时间限制？超过限制时间后出现什么情况？</font></p>
<p goog_ds_charindex="7655"><font size="2" goog_ds_charindex="7656">5.3 登录</font></p>
<p goog_ds_charindex="7665"><font size="2" goog_ds_charindex="7666">有些站点需要用户进行登录，以验证他们的身份。这样对用户是方便的，他们不需要每次都输入个人资料。你需要验证系统阻止非法的用户名/口令登录，而能够通过有效登录。用户登录是否有次数限制? 是否限制从某些 IP 地址登录? 如果允许登录失败的次数为3，你在第三次登录的时候输入正确的用户名和口令，能通过验证吗? 口令选择有规则限制吗?&nbsp; 是否可以不登陆而直接浏览某个页面？</font></p>
<p goog_ds_charindex="7851"><font size="2" goog_ds_charindex="7852">Web应用系统是否有超时的限制，也就是说，用户登陆后在一定时间内（例如15分钟）没有点击任何页面，是否需要重新登陆才能正常使用。</font></p>
<p goog_ds_charindex="7919"><font size="2" goog_ds_charindex="7920">5.4 日志文件</font></p>
<p goog_ds_charindex="7931"><font size="2" goog_ds_charindex="7932">在后台，要注意验证服务器日志工作正常。日志是否记所有的事务处理? 是否记录失败的注册企图? 是否记录被盗信用卡的使用? 是否在每次事务完成的时候都进行保存? 记录IP 地址吗? 记录用户名吗?</font></p>
<p goog_ds_charindex="8031"><font size="2" goog_ds_charindex="8032">5.5 脚本语言</font></p>
<p goog_ds_charindex="8043"><font size="2" goog_ds_charindex="8044">脚本语言是常见的安全隐患。每种语言的细节有所不同。有些脚本允许访问根目录。其他只允许访问邮件服务器，但是经验丰富的黑客可以将服务器用户名和口令发送给他们自己。找出站点使用了哪些脚本语言，并研究该语言的缺陷。还要需要测试没有经过授权，就不能在服务器端放置和编辑脚本的问题。最好的办法是订阅一个讨论站点使用的脚本语言安全性的新闻组。　</font></p>
<p goog_ds_charindex="8212">&nbsp;</p>
<p goog_ds_charindex="8213"><font size="2" goog_ds_charindex="8214">6 接口测试</font></p>
<p goog_ds_charindex="8223"><font size="2" goog_ds_charindex="8224">在很多情况下，web 站点不是孤立。Web 站点可能会与外部服务器通讯，请求数据、验证数据或提交订单。</font></p>
<p goog_ds_charindex="8278"><font size="2" goog_ds_charindex="8279">6.1服务器接口</font></p>
<p goog_ds_charindex="8290"><font size="2" goog_ds_charindex="8291">第一个需要测试的接口是浏览器与服务器的接口。测试人员提交事务，然后查看服务器记录，并验证在浏览器上看到的正好是服务器上发生的。测试人员还可以查询数据库，确认事务数据已正确保存。</font></p>
<p goog_ds_charindex="8382"><font size="2" goog_ds_charindex="8383">这种测试可以归到功能测试中的表单测试和数据校验测试中</font></p>
<p goog_ds_charindex="8412"><font size="2" goog_ds_charindex="8413">6.2 外部接口</font></p>
<p goog_ds_charindex="8424"><font size="2" goog_ds_charindex="8425">有些 web 系统有外部接口。例如，网上商店可能要实时验证信用卡数据以减少欺诈行为的发生。测试的时候，要使用 web 接口发送一些事务数据，分别对有效信用卡、无效信用卡和被盗信用卡进行验证。如果商店只使用 Visa 卡和 Mastercard 卡， 可以尝试使用 Discover 卡的数据。(简单的客户端脚本能够在提交事务之前对代码进行识别，例如 3 表示 American Express，4 表示 Visa，5 表示 Mastercard，6 代表Discover。)通常，测试人员需要确认软件能够处理外部服务器返回的所有可能的消息。</font></p>
<p goog_ds_charindex="8698"><font size="2" goog_ds_charindex="8699">这种情况在远程抄表中可能会体现到</font></p>
<p goog_ds_charindex="8718"><font size="2" goog_ds_charindex="8719">6.3 错误处理</font></p>
<p goog_ds_charindex="8730"><font size="2" goog_ds_charindex="8731">最容易被测试人员忽略的地方是接口错误处理。通常我们试图确认系统能够处理所有错误，但却无法预期系统所有可能的错误。尝试在处理过程中中断事务，看看会发生什么情况？订单是否完成？尝试中断用户到服务器的网络连接。尝试中断 web 服务器到信用卡验证服务器的连接。在这些情况下，系统能否正确处理这些错误？是否已对信用卡进行收费？如果用户自己中断事务处理，在订单已保存而用户没有返回网站确认的时候，需要由客户代表致电用户进行订单确认。</font></p>
<p goog_ds_charindex="8945"><font size="2" goog_ds_charindex="8946">采取措施：在理解需求的基础上，充分发挥想象力，尽量比较全面的列出各种异常情况。</font></p>
<p goog_ds_charindex="8988">&nbsp;</p>
<p goog_ds_charindex="8989"><font size="2" goog_ds_charindex="8990">7 结论</font></p>
<p goog_ds_charindex="8997"><font size="2" goog_ds_charindex="8998">　&nbsp; 无论你在测试 internet、intranet 或者是 extranet 应用程序，web 测试相对于非 web 测试来说都是更具挑战性的工作。用户对 web 页面质量有很高的期望。在很多情况下，就像业务功能一样，页面用于维护和发展公共关系，所以第一印象非常重要。</font></font></font></p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/296662.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-27 16:07 <a href="http://www.blogjava.net/xiachang88/articles/296662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个不错的会计站点</title><link>http://www.blogjava.net/xiachang88/archive/2009/09/26/296571.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Sat, 26 Sep 2009 12:03:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/09/26/296571.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/296571.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/09/26/296571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/296571.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/296571.html</trackback:ping><description><![CDATA[http://v.ku6.com/show/8DYQ2WW9QQqHxexo.html
<img src ="http://www.blogjava.net/xiachang88/aggbug/296571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-26 20:03 <a href="http://www.blogjava.net/xiachang88/archive/2009/09/26/296571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>selectedIndex</title><link>http://www.blogjava.net/xiachang88/archive/2009/09/24/296310.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Thu, 24 Sep 2009 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/09/24/296310.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/296310.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/09/24/296310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/296310.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/296310.html</trackback:ping><description><![CDATA[selectedIndex是document.form.site的当前选择项的索引值，从0开始从上往下依次递增，没选中是-1<br />
简单的说你可以将列表框理解为一个数组，selectedIndex就是这个数组的索引值，它对应的就是列表中该位置显示的项&nbsp;<br />
<br />
<br />
eg:<br />
&nbsp; if(COMBO0PC.selectedIndex!=-1){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Workitem.variables.item("BF_MAIN_NAME").value = COMBO0PC.options[COMBO0PC.selectedIndex].text;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Workitem.variables.item("BF_MAIN_TYPE").value = COMBO0PC.value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Workitem.variables.item("BF_ACT_NAME").value = ' - ' + COMBO0PC.options[COMBO0PC.selectedIndex].text;<br />
&nbsp;&nbsp;&nbsp; }
<img src ="http://www.blogjava.net/xiachang88/aggbug/296310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-24 16:51 <a href="http://www.blogjava.net/xiachang88/archive/2009/09/24/296310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QQ菜单</title><link>http://www.blogjava.net/xiachang88/archive/2009/09/24/296300.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Thu, 24 Sep 2009 07:40:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/09/24/296300.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/296300.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/09/24/296300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/296300.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/296300.html</trackback:ping><description><![CDATA[CtListBar控件不能预先设置好分组和项目，只能动态的添加，所以我们在Form_Load()事件中加入代码，添加结果分组和项目。&nbsp; <br />
<br />
ctListBar1.AddList&nbsp;"陌生人"&nbsp; <br />
ctListBar1.AddList&nbsp;"黑名单"&nbsp; <br />
ctListBar1.AddListItem&nbsp;1,&nbsp;"My&nbsp;heart",&nbsp;ctListBar1.Image1&nbsp; <br />
ctListBar1.AddListItem&nbsp;1,&nbsp;"第七乐章",&nbsp;ctListBar1.Image2&nbsp; <br />
ctListBar1.AddListItem&nbsp;1,&nbsp;"小A",&nbsp;ctListBar1.Image3&nbsp; <br />
ctListBar1.AddListItem&nbsp;1,&nbsp;"小B",&nbsp;ctListBar1.Image4&nbsp; <br />
ctListBar1.AddListItem&nbsp;1,&nbsp;"张三",&nbsp;ctListBar1.Image5&nbsp; <br />
ctListBar1.AddListItem&nbsp;1,&nbsp;"李四",&nbsp;ctListBar1.Image6&nbsp;&nbsp; <br />
<br />
　　&nbsp;以上代码中，我们新添加了&#8220;陌生人&#8221;和&#8220;黑名单&#8221;两个分组，又在原先设置过的&#8220;我的好友&#8221;分组中添加了6个项目。&nbsp; <br />
<br />
　　&nbsp;提示：ctListBar1.AddListItem方法使用了3个参数，分别为nIndex（分组的Index值）、strText（项目的名称）、Picture（项目的图片）。&nbsp; <br />
<img src ="http://www.blogjava.net/xiachang88/aggbug/296300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-24 15:40 <a href="http://www.blogjava.net/xiachang88/archive/2009/09/24/296300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML页面-div层滚动列表-写法 </title><link>http://www.blogjava.net/xiachang88/articles/295982.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 22 Sep 2009 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/295982.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295982.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/295982.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295982.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295982.html</trackback:ping><description><![CDATA[<p>效果如下：<img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/babydavic/浮动滚动列表.jpg" /><br />
<br />
&lt;!-- Start of table 5:列表内容标题栏 --&gt;<br />
&nbsp; <font color="#ff0000">&lt;div style="WIDTH: 100%;&nbsp; HEIGHT: 255px; overflow-x:auto; overflow-y:hidden"&gt;&nbsp; 层代码<br />
</font><font color="#0000ff">&nbsp; &lt;!--一定要有这个大table包含，如果不然不产生作用--&gt;<br />
<br />
&nbsp; &lt;table width="160%" border="0" cellspacing="0" cellpadding="0"&gt;</font>&nbsp;&nbsp;<font color="#0000ff">&nbsp;<br />
</font>&nbsp;&nbsp;<font color="#0000ff">&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;<br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- 具体table使用html代码--&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#cc99ff"> &lt;table&gt;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;<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;标题<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;tr&gt;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&lt;td&gt;内容&lt;/td&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &lt;/table&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">&nbsp;&lt;!-- 具体table使用html代码--&gt;</font><br />
</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#0000ff">&nbsp;&nbsp; &lt;/td&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/tr&gt;</font><br />
&nbsp;&nbsp;&nbsp;<font color="#0000ff"> &lt;/table&gt;<br />
</font>&nbsp;<font color="#ff0000">&lt;/div&gt;</font>&nbsp;&nbsp; </p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/295982.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-22 11:08 <a href="http://www.blogjava.net/xiachang88/articles/295982.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate如何配置操作多个数据库</title><link>http://www.blogjava.net/xiachang88/articles/295981.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 22 Sep 2009 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/295981.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295981.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/295981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295981.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295981.html</trackback:ping><description><![CDATA[<p><span class="Title">Hibernate如何配置操作多个数据库</span><br />
&nbsp;<br />
Question:&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
引用:&nbsp;&nbsp;&nbsp; <br />
我现在在做一个项目，需要从两个数据库实例中存取数据，在用hibernate实现的过程中该如何配置和处理&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
--------------------------------------------------------------------------------&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
1、如果一个项目要从两个乃至多个数据库实例读取数据，该如何处理？&nbsp;&nbsp;&nbsp; <br />
2、如果只有一个数据库oraA，为其建立建立oraA.hbm.xml以及hibernate.properties文件，该文件中的数据库连接部分写为：&nbsp;&nbsp;&nbsp; <br />
##&nbsp; Oracle&nbsp;&nbsp;&nbsp; <br />
hibernate.dialect&nbsp; net.sf.hibernate.dialect.OracleDialect&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.driver_class&nbsp; oracle.jdbc.driver.OracleDriver&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.username&nbsp; username&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.password&nbsp; password&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.url&nbsp; jdbc:oracle:thin:@local:1521:ora&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
3、如有两个oracle数据库oraA和oraB，分别为其建立oraA.hbm.xml和oraB.hbm.xml映射文件，这样数据库中的各个表和实体持久化类就可以映射好，但是hibernate.properties中的数据库配置部分该如何处理呢，怎样才能同时连接上两个数据库实例呢？&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
&nbsp;<br />
如果用这个Configuration.configure(File&nbsp; configFile)&nbsp;&nbsp;&nbsp; <br />
configFile可以是不同的配置。&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
通过配置configFile可以得到每个数据库的configuration，&nbsp; 也就是可以获得每个数据库实例的session；但是在hibernate.properties文件中怎么写数据库连接部分呢，一个数据库的时候写法是：hibernate.connection.url&nbsp; jdbc:oracle:thin:@local:1521:ora&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
那如果有两个数据库实例呢，在hibernate.properties文件中怎么处理，总不会是写成如下吧：&nbsp;&nbsp;&nbsp; <br />
＃＃oracle&nbsp;&nbsp;&nbsp; <br />
hibernate.dialect&nbsp; net.sf.hibernate.dialect.OracleDialect&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.driver_class&nbsp; oracle.jdbc.driver.OracleDriver&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.username&nbsp; username&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.password&nbsp; password&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.url&nbsp; jdbc:oracle:thin:@local:1521:oraA&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.username&nbsp; usernamet&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.password&nbsp; passwordt&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.url&nbsp; jdbc:oracle:thin:@local:1521:oraB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
&nbsp;<br />
Answer:&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
写两个hibernate.properties，例如连接oraA的叫做hibernateA.properties，连接oraB的叫做hibernateB.properties。&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
hibernateA.properties内容如下：&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
引用:&nbsp;&nbsp;&nbsp; <br />
hibernate.dialect&nbsp; net.sf.hibernate.dialect.OracleDialect&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.driver_class&nbsp; oracle.jdbc.driver.OracleDriver&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.username&nbsp; username&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.password&nbsp; password&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.url&nbsp; jdbc:oracle:thin:@local:1521:oraA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
&nbsp;<br />
&nbsp;<br />
hibernateB.properties内容如下：&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
引用:&nbsp;&nbsp;&nbsp; <br />
hibernate.dialect&nbsp; net.sf.hibernate.dialect.OracleDialect&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.driver_class&nbsp; oracle.jdbc.driver.OracleDriver&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.username&nbsp; usernamet&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.password&nbsp; passwordt&nbsp;&nbsp;&nbsp; <br />
hibernate.connection.url&nbsp; jdbc:oracle:thin:@local:1521:oraB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
&nbsp;<br />
程序里面：&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
代码:&nbsp;&nbsp;&nbsp; <br />
java代码:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
Configuration&nbsp; conf_oraA&nbsp; =&nbsp; new&nbsp; Configuration("/hibernateA.properties").addClass().......;&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
Configuration&nbsp; conf_oraB&nbsp; =&nbsp; new&nbsp; Configuration("/hibernateB.properties").addClass().......;&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
SessionFactory&nbsp; sf_oraA&nbsp; =&nbsp; conf_oraA.buildSessionFactory();&nbsp;&nbsp;&nbsp; <br />
SessionFactory&nbsp; sf_oraB&nbsp; =&nbsp; conf_oraB.buildSessionFactory();&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
Session&nbsp; s_oraA&nbsp; =&nbsp; sf_oraA.openSession();&nbsp;&nbsp;&nbsp; <br />
Session&nbsp; s_oraB&nbsp; =&nbsp; sf_oraB.openSession();&nbsp;&nbsp;&nbsp; <br />
&nbsp;<br />
......&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;<br />
---------------------------------------------------------------&nbsp; <br />
&nbsp;<br />
更正一下&nbsp; <br />
方案一：&nbsp; <br />
写两个hibernate.cfg.xml&nbsp; <br />
使用数据库a的时候&nbsp; <br />
Configuration&nbsp; cfg_a=new&nbsp; Configuration().configure(hibernate.cfg_a.xml);&nbsp; <br />
使用数据库b的时候&nbsp; <br />
Configuration&nbsp; cfg_b=new&nbsp; Configuration().configure(hibernate.cfg_b.xml);</p>
<p>usr/home/zk1007874/htdocs/upload_files/images</p>
<p><br />
&nbsp; <br />
方案二：&nbsp; <br />
使用一个能操作两个数据库的账号，在?.hbm.xml映射文件中的class标签中指定catalog为数据库名</p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/295981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-22 11:07 <a href="http://www.blogjava.net/xiachang88/articles/295981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Filter使用介绍</title><link>http://www.blogjava.net/xiachang88/articles/295980.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 22 Sep 2009 03:06:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/295980.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295980.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/295980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295980.html</trackback:ping><description><![CDATA[<p>Filter作用 ：<br />
&nbsp;每当使用应用服务器页面或servlet的时候，应用服务器就会根据web.xml里面配置的filter 去进行过滤理。 <br />
&nbsp; <br />
调用处理过程就是：<br />
&nbsp;1.接受request-&gt;去处理第一个filter.init-&gt; 处理第一个filter.doFilter <br />
&nbsp;2.如果不想继续使用filter过滤就在filter.doFilter中使用 return<br />
&nbsp;&nbsp;3.如果要继续使用filter过滤就filter.doFilter中 chain.doFilter(servletRequest, servletResponse);</p>
<p>使用例子：<br />
&nbsp; 1.web.xml配置<br />
&nbsp; &lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;Filter_name&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;Filter_class_name&lt;/filter-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;set 'true' to enable the filter&lt;/description&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;enabled&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;true&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&lt;init-param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;param-name&gt;excepts&lt;/param-name&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;param-value&gt;Excepts_Path&lt;/param-value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/filter&gt;<br />
&nbsp;&lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;Filter_name&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;filter_path&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;Filter_name&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;filter_path&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt; </p>
<p>&nbsp;&nbsp; 2、java代码<br />
&nbsp;<br />
&nbsp;2.1 init 函数<br />
&nbsp;public void init(FilterConfig filterConfig) throws ServletException {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //检查是否打开SSOFilter功能<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String _enable = filterConfig.getInitParameter("enabled");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_enable != null &amp;&amp; "true".equalsIgnoreCase(_enable)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enabled = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //初始化例外列表，即不经过SSOFilter的请求地址<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String _exceptStr = filterConfig.getInitParameter("excepts");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (_exceptStr != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] _excepts = _exceptStr.split(",");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; _excepts.length; i ++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; excepts.add(_excepts[i]);<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; }<br />
&nbsp; <br />
&nbsp;2.2 doFilter函数<br />
&nbsp;public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,<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; FilterChain chain) throws IOException, ServletException {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request = (HttpServletRequest) servletRequest;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response = (HttpServletResponse) servletResponse;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String path = request.getServletPath();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 当WEB程序启了SSOFilter，并且请求的路径没被配置为例外时，<br />
&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; if (enabled &amp;&amp; !excepts.contains(path)) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (logger.isDebugEnabled()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.debug("check member has signoned ...");<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; boolean signOned = SSOHelper.hasSignOned(request, response);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (logger.isDebugEnabled()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.debug("Signoned? " + signOned);<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 (!signOned) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String SSOContextUri = SysParamHelper.getSysParam(SysParamConstants.CONTEXT_URI_SSO);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer url = new StringBuffer(SSOContextUri);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url.append("/Login");<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; url.append("?entrance=");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url.append(request.getRequestURL());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (request.getQueryString() != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url.append("|");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url.append(request.getQueryString());<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; response.sendRedirect(url.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<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; &nbsp;chain.doFilter(servletRequest, servletResponse);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/295980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-22 11:06 <a href="http://www.blogjava.net/xiachang88/articles/295980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Servlet生命周期</title><link>http://www.blogjava.net/xiachang88/articles/295978.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 22 Sep 2009 03:05:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/295978.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295978.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/295978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295978.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295978.html</trackback:ping><description><![CDATA[<p style="margin: 0cm 0cm 0pt"><font size="3"><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">以下内容摘自</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">&lt;&lt;</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">精通</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana"> servlet&gt;&gt;Servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">基础</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">Servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">容器（以前称</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">Servelt</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">引擎）实际上是执行</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">的软件。所有支持</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">的服务器包括一个</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servelt</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">容器（集成的或通过插件。）术语支持</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">java</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">的服务器常指一个增强的</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servletHTTP</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">服务器</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">(</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">即它包括一个用于运行</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">的</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana"> servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">容器</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">) Servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">生命周期：以下是一个服务器调用</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">的过程。</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana"> <br />
1</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">，</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">在服务器启动时，当</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">被客户首次请求或被配置好，</span><span style="font-size: 12.5pt; font-family: 宋体">这时由<span style="color: red">服务器加载</span></span><span style="font-size: 12.5pt; color: red; font-family: Verdana">servlet.Servlet</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">的加载</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">可以通过合用一个自定义的</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">Java</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">类加载工具（可允许自动</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">Servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">重载）从本地或远程地址来实现。这一步等同于</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana"> Class c = Class.forName(&#8220;com.sourceStream.MyServlet&#8221;);</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">这里用的术语加载指同时加载和初始化</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">的过程。<br />
</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">2</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">．</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">服务器创建一个</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">类实例来为所有请求服务</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">利用多线程，可以由单个</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">实例来服务于并行的请求</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">。惟一的例外是，因为实现</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">SingleThreadModel</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">接口的</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">，这样，服务器会创建一个实例池并从中选择一个来服务于每一新的请求。此步相当于以下</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">java</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">代码：</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">Servlet s = (Servlet)c.newInstance();<br />
3. </span><span style="font-size: 12.5pt; color: red; font-family: 宋体">服务器调用</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">Servlet</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">的</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">init</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">（）方法</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">。它用来保证完成在首次请求</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">处理以前的执行过程。如果</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">创建了多个</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">实例，则为每个实例调用一次</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">init()</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">方法。</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana"> <br />
4</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">．</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">服务器从包括在客户请求中的数据里构造一个</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">ServletRequest</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">或</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">HttpServletRequest</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">对象</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">，还构造一个</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">ServletResponse</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">或</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">HttpServletResponse</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">对象来返回响应提供方法。其参数类型依赖于</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">是否分别扩展</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">GenericServlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">或</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">HttpServlet.(</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">注意：如果服务器没有收到对这一</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">的请求，此步骤与以下</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">5---7</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">步骤将不会发生。</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">) <br />
5</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">．</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">服务器调用</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">的</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">service</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">（）方法</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">（对于</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">Httpservlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">，</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">service</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">（）将调用更为具体的方法：如：</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">doGet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">（）</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">或</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">doPost</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">（）），在此步骤中作为参数传递结构化对象。当并行的请求到来时，多个</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">service()</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">方法能够同时运行在独立的线程中。（除非</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">实现了</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">SingleThreadModel</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">接口）<br />
</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">6</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">通过分析</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">ServletReuest</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">或</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">HttpServletRequest</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">对象</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">Service()</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">方法处理客户的请求．并调用</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">ServletResponse</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">或</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">HttpServletResponse</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">对象来响应。</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana"> 7</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">．</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">如果服务器收到另一格对该</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">的请求，这个处理过程从</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">5</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">步骤重复</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">。</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana"> 8</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">．</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">一旦</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">容器检测到一个</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">要被卸载，这可能是因为要回收资源或因为它正在被关闭，服务器会在所有</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">的</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">service()</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">线程完成之后（或在服务器规定时间后）调用</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">的</span><span style="font-size: 12.5pt; color: red; font-family: Verdana">destroy()</span><span style="font-size: 12.5pt; color: red; font-family: 宋体">方法</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">。然后</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">就可以进行无用存储单元收集清理。</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">Servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">容器不需要为保留一个</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">而指定时间。</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">以上</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">8</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">个步骤就是</span><span style="font-size: 12.5pt; color: #333333; font-family: Verdana">servlet</span><span style="font-size: 12.5pt; color: #333333; font-family: 宋体">的生命周期。（</span></font></p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/295978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-22 11:05 <a href="http://www.blogjava.net/xiachang88/articles/295978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>获取文件路径方法</title><link>http://www.blogjava.net/xiachang88/articles/295977.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 22 Sep 2009 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/295977.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295977.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/295977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295977.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295977.html</trackback:ping><description><![CDATA[<p>获取类文件所在的真实路径<br />
1.this.getClass().getClassLoader().getResource("/").getPath(); <br />
2.this.getClass().getResource("/").getPath();<br />
注意：1.如果文件不存在的话，将会发生nullpointerException<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.如果想获取web-inf/classes的路径,可以通过"/."获取</p>
<p>获取web服务器所在的真实路径<br />
request.getContextPath();</p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/295977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-22 11:03 <a href="http://www.blogjava.net/xiachang88/articles/295977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IT从业人员想要提高薪酬水平的十种技能方法</title><link>http://www.blogjava.net/xiachang88/archive/2009/09/22/295973.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 22 Sep 2009 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/09/22/295973.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295973.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/09/22/295973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295973.html</trackback:ping><description><![CDATA[<p>［计世网消息］（胡杨　编译） IT招聘专家和工作场所专家总结了技术专业人员应该掌握的一些具体技能。这些技能会帮助IT专业人员避免工作的低谷和得到薪酬上涨的好处。下面就是让IT人员提高薪酬的10种方法。 </p>
<p>&nbsp;</p>
<p>1.熟悉SAAS产品 </p>
<p>&nbsp;</p>
<p>IT人员配备和随需应变的咨询公司Bluewolf的共同创始人和负责人Michael Kirven说，SAAS（软件服务）知识在用人要求条件中的比例已经从三年前的5%提高到了35%。拥有这方面知识的人可能很快提高自己的薪酬，无论他们是否知道alesforce、Google Apps或者WorkDay。每一个人都需要知道这些产品如何适合当前的IT架构。 </p>
<p>&nbsp;</p>
<p>2.获得SAP知识或者经验 </p>
<p>&nbsp;</p>
<p>位于费城的人才和外包服务公司Yoh Services复杂战略和营销的副总裁Jim Lanzalotto称，他支持拥有SAP技术的人，因为SAP技术顾问的需求量和现有人员之间的缺口有3至4万。 </p>
<p>&nbsp;</p>
<p>3.获得一个行业的垂直的技术专长 </p>
<p>&nbsp;</p>
<p>Kirven说，做一个Java程序员或者一个熟练的.Net开发人员就是一件很好的事情。但是，随着系统越来越复杂，企业不仅需要这些人学些这些编程语言，而且还要了解具体的垂直市场知识，如金融、零售或者媒体，并且了解所有这些知识。 </p>
<p>&nbsp;</p>
<p>4.获得一个虚拟化项目 </p>
<p>&nbsp;</p>
<p>IT job board Dice网站称，它看到招聘列表中对虚拟化知识人才的需求在过去的六个月里提高了40%，特别是需要了解VMware技术的人。 </p>
<p>&nbsp;</p>
<p>5.提高你的商务技能 </p>
<p>&nbsp;</p>
<p>Lanzalotto认为，商务经验对于提高IT专业人员的薪金水平是非常重要的。他说，最好的首席信息官不仅仅是一个技术人员，而且应该是能够在技术和业务两个方面都能够工作的业务人员。 </p>
<p>&nbsp;</p>
<p>6.获得开源软件产品开发经验 </p>
<p>&nbsp;</p>
<p>Kirven说，由于时代已经发生了变化，首席信息官采用MySQL和其它开源软件技术不会有失去工作的风险。事实上，业务人员经常会喜欢开源软件，因为它可能为公司省钱。 </p>
<p>&nbsp;</p>
<p>7.更近一步了解能够让你的公司赚钱的技术 </p>
<p>&nbsp;</p>
<p>在大型银行或者金融机构工作的人都知道你越接近能够让你的公司赚钱的技术，你的工作岗位对于你的公司就越重要。IT人员也是如此。参与让你的公司增加收入或者节省金钱的项目的IT人员很少会被人忽略。 </p>
<p>&nbsp;</p>
<p>8.首席信息官需要架构技能 </p>
<p>&nbsp;</p>
<p>Kirven称，IT架构是一个极好的职场道路，不仅因为这是一个高级的职位，而且还因为这些职位几乎完全是不会外包出去的。 </p>
<p>&nbsp;</p>
<p>9.付费参加项目管理认证学习的人 </p>
<p>&nbsp;</p>
<p>许多研究报名，虽然并非所有的证书都比印刷证书的成本值钱，但是，企业继续付出高价的费用聘用拥有关键证书的人才。其中最最主要的两个项目管理证书是PMP（项目管理专业人员）和PMO（项目管理办公室）。 </p>
<p>&nbsp;</p>
<p>10.跳槽 </p>
<p>&nbsp;</p>
<p>IT专业人员从一个地方搬迁的另一个地方的比例提高了20%。当你在你的技术专长领域寻求进一步发展时，换一个地理环境也许会有帮助。不同地区对于IT专业人员的技术需求是不同的</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/295973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-22 11:01 <a href="http://www.blogjava.net/xiachang88/archive/2009/09/22/295973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL 的JDBC连接测试程序</title><link>http://www.blogjava.net/xiachang88/articles/295972.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 22 Sep 2009 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/295972.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295972.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/295972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295972.html</trackback:ping><description><![CDATA[<p>import java.sql.*;</p>
<p>public class MysqlJdbc {<br />
&nbsp; public static void main(String args[]) {<br />
&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("org.gjt.mm.mysql.Driver");&nbsp;&nbsp;&nbsp;&nbsp; //加载MYSQL JDBC驱动程序&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Success loading Mysql Driver!");<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("Error loading Mysql Driver!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection connect = DriverManager.getConnection(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "jdbc:mysql://localhost/catmiw", "root", "");<br />
//连接URL为&nbsp;&nbsp; jdbc:mysql//服务器地址/数据库名<br />
//后面的2个参数分别是登陆用户名和密码<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Success connect Mysql server!");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Statement stmt = connect.createStatement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs = stmt.executeQuery("select * from pet");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (rs.next()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(rs.getString("name"));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; catch (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print("get data error!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }<br />
}</p>
<p>程序运行结果如下：<br />
Success loading Mysql Driver!<br />
Success connect Mysql server!<br />
a dog</p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/295972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-22 10:56 <a href="http://www.blogjava.net/xiachang88/articles/295972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache配置参考 </title><link>http://www.blogjava.net/xiachang88/articles/295969.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 22 Sep 2009 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/295969.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295969.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/295969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295969.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1．什么是Apache ？Apache，是一种开放源码的HTTP服务器，可以在大多数操作系统中运行，由于其多平台和安全性所以被广泛使用，是目前最流行的Web服务器软件之一。Apache 起初由 Illinois 大学 Urbana-Champaign 的国家高级计算程序中心开发，开始Apache只是作为Netscape网页服务器之外的选择。渐渐的，它开始在功能和速度上超越其它基于Unix的HT...&nbsp;&nbsp;<a href='http://www.blogjava.net/xiachang88/articles/295969.html'>阅读全文</a><img src ="http://www.blogjava.net/xiachang88/aggbug/295969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-22 10:50 <a href="http://www.blogjava.net/xiachang88/articles/295969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>整合Struts+Hibernate+Spring应用开发 Hibernate hql操作详解 </title><link>http://www.blogjava.net/xiachang88/articles/295967.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 22 Sep 2009 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/295967.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295967.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/295967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295967.html</trackback:ping><description><![CDATA[<h3>4.3 使用HQL查询</h3>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">Hibernate提供了异常强大的查询体系，使用Hibernate有多种查询方式。可以选择使用Hibernate的HQL查询，或者使用条件查询，甚至可以使用原生的SQL查询语句，此外还提供了一种数据过滤功能，这些都可用于筛选目标数据。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">下面分别介绍Hibernate的4种数据筛选方法：</p>
<h3>4.3.1 HQL查询</h3>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">HQL是Hibernate Query Language的缩写，HQL的语法很像SQL的语法，但HQL是一种面向对象的查询语言。因此，SQL的操作对象是数据表和列等数据对象，而HQL的操作对象是类、实例、属性等。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">HQL是完全面向对象的查询语言，因此可以支持继承和多态等特征。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">HQL查询依赖于Query类，每个Query实例对应一个查询对象。使用HQL查询可按如下步骤进行：</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">（1）获取Hibernate Session对象；</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">（2）编写HQL语句；</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">（3）以HQL语句作为参数，调用Session的createQuery方法创建查询对象；</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">（4）如果HQL语句包含参数，调用Query的setXxx方法为参数赋值；</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">（5）调用Query对象的list等方法遍历查询结果。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">看下面的查询示例：</p>
<p>public class HqlQuery</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args)throws Exception</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HqlQuery mgr = new HqlQuery();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用查询方法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mgr.findPersons();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用第二个查询方法</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mgr.findPersonsByHappenDate();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateUtil.sessionFactory.close();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; //第一个查询方法</p>
<p>&nbsp;&nbsp;&nbsp; private void findPersons()</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获得Hibernate Session</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session sess = HibernateUtil.currentSession();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //开始事务</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transaction tx = sess.beginTransaction();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //以HQL语句创建Query对象.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //执行setString方法为HQL语句的参数赋值</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Query调用list方法访问查询的全部实例</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List pl = sess.createQuery("from Person p where p.myEvents.title</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = :eventTitle")</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setString("eventTitle","很普通事情")</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .list();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //遍历查询的全部结果</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator pit = pl.iterator() ; pit.hasNext(); )</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Person p = ( Person )pit.next();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(p.getName());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //提交事务</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tx.commit();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateUtil.closeSession();</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; //第二个查询方法</p>
<p>&nbsp;&nbsp;&nbsp; private void findPersonsByHappenDate()throws Exception</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //获得Hibernate Session对象</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session sess = HibernateUtil.currentSession();</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transaction tx = sess.beginTransaction();</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //解析出Date对象</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date start = sdf.parse("2005-01-01");</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("系统开始通过日期查找人" + start);</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //通过Session的createQuery方法创建Query对象</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置参数</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回结果集</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List pl = sess.createQuery(</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "from Person p where p.myEvents.happenDate between :firstDate</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and :endDate")</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setDate("firstDate",start)</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .setDate("endDate",new Date())</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .list();</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //遍历结果集</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator pit = pl.iterator() ; pit.hasNext(); )</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Person p = ( Person )pit.next();</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(p.getName());</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tx.commit();</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HibernateUtil.closeSession();</p>
<p style="line-height: 12pt">&nbsp;&nbsp;&nbsp; }</p>
<p style="line-height: 12pt">}</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">通过上面的示例程序，可看出查询步骤基本相似。Query对象可以连续多次设置参数，这得益于Hibernate Query的设计。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">通常，setXxx方法的返回值都是void，但Hibernate Query的setXxx方法返回值是Query本身。因此，程序通过Session创建Query后，直接多次调用setXxx方法为HQL语句的参数赋值，再直接调用list方法返回查询到的全部结果即可。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">Query还包含两个方法：</p>
<p>&nbsp;&nbsp; ● setFirstResult（int firstResult），设置返回的结果集从第几条记录开始。</p>
<p>&nbsp;&nbsp; ● setMaxResults（int maxResults），设置本次查询返回的结果数。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">这两个方法用于实现Hibernate分页。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">下面简单介绍HQL语句的语法。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">HQL语句本身是不区分大小写的。也就是说，HQL语句的关键字和函数都是不区分大小写的。但HQL语句中所使用的包名、类名、实例名和属性名都区分大小写。</p>
<h3>4.3.2 HQL查询的from子句</h3>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">from子句是最简单的HQL语句，也是最基本的HQL语句。from关键字后紧跟持久化类的类名。例如：</p>
<p style="line-height: 12pt">from Person</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">表明从Person持久化类中选出全部的实例。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">大部分时候，推荐为该Person的每个实例起别名。例如：</p>
<p>from Person as p</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">在上面的HQL语句中，Person持久化类中的实例的别名为p，既然 p是实例名，因此也应该遵守Java的命名规则：第一个单词的首字母小写，后面每个单词的首字母大写。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">命名别名时，as关键字是可选的，但为了增加可读性，建议保留。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">from后还可同时出现多个持久化类，此时将产生一个笛卡儿积或跨表的连接。</p>
<h3>4.3.3 HQL查询的select子句</h3>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">select子句用于确定选择出的属性，当然select选择的属性必须是from后持久化类包含的属性。例如：</p>
<p>select p.name from Person as p</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">select可以选择任意属性，不仅可以选择持久化类的直接属性，还可以选择组件属性包含的属性，例如：</p>
<p>select p.name.firstName from Person as p</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">select也支持将选择出的属性存入一个List对象中，例如：</p>
<p>select new list(p.name , p.address) from Person as p</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">甚至可以将选择出的属性直接封装成对象，例如：</p>
<p>select new ClassTest(p.name , p.address) from Person as p</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">前提是ClassTest支持p.name和p.address的构造器，假如p.name的数据类型是&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String，p.address的数据类型是String，则ClassTest必须有如下的构造器：</p>
<p>ClassTest(String s1, String s2)</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">select还支持给选中的表达式命名别名，例如：</p>
<p>select p.name as personName from Person as p</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">这种用法与new map结合使用更普遍。如：</p>
<p>select new map(p.name as personName) from Person as p</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">在这种情形下，选择出的是Map结构，以personName为key，实际选出的值作为value。</p>
<h3>4.3.4 HQL查询的聚集函数</h3>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">HQL也支持在选出的属性上，使用聚集函数。HQL支持的聚集函数与SQL完全相同，有如下5个：</p>
<p style="line-height: 16pt">&nbsp;&nbsp; ● avg，计算属性平均值。</p>
<p style="line-height: 16pt">&nbsp;&nbsp; ● count，统计选择对象的数量。</p>
<p style="line-height: 16pt">&nbsp;&nbsp; ● max，统计属性值的最大值</p>
<p style="line-height: 16pt">&nbsp;&nbsp; ● min，统计属性值的最小值。</p>
<p style="line-height: 16pt">&nbsp;&nbsp; ● sum，计算属性值的总和。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">例如：</p>
<p>select count(<sub>*</sub>) from Person</p>
<p>select max(p.age) from Person as p</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">select子句还支持字符串连接符、算术运算符以及SQL函数。如：</p>
<p>select p.name || "" || p.address from Person as p</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">select子句也支持使用distinct和all关键字，此时的效果与SQL中的效果完全相同。</p>
<h3>4.3.5 多态查询</h3>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">HQL语句被设计成能理解多态查询，from后跟的持久化类名，不仅会查询出该持久化类的全部实例，还会查询出该类的子类的全部实例。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">如下面的查询语句：</p>
<p>from Person as p</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">该查询语句不仅会查询出Person的全部实例，还会查询出Person的子类，如Teacher的全部实例，前提是Person和Teacher完成了正确的继承映射。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">HQL支持在from子句中指定任何Java类或接口，查询会返回继承了该类的持久化子类的实例或返回实现该接口的持久化类的实例。下面的查询语句返回所有被持久化的对象：</p>
<p>from java.lang.Object o</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">如果Named接口有多个持久化类，下面的语句将返回这些持久化类的全部实例：</p>
<p>from Named as n</p>
<p style="punctuation-trim: leading">注意：后面的两个查询将需要多个SQL SELECT语句，因此无法使用order by子句对结果集进行排序，从而，不允许对这些查询结果使用Query.scroll()方法。</p>
<h3>4.3.6 HQL查询的where子句</h3>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">where子句用于筛选选中的结果，缩小选择的范围。如果没有为持久化实例命名别名，可以直接使用属性名引用属性。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">如下面的HQL语句：</p>
<p>from Person where name like 'tom%'</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">上面HQL语句与下面的语句效果相同：</p>
<p>from Person as p where p.name like "tom%"</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">在后面的HQL语句中，如果为持久化实例命名了别名，则应该使用完整的属性名。两个HQL语句都可返回name属性以tom开头的实例。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">复合属性表达式加强了where子句的功能，例如如下HQL语句：</p>
<p>from Cat cat where cat.mate.name like "kit%"</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">该查询将被翻译成为一个含有内连接的SQL查询，翻译后的SQL语句如下：</p>
<p>select <sub>*</sub> from cat_table as table1 cat_table as table2 where table1.mate =</p>
<p>table2.id and table1.name like "kit%"</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">再看下面的HQL查询语句：</p>
<p>from Foo foo where foo.bar.baz.customer.address.city like"guangzhou%"</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">翻译成SQL查询语句，将变成一个四表连接的查询。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">=运算符不仅可以被用来比较属性的值，也可以用来比较实例：</p>
<p>from Cat cat, Cat rival where cat.mate = rival.mate</p>
<p>select cat, mate</p>
<p>from Cat cat, Cat mate</p>
<p>where cat.mate = mate</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">特殊属性（小写）id可以用来表示一个对象的标识符。（也可以使用该对象的属性名。）</p>
<p>from Cat as cat where cat.id = 123</p>
<p>from Cat as cat where cat.mate.id = 69</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">第二个查询是一个内连接查询，但在HQL查询语句下，无须体会多表连接，而完全使用面向对象方式的查询。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">id也可代表引用标识符。例如，Person类有一个引用标识符，它由country属性 与medicareNumber两个属性组成。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">下面的HQL语句有效：</p>
<p style="line-height: 13pt">from Person as person</p>
<p style="line-height: 13pt">where person.id.country = 'AU'</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp; and person.id.medicareNumber = 123456</p>
<p style="line-height: 13pt">from Account as account</p>
<p style="line-height: 13pt">where account.owner.id.country = 'AU'</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp; and account.owner.id.medicareNumber = 123456</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">第二个查询跨越两个表Person和Account。是一个多表连接查询，但此处感受不到多表连接查询的效果。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">在进行多态持久化的情况下，class关键字用来存取一个实例的鉴别值（discriminator value）。嵌入where子句中的Java类名，将被作为该类的鉴别值。例如：</p>
<p>from Cat cat where cat.class = DomesticCat</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">where子句中的属性表达式必须以基本类型或java.lang.String结尾，不要使用组件类型属性结尾，例如Account有Person属性，而Person有Name属性，Name有firstName属性。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">看下面的情形：</p>
<p>from Account as a where a.person.name.firstName like "dd%" //正确</p>
<p>from Account as a where a.person.name like "dd%" //错误</p>
<h3>4.3.7 表达式</h3>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">HQL的功能非常丰富，where子句后支持的运算符异常丰富，不仅包括SQL的运算符，还包括EJB-QL的运算符等。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">where子句中允许使用大部分SQL支持的表达式：</p>
<p>&nbsp;&nbsp; ● 数学运算符+、&#8211;、<sub>*</sub>、/ 等。</p>
<p>&nbsp;&nbsp; ● 二进制比较运算符=、&gt;=、&lt;=、&lt;&gt;、!=、like等。</p>
<p>&nbsp;&nbsp; ● 逻辑运算符and、or、not等。</p>
<p>&nbsp;&nbsp; ● in、not in、between、is null、is not null、is empty、is not empty、member of和not member of等。</p>
<p>&nbsp;&nbsp; ● 简单的case、case ... when ... then ... else ... end和case、case when ... then ... else ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end等。</p>
<p>&nbsp;&nbsp; ● 字符串连接符value1 || value2或使用字符串连接函数concat(value1 , value2)。</p>
<p>&nbsp;&nbsp; ● 时间操作函数current_date()、current_time()、current_timestamp()、second()、minute()、hour()、day()、month()、year()等。</p>
<p>&nbsp;&nbsp; ● HQL还支持EJB-QL 3.0所支持的函数或操作substring()、trim()、lower()、upper()、length()、locate()、abs()、sqrt()、bit_length()、coalesce()和nullif()等。</p>
<p>&nbsp;&nbsp; ● 还支持数据库的类型转换函数，如cast(... as ...)，第二个参数是Hibernate的类型名，或者extract(... from ...)，前提是底层数据库支持ANSI cast() 和extract()。</p>
<p>&nbsp;&nbsp; ● 如果底层数据库支持如下单行函数sign()、trunc()、rtrim()、sin()。则HQL语句也完全可以支持。</p>
<p>&nbsp;&nbsp; ● HQL语句支持使用？作为参数占位符，这与JDBC的参数占位符一致，也可使用命名参数占位符号，方法是在参数名前加冒号 :，例如 :start_date和:x1等。</p>
<p>&nbsp;&nbsp; ● 当然，也可在where子句中使用SQL常量，例如'foo'、69、'1970-01-01 10:00:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 01.0'等。</p>
<p>&nbsp;&nbsp; ● 还可以在HQL语句中使用Java public static final 类型的常量，例如eg.Color.TABBY。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">除此之外，where子句还支持如下的特殊关键字用法。</p>
<p>&nbsp;&nbsp; ● in与between...and可按如下方法使用：</p>
<p>from DomesticCat cat where cat.name between 'A' and 'B'</p>
<p>from DomesticCat cat where cat.name in ( 'Foo','Bar','Baz')</p>
<p>&nbsp;&nbsp; ● 当然，也支持not in和not between...and的使用，例如：</p>
<p>from DomesticCat cat where cat.name not between 'A' and 'B'</p>
<p>from DomesticCat cat where cat.name not in ( 'Foo','Bar','Baz' )</p>
<p>&nbsp;&nbsp; ● 子句is null与is not null可以被用来测试空值，例如：</p>
<p>from DomesticCat cat where cat.name is null;</p>
<p>from Person as p where p.address is not null;</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">如果在Hibernate配置文件中进行如下声明：</p>
<p>&lt;property name="hibernate.query.substitutions"&gt;true 1, false 0&lt;/property&gt;</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">上面的声明表明，HQL转换SQL语句时，将使用字符1和0来取代关键字true和false。然后将可以在表达式中使用布尔表达式，例如：</p>
<p>from Cat cat where cat.alive = true</p>
<p>&nbsp;&nbsp; ● size关键字用于返回一个集合的大小，例如：</p>
<p>from Cat cat where cat.kittens.size &gt; 0</p>
<p>from Cat cat where size(cat.kittens) &gt; 0</p>
<p>&nbsp;&nbsp; ● 对于有序集合，还可使用minindex与maxindex函数代表最小与最大的索引序数。同理，可以使用minelement与maxelement函数代表集合中最小与最大的元素。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如：</p>
<p>from Calendar cal where maxelement(cal.holidays) &gt; current date</p>
<p>from Order order where maxindex(order.items) &gt; 100</p>
<p>from Order order where minelement(order.items) &gt; 10000</p>
<p>&nbsp;&nbsp; ● 可以使用SQL函数any、some、all、exists、in操作集合里的元素，例如：</p>
<p>//操作集合元素</p>
<p>select mother from Cat as mother, Cat as kit</p>
<p>where kit in elements(foo.kittens)</p>
<p>//p的name属性等于集合中某个元素的name属性</p>
<p>select p from NameList list, Person p</p>
<p>where p.name = some elements(list.names)</p>
<p>//操作集合元素</p>
<p>from Cat cat where exists elements(cat.kittens)</p>
<p>from Player p where 3 &gt; all elements(p.scores)</p>
<p>from Show show where 'fizard' in indices(show.acts)</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">注意这些结构变量size、elements、indices、minindex、maxindex、minelement、maxelement 等，只能在where子句中使用。</p>
<p>&nbsp;&nbsp; ● where子句中，有序集合的元素（arrays, lists, maps）可以通过[ ]运算符访问。例如：</p>
<p>//items是有序集合属性，items[0]代表第一个元素</p>
<p>from Order order where order.items[0].id = 1234</p>
<p>//holidays是map集合属性，holidays[national day]代表其中一个元素</p>
<p>select person from Person person, Calendar calendar</p>
<p>where calendar.holidays['national day'] = person.birthDay</p>
<p>and person.nationality.calendar = calendar</p>
<p>//下面同时使用list 集合和map集合属性</p>
<p>select item from Item item, Order order</p>
<p>where order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11</p>
<p>select item from Item item, Order order</p>
<p>where order.items[ maxindex(order.items) ] = item and order.id = 11</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">在[]中的表达式甚至可以是一个算术表达式，例如：</p>
<p>select item from Item item, Order order</p>
<p>where order.items[ size(order.items) - 1 ] = item</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">借助于HQL，可以大大简化选择语句的书写，提高查询语句的可读性，看下面的HQL语句：</p>
<p>select cust</p>
<p>from Product prod,</p>
<p>&nbsp;&nbsp;&nbsp; Store store</p>
<p>&nbsp;&nbsp;&nbsp; inner join store.customers cust</p>
<p>where prod.name = 'widget'</p>
<p>&nbsp;&nbsp;&nbsp; and store.location.name in ( 'Melbourne', 'Sydney' )</p>
<p>&nbsp;&nbsp;&nbsp; and prod = all elements(cust.currentOrder.lineItems)</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">如果翻译成SQL语句，将变成如下形式：</p>
<p style="line-height: 13pt">SELECT cust.name, cust.address, cust.phone, cust.id, cust.current_order</p>
<p style="line-height: 13pt">FROM customers cust,</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp; stores store,</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp; locations loc,</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp; store_customers sc,</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp; product prod</p>
<p style="line-height: 13pt">WHERE prod.name = 'widget'</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp; AND store.loc_id = loc.id</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp; AND loc.name IN ( 'Melbourne', 'Sydney' )</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp; AND sc.store_id = store.id</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp; AND sc.cust_id = cust.id</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp; AND prod.id = ALL(</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT item.prod_id</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM line_items item, orders o</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE item.order_id = o.id</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AND cust.current_order = o.id</p>
<p style="line-height: 13pt">&nbsp;&nbsp;&nbsp; )</p>
<h3>4.3.8 order by子句</h3>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">查询返回的列表(list)可以根据类或组件属性的任何属性进行排序，例如：</p>
<p>from Person as p</p>
<p>order by p.name, p.age</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">还可使用asc或desc关键字指定升序或降序的排序规则，例如：</p>
<p>from Person as p</p>
<p>order by p.name asc , p.age desc</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">如果没有指定排序规则，默认采用升序规则。即是否使用asc关键字是没有区别的，加asc是升序排序，不加asc也是升序排序。</p>
<h3>4.3.9 group by子句</h3>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">返回聚集值的查询可以对持久化类或组件属性的属性进行分组，分组所使用的group by子句。看下面的HQL查询语句：</p>
<p>select cat.color, sum(cat.weight), count(cat)</p>
<p>from Cat cat</p>
<p>group by cat.color</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">类似于SQL的规则，出现在select后的属性，要么出现在聚集函数中，要么出现在group by的属性列表中。看下面示例：</p>
<p>//select后出现的id出现在group by之后，而name属性则出现在聚集函数中</p>
<p>select foo.id, avg(name), max(name)</p>
<p>from Foo foo join foo.names name</p>
<p>group by foo.id</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">having子句用于对分组进行过滤，如下：</p>
<p>select cat.color, sum(cat.weight), count(cat)</p>
<p>from Cat cat</p>
<p>group by cat.color</p>
<p>having cat.color in (eg.Color.TABBY, eg.Color.BLACK)</p>
<p style="punctuation-trim: leading">注意：having子句用于对分组进行过滤，因此having子句只能在有group by子句时才可以使用，没有group by子句，不能使用having子句。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">Hibernate的HQL语句会直接翻译成数据库SQL语句。因此，如果底层数据库支持的having子句和group by子句中出现一般函数或聚集函数，HQL语句的having子句和order by 子句中也可以出现一般函数和聚集函数。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">例如：</p>
<p>select cat</p>
<p>from Cat cat</p>
<p>join cat.kittens kitten</p>
<p>group by cat</p>
<p>having avg(kitten.weight) &gt; 100</p>
<p>order by count(kitten) asc, sum(kitten.weight) desc</p>
<p style="punctuation-trim: leading">注意：group by子句与 order by子句中都不能包含算术表达式。</p>
<h3>4.3.10 子查询</h3>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">如果底层数据库支持子查询，则可以在HQL语句中使用子查询。与SQL中子查询相似的是，HQL中的子查询也需要使用()括起来。如：</p>
<p>from Cat as fatcat</p>
<p>where fatcat.weight &gt; ( select avg(cat.weight) from DomesticCat cat )</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">如果select中包含多个属性，则应该使用元组构造符：</p>
<p>from Cat as cat</p>
<p>where not ( cat.name, cat.color ) in (</p>
<p>&nbsp;&nbsp;&nbsp; select cat.name, cat.color from DomesticCat cat</p>
<p>)</p>
<h3>4.3.11 fetch关键字</h3>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">对于集合属性，Hibernate默认采用延迟加载策略。例如，对于持久化类Person，有集合属性scores。加载Person实例时，默认不加载scores属性。如果Session被关闭，Person实例将无法访问关联的scores属性。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">为了解决该问题，可以在Hibernate映射文件中取消延迟加载或使用fetch join，例如：</p>
<p>from Person as p join p.scores</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">上面的fetch语句将会初始化person的scores集合属性。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">如果使用了属性级别的延迟获取，可以使用fetch all properties来强制Hibernate立即抓取那些原本需要延迟加载的属性，例如：</p>
<p style="line-height: 12pt">from Document fetch all properties order by name</p>
<p style="line-height: 12pt">from Document doc fetch all properties where lower(doc.name) like '%cats%'</p>
<h3>4.3.12 命名查询</h3>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">HQL查询还支持将查询所用的HQL语句放入配置文件中，而不是代码中。通过这种方式，可以大大提供程序的解耦。</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">使用query元素定义命名查询，下面是定义命名查询的配置文件片段：</p>
<p>&lt;!-- 定义命名查询 --&gt;</p>
<p>&lt;query name="myNamedQuery"&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;!-- 此处确定命名查询的HQL语句 --&gt;</p>
<p>&nbsp;&nbsp;&nbsp; from Person as p where p.age &gt; ?</p>
<p>&lt;/query&gt;</p>
<p style="layout-grid-mode: char; text-indent: 21.25pt; line-height: 15.75pt; punctuation-trim: leading">该命名的HQL查询可以直接通过Session访问，调用命名查询的示例代码如下：</p>
<p>private void findByNamedQuery()throws Exception</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; //获得Hibernate Session对象</p>
<p>&nbsp;&nbsp;&nbsp; Session sess = HibernateUtil.currentSession();</p>
<p>&nbsp;&nbsp;&nbsp; //开始事务</p>
<p>&nbsp;&nbsp;&nbsp; Transaction tx = sess.beginTransaction();</p>
<p>&nbsp;&nbsp;&nbsp; System.out.println("执行命名查询");</p>
<p>&nbsp;&nbsp;&nbsp; //调用命名查询</p>
<p>&nbsp;&nbsp;&nbsp; List pl = sess.getNamedQuery("myNamedQuery")</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //为参数赋值</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; .setInteger(0 , 20)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //返回全部结果</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; .list();</p>
<p>&nbsp;&nbsp;&nbsp; //遍历结果集</p>
<p>&nbsp;&nbsp;&nbsp; for (Iterator pit = pl.iterator() ; pit.hasNext(); )</p>
<p>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Person p = ( Person )pit.next();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(p.getName());</p>
<p>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; //提交事务</p>
<p>&nbsp;&nbsp;&nbsp; tx.commit();</p>
<p>&nbsp;&nbsp;&nbsp; HibernateUtil.closeSession();</p>
<p>}</p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/295967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-22 10:47 <a href="http://www.blogjava.net/xiachang88/articles/295967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java的框架</title><link>http://www.blogjava.net/xiachang88/archive/2009/09/22/295965.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 22 Sep 2009 02:45:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/09/22/295965.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295965.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/09/22/295965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295965.html</trackback:ping><description><![CDATA[<p>　框架(Framework)是整个或部分系统的可重用设计，表现为一组抽象构件及构件实例间交互的方法;另一种定义认为，框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。</p>
<p>　　可以说，一个框架是一个可复用的设计构件，它规定了应用的体系结构，阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程，表现为一组抽象类以及其实例之间协作的方法，它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。</p>
<p>　　构件领域框架方法在很大程度上借鉴了硬件技术发展的成就，它是构件技术、软件体系结构研究和应用软件开发三者发展结合的产物。在很多情况下，框架通常以构件库的形式出现，但构件库只是框架的一个重要部分。框架的关键还在于框架内对象间的交互模式和控制流模式。</p>
<p>　　框架比构件可定制性强。在某种程度上，将构件和框架看成两个不同但彼此协作的技术或许更好。框架为构件提供重用的环境，为构件处理错误、交换数据及激活操作提供了标准的方法。</p>
<p>　　应用框架的概念也很简单。它并不是包含构件应用程序的 小片程序，而是实现了某应用领域通用完备功能(除去特殊应用的部分)的底层服务。使用这种框架的编程人员可以在一个通用功能已经实现的基础上开始具体的系 统开发。框架提供了所有应用期望的默认行为的类集合。具体的应用通过重写子类(该子类属于框架的默认行为)或组装对象来支持应用专用的行为。</p>
<p>　　应用框架强调的是软件的设计重用性和系统的可扩充性，以缩短大型应用软件系统的开发周期，提高开发质量。与传统的基于类库的面向对象重用技术比较，应用框架更注重于面向专业领域的软件重用。应用框架具有领域相关性，构件根据框架进行复合而生成可运行的系统。框架的粒度越大，其中包含的领域知识就更加完整。</p>
<p>　　框架，即framework.其实就是某种应用的半成品，就是一组组件，供你选用完成你自己的系统。简单说就是使用别人搭好的舞台，你来做表演。而且，框架一般是成熟的，不断升级的软件。</p>
<p>　　框架的概念最早起源于Smalltalk环境，其中最著名的框架是Smalltalk 80的用户界面框架MVC(Model -View-Controller)。随着用户界面框架Interviews [Linton 89]和ET++ [Weinand 89] 的开发和发布，框架研究越来越受到研究人员的重视。虽然框架研究最初起源于用户界面领域，但它还被成功地应用到其他领域中，如操作系统[Russo 90]、火警系统 [Molin 96a，Molin 96b] 等。Taligent公司于1992年成立后，框架研究受到了广泛的重视。该公司计划基于框架来开发一个完整的面向对象操作系统。另外，该公司还发布了一 套支持快速应用开发的工具集CommonPoint，其中包括了上百个面向对象框架 [Andert 94，Cotter 95].框架目前还没有统一的定义，其中Ralph Johnson所给出的定义基本上为大多数研究人员所接受：一个框架是一个可复用设计，它是由一组抽象类及其实例间协作关系来表达的 [Johnson 98].这个定义是从框架内涵的角度来定义框架的，当然也可以从框架用途的角度来给出框架的定义：一个框架是在一个给定的问题领域内，一个应用程序的一部分设计与实现[Bosch 97].从以上两个定义可以看出，框架是对特定应用领域中的应用系统的部分设计和实现，它定义了一类应用系统(或子系统)的整体结构。框架将应用系统划分为类和对象，定义类和对象的责任，类和对象如何互相协作，以及对象之间的控制线程。这些共有的设计因素由框架预先定义，应用开发人员只须关注于特定的应用系统特有部分。框架刻画了其应用领域所共有的设计决策，所以说框架着重于设计复用，尽管框架中可能包含用某种程序设计语言实现的具体类。</p>
<p>　　一个基于框架开发的应用系统包含一个或多个框架，与框架相关的构件类，以及与应用系统相关的功能扩展。与应用系统相关的扩展包括与应用系统相关的类和对象。应用系统可能仅仅复用了面向对象框架的一部分，或者说，它可能需要对框架进行一些适应性修改，以满足系统需求。</p>
<p>　　面向对象的框架作为一种可复用的软件，在基于框架的软件开发过程中会涉及到框架的开发和利用两个方面的工作。框架的开发阶段在于产生领域中可复用的设计。 该阶段的主要结果是框架以及与框架相关的构件类。该阶段的一个重要活动是框架的演变和维护。象所有软件一样，框架也易于变化。产生变化的原因很多，如应用 出错，业务领域变化，等等。</p>
<p>　　不论是哪一种技术，最终都是为业务发展而服务的。从业务的角度来讲。首先，框架的是为了企业的业务发展和战略规划而服务的，他服从于企业的愿景 (vision);其次，框架最重要的目标是提高企业的竞争能力，包括降低成本、提高质量、改善客户满意程度，控制进度等方面。最后，框架实现这一目标的 方式是进行有效的知识积累。软件开发是一种知识活动，因此知识的聚集和积累是至关重要的。框架能够采用一种结构化的方式对某个特定的业务领域进行描述，也 就是将这个领域相关的技术以代码、文档、模型等方式固化下来。</p>
<p>　　一、框架要解决的问题框架要解决的最重要的一个问题是技术整合的问题，在J2EE的 框架中，有着各种各样的技术，不同的软件企业需要从J2EE中选择不同的技术，这就使得软件企业最终的应用依赖于这些技术，技术自身的复杂性和技术的风险 性将会直接对应用造成冲击。而应用是软件企业的核心，是竞争力的关键所在，因此应该将应用自身的设计和具体的实现技术解耦。这样，软件企业的研发将集中在 应用的设计上，而不是具体的技术实现，技术实现是应用的底层支撑，它不应该直接对应用产生影响。</p>
<p>　　要理解这一点，我们来举一些例子：一个做视频流应用的软件企业，他为电广行业提供整体的解决方案。他的优势在于将各种各样的视频硬件、服务器、和管理结合起来，因此他扮演的是一个集成商的 角色。因此他的核心价值在于使用软件技术将不同的硬件整合起来，并在硬件的整合层面上提供一个统一的管理平台。所以他的精力应该放在解决两个问题：如何找到一种方法，将不同的硬件整合起来，注意，这里的整合并不是技术整合，而是一种思路上的整合。首先要考虑的绝对不是要使用什么技术，而是这些硬件需 要提供哪些服务，需要以什么样的方式进行管理。因此，这时候做的事情实际上是对领域进行建模。例如，我们定义任何一种硬件都需要提供两种能力，一种是统一 的管理接口，用于对所有硬件统一管理;另一种是服务接口，系统平台可以查询硬件所能够提供的服务，并调用这些服务。所以，设计的规范将会针对两种能力进 行。</p>
<p>　　另一个问题是如何描述这个管理系统的规范。你需要描述各种管理活动，以及管理中所涉及的不同实体。因为管理系统是针对硬件的管理，所以它是构架在硬件整合平台之上的。</p>
<p>　　在完成业务层面的设计之后，我们再来看看具体的技术实现。光有规范和设计是不够的，我们还需要选择一个优秀的技术。由于是对不同硬件的整合，我们想到采用Java提供的JMX技术。JMX技术适合用来进行系统整合，它定义了一个通用的规范，并给出了远程管理端口的一些默认实现。JMX已经经过了实践的检验，不少的应用服务器都采用了以JMX为基础的结构，例如有名的JBoss.JMX已经是一个很好的开始了，但是我们还需要在JMX的基础上再做一些工作。</p>
<p>　　二、什么要用框架?</p>
<p>　　因为软件系统发展到今天已经很复杂了，特别是服务器端软件，设计到的知识，内容，问题太多。在某些方面使用别人成熟的框架，就相当于让别人帮你完成一些基 础工作，你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟，稳健的，他可以处理系统很多细节问题，比如，事物处理，安全性，数据流控制等问 题。还有框架一般都经过很多人使用，所以结构很好，所以扩展性也很好，而且它是不断升级的，你可以直接享受别人升级代码带来的好处。</p>
<p>　　框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层。</p>
<p>　　软件为什么要分层?</p>
<p>　　为了实现&#8220;高内聚、低耦合&#8221;。把问题划分开来各个解决，易于控制，易于延展，易于分配资源&#8230;总之好处很多啦：)。</p>
<p>&nbsp;</p>
<p>本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/whhpaccp2008/archive/2009/09/21/4576616.aspx</p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/295965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-22 10:45 <a href="http://www.blogjava.net/xiachang88/archive/2009/09/22/295965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>复用：组件和服务 </title><link>http://www.blogjava.net/xiachang88/archive/2009/09/22/295963.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Tue, 22 Sep 2009 02:42:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/09/22/295963.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295963.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/09/22/295963.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295963.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295963.html</trackback:ping><description><![CDATA[&nbsp;我们经常谈到复用，在一个企业中，根据不同的场景，复用的形态和方式是不同的，大体可以分为组件复用和服务复用两种方式。组件是按照一定的标准封装的软件实体，可以是为完成某种功能提供的API的集合，也可以是完成某一个技术和业务功能的实体；服务是通过组件暴露出来的供外部调用的接口和协议信息。服务不包括具体功能逻辑实体，靠组件来实现。
<p>&nbsp;&nbsp; 企业架构中通常提到的技术复用和业务复用，可以简单地映射到组件和服务上。技术层面的复用一般是一些API、或者抽象出的框架，比如日志，它可以称之为组件，但是日志组件提供了记录日志的API，并没有包括具体的日志内容，我们在使用的时候是通过日志组件提供的API来记录相应的日志内容；再比如业界提供的一些框架，它是对应用的高度抽象，自身也不包括具体的应用或业务逻辑，这些需要我们在软件实施过程中自己灌输进去。并且技术层面的复用往往是每个系统中都有该组件的相应实体，比如A系统中会有日志组件、B系统中也会有日志组件。业务层面的复用通常采用调用服务的方式，是一种远程访问，业务服务通常在一个企业中物理上只有一个实体，其他的系统通过服务来调用，比如银行目前的渠道有网上银行、ATM、手机银行、电话银行、柜台等，这些系统中是没有存取款业务逻辑实体的，存取款的交易都是通过调用主机相应的服务来实现的。</p>
<p>&nbsp; 所以 对于组件和服务的管理其实也有不同那个的策略，组件要管理的是软件实体，服务管理的是服务的接口和协议信息，并且服务有一系列的特征，这个网上也有很多描述，可以根据不同需求调整服务的实现。当前服务的协议通常有WebService、HTTP、EJB等，对应其组件的实现可以采用不同的技术，比如Java、C/C++等等。</p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/295963.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-22 10:42 <a href="http://www.blogjava.net/xiachang88/archive/2009/09/22/295963.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个程序员的奋斗历程</title><link>http://www.blogjava.net/xiachang88/archive/2009/09/16/295327.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Wed, 16 Sep 2009 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/09/16/295327.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295327.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/09/16/295327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295327.html</trackback:ping><description><![CDATA[这些日子我一直在写一个实时操作系统内核，已有小成了，等写完我会全部公开，希望能够为国内IT的发展尽自己一份微薄的力量。最近看到很多学生朋友和我当年一样没有方向 ，所以把我的经历写出来与大家共勉，希望能给刚如行的朋友们一点点帮助。一转眼我在IT行业学习工作已经七年多了，这期间我做过网页，写过MIS、数据库，应用程序，做过通信软件、硬件驱动、协议栈，到现在做操作系统内核和 IC相关开发，这中间走了很多弯路，也吃了不少苦。 <br />
<br />
我上的是一个三流的高校，就连同一个城市的人多数都不知道。因为学校不好也就没有指望能靠学校名气找一个好工作。所有的希望都寄托在自己的努力上了，大一开学前的假期我就开始了学习，记得我买的第一本书是《计算机基础DOS3.0》，大家别吓着了，其实当时已经普及了DOS6.22了，只是我在书店里看到了DOS4.0，5.0，6.0的书，以为像英语那样是第四、五、六册，记得当时到处找DOS1.0，现在想想也幸好我没有找到：）开学前我学完了 PASCAL，那时既没有计算机也没有人可以请教，我连程序是什么的概念都没有，只好死记硬背代码，然后拿纸写，我一直到大三才有了一台486，在这之前用纸写了多少程序我也记不清楚了，只知道最长的一个我拿A4大小的草稿纸写了30 多页，我的C语言、C++ 、VC都是在这样的条件下入门的。所以说条件是可以克服的，希望我的经历多少给条件艰苦的同学们一点信心。第一次上机是在我姐夫的机房，我的心情激动的无与伦比，但是一上机我立刻傻了眼，他们用的是英文版的Win3.1，我的那点DOS知识都见了鬼，上机提心吊胆的一阵瞎摸，一不小心把Word弄成了全屏，怎么都还不了原，当时真是心急如焚，我以为机器被我弄坏了。第一个C语言程序，就是那个经典的HelloWorld，我调了几个星期，上机机会非常少，也没有书告诉我开发环境（TC2.0）需要设置，而且开始我都不知道有编译器，我甚至自作聪明把写好的程序扩展名从.c改成.exe，结果可想而知。大一学完了C、X86的汇编、数据结构、C++。由于精力都花在自学上了，大一下四门课挂了彩，三类学校就是这点好，挂上一二十门也照样毕业。不过扯远点说，我那么刻苦都及不了格，可见我们国家的计算机教育有多死板。 <br />
<br />
大二准备学VC和BC，当时难以取舍，后来选了VC，不为别的，只为书店里两本书，VC 那本便宜6块钱。我的努力在班上无人能及，学的日夜不分，大三有了计算机后更是如此，很多次父亲半夜教训我说我不要命了，我一直觉得自己基础差，记忆又不行，条件也不好，所以觉得只有多花点时间才能赶上别人。居然后来有许多朋友说我有学计算机的天赋，让我哭笑不得。我用的是486，16M内存，1G硬盘，当时同学们的配置都是P166MMX，我安装 一个Windows NT4.0需要一个通宵，编译一个BC5.0向导生成的程序需要近两个小时，我的显示器是个二手的，辐射非常大，开机屏幕冒火花，看起来很酷的：），有一次程序写的太久，觉得怎么白色的编辑器背景变成了紫色，以为显示器坏了，后来才发现眼睛不行了，不过说来也奇怪，到今天我的视力还能保持1.5，真是个奇迹。但是就是那台破机器陪伴了我两年，让我学会了VC、Delphi、SQLServer等。后来那台机器给我阿姨打字用，据她说一天她正打的开心，一股青烟夹着火苗从显示器钻出来，之后它才寿终正寝。 <br />
<br />
大三假期找了个机会在一个计算机研究所实习，与其说实习不如说是做义工，工作了两个月一分钱没有拿。但是这两个月对我的发展帮助很大，让我早一步了解了社会，刚去的时候我当然是一窍不通，在那里我熟悉了网络，学会了Delphi和Oracle。由于工作很认真，得到了比较好的评价，在一位长者的引荐下，我开始和他们一起做项目，这使我在大三大四就有了自己的收入，大四又找了两家MIS公司兼职，虽然钱不多，但是在学生期间有1000多的收入我已经非常满足了，我终于用自己赚的钱把计算机换了。大四下开始找工作，这时我的工作经验已经比较多（当然现在想想非常幼稚），开始听父母的想去那个研究所， 实习过那个部门也希望我能去，但是不知道为什么最后不了了之，这种单位就是比较官僚，我一气之下就到了我兼职的一个公司做MIS的TeamLeader。在大三到毕业一年的时间，做过了各种MIS，从煤气、烟厂、公安、铁路、饮食到高校，什么有钱做什么，工作也很辛苦，经常加班和熬通宵，从跟客户谈需求到设计、编码、测试、交付都要上。那时觉得很有成就感，觉得自己还不错，现在想想真是很肤浅。 <br />
<br />
刚走上工作岗位的学生很容易被误导，各种开发工具让人眼花缭乱，同时也觉得很受公司器重，但这样工作永远是一个低层次的开发者。不要跟我说什么系统分析有多么多么重要，多么多么难。你以为自己跟用户谈需求做设计就是系统分析和设计了吗，国内又有几个公司能够做的很到位很规范？我是ISO9000内审员，也在Rational公司受过多次培训，拿了4个证书，还有一个公司让我去做 CMM。这些我听过很多，但是很多事情到国内就变了性质，一个公司不是通过了ISO9000或者CMM就能规范了，我现在在一家有几十年历史的外企工作，里面的管理不是一般国内企业能及的。作为一个毕业不久以前没有步入过社会的学生，几乎不可能在很短的时间掌握系统分析和设计，面向对象、UML只是一个工具，关键是人本身的思想，不是说你熟悉了C++、Rose就能够做出好的设计，相反如果你具备了很高的素质，你可以用C写出比别人用C++更加模块化的程序。 <br />
<br />
话说远一些，国内软件开发行业有一个怪圈，很多人觉得VC &gt; Delphi &gt; VB，真是很搞笑。这几个软件我都做过开发，说白了他们都是工具，应该根据应用的需要选择采用哪个，而不是觉得哪个上层次。如果你因为用某个开发工具很有面子而选择的话，只能说明你很浅薄。如果说层次，那么这些工具都不上层次，因为它们用来用去都是一些系统的API，微软的朋友不会因为你记住他们多少个 API或者多少个类就会觉得你很了不起，你永远只是他们的客户，他们看重的是你口袋里的银子。我也做过系统内核，我也封装过很多API，同样我也不会看重那些使用这些API做二次开发的客户，除非他能够作出自己独到的设计。 <br />
<br />
至于有人认为C++ &gt; C那更是让人笑掉大牙，不妨你去打听一下，现在有几个操作系统内核是用C++写的，又有几个实时系统用的是C++，当然我也不是说C++不好，但是目前的内核和实时系统中C++还无法与C匹敌，至于说C++适合做应用系统的开发那是另外一回事。所以我的观点是不在于你用什么工具和语言，而在于你干什么工作。你的设计体现了你的技术层次。 <br />
<br />
这样干了一年我觉得非常苦闷，做的大多数都是熟练工种的活，个人技术上没有太多 的提高也看不到方向。所以决定离开这个城市去上海，寻求更好的发展，并且打算放弃我以前的MIS转到通信行业。 <br />
<br />
写到这里不能不提到我女朋友，我们是在来上海前半年认识的，她大四在我公司实习，公司派她给我写文档，我们的感情发展的很快。她告诉我很多事情，她家原本是改革开放的第一批暴发户，她母亲爱打牌，输掉了几百万，还欠了很多债，她有男朋友，但是她对他没有感情，只因为他给了她母亲两万多块钱，后来还强迫她写了四万块的借条，她男朋友背叛过她并且不止一次打她，现在逼她结婚不然就要她还钱。这人居然还是一个高校的老师！她母亲把父亲给她的学费花了，因为拖欠学费她没有办法拿到毕业证。她母亲现在有病需要钱，我拿出了自己的一点积蓄并且跟朋友们接了一些，替她交了学费并给她母亲看病（后来才知道看病的钱又不知所终，就连她母亲是不是有病我都不知道，但她也是没有办法）。这个时候我家知道了一些事情，坚决反对我和她在一起，她原来的男朋友也极力破坏。无奈之下我们决定早一定离开这个伤心的城市，并且瞒着我们家。由于时间仓促，我只准备了4000块钱，她仅有的几百块钱也被她母亲要去了，我买了三张票，一张是中午的，两张是晚上的，中午我的家人把我送上船，他们一离开我就下了船，我和她乘坐晚上的船离开了这个我和她生活了很多年的城市，带走的只是一身债务。没有来过上海的我们两个性倔强，都不愿意去麻烦同学和朋友。来到上海是傍晚6点半，我们都不知道该去哪里，我们找了一个20块钱的旅馆，这个房间连窗户都没有，7月份的天气酷热难耐，房间里非常闷热。第二天我们开始租房子，因为身上的钱不多，我们基本都是步行，花了一个星期时间，不知道在浦东转了多少圈后找到了一个400块的房子，但是我们都不了解上海是付三压一，还要付半个月的中介费，买了一些锅碗瓢盆后，我们身上只有800块钱了，工作都还没有着落，这800块钱要支持到我们拿到第一个月工资，为了省钱我们自己做饭，每天买菜只花两块钱，她非常喜欢吃（也可能她在大学经常挨饿的愿意），看到她现在这样省吃俭用我真的很不忍心。她以前的男朋友也没有放过她，经常打电话来骚扰，并且来上海看她，还说了不少恐吓她的话，她过于善良，说他以前毕竟帮助过她，叫我不要与他一般见识。以后的每天在家就是苦等面试通知，原本我想迅速找一家MIS公司解决眼前的困难，但是她坚持让我不要放弃自己的理想，终于功夫不负有心人，我找到了一家通信公司，4000块的工资虽然赶不上MIS公司给我开出的价位，但也够在上海生存。她也找到了工作，第一天上班她哭了，这是她来上海第一次流泪，我心里很难受也很感动。 <br />
由于是全新的行业，我把自己降到了零点，我学的VC、Delphi、数据库派不上用场，摆在我面前的是嵌入式、协议、信令一些我从未接触过的知识。我知道我没有退路，于是拼命的学习，我把自己当做一个应届毕业生一样，一分努力一分收获，半年过去我终于熟悉了工作，并且得到了公司的表彰，薪水也加了一级。后面的日子里我们省吃俭用，把欠朋友的1万多块钱还了，日子终于上了正轨。这时女朋友告诉我她想考研究生，我也很支持，于是她辞职在家备考。 <br />
<br />
另外，在这里我要感谢我的ProjectManager，他原来是一个大通信公司的产品经理，对人非常和善，我从他那里学到了很多知识，而且他也给了我许许多多无私的帮助。在工作上他给我充分的空间和信任。记得公司安排我维护一个接入服务器软件，由于代码量不算太小（5万行），资料和文档都不齐全，我维护起来非常吃力，所以想重新把它做一遍，公司领导不太支持，可能觉得工作量太大，但是他极力支持我，私下里他让我放手去做，我的维护工作他挤时间做。在他的支持下，我花了半年时间完成了接入服务器的软件，并且实现了一个相对完整的TCP/IP协议栈。在这里我学会了嵌入式系统设计、驱动开发、TCP/IP和很多通信的知识，我花了一年时间终于使自己从MIS开发转到了通信行业，并且站稳了脚跟。我的开发大量是对硬件的直接操作，不再受微软的操作系统，VC、Delhpi这些开发工具的约束，我终于看到了另外一片天空。 <br />
<br />
我做事情喜欢追根问底，随着开发的深入，软件开发与硬件联系越来越紧密，硬件知识的匮乏又对我的发展产生了障碍，而且芯片技术基本上掌握在国外公司的手里，这对做系统级设计是一个非常大的制约，一个新产品出来，第一道利润（也往往是最丰厚的利润）常常都被IC公司如Intel、Motorola赚去了，国内的厂商只能喝点汤。所以我决心解决自己的硬件技术障碍，并打算离开通信行业，进入IC设计相关领域。 <br />
<br />
当然我明白如果我对硬件了解的非常少，没有哪家IC公司会仁慈到招我这样一个一窍不通的人来培训。所以我必须努力打好基础，学一些相关知识为以后做准备。就像我开始从MIS转到通信一样，我看过大量通信方面的书，并且给一个ISP做过RADIUS计费分拣台，在这样的背景下这家通信公司才给了我这个机会。我在的通信公司是做系统设计的，有不少PCB Layout硬件人员，平常我就注意向他们学习，由于我做的是软件，在公司看硬件资料不好意思，所以开始只好在家看，刚来上海工作我连续一年都在加班，后来不加了，因为我要挤出时间学习，通常我12点左右睡，第二天5点半起，我上班比较早，地铁上如果人不多我也用来看书。学习当然不会是一帆风顺的，有些实在不懂的问题就积累起来问硬件人员，他们的帮助使我学习进度快了很多，因为在没有人点拨的情况下自学，我的一半时间是花在解决疑难问题上，但这种问题经常是别人的一句话就可以让我豁然开朗，我非常庆幸我有这样的学习环境。在后面的一年里，我学会了看硬件原理图，学会了简单的硬件设计（模拟电路方面还有不小的差距），事情就是这样的，当你安安份份做软件，别人永远认为你是软件开发人员，在你开始学习硬件时别人未必会认同，有位中兴通讯的朋友还对我说过，一个人不可能把所有东西都学完。我也明白这一点，但我希望自己做的更好。但当你熟悉硬件后大家又会觉得你好像原本就是软硬件都懂的，同事们也都习以为常了。这个时候我可以把硬件资料堂堂正正的拿到公司看，没有人再大惊小怪了。让我比较自豪的是我通过自己的努力做了一个IAD（软交换的终端设备）系统方案，包含软硬件的选型、设计等内容，这个方案得到了公司和同事们的认同，让我感到非常欣慰。 <br />
<br />
技术是相辅相成的，当我的硬件有了一定的进步后，我的软件设计也有了很大的提高，我可以从更深层次理解问题，我做的接入服务器CPU是Motorola PowerPC860，熟悉的朋友都知道860 QMC与软件的批量数据传输通常采用BD表的方式，硬件人员做驱动的时候习惯采用固定BD表，每接收或发送数据都将数据从BD表拷贝到用户Buffer，或从用户Buffer拷贝到BD表，由于理解的比较深入，我自己重新实现了这个过程，采用动态BD表的方式，驱动从一个网口接收数据，提交给我的软件进行三层交换，直至从另外的接口发送出去，没有进行一次拷贝。这样的设计大大提高了性能，使系统的指标接近理论值。软硬件的结合使我的设计水平上了一个台阶。我现在写的这个操作系统，编译后我把程序反编译成汇编，找出其中不优化的代码，然后在C程序中进行调整。举个例子，很多CPU没有专门的乘法指令，这个大家应该都知道，在这种CPU上进行一个乘法操作常常会花费大量的指令周期，有的朋友会说这个我知道，我会尽量避免采用&#215;号，但是事情往往不是那么简单，你知道C语言中数组的下标操作是怎么实现的吗？仔细看看反汇编的代码你就会明白，同样是通过下标的定位操作，C编译器会有时候会产生位移指令，但有时候会用乘法实现，两者效率往往是天壤之别，所以明白这些问题你才能将系统性能提升到极致。一些问题就不多说了，有兴趣的话以后可以共同探讨。 <br />
<br />
话说远一点，我由衷的希望在软件上做的比较深入的朋友们有机会学学硬件以及其它相关知识，尤其是做底层开发和嵌入式设计的。这对软件技术的提高有非常大的帮助，否则很多事情你只知道该这样但不会明白为什么该这样。我这个观点在我现在的IC公司Project Manager那里也得到了验证。他告诉我们公司现在的802.11芯片产品的软件经理原本是做该芯片硬件设计的，某某某原本是做软件的，现在在做IC，类似的例子还有很多，只是在国内这样的风气不是非常流行。 <br />
<br />
我有一些心得体会与大家分享，只有当我干好本职工作后，我才会学习与工作关系不大的技术，这样公司的上司才不至于反感，在入门阶段的问题我通常不去问那些资深人士，而是问一些资历比较浅的朋友，比如刚毕业不久的学生，因为他们往往会跟你详细的讲解，而资深人士通常觉得你的问题太简单，所以回答的也很简单，我又不好意思多问。等技术上了一定的层次后我才会问他们，他们也能给你比较深入的回答。另外，有些朋友说我机会比较好，他们也希望能从事新的工作可惜没有机会，我听了只有苦笑，我的机会了解的人都应该知道，我没有出生在什么IT世家：）也没有谁一路提拔我，所有的路都是自己走出来的，我母亲去世比较早，我的后母（我叫她阿姨）看着我努力过来的，一次她看我大年30还在写程序，她说像我这样努力木头都能学出来。 <br />
<br />
我的最终目的是IC而不是PCB，所以我下一步的准备开始学习IC设计的知识。公司的同事没有懂IC设计的，后面的路又要靠自己了，我买了不少相关的书，在网上也查了很多的资料，我花了大量的时间去学习VHDL，并且用软件进行了一些简单的设计和仿真（没有设计ASIC，只是针对FPGA），随着学习的深入，我渐渐明白了IC设计的基本流程，同时也明白了这条路的艰辛。这个时候我已经做好了跳槽的准备，我向一家业界又一定知名度的IC设计公司投了简历，并通过了漫长的面试（4个多小时）。其他的一切我都比较满意，唯独薪资差强人意，我也明白原因，因为我是这个行业的新人，我没有经验，我再一次将自己清零了。公司老板问我6000多一个月能不能接受，我知道他也是照章办事。想想我通信行业的朋友们，基本上都是年薪10万以上，月薪过万的也比比皆是，朋友们也帮我介绍了不少待遇不错的公司，我该怎么选择，当时我很犹豫，我热爱我的事业，我向往我的追求，但我也是一个普通的人，我也需要养家糊口，我也想早一点买房买车。生活给我出了一道难题。 <br />
<br />
爱因斯坦在63岁时说过&#8220;一个人没有在30岁以前达成科学上的最大成就，那他永远都不会有。&#8221;这句话给了我很大的压力和震动，我马上就26岁了，离30只有四年时间，我必须抓紧这几年宝贵的时间，努力达到我技术上的最高峰。为了这个理想，为了能离自己的梦更近一些，我选择了这家IC公司，我明白自己的薪资和公司刚进来的硕士研究生相差无几，但为了今后的发展只能忍受，一切又得重新开始。换行业是一个非常痛苦的过程，尤其从一个春风得意的位置换到一个陌生的岗位，感觉像从温暖的被子里钻出来跳进冰水中，让人难以接受。在原来那家通信公司，我是唯一两年时间涨了五次工资的员工，公司和同事都给了我极大的认可，工作上也常常被委以重任。但现在这一切都成了过去，在新的公司我只是一个新人,没有人知道也没有人在意我过去的成绩。我决定重新开始，我把自己看作新毕业的学生，我要用自己的努力得到公司的认可。进入新的行业是非常痛苦的，我告诉自己必须忍受这一切，虽然外面有很多诱惑，但是既然作出了选择我就不允许自己轻易放弃。 <br />
我现在已经在这家新公司上了一个多月的班，开始非常艰难，现在慢慢适应了。第一 个月结束时，Team Leader找我谈话，说我是新进员工中最优秀的一个，我心里很欣慰，这也算对我努力的一个肯定吧。在这里还要感谢我的女朋友，她给了我很大的支持和鼓舞，每次在我动摇的时候她都在鼓励我，让我坚持自己的理想，刚来上海是她让我不要勉强去做MIS，这次也是她让我顶住了月薪过万的诱惑，没有她我可能不会有今天的成绩。现在的公司有自己的操作系统，自己的CPU、DSP和其它芯片，在这里我能学到世界上最先进的技术，我们的设计开发不再完全依赖别人的硬件和系统，这让我很开心。我打算等工作步入正轨后，全力学习新的知识，实现我的理想。 <br />
<br />
在后面的两年里我给自己定下了几个目标： <br />
<br />
一.努力做好本职工作，在工作上得到公司和同事们的认同； <br />
<br />
二.努力学习IC硬件设计知识，多向同事请教，并利用一切机会多实践； <br />
<br />
三.实现我的实时操作系统的主要部分，完成TCP/IP协议栈模块，并免费发布源代码； <br />
<br />
四.和我女朋友结婚并买一套小房子，这是最重要的，因为我明白事业是可以重来的，但是珍贵的感情很难失而复得。 <br />
<br />
在这里提一下我现在开发的操作系统，它是一个实时嵌入式系统，目前支持以下特性： <br />
<br />
a.支持时间片轮转调度和基于优先级调度，最多64个优先级； <br />
<br />
b.抢占式实时内核； <br />
<br />
c.为了便于移植，主体用标准C实现； <br />
<br />
d.汇编代码非常少，不到100行； <br />
<br />
e.支持任务管理，各任务有独立的堆栈； <br />
<br />
f. 进程同步和通信目前完成了Semaphore，Message Queue正在调试； <br />
<br />
g.实现了定时系统调用； <br />
<br />
h.可以在windows上仿真调试 <br />
<br />
我还打算下一步实现优先级反转保护，Event Flag，Data Pipe，内存管理（以前实现过）、驱动接口等。 在这之后我还会努力完善它，比如加入文件系统，协议栈、调试接口等。希望朋友们提出自己的意见和建议，在此不胜感激！ <br />
<br />
<br />
后记： <br />
<br />
就像有的朋友说的，我的经历或许会给一些朋友产生误导，在这里我必须说明一下。我来上海以前学习过于拼命，常常晚上只睡3个多小时，我身高1米71，那时只有108斤（我现在130多），家人也说我这样拼命活不过60岁，但是当时的我太固执，我对他们说只要能实现理想活50岁我就够了。那时的拼命使我的身体受到了影响，有一次早上突然腰肌剧痛难忍，痛的我倒在床上站不起来。虽然我现在已经比较注意，但有时候还会隐隐作痛。后来在女朋友说服了我，来上海以后我不再如此。我经常引用父亲的一句话&#8220;身体是革命的本钱&#8221;。 <br />
<br />
而且我也发现拼命不是办法，我可以熬一两个通宵，最多的一次我连续工作了三天三夜，但是我半个月都没有恢复过来，这样是不是得不偿失？学习工作应该是一个长期的过程，像马拉松而不是百米冲刺。我现在非常注意调整学习和工作的强度，我要保证每天尽量有相对充沛的精力，一些年轻的朋友觉得自己也应该拼命努力，这让我多少有些担心，如果我的故事能让你在学习工作上多一点兴趣，我会感到很开心，但如果误导了某些朋友，让你做一些不值得的付出，我会感到很内疚。 <br />
<br />
技术没有贵贱之分，我以前换行业是因为自己的兴趣所致，而不是对哪个行业有什么偏见。我希望我的经历不要给朋友一个错误的导向，觉得我始终向更高的技术发展。其实各行各业做到顶尖都是很困难的。话又说回来虽然技术没有贵贱，但是门槛是有高低的，无论如何，做IC的门槛要比做网页的高，这一点无可否认。国家各种人才都是需要的，但是作为个人奋发向上的想法还是应该有的，努力在自己喜欢的行业上做的更好，而不应该停留在比较肤浅的层次上。 <br />
<br />
我是一个自己觉得比较有自知之明的人，或许我最大的优点就是知道自己有很多缺点：）。我的故事中很多的曲折和错误都是由我的缺点造成的，希望大家用审慎的眼光看待我的经历，不要被我的&#8220;花言巧语&#8221;所迷惑。我学习有些随心所欲，这给我带来了无尽的麻烦，也大大阻碍的我的发展。记得我小时候成绩比较出色，但是后来学习严重偏科，导致我中学成绩一再滑坡，也没有考上什么好的学校，小时候的一个朋友，当时的成绩和我相仿，但是没有我这个缺点，她上了清华，后来在去了美国深造，在一个著名导师手下研究理论科学，这未尝不是一条更好的出路。另外我的学习方法也是在不断改善中的，过去的学习过于讲究数量和时间，那样学习既苦而已效率不高，现在我非常注意学习的效率和技巧，这样才是学习的捷径（当然不是指投机取巧），比如说学一相对陌生的技术，如果有条件，不妨问一问有经验的人，不需要问很多，往往他不经意的几句话会给你非常大的帮助，甚至超过你看一个星期的书。带着这样的思想再去学习你会节省很多时间，这样何乐不为呢？这些年中我学了不少的东西，由于开始非常盲目，所以学的东西杂乱无章，现在回想起来让我啼笑皆非，我把大量的时间浪费在一些没有必要深入了解的知识上，毕竟一个人的精力是有限度的。很多朋友很我一样都背过五笔字形，的确它是个不错的输入法，但是对一个研发人员它绝对不值得你去背，你的时间应该花在有价值的地方。我这样的事情还做过很多，我背过CCED、WPS的命令和快捷键，在dBase基本退出历史舞台后我还花了很多时间去学习它的使用。所以我的学习在前期缺乏规划，没有明确的短期目的、中期目标，只有一个虚无飘渺的长期的理想。这就像做设计一样，好的设计是从需求抽象到代码有很多过程，而不能得到了需求就立刻开始编码。
<img src ="http://www.blogjava.net/xiachang88/aggbug/295327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-16 15:54 <a href="http://www.blogjava.net/xiachang88/archive/2009/09/16/295327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache和tomcat有什么 区别？</title><link>http://www.blogjava.net/xiachang88/articles/295325.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Wed, 16 Sep 2009 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/295325.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295325.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/295325.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295325.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295325.html</trackback:ping><description><![CDATA[apache:侧重于http&nbsp;&nbsp; server&nbsp;&nbsp; <br />
tomcat:侧重于servlet引擎，如果以standalone方式运行，功能上与apache等效 ， 支持JSP，但对静态网页不太理想； <br />
apache是web服务器，tomcat是应用（java）服务器，它只是一个servlet(jsp也翻译成servlet)容器，可以认为是apache的扩展，但是可以独立于apache运行。<br />
换句话说，apache是一辆卡车，上面可以装一些东西如html等。但是不能装水，要装水必须要有容器（桶），而这个桶也可以不放在卡车上。 
<img src ="http://www.blogjava.net/xiachang88/aggbug/295325.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-16 15:47 <a href="http://www.blogjava.net/xiachang88/articles/295325.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORM的原理</title><link>http://www.blogjava.net/xiachang88/articles/295319.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Wed, 16 Sep 2009 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/articles/295319.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295319.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/articles/295319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295319.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295319.html</trackback:ping><description><![CDATA[<p>ORM的实现原理：其实，要实现JavaBean的属性到数据库表的字段的映射，任何ORM框架不外乎是读某个配置文件把JavaBean的属 性和数据库表的字段自动关联起来，当从数据库Query时，自动把字段的值塞进JavaBean的对应属性里，当做INSERT或UPDATE时，自动把 JavaBean的属性值绑定到SQL语句中。但是，几乎所有的ORM都提供&#8220;按需读取&#8221;的功能，比如一个User有id，name，email和 address这4个字段，但是address字段很少用，于是ORM只读取前3个字段，直到调用User的getAddress()方法时，才去数据库 中读取address的值。这个功能显然不能通过User的get/set完成，因此，ORM需要采用某种方式生成一个User类的子类，并且覆写get /set方法，这样，才能在调用get方法时有机会从数据库中读取。类似的对User的修改检测也是这样实现的。</p>
<img src ="http://www.blogjava.net/xiachang88/aggbug/295319.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-16 15:27 <a href="http://www.blogjava.net/xiachang88/articles/295319.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我们的现况 </title><link>http://www.blogjava.net/xiachang88/archive/2009/09/16/295315.html</link><dc:creator>xiachang88</dc:creator><author>xiachang88</author><pubDate>Wed, 16 Sep 2009 07:14:00 GMT</pubDate><guid>http://www.blogjava.net/xiachang88/archive/2009/09/16/295315.html</guid><wfw:comment>http://www.blogjava.net/xiachang88/comments/295315.html</wfw:comment><comments>http://www.blogjava.net/xiachang88/archive/2009/09/16/295315.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xiachang88/comments/commentRss/295315.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiachang88/services/trackbacks/295315.html</trackback:ping><description><![CDATA[<div style="clear: both; padding-right: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 5px; margin: 0px 0px 1em; line-height: 1.6em; padding-top: 15px; outline-width: 0px; outline-style: initial; outline-color: initial"  fix?="">
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><strong style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">从业人员篇</strong></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">IT工作、特别是开发工作，是年轻人的天下。在本次调查中，19-25&nbsp;岁以下受访者占47.84%，如果加上26-30岁的受访者，占到总比例的87.26%。这反映了我国IT尚未进入成熟阶段的现状。把年龄层比例数据与岗位比例数据作对比，可以更明确地看到这一点。有趣的是，据研究机构统计，越南等IT业处于起步阶段的国家，年轻开发者所占比例更大。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">受访者年龄分布</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="年龄" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="年龄" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E5%B9%B4%E9%BE%84.gif" width="372" size-full=""  wp-image-778?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">开发者群体中，&#8220;阳盛阴衰&#8221;的现象很明显。此次调查的受访者有9&nbsp;成是男性。受访者集中在北京、广东、上海和江浙地区。今年的数据显示，江苏、浙江两省受访者之和占到总额的13.26%，俨然已和北、上、广形成鼎立之势。但其他地区受访者愿意前往江苏、浙江发展的，所占比例却微不足道。在人才方面，江、浙尚缺乏足以与人抗衡的整体竞争力。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">五地受访者比例分布</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="地区" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="地区" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E5%9C%B0%E5%8C%BA.gif" width="331" size-full=""  wp-image-779?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">以对人才的吸引力而论，大型外企和创业公司最有人才竞争力。前者的薪酬、福利、管理、职业生涯等体系较为成熟可靠，后者凭借的是&#8220;许你一个未来&#8221;、&#8220;体现自我价值&#8221;的前景。调查显示，三成受访者有自我创业的意图。但金融危机引发的经济低潮，势必影响到创投形势，今年大家是否还想创业就很难说了。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">受访者理想中的工作单位</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="工作单位" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="工作单位" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E5%B7%A5%E4%BD%9C%E5%8D%95%E4%BD%8D.gif" width="251" size-full=""  wp-image-780?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">对于从业人员来说，就业市场形势越来越严峻。而在数百万尚未解决就业的应届和往届毕业生看来，简直就是冰海沉船一般的死局。在这种情况下，计算机相关专业教育与单位需求脱节的现象越发显得突出和严重。学生受访者中，有六成对高校计算机教材表示不满意。学历教育解决不了就业问题，学生只能转向培训机构寻求帮助。有77.1%的学生受访者，愿意参加专业课程之外的软件技术培训。相较去年的60%，比例有了极大的增加。入行不容易，入行后也得跟上日新月异的技术发展，培训市场的火暴不是没有理由的。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">07/08两年愿意参加课程外培训的学生比例</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="软件技术培训" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="161" alt="软件技术培训" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E8%BD%AF%E4%BB%B6%E6%8A%80%E6%9C%AF%E5%9F%B9%E8%AE%AD.gif" width="352" size-full=""  wp-image-781?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">积累二三年的工作经验后，通常都会成为骨干开发人员。此时，薪资方面可能得到第一次大幅度提升，部分开发者甚至得到提升机会。此时，他们对单位购买IT软、硬件设备的决策影响力也大幅增加。以购买开发工具为例，参与提出建议和选型评估的受访者，占总额的55.2%；有决策购买能力的，占10.%。厂商应更为重视开发者的购买决策影响力。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">受访者在机构购买开发工具时的参与情况</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="负责的工作" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="负责的工作" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E8%B4%9F%E8%B4%A3%E7%9A%84%E5%B7%A5%E4%BD%9C.gif" width="376" size-full=""  wp-image-782?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><strong style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">编程语言和平台篇</strong></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">Java、.NET和C++&nbsp;无疑仍是编程语言中的王者，各自占据擅长的市场。Java&nbsp;在大规模企业级应用中翻手为云，.NET在中小企业信息化市场上呼风唤雨，C++宝刀不老、在内核级开发和嵌入式软件应用上独擅胜场。PHP等Web专用的脚本语言，没有想象中那么风光。毕竟面向公众的Web应用，在整个IT市场中未见得占到多大的份额。企事业单位信息化进程日渐深入，IT正在成为基础设施，更&#8220;架构化&#8221;的Java和.NET，以及更&#8220;底层化&#8221;的C++，一占企业市场，一占移动市场，不算出奇。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">受访者工作涉及开发平台及语言</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="平台及语言" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="平台及语言" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E5%B9%B3%E5%8F%B0%E5%8F%8A%E8%AF%AD%E8%A8%80.gif" width="424" size-full=""  wp-image-783?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">在.NET阵营中，.NET&nbsp;Framework&nbsp;2.0&nbsp;的占有率高达63.7%，是当今.NET应用的主流平台版本。从2005&nbsp;年的11.0%到今天的超过六成，.NET&nbsp;Framework&nbsp;2.0确已修成正果。.NET&nbsp;Framework&nbsp;3.0和3.5版本的占有率之和超过17%；随着Visual&nbsp;Studio&nbsp;2008的推广（目前是VS2005占优，但有30%的.NET开发者打算迁移至VS&nbsp;2008），3.0和3.5版本会越来越强势。无论在哪个版本的.NET&nbsp;Framework上，C#语言都独占鳌头，其他语言完全不能与之抗衡。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">相对于.NET/C#不断升级的&#8220;折腾&#8221;劲，传统C++显得较为保守。根据调查显示，使用C++&nbsp;的受访者，以做系统开发（22.9%）和网络开发（22.6%）为主，他们的项目主要是企业应用（42.3%）和研究性项目（22.7%）。C++开发者似乎并不太买新版本Visual&nbsp;Studio的账，目前仍有35.5%的受访者使用Visual&nbsp;Studio&nbsp;6。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">受访者主要使用的C++ IDE环境</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="IDE" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="IDE" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/IDE.gif" width="261" size-full=""  wp-image-776?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">在Java方面，JDK的部署版本也逐年变化。到2008年，JDK&nbsp;5.0&nbsp;市占率接近50%，远远超过其他版本。不可忽视的是，JDK&nbsp;6.0从2007年的10%急速上升至25%，未来属于谁，不问可知。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">调查显示，Eclipse&nbsp;市占率持续提升，2008&nbsp;年首次超过5&nbsp;成受访者首选Eclipse。Netbeans市占率从2007年的27%下降到2008&nbsp;年的不到20%，主要原因是Sun公司推广重点转移到了Open&nbsp;Solaris和MySQL上，Netbeans成了爹不疼娘不爱的孩子，未来一段时间内，预计市占率会继续走低。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">Ruby、ErLang等&#8220;热词&#8221;，在2008年貌似风光无限，但实际采用率并不算高。前者的成熟度有待验证，后者应用领域较窄，但这并不说明它们缺乏重要性。尤其是RoR为代表的快速Web&nbsp;开发框架，给老牌平台/&nbsp;语言带来的冲击不可忽视。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><strong style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">Web应用开发篇</strong></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">反过来看，Java、.NET&nbsp;两大平台所涉应用，&nbsp;也反映出B/S&nbsp;体系成为信息化应用主流的状况。其中，54.8%的.NET&nbsp;使用者工作主要是开发Web&nbsp;应用，而在Java&nbsp;人群这个比例更是高达69.2%。网页为王，已是不争的事实。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">由于Web&nbsp;应用的特殊性，导致调查数据呈现出一种有趣的现象：无论你使用任何一种后台编程语言，绝大多数时候，前端总得与HTML&nbsp;和JavaScript&nbsp;打交道。在RIA深入人心的今天，作为一种成熟的RIA表现形式（至少是RIA&nbsp;过渡形式）的AJAX，其关注度也无人能匹敌。有近5&nbsp;成开发Web&nbsp;应用的受访者采用了AJAX作为客户端表现技术。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">近5成受访者采用AJAX技术</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="数据12" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="数据12" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E6%95%B0%E6%8D%AE12.gif" width="347" size-full=""  wp-image-784?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">在目前采用纯HTML的受访者中，64%的人打算转向AJAX。打算采用Flex/AIR或Silverlight&nbsp;的受访者比例大致相当，都不超过15%。Adobe和微软推广自家RIA技术仍然任重道远，倒是Google&nbsp;看准AJAX、以Chrome&nbsp;奇袭，没准真能把水彻底搅浑。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">受访者以后考虑采用的客户端表现技术</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="Web应用" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="Web应用" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/Web%E5%BA%94%E7%94%A8.gif" width="392" size-full=""  wp-image-785?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><strong style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">数据库篇</strong></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">在主流企业应用市场，Oracle和SQL&nbsp;Server&nbsp;比其他厂商产品有优势，而DB2在凭借IBM的整合服务，占据了8%的市场。MySQL以其低廉的成本也获取了相当份额。比较有意思的是，Access&nbsp;的表现相当优异，三成信息化应用是用它做的。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">厂商近年来不遗余力宣传的&#8220;BI&#8221;、&#8220;XML&#8221;等特性，目前并未成为主流，但开发者非常关注这方面趋势。事实上，40%的受访者数据库应用规模小于10万条记录，36%的受访者数据库应用规模在10万到100万条记录之间，达到千万级记录数的只有16.8%，这样的规模，还谈不上做商业智能级的数据挖掘。对此，数据库专家王翔表示，&#8220;相对其他数据而言，这组调查数据非常有趣。它提醒我们数据库、数据库应用设计要&#8216;适度&#8217;而不是&#8216;过度&#8217;，虽然在各大厂商在技术网站上都提供了为数很多的数据库部署方案，但作为应用的设计者要谨慎对待，要实事求是，设计时要对很多高可用性、高扩展性方案持谨慎态度，虽然对于计算机系统而言故障在所难免,&nbsp;但总要算个风险成本。&#8221;</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">数据库应用规模比例</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="数据15" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="数据15" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E6%95%B0%E6%8D%AE15.gif" width="347" size-full=""  wp-image-786?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">本次调查发现，工作中涉及数据库技术的开发者感兴趣的新数据库技术领域以全文搜索比例相对最高（51.4%），其次为基于Web&nbsp;的管理控制台（44.9%），&nbsp;第三为原生XML（Native&nbsp;XML）支持，比例为44.3%。搜索的重要性毋庸置疑，但即便采用数据库提供的全文检索，也未必能实现良好的搜索功能。总的来说，数据库应用水平取决于信息化发展水平。预计未来对检索、数据挖掘、BI&nbsp;等的需求会更加迫切。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">开发者感兴趣的新数据库技术领域</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="数据库技术领域" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="数据库技术领域" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8A%80%E6%9C%AF%E9%A2%86%E5%9F%9F.gif" width="350" size-full=""  wp-image-787?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><strong style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">软件工程篇</strong></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">调查发现，受访者所在公司的认证评估体系以ISO-9000&nbsp;系列比例最高，其次为CMM/CMMI&nbsp;系列。但表面上的&#8220;正规化&#8221;背后却是作坊化的生产方式。20人以下的小团队，占受访者所在团队的80%以上，这样的规模，要真照CMMI&nbsp;那套干起来，还不得淹没在文档的大海中。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">团队规模比例</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="数据16" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="224" alt="数据16" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E6%95%B0%E6%8D%AE16.gif" width="280" size-full=""  wp-image-795?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">软件工程专家青润认为，从国际上认可的软件工程实施较为完善的企业要求来看，开发人员和测试人员的比例应该为1：1，排除掉团队内特定的管理、需求、配置管理、文档、美工、质量保证等人员外，开发团队中测试人员的比例应该在1/2到1/3之间比较合理。而此次调查显示，受访者所在团队中，测试人员占团队总人数1/5&nbsp;以下的，竟有41.7%之多。对测试的忽视必然造成软件质量不过关，这也是信息化程度较低的一种体现。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="测试人员" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="测试人员" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E6%B5%8B%E8%AF%95%E4%BA%BA%E5%91%98.gif" width="396" size-full=""  wp-image-788?="" /></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">相对于其他软件生命周期工具，需求管理工具采用率较低。不使用需求管理工具的受访者团队占到三成以上。由此可见，需求管理仍然是大量开发团队较为忽视的环节。缺乏有效的需求管理，导致信息化项目延期或失败，这样的例子比比皆是。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">受访者团队采用需求管理工具情况</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="管理需求" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="管理需求" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E7%AE%A1%E7%90%86%E9%9C%80%E6%B1%82.gif" width="329" size-full=""  wp-image-789?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">34.8%的受访者团队采用Visio作为设计建模工具。严格来说Visio&nbsp;只是一种绘图工具，但相对于Rose&nbsp;的庞大，似乎更受小型开发团队欢迎。从2007年的调查结果开始，CVS就超过了VSS，成为第一大源代码管理工具。在今年的调查中，CVS继续保持微弱优势。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">受访者团队采用源代码管理工具情况</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="数据17" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="数据17" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E6%95%B0%E6%8D%AE17.gif" width="280" size-full=""  wp-image-790?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">不要求进行集成的比例逐年下降，说明国内软件项目的可控性在不断提高，但精细化仍然是不可触及的梦想。今年的调查结果显示，仅30%的受访者团队做每日集成，而对集成粒度没有要求的受访者团队比例高达20%。这类项目，只可以用&#8220;混乱&#8221;来形容，失败可能性极大。</p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">开发者经常采用的管理需求工具情况</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; text-align: center; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><em style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><img title="工具" style="border-right: 0px; padding-right: 0px; border-top: 0px; display: block; padding-left: 0px; font-size: 14px; padding-bottom: 0px; margin: 0px auto; border-left: 0px; padding-top: 0px; border-bottom: 0px; outline-width: 0px; outline-style: initial; outline-color: initial" height="201" alt="工具" src="http://www.programmer.com.cn/wp-content/uploads/2009/09/%E5%B7%A5%E5%85%B7.gif" width="303" size-full=""  wp-image-791?="" /><br />
</em></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial"><strong style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">结语</strong></p>
<p style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; border-left-width: 0px; font-size: 14px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px 0px 15px; text-indent: 28px; padding-top: 0px; border-right-width: 0px; outline-width: 0px; outline-style: initial; outline-color: initial">信息化搞了这么多年，硬件、软件该上的都上了，但应用水平却有待提高。如果说软硬件设备是&#8220;形&#8221;，那么应用水平就是&#8220;神&#8221;。反求诸己，软件业也是形稍俱而神不足。如同道家修行，此事急不得。唯有踏踏实实、去除浮躁，才有成功的基础。经济不景气，或许正是韬光隐晦、苦练内功的时候呢</p>
</div>
<img src ="http://www.blogjava.net/xiachang88/aggbug/295315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiachang88/" target="_blank">xiachang88</a> 2009-09-16 15:14 <a href="http://www.blogjava.net/xiachang88/archive/2009/09/16/295315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>