優化Spring啟動速度
spring的容器是提供了lazy-load,缺省設置是bean沒有lazy-load,該屬性處于false狀態。
把beans的default-lazy-init改為true就,再次啟動,可以大大降低啟動時間
10:00 ?|? 固定鏈接 | 引用通告 (0) | 記錄它 | JAVA學習
Disable Hibernates usage of cglib reflection optimizer

Put the following line in hibernate.properties:

hibernate.cglib.use_reflection_optimizer=false
9:57 ?|? 固定鏈接 | 引用通告 (0) | 記錄它 | JAVA學習
Use serialized XML documents when configuring Configuration

When building the configuration 40-60% of the time is used by the XML parsers and Dom4j to read up the XML document. Significant performance increases can be done by serializing the Document object's to disc once, and afterwards just add them to the configuration by deserializing them first.

In the current cvs we have an experimental Configuration.addCachableFile() method that can be used as inspiration for previous Hibernate versions.

public Configuration addCachableFile(String xmlFile) throws MappingException {        
        try {
            File file = new File(xmlFile);
            File lazyfile = new File(xmlFile + ".bin");
            org.dom4j.Document doc = null; 
            List errors = new ArrayList();
            if(file.exists() && lazyfile.exists() && file.lastModified()<lazyfile.lastModified()) {
                log.info("Mapping lazy file: " + lazyfile.getPath());
                ObjectInputStream oip = null;
                oip = new ObjectInputStream(new FileInputStream(lazyfile));
                doc = (org.dom4j.Document) oip.readObject();
                oip.close(); 
            } else {
                doc = xmlHelper.createSAXReader(xmlFile, errors, entityResolver).read( file );
                log.info("Writing lazy file to " + lazyfile);
                ObjectOutputStream oup = new ObjectOutputStream(new FileOutputStream(lazyfile));
                oup.writeObject(doc);
                oup.flush();
                oup.close();
            }
            
            if ( errors.size()!=0 ) throw new MappingException( "invalid mapping", (Throwable) errors.get(0) );
            add(doc);
            return this;
        }
        catch (Exception e) {
            log.error("Could not configure datastore from file: " + xmlFile, e);
            throw new MappingException(e);
        }
    }
9:55 ?|? 固定鏈接 | 引用通告 (0) | 記錄它 | JAVA學習
7月14日
iSQL*PLUS
Enterprise Manager Database Control URL - (orcl) :
http://name:1158/em
iSQL*Plus URL 為:
http://name:5560/isqlplus
iSQL*Plus DBA URL 為:
http://name:5560/isqlplus/dba
14:31 ?|? 固定鏈接 | 引用通告 (0) | 記錄它 | JAVA學習
7月12日
JDBC學習筆記——JDBC性能優化(轉)

作者:佚名????來自:CSDN
jdbc程序的性能主要由兩個因素決定,一是數據庫本身的性質,另一個是與數據庫相對獨立的jdbc應用程序接口(api)的使用。這里說的是如何正確使用jdbc編程接口,以獲得更好的性能。
  jdbc主要優化有:
  1.選擇正確的jdbc驅動程序
  2.Connention的優化:使用連接池來管理Connection對象
  3.Statement的優化:使用批量更新等
  4.Result的優化:正確的從數據庫中get數據等

  (1)選擇正確的jdbc驅動程序:
  1、jdbc-odbc 橋
  2、本地api-部分 java驅動
  3、jdbc網路協議-純java驅動
  4、jdbc本地協議
  最好選擇 jdbc網路協議-純java驅動? 效率比較高? 但需要第三方軟件的支持 比如corba? weblogic屬于這種類型

  (2)優化Connection對象:
  1、設置適當的參數
   DriverManager.getConnection(String url,Properties props);
   例如:
   Properties props=new Properties();
   props.put("user","wuwei");
   props.put("password","wuwei");
   props.put("defaultRowPrefectch","30");
   props.put("dufaultBatchValue","5");
   Connection con=DriverManager.getConnection("jdbc:oracle:thin:@hostsString",props);
   對象可以通過設置setDefaultRowPrefetch(int) 和 setDefaultBatchValue(int) 兩個參數類優化連接
  2、使用連接池
   可以自己寫一個連接池,這樣程序的靈活性強,便于移植。
????? apache項目開發了一套非常通用而表現非常穩定的對象池 http://jakarta.apache.org/commons/pool.htm
????? 設計了自己的連接池后,在客戶端調用建立對象:
   public Object makeObject() throws Exception{
    Class.forName("oracle.jdbc.driver.OracalDriver");
    return DriverManager.getConnection("url","username","password");
   }
