亚洲第一页综合图片自拍,亚洲精品国产精品乱码视色 ,亚洲视频在线视频http://www.tkk7.com/vesung/category/28848.htmlzh-cnMon, 12 Jan 2015 22:57:58 GMTMon, 12 Jan 2015 22:57:58 GMT60HttpClient簡介http://www.tkk7.com/vesung/archive/2012/08/12/385316.htmlvesungvesungSun, 12 Aug 2012 09:50:00 GMThttp://www.tkk7.com/vesung/archive/2012/08/12/385316.htmlhttp://www.tkk7.com/vesung/comments/385316.htmlhttp://www.tkk7.com/vesung/archive/2012/08/12/385316.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/385316.htmlhttp://www.tkk7.com/vesung/services/trackbacks/385316.htmlhttpclient已停止維護,其替代產品為 Apache HttpComponents 。 官方聲明如下(詳細信息點擊這里):
The Commons HttpClient project is now end of life, and is no longer being developed. It has been replaced by the Apache HttpComponents project in its HttpClient and HttpCore modules, which offer better performance and more flexibility.

HttpClient 是 Apache Jakarta Common 下的子項目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協議的
客戶端程工具包,并且它支持 HTTP 協議最新的版本和建議。本文首先介紹 HTTPClient,然后根據作者實際工作經驗給出了一些常見問題的解決方法。 

所以打算用HttpClient的朋友,可以考慮使用HttpComponents 了。
HttpComponents 入門,筆者認為 iteye上的一篇文章寫的不錯,大家可以參考 《HttpComponents入門解析》

vesung 2012-08-12 17:50 發表評論
]]>
如何調整eclipse字體大小http://www.tkk7.com/vesung/archive/2012/07/26/384065.htmlvesungvesungThu, 26 Jul 2012 06:46:00 GMThttp://www.tkk7.com/vesung/archive/2012/07/26/384065.htmlhttp://www.tkk7.com/vesung/comments/384065.htmlhttp://www.tkk7.com/vesung/archive/2012/07/26/384065.html#Feedback1http://www.tkk7.com/vesung/comments/commentRss/384065.htmlhttp://www.tkk7.com/vesung/services/trackbacks/384065.html方法一:
    打開菜單 window->preferences->general->appearance->colors and fonts
打開basec里面的text font 進行編輯會彈出一個字體編輯的窗口, 在里面調整字體即可。

方法二:
    因為eclipse版本眾多,所以菜單路徑也會有所差異。 還有一種方法可以不用擔心不同版本的差異:
    開始先打開菜單 window->preferences   在左上角數據font 回車, eclipse就會自動搜索出可以設置字體的地方了。 接下來打開basec里面的text font 進行編輯會彈出一個字體編輯的窗口, 在里面調整字體即可。 


一點小技巧希望對大家能有所幫助。


vesung 2012-07-26 14:46 發表評論
]]>
你屬于那個版本的程序員?http://www.tkk7.com/vesung/archive/2008/06/29/211554.htmlvesungvesungSun, 29 Jun 2008 15:28:00 GMThttp://www.tkk7.com/vesung/archive/2008/06/29/211554.htmlhttp://www.tkk7.com/vesung/comments/211554.htmlhttp://www.tkk7.com/vesung/archive/2008/06/29/211554.html#Feedback1http://www.tkk7.com/vesung/comments/commentRss/211554.htmlhttp://www.tkk7.com/vesung/services/trackbacks/211554.html國外開發者博客中有一篇有趣的文章,將程序員按水平像軟件版本號那樣劃分為不同的版本。相對于在招聘時分為初級,中級,高級程序員,直接表明需要某種語言N版本的程序員或許更方便直接。根據作者的觀點,可將WEB開發者大致分為以下幾個版本:

Alpha:閱讀過一些專業書籍,大多數能用Dreamweaver或者FrontPage幫朋友制作一些Web頁面。但在他們熟練掌握HTML代碼以前,你大概不會雇傭他們成為職業的WEB制作人員。

Beta:已經比較擅長整合站點頁面了,在HTML技巧方面也有一定造詣,但還是用Tables來制作頁面,不了解CSS,在面對動態頁面或數據庫連接時還是底氣不足。

Pre Version 1 (0.1):比Beta版的開發者水平要高。熟悉HTML,開始了解CSS是如何運作的,懂一點JavaScript,但還是基于業余水準,逐步開始關心動態站點搭建和數據庫連接的知識。這個版本的WEB開發人員還遠不能成為雇主眼中的香餑餑。

1.0: 能夠基本把控整個站點開發,針對每個問題盡可能的找到最直接的解決辦法。但對可測性,可擴展性以及在不同(層)框架下如何選擇最合適的WEB設計工具尚無概念。這個版本的WEB開發者有良好的技術基礎,需要有進一步的幫助和指導。

 

2.0:懂面向對象的編程語言,理解分層開發的必要性,關注代碼分離,對問題尋找更完美的解決方法,偶然也會考慮設計模式的問題,但對此仍然概念不清。屬于優秀的初級開發者,能完成較松散的代碼開發(相對大型嚴謹的站點開發而言),在面對較復雜問題尋找解決辦法時需要周邊人的幫助。

3.0:開始較為深入的理解面向對象編程和設計模式,了解他們的用途,當看到好的設計模式時能看透其本質,逐步關注分層的架構解決辦法和可測試性。理解不同的開發語言并能說出他們的異同(例如各自的優勢)。屬于優秀的中級別開發者,雇主也確信他們最終能找到問題的解決辦法,這個版本的人可以給1.0和2.0的開發者以指導。但他們對架構的理解仍然不夠清晰,值得一提的是,只要給予一些指導,他們能很快理解并熟記做出的決定,以及選定方案的優勢所在。

4.0:理解模式,重視用戶的反饋。著手研究方法論,架構設計和軟件開發的最佳入口。頭腦中已經形成了超越開發語言,技術架構的整體方案,可根據需求解構程序。能從理論的角度,不同模式如何融合成最佳形態,將多種X-驅動的模式應用到不同的方案中。是精通多語言的高手,理解不同系統和方法論的細微差別,屬于高級程序員。這個級別的人能夠輕易的輔導2.0和3.0的程序員,將他們推向更高的級別。

5.0:從系統的角度考慮問題。對各種系統結構有深入研究,能對整個代碼架構中的問題進行改進。在團隊粘合性以及代碼安全性方面有杰出貢獻。對1.0到4.0版本的開發人員出現的問題能及時察覺,讓整個團隊保持積極性且保持興奮的狀態創建軟件解決辦法。舉例來說,他們總是對新的技術和信息保持饑渴狀態,試圖用最簡便的方案解決開發任務。在整個IT團隊中獲得信任,屬于高級程序員和架構師。

那么,您屬于哪個版本的程序員呢?



vesung 2008-06-29 23:28 發表評論
]]>
ajax級聯菜單實例http://www.tkk7.com/vesung/archive/2008/06/12/207290.htmlvesungvesungThu, 12 Jun 2008 01:44:00 GMThttp://www.tkk7.com/vesung/archive/2008/06/12/207290.htmlhttp://www.tkk7.com/vesung/comments/207290.htmlhttp://www.tkk7.com/vesung/archive/2008/06/12/207290.html#Feedback5http://www.tkk7.com/vesung/comments/commentRss/207290.htmlhttp://www.tkk7.com/vesung/services/trackbacks/207290.html 頁面:
<html>
<head>
<script type='text/javascript' src='jquery.js'></script>
<script type='text/javascript'>
//js代碼1
<script>

