仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 546|回复: 11
打印 上一主题 下一主题

[学习教程] JAVA网站制作之关于Servlet、Jsp中的多国言语显现 --...

[复制链接]
逍遥一派 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:25:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
首先第一点:jsp,servlet,javabean这些最基本的,嘿嘿,就算你是高手的话,在大行的企业级应用的话还是需要框架的,一个好的框架确实能构解决许多问题。js|servlet|显现/**
*有伴侣有云云苦心之作,其实感激,信任它不会怪我转贴吧,他的email是vividq@china.com
*/

关于Servlet、Jsp中的多国言语显现

  由于一向不信Java竟会有不克不及混排显现多国言语的BUG,这个周末研讨了一下Servlet、Jsp的多国言语显现的成绩,也就是Servlet的多字符集成绩,因为我对字符集的观点还不是很明晰以是写出的工具一定是正确的,我是如许了解Java中的字符集的:在运转时,每一个字符串对象中存储的都是编码为UNICODE内码的(我以为一切的言语中都是有响应编码的,由于在盘算机外部字符串老是用内码来暗示的,只不外一样平常盘算机言语中的字符串编码时平台相干的,而Java则接纳了平台有关的UNICODE)。
  Java从一个byte流中读取一个字符串时,将把平台相干的byte变化为平台有关的Unicode字符串。在输入时Java将把Unicode字符串变化为平台相干的byte流,假如某个Unicode字符在某个平台上不存在,将会输入一个?。举个例子:在中文Windows中,Java读出一个"GB2312"编码的文件(能够是任何流)到内存中机关字符串对象,将会把GB2312编码的笔墨变化为Unicode编码的字符串,假如把这个字符串输入又将会把Unicode字符串转化为GB2312的byte流或数组:"中文测试"----->"u4e2du6587u6d4bu8bd5"----->"中文测试"。
以下例程:
byte[]bytes=newbyte[]{(byte)0xd6,(byte)0xd0,(byte)0xce,(byte)0xc4,(byte)0xb2,(byte)0xe2,(byte)0xca,(byte)0xd4};//GBK编码的"中文测试"
java.io.ByteArrayInputStreambin=newjava.io.ByteArrayInputStream(bytes);
java.io.BufferedReaderreader=newjava.io.BufferedReader(newjava.io.InputStreamReader(bin,"GBK"));
Stringmsg=reader.readLine();
System.out.println(msg)
  这段程序放到包括"中文测试"这四个字的体系(如中文体系)中,能够准确地打印出这些字。msg字符串中包括了准确的"中文测试"的Unicode编码:"u4e2du6587u6d4bu8bd5",打印时转换为操纵体系的默许字符集,是不是能够准确显现依附于操纵体系的字符集,只要在撑持响应字符集的体系中,我们的信息才干准确的输入,不然失掉的将会是渣滓。
  话进正题,我们来看看Servlet/Jsp中的多言语成绩。我们的方针是,任一国度的客户端经由过程Form向Server发送信息,Server把信息存进数据库中,客户端在检索时仍旧可以看到本人发送的准确信息。现实上,我们要包管,终极Server中的SQL语句中保留的时包括客户端发送笔墨的准确Unicode编码;DBC与数据库通信时接纳的编码体例能包括客户端发送的笔墨信息,现实上,最好让JDBC间接利用UNICODE/UTF8与数据库通信!如许就能够确保不会丧失信息;Server向客户端发送的信息时也要接纳不丧失信息的编码体例,也能够是Unicode/Utf8。
  假如不指定Form的Enctype属性,Form将把输出的内容按照以后页面的编码字符集urlencode以后再提交,服务器端失掉是urlencoding的字符串。编码后失掉的urlencoding字符串是与页面的编码相干的,如gb2312编码的页面提交"中文测试",失掉的是"%D6%D0%CE%C4%B2%E2%CA%D4",每一个"%"后跟的是16进制的字符串;而在UTF8编码时失掉的倒是"%E4%B8%AD%E6%96%87%E6%B5%8B%E8%AF%95",由于GB2312编码中一个汉字是16位的,而UTF8中一个汉字倒是24位的。中日韩三国的ie4以上扫瞄器均撑持UTF8编码,这类计划一定包容了这三国言语,以是我们假如让Html页面利用UTF8编码那末将最少能够撑持这三国言语。
  可是,假如我们html/Jsp页面利用UTF8编码,由于使用程序服务器大概不晓得这类情形,由于假如扫瞄器发送的信息不包括charset信息,最多Server晓得读到Accept-Language哀求招标,我们晓得仅靠这个招标是不克不及获知扫瞄器所接纳编码的,以是使用程序服务器不克不及准确剖析提交的内容,为何?由于Java中的一切字符串都是Unicode16位编码的,HttpServletRequest.request(String)的功效就是把客户端提交的Urlencode编码的信息转为Unicode字符串,有些Server只能以为客户真个编码和Server平台不异,复杂地利用URLDecoder.decode(String)办法间接解码,假如客户端编码刚好和Server不异,那末就能够失掉准确地字符串,不然,假如提交地字符串中包括了外地字符,那末将会招致渣滓信息。
  在我提出的这个办理计划里,已指定了接纳Utf8编码,以是,能够制止这个成绩,我们能够本人定制出decode办法:
