部落客廣告聯播

2007年12月24日 星期一

2007年11月6日 星期二

[Javascript實用技巧]判斷輸入是否為合法數字

1. 使用內建isNaN( ) -->若非合法數字傳回true,合法數字傳回false
isNaN(1.23) --> false
isNaN(-1.23) --> false
isNaN(4-1) --> false
isNaN("String") --> true

2. 自己寫

function fnIsValidInt(num)
{
var i,j,strTemp;
strTemp="0123456789";

for (i=0;i<num.length;i++)
{
j=strTemp.indexOf(num.charAt(i));
if (j==-1)
{
return false;
}
}
return true;
}

function fnIsValidFlot(NUM)
{
if ( NUM.length== 0)
return false;
if ( NUM=='.' )
return false;

var flag=false;


var i,j,strTemp;
strTemp="0123456789.";

for (i=0;i<NUM.length;i++)
{
j=strTemp.indexOf(NUM.charAt(i));
if (j==-1)
{
return false;
}
}
return true;
}

2007年10月21日 星期日

[javascript小技巧] 拉卷軸,物件跟著跑

拉卷軸,物件跟著跑

function setSellerInfoButtonLocation()
{
var btn=document.getElementById('seller-info-link');
btn.style.left=document.body.scrollLeft + document.body.clientWidth -btn.offsetWidth;
btn.style.top = document.documentElement.scrollTop+"px";
}

....
....
<body onload="setSellerInfoButtonLocation()" onscroll="setSellerInfoButtonLocation()" >

<body />

2007年9月30日 星期日

JSP custom tag library在OC4J中的使用注意事項(Notifications on using JSP Tag Library in OC4J)

在Tomcat上跑JSP常寫些custom tag lib如下:<myLib:myTag attribute1=" <%=request.getParameter("param") %> " />但在OC4J竟然會解析錯誤,無法解譯成java檔。
這真是令我想不透。


經過一番追查,改成如下:<myLib:myTag attribute1=' <%=request.getParameter("param") %> ' />
竟然就可以了。

都是雙引號在作怪。

2007年9月16日 星期日

Java月曆DIY (Build your Calendar in Java)

不久前曾介紹過DateFormatSymbols可用來製作月曆等,今天就來DIY一個月曆。
這裡提供的程式式最基本的用法,若修改成JSP/custom tag形式,配合聯結資料庫,可進一步做出行事曆等多項應用。










import java.text.DateFormatSymbols;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;


public class MyCalendar {

private int firstDayOfWeek=0;

public static void main(String[] args) {
showCalendar(2007,9,0);
showCalendar(2007,10,1);

}

/**
*
* @param year 年
* @param month 月
* @param firstDayOfWeek 每週第一天為 1 2 3 4 5 6 0 ,0=SUN
*/
private static void showCalendar(int year,int month,int firstDayOfWeek)
{
System.out.println(String.valueOf(year)+"年/"+String.valueOf(month)+"月");

String[] weekHeader=getCalendarWeekHeader(firstDayOfWeek);
for(String day:weekHeader)
{
System.out.print(day+"\t");
}
System.out.println();

String[][] content=getCalendarContent(year,month,firstDayOfWeek);
for(String[] days:content)
{
for(String day:days)
{
System.out.print(day);
}
System.out.println();
}
}

private static String[] getCalendarWeekHeader(int firstDay)
{
DateFormatSymbols smb=new DateFormatSymbols(Locale.getDefault());
String[] dayList=smb.getShortWeekdays(); // " ",sun,mon,tues......[] ,first element is blank string
String[] newDayList=new String[dayList.length-1];

for(int i=0;i<7;i++,firstDay++)
{
if(firstDay==7)firstDay=0;
newDayList[i]=dayList[firstDay+1];
}
//re-order
return newDayList;
}

private static int[] getCalendarWeekIntArr(int firstDay)
{
int[] newIntDayList=new int[7];

for(int i=0;i<7;i++,firstDay++)
{
if(firstDay==7)firstDay=0;
newIntDayList[i]=firstDay;
}

return newIntDayList;
}

private static String[] getCalendarWeekHeader()
{
return getCalendarWeekHeader(0);
}

private static String[][] getCalendarContent(int year,int month,int firstOfWeek)
{
GregorianCalendar calendar=new GregorianCalendar(Locale.getDefault());
calendar.set(year,month-1,1);

// calc how many rows
int maxDateOfThisMonth=calendar.getActualMaximum(calendar.DATE); //max date number of the month
int minDateOfThisMonth=calendar.getActualMinimum(calendar.DATE); //min date number of the month
calendar.set(calendar.DATE, maxDateOfThisMonth);
calendar.setMinimalDaysInFirstWeek(1); //?
calendar.setFirstDayOfWeek(firstOfWeek+1);
int rowCount=calendar.get(calendar.WEEK_OF_MONTH);

String[][] content=new String[rowCount][7];

//fill blank string to initial
for(int i=0;i<rowCount;i++)
{
Arrays.fill(content[i], "");
}


//fill content
int date=minDateOfThisMonth;
int[] weekInts=getCalendarWeekIntArr(firstOfWeek);

for(int row=0;row<rowCount;row++) //row
{
for(int col=0;col<7;col++) //column
{
if(date<=maxDateOfThisMonth)
{
calendar.set(calendar.DATE, date);
if(calendar.get(calendar.DAY_OF_WEEK)==weekInts[col]+1)
{
content[row][col]=String.valueOf(date)+"\t";
date++;
}
else
{
content[row][col]="\t";
}

}
}
}

return content;
}
}



輸出結果:

星期日 星期一 星期二 星期三 星期四 星期五 星期六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

2007年/10月
星期一 星期二 星期三 星期四 星期五 星期六 星期日
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

2007年9月6日 星期四

JavaScript實用函數:移除陣列元素 (Java script function: remove element from Array )



function array_removeAt(array,index)
{
var newArr=new Array(array.length-1);

var idx=0;
for(var i=0;i<array.length-1;i++)
{
if(i==index)continue;

newArr[idx]=array[i];
idx++;
}
return newArr;
}


-----------------------------------------------------
itemCodesArr=array_removeAt(itemCodesArr,j);

2007年8月22日 星期三

實用Java文件資源:Sun 官方提供Java Tutorials

學Java可以不用買書(代價是你要看的懂英文)
Sun官方提供
Java Tutorial:http://java.sun.com/docs/books/tutorial
書目章節大綱: Really Big Index
也可下載離線版本慢慢看:download page

更多Java 相關的Tutorial可在 Tutorials and Online Training找到喔...

一起練功吧.....

2007年8月13日 星期一

DateFormatSymbols

假設一個情形:你想自己寫一個JSP月曆表、或者是GUI月曆控制項,第一步當然是先產生月曆。
然而第一個遇到的問題便是要如何動態的產生星期x、星期x、x月,又如果user換成是外國人,他們習慣一周第一天是禮拜天、而且每周七天可不叫星期x而是SUN、Mon等表示,用if-than-else或switch判斷嗎?喔,別傻了?JDK裡面早有巨人的肩膀可以讓你站在上面了,這時便需要javax.text.DateFormatSymbols類別了。

這個類別封裝了區域化的date-time格式資料,像是月份的名稱、一星期各天的名稱、時區資料等。DateFormat和SimpleDateFormat都是使用DateFormatSymbols來封裝資訊。

當然API javadoc中說明通常不直接拿DateFormatSymbols來使用,但在我們要自己製作Calendar時拿來用無何不妥,可以省下許多程式碼與時間。

建構子:

  • DateFormatSymbols()
  • DateFormatSymbols(Locale locale)
    第二個建構子可傳進自訂的locale

重要方法:

  1. getMonths( )
  2. getShortMonths( )
  3. getShortWeekdays( )
  4. getShortWeekdays( )
    其他就不多加描述了,請參閱JDK文件或是直接參考下面的範例與結果



DateFormatSymbols smb=new DateFormatSymbols();
smb.getAmPmStrings();
//(java.lang.String[]) [上午, 下午]

DateFormatSymbols smb=new DateFormatSymbols();
smb.getEras();
//(java.lang.String[]) [西元前, 西元]
DateFormatSymbols smb=new DateFormatSymbols//(java.util.Locale.ENGLISH.US);
smb.getEras();//(java.lang.String[]) [BC, AD]

DateFormatSymbols smb=new DateFormatSymbols();
smb.getLocalPatternChars();
//(java.lang.String)GyMdkHmsSEDFwWahKzZ

DateFormatSymbols smb=new DateFormatSymbols//(java.util.Locale.ENGLISH.US);
smb.getLocalPatternChars();
//(java.lang.String) GyMdkHmsSEDFwWahKzZ

DateFormatSymbols smb=new DateFormatSymbols();
smb.getMonths();
//(java.lang.String[]) [一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月, ]

DateFormatSymbols smb=new DateFormatSymbols//(java.util.Locale.ENGLISH.US);
smb.getMonths();
//(java.lang.String[]) [January, February, March, April, May, June, July, August, September, October, November, December, ]

DateFormatSymbols smb=new DateFormatSymbols();
smb.getShortMonths();
//(java.lang.String[]) [一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月, ]

DateFormatSymbols smb=new DateFormatSymbols//(java.util.Locale.ENGLISH.US);
smb.getShortMonths();
//(java.lang.String[]) [Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec, ]

DateFormatSymbols smb=new DateFormatSymbols();
smb.getShortWeekdays();
//(java.lang.String[]) [, 星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六]

DateFormatSymbols smb=new DateFormatSymbols//(java.util.Locale.ENGLISH.US);
smb.getShortWeekdays();
//(java.lang.String[]) [, Sun, Mon, Tue, Wed, Thu, Fri, Sat]

DateFormatSymbols smb=new DateFormatSymbols();
smb.getWeekdays();
//(java.lang.String[]) [, 星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六]

DateFormatSymbols smb=new DateFormatSymbols//(java.util.Locale.ENGLISH.US);
smb.getWeekdays();
//(java.lang.String[]) [, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday]


