方法一:
使用java.sql.Date實現在yyyy-mm-dd格式的日期。
java.sql.Date不支持時間格式。切不要使用new java.sql.Date(int year, int month, int date),因為這樣還需要處理時間差問題。
PreparedStatement pstmt = conn.prepareStatement("insert into table1(tdate) values (?)");
java.sql.Date tdate=java.sql.Date.valueOf("2007-04-09");
pstmt.setDate(1,tdate );
pstmt.execute();
方法二:
使用java.sql.Timestamp,同上不要使用new java.sql.Timestamp(...)
PreparedStatement pstmt = conn.prepareStatement("insert into table1 (tdate) values (?)");
java.sql.Timestamp tdate=java.sql.Timestamp.valueOf("2007-04-09 10:50:00");
pstmt.setTimestamp(1,tdate );
pstmt.execute();
方法三:
使用ORACLE的內置函數to_date
PreparedStatement pstmt = conn.prepareStatement("insert into table1 (tdate) values (to_date(?, 'yyyy-mm-dd hh24:mi:ss')");
String buydate="2007-04-09 10:50:00";
pstmt.setString(1,buydate );
pstmt.execute();
理解類的實現機制
在JavaScript中可以使用function關鍵字來定義一個“類”,如何為類添加成員。在函數內通過this指針引用的變量或者方法都會成為類的成員,例如:
function class1(){
var s="abc";
this.p1=s;
this.method1=function(){
alert("this is a test method");
}
}
var obj1=new class1();
通過new class1()獲得對象obj1,對象obj1便自動獲得了屬性p1和方法method1。
在JavaScript中,function本身的定義就是類的構造函數,結合前面介紹過的對象的性質
以及new操作符的用法,下面介紹使用new創建對象的過程。
(1) 當解釋器遇到new操作符時便創建一個空對象;
(2) 開始運行class1這個函數,并將其中的this指針都指向這個新建的對象;
(3) 因為當給對象不存在的屬性賦值時,解釋器就會為對象創建該屬性,例如在class1中,當執行到this.p1=s這條語句時,就會添加一個屬性p1,并把變量s的值賦給它,這樣函數執行就是初始化這個對象的過程,即實現構造函數的作用;
(4) 當函數執行完后,new操作符就返回初始化后的對象。
通過這整個過程,JavaScript中就實現了面向對象的基本機制。由此可見,在JavaScript中,function的定義實際上就是實現一個對象的構造器,是通過函數來完成的。這種方式的缺點是:
□將所有的初始化語句、成員定義都放到一起,代碼邏輯不夠清晰,不易實現復雜的功能。
□每創建一個類的實例,都要執行一次構造函數。構造函數中定義的屬性和方法總被重復的創建,例如:
this.method1=function(){
alert("this is a test method");
}
這里的method1每創建一個class1的實例,都會被創建一次,造成了內存的浪費。下一節介紹另一種類定義的機制:prototype對象,可以解決構造函數中定義類成員帶來的缺點。
使用prototype對象定義類成員
上一節介紹了類的實現機制以及構造函數的實現,現在介紹另一種為類添加成員的機制:prototype對象。當new一個function時,該對象的成員將自動賦給所創建的對象,例如:
<script language="JavaScript" type="text/javascript">
<!--
//定義一個只有一個屬性prop的類
function class1(){
this.prop=1;
}
//使用函數的prototype屬性給類定義新成員
class1.prototype.showProp=function(){
alert(this.prop);
}
//創建class1的一個實例
var obj1=new class1();
//調用通過prototype原型對象定義的showProp方法
obj1.showProp();
//-->
</script>
prototype是一個JavaScript對象,可以為prototype對象添加、修改、刪除方法和屬性。從而為一個類添加成員定義。
了解了函數的prototype對象,現在再來看new的執行過程。
(1) 創建一個新的對象,并讓this指針指向它;
(2) 將函數的prototype對象的所有成員都賦給這個新對象;
(3) 執行函數體,對這個對象進行初始化操作;
(4) 返回(1)中創建的對象。
和上一節介紹的new的執行過程相比,多了用prototype來初始化對象的過程,這也和prototype的字面意思相符,它是所對應類的實例的原型。這個初始化過程發生在函數體(構造器)執行之前,所以可以在函數體內部調用prototype中定義的屬性和方法,例如:
<script language="JavaScript" type="text/javascript">
<!--
//定義一個只有一個屬性prop的類
function class1(){
this.prop=1;
this.showProp();
}
//使用函數的prototype屬性給類定義新成員
class1.prototype.showProp=function(){
alert(this.prop);
}
//創建class1的一個實例
var obj1=new class1();
//-->
</script>
和上一段代碼相比,這里在class1的內部調用了prototype中定義的方法showProp,從而在對象的構造過程中就彈出了對話框,顯示prop屬性的值為1。
需要注意,原型對象的定義必須在創建類實例的語句之前,否則它將不會起作用,例如:
<script language="JavaScript" type="text/javascript">
<!--
//定義一個只有一個屬性prop的類
function class1(){
this.prop=1;
this.showProp();
}
//創建class1的一個實例
var obj1=new class1();
//在創建實例的語句之后使用函數的prototype屬性給類定義新成員,只會對后面創建的對象有效
class1.prototype.showProp=function(){
alert(this.prop);
}
//-->
</script>
這段代碼將會產生運行時錯誤,顯示對象沒有showProp方法,就是因為該方法的定義是在實例化一個類的語句之后。
由此可見,prototype對象專用于設計類的成員,它是和一個類緊密相關的,除此之外,prototype還有一個重要的屬性:constructor,表示對該構造函數的引用,例如:
function class1(){
alert(1);
}
class1.prototype.constructor(); //調用類的構造函數
這段代碼運行后將會出現對話框,在上面顯示文字“1”,從而可以看出一個prototype是和一個類的定義緊密相關的。實際上:class1.prototype.constructor===class1。
一種JavaScript類的設計模式
前面已經介紹了如何定義一個類,如何初始化一個類的實例,且類可以在function定義的函數體中添加成員,又可以用prototype定義類的成員,編程的代碼顯得混亂。如何以一種清晰的方式來定義類呢?下面給出了一種類的實現模式。
在JavaScript中,由于對象靈活的性質,在構造函數中也可以為類添加成員,在增加靈活性的同時,也增加了代碼的復雜度。為了提高代碼的可讀性和開發效率,可以采用這種定義成員的方式,而使用prototype對象來替代,這樣function的定義就是類的構造函數,符合傳統意義類的實現:類名和構造函數名是相同的。例如:
function class1(){
//構造函數
}
//成員定義
class1.prototype.someProperty="sample";
class1.prototype.someMethod=function(){
//方法實現代碼
}
雖然上面的代碼對于類的定義已經清晰了很多,但每定義一個屬性或方法,都需要使用一次class1.prototype,不僅代碼體積變大,而且易讀性還不夠。為了進一步改進,可以使用無類型對象的構造方法來指定prototype對象,從而實現類的成員定義:
//定義一個類class1
function class1(){
//構造函數
}
//通過指定prototype對象來實現類的成員定義
class1.prototype={
someProperty:"sample",
someMethod:function(){
//方法代碼
},
…//其他屬性和方法.
}
上面的代碼用一種很清晰的方式定義了class1,構造函數直接用類名來實現,而成員使用無類型對象來定義,以列表的方式實現了所有屬性和方法,并且可以在定義的同時初始化屬性的值。這也更象傳統意義面向對象語言中類的實現。只是構造函數和類的成員定義被分為了兩個部分,這可看成JavaScript中定義類的一種固定模式,這樣在使用時會更加容易理解。
注意:在一個類的成員之間互相引用,必須通過this指針來進行,例如在上面例子中的someMethod方法中,如果要使用屬性someProperty,必須通過this.someProperty的形式,因為在JavaScript中每個屬性和方法都是獨立的,它們通過this指針聯系在一個對象上。
以前做過一個網上申報的功能,客戶可以在網站上申報辦件,這個申報過程需要完成4個步驟,內容比較多,設計人員將4個步驟設計成四個單獨的頁面,每個頁面上都有一個表單需要申報人員填寫相關信息。
為了一個申報數據是合法、有效的,程序在第四個步驟完成時才會將數據記錄到數據庫當中。
大家可能會想到,通過隱藏字段(hidden)記錄前一個步驟的表單值,到最后一個步驟時再一起提交出去,這也是一個方法。
現在有另一種方法,通過Struts來實現。
具體實現步驟如下:
1、建立一個FormBean,它包含4個步驟的Form信息,并助將scope設置為session.
2、每個頁面共用這個FormBean.
3、為每個頁面的表單加一個hidden字段,它的值分別為1,2,3,4(即第一個頁面的值為1,以此類推;這樣做的目的為了在FormBean里面的reset方法中,將相關的值設為null)
這里給出FormBean中reset方法的實現
public void reset(ActionMapping actionMapping,
HttpServletRequest
servletRequest) {
// 根據不同的步驟,重設相關表單字段的值
switch(stepNo) {
case: 1
name = null;
phoneNumber = null;
break;
case: 2
type = null;
email = null;
break;
case: 3


case: 4

}
}
JS中字符串的連接,我們常用"+",大量的字符串連接操作中使用"+"代價是很高的,在JAVA里面,都知道使用StringBuffer類的append方法,那么在JS里面,我們可以使Array對象的join方法。
我們使用AJAX發送請求,有時候需要傳遞參數,其多個參數之間都是以"&"隔開。
在要求傳的參數比較多的情況下,可以將參數-值先一個一個的存在Array里面,然后使用join方法轉換為字符串。
// 創建一個數組
var aParam = new Array();
// 參數
var param1 = "name=x29";
.
.
.
var paramN = "paramName=value";
// 將參數存入數組當中
aParam.push(param1);
.
.
aParam.push(paramN);
// 將數組轉換成字符串,并作為參數傳遞
xmlHttp.send(aParam.join("&"));
首先看下面的代碼
double?val1?=?1.0;
double?val2?=?0.4;
System.out.println(val1?-?val2);
輸出結果為:0.6
如果將val2的值改寫成0.8,執行結果又如何呢?會是0.2嗎?
輸出結果:0.19999999999999996
為什么會這樣呢?問題就是出在
"IEEE 754 floating-point arithmetic",在JAVA語言里需要遵守這項規則。
要解決上面的問題,得到正確的結果,需要使用BigDecimal類;float和double一般用來做科學計算或者是工程計算,在商業計算中我們要用 java.math.BigDecimal。
code:
double?val1?=?1.0;
double?val2?=?0.2;
BigDecimal?b1?=?new?BigDecimal(String.valueOf(val1));
BigDecimal?b2?=?new?BigDecimal(String.valueOf(val2));
b1?=?b1.subtract(b2);
System.out.println(b1.doubleValue());
這里有一點需要說明一下,BigDecimal類提供了BigDecimal(double?val)構造函數,為什么上面還用String.valueOf(double v)轉換而使用BigDecimal類的BigDecimal(String val)構造函數呢?
在API Doc 中這樣說明:
將 double 轉換為 BigDecimal,后者是 double 的二進制浮點值準確的十進制表示形式。返回的 BigDecimal 的標度是使 (10scale × val) 為整數的最小值。 注:
- 此構造方法的結果有一定的不可預知性。有人可能認為在 Java 中寫入 new BigDecimal(0.1) 所創建的 BigDecimal 正好等于 0.1(非標度值 1,其標度為 1),但是它實際上等于 0.1000000000000000055511151231257827021181583404541015625。這是因為 0.1 無法準確地表示為 double(或者說對于該情況,不能表示為任何有限長度的二進制小數)。這樣,傳入 到構造方法的值不會正好等于 0.1(雖然表面上等于該值)。
- 另一方面,String 構造方法是完全可預知的:寫入 new BigDecimal("0.1") 將創建一個 BigDecimal,它正好 等于預期的 0.1。因此,比較而言,通常建議優先使用 String 構造方法。
- 當 double 必須用作 BigDecimal 的源時,請注意,此構造方法提供了一個準確轉換;它不提供與以下操作相同的結果:先使用
Double.toString(double)
方法,然后使用 BigDecimal(String)
構造方法,將 double 轉換為 String。要獲取該結果,請使用 staticvalueOf(double)
方法。
<STYLE>
#A?tr
{
background-color
:
expression(rowIndex%2?'#ffffcc':'#ffffff')
}
</STYLE>
效果如下: