若天明 发表于 2015-1-18 11:31:06

JAVA编程:深切分析JSP和Servlet对中文的处置历程...

j2EE和asp比较,其实也没什么比的,原因和我上面说那些比较差不了多少,也是稳定性,安全性,J2EE比asp高,速度上比不过asp,asp也是延续着它的拖拽控件的方法,提高速度。js|servlet|历程|中文概述



天下上的各区域都有当地的言语。区域差别间接招致了言语情况的差别。在开辟一个国际化程序的过程当中,处置言语成绩就显得很主要了。

这是一个天下局限内都存在的成绩,以是,Java供应了天下性的办理办法。本文形貌的办法是用于处置中文的,可是,推而广之,关于处置天下上别的国度和区域的言语一样合用。

汉字是双字节的。所谓双字节是指一个双字要占用两个BYTE的地位(即16位),分离称为高位和低位。中国划定的汉字编码为GB2312,这是强迫性的,今朝几近一切的能处置中文的使用程序都撑持GB2312。GB2312包含了一二级汉字和9区标记,高位从0xa1到0xfe,低位也是从0xa1到0xfe,个中,汉字的编码局限为0xb0a1到0xf7fe。

别的有一种编码,叫做GBK,但这是一份标准,不是强迫的。GBK供应了20902个汉字,它兼容GB2312,编码局限为0x8140到0xfefe。GBK中的一切字符都能够逐一映照到Unicode2.0。

在不久的未来,中国会公布另外一种尺度:GB18030-2000(GBK2K)。它收录了躲、蒙等多数平易近族的字型,从基本上办理了字位不敷的成绩。注重:它不再是定长的。其二字节部分与GBK兼容,四字节部分是扩大的字符、字形。它的首字节和第三字节从0x81到0xfe,二字节和第四字节从0x30到0x39。

本文不盘算先容Unicode,有乐趣的能够扫瞄“http://www.unicode.org/”检察更多的信息。Unicode有一个特征:它包含了天下上一切的字符字形。以是,各个区域的言语都能够创建与Unicode的映照干系,而Java恰是使用了这一点以到达异种言语之间的转换。

在JDK中,与中文相干的编码有:

表1 JDK中与中文相干的编码列表

编码称号
说    明

ASCII
7位,与ascii7不异

ISO8859-1
8-位,与8859_1,ISO-8859-1,ISO_8859-1,latin1...等不异

GB2312-80
16位,与gb2312,gb2312-1980,EUC_CN,euccn,1381,Cp1381,1383,Cp1383,ISO2022CN,ISO2022CN_GB...等不异

GBK
与MS936不异,注重:辨别巨细写

UTF8
与UTF-8不异

GB18030
与cp1392、1392不异,今朝撑持的JDK很少


在实践编程时,打仗得对照多的是GB2312(GBK)和ISO8859-1。



为何会有“?”号



上文说过,异种言语之间的转换是经由过程Unicode来完成的。假定有两种分歧的言语A和B,转换的步骤为:先把A转化为Unicode,再把Unicode转化为B。

举例申明。有GB2312中有一个汉字“李”,其编码为“C0EE”,欲转化为ISO8859-1编码。步骤为:先把“李”字转化为Unicode,失掉“674E”,再把“674E”转化为ISO8859-1字符。固然,这个映照不会乐成,由于ISO8859-1中基本就没有与“674E”对应的字符。

当映照不乐成时,成绩就产生了!当从某言语向Unicode转化时,假如在某言语中没有该字符,失掉的将是Unicode的代码“uffffd”(“u”暗示是Unicode编码,)。而从Unicode向某言语转化时,假如某言语没有对应的字符,则失掉的是“0x3f”(“?”)。这就是“?”的由来。

比方:把字符流buf=“0x800x400xb00xa1”举行newString(buf,"gb2312")操纵,失掉的了局是“ufffdu554a”,再println出来,失掉的了局将是“?啊”,由于“0x800x40”是GBK中的字符,在GB2312中没有。

