2015年6月30日 星期二

簡易Hibernate入門(NetBeans+Servlet+MySQL)

Hibernate是一個基於資料庫物件化的一個框架(framework),它將資料庫裡的表格(Table)中的每一行紀錄實做成一個Java Bean型式的類別,而其中的屬性對應到了紀錄中的每欄位(Column),且擁有各自的Getter與Setter方法。

利用Hibernate我們可以以物件化的方式操控Database及以物件的方式得到查詢結果。在這裡我們要實作一個簡單的使用了Hibernate的Servlet,利用NetBeans的功能,可以使我們容易地實作Hibernate的許多細節。

一、在這邊我們使用MySQL作為我們的資料庫。首先先在MySQL中建立一個名為guest_database的資料庫,其中建立一個名為guest_list的Table,有三個欄位,分別是id、name、age、birth_date,tyep分別是varchar、varchar、int、date。我們先加入幾條紀錄,如下圖所示:

2015年6月28日 星期日

Android-使用單例模式(Singleton Pattern)關閉所有開啟過的Activity

在開發Android的App時,常會發生進入後台的Activity沒有正確的被關閉,還停留在後台繼續耗用系統的資源及消耗電量,或是按Back鍵時後台的Activity又回到前台畫面中,無法順利地離開App。
經過一翻搜尋方法後,找到了這篇文:
Android之完美退出方法(2.1-2.2-2.3SDK版本測試通過)

其中提到了一個個覺得蠻不錯的方法,特在此紀錄下來。主要是利用單例模式(Singleton Pattern)的方式,利用一個生命週期與App週期一樣長的唯一類別來管理所有開啟過的Activity,在要離開App時利用此單例的類別將所有開啟過的類別全部關掉,再把自己關掉,確保所有的Activity都關掉。

此例中有三個Activity,分別為MainActivity、Activity2、Activity3,三個Activity的Layout如下,在畫面正中央都有一個TextView顯示現在的頁面,而右下角都有一個Button可跳轉到下一個Activity,而在MainActivity按下Back鍵後,會關掉曾開啟的Activity並將整個App關掉。

此例中建立了一個單例類別,名為ActivityManager,在整個App的生命週期這個類別只會存在一個,裡面有一個LinkedList<Activity>用來存放所有開啟過的Activity,在每個Activity的onCreate()方法裡取得ActivityManager的物件實體並呼叫addActivity()方法來將Activity交由ActivityManager管理。最後在MainActivity的onBackPressed()中取得ActivityManager的物件實體並呼叫closeAllActivity()方法關掉所有曾開啟的Activity並結束App應用程式。

以下為程式碼,相關說明都已寫在註解中;

2015年6月27日 星期六

Ajax、JQuery與Servlet的簡單範例

在這邊要紀錄的是一個簡單的Ajax、JQuery、Servlet聯合應用的簡單範例。
此例client端利用JQuery的Ajax語法來將表單中的參數傳給以Servlet實作的Server端,經由Server端處理過後,以JSON的格式回傳給client端, client端再將JSON格式的回傳值解析後做相應的動作,此例的動作為兩個:跳出視窗顯示回傳值、在html裡的filedset中顯示回傳值。

  1. 首先是作為client端的html內容,index.html:
  2. <!DOCTYPE html>
    
    <html>
    
        <head>
    
            <title>AjaxTest</title>
    
            <meta charset="UTF-8">
    
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
            <!-- 加載Ajax -->
    
            <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
    
            <!-- Ajax的測試Script -->
    
             <script>
    
                 //在網頁加載後,對id=doAjaxBtn的Button設定click的function
    
                $(document).ready(function(){
    
                   $("#doAjaxBtn").click(function(){
    
                       $.ajax({
    
                            type:"POST",                    //指定http參數傳輸格式為POST
    
                            url: "doAjaxServlet.do",        //請求目標的url,可在url內加上GET參數,如 www.xxxx.com?xx=yy&xxx=yyy
    
                            data: $("#formId").serialize(), //要傳給目標的data為id=formId的Form其序列化(serialize)為的值,之
    
                                                            //內含有name的物件value
    
                            dataType: "json",               //目標url處理完後回傳的值之type,此列為一個JSON Object
    
                            //Ajax成功後執行的function,response為回傳的值
    
                            //此範列回傳的JSON Object的內容格式如右所示: {userName:XXX,uswerInterest:[y1,y2,y3,...]}
    
                            success : function(response){
    
                                //在id=ajaxResponse的fieldset中顯示Ajax的回傳值
    
                                $("#ajaxResponse").html("您的大名:"+response.userName+"</br>");
    
                                $("#ajaxResponse").append("您的興趣:</br>");
    
                                var userInterestString = "";
    
                                for(var i = 0 ; i<response.userInterest.length ; i++){
    
                                    $("#ajaxResponse").append(response.userInterest[i]+"</br>");
    
                                    userInterestString += "\n"+response.userInterest[i];
    
                                }
    
                                //用彈出視窗顯示Ajax的回傳值
    
                                alert("UserName:"+response.userName+"\nInterest: "+userInterestString);
    
                            },
    
                            //Ajax失敗後要執行的function,此例為印出錯誤訊息
    
                            error:function(xhr, ajaxOptions, thrownError){
    
                                alert(xhr.status+"\n"+thrownError);
                            }
    
                        });
    
                   });
    
                });  
    
            </script>
    
        </head>
    
        <body>
    
            <div>AjaxTest</div>
    
            <form id="formId">
    
                大名:<input type="text" name="userName">
    
                <input type="checkbox" name="userInterest" value="看書" />看書
    
                <input type="checkbox" name="userInterest" value="遊戲" />遊戲
    
                <input type="checkbox" name="userInterest" value="電影" />電影
    
                <input type="button" id="doAjaxBtn" value="啟動Ajax" />           
    
            </form>
    
            <div id="anotherSection">
    
                <!-- 用來顯示Ajax回傳值的fieldset -->
    
             <fieldset>
    
                 <legend>Response from jQuery Ajax Request</legend>
    
                 <div id="ajaxResponse"></div>
    
             </fieldset>
    
            </div> 
    
        </body>  
    
    </html>
  3. 再來是Server端的Servlet,doAjaxServlet.java:

