2011年5月26日

PopupWindow 動畫用法


1.          首先必須要定義動畫的Style,在這裡就先用android裡面定義的吧
2.          調用popupwindowsetAnimationStyle()方法
3.          在顯示前記得調用update()方法


完成!!!

看看程式碼吧 !

menuWindow = new PopupWindow(gridView,LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
menuWindow.setAnimationStyle(android.R.style.Animation_Dialog);
// 顯示的觸發
menuWindow.update();
menuWindow.showAsDropDown(mControlsLayout, 0, 0);

效果圖 :


2011年5月23日

JSP request session application 分析



JSP request session application 分析

Request, Session, Application

JSP網頁中我們有三個常用的對象
而這三個對象分別對應到了Serverlet中的三個類別,分別是ServerletRequestHttpSessionServerletContext
request
javax.servlet
Interface ServletRequest
All Known Subinterfaces:
All Known Implementing Classes:


public interface ServletRequest
Defines an object to provide client request information to a servlet. The servlet container creates a ServletRequest object and passes it as an argument to the servlet's service method.
A ServletRequest object provides data including parameter name and values, attributes, and an input stream. Interfaces that extend ServletRequest can provide additional protocol-specific data (for example, HTTP data is provided by HttpServletRequest.
session
javax.servlet.http
Interface HttpSession


public interface HttpSession
Provides a way to identify a user across more than one page request or visit to a Web site and to store information about that user.
The servlet container uses this interface to create a session between an HTTP client and an HTTP server. The session persists for a specified time period, across more than one connection or page request from the user. A session usually corresponds to one user, who may visit a site many times. The server can maintain a session in many ways such as using cookies or rewriting URLs.
application
javax.servlet
Interface ServletContext


public interface ServletContext
Defines a set of methods that a servlet uses to communicate with its servlet container, for example, to get the MIME type of a file, dispatch requests, or write to a log file.
There is one context per "web application" per Java Virtual Machine. (A "web application" is a collection of servlets and content installed under a specific subset of the server's URL namespace such as /catalog and possibly installed via a .war file.)
In the case of a web application marked "distributed" in its deployment descriptor, there will be one context instance for each virtual machine. In this situation, the context cannot be used as a location to share global information (because the information won't be truly global). Use an external resource like a database instead.
The ServletContext object is contained within the ServletConfig object, which the Web server provides the servlet when the servlet is initialized.

然而這三個對象使用的時機是不同的,我們可以透過API文件中發現他們皆有get Attribute()方法以及對應的set方法可以使用,以下來說明他們之間的差異點。
Request(範圍:獨立的request對象中)
請求對象被製造出來是客戶端透過超連結或是表單傳送需求時被產生的,因此每一筆新的Request伺服器都會產生一個新的request對象,所以假設A請求123,接下來B請求321時,request對象將會重新被產生,因此只會剩下最後的請求321,如何將他們都留下來呢,方法就是使用request對象中的setAttribute()方法,該方法可以將客戶請求存入並且轉發到下個頁面,下個頁面可以由getAttribute來取得該值進而達到頁面的轉發(forward)。
Seesion(範圍:瀏覽器)
會議對象使用時機通常是使用在一些需要登入的網頁上,可以透過session的存活判斷用戶是否登入等等資訊,這些資訊會一直存活在瀏覽器上。
Application(範圍:伺服器上):
應用對象的使用時機可以透過一個例子來實現,有時候我們想要寫一個網頁計數器,透過requestsession是無法達成的,首先request在每次請求時他都會被重新產生,session則是關閉瀏覽器時就會被銷毀,這樣皆不能達成該功能,此時我們可以透過application對象,這個對象所存下的訊息是存在伺服器端的,因此不管我們是在A電腦瀏覽還是B電腦瀏覽,該值都是一樣的,因此通常application是使用在取值而不是改值的應用上。



Html Hiden 使用時機

我們有時候在提交表格時,需要將資料遞交到下個畫面,但有時候這個資料是下一個頁面不想顯示出來的,我們可以將它放置在hidden中。

使用方法 :
<form action="XXX.jsp">
    <input type="hidden" value="123">
    <input type="submit" value="提交">
</form>

因為下一個頁面還需求這個值,所以要繼續將他放置表單傳送至下個頁面....

2011年5月17日

Daemon 執行緒


一個Daemon執行緒是一個在背景執行服務的執行緒,例如網路伺服器傾聽連接埠的服務、隱藏的系統執行緒如垃圾收集執行緒或其它JVM 建立的執行緒,如果所有的非Daemon的執行緒都結束了,則Daemon執行緒自動就會終止。 其設定方法為使用方法setDaemon(true);

public class DaemonTestMain {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new Runnable(){
            @Override
            public void run() {
                while(true) {
                    System.out.println("I'm daemon thread!!");
                }
            }
        });
       
        // 可以把這行拿掉看差別
        thread.setDaemon(true);
        thread.start();
    }
}

我們可以觀察到,設定為Daemon的執行緒在main執行緒結束後它就停止了。

Http協議中get與post傳輸方式的區別(轉載)

 B/S應用程式中,前臺與後臺的數據交互,都是通過HTMLForm表單完成的。Form提供了兩種數據傳輸的方式——getpost。雖然它們都是數據的提交方式,但是在實際傳輸時確有很大的不同,並且可能會對數據產生嚴重的影響。雖然為了方便的得到變數值,Web容器已經遮罩了二者的一些差異,但是了解二者的差異在以後的編程也會很有幫助的。

Form
中的getpost方法,在數據傳輸過程中分別對應了HTTP協議中的GETPOST方法。二者主要區別如下:

1
Get是用來從伺服器上獲得數據,而Post是用來向伺服器上傳遞數據。

2
Get將表單中數據的按照variable=value的形式,添加到action所指向的URL後面,並且兩者使用“?”連接,而各個變數之間使用“&”連接;Post是將表單中的數據放在form的數據體中,按照變數和值相對應的方式,傳遞到action所指向URL



3Get是不安全的,因為在傳輸過程,數據被放在請求的URL中,而如今現有的很多伺服器、***或者用戶代理都會將請求URL記錄到日誌文件中,然後放在某個地方,這樣就可能會有一些隱私的資訊被第三方看到。另外,用戶也可以在瀏覽器上直接看到提交的數據,一些系統內部消息將會一同顯示在用戶面前。Post的所有操作對用戶來說都是不可見的。


4Get傳輸的數據量小,這主要是因為受URL長度限制;而Post可以傳輸大量的數據,所以在上傳文件只能使用Post(當然還有一個原因,將在後面的提到)。


5Get限制Form表單的數據集的值必須為ASCII字符;而Post支援整個ISO10646字符集。

6、GetForm的默認方法。

所以我們在傳送一些内容較少、不涉及安全性相關的内容時可以選擇get方式,否則則必須選用post方式了。倘若是向服務器傳送文件時,則必須採用post方式。



2011年5月7日

自定義Layout系列 - 伸縮Layout

最近需要一種可以隱藏、出現的Layout,發現Android沒有提供,因此就寫了一個...
效果圖如下 : 



程式碼部分待補齊

2011年5月6日

建構區塊(constructor block)

if you miss to precede the block with "static" keyword, the block is called "constructor block" and will be executed when the class is instantiated. The constructor block will be copied into each constructor of the class. Say for example you have four parameterized constructors, then four copies of contructor blocks will be placed inside the constructor, one for each.

 
public class ConstructorBlock {
    public static void main(String[] args) {
        class ConstructorBlockExample
        {
            {
                System.out.println("This is first constructor block");
            }
   
            public ConstructorBlockExample(){
                System.out.println("This is no parameter constructor");
            }
   
            public ConstructorBlockExample(String param1){
                System.out.println("This is single parameter constructor");
            }
   
            public ConstructorBlockExample(String param1, String param2){
                System.out.println("This is two parameters constructor");
            }
   
            {
                System.out.println("This is second constructor block");
            }
        }
       
        ConstructorBlockExample cb1 = new ConstructorBlockExample();
        ConstructorBlockExample cb2 = new ConstructorBlockExample("2");
        ConstructorBlockExample cb3 = new ConstructorBlockExample("","");
    }
   
}


結果 :


This is first constructor block
This is second constructor block
This is no parameter constructor
This is first constructor block
This is second constructor block
This is single parameter constructor
This is first constructor block
This is second constructor block
This is two parameters constructor

2011年5月5日

Java static final 重點整理


1.   多型:父類型的引用可以指向子類型的物件。
2.  Parent    new  Child();當使用多態方式調用方法時,首先檢查父類中是否有sing()方法,如果沒有則編譯錯誤;如果有,再去調用子類的 sing()方法。
3.  一共有兩種類型的強制類型轉換:
a)  向上類型轉換(upcast):比如說將 Cat 類型轉換為 Animal 類型,即將子類型轉換為父類型。對於向上類型轉換,不需要顯式指定。
b)  向下類型轉換(downcast):比如將 Animal 類型轉換為 Cat 類型。即將父類型轉換為子類型。對於向下類型轉換,必須要顯式指定(必須要使用強制類型
轉換)。
4.  抽象類別(abstract class):使用了 abstract 關鍵字所修飾的  類叫做抽象類別。抽象類無法產生實體,也就是說,不能 new 出來一個抽象類別的物件(實例)。
5.  抽象方法(abstract  method):使用 abstract 關鍵字所修飾的方法叫做抽象方法。抽象方法需要定義在抽象類別中。相對於抽象方法,之前所定義的方法叫做具體方法(有聲明,有實現)。
6.  如果一個類包含了抽象方法,那麼這個類一定是抽象類別。
7.  如果某個類是抽象類別,那麼該類可以包含具體方法(有聲明、有實現)。
8.  如果一個類中包含了抽象方法,那麼這個類一定要聲明成 abstract  class,也就是說,該類一定是抽象類別;反之,如果某個類是抽象類別,那麼該類既可以包含抽象方法,也可以包含具體方法。
9.  無論何種情況,只要一個類是抽象類別,那麼這個類就無法產生實體。
10.   在子類繼承父類(父類是個抽象類別)的情況下,那麼該子類必須要實現父類中所定義的所有抽象方法;否則,該子類需要聲明成一個 abstract class
11.   介面(interface):介面的地位等同於  class,介面中的所有方法都是抽象方法。在聲明介面中的方法時,可以使用 abstract  關鍵字,也可以不使用。通常情況下,都會省略掉 abstract 關鍵字。
12. 可以將介面看作是特殊的抽象類別(抽象類別中可以有具體方法,也可以有抽象方法,而介面中只能有抽象方法,不能有具體方法)。
13.   類可以實現介面。實現使用關鍵字 implements 表示,代表了某個類實現了某個介面。
14. 一個類實現了某個介面,那麼該類必須要實現介面中聲明的所有方法。如果
該類是個抽象類別,那麼就無需實現介面中的方法了。
15. Java  是單繼承的,也就是說某個類只能有唯一一個父類;一個類可以實現多個介面,多個介面之間使用逗號分隔。
16.   多態:所謂多態,就是父類型的引用可以指向子類型的物件,或者介面類別型的引用可以指向實現該介面的類的實例。關於介面與實現介面的類之間的強
制類型轉換方式與父類和子類之間的強制類型轉換方式完全一樣。
17.   static  關鍵字:可以用於修飾屬性,也可以用於修飾方法,還可以用於修飾類
18.   static  修飾屬性:無論一個類生成了多少個物件,所有這些物件共同使用唯一一份靜態的成員變數;一個物件對該靜態成員變數進行了修改,其他物件
的該靜態成員變數的值也會隨之發生變化。如果一個成員變數是 static  的,那麼我們可以通過類名.成員變數名的方式來使用它(推薦使用這種方式)。
19. static 修飾方法:static 修飾的方法叫做靜態方法。對於靜態方法來說,可以使用類名.方法名的方式來訪問。
20. 靜態方法只能繼承,不能重寫(Override)。
21. final 關鍵字:final 可以修飾屬性、方法、類。
22. final 修飾類:當一個類被 final 所修飾時,表示該類是一個終態類,即不能被繼承。
23. final 修飾方法:當一個方法被 final 所修飾時,表示該方法是一個終態方法,即不能被重寫(Override)。
24. final 修飾屬性:當一個屬性被 final 所修飾時,表示該屬性不能被改寫。
25.   final  修飾一個原生資料類型時,表示該原生資料類型的值不能發生變化(比如說不能從 10 變為 20);如果 final 修飾一個參考類型時,表示該引用類型不能再指向其他物件了,但該引用所指向的物件的內容是可以發生變化
的。
26. 對於 final 類型成員變數,一般來說有兩種賦初值方式:
a)  在聲明 final 類型的成員變數時就賦上初值
b)  在聲明 final 類型的成員變數時不賦初值,但在類的所有構造方法中都為其賦上初值。
27. static 代碼塊:靜態代碼塊。靜態代碼塊的作用也是完成一些初始化工作。首先執行靜態代碼塊,然後執行構造方法。靜態代碼塊在類被載入的時候執行,
而構造方法是在生成物件的時候執行;要想調用某個類來生成物件,首先需
要將類載入到 Java 虛擬機器上(JVM),然後由 JVM 載入這個類來生成物件。
28. 類的靜態代碼塊只會執行一次,是在類被載入的時候執行的,因為每個類只
會被載入一次,所以靜態代碼塊也只會被執行一次;而構造方法則不然,每
次生成一個物件的時候都會調用類的構造方法,所以 new 一次就會調用構造
方法一次。
29. 如果繼承體系中既有構造方法,又有靜態代碼塊,那麼首先執行最頂層的類
的靜態代碼塊,一直執行到最底層類的靜態代碼塊,然後再去執行最頂層類
的構造方法,一直執行到最底層類的構造方法。注意:靜態代碼塊只會執行
一次。
30. 不能在靜態方法中訪問非靜態成員變數;可以在靜態方法中訪問靜態的成員
變數。可以在非靜態方法中訪問靜態的成員變數。
31. 總結:靜態的只能訪問靜態的;非靜態的可以訪問一切。
32. 不能在靜態方法中使用 this 關鍵字。