再如,把字符串String="u00d6u00ecu00e9u0046u00bbu00f9"举行newString(buf.getBytes("GBK"))操纵,失掉的了局是“3fa8aca8a6463fa8b4”,个中,“u00d6”在“GBK”中没有对应的字符,失掉“3f”,“u00ec”对应着“a8ac”,“u00e9”对应着“a8a6”,“0046”对应着“46”(由于这是ASCII字符),“u00bb”没找到,失掉“3f”,最初,“u00f9”对应着“a8b4”。把这个字符串println一下,失掉的了局是“?ìéF?ù”。看到没?这里其实不满是问号,由于GBK与Unicode映照的内容中除汉字外另有字符,本例就是最好的明证。

以是,在汉字转码时,假如产生庞杂,失掉的纷歧建都是问号噢!不外,错了毕竟是错了,50步和100步并没有质的不同。

大概会问:假如源字符会合有,而Unicode中没有,了局会怎样?回覆是不晓得。由于我手头没有能做这个测试的源字符集。但有一点是一定的,那就是源字符集不敷标准。在Java中,假如产生这类情形,是会抛出非常的。



甚么是UTF



UTF,是UnicodeTextFormat的缩写,意为Unicode文本格局。关于UTF,是如许界说的:

(1)假如Unicode的16位字符的头9位是0,则用一个字节暗示,这个字节的首位是“0”,剩下的7位与原字符中的后7位不异,如“u0034”(0000000000110100),用“34”(00110100)暗示;(与源Unicode字符是不异的);

(2)假如Unicode的16位字符的头5位是0,则用2个字节暗示,首字节是“110”开首,前面的5位与源字符中撤除头5个零后的最高5位不异;第二个字节以“10”开首,前面的6位与源字符中的低6位不异。如“u025d”(0000001001011101),转化后为“c99d”(1100100110011101);

(3)假如不切合上述两个划定规矩,则用三个字节暗示。第一个字节以“1110”开首,后四位为源字符的高四位;第二个字节以“10”开首,后六位为源字符两头的六位;第三个字节以“10”开首,后六位为源字符的低六位;如“u9da7”(1001110110100111),转化为“e9b6a7”(111010011011011010100111);

能够这么形貌JAVA程序中Unicode与UTF的干系,固然不停对:字符串在内存中运转时,体现为Unicode代码,而当要保留到文件或别的介质中往时,用的是UTF。这个转化历程是由writeUTF和readUTF来完成的。



好了,基本性的叙述差未几了,上面进进正题。



先把这个成绩想成是一个黑匣子。先看黑匣子的一级暗示:

input(charsetA)->process(Unicode)->output(charsetB)

复杂,这就是一个IPO模子,即输出、处置和输入。一样的内容要经由“从charsetA到unicode再到charsetB”的转化。

再看二级暗示:

SourceFile(jsp,java)->class->output


在这个图中,能够看出,输出的是jsp和java源文件,在处置过程当中,以Class文件为载体,然后输入。再细化到三级暗示:

jsp->tempfile->class->browser,osconsole,db

app,servlet->class->browser,osconsole,db



这个图就更分明了。Jsp文件师长教师成两头的Java文件,再天生Class。而Servlet和一般App则间接编译天生Class。然后,从Class再输入到扫瞄器、把持台或数据库等。



JSP:从源文件到Class的历程



Jsp的源文件是以“.jsp”开头的文本文件。在本节中,将论述JSP文件的注释和编译历程,并跟踪个中的中文变更。

1、JSP/Servlet引擎供应的JSP转换工具(jspc)搜刮JSP文件顶用<%@pagecontentType="text/html;charset=<Jsp-charset>"%>中指定的charset。假如在JSP文件中未指定<Jsp-charset>,则取JVM中的默许设置file.encoding,一样平常情形下,这个值是ISO8859-1;

2、jspc用相称于“javacCencoding<Jsp-charset>”的命令注释JSP文件中呈现的一切字符,包含中笔墨符和ASCII字符,然后把这些字符转换成Unicode字符,再转化成UTF格局,存为JAVA文件。ASCII码字符转化为Unicode字符时只是复杂地在后面加“00”,如“A”,转化为“u0041”(不必要来由,Unicode的码表就是这么编的)。然后,经由到UTF的转换,又变回“41”了!这也就是可使用一般文本编纂器检察由JSP天生的JAVA文件的缘故原由;

3、引擎用相称于“javacCencodingUNICODE”的命令,把JAVA文件编译成CLASS文件;

先看一下这些过程当中中笔墨符的转换情形。有以下源代码:

<%@pagecontentType="text/html;charset=gb2312"%>

<html><body>

<%

Stringa="中文";

out.println(a);

%>

</body></html>


这段代码是在UltraEditforWindows上编写的。保留后,“中文”两个字的16进制编码为“D6D0CEC4”(GB2312编码)。经查表,“中文”两字的Unicode编码为“u4E2Du6587”,用UTF暗示就是“E4B8ADE69687”。翻开引擎天生的由JSP文件变化而成的JAVA文件,发明个中的“中文”两个字的确被“E4B8ADE69687”替换了,再检察由JAVA文件编译天生的CLASS文件,发明了局与JAVA文件中的完整一样。

再看JSP中指定的CharSet为ISO-8859-1的情形。

<%@pagecontentType="text/html;charset=ISO-8859-1"%>

<html><body>

<%

Stringa="中文";

out.println(a);

%>

</body></html>


一样,该文件是用UltraEdit编写的,“中文”这两个字也是存为GB2312编码“D6D0CEC4”。先摹拟一下天生的JAVA文件和CLASS文件的历程:jspc用ISO-8859-1来注释“中文”,并把它映照到Unicode。因为ISO-8859-1是8位的,且是拉丁语系,其映照划定规矩就是在每一个字节前加“00”,以是,映照后的Unicode编码应为“u00D6u00D0u00CEu00C4”,转化成UTF后应当是“C396C390C38EC384”。好,翻开文件看一下,JAVA文件和CLASS文件中,“中文”公然都暗示为“C396C390C38EC384”。

假如上述代码中不指定<Jsp-charset>,即把第一行写成“<%@pagecontentType="text/html"%>”,JSPC会利用file.encoding的设置来注释JSP文件。在RedHat6.2上,其处置了局与指定为ISO-8859-1是完整不异的。

到如今为止,已注释了从JSP文件到CLASS文件的变化过程当中中笔墨符的映照历程。一句话:从“JspCharSet到Unicode再到UTF”。下表总结了这个历程:

表2 “中文”从JSP到CLASS的转化历程

Jsp-CharSet
JSP文件中
JAVA文件中
CLASS文件中

GB2312
D6D0CEC4

(GB2312)
从u4E2Du6587(Unicode)到

E4B8ADE69687(UTF)
E4B8ADE69687(UTF)

ISO-8859-1
D6D0CEC4

(GB2312)
从u00D6u00D0u00CEu00C4(Unicode)到C396C390C38EC384(UTF)
C396C390C38EC384(UTF)

无(默许=file.encoding)
同ISO-8859-1
同ISO-8859-1
同ISO-8859-1




下节先会商Servlet从JAVA文件到CLASS文件的转化历程,然后再注释从CLASS文件怎样输入到客户端。之以是如许布置,是由于JSP和Servlet在输入时处置办法是一样的。



Servlet:从源文件到Class的历程



Servlet源文件是以“.java”开头的文本文件。本节将会商Servlet的编译历程并跟踪个中的中文变更。

用“javac”编译Servlet源文件。javac能够带“-encoding<Compile-charset>”参数,意义是“用<Compile-charset>中指定的编码来注释Serlvet源文件”。

源文件在编译时,用<Compile-charset>来注释一切字符,包含中笔墨符和ASCII字符。然后把字符常量变化成Unicode字符,最初,把Unicode变化成UTF。