DateFormatSymbols smb=new DateFormatSymbols();
smb.getZoneStrings();
//(java.lang.String[][]) [[America/Los_Angeles, 太平洋標準時間, PST, 太平洋日光節約時間, PDT], [PST, 太平洋標準時間, PST, 太平洋日光節約時間, PDT], [America/Denver, 山區標準時間, MST, 山區日光節約時間, MDT], [MST, 山區標準時間, MST, 山區日光節約時間, MDT], [America/Phoenix, 山區標準時間, MST, 山區日光節約時間, MDT], [PNT, 山區標準時間, MST, 山區日光節約時間, MDT], [America/Chicago, 中央標準時間, CST, 中央日光節約時間, CDT], [CST, 中央標準時間, CST, 中央日光節約時間, CDT], [America/New_York, 東方標準時間, EST, 東方日光節約時間, EDT], [EST, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Indianapolis, 東方標準時間, EST, 東方日光節約時間, EDT], [IET, 東方標準時間, EST, 東方日光節約時間, EDT], [Pacific/Honolulu, 夏威夷標準時間, HST, 夏威夷日光節約時間, HDT], [HST, 夏威夷標準時間, HST, 夏威夷日光節約時間, HDT], [America/Anchorage, 阿拉斯加標準時間, AKST, 阿拉斯加日光節約時間, AKDT], [AST, 阿拉斯加標準時間, AKST, 阿拉斯加日光節約時間, AKDT], [America/Halifax, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/St_Johns, 紐芬蘭標準時間, NST, 紐芬蘭日光節約時間, NDT], [CNT, 紐芬蘭標準時間, NST, 紐芬蘭日光節約時間, NDT], [Europe/Paris, 中歐時間, CET, 中歐夏令時間, CEST], [ECT, 中歐時間, CET, 中歐夏令時間, CEST], [GMT, 格林威治時間, GMT, 格林威治時間, GMT], [Africa/Casablanca, 西歐時間, WET, 西歐夏令時間, WEST], [Asia/Jerusalem, 以色列標準時間, IST, 以色列日光節約時間, IDT], [Asia/Tokyo, 日本標準時間, JST, 日本日光節約時間, JDT], [JST, 日本標準時間, JST, 日本日光節約時間, JDT], [Europe/Bucharest, 東歐時間, EET, 東歐夏令時間, EEST], [Asia/Shanghai, 中國標準時間, CST, 中國日光節約時間, CDT], [CTT, 中國標準時間, CST, 中國日光節約時間, CDT], [ACT, 中部標準時間 (北部各地區), CST, 中部夏令時間 (北部各地區), CST], [AET, 東方標準時間 (新南威爾斯), EST, 東方夏令時間 (新南威爾斯), EST], [AGT, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [ART, 東歐時間, EET, 東歐夏令時間, EEST], [Africa/Abidjan, 格林威治時間, GMT, 格林威治時間, GMT], [Africa/Accra, 迦納平均時間, GMT, 迦納夏令時間, GHST], [Africa/Addis_Ababa, 東非時間, EAT, 東非夏令時間, EAST], [Africa/Algiers, 中歐時間, CET, 中歐夏令時間, CEST], [Africa/Asmera, 東非時間, EAT, 東非夏令時間, EAST], [Africa/Bamako, 格林威治時間, GMT, 格林威治時間, GMT], [Africa/Bangui, 西非時間, WAT, 西非夏令時間, WAST], [Africa/Banjul, 格林威治時間, GMT, 格林威治時間, GMT], [Africa/Bissau, 格林威治時間, GMT, 格林威治時間, GMT], [Africa/Blantyre, 中非時間, CAT, 中非夏令時間, CAST], [Africa/Brazzaville, 西非時間, WAT, 西非夏令時間, WAST], [Africa/Bujumbura, 中非時間, CAT, 中非夏令時間, CAST], [Africa/Cairo, 東歐時間, EET, 東歐夏令時間, EEST], [Africa/Ceuta, 中歐時間, CET, 中歐夏令時間, CEST], [Africa/Conakry, 格林威治時間, GMT, 格林威治時間, GMT], [Africa/Dakar, 格林威治時間, GMT, 格林威治時間, GMT], [Africa/Dar_es_Salaam, 東非時間, EAT, 東非夏令時間, EAST], [Africa/Djibouti, 東非時間, EAT, 東非夏令時間, EAST], [Africa/Douala, 西非時間, WAT, 西非夏令時間, WAST], [Africa/El_Aaiun, 西歐時間, WET, 西歐夏令時間, WEST], [Africa/Freetown, 格林威治平均時間, GMT, 獅子山夏令時間, SLST], [Africa/Gaborone, 中非時間, CAT, 中非夏令時間, CAST], [Africa/Harare, 中非時間, CAT, 中非夏令時間, CAST], [Africa/Johannesburg, 南非標準時間, SAST, 南非夏令時間, SAST], [Africa/Kampala, 東非時間, EAT, 東非夏令時間, EAST], [Africa/Khartoum, 東非時間, EAT, 東非夏令時間, EAST], [Africa/Kigali, 中非時間, CAT, 中非夏令時間, CAST], [Africa/Kinshasa, 西非時間, WAT, 西非夏令時間, WAST], [Africa/Lagos, 西非時間, WAT, 西非夏令時間, WAST], [Africa/Libreville, 西非時間, WAT, 西非夏令時間, WAST], [Africa/Lome, 格林威治時間, GMT, 格林威治時間, GMT], [Africa/Luanda, 西非時間, WAT, 西非夏令時間, WAST], [Africa/Lubumbashi, 中非時間, CAT, 中非夏令時間, CAST], [Africa/Lusaka, 中非時間, CAT, 中非夏令時間, CAST], [Africa/Malabo, 西非時間, WAT, 西非夏令時間, WAST], [Africa/Maputo, 中非時間, CAT, 中非夏令時間, CAST], [Africa/Maseru, 南非標準時間, SAST, 南非夏令時間, SAST], [Africa/Mbabane, 南非標準時間, SAST, 南非夏令時間, SAST], [Africa/Mogadishu, 東非時間, EAT, 東非夏令時間, EAST], [Africa/Monrovia, 格林威治時間, GMT, 格林威治時間, GMT], [Africa/Nairobi, 東非時間, EAT, 東非夏令時間, EAST], [Africa/Ndjamena, 西非時間, WAT, 西非夏令時間, WAST], [Africa/Niamey, 西非時間, WAT, 西非夏令時間, WAST], [Africa/Nouakchott, 格林威治時間, GMT, 格林威治時間, GMT], [Africa/Ouagadougou, 格林威治時間, GMT, 格林威治時間, GMT], [Africa/Porto-Novo, 西非時間, WAT, 西非夏令時間, WAST], [Africa/Sao_Tome, 格林威治時間, GMT, 格林威治時間, GMT], [Africa/Timbuktu, 格林威治時間, GMT, 格林威治時間, GMT], [Africa/Tripoli, 東歐時間, EET, 東歐夏令時間, EEST], [Africa/Tunis, 中歐時間, CET, 中歐夏令時間, CEST], [Africa/Windhoek, 西非時間, WAT, 西非夏令時間, WAST], [America/Adak, 夏威夷-阿留申群島標準時間, HAST, 夏威夷-阿留申群島日光節約時間, HADT], [America/Anguilla, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Antigua, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Araguaina, 巴西利亞時間, BRT, 巴西利亞夏令時間, BRST], [America/Argentina/Buenos_Aires, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Argentina/Catamarca, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Argentina/ComodRivadavia, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Argentina/Cordoba, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Argentina/Jujuy, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Argentina/La_Rioja, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Argentina/Mendoza, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Argentina/Rio_Gallegos, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Argentina/San_Juan, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Argentina/Tucuman, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Argentina/Ushuaia, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Aruba, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Asuncion, 巴拉圭時間, PYT, 巴拉圭夏令時間, PYST], [America/Atikokan, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Atka, 夏威夷-阿留申群島標準時間, HAST, 夏威夷-阿留申群島日光節約時間, HADT], [America/Bahia, 巴西利亞時間, BRT, 巴西利亞夏令時間, BRST], [America/Barbados, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Belem, 巴西利亞時間, BRT, 巴西利亞夏令時間, BRST], [America/Belize, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Blanc-Sablon, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Boa_Vista, 亞馬遜時間, AMT, 亞馬遜夏令時間, AMST], [America/Bogota, 哥倫比亞時間, COT, 哥倫比亞夏令時間, COST], [America/Boise, 山區標準時間, MST, 山區日光節約時間, MDT], [America/Buenos_Aires, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Cambridge_Bay, 山區標準時間, MST, 山區日光節約時間, MDT], [America/Campo_Grande, 亞馬遜時間, AMT, 亞馬遜夏令時間, AMST], [America/Cancun, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Caracas, 委內瑞拉時間, VET, 委內瑞拉夏令時間, VEST], [America/Catamarca, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Cayenne, 法屬圭亞那時間, GFT, 法屬圭亞那夏令時間, GFST], [America/Cayman, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Chihuahua, 山區標準時間, MST, 山區日光節約時間, MDT], [America/Coral_Harbour, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Cordoba, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Costa_Rica, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Cuiaba, 亞馬遜時間, AMT, 亞馬遜夏令時間, AMST], [America/Curacao, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Danmarkshavn, 格林威治時間, GMT, 格林威治時間, GMT], [America/Dawson, 太平洋標準時間, PST, 太平洋日光節約時間, PDT], [America/Dawson_Creek, 山區標準時間, MST, 山區日光節約時間, MDT], [America/Detroit, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Dominica, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Edmonton, 山區標準時間, MST, 山區日光節約時間, MDT], [America/Eirunepe, Acre 時間, ACT, Acre 夏令時間, ACST], [America/El_Salvador, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Ensenada, 太平洋標準時間, PST, 太平洋日光節約時間, PDT], [America/Fort_Wayne, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Fortaleza, 巴西利亞時間, BRT, 巴西利亞夏令時間, BRST], [America/Glace_Bay, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Godthab, 西格林蘭島時間, WGT, 西格林蘭島夏令時間, WGST], [America/Goose_Bay, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Grand_Turk, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Grenada, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Guadeloupe, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Guatemala, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Guayaquil, 厄瓜多爾時間, ECT, 厄瓜多爾夏令時間, ECST], [America/Guyana, 蓋亞那時間, GYT, 蓋亞那夏令時間, GYST], [America/Havana, Cuba Standard Time, CST, Cuba Daylight Time, CDT], [America/Hermosillo, 山區標準時間, MST, 山區日光節約時間, MDT], [America/Indiana/Indianapolis, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Indiana/Knox, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Indiana/Marengo, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Indiana/Petersburg, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Indiana/Vevay, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Indiana/Vincennes, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Inuvik, 山區標準時間, MST, 山區日光節約時間, MDT], [America/Iqaluit, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Jamaica, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Jujuy, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Juneau, 阿拉斯加標準時間, AKST, 阿拉斯加日光節約時間, AKDT], [America/Kentucky/Louisville, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Kentucky/Monticello, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Knox_IN, 中央標準時間, CST, 中央日光節約時間, CDT], [America/La_Paz, 玻利維亞時間, BOT, 玻利維亞夏令時間, BOST], [America/Lima, 祕魯時間, PET, 祕魯夏令時間, PEST], [America/Louisville, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Maceio, 巴西利亞時間, BRT, 巴西利亞夏令時間, BRST], [America/Managua, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Manaus, 亞馬遜時間, AMT, 亞馬遜夏令時間, AMST], [America/Martinique, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Mazatlan, 山區標準時間, MST, 山區日光節約時間, MDT], [America/Mendoza, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Menominee, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Merida, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Mexico_City, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Miquelon, 皮埃爾島及密克隆島標準時間, PMST, 皮埃爾島及密克隆島日光節約時間, PMDT], [America/Moncton, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Montevideo, 烏拉圭時間, UYT, 烏拉圭夏令時間, UYST], [America/Monterrey, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Montreal, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Montserrat, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Nassau, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Nipigon, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Nome, 阿拉斯加標準時間, AKST, 阿拉斯加日光節約時間, AKDT], [America/Noronha, 費爾南多-迪諾羅尼亞時間, FNT, 費爾南多-迪諾羅尼亞夏令時間, FNST], [America/North_Dakota/Center, 中央標準時間, CST, 中央日光節約時間, CDT], [America/North_Dakota/New_Salem, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Panama, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Pangnirtung, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Paramaribo, 蘇利南時間, SRT, 蘇利南夏令時間, SRST], [America/Port-au-Prince, 東方標準時間, EST, 東方日光節約時間, EDT], [America/Port_of_Spain, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Porto_Acre, Acre 時間, ACT, Acre 夏令時間, ACST], [America/Porto_Velho, 亞馬遜時間, AMT, 亞馬遜夏令時間, AMST], [America/Puerto_Rico, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Rainy_River, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Rankin_Inlet, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Recife, 巴西利亞時間, BRT, 巴西利亞夏令時間, BRST], [America/Regina, 中央標準時間, CST, 中央日光節約時間, CDT], [America/Rio_Branco, Acre 時間, ACT, Acre 夏令時間, ACST], [America/Rosario, 阿根廷時間, ART, 阿根廷夏令時間, ARST], [America/Santiago, 智利時間, CLT, 智利夏令時間, CLST], [America/Santo_Domingo, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Sao_Paulo, 巴西利亞時間, BRT, 巴西利亞夏令時間, BRST], [America/Scoresbysund, 東格林島時間, EGT, 東格林島夏令時間, EGST], [America/Shiprock, 山區標準時間, MST, 山區日光節約時間, MDT], [America/St_Kitts, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/St_Lucia, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/St_Thomas, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/St_Vincent, 大西洋標準時間, AST, 大西洋日光節約時間, ADT], [America/Swift_Current, 中央標準時間, CST, 中央日光...

