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月30日 星期二
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應用程式。
以下為程式碼,相關說明都已寫在註解中;
經過一翻搜尋方法後,找到了這篇文:
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中顯示回傳值。
此例client端利用JQuery的Ajax語法來將表單中的參數傳給以Servlet實作的Server端,經由Server端處理過後,以JSON的格式回傳給client端, client端再將JSON格式的回傳值解析後做相應的動作,此例的動作為兩個:跳出視窗顯示回傳值、在html裡的filedset中顯示回傳值。
- 首先是作為client端的html內容,index.html:
- 再來是Server端的Servlet,doAjaxServlet.java:
<!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>
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等。
我們的範例專案檔案配置如下:
以下為程式碼,相關的解釋都在註解裡:
下圖為一個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等。
我們的範例專案檔案配置如下:
- login.jsp : 身份認證的輸入畫面。
- loginSuccess.jsp : 認證成功的畫面。
- struts-config.xml : Struts的配置設定。
- LoginCheckAction : 處理身份認證商業邏輯的Action。
- 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,如下圖。
在Windows的命令列視窗中,鍵入以下指令:
keytool -list -v -keystore KeyStore檔的存放 -storepass KeyStore的密碼
輸入完後,就會顯出你的KeyStore資訊,其中的「別名名稱」就是你的Key Alias,如下圖。
2015年6月15日 星期一
有趣的中文
收集或自己想到的,本國人不易察覺,但可能會造成外國人困擾的有趣
中文例子。(不定時更新中) :
中文例子。(不定時更新中) :
- 有點矛盾的語法:
- 「太陽曬著屁股」和"屁股曬著太陽"是同一個意思
- 「大敗」和「大勝」是一個意思
- 「我吃了飯以後要出去」的「了」和「我餓了」的「了」一個表示「過去」(吃過飯),一個表示「現在」我餓了
- 「這個東西我是在美國買的」和「這個東西是我在美國買的」
- 「好不暢快」vs 「好暢快」
-
看似相似但意思不同的字詞或句子:
- 「有多好」vs 「有好多」
- 我"「不過」問"你這些事情,有需要這麼緊張嗎? vs 我"不「過問」"你這些事情,有需要這麼緊張嗎?
- 不是不用擔心嗎 vs 不是不用擔心吧
- 音完全相同但意思迴異的字詞:
- 器用 v.s. 棄用
- 戰力 v.s. 站立 v.s. 顫慄 Ex: 屈服於敵方的實力,他的部份「戰力」只能「顫慄」著「站立」。
- 王者 v.s. 亡者
- 工程 v.s. 功成 v.s. 攻城
- 明燈 v.s. 冥燈
- 食用 v,s, 實用
- 進言 v.s. 禁言 Ex:這位昏庸的皇帝「禁言」了大部份下屬的「進言」
- 電源 v.s, 店員 Ex:販責「電源」的「店員」
- 公式 v.s. 工事 v.s. 公事
- 書展 v.s. 舒展
- 九點了沒 v.s. 酒點了沒
- 飽食 v.s. 寶石
- 身世 v.s. 紳士
- 二號 v.s. 噩耗
- 目的 v.s. 墓地
- 忘記 v.s. 旺季
- 首位 v.s. 守衛
- 插插頭 v.s. 擦擦頭
- 沉默 v.s. 沉沒
- 捕獲 v.s. 補貨
- 發寒 v.s. 發函
- 宮殿 v.s. 供電
- 和尚 v.s. 闔上
- 筆試 v.s. 鄙視 v.s. 比試
- 由於 v.s. 魷魚
- 廚師 v.s. 除濕
- 西邊 v.s. 溪邊
- 鞋店 v.s. 鞋墊
- 煎餃 v.s. 奸角
- 注視 v.s. 註釋 v.s. 注釋
- 韓式 v.s. 函式
- 西式 v.s. 稀釋
- 歸宿 v.s. 龜速
- 將棋 v.s. 降旗
- 一同 v.s 亦同 v.s 異同
- 不足 v.s. 部族
- 備份 v.s. 輩分
- 附件 v.s. 復健
- 何時 v.s. 和食
- 丞相 v.s. 成像
- 榆樹 v.s. 餘數
- 鑑識 v.s.見識 v.s. 劍士
- 英靈 v.s.嬰靈
- 按鍵 v.s. 案件 v.s. 暗箭
- 範例 v.s. 飯粒
- 視力 v.s. 勢力 v.s. 市立 v.s. 事例 v.s. 勢利
- 數目 v.s. 樹木
- 克服 v.s. 客服
- 賦予 v s. 腹語
- 古物 v.s. 穀物
- 證件 v.s. 政見 v.s. 證見
- 淘氣 v.s. 陶器
- 就是 v.s. 救世 v.s. 舊識
- 印尼 v.s. 印泥
- 立法 v.s. 曆法
- 緝凶 v.s. 氣胸
- 行事 v.s. 形式 v.s. 刑事
- 開火 v.s. 開伙
- 富商 v.s. 負傷
- 經驗 v.s. 驚艷
- 回覆 v.s. 回復
- 原著 v.s. 援助
- 落實 v.s. 落石
- 出價 v.s. 出嫁
- 考績 v.s. 烤雞
- 程式 v.s. 城市
- 上船 v.s. 上傳
- 抑制 v.s. 意志 v.s. 益智
- 詩意 v.s. 失意 v.s. 失憶
- 混沌 v.s. 餛飩
- 豎笛 v.s. 樹敵
- 手勢 v.s. 首飾
- 海報 v.s. 海豹
- 堤防 v.s. 提防
- 學員 v.s. 學園
- 去世 v.s. 趣事
- 打結 v.s. 打劫
- 字完全一樣,但發音不同而有不同意思
- 更(ㄍㄥˋ)新 v.s. 更(ㄍㄥ)新
- 好吃(ㄏㄠˇ) v.s. 好(ㄏㄠˋ)吃
- 重聽(ㄓㄨㄥˋ ) v.s. 重(ㄔㄨㄥˊ )聽
- 一字、詞或句多義:
- 「他走一天了」 , 「走」可指 「行走」或 「離開」。
- 「要買要快點買,這家店要關門了」,「關門」可指「休息,之後再開店」或「以後都不營業了」。
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:
這是因為「com.example」的package name是Android Studio一開始就給的預設專案套件名稱,必須要修改成自己設定的,Google才會接受上架此APK。這裡介紹在使用Android Studio開發時,如何更改專案的套件名稱。
在Android Studio中,如果對著專案套件按右鍵選擇Refactor-->Rename的話,是沒有辦法更改其前綴名稱的,也就是「com.example」。
經過上網搜尋找到了方法,在此介紹,可以參考這篇Android Studio Rename Package:
- 在選示專案的數狀結構圖的右上角,有一個的符號,如下圖,按下它之後,將其中的「Compact Empty Middle Packages」的勾勾給勾選掉,這時所有的套件階層就不會用一行來表示,而是用一個樹狀階層的方式顯示,這樣就可以自行訂義套件各層的名字和位置了。
- 只有這樣是不夠的,我們會發現如果這時想要把產生的Signed APK上架的話,Google還是不會讓你過的,對它來說套件還是沒有真正改成功。必須再到Gradle Scripts下的build.gradle(Module:app)裡面,把defaultConfig裡的applicationId也一併修改成新的專案套件名稱,最後對build.gradle(Module:app)按右鍵選擇Synchronize 'build.gradle'才算真正修改成功,這樣產生的Signed APK的專案套件名稱才有真正的被改到,Google Play Store才會接受。
訂閱:
文章
(
Atom
)