在Servlet中,另有一个中央设置输入流的CharSet。一般在输入了局前,挪用HttpServletResponse的setContentType办法来到达与在JSP中设置<Jsp-charset>一样的效果,称之为<Servlet-charset>。

注重,文中一共提到了三个变量:<Jsp-charset>、<Compile-charset>和<Servlet-charset>。个中,JSP文件只与<Jsp-charset>有关,而<Compile-charset>和<Servlet-charset>只与Servlet有关。

看下例:

importjavax.servlet.*;

importjavax.servlet.http.*;



classtestServletextendsHttpServlet

{

publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)

throwsServletException,java.io.IOException

{

resp.setContentType("text/html;charset=GB2312");

java.io.PrintWriterout=resp.getWriter();

out.println("<html>");

out.println("#中文#");

out.println("</html>");

}

}


该文件也是用UltraEditforWindows编写的,个中的“中文”两个字保留为“D6D0CEC4”(GB2312编码)。

入手下手编译。下表是<Compile-charset>分歧时,CLASS文件中“中文”两字的十六进制码。在编译过程当中,<Servlet-charset>不起任何感化。<Servlet-charset>只对CLASS文件的输入发生影响,实践上是<Servlet-charset>和<Compile-charset>一同,到达与JSP文件中的<Jsp-charset>不异的效果,由于<Jsp-charset>对编译和CLASS文件的输入城市发生影响。

表3 “中文”从Servlet源文件到Class的变化历程

Compile-charset
Servlet源文件中
Class文件中
等效的Unicode码

GB2312
D6D0CEC4

(GB2312)
E4B8ADE69687(UTF)
u4E2Du6587(在Unicode中=“中文”)

ISO-8859-1
D6D0CEC4

(GB2312)
C396C390C38EC384(UTF)
u00D6u00D0u00CEu00C4(在D6D0CEC4后面各加了一个00)

无(默许)
D6D0CEC4

(GB2312)
同ISO-8859-1
同ISO-8859-1




一般Java程序的编译历程与Servlet完整一样。



CLASS文件中的中文暗示法是否是昭然若揭了?OK,接上去看看CLASS又是如何输入中文的呢?



Class:输入字符串



上文说过,字符串在内存中体现为Unicode编码。至于这类Unicode编码暗示了甚么,那要看它是从哪一种字符集映照过去的,也就是说要看它的先人。这比如在托运转李时,表面都是纸箱子,内里装了甚么就要看寄邮件的人实践邮了甚么工具。

看看下面的例子,假如给一串Unicode编码“00D600D000CE00C4”,假如不作转换,间接用Unicode码表来对比它时,是四个字符(并且是特别字符);假设把它与“ISO8859-1”举行映照,则间接往失落后面的“00”便可失掉“D6D0CEC4”,这是ASCII码表中的四个字符;而假设把它看成GB2312来举行映照,失掉的了局极可能是一年夜堆乱码,由于在GB2312中有大概没有(也有大概有)字符与00D6等字符对应(假如对应不上,将失掉0x3f,也就是问号,假如对应上了,因为00D6等字符太靠前,估量也是一些特别标记,真实的汉字在Unicode中的编码从4E00入手下手)。

列位看到了,一样的Unicode字符,能够注释成分歧的模样。固然,这个中有一种是我们希冀的了局。以上例而论,“D6D0CEC4”应当是我们所想要的,当把“D6D0CEC4”输入到IE中时,用“简体中文”体例检察,就可以看到分明的“中文”两个字了。(固然了,假如你必定要用“西欧字符”来看,那也没举措,你将得不就任何有什么时候何地的工具)为何呢?由于“00D600D000CE00C4”原本就是由ISO8859-1转化已往的。

给出以下结论:

在Class输入字符串前,会将Unicode的字符串依照某一种内码从头天生字撙节,然后把字撙节输出,相称于举行了一步“String.getBytes(???)”操纵。???代表某一种字符集。

假如是Servlet,那末,这类内码就是在HttpServletResponse.setContentType()办法中指定的内码,也就是上订婚义的<Servlet-charset>。