(待整理)Android中的配接器模式 - Adapter

我在剛玩android 時候,對這個adapter很不理解,到底是什麼原理呢? 適配器,哎,只知道setAdapter()把參數傳進去,系統就顯示出來了。

今天,針對這個東西,我們做個系統詳細的分析.

listview
載入adapter過程是這樣的.

1 先判斷adapter 有多少資料項目,根據這個資料確定有多少item. 
2 確定每個item裡載入哪個View. 
3 把View裡載入要顯示的資料.

問提一個一個來解決. 第一個問題: 因為adapter都要關聯一個list .有來存儲資料.list的項數就是Item的數目. 我們在重載BaseAdapter 時候,都要實現這個函數

public int getCount() {                           
        return weatherList.size();   
    }   

哎,這個函數就是確定關聯條目的.

第二個問題 哪來的view 呢, 當然我們自己創建的.重載BaseAdapter時候你要實現getView()這個函數,就是這個view.

第三個問題,你自己創建的view.載入哪些資料你該知道的.呵呵.

張豪就喜歡看例子,這個小夥子技術,管理都很牛,得以他為榜樣. 得努力.

public class CustomAdapterActivity extends ListActivity   
{   
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState)   
    {   
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.main);   
        ArrayList<Weather> weatherList = new ArrayList<Weather>();   
        Weather w = new Weather( "London", 17, Weather.OVERCAST );   
        weatherList.add( w );   
        w = new Weather( "Paris", 22, Weather.OVERCAST );   
        weatherList.add( w );   
        w = new Weather( "Athens", 29, Weather.SUNNY );   
        weatherList.add( w );   
        w = new Weather( "Stockholm", 12, Weather.RAIN );   
        weatherList.add( w );   
        WeatherAdapter weatherAdapter = new WeatherAdapter(    
                this,   
                weatherList );    
        setListAdapter( weatherAdapter );   
    }   
}  

