project中常會有需要利用排程的工作,
這邊介紹spring和quartz的整合,
首先先利用mvaen建立,可參閱maven build project,
接下來是需要用到的dependencies,
2014年3月28日 星期五
2014年3月26日 星期三
SpringMVC 幾種返回形式(ModelAndView,@ModelAttribute,Model,@SessionAttribute)
在透過@RequestMapping,
將request導入到@Controller內的function後,
function運作完畢後有幾種返回的形式可以選擇:
1.ModelAndView
當返回為ModelAndView時,
其中已經包含了顯示(View)和模型(Model),
將request導入到@Controller內的function後,
function運作完畢後有幾種返回的形式可以選擇:
1.ModelAndView
當返回為ModelAndView時,
其中已經包含了顯示(View)和模型(Model),
2014年3月23日 星期日
Clean Code - Note
在程式中下註解是很常見的,
但在看完clean code後,
我開始思考註解的適當性及必要性,
有些書中提到的要點可以分享一下:
1.用code代替註解
書中有提到一個重要的觀念,
寧可重新改寫code,
第一個敘述看了註解之後,
或者你可以了解if中的判斷,
但採用第二種方式之後,
你便可以繼續往下閱讀並了解此段程式碼要做什麼事情。
2.不要留註解的程式碼
以前的code中很常看到這樣的方式,
有時候是為了測試,
有時候是流程或業務內容改變,
但也怕會忘記以前的寫法所以用註解的方式保存,
但現在都有版控的機制,
可以清楚記錄每次的改版,
所以,把註解的程式碼刪除,
避免久了造成不必要的誤會。
但在看完clean code後,
我開始思考註解的適當性及必要性,
有些書中提到的要點可以分享一下:
1.用code代替註解
書中有提到一個重要的觀念,
不要用註解拯救糟糕的code,
//to check the member's level is enough if(member.level <= office_premium && member.level > office_higher){ } if(member.hasEnoughLevel()){ }
第一個敘述看了註解之後,
或者你可以了解if中的判斷,
但採用第二種方式之後,
你便可以繼續往下閱讀並了解此段程式碼要做什麼事情。
2.不要留註解的程式碼
以前的code中很常看到這樣的方式,
有時候是為了測試,
有時候是流程或業務內容改變,
但也怕會忘記以前的寫法所以用註解的方式保存,
但現在都有版控的機制,
可以清楚記錄每次的改版,
所以,把註解的程式碼刪除,
避免久了造成不必要的誤會。
Clean Code - function
不論是維護或者是開發時,
常常會遇到幾十、幾百甚至是幾千行的function,
當然再一邊抱怨的同時,
也同時告誡自己不要創造出如此的怪物,
在clean code中有提到一些寫function的建議:
1.只做一件事
每一個function應該只有一個目標,
只要完成一個工作,
例如if、else、while,
也應該只包含一行呼叫function的敘述,
當把握這個原則後,
你的function內也不會有幾百幾千行的code。
2.使用具描述能力的名稱
如同命名原則一樣,
countOfItem()的function應該會比count()這樣的名稱容易理解,
在思考function名稱時,
以能讓別人一眼看到就知道其含意為原則。
3.不要傳遞旗標參數
不要讓你的function接收true/false這樣的參數,
除了代表你的function做了不只一件事外,
也會影響命名function的難度。
4.以物件傳遞代替一串參數
function接收的參數盡量越少越好,
如果需要傳遞一整串的參數(2、3個以上),
可以使用物件來封裝傳遞。
5.使用try/catch代替錯誤代碼
避免使用錯誤處理代碼如error_code_1,
利用try/catch/finally來代替error_code,
就能將錯誤處理代碼的敘述抽出來並簡化,
且try/catch/finally裡面也應該只處理一件事。
常常會遇到幾十、幾百甚至是幾千行的function,
當然再一邊抱怨的同時,
也同時告誡自己不要創造出如此的怪物,
在clean code中有提到一些寫function的建議:
1.只做一件事
每一個function應該只有一個目標,
只要完成一個工作,
例如if、else、while,
也應該只包含一行呼叫function的敘述,
當把握這個原則後,
你的function內也不會有幾百幾千行的code。
2.使用具描述能力的名稱
如同命名原則一樣,
countOfItem()的function應該會比count()這樣的名稱容易理解,
在思考function名稱時,
以能讓別人一眼看到就知道其含意為原則。
3.不要傳遞旗標參數
不要讓你的function接收true/false這樣的參數,
除了代表你的function做了不只一件事外,
也會影響命名function的難度。
4.以物件傳遞代替一串參數
function接收的參數盡量越少越好,
如果需要傳遞一整串的參數(2、3個以上),
可以使用物件來封裝傳遞。
5.使用try/catch代替錯誤代碼
避免使用錯誤處理代碼如error_code_1,
利用try/catch/finally來代替error_code,
就能將錯誤處理代碼的敘述抽出來並簡化,
且try/catch/finally裡面也應該只處理一件事。
2014年3月22日 星期六
SpringMVC RequestParam、CookieValue、RequestHeader
@RequestParam
在呼叫@Controller內的@RequestMapping時,
我們可以在function的地方加入RequestParam綁定對應的參數名稱,
在呼叫@Controller內的@RequestMapping時,
我們可以在function的地方加入RequestParam綁定對應的參數名稱,
package com.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller @RequestMapping("/param") public class ParamTestController { @RequestMapping("/test") public String test( @RequestParam(value = "par1", defaultValue = "df") String par1, @RequestParam(value = "par2", required = false) int par2) { return "/param/test"; } }@RequestParam中有三個參數可以設定,
SpringMVC PathVariable
在@RequestMapping中,
當使用URL對應時還可以使用{}占位符號的方式傳遞參數,
當您呼叫/webapp/item/123456時,
會執行create()並且幫你把123456綁定到itemNo的變數中,
除了可以使用function的占位符外,
也可以使用class的占位符,
當使用URL對應時還可以使用{}占位符號的方式傳遞參數,
package com.springmvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/item") public class ItemController { @RequestMapping("/{itemNo}") public String create(@PathVariable("itemNo") String itemNo) { return "/item/create"; } }在ItemController中,
當您呼叫/webapp/item/123456時,
會執行create()並且幫你把123456綁定到itemNo的變數中,
除了可以使用function的占位符外,
也可以使用class的占位符,
SpringMVC Request Mapping
透過dispatcher-sevlet.xml,
利用context:component-scan去掃描package以下的所有@Controller,
那要如何將USER傳送的request對應到符合的控制器,
便是依賴@RequestMapping,
有以下幾種方式可以使用:
1.利用URL對應
可以在function前利用@RequestMapping來對應傳送的URL,
利用context:component-scan去掃描package以下的所有@Controller,
那要如何將USER傳送的request對應到符合的控制器,
便是依賴@RequestMapping,
有以下幾種方式可以使用:
1.利用URL對應
可以在function前利用@RequestMapping來對應傳送的URL,
2014年3月9日 星期日
Clean Code - Meaningful Names
在coding的過程中,
命名一直是大家常常討論的事情,
不論是package、class、jar、file、document、properties等等,
這邊分享一些書中提到的觀念,
我想寫程式的方式每個人都有自己的想法,
看到別人提出的論點可以多聽多看多了解,
覺得好的可以學起來用,
但不認同的也可以提出來討論,
畢竟這也不是聖經或是spec,
不會有人逼你一定要用,
在此將一些覺得不錯的條列如下:
1. 名符其實
每一段Code中的所有變數,應該要可以解答所有讀者的疑惑,
可以比較以下兩段程式碼,第二段會比第一段容易理解每個變數代表的涵義,
很常看到在宣告m這種變數後,再寫一段註解解釋m是什麼意思,
如果這樣的話,不如直接宣告為month更顯得淺顯易懂。
2. 有意義的區別
不要使用會讓人搞不清楚的命名,例如Member和MemberInfo兩個類別,
直覺上看起來是一樣的,或是使用a、an、the這種名稱,
像account和theAccount,或Item和ItemObject。
3. 可被搜尋
當一個變數或常數在程式中很常用到,最好給一個容易被搜尋到的名稱來代替,
比較以下兩段程式碼,for迴圈中的數字,
當使用變數名稱取代後,會更好搜尋及了解涵義。
4. 類別和方法的命名
類別的命名盡量使用名詞,例如Member、Account、Item等等,
方法的名稱則使用動詞,例如save、update、delete、add等等,
取出使用get,設定修改用set,判定或flag使用is。
5. 避免雙關語
有時候你會常常使用add這樣的名稱,
不論是增加、插入、附加等等,
但你可以考慮用add、insert、append等等的命名來區別這其中的差異,
可以幫助讀者更好理解。
命名一直是大家常常討論的事情,
不論是package、class、jar、file、document、properties等等,
這邊分享一些書中提到的觀念,
我想寫程式的方式每個人都有自己的想法,
看到別人提出的論點可以多聽多看多了解,
覺得好的可以學起來用,
但不認同的也可以提出來討論,
畢竟這也不是聖經或是spec,
不會有人逼你一定要用,
在此將一些覺得不錯的條列如下:
1. 名符其實
每一段Code中的所有變數,應該要可以解答所有讀者的疑惑,
可以比較以下兩段程式碼,第二段會比第一段容易理解每個變數代表的涵義,
很常看到在宣告m這種變數後,再寫一段註解解釋m是什麼意思,
如果這樣的話,不如直接宣告為month更顯得淺顯易懂。
int m; String str; List<Integer> list=null; int month; String memberName; List<Integer> memberList=null;
2. 有意義的區別
不要使用會讓人搞不清楚的命名,例如Member和MemberInfo兩個類別,
直覺上看起來是一樣的,或是使用a、an、the這種名稱,
像account和theAccount,或Item和ItemObject。
3. 可被搜尋
當一個變數或常數在程式中很常用到,最好給一個容易被搜尋到的名稱來代替,
比較以下兩段程式碼,for迴圈中的數字,
當使用變數名稱取代後,會更好搜尋及了解涵義。
int sum = 0; for (int i = 0; i < 10; i++) { sum += i * 2; } int total_item_count = 10; int item_exchange = 2; for (int i = 0; i < total_item_count; i++) { sum += i * item_exchange; }
4. 類別和方法的命名
類別的命名盡量使用名詞,例如Member、Account、Item等等,
方法的名稱則使用動詞,例如save、update、delete、add等等,
取出使用get,設定修改用set,判定或flag使用is。
5. 避免雙關語
有時候你會常常使用add這樣的名稱,
不論是增加、插入、附加等等,
但你可以考慮用add、insert、append等等的命名來區別這其中的差異,
可以幫助讀者更好理解。
訂閱:
文章 (Atom)