假如是JSP,那末,这类内码就是在<%@pagecontentType=""%>中指定的内码,也就是上订婚义的<Jsp-charset>。

假如是Java程序,那末,这类内码就是file.encoding中指定的内码,默许为ISO8859-1。

当输入对象是扫瞄器时

以盛行的扫瞄器IE为例。IE撑持多种内码。假设IE吸收到了一个字撙节“D6D0CEC4”,你能够实验用各类内码往检察。你会发明用“简体中文”时能失掉准确的了局。由于“D6D0CEC4”原本就是简体中文中“中文”两个字的编码。

OK,完全地看一遍。



JSP:源文件为GB2312格局的文本文件,且JSP源文件中有“中文”这两个汉字



假如指定了<Jsp-charset>为GB2312,转化历程以下表。

表4 Jsp-charset=GB2312时的变更历程

序号
步骤申明
了局

1
编写JSP源文件,且存为GB2312格局
D6D0CEC4

(D6D0=中CEC4=文)

2
jspc把JSP源文件转化为一时JAVA文件,并把字符串依照GB2312映照到Unicode,并用UTF格局写进JAVA文件中
E4B8ADE69687

3
把一时JAVA文件编译成CLASS文件
E4B8ADE69687

4
运转时,先从CLASS文件顶用readUTF读出字符串,在内存中的是Unicode编码
4E2D6587(在Unicode中4E2D=中6587=文)

5
依据Jsp-charset=GB2312把Unicode转化为字撙节
D6D0CEC4

6
把字撙节输入到IE中,并设置IE的编码为GB2312(作者按:这个信息埋没在HTTP头中)
D6D0CEC4

7
IE用“简体中文”检察了局
“中文”(准确显现)




假如指定了<Jsp-charset>为ISO8859-1,转化历程以下表。

表5 Jsp-charset=ISO8859-1时的变更历程

序号
步骤申明
了局

1
编写JSP源文件,且存为GB2312格局
D6D0CEC4

(D6D0=中CEC4=文)

2
jspc把JSP源文件转化为一时JAVA文件,并把字符串依照ISO8859-1映照到Unicode,并用UTF格局写进JAVA文件中
C396C390C38EC384

3
把一时JAVA文件编译成CLASS文件
C396C390C38EC384

4
运转时,先从CLASS文件顶用readUTF读出字符串,在内存中的是Unicode编码
00D600D000CE00C4

(啥都不是!!!)

5
依据Jsp-charset=ISO8859-1把Unicode转化为字撙节
D6D0CEC4

6
把字撙节输入到IE中,并设置IE的编码为ISO8859-1(作者按:这个信息埋没在HTTP头中)
D6D0CEC4

7
IE用“西欧字符”检察了局
乱码,实际上是四个ASCII字符,但因为年夜于128,以是显现出来的怪模怪样

8
改动IE的页面编码为“简体中文”
“中文”(准确显现)




奇异了!为何把<Jsp-charset>设成GB2312和ISO8859-1是一个样的,都能准确显现?由于表4表5中的第2步和第5步互逆,是互相“抵消”的。只不外当指定为ISO8859-1时,要增添第8步操纵,殊为方便。

再看看不指定<Jsp-charset>时的情形。

表6 未指定Jsp-charset时的变更历程

序号
步骤申明
了局

1
编写JSP源文件,且存为GB2312格局
D6D0CEC4

(D6D0=中CEC4=文)

2
jspc把JSP源文件转化为一时JAVA文件,并把字符串依照ISO8859-1映照到Unicode,并用UTF格局写进JAVA文件中
C396C390C38EC384

3
把一时JAVA文件编译成CLASS文件
C396C390C38EC384

4
运转时,先从CLASS文件顶用readUTF读出字符串,在内存中的是Unicode编码
00D600D000CE00C4

(啥都不是!!!)

5
依据Jsp-charset=ISO8859-1把Unicode转化为字撙节
D6D0CEC4

