擴充原本JDK Properties Class,讓Properties裡面的可以宣告變數。
星期四, 6月 30, 2011
星期三, 6月 29, 2011
Multiple File Upload Plugin
多檔上傳元件:
Flash:
http://www.uploadify.com/
http://digitarald.de/project/fancyupload/3-0/showcase/attach-a-file/
No Flash:
http://valums.com/ajax-upload/ License:GPL2 LGPL2
http://aquantum-demo.appspot.com/file-upload License:MIT
PS:上面的連結常常會失效,請改到github查看使用說明
https://github.com/blueimp/jQuery-File-Upload/wiki/Setup
other:
http://the-stickman.com/web-development/javascript/upload-multiple-files-with-a-single-file-element/
Flash:
http://www.uploadify.com/
http://digitarald.de/project/fancyupload/3-0/showcase/attach-a-file/
No Flash:
http://valums.com/ajax-upload/ License:GPL2 LGPL2
http://aquantum-demo.appspot.com/file-upload License:MIT
PS:上面的連結常常會失效,請改到github查看使用說明
https://github.com/blueimp/jQuery-File-Upload/wiki/Setup
other:
http://the-stickman.com/web-development/javascript/upload-multiple-files-with-a-single-file-element/
星期一, 6月 27, 2011
[jQuery plugin] How to sorting JSON Array
原理是使用javascript的sort()函數,此函數也提供讓使用者自訂sort function。
<script type="text/javascript">
var arr = [
{ "ID": 135, "Name": "Fargo Chan", "Address": "34, Baker Street" },
{ "ID": 432, "Name": "Aaron Luke", "Address": "BLDG 1, J Street" },
{ "ID": 252, "Name": "Dilip Singh", "Address": "Hotel J, SE" }
];
// Before Sorting
document.write("<b>Before Sorting </b><br/>");
for (var n = 0; n < arr.length; n++) {
document.write(arr[n].ID + ' ' + arr[n].Name + '<br>');
}
// ascending order
function SortByID(x,y) {
return x.ID - y.ID;
}
function SortByName(x,y) {
return ((x.Name == y.Name) ? 0 : ((x.Name > y.Name) ? 1 : -1 ));
}
// Call Sort By Name
arr.sort(SortByName);
document.write("<br/><b>After Sorting </b> <br/>");
for(var n=0;n<arr.length;n++){
document.write(arr[n].ID + ' ' + arr[n].Name + '<br>');
}
</script>
可重覆使用的範例:參考至How to sort a JSON array ?
Here's a more flexible version, which allows you to create reusable sort functions, and sort by any field
var sort_by = function(field, reverse, primer){
reverse = (reverse) ? -1 : 1;
return function(a,b){
a = a[field];
b = b[field];
if (typeof(primer) != 'undefined'){
a = primer(a);
b = primer(b);
}
if (a<b) return reverse * -1;
if (a>b) return reverse * 1;
return 0;
}
}
Now you can sort by any field at will
// Sort by price high to low
homes.sort(sort_by('price', true, parseInt));
// Sort by city, case-insensitive, A-Z
homes.sort(sort_by('city', false, function(a){return a.toUpperCase()}));
可以改寫成jQuery plugin的寫法:
(function($) {
$.extend({
sortBy : function(objects, field, reverse, fieldValueFunc) {
//ASC or DESC
//if reverse is true, data will be sorted using DESC
reverse = (reverse) ? -1 : 1;
//init sort func
var sortFunc = function(elA, elB) {
//get value by field name
elA = elA[field];
elB = elB[field];
if (typeof (fieldValueFunc) != 'undefined') {
elA = fieldValueFunc(elA);
elB = fieldValueFunc(elB);
}
//return element comparison value
if (elA < elB)
return reverse * -1;
if (elA > elB)
return reverse * 1;
return 0;
};
//call sort() method using sortFunc
objects.sort(sortFunc);
}
});
})(jQuery);
使用方式
$.sortBy(arr,"ID",false,parseInt);
[Java] Reading InputStream
如何使用Java 讀取InputStream資料。
可指定編碼格式UTF-8
//預設編碼為ANSI(ASCII)
BufferedReader in = new BufferedReader(
new InputStreamReader(inputStream));
String currentLine = null;
while((currentLine = in.readLine()) != null){
System.out.println("currentLine" + currentLine);
}
可指定編碼格式UTF-8
BufferedReader in = new BufferedReader( new InputStreamReader(inputStream,"UTF-8"));
星期四, 6月 23, 2011
[Java] Base64 Encoder
1. 下載所需的Jar檔。(這裡我們是使用Apache的commons-codec套件)
2. import org.apache.commons.codec.binary.Base64;
3. 使用Base64 Class進行編碼與解碼
Reference:
Java Base64 Encode & Decode(編碼和解碼)
2. import org.apache.commons.codec.binary.Base64;
3. 使用Base64 Class進行編碼與解碼
Base64 base64 = new Base64();
//使用Base64進行字串編碼
String encodeString = new String(base64.encode("This is source string.".getBytes()));
//輸出結果將為"VGhpcyBpcyBzb3VyY2Ugc3RyaW5nLg=="
System.out.println(encodeString);
//使用Base64進行字串解碼
String decodeString = new String(base64.decode(encodeString.getBytes()));
//輸出結果將為"This is source string."
System.out.println(decodeString);
Reference:
Java Base64 Encode & Decode(編碼和解碼)
[Java] Read Microsoft XLS using JDBC
import java.sql.*;
public class MainWindow {
public static void main(String[] args) {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con= DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};DBQ=d:/desktop/test.xls");
Statement st=con.createStatement();
ResultSet rs= st.executeQuery("select * from [Sheet1$]");//Sheet1是工作表名稱
while(rs.next()){
System.out.println(rs.getInt("id")+" "+rs.getString("name"));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Reference:
Apache POI - Code Sample
Handle Excel files
星期一, 6月 13, 2011
regular expression 正則式筆記
蒐集常用的正則式,不定期更新。
Regex 所使用的符號彙整
找出所有非特殊字元
[^\W_]+
找出特殊字元
[\W_]+
找出HTML Tag
<([\s\S]+)?>
驗證是否符合a-z A-Z 0-9 中文字
[a-zA-Z0-9\u4e00-\u9fa5]+
Reference:
過濾特殊字元
[入門][Regex] Regular Expression 詳論
正则表达式:英文、中文、数字、下划线
Regex 所使用的符號彙整
| 記號 | 說明 |
| 字元 | 代表該字元, 例如輸入 a 就代表那個地方應該出現 a 這個字元 |
| ^ | 限制字串必須出現於行首, 例如 ^a 表這串字必須以 a 開頭; 如果 a 出現在其它地方, 都不算數 |
| $ | 限制字串必須出現於行末, 例如 a$ 表這串字必須以 a 結尾; 如果 a 出現在其它地方, 都不算數 |
| \ | 將特殊字元還原成字面意義的字元, 例如 \( 代表 ( 這個符號, \\ 代表 \ 這個符號; 這種表示法適用於 (, ), [, ] 等在 Regex 有特殊意義的字元 |
| ^ | 某字元以外的任何字元, 必須包在中括號裡面。例如 [^a] 表示 a 除外的任何字元或符號, [^a\t] 表示 a 和 tab 除外的任何字元或符號 |
| - | 字元集合中可使用 - 來指定字元的區間, 必須包在中括號裡面。例如 [a-z] 表示從 a 到 z 的英文小寫字元, [1-3] 表示從 1 到 3 這三個數字之一 |
| + | 其前的字元或字元集合出現一次或一次以上, 例如 a+ |
| ? | 其前的字元或字元集合可出現一次或不出現, 例如 a? |
| * | 其前的字元或字元集合可出現任何次數或不出現, 例如 a* |
| (...) | 用以括住一群字元,且將之視成一個集合, 通常用來集合表示多個檢核式 |
| {n} | 重複 n 次 |
| {n,m} | 重複 n 到 m 次 |
| {n,} | 至少重複 n 次 |
| [] | 其中之一字元可出現可不出現,例如 [abc] 表示不論出現 a 或 b 或 c 都算符合 |
| | | 代表「或」, 例如 (Sun|Mon|Tue|Wed|Thu|Fri|Sat), (日|一|二|三|四|五|六) ; 必須以左右括號括住 |
| . (句點符號) | 代表除了換行符號 (\n) 以外的任一字元。如果要包括換行符號,請使用 [\s\S] |
| \w (\W) | 代表任何英文(以外的) 字元 - 請注意, 數字字元也被承認 |
| \s (\S) | 代表空白 (以外的) 字元 |
| \d (\D) | 代表數字 (以外的) 字元 |
| \b (\B) | 代表位於文字邊界的 (以外的) 字元, 例如 \bA 可以檢核出 AB, A\b 可以檢核出 BA, \bAA\b 可以檢核出 AA |
| \r | 代表換行字元 (或稱 CR, Carriage Return) |
| \n | 代表換行字元 (或稱 LF, Line Feed; 通常和 \r 一同出現, 所以一般以 \r\n 代表換行, 但根據我的測試, 無論使用 \r 或 \n 或 \r\n 都會得到相同的結果, 但唯獨不能寫成 \n\r, 但建議使用 \r?\n) |
| \t | 代表 TAB 字元 (或稱 HT, Horizontal Tab) |
| \( | 代表左括號 |
| \) | 代表右括號 |
| \x | 以十六進位字元碼代表某個字元; 例如 [\x21-\x7E] 可代表所有看得到的字元 ([\x20-\x7E] 則包括空白字元)。不過注意 \x 之後要使用兩個數字, 不足兩個數字者請補 0, 例如 \x01 |
| \1, \2... | (Backreference Constructs) 表示出現過的群組; 例如 "(\d)(\D)" 樣式中有兩個群組, 若使用 "(\d)(\D)\1" 可檢出 "2A3"; 若使用 "(\d)(\D)\2+" 則可檢出 "2AB"; 餘此類推 |
| \k | 同上, 但適用於命名的群組; 例如 "(? |
| \p{Lu} (\P{Lu}) | 檢出大寫(非大寫)的字母, 例如 (?-i:\p{Lu}) 可檢出字串中所有大寫字母, 而 (?-i:\P{Lu}) 可檢出所有非大寫 (包括數字、空白等) 的字母 |
找出所有非特殊字元
[^\W_]+
找出特殊字元
[\W_]+
找出HTML Tag
驗證是否符合a-z A-Z 0-9 中文字
[a-zA-Z0-9\u4e00-\u9fa5]+
Reference:
過濾特殊字元
[入門][Regex] Regular Expression 詳論
正则表达式:英文、中文、数字、下划线
星期三, 6月 08, 2011
星期二, 6月 07, 2011
[Java] Upload file using Jersey
目前使用Jersey接收上傳檔案只能使用HttpServletRequest來接收上傳成功!!
尚未解決使用@FormDataParam無法上傳的錯誤!!待解
以下範例是使用Apache FileUpload Module 來取得上傳的檔案物件
Reference:
Multiple file upload using RESTful web service (Jersey)
尚未解決使用@FormDataParam無法上傳的錯誤!!待解
//目前會HTTP Status 415 - Unsupported Media Type大爆炸
@POST
@Path("/simpleupload2")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void simpleUpload2(
@FormDataParam("username") final String username,
@FormDataParam("filedata") final InputStream file,
@FormDataParam("filedata") final FormDataContentDisposition disposition){
System.out.println("username:" + username);
}
以下範例是使用Apache FileUpload Module 來取得上傳的檔案物件
@POST
@Path("/simpleupload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public void simpleUpload(
//@Context UriInfo ui,
@Context HttpServletRequest request
){
String fileRepository = "D:\\";
if (ServletFileUpload.isMultipartContent(request)) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> items = null;
try {
items = upload.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace();
}
if (items != null) {
Iterator<FileItem> iter = items.iterator();
while (iter.hasNext()) {
FileItem item = iter.next();
if (!item.isFormField() && item.getSize() > 0) {
System.out.println("File is found.");
String fileName = processFileName(item.getName());
try {
String savePath = fileRepository + fileName;
System.out.println("savePath:" + savePath);
item.write(new File(savePath));
} catch (Exception e) {
e.printStackTrace();
}
}else{
System.out.println("getFieldName:" + item.getFieldName());
System.out.println(item.getString());
}
}
}
}
}
Reference:
Multiple file upload using RESTful web service (Jersey)
星期一, 6月 06, 2011
[Java] UnicodeFormatter
/*
* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle or the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList;
public class UnicodeFormatter {
static public String byteToHex(byte b) {
// Returns hex String representation of byte b
char hexDigit[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
char[] array = { hexDigit[(b >> 4) & 0x0f], hexDigit[b & 0x0f] };
return new String(array);
}
static public String charToHex(char c) {
// Returns hex String representation of char c
byte hi = (byte) (c >>> 8);
byte lo = (byte) (c & 0xff);
return byteToHex(hi) + byteToHex(lo);
}
}
星期三, 6月 01, 2011
[Java] Fake UTF-16
static public String CoverterUtf8ToFakeUtf16(String utf8String) throws UnsupportedEncodingException {
byte[] inputBytes = utf8String.getBytes("UTF-8");
printBytes(inputBytes,"input bytes:");
ArrayList list = new ArrayList();
//convert input bytes to utf-16
for(int i=0;i<inputBytes.length;i++){
list.add(new Byte("00"));
list.add(inputBytes[i]);
}
byte[] returnByte = new byte[list.size()];
for(int i=0;i<returnByte.length;i++){
returnByte[i] = (Byte)list.get(i);
}
returnByte = new String(returnByte, Charset.forName("UTF-16")).getBytes("UTF-8");
printBytes(returnByte,"return bytes:");
String fakeUtf16 = new String(returnByte,Charset.forName("UTF-8"));
printBytes(fakeUtf16.getBytes("UTF-8"),"fakeUtf16 bytes:");
return fakeUtf16;
}
Testing
public void fakeUtf16(InputStream requestBodyStream ) throws UnsupportedEncodingException {
String requestBODY = RequestBODY.get(requestBodyStream,Charset.forName("utf-8"));
System.out.println("requestBODY:" + requestBODY);
String fakeUtf16 = UnicodeFormatter.CoverterUtf8ToFakeUtf16(requestBODY);
System.out.println("fakeUtf16:" + fakeUtf16);
}
Console 輸出訊息--fakeUtf16--
charset:UTF-8
requestBODY:中
input bytes:[0] = 0xe4
input bytes:[1] = 0xb8
input bytes:[2] = 0xad
return bytes:[0] = 0xc3
return bytes:[1] = 0xa4
return bytes:[2] = 0xc2
return bytes:[3] = 0xb8
return bytes:[4] = 0xc2
return bytes:[5] = 0xad
fakeUtf16 bytes:[0] = 0xc3
fakeUtf16 bytes:[1] = 0xa4
fakeUtf16 bytes:[2] = 0xc2
fakeUtf16 bytes:[3] = 0xb8
fakeUtf16 bytes:[4] = 0xc2
fakeUtf16 bytes:[5] = 0xad
fakeUtf16:ä¸
fakeUtf16:[0] = 0xfe
fakeUtf16:[1] = 0xff
fakeUtf16:[2] = 0x00
fakeUtf16:[3] = 0xe4
fakeUtf16:[4] = 0x00
fakeUtf16:[5] = 0xb8
fakeUtf16:[6] = 0x00
fakeUtf16:[7] = 0xad
--/fakeUtf16--
訂閱:
意見 (Atom)
