RMI的全稱是遠程方法調用,相信不少朋友都聽說過,基本的思路可以用一個經典比方來解釋:A計算機想要計算一個兩個數的加法,但A自己做不了,于是叫另外一臺計算機B幫忙,B有計算加法的功能,A調用它就像調用這個功能是自己的一樣方便。這個就叫做遠程方法調用了。
遠程方法調用是EJB實現的支柱,建立分布式應用的核心思想。這個很好理解,再拿上面的計算加法例子,A只知道去call計算機B的方法,自己并沒有B的那些功能,所以A計算機端就無法看到B執行這段功能的過程和代碼,因為看都看不到,所以既沒有機會竊取也沒有機會去改動方法代碼。EJB正式基于這樣的思想來完成它的任務的。當簡單的加法變成復雜的數據庫操作和電子商務交易應用的時候,這樣的安全性和分布式應用的便利性就表現出來優勢了。
好了,回到細節上,要如何實現遠程方法調用呢?我希望大家學習任何技術的時候可以試著依賴自己的下意識判斷,只要你的想法是合理健壯的,那么很可能實際上它就是這么做的,畢竟真理都蘊藏在平凡的生活細節中。這樣只要帶著一些薄弱的Java基礎來思考RMI,其實也可以想出個大概來。
a) 需要有一個服務器角色,它擁有真正的功能代碼方法。例如B,它提供加法服務
b) 如果想遠程使用B的功能,需要知道B的IP地址
c) 如果想遠程使用B的功能,還需要知道B中那個特定服務的名字
我們很自然可以想到這些,雖然不完善,但已經很接近正確的做法了。實際上RMI要得以實現還得意于Java一個很重要的特性,就是Java反射機制。我們需要知道服務的名字,但又必須隱藏實現的代碼,如何去做呢?答案就是:接口!
舉個例子:
public interface Person(){
public void sayHello();
}
Public class PersonImplA implements Person{
public PersonImplA(){}
public void sayHello(){ System.out.println(“Hello!”);}
}
Public class PersonImplB implements Person{
public PersonImplB(){}
public void sayHello(){ System.out.println(“Nice to meet you!”);}
}
客戶端:Person p = Naming.lookup(“PersonService”);
p.sayHello();
就這幾段代碼就包含了幾乎所有的實現技術,大家相信么?客戶端請求一個say hello服務,服務器運行時接到這個請求,利用Java反射機制的Class.newInstance()返回一個對象,但客戶端不知道服務器返回的是 ImplA還是ImplB,它接受用的參數簽名是Person,它知道實現了Person接口的對象一定有sayHello()方法,這就意味著客戶端并不知道服務器真正如何去實現的,但它通過了解Person接口明確了它要用的服務方法名字叫做sayHello()。
如此類推,服務器只需要暴露自己的接口出來供客戶端,所有客戶端就可以自己選擇需要的服務。這就像餐館只要拿出自己的菜單出來讓客戶選擇,就可以在后臺廚房一道道的按需做出來,它怎么做的通常是不讓客戶知道的!(祖傳菜譜吧,^_^)
最后一點是我調用lookup,查找一個叫PersonService名字的對象,服務器只要看到這個名字,在自己的目錄(相當于電話簿)中找到對應的對象名字提供服務就可以了,這個目錄就叫做JNDI (Java命名與目錄接口),相信大家也聽過的。
有興趣的朋友不妨自己做個RMI的應用,很多前輩的博客中有簡單的例子。提示一下利用Jdk的bin目錄中rmi.exe和 rmiregistry.exe兩個命令就可以自己建起一個服務器,提供遠程服務。因為例子很容易找,我就不自己舉例子了!
posted @
2010-08-17 10:30 David1228 閱讀(245) |
評論 (0) |
編輯 收藏
相信大家對XML都不陌生,含義是可擴展標記語言。本身它也就是一個數據的載體以樹狀表現形式出現。后來慢慢的數據變成了信息,區別是信息可以包括可變的狀態從而針對程序硬編碼的做法變革為針對統一接口硬編碼而可變狀態作為信息進入了XML中存儲。這樣改變狀態實現擴展的唯一工作是在XML中添加一段文本信息就可以了,代碼不需要改動也不需要重新編譯。這個靈活性是XML誕生時候誰也沒想到的。
當然,如果接口要能提取XML中配置的信息就需要程序能解析規范的XML文件,Java中當然要提高包對這個行為進行有利支持。筆者打算講到的兩個包是 org.w3c.dom和javax.xml.parsers和。(大家可以瀏覽一下這些包中間的接口和類定義)
Javax.xml.parsers包很簡單,沒有接口,兩個工廠配兩個解析器。顯然解析XML是有兩種方式的:DOM解析和SAX解析。本質上并沒有誰好誰不好,只是實現的思想不一樣罷了。給一個XML文件的例子:
<?xml version=”1.0” encoding=”UTF-8” >
<root >
<child name=”Kitty” >
A Cat
</child >
</root >
所謂DOM解析的思路是把整個樹狀圖存入內存中,需要那個節點只需要在樹上搜索就可以讀到節點的屬性,內容等,這樣的好處是所有節點皆在內存可以反復搜索重復使用,缺點是需要消耗相應的內存空間。
自然SAX解析的思路就是為了克服DOM的缺點,以事件觸發為基本思路,順序的搜索下來,碰到了Element之前觸發什么事件,碰到之后做什么動作。由于需要自己來寫觸發事件的處理方案,所以需要借助另外一個自定義的Handler,處于org.xml.sax.helpers包中。它的優點當然是不用整個包都讀入內存,缺點也是只能順序搜索,走完一遍就得重來。
大家很容易就能猜到,接觸到的J2ee框架用的是哪一種,顯然是DOM。因為類似Struts,Hibernate框架配置文件畢竟是很小的一部分配置信息,而且需要頻繁搜索來讀取,當然會采用DOM方式(其實SAX內部也是用DOM采用的結構來存儲節點信息的)。現在無論用什么框架,還真難發現使用 SAX來解析XML的技術了,如果哪位仁兄知道,請讓筆者也學習學習。
既然解析方式有了,那么就需要有解析的存儲位置。不知道大家是否發現org.w3c.dom這個包是沒有實現類全部都是接口的。這里筆者想說一下Java 如何對XML解析是Jdk應該考慮的事,是它的責任。而w3c組織是維護定義XML標準的組織,所以一個XML結構是怎么樣的由w3c說了算,它不關心 Java如何去實現,于是乎規定了所有XML存儲的結構應該遵循的規則,這就是org.w3c.dom里全部的接口目的所在。在筆者看來,簡單理解接口的概念就是實現者必須遵守的原則。
整個XML對應的結構叫Document、子元素對應的叫做Element、還有節點相關的Node、NodeList、Text、Entity、 CharacterData、CDATASection等接口,它們都可以在XML的語法中間找到相對應的含義。由于這里不是講解XML基本語法,就不多介紹了。如果大家感興趣,筆者也可以專門寫一篇關于XML的語法規則帖與大家分享一下。
2. Java Swing
Swing是一個讓人又愛又恨的東西,可愛之處在于上手很容易,較AWT比起來Swing提供的界面功能更加強大,可恨之處在于編復雜的界面工作量實在是巨大。筆者寫過超過3000行的Swing界面,感覺用戶體驗還不是那么優秀。最近又寫過超過6000行的,由于功能模塊多了,整體效果還只是一般般。體會最深的就一個字:累! 所以大家現在都陸續不怎么用Swing在真正開發的項目上了,太多界面技術可以取代它了。筆者去寫也是迫于無奈組里面大家都沒寫過,我不入地域誰入?
盡管Swing慢慢的在被人忽略,特別是隨著B/S慢慢的在淹沒C/S,筆者倒是很愿意站出來為Swing正身。每一項技術的掌握絕不是為了流行時尚跟風。真正喜歡Java的朋友們還是應該好好體會一下Swing,相信在校的很多學生也很多在學習它。很可能從Jdk 1.1、1.2走過來的很多大學老師可能是最不熟悉它的。
Swing提供了一組輕組件統稱為JComponent,它們與AWT組件的最大區別是JComponent全部都是Container,而 Container的特點是里面可以裝載別的組件。在Swing組件中無論是JButton、JLabel、JPanel、JList等都可以再裝入任何其他組件。好處是程序員可以對Swing組件實現“再開發”,針對特定需求構建自己的按鈕、標簽、畫板、列表之類的特定組件。
有輕自然就有重,那么輕組件和重組件區別是?重組件表現出來的形態因操作系統不同而異,輕組件是Swing自己提供GUI,在跨平臺的時候最大程度的保持一致。
那么在編程的時候要注意一些什么呢?筆者談談自己的幾點經驗:
a. 明確一個概念,只有Frame組件才可以單獨顯示的,也許有人會說JOptionPane里面的靜態方法就實現了單獨窗口出現,但追尋源代碼會發現其實現實出來的Dialog也需要依托一個Frame窗體,如果沒有指定就會默認產生一個然后裝載這個Dialog顯示出來。
b. JFrame是由這么幾部分組成:
最底下一層JRootPane,上面是glassPane (一個JPanel)和layeredPane (一個JLayeredPane),而layeredPane又由contentPane(一個JPanel)和menuBar構成。我們的組件都是加在 contentPane上,而背景圖片只能加在layeredPane上面。至于glassPane是一個透明的覆蓋了contentPane的一層,在特定效果中將被利用到來記錄鼠標坐標或掩飾組件。
c. 為了增強用戶體驗,我們會在一些按鈕上添加快捷鍵,但Swing里面通常只能識別鍵盤的Alt鍵,要加入其他的快捷鍵,必須自己實現一個ActionListener。
d. 通過setLayout(null)可以使得所有組件以setBounds()的四個參數來精確定位各自的大小、位置,但不推薦使用,因為好的編程風格不應該在Swing代碼中硬編碼具體數字,所有的數字應該以常數的形式統一存在一個靜態無實例資源類文件中。這個靜態無實例類統一負責Swing界面的風格,包括字體和顏色都應該包括進去。
e. 好的界面設計有一條Golden Rule: 用戶不用任何手冊通過少數嘗試就能學會使用軟件。所以盡量把按鈕以菜單的形式(不管是右鍵菜單還是窗體自帶頂部菜單)呈現給顧客,除非是頻繁點擊的按鈕才有必要直接呈現在界面中。
其實Swing的功能是相當強大的,只是現在應用不廣泛,專門去研究大概是要花不少時間的。筆者在各網站論壇瀏覽關于Swing的技巧文章還是比較可信的,自己所學非常有限,各人體會對Swing各個組件的掌握就是一個實踐積累的過程。筆者只用到過以上這些,所以只能談談部分想法,還望大家見諒!
posted @
2010-08-17 10:15 David1228 閱讀(230) |
評論 (0) |
編輯 收藏
關于Java的線程,初學或者接觸不深的大概也能知道一些基本概念,同時又會很迷惑線程到底是怎么回事?如果有人認為自己已經懂了不妨來回答下面的問題:
a. A對象實現Runnable接口,A.start()運行后所謂的線程對象是誰?是A么?
b. 線程的wait()、notify()方法到底是做什么時候用的,什么時候用?
c. 為什么線程的suspend方法會被標注過時,不推薦再使用,線程還能掛起么?
d. 為了同步我們會對線程方法聲明Synchronized來加鎖在對象上,那么如果父類的f()方法加了Synchronized,子類重寫f()方法必須也加Synchronized么?如果子類的f()方法重寫時聲明Synchronized并調用super.f(),那么子類對象上到底有幾把鎖呢?會因為競爭產生死鎖么?
呵呵,各位能回答上來幾道呢?如果這些都能答上來,說明對線程的概念還是滿清晰的,雖說還遠遠不能算精通。筆者這里一一做回答,礙于篇幅的原因,筆者盡量說得簡介一點,如果大家有疑惑的歡迎一起討論。
首先第一點,線程跟對象完全是兩回事,雖然我們也常說線程對象。但當你用run()和start()來啟動一個線程之后,線程其實跟這個繼承了 Thread或實現了Runnable的對象已經沒有關系了,對象只能算內存中可用資源而對象的方法只能算內存正文區可以執行的代碼段而已。既然是資源和代碼段,另外一個線程當然也可以去訪問,main函數執行就至少會啟動兩個線程,一個我們稱之為主線程,還一個是垃圾收集器的線程,主線程結束就意味著程序結束,可垃圾收集器線程很可能正在工作。
第二點,wait()和sleep()類似,都是讓線程處于阻塞狀態暫停一段時間,不同之處在于wait會釋放當前線程占有的所有的鎖,而 sleep不會。我們知道獲得鎖的唯一方法是進入了Synchronized保護代碼段,所以大家會發現只有Synchronized方法中才會出現 wait,直接寫會給警告沒有獲得當前對象的鎖。所以notify跟wait配合使用,notify會重新把鎖還給阻塞的線程重而使其繼續執行,當有多個對象wait了,notify不能確定喚醒哪一個,必經鎖只有一把,所以一般用notifyAll()來讓它們自己根據優先級等競爭那唯一的一把鎖,競爭到的線程執行,其他線程只要繼續wait。
從前Java允許在一個線程之外把線程掛起,即調用suspend方法,這樣的操作是極不安全的。根據面向對象的思想每個對象必須對自己的行為負責,而對自己的權力進行封裝。如果任何外步對象都能使線程被掛起而阻塞的話,程序往往會出現混亂導致崩潰,所以這樣的方法自然是被斃掉了啦。
最后一個問題比較有意思,首先回答的是子類重寫f()方法可以加Synchronized也可以不加,如果加了而且還內部調用了super.f ()的話理論上是應該對同一對象加兩把鎖的,因為每次調用Synchronized方法都要加一把,調用子類的f首先就加了一把,進入方法內部調用父類的 f又要加一把,加兩把不是互斥的么?那么調父類f加鎖不就必須永遠等待已經加的鎖釋放而造成死鎖么?實際上是不會的,這個機制叫重進入,當父類的f方法試圖在本對象上再加一把鎖的時候,因為當前線程擁有這個對象的鎖,也可以理解為開啟它的鑰匙,所以同一個線程在同一對象上還沒釋放之前加第二次鎖是不會出問題的,這個鎖其實根本就沒有加,它有了鑰匙,不管加幾把還是可以進入鎖保護的代碼段,暢通無阻,所以叫重進入,我們可以簡單認為第二把鎖沒有加上去。
總而言之,Synchronized的本質是不讓其他線程在同一對象上再加一把鎖。
posted @
2010-08-17 09:48 David1228 閱讀(283) |
評論 (0) |
編輯 收藏
大家肯定在安裝JDK的時候會有選擇是否安裝單獨的jre,一般都會一起安裝,我也建議大家這樣做。因為這樣更能幫助大家弄清楚它們的區別:
Jre 是java runtime environment, 是java程序的運行環境。既然是運行,當然要包含jvm,也就是大家熟悉的虛擬機啦,還有所有java類庫的class文件,都在lib目錄下打包成了jar。大家可以自己驗證。至于在windows上的虛擬機是哪個文件呢?學過MFC的都知道什么是dll文件吧,那么大家看看jre/bin/client里面是不是有一個jvm.dll呢?那就是虛擬機。
Jdk 是java development kit,是java的開發工具包,里面包含了各種類庫和工具。當然也包括了另外一個Jre. 那么為什么要包括另外一個Jre呢?而且jdk/jre/bin同時有client和server兩個文件夾下都包含一個jvm.dll。說明是有兩個虛擬機的。這一點不知道大家是否注意到了呢?
相信大家都知道jdk的bin下有各種java程序需要用到的命令,與jre的bin目錄最明顯的區別就是jdk下才有javac,這一點很好理解,因為 jre只是一個運行環境而已。與開發無關,正因為如此,具備開發功能的jdk自己的jre下才會同時有client性質的jvm和server性質的 jvm, 而僅僅作為運行環境的jre下只需要client性質的jvm.dll就夠了。
記得在環境變量path中設置jdk/bin路徑麼?這應該是大家學習Java的第一步吧,老師會告訴大家不設置的話javac和java是用不了的。確實jdk/bin目錄下包含了所有的命令。可是有沒有人想過我們用的java命令并不是 jdk/bin目錄下的而是jre/bin目錄下的呢?不信可以做一個實驗,大家可以把jdk/bin目錄下的java.exe剪切到別的地方再運行 java程序,發現了什么?一切OK!
那么有人會問了?我明明沒有設置jre/bin目錄到環境變量中啊?
試想一下如果java為了提供給大多數人使用,他們是不需要jdk做開發的,只需要jre能讓java程序跑起來就可以了,那么每個客戶還需要手動去設置環境變量多麻煩啊?所以安裝jre的時候安裝程序自動幫你把jre的java.exe添加到了系統變量中,驗證的方法很簡單,大家看到了系統環境變量的 path最前面有“%SystemRoot%\system32;%SystemRoot%;”這樣的配置,那么再去Windows/system32下面去看看吧,發現了什么?有一個java.exe。
如果強行能夠把jdk/bin挪到system32變量前面,當然也可以迫使使用jdk/jre里面的java,不過除非有必要,我不建議大家這么做。使用單獨的jre跑java程序也算是客戶環境下的一種測試。
這下大家應該更清楚jdk和jre內部的一些聯系和區別了吧?
PS: 其實還有滿多感想可以總結的,一次寫多了怕大家扔磚頭砸死我,怪我太羅唆。大家應該更加踏實更加務實的去做一些研究并互相分享心得,大方向和太前沿的技術討論是必要的但最好不要太多,畢竟自己基礎都還沒打好,什么都講最新版本其實是進步的一大障礙!
posted @
2010-08-16 14:39 David1228 閱讀(221) |
評論 (0) |
編輯 收藏
201303
------------------------------------------
who options可顯示當前登錄的用戶.
選項:-a顯示所有結果,-r顯示當前運行級別,-s列出用戶名及時間域.
whoami 顯示自己的用戶名.
whereis 輸出系統命令的二進制文件路徑.
wc options files 能夠統計文件中的字符數、單詞數和行數.
wc -c xx顯示字符數 wc -l xx顯示行數 wc -w xx顯示單詞數.
wait 可用來等待進程號為proccess ID的進程或者所有的后臺進程結束后,再執行當前腳本.
uname 顯示當前操作系統名及其他相關信息.
選項:-a 顯示所有信息,-s 系統名,-v只顯示操作系統版本或其發布日期.
touch 創建一個文件.
選項:-t MMDDhhmm 創建一個具有相應月、日、時分時間戳的文件.
strings 可以看二進制文件中所包含的文本.
shutdown 關機(shutdown now)
script 可使用該命令記錄當前會話.
例:script mylogin 啟動script命令并將所有會話內容記錄到mylogin文件中.
mkdir 創建目錄 rmdir 刪除目錄
rm 能夠刪除文件或目錄.
選項: -i 刪除文件之前給出提示(安全模式), -r 刪除目錄.
pwd顯示當前的工作目錄.
nl 命令可用于在文件中列行號,在打印源代碼或列日志文件時很有用.
選項:-I 行號每次增加n,默認為1. -p 在新的一頁不重新計數.
more 該命令和page及pg命令功能類似,都能夠分屏顯示文件內容(分頁顯示).
logname 該命令可以顯示當前所使用的登陸用戶名.
head 命令可以顯示相應文件的前多少行.
例如:head -20 myfile 表示顯示myfile文件的前20行內容.
fuser 命令可以顯示訪問某個文件或文件系統的所有進程.
選項: -k 殺死所有訪問該文件或文件系統的進程, -u 顯示訪問該文件或文件系統的所有進程.
file 命令用來確定文件的類型.
df -h 查看系統磁盤空間.
du 顯示的磁盤空間占用是以512字節的塊來表示的.顯示目錄所占用的空間.
例如:在/var目錄下執行du -s 后顯示14929 表示/var目錄占用的空間為14929塊(每塊是512字節).
basename 能夠從路徑中分離出文件名.通常用于shell腳本中.
例如:/home/dave/myfile 返回myfile
dirname 返回路徑內部分,該目錄正好與basename命令相反.
例如:dirname /home/dave/myfile 返回/home/dave
cat 查看文本文件的顯示命令,選項-v:顯示控制字符.
diff 對比兩個文件,顯示兩個文件中不一致的行.
dircmp 比較并顯示兩個目錄中的不同.
tar -cvf 文件或目錄打包:
例如:tar -cvf temp2.tar /usr/lib ,將/usr/lib目錄下的文件與子目錄打包成一個文件庫為temp2.tar.
tar -xvf 解包 例如:tar -xvf /u0/temp2.tar
-----------------------------------
20130219:
find . -type f - exec chmod 644 {} \; |
find . -type d - exec chmod 755 {} \; |
find . -type d 文件夾
find . -type f 文件
------------------------------------
作者:馮太廣 主頁: http://www.521tg.com
最近總是應用一些LINUX命令,有些參數記不住,所以整理一下,方便查閱,也和大家一起分享.
vi命令使用
-----------------------
vi filename :打開或新建文件,并將光標置于第一行首
vi +n filename :打開文件,并將光標置于第n行首
vi + filename :打開文件,并將光標置于最后一行首
vi +/pattern filename:打開文件,并將光標置于第一個與pattern匹配的串處
vi -r filename :在上次正用vi編輯時發生系統崩潰,恢復filename
vi filename....filename :打開多個文件,依次編輯
移動光標類命令
h :光標左移一個字符
l :光標右移一個字符
space:光標右移一個字符
Backspace:光標左移一個字符
k或Ctrl+p:光標上移一行
j或Ctrl+n :光標下移一行
Enter :光標下移一行
w或W :光標右移一個字至字首
b或B :光標左移一個字至字首
e或E :光標右移一個字j至字尾
) :光標移至句尾
( :光標移至句首
}:光標移至段落開頭
{:光標移至段落結尾
nG:光標移至第n行首
n+:光標下移n行
n-:光標上移n行
n$:光標移至第n行尾
H :光標移至屏幕頂行
M :光標移至屏幕中間行
L :光標移至屏幕最后行
0:(注意是數字零)光標移至當前行首
$:光標移至當前行尾
屏幕翻滾類命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:將第n行滾至屏幕頂部,不指定n時將當前行滾至屏幕頂部。
插入文本類命令
i :在光標前
I :在當前行首
a:光標后
A:在當前行尾
o:在當前行之下新開一行
O:在當前行之上新開一行
r:替換當前字符
R:替換當前字符及其后的字符,直至按ESC鍵
s:從當前光標位置處開始,以輸入的文本替代指定數目的字符
S:刪除指定數目的行,并以所輸入文本代替之
ncw或nCW:修改指定數目的字
nCC:修改指定數目的行
刪除命令
ndw或ndW:刪除光標處開始及其后的n-1個字
do:刪至行首
d$:刪至行尾
ndd:刪除當前行及其后n-1行
x或X:刪除一個字符,x刪除光標后的,而X刪除光標前的
Ctrl+u:刪除輸入方式下所輸入的文本
搜索及替換命令 :
/pattern:從光標開始處向文件尾搜索pattern
?pattern:從光標開始處向文件首搜索pattern
n:在同一方向重復上一次搜索命令
N:在反方向上重復上一次搜索命令
:s/p1/p2/g:將當前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:將第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:將文件中所有p1均用p2替換
選項設置
all:列出所有選項設置情況
term:設置終端類型
ignorance:在搜索中忽略大小寫
list:顯示制表位(Ctrl+I)和行尾標志($)
number:顯示行號
report:顯示由面向行的命令修改過的數目
terse:顯示簡短的警告信息
warn:在轉到別的文件時若沒保存當前文件則顯示NO write信息
nomagic:允許在搜索模式中,使用前面不帶“\”的特殊字符
nowrapscan:禁止vi在搜索到達文件兩端時,又從另一端開始
mesg:允許vi顯示其他用戶用write寫到自己終端上的信息
最后行方式命令
:n1,n2 co n3:將n1行到n2行之間的內容拷貝到第n3行下
:n1,n2 m n3:將n1行到n2行之間的內容移至到第n3行下
:n1,n2 d :將n1行到n2行之間的內容刪除
:w :保存當前文件
:e filename:打開文件filename進行編輯
:x:保存當前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:執行shell命令command
:n1,n2 w!command:將文件中n1行至n2行的內容作為command的輸入并執行之,若不指
定n1,n2,則表示將整個文件內容作為command的輸入
:r!command:將命令command的輸出結果放到當前行 。
-----------------------
常用監控LINUX的命令
-----------------------
ps -aux 查看所有進程
ps -auxwww 參數w表示加寬顯示的命令行
vmstat:顯示當前的內存使用情況
netstat:顯示網絡狀況,使用參數p可以查看對應的進程號及程序名
netstat -anp 通常使用參數a(顯示所有連接情況)和n(不反查域名和服務名)
netstat -an | grep LISTEN 查看服務器偵聽情況
netstat -an | grep ESTABLISHED 查看服務器已建立的連接
ifconfig :查看(或設置)網絡設備信息
ifconfig -a:查看所有網絡設置信息
last:顯示登錄到服務器的情況以及服務器重啟情況
df:顯示硬盤空間及使用情況,Linux下可以帶參數h,顯示結果更人性化。
df -h 硬盤空間按人性化顯示
df -k 硬盤空間按KB顯示
df -m 硬盤空間按MB顯示
w:顯示登錄到服務器上的用戶列表
以下幾個命令僅針對Linux
lsof:顯示當前打開的文件列表,包括建立的socket連接等。本命令可以用于程序員檢查編寫的程序打開的文件數
sysctl:顯示(或設置)系統內核參數
sysctl -a 顯示所有內核參數
sysctl -w 參數名=參數值
ulimit :顯示(或設置)用戶可以使用的資源限制
輸出信息簡介
Procs r: 等待運行的進程數
b: 處在非中斷睡眠狀態的進程數
w: 被交換出去的可運行的進程數。此數由 linux 計算得出,但 linux 并不耗盡交換空間
Memory
swpd: 虛擬內存使用情況,單位:KB
free: 空閑的內存,單位KB
buff: 被用來做為緩存的內存數,單位:KB
Swap
si: 從磁盤交換到內存的交換頁數量,單位:KB/秒
so: 從內存交換到磁盤的交換頁數量,單位:KB/秒
IO
bi: 發送到塊設備的塊數,單位:塊/秒
bo: 從塊設備接收到的塊數,單位:塊/秒
System
in: 每秒的中斷數,包括時鐘中斷
cs: 每秒的環境(上下文)切換次數
CPU 按 CPU 的總使用百分比來顯示
us: CPU 使用時間
sy: CPU 系統使用時間
id: 閑置時間
-----------------------
sftp命令使用
-----------------------
sftp -l username hostname 或者 sftp user@hosname
進入到 sftp 之后,那就跟在一般 FTP 模式下的操作方法沒有兩樣
cd
ls dir
mkdir
rmdir
pwd
chgrp
chown
chmod
ln oldname newname
rm path
rename oldname newname
exit bye
-----------------------
修改 evn:
-----------------------
vi .bash_profile 每個用戶下都有
vi /usr/jboss-3.2.0RC2/server/default/log/boot.log
source .bash_profile
-----------------------
常用命令:
-----------------------
rmdir -p surf 刪除空目錄
mkdir 新建目錄
rm -rf 刪除整個目錄,并且不詢問
tail -f /usr/jboss-3.2.2RC2/server/default/log/server.log 時時刷新查看文件
ssh -l root 219.133.**.** 進入其他服務器
psql -h 219.133.**.** -Ult club_dump 進入其他服務器的PostGre數據庫
psql -Upostgres club_dump 進入服務器Postgre數據庫
select * from pg_stat_activity ; 查詢數據庫的連接數
/etc/init.d/postgresql restart 重啟數據庫服務
-----------------------
我們老總用過的命令,可以自己去研究一下.
-----------------------
df -kh
dmesg | grep CPU
df -kh
free -m
free -kh
free -k
meminfo
mem
dmesg
env
df -kh
tail -f nohup.out
nohup ./run.sh &
ps -ef
chmod u+x *.sh
-----------------------
文件或者目錄打包(來自網絡資料)
-----------------------
在Unix系統業務使用(特別是數據管理與備份)中,經過一番研究、整理后,充分利用Unix系統本身的命令tar、cpio和compress等來做到打包和壓縮,使之充當類似DOS下的壓縮軟件,同時在Unix系統中亦具有通用性。
在Unix系統中,是先通過cpio或tar將眾多的文件打包成一個文件庫后,再用compress將文件庫壓縮來達到目的的。下面分別以cpio和tar來說明使用的方法和步驟。
一、cpio
1.文件或目錄打包。
打包有如下多種情況:
A)含子目錄打包:
find /usr/lib -print|cpio -o〉/u0/temp1.cpio
將/usr /lib目錄下的文件與子目錄打包成一個文件庫為/u0/temp1.cpio。
若通過-o選項來打包整個目錄下的所有文件與子目錄,常先利用find目錄名-print來找出所有文件與子目錄的名稱,通過管道“|”傳給cpio打包。
B)不含子目錄的打包:
ls /usr/lib|cpio -o〉/u0/temp1.cpio
將/usr/lib目錄下的文件(不含子目錄下的文件)打包成一個文件庫為/u0/temp1.cpio。
C)特定文件打包:
可利用文本搜索命令grep與管道配合,可以排除或選擇特定類型的文件傳給cpio打包。如:ls /usr/lib/*.c|cpio -o〉/u0/temp1.cpio
或ls /usr/lib|grep ′.c$′|cpio -o〉/u0/temp1.cpio
意思均為找出/usr/lib目錄下以.c結尾的文件予以打包。
又如:ls /usr/lib|grep abcd|cpio -o〉/u0/temp1.cpio ,其意為找出/usr/lib目錄下文件名中含有abcd字符的文件予以打包。
ls /usr/lib|grep -v abcd|cpio -o〉/u0/temp1.cpio,其意為找出/usr/lib目錄下文件名中不含 abcd 字符的文件予以打包。-v選項在grep命令中的意思是排除含有字符串的行列。
如此,可充分利用Unix的管道和一些命令的強大功能來實現文件的打包。
2.壓縮:
文件打包完成后,即可用Unix中的compress命令(/usr/bin下)壓縮打包文件。對一般的文本文件,壓縮率較高,可達81%。
compress /u0/temp1.cpio則將文件庫/u0/temp1.cpio壓縮為/u0/temp1.cpio.Z(自動添加.Z并刪除/u0/temp1.cpio )。
3.解壓:
uncompress /u0/temp1.cpio.Z則自動還原為/u0/temp1.cpio。
4.解包展開:
將按原目錄結構解包展開到當前所在目錄下。若以相對路徑打包的,當解包展開時,也是以相對路徑存放展開的文件數據;若以絕對路徑打包的,當解包展開時,也是以絕對路徑存放展開的文件數據。因此注意若為相對路徑,應先進入相應的目錄下再展開。
cd /u1
cpio -id〈/u0/tmp1.cpio則將/u0/temp1.cpio解壓到/u1下(這里假設temp1.cpio以相對路徑壓縮)。
若加u選項,如cpio -iud〈/u0/temp1.cpio則文件若存在將被覆蓋,即強制覆蓋。
cpio -id〈/u0/temp1.cpio *.c 則展開其中的*.c文件,類似于DOS系統中的Pkzip軟件中Pkunzip -d temp1.zip解包功能。
5.顯示:
cpio -it〈/u0/temp1.cpio [*.c] 顯示文件庫內的文件名稱,類似于DOS系統中的Pkzip軟件中Pkunzip -vbnm temp1.zip功能。
二、tar
1.文件或目錄打包:
tar -cvf /u0/temp2.tar /usr/lib
將/usr/lib目錄下的文件與子目錄打包成一個文件庫為/u0/temp2.tar。
tar -cvf /u0/temp2.tar /usr/lib *.c *.f
將/usr/lib目錄下的*.c *.f等文件(不含子目錄)打包。
注意:如果指定文件如*.c *.f或*.*,則打包時均不含子目錄。如果指定為.或*,則含子目錄。
2.壓縮:
同上:compress /u0/temp2.tar壓縮為/u0/temp2.tar.Z
3.解壓:
uncompress /u0/temp2.tar.Z則還原為/u0/temp2.tar。
4.解包展開:
tar -xvf /u0/temp2.tar
若以相對路徑打包的,解包時,以相對路徑存放展開的文件數據;若以絕對路徑打包的,解包時,以絕對路徑存放展開的文件數據。
若指定展開的文件名,須注意文件的目錄路徑。
5.顯示:
tar -tvf /u0/temp2.tar 顯示文件庫內的文件名稱。當指定文件名時,亦須注意文件的路徑。
相對來說這兩個命令各有優缺點。
1)tar速度比cpio慢,且不能跨越兩份存儲媒體,但文件格式幾乎在所有的Unix系統中都能通用,且使用簡便。
2)cpio則由于可通過管道功能,使得其打包時的文件選擇、排除功能非常強,且能跨越多份媒體,并能備份特殊的系統文件。
另外,壓縮命令compress比DOS下的Pkzip的壓縮率要低些。經測試,在一個目錄下527個文本文件共15.7MB,在Unix打包后用compress壓縮,大小為 2.1MB;相同的文件拷到DOS系統用Pkzip壓縮,則大小為1.4MB。
-----------------------
posted @
2010-08-16 10:02 David1228 閱讀(334) |
評論 (0) |
編輯 收藏
在Hibernate中,對象有三種狀態:臨時狀態、持久狀態和游離狀態。
臨時狀態:當new一個實體對象后,這個對象處于臨時狀態,即這個對象只是一個保存臨時數據的內存區域,如果沒有變量引用這個對象,則會被jre垃圾回收機制回收。這個對象所保存的數據與數據庫沒有任何關系,除非通過Session的save或者SaveOrUpdate把臨時對象與數據庫關聯,并把數據插入或者更新到數據庫,這個對象才轉換為持久對象。
例如:Emp e=new Emp(); //創建臨時對象
e.setEmpno((long) 8888);
e.setEName("mike");
...
EmpDAO d=new EmpDAO();
d.save(e);//持久化
...
持久狀態: 持久化對象的實例在數據庫中有對應的記錄,并擁有一個持久化表示(ID)。對持久化對象進行delete操作后,數據庫中對應的記錄將被刪除,那么持久化對象與數據庫記錄不再存在對應關系,持久化對象變成臨時狀態。
持久化對象被修改變更后,不會馬上同步到數據庫,直到數據庫事務提交。在同步之前,持久化對象是臟的(Dirty)。
例如:
Emp e=new Emp(); //創建了臨時的對象
EmpDAO edao= new empDAO();
e=edao.findbyEmpno((long) 7786); //使對象與數據庫記錄對應,從而持久化
e.setEname("新的名字"); //修改了持久化對象,使之處于 Dirty
......
edao.saveorupdate(e); //保存,但是仍然 Dirty
tran.commit(); //提交,實現與數據庫同步,不再Dirty
......
游離狀態:當Session進行了Close、Clear或者evict后,持久化對象雖然擁有持久化標識符和與數據庫對應記錄一致的值,但是因為會話已經消失,對象不在持久化管理之內,所以處于游離狀態(也叫:脫管狀態)。游離狀態的對象與臨時狀態對象是十分相似的,只是它還含有持久化標識。
其中,持久化狀態的對象,簡稱為:PO
而臨時狀態和游離狀態的對象,簡稱為:VO
1、通過get()或load()方法得到的實例都是持久化狀態的。
2、當把session關閉時,session緩存中的持久化對象也變成游離態
因關閉session而變成游離態的可以通過lock、save、update變成持久態
3、持久態實例可以通過調用delete()變成游離態
而游離狀態的實例可以通過調用lock()或者replicate()進行持久化
4、save()和persist()將會引發SQL的insert,delete()會引發SQL的delete
update()或merge()會引發SQL的update,對持久化實例的修改在刷新提交的時候會
被檢測到, 它會引發SQL的update
saveOrUpdate()或者replicate ()會引發SQL的insert或者update
posted @
2010-08-16 09:59 David1228 閱讀(331) |
評論 (0) |
編輯 收藏
//獲取字符長度
String.prototype.getBytes = function()
{
var cArr = this.match(/[^\x00-\xff]/ig);
return this.length + (cArr == null ? 0 : cArr.length);
}
val.getBytes() > 60
alert('val不能超過60個字符或30個漢字');
posted @
2010-08-12 17:48 David1228 閱讀(315) |
評論 (0) |
編輯 收藏
Collections.sort(list, new Comparator<TCmsFormDTO>()
{
public int compare(TCmsFormDTO o1, TCmsFormDTO o2)
{
return new BeanComparator().compare(o1.getName(), o2.getName());
}
});
posted @
2010-08-11 16:15 David1228 閱讀(192) |
評論 (0) |
編輯 收藏
<style>
table{table-layout: fixed;}
td{word-break: break-all; word-wrap:break-word;}
</style>
就解決問題;
posted @
2010-08-04 16:56 David1228 閱讀(178) |
評論 (0) |
編輯 收藏
摘要: <html>
<title></title>
<head></head>
<body>
<form id="form1">
&n...
閱讀全文
posted @
2010-07-13 10:07 David1228 閱讀(541) |
評論 (0) |
編輯 收藏