<body>
<table>
 
<tr>
  
<td>級聯菜單</td>
  
<td>
    
<select name='city' class='amenu'>
     
<option value=''>-市局全部-</option>
     
<option value='1'>a市</option>
     
<option value='2'>b市</option>
     
<option value='3'>c市</option>
    
</select>
  
</td>
  
<td>
    
<select name='country' class='amenu'>
     
<option value=''>-縣局全部-</option>
     
<option value='1'>test</option>
    
</select>
  
</td>
  
<td>
    
<select name='taxOffice' class='amenu'>
     
<option value=''>-所全部-</option>
     
<option value='1'>test</option>    
    
</select>
  
</td>
  
<td>
    
<select name='taxOffical' class='amenu'>
     
<option value=''>-職員全部-</option>
     
<option value='1'>test</option>    
    
</select>
  
</td>
 
</tr>
</table>
</body>

對應的js代碼:
js代碼1:
//本菜單是4級級聯菜單,采用jquery框架來實現
$(document).ready(function(){
 
//為所有class為amenu的元素綁定onchange事件
 $('.amenu').change(function(){
  
//記錄本級菜單標志
  var orgLevel = this.name;
  
//下級菜單
  var nextMenu = $(this).parents().next().children[0];
  
//ajax動作提交的對象(后臺采用java程序)
  var postUrl = 'pubOrgAjax.do';

  
//如果本菜單是最后一級菜單的話則不做任何動作
  if(orgLevel=='taxOffical') return true;
  
//本級菜單選擇為全部選項,則下級菜單也置為全部
  if(this.value == ''){
   
var firstOption = nextMenu.option[0];
   nextMenu.length
=0;
   nextMenu.options.add(firstOption);
   
return true;
  }


  
//ajax動作
  $.post(postUrl,{orgFlag:orgLevel,orgCode:this.value},function(xml){
    
var dicts = $('dict',xml);
    
if(dicts.length<1){alert('返回數據錯誤,請重新登陸');return false;}
    
//清空nextMenu
    if(nextMenu.options[0].value == ''){
      
var firstOption = nextMenu.options[0].text;
      nextMenu.length 
= 0;
      nextMenu.options.add(
new Option(firstOption,''));
    }
else{
      nextMenu.length 
= 0;
    }

    
//為清空后的nextMenu填充新值
    for(var i=0;i<dicts.length;i++){
      
var newOption = new Option($('name',dicts[i]).text(),$('code',dicts[i]).text());
      nextMenu.options.add(newOption);
    }

    
  }
);
  
 }
);
}
);

后臺返回的數據格式:
<?xml version="1.0" cencodeing="gbk"?>
<ajax-response>
<response>
 
<dict>
    
<code>1</code>
    
<name>市局1</name>
 
</dict>
 
<dict>
 
 
</dict>

 
</response>
</ajax-respnse>



vesung 2008-06-12 09:44 發表評論
]]>
關于java遞歸調用內存泄露http://www.tkk7.com/vesung/archive/2008/06/03/205474.htmlvesungvesungTue, 03 Jun 2008 01:14:00 GMThttp://www.tkk7.com/vesung/archive/2008/06/03/205474.htmlhttp://www.tkk7.com/vesung/comments/205474.htmlhttp://www.tkk7.com/vesung/archive/2008/06/03/205474.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/205474.htmlhttp://www.tkk7.com/vesung/services/trackbacks/205474.html
import java.util.ArrayList;   
import java.util.List;   
  
public class TailRecursionTest {   
    
public static void main(String[] args) {   
        TailRecursionTest t 
= new TailRecursionTest();   
        
for (int i = 0; i < 10000; i++)   
            t.a(
0);   
    }
   
  
    
public void a(int j) {   
        j
++;   
        List list 
= new ArrayList<Integer>(100000);   
        
// 對list進行處理   
    }
   
}

沒啥特殊的,僅僅是為了測試,我們將a方法調用10000次,a方法創建一個有100000個元素的list的局部變量。
第二個程序:
import java.util.ArrayList;   
import java.util.List;   
  
public class TailRecursionTest2 {   
    
public static void main(String[] args) {   
        TailRecursionTest2 t 
= new TailRecursionTest2();   
        t.a(
0);   
    }
   
  
    
public void a(int j) {   
        System.out.println(j);   
        j
++;   
        
if (j == 10000)   
            
return;   
        List list 
= new ArrayList<Integer>(100000);   
        
// 對list進行處理   
        a(j);   
    }
   
}
  

也沒啥特殊的,就是將循環換成了遞歸,a方法做的事情沒變。兩個都跑一下,程序1順利結束,程序2出問題了,啥問題?如下:
161  
162  
163  
164  
165  
Exception in thread 
"main" java.lang.OutOfMemoryError: Java heap space   
    at java.util.ArrayList.
<init>(Unknown Source)   
    at TailRecursionTest2.a(TailRecursionTest2.java:
17)   
    at TailRecursionTest2.a(TailRecursionTest2.java:
20)   
    at TailRecursionTest2.a(TailRecursionTest2.java:
20)   
    at TailRecursionTest2.a(TailRecursionTest2.java:
20)   
    at TailRecursionTest2.a(TailRecursionTest2.java:
20

我倒,才運行166次了,heap就滿了。問題在哪呢?oh,yep,你肯定想到了,是不是重復創建list這個大集合引起的呢?它不是局部變量嗎?怎么也會溢出?是的,list是局部變量,在a的方法棧里引用著,指向heap上的大對象,更關鍵的問題在于,java是沒有尾遞歸優化的,遞歸方法是不會使用同一個棧幀,每一次遞歸調用,都將壓入新的棧幀,并且這個棧幀上又new了一個list變量,引用著heap上新的一個大集合。隨著棧深度的增加, jvm里維持著一條長長的方法調用軌跡以便你能回來,在方法沒有返回之前,這些list變量一直被各自的棧幀引用著,不能被GC,你說,能不OOM嗎?

    也許,你想到了個補救方法來挽救程序2,就是每次在處理完list后,我把它設置為null,不讓棧幀繼續引用著它,咱編寫對gc友好的代碼,這不就行了,試試:


import java.util.ArrayList;   
import java.util.List;   
  
public class TailRecursionTest2 {   
    
public static void main(String[] args) {   
        TailRecursionTest2 t 
= new TailRecursionTest2();   
        t.a(
0);   
    }
   
  
    
public void a(int j) {   
        System.out.println(j);   
        j
++;   
        
if (j == 10000)   
            
return;   
        List list 
= new ArrayList<Integer>(100000);   
        
// 對list進行處理   
        list = null;  //gc友好   
        a(j);   
    }
   
}
 

得意洋洋,我跑一下看看,這次跑到4000多次,但是:
   
4289  
4290  
4291  
4292  
java.lang.StackOverflowError   
    at sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop(Unknown Source)   
    at sun.nio.cs.ext.DoubleByteEncoder.encodeLoop(Unknown Source)   
    at java.nio.charset.CharsetEncoder.encode(Unknown Source) 

總結:在java里,遞歸最好咱還是別用,老老實實地while、for;就算遞歸了,最好遞歸方法不要new太大的對象,除非你能確定遞歸的深度不是那么大,否則OOM和堆棧溢出的陰影將籠罩著你。

vesung 2008-06-03 09:14 發表評論
]]>
Java作用域描述符的區別http://www.tkk7.com/vesung/archive/2008/06/02/205246.htmlvesungvesungMon, 02 Jun 2008 01:12:00 GMThttp://www.tkk7.com/vesung/archive/2008/06/02/205246.htmlhttp://www.tkk7.com/vesung/comments/205246.htmlhttp://www.tkk7.com/vesung/archive/2008/06/02/205246.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/205246.htmlhttp://www.tkk7.com/vesung/services/trackbacks/205246.html
作用域
當前類 同一package 子孫類
其他package
public √   
√   
√   
√   
protected
√   
√   
√   
  × 
