转自:http://bbs.chinajavaworld.com/post/view?bid=48&id=676836&sty=1&tpg=1&age=0
http://bbs.chinajavaworld.com/user/download/676836/Strutseclipse%EF%BC%91.doc
http://bbs.chinajavaworld.com/user/download/676837/Strutseclipse%EF%BC%92.doc
http://www.laliluna.de/struts-jsf-jsp-servlets-tutorials.html
标签:JSP
(转帖)Jive的中文问题及解决办法及关联转帖
首页 » 研究文集 » Jive 研究 搜索标题相关文章 发表评论 开始监控 加入收藏夹
Jive的中文问题及解决办法
bruce 原创 (参与分:520452,专家分:6410) 发表:2002-08-31 12:52 阅读:12622次
说明:本文没有特别指出的地方的环境配置均为:
Windows XP + Tomcat 3.3a + mysql 3.23.51-nt + mysql-connector-java-2.0.14-bin.jar
Jive中产出乱码的原因是多方面的,包括操作系统、Web服务器(比如Tomcat)、Jive的设置、数据库(链接)的编码方式、页面的编码等多个环节,任何一个环节出现编码问题,都会导致你的最终页面出现乱码。相应的解决问题也需要分多步进行。比如,你创建一个论坛,然后页面显示是乱码,你可以根据如下顺序定位问题:
1. 查看数据库中的记录是否是乱码。如果是,再试着修改数据库的链接的编码方式;如果仍然乱码,说明在向后台传送数据前就发生了编码问题,可以查看页面的编码方式、或者在提交前进行如下编码转换:
String new = new String(old.getBytes(“8859_1”), “GB2312”);
2. 如果数据库中正常显示中文,那么说明是页面显示的问题。
在上述每一步,你总是可以使用log语句及时输出,追踪乱码发生的位置。
下面是一些常见的问题,和解决办法。
1. 问:创建论坛或发贴时,输入的中文名显示乱码,查看数据库中,也为乱码。
解决办法:停止Tomcat,修改{JIVE}\WEB-INF\jiveHome\jive_config.xml(在jive.database.defaultProvider节点中):
<serverURL>jdbc:mysql://localhost/jive</serverURL>
为:
<serverURL>jdbc:mysql://localhost/jive?useUnicode=true&characterEncoding=gb2312</serverURL>
注意useUnicode=true与characterEncoding=gb2312之间不要直接使用“&”,需要使用XML转意字符:&加上amp;
2. 问:搜索中文时,search.jsp的输入框中的文字变成了“???”,导致不能搜索出任何结果。
解决办法:将search.jsp页面中的所有的:
/search.jsp...q=<%=(queryText!=null)?queryText:"")%>
修改为:
/search.jsp?...q=<%= (queryText!=null)?java.net.URLEncoder.encode(queryText,"GB2312"):""%>
你还可以参加cherami的一篇文章:
Tomcat下的JIVE2的中文问题的报告
本文会不断完善,欢迎大家把自己解决Jive乱码的经验回复在文后,我会把最新的一些内容及时补充近来,一起来完善本文。给更多的朋友提供方便,先谢谢大家!
TOMCAT下的JIVE2的中文问题的报告
首页 » 研究文集 » Jive 研究 搜索标题相关文章 发表评论
TOMCAT下的JIVE2的中文问题的报告
cherami 翻译 (参与分:700911,专家分:21389) 发表:2002-05-26 15:44 更新:2002-11-10 18:24 版本:1.0 阅读:7675次
原文摘自jive论坛用户shyguy的帖子。
翻译者:cherami
XXX 注意 XXX:
所有的结论都是基于一下平台:
Winnt4.0(简体中文版) + Sun JDK1.3 + Tomcat4.0-b7 + jive2.0.1 + mysql3.23.38 + org.gjt.mm.mysql.Driver-2.04
在这样的条件下,安装在TOMCAT下的Jive2.0不能像其他JSP应用那样不做任何修改就可以正确的显示中文。我不敢确定但是几个测试的结果告诉我tomcat核心的编码总是8859_1,无论是否在双字节的操作系统下。当客户端输入一些中文,request.getParameter()请求返回的字符串是8859_1,因此如果你使用System.out.println()将输入打印到控制台,它看上去就像"??x?"。如果你在每个JSP文件的开始加上 <%@ page contentType="text/html;charSet=gb2312" %> 标签,中文就可以正确显示,因为tomcat知道它的内核编码是8859_1而输出到客户端的PrintWriter(它是JSP的输出对象)的编码是gb2312,因此PrintWriter在内部做了令人愤怒的8859_1到gb2312的转换。这就是为什么我们总是添加contentType解决中文问题的原因。
但是不幸的是,当我们通过JDBC从数据库提取字符串的时候事情就不一样了。
看看下面的虚拟的代码: str=rec.getString(field); 你能告诉我字符串str的编码吗?
答案是: gb2312!!!
(就像mysql jdbc驱动一样,很多包都根据平台返回字符串的编码,例如 SimpleDateFormat 和 JavaMail。)因此,当你将字符串传递到PrintWrite时,愚蠢的PrintWriter将再次使用8859_1-->gb2312的转换。可怜的客户端别无选择的看到丑陋的????。
令我困惑的是:
request.getParameter()的返回字符串的编码是8859_1,因此向控制台打印时它看上去像??x?,但是Jive可以将字符串用gb2312编码存入数据库!!!
例如,在post.jsp里面,在消息创建发生以前,我将中文主题和内容输出到控制台,它看上去是??x?,但是在mysql数据库里面,SELECT * FROM jiveMessage将返回正确的中文!
同时我也发现response.setLocale()对中文输出没有作用。
如何解决呢:
1. 在输出前使用String.getBytes()反向转换gb2312字符串,这是最愚蠢的方法。
2. 在英文平台下运行服务器。
3. 最最最最好的方法是: 使用其他的 java服务器!
对于TOMCAT用户的建议是:
如果你确实想在一个双字节的操作系统(例如简体中文版的Winnt)上运行TOMCAT,你最好: (1)添加<%@ page contentType="text/html;charSet=gb2312"%>到 \include\brankding\style.jsp 和 \admin\include\global.jsp的第一行(路径是相对TOMCAT的主目录)
(2)反向转换从数据库返回的所有字符串为8859_1编码。这需要修改JIVE核心的所有DBxxxx类,
或者修改JDBC驱动的"result.getString()"进行反向转换,
或者修改TOMCAT内核中的"out"对象进行反向转换。
(3)如果你修改了tomcat内核中的"out对象,在将中文信息传递到jive/index.jsp时你最好使用URLEncode(/dir/URL.jsp?gb2312_msg)。
附:Rexip AppServer 有Record-Breaking Benchmark Results处理Java应用的服务器端中文问题。
版权声明 本篇文章对您是否有帮助? 投票: 是 否 投票结果: 6 3
作者其它文章:
使用Checklist提升项目的质量
提升项目组的开发效率
使用JkUnMount
Apache2.0运行模型分析及性能调整
优化Apache 2.0 性能
作者全部文章 查看作者的Blog
评论人:scorpio_leon 参与分: 365 专家分: 55 来自: 上海
发表时间: 2002-08-13 17:16
还有一个解决方案
在不进数据库,需要中文参数的页面使用filter,不要忘记了,filter是可以配置的:)
有既需要进数据库,又需要其他中文参数传递的页面呢?
一般不会有吧,有的就举个例子讨论看?
评论人:shyguy 参与分: 23055 专家分: 330 来自: 西湖
发表时间: 2002-09-18 12:10
嘿嘿,老了。很久以前的事情了,有些观点甚至是错误的。
对不起了。
这个文章共有 2 条评论,共 1 页
Problems encountered while deleting resources.
Kind Status Priority Description Resource In Folder Location
Error The project was not built due to "Problems encountered while deleting resources.". Fix the problem, then try refreshing this project and rebuilding it since it may be inconsistent. learndiary
删除classes,刷新工程,重新编译。
(转帖)使用 UTF-8 对 XML 文档进行编码
中国 [ 选择] 使用条款
dW 全部内容 ----------------- DB2 Lotus Tivoli WebSphere ----------------- Java 技术 Linux Open source Security SOA & Web services Web architecture Wireless XML ----------------- IBM 全部内容
首页 产品 服务与解决方案 支持与下载 个性化服务
developerWorks
中国
本文内容包括:
每个人都能使用 UTF-8
专家们的说法
中文、日文和韩文
健壮性
结束语
参考资料
关于作者
对本文的评价
相关链接
XML 技术文档库
developerWorks 中国 > XML >
使用 UTF-8 对 XML 文档进行编码
(提示:文档大小与 UTF-8 无关)
文档选项
将此页作为电子邮件发送
对此页的评价
帮助我们改进这些内容
级别: 中级
Elliotte Harold , 副教授, Polytechnic University
2005 年 9 月 26 日
Unicode 是目前世界上所有其他主要计算机字符集的超集。UTF-8 是 Unicode 字符集特有的二进制编码。本文解释了为何所有 XML 文档都应当使用 UTF-8 生成的原因。结果是更健壮、更具互操作性的文档世界。
Google 的 Sitemap 服务最近在 XML 社区引起了一些波澜,它要求发布的所有站点地图必须采用 Unicode 的 UTF-8 编码。Google 甚至不允许其他 Unicode 编码(如 UTF-16),更不用说 ISO-8859-1 这样的非 Unicode 编码了。从技术上说,这意味着 Google 使用的是非标准 XML 解析器,因为 XML Recommendation 特别要求“所有 XML 处理程序必须接受 Unicode 3.1 的 UTF-8 和 UTF-16 编码”,但这确实是一个大问题吗?
每个人都能使用 UTF-8
普遍性是选择 UTF-8 的第一个也是最有说服力的理由。它可以处理目前世界上使用的每一种文字。虽然还有少数空白,但是越来越不明显,被逐渐填平了。没有纳入的文字通常也没有其他任何字符集实现过,即使有也不能在 XML 中使用。最好的情况下,这些文字通过字体借用转嫁到 Latin-1 这样的单字节字符集。对这类稀有文字的真正支持可能最先来自 Unicode,而且可能只有 Unicode 支持它们。
但这仅仅是使用 Unicode 的一个理由。为什么选择 UTF-8 而不是 UTF-16 或者其他 Unicode 编码呢?最直接的原因之一是广泛的工具支持。基本上所有可能用于 XML 的主要编辑器都能处理 UTF-8,包括 JEdit、BBEdit、Eclipse、emacs 甚至 Notepad。在 XML 和非 XML 工具中,没有其他 Unicode 编码拥有这样广泛的工具支持。
对于其中一些编辑器,如 BBEdit 和 Eclipse,UTF-8 并不是默认的字符集。现在有必要改变默认设置了,所有工具出厂的时候都应该选择 UTF-8 作为默认编码。除非这样,否则当文件跨越国界、平台和语言传递的时候,我们就会陷入不能互操作的泥潭。不过在所有程序都把 UTF-8 作为默认编码之前,自己修改默认设置也很容易。比如在 Eclipse 中,图 1 所示的“General/Editors”首选项面板允许指定所有文件都使用 UTF-8。您可能注意到 Eclipse 希望默认值为 MacRoman,但是如果这样,当把文件传递给使用 Microsoft® Windows® 的程序员或者美国和西欧之外的计算机时将无法编译。
图 1. 改变 Eclipse 的默认字符集
当然,要让 UTF-8 其作用,开发人员交换的文件也都必须使用 UTF-8,但这不成问题。与 MacRoman 不同,UTF-8 不局限于少数文字或者个别平台。任何人都能用 UTF-8。而 MacRoman、Latin-1、SJIS 和其他各种遗留的国家字符集都不能做到。
UTF-8 在不支持多字节数据的工具中也能正常工作。其他 Unicode 格式如 UTF-16 往往包含很多零字节。很多工具将这些字节解释为文件尾或者其他某种特殊的分界符,造成不希望的、未曾预料到的、常常是不愉快的结果。比方说,如果 UTF-16 数据原样加载到 C 字符串中,字符串可能从第一个 ASCII 字符的第二个字节截断。UTF-8 文件仅在确实表示 null 的地方包含 null。当然,不应该选择这么天真的工具来处理 XML 文档。但是,遗留系统中文档常常在奇怪的地方结束,没有人真正认识到或者理解那些字符序列仅仅是旧瓶装新酒。与 UTF-16 或其他 Unicode 编码相比,对于不支持 Unicode 和 XML 的系统,UTF-8 更不容易造成问题。
回页首
专家们的说法
XML 是第一个全面支持 UTF-8 的重要标准,但这仅仅是开始。各标准组织都在逐渐推荐 UTF-8。比如,包含非 ASCII 字符的 URL 是长期困扰 Web 的一个问题。在 PC 机上工作的包含非 ASCII 字符的 URL 不能用于 Mac,反之亦然。万维网联盟(W3C)和 Internet 工程任务组(IETF)最近同意所有 URL 都必须采用 UTF-8 编码而不能是其他编码,从而解决了这一问题。
W3C 和 IETF 对最先、最后还是偶尔使用 UTF-8 变得越来越强硬。The W3C Character Model for the World Wide Web 1.0: Fundamentals 指出,“如果必须选择一种字符编码,则必须是 UTF-8、UTF-16 或 UTF-32。US-ASCII 对 UTF-8 向上兼容(US-ASCII 字符串也是 UTF-8 字符串,参见 [RFC 3629]),因此如果需要与 US-ASCII 保持兼容,UTF-8 非常合适。”事实上,与 US-ASCII 兼容如此重要,几乎是必需的。W3C 明智地解释说,“其他情况下,如对于 API,UTF-16 或 UTF-32 可能更合适。选择一种编码的原因可能包括内部处理的效率以及与其他进程的互操作性。”
我同意内部处理的效率这条理由。比如,Java™ 语言中字符串的内部表示采用 UTF-16,因此对字符串的索引更快。不过,Java 代码永远不会把这种内部表示向与它交换数据的程序公开。相反,对于外部数据交换,要使用 java.io.Writer,明确地指定字符集。选择的时候,强烈推荐 UTF-8。
IETF 甚至更加明确。The IETF Charset Policy [RFC 2277] 指出,在没有不确定性的语言中:
协议必须能够使用 UTF-8 字符集,它由 ISO 10646 编码集和 UTF-8 字符编码方法组成,全文参见 [10646] Annex R(修正版 2 中发布)。
此外,协议可以规定如何使用其他 ISO 10646 字符集和字符编码方案,如 UTF-16,但是不能使用 UTF-8 是对本策略的违反,这种违反在进入或者提升到标准跟踪过程时,需要经过变更程序([BCP9] 第 9 节),并在协议规范文档中提出明确、可靠的理由。
现有的协议或者从已有数据存储转移数据的协议,可能需要支持其他数据集,甚至使用 UTF-8 之外的默认编码。这是允许的,但是必须能够支持 UTF-8。
要点:今后一段时间,对遗留协议和文件的支持可能要求接受 UTF-8 之外的字符集和编码,但是如果必须如此我会非常小心。每种新的协议、应用程序和文档都应该使用 UTF-8。
回页首
中文、日文和韩文
一种常见的误解是认为 UTF-8 是一种压缩格式。其实并非如此。与其他 Unicode 编码特别是 UTF-16 相比,在 UTF-8 中 ASCII 字符占用的空间只有一半。不过一些字符的 UTF-8 编码占用的空间要多出 50%,特别是中文、日文和韩文(CJK)这样的象形文字。
但即使用 UTF-8 编码 CJK XML,实际的大小可能也比 UTF-16 小。比如,中文的 XML 文档包含大量 ASCII 字符,如 <、>、&、=、"、' 和空格。这些字符的 UTF-8 编码要比 UTF-16 小。具体的压缩/膨胀因素因文档而异,但不论哪种情况,差别都不可能很明显。
最后,值得一提的是中文和日文这类象形文字,与 Latin、Cyrillic 这类字母文字相比,用字往往更少。由于字符的绝对量很大,要求每个字符使用三个或更多字节才能完全地表达这些文字,就是说,与英文或俄文相比,同样的词语或句子,这些语言可以用更少的字表达。比如,“tree”在日文中用“木”表示(非常像一棵树)。 用 UTF-8 表示需要三个字节,而英文单词“tree”包含四个字母,需要四个字节。日文中的“grove(小树林)”是“林”(两棵树靠在一起)。用 UTF-8 编码需要三个字节,而英文单词“grove”有五个字母,需要五个字节。日文中的“森”(三棵树)仍然需要三个字节。而对应的英文字“forest”需要六个字节。
如果确实需要压缩,则使用 zip 或 gzip。压缩后,UTF-8 和 UTF-16 的大小差不多,不论原始大小相差多少。无论哪种编码,原始大小越大,压缩算法去掉的冗余就更多。
回页首
健壮性
真正的优势在于设计,与以前和以后设计的其他任何文本编码相比,UTF-8 是一种更健壮、更容易解释的格式。首先,与 UTF-16 相比,UTF-8 没有 endianness 问题。UTF-8 用 Big-endian 和 little-endian 来表示都是一样的,因为 UTF-8 是按 8 位字节而不是 16 位字定义的。UTF-8 没有字节序的不确定性问题,后者必须通过字节序标志或其他试探手段来解决。
UTF-8 更重要的一个特征是无状态性。UTF-8 流或序列中的每个字节都是明确的。在 UTF-8 中总是可以知道所处的位置,就是说给定一个字节,马上就能确定它是一个单字节字符、双字节字符的第一个字节、双字节字符的第二个字节,或者三字节/四字节字符的第二个、第三个或第四个字节(当然还有其他可能性,但明白这个意思就行)。在 UTF-16 中,就不能确定字节“0x41”是不是字母“A”。有时候是,有时候不是。必须记录足够的状态才能确定在流中的位置。如果损失了一个字节,此后的数据就全部无法用了。在 UTF-8 中,丢失或者破坏的字节很容易确定,也不会影响其他数据。
UTF-8 并非是万能的。需要随机访问文档特定位置的应用程序使用 UCS2 或 UTF-32 这类固定宽度的编码可能操作起来更快。(如果考虑到替换对,UTF-16 是一种变长字符编码。)但是,XML 处理不属于这类应用程序。XML 规范特别要求解析器从 XML 文档的第一个字节开始解析直到最后一个字节,所有现有的解析器都是这样操作的。更快的随机访问对 XML 处理没有什么帮助,虽然对于数据库或其他系统使用不同的编码这可能是一个很好的理由,但不适用于 XML。
回页首
结束语
在越来越国际化的世界中,语言和政治边界日渐模糊,依赖于地域的字符集不再适用了。Unicode 是惟一能够跨越很多地域互操作的字符集。UTF-8 是最好的 Unicode 编码:
广泛的工具支持,包括与遗留 ASCII 系统最佳的兼容性。
处理起来简单而高效。
抗讹误。
平台独立。
该停止关于字符集和编码的争论了,选择 UTF-8,结束纷争。
回页首
参考资料
学习
您可以参阅本文在 developerWorks 全球站点上的 英文原文。
看看引起这场争论的 Google Sitemap 需求。
Unicode 联盟在 The Unicode Standard 4.0 的 第 3.9 节 发布了 UTF-8 的正式定义。
请访问 Wikipedia,其中提供了很好的 关于 UTF-8 的文章。
请阅读 W3C Character Model for the World Wide Web 1.0: Fundamentals。
IETF Policy on Character Sets and Languages 是作为 RFC 2277 和 BCP 18 发布的。
在 developerWorks XML 专区 可以找到更多 XML 参考资料。
了解如何才能成为一名 IBM 认证的 XML 及相关技术的开发人员。
回页首
关于作者
Elliotte Harold 出生在新奥尔良,现在,他还定期回老家喝一碗美味的秋葵汤。不过目前他与妻子 Beth 定居在纽约临近布鲁克林的 Prospect Heights,与他们住在一起的还有猫咪 Charm(取自夸克)和 Marjorie(按照他岳母的名字)。他是 Polytechnic 大学计算机科学的副教授,讲授 Java 技术和面向对象编程。他的 Cafe au Lait 网站是 Internet 上最受欢迎的独立 Java 站点之一,姊妹站点 Cafe con Leche 是最受欢迎的 XML 站点之一。他的著作包括 Effective XML、Processing XML with Java、Java Network Programming 和 The XML 1.1 Bible。他目前在研究处理 XML 的 XOM API、Jaxen XPath 引擎和 Jester 测试覆盖工具。
回页首
对本文的评价
太差! (1) 需提高 (2) 一般;尚可 (3) 好文章 (4) 真棒!(5)
建议?
回页首
关于 IBM 隐私条约 联系 IBM
改變學習日記的字符集總結,查詢utf數據庫?
版权声明:本文章为学习日记网站(http://www.learndiary.com )版权所有,以<a href="http://creativecommons.org/licenses/by/2.0/">Creative Commons License</a>方式授权。欢迎转载,但请注明文章原始出处(http://www.learndiary.com/disDiaryContentAction.do?goalID=1242 )。
1、想在学习日记中(http://www.learndiary.com)贴繁体字的文章,结果是乱码;
2、先改为GBK,可是不知道为什么,用GBK写到数据库中和页面上的字符都自动加了转义符了(\),如:(")变成了 (\"),还有,原来,文本里的回车换行都被加上了转义,于是,在网页上连换行都不行了,如:(\r\n)自动变成了(\\r\\n)。到现在,我也不知道这是什么原因,先放在这里,等以后再学习;
3、看了jive3论坛,发现程序使用的字符集与mysql使用的默认字符集好像是无关的(究竟有没有关,还须进一步学习:),学习日记虚拟主机空间默认使用的是gb2312;于是,试着在数据库连接字符串用utf-8的characterEncoding=UTF-8;结果成功可以使用;
4、原来数据库中的数据是gb2312编码的,必须转成utf-8。我用了一个笨办法,先把数据中的数据导出成sql文件,把sql文件全部用ultraedit(旧版本的不行,我下了一个最新的 11烈火版)转成utf-8格式;
5、但是把转换后的sql文件重新导入数据库中出错,不知道为什么,偶然发现在用ultraedit转成的sql文件中的两个字段间缺了一个单引号',前一个字段后有一个?号,像:本该是这样的('学习','日记'),变成了('学?,'日记'),我想这是转码过程中出现的问题,问题是怎么一回事?现在还不清楚,以后学习;
6、用ultraedit查找替换掉错误的地方,导入成功;
7、导入后的数据有的被截掉了尾巴,原来是在utf-8编码中,一个汉字是3个字节,一个英文字符是1个字节,于是,原来的数据库字段长就不合适了;
8、修改字段长度,然后把sql文件像上面那样转码、修改、导入。
9、完成,可以用繁体字写日记了。
10、缺陷:无法在数据库中直接用中文关键字执行查询了,也不能直接看到数据库中的内容了,不知道怎么解决这个问题?以后再学习。
字符集编码问题有关转帖(共3篇)如有违权
来自:http://dev2dev.bea.com.cn/bbs/thread.jspa?forumID=121&threadID=10601&messageID=161934
论坛首页 ? 技术专区 ? Web Application Development
主题: 网站的字符集选择GB2312好还是GBK好?两者有什么区别?
回复: 37 页数: 3 最后提交: Oct 17, 2005 3:28:53 PM
欢迎, 客人
访客设置
转到 [根类别][版务] ? 论坛工作室[产品专区] ? Tuxedo ? BEA WebLogic Server ? BEA WebLogic Portal ? BEA WebLogic Integration ? BEA Workshop ? BEA General[技术专区] ? Web Application Development ? EJB Development ? JDBC & Transaction ? Design Pattern ? Develop Tools ? J2ME Development[BEA活动] ? 北京 User Group ? 上海 User Group ? 青岛 User Group ? 杭州 User Group ? 天津 User Group ? 广州User Group[小憩一会] ? 程序人生 ? 历史的天空[只读栏目] ? WebLogic开发
发新帖
回复此主题
搜索论坛
返回到 主题 列表
回复: 37 页数: 3 [ << | 1 2 3 ]
phoenixatsh [普通用户]
发帖数: 356
活跃积分: 348
技术积分: 10
可用币值: 288
注册时间: 2005-6-11
用户状态:正常
Re: 网站的字符集选择GB2312好还是GBK好?两者有什么区别?
提交时间: Oct 16, 2005 3:30:23 PM 回复 发消息
GB2312是GBK的子集
--------------------------------------------------------------------------------
blog: http://javaniao.blogdriver.com/
yexichang [普通用户]
发帖数: 494
活跃积分: 403
技术积分: 0
可用币值: 123
注册时间: 2005-1-31
用户状态:正常
Re: 网站的字符集选择GB2312好还是GBK好?两者有什么区别?
提交时间: Oct 16, 2005 10:00:03 PM 回复 发消息
GB2312是GBK的子集,不过既然有了UTF8还是用这个好,对自己也没有什么影响,还方便以后国际化
--------------------------------------------------------------------------------
kingyz [普通用户]
发帖数: 51
活跃积分: 47
技术积分: 0
可用币值: 32
注册时间: 2004-4-21
用户状态:正常
Re: 网站的字符集选择GB2312好还是GBK好?两者有什么区别?
提交时间: Oct 17, 2005 9:34:45 AM 回复 发消息
gb2312属于GBK
--------------------------------------------------------------------------------
focus2004 [普通用户]
发帖数: 106
活跃积分: 86
技术积分: 1
可用币值: 86
注册时间: 2004-8-9
用户状态:正常
Re: 网站的字符集选择GB2312好还是GBK好?两者有什么区别?
提交时间: Oct 17, 2005 9:35:34 AM 回复 发消息
这不是哪个好哪个不好的问题,看你的需要哦,我常用的是GBK
--------------------------------------------------------------------------------
I love Java!
keithhe [普通用户]
发帖数: 568
活跃积分: 499
技术积分: 5
可用币值: 324
注册时间: 2004-4-5
用户状态:正常
Re: 网站的字符集选择GB2312好还是GBK好?两者有什么区别?
提交时间: Oct 17, 2005 9:43:47 AM 回复 发消息
尽量全部采用UTF-8
--------------------------------------------------------------------------------
胡思乱想,就怕你不敢想
xuefengl [普通用户]
发帖数: 1,009
活跃积分: 962
技术积分: 31
可用币值: 317
注册时间: 2004-2-29
用户状态:正常
Re: 网站的字符集选择GB2312好还是GBK好?两者有什么区别?
提交时间: Oct 17, 2005 10:13:11 AM 回复 发消息
为了避免所有乱码问题,应该全部采用UTF-8,包括Java源文件/JSP/HTML...
将来要支持国际化也非常方便
--------------------------------------------------------------------------------
// see:
http://blog.csdn.net/asklxf/
http://www.j2medev.com/
http://www.crackj2ee.com/
zhzg605 [普通用户]
发帖数: 1,041
活跃积分: 971
技术积分: 24
可用币值: 306
注册时间: 2004-11-24
用户状态:正常
Re: 网站的字符集选择GB2312好还是GBK好?两者有什么区别?
提交时间: Oct 17, 2005 10:31:32 AM 回复 发消息
建议不要用gbk2312 用gbk 因为有些数据库服务器,或者unix服务的一些
生僻汉字用gbk2312 无法显示。
--------------------------------------------------------------------------------
shgodttj [普通用户]
发帖数: 234
活跃积分: 200
技术积分: 0
可用币值: 0
注册时间: 2005-3-7
用户状态:正常
Re: 网站的字符集选择GB2312好还是GBK好?两者有什么区别?
提交时间: Oct 17, 2005 3:28:53 PM 回复 发消息
应该全部采用UTF-8
--------------------------------------------------------------------------------
http://www.gody.cn
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
来自:http://www.mambo.cn/smf/index.php/topic,582.new.html
中曼中心简练机器论坛
utf-8技术讨论 (utf-8 Tech)
服务器设置 (版主: dylon)
对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解 0 会员 以及 2 访客 正在阅读本篇主题. ? 上一篇主题 下一篇主题 ?
页: [1]
作者 主题: 对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解 (阅读 1720 次)
zhous
管理员(Admin)
曼波五段
离线
文章: 590
对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解
? 于: 七月 02, 2005, 11:22:02 am ?
--------------------------------------------------------------------------------
来源:Donews
Unicode:
unicode.org制定的编码机制, 要将全世界常用文字都函括进去.
在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应一个字符; 在2.0开始抛弃了16位限制, 原来的16位作为基本位平面, 另外增加了16个位平面, 相当于20位编码, 编码范围0到0x10FFFF.
UCS:
ISO制定的ISO10646标准所定义的 Universal Character Set, 采用4byte编码.
Unicode与UCS的关系:
ISO与unicode.org是两个不同的组织, 因此最初制定了不同的标准; 但自从unicode2.0开始, unicode采用了与ISO 10646-1相同的字库和字码, ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值, 使得两者保持一致.
UCS的编码方式:
UCS-2, 与unicode的2byte编码基本一样.
UCS-4, 4byte编码, 目前是在UCS-2前加上2个全零的byte.
UTF: Unicode/UCS Transformation Format
UTF-8, 8bit编码, ASCII不作变换, 其他字符做变长编码, 每个字符1-3 byte. 通常作为外码. 有以下优点:
* 与CPU字节顺序无关, 可以在不同平台之间交流
* 容错能力高, 任何一个字节损坏后, 最多只会导致一个编码码位损失, 不会链锁错误(如GB码错一个字节就会整行乱码)
UTF-16, 16bit编码, 是变长码, 大致相当于20位编码, 值在0到0x10FFFF之间, 基本上就是unicode编码的实现. 它是变长码, 与CPU字序有关, 但因为最省空间, 常作为网络传输的外码.
UTF-16是unicode的preferred encoding.
UTF-32, 仅使用了unicode范围(0到0x10FFFF)的32位编码, 相当于UCS-4的子集.
UTF与unicode的关系:
Unicode是一个字符集, 可以看作为内码.
而UTF是一种编码方式, 它的出现是因为unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码, 没有变换, 但它包含了0x00在编码内, 头256字节码的第一个byte都是0x00, 在操作系统(C语言)中有特殊意义, 会引起问题. 采用UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来一些优点.
中国国标编码:
GB 13000: 完全等同于ISO 10646-1/Unicode 2.1, 今后也将随ISO 10646/Unicode的标准更改而同步更改.
GBK: 对GB2312的扩充, 以容纳GB2312字符集范围以外的Unicode 2.1的统一汉字部分, 并且增加了部分unicode中没有的字符.
GB 18030-2000: 基于GB 13000, 作为Unicode 3.0的GBK扩展版本, 覆盖了所有unicode编码, 地位等同于UTF-8, UTF-16, 是一种unicode编码形式. 变长编码, 用单字节/双字节/4字节对字符编码. GB18030向下兼容GB2312/GBK.
GB 18030是中国所有非手持/嵌入式计算机系统的强制实施标准.
已记录
天下本无事,庸人自扰之??好象有点道理
Autoit
曼波三段
离线
文章: 154
Hi,Mambo, I'm Autoit.
Re: 对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解
? 回复文章 #1 于: 七月 02, 2005, 11:45:36 am ?
--------------------------------------------------------------------------------
收藏!!!
已记录
http://xiaowei.cn 小薇精品婚纱
http://www.123yls.com 伊莉莎数码婚纱
http://www.lishabeila.com 伊莎贝尔时尚婚纱
...会聚 厦门精品婚纱 ...
zijie
曼波学员
离线
文章: 8
Re: 对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解
? 回复文章 #2 于: 十月 13, 2005, 01:07:09 am ?
--------------------------------------------------------------------------------
好文章
已记录
页: [1]
××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
来自:http://www.hongen.com/pc/newer/ime/problem/problem3.htm
当前位置:洪恩在线 -> 电脑乐园 -> 输入法
常见问题解答
一.什么是BIG5码?
二.什么是GBK?
三.添加和删除输入法
四.设置输入法的属性
五.给输入法定义快捷键
六.调整输入法的次序
七.大字符集汉字的输入
谈谈您的看法
已有 0 条发言
常见问题解答
常见问题解答
六、 调整输入法的次序
输入法在状态栏有一个图标,点击输入法图标就可以选择输入法。但排第一的图标可以用“Ctrl+Space”热键启动,因此可以将自己常用的输入法排列到前面。
一个简单的方法,就是先将最常用的输入法删除,再重新安装该输入法,最常用的输入法就安装在前面了。
第二种方法是通过修改注册表来调整输入法的顺序、增加或删除输入法,甚至可做到Windows 95/98启动后的缺省输入法为汉字而不是英文。 通过对注册表的分析,可以发现在HKEY_LOCAL_MACHINE\SYSTEM\ CurrentControlSet\Control\keyboard layout\下存放着各输入法对应的主键,见下表所示:
在HKEY_USERS\.DEFAULT\keyboard layout\preload\下则是系统所安装的输入法的主键及键值,其主键为自然数,键值为上表中各输入法对应的主键。例如系统已安装了“智能ABC”、“全拼”和五笔输入法,则可看到如下的主键和键值:
主键 键值
1 00000409 2 E0040804 3 E0010804 4 E0220804
下面我们来改变输入法的顺序:
假设要将输入法顺序变为“英文”、“五笔”、“全拼”和“智能ABC”,可将主键和键值更改如下:
主键 键值
1 00000409 2 E0220804 3 E0010804 4 E0040804
这时再重新启动计算机,输入法顺序就改过来了。
七、 大字符集汉字的输入
大字符集汉字是一种汉字扩展内码规范(GBK)中定义的汉字。使用这个汉字集有利于与港澳台交流,Win95中有五种输入法可以输入GBK汉字。但到了Win98,为了精简系统、优化性能,将GB和GBK两个汉字集的输入法进行了合并。除了区位码和智能ABC外,其他预装的输入法都有GB和GBK两种输入方式,它们在安装时,缺省是GB输入方式,如果要输入一些难检字,如“?、?”,可以切换到GBK输入方式下。
切换方法为:单击任务栏右侧的输入法图标,选择“全拼输入法”,此时全拼输入法启动了。
在输入法的状态条上单击鼠标右键,选择“设置”命令。
在弹出的对话框中,可以看到“检索字符集”一栏,选中“GBK”项,单击“确定”,设置完毕。
这时再键入“rong”,就能查到“?”字了。
你可能会问,为什么Windows 98中全拼输入法的缺省设置为“GB2312”呢?原来考虑到GBK大字符集汉字的数量较多,如果只设置为“GBK”大字符集,那么使用全拼输入法会有大量的重码,严重影响输入速度,故而设置了一个GB码与GBK大字符集输入状态的切换开关。这样在一般情况下只输入GB码的汉字,在需要时再打开GBK大字符集的输入开关,以输入GBK大字符集的汉字。
为什么一些人用的是五笔输入法,却还保留着“全拼输入法”呢?对了,就是为了方便输入一些冷僻字。
上一页 返回到主界面
谈谈您的看法 已有 0 条发言
jive3+mysql4的中文化
下面这段来自jive3的文档:(file:///H:/java/j2ee/jive_forums_ent_3_0_8/jive_forums_ent_3_0_8/documentation/database.html#mysql)
MySQL does not have proper Unicode support, which makes supporting postings in non-Western languages difficult. However, the MySQL JDBC driver has a workaround which can be enabled by adding <mysql><useUnicode>true</useUnicode></mysql> to the <database> section of your jive_config.xml file. When using this setting, you should also set the Jive character encoding to utf-8 in the admin tool.
因为在jive3的admin页面中可以设置字符集,所以没有必要在数据库连接字符串中再设置characterEncoding属性了。
<serverURL>
jdbc:mysql://localhost:3306/jive3
<!--?characterEncoding=UTF-8-->
</serverURL>
在采用utf-8编码后,数据库的数据均是utf-8编码,我们人工就不能在数据库中直接看数据内容了。在这种情况下,怎么在数据库中直接看到内容呢?还需要进一步的学习。
还有,学习日记目前只能使用gb2312,是否使用了utf-8编码后就可以支持其他类型的文本输入了?
????,在jive3中使用了utf-8??後,??可以支持繁?了。
jive学习资源
源码:http://www.codesky.net/down.asp?id=1740&loc=1&down=1
(网页简介:资源名称: 学习Jive源程序,可以更好的理解和应用设计模式 )
学习资料: http://www.javafan.net/softview.jsp?ID=198
(网页简介: Jive学习资料
更新日期: 2005-03-22 12:45:50
大 小: 2.17M
下载次数: 7296次
推荐星级:
教程格式: CHM 教程语言: 中文
【简介】
这份是由原自由动力软件联盟(FreedomWorks,目前已关站)整理的关于jive的学习资料,内容非常丰富,相信对研究jive的学习者会大有帮助。
同时,我们网站也会尽全力继续更新这份资料。
)
Jdon版Jive论坛:http://www.javafan.net/softview.jsp?ID=178
(网页简介: Jdon版Jive论坛
更新日期: 2005-01-23 15:46:00
大 小: 3.2M
下载次数: 6043次
推荐星级:
【简介】
Jdon版Jive论坛由大名鼎鼎的板桥里人等改编,在保留Jive优点的前提下作了简化,非常适合研究Jive源码。
源码内含Jbuilder工程文件,可以在Jbuilder7/8中打开编辑、调试、运行。
)
(转贴)Jsp+javascript打造二级级联下拉菜单
数据库需求分析:
class(一级栏目信息):classId(自动编号),className(栏目名称)
Nclass(二级栏目信息):NclassId(自动编号),NclassName(栏目名称),parentId(一级栏目id,与class表中的classId关联)
<%@ page contentType="text/html; charset=GB2312" language="java" errorPage="../error.jsp" %>
<%@ include file="../conn.jsp"%>
<%@ include file="../ds.jsp"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%request.setCharacterEncoding("gb2312"); %>
<HTML><HEAD>
<META http-equiv="Content-Type" content="text/html; charset=gb2312">
<TITLE>级联菜单</TITLE>
<LINK rel="stylesheet" type="text/css" href="style.css">
</HEAD>
<!--从数据库中得到二级栏目信息-->
<%String sql="select * from Nclass order by NclassId asc";
ResultSet rs=stmt.executeQuery(sql);
%>
<!--将二级栏目信息保存到数组subcat中-->
<script type="text/javascript">
var onecount;
onecount=0;
subcat = new Array();
<%
int count = 0;
while(rs.next()){
%>
subcat[<%=count%>] = new Array("<%=rs.getString("NclassName")%>","<%=rs.getString("NclassId")%>","<%=rs.getString("parentId")%>");
<%
count++;
}
rs.close();
%>
onecount=<%=count%>;
<!--决定select显示的函数-->
function changelocation(locationid)
{
document.myform.NclassId.length = 0;
var locationid=locationid;
var i;
for (i=0;i < onecount; i++)
{
if (subcat[i][2] == locationid)
{
document.myform.NclassId.options[document.myform.NclassId.length] = new Option(subcat[i][0], subcat[i][1]);
}
}
}
</script>
<FORM method="POST" name="myform" action="adminsave.jsp?action=add">
<TABLE>
<TR>
<TD>一级分类</TD>
<TD>
<SELECT name="classId" onChange="changelocation(document.myform.classId.options[document.myform.classId.selectedIndex].value)" size="1">
<OPTION selected value>==请选一级分类==</OPTION>
<sql:query var="query" dataSource="${bookdev}">
SELECT * FROM class
</sql:query>
<c:forEach var="row" items="${query.rows}">
<option value="${row.classId}">${row.className}</option>
</c:forEach>
</select>
</TD>
<TD>选择二级分类</TD>
<TD>
<SELECT name="NclassId">
<OPTION selected value>==请选二级分类==</OPTION>
</SELECT>
</TD>
</TR>
</TABLE>
</FORM>
</BODY>
</HTML>
posted on 2005-03-21 15:15 似水流年 阅读(915) 评论(5) 编辑 收藏 收藏至365Key 所属分类: JSP/Servlet
(转贴)JSP/Servlet: session 的使用(1、2)
From Gossip@caterpillar
JSP/Servlet: session (1)
session隱含物件在轉換為Servlet之後,對應於 javax.servlet.http.HttpSession型態之物件, HttpSession負責管理客戶端在瀏覽網站期間的進程(session)資訊,也就是每個操作流程間的狀態維護,您無需知道進程追蹤的細節,就可以讓使用者在數個頁面之間瀏覽而又能保留相關的進程資訊,例如在幾個頁面之間挑選商品並放入購物車,在最後進行結帳工作。
之前在 Cookie 中介紹過進程追蹤的三種作法,其適用與不適用的場合各不相同。您可以將何時使用何種技術這個工作交給session(HttpSession)物件來負責,相關的實作細節並不太需要您來注意(當然您願意的話,建議您還是瞭解一下會更好)。
舉個例來說,session(HttpSession)會預設使用Cookie來追蹤進程,如果不行(例如使用者關閉Cookie的使用),則您可以試著使用URL rewriting,或許伺服器會保留一些資訊在伺服器的記憶體或資料庫甚至檔案中,而只傳送session id給客戶端,之後瀏覽器在每個請求中包括這個id,以讓伺服器取出對應的資訊,具體的作法依各家容器的實作而不同。
總而言之,您可以使用session(HttpSession)來協助您作進程追蹤,而不用擔心資訊在伺服端是如何保留的,而session id又是如何產生的。
下面簡單的示範session的使用方式,實作一個簡單的登入網頁,您可以大致瞭解session的使用方式,首先您必須先製作一個簡單的HTML表單,它將用來輸入使用者名稱與密碼:
form.htm
<html> <head><title>登入頁面</title></head> <body> 輸入密碼登入:<br> <form action="login.jsp" method="POST"> 名稱:<input type="text" name="user"> <br> 密碼:<input type="password" name="password"> <br> <input type="submit" value="登入"> </form> </body> </html>
接下來撰寫登入驗證頁面login.jsp:
login.jsp
<%@page contentType="text.html;charset=Big5"%> <% String user = request.getParameter("user"); String password = request.getParameter("password"); String memberURL = "http://localhost:8080/myjsp/member.jsp"; String loginFormURL = "http://localhost:8080/myjsp/form.html"; if(user == null || password == null) { response.setHeader("Refresh", "0; " + loginFormURL); } else if(user.equals("justin") && password.equals("1234")) { session.setAttribute("user", user); response.setHeader("Refresh", "3; " + memberURL); out.println(user + "歡迎登入!3秒後進入會員頁面!"); } else { response.setHeader("Refresh", "3; " + loginFormURL); out.println( "使用者或密碼錯誤,請重新登入(3秒後回到登入表單)"); } %>
上面這個頁面在驗證使用者名稱與密碼無誤之後,使用setAttribute()方法,將使用者名稱存入session (HttpSession)物件中,setAttribute()可以存入任何的Java物件,在這邊存入的屬性名稱為"user",存入的物件為 String物件,內容為登入者的名稱,也就是"justin",然後將客戶端重導至會員頁面,如果驗證的結果不正確,就將客戶端重導至登入表單;接下來撰寫會員頁面member.jsp:
member.jsp
<%@page contentType="text.html;charset=Big5"%> <% String loginFormURL = "http://localhost:8080/myjsp/form.html"; String user = (String) session.getAttribute("user"); if(user == null) { response.setHeader("Refresh", "3; " + loginFormURL); out.println( "喔喔!您還沒登入!不能偷看喔!3秒後進入登入頁面"); } else { out.println("嗨!" + user + "!"); out.println("會員好康在這邊。。。。"); // 立即登出 session.invalidate(); } %>
getAttribute()可以指定屬性名稱取得存在session(HttpSession)中的物件,取回的型態是 Object,為了能夠使用,您必須將之轉換為相對應的型態,在這邊則是String型態,如果之前login.jsp中驗證通過的話,在這個 member.jsp中就可以取得儲存在session中的屬性物件,如果取回的是null,表示之前沒有設定過user屬性,也就是在 login.jsp中沒有通過驗證,我們必須將之送回登入頁面以重新進行登入;invalidate()可以讓目前的session物件失效,我們在 member.jsp中執行這個方法,以實作登出的功能(其實也是為了測試的方便而讓使用者立即登出)。
上面這個例子中,完全沒有牽涉到進程追蹤的實作細節(cookie或是URL rewriting等),一切都是交由session物件來負責,而由於session可以儲存物件資訊,使得進程追蹤所關聯的資訊更為豐富,但卻不用增加您實作進程追蹤的困難,不過上面這個例子是在瀏覽器的Cookie功能有打開的情況下才能正常運作,如果Cookie沒有開啟,則我們需要作一些額外的動作,這在下一個主題中討論。
要注意的是,session並不是執行緒安全的,由於session會在客戶端對話期間存在,所以當有多個執行緒會存取session時,必須注意到執行緒安全問題。
From Gossip@caterpillar
JSP/Servlet: session (2)
session(HttpSession)物件會在使用者第一次存取Web伺服器時產生,伺服器會產生一個獨特的 session id來表示這個客戶端,瀏覽器在之後的每次請求中都包括這個session id(可能是使用Cookie或是URL rewriting,這個細節不用您來擔心),伺服器根據這個session id來對應該客戶端的session物件,您可以使用getId()方法來取得session id,例如:
<%
out.println("Session ID:" + session.getId());
%>
顯示的session id型式如下:
Session ID:2F892EDF2669858811B8D121119AE90B
session id預設是使用Cookie來儲存於客戶端,並在每一次瀏覽器發送請求時夾帶這個訊息給伺服器,伺服器根據session id來對應出HttpSession物件,假如Cookie沒有開啟,則瀏覽器將無法儲存session id,也就無法將session id的訊息傳送給伺服器,也就無法進行進程追蹤,即使資料物件確實儲存於HttpSession中,您也無法取出,下面這個程式在瀏覽器Cookie功能關閉的情況下,只會一直顯示session not found, reset!訊息:
sessionDemo.jsp
<%@page contentType="text/html;charset=Big5"%> <html> <head><title>session demo</title></head> <body> <H1> <% if(session.getAttribute("info") == null) { session.setAttribute("info", "session information"); out.println("session not found, reset!"); } else { out.println("session found: " + session.getAttribute("info")); } %> </H1> </body> </html>
如果Cookie功能關閉,則session id無法儲存,也就無法在下一次請求時一併送至伺服器,為了讓進程追蹤得以進行,您必須使用URL rewriting來傳送session id,所幸的是有一個簡單的方法可以幫您進行這個動作,使用response的encodeURL()可以自動將session id編進URL中,例如:
sessionDemo.jsp
<%@page contentType="text/html;charset=Big5"%> <html> <head><title>session demo</title></head> <body> <H1> <% if(session.getAttribute("info") == null) { session.setAttribute("info", "session information"); out.println("session not found, reset!"); } else { out.println("session found: " + session.getAttribute("info")); } out.println("<br><a href='" + response.encodeURL("sessionDemo.jsp") + "'>" + "進程追蹤" + "</a>"); %> </H1> </body> </html>
如果您的瀏覽器Cookie功能關閉,您必須使用response的encodeURL()自動將session id編進URL中,如果Cookie功能可以運作,則encodeURL()會原封不動的傳回指定的URL,否則會在指定的URL後加上sessiond id,例如上面的JSP網頁在Cookie功能關閉的情況下,會傳回以下的內容:
<html>
<head><title>session demo</title></head>
<body>
<H1>
session not found, reset!
<br><a href='sessiondemo.jsp;jsessionid=
7A2A0BFA32D0022D8BB80A5E690A9D10'>進程追蹤</a>
</H1>
</body>
</html>
簡單的說,按下經過URL rewriting的連結,瀏覽器就可以將session id傳送至伺服器,然而您的網址列上就會出現session id的訊息:
http://localhost:8080/myjsp/sessionDemo.jsp;jsessionid=7A2A0BFA32D0022D8BB80A5E690A9D10
這是一個有危險性的訊息,任何人只要在session的存活期限獲得這個訊息,就可以進行進程追蹤,所以基本上還是建議使用者開啟Cookie功能,以免 session id曝露在網址列上。
在上一個主題中的登入網頁如果在Cookie功能關閉的情況下也將無法運作,您必須這樣改寫login.jsp:
login.jsp
<%@page contentType="text.html;charset=Big5"%> <% String user = request.getParameter("user"); String password = request.getParameter("password"); String memberURL = "http://localhost:8080/myjsp/member.jsp"; String loginFormURL = "http://localhost:8080/myjsp/form.html"; if(user == null || password == null) { response.setHeader("Refresh", "0; " + loginFormURL); } else if(user.equals("justin") && password.equals("1234")) { session.setAttribute("user", user); memberURL = response.encodeURL(memberURL); response.setHeader("Refresh", "3; " + memberURL); out.println(user + "歡迎登入!3秒後進入會員頁面!"); } else { response.setHeader("Refresh", "3; " + loginFormURL); out.println( "使用者或密碼錯誤,請重新登入(3秒後回到登入表單)"); } %>
或者是您可以直接使用response的sendRedirect()方法,由於sendRedirect()要求完整的位址訊息,也就是包括http: //開始的位址訊息,您可以使用response的encodeRedirectURL()傳回這個位址,同樣的,如果 Cookie有開啟,則只是原封不動傳回原來指定的URL,您也可以改寫login.jsp程式如下:
login.jsp
<%@page contentType="text.html;charset=Big5"%> <% String user = request.getParameter("user"); String password = request.getParameter("password"); String memberURL = "http://localhost:8080/myjsp/member.jsp"; String loginFormURL = "http://localhost:8080/myjsp/form.html"; if(user == null || password == null) { response.setHeader("Refresh", "0; " + loginFormURL); } else if(user.equals("justin") && password.equals("1234")) { session.setAttribute("user", user); memberURL = response.encodeRedirectURL(memberURL); response.sendRedirect(memberURL); } else { response.setHeader("Refresh", "3; " + loginFormURL); out.println( "使用者或密碼錯誤,請重新登入(3秒後回到登入表單)"); } %>
session具有其存活期限,關閉瀏覽器、伺服器關閉可能讓session失效,當客戶端停止活動一段時間(Tomcat預設是30分鐘), session會自動失效,您可以使用getMaxInactiveInterval()取得session的等待期限,取得的值以秒為單位,或是以 setMaxInactiveInterval()設定等待期限,設定的值也是以秒為單位:
<%
out.println("default session life: " +
session.getMaxInactiveInterval());
session.setMaxInactiveInterval(600);
out.println("now session life: " +
session.getMaxInactiveInterval());
%>
您可以在web.xml中設定預設的session等待期限,使用<session-config>與<session- timeout>來進行設定,注意設定的單位為分鐘數,例如下面的設定將session等待期限預設為10分鐘:
web.xml
... <session-config> <session-timeout> 10 <!--分鐘--> </session-timeout> </session-config> ...