DateFormatSymbols smb=new DateFormatSymbols//(java.util.Locale.ENGLISH.US);
smb.getZoneStrings();
//(java.lang.String[][]) [[America/Los_Angeles, Pacific Standard Time, PST, Pacific Daylight Time, PDT], [PST, Pacific Standard Time, PST, Pacific Daylight Time, PDT], [America/Denver, Mountain Standard Time, MST, Mountain Daylight Time, MDT], [MST, Mountain Standard Time, MST, Mountain Daylight Time, MDT], [America/Phoenix, Mountain Standard Time, MST, Mountain Daylight Time, MDT], [PNT, Mountain Standard Time, MST, Mountain Daylight Time, MDT], [America/Chicago, Central Standard Time, CST, Central Daylight Time, CDT], [CST, Central Standard Time, CST, Central Daylight Time, CDT], [America/New_York, Eastern Standard Time, EST, Eastern Daylight Time, EDT], [EST, Eastern Standard Time, EST, Eastern Daylight Time, EDT], [America/Indianapolis, Eastern Standard Time, EST, Eastern Daylight Time, EDT], [IET, Eastern Standard Time, EST, Eastern Daylight Time, EDT], [Pacific/Honolulu, Hawaii Standard Time, HST, Hawaii Daylight Time, HDT], [HST, Hawaii Standard Time, HST, Hawaii Daylight Time, HDT], [America/Anchorage, Alaska Standard Time, AKST, Alaska Daylight Time, AKDT], [AST, Alaska Standard Time, AKST, Alaska Daylight Time, AKDT], [America/Halifax, Atlantic Standard Time, AST, Atlantic Daylight Time, ADT], [America/St_Johns, Newfoundland Standard Time, NST, Newfoundland Daylight Time, NDT], [CNT, Newfoundland Standard Time, NST, Newfoundland Daylight Time, NDT], [Europe/Paris, Central European Time, CET, Central European Summer Time, CEST], [ECT, Central European Time, CET, Central European Summer Time, CEST], [GMT, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [Africa/Casablanca, Western European Time, WET, Western European Summer Time, WEST], [Asia/Jerusalem, Israel Standard Time, IST, Israel Daylight Time, IDT], [Asia/Tokyo, Japan Standard Time, JST, Japan Daylight Time, JDT], [JST, Japan Standard Time, JST, Japan Daylight Time, JDT], [Europe/Bucharest, Eastern European Time, EET, Eastern European Summer Time, EEST], [Asia/Shanghai, China Standard Time, CST, China Daylight Time, CDT], [CTT, China Standard Time, CST, China Daylight Time, CDT], [ACT, Central Standard Time (Northern Territory), CST, Central Summer Time (Northern Territory), CST], [AET, Eastern Standard Time (New South Wales), EST, Eastern Summer Time (New South Wales), EST], [AGT, Argentine Time, ART, Argentine Summer Time, ARST], [ART, Eastern European Time, EET, Eastern European Summer Time, EEST], [Africa/Abidjan, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [Africa/Accra, Ghana Mean Time, GMT, Ghana Summer Time, GHST], [Africa/Addis_Ababa, Eastern African Time, EAT, Eastern African Summer Time, EAST], [Africa/Algiers, Central European Time, CET, Central European Summer Time, CEST], [Africa/Asmara, Eastern African Time, EAT, Eastern African Summer Time, EAST], [Africa/Asmera, Eastern African Time, EAT, Eastern African Summer Time, EAST], [Africa/Bamako, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [Africa/Bangui, Western African Time, WAT, Western African Summer Time, WAST], [Africa/Banjul, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [Africa/Bissau, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [Africa/Blantyre, Central African Time, CAT, Central African Summer Time, CAST], [Africa/Brazzaville, Western African Time, WAT, Western African Summer Time, WAST], [Africa/Bujumbura, Central African Time, CAT, Central African Summer Time, CAST], [Africa/Cairo, Eastern European Time, EET, Eastern European Summer Time, EEST], [Africa/Ceuta, Central European Time, CET, Central European Summer Time, CEST], [Africa/Conakry, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [Africa/Dakar, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [Africa/Dar_es_Salaam, Eastern African Time, EAT, Eastern African Summer Time, EAST], [Africa/Djibouti, Eastern African Time, EAT, Eastern African Summer Time, EAST], [Africa/Douala, Western African Time, WAT, Western African Summer Time, WAST], [Africa/El_Aaiun, Western European Time, WET, Western European Summer Time, WEST], [Africa/Freetown, Greenwich Mean Time, GMT, Sierra Leone Summer Time, SLST], [Africa/Gaborone, Central African Time, CAT, Central African Summer Time, CAST], [Africa/Harare, Central African Time, CAT, Central African Summer Time, CAST], [Africa/Johannesburg, South Africa Standard Time, SAST, South Africa Summer Time, SAST], [Africa/Kampala, Eastern African Time, EAT, Eastern African Summer Time, EAST], [Africa/Khartoum, Eastern African Time, EAT, Eastern African Summer Time, EAST], [Africa/Kigali, Central African Time, CAT, Central African Summer Time, CAST], [Africa/Kinshasa, Western African Time, WAT, Western African Summer Time, WAST], [Africa/Lagos, Western African Time, WAT, Western African Summer Time, WAST], [Africa/Libreville, Western African Time, WAT, Western African Summer Time, WAST], [Africa/Lome, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [Africa/Luanda, Western African Time, WAT, Western African Summer Time, WAST], [Africa/Lubumbashi, Central African Time, CAT, Central African Summer Time, CAST], [Africa/Lusaka, Central African Time, CAT, Central African Summer Time, CAST], [Africa/Malabo, Western African Time, WAT, Western African Summer Time, WAST], [Africa/Maputo, Central African Time, CAT, Central African Summer Time, CAST], [Africa/Maseru, South Africa Standard Time, SAST, South Africa Summer Time, SAST], [Africa/Mbabane, South Africa Standard Time, SAST, South Africa Summer Time, SAST], [Africa/Mogadishu, Eastern African Time, EAT, Eastern African Summer Time, EAST], [Africa/Monrovia, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [Africa/Nairobi, Eastern African Time, EAT, Eastern African Summer Time, EAST], [Africa/Ndjamena, Western African Time, WAT, Western African Summer Time, WAST], [Africa/Niamey, Western African Time, WAT, Western African Summer Time, WAST], [Africa/Nouakchott, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [Africa/Ouagadougou, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [Africa/Porto-Novo, Western African Time, WAT, Western African Summer Time, WAST], [Africa/Sao_Tome, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [Africa/Timbuktu, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [Africa/Tripoli, Eastern European Time, EET, Eastern European Summer Time, EEST], [Africa/Tunis, Central European Time, CET, Central European Summer Time, CEST], [Africa/Windhoek, Western African Time, WAT, Western African Summer Time, WAST], [America/Adak, Hawaii-Aleutian Standard Time, HAST, Hawaii-Aleutian Daylight Time, HADT], [America/Anguilla, Atlantic Standard Time, AST, Atlantic Daylight Time, ADT], [America/Antigua, Atlantic Standard Time, AST, Atlantic Daylight Time, ADT], [America/Araguaina, Brasilia Time, BRT, Brasilia Summer Time, BRST], [America/Argentina/Buenos_Aires, Argentine Time, ART, Argentine Summer Time, ARST], [America/Argentina/Catamarca, Argentine Time, ART, Argentine Summer Time, ARST], [America/Argentina/ComodRivadavia, Argentine Time, ART, Argentine Summer Time, ARST], [America/Argentina/Cordoba, Argentine Time, ART, Argentine Summer Time, ARST], [America/Argentina/Jujuy, Argentine Time, ART, Argentine Summer Time, ARST], [America/Argentina/La_Rioja, Argentine Time, ART, Argentine Summer Time, ARST], [America/Argentina/Mendoza, Argentine Time, ART, Argentine Summer Time, ARST], [America/Argentina/Rio_Gallegos, Argentine Time, ART, Argentine Summer Time, ARST], [America/Argentina/San_Juan, Argentine Time, ART, Argentine Summer Time, ARST], [America/Argentina/Tucuman, Argentine Time, ART, Argentine Summer Time, ARST], [America/Argentina/Ushuaia, Argentine Time, ART, Argentine Summer Time, ARST], [America/Aruba, Atlantic Standard Time, AST, Atlantic Daylight Time, ADT], [America/Asuncion, Paraguay Time, PYT, Paraguay Summer Time, PYST], [America/Atikokan, Eastern Standard Time, EST, Eastern Daylight Time, EDT], [America/Atka, Hawaii-Aleutian Standard Time, HAST, Hawaii-Aleutian Daylight Time, HADT], [America/Bahia, Brasilia Time, BRT, Brasilia Summer Time, BRST], [America/Barbados, Atlantic Standard Time, AST, Atlantic Daylight Time, ADT], [America/Belem, Brasilia Time, BRT, Brasilia Summer Time, BRST], [America/Belize, Central Standard Time, CST, Central Daylight Time, CDT], [America/Blanc-Sablon, Atlantic Standard Time, AST, Atlantic Daylight Time, ADT], [America/Boa_Vista, Amazon Time, AMT, Amazon Summer Time, AMST], [America/Bogota, Colombia Time, COT, Colombia Summer Time, COST], [America/Boise, Mountain Standard Time, MST, Mountain Daylight Time, MDT], [America/Buenos_Aires, Argentine Time, ART, Argentine Summer Time, ARST], [America/Cambridge_Bay, Mountain Standard Time, MST, Mountain Daylight Time, MDT], [America/Campo_Grande, Amazon Time, AMT, Amazon Summer Time, AMST], [America/Cancun, Central Standard Time, CST, Central Daylight Time, CDT], [America/Caracas, Venezuela Time, VET, Venezuela Summer Time, VEST], [America/Catamarca, Argentine Time, ART, Argentine Summer Time, ARST], [America/Cayenne, French Guiana Time, GFT, French Guiana Summer Time, GFST], [America/Cayman, Eastern Standard Time, EST, Eastern Daylight Time, EDT], [America/Chihuahua, Mountain Standard Time, MST, Mountain Daylight Time, MDT], [America/Coral_Harbour, Eastern Standard Time, EST, Eastern Daylight Time, EDT], [America/Cordoba, Argentine Time, ART, Argentine Summer Time, ARST], [America/Costa_Rica, Central Standard Time, CST, Central Daylight Time, CDT], [America/Cuiaba, Amazon Time, AMT, Amazon Summer Time, AMST], [America/Curacao, Atlantic Standard Time, AST, Atlantic Daylight Time, ADT], [America/Danmarkshavn, Greenwich Mean Time, GMT, Greenwich Mean Time, GMT], [America/Dawson, Pacific Standard Time, PST, Pacific Daylight Time, PDT], [America/Dawson_Creek, Mountain Standard Time, MST, Mountain Daylight Time, MDT], [America/Detroit, Eastern Standard Time, EST, Eastern Daylight Time, EDT], [America/Dominica, Atlantic Standard Time, AST, Atlantic Daylight Time, ADT], [America/Edmonton, Mountain Standard Time, ...
DateFormatSymbols smb=new DateFormatSymbols();
smb.getAvailableLocales();
//(java.util.Locale[]) [ja_JP, es_PE, en, ja_JP_JP, es_PA, sr_BA, mk, es_GT, ar_AE, no_NO, sq_AL, bg, ar_IQ, ar_YE, hu, pt_PT, el_CY, ar_QA, mk_MK, sv, de_CH, en_US, fi_FI, is, cs, en_MT, sl_SI, sk_SK, it, tr_TR, zh, th, ar_SA, no, en_GB, sr_CS, lt, ro, en_NZ, no_NO_NY, lt_LT, es_NI, nl, ga_IE, fr_BE, es_ES, ar_LB, ko, fr_CA, et_EE, ar_KW, sr_RS, es_US, es_MX, ar_SD, in_ID, ru, lv, es_UY, lv_LV, iw, pt_BR, ar_SY, hr, et, es_DO, fr_CH, hi_IN, es_VE, ar_BH, en_PH, ar_TN, fi, de_AT, es, nl_NL, es_EC, zh_TW, ar_JO, be, is_IS, es_CO, es_CR, es_CL, ar_EG, en_ZA, th_TH, el_GR, it_IT, ca, hu_HU, fr, en_IE, uk_UA, pl_PL, fr_LU, nl_BE, en_IN, ca_ES, ar_MA, es_BO, en_AU, sr, zh_SG, pt, uk, es_SV, ru_RU, ko_KR, vi, ar_DZ, vi_VN, sr_ME, sq, ar_LY, ar, zh_CN, be_BY, zh_HK, ja, iw_IL, bg_BG, in, mt_MT, es_PY, sl, fr_FR, cs_CZ, it_CH, ro_RO, es_PR, en_CA, de_DE, ga, de_LU, de, es_AR, sk, ms_MY, hr_HR, en_SG, da, mt, pl, ar_OM, tr, th_TH_TH, el, ms, sv_SE, da_DK, es_HN]