default √   
√   
  × 
  × 
private √   
  × 
  × 
  × 

不寫時默認為default

我們先看類:

public class  Test 可以在任何地方訪問,無論是否為當前package
class Test 只允許當前的package使用,不允許其它package使用
class 不與許prirvate和protected ,所以不討論了

我們再看方法
private 的只允許類自己使用,子類都不可見。但允許inner類調用,因為inner類屬于他自己。

class Test 里面的方法
  public 和default和protected 方法,允許同包的訪問,因為類是default的,所以方法不可能大于它

public class Test 里面的方法
  private 只允許自己內部訪問
 default 只允許同包的訪問
  protected 只允許同包和子類訪問
  public 可以任意訪問


vesung 2008-06-02 09:12 發表評論
]]>
java序列化的控制 http://www.tkk7.com/vesung/archive/2008/05/28/203447.htmlvesungvesungWed, 28 May 2008 04:00:00 GMThttp://www.tkk7.com/vesung/archive/2008/05/28/203447.htmlhttp://www.tkk7.com/vesung/comments/203447.htmlhttp://www.tkk7.com/vesung/archive/2008/05/28/203447.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/203447.htmlhttp://www.tkk7.com/vesung/services/trackbacks/203447.html閱讀全文

vesung 2008-05-28 12:00 發表評論
]]>
轉摘:Tomcat中配置和使用JNDI http://www.tkk7.com/vesung/archive/2008/04/25/195793.htmlvesungvesungFri, 25 Apr 2008 01:02:00 GMThttp://www.tkk7.com/vesung/archive/2008/04/25/195793.htmlhttp://www.tkk7.com/vesung/comments/195793.htmlhttp://www.tkk7.com/vesung/archive/2008/04/25/195793.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/195793.htmlhttp://www.tkk7.com/vesung/services/trackbacks/195793.htmlJNDI是J2EE中一個很重要的標準,通常我們是在EJB編程中用到, 
Tomcat4.0中提供了在JSP和Servelt中直接使用JNDI的方法,下面談一下在Tomcat4.0中配置和使用JNDI的方法 
(以通過JNDI連接數據庫為例) 
假設使用的數據庫是mysql,實驗例子在TOMCAT_HOME/webapps/DBTest目錄中 

A.將mysql的JDBC連接庫mm.mysql-2.0.9-bin.jar放入TOMCAT_HOME/common/lib中 

B.配置TOMCAT_HOME/conf/serer.xml文件在<Service>;段中加入一個Context: 
<Context path="/DBTest" docBase="DBTest" 
debug="5" reloadable="true" crossContext="true"> 
</Context> 
這是DBTest的根路徑,這是為了在DBTest中使用做準備. 

C.在上面加入的<Context>;段加入 
<Resource name="jdbc/TestDB" 
auth="Container" 
type="javax.sql.DataSource"/> 

<ResourceParams name="jdbc/TestDB">
<parameter> 
<name>;factory</name> 
<value>;org.apache.commons.dbcp.BasicDataSourceFactory</value> 
</parameter> 

<!-- Maximum number of dB connections in pool. Make sure you 
configure your mysqld max_connections large enough to handle 
all of your db connections. Set to 0 for no limit. 
--> 
<parameter>
<name>;maxActive</name>
<value>;100</value>
</parameter>

<!-- Maximum number of idle dB connections to retain in pool. 
Set to 0 for no limit. 
-->
<parameter> 
<name>;maxIdle</name> 
<value>;30</value> 
</parameter> 

<!-- Maximum time to wait for a dB connection to become available 
in ms, in this example 10 seconds. An Exception is thrown if 
this timeout is exceeded. Set to -1 to wait indefinitely. 
--> 
<parameter> 
<name>;maxWait</name> 
<value>;10000</value> 
</parameter> 

<!-- MySQL dB username and password for dB connections --> 
<parameter> 
<name>;username</name>; 
<value>;test</value> 
</parameter> 
<parameter> 
<name>;password</name> 
<value>;test</value> 
</parameter> 

<!-- Class name for mm.mysql JDBC driver -->; 
<parameter>; 
<name>;driverClassName</name>; 
<value>;org.gjt.mm.mysql.Driver</value> 
</parameter> 

<!-- The JDBC connection url for connecting to your MySQL dB.--> 
<parameter> 
<name>;url</name> 
<value>;jdbc:mysql://localhost:3306/test</value> 
</parameter> 
</ResourceParams> 

這里每一個小段都有英文注解,是Tomcat提供的,我們可以將按照Sample加入,主要修改的是driverClassName, 
url,和用戶帳號;需要強調的是"jdbc/TestDB"就是JDNI要查找的Name.

在web.xml中加入 
<resource-ref> 
<description>;DB Connection</description> 
<res-ref-name>;jdbc/TestDB</res-ref-name> 
<res-type>;javax.sql.DataSource</res-type> 
<res-auth>;Container</res-auth> 
</resource-ref> 
這里的jdbc/TestDb要和C中Resource段的name匹配 



