﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-微蓝领域</title><link>http://www.blogjava.net/hilor/</link><description>我的学习档案馆</description><language>zh-cn</language><lastBuildDate>Sun, 03 May 2026 11:43:49 GMT</lastBuildDate><pubDate>Sun, 03 May 2026 11:43:49 GMT</pubDate><ttl>60</ttl><item><title>深入剖析JSP和Servlet对中文的处理过程</title><link>http://www.blogjava.net/hilor/articles/233539.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Fri, 10 Oct 2008 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/233539.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/233539.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/233539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/233539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/233539.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 概述&nbsp;世界上的各地区都有本地的语言。地区差异直接导致了语言环境的差异。在开发一个国际化程序的过程中，处理语言问题就显得很重要了。这是一个世界范围内都存在的问题，所以，Java提供了世界性的解决方法。本文描述的方法是用于处理中文的，但是，推而广之，对于处理世界上其它国家和地区的语言同样适用。汉字是双字节的。所谓双字节是指一个双字要占用两个BYTE的位置（即16位），分别称为...&nbsp;&nbsp;<a href='http://www.blogjava.net/hilor/articles/233539.html'>阅读全文</a><img src ="http://www.blogjava.net/hilor/aggbug/233539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-10-10 11:19 <a href="http://www.blogjava.net/hilor/articles/233539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LINUX  apache2.2X与TOMCAT5.5X整合</title><link>http://www.blogjava.net/hilor/archive/2008/09/08/227777.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Mon, 08 Sep 2008 09:27:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/archive/2008/09/08/227777.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/227777.html</wfw:comment><comments>http://www.blogjava.net/hilor/archive/2008/09/08/227777.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/227777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/227777.html</trackback:ping><description><![CDATA[<p><span style="font-size: 18px;">编译,安装</span></p>
<p><span style="color: #ff0000;">(多次编译或重新编译, 请执行make clean, make mrproper)</span></p>
<p>./configure --prefix=/usr/local/apache --enable-mods-shared=all --enable-so <span style="color: #ff0000;">--with-mpm=worker <font color="#000000">--with-included-apr</font></span>&nbsp;--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr </p>
<p>&nbsp;</p>
<p><font style="font-size: 12px;">./configure --prefix=/usr/local/apache2.2 --enable-mods-shared=all \<br />
--enable-so <span style="color: #ff0000;">--with-mpm=worker</span> --enable-deflate \<br />
--enable-cache --enable-disk-cache --enable-mem-cache --enable-file-cache \<br />
--enable-proxy --enable-suexec --with-included-apr&nbsp;--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr </font></p>
<p>make<br />
make install<br />
make mrproper</p>
<p><span style="color: #ff0000;">或者连续执行 make &amp;&amp; make install &amp;&amp; make mrproper</span></p>
<p><span style="font-size: 18px;">配置</span></p>
<p><span style="font-size: 18px;">cd /usr/local/apache/conf&nbsp; (下面的LINUX命令都是以conf为当前目录)</span></p>
<p><span style="font-size: 14px; color: #ff00ff;">(1.)httpd.conf</span></p>
<p>修改如下几项</p>
<p>DocumentRoot <span style="color: #ff0000;"><font size="+0">/home/test</font></span></p>
<p><font style="background-color: #ff4d4d;">并在末尾增加如下字段:</font></p>
<p>#LoadModule jk_module modules/mod_jk.so<br />
<span style="color: #ff0000;">Include /usr/local/apache/conf/Includes/*.conf</span></p>
<p><span style="color: #ff0000;">#转发规则 START</span></p>
<p>SetOutputFilter DEFLATE<br />
AddOutputFilterByType DEFLATE text/html<br />
BrowserMatch ^Mozilla/4 gzip-only-text/html<br />
BrowserMatch ^Mozilla/4\.0[678] no-gzip<br />
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html<br />
# Don't compress images<br />
SetEnvIfNoCase Request_URI \<br />
\.(?:gif|jpe?g|png)$ no-gzip dont-vary<br />
SetEnvIfNoCase Request_URI \<br />
\.(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary<br />
SetEnvIfNoCase Request_URI \<br />
\.pdf$ no-gzip dont-vary<br />
SetEnvIfNoCase Request_URI \<br />
\.(css|js)$ no-gzip dont-vary<br />
SetEnvIfNoCase Request_URI \<br />
\.(mp3|amr|mid|MP3)$ no-gzip dont-vary<br />
# 确保代理不会发送错误的内容<br />
Header append Vary User-Agent env=!dont-vary</p>
<p><span style="color: #ff0000;">#转发规则 END</span></p>
<p><br />
<span style="font-size: 14px; color: #ff00ff;">(2)配置 MOD_JK</span></p>
<p><span style="font-size: 14px; color: #ff00ff;">复制<span style="color: #ff0000;">mod_jk.so</span>到modules/下</span></p>
<p><span style="color: #22dd22;">1.配置mod_jk.conf</span></p>
<p>vi Includes/mod_jk.conf</p>
<p>增加如下内容:</p>
<p><br />
LoadModule jk_module modules/mod_jk.so<br />
#mod_jk&nbsp; workers.properties<br />
JkWorkersFile <span style="color: #ff0000;">/usr/local/apache2/conf/workers.properties</span></p>
<p># Where to put jk logs<br />
JkLogFile <span style="color: #ff0000;">/usr/local/apache2/logs/mod_jk.log</span></p>
<p># Set the jk log level [debug/error/info]<br />
JkLogLevel info</p>
<p># Select the log format<br />
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"</p>
<p># JkOptions indicate to send SSL KEY SIZE, <br />
JkOptions&nbsp; +ForwardKeySize +ForwardURICompat -ForwardDirectories</p>
<p># JkRequestLogFormat set the request format <br />
JkRequestLogFormat "%w %V %T"</p>
<p># ...servlet .jsp....ajp13.....Tomcat..Tomcat...<br />
JkMount /*.jsp loadbalancer <br />
JkMount /*.do loadbalancer <br />
JkMount /servlet/* loadbalancer <br />
JkMount /jsp-examples/* loadbalancer</p>
<p><span style="color: #6be61a;">2.配置workers.properties(一般只需改动对应HOST)</span></p>
<p>vi workers.properties</p>
<p>ps=/ </p>
<p># list the workers by name <br />
worker.list=tomcat1, loadbalancer <br />
# ------------------------ <br />
# First tomcat server <br />
# ------------------------ </p>
<p>worker.tomcat1.port=8009 <br />
worker.tomcat1.host=<span style="color: #ff0000;">123.108.208.17</span><br />
worker.tomcat1.type=ajp13 <br />
# Specify the size of the open connection cache. <br />
#worker.tomcat1.cachesize <br />
# <br />
# Specifies the load balance factor when used with <br />
# a load balancing worker. <br />
# Note: <br />
# ----&gt; lbfactor must be &gt; 0 <br />
# ----&gt; Low lbfactor means less work done by the worker. <br />
worker.tomcat1.lbfactor=100 </p>
<p>&nbsp;</p>
<p># ------------------------ <br />
# Load Balancer worker <br />
# ------------------------ <br />
# The loadbalancer (type lb) worker performs weighted round-robin <br />
# load balancing with sticky sessions. <br />
# Note: <br />
# ----&gt; If a worker dies, the load balancer will check its state <br />
# once in a while. Until then all work is redirected to peer <br />
# worker. <br />
worker.loadbalancer.type=lb <br />
worker.loadbalancer.balanced_workers=tomcat1<br />
# <br />
# END workers.properties <br />
# </p>
<p><span style="color: #2bd54d;">3.配置对应虚拟主机</span></p>
<p>vi Includes/examples.com.conf</p>
<p>NameVirtualHost *:80</p>
<p>&lt;VirtualHost *:80&gt;<br />
&nbsp;&nbsp;&nbsp; ServerAdmin <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#101;&#98;&#109;&#97;&#115;&#116;&#101;&#114;&#64;&#100;&#117;&#109;&#109;&#121;&#45;&#104;&#111;&#115;&#116;&#46;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;">webmaster@dummy-host.example.com</a><br />
&nbsp;&nbsp;&nbsp; DocumentRoot <span style="color: #ff0000;">/home/test</span><br />
&nbsp;&nbsp;&nbsp; ServerName <a href="http://www.prlweb.com/"><span style="color: #ff0000;">www.test.com</span></a><br />
&nbsp;&nbsp;&nbsp; ServerAlias <a href="http://www.prlweb.com/"><span style="color: #ff0000;">www.test.com</span></a><br />
&nbsp;&nbsp;&nbsp; ErrorLog logs/www.test.com-error_log<br />
&nbsp;&nbsp;&nbsp; CustomLog logs/www.test.com-access_log common<br />
&nbsp;&lt;Directory <span style="color: #ff0000;">"/home/test"&gt;</span><br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; Options Indexes FollowSymLinks<br />
&nbsp;&nbsp;&nbsp;&nbsp; AllowOverride None<br />
&nbsp;&nbsp;&nbsp;&nbsp; Order allow,deny<br />
&nbsp;&nbsp;&nbsp;&nbsp; Allow from all</p>
<p>&nbsp;&lt;/Directory&gt;<br />
&lt;/VirtualHost&gt;<br />
</p>
<p>4.配置静态页面压缩输出模块deflate</p>
<p>这个扩展模块在安装apache的时候已经动态的编译到apache里去了。现在进行配置。<br />
# cd /usr/local/apache2.2/conf/Includes<br />
上面添加的是apache扩展配置文件的目录<br />
# vi mod_deflate.conf<br />
在配置文件里添加如下语句<br />
<br />
5. 配置mod_cache模块<br />
# cd /usr/local/apache2.2/conf/Includes<br />
# vi mod_cache.conf<br />
在配置文件里添加如下语句<br />
<br />
<br />
<ifmodule mod_cache. c=""><br />
#LoadModule disk_cache_module modules/mod_disk_cache.so<br />
<ifmodule mod_disk_cache. c=""><br />
CacheRoot /<br />
CacheSize 256<br />
CacheEnable disk /<br />
CacheDirLevels 5<br />
CacheDirLength 3<br />
</ifmodule><br />
<br />
LoadModule mem_cache_module modules/mod_mem_cache.so<br />
<ifmodule mod_mem_cache. c=""><br />
CacheEnable mem /<br />
MCacheSize 4096<br />
MCacheMaxObjectCount 100<br />
MCacheMinObjectSize 1<br />
MCacheMaxObjectSize 2048</ifmodule></ifmodule></p>
<p><span style="font-size: 18px;">测试&amp;启动</span></p>
<p>./bin/apachectl -t 测试配置有无语法错误<br />
./bin/apachectl start 启动APACHE服务<br />
./bin/apachectl stop&nbsp; 停止APACHE服务</p>
<img src ="http://www.blogjava.net/hilor/aggbug/227777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-09-08 17:27 <a href="http://www.blogjava.net/hilor/archive/2008/09/08/227777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>表单验证 正则表达式实例 Email验证 电话号码验证 中文汉字验证</title><link>http://www.blogjava.net/hilor/articles/224017.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Sun, 24 Aug 2008 15:17:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/224017.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/224017.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/224017.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/224017.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/224017.html</trackback:ping><description><![CDATA[正则表达式用于字符串处理、表单验证等场合，实用高效。<br />
现将一些常用的表达式收集于此，以备不时之需。<br />
<br />
匹配中文字符的正则表达式：&nbsp;[\u4e00-\u9fa5]<br />
评注：匹配中文还真是个头疼的事，有了这个表达式就好办了<br />
<br />
匹配双字节字符(包括汉字在内)：[^\x00-\xff]<br />
评注：可以用来计算字符串的长度（一个双字节字符长度计2，ASCII字符计1）<br />
<br />
匹配空白行的正则表达式：\n\s*\r<br />
评注：可以用来删除空白行<br />
<br />
匹配HTML标记的正则表达式：&lt;(\S*?)[^&gt;]*&gt;.*?&lt;/\1&gt;|&lt;.*?&nbsp;/&gt;<br />
评注：网上流传的版本太糟糕，上面这个也仅仅能匹配部分，对于复杂的嵌套标记依旧无能为力<br />
<br />
匹配首尾空白字符的正则表达式：^\s*|\s*$<br />
评注：可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等)，非常有用的表达式<br />
<br />
匹配Email地址的正则表达式：\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*<br />
评注：表单验证时很实用<br />
<br />
匹配网址URL的正则表达式：[a-zA-z]+://[^\s]*<br />
评注：网上流传的版本功能很有限，上面这个基本可以满足需求<br />
<br />
匹配帐号是否合法(字母开头，允许5-16字节，允许字母数字下划线)：^[a-zA-Z][a-zA-Z0-9_]{4,15}$<br />
评注：表单验证时很实用<br />
<br />
匹配国内电话号码：\d{3}-\d{8}|\d{4}-\d{7}<br />
评注：匹配形式如&nbsp;0511-4405222&nbsp;或&nbsp;021-87888822<br />
<br />
匹配腾讯QQ号：[1-9][0-9]{4,}<br />
评注：腾讯QQ号从10000开始<br />
<br />
匹配中国邮政编码：[1-9]\d{5}(?!\d)<br />
评注：中国邮政编码为6位数字<br />
<br />
匹配身份证：\d{15}|\d{18}<br />
评注：中国的身份证为15位或18位<br />
<br />
匹配ip地址：\d+\.\d+\.\d+\.\d+<br />
评注：提取ip地址时有用<br />
<br />
匹配特定数字：<br />
^[1-9]\d*$　&nbsp;　&nbsp;//匹配正整数<br />
^-[1-9]\d*$&nbsp;　&nbsp;//匹配负整数<br />
^-?[1-9]\d*$　　&nbsp;//匹配整数<br />
^[1-9]\d*|0$　&nbsp;//匹配非负整数（正整数&nbsp;+&nbsp;0）<br />
^-[1-9]\d*|0$　　&nbsp;//匹配非正整数（负整数&nbsp;+&nbsp;0）<br />
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$　　&nbsp;//匹配正浮点数<br />
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$　&nbsp;//匹配负浮点数<br />
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$　&nbsp;//匹配浮点数<br />
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$　　&nbsp;//匹配非负浮点数（正浮点数&nbsp;+&nbsp;0）<br />
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$　　//匹配非正浮点数（负浮点数&nbsp;+&nbsp;0）<br />
评注：处理大量数据时有用，具体应用时注意修正<br />
<br />
匹配特定字符串：<br />
^[A-Za-z]+$　　//匹配由26个英文字母组成的字符串<br />
^[A-Z]+$　　//匹配由26个英文字母的大写组成的字符串<br />
^[a-z]+$　　//匹配由26个英文字母的小写组成的字符串<br />
^[A-Za-z0-9]+$　　//匹配由数字和26个英文字母组成的字符串<br />
^\w+$　　//匹配由数字、26个英文字母或者下划线组成的字符串<br />
评注：最基本也是最常用的一些表达式<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
&lt;script language=javascript&gt;<br />
function phonecheck(s){ <br />
var str=s;<br />
var reg=/(^[0-9]{3,4}\-[0-9]{7,8}$)|(^[0-9]{7,8}$)|(^\([0-9]{3,4}\)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/; <br />
//alert(reg.test(str));<br />
if (reg.test(str)==false)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; alert("请检查您输入的电话号码。");<br />
&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; }<br />
else<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; alert("输入的电话号码通过验证。");<br />
&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
&lt;/script&gt;<br />
&lt;form id="form1" name="form1" method="post" action="?" onSubmit="return phonecheck(document.all.iphone.value)"&gt;<br />
&nbsp; &lt;label&gt;<br />
&nbsp; &lt;input name="iphone" type="text" id="telephone" /&gt;<br />
&nbsp; &lt;/label&gt;<br />
&nbsp; &lt;label&gt;<br />
&nbsp; &lt;input type="submit" name="Submit" value="提交" /&gt;<br />
&nbsp; &lt;/label&gt;<br />
&nbsp; &lt;/form&gt;<br />
<img src ="http://www.blogjava.net/hilor/aggbug/224017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-08-24 23:17 <a href="http://www.blogjava.net/hilor/articles/224017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jquery radio,checkbox,select取值</title><link>http://www.blogjava.net/hilor/articles/221183.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Sun, 10 Aug 2008 15:54:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/221183.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/221183.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/221183.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/221183.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/221183.html</trackback:ping><description><![CDATA[<p>获取一组radio被选中项的值<br />
var item = $('input[@name=items][@checked]').val();<br />
获取select被选中项的文本<br />
var item = $("select[@name=items] option[@selected]").text();<br />
select下拉框的第二个元素为当前选中值<br />
$('#select_id')[0].selectedIndex = 1;<br />
radio单选组的第二个元素为当前选中值<br />
$('input[@name=items]').get(1).checked = true;</p>
<p>获取值：</p>
<p>文本框，文本区域：$("#txt").attr("value")；<br />
多选框checkbox：$("#checkbox_id").attr("value")；<br />
单选组radio：&nbsp;&nbsp; $("input[@type=radio][@checked]").val();<br />
下拉框select： $('#sel').val();</p>
<p>控制表单元素：<br />
文本框，文本区域：$("#txt").attr("value",'');//清空内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $("#txt").attr("value",'11');//填充内容</p>
<p>多选框checkbox： $("#chk1").attr("checked",'');//不打勾<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $("#chk2").attr("checked",true);//打勾<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if($("#chk1").attr('checked')==undefined) //判断是否已经打勾</p>
<p>单选组radio：&nbsp;&nbsp;&nbsp; $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项<br />
下拉框select：&nbsp;&nbsp; $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $("&lt;option value='1'&gt;1111&lt;/option&gt;&lt;option value='2'&gt;2222&lt;/option&gt;").appendTo("#sel")//添加下拉框的option<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $("#sel").empty()；//清空下拉框</p>
<img src ="http://www.blogjava.net/hilor/aggbug/221183.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-08-10 23:54 <a href="http://www.blogjava.net/hilor/articles/221183.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图片的无缝滚动</title><link>http://www.blogjava.net/hilor/articles/220147.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Tue, 05 Aug 2008 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/220147.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/220147.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/220147.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/220147.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/220147.html</trackback:ping><description><![CDATA[一则很不错的图片滚动代码：<br />
<br />
向右滚动：
<div class="code">&nbsp;&lt;div id=demo style=overflow:hidden;height:35;width:200;background:#214984;color:#ffffff&gt;<br />
&nbsp;&lt;table align=left cellpadding=0 cellspace=0 border=0&gt;&lt;tr&gt;&lt;td id=demo1 valign=top&gt;<br />
&nbsp;&lt;img src="http://www.songzi.org/blog/styles/default/sz_blog.gif"&gt;<br />
&nbsp;&lt;img src="http://www.songzi.org/forum/images/powered.gif"&gt;<br />
&nbsp;&lt;img src="http://iedoo.net/logo/mylogo.gif"&gt;&lt;/td&gt;<br />
&lt;td id=demo2 valign=top&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;<br />
&nbsp;&lt;script&gt;<br />
&nbsp;var speed=30<br />
&nbsp;demo2.innerHTML=demo1.innerHTML<br />
&nbsp;demo.scrollLeft=demo.scrollWidth<br />
&nbsp;function Marquee(){<br />
&nbsp;if(demo.scrollLeft&lt;=0)<br />
&nbsp;demo.scrollLeft+=demo2.offsetWidth<br />
&nbsp;else{<br />
&nbsp;demo.scrollLeft--<br />
&nbsp;}<br />
&nbsp;}<br />
&nbsp;var MyMar=setInterval(Marquee,speed)<br />
&nbsp;demo.onmouseover=function() {clearInterval(MyMar)}<br />
&nbsp;demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}<br />
&nbsp;&lt;/script&gt;</div>
<br />
向左滚动：
<div class="code">&nbsp;&lt;div id=demo style=overflow:hidden;height:35;width:200;background:#214984;color:#ffffff&gt;<br />
&nbsp;&lt;table align=left cellpadding=0 cellspace=0 border=0&gt;&lt;tr&gt;&lt;td id=demo1 valign=top&gt;<br />
&nbsp;&lt;img src="http://www.songzi.org/blog/styles/default/sz_blog.gif"&gt;<br />
&nbsp;&lt;img src="http://www.songzi.org/forum/images/powered.gif"&gt;<br />
&nbsp;&lt;img src="http://iedoo.net/logo/mylogo.gif"&gt;&lt;/td&gt;<br />
&lt;td id=demo2 valign=top&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;<br />
&nbsp;
&lt;script&gt;
<br />
var speed=30
<br />
demo2.innerHTML=demo1.innerHTML
<br />
function Marquee(){
<br />
if(demo2.offsetWidth-demo.scrollLeft&lt;=0)
<br />
demo.scrollLeft-=demo1.offsetWidth
<br />
else{
<br />
demo.scrollLeft++
<br />
}
<br />
}
<br />
var MyMar=setInterval(Marquee,speed)
<br />
demo.onmouseover=function() {clearInterval(MyMar)}
<br />
demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}
<br />
&lt;/script&gt;
</div>
<br />
向上滚动：
<div class="code">&nbsp;&lt;div id=demo style=overflow:hidden;height:100;width:90;background:#214984;color:#ffffff&gt;<br />
&nbsp;&lt;div id=demo1&gt;<br />
&nbsp;&lt;img src="http://www.songzi.org/forum/images/powered.gif"&gt;<br />
&nbsp;&lt;img src="http://www.songzi.org/blog/styles/default/sz_blog.gif"&gt;<br />
&nbsp;&lt;img src="http://iedoo.net/logo/mylogo.gif"&gt;<br />
&nbsp;&lt;/div&gt;<br />
&nbsp;&lt;div id=demo2&gt;&lt;/div&gt;<br />
&nbsp;&lt;/div&gt;<br />
&lt;script&gt;<br />
&nbsp;var speed=30<br />
&nbsp;demo2.innerHTML=demo1.innerHTML <br />
&nbsp;function Marquee(){<br />
&nbsp;if(demo2.offsetTop-demo.scrollTop&lt;=0) <br />
&nbsp;demo.scrollTop-=demo1.offsetHeight <br />
&nbsp;else{<br />
&nbsp;demo.scrollTop++<br />
&nbsp;}<br />
&nbsp;}<br />
&nbsp;var MyMar=setInterval(Marquee,speed) <br />
&nbsp;demo.onmouseover=function() {clearInterval(MyMar)}<br />
&nbsp;demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}<br />
&nbsp;&lt;/script&gt;</div>
<br />
向下滚动：
<div class="code">&lt;div id=demo style=overflow:hidden;height:100;width:90;background:#214984;color:#ffffff&gt;<br />
&nbsp;&lt;div id=demo1&gt;<br />
&nbsp;&lt;img src="http://www.songzi.org/forum/images/powered.gif"&gt;<br />
&nbsp;&lt;img src="http://www.songzi.org/blog/styles/default/sz_blog.gif"&gt;<br />
&nbsp;&lt;img src="http://iedoo.net/logo/mylogo.gif"&gt;<br />
&nbsp;&lt;/div&gt;<br />
&nbsp;&lt;div id=demo2&gt;&lt;/div&gt;<br />
&nbsp;&lt;/div&gt;<br />
&nbsp;&lt;script&gt;<br />
&nbsp;var speed=30<br />
&nbsp;demo2.innerHTML=demo1.innerHTML<br />
&nbsp;demo.scrollTop=demo.scrollHeight<br />
&nbsp;function Marquee(){<br />
&nbsp;if(demo1.offsetTop-demo.scrollTop&gt;=0)<br />
&nbsp;demo.scrollTop+=demo2.offsetHeight<br />
&nbsp;else{<br />
&nbsp;demo.scrollTop--<br />
&nbsp;}<br />
&nbsp;}<br />
&nbsp;var MyMar=setInterval(Marquee,speed)<br />
&nbsp;demo.onmouseover=function() {clearInterval(MyMar)}<br />
&nbsp;demo.onmouseout=function() {MyMar=setInterval(Marquee,speed)}<br />
&nbsp;&lt;/script&gt;</div>
<!-- Search Google Start -->
<script type="text/javascript"><!-- google_ad_client="pub-8274546448383187" ; google_ad_width="468;
google_ad_height" = 60; google_ad_format="468x60_as" ; google_ad_type="text_image" ; google_ad_channel="" ; google_color_border="FFFFFF" ; google_color_bg="FFFFFF" ; google_color_link="000000" ; google_color_text="000000" ; google_color_url="E1771E" ;
//-->
</script>
<script style="display: none;" type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- google ADLink-->
<script type="text/javascript"><!-- google_ad_client="pub-8274546448383187" ; google_ad_width="468;
google_ad_height" = 15; google_ad_format="468x15_0ads_al" ; google_ad_channel="" ; google_color_border="FFFFFF" ; google_color_bg="FFFFFF" ; google_color_link="CC0000" ; google_color_text="000000" ; google_color_url="008000" ;
//-->
</script>
<script style="display: none;" type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- google ADLink-->
<!-- firfox -->
<img src ="http://www.blogjava.net/hilor/aggbug/220147.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-08-05 14:03 <a href="http://www.blogjava.net/hilor/articles/220147.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 结合 C3P0配置</title><link>http://www.blogjava.net/hilor/articles/196735.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Mon, 28 Apr 2008 05:20:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/196735.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/196735.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/196735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/196735.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/196735.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: applicationContext.xml 文件：&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans"&nbsp;&nbsp;&nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSche...&nbsp;&nbsp;<a href='http://www.blogjava.net/hilor/articles/196735.html'>阅读全文</a><img src ="http://www.blogjava.net/hilor/aggbug/196735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-04-28 13:20 <a href="http://www.blogjava.net/hilor/articles/196735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于OpenSessionInView</title><link>http://www.blogjava.net/hilor/articles/189348.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Fri, 28 Mar 2008 12:38:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/189348.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/189348.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/189348.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/189348.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/189348.html</trackback:ping><description><![CDATA[附http://www.javaeye.com/topic/14631<br />
OpenSessionInViewFilter讨论<br />
Hibernate的Lazy初始化1:n关系时，你必须保证是在同一个Session内部使用这个关系集合，不然Hiernate将抛出例外。
<p class="paragraph">另外，你不愿意你的DAO测试代码每次都打开关系Session，因此，我们一般会采用OpenSessionInView模式。
</p>
<h3 class="heading-1"><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="0"></a><strong style="color: black; background-color: #ffff66;">OpenSessionInViewFilter</strong>解决Web应用程序的问题
</h3>
如果程序是在正常的Web程序中运行，那么Spring的<strong style="color: black; background-color: #ffff66;">OpenSessionInViewFilter</strong>能够解决问题，它：
<div class="code">
<pre><span class="java-keyword">protected</span> void doFilterInternal(HttpServletRequest request, <br />
HttpServletResponse response,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     FilterChain filterChain) <span class="java-keyword">throws</span> ServletException, IOException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SessionFactory sessionFactory = lookupSessionFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(<span class="java-quote">"Opening Hibernate Session in <strong style="color: black; background-color: #ffff66;">OpenSessionInViewFilter</strong>"</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session session = getSession(sessionFactory);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TransactionSynchronizationManager.bindResource(sessionFactory, <br />
<span class="java-keyword">new</span> SessionHolder(session));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">try</span> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterChain.doFilter(request, response);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">finally</span> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TransactionSynchronizationManager.unbindResource(sessionFactory);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(<span class="java-quote">"Closing Hibernate Session in <strong style="color: black; background-color: #ffff66;">OpenSessionInViewFilter</strong>"</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closeSession(session, sessionFactory);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</pre>
</div>
可以看到，这个Filter在request开始之前，把sessionFactory绑定到TransactionSynchronizationManager，和这个SessionHolder相关。这个意味着所有request执行过程中将使用这个session。而在请求结束后，将和这个sessionFactory对应的session解绑，并且关闭Session。
<p class="paragraph">为什么绑定以后，就可以防止每次不会新开一个Session呢？看看HibernateDaoSupport的情况： </p>
<div class="code">
<pre><span class="java-keyword">public</span> <span class="java-keyword">final</span> void setSessionFactory(SessionFactory sessionFactory) {<br />
<span class="java-keyword">this</span>.hibernateTemplate = <span class="java-keyword">new</span> HibernateTemplate(sessionFactory);<br />
}<br />
<span class="java-keyword">protected</span> <span class="java-keyword">final</span> HibernateTemplate getHibernateTemplate() {<br />
<span class="java-keyword">return</span> hibernateTemplate;<br />
}</pre>
</div>
<p class="paragraph">我们的DAO将使用这个template进行操作： </p>
<div class="code">
<pre><span class="java-keyword">public</span> <span class="java-keyword">abstract</span> class BaseHibernateObjectDao<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">extends</span> HibernateDaoSupport<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">implements</span> BaseObjectDao {<br />
<p class="paragraph"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">protected</span> BaseEntityObject getByClassId(<span class="java-keyword">final</span> <span class="java-object">long</span> id) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BaseEntityObject obj =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(BaseEntityObject) getHibernateTemplate()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.execute(<span class="java-keyword">new</span> HibernateCallback() {<br />
</p>
<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">public</span> <span class="java-object">Object</span> doInHibernate(Session session)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">throws</span> HibernateException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">return</span> session.get(getPersistentClass(), <br />
<span class="java-keyword">new</span> <span class="java-object">Long</span>(id));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</p>
<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">return</span> obj;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</p>
<br />
<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">public</span> void save(BaseEntityObject entity) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getHibernateTemplate().saveOrUpdate(entity);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</p>
<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">public</span> void remove(BaseEntityObject entity) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">try</span> {<br />
</p>
<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getHibernateTemplate().delete(entity);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <span class="java-keyword">catch</span> (Exception e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">throw</span> <span class="java-keyword">new</span> FlexEnterpriseDataAccessException(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</p>
<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">public</span> void refresh(<span class="java-keyword">final</span> BaseEntityObject entity) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getHibernateTemplate().execute(<span class="java-keyword">new</span> HibernateCallback() {<br />
</p>
<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">public</span> <span class="java-object">Object</span> doInHibernate(Session session)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">throws</span> HibernateException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.refresh(entity);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">return</span> <span class="java-keyword">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</p>
<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">public</span> void replicate(<span class="java-keyword">final</span> <span class="java-object">Object</span> entity) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getHibernateTemplate().execute(<span class="java-keyword">new</span> HibernateCallback() {<br />
</p>
<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">public</span> <span class="java-object">Object</span> doInHibernate(Session session)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">throws</span> HibernateException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.replicate(entity, <br />
ReplicationMode.OVERWRITE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">return</span> <span class="java-keyword">null</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</p>
<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
</pre>
</div>
而HibernateTemplate试图每次在execute之前去获得Session，执行完就力争关闭Session
<div class="code">
<pre><span class="java-keyword">public</span> <span class="java-object">Object</span> execute(HibernateCallback action) <span class="java-keyword">throws</span> DataAccessException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session session = (!<span class="java-keyword">this</span>.allowCreate ?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SessionFactoryUtils.getSession(getSessionFactory(), <br />
<span class="java-keyword">false</span>) :<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SessionFactoryUtils.getSession(getSessionFactory(),<br />
getEntityInterceptor(),<br />
getJdbcExceptionTranslator()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-object">boolean</span> existingTransaction =  <br />
TransactionSynchronizationManager.hasResource(getSessionFactory());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">if</span> (!existingTransaction &amp;&amp; getFlushMode() == FLUSH_NEVER) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setFlushMode(FlushMode.NEVER);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">try</span> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-object">Object</span> result = action.doInHibernate(session);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flushIfNecessary(session, existingTransaction);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">return</span> result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">catch</span> (HibernateException ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">throw</span> convertHibernateAccessException(ex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">catch</span> (SQLException ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">throw</span> convertJdbcAccessException(ex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">catch</span> (RuntimeException ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// callback code threw application exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">throw</span> ex;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">finally</span> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SessionFactoryUtils.closeSessionIfNecessary(<br />
session, getSessionFactory());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</pre>
</div>
而这个SessionFactoryUtils能否得到当前的session以及closeSessionIfNecessary是否真正关闭session，端取决于这个session是否用sessionHolder和这个sessionFactory在我们最开始提到的TransactionSynchronizationManager绑定。
<div class="code">
<pre><span class="java-keyword">public</span> <span class="java-keyword">static</span> void closeSessionIfNecessary(Session session, <br />
SessionFactory sessionFactory)   <br />
<span class="java-keyword">throws</span> CleanupFailureDataAccessException {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">if</span> (session == <span class="java-keyword">null</span> || <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   TransactionSynchronizationManager.hasResource(sessionFactory)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">return</span>;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(<span class="java-quote">"Closing Hibernate session"</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">try</span> {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">catch</span> (JDBCException ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// SQLException underneath<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">throw</span> <span class="java-keyword">new</span> CleanupFailureDataAccessException(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-quote">"Cannot close Hibernate session"</span>, ex.getSQLException());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">catch</span> (HibernateException ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-keyword">throw</span> <span class="java-keyword">new</span> CleanupFailureDataAccessException(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="java-quote">"Cannot close Hibernate session"</span>, ex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</pre>
</div>
<h3 class="heading-1">HibernateInterceptor和OpenSessionInViewInterceptor的问题 </h3>
<p class="paragraph">使用同样的方法，这两个Interceptor可以用来解决问题。但是关键的不同之处在于，它们的力度只能定义在DAO或业务方法上，而不是在我们的Test方法上，除非我们把它们应用到TestCase的方法上，但你不大可能为TestCase去定义一个接口，然后把Interceptor应用到这个接口的某些方法上。直接使用HibernateTransactionManager也是一样的。因此，如果我们有这样的测试：
</p>
<div class="code">
<pre>Category parentCategory  = <span class="java-keyword">new</span> Category ();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentCategory.setName(<span class="java-quote">"parent"</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dao.save(parentCategory);<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Category childCategory  = <span class="java-keyword">new</span> Category();<br />
childCategory.setName(<span class="java-quote">"child"</span>);<br />
</p>
<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parentCategory.addChild(childCategory);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dao.save(childCategory);</p>
<br />
<p class="paragraph">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Category savedParent = dao.getCategory(<span class="java-quote">"parent"</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Category savedChild = (Category ) savedParent.getChildren().get(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assertEquals(savedChild, childCategory);<br />
</p>
</pre>
</div>
将意味着两件事情：
<ul class="minus">
    <li>每次DAO执行都会启动一个session和关闭一个session
    </li>
    <li>如果我们定义了一个lazy的关系，那么最后的Category savedChild = (Category )
    savedParent.getChildren().get(0);将会让hibernate报错。 </li>
</ul>
<h3 class="heading-1">解决方案 </h3>
<p class="paragraph">一种方法是对TestCase应用Interceptor或者TransactionManager，但这个恐怕会造成很多麻烦。除非是使用增强方式的AOP.我前期采用这种方法(Aspectwerkz)，在Eclipse里面也跑得含好。
</p>
<p class="paragraph">另一种方法是在TestCase的setup和teardown里面实现和Filter完全一样的处理，其他的TestCase都从这个TestCase继承，这种方法是我目前所使用的。
</p>
<img src ="http://www.blogjava.net/hilor/aggbug/189348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-03-28 20:38 <a href="http://www.blogjava.net/hilor/articles/189348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA中获取系统路径</title><link>http://www.blogjava.net/hilor/articles/189347.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Fri, 28 Mar 2008 12:36:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/189347.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/189347.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/189347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/189347.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/189347.html</trackback:ping><description><![CDATA[<span id="ArticleContent1_ArticleContent1_lblContent"><span class="postbody"><font size="2">在Application中:
<br />
System.getProperty("user.dir")
<br />
<br />
在Servlet中:
<br />
ServletContext servletContext = config.getServletContext();
<br />
String rootPath = servletContext.getRealPath("/");
<br />
<br />
在jsp中:
<br />
application.getRealPath("") </font></span></span>
<img src ="http://www.blogjava.net/hilor/aggbug/189347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-03-28 20:36 <a href="http://www.blogjava.net/hilor/articles/189347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>open session in view 的使用</title><link>http://www.blogjava.net/hilor/articles/189346.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Fri, 28 Mar 2008 12:29:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/189346.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/189346.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/189346.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/189346.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/189346.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">在没有使用</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">Spring</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">提供的</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">Open Session In View</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">情况下，因需要在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">service(or Dao)</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">层里把</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">session</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">关闭，所以</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">lazy loading </span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">为</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">true</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">的话，要在应用层内把关系集合都初始化，如</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;"> company.getEmployees()</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">，否则</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">Hibernate</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">抛</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">session already closed Exception;</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">&nbsp;&nbsp;&nbsp; Open Session In View</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">提供了一种简便的方法，较好地解决了</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">lazy loading</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">问题</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">.</span>
<p><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;"><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">&nbsp;&nbsp;&nbsp; </span>它有两种配置方式<font face="Verdana">OpenSessionInViewInterceptor</font></span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">和<span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">OpenSessionInViewFilter(具体参看<a title="SpringSide" target="_blank" href="http://www.springside.org.cn/"><strong><font color="#78a515">SpringSide</font></strong></a>)</span></span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">，功能相同，只是一个在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">web.xml</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">配置，另一个在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">application.xml</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">配置而已。</span></p>
<p><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">&nbsp;&nbsp;&nbsp; Open Session In View</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">request</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">把</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">session</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">绑定到当前</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">thread</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">期间一直保持</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">hibernate session</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">open</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">状态，使</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">session</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">request</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">的整个期间都可以使用，如在</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">View</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">层里</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">PO</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">也可以</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">lazy loading</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">数据，如</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;"> ${ company.employees }</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">。当</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">View </span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">层逻辑完成后，才会通过</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">Filter</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">的</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">doFilter</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">方法或</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">Interceptor</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">的</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">postHandle</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">方法自动关闭</span><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">session</span><span style="font-size: 10pt; color: #4b4b4b; font-family: 宋体;">。</span></p>
<br />
<span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;"><span style="font-size: 10pt; color: #4b4b4b; font-family: Verdana;">
<div class="head">
<pre class="java">
<div class="head">OpenSessionInViewInterceptor配置</div>
<ol>
    <li class="li1">
    <div class="de1">&lt;beans&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">  &lt;bean name=<span class="st0"><font color="#0000ff">"openSessionInViewInterceptor"</font></span> </div>
    </li>
    <li class="li1">
    <div class="de1"><span class="kw2"><strong><font color="#7f0055">class</font></strong></span>=<span class="st0"><font color="#0000ff">"org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"</font></span>&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;property name=<span class="st0"><font color="#0000ff">"sessionFactory"</font></span>&gt;</div>
    </li>
    <li class="li1">
    <div class="de1">      &lt;ref bean=<span class="st0"><font color="#0000ff">"sessionFactory"</font></span>/&gt;</div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;/property&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">  &lt;/bean&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">  &lt;bean id=<span class="st0"><font color="#0000ff">"urlMapping"</font></span> </div>
    </li>
    <li class="li1">
    <div class="de1"><span class="kw2"><strong><font color="#7f0055">class</font></strong></span>=<span class="st0"><font color="#0000ff">"org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"</font></span>&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;property name=<span class="st0"><font color="#0000ff">"interceptors"</font></span>&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">      &lt;list&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">        &lt;ref bean=<span class="st0"><font color="#0000ff">"openSessionInViewInterceptor"</font></span>/&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">      &lt;/list&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;/property&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;property name=<span class="st0"><font color="#0000ff">"mappings"</font></span>&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">    ... </div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;/property&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">  &lt;/bean&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">... </div>
    </li>
    <li class="li1">
    <div class="de1">&lt;/beans&gt; </div>
    </li>
</ol>
</pre>
</div>
<div class="head">
<pre class="java">
<div class="head">OpenSessionInViewFilter配置</div>
<ol>
    <li class="li1">
    <div class="de1">&lt;web-app&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">... </div>
    </li>
    <li class="li1">
    <div class="de1">  &lt;filter&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;filter-class&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">      org.<span class="me1">springframework</span>.<span class="me1">orm</span>.<span class="me1">hibernate3</span>.<span class="me1">support</span>.<span class="me1">OpenSessionInViewFilter</span> </div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;/filter-class&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;!-- singleSession默认为true,若设为false则等于没用<span class="me1">OpenSessionInView --&gt;</span></div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;init-param&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">      &lt;param-name&gt;singleSession&lt;/param-name&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">      &lt;param-value&gt;true&lt;/param-value&gt;</div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;/init-param&gt;</div>
    </li>
    <li class="li1">
    <div class="de1">  &lt;/filter&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">... </div>
    </li>
    <li class="li1">
    <div class="de1">  &lt;filter-mapping&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;filter-name&gt;hibernateFilter&lt;/filter-name&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">    &lt;url-pattern&gt;*.<span class="me1">do</span>&lt;/url-pattern&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">  &lt;/filter-mapping&gt; </div>
    </li>
    <li class="li1">
    <div class="de1">... </div>
    </li>
    <li class="li1">
    <div class="de1">&lt;/web-app&gt; </div>
    </li>
</ol>
</pre>
<p>很多人在使用OpenSessionInView过程中提及一个错误：</p>
<pre class="java">
<ol>
    <li class="li1">
    <div class="de1">org.<span class="me1">springframework</span>.<span class="me1">dao</span>.<span class="me1">InvalidDataAccessApiUsageException</span>: Write operations </div>
    </li>
    <li class="li1">
    <div class="de1">are not allowed in read-only mode <span class="br0"><font color="#663300">(</font></span>FlushMode.<span class="me1">NEVER</span><span class="br0"><font color="#663300">)</font></span> - turn your Session into </div>
    </li>
    <li class="li1">
    <div class="de1">FlushMode.<span class="me1">AUTO</span> or remove <span class="st0"><font color="#0000ff">'readOnly'</font></span> marker from transaction definition </div>
    </li>
</ol>
</pre>
<p>看看OpenSessionInViewFilter里的几个方法</p>
<pre class="java">
<ol>
    <li class="li1">
    <div class="de1"><span class="kw2"><strong><font color="#7f0055">protected</font></strong></span> <span class="kw4"><font color="#f63333">void</font></span> doFilterInternal<span class="br0"><font color="#663300">(</font></span>HttpServletRequest request, <br />
    HttpServletResponse response,FilterChain filterChain<span class="br0"><font color="#663300">)</font></span> <br />
    <span class="kw2"><strong><font color="#7f0055">throws</font></strong></span> ServletException, <span class="kw3"><font color="#ff0000">IOException</font></span> <span class="br0"><font color="#663300">{<br />
    </font></span>　SessionFactory sessionFactory = lookupSessionFactory<font color="#663300"><span class="br0">(</span><span class="br0">)</span></font>;<br />
    logger.<span class="me1">debug</span><span class="br0"><font color="#663300">(</font></span><span class="st0"><font color="#0000ff">"Opening Hibernate Session in OpenSessionInViewFilter"</font></span><span class="br0"><font color="#663300">)</font></span>;<br />
    Session session = getSession<span class="br0"><font color="#663300">(</font></span>sessionFactory<span class="br0"><font color="#663300">)</font></span>;<br />
    TransactionSynchronizationManager.<span class="me1">bindResource</span><span class="br0"><font color="#663300">(<br />
    </font></span>　　sessionFactory, <span class="kw2"><strong><font color="#7f0055">new</font></strong></span> SessionHolder<span class="br0"><font color="#663300">(</font></span>session<font color="#663300"><span class="br0">)</span><span class="br0">)</span></font>;<br />
    <span class="kw2"><strong><font color="#7f0055">try</font></strong></span> <span class="br0"><font color="#663300">{<br />
    </font></span>　　filterChain.<span class="me1">doFilter</span><span class="br0"><font color="#663300">(</font></span>request, response<span class="br0"><font color="#663300">)</font></span>;<br />
    <span class="br0"><font color="#663300">}<br />
    </font></span><span class="kw2"><strong><font color="#7f0055">　finally</font></strong></span> <span class="br0"><font color="#663300">{<br />
    </font></span>　TransactionSynchronizationManager.<span class="me1">unbindResource</span><span class="br0"><font color="#663300">(</font></span>sessionFactory<span class="br0"><font color="#663300">)</font></span>;<br />
    logger.<span class="me1">debug</span><span class="br0"><font color="#663300">(</font></span><span class="st0"><font color="#0000ff">"Closing Hibernate Session in OpenSessionInViewFilter"</font></span><span class="br0"><font color="#663300">)</font></span>;<br />
    closeSession<span class="br0"><font color="#663300">(</font></span>session, sessionFactory<span class="br0"><font color="#663300">)</font></span>;<br />
    <font color="#663300"><span class="br0">}<br />
    </span><span class="br0">}</span></font><span class="br0"><br />
    <br />
    <br />
    <br />
    <br />
    </span>&nbsp;</div>
    </li>
    <li class="li1">
    <div class="de1"><span class="kw2"><strong><font color="#7f0055">protected</font></strong></span> Session getSession<span class="br0"><font color="#663300">(</font></span>SessionFactory sessionFactory<span class="br0"><font color="#663300">)<br />
    </font></span><span class="kw2"><strong><font color="#7f0055">throws</font></strong></span> DataAccessResourceFailureException <span class="br0"><font color="#663300">{<br />
    </font></span>　Session session = SessionFactoryUtils.<span class="me1">getSession</span><span class="br0"><font color="#663300">(</font></span>sessionFactory, <span class="kw2"><strong><font color="#7f0055">true</font></strong></span><span class="br0"><font color="#663300">)</font></span>;<br />
    session.<span class="me1">setFlushMode</span><span class="br0"><font color="#663300">(</font></span>FlushMode.<span class="me1">NEVER</span><span class="br0"><font color="#663300">)</font></span>;<br />
    <span class="kw2"><strong><font color="#7f0055">return</font></strong></span> session;<br />
    <span class="br0"><font color="#663300">}</font></span></div>
    </li>
    <li class="li1"><span class="kw2"><br />
    <strong><font color="#7f0055">protected</font></strong></span> <span class="kw4"><font color="#f63333">void</font></span> closeSession<span class="br0"><font color="#663300">(</font></span>Session session, SessionFactory sessionFactory<span class="br0"><font color="#663300">)<br />
    </font></span><span class="kw2"><strong><font color="#7f0055">throws</font></strong></span> CleanupFailureDataAccessException <span class="br0"><font color="#663300">{<br />
    </font></span>　SessionFactoryUtils.<span class="me1">closeSessionIfNecessary</span><span class="br0"><font color="#663300">(</font></span>session, sessionFactory<span class="br0"><font color="#663300">)</font></span>;<br />
    <span class="br0"><font color="#663300">}</font></span> </li>
</ol>
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp;
可以看到OpenSessionInViewFilter在getSession的时候,会把获取回来的session的flush mode
设为FlushMode.NEVER。然后把该sessionFactory绑定到
TransactionSynchronizationManager，使request的整个过程都使用同一个session，在请求过后再接除该
sessionFactory的绑定，最后<span class="me1">closeSessionIfNecessary</span>根据该
session是否已和transaction绑定来决定是否关闭session。在这个过程中，若HibernateTemplate
发现自当前session有不是readOnly的transaction，就会获取到FlushMode.AUTO
Session，使方法拥有写权限。</p>
<pre class="java">
<ol>
    <li class="li1">
    <div class="de1"><span class="kw2"><strong><font color="#7f0055">public</font></strong></span> <span class="kw2"><strong><font color="#7f0055">static</font></strong></span> <span class="kw4"><font color="#f63333">void</font></span> closeSessionIfNecessary<span class="br0"><font color="#663300">(</font></span>Session session, SessionFactory sessionFactory<span class="br0"><font color="#663300">)</font></span></div>
    </li>
    <li class="li1">
    <div class="de1">      <span class="kw2"><strong><font color="#7f0055">throws</font></strong></span> CleanupFailureDataAccessException <span class="br0"><font color="#663300">{</font></span></div>
    </li>
    <li class="li1">
    <div class="de1">    <span class="kw1"><font color="#b1b100">if</font></span> <span class="br0"><font color="#663300">(</font></span>session == <span class="kw2"><strong><font color="#7f0055">null</font></strong></span> || <br />
    TransactionSynchronizationManager.<span class="me1">hasResource</span><span class="br0"><font color="#663300">(</font></span>sessionFactory<font color="#663300"><span class="br0">)</span><span class="br0">)</span></font> <span class="br0"><font color="#663300">{</font></span></div>
    </li>
    <li class="li1">
    <div class="de1">      <span class="kw2"><strong><font color="#7f0055">return</font></strong></span>;</div>
    </li>
    <li class="li1">
    <div class="de1">    <span class="br0"><font color="#663300">}</font></span></div>
    </li>
    <li class="li1">
    <div class="de1">    logger.<span class="me1">debug</span><span class="br0"><font color="#663300">(</font></span><span class="st0"><font color="#0000ff">"Closing Hibernate session"</font></span><span class="br0"><font color="#663300">)</font></span>;</div>
    </li>
    <li class="li1">
    <div class="de1">    <span class="kw2"><strong><font color="#7f0055">try</font></strong></span> <span class="br0"><font color="#663300">{</font></span></div>
    </li>
    <li class="li1">
    <div class="de1">      session.<span class="me1">close</span><font color="#663300"><span class="br0">(</span><span class="br0">)</span></font>;</div>
    </li>
    <li class="li1">
    <div class="de1">    <span class="br0"><font color="#663300">}</font></span></div>
    </li>
    <li class="li1">
    <div class="de1">    <span class="kw2"><strong><font color="#7f0055">catch</font></strong></span> <span class="br0"><font color="#663300">(</font></span>JDBCException ex<span class="br0"><font color="#663300">)</font></span> <span class="br0"><font color="#663300">{</font></span></div>
    </li>
    <li class="li1">
    <div class="de1">      <span class="co1"><font color="#3f5fbf">// SQLException underneath</font></span></div>
    </li>
    <li class="li1">
    <div class="de1">      <span class="kw2"><strong><font color="#7f0055">throw</font></strong></span> <span class="kw2"><strong><font color="#7f0055">new</font></strong></span> CleanupFailureDataAccessException<span class="br0"><font color="#663300">(</font></span><span class="st0"><font color="#0000ff">"Could not close Hibernate session"</font></span>, ex.<span class="me1">getSQLException</span><font color="#663300"><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></font>;</div>
    </li>
    <li class="li1">
    <div class="de1">    <span class="br0"><font color="#663300">}</font></span></div>
    </li>
    <li class="li1">
    <div class="de1">    <span class="kw2"><strong><font color="#7f0055">catch</font></strong></span> <span class="br0"><font color="#663300">(</font></span>HibernateException ex<span class="br0"><font color="#663300">)</font></span> <span class="br0"><font color="#663300">{</font></span></div>
    </li>
    <li class="li1">
    <div class="de1">      <span class="kw2"><strong><font color="#7f0055">throw</font></strong></span> <span class="kw2"><strong><font color="#7f0055">new</font></strong></span> CleanupFailureDataAccessException<span class="br0"><font color="#663300">(</font></span><span class="st0"><font color="#0000ff">"Could not close Hibernate session"</font></span>, ex<span class="br0"><font color="#663300">)</font></span>;</div>
    </li>
    <li class="li1">
    <div class="de1">    <span class="br0"><font color="#663300">}</font></span></div>
    </li>
    <li class="li1">
    <div class="de1">  <span class="br0"><font color="#663300">}</font></span> </div>
    </li>
</ol>
</pre>
<p>&nbsp;&nbsp;&nbsp;
也即是，如果有不是readOnly的transaction就可以由Flush.NEVER转为Flush.AUTO,拥有insert,
update,delete操作权限，如果没有transaction，并且没有另外人为地设flush
model的话，则doFilter的整个过程都是Flush.NEVER。所以受transaction保护的方法有写权限，没受保护的则没有。</p>
<pre class="xml">
<div class="head">采用spring的事务声明,使方法受transaction控制</div>
<ol>
    <li class="li1">
    <div class="de1"><span class="sc3"><span class="re1">&nbsp; &lt;bean id="baseTransaction" <br />
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; abstract="true"&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &lt;property name="transactionManager" ref="transactionManager"/&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &lt;property name="proxyTargetClass" value="true"/&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &lt;property name="transactionAttributes"&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;props&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;prop key="get*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;prop key="find*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;prop key="load*"&gt;PROPAGATION_REQUIRED,readOnly&lt;/prop&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;prop key="save*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;prop key="add*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;prop key="update*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;prop key="remove*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/props&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &lt;/property&gt; <br />
    &nbsp; &nbsp; &lt;/bean&gt; </span></span><span class="sc3"><span class="re1"><br />
    </span></span></div>
    </li>
    <li class="li1">&nbsp; &nbsp; &lt;bean id="userService" parent="baseTransaction"&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &lt;property name="target"&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;bean class="com.phopesoft.security.service.impl.UserServiceImpl"/&gt; <br />
    &nbsp; &nbsp; &nbsp; &nbsp; &lt;/property&gt; <br />
    &nbsp; &nbsp; &lt;/bean&gt; </li>
</ol>
</pre>
</div>
<ol>&nbsp;</ol>
    <p>对
    于上例，则以save,add,update,remove开头的方法拥有可写的事务，如果当前有某个方法，如命名为importExcel()，则因没
    有transaction而没有写权限，这时若方法内有insert,update,delete操作的话，则需要手动设置flush
    model为Flush.AUTO,如</p>
    <pre class="java">
    <ol>
        <li class="li1">
        <div class="de1"> session.<span class="me1">setFlushMode</span><span class="br0"><font color="#663300">(</font></span>FlushMode.<span class="me1">AUTO</span><span class="br0"><font color="#663300">)</font></span>; </div>
        </li>
        <li class="li1">
        <div class="de1"> session.<span class="me1">save</span><span class="br0"><font color="#663300">(</font></span>user<span class="br0"><font color="#663300">)</font></span>; </div>
        </li>
        <li class="li1">
        <div class="de1"> session.<span class="me1">flush</span><font color="#663300"><span class="br0">(</span><span class="br0">)</span></font>; </div>
        </li>
    </ol>
    </pre>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    尽管Open Session In
    View看起来还不错，其实副作用不少。看回上面OpenSessionInViewFilter的doFilterInternal方法代码，这个方法
    实际上是被父类的doFilter调用的，因此，我们可以大约了解的OpenSessionInViewFilter调用流程:
    request(请求)-&gt;open
    session并开始transaction-&gt;controller-&gt;View(Jsp)-&gt;结束transaction并
    close session.</p>
    <p>&nbsp;&nbsp;&nbsp;&nbsp;
    一切看起来很正确，尤其是在本地开发测试的时候没出现问题，但试想下如果流程中的某一步被阻塞的话，那在这期间connection就一直被占用而不释
    放。最有可能被阻塞的就是在写Jsp这步，一方面可能是页面内容大，response.write的时间长，另一方面可能是网速慢，服务器与用户间传输时
    间久。当大量这样的情况出现时，就有连接池连接不足，造成页面假死现象。</p>
    <p>Open Session In View是个双刃剑，放在公网上内容多流量大的网站请慎用。</p>
    </span></span>    &nbsp;<br />
    <br />
    <p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1441664</p>
<img src ="http://www.blogjava.net/hilor/aggbug/189346.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-03-28 20:29 <a href="http://www.blogjava.net/hilor/articles/189346.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> Java编码问题详解</title><link>http://www.blogjava.net/hilor/articles/180895.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Wed, 20 Feb 2008 08:32:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/180895.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/180895.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/180895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/180895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/180895.html</trackback:ping><description><![CDATA[<p>引用：<a href="http://blog.csdn.net/Mr_IT/archive/2006/10/18/1339656.aspx">http://blog.csdn.net/Mr_IT/archive/2006/10/18/1339656.aspx</a></p>
<p>&gt;汉字编码的相关说明<br />
&nbsp; 汉字是双字节的，要占用两个BYTE的位置（即16位），分别称为高位和低位。<br />
中国规定的汉字编码为GB2312，这是强制性的，目前几乎所有的能处理中文的应用程序都支持GB2312。GB2312包括了一二级汉字和9区符号，高位从0xa1到0xfe，低位也是从0xa1到0xfe，其中，汉字的编码范围为0xb0a1到0xf7fe。<br />
另外有一种编码，叫做GBK，但这是一份规范，不是强制的。GBK提供了20902个汉字，它兼容GB2312，编码范围为0x8140到0xfefe。GBK中的所有字符都可以一一映射到Unicode 2.0。<br />
中国还颁布了另一种标准：GB18030-2000（GBK2K）。它收录了藏、蒙等少数民族的字型，从根本上解决了字位不足的问题。注意：它不再是定长的。其二字节部份与GBK兼容，四字节部分是扩充的字符、字形。它的首字节和第三字节从0x81到0xfe，二字节和第四字节从0x30到0x39。</p>
<p>2&gt;不同语言直接的转换<br />
&nbsp; 异种语言之间的转换是通过Unicode来完成的。假设有两种不同的语言A和B，转换的步骤为：先把A转化为Unicode，再把Unicode转化为B。<br />
&nbsp; 举例说明。有GB2312中有一个汉字&#8220;李&#8221;，其编码为&#8220;C0EE&#8221;，欲转化为ISO8859-1编码。步骤为：先把&#8220;李&#8221;字转化为Unicode，得到 &#8220;674E&#8221;，再把&#8220;674E&#8221;转化为ISO8859-1字符。当然，这个映射不会成功，因为ISO8859-1中根本就没有与&#8220;674E&#8221;对应的字符。当映射不成功时，问题就发生了！当从某语言向Unicode转化时，如果在某语言中没有该字符，得到的将是Unicode的代码&#8220;\uffffd&#8221;（&#8220;\ u&#8221;表示是Unicode编码，）。而从Unicode向某语言转化时，如果某语言没有对应的字符，则得到的是&#8220;0x3f&#8221;（&#8220;?&#8221;）。这就是&#8220;?&#8221;的由来。例如：把字符流buf =&#8220;0x80 0x40 0xb0 0xa1&#8221;进行new String(buf, "gb2312")操作，得到的结果是&#8220;\ufffd\u554a&#8221;，再println出来，得到的结果将是&#8220;?啊&#8221;，因为&#8220;0x80 0x40&#8221;是GBK中的字符，在GB2312中没有。再如，把字符串String="\u00d6\u00ec\u00e9\u0046\u00bb\ u00f9"进行new String (buf.getBytes("GBK"))操作，得到的结果是&#8220;3fa8aca8a6463fa8b4&#8221;，其中，&#8220;\u00d6&#8221;在&#8220;GBK&#8221;中没有对应的字符，得到&#8220;3f&#8221;，&#8220;\u00ec&#8221;对应着&#8220;a8ac&#8221;，&#8220;\u00e9&#8221;对应着&#8220;a8a6&#8221;，&#8220;0046&#8221;对应着&#8220;46&#8221;（因为这是ASCII字符），&#8220;\u00bb&#8221;没找到，得到&#8220;3f&#8221;，最后，&#8220;\u00f9&#8221;对应着&#8220;a8b4&#8221;。把这个字符串println一下，得到的结果是&#8220;?&#236;&#233;F? &#249;&#8221;。看到没？这里并不全是问号，因为GBK与Unicode映射的内容中除了汉字外还有字符，本例就是最好的明证。</p>
<p>3&gt;Unicode格式<br />
&nbsp; Unicode默认为UTF-16格式。<br />
&nbsp; UTF-8是Unicode压缩版本，对于大多数常用字符集(ASCII中0~127字符)它只使用单字节，而对其它常用字符(特别是朝鲜和汉语会意文字)，它使用３字节。如果写的主要是英语，那么UTF-8可减少文件大小一半左右。<br />
&nbsp; UTF-8就是以8位为单元对UCS进行编码，以字节为编码单元，没有字节序的问题。UTF-16以两个字节为编码单元，在解释一个UTF-16文本前，首先要弄清楚每个编码单元的字节序。例如"奎"的Unicode编码是594E，"乙"的Unicode编码是4E59。如果我们收到UTF-16字节流 "594E"，那么这是&#8220;奎&#8221;还是"乙"？Unicode规范中推荐的标记字节顺序的方法是BOM(即Byte Order Mark)。如果接收者收到FEFF，就表明这个字节流是Big-Endian的；如果收到FFFE，就表明这个字节流是Little-Endian的。</p>
<p>3&gt;UTF格式<br />
&nbsp; UTF，是Unicode Text Format的缩写，意为Unicode文本格式。对于UTF，是这样定义的：<br />
&nbsp; ● 如果Unicode的16位字符的头9位是0，则用一个字节表示，这个字节的首位是&#8220;0&#8221;，剩下的7位与原字符中的后7位相同，如&#8220;\u0034&#8221; （0000 0000 0011 0100），用&#8220;34&#8221; (0011 0100)表示；（与源Unicode字符是相同的）；<br />
&nbsp; &gt;7位的Unicode: 0 _ _ _ _ _ _ _<br />
&nbsp; ● 如果Unicode的16位字符的头5位是0，则用2个字节表示，首字节是&#8220;110&#8221;开头，后面的5位与源字符中除去头5个零后的最高5位相同；第二个字节以&#8220;10&#8221;开头，后面的6位与源字符中的低6位相同。如&#8220;\u025d&#8221;（0000 0010 0101 1101），转化后为&#8220;c99d&#8221;（1100 1001 1001 1101）；<br />
&nbsp; &gt;11位的Unicode: 1 1 0 _ _ _ _ _ 1 0 _ _ _ _ _ _<br />
&nbsp; ● 如果不符合上述两个规则，则用三个字节表示。第一个字节以&#8220;1110&#8221;开头，后四位为源字符的高四位；第二个字节以&#8220;10&#8221;开头，后六位为源字符中间的六位；第三个字节以&#8220;10&#8221;开头，后六位为源字符的低六位；如&#8220;\u9da7&#8221;（1001 1101 1010 0111），转化为&#8220;e9b6a7&#8221;（1110 1001 1011 0110 1010 0111）；<br />
&nbsp; &gt;16位的Unicode: 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _<br />
&nbsp; &gt;21位的Unicode: 1 1 1 1 0 _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _<br />
&nbsp; 可以这么描述JAVA程序中Unicode与UTF的关系，虽然不绝对：字符串在内存中运行时，表现为Unicode代码，而当要保存到文件或其它介质中去时，用的是UTF。这个转化过程是由writeUTF和readUTF来完成的。</p>
<p>4&gt;Java程序中的编码格式内幕<br />
&nbsp; input(charsetA)-＞process(Unicode)-＞output(charsetB)<br />
&nbsp; 即输入、处理和输出要经过&#8220;从charsetA到unicode再到charsetB&#8221;的转化。</p>
<p>&nbsp; SourceFile(jsp,java)-＞class-＞output<br />
&nbsp; 输入的是jsp和java源文件，在处理过程中，以Class文件为载体，然后输出。</p>
<p>　● JSP从源文件到Class的过程。<br />
&nbsp; 在本节中，将阐述JSP文件的解释和编译过程，并跟踪其中的中文变化。<br />
　　1、JSP/Servlet引擎提供的JSP转换工具（jspc）搜索JSP文件中用＜%@ page contentType ="text/html; charset=＜Jsp-charset＞"%＞中指定的charset。如果在JSP文件中未指定＜Jsp-charset＞，则取JVM中的默认设置file.encoding，一般情况下，这个值是ISO8859-1；<br />
　　2、jspc用相当于&#8220;javac &#8211;encoding ＜Jsp-charset＞&#8221;的命令解释JSP文件中出现的所有字符，包括中文字符和ASCII字符，然后把这些字符转换成Unicode字符，再转化成 UTF格式，存为JAVA文件。ASCII码字符转化为Unicode字符时只是简单地在前面加&#8220;00&#8221;，如&#8220;A&#8221;，转化为&#8220;\u0041&#8221;（不需要理由，Unicode的码表就是这么编的）。然后，经过到UTF的转换，又变回&#8220;41&#8221;了！这也就是可以使用普通文本编辑器查看由JSP生成的JAVA文件的原因；<br />
　　3、引擎用相当于&#8220;javac &#8211;encoding UNICODE&#8221;的命令，把JAVA文件编译成CLASS文件；<br />
　　先看一下这些过程中中文字符的转换情况。有如下源代码：<br />
＜%@ page contentType="text/html; charset=gb2312"%＞<br />
＜html＞＜body＞<br />
＜%<br />
　String a="中文";<br />
　out.println(a);<br />
%＞<br />
＜/body＞＜/html＞ <br />
&nbsp; 两个字的GB2312编码为&#8220;D6 D0 CE C4&#8221;。经查表，&#8220;中文&#8221;两字的Unicode编码为&#8220;\u4E2D\u6587&#8221;，用 UTF表示就是&#8220;E4 B8 AD E6 96 87&#8221;。此JSP文件生成的JAVA文件中的&#8220;中文&#8221;两个字被&#8220;E4 B8 AD E6 96 87&#8221;替代了，再查看由JAVA文件编译生成的CLASS文件，发现结果与JAVA文件中的完全一样。<br />
&nbsp; <br />
&nbsp; 再看JSP中指定的CharSet为ISO-8859-1的情况。<br />
＜%@ page contentType="text/html; charset=ISO-8859-1"%＞<br />
＜html＞＜body＞<br />
＜%<br />
　String a="中文";<br />
　out.println(a);<br />
%＞<br />
＜/body＞＜/html＞ <br />
&nbsp; 先推测一下生成的JAVA文件和CLASS文件的过程：jspc用ISO-8859-1来解释&#8220;中文&#8221;，并把它映射到Unicode。由于ISO- 8859-1是8位的，其映射规则就是在每个字节前加&#8220;00&#8221;，所以，映射后的Unicode编码应为&#8220;\u00D6\u00D0\u00CE\ u00C4&#8221;，转化成UTF后应该是&#8220;C3 96 C3 90 C3 8E C3 84&#8221;。最后，打开文件看一下，JAVA文件和CLASS文件中，&#8220;中文&#8221;果然都表示为&#8220;C3 96 C3 90 C3 8E C3 84&#8221;。<br />
&nbsp; 如果上述代码中不指定＜Jsp-charset＞，即把第一行写成&#8220;＜%@ page contentType="text/html" %＞&#8221;，JSPC会使用file.encoding的设置来解释JSP文件。在RedHat 6.2上，其处理结果与指定为ISO-8859-1是完全相同的。<br />
&nbsp; <br />
&nbsp; 到现在为止，已经解释了从JSP文件到CLASS文件的转变过程中中文字符的映射过程。一句话：从&#8220;JspCharSet到Unicode再到UTF&#8221;。</p>
<p>&nbsp; ● Servlet从源文件到Class的过程<br />
&nbsp; 本节将讨论Servlet的编译过程并跟踪其中的中文变化。<br />
&nbsp; 用&#8220;javac&#8221;编译Servlet源文件。javac可以带&#8220;-encoding ＜Compile-charset＞&#8221;参数，意思是&#8220;用＜ Compile-charset ＞中指定的编码来解释Serlvet源文件&#8221;。<br />
&nbsp; 源文件在编译时，用＜Compile-charset＞来解释所有字符，包括中文字符和ASCII字符。然后把字符常量转变成Unicode字符，最后，把Unicode转变成UTF。<br />
&nbsp; 在Servlet中，还有一个地方设置输出流的CharSet。通常在输出结果前，调用HttpServletResponse的 setContentType方法来达到与在JSP中设置＜Jsp-charset＞一样的效果，称之为＜Servlet-charset＞。<br />
&nbsp; 注意，文中一共提到了三个变量：＜Jsp-charset＞、＜Compile-charset＞和＜Servlet-charset＞。其中，JSP文件只与＜Jsp-charset＞有关，而＜Compile-charset＞和＜Servlet-charset＞只与Servlet有关。</p>
<p>import javax.servlet.*;<br />
import javax.servlet.http.*;<br />
class testServlet extends HttpServlet<br />
{<br />
　public void doGet(HttpServletRequest req,HttpServletResponse res)<br />
　throws ServletException,java.io.IOException<br />
　{<br />
　　res.setContentType("text/html; charset=GB2312");<br />
　　java.io.PrintWriter out=res.getWriter();<br />
　　out.println("＜html＞");<br />
　　out.println("#中文#");<br />
　　out.println("＜/html＞");<br />
　}<br />
} </p>
<p>&nbsp; 开始编译。下表是＜Compile-charset＞不同时，CLASS文件中&#8220;中文&#8221;两字的十六进制码。在编译过程中，＜Servlet- charset＞不起任何作用。＜Servlet-charset＞只对CLASS文件的输出产生影响，实际上是＜Servlet-charset＞和＜Compile-charset＞一起，达到与JSP文件中的＜Jsp-charset＞相同的效果，因为＜Jsp-charset＞对编译和 CLASS文件的输出都会产生影响。&#8220;中文&#8221;两个字的GB2312编码为&#8220;D6 D0 CE C4&#8221;</p>
<p>Compile-charset&nbsp;&nbsp; Class文件中&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 等效的Unicode码 <br />
GB2312&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; E4 B8 AD E6 96 87(UTF)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \u4E2D\u6587 (在Unicode中＝&#8220;中文&#8221;) <br />
ISO-8859-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C3 96 C3 90 C3 8E C3 84 (UTF)&nbsp;&nbsp; \u00D6 \u00D0 \u00CE \u00C4 (在D6 D0 CE C4前面各加了一个00) <br />
（默认）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同ISO-8859-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同ISO-8859-1 </p>
<p>&nbsp; 普通Java程序的编译过程与Servlet完全一样。<br />
&nbsp; 接下来看看CLASS又是怎样输出中文的呢？<br />
&nbsp; 上文说过，字符串在内存中表现为Unicode编码。至于这种Unicode编码表示了什么，那要看它是从哪种字符集映射过来的，也就是说要看它的祖先。看看上面的例子，如果给一串Unicode编码&#8220;00D6 00D0 00CE 00C4&#8221;，如果不作转换，直接用Unicode码表来对照它时，是四个字符（而且是特殊字符）；假如把它与&#8220;ISO8859-1&#8221;进行映射，则直接去掉前面的&#8220;00&#8221;即可得到&#8220;D6 D0 CE C4&#8221;，这是ASCII码表中的四个字符；而假如把它当作GB2312来进行映射，得到的结果很可能是一大堆乱码，因为在GB2312中有可能没有（也有可能有）字符与00D6等字符对应（如果对应不上，将得到0x3f，也就是问号，如果对应上了，由于00D6等字符太靠前，估计也是一些特殊符号，真正的汉字在Unicode中的编码从4E00开始）。<br />
&nbsp; 可以，同样的Unicode字符，可以解释成不同的样子。当然，这其中有一种是我们期望的结果。<br />
&nbsp; 以上例而论，&#8220;D6 D0 CE C4&#8221;应该是我们所想要的，当把&#8220;D6 D0 CE C4&#8221;输出到IE中时，用&#8220;简体中文&#8221;方式查看，就能看到清楚的&#8220;中文&#8221;两个字了。<br />
&nbsp; Servlet中，当Compile-charset=Servlet-charset时，显示结果肯定正常。</p>
<p>&nbsp; ● 最终结论：<br />
&nbsp; 在Class输出字符串前，会将Unicode的字符串按照某一种内码重新生成字节流，然后把字节流输入，相当于进行了一步&#8220;String.getBytes(???)&#8221;操作。???代表某一种字符集。<br />
&nbsp; 如果是Servlet，那么，这种内码就是在HttpServletResponse.setContentType()方法中指定的内码，也就是上文定义的＜Servlet-charset＞。<br />
&nbsp; 如果是JSP，那么，这种内码就是在＜%@ page contentType=""%＞中指定的内码，也就是上文定义的＜Jsp-charset＞。<br />
&nbsp; 如果是Java程序，那么，这种内码就是file.encoding中指定的内码，默认为ISO8859-1。</p>
<p>5&gt;结论<br />
&nbsp; 在Jsp文件中，要指定contentType，其中，charset的值要与客户端浏览器所用的字符集一样；对于其中的字符串常量，不需做任何内码转换；对于字符串变量，要求能根据ContentType中指定的字符集还原成客户端能识别的字节流，简单地说，就是&#8220;字符串变量是基于＜Jsp- charset＞字符集的&#8221;；<br />
&nbsp; 在Servlet中，必须用HttpServletResponse.setContentType()设置charset，且设置成与客户端内码一致；对于其中的字符串常量，需要在Javac编译时指定encoding，这个encoding必须与编写源文件的平台的字符集一样，一般说来都是 GB2312或GBK；对于字符串变量，与JSP一样，必须&#8220;是基于＜Servlet-charset＞字符集的&#8221;。&nbsp;</p>
<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1339656</p>
<img src ="http://www.blogjava.net/hilor/aggbug/180895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-02-20 16:32 <a href="http://www.blogjava.net/hilor/articles/180895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA字符编码系列一：Unicode,GBK,GB2312,UTF-8概念基础(转)</title><link>http://www.blogjava.net/hilor/articles/180893.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Wed, 20 Feb 2008 08:29:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/180893.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/180893.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/180893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/180893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/180893.html</trackback:ping><description><![CDATA[<div>这两天抽时间又总结/整理了一下各种编码的实际编码方式，和在Java应用中的使用情况，在这里记录下来以便日后参考。</div>
<div>为了构成一个完整的对文字编码的认识和深入把握，以便处理在Java开发过程中遇到的各种问题，特别是乱码问题，我觉得组成一个系列来描述和分析更好一些，包括三篇文章：</div>
<div>第一篇：JAVA字符编码系列一：<a href="http://blog.csdn.net/qinysong/archive/2006/09/05/1179480.aspx">Unicode,GBK,GB2312,UTF-8概念基础</a></div>
<div>第二篇：JAVA字符编码系列二：<a href="http://blog.csdn.net/qinysong/archive/2006/09/05/1179489.aspx">Unicode,ISO-8859,GBK,UTF-8编码及相互转换</a></div>
<div>第三篇：JAVA字符编码系列三：<a href="http://blog.csdn.net/qinysong/archive/2006/09/05/1179513.aspx">Java应用中的编码问题</a></div>
<div>&nbsp;</div>
<div>第一篇：JAVA字符编码系列一：Unicode,GBK,GB2312,UTF-8概念基础</div>
<div>本部分采用重用，转载一篇文章来完成这部分的目标。</div>
<div>来源：holen'blog&nbsp;&nbsp; 对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解</div>
<div>地址：http://blog.donews.com/holen/archive/2004/11/30/188182.aspx</div>
<div>&nbsp;</div>
<div></div>
<div><strong>Unicode:</strong> <br />
<br />
unicode.org制定的编码机制, 要将全世界常用文字都函括进去.<br />
在1.0中是16位编码, 由U+0000到U+FFFF. 每个2byte码对应一个字符; 在2.0开始抛弃了16位限制, 原来的16位作为基本位平面, 另外增加了16个位平面, 相当于20位编码, 编码范围0到0x10FFFF.<br />
<br />
<strong>UCS: </strong><br />
<br />
ISO制定的ISO10646标准所定义的 Universal Character Set, 采用4byte编码.<br />
<br />
<strong>Unicode与UCS的关系:</strong><br />
<br />
ISO 与unicode.org是两个不同的组织, 因此最初制定了不同的标准; 但自从unicode2.0开始, unicode采用了与ISO 10646-1相同的字库和字码, ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值, 使得两者保持一致.<br />
<br />
<strong>UCS的编码方式:</strong><br />
<br />
</div>
<li>UCS-2, 与unicode的2byte编码基本一样. <br />
</li>
<li>UCS-4, 4byte编码, 目前是在UCS-2前加上2个全零的byte.<br />
<br />
<strong>UTF: </strong>Unicode/UCS Transformation Format<br />
</li>
<li>UTF-8, 8bit编码, ASCII不作变换, 其他字符做变长编码, 每个字符1-3 byte. 通常作为外码. 有以下优点:<br />
* 与CPU字节顺序无关, 可以在不同平台之间交流<br />
* 容错能力高, 任何一个字节损坏后, 最多只会导致一个编码码位损失, 不会链锁错误(如GB码错一个字节就会整行乱码) <br />
</li>
<li>UTF-16, 16bit编码, 是变长码, 大致相当于20位编码, 值在0到0x10FFFF之间, 基本上就是unicode编码的实现. 它是变长码, 与CPU字序有关, 但因为最省空间, 常作为网络传输的外码.<br />
UTF-16是unicode的preferred encoding. <br />
</li>
<li>UTF-32, 仅使用了unicode范围(0到0x10FFFF)的32位编码, 相当于UCS-4的子集.<br />
<br />
<strong>UTF与unicode的关系:</strong><br />
<br />
Unicode是一个字符集, 可以看作为内码.<br />
而UTF 是一种编码方式, 它的出现是因为unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码, 没有变换, 但它包含了0x00在编码内, 头256字节码的第一个byte都是0x00, 在操作系统(C语言)中有特殊意义, 会引起问题. 采用UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来一些优点.<br />
<br />
<strong>中国国标编码:</strong><br />
</li>
<li>GB 13000: 完全等同于ISO 10646-1/Unicode 2.1, 今后也将随ISO 10646/Unicode的标准更改而同步更改.<br />
</li>
<li>GBK: 对GB2312的扩充, 以容纳GB2312字符集范围以外的Unicode 2.1的统一汉字部分, 并且增加了部分unicode中没有的字符. <br />
</li>
<li>GB 18030-2000: 基于GB 13000, 作为Unicode 3.0的GBK扩展版本, 覆盖了所有unicode编码, 地位等同于UTF-8, UTF-16, 是一种unicode编码形式. 变长编码, 用单字节/双字节/4字节对字符编码. GB18030向下兼容GB2312/GBK. <br />
GB 18030是中国所有非手持/嵌入式计算机系统的强制实施标准.
<p><br />
-------------------------------<br />
</p>
<p><br />
&nbsp;</p>
<h2>什么是 UCS 和 ISO 10646?</h2>
<p>国际标准 <strong>ISO 10646</strong> 定义了 <strong>通用字符集 (Universal Character Set, UCS)</strong>. UCS 是所有其他字符集标准的一个超集. 它保证与其他字符集是双向兼容的. 就是说, 如果你将任何文本字符串翻译到 UCS格式, 然后再翻译回原编码, 你不会丢失任何信息.</p>
<p>UCS 包含了用于表达所有已知语言的字符. 不仅包括拉丁语,希腊语, 斯拉夫语,希伯来语,阿拉伯语,亚美尼亚语和乔治亚语的描述, 还包括中文, 日文和韩文这样的象形文字, 以及 平假名, 片假名, 孟加拉语, 旁遮普语果鲁穆奇字符(Gurmukhi), 泰米尔语, 印.埃纳德语(Kannada), Malayalam, 泰国语, 老挝语, 汉语拼音(Bopomofo), Hangul, Devangari, Gujarati, Oriya, Telugu 以及其他数也数不清的语. 对于还没有加入的语言, 由于正在研究怎样在计算机中最好地编码它们, 因而最终它们都将被加入. 这些语言包括 Tibetian, 高棉语, Runic(古代北欧文字), 埃塞俄比亚语, 其他象形文字, 以及各种各样的印-欧语系的语言, 还包括挑选出来的艺术语言比如 Tengwar, Cirth 和克林贡语(Klingon). UCS 还包括大量的图形的, 印刷用的, 数学用的和科学用的符号, 包括所有由 TeX, Postscript, MS-DOS，MS-Windows, Macintosh, OCR 字体, 以及许多其他字处理和出版系统提供的字符.</p>
<p>ISO 10646 定义了一个 31 位的字符集. 然而, 在这巨大的编码空间中, 迄今为止只分配了前 65534 个码位 (0x0000 到 0xFFFD). 这个 UCS 的 16位子集称为 <strong>基本多语言面 (Basic Multilingual Plane, BMP)</strong>. 将被编码在 16 位 BMP 以外的字符都属于非常特殊的字符(比如象形文字), 且只有专家在历史和科学领域里才会用到它们. 按当前的计划, 将来也许再也不会有字符被分配到从 0x000000 到 0x10FFFF 这个覆盖了超过 100 万个潜在的未来字符的 21 位的编码空间以外去了. ISO 10646-1 标准第一次发表于 1993 年, 定义了字符集与 BMP 中内容的架构. 定义 BMP 以外的字符编码的第二部分 ISO 10646-2 正在准备中, 但也许要过好几年才能完成. 新的字符仍源源不断地加入到 BMP 中, 但已经存在的字符是稳定的且不会再改变了.</p>
<p>UCS 不仅给每个字符分配一个代码, 而且赋予了一个正式的名字. 表示一个 UCS 或 Unicode 值的十六进制数, 通常在前面加上 "U+", 就象 U+0041 代表字符"拉丁大写字母A". UCS 字符 U+0000 到 U+007F 与 US-ASCII(ISO 646) 是一致的, U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是一致的. 从 U+E000 到 U+F8FF, 已经 BMP 以外的大范围的编码是为私用保留的.</p>
<h2>什么是组合字符?</h2>
<p>UCS里有些编码点分配给了 <strong>组合字符</strong>. 它们类似于打字机上的无间隔重音键. 单个的组合字符不是一个完整的字符. 它是一个类似于重音符或其他指示标记, 加在前一个字符后面. 因而, 重音符可以加在任何字符后面. 那些最重要的被加重的字符, 就象普通语言的正字法(orthographies of common languages)里用到的那种, 在 UCS 里都有自己的位置, 以确保同老的字符集的向后兼容性. 既有自己的编码位置, 又可以表示为一个普通字符跟随一个组合字符的被加重字符, 被称为 <strong>预作字符(precomposed characters)</strong>. UCS 里的预作字符是为了同没有预作字符的旧编码, 比如 ISO 8859, 保持向后兼容性而设的. 组合字符机制允许在任何字符后加上重音符或其他指示标记, 这在科学符号中特别有用, 比如数学方程式和国际音标字母, 可能会需要在一个基本字符后组合上一个或多个指示标记.</p>
<p>组合字符跟随着被修饰的字符. 比如, 德语中的元音变音字符 ("拉丁大写字母A 加上分音符"), 既可以表示为 UCS 码 U+00C4 的预作字符, 也可以表示成一个普通 "拉丁大写字母A" 跟着一个"组合分音符":U+0041 U+0308 这样的组合. 当需要堆叠多个重音符, 或在一个基本字符的上面和下面都要加上组合标记时, 可以使用多个组合字符. 比如在泰国文中, 一个基本字符最多可加上两个组合字符.</p>
<h2>什么是 UCS 实现级别?</h2>
<p>不是所有的系统都需要支持象组合字符这样的 UCS 里所有的先进机制. 因此 ISO 10646 指定了下列三种实现级别: </p>
<dl>
<dt>级别1 </dt>
<dd>不支持组合字符和 Hangul Jamo 字符 (一种特别的, 更加复杂的韩国文的编码, 使用两个或三个子字符来编码一个韩文音节) </dd>
<dt>级别2 </dt>
<dd>类似于级别1, 但在某些文字中, 允许一列固定的组合字符 (例如, 希伯来文, 阿拉伯文, Devangari, 孟加拉语, 果鲁穆奇语, Gujarati, Oriya, 泰米尔语, Telugo, 印.埃纳德语, Malayalam, 泰国语和老挝语). 如果没有这最起码的几个组合字符, UCS 就不能完整地表达这些语言. </dd>
<dt>级别3 </dt>
<dd>支持所有的 UCS 字符, 例如数学家可以在任意一个字符上加上一个 tilde(颚化符号,西班牙语字母上面的～)或一个箭头(或两者都加). </dd></dl>
<h2>什么是 Unicode?</h2>
<p>历史上, 有两个独立的, 创立单一字符集的尝试. 一个是<a href="http://www.iso.ch/">国际标准化组织(ISO)</a>的 ISO 10646 项目, 另一个是由(一开始大多是美国的)多语言软件制造商组成的协会组织的 <a href="http://www.unicode.org/">Unicode 项目</a>. 幸运的是, 1991年前后, 两个项目的参与者都认识到, 世界不需要两个不同的单一字符集. 它们合并双方的工作成果, 并为创立一个单一编码表而协同工作. 两个项目仍都存在并独立地公布各自的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2 都同意保持 Unicode 和 ISO 10646 标准的码表兼容, 并紧密地共同调整任何未来的扩展.</p>
<h2>那么 Unicode 和 ISO 10646 不同在什么地方?</h2>
<p>Unicode 协会公布的 <a href="http://www.unicode.org/unicode/standard/standard.html">Unicode 标准</a> 严密地包含了 ISO 10646-1 实现级别3的基本多语言面. 在两个标准里所有的字符都在相同的位置并且有相同的名字.</p>
<p>Unicode 标准额外定义了许多与字符有关的语义符号学, 一般而言是对于实现高质量的印刷出版系统的更好的参考. Unicode 详细说明了绘制某些语言(比如阿拉伯语)表达形式的算法, 处理双向文字(比如拉丁与希伯来文混合文字)的算法和 排序与字符串比较 所需的算法, 以及其他许多东西.</p>
<p>另一方面, ISO 10646 标准, 就象广为人知的 ISO 8859 标准一样, 只不过是一个简单的字符集表. 它指定了一些与标准有关的术语, 定义了一些编码的别名, 并包括了规范说明, 指定了怎样使用 UCS 连接其他 ISO 标准的实现, 比如 ISO 6429 和 ISO 2022. 还有一些与 ISO 紧密相关的, 比如 ISO 14651 是关于 UCS 字符串排序的.</p>
<p>考虑到 Unicode 标准有一个易记的名字, 且在任何好的书店里的 Addison-Wesley 里有, 只花费 ISO 版本的一小部分, 且包括更多的辅助信息, 因而它成为使用广泛得多的参考也就不足为奇了. 然而, 一般认为, 用于打印 ISO 10646-1 标准的字体在某些方面的质量要高于用于打印 Unicode 2.0的. 专业字体设计者总是被建议说要两个标准都实现, 但一些提供的样例字形有显著的区别. ISO 10646-1 标准同样使用四种不同的风格变体来显示表意文字如中文, 日文和韩文 (CJK), 而 Unicode 2.0 的表里只有中文的变体. 这导致了普遍的认为 Unicode 对日本用户来说是不可接收的传说, 尽管是错误的.</p>
<h2>什么是 UTF-8?</h2>
<p>首先 UCS 和 Unicode 只是分配整数给字符的编码表. 现在存在好几种将一串字符表示为一串字节的方法. 最显而易见的两种方法是将 Unicode 文本存储为 2 个 或 4 个字节序列的串. 这两种方法的正式名称分别为 UCS-2 和 UCS-4. 除非另外指定, 否则大多数的字节都是这样的(Bigendian convention). 将一个 ASCII 或 Latin-1 的文件转换成 UCS-2 只需简单地在每个 ASCII 字节前插入 0x00. 如果要转换成 UCS-4, 则必须在每个 ASCII 字节前插入三个 0x00.</p>
<p>在 Unix 下使用 UCS-2 (或 UCS-4) 会导致非常严重的问题. 用这些编码的字符串会包含一些特殊的字符, 比如 '\0' 或 '/', 它们在 文件名和其他 C 库函数参数里都有特别的含义. 另外, 大多数使用 ASCII 文件的 UNIX 下的工具, 如果不进行重大修改是无法读取 16 位的字符的. 基于这些原因, 在文件名, 文本文件, 环境变量等地方, <strong>UCS-2</strong> 不适合作为 <strong>Unicode</strong> 的外部编码.</p>
<p>在 ISO 10646-1 <a href="http://www.cl.cam.ac.uk/~mgk25/ucs/ISO-10646-UTF-8.html">Annex R</a> 和 <a href="ftp://ftp.funet.fi/mirrors/nic.nordu.net/rfc/rfc2279.txt">RFC 2279</a> 里定义的 <strong>UTF-8</strong> 编码没有这些问题. 它是在 Unix 风格的操作系统下使用 Unicode 的明显的方法.</p>
<p>UTF-8 有一下特性: </p>
<ul>
    <li>UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容). 这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的. </li>
    <li>所有 &gt;U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的一部分. </li>
    <li>表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节. 多字节串的其余字节都在 0x80 到 0xBF 范围里. 这使得重新同步非常容易, 并使编码无国界, 且很少受丢失字节的影响. </li>
    <li>可以编入所有可能的 2<sup>31</sup>个 UCS 代码 </li>
    <li>UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长. </li>
    <li>Bigendian UCS-4 字节串的排列顺序是预定的. </li>
    <li>字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到. </li>
</ul>
<p>下列字节串用来表示一个字符. 用到哪个串取决于该字符在 Unicode 中的序号.</p>
<div align="center">
<center>
<table border="1">
    <tbody>
        <tr>
            <td>U-00000000 - U-0000007F: </td>
            <td>0<em>xxxxxxx</em> </td>
        </tr>
        <tr>
            <td>U-00000080 - U-000007FF: </td>
            <td>110<em>xxxxx</em> 10<em>xxxxxx</em> </td>
        </tr>
        <tr>
            <td>U-00000800 - U-0000FFFF: </td>
            <td>1110<em>xxxx</em> 10<em>xxxxxx</em> 10<em>xxxxxx</em> </td>
        </tr>
        <tr>
            <td>U-00010000 - U-001FFFFF: </td>
            <td>11110<em>xxx</em> 10<em>xxxxxx</em> 10<em>xxxxxx</em> 10<em>xxxxxx</em> </td>
        </tr>
        <tr>
            <td>U-00200000 - U-03FFFFFF: </td>
            <td>111110<em>xx</em> 10<em>xxxxxx</em> 10<em>xxxxxx</em> 10<em>xxxxxx</em> 10<em>xxxxxx</em> </td>
        </tr>
        <tr>
            <td>U-04000000 - U-7FFFFFFF: </td>
            <td>1111110<em>x</em> 10<em>xxxxxx</em> 10<em>xxxxxx</em> 10<em>xxxxxx</em> 10<em>xxxxxx</em> 10<em>xxxxxx</em> </td>
        </tr>
    </tbody>
</table>
</center></div>
<p>xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x 具有越少的特殊意义. 只用最短的那个足够表达一个字符编码数的多字节串. 注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目.</p>
<p><strong>例如</strong>: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 里的编码为:</p>
<blockquote>
<p>11000010 10101001 = 0xC2 0xA9</p>
</blockquote>
<p>而字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:</p>
<blockquote>
<p>11100010 10001001 10100000 = 0xE2 0x89 0xA0</p>
</blockquote>
<p>这种编码的官方名字拼写为 UTF-8, 其中 UTF 代表 <strong>U</strong>CS <strong>T</strong>ransformation <strong>F</strong>ormat. 请勿在任何文档中用其他名字 (比如 utf8 或 UTF_8) 来表示 UTF-8, 当然除非你指的是一个变量名而不是这种编码本身.</p>
<h2>什么编程语言支持 Unicode?</h2>
<p>在大约 1993 年之后开发的大多数现代编程语言都有一个特别的数据类型, 叫做 Unicode/ISO 10646-1 字符. 在 Ada95 中叫 Wide_Character, 在 Java 中叫 char.</p>
<p>ISO C 也详细说明了处理多字节编码和宽字符 (wide characters) 的机制, 1994 年 9 月 <a href="http://www.lysator.liu.se/c/na1.html">Amendment 1 to ISO C</a> 发表时又加入了更多. 这些机制主要是为各类东亚编码而设计的, 它们比处理 UCS 所需的要健壮得多. UTF-8 是 ISO C 标准调用多字节字符串的编码的一个例子, <em>wchar_t</em> 类型可以用来存放 Unicode 字符.</p>
</li>
<img src ="http://www.blogjava.net/hilor/aggbug/180893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-02-20 16:29 <a href="http://www.blogjava.net/hilor/articles/180893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下安装Tomcat5.5，并进行优化  </title><link>http://www.blogjava.net/hilor/articles/180637.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Tue, 19 Feb 2008 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/180637.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/180637.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/180637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/180637.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/180637.html</trackback:ping><description><![CDATA[<table class="post">
    <!-- 正常显示帖子-->
    <tbody>
        <tr>
            <td class="title" style="font-size: 14px">Linux下安装Tomcat5.5，并进行优化 </td>
        </tr>
        <tr>
            <td>
            <div class="message" style="font-size: 14px">1. 安装JDK1.5&nbsp;&nbsp;(Tomcat5.5必须要JDK1.5以上版本) <br />
            1)下载RPM包或bin包 <br />
            2)安装步骤 <br />
            &nbsp;&nbsp;a. 如果是bin包，需要 chmod 777&nbsp;&nbsp;jdk-1_5_0_12-linux-i586-rpm.bin <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;然后执行&nbsp;&nbsp;./jdk-1_5_0_12-linux-i586-rpm.bin <br />
            &nbsp;&nbsp;b. 软件自动安装到 /usr/java/jdk1.5.0_12 <br />
            &nbsp;&nbsp;c. vi ~/.bash_profile <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在PATH后面添加:/usr/java/jdk1.5.0_12/bin <br />
            <br />
            2.安装Tomcat5.5 <br />
            1)下载源码包&nbsp;&nbsp;apache-tomcat-5.5.23.tar.gz <br />
            &nbsp;&nbsp;&nbsp;下载地址：http://tomcat.apache.org <br />
            2)安装步骤 <br />
            &nbsp;&nbsp;&nbsp;a. tar zxvf apache-tomcat-5.5.23.tar.gz /usr/local/tomcat1 <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tar zxvf apache-tomcat-5.5.23.tar.gz /usr/local/tomcat2 <br />
            &nbsp;&nbsp;&nbsp;b. 修改&nbsp;&nbsp;bin/catalina.sh <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JAVA_HOME=/usr/java/jdk1.5.0_12 <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JAVA_OPTS=' -Xms256m -Xmx512m -XX:PermSize=512M -XX:MaxPermSize=512m '&nbsp;&nbsp; <br />
            3)起停 <br />
            &nbsp;&nbsp;/usr/local/tomcat1/bin/startup.sh|shutdown.sh <br />
            <br />
            3.安装Tomcat-Native连接APR，提高静态资源的访问性能 <br />
            1)下载软件包&nbsp;&nbsp;tomcat-native-1.1.10-src.tar.gz <br />
            &nbsp;&nbsp;&nbsp;下载地址：http://archive.apache.org/dist/tomcat/tomcat-connectors/native/ <br />
            2)apr和apr-util的安装参考<span class="ubb_link"><a class="ubb_link" href="http://forum.ospod.com/post-3006-1.fhtml" target="_blank" rel="nofollow">Linux下Apache和Apr整合，提高Apache性能</a></span> <br />
            2)安装步骤 <br />
            &nbsp;&nbsp;&nbsp;a. tar zxvf tomcat-native-1.1.10-src.tar.gz <br />
            &nbsp;&nbsp;&nbsp;b. cd /tomcat-native-1.1.10-src/jni/native <br />
            &nbsp;&nbsp;&nbsp;c. ./configure --prefix=/usr/local/apache2/apr --with-apr=/usr/local/apache2/apr --with-java-home=/usr/java/jdk1.5.0_12 <br />
            &nbsp;&nbsp;&nbsp;d. make <br />
            &nbsp;&nbsp;&nbsp;e. make install <br />
            &nbsp;&nbsp;&nbsp;f. 修改&nbsp;&nbsp;bin/catalina.sh 添加 CATALINA_OPTS=' -Djava.library.path=/usr/local/apache2/apr ' </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/hilor/aggbug/180637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-02-19 12:56 <a href="http://www.blogjava.net/hilor/articles/180637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用oscache+lucene2.2.0加快页面访问速度(转)</title><link>http://www.blogjava.net/hilor/articles/176971.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Tue, 22 Jan 2008 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/articles/176971.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/176971.html</wfw:comment><comments>http://www.blogjava.net/hilor/articles/176971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/176971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/176971.html</trackback:ping><description><![CDATA[大家都知道用lucene2.2.0全文检索速度很快,但是当并发量的大的时候,lucene也会吃不消的,所以我们可以用到缓存,我给大家介绍的是oscache-2.4.1,先到官方网站下载一个.,然后把oscache-2.4.1.jar导入你的工程中.然后在下载解压后的文件里有个重要的文件,那就是oscache.properties,oscache.tld文件,oscache.properties是对oscache的配置,这两个文件放在classes文件下.,打开oscache.properties文件,里面可以自己进行相关配置.<br />
&nbsp;&nbsp; 先介绍用硬盘缓存.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.打开oscache.properties文件.&nbsp;改成,cache.memory=false(表示硬盘缓存.true表示内存缓存),然后是路径,cache.path=/home/search/index/cache(我这个不是win下)然后cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.DiskPersistenceListener<br />
&nbsp;cache.persistence.class=com.opensymphony.oscache.plugins.diskpersistence.HashDiskPersistenceListener选一个,第一会当缓存数据在硬盘后,会产品一个文件夹.第二是存数据在硬盘后,会产生分步的件夹,不会像第一种那样把缓存数据放在一个文件夹里.<br />
2.写方法进行缓存.<br />
1.写个类extends GeneralCacheAdministrator,<br />
&nbsp;&nbsp;
<p>public class BaseCache extends GeneralCacheAdministrator {<br />
//&nbsp;过期时间(单位为秒);<br />
&nbsp;private int refreshPeriod;<br />
&nbsp;</p>
<p>&nbsp;public BaseCache(int refreshPeriod){<br />
&nbsp;&nbsp;&nbsp; super();<br />
&nbsp;&nbsp;&nbsp; this.refreshPeriod=refreshPeriod;<br />
&nbsp;}<br />
//&nbsp;添加被缓存的对象;<br />
&nbsp;public void put(String key,Object value){<br />
&nbsp;&nbsp;&nbsp; this.putInCache(key,value);<br />
&nbsp;}<br />
//&nbsp;删除被缓存的对象;<br />
&nbsp;public void remove(String key){<br />
&nbsp;&nbsp;&nbsp; this.flushEntry(key);<br />
&nbsp;}<br />
//&nbsp;删除所有被缓存的对象;<br />
&nbsp;public void removeAll(Date date){<br />
&nbsp;&nbsp;&nbsp; this.flushAll(date);<br />
&nbsp;}</p>
<p>&nbsp;public void removeAll(){<br />
&nbsp;&nbsp;&nbsp; this.flushAll();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;}<br />
//&nbsp;获取被缓存的对象;<br />
&nbsp;public Object get(String key) throws Exception{<br />
&nbsp;&nbsp;&nbsp; try{<br />
&nbsp;&nbsp;&nbsp;&nbsp; return this.getFromCache(key,this.refreshPeriod);<br />
&nbsp;&nbsp;&nbsp; } catch (NeedsRefreshException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; this.cancelUpdate(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; throw e;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}<br />
2.执行方法:<br />
在方法里,indexCache = new BaseCache(3600),hii = new cache.Hits(hits),这个类是自己写的,下面的详细代码,然后调用put(String key,Object value)方法,key是关键字.下次取的时候就直接get(key),key我是用的查询参数组成的,只要下次当别人用到相同条件搜索时,就可以直接从缓存读数据,这里所提到的是org.apache.lucene.search.Hits这个对像是不能被缓存的,没有被序例化,我查了下源码,也不能被继承,所以大家自己写个类implements Serializable</p>
<p>public class Hits implements Serializable&nbsp;&nbsp; {<br />
&nbsp; private&nbsp; org.apache.lucene.search.Hits hits;<br />
&nbsp; private&nbsp; Document[] docs=null;<br />
&nbsp; private boolean flag=true;<br />
&nbsp; <br />
&nbsp;/**<br />
&nbsp; *&nbsp;sundc 2007-11-20<br />
&nbsp; */<br />
&nbsp;public Hits(org.apache.lucene.search.Hits hits) {<br />
&nbsp;&nbsp;this.docs=new Document[hits.length()];<br />
&nbsp;&nbsp;int length=0;<br />
//我这里是定义记录有只缓存前710多记录,如果大于710还是查lucene,大家都知道搜索用户访问都是几页,大家可以针对自己项目进行规化..<br />
if(hits.length()&gt;=710){<br />
&nbsp;&nbsp;&nbsp;length=710;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;else{<br />
&nbsp;&nbsp;&nbsp;length=hits.length();&nbsp;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;length;i++){<br />
&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;this.docs[i]=hits.doc(i);<br />
&nbsp;&nbsp;&nbsp;} catch (CorruptIndexException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;}</p>
<p>&nbsp;<br />
&nbsp;public Hits( Document[] doc){<br />
&nbsp;&nbsp;this.docs=doc;<br />
&nbsp;}<br />
&nbsp;public&nbsp; Document doc(int i){<br />
&nbsp;&nbsp;if(!this.flag){<br />
&nbsp;&nbsp;&nbsp;try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;return this.hits.doc(i);<br />
&nbsp;&nbsp;&nbsp;} catch (CorruptIndexException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;} catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return this.docs[i];<br />
&nbsp;}</p>
<p>&nbsp;public&nbsp; int length(){<br />
&nbsp;&nbsp;if(this.flag){<br />
&nbsp;&nbsp;&nbsp;return&nbsp; docs.length;<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return this.hits.length();<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;public&nbsp; Document[] getDocs() {<br />
&nbsp;&nbsp;return this.docs;<br />
&nbsp;}</p>
<p>&nbsp;public&nbsp; void setDocs(Document[] docs) {<br />
&nbsp;&nbsp;this.docs = docs;<br />
&nbsp;}</p>
<p>&nbsp;public org.apache.lucene.search.Hits getHits() {<br />
&nbsp;&nbsp;return this.hits;<br />
&nbsp;}</p>
<p>&nbsp;public void setHits(org.apache.lucene.search.Hits hits) {<br />
&nbsp;&nbsp;this.hits = hits;<br />
&nbsp;}<br />
}<br />
我这里是如果有缓存数据,就读缓存,没有,就lucene然后放在缓存里.大家可以调用indexCache.get(key),大家每一次访问的时候会相对很慢.如果缓存已经建立了,那么速度会很快,大家在用的时候,针对自己项目的数据要求,进行缓存.下面介绍内存缓存.<br />
&nbsp; 2.内存缓存可以相对要快点.但是针对服务器的本身内存大小,大家针对自己的项目和服务器的配置选择好的缓存方式.,把cache.memory=true,这样就可以了.<br />
3.还可以实现页面级缓存<br />
你可以在web.xml中定义缓存过滤器，定义特定资源的缓存。<br />
&lt;filter&gt;<br />
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />
&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;time&lt;/param-name&gt;<br />
&lt;param-value&gt;60&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;init-param&gt;<br />
&lt;param-name&gt;scope&lt;/param-name&gt;<br />
&lt;param-value&gt;session&lt;/param-value&gt;<br />
&lt;/init-param&gt;<br />
&lt;/filter&gt;<br />
&lt;filter-mapping&gt;<br />
&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br />
&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;<br />
上面定义将缓存所有.jsp页面，缓存刷新时间为60秒，缓存作用域为Session,<br />
注意，CacheFilter只捕获Http头为200的页面请求，即只对无错误请求作缓存，<br />
而不对其他请求（如500,404,400）作缓存处理.<br />
我这里介绍的不全,只是我在项目中用到了这些.如果有什么问题,虚心接受....</p>
<img src ="http://www.blogjava.net/hilor/aggbug/176971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-01-22 11:38 <a href="http://www.blogjava.net/hilor/articles/176971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UBUNTU mplyer</title><link>http://www.blogjava.net/hilor/archive/2008/01/20/176644.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Sun, 20 Jan 2008 15:49:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/archive/2008/01/20/176644.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/176644.html</wfw:comment><comments>http://www.blogjava.net/hilor/archive/2008/01/20/176644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/176644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/176644.html</trackback:ping><description><![CDATA[最近玩上了ubuntu, 感觉不错, 把使用中的一些东西记录下来以供备查..<br />
mplyer: 主要是w64codecs解码器..&nbsp; 我的本本是64BIT的, 所以装的UBUNTU AMD64版本, 而在网上查的大部分文章都是X86用的w32codecs,折腾半天没弄好, 最后才想到用w64codecs试下, 结果找到了, 兴奋...<br />
而IM就是用的EVA, 这个跟QQ差不了多少了, 基本功能都有了, 最主要的是能够传文件..<br />
关键的输入法, 根据在ubuntu论坛里看的大部分网友的贴子, 选择了小企鹅fcitx... 用起来感觉不错..<br />
弄好这些就可以满足基本的使用要求了.. <br />
当然最后试了下wine..&nbsp; 测试了下IE, 虽然麻烦了点, 不过最终还是出来了.. <br />
<br />
<br />
PDF文档查看器,&nbsp; 系统自带的evince太慢, 不好用..&nbsp; XPDF书签支持貌似配的很麻烦, 最后找到KPDF,很好用, 该用的功能都有了, 速度也很快.. 最关键的是对中文支持的很好..<br />
<br />
CHM文档查看器, 用的Kchmviewer, 据说FIREFOX有款插件chmreader很好用, 可惜目前只支持到X86, 俺的64位只能等待中了..<br />
<br />
<img src ="http://www.blogjava.net/hilor/aggbug/176644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-01-20 23:49 <a href="http://www.blogjava.net/hilor/archive/2008/01/20/176644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>破解电信星空极速最简单办法</title><link>http://www.blogjava.net/hilor/archive/2008/01/18/176186.html</link><dc:creator>hilor</dc:creator><author>hilor</author><pubDate>Fri, 18 Jan 2008 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/hilor/archive/2008/01/18/176186.html</guid><wfw:comment>http://www.blogjava.net/hilor/comments/176186.html</wfw:comment><comments>http://www.blogjava.net/hilor/archive/2008/01/18/176186.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hilor/comments/commentRss/176186.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hilor/services/trackbacks/176186.html</trackback:ping><description><![CDATA[<div class="contents">
<p>有相当多的地区电信强制性要求用户安装星空软件才能正常上网，而星空极速软件的流氓行径令人发指。 <br />
<br />
首先我们对这种行为表示痛恨~~~ <br />
<br />
为什么一定要使用星空软件而不能使用其它软件上网呢？其实其它软件也能（比如XP自带的）正常上网。 <br />
<br />
当然这需要进行必要的设置，该如何设置呢？ <br />
<br />
我可以给大家提供一个只需要三分钟搞定的方法，不需要借助任何破解软件，只靠WINDOWS就OK！ <br />
<br />
大家有没有想过为什么只能使用星空极速才能上网呢？而其它软件都会出现&#8220;691&#8221;等类的错误提示？ <br />
<br />
实际上根本问题不是软件问题，而是账号问题。我们每人的宽带账号其实并非真实的账号，真实账号前面 <br />
<br />
比我们的账号前面多两个字符，一般是&#8220;~G&#8221;格式（~和1个大写字母），也有~7（~和1个阿拉伯数字）。 <br />
<br />
比如说电信提供给你的账号是：1234567，而实际你的真实账号是：~G1234567或者~71234567， <br />
<br />
如果用真实账号在XP自带的软件中上网就可以正常登陆。使用星空极速软件，它则将省去部分自动加上拨号。 <br />
<br />
问题我们弄清楚了，就需要搞明白究竟省去的是哪两个字符。&#8220;~&#8221;是固定的，后面的英文字母和数字是不定的， <br />
<br />
有好多网友提供的专业软件进行分析可以解析出是哪两个字符，但是这样太复杂。现在我给大家提供一种 <br />
<br />
相当简单的方法则可以找出。 <br />
<br />
方法如下： <br />
<br />
（关闭星空极速，建议关掉运行中的其它程序） <br />
<br />
开始——控制面板——性能和维护——管理工具——事件查看器——系统（双击）——启动星空极速——刷新事件查看器 <br />
<br />
第一个事件即为使用星空极速拨号的记录，双击该事件后可以在描述栏内看到你的真实宽带账号，即上面所说的格式。 <br />
<br />
得到真实账号后就可以使用自己心爱的拨号软件登陆。 <br />
<br />
声明：该方法成功率为99%，另外1%为不知控制面板是什么东西的网友。 <br />
<br />
当然还有笨办法，字母和数字加起来总数不到40个，不怕麻烦也可以一个个来试着拨号，总有一个是正确的。 <br />
<br />
希望上述能大家有所帮助。让我们摆脱流氓，生活在一个宁静的世界。</span></p>
</div>
<img src ="http://www.blogjava.net/hilor/aggbug/176186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hilor/" target="_blank">hilor</a> 2008-01-18 13:26 <a href="http://www.blogjava.net/hilor/archive/2008/01/18/176186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>