publicstaticStringdecode(Strings,Stringencoding)throwsException{
StringBuffersb=newStringBuffer();
for(inti=0;i<s.length();i++){
charc=s.charAt(i);
switch(c){
case+:
sb.append();
break;
case%:
try{
sb.append((char)Integer.parseInt(
s.substring(i+1,i+3),16));
}
catch(NumberFormatExceptione){
thrownewIllegalArgumentException();
}
i+=2;
break;
default:
sb.append(c);
break;
}
}
//Undoconversiontoexternalencoding
Stringresult=sb.toString();
byte[]inputBytes=result.getBytes("8859_1");
returnnewString(inputBytes,encoding);
}
  这个办法能够指定encoding,假如把它指定为UTF8就满意了我们的必要。好比用它剖析:"%E4%B8%AD%E6%96%87%E6%B5%8B%E8%AF%95"就能够失掉准确的汉字"中文测试"的Unicode字符串。
如今的成绩就是我们必需失掉客户端提交的Urlencode的字符串。关于method为get的form提交的信息,能够用HttpServletRequest.getQueryString()办法读到,而关于post办法的form提交的信息,只能从ServletInputStream中读到,现实上尺度的getParameter办法被第一次挪用后,form提交的信息就被读掏出来了,而ServletInputStream是不克不及反复读出的。以是我们应在第一次利用getParameter办法前读取并剖析form提交的信息。
  我是这么做的,创建一个Servlet基类,掩盖service办法,在挪用父类的service办法前读取并剖析form提交的内容,请看上面的源代码:
packagecom.hto.servlet;

importjavax.servlet.http.HttpServletRequest;
importjava.util.*;
/**
*Insertthetypesdescriptionhere.
*Creationdate:(2001-2-415:43:46)
*@author:钱卫春
*/
publicclassUTF8ParameterReader{
Hashtablepairs=newHashtable();
/**
*UTF8ParameterReaderconstructorcomment.
*/
publicUTF8ParameterReader(HttpServletRequestrequest)throwsjava.io.IOException{
super();
parse(request.getQueryString());
parse(request.getReader().readLine());
}
/**
*UTF8ParameterReaderconstructorcomment.
*/
publicUTF8ParameterReader(HttpServletRequestrequest,Stringencoding)throwsjava.io.IOException{
super();
parse(request.getQueryString(),encoding);
parse(request.getReader().readLine(),encoding);
}
publicstaticStringdecode(Strings)throwsException{
StringBuffersb=newStringBuffer();
for(inti=0;i<s.length();i++){
charc=s.charAt(i);
switch(c){
case+:
sb.append();
break;
case%:
try{
sb.append((char)Integer.parseInt(
s.substring(i+1,i+3),16));
}
catch(NumberFormatExceptione){
thrownewIllegalArgumentException();
}
i+=2;
break;
default:
sb.append(c);
break;
}
}
//Undoconversiontoexternalencoding
Stringresult=sb.toString();
byte[]inputBytes=result.getBytes("8859_1");
returnnewString(inputBytes,"UTF8");
}
publicstaticStringdecode(Strings,Stringencoding)throwsException{
StringBuffersb=newStringBuffer();
for(inti=0;i<s.length();i++){
charc=s.charAt(i);
switch(c){
case+:
sb.append();
break;
case%:
try{
sb.append((char)Integer.parseInt(
s.substring(i+1,i+3),16));
}
catch(NumberFormatExceptione){
thrownewIllegalArgumentException();
}
i+=2;
break;
default:
sb.append(c);
break;
}
}
//Undoconversiontoexternalencoding
Stringresult=sb.toString();
byte[]inputBytes=result.getBytes("8859_1");
returnnewString(inputBytes,encoding);
}
/**
*Insertthemethodsdescriptionhere.
*Creationdate:(2001-2-417:30:59)
*@returnjava.lang.String
*@paramnamejava.lang.String
*/
publicStringgetParameter(Stringname){
if(pairs==null||!pairs.containsKey(name))returnnull;
return(String)(((ArrayList)pairs.get(name)).get(0));
}
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译)
灵魂腐蚀 该用户已被删除
沙发
发表于 2015-1-21 06:09:37 | 只看该作者
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
山那边是海 该用户已被删除
板凳
发表于 2015-1-30 09:31:41 | 只看该作者
是一种为 Internet发展的计算机语言
蒙在股里 该用户已被删除
地板
发表于 2015-1-30 15:54:48 | 只看该作者
是一种突破用户端机器环境和CPU
再见西城 该用户已被删除
5#
发表于 2015-2-6 13:56:05 | 只看该作者
是一种使网页(Web Page)由静态(Static)转变为动态(Dynamic)的语言
飘灵儿 该用户已被删除
6#
发表于 2015-2-16 09:18:48 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
因胸联盟 该用户已被删除
7#
发表于 2015-3-4 02:14:04 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
只想知道 该用户已被删除
8#
发表于 2015-3-4 03:01:05 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
冷月葬花魂 该用户已被删除
9#
发表于 2015-3-4 11:53:34 | 只看该作者
是一种突破用户端机器环境和CPU
admin 该用户已被删除
10#
发表于 2015-3-7 11:15:29 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
谁可相欹 该用户已被删除
11#
发表于 2015-3-15 01:31:09 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
若相依 该用户已被删除
12#
发表于 2015-3-21 15:20:35 | 只看该作者
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-28 19:17

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表