DateFormatSymbols smb=new DateFormatSymbols//(java.util.Locale.ENGLISH.US);
smb.getAvailableLocales();
//(java.util.Locale[]) [ja_JP, es_PE, en, ja_JP_JP, es_PA, sr_BA, mk, es_GT, ar_AE, no_NO, sq_AL, bg, ar_IQ, ar_YE, hu, pt_PT, el_CY, ar_QA, mk_MK, sv, de_CH, en_US, fi_FI, is, cs, en_MT, sl_SI, sk_SK, it, tr_TR, zh, th, ar_SA, no, en_GB, sr_CS, lt, ro, en_NZ, no_NO_NY, lt_LT, es_NI, nl, ga_IE, fr_BE, es_ES, ar_LB, ko, fr_CA, et_EE, ar_KW, sr_RS, es_US, es_MX, ar_SD, in_ID, ru, lv, es_UY, lv_LV, iw, pt_BR, ar_SY, hr, et, es_DO, fr_CH, hi_IN, es_VE, ar_BH, en_PH, ar_TN, fi, de_AT, es, nl_NL, es_EC, zh_TW, ar_JO, be, is_IS, es_CO, es_CR, es_CL, ar_EG, en_ZA, th_TH, el_GR, it_IT, ca, hu_HU, fr, en_IE, uk_UA, pl_PL, fr_LU, nl_BE, en_IN, ca_ES, ar_MA, es_BO, en_AU, sr, zh_SG, pt, uk, es_SV, ru_RU, ko_KR, vi, ar_DZ, vi_VN, sr_ME, sq, ar_LY, ar, zh_CN, be_BY, zh_HK, ja, iw_IL, bg_BG, in, mt_MT, es_PY, sl, fr_FR, cs_CZ, it_CH, ro_RO, es_PR, en_CA, de_DE, ga, de_LU, de, es_AR, sk, ms_MY, hr_HR, en_SG, da, mt, pl, ar_OM, tr, th_TH_TH, el, ms, sv_SE, da_DK, es_HN]

Eclipse 3.3 新功能Mylyn 線上課程及文章

Eclipse 3.3(Europa)中的Mylyn(之前叫Mylar)是以任務導向的UI,可用來簡化IDE中大型系統的開發所造成的資訊副載(Information Overloading),簡單的說就是可以幫你把大專案的開發簡化成任務導向,此外還可以做為Bug追蹤等應用,或許講了這麼多,還是不了解,不過透過下面的一分線上課程及兩篇文章,只要仔細研讀,就知道這項新功能的用處了:

Webinar: Task-Focused Programming with Mylyn by Mik Kersten (56 min, Oct 2006)

Task Focused Programming with [Mylyn], Part 1: Integrated task management for Eclipse by Mik Kersten (Oct 2006)

Task Focused Programming with [Mylyn], Part 2: Automated context management for Eclipse by Mik Kersten (Oct 2006)

以上連結出於Eclipse官方網站。

POI HSSFCellStyle

HSSFCellStyle用來設定儲存格格式、字型、顏色、字大小等。

excel XLS格式所用的CellStyle其使用觀念類似GIF的索引色票,
也就是說你如果將xls內的某個cellStyle變更,則其他之前設到這個cellStyle的儲存格都會跟著變,
要特別注意。
(若要分辨個別cell所使用的style是否相同可由cell.getCellStyle取得style再由style.getIndex()取得索引編號,藉此來分辨是否使用同一索引的style)

//範例

