Web ADF的開發中com.esri.adf.web.data.WebContext是一個核心的類,這個類綁定了許多其他的組件,這些組件分為兩類:attributes和resources。WebContext為這些組件提供生命週期管理的服務,這些服務當然不是免費使用的啦,組件必須實現一些特定的介面並註冊到WebContext,相關的介面有: com.esri.adf.web.data.WebContextInitialize
+--public void init(WebContext context)
+--public void destroy()
com.esri.adf.web.data.WebLifecycle
+--public void activate()
+--public void passivate()
com.esri.adf.web.data.WebContextObserver
+--public void update(WebContext context, java.lang.Object arg)
這裡只討論attributes這類組件,例如WebMap,WebTOC,WebOverview等。為什麼我們放大地圖的時候,Overview的矩形框也跟著變化呢?就是因為WebMap和WebOverview都在WebContext的領地上,而WebOverview實現了WebContextObserver介面;呵呵,這就相當於它給WebContext交了服務費,每次WebContext狀態發生變化的時候,都會給WebOverview傳遞訊息,好讓它作出同步的調整。
對於WebContext中註冊的attribute,當session的第一個請求開始的時候,執行init()操作,然後是passivate();對於這個session中接下來的請求,總是從activate()開始,passivate()結束;當session中止的時候,執行destroy()操作。這就是attribute的生命週期,當然,上述三個介面並不是強制要求全部都要實現。
好了,現在我們來看看如何自訂一個attribute,文檔中有一個相關的例子,但不夠詳細。這裡還是用例子的思路:底圖用的是亞洲的各個國家,目的就是根據當前地圖顯示的國家在地圖的左上方顯示與該國相關的logo,當地圖停留在中國的時候,左上方顯示一個吐火龍,停留在日本的時候,顯示一個持斧的戰士,等等。
首先,定義一個類實現上述的三個介面,在init方法中()將這個類註冊為WebContext的監聽器,用來監聽WebMap的Extent的變化:public class PicSelector
implements WebContextObserver,WebLifecycle,WebContextInitialize{
public void init(WebContext ctx){
ctx.addObserver(this);
}
public void destroy(){
System.out.println("PicSelector destroyed.");
}
對於每個請求,都會執行activate()和passivate()方法,因此,這兩個方法適合用來執行一些資源擷取和釋放的操作,比如這個例子中用IO介面來讀取圖片檔案:
public void activate(){
String pic_1 = "E:/images/吐火龍.png";
String pic_2 = "E://images/武士.png";
try{
input_1 = new BufferedInputStream(new FileInputStream(pic_1));
input_2 = new BufferedInputStream(new FileInputStream(pic_2));
}catch(IOException e){
e.printStackTrace();
}
}
public void passivate(){
try{
input_1.close();
input_2.close();
}catch(IOException e){
e.printStackTrace();
}
}
接下來,是根據地圖顯示內容動態地調取logo圖片顯示在地圖的左上方:
public void update(WebContext ctx, Object arg1){
WebExtent currentExtent = ctx.getWebMap().getCurrentExtent();
ctx.getWebGraphics().clearGraphics();
this.updatePic(currentExtent,ctx);
}
private void updatePic(WebExtent ext, WebContext ctx){
if(){ //從extent判斷是否主要區域為中國
WebPictureMarkerSymbol pic = new WebPictureMarkerSymbol();
try{
byte[] bPic_1 = new byte[input_1.available()];
input_1.read(bPic_1);
pic.setPicture(bPic_1);
}catch(IOException e){
System.out.println(e.getMessage());
return;
}
WebGraphics graphics = ctx.getWebGraphics();
GraphicElement element = new GraphicElement();
element.setSymbol(pic);
element.setGeometry(new WebPoint(extent.getMinX(),extent.getMaxY()));
graphics.addGraphics(element);
}
else if()//同理,下略
}
最後,是在faces-config.xml中註冊這個自訂attribute:
<managed-property>
<property-name>attributes</property-name>
<map-entries>
<map-entry>
<key>myAttr</key>
<value>#{myAttr}</value>
</map-entry>
</map-entries>
</managed-property>
<managed-bean>
<managed-bean-name>myAttr</managed-bean-name>
<managed-bean-class>com.wj.test.data.PicSelector</managed-bean-class>
<managed-bean-scope>none</managed-bean-scope>
</managed-bean>
bContext都會調用update()方法,如果滿足要求,“吐火龍”就出來了,看-->
CTRL+滑鼠滾輪放大或縮小" src="http://bbs.esrichina-bj.cn/esri/attachments/forumid_25/zcK78MH6_P2kIgZATcxy6.jpg" width="716" border="0" resized="true">2007-1-29 16:30
武士.JPG (59.59 KB)
CTRL+滑鼠滾輪放大或縮小" src="http://bbs.esrichina-bj.cn/esri/attachments/forumid_25/zuTKvw==_snxmqcv4LVdG.jpg" width="716" border="0" resized="true">