﻿<?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>博客园-逍遥游</title><link>http://www.cnblogs.com/jjiac/</link><description>一直在想，怎样路好走一点，一直想，一直在崎岖中徘徊。</description><language>zh-cn</language><lastBuildDate>Fri, 05 Sep 2008 18:08:58 GMT</lastBuildDate><pubDate>Fri, 05 Sep 2008 18:08:58 GMT</pubDate><ttl>60</ttl><item><title>.NET实现RSS格式文件</title><link>http://www.cnblogs.com/jjiac/archive/2008/07/03/1234921.html</link><dc:creator>逍遥游</dc:creator><author>逍遥游</author><pubDate>Thu, 03 Jul 2008 08:59:00 GMT</pubDate><guid>http://www.cnblogs.com/jjiac/archive/2008/07/03/1234921.html</guid><wfw:comment>http://www.cnblogs.com/jjiac/comments/1234921.html</wfw:comment><comments>http://www.cnblogs.com/jjiac/archive/2008/07/03/1234921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jjiac/comments/commentRss/1234921.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jjiac/services/trackbacks/1234921.html</trackback:ping><description><![CDATA[<p><font face="Verdana">首先设计好数据库，然后开始做页面。使用Repeater控件，代码如下：ReadRss.aspx</font></p>
<p><font face="Verdana">&lt;%@ Page language="c#" Codebehind="ReadRss.aspx.cs" AutoEventWireup="false" Inherits="MyTest.rss" ContentType="text/xml" %&gt;<br />
&lt;asp:Repeater id="rptRss" runat="server"&gt;<br />
&lt;HeaderTemplate&gt;<br />
&nbsp;&nbsp; &lt;rss version="2.0"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;channel&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;rss测试&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;link&gt;www.sina.com.cn&lt;/link&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;这是一个rss的测试&lt;/description&gt;<br />
&lt;/HeaderTemplate&gt;<br />
&lt;ItemTemplate&gt;<br />
&nbsp;&nbsp; &lt;item&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;%# FormatForXml(DataBinder.Eval(Container.DataItem,"title"))%&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;description&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;![CDATA[ &lt;%# FormatForXml(DataBinder.Eval(Container.DataItem,"content"))%&gt;]]&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/description&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;link&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;%# "http://localhost/CompanySystem/shownewsdetails.aspx?newsID="+FormatForXml(DataBinder.Eval(Container.DataItem,"newsID"))%&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/link&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;author&gt;&lt;%# FormatForXml(DataBinder.Eval(Container.DataItem,"author"))%&gt;&lt;/author&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;pubDate&gt;&lt;%# FormatForXml(DataBinder.Eval(Container.DataItem,"addTime"))%&gt;&lt;/pubDate&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;category&gt;&lt;%# FormatForXml(DataBinder.Eval(Container.DataItem,"className"))%&gt;&lt;/category&gt;<br />
&nbsp;&nbsp; &lt;/item&gt;<br />
&lt;/ItemTemplate&gt;<br />
&lt;FooterTemplate&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/channel&gt;&lt;/rss&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/FooterTemplate&gt;<br />
&lt;/asp:Repeater&gt;</font></p>
<p><font face="Verdana">后置cs文件代码：</font></p>
<p><font face="Verdana">&nbsp;&nbsp; private void Page_Load(object sender, System.EventArgs e)<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; if(!IsPostBack)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp; BindData();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">&nbsp;&nbsp; protected string FormatForXml(object input)<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; string data=input.ToString();<br />
&nbsp;&nbsp;&nbsp; data=data.Replace("&amp;","&amp;amp;");<br />
&nbsp;&nbsp;&nbsp; data=data.Replace("/","&amp;quot;");<br />
&nbsp;&nbsp;&nbsp; data=data.Replace("'","&amp;qapos;");<br />
&nbsp;&nbsp;&nbsp; data=data.Replace("&lt;","&amp;lt;");<br />
&nbsp;&nbsp;&nbsp; data=data.Replace("&gt;","&amp;gt");<br />
&nbsp;&nbsp;&nbsp; return data;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public void BindData()<br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; SqlConnection cn=new SqlConnection("server=.;database=company;uid=sa;pwd=sa;");<br />
&nbsp;&nbsp;&nbsp; SqlDataAdapter da=new SqlDataAdapter("select * from news",cn);<br />
&nbsp;&nbsp;&nbsp; DataSet ds=new DataSet();<br />
&nbsp;&nbsp;&nbsp; da.Fill(ds);<br />
&nbsp;&nbsp;&nbsp; rptRss.DataSource=ds;<br />
&nbsp;&nbsp;&nbsp; rptRss.DataBind();<br />
&nbsp;&nbsp; }</font></p>
<p><font face="Verdana">注意要用FormatForXml来格式化，否则输出不符合XML格式，会导致失败！</font></p>
<p><font face="Verdana"></font>&nbsp;</p>
<img src ="http://www.cnblogs.com/jjiac/aggbug/1234921.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42116/" target="_blank">[新闻]消息称MySQL创始人已向Sun提交辞呈</a>]]></description></item><item><title>SQL SERVER 2005 通过链接服务器 访问 ORACLE 9i 的快速设定方法</title><link>http://www.cnblogs.com/jjiac/archive/2008/07/03/1234643.html</link><dc:creator>逍遥游</dc:creator><author>逍遥游</author><pubDate>Thu, 03 Jul 2008 03:42:00 GMT</pubDate><guid>http://www.cnblogs.com/jjiac/archive/2008/07/03/1234643.html</guid><wfw:comment>http://www.cnblogs.com/jjiac/comments/1234643.html</wfw:comment><comments>http://www.cnblogs.com/jjiac/archive/2008/07/03/1234643.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jjiac/comments/commentRss/1234643.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jjiac/services/trackbacks/1234643.html</trackback:ping><description><![CDATA[<div class="cnt" id="blog_text">
<p style="margin: 0cm 0cm 0pt"><span style="color: blue"><a href="http://www.cnblogs.com/eXcel/archive/2006/09/11/500887.html"><strong><span style="color: blue"><font face="Times New Roman">SQL SERVER 2005 </font></span></strong><strong><span style="color: blue"><span>通过链接服务器（</span></span></strong><strong><span style="color: blue"><font face="Times New Roman">Linked Server</font></span></strong><strong><span style="color: blue"><span>）访问</span></span></strong><strong><span style="color: blue"><font face="Times New Roman"> ORACLE 9i </font></span></strong><strong><span style="color: blue"><span>的方法</span></span></strong></a><font face="Times New Roman"> </font></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span><font face="Times New Roman">1)</font></span><span>在</span><span><font face="Times New Roman">SQL_SERVER 2005</font></span><span>服务器上安装</span><span><font face="Times New Roman">Oracle 9i</font></span><span>的客户端。</span><font face="Times New Roman"> </font><span>假设安装到</span><span><font face="Times New Roman">C:\ora92i\ </font></span><span>目录。如果</span><span><font face="Times New Roman">D:</font></span><span>是</span><span><font face="Times New Roman">NTFS</font></span><span>分区，需要将</span><span><font face="Times New Roman">ORACLE</font></span><span>安装后的目录设为所使用的用户有权可运行、可添加、可删除。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span><font face="Times New Roman">2)</font></span><span>配置</span><span><font face="Times New Roman">C:\ora92i\network\ADMIN\tnsnames.ora </font></span><span>文件。（以下红色文字是一个配置范例）</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 10pt"><strong><font color="#0000ff">OraLink</font></strong>=</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 10pt">(DESCRIPTION =</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 10pt">(ADDRESS_LIST =</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 10pt">(ADDRESS = (PROTOCOL = TCP)(HOST = <strong><span style="color: blue">192.168.0.11</span></strong>)(PORT = 1521))</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 10pt">)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 10pt">(CONNECT_DATA =</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 10pt">(SERVICE_NAME = <strong><font color="#0000ff">orl</font></strong>)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 10pt">)</span></p>
<p style="margin: 0cm 0cm 0pt; text-align: left; mso-layout-grid-align: none" align="left"><span style="font-size: 10pt">)</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span><font face="Times New Roman">3)</font></span><span>在</span><span><font face="Times New Roman">DOS</font></span><span>模式下运行以下命令以便确认</span><span><font face="Times New Roman">ORACLE</font></span><span>客户端安装无误。</span><span><font face="Times New Roman"> </font></span></p>
<p style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">sqlplus user/password@<span style="font-size: 10pt"><strong><font color="#0000ff">OraLink</font></strong></span></font></span></p>
<p style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman"></font></span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span><font face="Times New Roman">4</font></span><span>）打开开始</span><span><font face="Times New Roman">-</font></span><span>控制面板</span><span><font face="Times New Roman">-</font></span><span>服务，确认</span><span><font face="Times New Roman">Distributed Transaction Coordinator</font></span><span>服务已启动。</span></p>
<p style="margin: 0cm 0cm 0pt; text-indent: 21pt"><span><font face="Times New Roman">5)</font></span><span>打开</span><span><font face="Times New Roman">SQL SERVER Management Studio</font></span><span>，实例名称（</span><span><font face="Times New Roman"><span style="font-size: 10pt"><strong><font color="#0000ff">OraLink</font></strong></span></font></span><span>）</span><span><font face="Times New Roman">-</font></span><span>服务器对象（右键）</span><span><font face="Times New Roman">-</font></span><span>新建连接服务器。</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt"><span><font face="Times New Roman">a)</font></span><span>链接服务器：写上链接服务器的名字，如：</span><span><font face="Times New Roman">OraTest</font></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt"><span><font face="Times New Roman">b) </font></span><span>服务器类型，选择其他数据源</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt"><span><font face="Times New Roman">c) </font></span><span>访问接口：选择</span><span><font face="Times New Roman"> Microsoft OLE DB Provider for Oracle</font></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt"><span><font face="Times New Roman">d) </font></span><span>产品名称：写上</span><span><font face="Times New Roman"> Oracle</font></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt"><span><font face="Times New Roman">e) </font></span><span>数据源：写上</span><span><font face="Times New Roman">tnsnames.ora </font></span><span>文件中配置的服务名，如：</span><span><font face="Times New Roman"><span style="font-size: 10pt"><strong><font color="#0000ff">OraLink</font></strong></span></font></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt"><span><font face="Times New Roman">f)</font></span><span>访问接口字符串：</span><span><font face="Times New Roman">user id=user;password= password</font></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt"><span><font face="Times New Roman">g)</font></span><span>在选择安全性选项页，使用此安装上下文建立连接：</span></p>
<p style="margin: 0cm 0cm 0pt 42pt; text-indent: 21pt"><span><font face="Times New Roman">1</font></span><span>：远程登录：</span><span><font face="Times New Roman">user</font></span></p>
<p style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>2</font></span><span>：使用密码：</span><span><font face="Times New Roman">password</font></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: 21pt"><span><font face="Times New Roman">h) </font></span><span>确定</span></p>
<p style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman">6)SQL</font></span><span>的写法有两种</span></p>
<p style="margin: 0cm 0cm 0pt 0.85pt; text-indent: 19.25pt"><span><font face="Times New Roman">a) </font></span><span>使用</span><span><font face="Times New Roman">T-SQL</font></span><span>语法</span><span><font face="Times New Roman">:</font></span></p>
<p style="margin: 0cm 0cm 0pt 4.45pt; text-indent: -4.45pt; mso-char-indent-count: -.49"><strong><span style="font-size: 9pt; color: blue"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>SELECT * FROM <span><font face="Times New Roman">OraTest</font></span>.ERP.BAS_ITEM_CLASS</span></strong></p>
<p style="margin: 0cm 0cm 0pt"><strong><span style="font-size: 10pt; color: red"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></strong><strong><span style="font-size: 10pt; color: red">注意在，</span></strong><strong><span style="font-size: 10pt; color: red">SQL</span></strong><strong><span style="font-size: 10pt; color: red">查询分析器中输入</span></strong><strong><span style="font-size: 10pt; color: red">SQL</span></strong><strong><span style="font-size: 10pt; color: red">语句时注意中文的全角半角切换方式！</span></strong></p>
<p style="margin: 0cm 0cm 0pt 21pt"><span><font face="Times New Roman">b) </font></span><span>使用</span><span><font face="Times New Roman">PLSQL</font></span><span>语法：</span><span><br />
<span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span></span><strong><span style="font-size: 9pt; color: blue">SELECT * FROM</span></strong><strong><span style="font-size: 9pt; color: blue"><font face="Times New Roman"> openquery(</font></span></strong><strong><span style="font-size: 9pt; color: blue"><span><font face="Times New Roman">OraTest</font></span></span></strong><strong><span style="font-size: 9pt; color: blue"><font face="Times New Roman">,'</font></span></strong><strong><span style="font-size: 9pt; color: blue">SELECT * FROM <span><font face="Times New Roman">OraTest</font></span>.ERP.BAS_ITEM_CLASS</span></strong><strong><font face="Times New Roman"><span style="font-size: 9pt; color: blue"> ')</span></font></strong></p>
<p style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>c)</font></span><span>第二种访问方式比第一种约快</span><span><font face="Times New Roman">50</font></span><span>％；第二种访问方式跟直连</span><span><font face="Times New Roman">ORACLE</font></span><span>的速度相当；第一种访问方式可能会导致一些意外错误，如：</span><span><br />
<span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span></span><span>该表不存在，或者当前用户没有访问该表的权限等等一些信息。</span></p>
<p style="margin: 0cm 0cm 0pt"><span><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>d)</font></span><span>如果需要访问的</span><span><font face="Times New Roman">column</font></span><span>中使用没有精度的数据类型，这两种查询方式都可能会报错，这是</span><span><font face="Times New Roman">ORACLE</font></span><span>的</span><span><font face="Times New Roman">BUG</font></span><span>，无法修正，只能通过查询语句的特殊处理规避这一问题：</span><span><br />
<font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>OLE DB </font></span><span>提供程序</span><span><font face="Times New Roman"> 'OraOLEDB.Oracle' </font></span><span>为列提供的元数据不一致。执行时更改了元数据信息。</span></p>
</div>
<img src ="http://www.cnblogs.com/jjiac/aggbug/1234643.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42116/" target="_blank">[新闻]消息称MySQL创始人已向Sun提交辞呈</a>]]></description></item><item><title>[转]asp.net页面缓存技术</title><link>http://www.cnblogs.com/jjiac/archive/2008/04/09/1144947.html</link><dc:creator>逍遥游</dc:creator><author>逍遥游</author><pubDate>Wed, 09 Apr 2008 07:04:00 GMT</pubDate><guid>http://www.cnblogs.com/jjiac/archive/2008/04/09/1144947.html</guid><wfw:comment>http://www.cnblogs.com/jjiac/comments/1144947.html</wfw:comment><comments>http://www.cnblogs.com/jjiac/archive/2008/04/09/1144947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jjiac/comments/commentRss/1144947.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jjiac/services/trackbacks/1144947.html</trackback:ping><description><![CDATA[<div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><strong><span style="font-size: 9pt; line-height: 150%"><font color="#333333">页面缓存</font></span></strong></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">使用OutputCache指令。</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">&lt;%@&nbsp;OutputCache&nbsp;Duration="3600"</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Location="Any"</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VaryByCustom="browser"</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VaryByParam="RequestID"&nbsp;%&gt;</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">其中Duration和VaryByParam特性是必须的。</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333">&nbsp;</font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333"><span style="font-size: 9pt; line-height: 150%">Location</span><span style="font-size: 9pt; line-height: 150%">控制页面缓存的位置</span></font></div>
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="108">
            <div align="center"><span style="font-size: 9pt"><font color="#333333">Location</font></span></div>
            </td>
            <td valign="top" width="396">
            <div align="center"><span style="font-size: 9pt"><font color="#333333">含义</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="108">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">Any</font></span></div>
            </td>
            <td valign="top" width="396">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">默认值。意味着页面的输出可以缓存在客户端浏览器，缓存在任何&#8220;下游&#8221;的客户端（如代理服务器），或缓存在Web服务器本身</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="108">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">Client</font></span></div>
            </td>
            <td valign="top" width="396">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">指明输出缓存只能存储在发出请求的客户端（即浏览器）的本地缓存中</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="108">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">Downstream</font></span></div>
            </td>
            <td valign="top" width="396">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">指明输出缓存能存储在任何支持HTTP1.1缓存的设备（如代理服务器）中</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="108">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">Server</font></span></div>
            </td>
            <td valign="top" width="396">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">指明输出缓存将存储在Web服务器上</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="108">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">None</font></span></div>
            </td>
            <td valign="top" width="396">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">指明该页面禁用输出缓存</font></span></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333">&nbsp;</font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333"><span style="font-size: 9pt; line-height: 150%">Duration</span><span style="font-size: 9pt; line-height: 150%">允许我们控制页面在缓存中生存的时间（单位是秒）</span></font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333">&nbsp;</font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333"><span style="font-size: 9pt; line-height: 150%">VaryByParam</span><span style="font-size: 9pt; line-height: 150%">允许我们缓存页面的不同版本。在上面的例子中，VaryByParam设为了RequestID，所以ASP.NET使用RequestID参数的不同值，这些值或者是在HTTP&nbsp;GET的查询字符串中传入，或者是在HTTP&nbsp;POST的参数中传入。可以通过检查RequestID参数的值让应用程序区分不同的用户；通过在页面的OutputCache指令中放置VaryByParam＝"RequestID"，可以让ASP.NET为每个用户缓存页面的不同版本。</span></font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">如果不想根据参数的值缓存页面的不问版本，那么只要把VaryByParam设为none。</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">也可以要求ASP.NET为每个可能的参数组合缓存页面的一个版本。为此，可把VaryByParam设为*。</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333">&nbsp;</font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333"><span style="font-size: 9pt; line-height: 150%">VaryByHeader</span><span style="font-size: 9pt; line-height: 150%">和VaryByCustom特性与VaryByParam的相似之处在于，它们允许指定何时应创建页面新的缓存版本。</span></font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333"><span style="font-size: 9pt; line-height: 150%">VaryByHeader</span><span style="font-size: 9pt; line-height: 150%">允许我们根据由分号分隔的HTTP头的列表末缓存页面的不向版本。</span></font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333"><span style="font-size: 9pt; line-height: 150%">VaryByCustom</span><span style="font-size: 9pt; line-height: 150%">当设为browser时，允许我们根据浏览器的名称和主版本信息缓存不同版本。也可以把它设为一个自定义方法的名称，从而实现我们自己的逻辑，控制缓存的版本。</span></font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333">&nbsp;</font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><strong><span style="font-size: 9pt; line-height: 150%"><font color="#333333">片断缓存</font></span></strong></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">可以利用用户控件将页面分段，在ascx文件中写入缓存的语句，而不在aspx文件中写缓存语句，这样ASP.NET就可以只缓存ascx片断的输出了。一般像页眉或页脚基本上都是一样的，就不需要重新加载。但是如果其中有动态变化的数据就不能对其进行缓存，因为一旦被缓存后程序就不会再创建它的实例来更新数据显示，只有等到生存期过期才行，所以对于这种情况就不适于用页面片断缓存。</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">注意：</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">一、注意片段缓存不支持Location特性；缓存页面片段惟一合法的地方是web服务器。这是因为片段缓存在ASP.NET中是新的功能，所以浏览器和代理服务器不支持。</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">二、片段缓存有另外一个在页面缓存中没有的特性——VaryByControl。VaryByControl特性允许指定一个由分号分隔的字符串列表，代表用户控件内使用的控件的名称；ASP.NET将针对值的每个不同的组合生成用户构件的一个缓存版本。</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333">&nbsp;</font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><strong><span style="font-size: 9pt; line-height: 150%"><font color="#333333">数据缓存</font></span></strong></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">低级API是Cache类，它位于ASP.NET中的System.web.Caching命名空间，可以用它缓存生成很耗费资源的数据。Cache类的使用和Session与Application对象一样简单。每个应用程序只有一个Cache对象——这意味着使用Cache对象存储在缓存中的数据是应用程序级别的数据。使事情更为简单的是，Page类的Cache属性使应用程序的Cache对象实例能在代码中使用。</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">通过Cache对象缓存的数据存储在应用程序的内存中。这意味着该数据的生存期不会超过应用程序的重启(事实上，这和存储在Application与Session对象中的数据一样，除非使用StateService或SQL&nbsp;State会话模式存储Session数据)。</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">具体的使用和语法与Session和Application一样。转换回来的时候需要注意对其进行相应类型的强制类型转换。</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333">&nbsp;</font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">这不是在ASP.NET缓存中添加缓存项的惟一方式。Cache对象有两个方法Insert()方法和Add()方法，它们灵活性更高。它们的用法近似，但稍有不同：</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333"><span style="font-size: 9pt; line-height: 150%">Insert()</span><span style="font-size: 9pt; line-height: 150%">方法用于覆盖ASP.NET缓存中现有的缓存项。</span></font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333"><span style="font-size: 9pt; line-height: 150%">Add()</span><span style="font-size: 9pt; line-height: 150%">方法只用于在ASP.NET缓存中添加新的缓存项(如果用它覆盖现有的缓存项，则会失败)。</span></font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">每个方法都有7个参数，而且两个方法的参数相同。</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">在缓存某一项时，可以指定它的相关性，告诉ASP.NET该缓存项在缓存中一直保留到某个事件发生时为止。</font></span></div>