HSSFCellStyle style=wb.createCellStyle();
HSSFFont font=wb.createFont();
font.setFontName("新細明體");
font.setColor(HSSFColor.RED.index);
style.setFont(font);
cell.setCellStyle(style);
style.setFillForegroundColor((short)HSSFColor.LIGHT_BLUE.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

POI調整column欄寬

sheet.setColumnWidth((short)0,(short)(256*10));

  • 第一個參數是column index,由0開始
  • 第二個參數是寬度256為一個字

POI設定列Row高度

sheet.createRow(0).setHeight((short)(20*50));

注意單位是Twips,若要設xx points則要乘以20,最後記得轉short

POI 設定sheet名稱為中文

HSSFSheet sheet=wb.createSheet();
wb.setSheetName(i,"分頁"+String.valueOf(i),(short)HSSFWorkbook.ENCODING_UTF_16);

結果:

2007年8月9日 星期四

用javascript清空HTML<select>內所有option


<script>
var sel=document.frmName.selName;
//clear listbox
for(var i=sel.options.length-1;i>=0;i--)
{ sel.options.remove(i); }
</script>

2007年8月8日 星期三

Tomcat JDBC DataSource組態注意

在Tomcat中設定server.xml來組態設定一或多組DataSource,除了可以從JNDI位置取得該資料來源外,還有Connection Pooling的優點。
但關於Connection Pool設定若是不當,輕則效能不彰、重則導致無法取得資料庫連線而造成程式錯誤。
下面是Tomcat 官方文件關於在server.xml設定DataSource的範例:


<Context path="/DBTest" docBase="DBTest"
debug="5" reloadable="true" crossContext="true">
<!-- maxActive: Maximum number of dB connections in pool. Make sure you
configure your mysqld max_connections large enough to handle
all of your db connections. Set to 0 for no limit.
-->
<!-- maxIdle: Maximum number of idle dB connections to retain in pool.
Set to -1 for no limit. See also the DBCP documentation on this
and the minEvictableIdleTimeMillis configuration parameter.
-->
<!-- maxWait: Maximum time to wait for a dB connection to become available
in ms, in this example 10 seconds. An Exception is thrown if
this timeout is exceeded. Set to -1 to wait indefinitely.
-->
<!-- username and password: MySQL dB username and password for dB connections -->
<!-- driverClassName: Class name for the old mm.mysql JDBC driver is
org.gjt.mm.mysql.Driver - we recommend using Connector/J though.
Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver.
-->

<!-- url: The JDBC connection url for connecting to your MySQL dB.
The autoReconnect=true argument to the url makes sure that the
mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
connection. mysqld by default closes idle connections after 8 hours.
-->
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/javatest?autoReconnect=true"/>
</context>



其中注意兩個參數:

  • maxActive: 代表Pool可容納Connection的最大數量
  • maxIdlel:代表閒置時保留在Pool的Connection數量

親身經歷的事--在連線數使用超過maxActive時,後面取得Connection都為null,導致無法取得資料,造成程式錯誤!

WTP 簡介

Eclipse Web Tools Platform(WTP)

擴充了Eclipse platform,包含了許多工具可用來開發web application和JavaEE application。
這些工具有原始碼編輯器、圖形化的編輯器、精靈和許多內建的應用程式以簡化開發、幫助部署、運行、測試等工作。

WTP主要包含兩個子專案:
  • Web Standard Tools (WST) --> html、web service、xml等支援工具
  • J2EE Standard Tools (JST) --> EJB、Servlet、JSP、Java web service等Java特定的項目的支援工具
更詳細介紹,可參考:O'reilly ONJava.com - Eclipse Web Tools(英文)

2007年8月6日 星期一

javascript:實用函數檢查某組checkBox是否有至少選擇一項

用來驗證表單,快速套用

function haveCkedInCheckBox(selectObj)
{
if(selectObj!=null)
{
if(typeof selectObj.length!='undefined')
{
 for(var i=0;i<selectObj.length;i++)
   {
if(selectObj[i].checked)
    return true;
   }
}
else
{
return selectObj.checked;
}
}

return false;
}

javascript:實用函數 select All CheckBox

常在網頁上看到的技巧:點選最上個checkbox就可以進行全選/全取消 所有的checkBox,以下提供函數,稍經修改即可快速套用(修改chkAll_onclick()的來源及目的物件)--


function chkAll_onclick()
{
var obj=document.getElementById('chkAll');
var objs=frmDelTemp.checkedScoreCodes;
binaryCheckAll(obj,objs);
}

function binaryCheckAll(chkObj,beSelectedChkObjs)
{
if(chkObj!=null && beSelectedChkObjs!=null)
{
if(typeof beSelectedChkObjs.length=='undefined') //uni one row
{
beSelectedChkObjs.checked=chkObj.checked;
}
else
{
for (var i=0;i<beSelectedChkObjs.length;i++)
{
beSelectedChkObjs[i].checked=chkObj.checked;
}
}
}
}

2007年8月1日 星期三

JavaFX:在eclipse中執行fx檔案出錯的解決方法 (JavaFX:How to resolve the problem executing fx file in eclipse)

很高興的裝上新玩意- JavaFX eclipse plugin來玩玩,在之前的文(Java FX in Eclipse)有介紹其他玩家提供的教學影片,讓你很順利的進行安裝、HellowWorld、並執行。
記得上次裝還真的很順利,但今天換個地方裝換用eclipse 3.3就出現了以下錯誤:

not found: File4.fx
compile thread: Thread[AWT-EventQueue-0,6,main]
compile 0.0
init: 0.141

恩.....奇怪.......
反編(jad很好用,加上還有eclipse外掛)之後,大概看了原始碼知道了在執行fx檔案時的做法是用getClassLoader( ).getResource( ) 方式執行的,所以八成是classpath的問題,浪費的點時間來try-error果然解決了,以下提供各位參考:
1. 在eclipse中執行fx前打開的Run Dialog,在新建一個java fx configuration後切換到classpath頁籤,點選user entries節點,然後按下右邊的Advanced..按鈕,接著選add folders按下ok後,選取在你專案中fx檔案所在目錄後按下OK!
2. 接著,就沒有啥要注意了,按下Apply後,按下Run,瞧......問題就解決了.....

懶的看步驟說明,就看上圖的步驟,一目了然囉............

--------------------------------------------------------------------------------------------
I've found a new toy - Java FX eclipse plugin, and I installed it. As the previous article (Java FX in Eclipse) mentioned that there's someone have made some movie clips to introduce how to install and run your first java fx application in eclipse.
The last time I installed and run the plugin successfully. But when I install it again in eclipse 3.3,I got some problem like following:


not found: File4.fx
compile thread: Thread[AWT-EventQueue-0,6,main]
compile 0.0
init: 0.141

oh,it's really strange..

After I decomplie the related classes in javafx jar files(by using jad), and I realized that
it loads the fx file by using getClassLoader( ).getResource( ) . So, I guess there's something wrong with my classpath. So,let's have try-error to find the answer to resolve the problem. Although it takes time ,finally I found the method let fx runs successfully:

1. before running fx file, open the Run Dialog in eclipse,make a new Java FX app configuration,
and then go to the classpath tab,click the user entries node,and click the Advanced.. button,
select add folders,ok.

2. Then ,these is nothing to do additionally. Just click Apply and Run button,and the problem
will not a problem any more.


you can setup your configuration by following steps in up picture.

JAVA FX 基礎

  1. 分兩大部分:
    1. Java FX script
      • 靜態宣告式script語言
    2. Java FX Mobile
      • 用來開發應用於可攜裝置的平台
  2. 4個基本型別:
    1. String (java.lang.String)
    2. Boolean (java.lang.Boolean)
    3. Number (java.lang.Number)
    4. Integer (java.lang.BigInteger,byte, short, int, long)
      宣告方法: var varName:typeName=value;
      var varName:typeName=[itemval1,itemval2,itemval3];
  3. 邏輯運算子
    Java JavaFX
    && and
    || or
    ! not
  4. 在fx檔將變數寫到std out:

    import java.lang.System;
    var i:Integer=10;
    var str:String="String ddd";
    System.out.println("Hello {i} {str}");
  5. 宣告變數其尾(=號前)可指定下列符號,以限定其集合限制:
    1. ? 選擇性,可為null(零或一個元數)
    2. + 一或多個元素
    3. * 零或多個元素
      Ex.        var nums:Number* = [5, 9, 13];

  6. 字串可包於單引號或雙引號間。
  7. 若要串接字串,相較於java使用+號,java fx在字串中使用大括號,如下:

    var name="mark";
    var title="Manager";
    var complete_name="{title} {name}";

  8. 在上面的大括號也可以是判斷式,如下:

    var truth="1>2 is {if 1>2 then "true" else "false" }";

    這種情況下雙引號內有雙引號,是允許的。(相較java不可)
  9. java fx陣列代表一串物件,但陣列本身不是物件。
  10. sizeof varName 可用來取得varName陣列的包含元素數目。
  11. 宣告1到100整數陣列:
    var myint:Integer=[1..100];
  12. 陣列操作語法: insert、delete、select 、foreach
    1. insert
      var ints=[1,2,3];
      insert 20 into ints; //[1,2,3,20]
      insert 30 as first into ints; //[30,1,2,3,20]
      insert [100,200] as last into ints; //[30,1,2,3,20,100,200]
      insert 99 before ints[.==2]; //[30,1,99,2,3,20,100,200]
      insert 88 after ints[5]; //[30,1,99,2,3,88,20,100,200]
    2. delete
      var ints=[1,2,3,4,5];
      delete ints[.==3]; //[1,2,4,5]
      delete ints[.>3]; //[1,2]
      delete ints; //[ ]
    3. select
      var s:Integer*= select n+n from n in [1,2,3]; //[2,4,6]
      var s2:Integer*=select n from n in [1,2,3,4,5,6] where (n%2==0); //[2,4,6]
      var s3:Integer*=select n*m from n in [1,2],m in[3,4] ; //[3,4,6,8]
    4. foreach
      var s:Integer*= foreach(n in [1,2],m in [3,4]) n*m;
  13. 跳脫java fx關鍵字,將關鍵字放在<< 和 >>之間。
  14. class宣告:
    1. 包含有attribute、function、operation
    2. 可extends多個class
    3. 範例:(from Learning JavaFX Script, Part 1: An Introduction to JavaFX Script for Java Programmers)

      class Person {

      attribute name: String;
      attribute parent: Person;
      attribute children: Person*;

      function getFamilyIncome(): Number;
      function getNumberOfChildren(): Number;

      operation marry(spouse: Person): Boolean;
      }

  15. 使用物件:

    1. import java.lang.System;

      class X {
      attribute a: Number;
      attribute b: Number;
      }

      attribute X.a = 10;
      attribute X.b = -1;

      var x = new X();
      var myXClass = X {
      a: 10
      b: -1
      };

    2. import java.util.Date;
      import java.lang.System;

      var date1 = new Date(95, 4, 23); // call a Java constructor
      var date2 = Date { // create the same date as an object literal
      month: 4
      date: 23
      year: 95
      };

      System.out.println(date1 == date2); // prints true
  16. 大不同:java fx的function和operation主體都在class定義之外。

    1. operation Person.marry(spouse: Person): Boolean {
      // Body of operation
      }
    2. class定義中一定要有參數和回傳類型,但在class定義外的function或operation主體可省略。
      operation Person.marry() {
      // Body of operation
      }
  17. java fx沒有constructor和setter,取而代之的是使用Trigger:
    (object creation、insert、delete、replace)
    1. objectCreation
      import java.lang.*;
      class X{ attribute serial:Integer*;}
      trigger on new X{ insert [10,20] as last into serial}
      var x=new X();
    2. insert
      import java.lang.*;
      class X{ attribute serial:Integer*;}
      trigger on insert num into X.serial{ System.out.println("hi"); }
      var x = new X();
      insert 12 into x.nums;
    3. delete
      import java.lang.*;
      class X{ attribute serial:Integer*;}
      trigger on delete num from X.serial{ System.out.println("hi"); }
      var x = new X();
      delete x.serial[1];
    4. replace
      import java.lang.*;
      class X{ attribute serial:Integer*;}
      trigger on x.serial[olderVal]=newVal{ System.out.println("hi"); }
      var x = new X();
      delete x.serial[1];
  18. do{}敘述區塊:
    java fx程式是在AWT Event Dispatch Thread (EDT)中執行,而將程式碼放在do區塊中,可使該段程式於背景thread同步執行。
  19. 增進式評估:使用bind。

兩篇JavaFX簡介原文文章(Tow articles introduce JavaFX)

  1. Introduction to JavaFX Script (Oreilly ONJava)

  2. Learning JavaFX Script, Part 1: An Introduction to JavaFX Script for Java Programmers (java.sun.com)

2007年7月31日 星期二

Java Script 經典封裝

恩... 這篇跟JAVA沒什麼關係,但對寫web app的人或許多少有用.....

就是一些滿炫目的JavaScript程式:

Java Script 經典封裝

(文源自於 PCOnline)
拿來套用還滿方便的,站在巨人的肩膀上....

2007年7月27日 星期五

POI筆記:關於建立comment時,由HSSFSheet取得的HSSFPatriarch

當我們要使用POI HSSF在xls檔裡寫comments,第一步就是要取的容器HSSFPatriarch。
但每個HSSFSheet只能有一個HSSFPatriarch,如果你仔細看HSSFSheet的java doc就能發現其 createDrawingPatriarch()方法:
Creates the toplevel drawing patriarch. This will have the effect of removing any existing drawings on this sheet.
意思就是說在同一張sheet上若重複呼叫這個方法,則之前的所有圖形(comment註解也算是)都會被移掉。所以說囉 ,每個sheet只要呼叫一次就好了,不然就會只有最後一個圖形會存在囉,其他的就都被移掉了....

找了好久才知道的...................

POI筆記:比較將輸出XLS裡面的HSSFCellStyle是否相同

在使用POI HSSF輸出excel xls檔時,不管要設定儲存格的字型、底色、數字格式等,都需要透過HSSFCellStyle的使用,但當我們在程式將Workbook寫出成xls檔之前,若要判別某個cell的style和另一個cell的style是否相同時,可不能直接使用
(hssfCell1.getStyle()==hssfCell2.getStyle())


(hssfCell1.getStyle().equals(hssfCell2.getStyle()))

來做判斷喔! (這樣判斷有時會相等有時又不相等,完全取決於實做程式的判斷,所以不是正確用法)

正確的用法應該是要比較style的index值:
(hssfCell1.getStyle().getIndex()==hssfCell2.getStyle().getIndex()) 

來做比較才對喔!!

咦~~ 愛注意......

2007年7月24日 星期二

Resin Eclipse WTP 外掛 [Resin Eclipse WTP plugin]

雖然lomboz內建支援的Servlet Container眾多,但還是有遺珠之憾,如果工作上必要的container不在支援之列,便要尋找適合的plugin。
Resin便是其中之一。

網海遍尋許久,終於在Gunnar’s Weblog 找到了能和lomboz完美整合的外掛。
這是由Gunnar自己所寫的外掛,非常感激~~

關於介紹及安裝方法,可參照Gunnar的網頁,如果你用eclipse3.3可用eclipse的線上更新機制,至於線上更新的網址也在Gunnar的網頁中可找到。
而如果你的eclipse是3.2版(現在的最新穩定版本lomboz即是eclipse3.2),在Gunnar的網頁上The old version is still available here下載到。

由於我所使用為resin3.10 pro版,有些內附lib的jar檔案和plugin jar內的resin.serverdef不同故做了小小的修正:
在此提供連結分享給各位。
如果對各位有幫助的話,請不用謝我,麻煩請寫信謝Gunnar。(他應該只看的懂英文)

-------------------------------------------------------------------------------------------
Although there are many servlet containers be supported in lomboz, but some were not.
If the container which you will work with ,you'll need to find a plug-in.
Resin is one of them.

By searching over the net, I found a good plugin on Gunnar’s Weblog at last.
This plug-in was wrote by Gunnar himself. Thanks to him.

The introduction and installation guide about this plug-in could be found on the same Gunnar’s Weblog page.
If you are using Eclipse 3.3, you could install plugin inside eclipse through Gunnar's update site.
And if you are using Eclipse3.2(like the lomboz 3.2.2), you should the old version of plug-in. It can found on the same page.

Because I'm using resin 3.10 pro,some jar files in resin's lib directory is not the same with resin.serverdef in plugin's jar file.
So, I made a little modification to it.
If you are using the same version of resin with me, you could download the plug-in here.

If this article give helps to you , Please say thanks to Gunnar through e-mail.

為何要避免在JSP中處理二元串流?

故事起源於我要使用POI輸出報表,原有的報表乃是用JSP+ jsp custom tag來產生的。

當然用POI輸出XLS檔,使用Servlet當然是首選,這在網路上許多前輩也常提,但總不是很深切的了解為何?

由於許多報表運算邏輯都放在custom tag裡,故愚笨的我選擇為了能共用tag所以在JSP中配合custom tag和script let來產生XLS檔,但前前後後遇到了不少問題。

在單純的JSP(不包含EL及custom tag狀況)中,來處理要輸出的Stream若遇到狀況,似乎還不難解決,但若JSP中包含了custom tag就複雜多了,況且有些問題再script let強加補強就算能用,移到了別的container還是有不能跑的可能,這涉及到各個container將JSP轉譯java servlet的實做程式不同。

首先是JSP buffer的問題,我們知道當JSP寫到Response的資料到達buffer值時即會flush到客戶端去(假設autoFlush=true),每個container預設的JSP buffer size不同。
然而在JSP裡要將二元資料寫到串流前,通常都要將先前JSP轉譯成java後裡頭的out.print(" \t\n");之類的東西清掉,才不會在資料頭出現奇奇怪怪的東西,所需要使用out.clear() 之類的做清除的動作,但如果在執行out.clear()之前buffer就已經被flush過了,那麼就會IOException,不要的out.print(" \t\n");也早就被輸出了,為了這個問題,可以透過JSP的Directive來將buffer設大點,暫時解決。

第二,在我的JSP最後段是workbook.write(response.getOutputStream); response.flush(); 但在Tomcat中執行,出現了錯誤,由於Tomcat算是廣為使用,到處有人可問,所以不用一天的時間我就早到了解決方法,在我的JSP最後再加上 out=response.pushBody( );就解決了。打開java檔查看乃是Tomcat的實作在jsp頁面後會再對out做處理,但我們提前將整個response給flush掉了,所以只要再push一個新的JspWriter給out就能解決了。

第三,當程式移植到了Resin時,問題就來的,輸出的Excel檔會是一堆空白,然後再活頁簿往下拉發現許多亂碼。同樣的我們將該JSP頁面經由Resin轉譯成的servlet來觀察問題所在,發現Resin實做會將每個TagSupport的endTag()後方加上out.flush( );[相對Tomcat沒有],故會在之前就輸出許多的空白和escape character,為了解決這個問題,於是將custom tag由TagSupport改用BodyTagSupport來實做,並且在JSP頁面上每一個custom tag結尾加上pageContext.clear( );
,恩,又是暫時解決!!

第四,程式到了另一個或許你也沒聽過的container - Novell Silver Stream,好玩,輸出的XLS完全空白,同樣觀察java檔,然而,到現在對於這問題還是一無所獲!! 無法解決......


上面寫了這麼大串,或許那都不重要,但我卻真正體會不要再JSP中處理Stream的意義了!!
恩... 好樣,最後還是要用servlet寫...........................
( 哭 ) 浪費我好多時間阿...................................................

2007年7月22日 星期日

CSS中文參考文件 - 淺顯易懂

Cascading Style Sheets (串接樣式表)的基本介紹

VPN連線同時不能上網 ...... 鬼屁!!

恩... 好樣的... 哪管是換了幾百個工作,只要還在科技產業,加班是必免不了的!!

大公司、小公司 都一樣,不一樣的是,大公司有網管,精心準備好了VPN,不用勞路奔波,在家就可以加班了,這樣至少「Ki Mo tzi」還會好點!

連上了VPN後,乖乖,其他網站都開不了囉!連我的Flash Get也都滿江紅了! 根本是完全斷線了!
我的電腦躲在IP分享器後,經由HI Net ADSL上線,不知其他人是否也有相同問題,難道是神要我專心一意的工作,(別想邊工作邊Shopping),恩..謝謝保佑,但這不合乎人性。

搜尋了網路(Google似乎成為我所有問題第一個想問的),就在某論壇的某大大(這是別人的稱呼,我倒不大習慣,假...)貢獻(我不認識你,但是謝謝你),關鍵的設定正如下圖:


步驟都在上面的,就不用多說了吧!!

站在大大的肩膀上,成為別人的大大!!

2007年7月18日 星期三

JSP中 關於IE6開啟附件時的問題(A problem about direct open excel file from IE won't woks)

故事是這樣的:
工作上使用POI將資料寫出讓user下載,當Excel寫出response後,IE會提示使用者「開啟」或是「儲存」檔案,問題就在於使用者按下儲存正常順利,但若按下開啟,便會出現如下圖示:


好笑的是,用FireFox不會,聽說用IE7也不會,那麼算是IE6的Bug囉!!

又跑去Google神殿拜神,滿地的預測籤詩讓我找到了答案。

以下是我的原始JSP程式:




<%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%>
<%@page import="org.apache.poi.hssf.usermodel.*,org.apache.poi.hssf.util.*,java.io.*" autoFlush="true" buffer="10240kb"%>
<%@taglib uri="report" prefix="report" %>
<%

response.setHeader( "Content-disposition" , "attachment; filename=ProjectScorecardReport.xls" );
response.setContentType("application/vnd.ms-excel");
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);


HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("MajorScorecardYearReport");

//..... more here

wb.write(response.getOutputStream());
response.flushBuffer();
out.clear();
out = pageContext.pushBody();
%>



而我找到的答案告訴我,要解決這bug非常簡單,只要多設幾個http header即可:

response.setDateHeader("Expires", 0);
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "max-age=0");