哎,這個大家都很清楚,關鍵問題是weatherAdapter 哪來的呢? 自己創建的啊,如果創建呢?

public class WeatherAdapter extends BaseAdapter {   
  
    private Context context;   
    private List<Weather> weatherList;  
 這就是adapter關聯的List,用來存儲資料.還記的ArrayList 要往裡傳參數嗎? 傳的也是這個類型啊.呵呵
  
    public WeatherAdapter(Context context, List<Weather> weatherList ) {    
        this.context = context;   
        this.weatherList = weatherList;   
    }   
  
    public int getCount() {                           
        return weatherList.size();   
    }   
  
    public Object getItem(int position) {        
        return weatherList.get(position);   
    }   
  
    public long getItemId(int position) {     
        return position;   
    }   
  
    public View getView(int position, View convertView, ViewGroup parent) {    
        Weather weather = weatherList.get(position);   
        
return new WeatherAdapterView(this.context, weather );   
    }   
  
}  

哎,這段告訴了我們,有多少個Item, 可以通過getCount()得到了。 可是View 哪來的呢?
當然是getView ()這個函數提供.

這個view 的獲取就多中多樣了,我們可以傳個LayoutID. 通過Inflater出來,也可以自己創建個,只要出來就行.

在這裡,我們自己創建個View. 這個View.是個VIewGroup.