????? 銷毀對象時用:
   public void destroyObject(Object obj) throws Exception{
    ((Connection)obj.close());
   }
   注意幾點:對象池里有沒有回收機制,對象池里有機有容量限制,對象池里有多少個閑置對象(可以釋放)
  3、控制事務的提交
   最好手動提交事務,不但可以可以保證數據原子性,而且對新能提高留下余地。
   try{
    connection.setAutoCommint(false);
    // 代碼用PreparedStatement性能比Statementh好
    connection.commit();
    connection.setAutoCommit(true);
   }catch(SQLException e){
   }finally{
    //代碼
    if(connection!=null){
     connection.close();?
    }
   }
  4、適當的選擇事務的隔離級別
   TRANSACTION_READ_UNCOMMITED? 性能最高
   TRANSACTION_READ_COMMITED??? 快
   TRANSACTION_REFEATABLE_READ? 中等
   RANSACTION_SERIALIZABLE????? 慢

  (3)Statement 優化:
  jdbc3個接口用來處理sql的執行,是Statement PreparedStatement CallableStatement提供適當的Statement接口批量執行sql從數據庫批量獲取數據。
  PreparedStatement 比Statement性能要好 主要體現在一個sql語句多次重復執行的情況。
  PreparedStatemnt只編譯解析一次而Statement每次編譯一次。

  批量修改數據庫
  Statement 提供方法addBatch(String)和executeBatch()
  調用方法為
  stmt.addBatch("isnert.....");
  stmt.addBatch("update.....");
  stmt.executeBatch();
  也可以用PreparedStatement從而更好的提高性能:
  pstmt=conn.preparedStatement("insert into test_table(......) values(....?)");
  pstmt.setString(1,"aaa");
  pstmt.addBatch();
  pstmt.setString(1,"bbb");
  pstmt.addBatch();
  .....
  pstmt.executeBatch();

  批量地從數據庫中取數據:
  通過setFetchSize()和getFectchSize()方法來設定和查看這個參數,這個參數對體統的性能影響比較大。這個參數太小會嚴重地降低程序的性能。
  Connection Statement ResultSet都有這個參數,他們對性能地影響順序是:ResultSet---Statement---Connection

  (4)優化ResultSet:
  體現在以下幾個方面:
  批量讀取數據.合理設置ResultSet的getFetchSize()和setFetchSize()方法中的參數
  使用正確的get和set方法
  使用整數而不是字段名作為參數性能比較高
  例如:
  setInt(1,100);
  setString(2,"aaaa");
  比
  setInt("id","100");
  setString("name","aaaa");
  性能好
  設置適當的滾動方向。有3個方向FETCH_FORWORD,FETCH_REVERSE FETCH_UNKNOWN,單向滾動性能比較高。

  其他方面的性能優化
  及時顯示的關閉Connection Statement ResultSet,其中Connection可以用Connetion Pool處理。
  使用數據庫系統的強大查詢功能去組織數據。這樣程序運行是和數據庫服務的交互次數少,數據庫返回給程序的記錄條數少的多,所以性能有很大的提高。

17:58 ?|? 固定鏈接 | 引用通告 (0) | 記錄它 | JAVA學習
7月11日
設計模式的一個單詞解釋
PO:persistant object 持久對象,可以看成是與數據庫中的表相映射的java對象。最簡單的PO就是對應數據庫中某個表中的一條記錄,多個記錄可以用PO的集合。PO中應該不包含任何對數據庫的操作。
VO:value object值對象。通常用于業務層之間的數據傳遞,和PO一樣也是僅僅包含數據而已。但應是抽象出的業務對象,可以和表對應,也可以不,這根據業務的需要.個人覺得同DTO(數據傳輸對象),在web上傳遞。
DAO:data access object 數據訪問對象,此對象用于訪問數據庫。通常和PO結合使用,DAO中包含了各種數據庫的操作方法。通過它的方法,結合PO對數據庫進行相關的操作。
BO:business object 業務對象,封裝業務邏輯的java對象,通過調用DAO方法,結合PO,VO進行業務操作。
POJO:plain ordinary java object 簡單無規則java對象,我個人覺得它和其他不是一個層面上的東西,VO和PO應該都屬于它。
15:48 ?|? 固定鏈接 | 引用通告 (0) | 記錄它 | JAVA學習
結合struts和hibernate談J2EE架構的數據表示 (轉)
此篇文章作者:robbin
此篇文章來源: http://forum.hibernate.org.cn/
?
在 struts+ hibernate 這種結構中,是不應該把Hibernate產生的PO直接傳遞給JSP的,不管他是Iterator,還是List,這是一個設計錯誤。

我來談談在J2EE架構中各層的數據表示方法:

Web層的數據表示是FormBean,數據來源于HTML Form POST
業務層的數據表示是VO
持久層的數據表示是PO,其數據來源于數據庫,持久層的數據表示例如CMP

在一個規范的J2EE架構中,不同層的數據表示應該被限制在層內,而不應該擴散到其它層,這樣可以降低層間的耦合性,提高J2EE架構整體的可維護性和可擴展性。比如說Web層的邏輯進行了修改,那么只需要修改FormBean的結構,而不需要觸動業務層和持久層的代碼修改。同樣滴,當數據庫表進行了小的調整,那么也只需要修改持久層數據表示,而不需要觸動業務層代碼和Web層代碼。

不過由于Hibernate的強大功能,例如動態生成PO,PO的狀態管理可以脫離Session,使得在應用了Hibernate的J2EE框架中,PO完全可以充當VO,因此我們下面把PO和VO合并,統稱為PO。

先來談談ActionFormBean和持久層的PO之間的重大區別。

在簡單的應用中,ActionFormBean和PO幾乎是沒有區別,所以很多人干脆就是用ActionFormBean來充當PO,于是ActionFormBean從JSP頁面到Servlet控制層再到業務層,然后穿過持久層,最后一直映射到數據庫表。真是一竿子捅到了底!

但是在復雜的應用中,ActionFormBean和PO是分離的,他們也不可能一樣。ActionFormBean是和網頁里面的Form表單一一對應的,Form里面有什么元素,Bean里面就有什么屬性。而PO和數據庫表對應,因此如果數據庫表不修改,那么PO也不會修改,如果頁面的流程和數據庫表字段對應關系不一致,那么你又如何能夠使用ActionFormBean來取代PO呢?

比如說吧,用戶注冊頁面要求注冊用戶的基本信息,因此HTML Form里面包含了基本信息屬性,于是你需要一個ActionFormBean來一一對應(注意:是一一對應),每個Bean屬性對應一個文本框或者選擇框什么的。

而用戶這個持久對象呢?他的屬性和ActionFormBean有什么明顯不同呢?他會有一些ActionFormBean所沒有的集合屬性,比如說用戶的權限屬性,用戶的組屬性,用戶的帖子等等。另外還有可能的是在ActionFormBean里面有3個屬性,分別是用戶的First Name, Middle Name, Last Name,而在我的User這個持久對象中就是一個 Name 對象屬性。

假設我的注冊頁面原來只要你提供First Name,那么ActionFormBean就這一個屬性,后來我要你提供全名,你要改ActionFormBean,加兩個屬性。但是這個時候PO是不應該修改滴,因為數據庫沒有改。

