1. 概述
本文主要包括以下幾個方面:編碼基本知識,java,系統軟件,url,工具軟件等。
在下面的描述中,將以"中文"兩個字為例,經查表可以知道其GB2312編碼是"d6d0 cec4",Unicode編碼為"4e2d 6587",UTF編碼就是"e4b8ad e69687"。注意,這兩個字沒有iso8859-1編碼,但可以用iso8859-1編碼來"表示"。
2. 編碼基本知識
最早的編碼是iso8859-1,和ascii編碼相似。但為了方便表示各種各樣的語言,逐漸出現了很多標準編碼,重要的有如下幾個。
2.1. iso8859-1
屬于單字節編碼,最多能表示的字符范圍是0-255,應用于英文系列。比如,字母a的編碼為0x61=97。
很明顯,iso8859-1編碼表示的字符范圍很窄,無法表示中文字符。但是,由于是單字節編碼,和計算機最基礎的表示單位一致,所以很多時候,仍舊使用iso8859-1編碼來表示。而且在很多協議上,默認使用該編碼。比如,雖然"中文"兩個字不存在iso8859-1編碼,以gb2312編碼為例,應該是"d6d0 cec4"兩個字符,使用iso8859-1編碼的時候則將它拆開為4個字節來表示:"d6 d0 ce c4"(事實上,在進行存儲的時候,也是以字節為單位處理的)。而如果是UTF編碼,則是6個字節"e4 b8 ad e6 96 87"。很明顯,這種表示方法還需要以另一種編碼為基礎。
2.2. GB2312/GBK
這就是漢子的國標碼,專門用來表示漢字,是雙字節編碼,而英文字母和iso8859-1一致(兼容iso8859-1編碼)。其中gbk編碼能夠用來同時表示繁體字和簡體字,而gb2312只能表示簡體字,gbk是兼容gb2312編碼的。
2.3. unicode
這是最統一的編碼,可以用來表示所有語言的字符,而且是定長雙字節(也有四字節的)編碼,包括英文字母在內。所以可以說它是不兼容iso8859-1編碼的,也不兼容任何編碼。不過,相對于iso8859-1編碼來說,uniocode編碼只是在前面增加了一個0字節,比如字母a為"00 61"。
需要說明的是,定長編碼便于計算機處理(注意GB2312/GBK不是定長編碼),而unicode又可以用來表示所有字符,所以在很多軟件內部是使用unicode編碼來處理的,比如java。
2.4. UTF
考慮到unicode編碼不兼容iso8859-1編碼,而且容易占用更多的空間:因為對于英文字母,unicode也需要兩個字節來表示。所以unicode不便于傳輸和存儲。因此而產生了utf編碼,utf編碼兼容iso8859-1編碼,同時也可以用來表示所有語言的字符,不過,utf編碼是不定長編碼,每一個字符的長度從1-6個字節不等。另外,utf編碼自帶簡單的校驗功能。一般來講,英文字母都是用一個字節表示,而漢字使用三個字節。
注意,雖然說utf是為了使用更少的空間而使用的,但那只是相對于unicode編碼來說,如果已經知道是漢字,則使用GB2312/GBK無疑是最節省的。不過另一方面,值得說明的是,雖然utf編碼對漢字使用3個字節,但即使對于漢字網頁,utf編碼也會比unicode編碼節省,因為網頁中包含了很多的英文字符。
3. java對字符的處理
在java應用軟件中,會有多處涉及到字符集編碼,有些地方需要進行正確的設置,有些地方需要進行一定程度的處理。
3.1. getBytes(charset)
這是java字符串處理的一個標準函數,其作用是將字符串所表示的字符按照charset編碼,并以字節方式表示。注意字符串在java內存中總是按unicode編碼存儲的。比如"中文",正常情況下(即沒有錯誤的時候)存儲為"4e2d 6587",如果charset為"gbk",則被編碼為"d6d0 cec4",然后返回字節"d6 d0 ce c4"。如果charset為"utf8"則最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1",則由于無法編碼,最后返回 "3f 3f"(兩個問號)。
3.2. new String(charset)
這是java字符串處理的另一個標準函數,和上一個函數的作用相反,將字節數組按照charset編碼進行組合識別,最后轉換為unicode存儲。參考上述getBytes的例子,"gbk" 和"utf8"都可以得出正確的結果"4e2d 6587",但iso8859-1最后變成了"003f 003f"(兩個問號)。
因為utf8可以用來表示/編碼所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) === str,即完全可逆。
3.3. setCharacterEncoding()
該函數用來設置http請求或者相應的編碼。
對于request,是指提交內容的編碼,指定后可以通過getParameter()則直接獲得正確的字符串,如果不指定,則默認使用iso8859-1編碼,需要進一步處理。參見下述"表單輸入"。值得注意的是在執行setCharacterEncoding()之前,不能執行任何getParameter()。java doc上說明:This method must be called prior to reading request parameters or reading input using getReader()。而且,該指定只對POST方法有效,對GET方法無效。分析原因,應該是在執行第一個getParameter()的時候,java將會按照編碼分析所有的提交內容,而后續的getParameter()不再進行分析,所以setCharacterEncoding()無效。而對于GET方法提交表單是,提交的內容在URL中,一開始就已經按照編碼分析所有的提交內容,setCharacterEncoding()自然就無效。
對于response,則是指定輸出內容的編碼,同時,該設置會傳遞給瀏覽器,告訴瀏覽器輸出內容所采用的編碼。
3.4. 處理過程
下面分析兩個有代表性的例子,說明java對編碼有關問題的處理方法。
3.4.1. 表單輸入
User input *(gbk:d6d0 cec4) browser *(gbk:d6d0 cec4) web server iso8859-1(00d6 00d 000ce 00c4) class,需要在class中進行處理:getbytes("iso8859-1")為d6 d0 ce c4,new String("gbk")為d6d0 cec4,內存中以unicode編碼則為4e2d 6587。
l 用戶輸入的編碼方式和頁面指定的編碼有關,也和用戶的操作系統有關,所以是不確定的,上例以gbk為例。
l 從browser到web server,可以在表單中指定提交內容時使用的字符集,否則會使用頁面指定的編碼。而如果在url中直接用?的方式輸入參數,則其編碼往往是操作系統本身的編碼,因為這時和頁面無關。上述仍舊以gbk編碼為例。
l Web server接收到的是字節流,默認時(getParameter)會以iso8859-1編碼處理之,結果是不正確的,所以需要進行處理。但如果預先設置了編碼(通過request. setCharacterEncoding ()),則能夠直接獲取到正確的結果。
l 在頁面中指定編碼是個好習慣,否則可能失去控制,無法指定正確的編碼。
3.4.2. 文件編譯
假設文件是gbk編碼保存的,而編譯有兩種編碼選擇:gbk或者iso8859-1,前者是中文windows的默認編碼,后者是linux的默認編碼,當然也可以在編譯時指定編碼。
Jsp *(gbk:d6d0 cec4) java file *(gbk:d6d0 cec4) compiler read uincode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) compiler write utf(gbk: e4b8ad e69687; iso8859-1: *) compiled file unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) class。所以用gbk編碼保存,而用iso8859-1編譯的結果是不正確的。
class unicode(4e2d 6587) system.out / jsp.out gbk(d6d0 cec4) os console / browser。
l 文件可以以多種編碼方式保存,中文windows下,默認為ansi/gbk。
l 編譯器讀取文件時,需要得到文件的編碼,如果未指定,則使用系統默認編碼。一般class文件,是以系統默認編碼保存的,所以編譯不會出問題,但對于jsp文件,如果在中文windows下編輯保存,而部署在英文linux下運行/編譯,則會出現問題。所以需要在jsp文件中用pageEncoding指定編碼。
l Java編譯的時候會轉換成統一的unicode編碼處理,最后保存的時候再轉換為utf編碼。
l 當系統輸出字符的時候,會按指定編碼輸出,對于中文windows下,System.out將使用gbk編碼,而對于response(瀏覽器),則使用jsp文件頭指定的contentType,或者可以直接為response指定編碼。同時,會告訴browser網頁的編碼。如果未指定,則會使用iso8859-1編碼。對于中文,應該為browser指定輸出字符串的編碼。
l browser顯示網頁的時候,首先使用response中指定的編碼(jsp文件頭指定的contentType最終也反映在response上),如果未指定,則會使用網頁中meta項指定中的contentType。
3.5. 幾處設置
對于web應用程序,和編碼有關的設置或者函數如下。
3.5.1. jsp編譯
指定文件的存儲編碼,很明顯,該設置應該置于文件的開頭。例如:<%@page pageEncoding="GBK"%>。另外,對于一般class文件,可以在編譯的時候指定編碼。
3.5.2. jsp輸出
指定文件輸出到browser是使用的編碼,該設置也應該置于文件的開頭。例如:<%@ page contentType="text/html; charset= GBK" %>。該設置和response.setCharacterEncoding("GBK")等效。
3.5.3. meta設置
指定網頁使用的編碼,該設置對靜態網頁尤其有作用。因為靜態網頁無法采用jsp的設置,而且也無法執行response.setCharacterEncoding()。例如:
如果同時采用了jsp輸出和meta設置兩種編碼指定方式,則jsp指定的優先。因為jsp指定的直接體現在response中。
需要注意的是,apache有一個設置可以給無編碼指定的網頁指定編碼,該指定等同于jsp的編碼指定方式,所以會覆蓋靜態網頁中的meta指定。所以有人建議關閉該設置。
3.5.4. form設置
當瀏覽器提交表單的時候,可以指定相應的編碼。例如:
posted @
2006-10-10 08:56 向東博客 閱讀(630) |
評論 (0) |
編輯 收藏
一.
問題
??? JSP
中究竟采用絕對路徑還是采用相對路徑隨著所采用技術的越來越復雜,這個問題也變得越來越難以解決。
1)
采用相對路徑遇到的問題
l
????????
相對路徑固然比較靈活,但如果想復制頁面內的代碼卻變得比較困難,因為不同的頁面具有不同的相對路徑,復制后必須修改每一個連接的路徑。
l
????????
如果頁面被多于一個的頁面所包含,那么被包含頁面中的相對路徑將是不正確的。
l
????????
如果采用
Struts
的
Action
返回頁面,那么由于頁面路徑與
Action
路徑不同,使得瀏覽器無法正確解釋頁面中的路徑,如頁面為
/pages/cust/cust.jsp
,圖片所有目錄為
/images/title.gif
,這時在
/pages/cust/cust.jsp
中的所用的路徑為
”../../images/title.gif”
,但是如果某一個
Action
的
Forward
指向這個
JSP
文件,而這個
Action
的路徑為
/cust/manage.do
,那么頁面內容中
”../../images/title.gif”
就不再指向正確的路徑了。
解決以上問題似乎只有使用絕對路徑了。
2)
采用絕對路徑遇到的問題
l
????????
隨著不同的
Web
應用發布方式,絕對路徑的值也不同。如
Web
應用發布為
MyApp
,則路徑
”/MyApp/images/title.gif”
是正確的,但發布為另一應用時如
MyApp2
,這個路徑就不對了,也許這個情況比較少,但以
default
方式發布
Web
應用時以上絕對路徑也不同:
”/images/title.gif”
。
二.
解決方案
1)
?
采用絕對路徑,但為了解決不同部署方式的差別,在所有非
struts
標簽的路徑前加
${pageContext.request.contextPath}
,如原路徑為:
”/images/title.gif”
,改為
“${pageContext.request.contextPath}/images/title.gif”
。
代碼
” ${pageContext.request.contextPath}”
的作用是取出部署的應用程序名,這樣不管如何部署,所用路徑都是正確的。
缺點:
操作不便,其他工具無法正確解釋
${pageContext.request.contextPath}
2)
?
采用相對路徑,在每個
JSP
文件中加入
base
標簽,如:
<base href="http://${header['host']}${pageContext.request.contextPath}/pages/cust/relation.jsp" />
這樣所有的路徑都可以使用相對路徑。
缺點:
對于被包含的文件依然無效。
???
真正使用時需要靈活應用1)和2),寫出更加健壯的代碼。
posted @
2006-10-10 08:58 向東博客 閱讀(2658) |
評論 (0) |
編輯 收藏
首先說可以用下面的方法查看當前的目錄,你的文件路徑就可以以此為據:
System.out.println(System.getProperty("user.dir"));
如果你用這個方法來杳看你JSP頁面,可以發現它的路徑很奇怪,其實它是JSP引擎路徑。所以當你用
??? new File(String path);
時,如果用的是相對路徑,就得相對真實的當前路徑,而不是任何你想當然的路徑 。
當然對于這個方法用”絕對路徑“一般是不會出錯的。只是這樣,程序的靈活性就受到了限制。下面就是一個絕對路徑 的例子:
??? String xmlPath = "D:\\PublicFiles\\WCI\\navigation.xml";
Part 2
FileStream file = this.getClass().getClassLoader().getResourceAsStream(String xmlPath);
這個有點復雜,我了解的也不多,這里就說說現在我所了解的吧,以后再補充!
System.out.println(this.getClass().getClassLoader().getResource("/").getPath());
如此就可以看到相對“/”的根路徑。
對?? FileStream fileStream = this.getClass().getClassLoader().getResourceAsStream(filePath);
這里的filePath似乎只能用相對路徑,至少我不知道用絕對路徑怎么表示:
下面取個相對路徑的例子:
??? String filePath = "/../../Resources/XML/navigation.xml"; //表達規則和LINUX一樣。
System.out.println(this.getClass().getClassLoader().getResource(".").getPath());
System.out.println(this.getClass().getClassLoader().getResource("/").getPath());
System.out.println(this.getClass().getClassLoader().getResource("").getPath());
System.out.println(this.getClass().getClassLoader().getResource("..").getPath());
相信,看過這四個路徑結果就應該知道在哪放置自己的文件了,用什么樣的語句能找到。
今天在寫一個寫JSP時,碰到上面的文件路徑的問題,簡單的了解下,相信其中定有不少的錯誤,希望你能提出并改正,我在此謝過了!
posted @
2006-10-10 08:58 向東博客 閱讀(1597) |
評論 (0) |
編輯 收藏
前言:
?前一段時間,由于在處理Web應用下的文件創建與移動等,因此涉及到很多關于java
中相對路徑,絕對路徑等問題。同時,對于Web應用中的相對路徑,絕對路徑,以及Java.io.File
類學習了一下。也找了一些資料。希望大家遇到類似的問題,可以更有效的解決。
=================================================================================
1.基本概念的理解
絕對路徑:絕對路徑就是你的主頁上的文件或目錄在硬盤上真正的路徑,(URL和物理路徑)例如:
C:\xyz\test.txt?代表了test.txt文件的絕對路徑。http://www.sun.com/index.htm也代表了一個
URL絕對路徑。
相對路徑:相對與某個基準目錄的路徑。包含Web的相對路徑(HTML中的相對目錄),例如:在
Servlet中,"/"代表Web應用的跟目錄。和物理路徑的相對表示。例如:"./" 代表當前目錄,
"../"代表上級目錄。這種類似的表示,也是屬于相對路徑。
另外關于URI,URL,URN等內容,請參考RFC相關文檔標準。
RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax,
(http://www.ietf.org/rfc/rfc2396.txt)
2.關于JSP/Servlet中的相對路徑和絕對路徑。
2.1服務器端的地址
?服務器端的相對地址指的是相對于你的web應用的地址,這個地址是在服務器端解析的
(不同于html和javascript中的相對地址,他們是由客戶端瀏覽器解析的)也就是說這時候
在jsp和servlet中的相對地址應該是相對于你的web應用,即相對于http://192.168.0.1/webapp/的。
其用到的地方有:
?forward:servlet中的request.getRequestDispatcher(address);這個address是
在服務器端解析的,所以,你要forward到a.jsp應該這么寫:
request.getRequestDispatcher(“/user/a.jsp”)這個/相對于當前的web應用webapp,
其絕對地址就是:http://192.168.0.1/webapp/user/a.jsp。
sendRedirect:在jsp中<%response.sendRedirect("/rtccp/user/a.jsp");%>
2.22、客戶端的地址
?
?????? 所有的html頁面中的相對地址都是相對于服務器根目錄(http://192.168.0.1/)的,
而不是(跟目錄下的該Web應用的目錄)http://192.168.0.1/webapp/的。
?Html中的form表單的action屬性的地址應該是相對于服務器根目錄(http://192.168.0.1/)的,
所以,如果提交到a.jsp為:action="/webapp/user/a.jsp"或action="<%=request.getContextPath()%>"/user/a.jsp;
提交到servlet為actiom="/webapp/handleservlet" ?
? Javascript也是在客戶端解析的,所以其相對路徑和form表單一樣。
?
因此,一般情況下,在JSP/HTML頁面等引用的CSS,Javascript.Action等屬性前面最好都加上
<%=request.getContextPath()%>,以確保所引用的文件都屬于Web應用中的目錄。
另外,應該盡量避免使用類似".","./","../../"等類似的相對該文件位置的相對路徑,這樣
當文件移動時,很容易出問題。
3. JSP/Servlet中獲得當前應用的相對路徑和絕對路徑
3.1 JSP中獲得當前應用的相對路徑和絕對路徑
?根目錄所對應的絕對路徑:request.getRequestURI()
?文件的絕對路徑??? :application.getRealPath(request.getRequestURI());
?當前web應用的絕對路徑 :application.getRealPath("/");
?取得請求文件的上層目錄:new File(application.getRealPath(request.getRequestURI())).getParent()
3.2 Servlet中獲得當前應用的相對路徑和絕對路徑
?根目錄所對應的絕對路徑:request.getServletPath();
?文件的絕對路徑??? :request.getSession().getServletContext().getRealPath
(request.getRequestURI())???
?當前web應用的絕對路徑 :servletConfig.getServletContext().getRealPath("/");
?????(ServletContext對象獲得幾種方式:
???????javax.servlet.http.HttpSession.getServletContext()
???????javax.servlet.jsp.PageContext.getServletContext()
???????javax.servlet.ServletConfig.getServletContext()
?????)
4.java 的Class中獲得相對路徑,絕對路徑的方法
4.1單獨的Java類中獲得絕對路徑
根據java.io.File的Doc文擋,可知:
?默認情況下new File("/")代表的目錄為:System.getProperty("user.dir")。
?一下程序獲得執行類的當前路徑
package org.cheng.file;
import java.io.File;
public class FileTest {
??? public static void main(String[] args) throws Exception {??????
??System.out.println(Thread.currentThread().getContextClassLoader().getResource(""));????
??System.out.println(FileTest.class.getClassLoader().getResource(""));???????
System.out.println(ClassLoader.getSystemResource(""));???????
??System.out.println(FileTest.class.getResource(""));???????
??System.out.println(FileTest.class.getResource("/")); //Class文件所在路徑?
??System.out.println(new File("/").getAbsolutePath());???????
??System.out.println(System.getProperty("user.dir"));???
?}
}
4.2服務器中的Java類獲得當前路徑(來自網絡)
(1).Weblogic
WebApplication的系統文件根目錄是你的weblogic安裝所在根目錄。
例如:如果你的weblogic安裝在c:\bea\weblogic700.....
那么,你的文件根路徑就是c:\.
所以,有兩種方式能夠讓你訪問你的服務器端的文件:
a.使用絕對路徑:
比如將你的參數文件放在c:\yourconfig\yourconf.properties,
直接使用 new FileInputStream("yourconfig/yourconf.properties");
b.使用相對路徑:
相對路徑的根目錄就是你的webapplication的根路徑,即WEB-INF的上一級目錄,將你的參數文件放
在yourwebapp\yourconfig\yourconf.properties,
這樣使用:
new FileInputStream("./yourconfig/yourconf.properties");
這兩種方式均可,自己選擇。
(2).Tomcat
在類中輸出System.getProperty("user.dir");顯示的是%Tomcat_Home%/bin
(3).Resin
不是你的JSP放的相對路徑,是JSP引擎執行這個JSP編譯成SERVLET
的路徑為根.比如用新建文件法測試File f = new File("a.htm");
這個a.htm在resin的安裝目錄下
(4).如何讀相對路徑哪?
在Java文件中getResource或getResourceAsStream均可
例:getClass().getResourceAsStream(filePath);//filePath可以是"/filename",這里的/代表web
發布根路徑下WEB-INF/classes
默認使用該方法的路徑是:WEB-INF/classes。已經在Tomcat中測試。
5.讀取文件時的相對路徑,避免硬編碼和絕對路徑的使用。(來自網絡)
5.1 采用Spring的DI機制獲得文件,避免硬編碼。
? ?參考下面的連接內容:
? ?http://www.javajia.net/viewtopic.php?p=90213&
5.2 配置文件的讀取
?參考下面的連接內容:
?http://dev.csdn.net/develop/article/39/39681.shtm
5.3 通過虛擬路徑或相對路徑讀取一個xml文件,避免硬編碼
?參考下面的連接內容:
?http://club.gamvan.com/club/clubPage.jsp?iPage=1&tID=10708&ccID=8
?
6.Java中文件的常用操作(復制,移動,刪除,創建等)(來自網絡)
?常用 java File 操作類
?http://www.easydone.cn/014/200604022353065155.htm
?
?Java文件操作大全(JSP中)
?http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html
?java文件操作詳解(Java中文網)
?http://www.51cto.com/html/2005/1108/10947.htm
?JAVA 如何創建\刪除\修改\復制目錄及文件
?http://www.gamvan.com/developer/java/2005/2/264.html
總結:
?通過上面內容的使用,可以解決在Web應用服務器端,移動文件,查找文件,復制
?刪除文件等操作,同時對服務器的相對地址,絕對地址概念更加清晰。
建議參考URI,的RFC標準文擋。同時對Java.io.File. Java.net.URI.等內容了解透徹
對其他方面的理解可以更加深入和透徹。
==================================================================================
參考資料:
java/docs/
java.io.File
java.io.InputStream
java.io.OutputStream
java.io.FileInputStream
java.io.FileReader;
java.io.FileOutputStream
java.io.FileWriter;
java.net.URI
java.net.URL
絕對路徑與相對路徑祥解
http://www.webjx.com/htmldata/2005-02-26/1109430310.html
[『J道習練』]JSP和Servlet中的絕對路徑和相對路徑
http://w3china.org/blog/more.asp?name=pcthomas&id=9122&commentid=12376
JSP,Servlet,Class獲得當前應用的相對路徑和絕對路徑
http://cy.lzu.edu.cn/cy/club/clubPage.jsp?ccStyle=0&tID=886&ccID=77
如何獲得當前文件路徑
http://www.matrix.org.cn/resource/article/44/44113_java.html
通過Spring注入機制,取得文件
http://www.javajia.net/viewtopic.php?p=90213&
配置文件的讀取
http://dev.csdn.net/develop/article/39/39681.shtm
讀取配置文件,通過虛擬路徑或相對路徑讀取一個xml文件,避免硬編碼!
http://club.gamvan.com/club/clubPage.jsp?iPage=1&tID=10708&ccID=8
常用 java File 操作類
http://www.easydone.cn/014/200604022353065155.htm
Java文件操作大全
http://www.pconline.com.cn/pcedu/empolder/gj/java/0502/559401.html
Java文件操作詳解
http://www.51cto.com/html/2005/1108/10947.htm
posted @
2006-10-10 08:58 向東博客 閱讀(31362) |
評論 (1) |
編輯 收藏
????第一,談談final,?finally,?finalize的區別。
?
????final?修飾符(關鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為?abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載finally?再異常處理時提供?finally?塊來執行任何清除操作。如果拋出一個異常,那么相匹配的?catch?子句就會執行,然后控制就會進入?finally?塊(如果有的話)。?
????finalize?方法名。Java?技術允許使用?finalize()?方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在?Object?類中定義的,因此所有的類都繼承了它。子類覆蓋?finalize()?方法以整理系統資源或者執行其他清理工作。finalize()?方法是在垃圾收集器刪除對象之前對這個對象調用的。?
????
第二,Anonymous?Inner?Class?(匿名內部類)?是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)??
????匿名的內部類是沒有名字的內部類。不能extends(繼承)?其它類,但一個內部類可以作為一個接口,由另一個內部類實現。?
????
第三,Static?Nested?Class?和?Inner?Class的不同,說得越多越好(面試題有的很籠統)。?
????Nested?Class?(一般是C++的說法),Inner?Class?(一般是JAVA的說法)。Java內部類與C++嵌套類最大的不同就在于是否有指向外部的引用上。具體可見http:?//www.frontfree.net/articles/services/view.asp?id=704&page=1?
????注:?靜態內部類(Inner?Class)意味著1創建一個static內部類的對象,不需要一個外部類對象,2不能從一個static內部類的一個對象訪問一個外部類對象?
???
?第四,&和&&的區別。?
????&是位運算符。&&是布爾邏輯運算符。?
??
??第五,HashMap和Hashtable的區別。?
????都屬于Map接口的類,實現了將惟一鍵映射到特定的值上。?
????HashMap?類沒有分類或者排序。它允許一個?null?鍵和多個?null?值。?
????Hashtable?類似于?HashMap,但是不允許?null?鍵和?null?值。它也比?HashMap?慢,因為它是同步的。?
????
第六,Collection?和?Collections的區別。?
????Collections是個java.util下的類,它包含有各種有關集合操作的靜態方法。?
????Collection是個java.util下的接口,它是各種集合結構的父接口。?
???
第七,什么時候用assert。??
斷言是一個包含布爾表達式的語句,在執行這個語句時假定該表達式為?true。如果表達式計算為?false,那么系統會報告一個?AssertionError。它用于調試目的:??
assert(a?>?0);?//?throws?an?AssertionError?if?a?<=?0??
斷言可以有兩種形式:??
assert?Expression1?;??
assert?Expression1?:?Expression2?;??
Expression1?應該總是產生一個布爾值。??
Expression2?可以是得出一個值的任意表達式。這個值用于生成顯示更多調試信息的?String?消息。??
斷言在默認情況下是禁用的。要在編譯時啟用斷言,需要使用?source?1.4?標記:??
javac?-source?1.4?Test.java??
要在運行時啟用斷言,可使用?-enableassertions?或者?-ea?標記。??
要在運行時選擇禁用斷言,可使用?-da?或者?-disableassertions?標記。??
要系統類中啟用斷言,可使用?-esa?或者?-dsa?標記。還可以在包的基礎上啟用或者禁用斷言。??
可以在預計正常情況下不會到達的任何位置上放置斷言。斷言可以用于驗證傳遞給私有方法的參數。不過,斷言不應該用于驗證傳遞給公有方法的參數,因為不管是否啟用了斷言,公有方法都必須檢查其參數。不過,既可以在公有方法中,也可以在非公有方法中利用斷言測試后置條件。另外,斷言不應該以任何方式改變程序的狀態。??
第八,GC是什么??為什么要有GC??(基礎)。??
GC是垃圾收集器。Java?程序員不用擔心內存管理,因為垃圾收集器會自動進行管理。要請求垃圾收集,可以調用下面的方法之一:??
System.gc()??
Runtime.getRuntime().gc()??
第九,String?s?=?new?String("xyz");創建了幾個String?Object???
兩個對象,一個是“xyx”,一個是指向“xyx”的引用對象s。??
第十,Math.round(11.5)等於多少??Math.round(-11.5)等於多少???
Math.round(11.5)返回(long)12,Math.round(-11.5)返回(long)-11;??
第十一,short?s1?=?1;?s1?=?s1?+?1;有什么錯??short?s1?=?1;?s1?+=?1;有什么錯???
short?s1?=?1;?s1?=?s1?+?1;有錯,s1是short型,s1+1是int型,不能顯式轉化為short型。可修改為s1?=(short)(s1?+?1)?。short?s1?=?1;?s1?+=?1正確。??
第十二,sleep()?和?wait()?有什么區別??搞線程的最愛??
sleep()方法是使線程停止一段時間的方法。在sleep?時間間隔期滿后,線程不一定立即恢復執行。這是因為在那個時刻,其它線程可能正在運行而且沒有被調度為放棄執行,除非(a)“醒來”的線程具有更高的優先級,(b)正在運行的線程因為其它原因而阻塞。??
wait()是線程交互時,如果線程對一個同步對象x?發出一個wait()調用,該線程會暫停執行,被調對象進入等待狀態,直到被喚醒或等待時間到。??
第十三,Java有沒有goto???
Goto?java中的保留字,現在沒有在java中使用。??
第十四,數組有沒有length()這個方法??String有沒有length()這個方法???
數組沒有length()這個方法,有length的屬性。??
String有有length()這個方法。??
第十五,Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型???
方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫?(Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被“屏蔽”了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。??
第十六,Set里的元素是不能重復的,那么用什么方法來區分重復與否呢??是用==還是equals()??它們有何區別???
Set里的元素是不能重復的,那么用iterator()方法來區分重復與否。equals()是判讀兩個Set是否相等。??
equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。??
第十七,給我一個你最常見到的runtime?exception。??
ArithmeticException,?ArrayStoreException,?BufferOverflowException,?BufferUnderflowException,??CannotRedoException,????
?????? CannotUndoException,??ClassCastException,?CMMException,???ConcurrentModificationException,???
?????? DOMException,?EmptyStackException,?IllegalArgumentException,??IllegalMonitorStateException,???
?????? IllegalPathStateException,??IllegalStateException,?ImagingOpException,???
?????? IndexOutOfBoundsException,??MissingResourceException,??NegativeArraySizeException,??NoSuchElementException,???
?????? NullPointerException,??ProfileDataException,?ProviderException,??RasterFormatException,??SecurityException,?SystemException,?
?????? UndeclaredThrowableException,??UnmodifiableSetException,??UnsupportedOperationException???
第十八,error和exception有什么區別???
error?表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。?
exception?表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。??
第十九,List,?Set,?Map是否繼承自Collection接口???
List,Set是??
Map不是??
第二十,abstract?class和interface有什么區別???
聲明方法的存在而不去實現它的類被叫做抽象類(abstract?class),它用于要創建一個體現某些基本行為的類,并為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract?類的實例。然而可以創建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract?類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。??
接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static?final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現了該接口的類的任何對象上調用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof?運算符可以用來決定某對象的類是否實現了接口。??
第二十一,abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized???
都不能??
第二十二,接口是否可繼承接口??抽象類是否可實現(implements)接口??抽象類是否可繼承實體類(concrete?class)???
接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。??
第二十三,啟動一個線程是用run()還是start()???
啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處于可運行狀態,這意味著它可以由JVM調度并執行。這并不意味著線程就會立即運行。run()方法可以產生必須退出的標志來停止一個線程。??
第二十四,構造器Constructor是否可被override???
構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading。??
第二十五,是否可以繼承String類???
String類是final類故不可以繼承。??
第二十六,當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法???
不能,一個對象的一個synchronized方法只能由一個線程訪問。
????
(此答案有錯誤.其他線程可以進入此對象的其他方法,但不能進入此對象的synchronized方法)??
第二十七,try?{}里有一個return語句,那么緊跟在這個try后的finally?{}里的code會不會被執行,什么時候被執行,在return前還是后???
會執行,在return前執行。??
第二十八,編程題:?用最有效率的方法算出2乘以8等於幾???
有C背景的程序員特別喜歡問這種問題。??
2?<<?3??
第二十九,兩個對象值相同(x.equals(y)?==?true),但卻可有不同的hash?code,這句話對不對???
不對,有相同的hash?code。??
第三十,當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞???
是值傳遞。Java?編程語言只由值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。??
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上???
switch(expr1)中,expr1是一個整數表達式。因此傳遞給?switch?和?case?語句的參數應該是?int、?short、?char?或者?byte。long,string?都不能作用于swtich。??
第三十二,編程題:?寫一個Singleton出來。?
Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。??
一般Singleton模式通常有幾種種形式:??
第一種形式:?定義一個類,它的構造函數為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。??
public?class?Singleton?{??
private?Singleton(){}??
//在自己內部定義自己一個實例,是不是很奇怪???
//注意這是private?只供內部調用??
private?static?Singleton?instance?=?new?Singleton();??
//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問 ??
public?static?Singleton?getInstance()?{??
return?instance;? ??
?}??
}??
第二種形式:??
public?class?Singleton?{??
private?static?Singleton?instance?=?null;??
public?static?synchronized?Singleton?getInstance()?{??
//這個方法比上面有所改進,不用每次都進行生成對象,只是第一次 ? ??
//使用時生成實例,提高了效率!??
if?(instance==null)??
instance=new?Singleton();??
return?instance;? }??
}??
其他形式:??
定義一個類,它的構造函數為private的,所有方法為static的。??
一般認為第一種形式要更加安全些??
第三十三?Hashtable和HashMap??
Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map?interface的一個實現??
HashMap允許將null作為一個entry的key或者value,而Hashtable不允許??
還有就是,HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因為contains方法容易讓人引起誤解。??
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步。??
Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。
posted @
2006-10-10 08:57 向東博客 閱讀(4849) |
評論 (7) |
編輯 收藏
JSP
和
Servlet
中的絕對路徑和相對路徑問題困擾了我好幾天,經過努力之后將其部分心得和大家共享。
??????
前提:假設你的
Http
地址為
http://192.168.0.1/
你的
web
應用為
webapp
,那么你的
web
應用
URL
為
http://192.168.0.1/webapp/
?????? web
應用的目錄結構:
?????? webapp/
????????????? web-inf/
?????????????
?? classes/
???????????????????? lib/
???????????????????? web.xml
???????????????????????????
? <servlet-mapping>
???
?????????????????????????? <servlet-name>handleservlet</servlet-name>
???
?????????????????????????? <url-pattern>/handleservlet</url-pattern>
此映射是相對于當前
web
應用的
?
???????????????????????
???</servlet-mapping>
????????????? user/
a.jsp
b.jsp
????????????? images/
????????????? css/
????????????? js/
?????????????
??????
所有相對路徑都是由“
/
”開頭的。如:
/image/a.gif
,
/user/main.jsp
,大家知道在
html
中的相對路徑是這樣的:
??????
有個
html
文件:
a.html
,其中有
<link href="one.css" rel="stylesheet" type="text/css">
,其中
href
屬性表示引用的
css
文件的路徑。
one.css
:表示
one.css
和
a.hmtl
處于同一個目錄
user/one.css
:表示
one.css
處于
a.html
所在目錄的子目錄
user
中。
../one.css
:表示
one.css
位于
a.hmtl
上一級目錄下,
../../one.css
:表示
one.css
位于
a.hmtl
上一級目錄的上一級目錄下,
./
:表示和
a.hmtl
同一目錄
我們稱上述相對路徑為
html
相對路徑
1、
服務器端的地址
服務器端的相對地址指的是相對于你的
web
應用的地址,這個地址是在服務器端解析的(不同于
html
和
javascript
中的相對地址,他們是由客戶端瀏覽器解析的)也就是說這時候在
jsp
和
servlet
中的相對地址應該是相對于你的
web
應用,即相對于
http://192.168.0.1/webapp/
的。
其用到的地方有:
forwarder
:
servlet
中的
request.getRequestDispatcher(address);
這個
address
是在服務器端解析的,所以,你要
forwarder
到
a.jsp
應該這么寫:
request.getRequestDispatcher(“/user/a.jsp”)
這個
/
相對于當前的
web
應用
webapp
,其絕對地址就是:
http://192.168.0.1/webapp/user/a.jsp
。
sendRedirect
:在
jsp
中
<%response.sendRedirect("/rtccp/user/a.jsp");%>
2、
客戶端的地址
所有的
html
中的相對地址都是相對于
http://192.168.0.1/
的,而不是
http://192.168.0.1/webapp/
的。
Html
中的
form
表單的
action
屬性的地址應該是相對于
http://192.168.0.1/
的,所以,如果提交到
a.jsp
為:
action
=
”/webapp/user/a.jsp”
;提交到
servlet
為
action
=
”/webapp/handleservlet”
Javascript
也是在客戶端解析的,所以其相對路徑和
form
表單一樣。
3、
站點根目錄和
css
路徑問題
我們稱類似這樣的相對路徑
/webapp/….
為相對于站點根目錄的相對路徑。
當在
jsp
中引入
css
時,如果其相對路徑相對于當前
jsp
文件的,而在一個和這個
jsp
的路徑不一樣的
servlet
中
forwarder
這個
jsp
時,就會發現這個
css
樣式根本沒有起作用。這是因為在
servlet
中轉發時
css
的路徑就是相對于這個
servlet
的相對路徑而非
jsp
的路徑了。所以這時候不能在
jsp
中用這樣的路徑:
<link href="one.css" rel="stylesheet" type="text/css">
或者
<link href="../../one.css" rel="stylesheet" type="text/css">
類似
href="one.css"
和
../../one.css
的
html
相對路徑是相對于引用這個
css
的文件的相對路徑。而在
servlet
中轉發時就是相對于這個
servlet
的相對路徑了,因為
jsp
路徑和
servlet
路徑是不一樣的,所以這樣的引用肯定是出錯的。
所以這個時候,要用站點根目錄,就是相對于
http://192.168.0.1/
的目錄,以“
/
”開頭。
因此上述錯誤應更正為
href=”/webapp/one.css”
類似的站點根目錄的相對目錄。這樣在
servlet
轉發后和
jsp
中都是相對于站點根目錄的相對路徑,就能正確使用所定義的
css
樣式了。
?
說了這么多,不知道你了解沒,有什么問題留言,大家一塊交流!
posted @
2006-10-10 08:57 向東博客 閱讀(3792) |
評論 (2) |
編輯 收藏
1. 概述
本文主要包括以下幾個方面:編碼基本知識,java,系統軟件,url,工具軟件等。
在下面的描述中,將以"中文"兩個字為例,經查表可以知道其GB2312編碼是"d6d0 cec4",Unicode編碼為"4e2d 6587",UTF編碼就是"e4b8ad e69687"。注意,這兩個字沒有iso8859-1編碼,但可以用iso8859-1編碼來"表示"。
2. 編碼基本知識
最早的編碼是iso8859-1,和ascii編碼相似。但為了方便表示各種各樣的語言,逐漸出現了很多標準編碼,重要的有如下幾個。
2.1. iso8859-1
屬于單字節編碼,最多能表示的字符范圍是0-255,應用于英文系列。比如,字母a的編碼為0x61=97。
很明顯,iso8859-1編碼表示的字符范圍很窄,無法表示中文字符。但是,由于是單字節編碼,和計算機最基礎的表示單位一致,所以很多時候,仍舊使用iso8859-1編碼來表示。而且在很多協議上,默認使用該編碼。比如,雖然"中文"兩個字不存在iso8859-1編碼,以gb2312編碼為例,應該是"d6d0 cec4"兩個字符,使用iso8859-1編碼的時候則將它拆開為4個字節來表示:"d6 d0 ce c4"(事實上,在進行存儲的時候,也是以字節為單位處理的)。而如果是UTF編碼,則是6個字節"e4 b8 ad e6 96 87"。很明顯,這種表示方法還需要以另一種編碼為基礎。
2.2. GB2312/GBK
這就是漢子的國標碼,專門用來表示漢字,是雙字節編碼,而英文字母和iso8859-1一致(兼容iso8859-1編碼)。其中gbk編碼能夠用來同時表示繁體字和簡體字,而gb2312只能表示簡體字,gbk是兼容gb2312編碼的。
2.3. unicode
這是最統一的編碼,可以用來表示所有語言的字符,而且是定長雙字節(也有四字節的)編碼,包括英文字母在內。所以可以說它是不兼容iso8859-1編碼的,也不兼容任何編碼。不過,相對于iso8859-1編碼來說,uniocode編碼只是在前面增加了一個0字節,比如字母a為"00 61"。
需要說明的是,定長編碼便于計算機處理(注意GB2312/GBK不是定長編碼),而unicode又可以用來表示所有字符,所以在很多軟件內部是使用unicode編碼來處理的,比如java。
2.4. UTF
考慮到unicode編碼不兼容iso8859-1編碼,而且容易占用更多的空間:因為對于英文字母,unicode也需要兩個字節來表示。所以unicode不便于傳輸和存儲。因此而產生了utf編碼,utf編碼兼容iso8859-1編碼,同時也可以用來表示所有語言的字符,不過,utf編碼是不定長編碼,每一個字符的長度從1-6個字節不等。另外,utf編碼自帶簡單的校驗功能。一般來講,英文字母都是用一個字節表示,而漢字使用三個字節。
注意,雖然說utf是為了使用更少的空間而使用的,但那只是相對于unicode編碼來說,如果已經知道是漢字,則使用GB2312/GBK無疑是最節省的。不過另一方面,值得說明的是,雖然utf編碼對漢字使用3個字節,但即使對于漢字網頁,utf編碼也會比unicode編碼節省,因為網頁中包含了很多的英文字符。
3. java對字符的處理
在java應用軟件中,會有多處涉及到字符集編碼,有些地方需要進行正確的設置,有些地方需要進行一定程度的處理。
3.1. getBytes(charset)
這是java字符串處理的一個標準函數,其作用是將字符串所表示的字符按照charset編碼,并以字節方式表示。注意字符串在java內存中總是按unicode編碼存儲的。比如"中文",正常情況下(即沒有錯誤的時候)存儲為"4e2d 6587",如果charset為"gbk",則被編碼為"d6d0 cec4",然后返回字節"d6 d0 ce c4"。如果charset為"utf8"則最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1",則由于無法編碼,最后返回 "3f 3f"(兩個問號)。
3.2. new String(charset)
這是java字符串處理的另一個標準函數,和上一個函數的作用相反,將字節數組按照charset編碼進行組合識別,最后轉換為unicode存儲。參考上述getBytes的例子,"gbk" 和"utf8"都可以得出正確的結果"4e2d 6587",但iso8859-1最后變成了"003f 003f"(兩個問號)。
因為utf8可以用來表示/編碼所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) === str,即完全可逆。
3.3. setCharacterEncoding()
該函數用來設置http請求或者相應的編碼。
對于request,是指提交內容的編碼,指定后可以通過getParameter()則直接獲得正確的字符串,如果不指定,則默認使用iso8859-1編碼,需要進一步處理。參見下述"表單輸入"。值得注意的是在執行setCharacterEncoding()之前,不能執行任何getParameter()。java doc上說明:This method must be called prior to reading request parameters or reading input using getReader()。而且,該指定只對POST方法有效,對GET方法無效。分析原因,應該是在執行第一個getParameter()的時候,java將會按照編碼分析所有的提交內容,而后續的getParameter()不再進行分析,所以setCharacterEncoding()無效。而對于GET方法提交表單是,提交的內容在URL中,一開始就已經按照編碼分析所有的提交內容,setCharacterEncoding()自然就無效。
對于response,則是指定輸出內容的編碼,同時,該設置會傳遞給瀏覽器,告訴瀏覽器輸出內容所采用的編碼。
3.4. 處理過程
下面分析兩個有代表性的例子,說明java對編碼有關問題的處理方法。
3.4.1. 表單輸入
User input *(gbk:d6d0 cec4) browser *(gbk:d6d0 cec4) web server iso8859-1(00d6 00d 000ce 00c4) class,需要在class中進行處理:getbytes("iso8859-1")為d6 d0 ce c4,new String("gbk")為d6d0 cec4,內存中以unicode編碼則為4e2d 6587。
l 用戶輸入的編碼方式和頁面指定的編碼有關,也和用戶的操作系統有關,所以是不確定的,上例以gbk為例。
l 從browser到web server,可以在表單中指定提交內容時使用的字符集,否則會使用頁面指定的編碼。而如果在url中直接用?的方式輸入參數,則其編碼往往是操作系統本身的編碼,因為這時和頁面無關。上述仍舊以gbk編碼為例。
l Web server接收到的是字節流,默認時(getParameter)會以iso8859-1編碼處理之,結果是不正確的,所以需要進行處理。但如果預先設置了編碼(通過request. setCharacterEncoding ()),則能夠直接獲取到正確的結果。
l 在頁面中指定編碼是個好習慣,否則可能失去控制,無法指定正確的編碼。
3.4.2. 文件編譯
假設文件是gbk編碼保存的,而編譯有兩種編碼選擇:gbk或者iso8859-1,前者是中文windows的默認編碼,后者是linux的默認編碼,當然也可以在編譯時指定編碼。
Jsp *(gbk:d6d0 cec4) java file *(gbk:d6d0 cec4) compiler read uincode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) compiler write utf(gbk: e4b8ad e69687; iso8859-1: *) compiled file unicode(gbk: 4e2d 6587; iso8859-1: 00d6 00d 000ce 00c4) class。所以用gbk編碼保存,而用iso8859-1編譯的結果是不正確的。
class unicode(4e2d 6587) system.out / jsp.out gbk(d6d0 cec4) os console / browser。
l 文件可以以多種編碼方式保存,中文windows下,默認為ansi/gbk。
l 編譯器讀取文件時,需要得到文件的編碼,如果未指定,則使用系統默認編碼。一般class文件,是以系統默認編碼保存的,所以編譯不會出問題,但對于jsp文件,如果在中文windows下編輯保存,而部署在英文linux下運行/編譯,則會出現問題。所以需要在jsp文件中用pageEncoding指定編碼。
l Java編譯的時候會轉換成統一的unicode編碼處理,最后保存的時候再轉換為utf編碼。
l 當系統輸出字符的時候,會按指定編碼輸出,對于中文windows下,System.out將使用gbk編碼,而對于response(瀏覽器),則使用jsp文件頭指定的contentType,或者可以直接為response指定編碼。同時,會告訴browser網頁的編碼。如果未指定,則會使用iso8859-1編碼。對于中文,應該為browser指定輸出字符串的編碼。
l browser顯示網頁的時候,首先使用response中指定的編碼(jsp文件頭指定的contentType最終也反映在response上),如果未指定,則會使用網頁中meta項指定中的contentType。
3.5. 幾處設置
對于web應用程序,和編碼有關的設置或者函數如下。
3.5.1. jsp編譯
指定文件的存儲編碼,很明顯,該設置應該置于文件的開頭。例如:<%@page pageEncoding="GBK"%>。另外,對于一般class文件,可以在編譯的時候指定編碼。
3.5.2. jsp輸出
指定文件輸出到browser是使用的編碼,該設置也應該置于文件的開頭。例如:<%@ page contentType="text/html; charset= GBK" %>。該設置和response.setCharacterEncoding("GBK")等效。
3.5.3. meta設置
指定網頁使用的編碼,該設置對靜態網頁尤其有作用。因為靜態網頁無法采用jsp的設置,而且也無法執行response.setCharacterEncoding()。例如:
如果同時采用了jsp輸出和meta設置兩種編碼指定方式,則jsp指定的優先。因為jsp指定的直接體現在response中。
需要注意的是,apache有一個設置可以給無編碼指定的網頁指定編碼,該指定等同于jsp的編碼指定方式,所以會覆蓋靜態網頁中的meta指定。所以有人建議關閉該設置。
3.5.4. form設置
當瀏覽器提交表單的時候,可以指定相應的編碼。例如:
posted @
2006-10-10 08:56 向東博客 閱讀(630) |
評論 (0) |
編輯 收藏