JSP 兩種include 的差別

06 November 2010

在JSP中,

include有分兩種

<%@include file="/footer.jsp" %><!-- 第一種 -->


<jsp:include page="/footer.jsp"></jsp:include><!-- 第二種 -->





第一種稱為指令元素

第二種稱為動作元素

差別在於

第一種的include會在編譯時期(轉換成servlet)就將file include進來,

而第二種在編譯時期並不會被編譯,是在client request時,才會動態的去載入在去編譯。


且第一種最後只會有一個.class檔案,

因為他會在被轉換成servlet之前就把include的file融合至原本的內容中

最後才轉換成servlet,故只有一個.class檔案

而第二種就會有兩種。


總結

第一種是在編譯時期就去include

第二種是在run time時期去include(這個效能似乎較差一點點,但較靈活)













read more »


非常不專業之iMAC開箱文

04 November 2010


恩,因緣際會下,

有人送我一台iMac,

當然不是平白無故的,

天底下沒有白吃的午餐!!

條件是要我part-time,寫iPhone app..

其實對我來說,沒有甚麼損失,多碰點東西!

之前一直局限於設備,雖然說可以用vmware來灌os x,

但一直沒動力,不過竟然有人要提供給我mac了,

我就順便接下來阿~~~~~

從一開始的mac book pro→mac mini→iMac

最後是拿到iMac

不過並不是全新的啦!

不過至少規格也不差!!!

至少比我目前的桌機好!


今天用了一下的心得就是

apple的滑鼠(magic mouse)真的很好用!!!!!

鍵盤也好打!!!!!!!

大螢幕也真的很爽(可惜不是27吋)

btw, 我今天一直找不到開機扭在哪裡(我好俗喔!!!)


底下是圖片~~~


magic mouse,好用!


漂亮的螢幕








read more »


android detect screen on and screen off

01 November 2010

android detect screen on and screen off

android偵測螢幕的關閉與開啟,

和偵測sd card一樣,

Intent.ACTION_SCREEN_OFF和Intent.ACTION_SCREEN_ON是不能在AndroidManifest.xml裡面宣告的

如:

<receiver android:name="receiverScreen"> 
<intent-filter>
<action android:name="android.intent.action.SCREEN_ON" />
<action android:name="android.intent.action.SCREEN_OFF" />
</intent-filter>
</receiver>


這樣子的宣告沒有用,你永遠都receive不到任何action

詳細原因我也不知道,但是可以透過registerReceiver去實作,

這裡舉個例子,先啟動一個service,由這個service去registerReceiver

由service啟動的好處是,service可以常駐,

如果你用acitivity去registerReceiver

這個acitivity關閉以後,你一樣receive不到任何action

且如果你只是想偵測acitivity的關閉與否的話,可以直接利用onResume和onPause去偵測即可

不用特地去registerReceiver


但是如果今天你有一個widget在桌面,

且我們是無法透過widget去registerReceiver,

會出現exception(ReceiverCallNotAllowedException)

所以一定得透過service去啟動。

service的code如下:

public class serviceScreen extends Service {

@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}

@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
try {
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);

filter.addAction(Intent.ACTION_SCREEN_OFF);

BroadcastReceiver mReceiver = new receiverScreen();

registerReceiver(mReceiver, filter);
} catch (Exception e) {
Log.d("main",e.toString());
}
}

}




receiver的code如下:

public class receiverScreen extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)){
//收到螢幕開啟的通知
}else{
//收到螢幕關閉的通知
}

}

}





接著就是在widget中去startService

如下:

public class widgetSmall extends AppWidgetProvider {


@SuppressWarnings("static-access")
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);

//啟動一個service
context.startService(new Intent(context, serviceScreen.class));


}


@SuppressWarnings("static-access")
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);


//當這個widget被刪除時,就stopService
context.stopService(new Intent(context, serviceScreen.class) );

android.os.Process.killProcess(android.os.Process.myPid());


}


}









read more »