vesung 2008-04-25 09:02 發表評論
]]>
DataSource接口,Connection pooling(連接池),分布式事務,RowSet介紹http://www.tkk7.com/vesung/archive/2008/04/21/194425.htmlvesungvesungMon, 21 Apr 2008 00:58:00 GMThttp://www.tkk7.com/vesung/archive/2008/04/21/194425.htmlhttp://www.tkk7.com/vesung/comments/194425.htmlhttp://www.tkk7.com/vesung/archive/2008/04/21/194425.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/194425.htmlhttp://www.tkk7.com/vesung/services/trackbacks/194425.html一、DataSource接口是一個更好的連接數據源的方法:
  JDBC1.0是原來是用DriverManager類來產生一個對數據源的連接。JDBC2.0用一種替代的方法,使用DataSource的實現,代碼變的更小巧精致,也更容易控制。
  一個DataSource對象代表了一個真正的數據源。根據DataSource的實現方法,數據源既可以是從關系數據庫,也電子表格,還可以是一個表格形式的文件。當一個DataSource對象注冊到名字服務中,應用程序就可以通過名字服務獲得DataSource對象,并用它來產生一個與DataSource代表的數據源之間的連接。
  關于數據源的信息和如何來定位數據源,例如數據庫服務器的名字,在哪臺機器上,端口號等等,都包含在DataSource對象的屬性里面去了。這樣,對應用程序的設計來說是更方便了,因為并不需要硬性的把驅動的名字寫死到程序里面去。通常驅動名字中都包含了驅動提供商的名字,而在DriverManager類中通常是這么做的。如果數據源要移植到另一個數據庫驅動中,代碼也很容易做修改。所需要做的修改只是更改DataSource的相關的屬性。而使用DataSource對象的代碼不需要做任何改動。
  由系統管理員或者有相應權限的人來配置DataSource對象。配置DataSource,包括設定DataSource的屬性,然后將它注冊到JNDI名字服務中去。在注冊DataSource對象的的過程中,系統管理員需要把DataSource對象和一個邏輯名字關聯起來。名字可以是任意的,通常取成能代表數據源并且容易記住的名字。在下面的例子中,名字起為:InventoryDB,按照慣例,邏輯名字通常都在jdbc的子上下文中。這樣,邏輯名字的全名就是:jdbc/ InventoryDB。
  一旦配置好了數據源對象,應用程序設計者就可以用它來產生一個與數據源的連接。下面的代碼片段示例了如何用JNDI上下文獲得一個一個數據源對象,然后如何用數據源對象產生一個與數據源的連接。開始的兩行用的是JNDI API,第三行用的才是JDBC的API:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/InventoryDB");Connection con = ds.getConnection("myPassword", "myUserName");
  在一個基本的DataSource實現中,DataSource.getConnection方法返回的Connection對象和用DriverManager.getConnection方法返回的Connection對象是一樣的。因為DataSource提供的方便性,我們推薦使用DataSource對象來得到一個Connection對象。我們希望所以的基于JDBC2.0技術的數據庫驅動都包含一個基本的DataSource的實現,這樣就可以在應用程序中很容易的使用它。
  對于普通的應用程序設計者,是否使用DataSource對象只是一個選擇問題。但是,對于那些需要用的連接池或者分布式的事務的應用程序設計者來說,就必須使用DataSource對象來獲得Connection,原因在下面我們會提到。
   二、Connection pooling(連接池):
  連接池是這么一種機制,當應用程序關閉一個Connection的時候,這個連接被回收,而不是被destroy,因為建立一個連接是一個很費資源的操作。如果能把回收的連接重新利用,會減少新創建連接的數目,顯著的提高運行的性能。
  假設應用程序需要建立到一個名字為EmpolyeeDB的DataSource的連接。使用連接池得到連接的代碼如下:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB");Connection con = ds.getConnection("myPassword", "myUserName");除了邏輯名字以外,我們發現其代碼和上面舉的例子的代碼是一樣的。邏輯名字不同,就可以連接到不同的數據庫。DataSource對象的getConnection方法返回的Connection是否是一個連接池中的連接完全取決于DataSource對象的實現方法。如果DataSource對象實現與一個支持連接池的中間層的服務器一起工作,DataSource對象就會自動的返回連接池中的連接,這個連接也是可以重復利用的。
  是否使用連接池獲得一個連接,在應用程序的代碼上是看不出不同的。在使用這個Connection連接上也沒有什么不一樣的地方,唯一的不同是在java的finally語句塊中來關閉一個連接。在finally中關閉連接是一個好的編程習慣。這樣,即使方法拋出異常,Connection也會被關閉并回收到連接池中去。代碼應該如下所示:
  try{…
  }catch(){…
  }finally{ if(con!=null)con.close();}
  三、分布式事務:
  獲得一個用來支持分布式事務的連接與獲得連接池中的連接是很相似的。同樣,不同之處在于DataSource的實現上的不同,而不是在應用程序中獲得連接的方式上有什么不同。假設DataSource的實現可以與支持分布式事務中間層服務器一起工作,得到連接的代碼還是如下所示:
   Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB"); Connection con = ds.getConnection("myPassword", "myUserName");由于性能上的原因,如果一個DataSource能夠支持分布式的事務,它同樣也可以支持連接池管理。
  從應用程序設計者的觀點來看。是否支持分布式的事務的連接對它來說沒什么不同,唯一的不同是在事務的邊界上(開始一個事務的地方和結束一個事務的地方),開始一個事務或者結束一個事務都是由事務服務器來控制的。應用程序不應該做任何可能妨礙服務的事情。應用程序不能夠直接調用事務提交commit或者回滾rollback操作,也不能夠使用事務的自動提交模式auto-commit mode(在數據庫操作完成的時候自動的調用commit或者rollback)。 
 
在一個連接參與了分布式事務的時候,下面的代碼是你不能做的(con表示支持分布式事務的連接Connection)。
  con.commit();或者con.rollback();或者con.setAutoCommit(true);對于通常的Connection來說,缺省的是auto-commit模式。而對于支持分布式事務的Connection來說,缺省不是auto-commit模式。注意,即使Connection是支持事務的,它也可以用于沒有事務的情況。關于事務邊界的限制只是是對分布式事務的情況下才成立的。
  配置支持連接池的DataSource的時候,涉及到配置ConnectionPoolDataSource對象,這個對象是三層體系結構中的中間層來管理連接池的。同樣的,在配置支持分布式事務的時候,需要配置XADataSource,XADataSource是中間層用來管理分布式事物的對象。ConnectionPoolDataSource和XADataSource是由驅動提供商提供的,對應用程序的設計者來說是透明的。和基本的DataSource一樣,系統管理員來配置ConnectionPoolDataSource和XADataSource對象。
  四、結果集(RowSet接口):
  結果集對象是一行行數據的容器。根據其目的,可以通過多種方法實現。RowSet及其相關的接口與JDBC2.0的標準擴展API有點不同,他們并不是驅動的一部分,RowSet是在驅動的上層實現的,可以由其它的任何人來實現他們。
  任何類型的rowset都實現了RowSet接口,RowSet接口擴展了ResultSet接口。這樣RowSet對象就有了ResultSet對象所有的功能。能夠通過getXXX方法得到數據庫中的某列值,通過updateXXX方法可以修改某列值,可以移動光標,是當前行變為另一行。
  當然,我們更感興趣的是RowSet接口提供的新的功能。作為一個JavaBean組件,RowSet對象可以增加或者刪除一個listener(監聽者),可以get或者set其屬性值,這些屬性中,有一個是字符串,表示一個對數據庫Query請求,RowSet接口定義了設定參數的方法,也提供了執行這個請求的方法。這意味著RowSet對象能夠執行查詢請求,可以根據它產生的結果集進行計算。同樣,RowSet也可以根據任何表格數據源進行計算,所以,它不局限于關系數據庫。
  從數據源得到數據之后,RowSet對象可以和數據源斷開連接,rowset也可以被序列化。這樣,RowSet就可以通過網絡傳遞給瘦客戶端。
  RowSet可以被重新連接到數據源,這樣,做的修改就可以存回到數據源中去。如果產生了一個listener,當RowSet的當前行移動,或者數據被修改的時候,監聽者就會收到通知。例如,圖形用戶界面組件可以注冊成為監聽者,當RowSet更改的時候,圖形用戶界面接到通知,就可以修改界面,來符合它所表示的RowSet。
  根據不同的需要,RowSet接口可以通過多種方法來實現。Java software已經寫了一個CachedRowSet實現,從http://developer.java.sun.com/developer/earlyAccess/crs/index.html中可以得到這個實現。
  與CachedRowSet類不樣的是,JDBCRowSet類總是保持一個和數據源的連接。這樣,在ResultSet外圍簡單到加了一層,是基于JDBC技術的驅動看起來象是一個簡單的JavaBean組件一樣。

  總結:JDBC2.0標準擴展API通過見DataSource注冊到JNDI名字服務上,將JDBC技術擴展為一個全新的概念。使應用程序的代碼更加精巧,易于控制。新的API支持了連接池,支持分布式的事務。最后,還使java應用程序可以在網絡上傳播結果集,是不可以滾動的ResultSet變成了可以滾動的RowSet。