Struts簡單入門 - 簡易身份認證(使用NetBeans)

Struts是一個基於MVC(Model-View-Control)架構的Java Web框架,今天要以一個簡單的身份認證例子來初步地了解Struts的MVC概念精神。

下圖為一個Struts的簡單原理流程圖,其中在web.xml中會設定什麼樣的url要交由ActionServlet來轉發給處理邏輯(例如 *.do),JSP File相當於View的可視化介面,當JSP File要把表單(Form)中的參數傳給商業邏輯處理時,ActionServlet會去struts-config.xml中尋找對應Form裡指定目標url的Action(相當於Control)和相應要物件實例化Form的Bean類別,ActionForm(相當於Model)。之後在Action中處理商業邏輯,並指定一個轉送目標url,這時就會轉送到struts-config.xml中對應轉送標的JSP或Action等。

我們的範例專案檔案配置如下:

  1. login.jsp                  : 身份認證的輸入畫面。
  2. loginSuccess.jsp     : 認證成功的畫面。
  3. struts-config.xml    : Struts的配置設定。
  4. LoginCheckAction : 處理身份認證商業邏輯的Action。
  5. LoginFormBean     : 用來實例物件Form的Bean類別。



以下為程式碼,相關的解釋都在註解裡:

2015年6月16日 星期二

找回忘記的Android KeyStore的Key Alias

最近在開發完Android APP準備上架,要用到keystore來產生signed APK時,發現自己竟然忘記了keystore的Key Alias,密碼倒是還記得,所以Google了一下找回Key Alias的方法,找到了這篇「Corona SDK - [ android keystore lost alias ]」,並成功地找回了Key Alias,特在此紀錄一下方法:

在Windows的命令列視窗中,鍵入以下指令:

keytool -list -v -keystore KeyStore檔的存放 -storepass KeyStore的密碼

輸入完後,就會顯出你的KeyStore資訊,其中的「別名名稱」就是你的Key Alias,如下圖。


2015年6月15日 星期一

有趣的中文