那么在一個完整的J2EE系統中應該如何進行合理的設計呢?

JSP(View) ---> ActionFormBean(Module) ---> Action(Control)

ActionFormBean是Web層的數據表示,它和HTML頁面Form對應,只要Web頁面的操作流程發生改變,它就要相應的進行修改,它不應該也不能被傳遞到業務層和持久層,否則一旦頁面修改,會一直牽連到業務層和持久層的大面積的代碼進行修改,對于軟件的可維護性和可擴展性而言,是一個災難,Actiont就是他的邊界,到此為止!

Action(Web Control) ---> Business Bean ---> DAO ---> ORM --->DB

而PO則是業務層和持久層的數據表示,它在業務層和持久層之間進行流動,他不應該也不能被傳遞到Web層的View中去,而ActionServlet就是他的邊界,到此為止!

然后來看一看整個架構的流程:

當用戶通過瀏覽器訪問網頁,提交了一個頁面。于是Action拿到了這個FormBean,他會把FormBean屬性讀出來,然后構造一個PO對象,再調用業務層的Bean類,完成了注冊操作,重定向到成功頁面。而業務層Bean收到這個PO對象之后,調用DAO接口方法,進行持久對象的持久化操作。

當用戶查詢某個會員的信息的時候,他用全名進行查詢,于是Action得到一個UserNameFormBean包括了3個屬性,分別是first name, middle name, last name,然后Action把UserNameFormBean的3個屬性讀出來,構造Name對象,再調用業務Bean,把Name對象傳遞給業務Bean,進行查詢。

業務Bean取得Name(注意: Name對象只是User的一個屬性)對象之后調用DAO接口,返回一個User的PO對象,注意這個User不同于在Web層使用的UserFormBean,他有很多集合屬性滴。然后業務Bean把User對象返回給Action。

Action拿到User之后,把User的基本屬性取出(集合屬性如果不需要就免了),構造UserFormBean,然后把UserFormBean request.setAttribute(...),然后重定向到查詢結果頁面。

查詢頁面拿到request對象里面的ActionFormBean,自動調用tag顯示之。

總結:

FormBean是Web層的數據表示,他不能被傳遞到業務層;PO是持久層的數據表示,在特定情況下,例如Hibernate中,他可以取代VO出現在業務層,但是不管PO還是VO都必須限制在業務層內使用,最多到達Web層的Control,絕不能被擴散到View去。

FormBean和PO之間的數據轉化是在Action中進行滴。

BTW:

JDO1.x還不能像Hibernate功能這樣強大,PO不能脫離持久層,所以必須在業務層使用VO,因此必須在業務層進行大量的VO和PO的轉化操作,相對于Hibernate來說,編程比較煩瑣。

當然咯,理論是一回事,實際操作也不一定非要這樣干,你可以自行取舍,在實際項目中靈活一點,增加一點bad smell,提高開發效率。只不過在大型項目中最好還是嚴絲合縫,不然的話,改版的時候會痛苦的很滴。
15:28 ?|? 固定鏈接 | 引用通告 (0) | 記錄它 | JAVA學習
7月5日
判斷字符串中第一次出現數字的長度
String[] str1=str.split("\\d");
13:41 ?|? 固定鏈接 | 引用通告 (0) | 記錄它 | JAVA學習
7月4日
properties文件編碼
native2ascii -encoding gb2312 a.properties b.properties
9:46 ?|? 固定鏈接 | 引用通告 (0) | 記錄它
6月21日
修改XP Search 的準確性和速度

更準:Windows XP默認不會搜索某些目錄中的文件,且其對文件內搜索的支持也不是很完善,我們可以以下方法讓搜索的結果更為全面:運行“Regedit”命令打開注冊表編輯器,定位到“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer”,在右邊窗口中分別將CaseSensitive、IncludeSubFolders、SearchHidden、SearchSlowFiles、SearchSystemDirs(如果沒有則新建,其類型為REG_DWORD)的值修改為1,這樣可以最大限度擴大搜索目錄。接下來定位到“HKEY_CLASSES_ ROOT”分支,這里是控制文件內搜索所支持的文件類型,我們可以將幾種比較常見的文件類型添加進去,以新建其對htm格式文件內搜索支持為例,方法是:在該分支新建一個名為“HTM”的項,再在HTM項新建一個名為“PersistentHandler”并將其默認值修改為“{5e941d80- bf96-11cd-b579- 08002b30bfeb}”。

更快:上面介紹了如何讓搜索結果更多的技巧,那樣的代價就是搜索速度的緩慢,如果你想讓搜索更快,那么可以將“HKEY_CLASSES_ROOT”分支下不需要的文件類似刪除。我們打開搜索窗口,依次單擊“改變首選項→使用制作索引服務”將其開啟,這樣在我們系統處于空閑狀態時,系統會自動將本機文件編制索引并加以維護,提高搜索速度。