vesung 2008-04-21 08:58 發表評論
]]>
JDBC 2.0概述http://www.tkk7.com/vesung/archive/2008/04/10/191807.htmlvesungvesungThu, 10 Apr 2008 03:29:00 GMThttp://www.tkk7.com/vesung/archive/2008/04/10/191807.htmlhttp://www.tkk7.com/vesung/comments/191807.htmlhttp://www.tkk7.com/vesung/archive/2008/04/10/191807.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/191807.htmlhttp://www.tkk7.com/vesung/services/trackbacks/191807.html   JDBC2.0的擴展API增加了一些數據訪問和數據源訪問的重大的功能。這中間有一些是主要用來做企業計算的。用JDBC2.0的新的擴展包,JDBC提供了一個從JAVA2平臺的通用的數據訪問的方法。
  首先,我們來看看JDBC標準擴展的API怎樣來和JDBC2.0結合在一起的。JDBC2.0包括兩個包:
  1、 java.sql包,個包里面是JDBC2.0的核心API。它包括了原來的JDBC API(JDBC 1.0版本),再加上一些新的2.0版本的API。這個包在Java 2 Platform SDK里面有。
  2、 javax.sql包,這里面是JDBC2.0的標準擴展API。這個包是一個全新的,在Java 2 Platform SDK, Enterprise Edition里面單獨提供。
  JDBC2.0的核心API包括了JDBC1.0的API,并在此基礎上增加了一些功能,對某些性能做了增強。使java語言在數據庫計算的前端提供了統一的數據訪問方法,效率也得到了提高。
  JDBC是向后兼容的,JDBC1.0的程序可以不加修改的運行在JDBC2.0上。但是,假如程序中用到了JDBC2.0的新特性,就必須要運行在JDBC2.0版本上。
  概括的來說,JDBC核心API的新特性在兩個方面做了工作。一個是支持一些新的功能,另一個就是支持SQL3的數據類型。
  1、 在支持新功能方面:包括結果集可以向后滾動,批量的更新數據。另外,還提供了UNICODE字符集的字符流操作。
  2、 在支持SQL3的數據類型方面:包括新的SQL3數據類型,增加了對持久性對象的存貯。
  為了對數據的存取,操作更加方便,JDBC的新特性是應用程序的設計更容易了。例如:數據塊的操作能夠顯著的提高數據庫訪問的性能。新增加的BLOB, CLOB,和數組接口能夠是應用程序操作大塊的數據類型,而不必客戶端在存貯之前進行其它的處理。這樣,就顯著的提高了內存的使用效率。
   下面我們來介紹JDBC2.0的標準擴展API。標準擴展API分為如下幾個方面:
  1、 DataSource接口:和Java名字目錄服務(JNDI)一起工作的數據源接口。它提供了對數 吹囊恢指玫牧臃椒ā?br>;  2、 Connection pooling(連接池):可以重復使用連接,而不是對每個請求都使用一個新的連接。
  3、 Distrubute transaction(分布式的事務):在一個事務中涉及到了多個數據庫服務器。
  4、 Rowsets:JavaBean組件包含了結果集,主要用來將數據傳給瘦客戶,或者提供一個可以滾動的結果集。


vesung 2008-04-10 11:29 發表評論
]]>
struts工作流程http://www.tkk7.com/vesung/archive/2008/03/11/185293.htmlvesungvesungTue, 11 Mar 2008 03:22:00 GMThttp://www.tkk7.com/vesung/archive/2008/03/11/185293.htmlhttp://www.tkk7.com/vesung/comments/185293.htmlhttp://www.tkk7.com/vesung/archive/2008/03/11/185293.html#Feedback1http://www.tkk7.com/vesung/comments/commentRss/185293.htmlhttp://www.tkk7.com/vesung/services/trackbacks/185293.htmlstruts響應用戶請求的工作流程:

Request

|
V

ActionServlet

|

如果不存在相應的Action則否則返回error,流程結束

|
V

創建ActionForm

|

進行validatge校驗,如果沒有通過校驗則返回error


創建Action

|
V

執行Action的execute方法,并返回ActionForword對象

|
V

return respose
結束

 

 



vesung 2008-03-11 11:22 發表評論
]]>
java虛擬機常用參數詳解http://www.tkk7.com/vesung/archive/2008/03/05/184041.htmlvesungvesungWed, 05 Mar 2008 08:39:00 GMThttp://www.tkk7.com/vesung/archive/2008/03/05/184041.htmlhttp://www.tkk7.com/vesung/comments/184041.htmlhttp://www.tkk7.com/vesung/archive/2008/03/05/184041.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/184041.htmlhttp://www.tkk7.com/vesung/services/trackbacks/184041.html

設置虛擬機可用內存堆的初始大小,缺省單位為字節,該大小為1024的整數倍并且要大于1MB,可用k(K)或m(M)為單位來設置較大的內存數。初始堆大小為2MB。
例如:-Xms6400K,-Xms256M

-Xmx
設置虛擬機內存堆的最大可用大小,缺省單位為字節。該值必須為1024整數倍,并且要大于2MB。可用k(K)或m(M)為單位來設置較大的內存數。缺省堆最大值為64MB。
例如:-Xmx81920K,-Xmx80M

當應用程序申請了大內存運行時虛擬機拋
  閱讀全文

vesung 2008-03-05 16:39 發表評論
]]>
輕松搭建resin開發平臺--Resin配置詳解http://www.tkk7.com/vesung/archive/2008/03/05/184028.htmlvesungvesungWed, 05 Mar 2008 08:12:00 GMThttp://www.tkk7.com/vesung/archive/2008/03/05/184028.htmlhttp://www.tkk7.com/vesung/comments/184028.htmlhttp://www.tkk7.com/vesung/archive/2008/03/05/184028.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/184028.htmlhttp://www.tkk7.com/vesung/services/trackbacks/184028.html
本文resin采用版本為:Resin 2.1.13
本文所有代碼均已測試通過

我的工程目錄結構如下:

/(root)
    |--resin(resin根目錄)
    |        |--bin
    |        |--conf
    |        |      |--resin.conf(resin配置文件 今天的主角)
    |        |--lib
    |--src
          |--java(用于放置java源文件)
          |--test(測試文件目錄)
          |--webapp(web應用的根目錄,將來doc-dir會指向這里)
                    |---WEB-INF
                                |------classes
                                |------lib
                                |------web.xml(web配置文件)
                                |------applicationContext.xml(其他配置文件)



以下是resin.conf文件源碼
<caucho.com>
<log id='/logs' href='stderr:' timestamp='[%Y-%m-%d %H:%M:%S.%s]'/>

<http-server error-log="logs/errors.log">
    
<doc-dir>../src/webapp</doc-dir>
  
  
<!-- the http port -->
  
<http port='82'/>

  
<host id=''>
    
<web-app id='/'>
        
<work-dir>../../build/work</work-dir>
        
<temp-dir>../../build/tmp</temp-dir>
        
<cache-mapping url-pattern="/*" expires="2"/>
        
<class-update-interval>
            100000000
        
</class-update-interval>
        
<jsp jsp-update-interval="1s"/>
        
        
<classpath id='WEB-INF/classes'/>     

    
</web-app>    
  
</host>

</http-server>
</caucho.com>

web.xml源代碼
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>

    
<display-name>Acme Corp</display-name>

    
<filter>
        
<filter-name>webwork</filter-name>
        
<filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class>
    
</filter>

    
<filter-mapping>
        
<filter-name>webwork</filter-name>
        
