Effective Java 裡面有個章節是說要公平的覆寫 clone,我自己對 clone 的理解是,若是要 copy 一個物件 A,通常一般會想到的是再 new 一個物件 B 出來,然後將要 copy 的物件 A 指派給這個新的物件 B,但是這樣兩個其實都還是參考到同一塊 memory ,不然就是將所有 A 的 property 取出來 set 給 B,而這樣又很麻煩,所以有真正的 clone 出現,藉由 clone 出來的物件會跟原物件擁有完全相同的功能,但其 memory address 卻是不一樣的。
但對於 clone 說明,我還是不太能理解就是...
參考:
http://stackoverflow.com/questions/11540792/effective-java-analysis-of-the-clone-method
2014年3月29日 星期六
第一次接觸 ORM 的 test case
第一次做 PmdTaskDaoImpl 跟 PmdOrderDaoImpl 時,寫好 testcase 請同事幫忙 check 之後,紀錄一下應該改善的重點:
- 欄位更新的部分沒有check到
- 所有的判斷都用 assert 來做
- partial的部分也要作測試.
- 一開始的中文欄位(需被更新的欄位值)都是null的才對,對測試資料而言:
- 在新建測試的 entity 時,將欄位區分成:
- 有預設值,會變動。
- 有預設值,不會變動。
- 無預設值,會變動。
- 無預設值,不會變動。
JAVA 讀/寫檔
通常要把 data 寫入一個檔案,步驟是:
先給一個可以寫入的路徑,在這個路徑下 new 一個 file,將這個 file 開成可以寫入的串流 (ex: FileOutPutStream),然後利用這個串流將檔案內容寫入。
至於要寫成什麼格式就看狀況了。
最重要的是最後要記得在寫完後把串流做 close。
附上一個不倚賴 JVM 預設編碼讀檔的寫法,因為有時候就是會遇到 server 跟自己程式有衝突的編碼:
附上一個不倚賴 JVM 預設編碼讀檔的寫法,因為有時候就是會遇到 server 跟自己程式有衝突的編碼:
/**
* 讀取指定路徑之檔案內容成字串.
*
* @param filePath
* 檔案路徑.
* @return String 字串.
*/
private static String readFile (final String filePath) {
logger.info("Read filePath: {}", filePath);
final File file = new File(filePath);
if (!file.isFile()) {
throw new IllegalArgumentException( "Path [" + filePath + "] is not a file.");
}
// 讀檔要一個個 Byte 讀進來不能 buffer reader 讀.
// 讀取檔案內容成字串.
FileInputStream fis = null;
try {
final int fileSize = ( int) file.length();
final byte[] buffer = new byte[fileSize];
fis = new FileInputStream(file);
fis.read(buffer);
fis.close();
return new String(buffer, "UTF-8");
} catch (Exception e) {
logger.error( "Read file stream error.", e);
throw new RuntimeException( "Read argument file fail. " + filePath, e);
} finally {
if (fis != null) {
try {
fis.close();
} catch (Exception e) {
logger.error( "Close file stream error.", e);
}
}
}
}
Servlet using ajax
今天試了在前端使用 jQuery 的 ajax 傳參數給 controller 並由 controller 回傳一個值給前端頁面,
前端 js(jQuery) 中的寫法是這樣:
$.ajax({
url: 'batchMonitor.do?method=saveTest',
dataType: "html",
type: "post",
data: {
data1: $("#input1").val()
},
error: function(xhr) {
alert('Ajax request 發生錯誤');
},
success: function(response) {
alert(response);
}});
其中 url 這邊是設定成 controller 的名稱跟要處理這個 ajax 的方法,
data 區段指的是要傳一個參數叫做 data1 的給 server 端
而在 controller 端的寫法則是下面這樣:
public void saveTest(final HttpServletRequest req, final HttpServletResponse res) throws IOException {
String getFromClientTest = req.getParameter("data1");
logger.trace("saveTest:{} ", getFromClientTest);
res.setContentType("text/html");
res.setHeader("Cache-Control", "no-cache");
res.getWriter().write(getFromClientTest);
}
因為在前端 jsp 已經設定了 data ,所以可以用 HttpServletRequest 的 getParameter去接 設定的參數(值則為後面那個$("#input1").val())
記得要設定回傳的 content type, content type 也要跟前端的 dataType 一樣型態才可以。
jQuery toggleClass
toggle 就是「切換」的意思。
toggleClass:
指的是,若這個selector沒有附上這個class,就將其附上;但是若此selector已有這個class,則將其移除。
$(function() {
$( "#button" ).click(function() {
$( "#effect" ).toggleClass( "newClass", 1000 );
return false;
});
});
toggleClass:
指的是,若這個selector沒有附上這個class,就將其附上;但是若此selector已有這個class,則將其移除。
$(function() {
$( "#button" ).click(function() {
$( "#effect" ).toggleClass( "newClass", 1000 );
return false;
});
});
Spring 的 bean scope
spring framework 中,在 web.xml 中預設的 bean 行為 (即沒表示scope的狀況) 就是 singleton,單一,即表示只有一份,server 起來的時候只有一份。
通常 singleton 會使用在 POJO (Plain Old Java Object)。
POJO 是指只有設定 property 與 value 的 bean,這種較不常變動的 java bean 可以在 server 一起來時就設定好之後並不需要很多變動。
通常 POJO 也指不依賴任合框架即可在 JVM 中跑起來的 java object。
而我們在 spring-web-servlet.xml 中看見的大部分是程式使用執行的 bean,,它都沒有設定scope,所以預設就是 "singleton",就是在所有 container 當中只有一份,可以想成是 static 變數。
除非指定 scope 為 "prototype" (原型),這樣每次使用時 server 就會重新 new 一個 instatnce。
在 Spring 設定檔中,將 value 設定成 null 或空字串的方法
在 Spring 設定檔中,要將 value 設定成 null 或空字串的方法:
1. null: <property name="xxx"><null/></property>
2. 空字串:<property name="xxx"><value></value></property>
AOP 概念
Aspect: 模組化、可被重用的 cross-concern 物件,將多個 class 切割的模組,也是一種 class.
Joint point: 程式實際執行中的某一個點。
Advice: Aspect 在 Joint point 中執行的動作,意即 aspect 的實作就是 Advice, Advice 有三種 type: around, before, after。
Pointcut: 一段符合 joint point 的述語(斷言) ,描述每個joint point是要用哪個 aspect
Intruction。
Weave: Advice 被應用至物件的過程稱之為縫合(Weave),在 AOP 中,縫合的時機點有compile time, classload time, runtime.。
pointcut 表示法:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)
其中ret-type-pattern、name-pattern(param-pattern)是可以省略的。
Q: AOP 的cut point一定要是介面才行嗎?
A: interface or non-final class
關於 Http request.getParameter
Q: getParameter 取得的到底是什麼東西呢?
A: Returns the value of a request parameter as a String, or null if the parameter does not exist.
Do note that it is possible to submit an empty parameter - such that the parameter exists, but has no value. For example, I could include
&log=&somethingElse into the URL to enable logging, without needing to specify &log=true. In this case, the value will be an empty String ("").
若是要將取得的參數值改成數字形態:
if (request.getParameter("sum") != null &&
request.getParameter("sum").matches("^\\d+$"))
int sum = Integer.parseInt(request.getParameter("sum"));
Nexus 與 Jenkins 的關係
Nexus 是儲存檔案庫,而 Jenkins 是負責 build 版與 Unit test 的 server,並且 Jenkins 將每次 build 的版本留存下來,處理所有相關聯函式庫的相依性,確保所有的相關程式都能在每次 build 之後還能夠正常。
在 Nexus Repository上,那些 Type 為 proxy 的都是外面提供的 free lib.
而我們自己內部開發的都設定成 hosted,表示對外無法存取到我們的開發的專案。
我們目前使用的是 free 的 Nexus 的版本。
Jenkins 中的 upperstream 指的是此專案本身依賴(相依)的函式庫,
而 downstream 則是指依賴於此專案本身的其他相關函式庫。
什麼叫做 artifact ? 可以想像成是一個軟體模組的識別。
Maven 如果有很多紅叉叉在專案上面
如果有很多紅叉叉在專案上面:
1. Maven -> Update project configuration
2. Maven -> update dependency
2. Maven -> update dependency
3. 觀察此 Project 是否為 Maven 結構,不是的話將多餘的檔案刪除 (ex. MENIFIST... bin folder...)
4. 若是很多 jsp 的 error,先看 Marker 視窗是什麼錯誤,對其作修正,修正了之後還有再對jsp 做 validate 的動作
5. 若是 web project 觀察一下 war project的 merge.xml 或是 pom.xml
訂閱:
文章 (Atom)