16:48 ?|? 固定鏈接 | 引用通告 (0) | 記錄它 | 計算機與 Internet
6月20日
設置Tomcat的上傳最大限制
maxPostSize="20097152"
14:47 ?|? 固定鏈接 | 引用通告 (0) | 記錄它
6月8日
世界杯時間表。
世界杯時間表。
日期 時間 對陣 組別 比賽地 場次
6月10日
星期六
00:00 德國 VS 哥斯達黎加 A 慕尼黑 1
03:00 波蘭 VS 厄瓜多爾 A 蓋爾森基興 2
21:00 英格蘭 VS 巴拉圭 B 法蘭克福 3
6月11日
星期日
00:00 特立尼達和多巴哥 VS 瑞典 B 多特蒙德 4
03:00 阿根廷 VS 科特迪瓦 C 漢堡 5
21:00 塞黑 VS 荷蘭 C 萊比錫 6
6月12日
星期一
00:00 墨西哥 VS 伊朗 D 紐倫堡 7
03:00 安哥拉 VS 葡萄牙 D 科隆 8
21:00 澳大利亞 VS 日本 F 凱澤斯勞滕 12
6月13日
星期二
00:00 美國 VS 捷克 E 蓋爾森基興 10
03:00 意大利 VS 加納 E 漢諾威 9
21:00 韓國 VS 多哥 G 法蘭克福 14
6月14日
星期三
00:00 法國 VS 瑞士 G 斯圖加特 13
03:00 巴西 VS 克羅地亞 F 柏林 11
21:00 西班牙 VS 烏克蘭 H 萊比錫 15
6月15日
星期四
00:00 突尼斯 VS 沙特阿拉伯 H 慕尼黑 16
03:00 德國 VS 波蘭 A 多特蒙德 17
21:00 厄瓜多爾 VS 哥斯達黎加 A 漢堡 18
6月16日
星期五
00:00 英格蘭 VS 特立尼達和多巴哥 B 紐倫堡 19
03:00 瑞典 VS 巴拉圭 B 柏林 20
21:00 阿根廷 VS 塞黑 C 蓋爾森基興 21
6月17日
星期六
00:00 荷蘭 VS 科特迪瓦 C 斯圖加特 22
03:00 墨西哥 VS 安哥拉 D 漢諾威 23
21:00 葡萄牙 VS 伊朗 D 法蘭克福 24

6月18日
星期日

00:00 捷克 VS 加納 E 科隆 26
03:00 意大利 VS 美國 E 凱澤斯勞滕 25
21:00 日本 VS 克羅地亞 F 紐倫堡 28

6月19日
星期一

00:00 巴西 VS 澳大利亞 F 慕尼黑 27
03:00 法國 VS 韓國 G 萊比錫 29
21:00 多哥 VS 瑞士 G 多特蒙德 30

6月20日
星期二

00:00 沙特阿拉伯 VS 烏克蘭 H 漢堡 32
03:00 西班牙 VS 突尼斯 H 斯圖加特 31
22:00 厄瓜多爾 VS 德國 A 柏林 33
22:00 哥斯達黎加 VS 波蘭 A 漢諾威 34

6月21日
星期三

03:00 瑞典 VS 英格蘭 B 科隆 35
03:00 巴拉圭 VS 特立尼達和多巴哥 B 凱澤斯勞滕 36
22:00 葡萄牙 VS 墨西哥 D 蓋爾森基興 39
22:00 伊朗 VS 安哥拉 D 萊比錫 40

6月22日
星期四

03:00 荷蘭 VS 阿根廷 C 法蘭克福 37
03:00 科特迪瓦 VS 塞黑 C 慕尼黑 38
22:00 捷克 VS 意大利 E 漢堡 41
22:00 加納 VS 美國 E 紐倫堡 42

6月23日
星期五

03:00 日本 VS 巴西 F 多特蒙德 43
03:00 克羅地亞 VS 澳大利亞 F 斯圖加特 44
22:00 沙特阿拉伯 VS 西班牙 H 凱澤斯勞滕 47
22:00 烏克蘭 VS 突尼斯 H 柏林 48

6月24日
星期六

03:00 多哥 VS 法國 G 科隆 45
03:00 瑞士 VS 韓國 G 漢諾威 46
日期 時間 對陣 組別 比賽地 場次

6月24日
星期六

23:00 A1 VS B2 1/8決賽 慕尼黑 49

6月25日
星期日

03:00 C1 VS D2 1/8決賽 萊比錫 50
23:00 B1 VS A2 1/8決賽 斯圖加特 51

6月26日
星期一

03:00 D1 VS C2 1/8決賽 紐倫堡 52
23:00 E1 VS F2 1/8決賽 凱澤斯勞騰 53

6月27日
星期二

03:00 G1 VS H2 1/8決賽 科隆 54
23:00 F1 VS E2 1/8決賽 多特蒙德 55

6月28日
星期三

03:00 H1 VS G2 1/8決賽 漢諾威 56

6月30日
星期五

23:00 49勝者 VS 50勝者 1/4決賽 柏林 57

7月1日
星期六

03:00 53勝者 VS 54勝者 1/4決賽 漢堡 58
23:00 51勝者 VS 52勝者 1/4決賽 蓋爾森基興 59

7月2日
星期日

3:00 55勝者 VS 56勝者 1/4決賽 法蘭克福 60

7月5日
星期三

03:00 57勝者 VS 58勝者 半決賽 多特蒙德 61

7月6日
星期四

03:00 59勝者 VS 60勝者 半決賽 慕尼黑 62

7月9日
星期日

03:00 61負者 VS 62負者 3、4名決賽 斯圖加特 63

7月10日
星期一