class WeatherAdapterView extends LinearLayout {           
        public static final String LOG_TAG = "WeatherAdapterView";   
  
        public WeatherAdapterView(Context context,    
                                Weather weather ) {   
            super( context );   
  
            this.setOrientation(HORIZONTAL);           
            LinearLayout.LayoutParams cityParams =    
                new LinearLayout.LayoutParams(100, LayoutParams.WRAP_CONTENT);   
            cityParams.setMargins(1, 1, 1, 1);   
  
            TextView cityControl = new TextView( context );   
            cityControl.setText( weather.getCity() );   
            addView( cityControl, cityParams);          
  
            LinearLayout.LayoutParams temperatureParams =    
                new LinearLayout.LayoutParams(20, LayoutParams.WRAP_CONTENT);   
            temperatureParams.setMargins(1, 1, 1, 1);   
  
            TextView temperatureControl = new TextView(context);   
            temperatureControl.setText( Integer.toString( weather.temperature ) );   
            addView( temperatureControl, temperatureParams);               
  
            LinearLayout.LayoutParams skyParams =    
                new LinearLayout.LayoutParams(25, LayoutParams.WRAP_CONTENT);   
  
            ImageView skyControl = new ImageView( context );   
            Log.d( LOG_TAG, weather.getCity()+" -> "+weather.sky );   
            skyControl.setImageResource( weather.getSkyResource() );   
            addView( skyControl, skyParams );   
        }   
}   

ShareThis