Web亂碼與字符集的理解
小生最近學習Servlet和JSP處理中文時常常碰到亂碼,所以在網上找了許多有關字符集方面的資料學習,但總覺得一知半懂,所以想得到前輩
們指教,以下是我的理解:
磁盤上件的存儲形式:所有文件的儲存是都是字節(byte)的儲存,在磁盤上保留的並不是文件的字符而是先把字符編碼成字節,再儲存這些
字節到磁盤。在讀取文件(特別是文本文件)時,也是一個字節一個字節地讀取以形成字節序列.
字符編碼(encoding)就是把字符按照某種映射標準(字符集)轉換成字節。例如打開一個空記事本,然後在記事本中寫入"hello world"--〉另
存爲(默認的ASICC字符集)--->asc.txt , 這時asc.txt就以ASCII編碼的字節序列存儲在磁盤上,如果要讀這個文件,也就是將這個字節序列
按照原字符集轉換成字符串(解碼:decoding),所以處理好編碼<=>字符集<=>解碼就是關鍵.
字符集就像棋盤,每個字符(棋子)用一個棋格(字節)映射。
ISO8859:8位的字符集,0~0x7F仍與ASCII字符集保持兼容,大於0x7F的是各種拉丁字符或歐洲字符的擴展。
GB2312: 8位的字符集,如果當前字節(8 bit)小於0X80,則仍當它爲英文字符與(ASCII兼容);如果它大於等於0x80,則它和緊接着它的下一個
字節構成一個漢字字符,這樣,GB2312字符集可包含大約4000多個常用簡體漢字和其他漢字中的特殊符號(如①㈠之類)。
GBK:GB2312的擴展集,和GB2312兼容.
Unicode: 16位的字符集,Unicode的主要目標是提供一個“通用字符集”。
UTF-8: Unicode的使用、存儲與傳輸,都極其浪費空間,所以在此基礎上出現了UTF-8字符編碼的規範,在UTF-8中,屬於US-ASCII中的字符,
仍用一個字節表示,且和US-ASCII兼容,編碼其他的字符,則用1(大於0x7F部分)到3個字節. (編碼中文用3個字節)
JVM編譯器使用系統默認的字符集encoding/decoding.我的系統爲win2000Server 默認字符集爲GBK。編譯過程如下
1.javac Test.java ===>編譯器實際上執行了 javac -encoding GBK Test.java
2.在類裝載器中加載這個Test.class文件,編譯器再用GBK字符集解讀這個Test.class
Java可以讓你按自定義字符集編碼你的文件,如下列
Utf.java
public class Utf {
public static void main(String [] args)
throws Exception
{
String s = "你好";
byte[] bytelist = s.getBytes("UTF-8");
}
}
..
javac Utf.java // 這時,在類文件Utf.class中,bytelist存儲的是一塊UTF-8編碼"你好"的字節序列,而其他部分仍然是GBK編碼的字節.
現在再加上對這些字節解碼的過程
public class Utf {
public static void main(String [] args)
throws Exception
{
String s = "你好";
byte[] bytelist = s.getBytes("UTF-8");
//解碼
String decodingString = new String(bytelist,"UTF-8");
//正確的讀出這些UFT-8字符集編碼的字節
System.out.println(decodingString);
}
}
現在講JSP,Servlet了.
他們歸根到底都是 xxx.class文件,所以我們抓住他們的編譯器編碼方式和上例 bytelist那樣的字節序列就OK了.
以下是一個 JSP-Servlet-java Bean - JDBC 的實例.
JSP文件的編碼解碼過程如下(jsp引擎採用UTF-8 encoding/decoding):
JSP引擎(UTF-8) Servlet引擎(UTF-8)
xxx.jsp -----------------> xxx$jsp.java(UTF-8) -----------------------> xxx.class
1.在 xxx$jsp.java(UTF-8) ---> xxx.class 這一部分,Servlet編譯器會正確的用 UTF-8來解讀,所以我們可以不用管,
2.而關鍵在xxx.jsp這裏,我們應該告訴jsp引擎某個區域的字符串用GB2312或GBK、UTF編碼.
<%@ page pageEncoding="gb2312" %>
3.這樣你所提交的表單實體數據就用gb2312編碼了,數據提交到Servlet中,Servlet用gb2312來解讀這些數據就可以正確的給bean了.
//將接受到的數據以GB2312字符集進行編碼
req.setCharacterEncoding("GB2312");
//輸出的信息以GB2312字符集編碼,如果數據主要由Bean處理,charset=GB2312要不要都無所謂
res.setContentType("text/html;charset=GB2312");
因爲servlet解碼使用ISO-8859-1字符集, 這裏setCharacterEncoding("GB2312")完成的功能其實就是一個轉碼過程,如果傳來一個表單數據
爲gb2312編碼的"你好", 它處理的就是
byte[] bytelist = s.getByte("ISO-8859-1");
s = new String(bytelist,"GB2312");
後邊一般沒什麼問題了
*************************************************************************************************************************888888
ASP具備管理不同語言腳本程序的能力,能夠自動調用合適的腳本引擎以解釋腳本代碼和執行內置函數。ASP開發環境提供了兩種腳本引擎,即VBScript(缺省)和JScript。不過,開發者並沒有被限制於只能使用這兩種語言,只要能夠提供合適的ActiveX腳本引擎就能使用任何腳本語言。
腳本語言的選擇往往基於許多不同原因:它可能是開發者最爲熟悉的語言,可能是對給定工程來說能夠提供最多特色支持的,也有可能是最具效率的。不同的環境和要求使得我們在選擇腳本語言時注重不同的因素,同時也使得我們在某些時候面臨選定的腳本語言不能直接提供其它語言固有的函數這一問題,或某個腳本已經寫成但用的卻是另外一種腳本語言。
此時應該怎麼辦?是否需要用當前所用的腳本語言重寫這些腳本?或者說,是否有可能在一種腳本語言中調用其它腳本語言的內置函數?本文要說明的就是在ASP應用中如何讓VBScript腳本和JScript腳本交互以最大限度地獲得兩種腳本語言的特色支持。
一、VBScript和JScript的內置函數
在VBScript和JScript中,有大量的內置函數功能是相同或類似的。然而,在一種腳本語言中內置的函數並非總是在另外一種腳本語言中也有對應的函數。例如,VBScript提供了許多用於操作字符串和格式化數據的函數,這些函數在JScript中並不存在。這些函數包括StrReverse()、Filter()以及FormatCurrency()等。在另一方面,JScript所提供的用於管理數組、字符串編碼等的函數在VBScript中也沒有定義,如join()、reverse()、pow()、位操作、escape()和unescape()等。
那麼,如果在JScript程序中需要一個VBscript函數該怎麼辦呢?
二、異種腳本的互相調用
如果需要在JScript腳本中調用一個VBScript中內置的函數,則應該寫一個VBScript用戶定義函數(在這裏調用VBScript內置函數),然後在JScript腳本中象調用公用JScript函數一樣調用這個用戶定義函數。
例如,如果要調用的VBSCript內置函數是FormatCurrency(),則可以聲明如下自定義函數:
< SCRIPT LANGUAGE="VBSCRIPT" RUNAT="SERVER">
Function FormatValue(Value)
FormatValue = FormatCurrency(Value)
End Function
< /SCRIPT>
接下來在JScript代碼中就可以象普通JScript函數一樣調用FormatValue()了。用類似的方法也可以實現VBScript代碼調用JScript函數。
應用同樣的規則,我們可以在任何腳本內調用任何用戶定義函數。不過,從JScript腳本內調用一個不帶參數的VBScript過程(Sub)時應略加註意,此時在JScript中應該象調用一個不帶參數的JScript函數一樣調用它,如用foo()調用VBScript Sub foo過程。
三、數據共享
在某些情形下混合運用VBScript和JScript函數是非常有用的,但在不同語言腳本之間共享數據也可能很有用。實現這種共享的方法很簡單:不管使用的是什麼語言,只要是在頁面級聲明的變量就可以任意引用。
對象的使用方法也相似,可以任意選用合適的語言讀取、修改屬性或調用對象的方法。當然給定對象的屬性和方法是由創建該對象實例的語言所定義的。正如上例VBScript的過程調用,當從JScript中調用一個不帶參數的VBScript對象的方法時,其調用方法也遵從JScript的調用規則,反之亦然。
四、數組管理
數組共享問題稍微複雜一點。雖然數組也象其它變量一樣可以在不同語言腳本之間共享,但必須注意兼容方面的問題。
VBScript數組在JScript下可以用VBScript的符號引用,即用myArray(2)引用數組元素而不是JScript的數組元素引用符號myArray[2]。此外,還可以使用一個特殊的JScript對象——VBArray對象將VBScript數組轉換爲JScript數組。下面的代碼從VBScript數組myVBArray創建JScript數組myJSArray:
var Temp = new VBArray(myVBArray)
var myJSArray
myJSArray = Temp.toArray()
上述代碼首先創建一個臨時的VBArray對象,然後使用它的toArray()方法將自己轉換爲JScript數組。此後就可以象普通JScript數組一樣使用myJSArray,如myJSArray[1]。但應當注意的是,toArray()方法將把一個多維的VBArray轉換爲一維的JScript數組。
從VBScript中引用JScript數組更爲複雜。雖然在VBScript中我們可以直接訪問JScript數組相關的方法和屬性,但沒有直接訪問JScript數組的單個元素的方法。也就是說,我們可以在VBScript腳本中讀取JScript數組的長度屬性,如下所示:
x = myJSArray.length
但無法直接讀取該數組的單個元素,下面的VBScript代碼是不正確的:
x = myJSArray(3)
解決該問題的一個可行的方法是執行一個轉換過程,如下面的代碼所示,此處假定VBScript是缺省的腳本語言:
< %
Dim Temp
Dim myVBArray
Temp = myJSArray.join(", ")
myVBArray = Split(Temp, ", ")
%>
此處的JScript join()方法將數組myJSArray元素轉換到一個以逗號爲分割符的字符串,VBScript Split()函數將字符串轉換爲VBScript數組。注意這裏我們是在VBScript環境下調用JScript的join方法。依照此例,我們可以通過自定義VBScript函數來模擬JScript的VBArray對象的toArray()方法以實現JScript數組到VBScript數組的轉換。
、小結
在同一個ASP工程內靈活選用不同腳本語言具有許多優點,這些腳本之間的交互能力更爲開發者集成不同語言所提供的內置函數和其它功能帶來了更多的機會,同時也使得實現既可用於VBScript也可用於JScript環境的通用腳本庫成爲可能。
********************************************************************************************************************************************************************************************************************************************************************************************************************************
JavaScript的瀏覽器對象詳解
使用瀏覽器的內部對象系統, 可實現與HTML文檔進行交互。它的作用是將相關元素組織包裝起來,提供給程序設計人員使用,從而減輕編程人的勞動,提高設計Web頁面的能力。
一、瀏覽器對象層次及其主要作用
除了前面提到過的文檔document對象外,Navigator瀏覽器中還提供了窗口(Window)對象以及歷史(History)和位置(Location)對象。
●瀏覽器對象(Navigator)提供有關瀏覽器的信息
navigator中有用的屬性包括:
※appName:提供字符串形式的瀏覽器名稱。
※appVersion:反映瀏覽器的版本號。
※appCodeName:瀏覽器的代碼名稱。
※userAgent:用戶代理標識。
※mineTypes:可以使用的mine類型信息。
※plugins:可以使用的插件信息。
※languages:語言設定。
※platform:瀏覽器適用的平臺名稱。
示例:你所使用的瀏覽器爲:Microsoft Internet Explorer版本爲:4.0 (compatible; MSIE 6.0; Windows NT 5.0)
<script>
document.write("你所使用的瀏覽器爲:"+navigator.appName);
document.write("版本爲:"+navigator.appVersion);
</script>
●窗口對象(Windows)
Window對象有以下方法:
※open(url,WindowName,parameterlist):創建一個新窗口。
※close():關閉一個窗口。
※alert(text):警告窗口。
※confirm(text):彈出確認域。
※promt(text,Defaulttext):彈出提示框。
※setTimeout(表達式,時間)定時設置。
※clearTimeout(timer):取消以前的設定。
※setInterval(表達式,時間):設定一個時間間隔。
※clearInterval(timer):取消時間間隔設定。
※moveBy(水平位移,垂直位移):將窗口移支指定的位移。
※moveTo(x,y):將窗口移動到指定的座標。
※resizeBy(水平位移,垂直位移):按給定的位移量重新設定窗口大小。
※resizeTo(x,y):將窗口設定爲指定大小。
※scrollBy(水平位移,垂直位移):按給定的位移量滾動窗口。
※scrollTo(x,y):將窗口滾動到指定位置。
※find(["string",true|false][,true|false]):查找網頁中的字符串。
※back():後退。
※forward():前進。
※home():返回主頁。
※stop():停止裝載網頁。
※print():打印網頁。
※frame:幀。
※status:狀態欄信息。
※location:當前窗口URL信息。
※history:歷史。
※closed:窗口是否已關閉的邏輯值。
※Parent 指明當前窗口或幀的父窗口。
※defaultstatus:默認狀態,它的值顯示在窗口的狀態欄中。
※top:包括的是用以實現所有的下級窗口的窗口。
※window.指的是當前窗口
※self:引用當前窗口。
打開一個窗口的基本格式:
Window .open("URL","窗口名字","窗口屬性"]
window屬性參數是由一個字符串列表項它由逗號分隔,它指明瞭有關新創建窗口的屬性。
參 數 設定值 含 義
toolbar yes/no 建立或不建立標準工具條
location yes/no 建立或不建立位置輸入字段
directions yes/no 建立或不建立標準目錄按鈕
status yes/no 建立或不建立狀態條
menubar yes/no 建立或不建立菜單條
scrollbar yes/no 建立或不建立滾動條
revisable yes/no 能否改變窗口大小
width yes/no 確定窗口的寬度
Height yes/no 確定窗口的高度。
在使用Open()方法時,需要注意以下點。
·通常瀏覽器窗中,總有一個文檔是打開的。因而不需要爲輸出建立一個新文檔。
·在完成對Web文檔的寫操作後,要使用或調用close()方法來實現對輸出流的關閉。
·在使用open()來打開一個新流時,可爲文檔指定一個有效的文檔類型,有效文檔類型包括text/HTML、text/gif、text/xim、text/plugin等。
Window對象處於對象層次的最頂端,它提供了處理Navigator窗口的方法和屬性。
●位置對象(Location)
Location對象提供了與當前打開的URL一起工作的方法和屬性,它是一個靜態的對象。
location對象有以下方法:
location=url
reload()
replace()
●歷史對象(History)
History對象提供了與歷史清單有關的信息。
利用history對象可以實現網頁導航:
1) go:讓瀏覽器載入指定的url.
history.go(-2) 可以裝入瀏覽器訪問過的倒數第二個URL.
history.go(0) 可以重新載入當前URL.
history.go(http://www.tastelife.net)
2) back:讓瀏覽器載入歷史記錄前一個URL
3) forward:讓瀏覽器載入歷史記錄後一個URL
●文檔對象(Document)
document對象包含了與文檔元素(elements)一起工作的對象,它將這些元素封裝起來供編程人員使用。
編程人員利用這些對象,可以對WWW瀏覽器環境中的事件進行控制並作出處理。在JavaScript中提供了非常豐富的內部方法和屬性,從而減輕了編程人員的工作,提高編程效率。這正是基於對象與面向對象的根本區別所在。在這些對象系統中,文檔對象屬於非常重要的,它位於最低層,但對於我們實現Web頁面信息交互起作關鍵作用。因而它是對象系統的核心部分。
二、文檔對象功能及其作用
在Navigator瀏覽器中,document文檔對象是核心是,同時也是最重要的。見圖6-1所示。
Links Anchor Form Method Prop
鏈接對象 錨對象 窗體對象 方法 對象
從圖6-1中可以看出,document對象的主要作用就是把這些基本的元素(如links,anchor等)包裝起來,提供給編程人員使用。從另一個角度看,document對象中又是由屬性和方法組成。
1、document中三個主要的對象
在document中主要有:links,anchor,form等三個最重要的對象:
(1)anchor錨對象:
anchor對象指的是<A Name=...> </A>標識在HTML源碼中存在時產生的對象。它包含着文檔中所有的anchors信息。
(2)鏈接links對象
link對象指的是用<A Href=...> </A>標記的連接一個超文本或超媒體的元素作爲一個特定的URL。
(3)窗體(Form)對象
窗體對象是文檔對象的一個元素,它含有多種格式的對象儲存信息,使用它可以在JavaScript腳本中編寫程序進行文字輸入,並可以用來動態改變文檔的行爲。通過document. Forms[]數組來使得在同一個頁面上可以有多個相同的窗體,使用forms[]數組要比使用窗體名字要方便得多。
document對象有以下方法:
(1)write()、writeln()輸出顯示。
該方法主要用來實現在Web頁面上顯示輸出信息。在實際使用中,需注意以下幾點:
·writeln()與write()唯一不同之處在於在未尾加了一個換符。
·爲了正常顯示其輸出信息,必須指明<pre> </Pre>標記,使之告訴編輯器。
·輸出的文檔類型,可以由瀏覽器中的有效的合法文本類型所確定。
(2)關閉文檔流close()
在實現多個文檔對象中,必須使用close()來關閉一個對象後,才能打開另一個文檔對象。
(3)清除文檔內容clear()
例:下面就是一個使用窗體數組和窗體名字的例子。該程序使得兩個窗體中的字段內容保持一致。
Test6_1.htm
<Html>
<head>
</head>
<body>
<form >
<input type=text onChange="document.my.elements[0].value=this.value;" >
</form>
<form NAME="my">
<input type=text onChange="document.forms[0].elements[0].value=this.value;">
</form>
</body>
</html>
其中用了OnChnge事件(當窗體內容改變時激發)。第一個使用窗體名字標識my,第二個使用窗體數組Forms[]。其效果是一致。
2、文檔對象中的attribute屬性
document對象中的attribute屬性,主要用於在引用Href標識時,控制着有關顏色的格式和有關文檔標題、文檔原文件的URL以及文檔最後更新的日期。這部分元素的主要含義如下:
(1)鏈接顏色:alinkcolor
這個元素主要用於,當選取一個鏈接時,鏈接對象本身的顏色就按alinkcolo r指定改變。
(2)鏈接顏色:linkcolor
當用戶使用<A Href=...> Text string </A>鏈接後,Textstring的顏色就會按Linkcolor所指定的顏色更新。
(3)瀏覽過後的顏色:VlinkColor
該屬性表示的是已被瀏覽存儲爲已瀏覽過的鏈接顏色。
(4)背景顏色:bgcolor
該元素包含文檔背景的顏色。
(5)前景顏色:Fgcolor
該元素包含HTML文檔中文本的前景顏色。
3、文檔對象的基本元素
(1)窗體屬性:
窗體屬性是與HTML文檔中<Form>...</Form>相對應的一組對象在HTML文檔所創建的窗體數,由length指定。通過document.forms.length反映該文檔中所創建的窗體數目。
(2)錨屬性:anchors
該屬性中,包含了HTML文檔的所有<A> </A>標記爲Name=...的語句標識。所有“錨”的數目保存在document.anchors.length中。
(3)鏈接屬性:links
鏈接屬性是指在文檔中<A>...</A>的由Href=...指定的數目,其鏈接數目保存在document.links.length中。
三、範例
例1:下面我們通過一個例子來說明文檔對象的綜合應用。
Test6_2.htm
<html>
<head>
</HEAD>
<BOdy>
<Form Name="mytable">
請輸入數據:
<Input Type="text" Name="text1" Value="">
</Form>
<A name="Link1" href="test31.htm">鏈接到第一個文本</a><br>
<A name="Link2" href="test32.htm">鏈接到第二個文本</a><br>
<A name="Link2" href="test33.htm">鏈接到第三個文本</a><br>
<A href="#Link1">第一錨點</a>
<A href="#Link2">第二錨點</a>
<A Href="#Link3">第三錨點</a>
<BR>
<Script Language="JavaScript">
document.write("文檔有"+document.links.length+"個鏈接"+"<br>");
document.write("文檔有"+document.anchors.length+"個錨點"+"<br>");
document.write("文檔有"+document.forms.length+"個窗體");
</script>
</body>
</HTML>
例子2:下列程序隨機產生每日一語。
test6_3.html
<HTML>
<HEAD>
<script Language="JavaScript">
<!--
tips = new Array(6);
tips[0]="每日一語(1)";
tips[1]="每日一語(2)";
tips[2]="每日一語(3)";
tips[3]="每日一語(4)";
tips[4]="每日一語(5)";
tips[5]="每日一語(6)";
index = Math.floor(Math.random() * tips.length);
document.write("<FONT SIZE=8 COLOR=DARKBLUE>" + tips[index]+"</FONT>");
</Script>
</HEAD>
</BODY>
</HTML>
/********************************************************************************************************************************************************************************************/
Java性能的優化(下)(轉)
轉貼:Andy.m 日期:2003-07-26 人氣:9
三.優化JAVA程序設計和編碼,提高JAVA程序性能的一些方法。
通過使用一些前面介紹過的輔助性工具來找到程序中的瓶頸,然後就可以對瓶頸部分的代碼進行優化。一般有兩種方案:即優化代碼或更改設計方法。我們一般會選擇後者,因爲不去調用以下代碼要比調用一些優化的代碼更能提高程序的性能。而一個設計良好的程序能夠精簡代碼,從而提高性能。
下面將提供一些在JAVA程序的設計和編碼中,爲了能夠提高JAVA程序的性能,而經常採用的一些方法和技巧。
1.對象的生成和大小的調整。
JAVA程序設計中一個普遍的問題就是沒有好好的利用JAVA語言本身提供的函數,從而常常會生成大量的對象(或實例)。由於系統不僅要花時間生成對象,以後可能還需花時間對這些對象進行垃圾回收和處理。因此,生成過多的對象將會給程序的性能帶來很大的影響。
例1:關於String ,StringBuffer,+和append
JAVA語言提供了對於String類型變量的操作。但如果使用不當,會給程序的性能帶來影響。如下面的語句:
String name=new String(“HuangWeiFeng”);
System.out.println(name+”is my name”);
看似已經很精簡了,其實並非如此。爲了生成二進制的代碼,要進行如下的步驟和操作。
(1) 生成新的字符串 new String(STR_1);
(2) 複製該字符串。
(3) 加載字符串常量”HuangWeiFeng”(STR_2);
(4) 調用字符串的構架器(Constructor);
(5) 保存該字符串到數組中(從位置0開始)
(6) 從java.io.PrintStream類中得到靜態的out變量
(7) 生成新的字符串緩衝變量new StringBuffer(STR_BUF_1);
(8) 複製該字符串緩衝變量
(9) 調用字符串緩衝的構架器(Constructor);
(10) 保存該字符串緩衝到數組中(從位置1開始)
(11) 以STR_1爲參數,調用字符串緩衝(StringBuffer)類中的append方法。
(12) 加載字符串常量”is my name”(STR_3);
(13) 以STR_3爲參數,調用字符串緩衝(StringBuffer)類中的append方法。
(14) 對於STR_BUF_1執行toString命令。
(15) 調用out變量中的println方法,輸出結果。
由此可以看出,這兩行簡單的代碼,就生成了STR_1,STR_2,STR_3,STR_4和STR_BUF_1五個對象變量。這些生成的類的實例一般都存放在堆中。堆要對所有類的超類,類的實例進行初始化,同時還要調用類極其每個超類的構架器。而這些操作都是非常消耗系統資源的。因此,對對象的生成進行限制,是完全有必要的。
經修改,上面的代碼可以用如下的代碼來替換。
StringBuffer name=new StringBuffer(“HuangWeiFeng”);
System.out.println(name.append(“is my name.”).toString());
系統將進行如下的操作。
(1) 生成新的字符串緩衝變量new StringBuffer(STR_BUF_1);
(2) 複製該字符串緩衝變量
(3) 加載字符串常量”HuangWeiFeng”(STR_1);
(4) 調用字符串緩衝的構架器(Constructor);
(5) 保存該字符串緩衝到數組中(從位置1開始)
(6) 從java.io.PrintStream類中得到靜態的out變量
(7) 加載STR_BUF_1;
(8) 加載字符串常量”is my name”(STR_2);
(9) 以STR_2爲參數,調用字符串緩衝(StringBuffer)實例中的append方法。
(10) 對於STR_BUF_1執行toString命令。(STR_3)
(11)調用out變量中的println方法,輸出結果。
由此可以看出,經過改進後的代碼只生成了四個對象變量:STR_1,STR_2,STR_3和STR_BUF_1.你可能覺得少生成一個對象不會對程序的性能有很大的提高。但下面的代碼段2的執行速度將是代碼段1的2倍。因爲代碼段1生成了八個對象,而代碼段2只生成了四個對象。
代碼段1:
String name= new StringBuffer(“HuangWeiFeng”);
name+=”is my”;
name+=”name”;
代碼段2:
StringBuffer name=new StringBuffer(“HuangWeiFeng”);
name.append(“is my”);
name.append(“name.”).toString();
因此,充分的利用JAVA提供的庫函數來優化程序,對提高JAVA程序的性能時非常重要的.其注意點主要有如下幾方面;
(1) 儘可能的使用靜態變量(Static Class Variables)
如果類中的變量不會隨他的實例而變化,就可以定義爲靜態變量,從而使他所有的實例都共享這個變量。
例:
public class foo
{
SomeObject so=new SomeObject();
}
就可以定義爲:
public class foo
{
static SomeObject so=new SomeObject();
}
(2) 不要對已生成的對象作過多的改變。
對於一些類(如:String類)來講,寧願在重新生成一個新的對象實例,而不應該修改已經生成的對象實例。
例:
String name=”Huang”;
name=”Wei”;
name=”Feng”;
上述代碼生成了三個String類型的對象實例。而前兩個馬上就需要系統進行垃圾回收處理。如果要對字符串進行連接的操作,性能將得更差。因爲系統將不得爲此生成更多得臨時變量。如上例1所示。
(3) 生成對象時,要分配給它合理的空間和大小
JAVA中的很多類都有它的默認的空間分配大小。對於StringBuffer類來講,默認的分配空間大小是16個字符。如果在程序中使用StringBuffer的空間大小不是16個字符,那麼就必須進行正確的初始化。
(4) 避免生成不太使用或生命週期短的對象或變量。
對於這種情況,因該定義一個對象緩衝池。以爲管理一個對象緩衝池的開銷要比頻繁的生成和回收對象的開銷小的多。
(5) 只在對象作用範圍內進行初始化。
JAVA允許在代碼的任何地方定義和初始化對象。這樣,就可以只在對象作用的範圍內進行初始化。從而節約系統的開銷。
例:
SomeObject so=new SomeObject();
If(x==1) then
{
Foo=so.getXX();
}
可以修改爲:
if(x==1) then
{
SomeObject so=new SomeObject();
Foo=so.getXX();
}
2.異常(Exceptions)
JAVA語言中提供了try/catch來發方便用戶捕捉異常,進行異常的處理。但是如果使用不當,也會給JAVA程序的性能帶來影響。因此,要注意以下兩點。
(1) 避免對應用程序的邏輯使用try/catch
如果可以用if,while等邏輯語句來處理,那麼就儘可能的不用try/catch語句
(2) 重用異常
在必須要進行異常的處理時,要儘可能的重用已經存在的異常對象。以爲在異常的處理中,生成一個異常對象要消耗掉大部分的時間。
3. 線程(Threading)
一個高性能的應用程序中一般都會用到線程。因爲線程能充分利用系統的資源。在其他線程因爲等待硬盤或網絡讀寫而 時,程序能繼續處理和運行。但是對線程運用不當,也會影響程序的性能。
例2:正確使用Vector類
Vector主要用來保存各種類型的對象(包括相同類型和不同類型的對象)。但是在一些情況下使用會給程序帶來性能上的影響。這主要是由Vector類的兩個特點所決定的。第一,Vector提供了線程的安全保護功能。即使Vector類中的許多方法同步。但是如果你已經確認你的應用程序是單線程,這些方法的同步就完全不必要了。第二,在Vector查找存儲的各種對象時,常常要花很多的時間進行類型的匹配。而當這些對象都是同一類型時,這些匹配就完全不必要了。因此,有必要設計一個單線程的,保存特定類型對象的類或集合來替代Vector類.用來替換的程序如下(StringVector.java):
public class StringVector
{
private String [] data;
private int count;
public StringVector() { this(10); // default size is 10 }
public StringVector(int initialSize)
{
data = new String[initialSize];
}
public void add(String str)
{
// ignore null strings
if(str == null) { return; }
ensureCapacity(count + 1);
data[count++] = str;
}
private void ensureCapacity(int minCapacity)
{
int oldCapacity = data.length;
if (minCapacity > oldCapacity)
{
String oldData[] = data;
int newCapacity = oldCapacity * 2;
data = new String[newCapacity];
System.arraycopy(oldData, 0, data, 0, count);
}
}
public void remove(String str)
{
if(str == null) { return // ignore null str }
for(int i = 0; i < count; i++)
{
// check for a match
if(data[i].equals(str))
{
System.arraycopy(data,i+1,data,i,count-1); // copy data
// allow previously valid array element be gc'd
data[--count] = null;
return;
}
}
}
public final String getStringAt(int index) {
if(index < 0) { return null; }
else if(index > count)
{
return null; // index is > # strings
}
else { return data[index]; // index is good }
}
/* * * * * * * * * * * * * * * *StringVector.java * * * * * * * * * * * * * * * * */
因此,代碼:
Vector Strings=new Vector();
Strings.add(“One”);
Strings.add(“Two”);
String Second=(String)Strings.elementAt(1);
可以用如下的代碼替換:
StringVector Strings=new StringVector();
Strings.add(“One”);
Strings.add(“Two”);
String Second=Strings.getStringAt(1);
這樣就可以通過優化線程來提高JAVA程序的性能。用於測試的程序如下(TestCollection.java):
import java.util.Vector;
public class TestCollection
{
public static void main(String args [])
{
TestCollection collect = new TestCollection();
if(args.length == 0)
{
System.out.println(
"Usage: java TestCollection [ vector | stringvector ]");
System.exit(1);
}
if(args[0].equals("vector"))
{
Vector store = new Vector();
long start = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++)
{
store.addElement("string");
}
long finish = System.currentTimeMillis();
System.out.println((finish-start));
start = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++)
{
String result = (String)store.elementAt(i);
}
finish = System.currentTimeMillis();
System.out.println((finish-start));
}
else if(args[0].equals("stringvector"))
{
StringVector store = new StringVector();
long start = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) { store.add("string"); }
long finish = System.currentTimeMillis();
System.out.println((finish-start));
start = System.currentTimeMillis();
for(int i = 0; i < 1000000; i++) {
String result = store.getStringAt(i);
}
finish = System.currentTimeMillis();
System.out.println((finish-start));
}
}
}
/* * * * * * * * * * * * * * * *TestCollection.java * * * * * * * * * * * * * * * * */
測試的結果如下(假設標準的時間爲1,越小性能越好):
關於線程的操作,要注意如下幾個方面。
(1) 防止過多的同步
如上所示,不必要的同步常常會造成程序性能的下降。因此,如果程序是單線程,則一定不要使用同步。
(2) 同步方法而不要同步整個代碼段
對某個方法或函數進行同步比對整個代碼段進行同步的性能要好。
(3) 對每個對象使用多”鎖”的機制來增大併發。
一般每個對象都只有一個”鎖”,這就表明如果兩個線程執行一個對象的兩個不同的同步方法時,會發生”死鎖”。即使這兩個方法並不共享任何資源。爲了避免這個問題,可以對一個對象實行”多鎖”的機制。如下所示:
class foo
{
private static int var1;
private static Object lock1=new Object();
private static int var2;
private static Object lock2=new Object();
public static void increment1()
{
synchronized(lock1)
{
var1++;
}
}
public static void increment2()
{
synchronized(lock2)
{
var2++;
}
}
}
4.輸入和輸出(I/O)
輸入和輸出包括很多方面,但涉及最多的是對硬盤,網絡或數據庫的讀寫操作。對於讀寫操作,又分爲有緩存和沒有緩存的;對於數據庫的操作,又可以有多種類型的JDBC驅動器可以選擇。但無論怎樣,都會給程序的性能帶來影響。因此,需要注意如下幾點:
(1) 使用輸入輸出緩衝
儘可能的多使用緩存。但如果要經常對緩存進行刷新(flush),則建議不要使用緩存。
(2) 輸出流(Output Stream)和Unicode字符串
當時用Output Stream和Unicode字符串時,Write類的開銷比較大。因爲它要實現Unicode到字節(byte)的轉換.因此,如果可能的話,在使用Write類之前就實現轉換或用OutputStream類代替Writer類來使用。
(3) 當需序列化時使用transient
當序列化一個類或對象時,對於那些原子類型(atomic)或可以重建的原素要表識爲transient類型。這樣就不用每一次都進行序列化。如果這些序列化的對象要在網絡上傳輸,這一小小的改變對性能會有很大的提高。
(4) 使用高速緩存(Cache)
對於那些經常要使用而又不大變化的對象或數據,可以把它存儲在高速緩存中。這樣就可以提高訪問的速度。這一點對於從數據庫中返回的結果集尤其重要。
(5) 使用速度快的JDBC驅動器(Driver)
JAVA對訪問數據庫提供了四種方法。這其中有兩種是JDBC驅動器。一種是用JAVA外包的本地驅動器;另一種是完全的JAVA驅動器。具體要使用哪一種得根據JAVA佈署的環境和應用程序本身來定。
5.一些其他的經驗和技巧
(1) 使用局部變量
(2) 避免在同一個類中動過調用函數或方法(get或set)來設置或調用變量。
(3) 避免在循環中生成同一個變量或調用同一個函數(參數變量也一樣)
(4) 儘可能的使用static,final,private等關鍵字
(5) 當複製大量數據時,使用System.arraycopy()命令。
/************************************************************************************************************************************************************************************************************************************************************8
我先來一帖!(很實用的精華)
在程序運行過程中,也可放在servlet裏,獲取bean裏的相應要求的property的值,這個方法被我用在tag解析時獲取用戶setAttribute的值,供大家參考!!!
************************ Main.java ************************/
package reflect;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
Bean1 bean1 = new Bean1();
System.out.println( Reflect.get(bean1, "getName", 0) );
System.out.println( Reflect.get(bean1, "getOld", 0) );
System.out.println( Reflect.get(bean1, "getName", 1) );
System.out.println( Reflect.get(bean1, "getOld", 1) );
System.out.println( Reflect.get(bean1, "getName", 2) );
System.out.println( Reflect.get(bean1, "getOld", 2) );
System.out.println( Reflect.get(bean1, "getName", 3) );
System.out.println( Reflect.get(bean1, "getOld", 3) );
System.out.println( Reflect.get(bean1, "getName", 4) );
System.out.println( Reflect.get(bean1, "getOld", 4) );
Bean2 bean2 = new Bean2();
System.out.println( Reflect.get(bean2, "getMember", 0) );
System.out.println( Reflect.get(bean2, "getYear", 0) );
System.out.println( Reflect.get(bean2, "getMember", 1) );
System.out.println( Reflect.get(bean2, "getYear", 1) );
System.out.println( Reflect.get(bean2, "getMember", 2) );
System.out.println( Reflect.get(bean2, "getYear", 2) );
System.out.println( Reflect.get(bean2, "getMember", 3) );
System.out.println( Reflect.get(bean2, "getYear", 3) );
System.out.println( Reflect.get(bean2, "getMember", 4) );
System.out.println( Reflect.get(bean2, "getYear", 4) );
}
}
************************ Reflect.java ************************
package reflect;
import java.lang.reflect.Array;
import java.lang.reflect.Method;
import java.util.ArrayList;
public class Reflect {
public static String get(Object object, String methodname, int i){
Class cls = object.getClass();
Object ret;
try {
Method method = cls.getMethod(methodname, null);
ret = method.invoke(cls.newInstance(), null);
ArrayList array = new ArrayList();
if (ret.getClass().isArray()) {
ret = Array.get(ret, i);
}
} catch (Exception e) {
ret = null;
}
if(ret == null){
return null;
}
return ret.toString();
}
}
************************ Bean1.java ************************
package reflect;
public class Bean1 {
String[] name = {"趙","錢","孫","李"};
int[] old = {28, 27, 32, 26};
public String[] getName(){
return name;
}
public int[] getOld(){
return old;
}
}
************************ Bean2.java ************************
package reflect;
public class Bean2 {
String[] member = {"張","劉","王","方"};
int[] year = {31, 28, 30, 36};
public String[] getMember(){
return member;
}
public int[] getYear(){
return year;
}
}
大家注意:主要是Reflect.java,你只要將bean的名字和getproperty的名字給他,他就能把數據傳回給你,呵呵,很實用!希望大家喜歡!!!
/*******************************************************************************************************************************************************************
DES加密的,文件中共有兩
個方法,即加密、解密兩個方法。
*/
以下是該文件的詳細代碼:
package com.pechinsoft.util;
import java.security.*;
import javax.crypto.*;
public class WriteOffDES {
private String Algorithm = "DES";
public WriteOffDES() {
init();
}
public void init() {
Security.addProvider(new com.sun.crypto.provider.SunJCE());
try {
keygen = KeyGenerator.getInstance(Algorithm);
deskey = keygen.generateKey();
c = Cipher.getInstance(Algorithm);
}
catch(NoSuchAlgorithmException ex) {ex.printStackTrace();}
catch(NoSuchPaddingException ex) {ex.printStackTrace();}
}
public byte[] encrypt(String e) {
try {
c.init(Cipher.ENCRYPT_MODE, deskey);
cipherByte = c.doFinal(e.getBytes());
}
catch(java.security.InvalidKeyException ex){ex.printStackTrace();}
catch(javax.crypto.BadPaddingException ex){ex.printStackTrace();}
catch(javax.crypto.IllegalBlockSizeException ex){ex.printStackTrace();}
return cipherByte;
}
public String decrypt(byte[] d) {
try {
c.init(Cipher.DECRYPT_MODE, deskey);
cipherByte = c.doFinal(d);
}
catch(java.security.InvalidKeyException ex){ex.printStackTrace();}
catch(javax.crypto.BadPaddingException ex){ex.printStackTrace();}
catch(javax.crypto.IllegalBlockSizeException ex){ex.printStackTrace();}
return (new String(cipherByte));
}
public String byteTohex(byte[] b) {
String str = "";
String stmp = "";
for(int n=0;n<b.length;n++) {
stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
if(stmp.length()==1) str = str + "0" + stmp;
else str = str + stmp;
if(n<b.length-1) str = str + ":";
}
return str.toUpperCase();
}
private KeyGenerator keygen;
private SecretKey deskey;
private Cipher c;
private byte[] cipherByte;
}
附運用方法:
<%--TestDES.jsp--%>
<%@ page contentType="text/html; charset=gb2312" %>
<jsp:useBean id="DES" scope="page" class="com.pechinsoft.util.WriteOffDES" />
<html>
<head><title>TestDES File</title></head>
<body bgcolor="#FFFFFF">
<div align="center"><center>
<%
String Num = request.getParameter("Num");
if(Num==null || Num.equals("")) {
%>
<form name="form" action="TestDES.jsp" method="post">
<input type="text" name="Num" size="25" value=""/>
<input type="submit" name="button" value=" 確定 "/>
</form>
<%
}else{
out.println("加密前的數據:"+Num +"<br/>");
out.println("加密後的數據:"+DES.encrypt(Num) +"<br/>");
out.println("解密後的數據:"+DES.decrypt(DES.encrypt(Num)) +"<br/>");
}
%>
</center></div>
</body>
</html>
/*********************************************************************************************************************************************************************
*/
一. Input和Output
1. 關於stream
stream代表的是任何有能力產出數據的數據源,或是任何有能力接收數據的接收源。
在Java的IO中,所有的stream(包括Input和Out stream)都包括兩種類型:
1.1 以字節爲導向的stream
以字節爲導向的stream,表示以字節爲單位從stream中讀取或往stream中寫入信息。
以字節爲導向的stream包括下面幾種類型:
1) Input stream:
(1) ByteArrayInputStream:把內存中的一個緩衝區作爲InputStream使用
(2) StringBufferInputStream:把一個String對象作爲InputStream
(3) FileInputStream:把一個文件作爲InputStream,實現對文件的讀取操作
(4) PipedInputStream:實現了pipe的概念,主要在線程中使用
(5) SequenceInputStream:把多個InputStream合併爲一個InputStream
2) Out stream
(1) ByteArrayOutputStream:把信息存入內存中的一個緩衝區中
(2) FileOutputStream:把信息存入文件中
(3) PipedOutputStream:實現了pipe的概念,主要在線程中使用
(4) SequenceOutputStream:把多個OutStream合併爲一個OutStream
1.2 以Unicode字符爲導向的stream
以Unicode字符爲導向的stream,表示以Unicode字符爲單位從stream中讀取或往st-
ream中寫入信息。以Unicode字符爲導向的stream包括下面幾種類型:
1) Input Stream
(1) CharArrayReader:與ByteArrayInputStream對應
(2) StringReader:與StringBufferInputStream對應
(3) FileReader:與FileInputStream對應
(4) PipedReader:與PipedInputStream對應
2) Out Stream
(1) CharArrayWrite:與ByteArrayOutputStream對應
(2) StringWrite:無與之對應的以字節爲導向的stream
(3) FileWrite:與FileOutputStream對應
(4) PipedWrite:與PipedOutputStream對應
以字符爲導向的stream基本上對有與之相對應的以字節爲導向的stream。兩個對應類實
現的功能相同, 只是在操作時的導向不同。如CharArrayReader:和ByteArrayInputStre-
am的作用都是把內存中的一個緩衝區作爲InputStream使用,所不同的是前者每次從內存中
讀取一個字節的信息,而後者每次從內存中讀取一個字符。
1.3 兩種不現導向的stream之間的轉換
InputStreamReader和OutputStreamReader:把一個以字節爲導向的stream轉換成一個
以字符爲導向的stream。
2. stream添加屬性
2.1 “爲stream添加屬性”的作用
運用上面介紹的Java中操作IO的API,我們就可完成我們想完成的任何操作了。但通過
FilterInputStream和FilterOutStream的子類,我們可以爲stream添加屬性。 下面以一個
例子來說明這種功能的作用。
如果我們要往一個文件中寫入數據,我們可以這樣操作:
FileOutStream fs = new FileOutStream(“test.txt”);
然後就可以通過產生的fs對象調用write()函數來往test.txt文件中寫入數據了。但是,
如果我們想實現“先把要寫入文件的數據先緩存到內存中,再把緩存中的數據寫入文件中”
的功能時,上面的API就沒有一個能滿足我們的需求了。但是通過FilterInputStream和Fi-
lterOutStream的子類,爲FileOutStream添加我們所需要的功能。
2.2 FilterInputStream的各種類型
2.2.1 用於封裝以字節爲導向的InputStream
(1) DataInputStream:從stream中讀取基本類型(int、char等)數據。
(2) BufferedInputStream:使用緩衝區
(3) LineNumberInputStream:會記錄input stream內的行數,然後可以調用getLineNumbe-
r()和setLineNumber(int)
(4) PushbackInputStream:很少用到,一般用於編譯器開發
2.2.2 用於封裝以字符爲導向的InputStream
(1) 沒有與DataInputStream對應的類。除非在要使用readLine()時改用BufferedReader,否
則使用DataInputStream
(2) BufferedReader:與BufferedInputStream對應
(3) LineNumberReader:與LineNumberInputStream對應
(4) PushBackReader:與PushbackInputStream對應
2.3 FilterOutStream的各種類型
2.3.1 用於封裝以字節爲導向的OutputStream
(1) DataIOutStream:往stream中輸出基本類型(int、char等)數據。
(2) BufferedOutStream:使用緩衝區
(3) PrintStream:產生格式化輸出
2.3.2 用於封裝以字符爲導向的OutputStream
(1) BufferedWrite:與對應
(2) PrintWrite:與對應
3. RandomAccessFile
(1) 可通過RandomAccessFile對象完成對文件的讀寫操作
(2) 在產生一個對象時,可指明要打開的文件的性質:r,只讀;w,只寫;rw可讀寫
(3) 可以直接跳到文件中指定的位置
4. I/O應用的一個例子
import java.io.*;
public class TestIO {
public static void main(String[] args) throws IOException{
//1a.以行爲單位從一個文件讀取數據
BufferedReader in =
new BufferedReader(new FileReader("F:\\nepalon\\TestIO.java"));
String s, s2 = new String();
while((s = in.readLine()) != null)
s2 += s + "\n";
in.close();
//1b. 接收鍵盤的輸入
BufferedReader stdin =
new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter a line:");
System.out.println(stdin.readLine());
//2. 從一個String對象中讀取數據
StringReader in2 = new StringReader(s2);
int c;
while((c = in2.read()) != -1)
System.out.println((char)c);
in2.close();
//3. 從內存取出格式化輸入
try {
DataInputStream in3 =
new DataInputStream(new ByteArrayInputStream(s2.getBytes()));
while(true)
System.out.println((char)in3.readByte());
}
catch(EOFException e) {
System.out.println("End of stream");
}
//4. 輸出到文件
try {
BufferedReader in4 =
new BufferedReader(new StringReader(s2));
PrintWriter out1 =
new PrintWriter(new BufferedWriter(new FileWriter("F:\\nepalon\\TestIO.out")));
int lineCount = 1;
while((s = in4.readLine()) != null)
out1.println(lineCount++ + ":" + s);
out1.close();
in4.close();
}catch(EOFException ex) {
System.out.println("End of stream");
}
//5. 數據的存儲和恢復
try {
DataOutputStream out2 =
new DataOutputStream(new BufferedOutputStream(
new FileOutputStream("F:\\nepalon\\Data.txt")));
out2.writeDouble(3.1415926);
out2.writeChars("\nThas was pi:writeChars\n");
out2.writeBytes("Thas was pi:writeByte\n");
out2.close();
DataInputStream in5 =
new DataInputStream(new BufferedInputStream(
new FileInputStream("F:\\nepalon\\ Data.txt")));
BufferedReader in5br =
new BufferedReader(new InputStreamReader(in5));
System.out.println(in5.readDouble());
System.out.println(in5br.readLine());
System.out.println(in5br.readLine());
}catch(EOFException e) {
System.out.println("End of stream");
}
//6. 通過RandomAccessFile操作文件
RandomAccessFile rf =
new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
for(int i=0; i<10; i++)
rf.writeDouble(i*1.414);
rf.close();
rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
for(int i=0; i<10; i++)
System.out.println("Value " + i + ":" + rf.readDouble());
rf.close();
rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
rf.seek(5*8);
rf.writeDouble(47.0001);
rf.close();
rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
for(int i=0; i<10; i++)
System.out.println("Value " + i + ":" + rf.readDouble());
rf.close();
}
}
/**********************************************************************************************************************************
關於代碼的解釋(以區爲單位):
1a區中,當讀取文件時,先把文件內容讀到緩存中,當調用in.readLine()時,再從緩存中
以字符的方式讀取數據(以下簡稱“緩存字節讀取方式”)。
1b區中,由於想以緩存字節讀取方式從標準IO(鍵盤)中讀取數據,所以要先把標準IO(
System.in)轉換成字符導向的stream,再進行BufferedReader封裝。
2區中,要以字符的形式從一個String對象中讀取數據,所以要產生一個StringReader類型
的stream。
4區中,對String對象s2讀取數據時,先把對象中的數據存入緩存中,再從緩衝中進行讀取;
對TestIO.out文件進行操作時,先把格式化後的信息輸出到緩存中,再把緩存中的信息輸
出到文件中。
5區中,對Data.txt文件進行輸出時,是先把基本類型的數據輸出屋緩存中,再把緩存中的
數據輸出到文件中;對文件進行讀取操作時,先把文件中的數據讀取到緩存中,再從緩存
中以基本類型的形式進行讀取。注意in5.readDouble()這一行。因爲寫入第一個writeDo-
uble(),所以爲了正確顯示。也要以基本類型的形式進行讀取。
6區是通過RandomAccessFile類對文件進行操作。
/************************************************************************************************************************************************
做爲小斑竹,我先來帖一個吧
這個類用來根據表結構生成INSERT和UPDATE語句,自己用的非常好用!
有很多不完善的地方需要修改,我沒時間。在另一個ASP的項目裏我採用這個思想寫的比較完善~
希望大家學思想!!!也希望高手能把自己的好方法帖上來大家共享!!!
package ct.util;
import java.sql.ResultSet;
import java.sql.SQLException;
import pub.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import pub.DBConnect;
import java.util.Vector;
public class DbUtil {
public DbUtil() {
}
public static boolean CheckForType(String colType) {
if (colType.equals("LONG"))
return true;
else
return false;
}
public static String CheckForInsert(String colType, String parametervalue) {
if (CheckForType(colType))
return parametervalue;
else
return "'" + parametervalue + "'";
}
/*
*/
public static String BuildInsertSql(String tableName,
HttpServletRequest request,int head,int offal) {
try {
String bsql = "";
String sql = "select * from " + tableName + " limit 1";
DBConnect conn = new DBConnect();
ResultSet rs = conn.executeQuery(sql);
bsql = "insert into " + tableName +" (" ;
for (int i = head+1; i <= rs.getMetaData().getColumnCount()-offal; i++) {
bsql +=rs.getMetaData().getColumnName(i)+",";
}
bsql = bsql.substring(0, bsql.length() - 1);
bsql+=") values (";
for (int i = head+1; i <= rs.getMetaData().getColumnCount()-offal; i++) {
bsql +=
CheckForInsert(rs.getMetaData().getColumnTypeName(i),
request.
getParameter(rs.getMetaData().getColumnName(i))) +
",";
}
bsql = bsql.substring(0, bsql.length() - 1);
bsql += ")";
conn.close();
//System.out.println(bsql);
return bsql;
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
/*
*/
public static String CheckForUpdate(String colType, String parameter,
String parametervalue) {
if (CheckForType(colType))
return parameter + "=" + parametervalue;
else
return parameter + "=" + "'" + parametervalue + "'";
}
public static String BuildUpdateSql(String tableName,
HttpServletRequest request,int head,int offal) {
try {
String bsql = "";
String sql = "select * from " + tableName + " limit 1";
DBConnect conn = new DBConnect();
ResultSet rs = conn.executeQuery(sql);
bsql = "update " + tableName + " set ";
for (int i = head+1; i <= rs.getMetaData().getColumnCount()-offal; i++) {
bsql +=
CheckForUpdate(rs.getMetaData().getColumnTypeName(i),
rs.getMetaData().getColumnName(i),
request.getParameter(rs.getMetaData().getColumnName(i))) +
",";
}
bsql = bsql.substring(0, bsql.length() - 1);
bsql += " where id=" + request.getParameter("id");
//System.out.println(bsql);
conn.close();
return bsql;
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
/*******************************************************************************************************************************************************************88
import java.util.*;
/**
* 用於處理畫面翻頁的類
* <p>Copyright: 2003</p>
* @author Filippo Guan
* @version 1.0
*/
public class ListPage {
private List totalList;
private int currentPageNum;
private int totalPageNum;
private int limit;
public ListPage(List _totalList,int _pageLimit) {
if (_totalList == null) {
totalList = new ArrayList();
}
else {
totalList = _totalList;
}
limit = _pageLimit;
currentPageNum = 1;
totalPageNum = totalList.size()%limit==0 ? totalList.size()/limit : totalList.size()/limit+1;
}
public ListPage(){
this(new ArrayList());
}
public ListPage(List _totalList){
this(_totalList,10);
}
public void clear(){
this.totalList = new Vector();
currentPageNum = 1;
totalPageNum = 0;
}
public int size(){
return totalList.size();
}
public List getTotalList(){
return totalList;
}
public int getTotalPageNum(){
if (totalList == null) return 0;
totalPageNum = totalList.size()%limit==0 ? totalList.size()/limit : totalList.size()/limit+1;
return this.totalPageNum;
}
public int getPageLimit(){
return limit;
}
public void setPageLimit(int _Limit){
limit = _Limit;
}
// -----------------------------------------------------------
public Object getLineObject(int _LineNum){
if (totalList == null) return null;
Object retObj = totalList.get((currentPageNum-1)*limit + _LineNum - 1);
return retObj;
}
// -----------------------------------------------------------
public void setCurrentPageNum(int _currentPageNum){
currentPageNum = _currentPageNum;
}
public int getCurrentPageNum(){
return currentPageNum;
}
public boolean hasPreviousPage(){
return currentPageNum > 1;
}
public boolean hasNextPage(){
return currentPageNum < totalPageNum;
}
public List getCurrentPage(){
return getPage(currentPageNum);
}
public List getFirstPage(){
return this.getPage(1);
}
public List getLastPage(){
return this.getPage(totalPageNum);
}
public List getPreviousPage(){
if (!hasPreviousPage()) throw new NullPointerException("Has not Previous page");
return this.getPage(currentPageNum - 1);
}
public List getNextPage(){
if (!hasNextPage()) throw new NullPointerException("Has not Next page");
return this.getPage(currentPageNum + 1);
}
public List turnPreviousPage(){
this.currentPageNum--;
return this.getCurrentPage();
}
public List turnNextPage(){
this.currentPageNum++;
return this.getCurrentPage();
}
public List turnFirstPage(){
this.currentPageNum = 1;
return this.getCurrentPage();
}
public List turnLastPage(){
this.currentPageNum = this.totalPageNum;
return this.getCurrentPage();
}
// -----------------------------------------------------------
public List getPage(int _pageNum){
Vector vec = new Vector();
for(int i=(_pageNum-1)*limit;i<_pageNum*limit && i<totalList.size();i++){
vec.add(totalList.get(i));
}
return vec;
}
public boolean isFirstPage(int _pageNum){
return _pageNum == 1;
}
public boolean isLastPage(int _pageNum){
return _pageNum == totalPageNum;
}
public static void main(String[] args) {
Vector tryVec = new Vector();
for (int i=0;i<49;i++){
tryVec.add("test" + Integer.toString(i));
}
ListPage page = new ListPage(tryVec,10);
System.err.println("MaxPage=" + page.getTotalPageNum());
if (page.hasNextPage()) page.turnNextPage();
Vector retVec = new Vector(page.getCurrentPage());
try{
System.in.read();
} catch (Exception e){
}
}
}
/***********************************************************************************************************************************************************************88
數據庫中字段id遞增問題
我的代碼如下:添加數據時實現數據庫中字段id遞增1;
String id="1";
ResultSet rs=stmt.executeQuery("select * from product");
if (!rs.next())
id="1";
else
{
rs.last();
id=rs.getString("id");
id=String.valueOf(Integer.parseInt(id)+1);
rs.close();
}
//下面寫插入語句
當數據庫中沒有記錄時,也就是加第一條記錄時會出現java.lang.NumberFormatException:這種錯誤,如果數據庫中有記錄,也就是加的不
是第一條記錄時,可以正常添加,沒有任何錯誤,請問大俠爲什麼 啊?
不甚感激!!!
---------------------------------------------------------------
懷疑你的條件沒起作用,不管是不是有記錄都走的else
if (!rs.next())
id="1";
else
{
rs.last();
id=rs.getString("id");
id=String.valueOf(Integer.parseInt(id)+1);
rs.close();
}
改成
while(rs.next()) {
rs.last();
id=rs.getString("id");
id=String.valueOf(Integer.parseInt(id)+1);
rs.close();
}
---------------------------------------------------------------
改成
while(rs.next()) {
rs.last();
id=rs.getString("id");
if(id==null | |id.equals(""))
id="1";
else
id=String.valueOf(Integer.parseInt(id)+1);
rs.close();
}
---------------------------------------------------------------
oracle中沒有“自增字段”類型,不過可以用其它方法實現,下面是用sequence實現
第一步:建立sequence變量
create sequence sequence_id
說明:該語句作爲sql語句在建表之時直接運行,create sequence是關鍵字,就像create table一樣,sequence_id是你自己取的名字,最好和你表中的遞增字段名相關
第二步:在插入數據時引用sequence
insert mytable(id,name) values(sequence_id.nextVal,'sandm')
說明:nextVal用於獲得sequence的下一個值,即讓其遞增
/********************************************************************************************************************************************************************************************
package com.oa.util;
/**
* <p>Title: 電子政務系統</p>
* <p>Description: 瀏覽器認證</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author
* @version 1.0
*/
public final class Base64 {
static private final int BASELENGTH = 255;
static private final int LOOKUPLENGTH = 63;
static private final int TWENTYFOURBITGROUP = 24;
static private final int EIGHTBIT = 8;
static private final int SIXTEENBIT = 16;
static private final int SIXBIT = 6;
static private final int FOURBYTE = 4;
static private final byte PAD = (byte) '=';
static private byte[] base64Alphabet = new byte[BASELENGTH];
static private byte[] lookUpBase64Alphabet = new byte[LOOKUPLENGTH];
static {
for (int i = 0; i < BASELENGTH; i++) {
base64Alphabet[i] = -1;
}
for (int i = 'Z'; i >= 'A'; i--) {
base64Alphabet[i] = (byte) (i - 'A');
}
for (int i = 'z'; i >= 'a'; i--) {
base64Alphabet[i] = (byte) (i - 'a' + 26);
}
for (int i = '9'; i >= '0'; i--) {
base64Alphabet[i] = (byte) (i - '0' + 52);
}
base64Alphabet['+'] = 62;
base64Alphabet['/'] = 63;
for (int i = 0; i <= 25; i++) {
lookUpBase64Alphabet[i] = (byte) ('A' + i);
}
for (int i = 26, j = 0; i <= 51; i++, j++) {
lookUpBase64Alphabet[i] = (byte) ('a' + j);
}
for (int i = 52, j = 0; i <= 61; i++, j++) {
lookUpBase64Alphabet[i] = (byte) ('0' + j);
}
}
static boolean isBase64(byte octect) {
//shall we ignore white space? JEFF??
return (octect == PAD || base64Alphabet[octect] != -1);
}
static boolean isArrayByteBase64(byte[] arrayOctect) {
int length = arrayOctect.length;
if (length == 0) {
return false;
}
for (int i = 0; i < length; i++) {
if (Base64.isBase64(arrayOctect[i]) == false) {
return false;
}
}
return true;
}
/**
* Encodes hex octects into Base64
*
* @param binaryData Array containing binaryData
* @return Encoded Base64 array
*/
public static byte[] encode(byte[] binaryData) {
int lengthDataBits = binaryData.length * EIGHTBIT;
int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP;
int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP;
byte encodedData[] = null;
if (fewerThan24bits != 0) { //data not divisible by 24 bit
encodedData = new byte[ (numberTriplets + 1) * 4];
}
else { // 16 or 8 bit
encodedData = new byte[numberTriplets * 4];
}
byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0;
int encodedIndex = 0;
int dataIndex = 0;
int i = 0;
for (i = 0; i < numberTriplets; i++) {
dataIndex = i * 3;
b1 = binaryData[dataIndex];
b2 = binaryData[dataIndex + 1];
b3 = binaryData[dataIndex + 2];
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
encodedIndex = i * 4;
encodedData[encodedIndex] = lookUpBase64Alphabet[b1 >> 2];
encodedData[encodedIndex + 1] = lookUpBase64Alphabet[ (b2 >> 4) |
(k << 4)];
encodedData[encodedIndex + 2] = lookUpBase64Alphabet[ (l << 2) |
(b3 >> 6)];
encodedData[encodedIndex + 3] = lookUpBase64Alphabet[b3 & 0x3f];
}
// form integral number of 6-bit groups
dataIndex = i * 3;
encodedIndex = i * 4;
if (fewerThan24bits == EIGHTBIT) {
b1 = binaryData[dataIndex];
k = (byte) (b1 & 0x03);
encodedData[encodedIndex] = lookUpBase64Alphabet[b1 >> 2];
encodedData[encodedIndex + 1] = lookUpBase64Alphabet[k << 4];
encodedData[encodedIndex + 2] = PAD;
encodedData[encodedIndex + 3] = PAD;
}
else if (fewerThan24bits == SIXTEENBIT) {
b1 = binaryData[dataIndex];
b2 = binaryData[dataIndex + 1];
l = (byte) (b2 & 0x0f);
k = (byte) (b1 & 0x03);
encodedData[encodedIndex] = lookUpBase64Alphabet[b1 >> 2];
encodedData[encodedIndex + 1] = lookUpBase64Alphabet[ (b2 >> 4)
| (k << 4)];
encodedData[encodedIndex + 2] = lookUpBase64Alphabet[l << 2];
encodedData[encodedIndex + 3] = PAD;
}
return encodedData;
}
/**
* Decodes Base64 data into octects
* @param base64Data binaryData Byte array containing Base64 data
* @return Array containind decoded data.
*/
public byte[] decode(byte[] base64Data) {
int numberQuadruple = base64Data.length / FOURBYTE;
byte decodedData[] = null;
byte b1 = 0, b2 = 0, b3 = 0, b4 = 0, marker0 = 0, marker1 = 0;
// Throw away anything not in base64Data
// Adjust size
int encodedIndex = 0;
int dataIndex = 0;
decodedData = new byte[numberQuadruple * 3 + 1];
for (int i = 0; i < numberQuadruple; i++) {
dataIndex = i * 4;
marker0 = base64Data[dataIndex + 2];
marker1 = base64Data[dataIndex + 3];
b1 = base64Alphabet[base64Data[dataIndex]];
b2 = base64Alphabet[base64Data[dataIndex + 1]];
if (marker0 != PAD && marker1 != PAD) { //No PAD e.g 3cQl
b3 = base64Alphabet[marker0];
b4 = base64Alphabet[marker1];
decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
decodedData[encodedIndex + 1] = (byte) ( ( (b2 & 0xf) << 4) | (
(b3 >> 2) & 0xf));
decodedData[encodedIndex + 2] = (byte) (b3 << 6 | b4);
}
else if (marker0 == PAD) { //Two PAD e.g. 3c[Pad][Pad]
decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
decodedData[encodedIndex + 1] = (byte) ( (b2 & 0xf) << 4);
decodedData[encodedIndex + 2] = (byte) 0;
}
else if (marker1 == PAD) { //One PAD e.g. 3cQ[Pad]
b3 = base64Alphabet[marker0];
decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4);
decodedData[encodedIndex + 1] = (byte) ( ( (b2 & 0xf) << 4) | (
(b3 >> 2) & 0xf));
decodedData[encodedIndex + 2] = (byte) (b3 << 6);
}
encodedIndex += 3;
}
return decodedData;
}
static final int base64[] = {
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
64, 0, 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, 64, 64, 64, 64, 64,
64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
};
public static String base64Decode(String orig) {
char chars[] = orig.toCharArray();
StringBuffer sb = new StringBuffer();
int i = 0;
int shift = 0; // # of excess bits stored in accum
int acc = 0;
for (i = 0; i < chars.length; i++) {
int v = base64[chars[i] & 0xFF];
if (v >= 64) {
if (chars[i] != '=') {
System.out.println("Wrong char in base64: " + chars[i]);
}
}
else {
acc = (acc << 6) | v;
shift += 6;
if (shift >= 8) {
shift -= 8;
sb.append( (char) ( (acc >> shift) & 0xff));
}
}
}
return sb.toString();
}
}
/*********************************************************************************************************************************
import java.util.*;
/**
* 處理字符串相關功能的類
* <p>Copyright: 2003</p>
* @author Filippo Guan
* @version 1.0
*/
public class StringFunction {
private String str;
public StringFunction(String _Str) {
str = _Str;
}
/**
* 將字符串擴充到長度爲num,如果超過長度則去除超過的部分,否則則在前補0
* @param num 指定擴充到的長度
* @return 返回的字串
*/
public String updateZero(int num) {
return updateChar(num, '0');
}
public synchronized static String updateZero(String str, int num) {
return new StringFunction(str).updateZero(num);
}
/**
* 將字符串擴充到長度爲num,如果超過長度則去除超過的部分,
* 否則則在前面不上某個字符
* @param num 指定擴充到的長度
* @param c 補上的字符
* @return 返回的字串
*/
public String updateChar(int num, char c) {
if (str.length() == num) {
return str;
}
else if (str.length() < num) {
for (int i = str.length(); i < num; i++) {
str = c + str;
}
return str;
}
else {
return str.substring(str.length() - num);
}
}
/**
* 如果字符串爲空,則返回一個" "符號
* @param s 傳入的字串
* @return 返回的字串
*/
public synchronized static String getHtmlFormat(String s) {
if (s != null) {
if (s.trim().equals("")) {
return " ";
}
else {
return s.trim();
}
}
else {
return " ";
}
}
/**
* 保證字符串可以轉化爲數值型,若不能則返回"0"
* @param s 傳入的字串
* @return 返回的字串
*/
public synchronized static String getNumberFormat(Object o) {
if (o == null) {
return "0";
}
String s = o.toString();
try {
double dou = Double.parseDouble(s);
}
catch (Exception e) {
return "0";
}
return s;
}
public static double getDouble(Object o) {
return Double.parseDouble(getNumberFormat(o));
}
public static long getLong(Object o) {
return (long) getDouble(o);
}
public static int getInt(Object o) {
return (int) getDouble(o);
}
public static float getFloat(Object o) {
return (float) getDouble(o);
}
/**
* 把一個字符串轉換成字符串YYYYMMDDHHMISS的形式
* @param _date 傳入的字串
* @return 返回的字串
*/
public static synchronized String getDateTimeFormat(String _date) {
if (_date == null) {
return "";
}
if (_date.length() == 8) {
_date += "000000";
}
if (_date.length() == 14) {
return _date;
}
if (_date.length() > 14) {
return _date.substring(0, 4)
+ _date.substring(5, 7)
+ _date.substring(8, 10)
+ _date.substring(11, 13)
+ _date.substring(14, 16)
+ _date.substring(17, 19);
}
return "";
}
/**
* 獲取一個字符串的絕對長度(如果遇到漢字字符則算兩個)
* @param s 傳入的字串
* @return 字串的絕對長度
*/
public static int absoluteLength(String s) {
if (s == null) {
return 0;
}
try {
return new String(s.getBytes("GB2312"), "8859_1").length();
}
catch (Exception e) {
return s.length();
}
}
/**
* 對一個字符串的絕對長度進行拆解(如果遇到漢字字符會把它當作兩個字符處理)
* @param s 傳入的字串
* @param start 起始絕對位置
* @param end 終止絕對位置
* @return 返回的字串
*/
public static String absoluteSubstring(String s, int start, int end) {
if (s == null) {
return null;
}
try {
String s2 = new String(s.getBytes("GB2312"), "8859_1");
s2 = s2.substring(start, end);
return new String(s2.getBytes("8859_1"), "GB2312");
}
catch (Exception e) {
return s.substring(start, end);
}
}
/**
* 擴充一個字串,使其絕對長度爲指定的長度,如果過長就截斷,過短就補充指定的字串
* @param str 傳入的字串
* @param updateStr 填充的字串
* @param num 指定的長度
* @param flag 填補字符串的位置:true的話在前面填補、false在後面填補
* @return 返回的字串
*/
public static String updateAbsoluteLength(
String str,
String updateStr,
int num,
boolean flag) {
if (updateStr == null) {
return str;
}
if (str == null) {
str = "";
for (int i = 0; i < num; i++) {
str += updateStr;
}
return str;
}
if (absoluteLength(str) == num) {
return str;
}
else if (absoluteLength(str) < num) {
for (int i = absoluteLength(str); i < num; i++) {
if (flag) {
str = updateStr + str;
}
else {
str = str + updateStr;
}
}
return str;
}
else {
return absoluteSubstring(str, 0, absoluteLength(str) - num);
}
}
public static String updateAbsoluteLength(
String str,
String updateStr,
int num) {
return updateAbsoluteLength(str, updateStr, num, true);
}
public static void main(String[] args) {
String c = new String("管振宇");
String c2 = new String("劉蓓麗");
String c3 = new String("administrator");
System.out.println(StringFunction.updateAbsoluteLength(c, "& ", 28));
System.out.println(StringFunction.updateAbsoluteLength(c2, "& ", 28));
System.out.println(StringFunction.updateAbsoluteLength(c3, "& ", 28));
}
}
/*******************************************************************************************************************************************************************8
IE緩存jsp文件
1、使用java提供的方法,在jsp或者servlet中都可以
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
%>
2|、使用HTML標記,如下面:
<HEAD>
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</HEAD>
/********************************************************************************************************************************************88
Md5 算法java實現!
import java.security.*;
import java.math.*;
public class TestMd5
{
public String MD5(String sInput) throws Exception{
String algorithm="";
//輸入不能爲空
if(sInput.trim()==null){
return "null";
}
//指定採用MD5算法
try{
algorithm=System.getProperty("MD5.algorithm","MD5");
}catch(SecurityException se){
}
//定義MessageDigest對象
MessageDigest md=MessageDigest.getInstance(algorithm);
//按照系統缺省的字符編碼方式把sInput 轉換成字節,並把結果存到一新的字節數組buffer中
byte buffer[]=sInput.getBytes();
//從指定的字節數組buffer的偏移量0開始,用指定的字節數組修改由sInput生成摘要
//count爲從 0 開始用的字節數長度。
for(int count=0;count<sInput.length();count++)
{
md.update(buffer,0,count);
}
//通過執行最後的諸如填充的操作完成散列碼的計算。 在調用之後復位該摘要
//返回存放結果散列值的字節數組bDigest
byte bDigest[]=md.digest();
//將bDigest轉換爲大整數bi
BigInteger bi=new BigInteger(bDigest);
//返回bi字符串表示,即最終的編碼結果
return(bi.toString(16));
}
public static void main(String [] a)
{
TestMd5 my = new TestMd5();
try
{
System.out.println(my.MD5("abc"));
//50f260602273676bfc60ab35352d8d40 //111
//-19da6a11674a7aeac2537831e54963c4 //abc
}catch (Exception e){}
}
}
/**************************************************************************************************************************************************************************************************************
解決多國語言..
1、根據系統默認的語言設置讀取參數值的類Resource:
package i18n.article;
import java.io.*;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
/**
* <p>Title:多國語言的後臺實現類 </p>
* <p>Description: 根據屬性文件及區域與語言設置,得到對應的語言</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: Timer Corporation</p>
* @author:宋兆輝
* @version 1.0
*/
public class Resource {
private static final String HEAD_FILE = "ATTR"; //屬性文件名的前綴
private static final String LAST_FILE=".properties"; //屬性文件名的後綴
private static final String FILE_PATH="c://"; //定義屬性文件存放的目錄
public Resource() {
}
/*以下是根據傳入的屬性文件中的"鍵",而得到與區域與語言設置相對應的"值"*/
public synchronized String srcStr(String disStr) {
String ret = "";
try {
Locale locale = Locale.getDefault(); //獲取系統的區域與語言默認設置
System.out.println("");
String baseName = new StringBuffer()
.append(HEAD_FILE).append("_").append(locale.toString())
.append(LAST_FILE).toString(); //根據local屬性,前綴以及後綴生成文件名
String fileName = new StringBuffer(FILE_PATH).append(baseName)
.toString(); //獲取文件的完整路徑
InputStream is = new FileInputStream(fileName); //生成文件輸入流
PropertyResourceBundle pr = new PropertyResourceBundle(is); //根據輸入流構造PropertyResourceBundle的實例
ret = pr.getString(disStr);
if(locale.equals(Locale.CHINA)){
ret = new String(ret.getBytes("ISO-8859-1"),"GB2312");
} //如果是要顯示中文,則要進行內碼的轉換
is.close();
return ret;
}
catch (Exception e) {
e.printStackTrace();
return disStr;
}
}
}
2、對應的properties文件:ATTR.properties和ATTR_zh_CN.properties
(1)ATTR_en_US.properties:
LoginName=login name
Password=password
Login=login
LoginTime=loginTime
LogOff=logout
ChineseVersion=English Version
MainPage=home
SoftWare=softWare
Hardware=Hardware
YourLocationMainPage=YourLocationMainPage
MyCalendar=MyCalendar
MyMails=MyMails
R&D=R&D
Forum=Forum
DeveloperProcess=DeveloperProcess
TechnologyCommunion=TechnologyCommunion
(2)ATTR_zh_CN.properties:
LoginName=用戶
Password=密碼
Login=登陸
LoginTime=登陸時間
LogOff=註銷登陸
ChineseVersion=中文版
MainPage=首頁
SoftWare=軟件
Hardware=硬件
YourLocationMainPage=當前位置:首頁
MyCalendar=我的日程
MyMails=我的郵件
R&D=研發區
Forum=討論區
DeveloperProcess=開發進程
TechnologyCommunion=技術交流
3、對應的jsp文件:
本例中有3個jsp頁面:
(1)login.jsp:(登陸頁面)
圖1-登陸頁面_中文
圖2—登陸頁面_英文
<%@ page contentType="text/html; charset=GB2312" %>
<HTML>
<HEAD>
<TITLE></TITLE>
<link href="css/style.css" rel="stylesheet" type="text/css">
<script language = javascript>
function focusIt() {
window.document.login.loginName.focus();
}
</script>
</HEAD>
<jsp:useBean id="resource" scope="application" class="i18n.article.Resource"/>
<BODY onload="javascript:focusIt();" bgcolor="#ffffff">
<form name="login" method="post" action="main.jsp">
<table border=0 cellpadding=0 cellspacing=0 align=center>
<tr>
<td height="150"></td></tr>
<tr>
<td width=262><img alt="" border=0 src="images/cover_r1_c1.jpg"></td>
<td> </td>
<td>
<table border=0 cellpadding=1 cellspacing=1>
<tr>
<td>
<p align=right><%=resource.srcStr("LoginName")%></p></td>
<td><input type=text name="loginName" ID=Text1></td></tr>
<tr>
<td>
<p align=right><%=resource.srcStr("Password")%></p></td>
<td><input type=password name="password" ID=Password1></td></tr>
<tr>
<td> </td>
<td align=center>
<input class="button" type=submit value=" <%=resource.srcStr("Login")%> " ID=Submit1></td></tr>
</table>
</td></tr>
<tr>
<td colspan=3><img alt="" border=0
src="images/cover_r2_c1.jpg"></td></tr>
<tr>
<td colspan=3><img alt="" border=0
src="images/cover_r3_c1.jpg"></td></tr>
<tr>
<td colspan=3 height=20> </td>
</tr>
<tr>
<td colspan=3 align=center><font color="#c0c0c0">Best Viewed In IE5.0 Or Up ,1024x768</font></td>
</tr>
<tr>
<td colspan=3><hr size=1 width="100%" color="#c0c0c0"></td>
</tr>
<tr>
<td colspan=3 align=center>© 2003 Corporation. All rights reserved.</td>
</tr>
</table>
</form>
</BODY>
</HTML>
圖3-主頁面_中文
圖3主頁面_英文
(2)main.jsp:(主頁面左邊及上邊部分)
%@ page contentType="text/html; charset=GB2312" %>
<jsp:useBean id="resource" scope="application" class="i18n.article.Resource"/>
<HTML>
<HEAD>
<TITLE></TITLE>
<META NAME="GENERATOR" Content="Microsoft Visual Studio">
<META HTTP-EQUIV="Content-Type" content="text/html; charset=UTF-8">
<LINK rel="stylesheet" href="css/style.css" type="text/css">
</HEAD>
<BODY topMargin=2 leftMargin=2 bgcolor="#ffffff">
<TABLE WIDTH="100%" HEIGHT="100%" BORDER="0" CELLSPACING="0" CELLPADDING="0">
<tr>
<td height=80>
<%
String loginName = request.getParameter("loginName");
%>
<table width=100% height=100% cellpadding=0 cellspacing=0 border=0>
<tr>
<td width=163 rowspan=3><img src="images/system_logo.jpg" border=0></td>
<td width=30 rowspan=3><img src="images/logo_linked_corner.gif" border=0></td>
<td width=140><img src="images/logo_extended_bar.jpg" border=0></td>
<td height=25 bgcolor="#95ADD3" align=right class="P1">
<%=resource.srcStr("LoginTime")%><%=new java.util.Date().toLocaleString()%>
<%=resource.srcStr("LoginName")%><%=loginName%>
<img src="images/logout.gif" align="absMiddle" border=0>
<a href="login.jsp"><%=resource.srcStr("LogOff")%></a>
<img src="images/row_ender.jpg" align="absMiddle" border=0></td>
</tr>
<tr><td height=30 colspan=2><p>
<a href="#"><%=resource.srcStr("MainPage")%></a> |
<a href="#"><%=resource.srcStr("SoftWare")%></a> |
<a href="#"><%=resource.srcStr("Hardware")%></a> | </p></td></tr>
<tr><td height=25 colspan=2<%=resource.srcStr("YourLocationMainPage")%>></td></tr>
</table>
</td>
</tr>
<tr>
<td>
<table width=100% height=100% cellpadding=0 cellspacing=0 border=0>
<tr>
<td width=165 valign=top>
<table width=100% cellpadding=0 cellspacing=0 border=0>
<tr><td colspan=2><img src="images/left_menu_top.jpg" border=0></td></tr>
<tr><td width=35 align=left><img src="images/left_menu_colbar.jpg" border=0></td>
<td width=130 align=left valign=top>
<table width=100% cellpadding=0 cellspacing=0 border=0>
<tr><td style="cursor:hand;"><p><%=resource.srcStr("MyCalendar")%></p></td></tr>
<tr><td><hr size=1 width=100% color="#C6FF00"></td></tr>
<tr><td style="cursor:hand;"><p><%=resource.srcStr("MyMails")%></p></td></tr>
<tr><td><hr size=1 width=100% color="#C6FF00"></td></tr>
<tr><td style="cursor:hand;"><p><%=resource.srcStr("DeveloperProcess")%></p></td></tr>
<tr><td><hr size=1 width=100% color="#C6FF00"></td></tr>
<tr><td style="cursor:hand;"><p><%=resource.srcStr("TechnologyCommunion")%></p></td></tr>
<tr><td><hr size=1 width=100% color="#C6FF00"></td></tr>
<tr><td style="cursor:hand;"><p><%=resource.srcStr("Forum")%></p></td></tr>
<tr><td><hr size=1 width=100% color="#C6FF00"></td></tr>
<tr><td style="cursor:hand;"><p><%=resource.srcStr("R&D")%></p></td></tr>
<tr><td><hr size=1 width=100% color="#C6FF00"></td></tr>
</table>
</td>
</tr>
</table>
</td>
<td><IFRAME frameBorder=0 id=main name=main scrolling=auto src="version.jsp"
style="HEIGHT: 100%; VISIBILITY: inherit; WIDTH: 100%; Z-INDEX: 1"></IFRAME></td>
</tr>
</table>
</td>
</tr>
<tr>
<td height=50 valign=top>
<table width=100% cellpadding=0 cellspacing=0 border=0>
<tr><td align=center><hr size=1 width=80% color="#95ADD3"></td></tr>
<tr><td align=center>?2003 Corporation. All rights reserved.</td></tr>
</table>
</td>
</tr>
</TABLE>
</BODY>
</HTML>
(3)version.jsp:(主頁面的中間部分)
<%@ page contentType="text/html; charset=GBK" %>
<jsp:useBean id="resource" scope="application" class="i18n.article.Resource"/>
<HTML>
<HEAD>
<TITLE></TITLE>
<META HTTP-EQUIV="Content-Type" content="text/html; charset=UTF-8">
</HEAD>
<BODY leftMargin="0" topMargin="0">
<table width="100%" height="100%" cellpadding=0 cellspacing=0 border=0>
<tr>
<td align=center valign=middle colspan=2>
<table align="center" border="0" cellspacing="3" cellpadding="5" style="filter:dropshadow(color=gray,offx=5,offy=5,positive=1);">
<tr>
<td width=400 height=100 bgcolor="#CBD3EA" align="center" style="border: 1px #0A246A solid;">
<p><font color="#5c6bac" style="font-size:30px;"><b><%=resource.srcStr("ChineseVersion")%></b></font></p>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td width=50% valign=top align=center> </td>
<td width=50% height=155 align=center><img src="images/internationalization.jpg"></td>
</tr>
</table>
</BODY>
</HTML>
/************************************************************************************************************************************************************
支持一下,request 工具
package com.commons.util;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletContext;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import java.io.IOException;
/**
* request工具類
*
* @author
* @version 1.0
*/
public class RequestUtil {
private RequestUtil() {
}
public static Object requsetGetObject(HttpServletRequest req, String name) {
Object result = req.getAttribute(name);
if (result == null) {
result = req.getParameter(name);
}
return result;
}
public static String requestGetString(HttpServletRequest req, String name) {
String result = (String) req.getAttribute(name);
if (result == null) {
result = req.getParameter(name);
}
return result;
}
public static String requestGetString(HttpServletRequest req, String name, String defaultValue) {
String result = (String) req.getAttribute(name);
if (result == null) {
result = req.getParameter(name);
}
if (result == null) {
result = defaultValue;
}
return result;
}
public static int requestGetInt(HttpServletRequest req, String name) {
String result = requestGetString(req, name);
if (result != null) {
Integer i = new Integer(result);
return i.intValue();
}
return 0;
}
public static double requestGetDouble(HttpServletRequest req, String name) {
String result = requestGetString(req, name);
if (result != null) {
Double d = new Double(result);
return d.doubleValue();
}
return 0;
}
public static boolean requestGetBoolean(HttpServletRequest req, String name) {
String result = requestGetString(req, name);
if (result != null) {
Boolean b = new Boolean(result);
return b.booleanValue();
}
return false;
}
public static String[] requestGetArray(HttpServletRequest req, String name) {
String[] sa = null;
if (sa == null) {
sa = req.getParameterValues(name);
}
return sa;
}
public static void forward(ServletConfig sc, HttpServletRequest req, HttpServletResponse res, String toUrl) throws
ServletException, IOException {
ServletContext ctx = sc.getServletContext();
RequestDispatcher dispatcher = ctx.getRequestDispatcher(toUrl);
dispatcher.forward(req, res);
}
public static void include(ServletConfig sc, HttpServletRequest req, HttpServletResponse res, String toUrl) throws
ServletException, IOException {
ServletContext ctx = sc.getServletContext();
RequestDispatcher dispatcher = ctx.getRequestDispatcher(toUrl);
dispatcher.include(req, res);
}
public static String requestGetUrl(HttpServletRequest request) {
String contextPath = request.getContextPath();
String servletPath = request.getServletPath();
String queryString = request.getQueryString();
if (queryString == null || queryString.equals(""))
return contextPath + servletPath;
else
return contextPath + servletPath + "?" + queryString;
}
public static String requestGetCleanUrl(HttpServletRequest request) {
String contextPath = request.getContextPath();
String servletPath = request.getServletPath();
return contextPath + servletPath;
}
}
/********************************************************************************************************************************************
右鍵菜單的淡入淡出效果
<HTML><HEAD><TITLE>右鍵菜單的淡入淡出效果</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<SCRIPT language=JavaScript>
<!-- // RightClickMenu
var intDelay=10; //設置菜單顯示速度,越大越慢
var intInterval=5; //每次更改的透明度
function showmenuie5(){
var rightedge=document.body.clientWidth-event.clientX
var bottomedge=document.body.clientHeight-event.clientY
if (rightedge<ie5menu.offsetWidth)
ie5menu.style.left=document.body.scrollLeft+event.clientX-ie5menu.offsetWidth
else
ie5menu.style.left=document.body.scrollLeft+event.clientX
if (bottomedge<ie5menu.offsetHeight)
ie5menu.style.top=document.body.scrollTop+event.clientY-ie5menu.offsetHeight
else
ie5menu.style.top=document.body.scrollTop+event.clientY
ie5menu.style.visibility="visible"
//ie5menu.style.visibility=""
ie5menu.filters.alpha.opacity=0
GradientShow()
return false
}
function hidemenuie5(){
//ie5menu.style.visibility="hidden"
GradientClose()
}
function highlightie5(){
if (event.srcElement.className=="menuitems"){
event.srcElement.style.backgroundColor="highlight"
event.srcElement.style.color="white"
}
}
function lowlightie5(){
if (event.srcElement.className=="menuitems"){
event.srcElement.style.backgroundColor=""
event.srcElement.style.color="#000000"
}
}
function jumptoie5(){
if (event.srcElement.className=="menuitems"){
if (event.srcElement.url != ''){
if (event.srcElement.getAttribute("target")!=null)
window.open(event.srcElement.url,event.srcElement.getAttribute("target"))
else
window.location=event.srcElement.url
}
}
}
function GradientShow() //實現淡入的函數
{
ie5menu.filters.alpha.opacity+=intInterval
if (ie5menu.filters.alpha.opacity<100) setTimeout("GradientShow()",intDelay)
}
function GradientClose() //實現淡出的函數
{
ie5menu.filters.alpha.opacity-=intInterval
if (ie5menu.filters.alpha.opacity>0) {
setTimeout("GradientClose()",intDelay)
}
else {
ie5menu.style.visibility="hidden"
}
}
function ChangeBG() //改變菜單項的背景顏色,這裏的兩種顏色值可以改爲你需要的
{
oEl=event.srcElement
if (oEl.style.background!="navy") {
oEl.style.background="navy"
}
else {
oEl.style.background="#cccccc"
}
}
// -->
</SCRIPT>
<style type=text/css>
.cMenu {
FILTER: alpha(opacity=0);BACKGROUND-COLOR: #D6D3CE;BORDER-BOTTOM: #666666 2px solid; BORDER-LEFT: #E4E4E4 2px solid; BORDER-RIGHT: #666666 2px solid; BORDER-TOP: #E4E4E4 2px solid; COLOR: #000000; CURSOR: default; FONT-SIZE: 9pt; color:#000000;FONT-WEIGHT:
normal; LINE-HEIGHT: 20px; POSITION: absolute; VISIBILITY: hidden; WIDTH: 110px
}
.menuitems {
font-size:9pt;
MARGIN: 2px;
PADDING-BOTTOM: 0px;
PADDING-LEFT: 15px;
PADDING-RIGHT: 3px;
PADDING-TOP: 0px;
}
</style>
<META content="Microsoft FrontPage 4.0" name=GENERATOR>
</HEAD>
<BODY>
<OBJECT classid=CLSID:8856F961-340A-11D0-A96B-00C04FD705A2 height=0 id=WebBrowser width=0>
</OBJECT>
<RIGHTCLICK><!--[if IE]>
<DIV class=cMenu id=ie5menu onclick=jumptoie5() onmouseout=lowlightie5()
onmouseover=highlightie5()>
<DIV class=menuitems url="javascript:click_obj(0)">後退</DIV>
<DIV class=menuitems url="javascript:click_obj(1)">前進</DIV>
<DIV class=menuhr><hr style="width:100%"></DIV>
<DIV class=menuitems url="javascript:click_obj(2)">刷新</DIV>
<DIV class=menuitems url="javascript:click_obj(3)">加入收藏夾</DIV>
<DIV class=menuitems url="javascript:click_obj(4)">查看源文件</DIV>
<DIV class=menuhr><hr style="width:100%"></DIV>
<DIV class=menuitems url="javascript:click_obj(5)">屬性</DIV>
</DIV>
<![endif]-->
<SCRIPT language=JavaScript>
<!--
function click_obj(id){
switch(id){
case 0:
history.back()
break
case 1:
history.forward()
break
case 2:
window.location.reload()
break
case 3:
window.external.AddFavorite(location.href, document.title)
break
case 4:
window.location = "view-source:" + window.location.href
break
case 5:
document.all.WebBrowser.ExecWB(10,1)
break
}
}
if (document.all&&window.print){
ie5menu.className="cMenu"
document.oncontextmenu=showmenuie5
document.body.onclick=hidemenuie5
}
//-->
</SCRIPT>
</RIGHTCLICK>
</BODY></HTML>
/********************************************************************************************************************************************88
不準確的頁面loging
<script>
var text="正在載入文檔";i=0;
function load() {
if (i<6) {
text+=".";
Waiting.innerText=text;
i++;}
else {text="正在載入文檔";i=0;}}
timer=window.setInterval("load()",300);
</script>
/*****************************************************************************************************************************************
不準確的頁面loging
<script>
var text="正在載入文檔";i=0;
function load() {
if (i<6) {
text+=".";
Waiting.innerText=text;
i++;}
else {text="正在載入文檔";i=0;}}
timer=window.setInterval("load()",300);
</script>
/*********************************************************************************************************************88
我貼一個限制輸入類型的,代碼如下:
function KeyInput(flag,sTag){
var rtn=false;
if(sTag!=""){
for(var i=0;i<sTag.length;i++){
if (event.keyCode==sTag.charCodeAt(i))
rtn=true;
}
}
if (flag==0){//只輸入數字
if((event.keyCode>=48)&&(event.keyCode<=57))
rtn=true;
}
else if (flag==1){//只輸入字母
if(((event.keyCode>=65)&&(event.keyCode<=90)) ||
((event.keyCode>=97)&&(event.keyCode<=122)))
rtn=true;
}
else if (flag==2){//輸入字母和數字
if( ( (event.keyCode>=65)&&(event.keyCode<=90 ) ) ||
( (event.keyCode>=97)&&(event.keyCode<=122) ) ||
( (event.keyCode>=48)&&(event.keyCode<=57 ) ) )
rtn=true;
}
else{//所有
rtn=true;
}
event.returnValue=rtn;
}
/***************************************************************************************************************************
獲得隨機數(String型),代碼如下:
import java.util.*;
import java.security.SecureRandom;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
/**
* 一個獲得隨機數的類
* <p>Copyright: 2004</p>
* @author Filippo Guan
* @version 1.1
*/
public class RandomStr
{
static String randomstr;
static boolean allchars = false;
//欠缺是8位字符串
static Integer length = new Integer(8);
static HashMap hmap;
static ArrayList lower = null;
static ArrayList upper = null;
static char[] single = null;
static int singlecount = 0;
static boolean singles = false;
static String algorithm = null;
static String provider = null;
static boolean secure = false;
static Random random = null;
static SecureRandom secrandom = null;
private static float getFloat()
{
if (random == null)
{
return secrandom.nextFloat();
}
else
{
return random.nextFloat();
}
}
public static void generateRandomObject() throws Exception
{
// check to see if the object is a SecureRandom object
if (secure)
{
try
{
// get an instance of a SecureRandom object
if (provider != null)
{
random = SecureRandom.getInstance(algorithm, provider);
}
else
{
random = SecureRandom.getInstance(algorithm);
}
}
catch (NoSuchAlgorithmException ne)
{
throw new Exception(ne.getMessage());
}
catch (NoSuchProviderException pe)
{
throw new Exception(pe.getMessage());
}
}
else
{
random = new Random();
}
}
/**
* generate the random string
*/
private static void generaterandom()
{
if (allchars)
{
for (int i = 0; i < length.intValue(); i++)
{
randomstr = randomstr + new Character((char)((int) 34 +((int)(getFloat() * 93)))).toString();
}
}
else if (singles)
{
// check if there are single chars to be included
if (upper.size() == 3)
{
// check for the number of ranges max 3 uppercase lowercase digits build the random string
for (int i = 0; i < length.intValue(); i++)
{
// you have four groups to choose a random number from, to make
// the choice a little more random select a number out of 100 get a random number even or odd
if (((int) (getFloat() * 100)) % 2 == 0)
{
// the number was even get another number even or odd
if (((int) (getFloat() * 100)) % 2 == 0)
{
// choose a random char from the single char group
randomstr = randomstr + randomSingle().toString();
}
else
{
// get a random char from the first range
randomstr = randomstr + randomChar((Character)lower.get(2),(Character)upper.get(2)).toString();
}
}
else
{
// the number was odd
if (((int) (getFloat() * 100)) % 2 == 0)
{
// choose a random char from the second range
randomstr = randomstr + randomChar((Character)lower.get(1),(Character)upper.get(1)).toString();
}
else
{
// choose a random char from the third range
randomstr = randomstr + randomChar((Character)lower.get(0),(Character)upper.get(0)).toString();
}
}
}
}
else if (upper.size() == 2)
{
// single chars are to be included choose a random char from
// two different ranges build the random char from single chars and two ranges
for (int i = 0; i < length.intValue(); i++)
{
// select the single chars or a range to get each random charfrom
if (((int)(getFloat() * 100)) % 2 == 0)
{
// get random char from the single chars
randomstr = randomstr + randomSingle().toString();
}
else if (((int) (getFloat() * 100)) % 2 == 0)
{
// get the random char from the first range
randomstr = randomstr + randomChar((Character)lower.get(1),(Character)upper.get(1)).toString();
}
else
{
// get the random char from the second range
randomstr = randomstr + randomChar((Character)lower.get(0),(Character)upper.get(0)).toString();
}
}
}
else if (upper.size() == 1)
{
// build the random string from single chars and one range
for (int i = 0; i < length.intValue(); i++)
{
if (((int) getFloat() * 100) % 2 == 0)
{
// get a random single char
randomstr = randomstr + randomSingle().toString();
}
else
{
// get a random char from the range
randomstr = randomstr + randomChar((Character)lower.get(0),(Character)upper.get(0)).toString();
}
}
}
else
{
// build the rand string from single chars
for (int i = 0; i < length.intValue(); i++)
{
randomstr = randomstr + randomSingle().toString();
}
}
}
else
{
// no single chars are to be included in the random string
if (upper.size() == 3)
{
// build random strng from three ranges
for (int i = 0; i < length.intValue(); i++)
{
if (((int) (getFloat() * 100)) % 2 == 0)
{
// get random char from first range
randomstr = randomstr + randomChar((Character)lower.get(2),(Character)upper.get(2)).toString();
}
else if (((int) (getFloat() * 100)) % 2 == 0)
{
// get random char form second range
randomstr = randomstr + randomChar((Character)lower.get(1),(Character)upper.get(1)).toString();
}
else
{
// get random char from third range
randomstr = randomstr + randomChar((Character)lower.get(0),(Character)upper.get(0)).toString();
}
}
}
else if (upper.size() == 2)
{
// build random string from two ranges
for (int i = 0; i < length.intValue(); i++)
{
if (((int) (getFloat() * 100)) % 2 == 0)
{
// get random char from first range
randomstr = randomstr + randomChar((Character)lower.get(1),(Character)upper.get(1)).toString();
}
else
{
// get random char from second range
randomstr = randomstr + randomChar((Character)lower.get(0),(Character)upper.get(0)).toString();
}
}
}
else
{
// build random string
for (int i = 0; i < length.intValue(); i++)
{
// get random char from only range
randomstr = randomstr + randomChar((Character)lower.get(0),(Character)upper.get(0)).toString();
}
}
}
}
/**
* generate a random char from the single char list
*
* @returns - a randomly selscted character from the single char list
*
*/
private static Character randomSingle()
{
return (new Character(single[(int)((getFloat() * singlecount) - 1)]));
}
/**
* generate a random character
*
* @param lower lower bound from which to get a random char
* @param upper upper bound from which to get a random char
*
* @returns - a randomly generated character
*
*/
private static Character randomChar(Character lower, Character upper)
{
int tempval;
char low = lower.charValue();
char up = upper.charValue();
// get a random number in the range lowlow - lowup
tempval = (int)((int)low + (getFloat() * ((int)(up - low))));
// return the random char
return (new Character((char) tempval));
}
/**
* get the randomly created string for use with the
* <jsp:getProperty name=<i>"id"</i> property="randomstr"/>
*
* @return - randomly created string
*
*/
public static String getRandom()
{
randomstr = new String();
generaterandom(); // generate the first random string
if (hmap != null)
{
while (hmap.containsKey(randomstr))
{
// random string has already been created generate a different one
generaterandom();
}
hmap.put(randomstr, null); // add the new random string
}
return randomstr;
}
/**
* set the ranges from which to choose the characters for the random string
*
* @param low set of lower ranges
* @param up set of upper ranges
*
*/
public static void setRanges(ArrayList low, ArrayList up)
{
lower = low;
upper = up;
}
/**
* set the hashmap that is used to check the uniqueness of random strings
*
* @param map hashmap whose keys are used to insure uniqueness of random strgs
*
*/
public static void setHmap(HashMap map)
{
hmap = map;
}
/**
* set the length of the random string
*
* @param value length of the random string
*
*/
public static void setLength(String value)
{
length = new Integer(value);
}
/**
* set the algorithm name
*
* @param value name of the algorithm to use for a SecureRandom object
*
*/
public static void setAlgorithm(String value)
{
algorithm = value;
secure = true; // a SecureRandom object is to be used
}
/**
* set the provider name
*
* @param value name of the package to check for the algorithm
*
*/
public static void setProvider(String value)
{
provider = value;
}
/**
* set the allchars flag
*
* @param value boolean value of the allchars flag
*
*/
public static void setAllchars(boolean value)
{
allchars = value;
}
/**
* set the array of single chars to choose from for this random string and the
* number of chars in the array
*
* @param chars the array of single chars
* @param value the number of single chars
*
*/
public static void setSingle(char[] chars, int value)
{
single = chars; // set the array of chars
singlecount = value; // set the number of chars in array single
singles = true; // set flag that single chars are in use
}
public static void setCharset(String value)
{
// values tells the method whether or not to check for single chars
boolean more = true;
// create the arraylists to hold the upper and lower bounds for the char
// ranges
lower = new ArrayList(3);
upper = new ArrayList(3);
// user has chosen to use all possible characters in the random string
if (value.compareTo("all") == 0)
{
allchars = true; // set allchars flag
// all chars are to be used so there are no single chars to sort
// through
more = false;
}
else if ((value.charAt(1) == '-') && (value.charAt(0) != '\\'))
{
// run through the ranges at most 3
while (more && (value.charAt(1) == '-'))
{
// check to make sure that the dash is not the single char
if (value.charAt(0) == '\\')
{
break;
}
else
{
// add upper and lower ranges to there list
lower.add(new Character(value.charAt(0)));
upper.add(new Character(value.charAt(2)));
}
// check to see if there is more to the charset
if (value.length() <= 3)
{
more = false;
}
else
{
// create a new string so that the next range if there is one
// starts it
value = value.substring(3);
}
}
}
// if more = false there are no single chars in the charset
if (more)
{
single = new char[30]; // create single
// create a set of tokens from the string of single chars
StringTokenizer tokens = new StringTokenizer(value);
while (tokens.hasMoreTokens())
{
// get the next token from the string
String token = tokens.nextToken();
if (token.length() > 1)
{
// char is a - add it to the list
single[singlecount++] = '-';
}
// add the current char to the list
single[singlecount++] = token.charAt(0);
}
}
if ((lower == null) && (single == null))
setCharset("a-zA-Z0-9");
}
}
關於使用:可以獲得0-9 a-z A-Z 中的隨機數.
RandomStr.setCharset("0-9"); //範圍
RandomStr.setLength("8"); //長度
RandomStr.generateRandomObject();
隨機數(字符型) = RandomStr.getRandom();
/************************************************************************************************************************************************************************
/* 將當前日期加減n天數。
* 如傳入字符型"-5" 意爲將當前日期減去5天的日期
* 如傳入字符型"5" 意爲將當前日期加上5天后的日期
* 返回字串 例(1999-02-03)
*/
public String dateAdd(String to)
{
//日期處理模塊 (將日期加上某些天或減去天數)返回字符串
int strTo;
try {
strTo = Integer.parseInt(to);
}
catch (Exception e) {
System.out.println("日期標識轉換出錯! : \n:::" + to + "不能轉爲數字型");
e.printStackTrace();
strTo = 0;
}
Calendar strDate = Calendar.getInstance(); //java.util包
strDate.add(strDate.DATE, strTo); //日期減 如果不夠減會將月變動
//生成 (年-月-日) 字符串
String meStrDate = strDate.get(strDate.YEAR) + "-" +
String.valueOf(strDate.get(strDate.MONTH)+1) + "-" + strDate.get(strDate.DATE);
return meStrDate;
}
/******************************************************************************************************************************************88
JSP中文件上傳
一、前言
文件上載對於任何web應用程序都是一個很有用處的功能。比如,在基於web的email中使用文件上載在消息中加入附件;在技術支持站點可以使用文件上載接收從用戶處發來的錯誤日誌和缺陷報告文檔;在web應用中使用文件上載,通過友好的web界面在用戶間共享文件。本文將對如何在JSP編程中上載文件進行討論,並給出解決方法。
二、文件上載的方式
在TCP/IP中最早出現的文件上載機制是FTP,它是將文件由客戶端發送到服務器的標準機制。它很可靠,能夠考慮到跨平臺的文本和二進制格式文件。但在JSP編程中不能使用FTP方法來上載文件,這是由JSP的運行機制所決定的。我們知道:JSP(JavaServer Pages)是由Sun MicroSystems公司倡導、許多公司參與,一起建立的一種動態網頁技術標準。它在傳統的網頁HTML文件中加入JAVA程序片段和JSP標記就構成了JSP網頁。web服務器在遇到訪問JSP網頁請求時,首先執行其中的程序片段,然後將執行結果以HTML形式返回客戶。這種運行機制就要求客戶與服務器的聯繫需要使用HTTP協議而不能是FTP協議。
在HTTP協議中上載文件主要有兩種機制:
1)RFC1867方式:RFC1867在作爲標準發佈之前首先被Netscape的Navigator 2.0中採用。隨後被Microsoft的IE3.0的附件和IE3.03的一部分使用。它是一種簡單實用的方法。只在表單字段中定義一個file類型的input:
<input type="file">
並且在表單本身中加入了不同的編碼方案,它不再使用典型的:
<form action="test.jsp" method="post">
而是使用
<form action="test.jsp" method="post" enctype="multipart/form-data">
這種編碼方案在傳送大量數據時比缺省的"application/x-url-encoded"表單編碼方案要效率高得多。因爲URL編碼只有很有限的字符集。當使用任何超出字符集的字符時,必須用"%nn"代替(這裏的nn表示相應的兩個十進制數)。這樣即使是普通的空格字符也要用"%20"代替。那麼,通過URL編碼方式上載的文件將會是原來的2-3倍大。而使用RFC1867編碼方式則只是在傳送數據的周圍加上很簡單的頭部來標識文件內容。
2)put方式:在HTTP1.1中引入了一個新的HTTP動詞:put。當web服務器收到一個HTTP的put請求和對象名字(如:"/myweb/images/x.gif")時,它會驗證用戶,接收HTTP流的內容,並把它直接存入web服務器。由於這種方式可能會對一個web站點造成破壞,因而並不常用。而且它也失去了web服務器端的最大優勢:服務器的可編程性。在使用put方式時,服務器自己處理客戶的請求,沒有空間讓JSP介入,因此,此方式對於JSP應用開發都是毫無用處的。
三、JSP中實現文件上載的方法
從以上分析中我們可以得出結論:RFC1867是在JSP編寫的web應用程序中實現文件上載的最好方法。它是如何在實際應用的呢?
這裏將介紹一種簡單而實用的方法,只需要幾行代碼就可以在JSP程序中實現文件上載。這就是使用一個免費的JAVA組件JspSmartUpload(http://www.jspsmart.com)實現文件上載。
1) JspSmartUpload的配置要求
安裝JspSmartUpload組件需要如下的配置:
a. web服務器(如IIS,apache等)
b. JDK1.1.2以上的JAVA編譯器
c. 支持JSP1.1及JavaServelet API 2.2的引擎。
其中的JSP引擎有許多產品,如:
Tomcat: http://java.sun.com/products/jsp/tomcat
Allaire Jrun: http://www.allaire.com/products/jrun
JSWDK: http://java.sun.com/produces/jsp/
IBM webSphere: http://www-4.ibm.com/software/webservers/
Resin: http://www.caucho.com
注意:本文將主要討論JspSmartUpload在Tomcat引擎中的安裝及使用。
2) JspSmartUpload的安裝
首先, 把下載的壓縮文件JspSmartUpload.zip解壓縮到/tomcat/webapps/ 目錄下(/tomcat目錄是你的tomcat引擎安裝的根目錄),這樣就會形成如下的目錄結構/tomcat/webapps/jspsmartupload/。所有必需的文件都在這個目錄下。
其次,把如下內容粘貼到/tomcat/conf/server.xml文件中。
<Context path="/jspsmartupload" docBase="/tomcat/webapps/jspsmartupload"
defaultSessionTimeOut="30" isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true" isWorkDirPersistent="false" />
最後,把如下的內容粘貼到/tomcat/conf/uniworkermap.properties文件中。
/jspsmartupload/*.jsp=ajp12
/jspsmartupload/servlet/*=ajp12
至此,jspsmartupload在tomcat引擎中的安裝就完成了。
3) 上載文件的HTML表單
如前所述,在JSP中文件上載使用的是RFC1867標準。在其中也規定了上載文件所使用的HTML表單的格式。此表單的格式被Netscape 3和Microsoft IE3.02以上的瀏覽器所支持。上載文件的表單發佈具備如下的格式:
a) 單所使用的方法必須是post
b) 在action屬性中的執行程序必須能處理由客戶端返回的數據
c) 表單必須使用MIME類型:multipart/form-data
d) 表單必須至少包含一個<input type=”file”>元素。與RFC1867兼容的瀏覽器將會在客戶端界面上顯示一個文本框和一個“遊覽”按鈕,以方便客戶端選擇上載的文件。
下面是使用此類型表單的HTML文件例子。
upload.htm
<HTML>
<BODY BGCOLOR="white">
<H1>jspUpload : Sample </H1>
<HR>
<form METHOD="POST" ACTION="/jspsmartupload/upload.jsp" NAME="PW" ENCTYPE="multipart/form-data">
<table CELLSPACING="0" CELLPADDING="3" BORDER="1" WIDTH="474">
<!-- FILE -->
<tr>
<td><small><font face="Verdana">
Select a first file :
</font></small></td>
<td><small><font face="Verdana">
<input TYPE="file" name="FILE1"></font></small></td>
</tr>
<tr>
<td><small><font face="Verdana">Select a second file : </font></small></td>
<td><small><font face="Verdana">
<input TYPE="file" name="FILE2"></font></small></td>
</tr>
<!-- TEXT -->
<tr>
<td width="150"><div align="left"><p><small><font face="Verdana">Text : </font></small></td>
<td width="324"><small><font face="Verdana"><input TYPE="TEXT" name="myText" value=""><br></font></small></td>
</tr>
<!-- SUBMIT -->
<tr>
<td colspan="2" width="474"><div align="center"><center><p><small><font face="Verdana"><input
TYPE="Submit"> </font></small></td>
</tr>
</table>
</form>
</BODY>
</HTML>
4) 使用JspSmartUpload處理表單
當客戶端submit表單以後,服務器將會調用表單action中的JSP程序處理客戶端的請求。在此JSP中就要調用JspSmartUpload來完成文件上載的請求。
在JSP程序中,首先要在<%@ page import=my.class %>中聲明引入JspSmartUpload類。然後使用JavaBean來實例化一個JspSmartUpload類。如:<jsp:useBean id=”mybean” class=”my.class”>。在實例化後,要使用JSP引擎隱含的對象pageContext對JspSmartUpload JavaBean進行初使化,這樣就把客戶端的請求傳給了JspSmartUpload組件。然後使用組件的upload()方法對客戶的請求進行分析,最後把這些數據通過save()方法存入一個文件。
下面是處理上一個HTML表單的JSP例程。
upload.jsp
<%@page language="java" import="com.jspsmart.upload.*"%>
<jsp:useBean id="myUpload" scope="page" class="com.jspsmart.upload.SmartUpload" />
<HTML>
<BODY BGCOLOR="white">
<H1>jspUpload : Sample</H1>
<HR>
<%
// 初使化
myUpload.initialize(pageContext);
// 分析客戶數據
myUpload.upload();
//
// 處理上載文件
//
out.println("<BR><STRONG>關於文件的信息</STRONG><BR>");
out.println("上載文件的數量 = " + myUpload.getFiles().getCount() + "<BR>");
//out.println("文件大小 (bytes) = " + myUpload.getFiles().getSize() +"<BR>");
for (int i=0;i<myUpload.getFiles().getCount();i++){
out.print(myUpload.getFiles().getFile(i).getFieldName());
if (!myUpload.getFiles().getFile(i).isMissing())
out.print(" = " + myUpload.getFiles().getFile(i).getFileName() + " (" + myUpload.getFiles().getFile(i).getSize() + ")");
else
out.print(" = 空");
out.println("<BR>");
}
//
// 處理客戶請求信息
//
out.println("<BR><BR><STRONG>顯示客戶表單數據</STRONG><BR>");
// 顯示請求名
java.util.Enumeration e = myUpload.getRequest().getParameterNames();
// 得到請求的值
while (e.hasMoreElements()) {
String key = (String)e.nextElement();
String[] values = myUpload.getRequest().getParameterValues(key);
// 顯示請求的值
for(int i = 0; i < values.length; i++) {
out.print(key + " = ");
out.print(values[i] + "<BR>");
}
}
%>
</BODY></HTML>
5) 運行例程
把上述的HTML表單例子及處理表單的JSP例程存到/tomcat/webapps/uspsmartupload/目錄下,然後運行/tomcat/bin/startup.bat啓動服務器。在IE或Netscape的地址欄中輸入:
http://localhost:8080/jspsmartupload/jspupload.htm
就可以看到運行結果了。
四、結論
JspSmartUpload組件不僅可以把客戶端的數據存入到文件中,也可以把它存入到數據庫中。而且,它的安裝及使用方法簡單易學,是一個非常好的上傳組件,可以給JSP編制的web應用程序提供更強大的功能。
/***********************************************************************************************************************************************************************************************************************************************88
檢查日期的函數,大家常用把。
function checkDate(obj_YMD,obj_nm){
date_flg = "0";
intYMD = fgetdata(obj_YMD);
intY = intYMD.substr(0,4);
intM = intYMD.substr(4,2);
intD = intYMD.substr(6,2);
if (intYMD.length != 0){
if (intYMD.length < 8 || intYMD.length > 8){
alert(obj_nm + "的位數不正確。");
obj_YMD.focus();
date_flg="1";
}
chkstr = "0123456789";
if (date_flg == "0") {
for (var i=0; i< intY.length; i++){
if ( chkstr.indexOf(intY.charAt(i)) == -1){
alert(obj_nm + "的年不正確。");
obj_YMD.focus();
date_flg="1";
break;
}
}
}
if (date_flg == "0") {
for (var i=0; i< intM.length; i++){
if ( chkstr.indexOf(intM.charAt(i)) == -1){
alert(obj_nm + "的月不正確。");
obj_YMD.focus();
date_flg="1";
break;
}
}
}
if (date_flg == "0") {
for (var i=0; i< intD.length; i++){
if ( chkstr.indexOf(intD.charAt(i)) == -1){
alert(obj_nm + "的日不正確。");
obj_YMD.focus();
date_flg="1";
break;
}
}
}
if (date_flg=="0" && intY < 1){
alert(obj_nm + "的年不正確。");
obj_YMD.focus();
date_flg="1";
}
if (date_flg=="0" && (intM > 12 || intM < 1)){
alert(obj_nm + "的月不正確。");
obj_YMD.focus();
date_flg="1";
}
if (date_flg=="0" && (intD > 31 || intD < 1)){
alert(obj_nm + "的日不正確。");
obj_YMD.focus();
date_flg="1";
}
Yper4 = intY % 4;
Yper100 = intY % 100;
Yper400 = intY % 400;
if (date_flg=="0" && (Yper4 == 0 && Yper100 != 0 && intM == 2 && intD >= 30)){
alert(intY+"年的2月是29日。");
obj_YMD.focus();
date_flg="1";
}
if (date_flg=="0" && (Yper400 == 0 && intM == 2 && intD >= 30)){
alert(intY+"年的2月是29日。");
obj_YMD.focus();
date_flg="1";
}
if (date_flg=="0" && (Yper4 != 0 && Yper100 != 0 && Yper400 != 0 && intM == 2 && intD >= 29)){
alert(intY+"年的2月是28日。");
obj_YMD.focus();
date_flg="1";
}
if (date_flg=="0" && (((intM == 4)||(intM == 6)||(intM == 9)||(intM == 11)) && intD >= 31)){
alert(intM+"月是30日。");
obj_YMD.focus();
date_flg="1";
}
}
return date_flg;
}
/*******************************************************************************************************************************************************************
/************************************************
* <p>Copyright: 2003</p>
* @author Filippo Guan
* javascript正則表達式檢驗
*************************************************
*/
//校驗是否全由數字組成
function isDigit(s)
{
var patrn=/^[0-9]{1,20}$/;
if (!patrn.exec(s)) return false;
return true;
}
//校驗登錄名:只能輸入4-20個以字母開頭、可帶數字、“_”、“.”的字串
function isRegisterUserName(s)
{
var patrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){3,19}$/;
if (!patrn.exec(s)) return false;
return true;
}
//校驗用戶姓名:只能輸入1-30個以字母開頭的字串
function isTrueName(s)
{
var patrn=/^[a-zA-Z]{1,30}$/;
if (!patrn.exec(s)) return false;
return true;
}
//校驗密碼:只能輸入6-20個字母、數字、下劃線
function isPasswd(s)
{
var patrn=/^(\w){6,20}$/;
if (!patrn.exec(s)) return false;
return true;
}
//校驗普通電話、傳真號碼:可以“+”開頭,除數字外,可含有“-”
function isTel(s)
{
//var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/;
var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;
if (!patrn.exec(s)) return false;
return true;
}
//校驗手機號碼:必須以數字開頭,除數字外,可含有“-”
function isMobile(s)
{
var patrn=/13[0,1,2,3,4,5,6,7,8,9]\d{8}/;
if (!patrn.exec(s)) return false;
return true;
}
//校驗手機號碼(移動):必須以數字開頭,除數字外,可含有“-”
function isCMCCMobile(s)
{
var patrn=/13[5,6,7,8,9]\d{8}/;
if (!patrn.exec(s)) return false;
return true;
}
//校驗手機號碼(聯通):必須以數字開頭,除數字外,可含有“-”
function isUNICOMMobile(s)
{
var patrn=/13[0,1,2,3,4]\d{8}/;
if (!patrn.exec(s)) return false;
return true;
}
//校驗郵政編碼
function isPostalCode(s)
{
//var patrn=/^[a-zA-Z0-9]{3,12}$/;
var patrn=/^[a-zA-Z0-9 ]{3,12}$/;
if (!patrn.exec(s)) return false;
return true;
}
//校驗搜索關鍵字
function isSearch(s)
{
var patrn=/^[^`~!@#$%^&*()+=|\\\][\]\{\}:;\'\,.<>/?]{1}[^`~!@$%^&()+=|\\\][\]\{\}:;\'\,.<>?]{0,19}$/;
if (!patrn.exec(s)) return false;
return true;
}
//校驗IP
function isIP(s)
{
var patrn=/^[0-9.]{1,20}$/;
if (!patrn.exec(s)) return false;
return true;
}
/*************************************************************************************************************************8
//*******************************************************************************/
// * @(#)FileUtils.java
// * @version 1.0
// * @description 常用目錄文件操作類
// * @author Filippo Guan
//*******************************************************************************//
import java.io.*;
public class FileUtils
{
public FileUtils()
{
}
public static void copy(File src, File dest, boolean cover)
throws IOException
{
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest);
byte buf[] = new byte[1024];
int i;
try
{
while((i = fis.read(buf)) >= 0)
{
fos.write(buf, 0, i);
}
}
finally
{
try
{
fis.close();
}
catch(Exception exception1)
{
}
try
{
fos.close();
}
catch(Exception exception2)
{
}
}
}
public static void copy(String src, String dest, boolean cover) throws IOException
{
File fsrc = new File(src);
File fdest = new File(dest);
copy(fsrc,fdest,cover);
}
public static void copytree(File src, File dest, boolean cover) throws IOException
{
if(src.isFile())
{
copy(src, dest, cover);
}
else
{
File children[] = src.listFiles();
for(int i = 0; i < children.length; i++)
{
File f = new File(dest, children[i].getName());
if(children[i].isDirectory())
{
f.mkdirs();
copytree(children[i], f, cover);
}
else
{
copy(children[i], f, cover);
}
}
}
}
public static void copytree(String src, String dest, boolean cover) throws IOException
{
File fsrc = new File(src);
File fdest = new File(dest);
copytree(fsrc,fdest,cover);
}
public static void movetree(File src, File dest, boolean cover) throws IOException
{
copytree(src, dest, cover);
deltree(src);
}
public static void deltree(File f)
{
File children[] = f.listFiles();
if(children != null && children.length != 0)
{
for(int i = 0; i < children.length; i++)
{
deltree(children[i]);
}
}
f.delete();
}
public static void deltree(String path)
{
File f = new File(path);
deltree(f);
}
public static void move(String src, String dest, boolean cover) throws IOException
{
File fsrc = new File(src);
File fdest = new File(dest);
copy(fsrc,fdest,cover);
fsrc.delete();
}
public static boolean find(File root, FileFilter filter)
{
if(filter.accept(root))
{
return true;
}
File children[] = root.listFiles();
if(children == null || children.length == 0)
{
return false;
}
for(int i = 0; i < children.length; i++)
{
if(find(children[i], filter))
{
return true;
}
}
return false;
}
public static boolean contains(File file, String suffix)
{
if(!file.exists() || !file.isDirectory())
{
return false;
}
File children[] = file.listFiles();
for(int i = 0; i < children.length; i++)
{
if(children[i].isFile() && children[i].getName().endsWith(suffix))
{
return true;
}
}
return false;
}
//讀取單行文件內容
public static String getFline(String filePath)
{
String fc = null;
try
{
BufferedReader f = new BufferedReader(new FileReader(filePath));
fc = f.readLine();
f.close();
}
catch (IOException e)
{
System.out.println("readLine problem, terminating.");
}
return fc;
}
//讀取單行文件內容並加一寫入返回
public static String getIline(String filePath)
{
String fc = null;
try
{
BufferedReader f = new BufferedReader(new FileReader(filePath));
fc = f.readLine();
long l = Long.parseLong(fc);
l++;
fc = String.valueOf(l);
f.close();
BufferedWriter bw = new BufferedWriter(new FileWriter(filePath));
bw.write(fc + "\n");
bw.flush();
bw.close();
}
catch (IOException e)
{
System.out.println("readLine problem, terminating.");
}
return fc;
}
public static String getFileExt(String fileName)
{
String ext = "";
int dot = fileName.lastIndexOf(".");
if (dot != -1)
{
ext = fileName.substring(dot + 1);
}
return ext;
}
public static String getFullFileName(String filePath)
{
String fileName = filePath;
int i = filePath.lastIndexOf("/");
if (i != -1)
{
fileName = filePath.substring(i + 1);
}
return fileName;
}
public static String getFileName(String filePath)
{
String fileName = filePath;
int i = filePath.lastIndexOf("/");
int j = filePath.lastIndexOf(".");
if (i != -1)
{
fileName = filePath.substring(i + 1, j);
}
return fileName;
}
public static String getPath(String filePath)
{
String path = "";
int i = filePath.lastIndexOf("/");
if (i != -1)
{
path = filePath.substring(0,i);
}
return path;
}
public static boolean WriteTo(String path, String info)
{
try
{
File f = new File(path);
PrintWriter out = new PrintWriter(new FileWriter(f));
out.print(info);
out.close();
return true;
}
catch (IOException e)
{
return false;
}
}
//追加字符串
public static boolean Append(String path,String info)
{
try
{
File f = new File(path);
PrintWriter out;
FileWriter theFile;
if (f.exists())
{
theFile = new FileWriter(path,true);
out = new PrintWriter(theFile);
}
else
{
theFile = new FileWriter(f);
out = new PrintWriter(theFile);
}
out.print(info + "\n");
out.close();
theFile.close();
return true;
}
catch (IOException e)
{
return false;
}
}
public static String getFileContent(File srcfile)
{
String strReturn = "";
try
{
BufferedInputStream buff = new BufferedInputStream(new FileInputStream(srcfile));
int in = 0;
do{
in = buff.read();
if(in != -1)
{
strReturn += (char)in;
}
}while(in != -1);
return strReturn;
}
catch(Exception e)
{
return strReturn;
}
}
public static String getFileContent(String fpath)
{
File srcfile = new File(fpath);
return getFileContent(srcfile);
}
public static boolean isType(String ext,String ptype)
{
if (ext.equals("jpg")||ext.equals("jpeg")||ext.equals("gif")||ext.equals("png")||ext.equals("bmp"))
{
if(ptype.equals("pic"))
{
return true;
}
}
else if (ext.equals("mid")||ext.equals("amr")||ext.equals("wma"))
{
if(ptype.equals("ring"))
{
return true;
}
}
else if (ext.equals("htm")||ext.equals("html"))
{
if(ptype.equals("webpage"))
{
return true;
}
}
else if (ext.equals("css"))
{
if(ptype.equals("css"))
{
return true;
}
}
else if (ext.equals("htt")||ext.equals("ini")||ext.equals("inc"))
{
if(ptype.equals("htt"))
{
return true;
}
}
else if (ext.equals("js")||ext.equals("htc"))
{
if(ptype.equals("js"))
{
return true;
}
}
return false;
}
/*******************************************************************************************************************************************************************************
日期轉爲漢字
///把日期轉換成漢字 cnDateFormat("2002/01/01","/") out 二零零二年一月一日 or cnDateFormat("2002-01-01","-") out 二零零二年一月一日
public String cnDateFormat(String sDate, String DelimeterChar) {
String restr = "";
String tmpArr[] = sDate.split(DelimeterChar);
String dArr[] = {
"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
for (int i = 0; i < 10; i++) {
Integer x = new Integer(i);
String temp = x.toString();
tmpArr[0] = tmpArr[0].replaceAll(temp, dArr[i]);
}
tmpArr[0] = tmpArr[0] + "年";
if (tmpArr[1].length() == 1) {
tmpArr[1] = dArr[Integer.parseInt(tmpArr[1])] + "月";
}
else {
if (tmpArr[1].substring(0, 1).equals("0")) {
tmpArr[1] = dArr[Integer.parseInt(tmpArr[1].substring(tmpArr[1].length() -
1, tmpArr[1].length()))] + "月";
}
else {
tmpArr[1] = "十" +
dArr[Integer.parseInt(tmpArr[1].substring(tmpArr[1].length() - 1,
tmpArr[1].length()))] + "月";
tmpArr[1] = tmpArr[1].replaceAll("零", "");
}
}
if (tmpArr[2].length() == 1) {
tmpArr[2] = dArr[Integer.parseInt(tmpArr[2])] + "日";
}
else {
if (tmpArr[2].substring(0, 1).equals("0")) {
tmpArr[2] = dArr[Integer.parseInt(tmpArr[2].substring(tmpArr[2].length() -
1, tmpArr[2].length()))] + "日";
}
else {
tmpArr[2] = dArr[Integer.parseInt(tmpArr[2].substring(0, 1))] + "十" +
dArr[Integer.parseInt(tmpArr[2].substring(tmpArr[2].length() - 1,
tmpArr[2].length()))] + "日";
tmpArr[2] = tmpArr[2].replaceAll("零", "");
}
}
return tmpArr[0] + tmpArr[1] + tmpArr[2];
}
/**********************************************************************************************************************************************
產生zip文件的程序:
public void makeZIP(String s_zipPath,
String s_newZipFile,
String s_fileName,
String s_filePath,
String status,
String yearmonth)
throws FileNotFoundException,IOException
{
try
{
File f_compressFile=new File(s_filePath,s_fileName);
if (f_compressFile.isFile())
{
FileInputStream s_fileIn=new FileInputStream(f_compressFile);
DataInputStream in = new DataInputStream(s_fileIn);
outZip.putNextEntry(new ZipEntry(s_fileName));
int c;
while((c = in.read()) != -1)
outZip.write(c);
in.close();
s_fileIn.close();
outZip.closeEntry();
java.io.File ZipfileDir = new java.io.File(s_filePath+"\\"+s_fileName);
if (ZipfileDir.exists())
{
ZipfileDir.delete();
}
if (status=="end")
{
outZip.close();
this.addNormalMessage("Download/"+
this.getSessionParam().getString(
CMN_APP_ColConstant.MANNO)+"_"+yearmonth+".zip");
}
}
else if (f_compressFile.isDirectory())
{
File f_zip=new File(s_zipPath,s_newZipFile);
FileOutputStream f_zipFile = new FileOutputStream(f_zip);
outZip = new ZipOutputStream(new DataOutputStream(f_zipFile));
String[] s_fileList=f_compressFile.list();
String s_newDirectory=f_compressFile.getAbsolutePath();
String nowStatus=null;
for (int i=0;i<s_fileList.length ;i++ )
{
if (i==s_fileList.length-1)
{
nowStatus="end";
}
makeZIP(s_zipPath,s_newZipFile,s_fileList[i],
s_newDirectory,nowStatus,yearmonth);
}
}
//
}
catch (Exception e)
{
e.printStackTrace();
}
}
/****************************************************************************************************************************************************************
下面這些關於文件的...
1.新建目錄
<%@ page contentType="text/html;charset=gb2312"%>
<%
String filePath="c:/aaa/";
filePath=filePath.toString();//中文轉換
java.io.File myFilePath=new java.io.File(filePath);
if(!myFilePath.exists())
myFilePath.mkdir();
%>
2。新建文件
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*" %>
<%
String filePath="c:/哈哈.txt";
filePath=filePath.toString();
File myFilePath=new File(filePath);
if(!myFilePath.exists())
myFilePath.createNewFile();
FileWriter resultFile=new FileWriter(myFilePath);
PrintWriter myFile=new PrintWriter(resultFile);
String strContent = "中文測試".toString();
myFile.println(strContent);
resultFile.close();
%>
3。刪除文件
<%@ page contentType="text/html;charset=gb2312"%>
<%
String filePath="c:/支出證明單.xls";
filePath=filePath.toString();
java.io.File myDelFile=new java.io.File(filePath);
myDelFile.delete();
%>
4。文件拷貝
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.io.*" %>
<%
int bytesum=0;
int byteread=0;
file://讀到流中
InputStream inStream=new FileInputStream("c:/aaa.doc");
FileOutputStream fs=new FileOutputStream( "d:/aaa.doc");byte[] buffer =new byte[1444];
int length;
while ((byteread=inStream.read(buffer))!=-1)
{
out.println("<DT><B>"+byteread+"</B></DT>");
bytesum+=byteread;
System.out.println(bytesum);
fs.write(buffer,0,byteread);
}
inStream.close();
%>
5。整個文件夾拷貝
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.io.*" %>
<%String url1="C:/aaa";
String url2="d:/java/";
(new File(url2)).mkdirs();
File[] file=(new File(url1)).listFiles();
for(int i=0;i<file.length;i++){
if(file[i].isFile()){
file[i].toString();
FileInputStream input=new FileInputStream(file[i]);
FileOutputStream output=new FileOutputStream(url2+"/"+(file[i].getName()).toString());
byte[] b=new byte[1024*5];
int len;
while((len=input.read(b))!=-1){
output.write(b,0,len);
}
output.flush();
output.close();
input.close();
}
}
%>
6。文件下載
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.io.*" %>
<%
String fileName = "zsc104.swf".toString();
//讀到流中
InputStream inStream=new FileInputStream("c:/zsc104.swf");
//設置輸出的格式
response.reset();
response.setContentType("bin");
response.addHeader("Content-Disposition","attachment; filename=\"" + fileName + "\"");
//循環取出流中的數據
byte[] b = new byte[100];
int len;
while((len=inStream.read(b)) >0)
response.getOutputStream().write(b,0,len);
inStream.close();
%>
7。數據庫字段中的文件下載
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.sql.*"%>
<%@ page import="java.lang.*" %>
<%@ page import="java.io.*" %>
<%@ page import="com.jspsmart.upload.*" %>
<%@ page import="DBstep.iDBManager2000.*"%>
<%
int bytesum=0;
int byteread=0;
//打開數據庫
ResultSet result=null;
String Sql=null;
PreparedStatement prestmt=null;
DBstep.iDBManager2000 DbaObj=new DBstep.iDBManager2000();
DbaObj.OpenConnection();
//取得數據庫中的數據
Sql="select * from t_local_zhongzhuan ";
result=DbaObj.ExecuteQuery(Sql);
result.next();
file://將數據庫中的數據讀到流中
InputStream inStream=result.getBinaryStream("content");
FileOutputStream fs=new FileOutputStream( "c:/dffdsafd.doc");
byte[] buffer =new byte[1444];
int length;
while ((byteread=inStream.read(buffer))!=-1)
{
out.println("<DT><B>"+byteread+"</B></DT>");
bytesum+=byteread;
System.out.println(bytesum);
fs.write(buffer,0,byteread);
}
%>
8。把網頁保存成文件
<%@ page import="java.text.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="java.net.*"%>
<%
URL stdURL = null;
BufferedReader stdIn = null;
PrintWriter stdOut = null;
try {
stdURL = new URL("http://www.163.com");
}
catch (MalformedURLException e) {
throw e;
}
try {
stdIn = new BufferedReader(new InputStreamReader(stdURL.openStream()));
stdOut = new PrintWriter(new BufferedWriter(new FileWriter("c:/163.html")));
}
catch (IOException e) {
}
/***把URL指定的頁面以流的形式讀出,寫成指定的文件***/
try {
String strHtml = "";
while((strHtml = stdIn.readLine())!=null) {
stdOut.println(strHtml);
}
}
catch (IOException e) {
throw e;
}
finally {
try {
if(stdIn != null)
stdIn.close();
if(stdOut != null)
stdOut.close();
}
catch (Exception e) {
System.out.println(e);
}
}
%>
9。直接下載網上的文件
<%@ page import="java.io.*"%>
<%@ page import="java.net.*"%>
<%
int bytesum=0;
int byteread=0;
URL url = new URL("http://pimg.163.com/sms/micheal/logo.gif");
URLConnection conn = url.openConnection();
InputStream inStream = conn.getInputStream();
FileOutputStream fs=new FileOutputStream( "c:/abc.gif");
byte[] buffer =new byte[1444];
int length;
while ((byteread=inStream.read(buffer))!=-1)
{
out.println("<DT><B>"+byteread+"</B></DT>");
bytesum+=byteread;
System.out.println(bytesum);
fs.write(buffer,0,byteread);
}
%>
/*
目錄遞歸併刪除該目錄下所以的文件及文件夾
*/
public void SearchDirOk(String Dir){
File tempFolder = new File(Dir);
String fileList[] =tempFolder.list();
for (int i = 0;i < fileList.length;i++){
File tempSubFolder = new File(Dir+"/"+fileList[i]);
if (tempSubFolder.isDirectory())
this.SearchDirOk(Dir+"/"+fileList[i]);
else
tempSubFolder.delete();
}
tempFolder.delete();
}
調用方法:
CommonClass common = new CommonClass();
common.SearchDirOk((String)sessionDir.toString()) ;
sessionDir爲路徑
刪除文件:
public static void delete(String filename) {
File f = new File(filename);
if (!f.exists()) fail("Delete: no such file or directory: " +filename);
if (!f.canWrite()) fail("Delete: write protected: " + filename);
if (f.isDirectory()) {
String[] files = f.list();
if (files.length > 0)
fail("Delete: directory not empty: " + filename);
}
boolean success = f.delete();
if (!success) fail("Delete: deletion failed");
}
protected static void fail(String msg) throws IllegalArgumentException {
throw new IllegalArgumentException(msg);
}
下面是兩種刪除方法:
方法1:
try {
String sql1 = "drop table DATA ";
int num1 = stmt.executeUpdate(sql1);
String sql2 = "drop table HEAD ";
int num2 = stmt.executeUpdate(sql2);
String sql3 = "drop table payinfo ";
int num3 = stmt.executeUpdate(sql3);
} catch (Exception ex) {
SystemLog.writeErrorLog("刪除數據庫文件出錯!", ex.toString());
}
方法2:
File f = new File(path);
File[] fname = f.listFiles();
try{
for(int i=0;i<fname.length;i++){
fname[i].delete();
}
}catch (Exception e) {
SystemLog.writeErrorLog("刪除BDF數據庫文件出錯!!"+e.getMessage(), e.toString());
}
/*************************************************************************************************************************************************************************************************************
今天想學習一下基礎知識,就看了一下HTML(4.0),發現自己對HTML掌握的太少了。很多代碼都很陌生,根本就沒見過,更別提用了。
就拿<a></a>元素來舉個例子。它的屬性就有:
name,href,target,title(這都是我們常用的,就不用多說了)
rel,rev,charset,hreflang,tabindex,accesskey,shape(default|rect|circle|poly),coords(length-list) 這些以前基本很少見過,在這裏就加以介紹。
rel=cdate
這個屬性指出了從當前位置到鏈接位置的關係。例如 rel="next" href="A" 指出了A這個鏈接是下一個。
rev=cdate
這個屬性剛好與rel相反,就不再多說。
charset=cdate
這個屬性指定了鏈接的編碼方式,屬性值必須是在[RFC2O45]中作爲“charset”指定的名稱:例如:“euc-jp”。這個屬性的缺省值是“iso-8859-1”。
hreflang=languagecode
這個屬性用來指定鏈接所使用的語言。例如:"en"指的是英語,"cn"指的是漢語。
tabindex=number
這個屬性是用來指定元素獲得焦點順序的。它的值可以是從0~32767中的任何一個。
tabindex屬性的元素中,具有較小數字的較先獲得焦點,在具有相等值得情況下,在HTML文檔裏最先顯示的元素先處理。一個“tabindex=0”或者沒有tabindex屬性的元素將在最後被訪問。(看了這個我突然想起能否有這個值來控制頁面的下載元素,不過不知道這個想法是否正確,好像別的不支持這個屬性)。
accesskey=character
這個屬性分配一個熱鍵給一個A元素。一個熱鍵是來自於客戶端瀏覽器當前字符集的單個字符。客戶端瀏覽器應當把這個屬性作爲大小寫無關來對待。
shape=default|rect|cirle|poly
這個屬性是用來建立客戶端圖象映像的,它指定了區域的形狀,可能的值爲:
default:定義這個區域
rect :定義一個矩形區域
circle:定義一個圓形區域
poly : 定義一個橢圓形區域
默認得shape值爲rect
coords=length-list
這個屬性被用來建立客戶端圖象映像的,它指定了一個形狀在屏幕上的位置,值的數字和值取決於被定義的形狀。可能的組合爲:
rect:left-x,top-y,right-x,bottom-y
circle: center-x,center-y,radius
poly: x1,y1,x2,y2……xn,yn
座標聯繫到特件的左上角,所有的值都是長度(可以是像素或百分比)
以上所寫,均爲本人蔘照書籍整理,並不代表我的個人水平,因爲這個我基本也沒用到過,也不是很理解,貼出來的意思是希望那些不知道的朋友能夠熟悉一下,而對此十分了解的朋友能夠根據這些給予說明,結合實際指出這些代碼的作用,讓大家都能加深對HTML的認識。雖然現在的軟件基本可以滿足大家的要求,可是畢竟網頁最終還是有代碼來實現的,所以我想多掌握一些,多瞭解和認識一些會對自己更有幫助,只有好處,沒有壞處,其實在HTML中還有好多這樣的代碼,上面的只是一個例子,希望大家也能多多交流,共同進步,就說到這裏。
/******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
Clip屬性的應用
上一節說到了動態可視區的調整,實際上就是Clip屬性的應用。
Clipping的中文解釋就是剪輯的意思,這個屬性決定了對象的哪個部位可以被看到。它不會改變任何對象的性質。
Clipping 的區域是一個矩形, 而這個矩形的尺寸取決於於四個邊的位置。
這四個邊用 top, right, botton, left 來表示。
請注意:這四個邊的位置是相對於對象的而不是相對於窗口的。
Clip屬性的書寫格式是這樣的:
Clip rect(top,right,bottom,left)
在這裏,top,right,bottom,left的值都是以像素pixels爲單位的。