02:00 61勝者 VS 62勝者 決賽 柏林 64
17:45 ?|? 固定鏈接 | 引用通告 (0) | 記錄它
6月7日
SQL Server中各個系統表的作用
sysaltfiles???????? ?? 主數據庫???????????????保存數據庫的文件
syscharsets????? ? 主數據庫???????????????字符集與排序順序
sysconfigures? ?? 主數據庫???????????????配置選項
syscurconfigs???? 主數據庫???????????????當前配置選項
sysdatabases??? 主數據庫???????????????服務器中的數據庫
syslanguages??? 主數據庫???????????????語言
syslogins??????????? 主數據庫???????????????登陸帳號信息
sysoledbusers?? 主數據庫???????????????鏈接服務器登陸信息
sysprocesses??? 主數據庫???????????????進程
sysremotelogins 主數據庫???????????????遠程登錄帳號
syscolumns??????? 每個數據庫?????????????列
sysconstrains???? 每個數據庫?????????????限制
sysfilegroups????? 每個數據庫?????????????文件組
sysfiles???????????????? 每個數據庫?????????????文件
sysforeignkeys? ?每個數據庫?????????????外部關鍵字
sysindexs????????? ? 每個數據庫?????????????索引
sysmenbers???????每個數據庫?????????????角色成員
sysobjects????????? ?每個數據庫?????????????所有數據庫對象
syspermissions?每個數據庫?????????????權限
systypes??????????? ?? 每個數據庫?????????????用戶定義數據類型
sysusers????????????? 每個數據庫?????????????用戶
12:21 ?|? 固定鏈接 | 引用通告 (0) | 記錄它 | JAVA學習
5月30日
每滾動一條信息停頓javascript
<DIV id=scroll_image onmouseover=bMouseOver=0 style="OVERFLOW: hidden; WIDTH: 202px; HEIGHT: 20px" onmouseout=bMouseOver=1>
?????<SCRIPT language=javascript>
?????var scrollerheight=20;
?????var html,total_area=0,wait_flag=true;
?????var bMouseOver = 1;
?????var scrollspeed = 1;
?????var waitingtime = 3500;
?????var s_tmp = 0, s_amount = 20;
?????var scroll_content=new Array();
?????var startPanel=0, n_panel=0, i=0;
?????function startscroll()
?????{
?????i=0;
?????for (i in scroll_content)
?????n_panel++;
?????n_panel = n_panel -1 ;
?????startPanel = Math.round(Math.random()*n_panel);
?????if(startPanel == 0)
?????{
?????i=0;
?????for (i in scroll_content)
?????insert_area(total_area, total_area++);
?????}
?????else if(startPanel == n_panel)
?????{
?????insert_area(startPanel, total_area);
?????total_area++;
?????for (i=0; i<startPanel; i++)
?????{
?????insert_area(i, total_area);
?????total_area++;
?????}
?????}
?????else if((startPanel > 0) || (startPanel < n_panel))
?????{
?????insert_area(startPanel, total_area);
?????total_area++;
?????for (i=startPanel+1; i<=n_panel; i++)
?????{
?????insert_area(i, total_area);
?????total_area++;
?????}
?????for (i=0; i<startPanel; i++)
?????{
?????insert_area(i, total_area);
?????total_area++;
?????}
?????}
?????window.setTimeout("scrolling()",waitingtime);
?????}
?????function scrolling(){
?????if (bMouseOver && wait_flag)
?????{
?????for (i=0;i<total_area;i++){
?????tmp = document.getElementById('scroll_area'+i).style;
?????tmp.top = parseInt(tmp.top)-scrollspeed;
?????if (parseInt(tmp.top) <= -scrollerheight){
?????tmp.top = scrollerheight*(total_area-1);
?????}
?????if (s_tmp++ > (s_amount-1)*scroll_content.length){
?????wait_flag=false;
?????window.setTimeout("wait_flag=true;s_tmp=0;",waitingtime);
?????}
?????}
?????}
?????window.setTimeout("scrolling()",1);
?????}
?????function insert_area(idx, n){
?????html='<div style="left: 0px; width: 100%; position: absolute; top: '+(scrollerheight*n)+'px" id="scroll_area'+n+'">';
?????html+=scroll_content[idx];
?????html+='</div>';
?????document.write(html);
?????}
?????var newsVar = 0;
?????<%
??????Iterator it=col.iterator();
??????EScheduleDto dto=null;
??????int i=0;
??????while(it.hasNext()){
???????dto=(EScheduleDto) it.next();
?????%>
?????scroll_content[<%=i++%>]='<a href="javascript:refreshleftmenu(\'4\',\'4021\',\'/edoas2/shiwuchuli/opentheschedule?id=<%=dto.getEId()%>\');"><font style="font-size:10pt; text-decoration:none; color:red"><%=dto.getETitle()%></font></a>';
?????<%
??????}
?????%>
?????</SCRIPT>
?????<SCRIPT>startscroll();</SCRIPT>
?????</DIV>
17:52 ?|? 固定鏈接 | 引用通告 (0) | 記錄它 | JAVA學習
5月15日
替換html代碼
res = res.replaceAll("&", "&amp;");
res = res.replaceAll("<", "&lt;");
res = res.replaceAll(">", "&gt;");
res = res.replaceAll("'", "&apos;");
res = res.replaceAll("\"", "&quot;");
res = res.replaceAll("\n", "<br/>");
res = res.replaceAll("\r", "");
res = res.replaceAll(" ", "&nbsp;");
10:59 ?|? 固定鏈接 | 引用通告 (0) | 記錄它 | JAVA學習
5月5日
痛苦的五一假期
?今天已經是五月五號了 已經加了3天班了 正經就五月一號和三號給我們休息 三號還是應為公司停電,要不然也要加班 。?別人加班要給三薪 我們加班一頓麗華快餐就給打發了 哎 苦命~
? 一號那天在家好好的休息了一天 已經好長時間沒有在家休息了 偶爾在家休息一天還有點不太習慣 ?已經習慣了這種天天加班的生活 真不明白 為什么 “程序員”=“加班” 這個公式是誰發明的
?二號在公司加了一天班 到了晚上跟幾個同事去參加第二天另一個同事的婚禮,做了三個多小時的車才到( 好遠呀 快到河北了) 第一次看到農村的婚禮原來是這樣大家在家里吃吃喝喝的也挺爽的 跟她同事玩了一宿牌 等著明天參加婚禮 嘿嘿!
?三號 早上4點跟同事去接新娘 到了路上我才知道 原來我是“伴郎” 暈!~ 沒有一點準備 只好趕鴨子上架了 到了新娘家跟同事去娶親 原來這是個體力活 需要良好的身體素質才能把門打開 還好新郎身材比較魁梧 (忽然想到了自己 ,現在開始每天鍛煉身體 ,為將來做準備 嘿嘿) 廢了好大的力氣和很多紅包 總算把門打開了 回到新郎家開始舉行婚禮 干了一個非常丟人的事 司儀說送親的把手舉起來 我居然把手抬的那么高 暈 我是伴郎 因該事娶親的呀 天呀~ 我得臉當時都不知道事什么顏色的了 (紅里透著紫)太丟人了 在回來的路上同事笑了我一路 這次沒有經驗下次估計就好了
?四號 在郁悶無奈中加了一天的班
?五號 上午干的還不錯 實現了不少功能 中午吃完飯 忽然很郁悶不知道怎么回事就想跟別人聊聊,也不知道跟誰聊好 就上來寫寫 想想自己一個人要是不加班還真不知到 該去干什么 (只能這么安慰自己)
13:55 ?|? 固定鏈接 | 引用通告 (0) | 記錄它
ANT安裝、配置