把這三行程式加入後,果然成功了!
不管PHP或ASP或其他CGI語言,都可用相同方法設定Header即可解決,因為問題出在IE!

================================================================

It's a short story:
I need to export reports to Excel xls files by using POI library in my JSP page.
When everything went on well, there was some problem when user who was using IE6 will get an error message when they directly opened XLS file, like thihs:
And it won't appear if the user's browser is FireFox or IE7. So,it is a bug of IE6 baldly.

After searching through Google,I got a useful solution to solve this bug.

Below is my original JSP file:




<%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%>
<%@page import="org.apache.poi.hssf.usermodel.*,org.apache.poi.hssf.util.*,java.io.*" autoFlush="true" buffer="10240kb"%>
<%@taglib uri="report" prefix="report" %>
<%

response.setHeader( "Content-disposition" , "attachment; filename=ProjectScorecardReport.xls" );
response.setContentType("application/vnd.ms-excel");
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);


HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("MajorScorecardYearReport");

//..... more here

wb.write(response.getOutputStream());
response.flushBuffer();
out.clear();
out = pageContext.pushBody();
%>


It's really simple to solve this bug , you just need to add three lines of code to set related http headers:

response.setDateHeader("Expires", 0);
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "max-age=0");

After Adding these codes , It works well without any problem.
And you can use the same method to set these three header to resolve the problem in PHP or ASP. Because this problem is a Bug of IE6.

2007年7月12日 星期四

筆記:Jakarta HttpClient library (Notes: Jakarta HttpClient library)

  1. 需要四個Jar檔:
    • commons-httpclient.jar
    • commons-lang.jar
    • commons-logging.jar
    • commons-codec.jar
  2. 簡單範例:

    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.methods.GetMethod;

    public class test{
    public static void main(String[] args)
    {
    try{
    HttpClient client=new HttpClient();
    GetMethod method=new GetMethod("http://www.hinet.net");
    int resultCode=client.executeMethod(method);
    if(resultCode==200)
    System.out.println(method.getResponseAsString());
    }catch(Exception e)
    {}
    }
    }
  3. HttpClient類別依賴
    • HttpConnectionManager介面
      • SimpleHttpConnectionManager
      • MultithreadedConnectionManager:需要同時做多個連結,預設連線pool是每個host有兩個,可調整最大數為20
    • HttpClientParams類別
  4. HttpMethod-->HttpMethodBase --> GetMethod、PostMethod等。(位於org.apache.commons.httpclient.methods)
  5. org.apache.commons.httpclient.auth.AuthScheme的實作有:
    • BasicScheme
    • DigestScheme
    • NTLMScheme
  6. AuthState:
    • 提供authentication處理狀態
    • 更換authentication scheme
  7. AuthPolicy
  8. CredentialsProvider:
    • 用來向使用者要求憑證
  9. AuthChallengeParser、AuthChallengeProcessor:
    • 在authentication處理中解析response header
    • 處理在header中的盤問(challenge)
  10. authendication處理相關Exception:
    • AuthChallengeException
    • MalformedChallengeException
    • InvalidCredentialsException
    • CredentialsNotAvaliableException
  11. org.apache.commons.httpclient.cookie package裡包含用來處理在HttpClient物件裡heder的cookie。
  12. org.apache.commons.httpclient.params裡包含有許多HttpClient重要物件的參數,比如說HttpClientParams就是用來設定HttpClient類別物件的類別。
  13. 以下程式碼,可將送出的request中header的browser資訊修改掉:

    HttpClient client=new HttpClient();
    client.getParams().setParameter("http.useragent", "java browser");

  14. 用GetMethod取回GIF圖檔:


  15. import java.io.FileOutputStream;

    import org.apache.commons.httpclient.HostConfiguration;
    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.URI;
    import org.apache.commons.httpclient.methods.GetMethod;
    import org.apache.commons.httpclient.protocol.Protocol;


    public class test {


    public static void main(String[] args) {
    try {
    HttpClient client=new HttpClient();
    client.getParams().setParameter("http.useragent", "java browser");
    GetMethod method=new GetMethod();
    method.setURI(new URI("http://tw.yimg.com/i/tw/dictionary/masthead_logo.gif"));
    HostConfiguration hostConfig=new HostConfiguration();
    hostConfig.setHost("tw.yimg.com",null,80,Protocol.getProtocol("http"));
    int result=client.executeMethod(hostConfig,method);
    System.out.printf("result code=%d",result);
    byte[] gif=method.getResponseBody();
    FileOutputStream fos=new FileOutputStream("c:\\image.gif");
    fos.write(gif);
    fos.close();
    } catch (Exception e) {
    // TODO: handle exception
    }


    }

    }

    在這個範例程式,如果要抓下來的圖檔很大,可以用method.getResponseBodyAsStream()取得InputStream後直接寫入檔案,就不用放在記憶體中了。
  16. 上面都是用GetMethod執行,可改用PostMethod,而原本給GetMethod的建構子或setUrl方法的字串中的參數,可用PostMethod物件的addParameter( )即可。
  17. 若要以HttpClient做上傳資料動作,可改用MultiPartMethod物件。
  18. PutMethod主要用來把檔案放上server,DeleteMethod則相反。
  19. HttpClient預設使用SimpleHttpConnectionManager,若需同時發出多個作業,要改用MultiThreadedHttpConnectionManager。
  20. multiThread範例:

    import java.io.BufferedOutputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;

    import org.apache.commons.httpclient.HttpClient;
    import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
    import org.apache.commons.httpclient.methods.GetMethod;
    import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
    import org.apache.commons.httpclient.params.HttpConnectionParams;


    public class MultiThread extends Thread {

    private HttpClient client;
    private GetMethod method;

    public MultiThread(HttpClient client,GetMethod method)
    {
    this.client=client;
    this.method=method;
    }

    public static void main(String[] args) {
    MultiThreadedHttpConnectionManager mcm=new MultiThreadedHttpConnectionManager();
    HttpConnectionManagerParams params=new HttpConnectionManagerParams();
    params.setDefaultMaxConnectionsPerHost(10);
    mcm.setParams(params);

    HttpClient client=new HttpClient(mcm);
    GetMethod method1=new GetMethod("http://www.sun.com/images/l2/l2_phone_pda.gif");
    GetMethod method2=new GetMethod("http://www.sun.com/images/l2/l2_swingap.gif");
    GetMethod method3=new GetMethod("http://java.sun.com/javase/images/dukejdk6_100x88.gif");

    new MultiThread(client,method1).start();
    new MultiThread(client,method2).start();
    new MultiThread(client,method3).start();
    }

    @Override
    public void run() {
    try{
    client.executeMethod(method);

    String filePath="c:\\"+method.getURI().getName();
    InputStream input=method.getResponseBodyAsStream();
    BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream(filePath));
    int data;
    while((data=input.read())>=0)
    bos.write(data);

    input.close();
    bos.close();

    }catch(Exception e)
    {
    System.out.println(e);
    }
    }

    }

  21. HttpClient支援NTLM、Digest、Basic三種authentication。
  22. authentication範例1

    import org.apache.commons.httpclient.*;
    import org.apache.commons.httpclient.auth.*;
    import org.apache.commons.httpclient.method.*;

    public class authExam{
    public static void main(String[] args) throws Exception{
    HttpClient client=new HttpClient();
    HostConfiguration host=client.getHostConfiguration();
    host.setHost(new URI("http://localhost:8080",true));

    GetMethod method=new GetMethod("protectedArea/protect.jsp");
    try{
    int code=client.executeMethod(host,method);
    if (code==HttpStatus.SC_UNAUTHORIZED)
    {
    Crenditals cred=new UsernamePasswordCrenditals("tomcat","tomcat");
    AuthScope scope=new AuthScope(host.getHost(),host.getPort());
    client.getState().setCrentials(scope,cred);
    client.executeMethod(host,method);
    }
    }catch(Exception e){}
    }
    }
  23. authentication 範例2

    public class authExam2{
    public static void main(String args[]) throws Exception
    {
    HttpClient client=new HttpClient();
    HostConfiguration host=client.getHostConfiguration();
    host.setHost(new URI("http://localhost:8080",true));

    Credentials cre=new UsernamePasswordCredential("tomcat","tomcat");
    AuthoScope scope=new AuthScope(host.getHost(),host.getPort());
    client.getState().setCredentials(scope,cre);

    try{
    client.executeMethod(new GetMethod("http://localhost/protectedArea");)
    }
    catch(Exception e){}
    }
    }
  24. 讀取Cookie
    client.getState( ).getCookies( );

