Java函數式編程(十):搜集器。本站提示廣大學習愛好者:(Java函數式編程(十):搜集器)文章只能為提供參考,不一定能成為您想要的結果。以下是Java函數式編程(十):搜集器正文
比來看到群裡有人聊到他們的辦事器比來被掛馬,然後想應用一個劇本可以或許及時監控web目次下文件的變更,也就是對該目次的增刪改操作都邑記載到響應日記下。
其時感到這個功效切實其實實有點意思,所以網上查閱了些材料,本身研討了下,這會兒有空寫了個劇本,分享給年夜家,若有成績,還請年夜家指出。
以下我寫了兩個劇本:
劇本1:將須要監控的目次的原始狀況保留到LOG日記
劇本2:將劇本1的原始狀況與本劇本比對,假如目次文件產生變更,則將變更的內容保留到日記。
注:道理現實上應用的是du -sb輸入值來斷定文件的變更,再應用diff停止比對。
1.在履行劇本前要保留原始的狀況:
# vi initial.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin/:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 監控的目次
DIR=/root
# 暫時文件
TMP_A=/tmp/a.txt
# 遍歷指定目次下的文件年夜小及途徑偏重定向到日記文件
find $DIR -print0 | xargs -0 du -sb > $TMP_A
2.履行監控劇本
# vi monitor.sh
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin/:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 監控的目次
DIR=/root
# 日期變量
DATE=`date +%F_%H:%M`
# 暫時文件
TMP_A=/tmp/a.txt
TMP_B=/tmp/b.txt
TMP_C=/tmp/c.txt
# 日記文件
LOG=/var/log/filemodify.log
# 遍歷指定目次下的文件年夜小及途徑偏重定向到日記文件
find $DIR -print0 | xargs -0 du -sb > $TMP_B
# 比擬目次變更,並將變更的文件寫入日記
DIFF=$(diff $TMP_A $TMP_B)
if [[ -z $DIFF ]];
then
echo "Nothing change" >> $LOG
else
echo "Here is the change" >> $LOG
echo "" >> $LOG
echo "$DIFF" |awk '{print $3}'|sort -k2n |uniq |sed '/^$/d' |tee $TMP_C >> $LOG
if [ -s $TMP_C ];
then
echo "" >> $LOG
echo "It modified at $DATE" >> $LOG
# 將以後監控的目次構造籠罩為初始狀況
find $DIR -print0 | xargs -0 du -sb > $TMP_A
fi
fi
echo "====================================" >> $LOG
#清算暫時文件
rm -rf $TMP_B $TMP_C
��戶交互的邏輯。
作為一個開辟者,你可以依據本身的愛好,用本身所熟習的IDE(好比Eclipes或Intellij)手工編寫MXML,也能夠應用Flex支撐的“所見即所得”開辟情況(今朝開辟代號為Brady)。即便你選擇手工編寫MXML,仍可以使用Flex供給的XML schema,在IDE中為你供給代碼提醒(code hinting)和代碼主動填充(code completion)的功效.
上面例子是一個名為HelloWord.mxml的簡略Flex運用的源代碼。該運用法式有兩個TextInput組件,當點擊Copy時,source TextInput的內容就會顯示在destination TextInput域中。以下例子顯示若何用MXML和ActionScript來創立運用:用MXML界說用戶界面,再用ActionScript為Button組件的事宜監聽器編寫拷貝邏輯。
<?xml version=“1.0“ encoding=“iso-8859-1“?>
<mx:Application xmlns:mx=“http://www.macromedia.com/2003/mxml“>
<mx:TextInput id=“source“ width=“100“/>
<mx:Button label=“Copy“ click=“destination.text=source.text“/>
<mx:TextInput id=“destination“ width=“100“/>
</mx:Application>
Flex開辟與安排模子
要開辟並安排這個運用,普通要經由以下步調:
1. 用你熟習的IDE或Flex的“所見即所得”開辟對象編寫HelloWold.mxml文件。
2. 把該文件安排到運用辦事器上。普通可以經由過程拷貝HelloWorld.mxml到某個web運用的目次下,或將HelloWorld.mxml作為運用的一部門打包到WAR文件中去。
當一個用戶初次要求HelloWorld.mxml的時刻,辦事器會將MXML代碼編譯為Flash字節碼(一個SWF文件)。然後辦事器將發生的SWF文件發往客戶端,讓Flash播放器履行。對統一個MXML文檔的並發要求,辦事器將跳過編譯進程,直接前往雷同的編譯成果。
假如你對JavaServer Pages比擬熟習,就會發明它們的模子異常類似。就像JSPs被編譯為Java字節碼(servlets)一樣,MXML文件將被編譯為Flash字節碼。兩者的重要分歧在於:在Flex中,發生的字節碼是在客戶端履行的,而由JSP發生的Java字節碼(servlet)是在辦事器端履行的。經由過程Flex,你可以將龐雜客戶端運用無縫的集成到已有的貿易邏輯中。
應用MXML用戶界面組件
具有豐碩的用戶組件是Flex的一年夜特點。除傳統的數據輸出控件(Text InputTextArea,CheckBox,RadioButton,ComboBox等等),MXML還包含了一些高等組件,用於保護構造化數據(Tree 組件)和年夜數據集(DataGrid 組件)。為了清楚的組織數據及其處置進程,Flex還供給了導航組件(Tab,ViewStack,Accordion等等)。
為了更容易於組織用戶界面,Flex容器還界說了結構治理戰略,用於指明一個組件絕對與另外一個組件的地位。Flex組件庫供給了年夜量的、可完成分歧結構戰略的容器。好比,在HBox中的組件將被程度分列,而在VBox中的組件會被垂直分列,而在Grid中組件將以行列的方法停止分列,就象HTML的table一樣。View容器中沒有界說任何結構治理戰略,是以你可以用x,y坐標來指定組件的地位。
上面給出一個在Flex情況下、具有三個面板的傳統e-mail界面。HBox容器中的Tree是程度分列的,而VBox容器中的DataGrid和TextArea則是垂直分列的。
<?xml version=“1.0“ encoding=“iso-8859-1“?>
<mx:Application xmlns:mx=“http://www.macromedia.com/2003/mxml“>
<mx:HBox>
<mx:Tree/>
<mx:VBox>
<mx:DataGrid/>
<mx:TextArea/>
</mx:VBox>
</mx:HBox>
</mx:Application>
編寫ActionScript代碼
Flex說話是事宜驅動的。MXML將事宜作為標簽的屬性,你可認為它編寫事宜監聽器。好比,Button組件有一個click屬性,ComboBox,List和Tree組件有一個change屬性,等等。
關於簡略的交互,可以在標簽的事宜屬性上直接編寫ActionScript語句。例如,在HelloWorld運用中,存在Button的click事宜監聽器中的ActionScripts語句,能把source TextInput 的內容拷貝到destination TextInput中。
<?xml version=“1.0“ encoding=“iso-8859-1“?>
<mx:Application xmlns:mx=“http://www.macromedia.com/2003/mxml“>
<mx:TextInput id=“source“ width=“100“/>
<mx:Button label=“Copy“ click=“destination.text=source.text“/>
<mx:TextInput id=“destination“ width=“100“/>
</mx:Application>
當邏輯更加龐雜的時刻,可以界說自力的ActionScript函數,然後在組件的事宜監聽器中挪用。例如,你可以象上面一樣,重寫HelloWorld運用:
<?xml version=“1.0“ encoding=“iso-8859-1“?>
<mx:Application xmlns:mx=“http://www.macromedia.com/2003/mxml“>
<mx:script>
function copy() {
destination.text=source.text
}
</mx:script>
<mx:TextInput id=“source“ width=“100“/>
<mx:Button label=“Copy“ click=“copy()“/>
<mx:TextInput id=“destination“ width=“100“/>
</mx:Application>
創立一個MXML文件,現實上是創立了一個類。界說在<mx:script>標簽中的ActionScript函數是該類的辦法。你可以在MXML文件或自力的文件中界說ActionScript函數。選擇哪一種辦法,取決你地點的組織,後一種辦法可以對開辟團隊停止更好的分工。
界說本身的組件
在Flex中,你可以從頭開端,或經由過程擴大Flex組件庫中已有的組件,來創立本身的組件。創立組件就象創立一個運用一樣:用MXML排布用戶界面,用ActionScript編寫用界面邏輯。
上面的一個例子是,經由過程擴大VBox類來創立簡略的信譽卡選擇組件。
<?xml version=“1.0“ encoding=“iso-8859-1“?>
<mx:VBox xmlns:mx=“http://www.macromedia.com/2003/mxml“>
<mx:RadioButton groupName=“card“ id=“americanExpress“
label=“American Express“ selected=“true“/>
<mx:RadioButton groupName=“card“ id=“masterCard“ label=“MasterCard“/>
<mx:RadioButton groupName=“card“ id=“visa“ label=“Visa“/>
</mx:VBox>
組件的名字就是源文件的名字。如,源文件的名字是CreditCardChooser.mxml,組件的名字就是CreditCardChooser,如許,這個標簽名便可以用了。上面的例子就用上了適才創立的CreditCardChoose組件。
<?xml version=“1.0“ encoding=“iso-8859-1“?>
<mx:Application xmlns:mx=“http://www.macromedia.com/2003/mxml“>
<mx:Label text=“Select a credit card:“/>
<CreditCardChooser/>
</mx:Application>
界面開辟者還能在Macromedia Flash開辟情況中創立龐雜的可視化組件,並存為SWC文件。
固然,也能夠只用ActionScript界說來全部組件,這類辦法普通用於界說運用中的非可視組件。你能夠會為如許貿易對象創立非可視組件——例如,包括客戶端邏輯的購物車,或是運用中helper類
數據拜訪
Macromedia Flex為面向辦事器架構(SOA – service-oriented architecture)而開辟。在這一模子中,運用經由過程與疏散在分歧處所的辦事停止交互,來完成本身的義務。例如,假如創立一個在線觀光運用,你須要與分歧的辦事停止交互:全球旅店預定辦事,目標信息辦事,氣象辦事等等。這些辦事能夠以分歧的機制來供給,而且來自分歧的處所。Flex使你能在客戶端聚集信息,並供給三種分歧的數據辦事組件,以知足對辦事供給者停止特定命據拜訪的需求:WebService組件,HTTPService組件(普通應用XML經由過程HTTP停止數據拜訪)和RemoteObject組件。MXML許可你用響應的WebService, HTTPService, and RemoteObject標簽來設置與辦事的銜接。
數據綁定
在很多說話中,若何在用戶界面控件中顯示後台數據,是件使人頭疼的工作,並且異常輕易失足。搜集用戶在控件中輸出的數據,並傳給長途辦事也經常是件有趣的工作。
Flex的特點之一,就是供給了雙向的數據綁定機制:你可以將用戶界面控件綁定到辦事挪用的數據成果集上,反過去,也能夠將辦事的參數綁定到用戶界面控件輸出的值上。
上面是一個簡略的股票報價運用。例子應用了WebService標簽來設置與XMMethods供給的股價web辦事停止銜接。這個例子說明了Flex的雙向綁定功效。getQuote辦法的symbol輸出參數被綁定到symbol TextInput組件上。quote標簽被綁定到getQute辦法的挪用成果上。
<?xml version=“1.0“ encoding=“iso-8859-1“?>
<mx:Application xmlns:mx=“http://www.macromedia.com/2003/mxml“>
<mx:WebService id=“wsStock“ wsdl=“http://services.xmethods.net/soap/urn:xmethods-delayed-quotes.wsdl“>
<mx:operation name=“getQuote“>
<mx:request>
<symbol>{symbol.text}</symbol>
</mx:request>
</mx:operation>
</mx:WebService>
<mx:Label text=“Enter a symbol:“/>
<mx:HBox>
<mx:TextInput id=“symbol“/>
<mx:Button label=“Get Quote“ click='wsStock.getQuote.send()'/>
</mx:HBox>
<mx:Label id=“quote“ fontWeight=“bold“>{wsStock.getQuote.result}</mx:Label>
</mx:Application>
現實上,Flex數據綁定機制比傳統的重取/顯示(retrieve/display)方法更勝一籌:在Flex運用中,你可以將隨意率性對象的隨意率性屬性綁定到另外一隨意率性對象的隨意率性屬性值上。
應用層級款式表(CSS)
Flex應用層級款式表尺度來包管用戶界面的分歧性,並使運用更容易於保護。就像在HTML中一樣,你可以在運用中嵌入一個指向內部的款式表,或在特定的標志元素下將某種作風界說為其屬性。款式表還許可界說字體。所需字體界說內嵌於運用的字節碼中,即便用戶的機械上沒有如許的字體,也能被准確的襯著出來。
上面是一個名為main.css的內部款式表。
@font-face {
src: url(“LucidaSansRegular.ttf“);
font-family: mainFont;
}
.error {color: #FF0000; font-size: 12;}
.title {font-family: mainFontBold;font-size: 18;}
TextArea {backgroundColor: #EEF5EE;}
上面的例子經由過程應用<mx:style>標簽聲清楚明了一個內部款式表,並對分歧的控件應用了分歧的款式。
<?xml version=“1.0“ encoding=“iso-8859-1“?>
<mx:Application xmlns:mx=“http://www.macromedia.com/2003/mxml“>
<mx:style src=“main.css“/>
<mx:Label styleName=“error“ text=“This is an error“/>
<mx:Label styleName=“title“ text=“This is a title“/>
<mx:TextArea width=“200“ height=“100“ wordWrap=“true“>This is a TextArea</mx:TextArea>
</mx:Application>
殊效
龐雜Internet運用經常被拿來和客戶/辦事器運用停止比擬。由於它們供給了統一級其余用戶體驗。然則,輕易疏忽的差別是,二者的用戶各具特色。應用客戶/辦事器運用的客戶平日是備受熬煎後,終究順應了他們須要面臨的用戶界面。而龐雜Internet運用的客戶平日是暫時性的用戶。在如許的前提下,一個不直不雅的用戶界面將會損失機遇。
恰當的應用殊效,如浮動提醒和進度狀況,有助於客戶直不雅的懂得以後內容。在MXML中,你可以經由過程設置動畫到達這一目標。
上面的例子應用了Flex特征庫中的prebuilt殊效,在這個例子中,當square組件顯示時,應用WipeRight殊效,而消逝時則應用了WipeLeft殊效。
<?xml version=“1.0“ encoding=“iso-8859-1“?>
<mx:Application xmlns:mx=“http://www.macromedia.com/2003/mxml“>
<mx:View id=“square“ width=“100“ height=“100“ backgroundColor=“#666699“ showEffect=“WipeRight“ hideEffect=“WipeLeft“/>
<mx:HBox>
<mx:Button label=“Display“ click=“square.visible=true“/>
<mx:Button label=“Hide“ click=“square.visible=false“/>
</mx:HBox>
</mx:Application>
總結
Flex說話包括了一個豐碩的用戶界面組件庫,MXML(一種基於XML的標志說話)和ActionScript(基於ECMA 262的、強類型面向對象編程說話)。MXML用於排布用戶界面和處置運用中其他方面的成績,而ActionScript用來處置用戶交互邏輯。因為Flash平台的普及,Flex使開辟者可以開辟普遍的運用法式。開辟者可使用工業尺度(如XML,CSS和SVC)和他們所熟習的形式和典范來創立運用。Flex的分別協作方法和Macromedia公用組件模子也使得開辟者和界面設計者能更好的停止協作,在靠得住的、易於保護的架構上臨盆出在用戶體驗方面有沖破性的產物。
關於作者:
從 1994-2000 年,Christophe Coenraets 辦事於 Powersoft 公司,該公司如今已被Sybase並購。他用Java任務始於1996年,並成為公司Java and Internet Application 部分的技巧專員。Christophe後來參加Macromedia公司成為公司J2EE運用辦事器JRun的技巧專員。Christophe在這一職位上開端研討龐雜Internet運用,著手將Flash前端與J2EE後端停止集成,Christophe 今朝是 Macromedia 的 new developer-centric Rich Internet Applications initiative的高等專員。曩昔的十年間,Christophe常常在全球規模的研究會中談話。