<table cellspacing="0" cellpadding="0" width="492" border="1">
    <tbody>
        <tr>
            <td valign="top" width="168">
            <div align="center"><span style="font-size: 9pt"><font color="#333333">相关性值</font></span></div>
            </td>
            <td valign="top" width="324">
            <div align="center"><span style="font-size: 9pt"><font color="#333333">含义</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="168">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">CacheDependency</font></span></div>
            </td>
            <td valign="top" width="324">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">允许指定一个文件或缓存键。如果文件发生变化，对象就被删除。如果缓存键发生变化，对象也被删除。</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="168">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">DateTime</font></span></div>
            </td>
            <td valign="top" width="324">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">这是一个DataTime值，指明缓存数据过期的时间（绝对过期时间）</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="168">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">TimeSpan</font></span></div>
            </td>
            <td valign="top" width="324">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">这是一个时间间隔，指明缓存数据在上一次访问后可以在缓存中保留多长时间（弹性过期时间）</font></span></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">使用CacheItemPriority来指定缓存数据的优先级，以便在缓存被填满的时候删除那些优先级低的数据。</font></span></div>
<table cellspacing="0" cellpadding="0" width="492" border="1">
    <tbody>
        <tr>
            <td valign="top" width="168">
            <div align="center"><span style="font-size: 9pt"><font color="#333333">优先级值</font></span></div>
            </td>
            <td valign="top" width="324">
            <div align="center"><span style="font-size: 9pt"><font color="#333333">含义</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="168">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">High</font></span></div>
            </td>
            <td valign="top" width="324">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">设为此优先级的缓存项是最不可能在内存不足时被删除的</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="168">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">AboveNormal</font></span></div>
            </td>
            <td valign="top" width="324">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">设为此优先级的缓存项比优先级为Normal或以下的缓存项更优先保留</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="168">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">Normal</font></span></div>
            </td>
            <td valign="top" width="324">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">设为此优先级的缓存项比优先级为BelowNormal和Low的缓存项更优先保留</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="168">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">BelowNormal</font></span></div>
            </td>
            <td valign="top" width="324">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">这是倒数第二级的优先级；设为此优先级的缓存项只比优先级设为Low的缓存项更优先保留</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="168">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">Low</font></span></div>
            </td>
            <td valign="top" width="324">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">设为此优先级的缓存项是最有可能在内存不足时被删除的</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="168">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">Default</font></span></div>
            </td>
            <td valign="top" width="324">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">缓存项的优先级的默认值是Normal</font></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="168">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">NotRemovable</font></span></div>
            </td>
            <td valign="top" width="324">
            <div align="left"><span style="font-size: 9pt"><font color="#333333">当缓存项设为此优先级时，是在告诉ASP.NET即使是内存不足，也不要从缓存中删除它</font></span></div>
            </td>
        </tr>
    </tbody>