2007年7月4日 星期三

Java存取MS Office檔案格式函式庫Apache POI (Java library for Accessing MS Office format files)

Java存取MS Office檔案格式函式庫Apache POI
(Java library for Accessing MS Office format files)

最常被用來存取Excel XLS檔案,
此外還有提供對Word及power point及visio檔案格式有限的存取,
請見官方網站
使用文件可在此取得。(建議閱讀)

Normally used for accessing Excel XLS files,
and have the limited ability to access Word,power point and visio files,
see Official Site here
and documents here

2007年7月3日 星期二

製作網頁超實用的[色碼表] (Color code table for HTML Design)

製作網頁超實用的[色碼表]
(Color code table for HTML Design)

在這裡,寫web application時很實用的...
(Press Here)


----------------------------------------
When you designing web pages, it is banausic having such a color table for look up by hand.

The Link is Here

2007年6月22日 星期五

Java FX in Eclipse

http://www.thescreencast.com/2007/05/running-your-first-javafx-program-in.html
推薦上面連結,介紹安裝java FX的eclipse plugin,還有基本使用方式。
是Flash 影片動態展示的喔!


-------------------------------------------------------------------------------------
The following Link is a blog containing demonstration video
about installing and basic usage of Java FX Eclipse plugin,
and the video is flash video format!

http://www.thescreencast.com/2007/05/running-your-first-javafx-program-in.html

2007年6月20日 星期三

Tomcat 6.0 Document中譯[2.建置]