ANT安裝、配置

內容摘要:
ant是一個基于JAVA的自動化腳本引擎,腳本格式為XML。除了做JAVA編譯相關任務外,ANT還可以通過插件實現很多應用的調用。


ANT的基本概念:
ANT的安裝:解包,設置路徑
ANT的使用:最好的學習只不過是一個簡單實用的例子起步……
ANT的基本概念:Java的Makefile
當一個代碼項目大了以后,每次重新編譯,打包,測試等都會變得非常復雜而且重復,因此c語言中有make腳本來幫助這些工作的批量完成。在Java 中應用是平臺無關性的,當然不會用平臺相關的make腳本來完成這些批處理任務了,ANT本身就是這樣一個流程腳本引擎,用于自動化調用程序完成項目的編譯,打包,測試等。除了基于JAVA是平臺無關的外,腳本的格式是基于XML的,比make腳本來說還要好維護一些。


每個ant腳本(缺省叫build.xml)中設置了一系列任務(target):比如對于一個一般的項目可能需要有以下任務。

任務1:usage 打印本腳本的幫助信息(缺省)
任務2:clean <-- init 清空初始化環境
任務3:javadoc <-- build <-- init 生成JAVADOC
任務4:jar <-- build <-- init 生成JAR
任務5:all <-- jar + javadoc <-- build <-- init 完成以上所有任務:jar javadoc
而多個任務之間往往又包含了一定了依賴關系:比如把整個應用打包任務(jar)的這個依賴于編譯任務(build),而編譯任務又依賴于整個環境初始化任務(init)等。

注:我看到很多項目的ant腳本中的命名基本上都是一致的,比如:編譯一般叫build或者compile;打包一般叫jar或war;生成文檔一般命名為javadoc或javadocs;執行全部任務all。在每個任務的中,ANT會根據配置調用一些外部應用并配以相應參數執行。雖然ANT可調用的外部應用種類非常豐富,但其實最常用的就2,3個:比如javac javadoc jar等。
ANT的安裝
解包后在系統可執行路徑中加入指向ant的bin的路徑就可以了,比如可以在GNU/Linux上把以下配置加入/etc/profile中:
export ANT_HOME=/home/ant
export JAVA_HOME=/usr/java/j2sdk1.4.1
export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin

這樣執行ant 后,如果不指定配置文件ant會缺省找build.xml這個配置文件,并根據配置文件執行任務,缺省的任務設置可以指向最常用的任務,比如: build,或指向打印幫助信息:usage,告訴用戶有那些腳本選項可以使用。


ANT的使用

最好的學習過程就是看懂那些open source項目中的build.xml腳本,然后根據自己的需要簡化成一個更簡單的,ANT和APACHE上很多非常工程派的項目:簡單易用,而且適應性非常強,因為這些項目的建立往往來源于開發人員日常最直接的需求。
以下是的一個WebLucene應用的例子:修改自JDOM的build.xml:

<project default="usage" basedir=".">

<!-- =================================================================== -->
<!-- Initialization target -->
<!-- =================================================================== -->
<target name="init">
<tstamp/>
<property file="${basedir}/build.properties" />
<property name="Name" value="ProjectFullName"/>
<property name="name" value="project_name"/>
<property name="version" value="0.2"/>
<property name="year" value="2003"/>

<echo message="----------- ${Name} ${version} [${year}] ------------"/>

<property name="debug" value="off"/>
<property name="optimize" value="on"/>
<property name="deprecation" value="on"/>

<property name="src.dir" value="./src/WEB-INF/src"/>
<property name="lib.dir" value="./src/WEB-INF/lib"/>
<property name="packages" value="com.chedong.*,org.apache.lucene.*"/>

<property name="build.src" value="./src/WEB-INF/build"/>
<property name="build.dest" value="./src/WEB-INF/classes"/>
<property name="build.javadocs" value="./src/doc"/>

<path id="classpath">
<pathelement path="${jsdk_jar}"/>
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>

<filter token="year" value="${year}"/>
<filter token="version" value="${version}"/>
<filter token="date" value="${TODAY}"/>
<filter token="log" value="true"/>
<filter token="verbose" value="true"/>
</target>

<!-- =================================================================== -->
<!-- Help on usage -->
<!-- =================================================================== -->
<target name="usage" depends="init">
<echo message="${Name} Build file"/>
<echo message="-------------------------------------------------------------"/>
<echo message=""/>
<echo message=" available targets are:"/>
<echo message=""/>
<echo message=" jar --> generates the ${name}.jar file"/>
<echo message=" build --> compiles the source code"/>
<echo message=" javadoc --> generates the API documentation"/>
<echo message=" clean --> cleans up the directory"/>
<echo message=""/>
<echo message=" Please rename build.properties.default to build.properties"/>
<echo message=" and edit build.properties to specify JSDK 2.3 classpath."/>
<echo message=""/>
<echo message=" See the comments inside the build.xml file for more details."/>
<echo message="-------------------------------------------------------------"/>
<echo message=""/>
<echo message=""/>
</target>

<!-- =================================================================== -->
<!-- Prepares the source code -->
<!-- =================================================================== -->
<target name="prepare-src" depends="init">
<!-- create directories -->
<mkdir dir="${build.src}"/>
<mkdir dir="${build.dest}"/>

<!-- copy src files -->
<copy todir="${build.src}">
<fileset dir="${src.dir}"/>
</copy>
</target>

<!-- =================================================================== -->
<!-- Compiles the source directory -->
<!-- =================================================================== -->
<target name="build" depends="prepare-src">
<javac srcdir="${build.src}"
destdir="${build.dest}"
debug="${debug}"
optimize="${optimize}">
<classpath refid="classpath"/>
</javac>
</target>