收集或自己想到的,本國人不易察覺,但可能會造成外國人困擾的有趣
中文例子。(不定時更新中) :
  1. 有點矛盾的語法:
    1. 「太陽曬著屁股」和"屁股曬著太陽"是同一個意思
    2. 「大敗」和「大勝」是一個意思
    3. 「我吃了飯以後要出去」的「了」和「我餓了」的「了」一個表示「過去」(吃過飯),一個表示「現在」我餓了
    4. 「這個東西我是在美國買的」和「這個東西是我在美國買的」
    5. 「好不暢快」vs 「好暢快」


  2. 看似相似但意思不同的字詞或句子:
    1. 「有多好」vs 「有好多」
    2. 我"「不過」問"你這些事情,有需要這麼緊張嗎? vs 我"不「過問」"你這些事情,有需要這麼緊張嗎?
    3. 不是不用擔心嗎 vs 不是不用擔心吧


  3. 音完全相同但意思迴異的字詞:
    1. 器用 v.s. 棄用
    2. 戰力 v.s. 站立 v.s. 顫慄  Ex: 屈服於敵方的實力,他的部份「戰力」只能「顫慄」著「站立」。
    3. 王者 v.s. 亡者
    4. 工程 v.s. 功成 v.s. 攻城
    5. 明燈 v.s. 冥燈
    6. 食用 v,s, 實用
    7. 進言 v.s. 禁言  Ex:這位昏庸的皇帝「禁言」了大部份下屬的「進言」
    8. 電源 v.s, 店員 Ex:販責「電源」的「店員」
    9. 公式 v.s. 工事 v.s. 公事
    10. 書展 v.s. 舒展
    11. 九點了沒 v.s. 酒點了沒
    12. 飽食 v.s. 寶石
    13. 身世 v.s. 紳士
    14. 二號 v.s. 噩耗
    15. 目的 v.s. 墓地
    16. 忘記 v.s. 旺季
    17. 首位 v.s. 守衛
    18. 插插頭 v.s. 擦擦頭
    19. 沉默 v.s. 沉沒
    20. 捕獲 v.s. 補貨
    21. 發寒 v.s. 發函
    22. 宮殿 v.s. 供電
    23. 和尚 v.s. 闔上
    24. 筆試 v.s. 鄙視 v.s. 比試
    25. 由於 v.s. 魷魚
    26. 廚師 v.s. 除濕
    27. 西邊 v.s. 溪邊
    28. 鞋店 v.s. 鞋墊
    29. 煎餃 v.s. 奸角
    30. 注視 v.s. 註釋 v.s. 注釋
    31. 韓式 v.s. 函式
    32. 西式 v.s. 稀釋
    33. 歸宿 v.s. 龜速
    34. 將棋 v.s. 降旗
    35. 一同 v.s 亦同 v.s 異同
    36. 不足 v.s. 部族
    37. 備份 v.s. 輩分
    38. 附件 v.s. 復健
    39. 何時 v.s. 和食
    40. 丞相 v.s. 成像
    41. 榆樹 v.s. 餘數
    42. 鑑識 v.s.見識 v.s. 劍士
    43. 英靈 v.s.嬰靈
    44. 按鍵 v.s. 案件 v.s. 暗箭
    45. 範例 v.s. 飯粒
    46. 視力 v.s. 勢力 v.s. 市立 v.s. 事例 v.s. 勢利
    47. 數目 v.s. 樹木
    48. 克服 v.s. 客服
    49. 賦予 v s. 腹語
    50. 古物 v.s. 穀物
    51. 證件 v.s. 政見 v.s. 證見
    52. 淘氣 v.s. 陶器
    53. 就是 v.s. 救世 v.s. 舊識
    54. 印尼 v.s. 印泥
    55. 立法 v.s. 曆法
    56. 緝凶 v.s. 氣胸
    57. 行事 v.s. 形式 v.s. 刑事
    58. 開火 v.s. 開伙
    59. 富商 v.s. 負傷
    60. 經驗 v.s. 驚艷
    61. 回覆 v.s. 回復
    62. 原著 v.s. 援助
    63. 落實 v.s. 落石
    64. 出價 v.s. 出嫁
    65. 考績 v.s. 烤雞
    66. 程式 v.s. 城市
    67. 上船 v.s. 上傳
    68. 抑制 v.s. 意志 v.s. 益智
    69. 詩意 v.s. 失意 v.s. 失憶
    70. 混沌 v.s. 餛飩
    71. 豎笛 v.s. 樹敵
    72. 手勢 v.s. 首飾
    73. 海報 v.s. 海豹
    74. 堤防 v.s. 提防
    75. 學員 v.s. 學園
    76. 去世 v.s. 趣事
    77. 打結 v.s. 打劫
  4. 字完全一樣,但發音不同而有不同意思
    1. 更(ㄍㄥˋ)新  v.s. 更(ㄍㄥ)新
    2. 好吃(ㄏㄠˇ) v.s. 好(ㄏㄠˋ)吃
    3. 重聽(ㄓㄨㄥˋ ) v.s. 重(ㄔㄨㄥˊ )聽
  5. 一字、詞或句多義:
    1. 「他走一天了」 , 「走」可指 「行走」或 「離開」。
    2. 「要買要快點買,這家店要關門了」,「關門」可指「休息,之後再開店」或「以後都不營業了」。



2015年6月9日 星期二

Android Studio更改專案套件(package)名稱的方法

當Android開發者要把自己寫的APK上架到Google Play Store時(記得先產生Signed APK,在Android Studio裡為Build-->Generate Signed APK),有時會碰到Google因package name為「com.example」的前綴而不接受。

這是因為「com.example」的package name是Android Studio一開始就給的預設專案套件名稱,必須要修改成自己設定的,Google才會接受上架此APK。這裡介紹在使用Android Studio開發時,如何更改專案的套件名稱。

在Android Studio中,如果對著專案套件按右鍵選擇Refactor-->Rename的話,是沒有辦法更改其前綴名稱的,也就是「com.example」。

經過上網搜尋找到了方法,在此介紹,可以參考這篇Android Studio Rename Package


  1. 在選示專案的數狀結構圖的右上角,有一個Gears icon的符號,如下圖,按下它之後,將其中的「Compact Empty Middle Packages」的勾勾給勾選掉,這時所有的套件階層就不會用一行來表示,而是用一個樹狀階層的方式顯示,這樣就可以自行訂義套件各層的名字和位置了。



  2. 只有這樣是不夠的,我們會發現如果這時想要把產生的Signed APK上架的話,Google還是不會讓你過的,對它來說套件還是沒有真正改成功。必須再到Gradle Scripts下的build.gradle(Module:app)裡面,把defaultConfig裡的applicationId也一併修改成新的專案套件名稱,最後對build.gradle(Module:app)按右鍵選擇Synchronize 'build.gradle'才算真正修改成功,這樣產生的Signed APK的專案套件名稱才有真正的被改到,Google Play Store才會接受。