[原文請見: http://tomcat.apache.org/tomcat-6.0-doc/setup.html]
[此中譯版本僅提供參考,請勿用於商業用途]


前言

此文件介紹在不同平台建置Tomcat的數種方式。請注意有些進階的建置議題位包含於此:完整套件(ZIP 檔案或tarball)包含一個名為RUNNINT.txt的檔案裡頭討論到這些進階的議題。如果您在下列資訊找不到答案,我們鼓勵您可以參考看看這個檔案。
Windows
在Windows可以使用Windows Installer很簡單的安裝好Tomcat。它的介面和運作叫好似精靈式的installer,只要填些重要的項目即可完成。



  • 安裝成一個「服務」: 不管選擇什麼安裝選項,Tomcat都將被安裝成一項 Windows NT/2k/XP的服務. 使用元件頁面上的核選框將服務設定成「自動」啟動,Tomcat就會在Windows啟動時自動啟用了。基於安全考量, 這項服務應該以擁有較少權限的獨立使用者身份執行 (請參閱Windows服務管理工具和其文件).

  • Java 位置: 這個installer將會使用系統登錄或是 JAVA_HOME環境變數來取得J2SE 5 JRE的路徑。

  • 系統匣圖示:當Tomcat以服務執行時, 不會有任何系統匣圖示。注意當選則在安裝結束後運行Tomcat,即使Tomcat以服務形式運作,系統匣圖示將會被使用。

  • 請參閱Windows服務 HOW-TO 得知如何管理以Windows NT形式運作的Tomcat

Installer將會建立允許及組態Tomcat的捷徑 。記得, Tomcat administration web application只有再Tomcat開著時才能運作。


Unix deamon


Tomcat藉由來在commons-daemon專案的jsvc工作,可以以daemon型式運作。jsvc原始碼tarball 已經包含在Tomcat的二進格式套裝裡面, 需要自行編譯。編譯jsvc 需要一個C ANSI 編譯器(像是 GCC), GNU Autoconf, and a JDK.


運行這個指令稿(script)前,JAVA_HOME 環境變數應該正確設置 JDK目錄。或者你也可以在呼叫 ./configure 指令稿時, 使用--with-java參數來指定JDK的目錄。像是這樣


./configure --with-java=/usr/java.


使用以下的命令就可以編譯好jsvc二進程式,編譯好的檔案位於 $CATALINA_HOME/bin 目錄。這裡會用到 GNU TAR ,CATALINA_HOME代表指向TOMCAT安裝目錄的環境變數。


請注意,在BSD系統上你應該使用GNU make(gmake)取代BSD原生的make。


從Jakarta Commons網站下載commons-daemon二進位套件 ,,jsvc.tar.gz 及 commons-daemon.jar放在$CATALINA_HOME/bin 目錄。
















    cd $CATALINA_HOME/bin

tar xvfz jsvc.tar.gz

cd jsvc-src

autoconf

./configure

make

cp jsvc ..

cd ..


Tomcat接著就可以使用下列指令以daemon型式執行。
















    cd $CATALINA_HOME

./bin/jsvc -cp ./bin/bootstrap.jar \

-outfile ./logs/catalina.out -errfile ./logs/catalina.err \

org.apache.catalina.startup.Bootstrap


jsvc 還有其他有用的參數,如-user能在daemon起始完成後切換到另一使用者帳號。這樣做的話可以以較少權限的使用者運行Tomcat同時還可以使用有權限的埠。 jsvc --help 將會得到完整的 jsvc使用資訊。還有一項比較特別,-debug 選項在運行jsvc時除錯很有用。


$CATALINA_HOME/bin/jsvc/native/tomcat.sh 這個檔案可以當作能在從/etc/init.d開機時自動啟動Tomcat的樣板檔。這個檔案是為Tomcat 4.1.x寫的,所以說需要對其修改,並將類別名稱BootstrapService改成Bootstrap


記得要將Commons-Daemon JAR檔案放在你的執行環境 這樣才能執行Tomcat。. Commons-Daemon JAR 檔案路徑在bootstrap.jar manifest的Class-Path那行,如果你遇到關於Commons-Daemon 類別ClassNotFoundException或是NoClassDefFoundError ,啟動jsvc時將Commons-Daemon JAR檔路徑放在-cp 參數裡。




Tomcat 6.0 Document中譯[1.簡介]

[原文請見: http://tomcat.apache.org/tomcat-6.0-doc/introduction.html]
[此中譯版本僅提供參考,請勿用於商業用途]

簡介
不管是系統管理員或是開發人員,在開始之前有些重要的資訊你必須要了解與熟悉。這份文件對於Tomcat容器的觀念及專有術語做了有用的介紹。比如說,當你需要幫助時,要到哪尋求協助等。
專有名詞
往後在閱讀這份文件,你將接觸到一些專有名詞。有些是Tomcat特有的,有些則是Servlet及JSP規格所定義的。
  • Context - 概括的說就是Web application
  • 專有名詞1 - 意義
  • 專有名詞2 - 意義
目錄及檔案
遍及整份文件,你會注意到有一堆參考$CATALINA_HOME變數。這個環境變數代表的是你安裝Tomcat的根目錄。
「這些資訊可在你的
$CATALINA_HOME/README.txt 檔案找到」代表的是請您找找您安裝的Tomcat跟目錄下的README.txt檔案。

還有一些主要與
$CATALINA_HOME有關聯的目錄:
  • /bin - 啟動、關閉和其他的指令稿(scripts)。*.sh 檔案(Unix系統) 的功能和同檔名的 *.bat files (Windows系統)相同。因為Win32 命令列模式缺少某些功能,所以有些而外的檔案在裡面。
  • /conf - 組態檔和相關的DTD。這裡最重要的檔案就是 server.xml。它是容器主要的組態檔。
  • /logs - 預設的日誌紀錄檔都擺在這裡。
  • /webapps - 這就是你放你的Web application的地方。

組態Tomcat
這節將介紹你組態容器的基本資訊。
所有在組態檔裡面的資訊都再啟動時被讀取,這代表所有對於組態檔的變更,都需要重新啟動容器。
哪裡尋求協助
當我們盡吾所能的使這份文件清楚易讀,我們可能還是會有些遺漏。下面提供一些網站及郵件列表,當你遇到問題時可尋得協助。
Tomcat6是新版本的Tomcat,請記得有些問題和解節方法可能因版本而異(現有主要為4.x及5.x版)。當你搜尋網站時,有些文件並不適用於Tomcat 6, 但可能能用於3.x, 4.x and 5.x版。用3.x及4.x版的方法對6版可能無法正常運作,主要在於server.xml檔案差異甚大。

  • 現行版文件 - 大部分的文件將列出可能潛在的問題。確切完整的閱讀相關文件將會節省你相當多的時間與力氣。別始終總是遍地的搜尋網路只為找出你要的某個答案。
  • 開發者所維護的Tomcat FAQ
  • Tomcat WIKI
  • jGuru
  • Tomcat郵件列表存檔 - 許多網站庫存有Tomcat 郵件列表. 因為這相連結經常換位置,所以請按這 Google到google搜尋
  • TOMCAT-USER 郵件列表, 可在這裡訂閱. 如果你得不到答覆,那麼有很有可能你的問題已經在在庫存的列表或其他FAQ有人回答過了。 雖然關於一般性的web application開發的問題 常被提問與答覆, 但請把焦點放在Tomcat特定的議題.
  • TOMCAT-DEV 郵件列表, 你可以在 這裡訂閱. 這個列表保留給開發Tomcat的討論使用. 關於Tomcat配置以及開發及運作tomcat時遇到的問題比較適合在TOMCAT-USER 列表內提問

最後,如果你認為有什麼應該要被包含近文件內,請在TOMCAT-DEV讓我們知道,或是寄封e-mail給文件的作者。

2007年6月18日 星期一

筆記:JSF

JSF下載網址:https://javaserverfaces.dev.java.net/

1. 架構概觀:


  • FaceServlet (javax.faces.webapp.faceServlet)

  • FaceContext (FaceServlet生成,裏頭包含了ServletContext、ServletRequest、ServletResponse)

  • LifeCycle (封裝在FaceContext裏頭的JSF請求主要交由LifeCycle經由六階段處理)

2. LifeCycle六階段:


  1. Restore Component Tree

  2. Apply Request

  3. Validation

  4. update Model

  5. Invoke application

  6. render response

參考圖片from IBM


從上圖可看到中間四個紅色的階段,代表這四個階段可產生事件,以進行處理。

3. JSF配置檔faces-config.xml:
  • JavaBean

  • Navigation

4. JSF支援兩種EVENT:
  • ActionEvent

  • ValueChangeEvent

5. 使用JSF所需jar:
  1. jsf-api.jar

  2. jsf-impl.jar

  3. jstl.jar

  4. standard.jar

  5. commons-beanutils.jar

  6. commons-digester.jar

  7. commons-logging.jar
若是JSF1.2版,則只要前四項,後面的3項commons已經包在jsf-impl.jar的com.sun.org.apache.commons套件中了。

6. JSF的JSP頁面引入自訂標籤庫:
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

7. 所有的JSF標籤都要包在 <f:view>之間

8. JSF的HTML標籤包含四大類
  1. UIForm

  2. UIInput

  3. UIOutput

  4. UICommand

9. JSF Core核心標籤與事件有關的標籤:
  1. <f:actionListener>

  2. <f:valueChangeListener>

  3. <f:phaseListener>

10. 上列type為class的完整名稱,該類別必須實做javax.faces.event.AcionListener。
同的如果違valueChangeListenre則必須實做javax.faces.event.ValueChangeListener。

11.四個核心validator標籤

  1. <f:validator>

  2. <f:validateLength>

  3. <f:validateDoubleRange>

  4. <f:validateLongRange>

12.JSF API 介面:
  • javax.faces:

    • FactoryFinder:用來找所有JSF API裡指定的Factory,不會直接使用該類別

    • FacesException: RuntimeException的子類別,常會在我們JSF程式裡面throw該類實例


  • javax.faces.aplication:

    • NavigationHandler:處理頁面導覽。

    • Application:類似jsp裡的application,每個web application中只有一個,提供存放一些支援JSF的物件(如NavigationHandler)


  • javax.faces.component: 包含JSF標準UI組件的介面和類別

    • UIComponent:所有UI組件皆實做UIComponent


  • javax.faces.context:

    • FaceContext: 封裝了ServletContext、ServletRequest、ServletResponse等物件。

    • FaceContextFactory: 負責FaceContext物件的生成。

    • ExternalContext: 可用來取得ServletContext、ServletRequest、ServletResponse等物件。


  • javax.faces.convert: 包含了一堆轉換器的介面及類別

    • Converter: 所有自訂的轉換器都要實做Converter

    • ConverterException: 轉換錯誤時 ,要拋出這個例外


  • javax.faces.el: 包含用於處理JSF Expression language的類別及介面

    • ValueBinding: 相當重要,常在我們的JSF程式中使用,用來在程式中存取某個字串代表的EL


  • javax.faces.event: 事件處理所需的介面及類別

    • ActionEvent

    • ValueChangeEvent

    • FacesListener: 介面,被ActionListener及ValueChangeListener實做

    • ActionListener

    • ValueChangeListener

    • PhaseId: 包含了數個常數代表LifeCycle的六個階段,FacesListener有一個getPhaseId( )方法傳回的PhaseId將會指明這個Listener要在哪階段被使用

    • AbortProcessingException: 用來中斷當前事件處理


  • javax.faces.lifecycle:

    • Lifecycle: 處理JSF請求。

    • LifecycleFactory: 用來生成LifeCycle


  • javax.faces.model: 包含了一些Data Model介面及類別


  • javax.faces.render:

    • Render:負責把UI組件轉換成客戶端特定型式(如html)

    • RenderKit:Render實例的集合

    • RenderKitFactory


  • javax.faces.validator:

    • Valicator:介面

    • LengthValidator

    • LongRangeValidator

    • RequiredValidator

    • DoubleRangeValidator

    • StringRangeValidator


  • javax.faces.webapp

    • FacesServlet

    • UIComponentTag


13.一般不直接接觸ServletContext、ServletRequest、ServletResponse而是使用FaceContext及ExternalContext物件。



14.JSF每個JSP頁面都以一組component tree來表示。


15.JSF內通常不用jsp:useBean來與JavaBean互動,而是將JavaBean定義在facesConfig.xml設定檔內,並透過JSF EL或是ValueBinding類別來存取。



16.FacesContext物件內主要包含:

  1. Tree

  2. ExternalContext

  3. Message Collection

  4. Event object collection

  5. ResponseStream

  6. ResponseWriter

17.取得FacesContext:

  FacesContext fcontext = FacesContext.getCurrentInstance( );


18.取得component tree:

  fcontext.getTree( );

設定component tree:

  fcontext.setTree(TreeO);


19.將訊息推入facesContext物件裡的Message Collection:

  fcontext.addMessage(UIComponentO,MessageO);

取出Message collection裡所有訊息:

  fcontext.getMessages( ) ; ->會傳回Iterator物件

  fcontext.getMessages(UIComponentO);


20.將事件推入Event collection:

  fcontext.addFacesEvent(FacesEventO);

取出所有Event:

  fcontext.getFacesEvents( ) ;



21.取得與設定Locale:

  fcontext.getLocale( );

  fcontext.setLocale(LocaleO);


22.取得ExternalContext:

  fcontext.getExternalContext();

23. 使用ExternalContext取得ServletContext、ServletRequest、ServletResponse、HttpSession
  • eContext.getContext( );
  • eContext.getRequest( );
  • eContext.getResponse( );
  • eContext.getSession(boolean create);

24. 使用ExternalContext取得ServletContext所有Attribute的Name-value Map:
  • eContext.getApplicationMap( );

25. 使用ExternalContext取得session所有Attribute的Name-value Map:
  • eContext.getSessionMap( );

26. 使用ExternalContext取得request所有Attribute的Name-value Map:
  • eContext.getRequestMap( );

27. 使用ExternalContext取得ServletContext起始參數(Init parameter defined in web.xml):
  • eContext.getInitParameter(String name);
  • eContext.getInitParameterMap( ); //所有參數map

28. 使用ExternalContext取得request參數:
  • eContext.getRequestParameterMap( );
  • eContext.getRequestParameterValuesMap( ); //map value為字串陣列
  • eContext.getRequestParameterNames( ); //傳回Iterator

29. 使用ExternalContext取得header參數:
  • eContext.getHeaderMap( );
  • eContext.getHeaderValuesMap( ); //map value為Enumeration
30. 使用ExternalContext取得cookie:
  • eContext.getRequestCookieMap( ); //map value 為Cookie
31. 使用ExternalContext取得瀏覽器送出的Locale:
  • eContext.getRequestLocale( ); // map value為Locale
32. 使用ExternalContext取得當前WebApp名稱、頁面名稱:
  • eContext.getRequestContextPath( ); //傳回 /appName
  • eContext.getRequestPathInfo( ); //傳回 xxx.jsp
33. 使用ExternalContext取得指定網站目錄下的目錄及檔案列表:
  • eContext.getResourcePaths("/pathDir1"); //傳回Set,列出網站跟目錄下的pathDir1目錄下的目錄名及檔名。
34. javax.faces.tree.Tree代表一個component tree。前面有提過可使用FacesContext物件的getTree( )取得。
Tree物件的四個方法:
  1. getTreeId( );
  2. getRoot( );
  3. getRenderKitId( );
  4. setRenderKitId( );

35. 取得Application物件實例:
ApplicationFactory factory = (ApplicationFactory) FactoryFinder.getFactory( FactoryFinder.APPLICATION_FACTORY);
Application app=factory.getApplication( );

36. 使用Application及ValueBinding存取JavaBean:
ValueBinding vb=app.getValueBinding("someBean");
ValueBinding vb2=app.getValueBinding("someBean.someAttribute");

37. ValueBinding物件四個方法:
  1. getType(fContext );
  2. getValue( fContext);
  3. setValue( fContext);
  4. isReadOnly( fContext );

....未完待續



Tomcat 6.0 Document中譯[文件索引]

[原文請見: http://tomcat.apache.org/tomcat-6.0-doc/index.html]
[此中譯版本僅提供參考,請勿用於商業用途]

文件索引
簡介
此頁是
Apache Tomcat Servlet/JSP 容器文件捆包最上層起始點。
Apache Tomcat 6.0實做了 Java Community Process的Servlet 2.5和JavaServer Pages 2.1 規格,而且包含了許多附加的功能,使的Tomcat成為開發和部屬Web Applcation和Web Service的好用平台。
你可從左側的導覽清單沿下找到更詳細的有用文件。愈下層的文件就越詳細。

Apache Tomcat使用手冊
下列文件將協助您下載、安裝Tomcat 6,以及使用許多Tomcat的功能。
  1. 簡介 - 以高端檢視Apache Tomcat的概觀
  2. 建置 - 如何在各式各樣的平台安裝並執行Apache Tomcat
  3. 第一支web application - 簡介Servlet 2.4 Specification內所定義的web application的概念。包含你的web application原始碼樹狀結構的基本組成、web application封裝的結構以及web application部屬描述子 (/WEB-INF/web.xml)的介紹。
  4. 部屬器(Deployer) - 操作Apache Tomcat 部屬器來部屬、先期編譯(precompile)與驗證 web applications。
  5. 管理 - 在Apache Tomcat 仍在運作的情況下,操作管理器(Manager) web應用程式來部屬、卸載、重部屬。
  6. Realms與存取控制 - 描述如何組態 Realms (存放使用者帳號、密碼以及相關角色的資料庫)以供利用容器自管安全(Container Managed Security)的web applications 使用。
  7. 安全管理員 - 組套及使用Java 安全管理員以支援你的web application行為中細密的控制。
  8. JNDI資源 - 在供給各個web application使用的JNDI命名環境(JNDI naming context )組態標準及自訂的資源。
  9. JDBC 資料來源 - 利用DB連線集區(connection pool)組態一個JNDI資料來源。還有許多常用資料庫的範例。
  10. 類別載入- 關於在Tomcat內的類別載入資訊,包含要把你的程式類別放在哪裡才可用。
  11. JSPs - 關於Jasper組態的資訊,好比說JSP編譯使用。
  12. SSL - 安裝及組態SSL支援,好讓您的Apache Tomcat能夠處理使用https協定的請求.
  13. SSI - 在Apache Tomcat中使用伺服端包含。
  14. CGI - 在Apache Tomcat中使用CGI。
  15. 代理支援 - 組態Apache Tomcat能在代理伺服器後面運作 (或者是一個如同代理伺服器運作的網頁伺服器)。
  16. MBean 描述子 - 為自訂元件組態 MBean 描述子(descriptors)檔案 。
  17. 預設Servlet - 組態預設servlet以及自訂檔案列表型式。
  18. Apache Tomcat叢集 - 在Apache Tomcat環境啟用階段覆寫(session replication) 。
  19. 負載平衡- 組態、使用、並擴充負載平衡應用。
  20. 連接器(Connectors) - 連接器是Apache Tomcat和一般網頁伺服器整合的橋樑。
  21. 監控與管理 - 啟用 JMX 遠端支援並使用工具來監控管理Apache Tomcat。
  22. 日誌(Logging) - 組態Apache Tomcat日誌(logging)。
  23. Apache 可移植執行環境(Portable Runtime) - 使用APR提供較好的效能、穩定性,以及與原生伺服器技術有較好的整合。
  24. 虛擬主機(Virtual Hosting) - 在Apache Tomcat組態虛擬主機。
  25. 進階IO - 一般塊狀IO的可用擴充。
  26. 額外組件 - 取得額外可選用的組件。