</table>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">DateTime&nbsp;dt&nbsp;<span style="color: fuchsia">=</span>&nbsp;<span style="color: blue">new</span>&nbsp;DateTime(DateTime<span style="color: fuchsia">.</span>Now<span style="color: fuchsia">.</span>Year,<span style="color: red">12</span>,<span style="color: red">31</span>);</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">Cache<span style="color: fuchsia">.</span>Add(<span style="color: purple">"MembersDataSet"</span>,dsMembers,<span style="color: blue">null</span>,</font></span></div>
<div align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">dt,TimeSpan<span style="color: fuchsia">.</span>Zero,</font></span></div>
<div align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">CacheItemPriority<span style="color: fuchsia">.</span>Normal,<span style="color: blue">null</span>);</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">第一个参数是引用缓存对象的键，第二个参数是要缓存的对象。第三个参数是null(表明没有相关性)。</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">第四和第五个参数是绝对的过期时间和弹性的过期时间。这里，我们指定缓存应在当前年份的最后一天过期(dt)。我们想指定没有弹性的过期时间，所以第五个参数使用TimeSpan.Zero。第六个参数使用System.Web.Caching.CacheItemPriority枚举中的一个值，把优先级设为Normal。</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333">&nbsp;</font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">指定一个5分钟的弹性过期时间，没有指定绝对过期时间</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">Cache<span style="color: fuchsia">.</span>Add(<span style="color: purple">"MembersDataSet"</span>,dsMembers,<span style="color: blue">null</span>,</font></span></div>
<div style="line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTime<span style="color: fuchsia">.</span>MaxValue,TimeSpan<span style="color: fuchsia">.</span>FromMinutes(<span style="color: red">5</span>),</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CacheItemPriority<span style="color: fuchsia">.</span>Normal,<span style="color: blue">null</span>);</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333">&nbsp;</font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">添加一个相关性。在这个例子中，过期时间也取决于一个文件的修改，即test.xml文件：</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">CacheDependency&nbsp;dep&nbsp;<span style="color: fuchsia">=</span>&nbsp;<span style="color: blue">new</span>&nbsp;CacheDependency(<span style="color: purple">@"C:\test.xml"</span>);</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">Cache<span style="color: fuchsia">.</span>Add(<span style="color: purple">"MembersDataSet"</span>,dsMembers,dep,</font></span></div>
<div style="line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTime<span style="color: fuchsia">.</span>MaxValue,TimeSpan<span style="color: fuchsia">.</span>FromMinutes(<span style="color: red">5</span>),</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CacheItemPriority<span style="color: fuchsia">.</span>Normal,<span style="color: blue">null</span>);</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333">&nbsp;</font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">过期时间取决于缓存中另一项的修改：</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">String[]&nbsp;dependencyKeys&nbsp;<span style="color: fuchsia">=</span>&nbsp;<span style="color: blue">new</span>&nbsp;String[<span style="color: red">1</span>];</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">dependencyKeys[<span style="color: red">0</span>]&nbsp;<span style="color: fuchsia">=</span>&nbsp;<span style="color: purple">"MembersChanged"</span>;</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">CacheDependency&nbsp;dependency&nbsp;<span style="color: fuchsia">=</span>&nbsp;<span style="color: blue">new</span>&nbsp;CacheDependency(<span style="color: blue">null</span>,&nbsp;dependencyKeys);</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">Cache<span style="color: fuchsia">.</span>Add(<span style="color: purple">"MembersDataSet"</span>,dsMembers,dependency,</font></span></div>
<div style="line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTime<span style="color: fuchsia">.</span>MaxValue,TimeSpan<span style="color: fuchsia">.</span>Zero,</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CacheItemPriority<span style="color: fuchsia">.</span>Normal,<span style="color: blue">null</span>);</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333">&nbsp;</font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">最后一个参数是CacheItemRemovedCallback类型的，允许我们在缓存项从缓存中删除时要求通知，可以编写一个自定义的方法(像这里的ItemRemovedCallback()方法)，然后在第7个参数中指定该方法：</font></span></div>
<div style="line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue">public</span>&nbsp;<span style="color: blue">void</span>&nbsp;ItemRemovedCallback(String&nbsp;key,&nbsp;Object&nbsp;<span style="color: blue">value</span>,&nbsp;CacheItemRemovedReason&nbsp;reason)</font></span></div>
<div style="line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</font></span></div>
<div style="line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><font color="#333333">&nbsp;</font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">Cache<span style="color: fuchsia">.</span>Add(<span style="color: purple">"MembersDataSet"</span>,dsMembers,dependency,</font></span></div>
<div style="line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateTime<span style="color: fuchsia">.</span>MaxValue,TimeSpan<span style="color: fuchsia">.</span>FromMinutes(<span style="color: red">5</span>),</font></span></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 10pt; line-height: 150%"><font color="#333333">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CacheItemPriority<span style="color: fuchsia">.</span>Normal,</font></span></div>
<div align="left"><font color="#333333"><span style="font-size: 10pt; color: blue; line-height: 150%">new</span><span style="font-size: 10pt; line-height: 150%">&nbsp;CacheItemRemovedCallback(<span style="color: blue">this</span><span style="color: fuchsia">.</span>ItemRemovedCallback());</span></font></div>
<div style="text-indent: 21pt; line-height: 150%" align="left"><span style="font-size: 9pt; line-height: 150%"><font color="#333333">第一个参数是在缓存中存储缓存项时使用的键，第二个是存储的对象本身，第三个是缓存项删除的原因。</font></span>&nbsp;&nbsp;</div>
</div>
<img src ="http://www.cnblogs.com/jjiac/aggbug/1144947.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42115/" target="_blank">[新闻]谷歌Chrome浏览器即将更换LOGO颜色？</a>]]></description></item><item><title>Oracle常用Script </title><link>http://www.cnblogs.com/jjiac/archive/2007/09/27/907456.html</link><dc:creator>逍遥游</dc:creator><author>逍遥游</author><pubDate>Thu, 27 Sep 2007 01:15:00 GMT</pubDate><guid>http://www.cnblogs.com/jjiac/archive/2007/09/27/907456.html</guid><wfw:comment>http://www.cnblogs.com/jjiac/comments/907456.html</wfw:comment><comments>http://www.cnblogs.com/jjiac/archive/2007/09/27/907456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jjiac/comments/commentRss/907456.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jjiac/services/trackbacks/907456.html</trackback:ping><description><![CDATA[<p><span style="color: red">1、查看当前所有对象 </span>
<p>SQL&gt; select * from tab;
<p><span style="color: red">2、建一个和a表结构一样的空表 </span>
<p>SQL&gt; create table b as select * from a where 1=2;
<p>SQL&gt; create table b(b1,b2,b3) as select a1,a2,a3 from a where 1=2;
<p><span style="color: red">3、察看数据库的大小，和空间使用情况 </span>
<p>SQL&gt; col tablespace format a20<br />
SQL&gt; select b.file_id　　文件ID,<br />
　　b.tablespace_name　　表空间,<br />
　　b.file_name　　　　　物理文件名,<br />
　　b.bytes　　　　　　　总字节数,<br />
　　(b.bytes-sum(nvl(a.bytes,0)))　　　已使用,<br />
　　sum(nvl(a.bytes,0))　　　　　　　　剩余,<br />
　　sum(nvl(a.bytes,0))/(b.bytes)*100　剩余百分比 <br />
　　from dba_free_space a,dba_data_files b <br />
　　where a.file_id=b.file_id <br />
　　group by b.tablespace_name,b.file_name,b.file_id,b.bytes <br />
　　order by b.tablespace_name<br />
　　/<br />
　　dba_free_space --表空间剩余空间状况<br />
　　dba_data_files --数据文件空间占用情况<br />
<p><span style="color: red">4、查看现有回滚段及其状态 </span>
<p>SQL&gt; col segment format a30<br />
SQL&gt; SELECT SEGMENT_NAME,OWNER,TABLESPACE_NAME,SEGMENT_ID,FILE_ID,STATUS FROM DBA_ROLLBACK_SEGS;
<p><span style="color: red">5、查看数据文件放置的路径 </span>
<p>SQL&gt; col file_name format a50<br />
SQL&gt; select tablespace_name,file_id,bytes/1024/1024,file_name from dba_data_files order by file_id;
<p><span style="color: red">6、显示当前连接用户 </span>
<p>SQL&gt; show user
<p><span style="color: red">7、把SQL*Plus当计算器 </span>
<p>SQL&gt; select 100*20 from dual;
<p><span style="color: red">8、连接字符串 </span>
<p>SQL&gt; select 列1||列2 from 表1;<br />
SQL&gt; select concat(列1,列2) from 表1;
<p><span style="color: red">9、查询当前日期 </span>
<p>SQL&gt; select to_char(sysdate,'yyyy-mm-dd,hh24:mi:ss') from dual;
<p><span style="color: red">10、用户间复制数据 </span>
<p>SQL&gt; copy from user1 to user2 create table2 using select * from table1;
<p><span style="color: red">11、视图中不能使用order by，但可用group by代替来达到排序目的 </span>
<p>SQL&gt; create view a as select b1,b2 from b group by b1,b2;
<p><span style="color: red">12、通过授权的方式来创建用户 </span>
<p>SQL&gt; grant connect,resource to test identified by test;
<p>SQL&gt; conn test/test </p>
<img src ="http://www.cnblogs.com/jjiac/aggbug/907456.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42101/" target="_blank">[新闻]淘宝网合并阿里妈妈 专家称阿里巴巴或有新战略</a>]]></description></item><item><title>[整理]如何在 JavaScript 中实现拖放</title><link>http://www.cnblogs.com/jjiac/archive/2007/09/13/891763.html</link><dc:creator>逍遥游</dc:creator><author>逍遥游</author><pubDate>Thu, 13 Sep 2007 06:41:00 GMT</pubDate><guid>http://www.cnblogs.com/jjiac/archive/2007/09/13/891763.html</guid><wfw:comment>http://www.cnblogs.com/jjiac/comments/891763.html</wfw:comment><comments>http://www.cnblogs.com/jjiac/archive/2007/09/13/891763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jjiac/comments/commentRss/891763.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jjiac/services/trackbacks/891763.html</trackback:ping><description><![CDATA[<p>&lt;HTML&gt; &lt;HEAD&gt; &lt;script language='javascript'&gt; </p>
<p>var mouseOffset = null;<br />
var iMouseDown&nbsp; = false;<br />
var lMouseState = false;<br />
var dragObject&nbsp; = null;</p>
<p>// Demo 0 variables<br />
var DragDrops&nbsp;&nbsp; = [];<br />
var curTarget&nbsp;&nbsp; = null;<br />
var lastTarget&nbsp; = null;<br />
var dragHelper&nbsp; = null;<br />
var tempDiv&nbsp;&nbsp;&nbsp;&nbsp; = null;<br />
var rootParent&nbsp; = null;<br />
var rootSibling = null;</p>
<p>//Number.prototype.NaN0=function(){return isNaN(this)?0:this;}</p>
<p>function CreateDragContainer(){<br />
&nbsp;/*<br />
&nbsp;Create a new "Container Instance" so that items from one "Set" can not<br />
&nbsp;be dragged into items from another "Set"<br />
&nbsp;*/<br />
&nbsp;var cDrag&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = DragDrops.length;<br />
&nbsp;DragDrops[cDrag] = [];</p>
<p>&nbsp;/*<br />
&nbsp;Each item passed to this function should be a "container".&nbsp; Store each<br />
&nbsp;of these items in our current container<br />
&nbsp;*/<br />
&nbsp;for(var i=0; i&lt;arguments.length; i++){<br />
&nbsp;&nbsp;var cObj = arguments[i];<br />
&nbsp;&nbsp;DragDrops[cDrag].push(cObj);<br />
&nbsp;&nbsp;cObj.setAttribute('DropObj', cDrag);</p>
<p>&nbsp;&nbsp;/*<br />
&nbsp;&nbsp;Every top level item in these containers should be draggable.&nbsp; Do this<br />
&nbsp;&nbsp;by setting the DragObj attribute on each item and then later checking<br />
&nbsp;&nbsp;this attribute in the mouseMove function<br />
&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;for(var j=0; j&lt;cObj.childNodes.length; j++){</p>
<p>&nbsp;&nbsp;&nbsp;// Firefox puts in lots of #text nodes...skip these<br />
&nbsp;&nbsp;&nbsp;if(cObj.childNodes[j].nodeName=='#text') continue;</p>
<p>&nbsp;&nbsp;&nbsp;cObj.childNodes[j].setAttribute('DragObj', cDrag);<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
}<br />
function mouseCoords(ev) {<br />
&nbsp; if(ev.pageX || ev.pageY) {<br />
&nbsp;&nbsp;&nbsp; return {x:ev.pageX, y:ev.pageY};<br />
&nbsp; }<br />
&nbsp; return {<br />
&nbsp;&nbsp;&nbsp; x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,<br />
&nbsp;&nbsp;&nbsp; y:ev.clientY + document.body.scrollTop - document.body.clientTop<br />
&nbsp; };<br />
}<br />
function&nbsp; getMouseOffset(target, ev)&nbsp;&nbsp; {<br />
&nbsp; ev&nbsp; =&nbsp; ev&nbsp; ||&nbsp; window.event;</p>
<p>&nbsp;&nbsp; var&nbsp; docPos&nbsp; =&nbsp; getPosition(target);<br />
&nbsp;&nbsp; var&nbsp; mousePos&nbsp; =&nbsp; mouseCoords(ev);</p>
<p>&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp;&nbsp; {x:mousePos.x&nbsp; -&nbsp; docPos.x, y:mousePos.y&nbsp; -&nbsp; docPos.y} ;<br />
} <br />
&nbsp;<br />
&nbsp; function&nbsp; getPosition(e)&nbsp;&nbsp; {<br />
&nbsp;&nbsp; var&nbsp; left&nbsp; =&nbsp;&nbsp; 0 ;<br />
&nbsp;&nbsp; var&nbsp; top&nbsp;&nbsp; =&nbsp;&nbsp; 0 ;</p>
<p>&nbsp;&nbsp; while&nbsp; (e.offsetParent)&nbsp; {<br />
&nbsp;&nbsp;&nbsp; left&nbsp; +=&nbsp; e.offsetLeft;<br />
&nbsp;&nbsp;&nbsp; top&nbsp; +=&nbsp; e.offsetTop;<br />
&nbsp;&nbsp;&nbsp; e&nbsp; =&nbsp; e.offsetParent;<br />
&nbsp; } <br />
&nbsp;<br />
&nbsp; left&nbsp; +=&nbsp; e.offsetLeft;<br />
&nbsp; top&nbsp; +=&nbsp; e.offsetTop;</p>
<p>&nbsp;&nbsp; return&nbsp;&nbsp;&nbsp; {x:left, y:top} ;<br />
} </p>
<p>function mouseMove(ev){<br />
&nbsp;ev&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = ev || window.event;</p>
<p>&nbsp;/*<br />
&nbsp;We are setting target to whatever item the mouse is currently on</p>
<p>&nbsp;Firefox uses event.target here, MSIE uses event.srcElement<br />
&nbsp;*/<br />
&nbsp;var target&nbsp;&nbsp; = ev.target || ev.srcElement;<br />
&nbsp;var mousePos = mouseCoords(ev);<br />
&nbsp;document.all("posXY").innerText = mousePos.x + " " + mousePos.y<br />
&nbsp;// mouseOut event - fires if the item the mouse is on has changed<br />
&nbsp;if(lastTarget &amp;&amp; (target!==lastTarget)){<br />
&nbsp;&nbsp;// reset the classname for the target element<br />
&nbsp;&nbsp;var origClass = lastTarget.getAttribute('origClass');<br />
&nbsp;&nbsp;if(origClass) lastTarget.className = origClass;<br />
&nbsp;}</p>
<p>&nbsp;/*<br />
&nbsp;dragObj is the grouping our item is in (set from the createDragContainer function).<br />
&nbsp;if the item is not in a grouping we ignore it since it can't be dragged with this<br />
&nbsp;script.<br />
&nbsp;*/<br />
&nbsp;var dragObj = target.getAttribute('DragObj');</p>
<p>&nbsp; // if the mouse was moved over an element that is draggable<br />
&nbsp;if(dragObj!=null){</p>
<p>&nbsp;&nbsp;// mouseOver event - Change the item's class if necessary<br />
&nbsp;&nbsp;if(target!=lastTarget){<br />
&nbsp;&nbsp;&nbsp;var oClass = target.getAttribute('overClass');<br />
&nbsp;&nbsp;&nbsp;if(oClass){<br />
&nbsp;&nbsp;&nbsp;&nbsp;target.setAttribute('origClass', target.className);<br />
&nbsp;&nbsp;&nbsp;&nbsp;target.className = oClass;<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;// if the user is just starting to drag the element<br />
&nbsp;&nbsp;if(iMouseDown &amp;&amp; !lMouseState){<br />
&nbsp;&nbsp;&nbsp;// mouseDown target<br />
&nbsp;&nbsp;&nbsp;curTarget&nbsp;&nbsp;&nbsp;&nbsp; = target;</p>
<p>&nbsp;&nbsp;&nbsp;// Record the mouse x and y offset for the element<br />
&nbsp;&nbsp;&nbsp;rootParent&nbsp;&nbsp;&nbsp; = curTarget.parentNode;<br />
&nbsp;&nbsp;&nbsp;rootSibling&nbsp;&nbsp; = curTarget.nextSibling;</p>
<p>&nbsp;&nbsp;&nbsp;mouseOffset&nbsp;&nbsp; = getMouseOffset(target, ev);</p>
<p>&nbsp;&nbsp;&nbsp;// We remove anything that is in our dragHelper DIV so we can put a new item in it.<br />
&nbsp;&nbsp;&nbsp;for(var i=0; i&lt;dragHelper.childNodes.length; i++) dragHelper.removeChild(dragHelper.childNodes[i]);</p>
<p>&nbsp;&nbsp;&nbsp;// Make a copy of the current item and put it in our drag helper.<br />
&nbsp;&nbsp;&nbsp;dragHelper.appendChild(curTarget.cloneNode(true));<br />
&nbsp;&nbsp;&nbsp;dragHelper.style.display = 'block';</p>
<p>&nbsp;&nbsp;&nbsp;// set the class on our helper DIV if necessary<br />
&nbsp;&nbsp;&nbsp;var dragClass = curTarget.getAttribute('dragClass');<br />
&nbsp;&nbsp;&nbsp;if(dragClass){<br />
&nbsp;&nbsp;&nbsp;&nbsp;dragHelper.firstChild.className = dragClass;<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;// disable dragging from our helper DIV (it's already being dragged)<br />
&nbsp;&nbsp;&nbsp;dragHelper.firstChild.removeAttribute('DragObj');</p>
<p>&nbsp;&nbsp;&nbsp;/*<br />
&nbsp;&nbsp;&nbsp;Record the current position of all drag/drop targets related<br />
&nbsp;&nbsp;&nbsp;to the element.&nbsp; We do this here so that we do not have to do<br />
&nbsp;&nbsp;&nbsp;it on the general mouse move event which fires when the mouse<br />
&nbsp;&nbsp;&nbsp;moves even 1 pixel.&nbsp; If we don't do this here the script<br />
&nbsp;&nbsp;&nbsp;would run much slower.<br />
&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;&nbsp;var dragConts = DragDrops[dragObj];</p>
<p>&nbsp;&nbsp;&nbsp;/*<br />
&nbsp;&nbsp;&nbsp;first record the width/height of our drag item.&nbsp; Then hide it since<br />
&nbsp;&nbsp;&nbsp;it is going to (potentially) be moved out of its parent.<br />
&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;&nbsp;curTarget.setAttribute('startWidth',&nbsp; parseInt(curTarget.offsetWidth));<br />
&nbsp;&nbsp;&nbsp;curTarget.setAttribute('startHeight', parseInt(curTarget.offsetHeight));<br />
&nbsp;&nbsp;&nbsp;curTarget.style.display&nbsp; = 'none';</p>
<p>&nbsp;&nbsp;&nbsp;// loop through each possible drop container<br />
&nbsp;&nbsp;&nbsp;for(var i=0; i&lt;dragConts.length; i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;with(dragConts[i]){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var pos = getPosition(dragConts[i]);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;save the width, height and position of each container.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Even though we are saving the width and height of each<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container back to the container this is much faster because<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;we are saving the number and do not have to run through<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;any calculations again.&nbsp; Also, offsetHeight and offsetWidth<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;are both fairly slow.&nbsp; You would never normally notice any<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;performance hit from these two functions but our code is<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;going to be running hundreds of times each second so every<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;little bit helps!</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Note that the biggest performance gain here, by far, comes<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from not having to run through the getPosition function<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hundreds of times.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setAttribute('startWidth',&nbsp; parseInt(offsetWidth));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setAttribute('startHeight', parseInt(offsetHeight));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setAttribute('startLeft',&nbsp;&nbsp; pos.x);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setAttribute('startTop',&nbsp;&nbsp;&nbsp; pos.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;// loop through each child element of each container<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(var j=0; j&lt;dragConts[i].childNodes.length; j++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;with(dragConts[i].childNodes[j]){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((nodeName=='#text') || (dragConts[i].childNodes[j]==curTarget)) continue;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var pos = getPosition(dragConts[i].childNodes[j]);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// save the width, height and position of each element<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setAttribute('startWidth',&nbsp; parseInt(offsetWidth));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setAttribute('startHeight', parseInt(offsetHeight));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setAttribute('startLeft',&nbsp;&nbsp; pos.x);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setAttribute('startTop',&nbsp;&nbsp;&nbsp; pos.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>&nbsp;// If we get in here we are dragging something<br />
&nbsp;if(curTarget){<br />
&nbsp;&nbsp;// move our helper div to wherever the mouse is (adjusted by mouseOffset)<br />
&nbsp;&nbsp;dragHelper.style.top&nbsp; = mousePos.y - mouseOffset.y;<br />
&nbsp;&nbsp;dragHelper.style.left = mousePos.x - mouseOffset.x;</p>
<p>&nbsp;&nbsp;var dragConts&nbsp; = DragDrops[curTarget.getAttribute('DragObj')];<br />
&nbsp;&nbsp;var activeCont = null;</p>
<p>&nbsp;&nbsp;var xPos = mousePos.x - mouseOffset.x + (parseInt(curTarget.getAttribute('startWidth')) /2);<br />
&nbsp;&nbsp;var yPos = mousePos.y - mouseOffset.y + (parseInt(curTarget.getAttribute('startHeight'))/2);</p>
<p>&nbsp;&nbsp;// check each drop container to see if our target object is "inside" the container<br />
&nbsp;&nbsp;for(var i=0; i&lt;dragConts.length; i++){<br />
&nbsp;&nbsp;&nbsp;with(dragConts[i]){<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(((getAttribute('startLeft'))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; xPos) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((getAttribute('startTop'))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt; yPos) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((getAttribute('startLeft') + getAttribute('startWidth'))&nbsp; &gt; xPos) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((getAttribute('startTop')&nbsp; + getAttribute('startHeight')) &gt; yPos)){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;our target is inside of our container so save the container into<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the activeCont variable and then exit the loop since we no longer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;need to check the rest of the containers<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;activeCont = dragConts[i];</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// exit the for loop<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;// Our target object is in one of our containers.&nbsp; Check to see where our div belongs<br />
&nbsp;&nbsp;if(activeCont){<br />
&nbsp;&nbsp;&nbsp;// beforeNode will hold the first node AFTER where our div belongs<br />
&nbsp;&nbsp;&nbsp;var beforeNode = null;</p>
<p>&nbsp;&nbsp;&nbsp;// loop through each child node (skipping text nodes).<br />
&nbsp;&nbsp;&nbsp;for(var i=activeCont.childNodes.length-1; i&gt;=0; i--){<br />
&nbsp;&nbsp;&nbsp;&nbsp;with(activeCont.childNodes[i]){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(nodeName=='#text') continue;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// if the current item is "After" the item being dragged<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curTarget != activeCont.childNodes[i]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((getAttribute('startLeft') + getAttribute('startWidth'))&nbsp; &gt; xPos) &amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((getAttribute('startTop')&nbsp; + getAttribute('startHeight')) &gt; yPos)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beforeNode = activeCont.childNodes[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;// the item being dragged belongs before another item<br />
&nbsp;&nbsp;&nbsp;if(beforeNode){<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(beforeNode!=curTarget.nextSibling){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;activeCont.insertBefore(curTarget, beforeNode);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;// the item being dragged belongs at the end of the current container<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;if((curTarget.nextSibling) || (curTarget.parentNode!=activeCont)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;activeCont.appendChild(curTarget);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;// make our drag item visible<br />
&nbsp;&nbsp;&nbsp;if(curTarget.style.display!=''){<br />
&nbsp;&nbsp;&nbsp;&nbsp;curTarget.style.display&nbsp; = '';<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;} else {</p>
<p>&nbsp;&nbsp;&nbsp;// our drag item is not in a container, so hide it.<br />
&nbsp;&nbsp;&nbsp;if(curTarget.style.display!='none'){<br />
&nbsp;&nbsp;&nbsp;&nbsp;curTarget.style.display&nbsp; = 'none';<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>&nbsp;// track the current mouse state so we can compare against it next time<br />
&nbsp;lMouseState = iMouseDown;</p>
<p>&nbsp;// mouseMove target<br />
&nbsp;lastTarget&nbsp; = target;</p>
<p>&nbsp;// track the current mouse state so we can compare against it next time<br />
&nbsp;lMouseState = iMouseDown;</p>
<p>&nbsp;// this helps prevent items on the page from being highlighted while dragging<br />
&nbsp;return false;<br />
}</p>
<p>function mouseUp(ev){<br />
&nbsp;if(curTarget){<br />
&nbsp;&nbsp;// hide our helper object - it is no longer needed<br />
&nbsp;&nbsp;dragHelper.style.display = 'none';</p>
<p>&nbsp;&nbsp;// if the drag item is invisible put it back where it was before moving it<br />
&nbsp;&nbsp;if(curTarget.style.display == 'none'){<br />
&nbsp;&nbsp;&nbsp;if(rootSibling){<br />
&nbsp;&nbsp;&nbsp;&nbsp;rootParent.insertBefore(curTarget, rootSibling);<br />
&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;rootParent.appendChild(curTarget);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;// make sure the drag item is visible<br />
&nbsp;&nbsp;curTarget.style.display = '';<br />
&nbsp;}<br />
&nbsp;curTarget&nbsp; = null;<br />
&nbsp;iMouseDown = false;<br />
}</p>
<p>function mouseDown(){<br />
&nbsp;iMouseDown = true;<br />
&nbsp;if(lastTarget){<br />
&nbsp;&nbsp;return false;<br />
&nbsp;}<br />
}</p>
<p>document.onmousemove = mouseMove;<br />
document.onmousedown = mouseDown;<br />
document.onmouseup&nbsp;&nbsp; = mouseUp;</p>
<p>window.onload = function(){<br />
&nbsp;// Create our helper object that will show the item while dragging<br />
&nbsp;dragHelper = document.createElement('DIV');<br />
&nbsp;dragHelper.style.cssText = 'position:absolute;display:none;';<br />
&nbsp;&nbsp;<br />
&nbsp;CreateDragContainer(<br />
&nbsp;&nbsp;document.getElementById('DragContainer1'),<br />
&nbsp;&nbsp;document.getElementById('DragContainer2'),<br />
&nbsp;&nbsp;document.getElementById('DragContainer3')<br />
&nbsp;);</p>
<p>&nbsp;document.body.appendChild(dragHelper);<br />
}<br />
&lt;/script&gt;<br />
&lt;/HEAD&gt;</p>
<p>&lt;body&gt;<br />
&lt;!--the mouse over and dragging class are defined on each item--&gt;<br />
&lt;div id="posXY"&gt;11&lt;/div&gt;<br />
&lt;div class="DragContainer" id="DragContainer1"&gt;<br />
&nbsp;&lt;div class="DragBox" id="Item1"&nbsp; overClass="OverDragBox" dragClass="DragDragBox"&gt;Item #1&lt;/div&gt;<br />
&nbsp;&lt;div class="DragBox" id="Item2"&nbsp; overClass="OverDragBox" dragClass="DragDragBox"&gt;Item #2&lt;/div&gt;<br />
&nbsp;&lt;div class="DragBox" id="Item3"&nbsp; overClass="OverDragBox" dragClass="DragDragBox"&gt;Item #3&lt;/div&gt;<br />
&nbsp;&lt;div class="DragBox" id="Item4"&nbsp; overClass="OverDragBox" dragClass="DragDragBox"&gt;Item #4&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;div class="DragContainer" id="DragContainer2"&gt;<br />
&nbsp;&lt;div class="DragBox" id="Item5"&nbsp; overClass="OverDragBox" dragClass="DragDragBox"&gt;Item #5&lt;/div&gt;<br />
&nbsp;&lt;div class="DragBox" id="Item6"&nbsp; overClass="OverDragBox" dragClass="DragDragBox"&gt;Item #6&lt;/div&gt;<br />
&nbsp;&lt;div class="DragBox" id="Item7"&nbsp; overClass="OverDragBox" dragClass="DragDragBox"&gt;Item #7&lt;/div&gt;<br />
&nbsp;&lt;div class="DragBox" id="Item8"&nbsp; overClass="OverDragBox" dragClass="DragDragBox"&gt;Item #8&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;div class="DragContainer" id="DragContainer3"&gt;<br />
&nbsp;&lt;div class="DragBox" id="Item9"&nbsp; overClass="OverDragBox" dragClass="DragDragBox"&gt;Item #9&lt;/div&gt;<br />
&nbsp;&lt;div class="DragBox" id="Item10" overClass="OverDragBox" dragClass="DragDragBox"&gt;Item #10&lt;/div&gt;<br />
&nbsp;&lt;div class="DragBox" id="Item11" overClass="OverDragBox" dragClass="DragDragBox"&gt;Item #11&lt;/div&gt;<br />
&nbsp;&lt;div class="DragBox" id="Item12" overClass="OverDragBox" dragClass="DragDragBox"&gt;Item #12&lt;/div&gt;<br />
&lt;/div&gt;<br />
&lt;/body&gt;<br />
&lt;/HTML&gt;</p>
<img src ="http://www.cnblogs.com/jjiac/aggbug/891763.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42096/" target="_blank">[新闻]微软研究院发布 AutoCollage - 整理并融合照片</a>]]></description></item><item><title>[转]鼠标拖动层的javascript脚本 </title><link>http://www.cnblogs.com/jjiac/archive/2007/09/13/891523.html</link><dc:creator>逍遥游</dc:creator><author>逍遥游</author><pubDate>Thu, 13 Sep 2007 02:45:00 GMT</pubDate><guid>http://www.cnblogs.com/jjiac/archive/2007/09/13/891523.html</guid><wfw:comment>http://www.cnblogs.com/jjiac/comments/891523.html</wfw:comment><comments>http://www.cnblogs.com/jjiac/archive/2007/09/13/891523.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/jjiac/comments/commentRss/891523.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jjiac/services/trackbacks/891523.html</trackback:ping><description><![CDATA[摘要: 方法一：代码的基本思想是：把要拖动的控件（可以是table,div,input等任何html标签）看成是元素（element）,然后这些元素需要有一个空间让他们可以拖动，我把这个称作容器(container)，把在容器里面鼠标的拖动距离加到元素的style.left和style.top那里，那么元素的位置就发生改变，这样就实现了拖动的效果。代码的使用方法，就像下面的示例一样，首先要指定一个cont&nbsp;&nbsp;<a href='http://www.cnblogs.com/jjiac/archive/2007/09/13/891523.html'>阅读全文</a><img src ="http://www.cnblogs.com/jjiac/aggbug/891523.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42096/" target="_blank">[新闻]微软研究院发布 AutoCollage - 整理并融合照片</a>]]></description></item><item><title>[转]Spring笔记</title><link>http://www.cnblogs.com/jjiac/archive/2007/09/12/890390.html</link><dc:creator>逍遥游</dc:creator><author>逍遥游</author><pubDate>Wed, 12 Sep 2007 01:25:00 GMT</pubDate><guid>http://www.cnblogs.com/jjiac/archive/2007/09/12/890390.html</guid><wfw:comment>http://www.cnblogs.com/jjiac/comments/890390.html</wfw:comment><comments>http://www.cnblogs.com/jjiac/archive/2007/09/12/890390.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jjiac/comments/commentRss/890390.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jjiac/services/trackbacks/890390.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt">&nbsp;本文档适用于使用过Spring的开发者，该文章有助于他们重新梳理一下对Spring的认识。 </span>
<div><font size="1"><span style="font-size: 10pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>这篇文章是本人在项目开发中使用Spring的总结，这里只是归纳了我们在开发中经常要用到的Spring的特性，Spring的其他特性或者使用起来比较复杂，或者很少有机会在实际开发中使用将不再本文中做介绍。</span></font></div>
<div><span><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></div>
<div><span style="font-size: 10pt">一、背景，为什么我们需要Spring？</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">Martin Flower提出了IoC（Inversion of Control），反转的是什么样的控制？</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">以前我们在一个java对象中要使用另外一个java对象，即定义两个java bean之间的依赖关系，通常通过以下三种方式建立：</span></div>
<div><span style="font-size: 10pt">(1) Bean自己实例化另外一个bean。</span></div>
<div><span style="font-size: 10pt">(2) 在bean的构造函数中指定依赖关系。</span></div>
<div><span style="font-size: 10pt">(3) 使用类似service locator模式来获得另外一个bean。</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">这三种方式都是由bean自己自主控制依赖关系。</span></div>
<div><span style="font-size: 10pt">现在我们通过IoC容器来创建bean并注入它们之间的依赖关系。这样对象的创建和依赖关系的定义就由专门的IoC容器来实现，而不是由对象本身。这样就是我们所说的控制的翻转。好处：bean自己不再负责对象的依赖关系，从而降低对象之间的耦合。同时让开发者把精力放在业务逻辑的编写上。</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">&nbsp;</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">这种控制翻转更确切的说是Dependency Injection(依赖注入)，依赖关系通过容器来注入实现的。我们通过接口的方式实现它，这也符合DIP的原则，即Dependency Inversion Principle(依赖倒转原则：面对对象编程的基本原则)。</span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">spring最新版本：</span></div>
<div><span style="font-size: 10pt">Spring Framework 2.0 (current production version 2.0.3)</span></div>
<div><span style="font-size: 10pt">我们公司大多数使用的</span></div>
<div><span style="font-size: 10pt">Spring Framework 1.2 (current production version 1.2.8) </span></div>
<div><font size="1"><span style="font-size: 10pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spring</span>就是一个轻量级的IoC容器。IoC容器最主要的功能就是帮助我们管理对象，并建立他们的依赖关系。</span></font></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div style="margin-left: 21pt; text-indent: -21pt"><font size="1"><span style="font-size: 10pt"><span>二、</span>Spring框架介绍</span></font></div>
<div style="margin-left: 21pt; text-indent: -21pt"><span style="font-size: 10pt"><img style="width: 660px; height: 524px" height="524" alt="" src="http://static.springframework.org/spring/docs/2.0.x/reference/images/spring-overview.png" width="660" /><br />
</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Core封装包是框架最基础的部分,提供IoC和依赖注入特性。</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">DAO提供了JDBC的抽象和封装，方便我们使用JDBC的方式访问数据库，同时提供了声明式事务管理的功能。</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">ORM提供了常用的ORM Mapping API（JPA, JDO, Hibernate, iBatis.）的集成。我们公司目前采用Spring提供的ibatis集成。</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">AOP提供了面向方面的编程实现，让我们可以方便的定义方法拦截器和切点。</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">WEB提供了针对web层开发的集成特性。</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">&nbsp;</span></div>
<div style="margin-left: 21pt; text-indent: -21pt"><font size="1"><span style="font-size: 10pt"><span>三、</span>Core</span></font></div>
<div style="text-indent: 18pt"><span style="font-size: 10pt">org.springframework.beans 和org.springframework.context是spring IoC容器的基础。</span></div>
<div><span style="font-size: 10pt">org.springframework.beans.factory.BeanFactory初始化和配置Bean，装配它们之间的依赖关系。</span></div>
<div style="text-indent: 18pt"><span style="font-size: 10pt">ApplicationContext 是扩展了BeanFactory ，提供了更多的功能，在使用中Spring作者推荐是使用ApplicationContext。</span></div>
<div><span style="font-size: 10pt">几个重要的知识点：</span></div>
<div><span style="font-size: 10pt">(1) spring注入的方式：Setter注入和构造器注入。如果采用Setter方法注入，别忘了在类定义的时候加上setter方法，这一点开发者常常会忘掉，导致NullPointerException。</span></div>
<div style="margin-left: 18pt; text-indent: -18pt"><font size="1"><span style="font-size: 10pt"><span>(2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span>自动装配：Spring提供多种自动装配的功能，其中byName是最好用、最常用的。可以大大简化bean的定义。例子</span></font></div>
<div style="margin-left: 18pt"><span style="font-size: 10pt">&lt;beans default-autowire="byName"&gt;</span></div>
<div style="margin-left: 18pt"><span style="font-size: 10pt">比如我们定义了一个bean 类，它包含了master属性，并且含有setMaster方法，那么spring会自动在IoC容器中寻找名为master的bean，然后调用setMaster将master对象赋值给master。</span></div>
<div style="margin-left: 18pt"><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">(3)Bean的作用域</span></div>
<div><span style="font-size: 10pt">Singleton</span></div>
<div style="margin-left: 18pt"><span style="font-size: 10pt">Spring容器只存在一个共享的bean实例，默认的配置。</span></div>
<div style="margin-left: 18pt"><span style="font-size: 10pt">&lt;bean id="example" class="com.yz.bean.Example"/&gt;</span></div>
<div><span style="font-size: 10pt">Prototype</span></div>
<div style="margin-left: 18pt"><span style="font-size: 10pt">每次对bean的请求都会创建一个新的bean实例。</span></div>
<div style="margin-left: 18pt"><span style="font-size: 10pt">&lt;bean id="example" class="com.yz.bean.Example" singleton=&#8221;false&#8221;/&gt;</span></div>
<div style="margin-left: 18pt"><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">两者如何选择？原则：所有有状态的bean都使用Prototype作用域，而对无状态的bean则应该使用singleton作用域。</span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">(4) 熟悉Spring的配置文件xml中bean的定义，有助于我们灵活地定义bean。</span></div>
<div><span style="font-size: 10pt">Bean的定义的格式基本如下：</span></div>
<div><span style="font-size: 10pt">&lt;bean id="example" class="com.yz.bean.Example"/&gt;</span></div>
<div><span style="font-size: 10pt">id唯一标识该bean，要使用某个bean，只需在容器中通过id获得之，就可以获得它的一个实例。</span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">Bean的属性定义如：&lt;properyt name=&#8221;&#8221;&gt;</span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">其属性值可以为：</span></div>
<div style="margin-left: 21pt; text-indent: -21pt"><font size="1"><span style="font-size: 10pt"><span>l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>其它bean：</span></font></div>
<div><span style="font-size: 10pt">ref bean=</span></div>
<div><span style="font-size: 10pt">ref local=</span></div>
<div style="margin-left: 21pt; text-indent: -21pt"><font size="1"><span style="font-size: 10pt"><span>l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>集合</span></font></div>
<div><span style="font-size: 10pt">&lt;list&gt; &lt;set&gt; &lt;map&gt; &lt;props&gt;</span></div>
<div style="margin-left: 21pt; text-indent: -21pt"><font size="1"><span style="font-size: 10pt"><span>l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>数字，字符串。</span></font></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div style="text-indent: 5.25pt"><span style="font-size: 10pt">(6) bean定义中的继承关系，使用这种继承关系同样可以简化bean的定义，实际开发中经常被使用。</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">如果你希望你的java bean的实例能继承另外一个java bean的配置信息。那么你在定义该bean的时候要使用parent属性。</span></div>
<div><span style="font-size: 10pt">&lt;bean id="childExample" class="com.yz.bean.ChildExample" parent="example"&gt;&lt;/bean&gt;</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">尽管这两个bean实际上没有类的继承关系，也可以使用parent属性。这种parent属性的方式实际上提供了模板的形式。</span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">(7) &nbsp;PropertyPlaceholderConfigure</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">用途：将spring中分布在不同的xml文件的一些属性值统一到一个文件来维护。这样可以提高我们程序的维护性，我们在实际开发中经常使用它。</span></div>
<div><span><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div align="left"><span style="font-size: 10pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&lt;bean id="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;</span></span></div>
<div align="left"><span style="font-size: 10pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="location" value="/com/yz/bean/common.properties"/&gt;</span></span></div>
<div align="left"><span style="font-size: 10pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</span></span></div>
<div align="left"><span style="font-size: 10pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource"&gt;</span></span></div>
<div align="left"><span style="font-size: 10pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="driverClassName" value="${jdbc.driverClassName}"/&gt;</span></span></div>
<div align="left"><span style="font-size: 10pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="url" value="${jdbc.url}"/&gt;</span></span></div>
<div align="left"><span style="font-size: 10pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="username" value="${jdbc.username}"/&gt;</span></span></div>
<div align="left"><span style="font-size: 10pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;property name="password" value="${jdbc.password}"/&gt;</span></span></div>
<div><span style="font-size: 10pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</span></span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">(8) 资源读取。</span></div>
<div><font size="1"><span style="font-size: 10pt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spring</span>来读取配置文件是按照以下的规则进行的：</span></font></div>
<table style="border-right: medium none; border-top: medium none; margin-left: 37.5pt; border-left: medium none; width: 90%; border-bottom: medium none; border-collapse: collapse" cellspacing="0" cellpadding="0" width="90%" border="1">
    <thead>
        <tr>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <div style="margin: 7.5pt 0cm 22.5pt" align="center"><strong><span style="font-size: 12pt; color: black"><span style="font-size: 10pt">前缀</span></span></strong></div>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <div style="margin: 7.5pt 0cm 22.5pt" align="center"><strong><span style="font-size: 12pt; color: black"><span style="font-size: 10pt">例子</span></span></strong></div>
            </td>
            <td style="padding-right: 0.75pt; padding-left: 0.75pt; padding-bottom: 0.75pt; padding-top: 0.75pt">
            <div style="margin: 7.5pt 0cm 22.5pt" align="center"><strong><span style="font-size: 12pt; color: black"><span style="font-size: 10pt">说明</span></span></strong></div>
            </td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td style="padding-right: 4pt; padding-left: 4pt; padding-bottom: 4pt; padding-top: 4pt">
            <div style="margin: 4.5pt 0cm" align="left"><span style="font-size: 8.5pt; color: black"><span style="font-size: 10pt">classpath:</span></span></div>
            </td>
            <td style="padding-right: 4pt; padding-left: 4pt; padding-bottom: 4pt; padding-top: 4pt">
            <div style="margin: 4.5pt 0cm"><span style="font-size: 9.5pt; color: black"><span style="font-size: 10pt">classpath:com/myapp/config.xml</span></span></div>
            </td>
            <td style="padding-right: 4pt; padding-left: 4pt; padding-bottom: 4pt; padding-top: 4pt">
            <div style="margin: 4.5pt 0cm"><font size="1"><span style="font-size: 10pt"><span style="font-size: 8.5pt; color: black">从</span><span style="font-size: 8.5pt; color: black"> classpath</span><span style="font-size: 8.5pt; color: black">中载入。</span></span></font></div>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 4pt; padding-left: 4pt; padding-bottom: 4pt; padding-top: 4pt">
            <div style="margin: 4.5pt 0cm" align="left"><span style="font-size: 8.5pt; color: black"><span style="font-size: 10pt">file:</span></span></div>
            </td>
            <td style="padding-right: 4pt; padding-left: 4pt; padding-bottom: 4pt; padding-top: 4pt">
            <div style="margin: 4.5pt 0cm"><span style="font-size: 9.5pt; color: black"><span style="font-size: 10pt">file:/data/config.xml</span></span></div>
            </td>
            <td style="padding-right: 4pt; padding-left: 4pt; padding-bottom: 4pt; padding-top: 4pt">
            <div style="margin: 4.5pt 0cm"><span style="font-size: 8.5pt; color: black"><span style="font-size: 10pt">从文件系统载入。</span></span></div>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 4pt; padding-left: 4pt; padding-bottom: 4pt; padding-top: 4pt">
            <div style="margin: 4.5pt 0cm" align="left"><span style="font-size: 8.5pt; color: black"><span style="font-size: 10pt">http:</span></span></div>
            </td>
            <td style="padding-right: 4pt; padding-left: 4pt; padding-bottom: 4pt; padding-top: 4pt">
            <div style="margin: 4.5pt 0cm"><span style="font-size: 9.5pt; color: black"><span style="font-size: 10pt">http://myserver/logo.png</span></span></div>
            </td>
            <td style="padding-right: 4pt; padding-left: 4pt; padding-bottom: 4pt; padding-top: 4pt">
            <div style="margin: 4.5pt 0cm"><font size="1"><span style="font-size: 10pt"><span style="font-size: 8.5pt; color: black">作为</span><span style="font-size: 9.5pt; color: black">URL</span><span style="font-size: 9.5pt; color: black">载入。</span></span></font></div>
            </td>
        </tr>
        <tr>
            <td style="padding-right: 4pt; padding-left: 4pt; padding-bottom: 4pt; padding-top: 4pt">
            <div style="margin: 4.5pt 0cm" align="left"><span style="font-size: 8.5pt; color: black"><span style="font-size: 10pt">(none)</span></span></div>
            </td>
            <td style="padding-right: 4pt; padding-left: 4pt; padding-bottom: 4pt; padding-top: 4pt">
            <div style="margin: 4.5pt 0cm"><span style="font-size: 9.5pt; color: black"><span style="font-size: 10pt">/data/config.xml</span></span></div>
            </td>
            <td style="padding-right: 4pt; padding-left: 4pt; padding-bottom: 4pt; padding-top: 4pt">
            <div style="margin: 4.5pt 0cm"><font size="1"><span style="font-size: 10pt"><span style="font-size: 8.5pt; color: black">取决于当前的</span><span style="font-size: 9.5pt; color: black">ApplicationContext</span></span></font></div>
            </td>
        </tr>
    </tbody>
</table>
<div><span><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">四、AOP</span></div>
<div><span style="font-size: 10pt">1、背景</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">AOP(Aspect-Oriented Programming)是对Object-Oriented Programming (OOP)的补充，</span></div>
<div><span style="font-size: 10pt">OOP通过类的继承实现功能的重用，如果某个功能是多个不同类型的类都需要具有的话，OOP就解决不了这个问题，这样就需要AOP来帮助我们</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">AOP通过切面来达到我们的实现可以跨越不同对象和类型。</span></div>
<div><span style="font-size: 10pt">Spring中的AOP主要用于：</span></div>
<div style="margin-left: 36pt; text-indent: -36pt"><font size="1"><span style="font-size: 10pt"><span>（1）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>提供声明式企业服务，比如声明的事务管理</span></font></div>
<div style="margin-left: 36pt; text-indent: -36pt"><font size="1"><span style="font-size: 10pt"><span>（2）<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>允许使用者实现定制的aspects, 这是对OOP的补充。</span></font></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">2、概念</span></div>
<div><span style="font-size: 10pt">Joinpoint（连接点）：程序执行过程中的某个特定的点。比如某个方法的调用或者异常。</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">通常我们希望在这个joinpoint上执行某个特殊的功能。Spring的AOP目前只支持连接点为方法的调用。</span></div>
<div><span style="font-size: 10pt">Aspect（切面）：横切多个对象的关注点的模块化。比如事务处理，我们有多个对象都需要实现事务处理的功能，Aspect就是我们将多个对象共同关注的功能抽出独立出来。</span></div>
<div><span style="font-size: 10pt">Advice（通知）：在某个特定的Joinpoint上切面执行的动作。通常我们通过拦截器interceptor或者advisor来实现，</span></div>
<div><span style="font-size: 10pt">Pointcut（切入点）:符合某种规则的连接点。</span></div>
<div><span style="font-size: 10pt">目标对象：被代理的对象。</span></div>
<div><span style="font-size: 10pt">AOP代理：AOP框架创建的对象，用来代理我们的目标对象。</span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">Spring缺省使用j2se动态代理来作为AOP的代理，如果要代理的类没有继承任何接口，spring使用CGLIB代理。Spring使用org.springframework.aop.framework.ProxyFactoryBean来产生代理对象。</span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">3、简化代理定义</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">在实际开发中常常有许多相似的代理定义，那么我们可以创建一个模板bean，这个bean本身不会初始化，每个需要创建的代理都定义为这个bean的子bean。</span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">&nbsp;</span></div>
<div><span style="font-size: 10pt">五、spring的DAO</span></div>
<div><span style="font-size: 10pt">1、JDBC封装包</span></div>
<div><span style="font-size: 10pt">涉及spring的包：core, dataSource, object, and support。</span></div>
<div><span style="font-size: 10pt">org.springframework.jdbc.core由JdbcTemplate类以及相关的回调接口组成。</span></div>
<div><span style="font-size: 10pt">org.springframework.jdbc.datasource提供了简化DataSource访问的工具类。</span></div>
<div><span style="font-size: 10pt">org.springframework.jdbc.object提供了一些处理查询、更新、存储过程的类。</span></div>
<div><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">org.springframework.jdbc.support</span></code><code><span style="font-size: 12pt">提供了SQLException的转换类和相关的工具类。</span></code></span></font></div>
<div style="text-indent: 21pt"><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">Spring</span></code><code><span style="font-size: 12pt">将所有jdbc处理中抛出的异常转换为spring dao包中定义的异常，这些异常是unchecked&nbsp;exception，我们可以对这些异常有选择的捕获。这也是Spring提供的一个很重要的特性。</span></code></span></font></div>
<div style="text-indent: 21pt"><code><span style="font-size: 12pt"><span style="font-size: 10pt">看例子：</span></span></code></div>
<div><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">2</span></code><code><span style="font-size: 12pt">、DataSource可以JNDI，或者apache提供的</span></code>dbcp，或者spring自带的DriverManagerDataSource。</span></font></div>
<div><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">3</span></code><code><span style="font-size: 12pt">、需要了解的知识：</span></code></span></font></div>
<div style="margin-left: 39pt; text-indent: -18pt"><font size="1"><span style="font-size: 10pt"><span>(1)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp; </span></span>JdbcTemplate是线程安全的。</span></font></div>
<div style="margin-left: 39pt; text-indent: -18pt"><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">(2)<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span></code><code><span style="font-size: 12pt">我们如果要获得connection，需要调用DataSourceUtils.getConncetion(),这个类会把SQLException的异常转换为spring的unchecked Exception，并且如果我们使用DataSourceTransactionManager的话，该connection会绑定到当前线程中。</span></code></span></font></div>
<div style="margin-left: 39pt"><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">JdbcTemplate</span></code><code><span style="font-size: 12pt">就是通过这种方式获得数据库连接的。</span></code></span></font></div>
<div><code><span style="font-size: 10pt">&nbsp;</span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">六、spring的ORM</span></span></code></div>
<div style="text-indent: 21pt"><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">Spring</span></code><code><span style="font-size: 12pt">的ORM提供了对常用ORM Mapping工具的封装，包括Hibernate、JDO、ibatis</span></code></span></font></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">等，ibatis由于使用和jdbc sql的访问方式相似，同时sql语句可控，便于DBA优化，所以深受普遍欢迎。</span></span></code></div>
<div><code><span style="font-size: 10pt">&nbsp;</span></code></div>
<div><code><span style="font-size: 10pt">&nbsp;</span></code></div>
<div><code><span style="font-size: 10pt">&nbsp;</span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">批量操作：</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">public class SqlMapAccountDao extends SqlMapClientDaoSupport implements AccountDao {</span></span></code></div>
<div><code><span style="font-size: 10pt">&nbsp;</span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; public void insertAccount(Account account) throws DataAccessException {</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getSqlMapClientTemplate().execute(new SqlMapClientCallback() {</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object doInSqlMapClient(SqlMapExecutor executor) throws SQLException {</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; executor.startBatch();</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; executor.update("insertAccount", account);</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; executor.update("insertAddress", account.getAddress());</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; executor.executeBatch();</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; }</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">}</span></span></code></div>
<div><code><span style="font-size: 10pt">&nbsp;</span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">七、Spring的事务管理</span></span></code></div>
<div><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">1</span></code><code><span style="font-size: 12pt">、全局事务和本地事务</span></code></span></font></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">如果我们的应用涉及到多个事务性资源的参与(比如多个数据库)，我们就需要使用全局事务，全局事务是由应用服务器管理的，我们它使用JTA。</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">本地事务是指只涉及单个事务资源(比如一台数据库)。应用服务器不涉及事务管理，不能跨越多个资源。</span></div>
<div style="text-indent: 21pt"><span style="font-size: 10pt">&nbsp;</span></div>
<div><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">2</span></code><code><span style="font-size: 12pt">、spring的事务</span></code></span></font></div>
<div><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp; Spring</span></code><code><span style="font-size: 12pt">使用</span></code>PlatformTransactionManager来管理事务。定义如下：</span></font></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&lt;bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;</span></span></code></div>
<div><code><span style="font-size: 10pt">&nbsp;</span></code></div>
<div><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">3</span></code><code><span style="font-size: 12pt">、声明式事务管理</span></code></span></font></div>
<div><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp; </span></code><code><span style="font-size: 12pt">声明式事务管理，开发者不用编写事务代码就可以实现事务处理。</span></code></span></font></div>
<div><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp; Spring</span></code><code><span style="font-size: 12pt">的事务管理是通过spring AOP来实现的。</span></code></span></font></div>
<div><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">&nbsp;&nbsp;&nbsp; </span></code><code><span style="font-size: 12pt">我们通过TransactionProxyFactoryBean设置Spring事务代理，然后将目标对象包装在事务代理中。当定义TransactionProxyFactoryBean时，必须提供一个相关的PlatformTransactionManager的引用和事务属性。</span></code></span></font></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&lt;bean id="petStoreTarget"&gt;</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&lt;/bean&gt;</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&lt;bean id="petStore"</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;property name="transactionManager"&gt;&lt;ref bean="transactionManager"/&gt;&lt;/property&gt;</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;property name="target"&gt;&lt;ref bean="petStoreTarget"/&gt;&lt;/property&gt;</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;property name="transactionAttributes"&gt;</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;props&gt;</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="insert*"&gt;PROPAGATION_REQUIRED,-MyCheckedException&lt;/prop&gt;</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="update*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prop key="*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt;</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/props&gt;</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; &lt;/property&gt;</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&lt;/bean&gt;</span></span></code></div>
<div><code><span style="font-size: 10pt">&nbsp;</span></code></div>
<div><font size="1"><span style="font-size: 10pt"><code><span style="font-size: 12pt">4</span></code><code><span style="font-size: 12pt">、编程式事务管理</span></code></span></font></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">Object result = transactionTemplate.execute(new TransactionCallback() {</span></span></code></div>
<div><code><span style="font-size: 10pt">&nbsp;</span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; public Object doInTransaction(TransactionStatus status) {</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; updateOperation1();</span></span></code></div>
<div><code><span style="font-size: 10pt">&nbsp;</span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return resultOfUpdateOperation2();</span></span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; }</span></span></code></div>
<div><code><span style="font-size: 10pt">&nbsp;</span></code></div>
<div><code><span style="font-size: 12pt"><span style="font-size: 10pt">});</span></span></code></div>
<img src ="http://www.cnblogs.com/jjiac/aggbug/890390.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42100/" target="_blank">[新闻]2008年9月5日科技博客精选</a>]]></description></item><item><title>[转]web项目经理手册-项目经理需要铭记在心的话 </title><link>http://www.cnblogs.com/jjiac/archive/2007/09/12/890369.html</link><dc:creator>逍遥游</dc:creator><author>逍遥游</author><pubDate>Wed, 12 Sep 2007 01:07:00 GMT</pubDate><guid>http://www.cnblogs.com/jjiac/archive/2007/09/12/890369.html</guid><wfw:comment>http://www.cnblogs.com/jjiac/comments/890369.html</wfw:comment><comments>http://www.cnblogs.com/jjiac/archive/2007/09/12/890369.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jjiac/comments/commentRss/890369.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jjiac/services/trackbacks/890369.html</trackback:ping><description><![CDATA[<p><em><font size="1">版权声明：如有转载请求，请注明出处：</font></em><a href="http://blog.csdn.net/yzhz"><font color="#000080" size="1"><em>http://blog.csdn.net/yzhz</em></font></a><font size="2"><font size="1">&nbsp; 杨争</font>&nbsp;&nbsp;</font></p>
<p><span style="color: red">1、项目经理不是来管人的，而是来支持人的。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解析：不光是项目经理，任何经理的职位都是如此。但现实中很多人并不是那么做，这也是为什么他们没能把项目做成功的原因。作为项目经理首先要端正态度，认识到这份工作职责的本质。</p>
<p><span style="color: red">2、好的开始是成功的一半。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解析：一个好项目的失败，往往是由于前期的准备不足、计划不周密。所以在项目初期要舍得花时间做前期的需求收集、讨论、技术准备等工作。尽管前期的工作看起来并没有直接产生效益，但这块工作做好了，后面的工作往往会事半功倍。否则前期准备不足，很可能导致项目出现各种各样的问题（比如大量的需求变更等）。</p>
<p><span style="color: red">3、什么样的项目最可能成功？答案是：项目越小成功的可能性越大。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解析：项目经理和相关人员要仔细评估项目中feature的成本/价值比，尽可能缩小产品的规模。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有时候项目经理可能改变不了整个项目规模，但是项目经理可以采用各种手段来&#8220;缩小&#8221;项目，比如分期进行、迭代开发等。<br />
&nbsp; <br />
<span style="color: red">4、任何对项目的改善无关的工作都是浪费时间。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解析：在项目过程中项目经理不要做表面工作，或者对项目本身无意义的工作。比如无休止的会议；要求编写详细而最终没有用处的文档。<br />
&nbsp;<br />
<span style="color: red">5、使用者的参与是项目成功的重要保证。<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 解析：使用者可以是：产品经理、需求方代表、或者客户。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在项目的各个阶段，项目经理要积极要求使用者参与到项目过程中。通过这种与使用者不断的沟通、反馈，使得最终做出来的产品是客户真正想要的。</p>
<p><span style="color: red">6、不要认为把任务交给团队成员，期间你可以不闻不问，到了完成的时间他自然会把任务交上来。这种想法是非常错误。</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;解析：这样做无疑会增加项目的风险，很容易出现该完成的任务没有按时完成，有些延误，这样项目后续的工作都会收到牵制。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 正确的做法是：当把任务安排下去后，你要定期和成员沟通完成的情况，询问是否需要支持，这样我们才能保证任务能按时保质的完成。</p>
<p><span style="color: red">7、沟通要诀</span>：项目过程中与相关人员沟通时，不要总认为对方的出发点都是从项目利益考虑，他/她一定先考虑个人利益或部门利益，所以项目经理要做的是：如何把对方的个人利益(部门利益)引导到和项目利益一致。</p>
<p><span style="color: red">8、&#8220;加班&#8221;是一个危险的信号，</span>表明一定是某个地方出现了问题，要找出进度落后的原因。</p>
<p><span style="color: red">9、项目开始前，项目经理一定要找出项目的决策者是谁，谁对项目的产品有最终的发言权。</span></p>
<p style="color: red">10、我们交付的不是程序，而是产品和服务。&nbsp;</p>
<br />
<img src ="http://www.cnblogs.com/jjiac/aggbug/890369.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42100/" target="_blank">[新闻]2008年9月5日科技博客精选</a>]]></description></item><item><title>[原]学习Struts+Spring+hibernate笔记</title><link>http://www.cnblogs.com/jjiac/archive/2007/06/29/800574.html</link><dc:creator>逍遥游</dc:creator><author>逍遥游</author><pubDate>Fri, 29 Jun 2007 09:51:00 GMT</pubDate><guid>http://www.cnblogs.com/jjiac/archive/2007/06/29/800574.html</guid><wfw:comment>http://www.cnblogs.com/jjiac/comments/800574.html</wfw:comment><comments>http://www.cnblogs.com/jjiac/archive/2007/06/29/800574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jjiac/comments/commentRss/800574.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jjiac/services/trackbacks/800574.html</trackback:ping><description><![CDATA[步骤：<br><span style="COLOR: red">一、创建WEB工程。</span><br><span style="COLOR: red">二、导入Struts。</span><br><span style="COLOR: red">三、加载Filters</span>，SetCharacterEncodingFilter.java，在Tomcat 6.0\webapps\examples\WEB-INF\classes\filters目录下有，<br>Web.xml中配置<br>&lt;filter&gt;<br>&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;com.ssh.filters.SetCharacterEncodingFilter&lt;/filter-class&gt;<br>&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;encoding&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;GBK&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br>&nbsp; &lt;/filter&gt;<br>&nbsp; &lt;filter-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br>&nbsp; &lt;/filter-mapping&gt;<br><span style="COLOR: red">四、加载Spring<br></span><br><span style="COLOR: red">五、加载hibernate</span><br>关联相关的数据源，<br>//applicationContext.xml<br>&nbsp;&lt;bean id="dataSource"<br>&nbsp;&nbsp;class="org.apache.commons.dbcp.BasicDataSource"&gt;<br>&nbsp;&nbsp;&lt;property name="driverClassName"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;oracle.jdbc.driver.OracleDriver&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="url"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;jdbc:oracle:thin:@101.14.12.201:1521:orcl&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="username"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="password"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;value&gt;&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&lt;/bean&gt;<br><br>&lt;bean id="sessionFactory"<br>&nbsp;&nbsp;class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;<br>&nbsp;&nbsp;&lt;property name="dataSource"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;ref bean="dataSource" /&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="hibernateProperties"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;props&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;prop key="hibernate.dialect"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.dialect.Oracle9Dialect<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/prop&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/props&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&nbsp;&lt;property name="mappingResources"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;list&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;com/ssh/Person.hbm.xml&lt;/value&gt;&lt;/list&gt;<br>&nbsp;&nbsp;&lt;/property&gt;&lt;/bean&gt;<br><br><span style="COLOR: red">六、创建DAO</span><br>//applicationContext.xml<br>&lt;bean id="PersonDAO" class="com.ssh.PersonDAO"&gt;<br>&nbsp;&nbsp;&lt;property name="sessionFactory"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;ref bean="sessionFactory" /&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&lt;/bean&gt;<br><span style="COLOR: red">七、配置Action<br></span>//applicationContext.xml<br>&nbsp;&lt;bean name="/person" class="com.ssh.struts.action.PersonAction"<br>&nbsp;&nbsp;abstract="false" singleton="false" lazy-init="default"<br>&nbsp;&nbsp;autowire="default" dependency-check="default"&gt;<br>&nbsp;&nbsp;&lt;property name="persondao"&gt;<br>&nbsp;&nbsp;&nbsp;&lt;ref bean="PersonDAO"/&gt;<br>&nbsp;&nbsp;&lt;/property&gt;<br>&nbsp;&lt;/bean&gt;<br>//struts-config.xml<br>&lt;action<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attribute="personForm"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input="/personInsert.jsp"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="personForm"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path="/person"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope="request"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="org.springframework.web.struts.DelegatingActionProxy"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="failure" path="/personInsert.jsp" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="ok" path="/index.do" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br><br>
<img src ="http://www.cnblogs.com/jjiac/aggbug/800574.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42099/" target="_blank">[新闻]SNS网站风靡影响工作效率 公司下令封杀</a>]]></description></item><item><title>[转]Request.UrlReferrer详解 </title><link>http://www.cnblogs.com/jjiac/archive/2007/06/14/782985.html</link><dc:creator>逍遥游</dc:creator><author>逍遥游</author><pubDate>Thu, 14 Jun 2007 01:05:00 GMT</pubDate><guid>http://www.cnblogs.com/jjiac/archive/2007/06/14/782985.html</guid><wfw:comment>http://www.cnblogs.com/jjiac/comments/782985.html</wfw:comment><comments>http://www.cnblogs.com/jjiac/archive/2007/06/14/782985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/jjiac/comments/commentRss/782985.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/jjiac/services/trackbacks/782985.html</trackback:ping><description><![CDATA[<p style="MARGIN-LEFT: 6pt"><span lang=EN-US><font face=宋体><span lang=EN-US><font face=宋体 size=5><strong>Request.UrlReferrer</strong></font></span></font></span></p>
<p style="MARGIN-LEFT: 6pt"><span lang=EN-US><font face=宋体>Request.UrlReferrer可以获取客户端上次请求的url的有关信息。<br>&nbsp; 这样我们就可以通过这个属性返回到&#8220;上一页&#8221;，<br>示例如下<br>&nbsp;&nbsp;&nbsp;&nbsp;</font></span></p>
<p style="MARGIN-LEFT: 69pt; TEXT-INDENT: -21pt"><span lang=EN-US><span><font face=宋体>1.</font><span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><font face=宋体>首先在<span lang=EN-US>Page_load中获得并储存该信息</span></font></p>
<p style="MARGIN-LEFT: 69pt"><span lang=EN-US><font face=宋体>Page_load(object obj,EventArgs e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!IsPostBack)<br>&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;&nbsp;&nbsp;&nbsp; if(Request.UrlReferrer!=null)&nbsp;&nbsp;// <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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ViewState["UrlReferrer"]=Request.UrlReferrer.ToString();<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;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></p>
<p style="MARGIN-LEFT: 90pt; TEXT-INDENT: -21pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><span>l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><font face=宋体>页面回发后会改变<span lang=EN-US>Request.UrlReferrer，将其指向当前页面，所以需要进行判断：只有在第一次请求页面的时候才储存该信息</span></font></p>
<p style="MARGIN-LEFT: 90pt; TEXT-INDENT: -21pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><span>l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><font face=宋体>因为可能</font><span lang=EN-US><font face=宋体>&#8220;上一次&#8221;的url不存在，所以需要进行判断，只有在Request.UrlReferrer存在的情况下才进行储存<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><br></font></span></p>
<p style="MARGIN-LEFT: 69pt; TEXT-INDENT: -21pt"><span lang=EN-US><span><font face=宋体>2.</font><span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><font face=宋体>然后在返回函数中使用该信息</font></p>
<p style="MARGIN-LEFT: 84pt"><span lang=EN-US><font face=宋体>void Return()</font></span></p>
<p style="MARGIN-LEFT: 84pt"><span lang=EN-US><font face=宋体>{</font></span></p>
<p style="MARGIN-LEFT: 84pt"><span lang=EN-US><font face=宋体><span>&nbsp;&nbsp;&nbsp; </span>if(ViewState["UrlReferrer"]!=null)</font></span></p>
<p style="MARGIN-LEFT: 84pt"><span lang=EN-US><font face=宋体><span>&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;&nbsp; </span>Response.Redirect(ViewState["UrlReferrer"].ToString();</font></span></p>
<p style="MARGIN-LEFT: 84pt"><span lang=EN-US><font face=宋体>}</font></span></p>
<p style="MARGIN-LEFT: 84pt"><span lang=EN-US><o:p><font face=宋体>在使用Request.UrlReferrer时还要注意：&nbsp;<br></font></o:p></span><span lang=EN-US><o:p>1.&nbsp; 如果上一页面使用document.location方法导航到当前页面，<font face=宋体>Request.UrlReferrer返回空值<br></font>2.&nbsp;&nbsp;如果有A,B两个页面，在浏览器中直接请求A页面，在A页面的中Page_Load事件中导航到B&nbsp;页面，则&nbsp;&nbsp;&nbsp;&nbsp;<font face=宋体>Request.UrlReferrer返回空。因为</font>&nbsp;在Page_load事件中页面还未初始化，所以无法记录当前页的信息，导航到b页面也就无法获得上一页面的信息&nbsp;&nbsp;&nbsp;<br>3.&nbsp; 点击刷新按钮不会改变Request.UrlReferrer&nbsp;</o:p></span></p>
&nbsp;<br>
<img src ="http://www.cnblogs.com/jjiac/aggbug/782985.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42098/" target="_blank">[新闻]《孢子》正式发布</a>]]></description></item></channel></rss>