6
把字撙节输入到IE中
D6D0CEC4

7
IE用收回哀求时的页面的编码检察了局
视情形而定。假如是简体中文,则能准确显现,不然,需实行表5中的第8步




Servlet:源文件为JAVA文件,格局是GB2312,源文件中含有“中文”这两个汉字



假如<Compile-charset>=GB2312,<Servlet-charset>=GB2312

表7 Compile-charset=Servlet-charset=GB2312时的变更历程

序号
步骤申明
了局

1
编写Servlet源文件,且存为GB2312格局
D6D0CEC4

(D6D0=中CEC4=文)

2
用javacCencodingGB2312把JAVA源文件编译成CLASS文件
E4B8ADE69687 (UTF)

3
运转时,先从CLASS文件顶用readUTF读出字符串,在内存中的是Unicode编码
4E2D6587(Unicode)

4
依据Servlet-charset=GB2312把Unicode转化为字撙节
D6D0CEC4(GB2312)

5
把字撙节输入到IE中并设置IE的编码属性为Servlet-charset=GB2312
D6D0CEC4(GB2312)

6
IE用“简体中文”检察了局
“中文”(准确显现)




假如<Compile-charset>=ISO8859-1,<Servlet-charset>=ISO8859-1

表8 Compile-charset=Servlet-charset=ISO8859-1时的变更历程

序号
步骤申明
了局

1
编写Servlet源文件,且存为GB2312格局
D6D0CEC4

(D6D0=中CEC4=文)

2
用javacCencodingISO8859-1把JAVA源文件编译成CLASS文件
C396C390C38EC384 (UTF)

3
运转时,先从CLASS文件顶用readUTF读出字符串,在内存中的是Unicode编码
00D600D000CE00C4

(啥都不是!!!)

4
依据Servlet-charset=ISO8859-1把Unicode转化为字撙节
D6D0CEC4

5
把字撙节输入到IE中并设置IE的编码属性为Servlet-charset=ISO8859-1
D6D0CEC4(GB2312)

6
IE用“西欧字符”检察了局
乱码(缘故原由同表5)

7
改动IE的页面编码为“简体中文”
“中文”(准确显现)




假如不指定Compile-charset或Servlet-charset,其默许值均为ISO8859-1。



当Compile-charset=Servlet-charset时,第2步和第4步能互逆,“抵消”,显现了局均能准确。读者可试着写一下Compile-charsetServlet-charset时的情形,一定是不准确的。



当输入对象是数据库时

输入到数据库时,道理与输入到扫瞄器也是一样的。本节只是Servlet为例,JSP的情形请读者自行推导。

假定有一个Servlet,它能吸收来自客户端(IE,简体中文)的汉字字符串,然后把它写进到内码为ISO8859-1的数据库中,然后再从数据库中掏出这个字符串,显现到客户端。

表9 输入对象是数据库时的变更历程(1)

序号
步骤申明
了局


1
在IE中输出“中文”
D6D0CEC4
IE

2
IE把字符串变化成UTF,并送进传输流中
E4B8ADE69687

3
Servlet吸收到输出流,用readUTF读取
4E2D6587(unicode)
Servlet

4
编程者在Servlet中必需把字符串依据GB2312复原为字撙节
D6D0CEC4

5
编程者依据数据库内码ISO8859-1天生新的字符串
00D600D000CE00C4

6
把重生成的字符串提交给JDBC
00D600D000CE00C4

7
JDBC检测到数据库内码为ISO8859-1
00D600D000CE00C4
JDBC

8
JDBC把吸收到的字符串依照ISO8859-1天生字撙节
D6D0CEC4

9
JDBC把字撙节写进数据库中
D6D0CEC4

10
完成数据存储事情
D6D0CEC4数据库

以下是从数据库中掏出数的历程

11
JDBC从数据库中掏出字撙节
D6D0CEC4
JDBC

12
JDBC依照数据库的字符集ISO8859-1天生字符串,并提交给Servlet
00D600D000CE00C4(Unicode)