<!-- =================================================================== -->
<!-- Creates the class package -->
<!-- =================================================================== -->
<target name="jar" depends="build">
<jar jarfile="${lib.dir}/${name}.jar"
basedir="${build.dest}"
includes="**"/>
</target>

<!-- =================================================================== -->
<!-- Creates the API documentation -->
<!-- =================================================================== -->
<target name="javadoc" depends="build">
<mkdir dir="${build.javadocs}"/>
<javadoc packagenames="${packages}"
sourcepath="${build.src}"
destdir="${build.javadocs}"
author="true"
version="true"
use="true"
splitindex="true"
windowtitle="${Name} API"
doctitle="${Name}">
<classpath refid="classpath"/>
</javadoc>
</target>

<!-- =================================================================== -->
<!-- Clean targets -->
<!-- =================================================================== -->
<target name="clean" depends="init">
<delete dir="${build.src}"/>
<delete dir="${build.dest}/org"/>
<delete dir="${build.dest}/com"/>
<delete>
<fileset dir="${build.dest}" includes="**/*.class"/>
</delete>
</target>
</project>
<!-- End of file -->

缺省任務:usage 打印幫助文檔,告訴有那些任務選項:可用的有build, jar, javadoc和clean.

初始化環境變量:init
所有任務都基于一些基本環境變量的設置初始化完成,是后續其他任務的基礎,在環境初始化過程中,有2點比較可以方便設置:

1 除了使用卻缺省的property設置了JAVA源路徑和輸出路徑外,引用了一個外部的build.properties文件中的設置,
<property file="${basedir}/build.properties" />
這樣大部分簡單配置用戶只要會看懂build.properties就可以了,畢竟XML比起key value的屬性文件還是要可讀性差一些。用build.properties也可以方便其他用戶從編譯的細節中解放出來。

2 CLASSPATH設置:使用了其中的:
<path id="classpath">
<pathelement path="${jsdk_jar}"/>
<fileset dir="${lib.dir}">
<include name="**/*.jar"/>
</fileset>
</path>
則相當于設置了:CLASSPATH=/path/to/resin/lib/jsdk23.jar; /path/to/project/lib/*.jar;

文件復制:prepare-src
創建臨時SRC存放目錄和輸出目錄。
<!-- =================================================================== -->
<!-- Prepares the source code -->
<!-- =================================================================== -->
<target name="prepare-src" depends="init">
<!-- create directories -->
<mkdir dir="${build.src}"/>
<mkdir dir="${build.dest}"/>

<!-- copy src files -->
<copy todir="${build.src}">
<fileset dir="${src.dir}"/>
</copy>
</target>

編譯任務:build
編譯時的CLASSPATH環境通過一下方式找到引用一個path對象
<classpath refid="classpath"/>

打包任務:jar
對應用打包生成項目所寫名的.jar文件
<!-- =================================================================== -->
<!-- Creates the class package -->
<!-- =================================================================== -->
<target name="jar" depends="build">
<jar jarfile="${lib.dir}/${name}.jar"
basedir="${build.dest}"
includes="**"/>
</target>

生成JAVADOC文檔任務: javadoc
<!-- =================================================================== -->
<!-- Creates the API documentation -->
<!-- =================================================================== -->
<target name="javadoc" depends="build">
<mkdir dir="${build.javadocs}"/>
<javadoc packagenames="${packages}"
sourcepath="${build.src}"
destdir="${build.javadocs}"
author="true"
version="true"
use="true"
splitindex="true"
windowtitle="${Name} API"
doctitle="${Name}">
<classpath refid="classpath"/>
</javadoc>
</target>

清空臨時編譯文件:clean
<!-- =================================================================== -->
<!-- Clean targets -->
<!-- =================================================================== -->
<target name="clean" depends="init">
<delete dir="${build.src}"/>
<delete dir="${build.dest}/org"/>
<delete dir="${build.dest}/com"/>
<delete>
<fileset dir="${build.dest}" includes="**/*.class"/>
</delete>
</target>

TODO:
更多任務/擴展:(樣例)

測試任務:JUnit測試
代碼風格檢查任務:CheckStyle,Jalopy等
郵件警報任務:可以把以上這些任務的輸出警告發送到制定的用戶列表中,這個任務可以設置每天自動運行。

13:25 ?|? 固定鏈接 | 引用通告 (0) | 記錄它 | JAVA學習
4月29日
《短歌行》


對酒當歌,人生幾何?譬如朝露,去日苦多。
概當以慷,憂思難忘。何以解憂?唯有杜康。
青青子衿,悠悠我心。但為君故,沈吟至今。
呦呦鹿鳴,食野之蘋。我有嘉賓,鼓瑟吹笙。
明明如月,何時可掇?憂從中來,不可斷絕。
越陌度阡,枉用相存。契闊談咽,心念舊恩。
月明星稀,烏鵲南飛。繞樹三匝,何枝可依。
山不厭高,海不厭深,周公吐哺,天下歸心。
13:20 ?|? 固定鏈接 | 引用通告 (0) | 記錄它
4月24日
SQLServer和Oracle常用函數對比
數學函數
  1.絕對值
  S:select abs(-1) value
  O:select abs(-1) value from dual

  2.取整(大)
  S:select ceiling(-1.001) value
  O:select ceil(-1.001) value from dual

  3.取整(小)
  S:select floor(-1.001) value
  O:select floor(-1.001) value from dual

  4.取整(截取)
  S:select cast(-1.002 as int) value
  O:select trunc(-1.002) value from dual

  5.四舍五入
  S:select round(1.23456,4) value 1.23460
  O:select round(1.23456,4) value from dual 1.2346

  6.e為底的冪
  S:select Exp(1) value 2.7182818284590451
  O:select Exp(1) value from dual 2.71828182

  7.取e為底的對數
  S:select log(2.7182818284590451) value 1
  O:select ln(2.7182818284590451) value from dual; 1

  8.取10為底對數
  S:select log10(10) value 1
  O:select log(10,10) value from dual; 1

  9.取平方
  S:select SQUARE(4) value 16
  O:select power(4,2) value from dual 16

  10.取平方根
  S:select SQRT(4) value 2
  O:select SQRT(4) value from dual 2

  11.求任意數為底的冪
  S:select power(3,4) value 81
  O:select power(3,4) value from dual 81

  12.取隨機數
  S:select rand() value
  O:select sys.dbms_random.value(0,1) value from dual;

  13.取符號
  S:select sign(-8) value -1
  O:select sign(-8) value from dual -1

  14.圓周率
  S:SELECT PI() value 3.1415926535897931
  O:不知道

  15.sin,cos,tan 參數都以弧度為單位
  例如:select sin(PI()/2) value 得到1(SQLServer)

  16.Asin,Acos,Atan,Atan2 返回弧度

  17.弧度角度互換(SQLServer,Oracle不知道)
  DEGREES:弧度-〉角度
  RADIANS:角度-〉弧度

