了解團(tuán)隊(duì)運(yùn)作
團(tuán)隊(duì)合作是所有成功管理的根基。無論你是新手還是資深管理人,對(duì)你而言,管理好團(tuán)隊(duì)都是重要且具激勵(lì)性的挑戰(zhàn)。
1.切記:每位成員都能為團(tuán)隊(duì)作出一些貢獻(xiàn)。
2.謹(jǐn)慎地設(shè)定團(tuán)隊(duì)目標(biāo),且認(rèn)真嚴(yán)肅地對(duì)待它們。
3.切記成員間要彼此扶持。
4.將長(zhǎng)程目標(biāo)打散成許多短程計(jì)劃。
5.為每個(gè)計(jì)劃設(shè)定明確的期限。
6.盡早決定何種形態(tài)的團(tuán)隊(duì)適合你的目標(biāo)。
7.努力與其它團(tuán)隊(duì)的成員建立強(qiáng)有力的緊密關(guān)系。
8.找一位可提升團(tuán)隊(duì)工作士氣的重量級(jí)人物。
9.時(shí)時(shí)提醒團(tuán)隊(duì)成員:他們都是團(tuán)隊(duì)的一份子。
10.將團(tuán)隊(duì)的注意力集中在固定可衡量的目標(biāo)上。
11.利用友誼的強(qiáng)大力量強(qiáng)化團(tuán)隊(duì)。
12.選擇領(lǐng)導(dǎo)者時(shí)要把握用人唯才原則。
13.領(lǐng)導(dǎo)者需具備強(qiáng)烈的團(tuán)隊(duì)使命感。
14.獎(jiǎng)賞優(yōu)異的表現(xiàn),但絕不姑息錯(cuò)誤。
15.記住每位團(tuán)隊(duì)成員看事情的角度都不一樣。
16.征召團(tuán)隊(duì)成員時(shí),應(yīng)注重他們的成長(zhǎng)潛能。
17.密切注意團(tuán)隊(duì)成員缺少的相關(guān)經(jīng)驗(yàn)。
18.應(yīng)使不適任的成員退出團(tuán)隊(duì)。
19.找到能將人際關(guān)系處理得很好的人,并培養(yǎng)他們。
設(shè)立一支團(tuán)隊(duì)
成立一支團(tuán)隊(duì)是領(lǐng)導(dǎo)者的主要工作。確保你的團(tuán)隊(duì)有清楚明確的目的和足夠達(dá)成目標(biāo)的資源。要以開放和公正無私的態(tài)度對(duì)待團(tuán)隊(duì)成員。
20.設(shè)定具挑戰(zhàn)性的目標(biāo)須根據(jù)限期來考量是否合理。
21.設(shè)定目標(biāo)時(shí),考量個(gè)別成員的工作目標(biāo)。
22.計(jì)劃的失敗危及整體計(jì)劃的成功。
23.堅(jiān)持得到信息技術(shù)支持,它能為你提供確實(shí)需要的東西。
24.對(duì)待團(tuán)隊(duì)外的顧問要如同對(duì)待團(tuán)隊(duì)成員一般。
25.讓團(tuán)隊(duì)的贊助者隨時(shí)知道工作進(jìn)展情形。
26.除非你確定沒有人能夠勝任,否則應(yīng)避免“事必躬親”。
27.不要委托不必要的工作,最好將其去除掉。
28.賦予團(tuán)隊(duì)自己作決策的權(quán)力。
29.鼓勵(lì)團(tuán)隊(duì)成員正面積極的貢獻(xiàn)。
30.肯定、宣揚(yáng)和慶祝團(tuán)隊(duì)每次的成功。
31.找到易于讓成員及團(tuán)隊(duì)了解每日工作進(jìn)度的展現(xiàn)方式。
32.鼓勵(lì)成員之間建立工作上的伙伴關(guān)系。
33.鼓勵(lì)天生具有領(lǐng)導(dǎo)才能的人,并引導(dǎo)和培養(yǎng)他們的領(lǐng)導(dǎo)技巧。
34.絕對(duì)不能沒有解釋就駁回團(tuán)隊(duì)的意見,與此相反,解釋要坦白,理由要充分。
35.確定團(tuán)隊(duì)和客戶經(jīng)常保持聯(lián)系。
36.以自信肯定的態(tài)度讓團(tuán)隊(duì)知道誰當(dāng)家,但要預(yù)防予人來勢(shì)洶洶的感覺。
37.想辦法給新團(tuán)隊(duì)留下一個(gè)實(shí)時(shí)的好印象,但切忌操之過急。
38.倘若你要求別人的建議,抱持的心態(tài)不能只是歡迎就行了,也要依循建議有所行動(dòng)。
提升團(tuán)隊(duì)效率
團(tuán)隊(duì)要達(dá)到應(yīng)有的效率,唯一的條件是每個(gè)成員都要學(xué)會(huì)集中力量。你必須了解團(tuán)隊(duì)的能力,以確保團(tuán)隊(duì)的成功。
39.協(xié)助團(tuán)隊(duì)找出方法以改變有礙任務(wù)推展的團(tuán)體行為。
40.找出可建設(shè)性地利用沖突的方法。
41.記住要在工作中穿插安排娛樂調(diào)劑身心──這是每個(gè)人應(yīng)得的福利。
42.若有計(jì)劃出錯(cuò),一定要作全面性、公開化的分析。
43.如果你希望團(tuán)隊(duì)成員有問題時(shí)能毫不猶疑地找你談,就要實(shí)施“開門政策”。
44.要求提出問題的人解決問題。
45.安排正式的和非正式的會(huì)面,討論團(tuán)隊(duì)的工作進(jìn)展。
46.使用不帶感情只問事實(shí)的態(tài)度,是化解紛爭(zhēng)的最好方法。
47.保持團(tuán)隊(duì)成員間的熟稔,以易于溝通。
48.設(shè)立交誼場(chǎng)所,讓團(tuán)隊(duì)成員可作非正式的碰面交談。
49.鼓勵(lì)同事間自由的溝通活動(dòng)。
50.建立最適合的通訊科技系統(tǒng),并經(jīng)常更新。
51.實(shí)施會(huì)議主席輪流制,讓每個(gè)人都有機(jī)會(huì)主持會(huì)議。
52.盡可能多地授權(quán)給團(tuán)隊(duì)成員。
53.事先于會(huì)前發(fā)出議程,預(yù)留時(shí)間給與會(huì)者準(zhǔn)備。
54.培養(yǎng)所有對(duì)團(tuán)隊(duì)有益的關(guān)系。
55.努力保持團(tuán)隊(duì)內(nèi)外關(guān)系的均衡與平穩(wěn)。
56.確定所有相關(guān)人士都能聽到、了解好消息。
57.倘有麻煩在團(tuán)隊(duì)關(guān)系中發(fā)酵蘊(yùn)釀,要盡快處理。
58.安排團(tuán)隊(duì)與機(jī)構(gòu)的其它部門作社交聯(lián)誼。
59.找出你與“大佬”保持聯(lián)系的最佳通訊科技。
60.要對(duì)你在團(tuán)隊(duì)或辦公室外接觸過的重要人士作聯(lián)系記錄。
61.謹(jǐn)慎分派角色以避免任務(wù)重復(fù)。
62.找尋建議中的精華,且絕不在公開場(chǎng)合批評(píng)任何建議。
63.一定要找有經(jīng)驗(yàn)的人解決問題。
64.分析團(tuán)隊(duì)成員每個(gè)人所扮演的角色。
65.腦力激發(fā)出的意見,就算不采用,亦不得輕視。否則,會(huì)打擊人的積極性,創(chuàng)意的流動(dòng)也會(huì)因此停止。
66.公平對(duì)待每個(gè)成員才能避免怨恨。
67.確定團(tuán)隊(duì)成員真正有錯(cuò)之前,都須視他們沒有錯(cuò)。
68.告訴同事他們做得很好,這有助于激勵(lì)團(tuán)隊(duì)士氣。
69.尊重每一位成員,包括那些給你制造麻煩的人。
70.避免和團(tuán)隊(duì)成員有直接的沖突。
71.記住采用對(duì)事不對(duì)人的處事態(tài)度。
72.確定整個(gè)團(tuán)隊(duì)都能夠從解決問題中學(xué)習(xí)經(jīng)驗(yàn)。
73.先選擇完成一些規(guī)模大的、可快速達(dá)成及有成就感的任務(wù),以激勵(lì)成員再接再勵(lì)。
74.確信團(tuán)隊(duì)成員皆了解團(tuán)隊(duì)中的其它角色。
75.計(jì)算品質(zhì)的成本之前,先計(jì)算失敗的成本。
76.針對(duì)每筆預(yù)算及每項(xiàng)團(tuán)隊(duì)行動(dòng)計(jì)劃,設(shè)定重大的改進(jìn)目標(biāo)。
為未來努力
為團(tuán)隊(duì)設(shè)定新的、更高的挑戰(zhàn)目標(biāo)是團(tuán)隊(duì)工作中最令人興奮的事情之一??蛇\(yùn)用一些適當(dāng)?shù)募记?,推?dòng)團(tuán)隊(duì)向更大、更好的目標(biāo)前進(jìn)。
77.告知團(tuán)隊(duì)每位成員,在設(shè)定的標(biāo)準(zhǔn)中有哪些評(píng)量的項(xiàng)目。
78.確定所有改善措施及新訂目標(biāo)都持續(xù)進(jìn)行著。
79.召開檢討會(huì)議前傳閱所有相關(guān)資料及資料。
80.開檢討會(huì)時(shí)一定要避諱人身攻擊。
81.記住關(guān)系會(huì)隨時(shí)間改變。
82.避開低估或忽視壞消息的陷井。
83.每天結(jié)束時(shí)自問團(tuán)隊(duì)今天是否又向前跨出了一步。
84.傾聽受訓(xùn)者關(guān)于訓(xùn)練課程的回饋意見。
85.找到有最好設(shè)備的最佳訓(xùn)練場(chǎng)所。
86.聘請(qǐng)顧問設(shè)立公司內(nèi)部的訓(xùn)練課程。
87.利用移地訓(xùn)練時(shí)的用餐時(shí)間作非正式的計(jì)劃。
88.每位團(tuán)隊(duì)成員都必須參與設(shè)定目標(biāo)的工作,以促進(jìn)團(tuán)隊(duì)合作及達(dá)成共識(shí)。
89.允許團(tuán)隊(duì)自行決定達(dá)成目標(biāo)的方法,可激勵(lì)團(tuán)隊(duì)努力工作。
90.確定目標(biāo)能激發(fā)團(tuán)隊(duì)的斗志,如果不行,請(qǐng)改變目標(biāo)。
91.一支沒有“嚴(yán)峻”目標(biāo)的團(tuán)隊(duì),工作表現(xiàn)將不如接受過此類考驗(yàn)的團(tuán)隊(duì)。
92.設(shè)定獎(jiǎng)勵(lì)標(biāo)準(zhǔn)時(shí),允許團(tuán)隊(duì)成員有發(fā)言權(quán)。
93.避免使用名次表,因?yàn)槁浜蟮膱F(tuán)隊(duì)成員將會(huì)感到自尊心受創(chuàng)。
94.指定某人監(jiān)視市場(chǎng)上每一個(gè)相關(guān)變化。
95.隨時(shí)準(zhǔn)備作改變,甚至計(jì)劃的根本要素亦包含在改變的范圍內(nèi)。
96.記住有某些人很害怕變革。
97.尋找能推動(dòng)改革的團(tuán)隊(duì)成員。
98.每隔一段時(shí)間作一次生涯發(fā)展的評(píng)量。
99.記?。汗膭?lì)團(tuán)隊(duì)成員即是在幫助團(tuán)隊(duì)。
100.與團(tuán)隊(duì)同事就生涯規(guī)劃達(dá)成一致意見,并給他們提供必要的協(xié)助。
101.團(tuán)隊(duì)解散后仍舊要與團(tuán)隊(duì)成員保持聯(lián)系,因?yàn)槟憧赡苓€會(huì)與他們?cè)俅魏献?/p>
用于 FROM 子句時(shí),把源表記錄組合起來。
FROM表1 [ LEFT | RIGHT ] JOIN表2
????ON 表1.字段1compopr 表2. 字段2
LEFT JOIN 及 RIGHT JOIN 運(yùn)算可分為以下幾個(gè)部分:
部分 | 說明 |
---|---|
table1, table2 | 記錄被組合的表的名稱。 |
field1, field2 | 被聯(lián)接的字段的名稱。且這些字段必須有相同的數(shù)據(jù)類型及包含相同類型的數(shù)據(jù),但它們不需要有相同的名稱。 |
compopr | 任何的關(guān)系比較運(yùn)算子:"=," "<," ">," "<=," ">=," 或 "<>." |
用 LEFT JOIN 運(yùn)算 創(chuàng)建左邊外部聯(lián)接.左邊外部聯(lián)接將包含了從第一個(gè)(左邊)開始的兩個(gè)表中的全部記錄,即使在第二個(gè)(右邊)表中并沒有相符值的記錄。
用RIGHT JOIN 運(yùn)算 創(chuàng)建 右邊外部聯(lián)接.右邊外部聯(lián)接將包含了從第二個(gè)(右邊)開始的兩個(gè)表中的全部記錄,即使在第一個(gè)(左邊)表中并沒有匹配值的記錄。
例如,可以使用 LEFT JOIN 與部門(左邊)及員工(右邊)表來選擇所有的部門,包含了沒有分配到員工的部門。可以使用 RIGHT JOIN 選擇所有的員工,包含了沒有分配到部門的員工。
下列示例顯示如何在類標(biāo)識(shí)符字段中聯(lián)接類表及產(chǎn)品表。查詢將會(huì)列出所有種類的列表,包含那些沒有產(chǎn)品在其中的種類:
SELECT CategoryName,
ProductName
FROM Categories LEFT JOIN Products
ON Categories.CategoryID = Products.CategoryID;
在本例中,CategoryID 是聯(lián)接的字段,但由于它不包含在 SELECT 語句中,因此,也不包含在查詢結(jié)果中。要包含聯(lián)接的字段,請(qǐng)?jiān)?SELECT 語句中輸入字段名 — 在這個(gè)示例中為 Categories.CategoryID。
注意
欲創(chuàng)建只包含聯(lián)接字段中數(shù)據(jù)相同的記錄的查詢,請(qǐng)用 INNER JOIN 運(yùn)算。
若試圖聯(lián)接包含 Memo或 OLE Object數(shù)據(jù)的字段,會(huì)導(dǎo)致錯(cuò)誤。
FROM 子句 (Microsoft Jet SQL) | UNION 運(yùn)算 (Microsoft Jet SQL) |
INNER JOIN 運(yùn)算 (Microsoft Jet SQL) | ? |
LEFT JOIN 和 RIGHT JOIN 運(yùn)算示例
關(guān)閉msn,在開始->運(yùn)行中分別輸入rst is Ok!" + rst.next());
while(rst.next()){
out.println("
BOOK_CODE:" + rst.getString(1));
}
cn.close();
}else{
out.println("rst Fail!");
}
}
else
out.println("Fail!");
}catch(Exception ne){ out.println(ne);
}
3.2 Statement Pool
普通預(yù)編譯代碼:
String strSQL=”select name from items where id=?”;
PreparedStatement ps=conn.prepareStatement(strSQL);
ps.setString(1, “2”);
ResultSet rs=ps.executeQuery();
但是PreparedStatement 是與特定的Connection關(guān)聯(lián)的,一旦Connection關(guān)閉,則相關(guān)的PreparedStatement 也會(huì)關(guān)閉。
為了創(chuàng)建PreparedStatement 緩沖池,可以在invoke方法中通過sql語句判斷池中還有沒有可用實(shí)例。
4. 持久層設(shè)計(jì)與O/R mapping 技術(shù)
1) Hernate:適合對(duì)新產(chǎn)品的開發(fā),進(jìn)行封閉化的設(shè)計(jì)
Hibernate 2003年被Jboss接管,通過把java pojo對(duì)象映射到數(shù)據(jù)庫的table中,采用了xml/javareflection技術(shù)等。3.0提供了對(duì)存儲(chǔ)過程和手寫sql的支持,本身提供了hql語言。
開發(fā)所需要的文件:
hibernate配置文件: hibernate.cfg.xml 或 hibernate.properties
hibernate 映射文件: a.hbm.xml
pojo類源文件: a.java
導(dǎo)出表與表之間的關(guān)系:
a. 從java對(duì)象到hbm文件:xdoclet
b. 從hbm文件到j(luò)ava對(duì)象:hibernate extension
c. 從數(shù)據(jù)庫到hbm文件:middlegen
d. 從hbm文件到數(shù)據(jù)庫:SchemaExport
2)Iatis :適合對(duì)遺留系統(tǒng)的改造和對(duì)既有數(shù)據(jù)庫的復(fù)用,有很強(qiáng)的靈活性 3) Apache OJB:優(yōu)勢(shì)在于對(duì)標(biāo)準(zhǔn)的全面支持 4)EJB:適合集群服務(wù)器,其性能也不象某些人所詬病的那么差勁 5) JDO (java data object)
設(shè)置一個(gè)Properties對(duì)象,從而獲取一個(gè)JDO的PersistenceManagerFactory(相當(dāng)于JDBC連接池中的DataSource),進(jìn)而獲得一個(gè)PersistenceManager對(duì)象(相當(dāng)于JDBC中的Connection對(duì)象),之后,你可以用這個(gè)PersistenceManager對(duì)象來增加、更新、刪除、查詢對(duì)象。
JDOQL是JDO的查詢語言;它有點(diǎn)象SQL,但卻是依照J(rèn)ava的語法的。
5. 基于開源框架的Struts+Spring+Hibernate實(shí)現(xiàn)方案
示例:這是一個(gè)3層架構(gòu)的web 程序,通過一個(gè)Action 來調(diào)用業(yè)務(wù)代理,再通過它來回調(diào) DAO類。下面的流程圖表示了MyUsers是如何工作的。數(shù)字表明了流程的先后順序,從web層(UserAction)到中間層(UserManager),再到數(shù)據(jù)層(UserDAO),然后返回。
Spring是AOP, UserManager和UserDAO都是接口.
1) web層(UserAction) :調(diào)用中間層的接口方法,將UserManager作為屬性注入。
采用流行的Struts框架,雖然有很多人不屑一顧,但是這項(xiàng)技術(shù)在業(yè)界用的比較普遍,能滿足基本的功能,可以減少培訓(xùn)學(xué)習(xí)成本。
2) 中間層(UserManager):將UserDAO作為屬性注入,其實(shí)現(xiàn)主要是調(diào)用數(shù)據(jù)層接口的一些方法;它處于事務(wù)控制中。
采用Spring框架實(shí)現(xiàn),IOC與AOP是它的代名詞,功能齊全,非常棒的一個(gè)架構(gòu)。
3) 數(shù)據(jù)層(UserDAO):實(shí)現(xiàn)類繼承HibernateDaoSupport類,在該類中可以調(diào)用getHibernateTemplate()的一些方法執(zhí)行具體的數(shù)據(jù)操作。
采用Hibernate做O/R mapping,從種種跡象可以看出,Hibernate就是EJB3.0的beta版。 (轉(zhuǎn)載文章請(qǐng)保留出處:Java家(www.javajia.com))
用java寫服務(wù)端代碼
import java.io.*;
import java.net.*;
public class test {
public test() {
}
public static final int PORT = 8080;
public static final String ip = "10.194.111.222";
public static void main(String[] args) throws IOException {
ServerSocket s = new ServerSocket(51,2,InetAddress.getByName(ip));
System.out.println("Started: " + s);
try {
// Blocks until a connection occurs:
Socket socket = s.accept();
try {
System.out.println(
"Connection accepted: "+ socket);
BufferedReader in =
new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
// Output is automatically flushed
// by PrintWriter:
PrintWriter out =
new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream())),true);
while (true) {
String str = in.readLine();
if (str.equals("END")) break;
System.out.println("Echoing: " + str);
out.println(str);
}
// Always close the two sockets...
} finally {
System.out.println("closing...");
socket.close();
}
} finally {
s.close();
}
}
}
.net寫客戶端代碼
private void button2_Click(object sender, System.EventArgs e)
{
try
{
stSend = new Socket ( AddressFamily.InterNetwork ,
SocketType.Stream , ProtocolType.Tcp ) ;
//初始化一個(gè)Socket實(shí)例
IPEndPoint tempRemoteIP = new IPEndPoint(IPAddress.Parse("10.194.111.222"),51);
//根據(jù)IP地址和端口號(hào)創(chuàng)建遠(yuǎn)程終結(jié)點(diǎn)
EndPoint epTemp = ( EndPoint ) tempRemoteIP;
stSend.Connect ( epTemp ) ;
}
catch ( Exception err)
{
string s = err.ToString();
}
}
1.工作區(qū): (顯隱)
項(xiàng)目面板:ctrl + Alt + p (Project)
設(shè)計(jì)面板: ctrl + Alt + c (content)
結(jié)構(gòu)面板: ctrl + Alt + s (Structure)
信息面板: ctrl + Alt + M (Message)
狀態(tài)面板: ctrl + Alt + Z
2.主面板:(代碼面板和設(shè)計(jì)面板)
激活代碼模塊: ctrl + J (@1)
參數(shù)提示信息的激活: ctrl + shift + H
打開查詢、替換窗口: ctrl + F
類的查詢: ctrl + -
3.F 鍵的用法
F1: 幫助快捷
F4: 運(yùn)行多行
F5: 加入斷點(diǎn)
F7: 當(dāng)遇到方法時(shí)會(huì)運(yùn)行方法內(nèi)的代碼
F8: 逐步運(yùn)行代碼
F12: 代碼面板和設(shè)計(jì)面板切換
4. Shift 鍵的用法
添加多個(gè)相同組件: 按shift鍵在選項(xiàng)上選取組件,把組件添加到窗口即可
調(diào)整組件間間隔和對(duì)齊: 假設(shè)有組件JPanel 1/2/3;(要達(dá)到3個(gè)組件寬度相同,組件間隔相等,并且都是依據(jù)JPanel1左對(duì)齊),按shift鍵,用鼠標(biāo)選中需要調(diào)整的組件,(第一個(gè)選中的組件是其他的基準(zhǔn))然后右鍵。
5: codeInsight 和 Codetemplates
MemberInsight -- 根據(jù)當(dāng)前的代碼提示可用的類成員或方法(說明)
ParameterInsight -- 提示當(dāng)前的方法需要使用的參數(shù)
SymbolInsigh -- 查看當(dāng)前的變量、方法或者類的愿代碼。
MemberInsight: ctrl + space 或 ctrl + H
ParameterInsight: ctrl + shift + space 或 ctrl + shift + H
SymbolInsight: ctrl + Enter 或 Alt + shift + H
ClassInsight : ctrl + alt + space 或 ctrl + alt + H
注: (@1):使用代碼功能:(ctrl + J)
1、 在想要輸入代碼的位置輸入代碼摸板名,然后按 ctrl + J(開發(fā)人員可以用主菜單上的Tools/Editor/Templates命令來查看代碼摸板的名字)
2、把光標(biāo)定位于想要輸入代碼的位置,然后按ctrl + J
http://blog.csdn.net/javamxj/archive/2004/10/11/131935.aspx
我是一名java的愛好者,理所當(dāng)然裝了不少java方面的軟件,大部分是開放源碼的,而且多數(shù)是綠色軟件,只要解壓,設(shè)置一下環(huán)境變量即可使用。
我們要開發(fā)一個(gè)java類:其內(nèi)容只有一句,輸出"hello ant"字符串。并使用ant完成編譯和運(yùn)行工作,這個(gè)例子只是為了跑通ant,不附加多余的東西。
下圖為文件組織,請(qǐng)建立相應(yīng)的目錄,并編寫HelloAnt.java
按照人家老外的文件組織規(guī)則咱也照搬。
hello.ant.HelloAnt.java |
在項(xiàng)目根目錄(hello-ant\)寫1個(gè)文件:ant執(zhí)行配置文件build.xml
build.xml |
ok,一切大功告成,哦,不,還沒有運(yùn)行它。
dos下進(jìn)入hello-ant的目錄,即build.xml所在的目錄,我們要用ant工具執(zhí)行它 ,
執(zhí)行: %ant_home%/bin/ant -file build.xml 用ant工具執(zhí)行當(dāng)前目錄下的配置文件build.xml
或 :ant -file build.xml 你如果設(shè)置%ant_home%/bin到path中
這次ok了,這是答案:
命令提示符窗口 |
D:\temp\hello-ant>ant -file build.xml Buildfile: build.xml main: [javac] Compiling 1 source file to D:\temp\hello-ant\build\classes [java] hello ant,ant 的第一次接觸,好棒! BUILD SUCCESSFUL Total time: 2 seconds D:\temp\hello-ant> |
檢查一下build/classes目錄,哦,看到編譯過的文件就在這里:
build/classes/hello/ant/HelloAnt.class.
hello ant 進(jìn)級(jí)
(此段比較廢話,可以略過)
你也許會(huì)說:這末簡(jiǎn)單的工作寫個(gè)批處理不就得了,又xml又ant的,把我的時(shí)間都浪費(fèi)完了,我用jbuild或
webShpere不就得了,怎末說你才明白呢?反正網(wǎng)上開源項(xiàng)目大多數(shù)都用ant,你總不能給人家個(gè)*.jpx吧,
而且這樣的工具太貴,受不了(當(dāng)然用D的兄弟不怕^_^ ),而且ant可以讓你明確的管理和自動(dòng)化所有的東西:
編譯-實(shí)施-測(cè)試...,哎,稍微麻煩一點(diǎn)點(diǎn),但節(jié)約你以前花在零碎的copy,paste上的時(shí)間.而且我發(fā)現(xiàn)管理
代碼的質(zhì)量有所提高.
我們要改進(jìn)build.xml,讓它做更多的事情:
凡事都講究平衡,你要ant給你做更多事,當(dāng)然要累一點(diǎn)點(diǎn),不過只用累一次,以后的代碼修改后的構(gòu)建都是"一鍵式"完成,我們制作一個(gè)hello的簡(jiǎn)單例子,你可以自己做j2ee的練習(xí)。
我們要擴(kuò)充目錄結(jié)構(gòu),使它更像回事:
ant處理編譯之前的目錄:
ant處理之后的目錄:
圖中:\src,\docs,\lib是自己組織的文件結(jié)構(gòu),\build,\dist是ant動(dòng)態(tài)生成的成品。
\src 源文件:java源,script源,jsp源,xml配置.....
\src\main java源
\src\script window,unix,liunx的執(zhí)行script,我們的簡(jiǎn)單只有一個(gè):
run.bat: java hello.ant.HelloAnt
\docs 手寫說明文檔
\lib 程序所需類庫的jar,比如j2ee.jar,mail,jar...
\build 用ant動(dòng)態(tài)生成的構(gòu)建目錄
\build\classes 編譯的類文件
\build\docs copy "\docs"的手寫說明文檔,和ant生成的api文檔
\build\lib 放置我們自己的HelloAnt.class打包成品hello-ant.jar
\dist\bin copy "\src\script" 得執(zhí)行文件
\dist\docs copy "\build\docs" 的文檔
\dist\lib 除了copy "\build\lib"下的hello-ant.jar外,
還應(yīng)copy "\lib"的程序所需jar,這里我們沒有。
以上是我學(xué)老外的文件組織,大家可以按照自己的愛好組織
我們編寫必要的文件:
hello.ant. HelloAnt.java |
已有 |
\src\script.bat |
\docs\index.html 隨便寫一個(gè)手寫的文檔 |
hello ant 軟件項(xiàng)目手冊(cè)docs |
\build.xml 配置文件 |
build.xml多了些,但其實(shí)很簡(jiǎn)單:(注釋比較詳細(xì)可以參照,這里再簡(jiǎn)單說一下)
一個(gè)build.xml包含一個(gè)工程的自動(dòng)化處理的完整xml說明,并且基本由3種東東組成:
<project >
1.全局變量的定義
<property/>
2.任務(wù)組
<target>
3.許多單項(xiàng)任務(wù)... 像copy,delete,javac,jar...
<task1/>
<task2/>
<task3/>
</target>
</project>
參考及下載:
本文程序:第1個(gè)hello-ant
本文程序:第2個(gè)進(jìn)階的hello-ant
ant最新下載:
http://jakarta.apache.org/ant/index.html
ant具體的編寫方法參考ant手冊(cè)以下2部分就形,
http://jakarta.apache.org/ant/manual/using 使用說明
http://jakarta.apache.org/ant/manual/coretasklist.html 核心tasks
其他一大堆東西你要看也行。不過我覺得比較浪費(fèi)時(shí)間。
http://jakarta.apache.org/ant/manual/index.html 手冊(cè)index
huihoo.com翻譯改編的ant/manual/using
http://www.huihoo.com/java/ant.html
用ANT構(gòu)造Application作者:余斌斌
http://developer.ccidnet.com/pub/disp/Article?columnID=295&articleID=27619&pageNO=1
ibm 利用 Ant 和 JUnit 進(jìn)行增量開發(fā)——使用單元測(cè)試來逐步改進(jìn)代碼
http://www-900.ibm.com/developerWorks/cn/java/j-ant/index.shtml
SET ANT_HOME=D:\jakarta-ant-1.5.1 //注意是Ant的安裝目錄,不是bin子目錄 SET PATH=%PATH%;%ANT_HOME%\bin; |
Buildfile: build.xml does not exist! Build failed |
//HelloWorld.java package com.sharetop.antdemo; public class HelloWorld { public static void main( String args[] ) { System.out.println("Hello world. "); } } |
<?xml version="1.0" encoding="UTF-8" ?> <project name="HelloWorld" default="run" basedir="." > <property name="src" value="src"/> <property name="dest" value="classes"/> <property name="hello_jar" value="hello.jar" /> <target name="init"> <mkdir dir="${dest}"/> </target> <target name="compile" depends="init"> <javac srcdir="${src}" destdir="${dest}"/> </target> <target name="build" depends="compile"> <jar jarfile="${hello_jar}" basedir="${dest}"/> </target> <target name="run" depends="build"> <java classname="com.sharetop.antdemo.HelloWorld" classpath="${hello_jar}"/> </target> </project> |
圖1 ant_demo應(yīng)用的目錄結(jié)構(gòu)
G:\myDoc\ant_demo>ant -buildfile build_front.xml |
G:\myDoc\ant_demo>ant compile |
目錄 | 文件 |
bin | 公共的二進(jìn)制文件,以及運(yùn)行腳本 |
build | 臨時(shí)創(chuàng)建的文件,如類文件等 |
dist | 目標(biāo)輸出文件,如生成Jar文件等。 |
doc/javadocs | 文檔。 |
lib | 需要導(dǎo)出的Java包 |
src | 源文件 |
<target name="core" depends="init"> <ant dir="components" target="core"/> <ant dir="waf/src" target="core"/> <ant dir="apps" target="core"/> </target> |
圖2 build.xml文件的結(jié)構(gòu)
<!DOCTYPE project [ <!ENTITY share-variable SYSTEM "file:../share-variable.xml"> <!ENTITY build-share SYSTEM "file:../build-share.xml"> ]> <project name="main" default="complie" basedir="."> &share-variable; &build-share; ... ... |
<target name="deploy_HelloEJB" depends="compile"> <delete dir="${temp}/ejb_make"/> <!-- 首先刪除臨時(shí)目錄 --> <delete file="${temp}/helloEJB.jar"/> <!-- 刪除WebLogic域中老版本的EJB --> <delete file="${weblogic.deploy.dest}/helloEJB.jar"/> <!-- 創(chuàng)建META-INF目錄,放置ejb-jar.xml和weblogic-ejb-jar.xml --> <mkdir dir="${temp}/ejb_make/META-INF"/> <!-- 拷貝ejb-jar.xml和weblogic-ejb-jar.xml 到臨時(shí)目錄--> <copy todir="${temp}/ejb_make/META-INF"> <fileset dir="etc/baseinfo"> <include name="*.xml"/> </fileset> </copy> <!-- 拷貝所有的helloEJB類到臨時(shí)目錄 --> <copy todir="${temp}/ejb_make/"> <fileset dir="${dest.classes}/"> <!-- dest.classes是輸出的類文件目錄 --> <include name="${dest.classes}/helloEJB/**"/> </fileset> </copy> <!-- 將所有這些文件打包成helloEJB.jar --> <jar jarfile="${temp}/helloEJB.jar" basedir="${temp}/ejb_make"/> <!-- 進(jìn)行weblogic.ejbc編譯 --> <java classpath="${wl_cp}" classname="weblogic.ejbc" fork="yes" > <classpath> <fileset dir="lib"> <include name="*.jar" /> </fileset> </classpath> <arg value="${temp}/helloEJB.jar" /> <arg value="${temp}/helloEJB_deploy.jar" /> </java> <!-- 拷貝/發(fā)布到WebLogic的{DOMAIN}\applications目錄 --> <copy file="${temp}/helloEJB_deploy.jar" todir="${weblogic.deploy.dest}"/> </target> |
<target name="run" depends="client"> <junit printsummary="yes" fork="yes" haltonfailure="yes"> <classpath> <pathelement location="client.jar" /> </classpath> <formatter type="plain" /> <test name="com.sharetop.antdemo.HelloWorldTest" /> </junit> </target> |
//HelloInfoTask.java package com.sharetop.antdemo; import org.apache.tools.ant.*; public class HelloInfoTask { private String msg; public void execute() throws BuildException { System.out.println(msg); } public void setMessage(String msg) { this.msg = msg; } } |
//HelloTask.java package com.sharetop.antdemo; import org.apache.tools.ant.*; public class HelloTask extends Task implements org.apache.tools.ant.TaskContainer { private Task info; private int count; public void execute() throws BuildException { for(int i=0;i<count;i++) info.execute(); } public void setCount(int c){ this.count=c; } public void addTask(Task t){ this.info=t; } } |
<target name="hello" depends="client"> <taskdef name="hello" classname="com.sharetop.antdemo.HelloTask" classpath="client.jar"/> <taskdef name="helloinfo" classname="com.sharetop.antdemo.HelloInfoTask" classpath="client.jar"/> <hello count="3" > <helloinfo message="hello world" /> </hello> </target> |
package com.sharetop.antdemo; import org.apache.tools.ant.*; import org.apache.tools.ant.taskdefs.*; import java.io.File; public class RunAntTask { public RunAntTask() { } public static void main(String args[]){ AntJAR j = new AntJAR(); j.setBasedir(new File("./classes")); j.setJarfile(new File("aaa.jar")); j.execute(); } } final class AntJAR extends Jar { public AntJAR() { project = new Project(); project.init(); taskType = "jar"; taskName = "jar"; } } |
public void buildTarget(String targetName,String buildFileName) { try { Project p = new Project(); p.init(); File f = new File(buildFileName); p.setUserProperty("ant.file",f.getAbsolutePath()); ProjectHelper.configureProject(p,f); p.addBuildListener(this); if( targetName==null ) p.executeTarget(p.getDefaultTarget()); else p.executeTarget(targetName); } catch (Exception ex) { jTextArea1.append(ex.getMessage()); } } |
public void buildStarted(BuildEvent event){ /* nothing*/ } public void buildFinished(BuildEvent event) { /* nothing*/ } public void targetStarted(BuildEvent event) { this.jTextArea1.append(event.getTarget().getName()+": \n\r"); } public void targetFinished(BuildEvent event) {/* nothing*/ } public void taskStarted(BuildEvent event) {/* nothing*/ } public void taskFinished(BuildEvent event) { /* nothing*/ } public void messageLogged(BuildEvent event) { int prior = event.getPriority(); switch(prior){ case Project.MSG_ERR : this.jTextArea1.append("["+event.getTask().getTaskName()+"]Err:" +event.getMessage()); break; case Project.MSG_INFO: this.jTextArea1.append("["+event.getTask().getTaskName()+"]"+event.getMessage ()); break; case Project.MSG_WARN: this.jTextArea1.append("["+event.getTask().getTaskName()+"]" +event.getMessage()); break; case Project.MSG_VERBOSE: this.jTextArea1.append(event.getMessage()); break; } } |
//服務(wù)器代碼
/********************************Main******************************/
import java.io.*;
import java.net.*;
import java.util.*;
public class ServerMain{
public static Vector socketVector=new Vector();
public static void main(String[] args) throws IOException{
System.out.println("服務(wù)器啟動(dòng)........");
ServerSocket s = new ServerSocket(5000);
while(true){
Socket soc = s.accept();
SocketThread st=new SocketThread(soc);
socketVector.addElement(st);
st.start();
}
}
public static void sendEveryone(String msg){
Object object=null;
int len=socketVector.size();
for(int i=0;i<len;i++){
try {
object=socketVector.elementAt(i);
SocketThread st = (SocketThread)object;
st.sender.send(msg);
}
catch (Exception ex) {
socketVector.removeElement(object);
}
}
}
public static void removeObject(Object object){
socketVector.removeElement(object);
}
public static void removeObject(Sender sender) throws Exception{
int len=socketVector.size();
for(int i=0;i<len;i++){
Object object=socketVector.elementAt(i);
SocketThread st = (SocketThread)object;
if(st.sender==sender)
socketVector.removeElement(object);
}
}
}
/*********************************SocketThread **********************/
import java.io.*;
import java.net.*;
import java.util.*;
public class SocketThread implements Runnable{
public Socket socke;
public DataInputStream dis;
public DataOutputStream dos;
public Sender sender;
private boolean stop;
Calendar date;// = Calendar.getInstance(TimeZone.getTimeZone("Asia/ShangHai"));
public SocketThread(Socket sok){
socke=sok;
}
public void start(){
Thread t=new Thread(this);
t.start();
}
public void run() {
try {
socke.setKeepAlive(true);
dis = new DataInputStream(socke.getInputStream());
dos = new DataOutputStream(socke.getOutputStream());
sender = new Sender(dos);
while (true) {
StringBuffer sb = new StringBuffer();
char c;
while (((c = dis.readChar()) != '\n') && (c != -1)) {
sb.append(c);
}
if (c == -1) {
break;
}
date = Calendar.getInstance(TimeZone.getTimeZone("Asia/ShangHai"));
String ljnTime="("+date.get(date.YEAR)+"/"+(date.get(date.MONTH)+1)+"/"+date.get(date.DATE)+" "+date.get(date.HOUR_OF_DAY)+":"+date.get(date.MINUTE)+":"+date.get(date.SECOND)+")";
String acceptMsg=sb.toString();
System.out.println(ljnTime+acceptMsg);
ServerMain.sendEveryone(acceptMsg);
}
stop();
ServerMain.removeObject(this);
} catch (IOException ioe) {
} catch (Exception e) {
e.printStackTrace();
}
}
public void stop() {
try {
stop = true;
if(sender!=null){
sender.stop1();
}
if (dis != null) {
dis.close();
}
if (dos != null) {
dos.close();
}
if (socke != null) {
socke.close();
}
} catch (IOException ioe) {
}
}
}
/*********************************************Sender**************************/
import java.io.*;
public class Sender extends Thread {
private DataOutputStream dos;
private String message;
public Sender(DataOutputStream os) {
this.dos = os;
start();
}
public synchronized void send(String msg) {
message = msg;
notify();
}
public synchronized void run() {
while (true) {
if (message == null) {
try {
wait();
} catch (InterruptedException e) {
}
}
if (message == null) {
break;
}
try {
dos.writeChars(message);
dos.writeChars("\r\n");
} catch (IOException ioe) {
try {
ServerMain.removeObject(this);
}
catch (Exception ex) {
}
}
message = null;
}
}
public synchronized void stop1() {
message = null;
notify();
}
}
//下面為手機(jī)客戶端代碼
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class ChatClientMIDlet extends MIDlet {
private static ChatClientMIDlet instance;
public static ChatForm displayable = new ChatForm();
/** Constructor */
public ChatClientMIDlet() {
instance = this;
}
/** Main method */
public void startApp() {
Display.getDisplay(this).setCurrent(displayable);
}
/** Handle pausing the MIDlet */
public void pauseApp() {
}
/** Handle destroying the MIDlet */
public void destroyApp(boolean unconditional) {
}
public static void setCurrent(Displayable s){
Display.getDisplay(instance).setCurrent(s);
}
/** Quit the MIDlet */
public static void quitApp() {
instance.destroyApp(true);
instance.notifyDestroyed();
instance = null;
}
}
/********************************************************ChatForm ************************/
import com.nec.io.*;
import javax.microedition.lcdui.*;
import javax.microedition.io.*;
import java.io.*;
public class ChatForm extends Form implements CommandListener,Runnable {
public Form mainForm=new Form("聊天室");
public Command enter=new Command("進(jìn)入",Command.OK,0);
public Command send=new Command("發(fā)送",Command.OK,1);
public Command exit=new Command("退出",Command.EXIT,0);
public DataInputStream dis;
public DataOutputStream dos;
public SocketConnection sc;
public Sender sender;
public boolean stop;
public TextField textField=new TextField("請(qǐng)輸入昵稱:", null, 10, TextField.ANY);
public TextField info=new TextField("請(qǐng)輸入消息:", null,255, TextField.ANY);
public ChoiceGroup choiceGroup=new ChoiceGroup(null,ChoiceGroup.EXCLUSIVE);
public String MyName="游客";
public boolean isCurrent=false;;
public ChatForm() {
super("我的聊天室");
append(textField);
addCommand(enter);
mainForm.append(info);
mainForm.append(choiceGroup);
choiceGroup.append(");
setCommandListener(this);
mainForm.addCommand(send);
mainForm.addCommand(exit);
mainForm.setCommandListener(this);
}
public void commandAction(Command c, Displayable dis) {
if(c==enter){
if(textField.getString().length()==0){
Alert alert=new Alert("警告","昵稱不能為空!", null, AlertType.WARNING) ;
alert.setTimeout(3000);
ChatClientMIDlet.setCurrent(alert);
return;
}else
{
MyName = textField.getString();
append("正在進(jìn)入......");
}
Thread t=new Thread(this);
t.start();
}else if(c==send){
if(info.getString().length()==0){
Alert alert=new Alert("警告","消息內(nèi)容不能為空!", null, AlertType.WARNING) ;
alert.setTimeout(3000);
ChatClientMIDlet.setCurrent(alert);
return;
}
sender.send(MyName+"說:"+info.getString());
info.setString("");
}
else{
stop();
ChatClientMIDlet.quitApp();
}
}
public void run() {
try {
sc = (SocketConnection) Connector.open("socket://127.0.0.1:5000");
sc.setSocketOption(SocketConnection.LINGER, 5);
dis = new DataInputStream(sc.openInputStream());
dos = new DataOutputStream(sc.openOutputStream());
sender = new Sender(dos);
sender.send("歡迎"+MyName+"進(jìn)入房間");
while (true) {
if(stop) break;
StringBuffer sb = new StringBuffer();
char c;
while (((c = dis.readChar()) != '\n') && (c != -1)) {
sb.append(c);
}
if (c == -1) break;
if(!isCurrent){
ChatClientMIDlet.setCurrent(mainForm);
isCurrent=true;
}
String msg=sb.toString();
msg=msg.substring(0,msg.length()-2);
choiceGroup.insert(0,msg,null);
choiceGroup.setSelectedIndex(0,true);
}
stop();
} catch (ConnectionNotFoundException cnfe) {
} catch (IOException ioe) {
if (!stop) {
ioe.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void stop() {
try {
stop = true;
if (sender != null) {
sender.stop1();
}
if (dis != null) {
dis.close();
}
if (dos != null) {
dos.close();
}
if (sc != null) {
sc.close();
}
} catch (IOException ioe) {
}
}
}
/**************************Sender*********************************/
同上