13
Servlet取得字符串
00D600D000CE00C4(Unicode)
Servlet

15
编程者必需依据数据库的内码ISO8859-1复原成原始字撙节
D6D0CEC4

16
编程者必需依据客户端字符集GB2312天生新的字符串
4E2D6587

(Unicode)

Servlet筹办把字符串输入到客户端

17
Servlet依据<Servlet-charset>天生字撙节
D6D0CEC4
Servlet

18
Servlet把字撙节输入到IE中,假如已指定<Servlet-charset>,还会设置IE的编码为<Servlet-charset>
D6D0CEC4

19
IE依据指定的编码或默许编码检察了局
“中文”(准确显现)
IE


注释一下,表中第4第5步和第15第16步是用白色标志的,暗示要由编码者来作转换。第4、5两步实在就是一句话:“newString(source.getBytes("GB2312"),"ISO8859-1")”。第15、16两步也是一句话:“newString(source.getBytes("ISO8859-1"),"GB2312")”。敬爱的读者,你在如许编写代码时是不是意想到了个中的每个细节呢?



至于客户端内码和数据库内码为别的值时的流程,和输入对象是体系把持台时的流程,请读者本人想吧。分明了上述流程的道理,信任你能够轻松地写出来。



行文至此,已可告一段落了。尽头又回到了出发点,关于编程者而言,几近是甚么影响都没有。

由于我们早就原告之要这么做了。



以下给出一个结论,作为开头。

1、在Jsp文件中,要指定contentType,个中,charset的值要与客户端扫瞄器所用的字符集一样;关于个中的字符串常量,不需做任何内码转换;关于字符串变量,请求能依据ContentType中指定的字符集复原成客户端能辨认的字撙节,复杂地说,就是“字符串变量是基于<Jsp-charset>字符集的”;

2、在Servlet中,必需用HttpServletResponse.setContentType()设置charset,且设置成与客户端内码分歧;关于个中的字符串常量,必要在Javac编译时指定encoding,这个encoding必需与编写源文件的平台的字符集一样,一样平常说来都是GB2312或GBK;关于字符串变量,与JSP一样,必需“是基于<Servlet-charset>字符集的”。



实在我甚么都没做。



主要缺点就是:速度比较慢,没有C和C++快

admin 发表于 2015-1-21 09:16:35

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言

冷月葬花魂 发表于 2015-1-24 15:13:30

你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。

简单生活 发表于 2015-1-31 07:41:45

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

金色的骷髅 发表于 2015-2-4 13:18:06

设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧

仓酷云 发表于 2015-2-9 23:24:35

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

爱飞 发表于 2015-2-22 05:33:47

是一种使网页(Web Page)产生生动活泼画面的语言

只想知道 发表于 2015-2-27 21:08:55

是一种使用者不需花费很多时间学习的语言

小妖女 发表于 2015-3-9 14:07:17

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

精灵巫婆 发表于 2015-3-15 23:17:24

Java是一种计算机编程语言,拥有跨平台、面向对java

海妖 发表于 2015-3-22 01:09:13

是一种为 Internet发展的计算机语言

飘飘悠悠 发表于 2015-3-25 15:40:48

Java 编程语言的风格十分接近C、C++语言。

谁可相欹 发表于 2015-3-26 19:39:40

我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。

山那边是海 发表于 2015-3-31 02:53:18

科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。

活着的死人 发表于 2015-4-9 10:52:51

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

第二个灵魂 发表于 2015-4-10 04:04:05

另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。

分手快乐 发表于 2015-4-21 16:05:26

还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。

再现理想 发表于 2015-6-11 17:39:19

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

老尸 发表于 2015-6-20 23:43:29

是一种将安全性(Security)列为第一优先考虑的语言

因胸联盟 发表于 2015-6-26 09:51:05

是一种语言,用以产生「小应用程序(Applet(s))
页: [1]
查看完整版本: JAVA编程:深切分析JSP和Servlet对中文的处置历程...