數值間比較

  18. 求集合最大值
  S:select max(value) value from
  (select 1 value
  union
  select -2 value
  union
  select 4 value
  union
  select 3 value)a

  O:select greatest(1,-2,4,3) value from dual

  19. 求集合最小值
  S:select min(value) value from
  (select 1 value
  union
  select -2 value
  union
  select 4 value
  union
  select 3 value)a

  O:select least(1,-2,4,3) value from dual

  20.如何處理null值(F2中的null以10代替)
  S:select F1,IsNull(F2,10) value from Tbl
  O:select F1,nvl(F2,10) value from Tbl

  21.求字符序號
  S:select ascii('a') value
  O:select ascii('a') value from dual

  22.從序號求字符
  S:select char(97) value
  O:select chr(97) value from dual

  23.連接
  S:select '11'+'22'+'33' value
  O:select CONCAT('11','22')  33 value from dual

23.子串位置 --返回3
  S:select CHARINDEX('s','sdsq',2) value
  O:select INSTR('sdsq','s',2) value from dual

  23.模糊子串的位置 --返回2,參數去掉中間%則返回7
  S:select patindex('%d%q%','sdsfasdqe') value
  O:oracle沒發現,但是instr可以通過第四個參數控制出現次數
  select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6

  24.求子串
  S:select substring('abcd',2,2) value
  O:select substr('abcd',2,2) value from dual

  25.子串代替 返回aijklmnef
  S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value
  O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual

  26.子串全部替換
  S:沒發現
  O:select Translate('fasdbfasegas','fa','我' ) value from dual

  27.長度
  S:len,datalength
  O:length

  28.大小寫轉換 lower,upper

  29.單詞首字母大寫
  S:沒發現
  O:select INITCAP('abcd dsaf df') value from dual

  30.左補空格(LPAD的第一個參數為空格則同space函數)
  S:select space(10)+'abcd' value
  O:select LPAD('abcd',14) value from dual

  31.右補空格(RPAD的第一個參數為空格則同space函數)
  S:select 'abcd'+space(10) value
  O:select RPAD('abcd',14) value from dual

  32.刪除空格
  S:ltrim,rtrim
  O:ltrim,rtrim,trim

  33. 重復字符串
  S:select REPLICATE('abcd',2) value
  O:沒發現

  34.發音相似性比較(這兩個單詞返回值一樣,發音相同)
  S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')
  O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual
  SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比較soundex的差
  返回0-4,4為同音,1最高

日期函數
  35.系統時間
  S:select getdate() value
  O:select sysdate value from dual

  36.前后幾日
  直接與整數相加減

  37.求日期
  S:select convert(char(10),getdate(),20) value
  O:select trunc(sysdate) value from dual
  select to_char(sysdate,'yyyy-mm-dd') value from dual

  38.求時間
  S:select convert(char(8),getdate(),108) value
  O:select to_char(sysdate,'hh24:mm:ss') value from dual

39.取日期時間的其他部分
  S:DATEPART 和 DATENAME 函數 (第一個參數決定)
  O:to_char函數 第二個參數決定

  參數---------------------------------下表需要補充
  year yy, yyyy
  quarter qq, q (季度)
  month mm, m (m O無效)
  dayofyear dy, y (O表星期)
  day dd, d (d O無效)
  week wk, ww (wk O無效)
  weekday dw (O不清楚)
  Hour hh,hh12,hh24 (hh12,hh24 S無效)
  minute mi, n (n O無效)
  second ss, s (s O無效)
  millisecond ms (O無效)
  ----------------------------------------------

  40.當月最后一天
  S:不知道
  O:select LAST_DAY(sysdate) value from dual

  41.本星期的某一天(比如星期日)
  S:不知道
  O:SELECT Next_day(sysdate,7) vaule FROM DUAL;

  42.字符串轉時間
  S:可以直接轉或者select cast('2004-09-08'as datetime) value
  O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;

  43.求兩日期某一部分的差(比如秒)
  S:select datediff(ss,getdate(),getdate()+12.3) value
  O:直接用兩個日期相減(比如d1-d2=12.3)
  SELECT (d1-d2)*24*60*60 vaule FROM DUAL;

  44.根據差值求新的日期(比如分鐘)
  S:select dateadd(mi,8,getdate()) value
  O:SELECT sysdate+8/60/24 vaule FROM DUAL;

  45.求不同時區時間
  S:不知道
  O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;

  -----時區參數,北京在東8區應該是Ydt-------
  AST ADT 大西洋標準時間
  BST BDT 白令海標準時間
  CST CDT 中部標準時間
  EST EDT 東部標準時間
  GMT 格林尼治標準時間
  HST HDT 阿拉斯加?夏威夷標準時間
  MST MDT 山區標準時間
  NST 紐芬蘭標準時間
  PST PDT 太平洋標準時間
  YST YDT YUKON標準時間