<url-pattern>/*</url-pattern>
    
</filter-mapping>

    
<listener>
        
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    
</listener>

    
<welcome-file-list>
        
<welcome-file>index.jsp</welcome-file>
        
<welcome-file>default.jsp</welcome-file>
        
<welcome-file>index.html</welcome-file>
    
</welcome-file-list>

    
<!--
        This typically isn't required, as the taglib is included in webwork.jar.
        If you really need a taglib configuration within web.xml, copy webwork/src/java/META-INF/taglib.tld
        to the WEB-INF directory as webwork.tld.
     
-->
    
<!--taglib>
        <taglib-uri>webwork</taglib-uri>
        <taglib-location>/WEB-INF/webwork.tld</taglib-location>
    </taglib
-->
</web-app>



vesung 2008-03-05 16:12 發表評論
]]>
單例模式http://www.tkk7.com/vesung/archive/2008/02/29/182985.htmlvesungvesungFri, 29 Feb 2008 08:52:00 GMThttp://www.tkk7.com/vesung/archive/2008/02/29/182985.htmlhttp://www.tkk7.com/vesung/comments/182985.htmlhttp://www.tkk7.com/vesung/archive/2008/02/29/182985.html#Feedback1http://www.tkk7.com/vesung/comments/commentRss/182985.htmlhttp://www.tkk7.com/vesung/services/trackbacks/182985.html     單例模式通過使用私有構造函數保證了一個類只能存在一個實例,類中的某個靜態方法用于返回類的唯一實例。以下的Widget類就是一個單例:
public class Widget{
    
private static Widget instance = new Widget();
    
public static Widget getInstance(){
       
return instance;
    }

    
private Widget(){}
    
public int doSomething(){
        
// 
    }

}
  Widget的構造函數是私有的,這以為著只有靜態方法getInstance()能夠創建Widget對象。由于instance字段是靜態的,所以它被定義為唯一的實例。第一次調用getInstance()方法創建一個新的Widget對象實例,而后續所有的調用都將會返回這唯一的對象實例。
  單例模式可以去掉不必要的對象創建過程。

vesung 2008-02-29 16:52 發表評論
]]>
一個不錯的log4j.properties例子http://www.tkk7.com/vesung/archive/2008/01/22/177059.htmlvesungvesungTue, 22 Jan 2008 07:28:00 GMThttp://www.tkk7.com/vesung/archive/2008/01/22/177059.htmlhttp://www.tkk7.com/vesung/comments/177059.htmlhttp://www.tkk7.com/vesung/archive/2008/01/22/177059.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/177059.htmlhttp://www.tkk7.com/vesung/services/trackbacks/177059.html# Set root logger level to WARN and append to stdout
log4j.rootLogger=WARN, stdout, error
#WARN為log輸出級別,stdout,error為該log的別名,下面將用到
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j
.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%c:%L- %m%n

# Print only messages of level ERROR or above in the package noModule.
log4j.logger.noModule=FATAL

# OpenSymphony Stuff
log4j.logger.com.opensymphony=INFO
log4j
.logger.com.opensymphony.webwork=DEBUG

# Spring Stuff
log4j.logger.org.springframework=INFO

#################################
#                       錯誤信息 #
#################################

log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j
.appender.error.File=E:/MyDoc/WorkSpace/webworkroot/logs/errors.log
log4j
.appender.error.layout=org.apache.log4j.PatternLayout
log4j
.appender.error.layout.ConversionPattern=[%d]-%-5p (%F:%L)|%m%n
log4j
.appender.error.DatePattern='.'yyyy-MM-dd
log4j
.appender.error.Threshold=ERROR

###################################
#                       CONSOLE #
#################################


log4j
.appender.console=org.apache.log4j.ConsoleAppender
log4j
.appender.console.layout=org.apache.log4j.PatternLayout
log4j
.appender.console.layout.ConversionPattern=(%F:%L)|%m%n

log4j
.appender.errorcsle=org.apache.log4j.ConsoleAppender
log4j
.appender.errorcsle.layout=org.apache.log4j.PatternLayout
log4j
.appender.errorcsle.layout.ConversionPattern=%-5p (%F:%L)|%m%n
log4j
.appender.errorcsle.Threshold=ERROR

##################################
#                       業務系統 #
#################################

log4j.logger.cn.vesung=DEBUG, logic

log4j
.appender.logic=org.apache.log4j.DailyRollingFileAppender
log4j
.appender.logic.File=E:/MyDoc/WorkSpace/webworkroot/logs/logic.log
log4j
.appender.logic.layout=org.apache.log4j.PatternLayout
log4j
.appender.logic.layout.ConversionPattern=[%d]-%-5p (%F:%L)|%m%n
log4j
.appender.logic.DatePattern='.'yyyy-MM-dd
其實業務系統和錯誤信息的輸出定義對開發人員來說是最重要的。

vesung 2008-01-22 15:28 發表評論
]]>
hibernate相關jar包功能詳解http://www.tkk7.com/vesung/archive/2008/01/17/175841.htmlvesungvesungThu, 17 Jan 2008 01:58:00 GMThttp://www.tkk7.com/vesung/archive/2008/01/17/175841.htmlhttp://www.tkk7.com/vesung/comments/175841.htmlhttp://www.tkk7.com/vesung/archive/2008/01/17/175841.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/175841.htmlhttp://www.tkk7.com/vesung/services/trackbacks/175841.html         Hibernate的庫,沒有什么可說的,必須使用的jar包 
cglib-asm.jar: 
  CGLIB庫,Hibernate用它來實現PO字節碼的動態生成,非常核心的庫,必須使用的jar包 
dom4j.jar: 
  dom4j是一個Java的XML API,類似于jdom,用來讀寫XML文件的。dom4j是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,同時它也是一個開放源代碼的軟件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,對主流的Java XML API進行的性能、功能和易用性的評測,dom4j無論在那個方面都是非常出色的。我早在將近兩年之前就開始使用dom4j,直到現在。如今你可以看到越來越多的Java軟件都在使用dom4j來讀寫XML,特別值得一提的是連Sun的JAXM也在用dom4j。這是必須使用的jar包,Hibernate用它來讀寫配置文件。 
odmg.jar:
  ODMG是一個ORM的規范,Hibernate實現了ODMG規范,這是一個核心的庫,必須使用的jar包。 
commons-collections.jar: 
        Apache Commons包中的一個,包含了一些Apache開發的集合類,功能比java.util.*強大。必須使用的jar包。 
commons-beanutils.jar:
  Apache Commons包中的一個,包含了一些Bean工具類類。必須使用的jar包。 
commons-lang.jar: 
  Apache Commons包中的一個,包含了一些數據類型工具類,是java.lang.*的擴展。必須使用的jar包。 
commons-logging.jar: 
  Apache Commons包中的一個,包含了日志功能,必須使用的jar包。這個包本身包含了一個Simple Logger,但是功能很弱。在運行的時候它會先在CLASSPATH找log4j,如果有,就使用log4j,如果沒有,就找JDK1.4帶的java.util.logging,如果也找不到就用Simple Logger。commons-logging.jar的出現是一個歷史的的遺留的遺憾,當初Apache極力游說Sun把log4j加入JDK1.4,然而JDK1.4項目小組已經接近發布JDK1.4產品的時間了,因此拒絕了Apache的要求,使用自己的java.util.logging,這個包的功能比log4j差的很遠,性能也一般。
  后來Apache就開發出來了commons-logging.jar用來兼容兩個logger。因此用commons-logging.jar寫的log程序,底層的Logger是可以切換的,你可以選擇log4j,java.util.logging或者它自帶的Simple Logger。不過我仍然強烈建議使用log4j,因為log4j性能很高,log輸出信息時間幾乎等于System.out,而處理一條log平均只需要5us。你可以在Hibernate的src目錄下找到Hibernate已經為你準備好了的log4j的配置文件,你只需要到Apache 網站去下載log4j就可以了。commons-logging.jar也是必須的jar包。
  使用Hibernate必須的jar包就是以上的這幾個,剩下的都是可選的。 
ant.jar: 
  Ant編譯工具的jar包,用來編譯Hibernate源代碼的。如果你不準備修改和編譯Hibernate源代碼,那么就沒有什么用,可選的jar包 
optional.jar:
  Ant的一個輔助包。 
c3p0.jar: 
  C3PO是一個數據庫連接池,Hibernate可以配置為使用C3PO連接池。如果你準備用這個連接池,就需要這個jar包。 
proxool.jar:
  也是一個連接池,同上。 
commons-pool.jar, commons-dbcp.jar: 
  DBCP數據庫連接池,Apache的Jakarta組織開發的,Tomcat4的連接池也是DBCP。 

  實際上Hibernate自己也實現了一個非常非常簡單的數據庫連接池,加上上面3個,你實際上可以在Hibernate上選擇4種不同的數據庫連接池,選擇哪一個看個人的偏好,不過DBCP可能更通用一些。另外強調一點,如果在EJB中使用Hibernate,一定要用App Server的連接池,不要用以上4種連接池,否則容器管理事務不起作用。 

  connector.jar: 

  JCA 規范,如果你在App Server上把Hibernate配置為Connector的話,就需要這個jar。不過實際上一般App Server肯定會帶上這個包,所以實際上是多余的包。 

  jaas.jar: 

  JAAS是用來進行權限驗證的,已經包含在JDK1.4里面了。所以實際上是多余的包。 

  jcs.jar: 

  如果你準備在Hibernate中使用JCS的話,那么必須包括它,否則就不用。 

  jdbc2_0-stdext.jar: 

  JDBC2.0的擴展包,一般來說數據庫連接池會用上它。不過App Server都會帶上,所以也是多余的。 

  jta.jar: 

  JTA規范,當Hibernate使用JTA的時候需要,不過App Server都會帶上,所以也是多余的。 

  junit.jar: 

  Junit包,當你運行Hibernate自帶的測試代碼的時候需要,否則就不用。 

  xalan.jar, xerces.jar, xml-apis.jar: 

  Xerces是XML解析器,Xalan是格式化器,xml-apis實際上是JAXP。一般App Server都會帶上,JDK1.4也包含了解析器,不過不是Xerces,是Crimson,效率比較差,不過Hibernate用XML只不過是讀取配置文件,性能沒什么緊要的,所以也是多余的。

vesung 2008-01-17 09:58 發表評論
]]>
WebWork2.2+DOJO(續)http://www.tkk7.com/vesung/archive/2008/01/16/175525.htmlvesungvesungWed, 16 Jan 2008 00:46:00 GMThttp://www.tkk7.com/vesung/archive/2008/01/16/175525.htmlhttp://www.tkk7.com/vesung/comments/175525.htmlhttp://www.tkk7.com/vesung/archive/2008/01/16/175525.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/175525.htmlhttp://www.tkk7.com/vesung/services/trackbacks/175525.htmlRemote Div Tag

wiki上的文檔翻譯:
Remote DIV 標簽和普通的Html的DIV標簽工作方式是一樣的,但是它可以通過標簽內指定的一個網址來裝載它的內容.
屬性

名稱 描述
id (必有): DIV的ID
href (必有): 用來獲取內容的網址
delay: 第一次裝載內容需要延遲多長時間 (毫秒)
updateFreq: 多長時間重新取一次內容 (毫秒)
loadingText: 裝載內容中對用戶顯示的文字 (特別是取內容的時候要花費很長的時間
errorText: 如果取內容時發生了錯誤,向用戶顯示的提示
showErrorTransportText: true/false 當獲取內容有問題的時候,是否把錯誤信息當作內容顯示
listenTopics: 監聽的Topic名稱(多個逗號分割), 將會導致此DIV重新獲取內容
afterLoading: 獲取內容后要執行的Javascript代碼

其他功能
使用javascript代碼我們還可以刷新內容,停止或者開始刷新組件.例如一個id是"remotediv1"的div組件:
開始刷新的javascript代碼: remotediv1.start();
停止刷新的javascript代碼remotediv1.stop();
刷新內容的javascript代碼:remotediv1.bind();
Remote DIV標簽最值得關注的特性:
可以自己重新裝載自己的內容
可以監聽Topic,也就是別的動作可以引發更新內容的行為
JavaScript代碼可以控制它的行為
來看Remote Div標簽的最簡單的一個例子example1.jsp:
 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 
 2 <%@ taglib prefix="ww" uri="/webwork" %> 
 3 <html> 
 4 <head> 
 5 <title>Ajax Examples</title> 
 6 <jsp:include page="../commonInclude.jsp"/> 
 7 </head> 
 8 <body> 
 9 <ww:div id="once" theme="ajax" cssStyle="border: 1px solid yellow;" 
10 href="/AjaxTest.action" delay="5000" loadingText="loading">Initial Content</ww:div> 
11 </body></html> 
12 
這個文件,內容非常簡單,使用了一個ww:div標簽,設置了一個id,使用的是ajax這個模板(如果你想定義自己的模板,請務必參考ajax模板的編寫方法),設置讀取內容的url為"/AjaxTest.action",設置延遲5000毫秒后讀取內容,裝載內容時顯示的文本設置為"loading...",div顯示時的初始內容時"Initial Content".

很簡單,在打開網頁5秒后,標簽會自動去訪問"/AjaxTest.action",并把獲取的內容設置為Div的內容.

再來看一個定時自動刷新的例子:

<ww:div id="twoseconds" cssStyle="border: 1px solid yellow;" href="/AjaxTest.action" 
theme
="ajax" delay="2000" updateFreq="3000" errorText="There was an error">Initial Content</ww:div> 

這個標簽產生的結果每3秒鐘刷新一次DIV的內容,和上面的差不多,只是多了一個updateFreq設置.

此標簽還有一個afterLoading屬性,使用方法如下:
<ww:div ...... afterLoading='alert("done")'>Initial Content</ww:div>
<ww:div ...... afterLoading="alert(\"done\")">Initial Content</ww:div>



vesung 2008-01-16 08:46 發表評論
]]>
WebWork2.2+DOJOhttp://www.tkk7.com/vesung/archive/2008/01/15/175518.htmlvesungvesungTue, 15 Jan 2008 10:03:00 GMThttp://www.tkk7.com/vesung/archive/2008/01/15/175518.htmlhttp://www.tkk7.com/vesung/comments/175518.htmlhttp://www.tkk7.com/vesung/archive/2008/01/15/175518.html#Feedback1http://www.tkk7.com/vesung/comments/commentRss/175518.htmlhttp://www.tkk7.com/vesung/services/trackbacks/175518.html 其中主要增加的特性包括:
1.Remote Div Tag -- 遠程區域塊標簽,通過異步調用獲取內容,來動態更新Div.可以循環更新.
2.Remote A Tag --遠程鏈接標簽,點擊鏈接時進行一個遠程異步調用,可以動態更新Div的內容.
3.Tabbed Panelds --選項卡頁面,和普通程序中的選項卡一樣,可以有多個選項頁面,每個頁面的內容都可以設置(本地或者從遠程獲取),點擊一個選項頁,切換頁面.
4.Remote Form --遠程表單,也就是提交但不刷新的表單,點擊提交按鈕,頁面不刷新,通過遠程異步調用,更新目標區域的內容.
5.Form Validation --表單校驗,在表單中的每個控件輸入數據都可以進行即時的校驗,主要使用的是DWR.

先了解一下Dojo的工作原理:

清除緩存的代碼:
1 response.setHeader("Pragma""no-cache"); 
2 response.setHeader("Cache-Control""no-cache"); 
3 response.setDateHeader("Expires"0); 
或者用html的meta來試試,不過那就包含在內容里了.
為了使用WebWork的AJAX組件,我們需要在頁面里面根據Dojo的做法包含一些代碼,例如ajax例子里面的commonInclude.jsp文件:
 1 <%@ taglib prefix="ww" uri="/webwork" %> 
 2 <!--// START SNIPPET: common-include--> 
 3 <script language="JavaScript" type="text/javascript"> 
 4 // Dojo configuration 
 5 djConfig = { 
 6 baseRelativePath: "<ww:url includeParams="none" value="/webwork/dojo/"/>"
 7 isDebug: false 
 8 }; 
 9 </script> 
10 
11 <script language="JavaScript" type="text/javascript" 
12 src="<ww:url includeParams="none" value="/webwork/dojo/dojo.js" />"></script> 
13 <script language="JavaScript" type="text/javascript" 
14 src="<ww:url includeParams="none" value="/webwork/CommonFunctions.js" />"></script> 
15 
16 <script language="JavaScript" type="text/javascript"
17 dojo.require("dojo.io.BrowserIO"); 
18 dojo.require("dojo.event.topic"); 
19 dojo.require("webwork.widgets.Bind"); 
20 dojo.require("webwork.widgets.BindDiv"); 
21 dojo.require("webwork.widgets.BindButton"); 
22 dojo.require("webwork.widgets.BindAnchor"); 
23 </script> 
24 <!--// END SNIPPET: common-include--> 
25 
這個文件里面對Dojo進行了設置,包含dojo.js,并且引入了webwork實現的這幾個裝飾件的代碼,在后面的每個例子中,都要包含這個文件,因為后面的介紹中將省略這個文件的介紹,要想了解更多信息,可以參考Dojo的文檔.

提示:其實在webwork框架下面引入dojo最容易了只需在頁面加入下面一行即可:
<ww:head theme="ajax" debug="true" />

--待續--

vesung 2008-01-15 18:03 發表評論
]]>
你是如何處理捕獲的異常的?http://www.tkk7.com/vesung/archive/2008/01/09/174002.htmlvesungvesungWed, 09 Jan 2008 06:46:00 GMThttp://www.tkk7.com/vesung/archive/2008/01/09/174002.htmlhttp://www.tkk7.com/vesung/comments/174002.htmlhttp://www.tkk7.com/vesung/archive/2008/01/09/174002.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/174002.htmlhttp://www.tkk7.com/vesung/services/trackbacks/174002.html         錯誤在于,異常總是意味著某些事情不對勁了,或者說至少發生了某些不尋常的事情,我們不應該對程序發出的求救信號保持沉默和無動于衷。調用一下printStackTrace算不上“處理異常”。不錯,調用printStackTrace對調試程序有幫助,但程序調試階段結束之后,printStackTrace就不應再在異常處理模塊中擔負主要責任了。 
        那么,應該怎樣改正呢?主要有四個選擇:

  1、處理異常。針對該異常采取一些行動,例如修正問題、提醒某個人或進行其他一些處理,要根據具體的情形確定應該采取的動作。再次說明,調用printStackTrace算不上已經“處理好了異常”。

  2、重新拋出異常。處理異常的代碼在分析異常之后,認為自己不能處理它,重新拋出異常也不失為一種選擇。

  3、把該異常轉換成另一種異常。大多數情況下,這是指把一個低級的異常轉換成應用級的異常(其含義更容易被用戶了解的異常)。

  4、不要捕獲異常。

  結論一:既然捕獲了異常,就要對它進行適當的處理。不要捕獲異常之后又把它丟棄,不予理睬。

vesung 2008-01-09 14:46 發表評論
]]>
tomcat 的緩存機制http://www.tkk7.com/vesung/archive/2008/01/09/173995.htmlvesungvesungWed, 09 Jan 2008 06:22:00 GMThttp://www.tkk7.com/vesung/archive/2008/01/09/173995.htmlhttp://www.tkk7.com/vesung/comments/173995.htmlhttp://www.tkk7.com/vesung/archive/2008/01/09/173995.html#Feedback0http://www.tkk7.com/vesung/comments/commentRss/173995.htmlhttp://www.tkk7.com/vesung/services/trackbacks/173995.html 當請求jsp頁面時,Tomcat會分派給JspServlet來處理,在jspServlet的方法 service()中有一句
boolean precompile = preCompile(request); 
它會判斷你請求jsp頁面時有沒有帶?jsp_precompile查詢字符串,如果帶了就會重新編譯
然后再由serviceJspFile(request, response, jspUri, null, precompile)進一步判斷是否要進行編譯jsp文件,下面是JspServletWraper service方法
 1 if (options.getDevelopment() || firstTime ) { 
 2 synchronized (this) { 
 3 if (firstTime) { 
 4 firstTime = false
 5 
 6 // The following sets reload to true, if necessary 
 7 ctxt.compile(); 
 8 
 9 
10 
關鍵就在Compiler的isOutDated(boolean checkClass) 的判斷上 。
判斷標準是,如果 jsp最后修改時間大于目標文件的最后修改時間要重新編譯。還有一種情況就是即使jsp的最后修改時間晚于目標文件的最后修改時間,但只要jsp中用了
include指令包含的某個文件的最后修改時間早于對應目標文件的修改時間的話,也是需要重新編譯主jsp文件的


vesung 2008-01-09 14:22 發表評論
]]>
主站蜘蛛池模板: 国产jizzjizz免费视频| 日韩在线视频免费看| 13一14周岁毛片免费| 69天堂人成无码麻豆免费视频| 亚洲人成网站免费播放| 国产免费啪嗒啪嗒视频看看| 亚洲av无码成人精品区在线播放| 亚洲人成精品久久久久| 亚洲香蕉免费有线视频| 亚洲av成人一区二区三区观看在线 | 美女被cao网站免费看在线看| 免费无码VA一区二区三区| 成人无遮挡裸免费视频在线观看 | 亚洲乱码在线视频| 国产精品亚洲专一区二区三区| 精品无码国产污污污免费网站国产| 久久精品视频免费看| 成年女人18级毛片毛片免费观看| 日韩免费高清视频网站| 亚洲无人区一区二区三区| 亚洲精品视频专区| 国产免费无遮挡精品视频| 亚洲小说区图片区另类春色| 亚洲精品视频免费看| 午夜亚洲国产精品福利| 成人性做爰aaa片免费看| 好先生在线观看免费播放| 无码国产亚洲日韩国精品视频一区二区三区 | 麻豆成人久久精品二区三区免费| 成人看的午夜免费毛片| 自拍偷自拍亚洲精品被多人伦好爽| 亚洲视频在线观看网站| 日韩久久无码免费毛片软件| 18以下岁毛片在免费播放| 大胆亚洲人体视频| 亚洲国产日韩在线| 中文永久免费观看网站| 成人人免费夜夜视频观看| 亚洲av无码不卡一区二区三区| 亚洲国产精品美女久久久久| 久爱免费观看在线网站|