﻿<?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-J2EE社区-随笔分类-JAVA</title><link>http://www.blogjava.net/xcp/category/33476.html</link><description>苟有恒,何必三更起五更眠;&lt;br/&gt;最无益,只怕一日曝十日寒.</description><language>zh-cn</language><lastBuildDate>Mon, 15 Sep 2014 12:04:45 GMT</lastBuildDate><pubDate>Mon, 15 Sep 2014 12:04:45 GMT</pubDate><ttl>60</ttl><item><title>jms activemq完整实例</title><link>http://www.blogjava.net/xcp/archive/2014/09/11/417837.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Thu, 11 Sep 2014 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2014/09/11/417837.html</guid><description><![CDATA[ http://www.cppblog.com/khan/archive/2006/02/13/3236.html<img src ="http://www.blogjava.net/xcp/aggbug/417837.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2014-09-11 13:53 <a href="http://www.blogjava.net/xcp/archive/2014/09/11/417837.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jfinal实例－北京丰帆佳宇运输有限公司</title><link>http://www.blogjava.net/xcp/archive/2014/09/07/417749.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Sun, 07 Sep 2014 12:43:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2014/09/07/417749.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/417749.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2014/09/07/417749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/417749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/417749.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前面学习了一个开源框架Jfinal，并用此框架开发了一个实例网站现进行分享.公司名称：北京丰帆佳宇运输有限公司公司简介：渣土消纳证办理,大型支护土方深度开挖,矿山暗挖,基坑开挖,建筑垃圾清运,渣土清运,砂石料配送,工程机械租赁业务公司网址：www.bjffjy.com&nbsp; &nbsp;&nbsp;1、框架Jfinal+freemarker+mysql&nbsp; &nbsp; &nbsp;...&nbsp;&nbsp;<a href='http://www.blogjava.net/xcp/archive/2014/09/07/417749.html'>阅读全文</a><img src ="http://www.blogjava.net/xcp/aggbug/417749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2014-09-07 20:43 <a href="http://www.blogjava.net/xcp/archive/2014/09/07/417749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2014 年中国开源优秀项目获奖-Jfinal</title><link>http://www.blogjava.net/xcp/archive/2014/09/07/417748.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Sun, 07 Sep 2014 12:14:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2014/09/07/417748.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/417748.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2014/09/07/417748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/417748.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/417748.html</trackback:ping><description><![CDATA[<p>&nbsp;　　开源中国开源世界"高峰论坛（简称"论坛"）每年6月由中国开源软件推进联盟（COPU）主办自2006年起，已成功举办八届，是我国开源界一年一度的盛 会，影响 深远，受到国内外开源组织、人士的高度关注，是开源爱好者获取最新开源讯息的有效平台，有力地促进了开源领域国际与国内、企业与 政府、企业与社区组织之间的合作与发展,已为国内开源界对外交流合作的一个重要窗口。今年第九届论坛已于2014年6月27-28日（周五至 周六）在北京隆重召开。（<a href="http://www.oschina.net/news/53265/2014-good-opensource-projects?from=20140706">http://www.oschina.net/news/53265/2014-good-opensource-projects?from=20140706</a>）<br />&nbsp;&nbsp;&nbsp;&nbsp; 居然开源项目Jfinal排在第一位，于是下定决心研究下。JFinal 是基于 Java 语言的极速 WEB + ORM 框架，其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。 在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率！为您节约更多时间，去陪恋人、家人和朋友 :) <br />&nbsp;&nbsp;&nbsp;&nbsp; 然后花费了３天时间研究下框架，正好帮朋友做一个公司网站，感觉框架不错。<strong>附实例网站</strong>（后面的文章将贴上源代码）</p>
<p>　　公司名称：<a href="http://www.bjffjy.com" target="_blank">北京丰帆佳宇运输有限公司<br /></a>&nbsp;&nbsp; 　公司简介：渣土消纳证办理,大型支护土方深度开挖,矿山暗挖,基坑开挖,建筑垃圾清运,渣土清运,砂石料配送,工程机械租赁业务<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 公司网址：<a href="http://www.bjffjy.com/" target="_blank">www.bjffjy.com</a></p><img src ="http://www.blogjava.net/xcp/aggbug/417748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2014-09-07 20:14 <a href="http://www.blogjava.net/xcp/archive/2014/09/07/417748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j 获取动态参数</title><link>http://www.blogjava.net/xcp/archive/2012/11/06/390894.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 06 Nov 2012 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2012/11/06/390894.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/390894.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2012/11/06/390894.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/390894.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/390894.html</trackback:ping><description><![CDATA[<p>在log中必须先了解log4j自带的两个类MDC和NDC</p><p>NDC和MDC是log4j用于存储应用程序的上下文信息（context infomation），从而便于在log中使用这些上下文信息。<br />NDC采用了一个类似栈的机制来push存储上下文信息，每一个线程都独立地储存上下文信息。比如说一个servlet就可以针对每一个request创建对应的NDC，储存客户端地址等等信息。相关的信息使用NDC.push(message);<br />在log的时候将信息输出。在相应的PatternLayout中使用&#8221;%x&#8221;来输出存储的上下文信息</p><p>例如：String remoteAddr = request.getRemoteAddr();<br />NDC.push(remoteAddr);<br />在log4j.properties文件中作如下的配置即可<br />log4j.appender.console.layout.ConversionPattern=%-d{yyyy/MM/dd HH:mm:ss,SSS} [<span style="color: red;"><strong>%X</strong></span>] -[%c]-[%p] %m%n</p><p><br />&nbsp;</p><p><br />MDC内部使用了类似map的机制来存储信息，相对应的方法，MDC.put(key,value);在配置PatternLayout的时候使用：%x{key}来输出对应的value<br />例如：String remoteAddr = request.getRemoteAddr();<br />MDC.put("ip", remoteAddr); <br />在log4j.properties文件中作如下的配置即可<br />log4j.appender.console.layout.ConversionPattern=%-d{yyyy/MM/dd HH:mm:ss,SSS} [<span style="color: red;"><strong>%X{ip}</strong></span>] -[%c]-[%p] %m%n<br /></p><p>总：如果在项目中有过滤器或者模板Action,你可以把获取公共的属性方法直接定义在里面，然后在配置文件中配置获取显示</p><img src ="http://www.blogjava.net/xcp/aggbug/390894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2012-11-06 16:34 <a href="http://www.blogjava.net/xcp/archive/2012/11/06/390894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于log4j的日志文件保存位置解决方案 （转）</title><link>http://www.blogjava.net/xcp/archive/2012/07/24/383837.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 24 Jul 2012 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2012/07/24/383837.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/383837.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2012/07/24/383837.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/383837.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/383837.html</trackback:ping><description><![CDATA[以DailyRollingFileAppender 为例：假设每天一个日志文件<br />有以下设置：<br /><br />log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender <br />log4j.appender.A1.File=app.log<br />log4j.appender.A1.DatePattern='.'yyyy-MM-dd<br />log4j.appender.A1.layout=org.apache.log4j.PatternLayout<br />log4j.appender.A1.layout.ConversionPattern=%d %5p - %c -%-4r [%t]&nbsp;&nbsp;&nbsp; - %m%n<br /><br />此时生成日志文件将位于tomcat的bin目录下，如要将日志文件保存在 ：根目录/web-info/logs/下，个人有以下4种解决方案：<br />1 绝对路径<br />log4j.appender.A1.File=D:\apache-tomcat-6.0.18/webapps/项目/WEB-INF/logs/app.log<br />但这种写法灵活性很差<br /><br />以下3中使用相同的设置原理： jvm的环境变量<br /> 2：spring的Log4jConfigListener<br />通过以下配置：<br />&lt;context-param&gt;<br />&nbsp;&nbsp;&nbsp; &lt;param-name&gt;webAppRootKey&lt;/param-name&gt;<br />&nbsp;&nbsp;&nbsp; &lt;param-value&gt;webApp.root&lt;/param-value&gt;<br />&nbsp; &lt;/context-param&gt;<br /> &lt;context-param&gt;<br />&nbsp; &lt;param-name&gt;log4jConfigLocation&lt;/param-name&gt;<br />&nbsp;&nbsp;&nbsp; &lt;param-value&gt;classpath:log4j.properties&lt;/param-value&gt;<br /> &lt;/context-param&gt;<br />&lt; listener&gt;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;org.springframework.web.util.Log4jConfigListener&lt;/listener-class&gt; <br /> &lt;/listener&gt;<br />...<br />log4j.appender.logfile.File=${webApp.root}/WEB-INF/logs/app.log<br />...<br />来解决<br /> 2:使用已有jvm变量：<br />例如：<br />&nbsp;&nbsp;&nbsp; log4j.appender.logfile.File=${user.home}/logs/app.log<br />&nbsp; 日志将位于：例如windows：C:\Documents and Settings\joe\logs\app.log<br /><br />3 自己设置目录，也就是在项目启动时通过System.setProperty设置<br />通过实现ServletContextListener来解决：例如<br /><p>public class log4jlistener implements ServletContextListener {</p><p> public static final String log4jdirkey = "log4jdir";<br /> public void contextDestroyed(ServletContextEvent servletcontextevent) {<br />&nbsp; System.getProperties().remove(log4jdirkey);</p><p> }</p><p> public void contextInitialized(ServletContextEvent servletcontextevent) {<br />&nbsp; String log4jdir = servletcontextevent.getServletContext().getRealPath("/");<br />&nbsp; //System.out.println("log4jdir:"+log4jdir);<br />&nbsp; System.setProperty(log4jdirkey, log4jdir);</p><p> }</p><p>}<br />web.xml配置：<br /></p>&lt;listener&gt;<br />&nbsp; &lt;listener-class&gt;com.log4j.log4jlistener&lt;/listener-class&gt;<br /> &lt;/listener&gt;<br /><br />log4j.prtperties 配置：<br />log4j.appender.A1.File=${log4jdir}/WEB-INF/logs/app1.log来解决。<br /><br />参数配置：<br /><a href="http://hi.baidu.com/zhy65991/blog/item/4af01d090e4353dc63d98635.html">http://hi.baidu.com/zhy65991/blog/item/4af01d090e4353dc63d98635.html</a><br /><img src ="http://www.blogjava.net/xcp/aggbug/383837.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2012-07-24 15:06 <a href="http://www.blogjava.net/xcp/archive/2012/07/24/383837.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单东东---关闭占用指定端口的进程</title><link>http://www.blogjava.net/xcp/archive/2011/12/13/366257.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 13 Dec 2011 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/12/13/366257.html</guid><description><![CDATA[<div><font style="background-color: #cce8cf">今天.....<br /><br />
<p>8080端口被其他的应用占用<br />第一步，命令提示符号，执行命令：netstat -ano </p>
<p>可见，占用8080端口的进程的PID是1476 <br /><br />第二步<br />&nbsp; 方法一:<br />&nbsp;&nbsp;&nbsp; 命令提示符号，执行命令：tasklist&nbsp;<br />&nbsp;&nbsp;&nbsp; xxx.exe 1476 Console 0 6,464 K <br />&nbsp;&nbsp;&nbsp; 可见，该占用8080端口的进程是xxx.exe </p>
<p>&nbsp;&nbsp;&nbsp; 通过任务管理器，终止进程xxx.exe </p>&nbsp;方法二:<br />&nbsp;&nbsp;&nbsp; 通过任务管理器,查看菜单,选择列,把PID显示出来<br />&nbsp;&nbsp;&nbsp; 查到对应的PID:1476,终止进程xxx.exe </font></div><img src ="http://www.blogjava.net/xcp/aggbug/366257.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-12-13 16:50 <a href="http://www.blogjava.net/xcp/archive/2011/12/13/366257.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>window linux 自动重启tomcat</title><link>http://www.blogjava.net/xcp/archive/2011/02/14/344277.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Mon, 14 Feb 2011 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2011/02/14/344277.html</guid><description><![CDATA[<p>window</p>
http://hi.baidu.com/heelenyc/blog/item/602bbf11b438a48b6538dbea.html<br />
<br />
<br />
Linux<br />
http://yangrong083.blog.163.com/blog/static/113406097201071633451201/<br />
http://hi.baidu.com/swantt/blog/item/67360608b971f0d862d986b9.html
<img src ="http://www.blogjava.net/xcp/aggbug/344277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2011-02-14 16:55 <a href="http://www.blogjava.net/xcp/archive/2011/02/14/344277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>X-Java:http,session,cookie详解</title><link>http://www.blogjava.net/xcp/archive/2010/12/15/340792.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Wed, 15 Dec 2010 06:44:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/12/15/340792.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/340792.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/12/15/340792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/340792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/340792.html</trackback:ping><description><![CDATA[<p>http,session,cookie一定是困扰了大家许久了的三个词吧。<br />
<br />
下面跟我来。<br />
<br />
HTTP Session<br />
一、浅析<br />
HTTP协议（http://www.w3.org/Protocols/）是&#8220;一次性单向&#8221;协议。<br />
<br />
服务端不能主动连接客户端，只能被动等待并答复客户端请求。客户端连接服务端，发出一个HTTP Request，服务端处理请求，并且返回一个HTTP Response给客户端，本次HTTP Request-Response Cycle结束。<br />
<br />
我们看到，HTTP协议本身并不能支持服务端保存客户端的状态信息。于是，Web Server中引入了session的概念，用来保存客户端的状态信息。<br />
<br />
这里用一个形象的比喻来解释session的工作方式。假设Web Server是一个商场的存包处，HTTP Request是一个顾客，第一次来到存包处，管理员把顾客的物品存放在某一个柜子里面（这个柜子就相当于Session），然后把一个号码牌交给这个顾客，作为取包凭证（这个号码牌就是Session ID）。顾客（HTTP Request）下一次来的时候，就要把号码牌（Session ID）交给存包处（Web Server）的管理员。管理员根据号码牌（Session ID）找到相应的柜子（Session），根据顾客（HTTP Request）的请求，Web Server可以取出、更换、添加柜子（Session）中的物品，Web Server也可以让顾客（HTTP Request）的号码牌和号码牌对应的柜子（Session）失效。顾客（HTTP Request）的忘性很大，管理员在顾客回去的时候（HTTP Response）都要重新提醒顾客记住自己的号码牌（Session ID）。这样，顾客（HTTP Request）下次来的时候，就又带着号码牌回来了。<br />
<br />
Session ID实际上是在客户端和服务端之间通过HTTP Request和HTTP Response传来传去的。号码牌（Session ID）必须包含在HTTP Request里面。关于HTTP Request的具体格式，请参见HTTP协议（http://www.w3.org/Protocols/）。这里只做一个简单的介绍。<br />
<br />
在Java Web Server（即Servlet/JSP Server）中，Session ID用jsessionid表示（请参见Servlet规范）。<br />
<br />
HTTP Request一般由3部分组成：<br />
<br />
（1）Request Line<br />
<br />
这一行由HTTP Method（如GET或POST）、URL、和HTTP版本号组成。<br />
<br />
例如，GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1<br />
<br />
GET http://www.google.com/search?q=Tomcat HTTP/1.1<br />
<br />
POST http://www.google.com/search HTTP/1.1<br />
<br />
GET http://www.somsite.com/menu.do;jsessionid=1001 HTTP/1.1<br />
<br />
&nbsp;<br />
<br />
（2）Request Headers<br />
<br />
这部分定义了一些重要的头部信息，如，浏览器的种类，语言，类型。Request Headers中还可以包括Cookie的定义。例如：<br />
<br />
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)<br />
<br />
Accept-Language: en-us<br />
<br />
Cookie: jsessionid=1001<br />
<br />
&nbsp;<br />
<br />
（3）Message Body<br />
<br />
如果HTTP Method是GET，那么Message Body为空。<br />
<br />
如果HTTP Method是POST，说明这个HTTP Request是submit一个HTML Form的结果，<br />
<br />
那么Message Body为HTML Form里面定义的Input属性。例如，<br />
<br />
user=guest<br />
<br />
password=guest<br />
<br />
jsessionid=1001<br />
<br />
主意，如果把HTML Form元素的Method属性改为GET。那么，Message Body为空，所有的Input属性都会加在URL的后面。你在浏览器的URL地址栏中会看到这些属性，类似于<br />
<br />
http://www.somesite/login.do?user=guest&amp;password=guest&amp;jsessionid=1001<br />
<br />
&nbsp;<br />
<br />
从理论上来说，这3个部分（Request URL，Cookie Header, Message Body）都可以用来存放Session ID。由于Message Body方法必须需要一个包含Session ID的HTML Form，所以这种方法不通用。<br />
<br />
一般用来实现Session的方法有两种：<br />
<br />
（1）URL重写。<br />
<br />
Web Server在返回Response的时候，检查页面中所有的URL，包括所有的连接，和HTML Form的Action属性，在这些URL后面加上&#8220;;jsessionid=XXX&#8221;。<br />
<br />
下一次，用户访问这个页面中的URL。jsessionid就会传回到Web Server。<br />
<br />
（2）Cookie。<br />
<br />
如果客户端支持Cookie，Web Server在返回Response的时候，在Response的Header部分，加入一个&#8220;set-cookie: jsessionid=XXXX&#8221;header属性，把jsessionid放在Cookie里传到客户端。<br />
<br />
客户端会把Cookie存放在本地文件里，下一次访问Web Server的时候，再把Cookie的信息放到HTTP Request的&#8220;Cookie&#8221;header属性里面，这样jsessionid就随着HTTP Request返回给Web Server。<br />
<br />
二、相关资料<br />
前面是我自作聪明的一段个人浅见，下面我来找点权威资料支持。<br />
<br />
http://www.w3.org/Protocols/<br />
<br />
&nbsp;<br />
<br />
Use of HTTP State Management (RFC 2964).<br />
<br />
ftp://ftp.rfc-editor.org/in-notes/rfc2964.txt<br />
<br />
&nbsp;<br />
<br />
这个文件是定义&#8220;HTTP State Management&#8221;扩展协议部分。里面有这么一段，<br />
<br />
It's important to realize that similar capabilities may also be&nbsp;&nbsp;&nbsp; achieved using the "bare" HTTP protocol, and/or dynamically-generated<br />
<br />
HTML, without the State Management extensions.&nbsp; For example, state information can be transmitted from the service to the user by&nbsp;&nbsp;&nbsp; embedding a session identifier in one or more URLs which appear in HTTP redirects, or dynamically generated HTML; and the state information may be returned from the user to the service when such URLs appear in a GET or POST request.&nbsp; HTML forms can also be used to pass state information from the service to the user and back, without the user being aware of this happening.<br />
<br />
&nbsp;<br />
这段话的意思是说，不用这个 &#8220;HTTP State Management&#8221;扩展协议部分，我们也可以用&#8220;纯粹&#8221;的HTTP协议实现Session -- 比如URL重写，HTML Form等。<br />
<br />
这里面没有提到Cookie。因为&#8220;HTTP State Management&#8221; 扩展协议部分本身包括了关于Cookie的内容。这一点可以通过<br />
<br />
HTTP State Management Mechanism (RFC 2965),<br />
<br />
ftp://ftp.rfc-editor.org/in-notes/rfc2965.txt<br />
<br />
看出来。<br />
<br />
&nbsp;<br />
<br />
STATE AND SESSIONS<br />
<br />
This document describes a way to create stateful sessions with HTTP&nbsp;&nbsp;&nbsp; requests and responses.&nbsp; Currently, HTTP servers respond to each&nbsp;&nbsp;&nbsp; client request without relating that request to previous or&nbsp;&nbsp;&nbsp; subsequent requests; the state management mechanism allows clients&nbsp;&nbsp;&nbsp; and servers that wish to exchange state information to place HTTP&nbsp;&nbsp;&nbsp; requests and responses within a larger context, which we term a&nbsp;&nbsp;&nbsp; "session".&nbsp; This context might be used to create, for example, a&nbsp;&nbsp;&nbsp; "shopping cart", in which user selections can be aggregated before&nbsp;&nbsp;&nbsp; purchase, or a magazine browsing system, in which a user's previous&nbsp;&nbsp;&nbsp; reading affects which offerings are presented.<br />
<br />
Neither clients nor servers are required to support cookies.&nbsp; A&nbsp;&nbsp;&nbsp; server MAY refuse to provide content to a client that does not return&nbsp;&nbsp;&nbsp; the cookies it sends.<br />
<br />
&nbsp;<br />
<br />
后面还给出了例子（其中的汉语部分是我加的）。<br />
<br />
&nbsp;<br />
<br />
4.1&nbsp; Example 1<br />
<br />
Most detail of request and response headers has been omitted.&nbsp; Assume<br />
<br />
the user agent has no stored cookies.<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. User Agent -&gt; Server<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POST /acme/login HTTP/1.1<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [form data]<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User identifies self via a form.<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. Server -&gt; User Agent<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP/1.1 200 OK<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set-Cookie2: Customer="WILE_E_COYOTE"; Version="1"; Path="/acme"<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cookie reflects user's identity.<br />
<br />
（这里面的 Customer="WILE_E_COYOTE" 应该就是从Form Data里面来的，这时候又传回给了客户端）<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. User Agent -&gt; Server<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POST /acme/pickitem HTTP/1.1<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cookie: $Version="1"; Customer="WILE_E_COYOTE"; $Path="/acme"<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [form data]<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User selects an item for "shopping basket".<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4. Server -&gt; User Agent<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP/1.1 200 OK<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set-Cookie2: Part_Number="Rocket_Launcher_0001"; Version="1";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Path="/acme"<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shopping basket contains an item.<br />
<br />
（这个火箭发射器显然也是从Form Data来的。但为什么Part_Number="Rocket_Launcher_0001"也需要传回给客户端？<br />
<br />
Customer="WILE_E_COYOTE"; 应该是在传统的&#8221;Set-Cookie&#8221;里面传回给客户端的。&#8221; Set-Cookie2&#8221; 的作用应该是向Cookie里面添加东西。）<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5. User Agent -&gt; Server<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POST /acme/shipping HTTP/1.1<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cookie: $Version="1";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Customer="WILE_E_COYOTE"; $Path="/acme";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Part_Number="Rocket_Launcher_0001"; $Path="/acme"<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [form data]<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User selects shipping method from form.<br />
<br />
&nbsp;<br />
<br />
（客户传给服务器的Cookie里面包括了Customer和Part_Number）<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6. Server -&gt; User Agent<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP/1.1 200 OK<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set-Cookie2: Shipping="FedEx"; Version="1"; Path="/acme"<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; New cookie reflects shipping method.<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7. User Agent -&gt; Server<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; POST /acme/process HTTP/1.1<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cookie: $Version="1";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Customer="WILE_E_COYOTE"; $Path="/acme";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Part_Number="Rocket_Launcher_0001"; $Path="/acme";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Shipping="FedEx"; $Path="/acme"<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [form data]<br />
<br />
&nbsp;<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User chooses to process order.<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8. Server -&gt; User Agent<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HTTP/1.1 200 OK<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Transaction is complete.<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp; The user agent makes a series of requests on the origin server, after each of which it receives a new cookie.&nbsp; All the cookies have the same Path attribute and (default) domain.&nbsp; Because the request-URIs all path-match /acme, the Path attribute of each cookie, each request contains all the cookies received so far.<br />
<br />
（看到这里，我才大致明白，原来那个$Path="/acme" 大致起着 JSessionID的作用）<br />
<br />
&nbsp;<br />
<br />
三、Tomcat5的HTTP Session实现<br />
下面我们来看Tomcat5的源代码如何支持HTTP 1.1 Session。<br />
<br />
我们可以用jsessionid, Set-Cookie等关键字搜索Tomcat5源代码。<br />
<br />
&nbsp;<br />
<br />
首先，我们来看常量定义：<br />
<br />
org.apache.catalina.Globals<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; /**<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; * The name of the cookie used to pass the session identifier back<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; * and forth with the client.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
<br />
&nbsp;&nbsp;&nbsp; public static final String SESSION_COOKIE_NAME = "JSESSIONID";<br />
<br />
&nbsp;<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; /**<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; * The name of the path parameter used to pass the session identifier<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; * back and forth with the client.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
<br />
public static final String SESSION_PARAMETER_NAME = "jsessionid";<br />
<br />
&nbsp;<br />
<br />
Cookie里面用大写的JSESSIONID，URL后缀用的是小写的jsessionid。<br />
<br />
Session 的具体实现类是org.apache.catalina.session.StandardSession。一个Tomcat Server的所有Session都由一个Manager（拥有一个Context）统一管理。我估计有一个 Session Listener 专门管理Cluster之间的Session数据复制，具体的我没有追查下去。<br />
<br />
&nbsp;<br />
<br />
另外几个重要的相关类是org.apache.coyote.tomcat5包下面的CoyoteRequest , CoyoteResponse, CoyoteAdapter三个类。<br />
<br />
&nbsp;<br />
<br />
org.apache.coyote.tomcat5.CoyoteResponse类的toEncoded()方法支持URL重写。<br />
<br />
String toEncoded(String url, String sessionId) {<br />
<br />
&#8230;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sb = new StringBuffer(path);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( sb.length() &gt; 0 ) { // jsessionid can't be first.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(";jsessionid=");<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(sessionId);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(anchor);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(query);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (sb.toString());<br />
<br />
}<br />
<br />
&nbsp;<br />
<br />
我们来看org.apache.coyote.tomcat5.CoyoteRequest的两个方法configureSessionCookie()<br />
<br />
doGetSession()用Cookie支持jsessionid.<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; /**<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; * Configures the given JSESSIONID cookie.<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; *<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; * @param cookie The JSESSIONID cookie to be configured<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
<br />
&nbsp;&nbsp;&nbsp; protected void configureSessionCookie(Cookie cookie) {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br />
<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp; HttpSession doGetSession(boolean create){<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Creating a new session cookie based on that session<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((session != null) &amp;&amp; (getContext() != null)<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; getContext().getCookies()) {<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cookie cookie = new Cookie(Globals.SESSION_COOKIE_NAME,<br />
<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.getId());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configureSessionCookie(cookie);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((HttpServletResponse) response).addCookie(cookie);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;<br />
<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;<br />
<br />
四、More<br />
HTTP Session的协议、规范、实现大概就是这些。<br />
<br />
另外，在frameset中使用Session的情况有些复杂，不同环境表现可能不同。<br />
<br />
其余相关的概念有&#8220;单点登录&#8221;(Sing Sign On &#8211; SSO), Domain, Cluster, Proxy, Cache等。</p>
<img src ="http://www.blogjava.net/xcp/aggbug/340792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-12-15 14:44 <a href="http://www.blogjava.net/xcp/archive/2010/12/15/340792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java EE和Domino系统间跨域SSO的实现</title><link>http://www.blogjava.net/xcp/archive/2010/12/14/340561.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Mon, 13 Dec 2010 16:11:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/12/14/340561.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/340561.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/12/14/340561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/340561.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/340561.html</trackback:ping><description><![CDATA[<p>http://jimmy-shine.javaeye.com/blog/120964</p>
<img src ="http://www.blogjava.net/xcp/aggbug/340561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-12-14 00:11 <a href="http://www.blogjava.net/xcp/archive/2010/12/14/340561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 实现自动监听并更新配置文件内容</title><link>http://www.blogjava.net/xcp/archive/2010/11/05/337308.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Fri, 05 Nov 2010 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/11/05/337308.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/337308.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/11/05/337308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/337308.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/337308.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
自动监听器 PropertiesListener<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.stephencat.listener;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*&nbsp;自动监听器<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;stephen<br />
&nbsp;*<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PropertiesListener&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ServletContextListener&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;自动监听时钟<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;PropertiesTimer&nbsp;rt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;contextInitialized(ServletContextEvent&nbsp;event)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;status&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Properties&nbsp;listener&nbsp;start&nbsp;.</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.getServletContext().log(status);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(status);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;激活自动监听时钟</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PropertiesTimer(</span><span style="color: #000000">15</span><span style="color: #000000">,&nbsp;event.getServletContext());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rt.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;contextDestroyed(ServletContextEvent&nbsp;event)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;status&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Properties&nbsp;listener&nbsp;stop&nbsp;.</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;event.getServletContext().log(status);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(status);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;停止自动监听时钟</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(rt&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rt.stop();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
自动监听时钟 PropertiesTimer<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.stephencat.listener;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<br />
<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*&nbsp;自动监听时钟<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;stephen<br />
&nbsp;*<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PropertiesTimer&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Timer&nbsp;timer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Timer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sec;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;ServletContext&nbsp;context&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;PropertiesTimer(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;seconds,&nbsp;ServletContext&nbsp;context)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sec&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;seconds;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.context&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;context;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;启动自动监听任务<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;start()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;取得当前日期时间</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;date&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Date();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;执行自动监听计划</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.schedule(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PropertiesTask(</span><span style="color: #0000ff">this</span><span style="color: #000000">.context),&nbsp;date,&nbsp;sec&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;停止自动监听任务<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;stop()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.cancel();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
自动监听任务 PropertiesTask<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;org.stephencat.listener;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.IOException;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.servlet.</span><span style="color: #000000">*</span><span style="color: #000000">;<br />
</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;*&nbsp;自动监听任务<br />
&nbsp;*&nbsp;</span><span style="color: #808080">@author</span><span style="color: #008000">&nbsp;stephen<br />
&nbsp;*<br />
&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PropertiesTask&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;TimerTask&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;ServletContext&nbsp;context&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;配置文件的最后更新时间<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;lastModified&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;构造一个自动更新任务<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;context<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;PropertiesTask(ServletContext&nbsp;context){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.context&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;context;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">A&nbsp;task&nbsp;instance&nbsp;is&nbsp;created&nbsp;now.</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;任务在整个&nbsp;application&nbsp;周期内只创建一次。</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;每次执行任务时显示一个随机数。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;todoTestRandom(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Task&nbsp;running</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.setAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">random</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;String.valueOf(Math.random()));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println((String)context.getAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">random</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;监听配置文件是否被更新。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;todoTestFileStatus(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Getting&nbsp;file&nbsp;status</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">this</span><span style="color: #000000">.isFileUpdated(</span><span style="color: #000000">"</span><span style="color: #000000">WEB-INF/platforms/test.properties</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;监听配置文件是否被更新，自动更新文件中的配置项存储到&nbsp;application&nbsp;变量中。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;todo(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;filename&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">WEB-INF/platforms/test.properties</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #0000ff">this</span><span style="color: #000000">.isFileUpdated(filename)){<br />
&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;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Getting&nbsp;properties</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.loadProperties(</span><span style="color: #000000">"</span><span style="color: #000000">test</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">catch</span><span style="color: #000000">(IOException&nbsp;ioe){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(ioe.getMessage());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Test&nbsp;value&nbsp;is:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.getTestProperty(</span><span style="color: #000000">"</span><span style="color: #000000">name</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;todoTestRandom();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;todo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">todo();</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;判断物理文件是否已被更新<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;filename&nbsp;物理文件名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;是&nbsp;true&nbsp;否&nbsp;false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;isFileUpdated(String&nbsp;filename){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;File(context.getRealPath(filename));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(file.isFile()){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;lastUpdateTime&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;file.lastModified();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(lastUpdateTime&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.lastModified){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">The&nbsp;properties&nbsp;file&nbsp;was&nbsp;modified.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.lastModified&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lastUpdateTime;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">The&nbsp;properties&nbsp;file&nbsp;was&nbsp;not&nbsp;modified.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">The&nbsp;path&nbsp;does&nbsp;not&nbsp;point&nbsp;to&nbsp;a&nbsp;file.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取配置文件<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;key<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;filename<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;loadProperties(String&nbsp;key,&nbsp;String&nbsp;filename)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;prop&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Properties();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;stream&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;context.getResourceAsStream(filename);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prop.load(stream);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(stream</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stream.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.setAttribute(key,&nbsp;prop);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">/**</span><span style="color: #008000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;从&nbsp;application&nbsp;取配置项的值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;key&nbsp;配置项的键名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000">&nbsp;配置项的值<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getTestProperty(String&nbsp;key){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;prop&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Properties)context.getAttribute(</span><span style="color: #000000">"</span><span style="color: #000000">test</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(prop</span><span style="color: #000000">==</span><span style="color: #0000ff">null</span><span style="color: #000000">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(String)prop.get(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<br />
web.xml 配置<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="GB18030"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">web-app&nbsp;</span><span style="color: #ff0000">version</span><span style="color: #0000ff">="2.4"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff">="http://java.sun.com/xml/ns/j2ee&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.stephencat.listener.PropertiesListener</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span></div>
<br />
在 WEB-INF 目录下增加 platforms/test.properties 文件<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #000000">name</span><span style="color: #000000">=</span><span style="color: #000000">Stephen&nbsp;Wong<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
<br />
启动应用服务器，控制台输出如下：<br />
<br />
11:30:31,000 INFO&nbsp; [TomcatDeployer] undeploy, ctxPath=/ServerTest, warUrl=.../deploy/ServerTest.war/<br />
11:30:31,000 INFO&nbsp; [[/ServerTest]] Properties listener stop .<br />
11:30:31,000 INFO&nbsp; [STDOUT] Properties listener stop .<br />
11:30:31,046 INFO&nbsp; [TomcatDeployer] deploy, ctxPath=/ServerTest, warUrl=.../deploy/ServerTest.war/<br />
11:30:31,359 INFO&nbsp; [[/ServerTest]] Properties listener start .<br />
11:30:31,359 INFO&nbsp; [STDOUT] Properties listener start .<br />
11:30:31,375 INFO&nbsp; [STDOUT] A task instance is created now.<br />
11:30:31,390 INFO&nbsp; [STDOUT] Task running<br />
11:30:31,390 INFO&nbsp; [STDOUT] 0.9924364802139768<br />
11:30:31,390 INFO&nbsp; [STDOUT] The properties file was modified.<br />
11:30:31,390 INFO&nbsp; [STDOUT] Getting properties<br />
11:30:31,390 INFO&nbsp; [STDOUT] Test value is: Stephen<br />
11:30:46,390 INFO&nbsp; [STDOUT] Task running<br />
11:30:46,390 INFO&nbsp; [STDOUT] 0.24869896604923036<br />
11:30:46,390 INFO&nbsp; [STDOUT] The properties file was not modified.<br />
11:30:46,390 INFO&nbsp; [STDOUT] Test value is: Stephen<br />
11:31:01,390 INFO&nbsp; [STDOUT] Task running<br />
11:31:01,390 INFO&nbsp; [STDOUT] 0.47994173379307203<br />
11:31:01,390 INFO&nbsp; [STDOUT] The properties file was not modified.<br />
11:31:01,390 INFO&nbsp; [STDOUT] Test value is: Stephen<br />
11:31:16,390 INFO&nbsp; [STDOUT] Task running<br />
11:31:16,390 INFO&nbsp; [STDOUT] 0.6379331056768383<br />
11:31:16,390 INFO&nbsp; [STDOUT] The properties file was modified.<br />
11:31:16,390 INFO&nbsp; [STDOUT] Getting properties<br />
11:31:16,390 INFO&nbsp; [STDOUT] Test value is: Stephen Wong<br />
11:31:31,390 INFO&nbsp; [STDOUT] Task running<br />
11:31:31,390 INFO&nbsp; [STDOUT] 0.30415561271978353<br />
11:31:31,390 INFO&nbsp; [STDOUT] The properties file was not modified.<br />
11:31:31,390 INFO&nbsp; [STDOUT] Test value is: Stephen Wong<br />
11:31:46,390 INFO&nbsp; [STDOUT] Task running<br />
11:31:46,390 INFO&nbsp; [STDOUT] 0.03696303208126983<br />
11:31:46,390 INFO&nbsp; [STDOUT] The properties file was not modified.<br />
11:31:46,390 INFO&nbsp; [STDOUT] Test value is: Stephen Wong<br />
<div style="display: none" id="c_jquery_test"></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<span style="color: red; font-size: 24pt">我自己地例子<br />
<br />
</span>
<p>package cn.gov.luzhou.SiteServer.gate.web.filter;</p>
<p>import javax.servlet.ServletContext;<br />
import javax.servlet.ServletContextEvent;<br />
import javax.servlet.ServletContextListener;</p>
<p>import cn.gov.luzhou.SiteServer.gate.buiness.service.SysUserService;<br />
import cn.gov.luzhou.SiteServer.gate.buiness.util.AppContext;</p>
<p>/**<br />
&nbsp;*<br />
&nbsp;* @author&nbsp; 向才鹏<br />
&nbsp;* @version&nbsp; 1.0<br />
&nbsp;* Copyright (C), 2009,www.soujava.cn所有<br />
&nbsp;* Program Name:鹏哥伟业<br />
&nbsp;* Date: Nov 5, 2010 10:41:34 AM<br />
&nbsp;*/<br />
@SuppressWarnings("unused")<br />
public class PropertiesListener implements ServletContextListener{<br />
&nbsp;private SysUserService userSev;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp; private PropertiesTimer rt = null;<br />
&nbsp;&nbsp;&nbsp; public void contextInitialized(ServletContextEvent event) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String status = "updatecenter listener start .";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.getServletContext().log(status);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletContext sc = event.getServletContext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(sc.getInitParameter("udpateCenterSwitch").equals("open")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; userSev = (SysUserService) AppContext.getBean("sysUserService");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 激活自动监听时钟<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rt = new PropertiesTimer(15,sc,userSev);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rt.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void contextDestroyed(ServletContextEvent event) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String status = "updatecenter listener stop .";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event.getServletContext().log(status);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(status);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 停止自动监听时钟<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (rt != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rt.stop();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userSev = null;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; <br />
&nbsp;public SysUserService getUserSev() {<br />
&nbsp;&nbsp;return userSev;<br />
&nbsp;}</p>
<p>&nbsp;public void setUserSev(SysUserService userSev) {<br />
&nbsp;&nbsp;this.userSev = userSev;<br />
&nbsp;}</p>
<p>&nbsp;public PropertiesTimer getRt() {<br />
&nbsp;&nbsp;return rt;<br />
&nbsp;}</p>
<p>&nbsp;public void setRt(PropertiesTimer rt) {<br />
&nbsp;&nbsp;this.rt = rt;<br />
&nbsp;}<br />
}</p>
<br />
<br />
<br />
<br />
<p>package cn.gov.luzhou.SiteServer.gate.web.filter;</p>
<p>import java.util.Date;<br />
import java.util.Timer;</p>
<p>import javax.servlet.ServletContext;</p>
<p>import cn.gov.luzhou.SiteServer.gate.buiness.service.SysUserService;</p>
<p><br />
/**<br />
&nbsp;*<br />
&nbsp;* @author&nbsp; 向才鹏<br />
&nbsp;* @version&nbsp; 1.0<br />
&nbsp;* Copyright (C), 2009,www.soujava.cn所有<br />
&nbsp;* Program Name:鹏哥伟业<br />
&nbsp;* Date: Nov 5, 2010 10:59:46 AM<br />
&nbsp;*/<br />
public class PropertiesTimer {<br />
&nbsp;private final Timer timer = new Timer();<br />
&nbsp;&nbsp;&nbsp; private final int sec;<br />
&nbsp;&nbsp;&nbsp; private ServletContext context = null;<br />
&nbsp;&nbsp;&nbsp; private SysUserService userSev = null;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public PropertiesTimer(int seconds, ServletContext context,SysUserService userSev) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sec = seconds;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.context = context;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 启动自动监听任务<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void start() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 取得当前日期时间<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date date = new Date();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 执行自动监听计划<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer.schedule(new PropertiesTask(this.context,userSev), date, sec * 1000);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp;&nbsp;&nbsp;&nbsp; * 停止自动监听任务<br />
&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void stop() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timer.cancel();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; userSev = null;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<br />
<br />
<br />
<br />
<p>package cn.gov.luzhou.SiteServer.gate.web.filter;</p>
<p>import java.sql.Timestamp;<br />
import java.util.Calendar;<br />
import java.util.TimerTask;</p>
<p>import javax.servlet.ServletContext;</p>
<p>import cn.gov.luzhou.SiteServer.gate.buiness.service.SysUserService;<br />
import cn.gov.luzhou.SiteServer.gate.buiness.util.AppContext;</p>
<p>public class PropertiesTask extends TimerTask{<br />
&nbsp;private ServletContext context = null;<br />
&nbsp;SysUserService userSev = null;<br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp; * 构造一个自动更新任务<br />
&nbsp; * @param context<br />
&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public PropertiesTask(ServletContext context,SysUserService ttt){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.context = context;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ttt==null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;this.userSev = (SysUserService) AppContext.getBean("sysUserService");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;this.userSev = ttt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public void run() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; todoTestRandom();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; todo();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp; * 每次执行任务时显示一个随机数。<br />
&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void todoTestRandom(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.setAttribute("random", String.valueOf(Math.random()));<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; /**<br />
&nbsp; * 自动更新文件中的配置项存储到 application 变量中。<br />
&nbsp; */<br />
&nbsp;&nbsp;&nbsp; public void todo(){<br />
&nbsp;&nbsp;&nbsp; &nbsp;Timestamp st = new Timestamp(Calendar.getInstance().getTimeInMillis());<br />
&nbsp;&nbsp;&nbsp; &nbsp;context.log(st.toString()+"自动更新了数据");<br />
&nbsp;&nbsp;&nbsp; &nbsp;userSev.updateAll();<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
<br />
<script type="text/javascript">
if ($ != jQuery) {
	$ = jQuery.noConflict();
}
</script>
<img src ="http://www.blogjava.net/xcp/aggbug/337308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-11-05 11:49 <a href="http://www.blogjava.net/xcp/archive/2010/11/05/337308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FCK编辑区的背景色 FCK工具条的背景 修改</title><link>http://www.blogjava.net/xcp/archive/2010/11/04/337254.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Thu, 04 Nov 2010 11:04:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/11/04/337254.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/337254.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/11/04/337254.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/337254.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/337254.html</trackback:ping><description><![CDATA[1、设置FCKeditor编辑区的背景色如果改css的话，就直接修改/fckeditor/editor/css/fck_editorarea.css文件就可以了<br />
<br />
body<br />
{<br />
background-color: #ffffff;<br />
padding: 5px 5px 5px 5px;<br />
margin: 0px;<br />
}<br />
<br />
2、设置FCK工具条的背景，在fckeditor/editor/skin/各自不同的主题/fck_editor.css文件就可以了<br />
<br />
body<br />
{<br />
&nbsp;padding: 1px;<br />
&nbsp;margin: 0;<br />
&nbsp;background-color: #ffffff;<br />
}<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/xcp/aggbug/337254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-11-04 19:04 <a href="http://www.blogjava.net/xcp/archive/2010/11/04/337254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关闭页面</title><link>http://www.blogjava.net/xcp/archive/2010/10/25/336124.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Mon, 25 Oct 2010 13:39:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/10/25/336124.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/336124.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/10/25/336124.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/336124.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/336124.html</trackback:ping><description><![CDATA[1.当我在列表页面点击新增时，用lhgdialog弹出一个新增子窗口<br />
2.当新增完毕后，我们平时的做法，是调整到列表页面，可是这的话，就会出现将列表页面显示在子窗口<br />
<br />
所以解决办法：<br />
a.返回子窗口，用户在点击关闭一次（附：onunload="javascript:D.document.location.reload();"）&nbsp;<br />
b.在服务端写一个request.setAttribute("close","window.document.close();")<br />
&nbsp;&nbsp; 在新增页面：&lt;script&gt;${requestScope.close}&lt;/script&gt;
<img src ="http://www.blogjava.net/xcp/aggbug/336124.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-10-25 21:39 <a href="http://www.blogjava.net/xcp/archive/2010/10/25/336124.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Myeclipse中相同变量高亮显示</title><link>http://www.blogjava.net/xcp/archive/2010/08/24/329834.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 24 Aug 2010 13:28:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/08/24/329834.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/329834.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/08/24/329834.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/329834.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/329834.html</trackback:ping><description><![CDATA[今天不晓得杂弄得。。把相同变量高亮显示弄得不见了。。。 <br />
<br />
<strong>关键字: eclipse 高亮 相同变量</strong>
<div class="blog_content">
<p>在eclipse/myeclipse中如果不小心把变量的高亮显示弄丢了。可真是件愁人的事，不过看到这你就不用愁了</p>
<p><font color="#ff9900">windows-&gt; preferences-&gt; java-&gt; Editor-&gt; Mark Occurences</font> <br />
<br />
最上边的大标题的复选框<font color="#ff9900">勾上</font>，下面的就都可以高亮显示了，Local variables是变量的高亮显示</p>
</div>
<img src ="http://www.blogjava.net/xcp/aggbug/329834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-08-24 21:28 <a href="http://www.blogjava.net/xcp/archive/2010/08/24/329834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP的内置(隐含)对象及EL表达式的内置(隐含)对象</title><link>http://www.blogjava.net/xcp/archive/2010/07/24/327005.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Sat, 24 Jul 2010 04:40:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/07/24/327005.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/327005.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/07/24/327005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/327005.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/327005.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font size="4">JSP中的内置对象一共有九个, 由于有的不太常用, 所以总是记不住, 从Sun公司的网站上找到的PDF文档, 把这一部分放在这里, 以备随时查用:</font>&nbsp;<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<table style="width: 869pt; border-collapse: collapse" border="0" cellspacing="0" cellpadding="0" width="1157" x:str>
    <tbody>
        <tr style="height: 54pt" height="72">
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; background-color: transparent; width: 229pt; height: 54pt; border-top: windowtext 1pt solid; border-right: black 0.5pt solid" class="xl32" height="72" width="305" colspan="2"><font color="#0000ff" size="3" face="宋体"><strong>Implicit Objects for Scriptlets<br />
            (JSP Scriplets中的隐含对象)</strong></font></td>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext; background-color: transparent; width: 269pt; border-top: windowtext 1pt solid; border-right: windowtext 0.5pt solid" class="xl26" width="358"><font color="#0000ff" size="3" face="宋体"><strong>Type<br />
            (对应类型)</strong></font></td>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext; background-color: transparent; width: 77pt; border-top: windowtext 1pt solid; border-right: windowtext 0.5pt solid" class="xl26" width="102"><font color="#0000ff" size="3" face="宋体"><strong>Scope<br />
            (范围)</strong></font></td>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext; background-color: transparent; width: 294pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid" class="xl27" width="392"><strong><font color="#0000ff"><font size="3"><font face="宋体">&nbsp;Some Useful Methods (see class or interface for others)<br />
            (常用的方法)</font></font></font></strong></td>
        </tr>
        <tr style="height: 28.5pt" height="38">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 28.5pt; border-top: #ece9d8; border-right: #ece9d8" class="xl34" height="38" align="right" x:num><font size="3" face="宋体">1</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; border-top: #ece9d8; border-right: windowtext 0.5pt solid" class="xl24"><strong><font size="3" face="宋体">request</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: #ece9d8; border-right: windowtext 0.5pt solid" class="xl25"><font size="3" face="宋体">Subclass of javax.servlet.ServletRequest</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: #ece9d8; border-right: windowtext 0.5pt solid" class="xl25"><font size="3" face="宋体">Request</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 294pt; border-top: #ece9d8; border-right: windowtext 1pt solid" class="xl28" width="392"><font size="3" face="宋体">getAttribute, getParameter, getParameterNames, getParameterValues, setAttribute</font></td>
        </tr>
        <tr style="height: 14.25pt" height="19">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 14.25pt; border-top: windowtext; border-right: #ece9d8" class="xl35" height="19" align="right" x:num><font size="3" face="宋体">2</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl23"><strong><font size="3" face="宋体">response</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">Subclass of javax.servlet.ServletResponse</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">Page</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 294pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl29" width="392"><font size="3" face="宋体">Not typically used by JSP page authors</font></td>
        </tr>
        <tr style="height: 28.5pt" height="38">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 28.5pt; border-top: windowtext; border-right: #ece9d8" class="xl35" height="38" align="right" x:num><font size="3" face="宋体">3</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl23"><strong><font size="3" face="宋体">pageContext</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">javax.servlet.jsp.PageContext</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">Page</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 294pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl29" width="392"><font size="3" face="宋体">findAttribute, getAttribute, getAttributesScope, getAttributeNamesInScope, setAttribute</font></td>
        </tr>
        <tr style="height: 14.25pt" height="19">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 14.25pt; border-top: windowtext; border-right: #ece9d8" class="xl35" height="19" align="right" x:num><font size="3" face="宋体">4</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl23"><strong><font size="3" face="宋体">session</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">javax.servlet.http.HttpSession</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">Session</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 294pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl29" width="392"><font size="3" face="宋体">getAttribute, getId, setAttribute</font></td>
        </tr>
        <tr style="height: 28.5pt" height="38">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 28.5pt; border-top: windowtext; border-right: #ece9d8" class="xl35" height="38" align="right" x:num><font size="3" face="宋体">5</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl23"><strong><font size="3" face="宋体">application</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">javax.servlet.ServletContext</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">Application</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 294pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl29" width="392"><font size="3" face="宋体">getAttribute, getMimeType, getRealPath, setAttribute</font></td>
        </tr>
        <tr style="height: 28.5pt" height="38">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 28.5pt; border-top: windowtext; border-right: #ece9d8" class="xl35" height="38" align="right" x:num><font size="3" face="宋体">6</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl23"><strong><font size="3" face="宋体">out</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">javax.servlet.jsp.JspWriter</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">Page</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 294pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl29" width="392"><font size="3" face="宋体">clear, clearBuffer, flush, getBufferSize, getRemaining</font></td>
        </tr>
        <tr style="height: 14.25pt" height="19">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 14.25pt; border-top: windowtext; border-right: #ece9d8" class="xl35" height="19" align="right" x:num><font size="3" face="宋体">7</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl23"><strong><font size="3" face="宋体">config</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">javax.servlet.ServletConfig</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">Page</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 294pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl29" width="392"><font size="3" face="宋体">getInitParameter, getInitParameterNames</font></td>
        </tr>
        <tr style="height: 14.25pt" height="19">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 14.25pt; border-top: windowtext; border-right: #ece9d8" class="xl35" height="19" align="right" x:num><font size="3" face="宋体">8</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl23"><strong><font size="3" face="宋体">page</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">java.lang.Object</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl22"><font size="3" face="宋体">Page</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 294pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl29" width="392"><font size="3" face="宋体">Not typically used by JSP page authors</font></td>
        </tr>
        <tr style="height: 29.25pt" height="39">
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 29.25pt; border-top: windowtext; border-right: #ece9d8" class="xl36" height="39" align="right" x:num><font size="3" face="宋体">9</font></td>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 0.5pt solid; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl37"><strong><font size="3" face="宋体">exception</font></strong></td>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl30"><font size="3" face="宋体">java.lang.Throwable</font></td>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl30"><font size="3" face="宋体">Page</font></td>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext; background-color: transparent; width: 294pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl31" width="392"><font size="3" face="宋体">getMessage, getLocalizedMessage, printStackTrace, toString</font></td>
        </tr>
    </tbody>
</table>
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<div><font size="4">JSP十一个用于EL表达式的隐含(内置)对象:</font></div>
<div>
<table style="width: 812pt; border-collapse: collapse" border="0" cellspacing="0" cellpadding="0" width="1082" x:str>
    <colgroup>
    <col style="width: 157pt; mso-width-source: userset; mso-width-alt: 6688" width="209">
    <col style="width: 197pt; mso-width-source: userset; mso-width-alt: 8384" width="262">
    <col style="width: 458pt; mso-width-source: userset; mso-width-alt: 19552" width="611">
    <tbody>
        <tr style="height: 57.75pt; mso-height-source: userset" height="77">
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; background-color: transparent; width: 157pt; height: 57.75pt; border-top: windowtext 1pt solid; border-right: windowtext 0.5pt solid" class="xl26" height="77" width="209"><font color="#0000ff" size="3" face="宋体"><strong>Implicit Objects for EL<br />
            Expressions<br />
            用于EL表达式的隐含对象</strong></font></td>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext; background-color: transparent; width: 197pt; border-top: windowtext 1pt solid; border-right: windowtext 0.5pt solid" class="xl27" width="262"><font color="#0000ff" size="3" face="宋体"><strong>Type<br />
            类型</strong></font></td>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext; background-color: transparent; width: 458pt; border-top: windowtext 1pt solid; border-right: windowtext 1pt solid" class="xl28" width="611"><font color="#0000ff" size="3" face="宋体"><strong>Description<br />
            具体说明</strong></font></td>
        </tr>
        <tr style="height: 28.5pt" height="38">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 28.5pt; border-top: #ece9d8; border-right: windowtext 0.5pt solid" class="xl29" height="38"><strong><font size="3" face="宋体">pageContext</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: #ece9d8; border-right: windowtext 0.5pt solid" class="xl25"><font size="3" face="宋体">javax.servlet.jsp.PageContext</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 458pt; border-top: #ece9d8; border-right: windowtext 1pt solid" class="xl30" width="611"><font size="3" face="宋体">The context for the JSP page. Provides access to various objects, including servletContext, session, request, and response.</font></td>
        </tr>
        <tr style="height: 14.25pt" height="19">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 14.25pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl31" height="19"><strong><font size="3" face="宋体">pageScope</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl24"><font size="3" face="宋体">java.util.Map</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 458pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl32" width="611"><font size="3" face="宋体">Maps page-scoped variable names to their values.</font></td>
        </tr>
        <tr style="height: 14.25pt" height="19">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 14.25pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl31" height="19"><strong><font size="3" face="宋体">requestScope</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl24"><font size="3" face="宋体">java.util.Map</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 458pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl32" width="611"><font size="3" face="宋体">Maps request-scoped variable names to their values.</font></td>
        </tr>
        <tr style="height: 14.25pt" height="19">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 14.25pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl31" height="19"><strong><font size="3" face="宋体">sessionScope</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl24"><font size="3" face="宋体">java.util.Map</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 458pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl32" width="611"><font size="3" face="宋体">Maps session-scoped variable names to their values.</font></td>
        </tr>
        <tr style="height: 14.25pt" height="19">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 14.25pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl31" height="19"><strong><font size="3" face="宋体">applicationScope</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl24"><font size="3" face="宋体">java.util.Map</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 458pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl32" width="611"><font size="3" face="宋体">Maps application-scoped variable names to their values.</font></td>
        </tr>
        <tr style="height: 28.5pt" height="38">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 28.5pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl31" height="38"><strong><font size="3" face="宋体">param</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl24"><font size="3" face="宋体">java.util.Map</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 458pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl32" width="611"><font size="3" face="宋体">Maps a request parameter to a single String parameter value (obtained by calling ServletReqwuest.getParameter(String name)).</font></td>
        </tr>
        <tr style="height: 42.75pt" height="57">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 42.75pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl31" height="57"><strong><font size="3" face="宋体">paramValues</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl24"><font size="3" face="宋体">java.util.Map</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 458pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl32" width="611"><font size="3" face="宋体">Maps a request parameter name to an array of String values for that parameter name (obtained by calling ServletRequest.getParameterValues(String name)).</font></td>
        </tr>
        <tr style="height: 28.5pt" height="38">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 28.5pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl31" height="38"><strong><font size="3" face="宋体">header</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl24"><font size="3" face="宋体">java.util.Map</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 458pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl32" width="611"><font size="3" face="宋体">Maps a request header name to a single String header value (obtained by calling ServletRequest.getHeader(String name)).</font></td>
        </tr>
        <tr style="height: 28.5pt" height="38">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 28.5pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl31" height="38"><strong><font size="3" face="宋体">headerValues</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl24"><font size="3" face="宋体">java.util.Map</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 458pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl32" width="611"><font size="3" face="宋体">Maps a request header name to an array of String values for that header (obtained by calling ServletRequest.getHeaders(String)).</font></td>
        </tr>
        <tr style="height: 85.5pt" height="114">
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 85.5pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl31" height="114"><strong><font size="3" face="宋体">coookie</font></strong></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl24"><font size="3" face="宋体">java.util.Map</font></td>
            <td style="border-bottom: windowtext 0.5pt solid; border-left: windowtext; background-color: transparent; width: 458pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl32" width="611"><font size="3" face="宋体">Maps a cookie name to a single Cookie object. Cookies are retrieved according to the semantics of HttpServletRequest.getCookies(). If the same name is shared by multiple cookies, an implementation must use the first one encountered in the array of Cookie objects returned by the getCookies() method. However, the ordering of cookies is currently unsspecified in the Servlet specification.</font></td>
        </tr>
        <tr style="height: 29.25pt" height="39">
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext 1pt solid; background-color: transparent; height: 29.25pt; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl33" height="39"><strong><font size="3" face="宋体">initParam</font></strong></td>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext; background-color: transparent; border-top: windowtext; border-right: windowtext 0.5pt solid" class="xl34"><font size="3" face="宋体">java.util.Map</font></td>
            <td style="border-bottom: windowtext 1pt solid; border-left: windowtext; background-color: transparent; width: 458pt; border-top: windowtext; border-right: windowtext 1pt solid" class="xl35" width="611"><font size="3" face="宋体">Maps a context initialization parameter name to a String parameter value (obtained by calling ServletContext.getInitparameter(String name)).</font></td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/xcp/aggbug/327005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-07-24 12:40 <a href="http://www.blogjava.net/xcp/archive/2010/07/24/327005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TagLib的学习 </title><link>http://www.blogjava.net/xcp/archive/2010/07/09/325617.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Fri, 09 Jul 2010 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/07/09/325617.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/325617.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/07/09/325617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/325617.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/325617.html</trackback:ping><description><![CDATA[<p><font size="2"><strong style="font-size: 14pt">http://wenku.baidu.com/view/a6e7f4d233d4b14e8524686a.html</strong></font><br />
<br />
<br />
前言： TagLib可以使程序员自己开发JSP标签，并且可以重复利用。</p>
<p><strong>Part 1 TagLib比JavaBean的优势是什么？</strong><br />
1．&nbsp; 方便处理网页内容的数据<br />
2．&nbsp; 网页美工使用TagLib感觉更顺手</p>
<p><strong>Part 2 如何制作和使用TagLib？</strong><br />
涉及4个方面：1.标记处理类 ;2.标记描述文件; 3.JSP 页面中用&lt;% @&nbsp; taglib %&gt;引入标签; 4.在Web.xml中描述标签描述文件的位置(可选).</p>
<p><strong>Part 3 标记处理类的API介绍</strong><br />
主要涉及javax.servlet.jsp.tagext和javax.servlet.jsp两个包。Jsp包中主要使用JspWriter 和PageContext类，相当与隐藏对象out和pageContext，不细介绍，下面关键介绍tagext包。<br />
Tagext包中有两个接口Tag,BodyTag和9个类BodyContent,BodyTagSupport,TagAttributteInfo,TagData,TagExtraInfo,TagInfo,TagLibraryInfo,TagSupport,VariableInfo （粗体下划线的是最重要的四个类）</p>
<p>Part 4 BodyTagSupport和TagSupport的区别在哪里？<br />
如果我们要获取标签中的内容，并对它进行处理时，比如对标签中间的字符&lt; 替换为'&amp;lt'等，必须继承自BodyTagSupport，否则继承TagSupport就足够了。</p>
<p><strong>Part 5 TagSupport的API</strong><br />
最重要的两个方法是：<br />
public int doStartTag() throws JspException<br />
遇到起始标签进行的处理，有两个返回值，一个是Tag.SKIP_BODY,表示起止标签中间的内容被忽略，不做执行。另一个是Tag.EVAL_BODY_INCLUDE,表示标记中间的内容被正常执行。<br />
public int doEndTag() throws JspException<br />
遇到结束标签进行的处理，有两个返回值，一个是Tag.SKIP_PAGE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示执行立即结束，网页上剩余部分都被忽略。另一个是Tag.EVAL._PAGE表示JSP Page都能正常执行。</p>
<br />
<font size="2"><strong>Part 6 如何处理标签的属性？</strong><br />
如果标签类似&lt;prefix:myTag attr1=&#8221;123&#8221;&gt; &#8230;&lt;/prefix:myTag&gt;，处理类中必须写类似JavaBean的set和get方法。示例如下：<br />
private int attr1;<br />
public void setAttr1(int value)<br />
{this.attr1=value;}<br />
public int getAttr1()<br />
{return this.attr1;}<br />
注意：属性id,不用在标签处理类中实现get set代码，只需要在描述文件中指出id属性。<br />
<br />
<br />
<p><strong>Part 7 BodyTagSupport的API</strong><br />
BodyTagSupport类继承TagSupport,有以下六个常用方法：<br />
public int doStartTag() throws JspException<br />
功能与TagSupport中一样，返回值有Tag.SKIP_BODY和Tag.EVAL_BODY_BUFFERED,Tag.SKIP_BODY表示标签中间的内容被忽略，Tag. EVAL_BODY_BUFFERED表示标记中间的内容被执行，处理结果被放入BodyContent类中。<br />
public int doEndTag() throws JspException<br />
功能与返回值跟TagSupport中一样。<br />
public void doInitBody() throws JspException<br />
让用户能够新增初始值<br />
public int doAfterBody() throws JspException<br />
功能是让用户决定是否重新处理标记中间的内容，返回值有Tag.SKIP_BODY和BodyTag.EVAL_BODY_TAG,表示会重复不断地处理标记之间的内容。<br />
public BodyContent getBodyContent()<br />
获取标签的内容，以便于进行处理。<br />
public void setBodyContent(BodyContent b)<br />
设置标签内容。<br />
<br />
</p>
<p><font size="2"><strong>Part 8 TagExtraInfo 和 VariableInfo</strong><br />
这两个类结合使用的目的是，在标签外部获取标签处理类中保存在页面的对象。该对象如果是JavaBean，则可以直接用&lt;jsp:getProperty name=&#8221;id&#8221; property=&#8221;xxx&#8221;&gt;取得该javabean的属性值，id是所保存的页面对象对应的变量名。标签外部包括：&lt;prefix:mytag&gt;开始到Page结束的范围，&lt;/prefix:mytag&gt;开始到Page结束的范围，&lt;prefix:mytag&gt;和&lt;/prefix:mytag&gt;中间的范围。<br />
TagExtraInfo类最重要的一个方法是<br />
public VariableInfo[] getVariableInfo(TagData data)<br />
功能是返回所有的与此TagExtraInfo相关联的标签定义类里的变量信息。<br />
VariableInfo类的构造函数<br />
public VariableInfo(String ID,String ClassName,Boolean Declare, int Scope)<br />
ID表示变量名称<br />
ClassName表示类的名称<br />
Declare表示之前是否申明过<br />
Scope表示变量的使用范围：VariableInfo.AT_BEGIN表示从标签起始位置到Page结束，VariableInfo.AT_END表示标签结束位置到Page结束，VariableInfo.NESTED表示标签起止中间的范围。</font></p>
<p><font size="2"><strong>Part 9 标记描述文件</strong><br />
标记描述文件是XML格式的文件，分三层来介绍：<br />
第一层&lt;taglib&gt;是根元素，包括下列子元素<br />
&lt;tlibversion&gt;<br />
Tag Library的版本<br />
&lt;jspversion&gt;<br />
jsp的版本<br />
&lt;shortname&gt;<br />
定义Tag Library taglib命令中默认的Prefix值<br />
&lt;uri&gt;<br />
说明Tag Libray的文件来源，通常是空的<br />
&lt;info&gt;<br />
用来描述此TagLib的相关信息<br />
&lt;tag&gt;表示用户子定以的标记，作为第二层详细介绍<br />
第二层 &lt;tag&gt;描述文件的关键部分，包括下列子元素<br />
&lt;name&gt;<br />
用户定义的Tag名称<br />
&lt;tagclass&gt;<br />
标签的处理类全名称<br />
&lt;teiclass&gt;<br />
TagExtraInfo类的全名称<br />
&lt;bodycontent&gt;<br />
三种值:empty,JSP,tagdependent。empty表示没有body，JSP表示body中可以加入JSP程序代码，tagdependent表示内容交给tag自己处理<br />
&lt;info&gt;<br />
说明此tag的相关内容<br />
&lt;attribute&gt;标签的属性，作为第三层介绍<br />
第三层 &lt;attribute&gt;有3个子元素<br />
&lt;name&gt;<br />
属性的名称<br />
&lt;required&gt;<br />
属性必须存在？ true为是，false是否，默认是false。<br />
&lt;rtexprvalue&gt;<br />
属性值是否可以为表达式，true为是，false为否。例如：是否可以这样使用？<br />
&lt;prefix:mytag num=&#8221;&lt;%=request.getParameter(\&#8221; num\&#8221;)%&gt;&#8221;/&gt;</font></p>
<p><font size="2"><strong>Part 10 如何在页面使用TagLib？</strong><br />
在页面先引入tag，然后就可以使用。其中uri指明taglib描述文件的路径，prefix表示标签的前缀。<br />
&lt;%@ taglib uri="/WEB-INF/MyTagLib.tld" prefix="mytag"%&gt;<br />
&lt;h1&gt;&lt;mytag:Hello/&gt;&lt;/h1&gt;</font></p>
<p><font size="2"><strong>Part 11 在Web.xml中设定taglib的uri假名。</strong><br />
&lt;taglib&gt;<br />
&nbsp;&nbsp; &lt;taglib-uri&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Taglib<br />
&nbsp;&nbsp; &lt;/taglib-uri&gt;<br />
&nbsp;&nbsp; &lt;taglib-location&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /WEB-INF/MyTaglib.tld<br />
&nbsp;&nbsp; &lt;/taglib-location&gt;<br />
&lt;/taglib&gt;<br />
使用方式：<br />
&lt;%@ taglib uri=&#8221;Taglib&#8221; prefix=&#8221;myTag&#8221;%&gt;<br />
好处是，每次引入taglib时不用写长路径名称，并且改变了taglib描述的位置，只需要修改一个地方.</font></p>
<p><br />
<br />
&nbsp;</p>
</font>
<img src ="http://www.blogjava.net/xcp/aggbug/325617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-07-09 09:54 <a href="http://www.blogjava.net/xcp/archive/2010/07/09/325617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>动态传参 中文编码　信息提示处理</title><link>http://www.blogjava.net/xcp/archive/2010/06/25/324378.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Thu, 24 Jun 2010 16:53:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/06/25/324378.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/324378.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/06/25/324378.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/324378.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/324378.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、服务端两种处理中文的方式&nbsp;&nbsp;&nbsp;&nbsp;1.Action写法&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;showMessage;&nbsp;//公有属性//第一种处理编码方式this.showMessage&nbsp;=&nbsp;URLEncoder.encode("删除所有...&nbsp;&nbsp;<a href='http://www.blogjava.net/xcp/archive/2010/06/25/324378.html'>阅读全文</a><img src ="http://www.blogjava.net/xcp/aggbug/324378.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-06-25 00:53 <a href="http://www.blogjava.net/xcp/archive/2010/06/25/324378.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HTML Parser </title><link>http://www.blogjava.net/xcp/archive/2010/06/08/323010.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Mon, 07 Jun 2010 16:22:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/06/08/323010.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/323010.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/06/08/323010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/323010.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/323010.html</trackback:ping><description><![CDATA[<p>实例：<a href="http://bbs.sinobuy.cn/index.php/topic,29082.msg48061.html?PHPSESSID=25765715740d5ea729db953abfa52679">http://bbs.sinobuy.cn/index.php/topic,29082.msg48061.html?PHPSESSID=25765715740d5ea729db953abfa52679</a><br />
<br />
研究的重点还是extraction的使用，有空再研究transformation的使用。<br />
1、htmlparser对html页面处理的数据结构<br />
<br />
<a href="http://hiphotos.baidu.com/zhangtianshun/pic/item/52a9898becaa905c9f2fb42d.jpg" target="_blank"></a><br />
如图所示，HtmlParser采用了经典的Composite模式，通过RemarkNode、TextNode、TagNode、AbstractNode和Tag来描述HTML页面各元素。<br />
<br />
&nbsp;&nbsp;&nbsp; * org.htmlparser.Node：<br />
<br />
Node接口定义了进行树形结构节点操作的各种典型操作方法，包括：<br />
<br />
节点到html文本、text文本的方法：toPlainTextString、toHtml<br />
<br />
典型树形结构遍历的方法：getParent、getChildren、getFirstChild、getLastChild、getPreviousSibling、getNextSibling、getText<br />
<br />
获取节点对应的树形结构结构的顶级节点Page对象方法：getPage<br />
<br />
获取节点起始位置的方法：getStartPosition、getEndPosition<br />
<br />
Visitor方法遍历节点时候方法：accept (NodeVisitor visitor)<br />
<br />
Filter方法：collectInto (NodeList list, NodeFilter filter)<br />
<br />
Object方法：toString、clone<br />
<br />
&nbsp;&nbsp;&nbsp; * org.htmlparser.nodes.AbstractNode：<br />
<br />
AbstractNode是形成HTML树形结构抽象基类，实现了Node接口。<br />
<br />
在htmlparser中，Node分成三类：<br />
<br />
RemarkNode：代表Html中的注释<br />
<br />
TagNode：标签节点。<br />
<br />
TextNode：文本节点<br />
<br />
这三类节点都继承AbstractNode。<br />
<br />
&nbsp;&nbsp;&nbsp; * org.htmlparser.nodes.TagNode：<br />
<br />
TagNode包含了对HTML处理的核心的各个类，是所有TAG的基类，其中有分为包含其他TAG的复合节点ComositeTag和不包含其他TAG的叶子节点Tag。<br />
<br />
复合节点CompositeTag：<br />
<br />
AppletTag,BodyTag,Bullet,BulletList,DefinitionList,DefinitionListBullet,Div,FormTag,FrameSetTag,HeadingTag,<br />
<br />
HeadTag,Html,LabelTag,LinkTag,ObjectTag,ParagraphTag,ScriptTag,SelectTag,Span,StyleTag,TableColumn,<br />
<br />
TableHeader,TableRow,TableTag,TextareaTag,TitleTag<br />
<br />
叶子节点TAG：<br />
<br />
BaseHrefTag,DoctypeTag,FrameTag,ImageTag,InputTag,JspTag,MetaTag,ProcessingInstructionTag,<br />
2、htmlparser对html页面处理的算法<br />
<br />
主要是如下几种方式<br />
<br />
&nbsp;&nbsp;&nbsp; * 采用Visitor方式访问Html<br />
<br />
&nbsp;&nbsp;&nbsp; public static void testVisitorAll()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Parser parser = new Parser();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parser.setURL("http://www.google.com");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parser.setEncoding(parser.getEncoding());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NodeVisitor visitor = new NodeVisitor()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void visitTag(Tag tag) <br />
&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.info("testVisitorAll() Tag name is :" + tag.getTagName() + " Class is :" + tag.getClass());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parser.visitAllNodesWith(visitor);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ParserException e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; * 采用Filter方式访问html<br />
<br />
&nbsp;&nbsp;&nbsp; public static void testLinkTag()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NodeFilter filter = new NodeClassFilter(LinkTag.class);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Parser parser = new Parser();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parser.setURL("http://www.google.com");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parser.setEncoding(parser.getEncoding());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NodeList list = parser.extractAllNodesThatMatch(filter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; list.size(); i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinkTag node = (LinkTag) list.elementAt(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.fatal("testLinkTag() Link is :" + node.extractLink());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; * 采用org.htmlparser.beans方式<br />
<br />
&nbsp;&nbsp;&nbsp; public static void testLinkBean() <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Parser parser = new Parser();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LinkBean linkBean = new LinkBean();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linkBean.setURL("http://www.google.com");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL[] urls = linkBean.getLinks();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; urls.length; i++) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL url = urls[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logger.fatal("testLinkBean() -url is :" + url);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
<font size="3">&nbsp;&nbsp;&nbsp; * parse (NodeFilter filter)：通过NodeFilter方式获取<br />
&nbsp;&nbsp;&nbsp; * visitAllNodesWith (NodeVisitor visitor)：通过Nodevisitor方式<br />
&nbsp;&nbsp;&nbsp; * extractAllNodesThatMatch (NodeFilter filter)：通过NodeFilter方式</font></p>
<p>org.htmlparser<br />
定义了htmlparser的一些基础类。其中最为重要的是Parser类。 <br />
&nbsp;&nbsp;&nbsp; Parser是htmlparser的最核心的类，其构造函数提供了如下：Parser.createParser (String html, String charset)、 Parser ()、Parser (Lexer lexer, ParserFeedback fb)、Parser (URLConnection connection, ParserFeedback fb)、Parser (String resource, ParserFeedback feedback)、 Parser (String resource)</p>
<p>org.htmlparser.beans<br />
对Visitor和Filter的方法进行了封装，定义了针对一些常用html元素操作的bean，简化对常用元素的提取操作。 <br />
&nbsp;&nbsp;&nbsp; 包括：FilterBean、HTMLLinkBean、HTMLTextBean、LinkBean、StringBean、BeanyBaby等。</p>
<p>3.3、org.htmlparser.nodes<br />
&nbsp;&nbsp;&nbsp; 定义了基础的node，包括：AbstractNode、RemarkNode、TagNode、TextNode等。</p>
<p>3.4、org.htmlparser.tags<br />
&nbsp;&nbsp;&nbsp; 定义了htmlparser的各种tag。</p>
<p>3.5、org.htmlparser.filters<br />
&nbsp;&nbsp;&nbsp; 定义了htmlparser所提供的各种filter，主要通过extractAllNodesThatMatch (NodeFilter filter)来对html页面指定类型的元素进行过滤，包括：AndFilter、CssSelectorNodeFilter、 HasAttributeFilter、HasChildFilter、HasParentFilter、HasSiblingFilter、 IsEqualFilter、LinkRegexFilter、LinkStringFilter、NodeClassFilter、 NotFilter、OrFilter、RegexFilter、StringFilter、TagNameFilter、XorFilter</p>
<p>3.6、org.htmlparser.visitors<br />
&nbsp;&nbsp; 定义了htmlparser所提供的各种visitor，主要通过visitAllNodesWith (NodeVisitor visitor)来对html页面元素进行遍历，包括：HtmlPage、LinkFindingVisitor、NodeVisitor、 ObjectFindingVisitor、StringFindingVisitor、TagFindingVisitor、 TextExtractingVisitor、UrlModifyingVisitor</p>
<p>&nbsp;</p>
<p>3.7、org.htmlparser.parserapplications<br />
&nbsp;&nbsp; 定义了一些实用的工具，包括LinkExtractor、SiteCapturer、StringExtractor、WikiCapturer，这几个类也可以作为htmlparser使用样例。</p>
<p>3.8、org.htmlparser.tests<br />
&nbsp;&nbsp; 对各种功能的单元测试用例，也可以作为htmlparser使用的样例。</p>
<p>文章出处：飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/java/javajs/20091021/179713.html</p>
<img src ="http://www.blogjava.net/xcp/aggbug/323010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-06-08 00:22 <a href="http://www.blogjava.net/xcp/archive/2010/06/08/323010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>System.getProperty("")参数里面是什么意思</title><link>http://www.blogjava.net/xcp/archive/2010/06/03/322659.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Thu, 03 Jun 2010 11:45:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/06/03/322659.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/322659.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/06/03/322659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/322659.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/322659.html</trackback:ping><description><![CDATA[os.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Operating system name&nbsp;&nbsp; <br />
os.arch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Operating system architecture&nbsp;&nbsp; <br />
os.version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Operating system version&nbsp;&nbsp; <br />
file.separator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File separator ("/" on UNIX)&nbsp;&nbsp; <br />
path.separator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Path separator (":" on UNIX)&nbsp;&nbsp; <br />
line.separator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Line separator ("\n" on UNIX)&nbsp;&nbsp; <br />
user.name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User's account name&nbsp;&nbsp; <br />
user.home&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User's home directory&nbsp;&nbsp; <br />
user.dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; User's current working directory 
<img src ="http://www.blogjava.net/xcp/aggbug/322659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-06-03 19:45 <a href="http://www.blogjava.net/xcp/archive/2010/06/03/322659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RedHat下用vsftp搭建ftp系统</title><link>http://www.blogjava.net/xcp/archive/2010/04/15/318394.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Thu, 15 Apr 2010 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/04/15/318394.html</guid><description><![CDATA[<div>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">RedHat</span><span style="font-size: 10pt; color: black; font-family: 宋体;">带了</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">wu-ftpd</span><span style="font-size: 10pt; color: black; font-family: 宋体;">和</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">vsftp</span><span style="font-size: 10pt; color: black; font-family: 宋体;">两套</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">ftp</span><span style="font-size: 10pt; color: black; font-family: 宋体;">系统</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">.</span><span style="font-size: 10pt; color: black; font-family: 宋体;">我也使第一次接触</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">vsftp,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">根据</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">man</span><span style="font-size: 10pt; color: black; font-family: 宋体;">说</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">vsftp</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的含义就是</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">Very Security Ftp</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的意思简单的看了看</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">vsftp</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的说明</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">发现还是很简单的</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">下面就简要的说一下它的配置方法</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">. <br />
<br />
1.</span><span style="font-size: 10pt; color: black; font-family: 宋体;">相关配置文件</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
/etc</span><span style="font-size: 10pt; color: black; font-family: 宋体;">目录下的</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">vsftpd.conf,vsftpd.ftpuser,vsftpd.user_list,/etc/xinetd.d/vsftpd <br />
<br />
2.</span><span style="font-size: 10pt; color: black; font-family: 宋体;">配置</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">vsftp <br />
</span><span style="font-size: 10pt; color: black; font-family: 宋体;">主要是修改</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">/etc/vsftpd.conf</span><span style="font-size: 10pt; color: black; font-family: 宋体;">就可以了</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">相关参数如下</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">: <br />
<br />
anonymous_enable=YES </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否允许匿名</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">ftp,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">如否则选择</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">NO <br />
<br />
local_enable=YES </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否允许本地用户登录</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
local_umask=022 </span><span style="font-size: 10pt; color: black; font-family: 宋体;">默认的</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">umask</span><span style="font-size: 10pt; color: black; font-family: 宋体;">码</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
anon_upload_enable=YES </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否允许匿名</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">ftp</span><span style="font-size: 10pt; color: black; font-family: 宋体;">用户访问</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
anon_upload_enable=YES </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否允许匿名上传文件</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
anon_mkdir_write_enable=YES </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否允许匿名用户有创建目录的权利</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
dirmessage_enable=YES </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否显示目录说明文件</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">默认是</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">YES</span><span style="font-size: 10pt; color: black; font-family: 宋体;">但需要收工创建</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">.message</span><span style="font-size: 10pt; color: black; font-family: 宋体;">文件</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
xferlog_enable=YES </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否记录</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">ftp</span><span style="font-size: 10pt; color: black; font-family: 宋体;">传输过程</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
connect_from_port_20=YES </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否确信端口传输来自</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">20(ftp-data) <br />
<br />
chown_upload=YES <br />
chown_username=username </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否改变上传文件的属主</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">如果是需要输入一个系统用户名</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">你可以把上传的文件都改成</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">root</span><span style="font-size: 10pt; color: black; font-family: 宋体;">属主</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
xferlog_file=/var/log/vsftpd.log ftp</span><span style="font-size: 10pt; color: black; font-family: 宋体;">传输日志的路径和名字默认是</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">/var/log/vsftpd.log <br />
<br />
xferlog_std_format=YES </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否使用标准的</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">ftp xferlog</span><span style="font-size: 10pt; color: black; font-family: 宋体;">模式</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
idle_session_timeout=600 </span><span style="font-size: 10pt; color: black; font-family: 宋体;">设置默认的断开不活跃</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">session</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的时间</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
data_connection_timeout=120 </span><span style="font-size: 10pt; color: black; font-family: 宋体;">设置数据传输超时时间</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
nopriv_user=ftpsecure </span><span style="font-size: 10pt; color: black; font-family: 宋体;">运行</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">vsftpd</span><span style="font-size: 10pt; color: black; font-family: 宋体;">需要的非特权系统用户默认是</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">nobody <br />
<br />
async_abor_enable=YES </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否允许运行特殊的</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">ftp</span><span style="font-size: 10pt; color: black; font-family: 宋体;">命令</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">async ABOR.</span><span style="font-size: 10pt; color: black; font-family: 宋体;">这里我翻译的不爽</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">原文如下</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">: <br />
When
enabled, a special FTP command known as "async ABOR" will be enabled.
Only ill advised FTP clients will use this feature.Addtionally, this
feature is awkward to handle, so it is dis-abled by default.
Unfortunately, some FTP clients will hang when cancelling a transfer
unless this feature is available, so you may wish to enable it. <br />
<br />
ascii_upload_enable=YES <br />
ascii_download_enable=YES </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否使用</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">ascii</span><span style="font-size: 10pt; color: black; font-family: 宋体;">码方式上传和下载文件</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
ftpd_banner=Welcome to chenlf FTP service. </span><span style="font-size: 10pt; color: black; font-family: 宋体;">定制欢迎信息</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
deny_email_enable=YES <br />
banned_email_file=/etc/vsftpd.banned_emails </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否允许禁止匿名用户使用某些邮件地址</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">如果是输入禁止的邮件地址的路径和文件名</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
chroot_list_enable=YES <br />
chroot_list_file=/etc/vsftpd.chroot_list </span><span style="font-size: 10pt; color: black; font-family: 宋体;">是否将系统用户限止在自己的</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">home</span><span style="font-size: 10pt; color: black; font-family: 宋体;">目录下</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">如果选择了</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">yes</span><span style="font-size: 10pt; color: black; font-family: 宋体;">那么</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">chroot_list_file=/etc/vsftpd.chroot_list</span><span style="font-size: 10pt; color: black; font-family: 宋体;">中列出的是不</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">chroot</span><span style="font-size: 10pt; color: black; font-family: 宋体;">的用户的列表</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
max_clients=Number </span><span style="font-size: 10pt; color: black; font-family: 宋体;">如果以</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">standalone</span><span style="font-size: 10pt; color: black; font-family: 宋体;">模式起动</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">那么只有</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">$Number</span><span style="font-size: 10pt; color: black; font-family: 宋体;">个用户可以连接</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">其他的用户将得到错误信息</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">默认是</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">0</span><span style="font-size: 10pt; color: black; font-family: 宋体;">不限止</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
message_file </span><span style="font-size: 10pt; color: black; font-family: 宋体;">设置访问一个目录时获得的目录信息文件的文件名</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">默认是</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">.message <br />
<br />
</span><span style="font-size: 10pt; color: black; font-family: 宋体;">没发现有限止带宽的地方</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">如果谁知道请告诉我</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">详细的帮助说明请参考</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">man vsftpd.conf <br />
<br />
3 </span><span style="font-size: 10pt; color: black; font-family: 宋体;">配置实例</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
</span><span style="font-size: 10pt; color: black; font-family: 宋体;">以下是我的配置文件</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">.</span><span style="font-size: 10pt; color: black; font-family: 宋体;">允许匿名</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">FTP,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">允许上传</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,chroot</span><span style="font-size: 10pt; color: black; font-family: 宋体;">用户目录</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">上传文件属主改为</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">root <br />
<br />
anonymous_enable=YES <br />
local_enable=YES <br />
write_enable=YES <br />
local_umask=022 <br />
anon_upload_enable=YES <br />
anon_mkdir_write_enable=YES <br />
dirmessage_enable=YES <br />
xferlog_enable=YES <br />
connect_from_port_20=YES <br />
chown_uploads=YES <br />
chown_username=root <br />
xferlog_file=/var/log/vsftpd.log <br />
xferlog_std_format=YES <br />
pam_service_name=vsftpd <br />
chroot_local_user=YES <br />
<br />
4 </span><span style="font-size: 10pt; color: black; font-family: 宋体;">起动服务</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US"> <br />
<br />
vsftpd</span><span style="font-size: 10pt; color: black; font-family: 宋体;">和</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">wu-ftpd</span><span style="font-size: 10pt; color: black; font-family: 宋体;">不能同时起动</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">所以修改</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">/etc/xinetd.d/wu-ftpd</span><span style="font-size: 10pt; color: black; font-family: 宋体;">将</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">disable</span><span style="font-size: 10pt; color: black; font-family: 宋体;">设置为</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">yes,</span><span style="font-size: 10pt; color: black; font-family: 宋体;">然后修改</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">/etc/vsftpd</span><span style="font-size: 10pt; color: black; font-family: 宋体;">将</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">disable</span><span style="font-size: 10pt; color: black; font-family: 宋体;">设置为</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">NO <br />
</span><span style="font-size: 10pt; color: black; font-family: 宋体;">执行</span><span style="font-size: 10pt; color: black; font-family: Verdana;" lang="EN-US">/etc/initd.d/xinetd restart</span></p>
</div>
<img src ="http://www.blogjava.net/xcp/aggbug/318394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-04-15 11:31 <a href="http://www.blogjava.net/xcp/archive/2010/04/15/318394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RHEL 5 VSFTP 配置</title><link>http://www.blogjava.net/xcp/archive/2010/04/14/318379.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Wed, 14 Apr 2010 15:21:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/04/14/318379.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/318379.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/04/14/318379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/318379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/318379.html</trackback:ping><description><![CDATA[<p>Red Hat Enterprise Linux 5服务器配置之Vsftpd配置 <br />
1.可用以下命令查询是否已安装：<br />
#rpm -qa|grep vsftpd<br />
vsftpd-2.0.5-10.e15</p>
<p>如果出现以上结果，表明已安装。<br />
如果未安装，可在Red Hat Enterprise Linux 5安装光盘中找到安装包，使用命令<br />
#rpm -ivh vsftp-2.0.5-10.e15.i386.rpm<br />
如果版本不一样，可以在光盘里查找vsftp版本</p>
<p>2、启动和关闭<br />
#/etc/init.d/vsftpd start 开启<br />
#/etc/init.d/vsftpd stop&nbsp;&nbsp; 关闭<br />
#/etc/init.d/vsftpd restart 重启<br />
也可以<br />
#/sbin/service vsftpd start 开启<br />
#/sbin/service vsftpd stop&nbsp;&nbsp; 关闭<br />
#/sbin/service vsftpd restart 重启<br />
#/sbin/service vsftpd status 查询运行状态</p>
<p>3、Vsftpd服务器的配置文件<br />
Vsftpd的主配置文件有三个：<br />
/etc/vsftpd/vsftpd.conf<br />
/etc/vsftpd.ftpusers<br />
/etc/vsftpd.user_list<br />
修改前建议使用&#8220;cp&#8221;命令备份这三个文件，修改完成后需要重启vsftpd服务才能使设置生效。</p>
<p>4、设置开机自启动<br />
#chkconfig vsftpd on</p>
<p><br />
（一）匿名用户访问配置 /etc/vsftpd/vsftpd.conf<br />
1.启动后FTP服务器就可以登陆了<br />
　　匿名用户在text模式下，要用用户名ftp，密码也是ftp，来进行登陆；如果是用FTP工具来匿名登陆的话，用户名</p>
<p>和密码都为：anonymous。默认情况下匿名用户可以访问和下载，但不能进行上传、删除、新建目录、执行文件等操作</p>
<p>！<br />
　　本地用户可以登陆，并可以离开自家目录至有权访问的其他目录，并在权限允许的情况下进行上传和下载，写在文</p>
<p>件/etc/vsftpd.ftpusers中的本地用户禁止登录。</p>
<p>2允许匿名用户上传文件<br />
需要修改/etc/vsftpd/vsftpd.conf文件，把以下两项前的&#8220;#&#8221;去掉。<br />
anon_upload_enable=YES<br />
anon_mkdir_write_enable=YES<br />
重启vsftpd服务</p>
<p>3、.仅允许匿名用户访问<br />
指需要限制本地账号访问，修改/etc/vsftpd/vsftpd.conf文件，把以下两项前的&#8220;#&#8221;去掉。<br />
local_enable=YES<br />
write_enable=YES<br />
重启vsftpd服务。</p>
<p>4、4.设置欢迎信息<br />
修改/etc/vsftpd/vsftpd.conf文件<br />
ftpd_banner=*****<br />
*****即为设置的欢迎信息。<br />
重启vsftpd服务。</p>
<p>5.设置最大传输率<br />
修改/etc/vsftpd/vsftpd.conf文件<br />
设置匿名用户的最大传输速率为20Kbps，应添加以下语句：<br />
anon_max_rate=20000<br />
设置本地账号的最大传输速率为1Mbps，应添加以下语句：<br />
local_max_rate=1000000</p>
<p>6.设置服务器最大并发数和用户最大线程数<br />
修改/etc/vsftpd/vsftpd.conf文件<br />
设置服务器最大并发数为99，应添加以下语句：<br />
max_clients=99<br />
设置用户同一时段的最大连接数，应添加以下语句：<br />
max_per_ip=5</p>
<p>7.禁止某些IP段的主机匿名访问服务器<br />
修改vsftpd.conf文件，确认有如下语句：<br />
tcp_wrappers=YES<br />
修改/etc/hosts.allow文件，增加1行命令：<br />
vsftpd:192.168.1.1:DENY<br />
表示限制IP为192.168.1.1的主机访问FTP服务器。<br />
重启vsftpd服务。</p>
<p>8.用ASCII方法传送数据<br />
修改/etc/vsftpd/vsftpd.conf文件，<br />
ascii_upload_enable=YES<br />
ascii_download_enable=YES<br />
重启vsftpd服务。</p>
<p>9.设置数据传输中断间隔时间<br />
修改/etc/vsftpd/vsftpd.conf文件，<br />
idle_session_timeout=600<br />
表明空闲会话时间为600秒。<br />
data_connection_timeout=120<br />
表明数据连接超时时间为120秒。<br />
重启vsftpd服务。</p>
<p>&nbsp;</p>
<p><br />
（二）本地用户访问配置<br />
1.使用用户列表进行访问控制<br />
修改/etc/vsftpd/vsftpd.conf文件，按以下语句设置：<br />
userlist_enable=NO<br />
表明vsftpd.ftpuser文件中的用户将被禁止访问FTP服务器。</p>
<p>userlist_enable=YES<br />
userlist_deny=NO<br />
表明仅允许vsftpd.user_list文件中的用户访问FTP服务器。</p>
<p>userlist_enable=YES<br />
userlist_deny=YES<br />
表明vsftpd.ftpuser和vsftpd.user_list文件中的用户都不能访问FTP服务器。</p>
<p>2.限制用户目录的访问权限<br />
修改/etc/vsftpd/vsftpd.conf文件<br />
chroot_local_user=YES<br />
表明用户登录后不能访问自己目录以外的其它目录或文件。</p>
<p>3.修改默认端口<br />
FTP服务器默认的端口是21，如需要修改端口，请修改/etc/vsftpd/vsftpd.conf文件，以下语句：<br />
listen_port=4444<br />
表明FTP服务器的端口号为4444，应该尽量大于4000。</p>
<img src ="http://www.blogjava.net/xcp/aggbug/318379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-04-14 23:21 <a href="http://www.blogjava.net/xcp/archive/2010/04/14/318379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能大提速 MyEclipse终极优化四要点</title><link>http://www.blogjava.net/xcp/archive/2010/04/14/318217.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Wed, 14 Apr 2010 00:44:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/04/14/318217.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/318217.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/04/14/318217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/318217.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/318217.html</trackback:ping><description><![CDATA[　MyEclipse 8.5刚刚正式发布，新版本的特性能够大大提高开发者的效率。但同时，由于电脑配置的原因，很多开发者在使用MyEclipse的时候，速度都不是很快，需要我们对MyEclipse进行一些必要的优化。
<p>　　1、老是弹出Quick update error 、关闭MyEclipse的Quick Update自动更新功能</p>
<p>　　这个问题的解决办法是关闭自动更新：</p>
<p>
Windows &gt; Preferences &gt; MyEclipse Enterprise Workbench &gt;
Community Essentials,然后把选项 &#8221;Search for new features on startup&#8221;的前勾去掉即可。</p>
<p>　　2 、关闭updating indexes</p>
<p>　　Window &gt; Preferences &gt; Myeclipse Enterprise Workbench &gt; Maven4Myeclipse &gt; Maven&gt;</p>
<p align="center"><img id="eWebEditor_TempElement_Img" style="cursor: pointer;" onclick="showimg(this.src);return false;" alt="关闭updating indexes" src="http://ttcma.techtarget.com.cn/UpLoad/ArticlePic/2010-04-01-11-09-13.gif" border="0" /></p>
<p>　　禁用Download repository index updates on startup 。</p>
<p>　　注意：强调一个问题，很多人发现无法找到这个，原因其实是它已经关闭了。</p>
<p>　　3 、关闭MyEclipse的自动validation</p>
<p>　　validation有很多，包括xml、jsp、jsf、js等等，我们没有必要全部都去自动校验一下，只是需要的时候才会手工校验一下，速度将很快提升好几个档次。</p>
<p align="center"><img id="eWebEditor_TempElement_Img" style="cursor: pointer;" onclick="showimg(this.src);return false;" alt="关闭MyEclipse的自动validation" src="http://ttcma.techtarget.com.cn/UpLoad/ArticlePic/2010-04-01-11-09-34.gif" border="0" /></p>
<p>　　windows &gt; perferences &gt; myeclipse &gt; validation</p>
<p>　　将Build下全部勾取消，如果你需要验证某个文件的时候，我们可以单独去验证它。方法是：在需要验证的文件上( 右键 -&gt; MyEclipse -&gt; Run Validation 。</p>
<p>　　4、启动优化，关闭不需要使用的模块</p>
<p>　　一个系统20%的功能往往能够满足80%的需求，MyEclipse也不例外，我们在大多数时候只需要20%的系统功能，所以可以将一些不使用的模块禁止加载启动。</p>
<p align="center"><img id="eWebEditor_TempElement_Img" style="cursor: pointer;" onclick="showimg(this.src);return false;" alt="启动优化，关闭不需要使用的模块" src="http://ttcma.techtarget.com.cn/UpLoad/ArticlePic/2010-04-01-11-11-03.gif" border="0" /></p>
<p>　　Window &gt; Preferences &gt; General &gt; Startup andy Shutdown 在这里列出的是MyEclipse启动时加载的模块。</p>
<p>　　我这里只让它加载tomcat5，勾选MyEclipse EASIE Tomcat 5。接下来，关闭工作空间启动刷新：</p>
<p align="center"><img id="eWebEditor_TempElement_Img" style="cursor: pointer;" onclick="showimg(this.src);return false;" alt="关闭工作空间启动刷新" src="http://ttcma.techtarget.com.cn/UpLoad/ArticlePic/2010-04-01-11-11-36.gif" border="0" /></p>
<p>　　接下来关闭拼写检查：</p>
<p align="center"><img id="eWebEditor_TempElement_Img" style="cursor: pointer;" onclick="showimg(this.src);return false;" alt="接下来关闭拼写检查：" src="http://ttcma.techtarget.com.cn/UpLoad/ArticlePic/2010-04-01-11-11-58.gif" border="0" /></p>
<p>　　只需要取消Enable spell checking：</p>
<p align="center"><img id="eWebEditor_TempElement_Img" style="cursor: pointer;" onclick="showimg(this.src);return false;" alt="只需要取消Enable spell checking：" src="http://ttcma.techtarget.com.cn/UpLoad/ArticlePic/2010-04-01-11-12-20.gif" border="0" /></p>
<p>　　看到auto activation triggers for java之后，在里面输入a-z这些字幕吧，然后选择应用，接着去编辑器里查看提示，上面那个选项是延迟多少时间提示，建议不修改。</p>
<p align="center"><img id="eWebEditor_TempElement_Img" style="cursor: pointer;" onclick="showimg(this.src);return false;" alt="上面那个选项是延迟多少时间提示，建议不修改" src="http://ttcma.techtarget.com.cn/UpLoad/ArticlePic/2010-04-01-11-12-44.gif" border="0" /></p>
<p>　　如图那样选择就完成了，然后我们到myeclipse安装目录&gt;myeclipse.ini打开修改这个文件，建议在做之前备份，不然错了没法启动。</p>
<table style="border: 1px dotted #cccccc; table-layout: fixed;" width="95%" align="center" border="0" cellpadding="6" cellspacing="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word;" bgcolor="#f3f3f3"><font style="font-weight: bold; color: #990000;">以下是引用片段：</font><br />
            -startup <br />
            &nbsp;&nbsp;../Common/plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar <br />
            &nbsp;&nbsp;--launcher.library <br />
            &nbsp;&nbsp;../Common/plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519 <br />
            &nbsp;-install <br />
            &nbsp;&nbsp;E:/develop/MYEC85/MyEclipse&nbsp;8.5&nbsp;M2 <br />
            &nbsp;&nbsp;-vm&nbsp; <br />
            &nbsp;E:/develop/MYEC85/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/jre/bin/client/jvm.dl <br />
            l&nbsp;&nbsp;-vmargs <br />
            &nbsp;&nbsp;-Xmx512m&nbsp; <br />
            &nbsp;-XX:MaxPermSize=512m&nbsp;-XX:ReservedCodeCacheSize=256m&nbsp;</td>
        </tr>
    </tbody>
</table>
<p>　　主要是修改： </p>
<table style="border: 1px dotted #cccccc; table-layout: fixed;" width="95%" align="center" border="0" cellpadding="6" cellspacing="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word;" bgcolor="#f3f3f3"><font style="font-weight: bold; color: #990000;">以下是引用片段：</font><br />
            -Xmx512m <br />
            &nbsp;&nbsp;-XX:MaxPermSize=512m <br />
            &nbsp;-XX:ReservedCodeCacheSize=256m&nbsp;</td>
        </tr>
    </tbody>
</table>
<p>　　这三个优化方案，最好按照自己的内存来选择，选择合适的话，相信效果会很不错。如果修改后无法使用就能把备份覆盖回来吧。下面说一下MyEclipse中常用的快捷键:</p>
<p>　　1、切换编辑点 Alt + &lt;-， Alt + -&gt;。</p>
<p>　　2、查看打开文件 Ctr + e。</p>
<p>　　3、充分利用模板 主要是自己定义的。</p>
<p>　　4、自定义快捷键生成Getter和Setter。</p>
<p>　　5、删除时候尽量不要退格或者Delete键，行级别 Ctr+d，行中个别部分 Ctr+x。</p>
<p>　　6、看见方法名或者变量名不好，替换Ctr+2，r。</p>
<p>　　7、Ctr+Shift+o快速导包。</p>
<p>　　8、运行Ctr+F11。</p>
<p>　　9、大小写转化：Ctr+Shift+X Ctr+Shift+Y。</p>
<p>　　10、最大一般窗口切换：Ctr+M。</p>
<p>　　11、有时候，Alt+Shift+X，Q 运行还是挺爽，特别是个别运行build时候。</p>
<p>　　12、ctrl+shift+f 代码格式化。</p>
<p>　　13、ctrl+shift+/来注释/反注释选择的源码。</p>
<p>　　14、shift+alt+s来快速打开源码功能。</p>
<img src ="http://www.blogjava.net/xcp/aggbug/318217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-04-14 08:44 <a href="http://www.blogjava.net/xcp/archive/2010/04/14/318217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java实现简单的单点登录</title><link>http://www.blogjava.net/xcp/archive/2010/04/13/318125.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 13 Apr 2010 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/04/13/318125.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘要：单点登录（SSO）的技术被越来越广泛地运用到各个领域的软件系统当中。本文从业务的角度分析了单点登录的需求和应用领域；从技术本身的角度分析了单点登录技术的内部机制和实现手段，并且给出Web-SSO和桌面SSO的实现、源代码和详细讲解；还从安全和性能的角度对现有的实现技术进行进一步分析，指出相应的风险和需要改进的方面。本文除了从多个方面和角度给出了对单点登录（SSO）的全面分析，还并且讨论了如何...&nbsp;&nbsp;<a href='http://www.blogjava.net/xcp/archive/2010/04/13/318125.html'>阅读全文</a><img src ="http://www.blogjava.net/xcp/aggbug/318125.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-04-13 10:28 <a href="http://www.blogjava.net/xcp/archive/2010/04/13/318125.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>  使用 CAS 在 Tomcat 中实现单点登录 </title><link>http://www.blogjava.net/xcp/archive/2010/04/13/318122.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 13 Apr 2010 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/04/13/318122.html</guid><description><![CDATA[<p><a name="2.CAS 介绍"><span class="atitle">CAS 介绍</span></a></p>
<p>CAS 是 Yale 大学发起的一个开源项目，旨在为 Web 应用系统提供一种可靠的单点登录方法，CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点：</p>
<ul>
    <li>开源的企业级单点登录解决方案。 </li>
    <li>CAS Server 为需要独立部署的 Web 应用。 </li>
    <li>CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用)，包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。 </li>
</ul>
<p><a name="N1008D"><span class="smalltitle"><strong><font size="3">CAS 原理和协议</font></strong></span></a></p>
<p>从结构上看，CAS 包含两个部分： CAS Server 和 CAS Client。CAS Server
需要独立部署，主要负责对用户的认证工作；CAS Client 负责处理对客户端受保护资源的访问请求，需要登录时，重定向到 CAS
Server。图1 是 CAS 最基本的协议过程：</p>
<br />
<a name="N10098"><strong>图 1. CAS 基础协议</strong></a><br />
<img alt="CAS 基础协议" src="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/images/image001.jpg" width="467" height="341" /> <br />
<p>CAS Client 与受保护的客户端应用部署在一起，以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web
请求，CAS Client 会分析该请求的 Http 请求中是否包含 Service
Ticket，如果没有，则说明当前用户尚未登录，于是将请求重定向到指定好的 CAS Server 登录地址，并传递 Service
（也就是要访问的目的资源地址），以便登录成功过后转回该地址。用户在第 3 步中输入认证信息，如果登录成功，CAS Server
随机产生一个相当长度、唯一、不可伪造的 Service Ticket，并缓存以待将来验证，之后系统自动重定向到 Service
所在地址，并为客户端浏览器设置一个 Ticket Granted Cookie（TGC），CAS Client 在拿到 Service
和新产生的 Ticket 过后，在第 5，6 步中与 CAS Server 进行身份合适，以确保 Service Ticket 的合法性。</p>
<p>在该协议中，所有与 CAS 的交互均采用 SSL 协议，确保，ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程，但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。</p>
<p>另外，CAS 协议中还提供了 Proxy （代理）模式，以适应更加高级、复杂的应用场景，具体介绍可以参考 CAS 官方网站上的相关文档。</p>
<p><a name="N100B0"><span class="smalltitle"><strong><font size="3">准备工作</font></strong></span></a></p>
<p>本文中的例子以 tomcat5.5 为例进行讲解，下载地址：</p>
<p><a href="http://tomcat.apache.org/download-55.cgi"><font color="#5c81a7">http://tomcat.apache.org/download-55.cgi</font></a> </p>
<p>到 CAS 官方网站下载 CAS Server 和 Client，地址分别为：</p>
<p><a href="http://www.ja-sig.org/downloads/cas/cas-server-3.1.1-release.zip"><font color="#5c81a7">http://www.ja-sig.org/downloads/cas/cas-server-3.1.1-release.zip</font></a> </p>
<p><a href="http://www.ja-sig.org/downloads/cas-clients/cas-client-java-2.1.1.zip"><font color="#5c81a7">http://www.ja-sig.org/downloads/cas-clients/cas-client-java-2.1.1.zip</font></a> </p>
<br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td><img alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" height="1" /><br />
            <img alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" height="6" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" align="right" cellpadding="0" cellspacing="0">
    <tbody>
        <tr align="right">
            <td><img alt="" src="http://www.ibm.com/i/c.gif" width="100%" height="4" /><br />
            <table border="0" cellpadding="0" cellspacing="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" height="16" /><br />
                        </td>
                        <td align="right" valign="top"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#main"><strong><font color="#996699">回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="3.部署 CAS Server"><span class="atitle">部署 CAS Server</span></a></p>
<p>CAS Server 是一套基于 Java 实现的服务，该服务以一个 Java Web Application 单独部署在与
servlet2.3 兼容的 Web 服务器上，另外，由于 Client 与 CAS Server 之间的交互采用 Https 协议，因此部署
CAS Server 的服务器还需要支持 SSL 协议。当 SSL 配置成功过后，像普通 Web 应用一样将 CAS Server
部署在服务器上就能正常运行了，不过，在真正使用之前，还需要扩展验证用户的接口。</p>
<p>在 Tomcat 上部署一个完整的 CAS Server 主要按照以下几个步骤：</p>
<p><a name="N100DD"><span class="smalltitle"><strong><font size="3">配置 Tomcat 使用 Https 协议</font></strong></span></a></p>
<p>如果希望 Tomcat 支持 Https，主要的工作是配置 SSL 协议，其配置过程和配置方法可以参考 Tomcat 的相关文档。不过在生成证书的过程中，会有需要用到主机名的地方，CAS 建议不要使用 IP 地址，而要使用机器名或域名。</p>
<p><a name="N100E6"><span class="smalltitle"><strong><font size="3">部署 CAS Server</font></strong></span></a></p>
<p>CAS Server 是一个 Web 应用包，将前面下载的 cas-server-3.1.1-release.zip 解开，把其中的
cas-server-webapp-3.1.1.war 拷贝到 tomcat的 webapps 目录，并更名为
cas.war。由于前面已配置好 tomcat 的 https 协议，可以重新启动
tomcat，然后访问：https://localhost:8443/cas ，如果能出现正常的 CAS 登录页面，则说明 CAS
Server 已经部署成功。</p>
<p>虽然 CAS Server 已经部署成功，但这只是一个缺省的实现，在实际使用的时候，还需要根据实际概况做扩展和定制，最主要的是扩展认证 (Authentication) 接口和 CAS Server 的界面。</p>
<p><a name="N100F2"><span class="smalltitle"><strong><font size="3">扩展认证接口</font></strong></span></a></p>
<p>CAS Server 负责完成对用户的认证工作，它会处理登录时的用户凭证 (Credentials)
信息，用户名/密码对是最常见的凭证信息。CAS Server 可能需要到数据库检索一条用户帐号信息，也可能在 XML
文件中检索用户名/密码，还可能通过 LDAP Server 获取等，在这种情况下，CAS
提供了一种灵活但统一的接口和实现分离的方式，实际使用中 CAS 采用哪种方式认证是与 CAS
的基本协议分离开的，用户可以根据认证的接口去定制和扩展。</p>
<p><strong>扩展 AuthenticationHandler</strong> </p>
<p>CAS 提供扩展认证的核心是 AuthenticationHandler 接口，该接口定义如清单 1 下：</p>
<br />
<a name="N10107"><strong>清单 1. AuthenticationHandler定义</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            public interface AuthenticationHandler {<br />
            /**<br />
            * Method to determine if the credentials supplied are valid.<br />
            * @param credentials The credentials to validate.<br />
            * @return true if valid, return false otherwise.<br />
            * @throws AuthenticationException An AuthenticationException can contain<br />
            * details about why a particular authentication request failed.<br />
            */<br />
            boolean authenticate(Credentials credentials) throws AuthenticationException;<br />
            /**<br />
            * Method to check if the handler knows how to handle the credentials<br />
            * provided. It may be a simple check of the Credentials class or something<br />
            * more complicated such as scanning the information contained in the<br />
            * Credentials object. <br />
            * @param credentials The credentials to check.<br />
            * @return true if the handler supports the Credentials, false othewrise.<br />
            */<br />
            boolean supports(Credentials credentials);<br />
            }<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>该接口定义了 2 个需要实现的方法，supports ()方法用于检查所给的包含认证信息的Credentials 是否受当前
AuthenticationHandler 支持；而 authenticate()
方法则担当验证认证信息的任务，这也是需要扩展的主要方法，根据情况与存储合法认证信息的介质进行交互，返回 boolean 类型的值，true
表示验证通过，false 表示验证失败。</p>
<p>CAS3中还提供了对AuthenticationHandler 接口的一些抽象实现，比如，可能需要在执行authenticate() 方法前后执行某些其他操作，那么可以让自己的认证类扩展自清单 2 中的抽象类：</p>
<br />
<a name="N10117"><strong>清单 2. AbstractPreAndPostProcessingAuthenticationHandler定义</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            public abstract class AbstractPreAndPostProcessingAuthenticationHandler <br />
            implements AuthenticateHandler{<br />
            protected Log log = LogFactory.getLog(this.getClass());<br />
            protected boolean preAuthenticate(final Credentials credentials) {<br />
            return true;<br />
            }<br />
            protected boolean postAuthenticate(final Credentials credentials,<br />
            final boolean authenticated) {<br />
            return authenticated;<br />
            }<br />
            public final boolean authenticate(final Credentials credentials)<br />
            throws AuthenticationException {<br />
            if (!preAuthenticate(credentials)) {<br />
            return false;<br />
            }<br />
            final boolean authenticated = doAuthentication(credentials);<br />
            return postAuthenticate(credentials, authenticated);<br />
            }<br />
            protected abstract boolean doAuthentication(final Credentials credentials) <br />
            throws AuthenticationException;<br />
            }<br />
            <br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>AbstractPreAndPostProcessingAuthenticationHandler 类新定义了
preAuthenticate() 方法和 postAuthenticate() 方法，而实际的认证工作交由
doAuthentication() 方法来执行。因此，如果需要在认证前后执行一些额外的操作，可以分别扩展
preAuthenticate()和 ppstAuthenticate() 方法，而 doAuthentication() 取代
authenticate() 成为了子类必须要实现的方法。</p>
<p>由于实际运用中，最常用的是用户名和密码方式的认证，CAS3 提供了针对该方式的实现，如清单 3 所示：</p>
<br />
<a name="N10127"><strong>清单 3. AbstractUsernamePasswordAuthenticationHandler 定义</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            public abstract class AbstractUsernamePasswordAuthenticationHandler extends <br />
            AbstractPreAndPostProcessingAuthenticationHandler{<br />
            ...<br />
            protected final boolean doAuthentication(final Credentials credentials)<br />
            throws AuthenticationException {<br />
            return authenticateUsernamePasswordInternal((UsernamePasswordCredentials) credentials);<br />
            }<br />
            protected abstract boolean authenticateUsernamePasswordInternal(<br />
            final UsernamePasswordCredentials credentials) throws AuthenticationException;   <br />
            protected final PasswordEncoder getPasswordEncoder() {<br />
            return this.passwordEncoder;<br />
            }<br />
            public final void setPasswordEncoder(final PasswordEncoder passwordEncoder) {<br />
            this.passwordEncoder = passwordEncoder;<br />
            }<br />
            ...<br />
            }<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>基于用户名密码的认证方式可直接扩展自
AbstractUsernamePasswordAuthenticationHandler，验证用户名密码的具体操作通过实现
authenticateUsernamePasswordInternal()
方法达到，另外，通常情况下密码会是加密过的，setPasswordEncoder() 方法就是用于指定适当的加密器。</p>
<p>从以上清单中可以看到，doAuthentication() 方法的参数是 Credentials
类型，这是包含用户认证信息的一个接口，对于用户名密码类型的认证信息，可以直接使用
UsernamePasswordCredentials，如果需要扩展其他类型的认证信息，需要实现Credentials接口，并且实现相应的
CredentialsToPrincipalResolver 接口，其具体方法可以借鉴 UsernamePasswordCredentials
和 UsernamePasswordCredentialsToPrincipalResolver。</p>
<p><strong>JDBC 认证方法</strong> </p>
<p>用户的认证信息通常保存在数据库中，因此本文就选用这种情况来介绍。将前面下载的 cas-server-3.1.1-release.zip
包解开后，在 modules 目录下可以找到包 cas-server-support-jdbc-3.1.1.jar，其提供了通过 JDBC
连接数据库进行验证的缺省实现，基于该包的支持，我们只需要做一些配置工作即可实现 JDBC 认证。</p>
<p>JDBC 认证方法支持多种数据库，DB2, Oracle, MySql, Microsoft SQL Server 等均可，这里以
DB2 作为例子介绍。并且假设DB2数据库名： CASTest，数据库登录用户名： db2user，数据库登录密码：
db2password，用户信息表为： userTable，该表包含用户名和密码的两个数据项分别为 userName 和 password。</p>
<p><strong>1. </strong><strong>配置</strong> <strong>DataStore</strong> </p>
<p>打开文件 %CATALINA_HOME%/webapps/cas/WEB-INF/deployerConfigContext.xml，添加一个新的 bean 标签，对于 DB2，内容如清单 4 所示：</p>
<br />
<a name="N10152"><strong>清单 4. 配置 DataStore</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            &lt;bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource"&gt;<br />
            &lt;property name="driverClassName"&gt;<br />
            &lt;value&gt;com.ibm.db2.jcc.DB2Driver&lt;/value&gt;<br />
            &lt;/property&gt;<br />
            &lt;property name="url"&gt;<br />
            &lt;value&gt;jdbc:db2://9.125.65.134:50000/CASTest&lt;/value&gt;<br />
            &lt;/property&gt;<br />
            &lt;property name="username"&gt;<br />
            &lt;value&gt;db2user&lt;/value&gt;<br />
            &lt;/property&gt;<br />
            &lt;property name="password"&gt;<br />
            &lt;value&gt;db2password&lt;/value&gt;<br />
            &lt;/property&gt;<br />
            &lt;/bean&gt;<br />
            <br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>其中 id 属性为该 DataStore 的标识，在后面配置 AuthenticationHandler 会被引用，另外，需要提供 DataStore 所必需的数据库驱动程序、连接地址、数据库登录用户名以及登录密码。</p>
<p><strong>2. 配置 AuthenticationHandler</strong> </p>
<p>在 cas-server-support-jdbc-3.1.1.jar 包中，提供了 3 个基于 JDBC 的
AuthenticationHandler，分别为 BindModeSearchDatabaseAuthenticationHandler,
QueryDatabaseAuthenticationHandler,
SearchModeSearchDatabaseAuthenticationHandler。其中
BindModeSearchDatabaseAuthenticationHandler
是用所给的用户名和密码去建立数据库连接，根据连接建立是否成功来判断验证成功与
否；QueryDatabaseAuthenticationHandler 通过配置一个 SQL
语句查出密码，与所给密码匹配；SearchModeSearchDatabaseAuthenticationHandler
通过配置存放用户验证信息的表、用户名字段和密码字段，构造查询语句来验证。</p>
<p>使用哪个 AuthenticationHandler，需要在 deployerConfigContext.xml
中设置，默认情况下，CAS 使用一个简单的 username=password 的
AuthenticationHandler，在文件中可以找到如下一行：&lt;bean
class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePassword<br />
AuthenticationHandler"
/&gt;，我们可以将其注释掉，换成我们希望的一个
AuthenticationHandler，比如，使用QueryDatabaseAuthenticationHandler 或
SearchModeSearchDatabaseAuthenticationHandler 可以分别选取清单 5 或清单 6 的配置。</p>
<br />
<a name="N1016D"><strong>清单 5. 使用 QueryDatabaseAuthenticationHandler</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            &lt;bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"&gt;<br />
            &lt;property name="dataSource" ref=" casDataSource " /&gt;<br />
            &lt;property name="sql" <br />
            value="select password from userTable where lower(userName) = lower(?)" /&gt;<br />
            &lt;/bean&gt;<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<a name="N10177"><strong>清单 6. 使用 SearchModeSearchDatabaseAuthenticationHandler</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            &lt;bean id="SearchModeSearchDatabaseAuthenticationHandler"<br />
            class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler"<br />
            abstract="false" singleton="true" lazy-init="default" <br />
            autowire="default" dependency-check="default"&gt;<br />
            &lt;property  name="tableUsers"&gt;<br />
            &lt;value&gt;userTable&lt;/value&gt;<br />
            &lt;/property&gt;<br />
            &lt;property name="fieldUser"&gt;<br />
            &lt;value&gt;userName&lt;/value&gt;<br />
            &lt;/property&gt;<br />
            &lt;property name="fieldPassword"&gt;<br />
            &lt;value&gt;password&lt;/value&gt;<br />
            &lt;/property&gt;<br />
            &lt;property name="dataSource" ref=" casDataSource " /&gt;<br />
            &lt;/bean&gt;<br />
            <br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>另外，由于存放在数据库中的密码通常是加密过的，所以 AuthenticationHandler 在匹配时需要知道使用的加密方法，在
deployerConfigContext.xml 文件中我们可以为具体的 AuthenticationHandler 类配置一个
property，指定加密器类，比如对于 QueryDatabaseAuthenticationHandler，可以修改如清单7所示：</p>
<br />
<a name="N10184"><strong>清单 7. 添加 passwordEncoder</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            &lt;bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"&gt;<br />
            &lt;property name="dataSource" ref=" casDataSource " /&gt;<br />
            &lt;property name="sql" <br />
            value="select password from userTable where lower(userName) = lower(?)" /&gt;<br />
            &lt;property  name="passwordEncoder"  ref="myPasswordEncoder"/&gt;<br />
            &lt;/bean&gt;<br />
            <br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>其中 myPasswordEncoder 是对清单 8 中设置的实际加密器类的引用：</p>
<br />
<a name="N10191"><strong>清单 8. 指定具体加密器类</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            &lt;bean id="passwordEncoder" <br />
            class="org.jasig.cas.authentication.handler.MyPasswordEncoder"/&gt;<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>这里 MyPasswordEncoder 是根据实际情况自己定义的加密器，实现 PasswordEncoder 接口及其 encode() 方法。</p>
<p><strong>3. 部署依赖包</strong> </p>
<p>在以上配置完成以后，需要拷贝几个依赖的包到 cas 应用下，包括：</p>
<ul>
    <li>将 cas-server-support-jdbc-3.1.1.jar 拷贝到 %CATALINA_HOME%/webapps/cas/ WEB-INF/lib 目录。 </li>
    <li>数
    据库驱动，由于这里使用 DB2，将 %DB2_HOME%/java 目录下的 db2java.zip （更名为 db2java.jar）,
    db2jcc.jar, db2jcc_license_cu.jar 拷贝到
    %CATALINA_HOME%/webapps/cas/WEB-INF/lib 目录。对于其他数据库，同样将相应数据库驱动程序拷贝到该目录。 </li>
    <li>DataStore
    依赖于 commons-collections-3.2.jar, commons-dbcp-1.2.1.jar,
    commons-pool-1.3.jar，需要到 apache 网站的 Commons 项目下载以上 3 个包放进
    %CATALINA_HOME%/webapps/cas/WEB-INF/lib 目录。 </li>
</ul>
<p><a name="N101B0"><span class="smalltitle"><strong><font size="3">扩展 CAS Server 界面</font></strong></span></a></p>
<p>CAS 提供了 2 套默认的页面，分别为&#8220; default &#8221;和&#8220; simple &#8221;，分别在目录&#8220;
cas/WEB-INF/view/jsp/default &#8221;和&#8220; cas/WEB-INF/view/jsp/simple &#8221;下。其中
default 是一个稍微复杂一些的页面，使用 CSS，而 simple 则是能让 CAS 正常工作的最简化的页面。</p>
<p>在部署 CAS 之前，我们可能需要定制一套新的 CAS Server 页面，添加一些个性化的内容。最简单的方法就是拷贝一份
default 或 simple 文件到&#8220; cas/WEB-INF/view/jsp &#8221;目录下，比如命名为
newUI，接下来是实现和修改必要的页面，有 4 个页面是必须的：</p>
<ul>
    <li>casConfirmView.jsp: 当用户选择了&#8220; warn &#8221;时会看到的确认界面 </li>
    <li>casGenericSuccess.jsp: 在用户成功通过认证而没有目的Service时会看到的界面 </li>
    <li>casLoginView.jsp: 当需要用户提供认证信息时会出现的界面 </li>
    <li>casLogoutView.jsp: 当用户结束 CAS 单点登录系统会话时出现的界面 </li>
</ul>
<p>CAS 的页面采用 Spring 框架编写，对于不熟悉 Spring 的使用者，在修改之前需要熟悉该框架。</p>
<p>页面定制完过后，还需要做一些配置从而让 CAS 找到新的页面，拷贝&#8220;
cas/WEB-INF/classes/default_views.properties &#8221;，重命名为&#8220;
cas/WEB-INF/classes/ newUI_views.properties &#8221;，并修改其中所有的值到相应新页面。最后是更新&#8220;
cas/WEB-INF/cas-servlet.xml &#8221;文件中的 viewResolver，将其修改为如清单 9 中的内容。</p>
<br />
<a name="N101D4"><strong>清单 9. 指定 CAS 页面</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            &lt;bean id="viewResolver" <br />
            class="org.springframework.web.servlet.view.ResourceBundleViewResolver" p:order="0"&gt;<br />
            &lt;property name="basenames"&gt;<br />
            &lt;list&gt;<br />
            &lt;value&gt;${cas.viewResolver.basename}&lt;/value&gt;<br />
            &lt;value&gt; newUI_views&lt;/value&gt;<br />
            &lt;/list&gt;<br />
            &lt;/property&gt;<br />
            &lt;/bean&gt;<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td><img alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" height="1" /><br />
            <img alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" height="6" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" align="right" cellpadding="0" cellspacing="0">
    <tbody>
        <tr align="right">
            <td><img alt="" src="http://www.ibm.com/i/c.gif" width="100%" height="4" /><br />
            <table border="0" cellpadding="0" cellspacing="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" height="16" /><br />
                        </td>
                        <td align="right" valign="top"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#main"><strong><font color="#996699">回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="4.部署客户端应用"><span class="atitle">部署客户端应用</span></a></p>
<p>单点登录的目的是为了让多个相关联的应用使用相同的登录过程，本文在讲解过程中构造 2个简单的应用，分别以 casTest1 和
casTest2 来作为示例，它们均只有一个页面，显示欢迎信息和当前登录用户名。这 2
个应用使用同一套登录信息，并且只有登录过的用户才能访问，通过本文的配置，实现单点登录，即只需登录一次就可以访问这两个应用。</p>
<p><a name="N101E4"><span class="smalltitle"><strong><font size="3">与 CAS Server 建立信任关系</font></strong></span></a></p>
<p>假设 CAS Server 单独部署在一台机器 A，而客户端应用部署在机器 B 上，由于客户端应用与 CAS Server 的通信采用 SSL，因此，需要在 A 与 B 的 JRE 之间建立信任关系。</p>
<p>首先与 A 机器一样，要生成 B 机器上的证书，配置 Tomcat 的 SSL 协议。其次，下载<a href="http://blogs.sun.com/andreas/entry/no_more_unable_to_find"><font color="#5c81a7">http://blogs.sun.com/andreas/entry/no_more_unable_to_find</font></a>
的 InstallCert.java，运行&#8220; java InstallCert compA:8443 &#8221;命令，并且在接下来出现的询问中输入
1。这样，就将 A 添加到了 B 的 trust store 中。如果多个客户端应用分别部署在不同机器上，那么每个机器都需要与 CAS
Server 所在机器建立信任关系。</p>
<p><a name="N101F4"><span class="smalltitle"><strong><font size="3">配置 CAS Filter</font></strong></span></a></p>
<p>准备好应用 casTest1 和 casTest2 过后，分别部署在 B 和 C 机器上，由于 casTest1 和casTest2，B
和 C 完全等同，我们以 casTest1 在 B 机器上的配置做介绍，假设 A 和 B 的域名分别为 domainA 和 domainB。</p>
<p>将 cas-client-java-2.1.1.zip 改名为 cas-client-java-2.1.1.jar 并拷贝到 casTest1/WEB-INF/lib目录下，修改 web.xml 文件，添加 CAS Filter，如清单 10 所示：</p>
<br />
<a name="N10203"><strong>清单 10. 添加 CAS Filter</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            &lt;web-app&gt;<br />
            ...<br />
            &lt;filter&gt;<br />
            &lt;filter-name&gt;CAS Filter&lt;/filter-name&gt;<br />
            &lt;filter-class&gt;edu.yale.its.tp.cas.client.filter.CASFilter&lt;/filter-class&gt;<br />
            &lt;init-param&gt;<br />
            &lt;param-name&gt;edu.yale.its.tp.cas.client.filter.loginUrl&lt;/param-name&gt;<br />
            &lt;param-value&gt;https://domainA:8443/cas/login&lt;/param-value&gt;<br />
            &lt;/init-param&gt;<br />
            &lt;init-param&gt;<br />
            &lt;param-name&gt;edu.yale.its.tp.cas.client.filter.validateUrl&lt;/param-name&gt;<br />
            &lt;param-value&gt;https://domainA:8443/cas/serviceValidate&lt;/param-value&gt;<br />
            &lt;/init-param&gt;<br />
            &lt;init-param&gt;<br />
            &lt;param-name&gt;edu.yale.its.tp.cas.client.filter.serverName&lt;/param-name&gt;<br />
            &lt;param-value&gt;domainB:8080&lt;/param-value&gt;<br />
            &lt;/init-param&gt;<br />
            &lt;/filter&gt;<br />
            &lt;filter-mapping&gt;<br />
            &lt;filter-name&gt;CAS Filter&lt;/filter-name&gt;<br />
            &lt;url-pattern&gt;/protected-pattern/*&lt;/url-pattern&gt;<br />
            &lt;/filter-mapping&gt;<br />
            ...<br />
            &lt;/web-app&gt;<br />
            <br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>对于所有访问满足 casTest1/protected-pattern/ 路径的资源时，都要求到 CAS Server 登录，如果需要整个 casTest1 均受保护，可以将 url-pattern 指定为&#8220;/*&#8221;。</p>
<p>从清单 10 可以看到，我们可以为 CASFilter 指定一些参数，并且有些是必须的，<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#_Ref188033615"><font color="#996699">表格 1</font></a> 和<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#_Ref188033632"><font color="#996699">表格 2</font></a> 中分别是必需和可选的参数：</p>
<br />
<a name="表格1|table"><strong>表格 1. CASFilter 必需的参数</strong></a><br />
<table class="data-table-1" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="vertical-align: top; text-align: left;"><strong>参数名</strong> </td>
            <td style="vertical-align: top; text-align: left;"><strong>作用</strong> </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left;">edu.yale.its.tp.cas.client.filter.loginUrl </td>
            <td style="vertical-align: top; text-align: left;">指定 CAS 提供登录页面的 URL </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left;">edu.yale.its.tp.cas.client.filter.validateUrl </td>
            <td style="vertical-align: top; text-align: left;">指定 CAS 提供 service ticket 或 proxy ticket 验证服务的 URL </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left;">edu.yale.its.tp.cas.client.filter.serverName </td>
            <td style="vertical-align: top; text-align: left;">指定客户端的域名和端口，是指客户端应用所在机器而不是 CAS Server 所在机器，该参数或 serviceUrl 至少有一个必须指定 </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left;">edu.yale.its.tp.cas.client.filter.serviceUrl </td>
            <td style="vertical-align: top; text-align: left;">该参数指定过后将覆盖 serverName 参数，成为登录成功过后重定向的目的地址 </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<a name="表格2|table"><strong>表格 2. CASFilter 可选参数</strong></a><br />
<table class="data-table-1" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="vertical-align: top; text-align: left;"><strong>参数名</strong> </td>
            <td style="vertical-align: top; text-align: left;"><strong>作用</strong> </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left;">edu.yale.its.tp.cas.client.filter.proxyCallbackUrl </td>
            <td style="vertical-align: top; text-align: left;">用于当前应用需要作为其他服务的代理(proxy)时获取 Proxy Granting Ticket 的地址 </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left;">edu.yale.its.tp.cas.client.filter.authorizedProxy </td>
            <td style="vertical-align: top; text-align: left;">用
            于允许当前应用从代理处获取 proxy tickets，该参数接受以空格分隔开的多个 proxy
            URLs，但实际使用只需要一个成功即可。当指定该参数过后，需要修改 validateUrl 到 proxyValidate，而不再是
            serviceValidate </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left;">edu.yale.its.tp.cas.client.filter.renew </td>
            <td style="vertical-align: top; text-align: left;">如果指定为 true，那么受保护的资源每次被访问时均要求用户重新进行验证，而不管之前是否已经通过 </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left;">edu.yale.its.tp.cas.client.filter.wrapRequest </td>
            <td style="vertical-align: top; text-align: left;">如果指定为 true，那么 CASFilter 将重新包装 HttpRequest,并且使 getRemoteUser() 方法返回当前登录用户的用户名 </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left;">edu.yale.its.tp.cas.client.filter.gateway </td>
            <td style="vertical-align: top; text-align: left;">指定 gateway 属性 </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N102BB"><span class="smalltitle"><strong><font size="3">传递登录用户名</font></strong></span></a></p>
<p>CAS 在登录成功过后，会给浏览器回传 Cookie，设置新的到的 Service Ticket。但客户端应用拥有各自的
Session，我们要怎么在各个应用中获取当前登录用户的用户名呢？CAS Client 的 Filter
已经做好了处理，在登录成功后，就可以直接从 Session 的属性中获取，如清单 11 所示：</p>
<br />
<a name="N102C7"><strong>清单 11. 在 Java 中通过 Session 获取登录用户名</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            // 以下两者都可以<br />
            session.getAttribute(CASFilter.CAS_FILTER_USER);<br />
            session.getAttribute("edu.yale.its.tp.cas.client.filter.user");<br />
            <br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>在 JSTL 中获取用户名的方法如清单 12 所示：</p>
<br />
<a name="N102D4"><strong>清单 12. 通过 JSTL 获取登录用户名</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            &lt;c:out value="${sessionScope[CAS:'edu.yale.its.tp.cas.client.filter.user']}"/&gt;<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>另外，CAS 提供了一个 CASFilterRequestWrapper
类，该类继承自HttpServletRequestWrapper，主要是重写了 getRemoteUser() 方法，只要在前面配置
CASFilter 的时候为其设置&#8220; edu.yale.its.tp.cas.client.filter.wrapRequest &#8221;参数为
true，就可以通过 getRemoteUser（） 方法来获取登录用户名，具体方法如清单 13 所示：</p>
<br />
<a name="N102E1"><strong>清单 13. 通过 CASFilterRequestWrapper 获取登录用户名</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            CASFilterRequestWrapper  reqWrapper=new CASFilterRequestWrapper(request);<br />
            out.println("The logon user:" + reqWrapper.getRemoteUser());<br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td><img alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" height="1" /><br />
            <img alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" height="6" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" align="right" cellpadding="0" cellspacing="0">
    <tbody>
        <tr align="right">
            <td><img alt="" src="http://www.ibm.com/i/c.gif" width="100%" height="4" /><br />
            <table border="0" cellpadding="0" cellspacing="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" height="16" /><br />
                        </td>
                        <td align="right" valign="top"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#main"><strong><font color="#996699">回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="5.效果"><span class="atitle">效果</span></a></p>
<p>在 casTest1 和 casTest2 中，都有一个简单 Servlet 作为欢迎页面 WelcomPage，且该页面必须登录过后才能访问，页面代码如清单 14 所示：</p>
<br />
<a name="N102F4"><strong>清单 14. WelcomePage 页面代码</strong></a><br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">                <br />
            public class WelcomePage extends HttpServlet {<br />
            public void doGet(HttpServletRequest request, HttpServletResponse response)<br />
            throws IOException, ServletException<br />
            {<br />
            response.setContentType("text/html");<br />
            PrintWriter out = response.getWriter();<br />
            out.println("&lt;html&gt;");<br />
            out.println("&lt;head&gt;");<br />
            out.println("&lt;title&gt;Welcome to casTest2 sample System!&lt;/title&gt;");<br />
            out.println("&lt;/head&gt;");<br />
            out.println("&lt;body&gt;");<br />
            out.println("&lt;h1&gt;Welcome to casTest1 sample System!&lt;/h1&gt;");<br />
            CASFilterRequestWrapper  reqWrapper=new CASFilterRequestWrapper(request);<br />
            out.println("&lt;p&gt;The logon user:" + reqWrapper.getRemoteUser() + "&lt;/p&gt;");<br />
            HttpSession session=request.getSession();<br />
            out.println("&lt;p&gt;The logon user:" + <br />
            session.getAttribute(CASFilter.CAS_FILTER_USER)  + "&lt;/p&gt;");<br />
            out.println("&lt;p&gt;The logon user:" + <br />
            session.getAttribute("edu.yale.its.tp.cas.client.filter.user") + "&lt;/p&gt;");<br />
            out.println("&lt;/body&gt;");<br />
            out.println("&lt;/html&gt;");<br />
            }<br />
            }<br />
            <br />
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>在上面所有配置结束过后，分别在 A， B， C上启动 cas， casTest1 和 casTest2，按照下面步骤来访问 casTest1 和 casTest2：</p>
<ol type="1">
    <li>打开浏览器，访问 <a href="http://domainb:8080/casTest1/WelcomePage"><font color="#5c81a7">http://domainB:8080/casTest1/WelcomePage</font></a> ，浏览器会弹出安全提示，接受后即转到 CAS 的登录页面，如图 2 所示： </li>
</ol>
<br />
<a name="_Ref188554660"><strong>图 2. CAS 登录页面</strong></a><br />
<img alt="CAS 登录页面" src="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/images/image002.jpg" width="553" height="351" /> <br />
<ol type="1">
    <li>登录成功后，再重定向到 casTest1 的 WelcomePage 页面，如<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#_Ref188552289"><font color="#996699">图 </font></a>所示： </li>
</ol>
<br />
<a name="_Ref188552289"><strong>图 3. 登录后访问 casTest1 的效果</strong></a><br />
<img alt="登录后访问 casTest1 的效果" src="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/images/image003.jpg" width="554" height="315" /> <br />
<p>可以看到<a href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#_Ref188552289"><font color="#996699">图 </font></a>中地址栏里的地址多出了一个 ticket 参数，这就是 CAS 分配给当前应用的 ST(Service Ticket)。</p>
<ol type="1">
    <li>再在同一个浏览器的地址栏中输入 <a href="http://domainb:8080/casTest1/WelcomePage"><font color="#5c81a7">http://domainC:8080/casTest2/WelcomePage</font></a> ，系统不再提示用户登录，而直接出现如图 4 所示的页面，并且显示在 casTest1 中已经登录过的用户。 </li>
</ol>
<br />
<a name="N1034A"><strong>图 4. 在 casTest1 中登录过后访问 casTest2 的效果</strong></a><br />
<img alt="在 casTest1 中登录过后访问 casTest2 的效果" src="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/images/image004.jpg" width="553" height="307" /> <br />
<ol type="1">
    <li>重新打开一个浏览器窗口，先输入 <a href="http://domainb:8080/casTest1/WelcomePage"><font color="#5c81a7">http://domainC:8080/casTest2/WelcomePage</font></a> ，系统要求登录，在登录成功过后，正确显示 casTest2 的页面。之后再在地址栏重新输入 <a href="http://domainb:8080/casTest1/WelcomePage"><font color="#5c81a7">http://domainB:8080/casTest1/WelcomePage</font></a> ，会直接显示 casTest1 的页面而无需再次登录。 </li>
</ol>
<br />
<table width="100%" border="0" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td><img alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" height="1" /><br />
            <img alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" height="6" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" align="right" cellpadding="0" cellspacing="0">
    <tbody>
        <tr align="right">
            <td><img alt="" src="http://www.ibm.com/i/c.gif" width="100%" height="4" /><br />
            <table border="0" cellpadding="0" cellspacing="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" height="16" /><br />
                        </td>
                        <td align="right" valign="top"><a class="fbox" href="http://www-128.ibm.com/developerworks/cn/opensource/os-cn-cas/?S_TACT=105AGX52&amp;S_CMP=techcsdn#main"><strong><font color="#996699">回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="6.结束语"><span class="atitle">结束语</span></a></p>
<p>本文介绍了 CAS 单点登录解决方案的原理，并结合实例讲解了在 Tomcat 中使用 CAS 的配置、部署方法以及效果。CAS 是作为开源单点登录解决方案的一个不错选择，更多的使用细节可以参考 CAS 官方网站。</p>
<br />
<br />
<p><a name="resources"><span class="atitle">参考资料 </span></a></p>
<ul>
    <li>有关 CAS 方面的信息， 请参考<a href="http://www.ja-sig.org/products/cas"><font color="#5c81a7">CAS 官方网站</font></a>。 <br />
    <br />
    </li>
    <li>浏览<a href="http://www.ja-sig.org/facebook/"><font color="#5c81a7">JA-SIG 社区</font></a>，与社区分享 Java 技术。 <br />
    </li>
</ul>
转自：IBM开发者社区
<img src ="http://www.blogjava.net/xcp/aggbug/318122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-04-13 10:21 <a href="http://www.blogjava.net/xcp/archive/2010/04/13/318122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>单点登录的简单实现</title><link>http://www.blogjava.net/xcp/archive/2010/04/13/318114.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 13 Apr 2010 01:42:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/04/13/318114.html</guid><description><![CDATA[在门户项目中，经常会遇到如何实现单点登录的问题，下面就本人的经验做个总结。欢迎大家进行补充讨论。
<br />
<br />
单点登录的具体实现有很多种选择，包括：
<br />
采用专门的SSO商业软件： 主要有：Netgrity的Siteminder，已经被CA收购。Novell 公司的iChain。RSA公司的ClearTrust等。
<br />
采用门户产品供应商自己的SSO产品，如：BEA的WLES，IBM 的Tivoli Access Manager，Sun 公司的identity Server，Oracle公司的OID等。
<br />
这些商业软件一般适用于客户对SSO的需求很高，并且企业内部采用COTS软件如：Domino,SAP,Sieble的系统比较多的情况下采
用。并结合身份管理。统一认证等项目采用。采用这些软件一般都要对要集成的系统做些改造，如在要集成的系统上安装AGENT。现在一般只提供常见软件
如：Domino,SAP,Sieble，常见应用服务器：weblogic,websphere等的AGENT。要先统一这些系统的认证。一般采用
LDAP或数据库。然后才能实现SSO。比较麻烦。 <br />
另外，如果不想掏银子，也有OPEN SOURCE的SSO软件可选：主要有：http://www.josso.org/ https://opensso.dev.java.net/ http://www.sourceid.org 等。具体怎么样就不清楚了。
<br />
如果项目对SSO的要求比较低，又不想对要被集成的系统做任何改动，可采用下面介绍的方式简单实现：下面我们通过一个例子来说明。假如一个门户项目要对下面的几个系统做SSO。
<br />
<br />
<br />
<br />
用户在这些系统中的用户名，密码各不相同，如：员工号为001的员工在这些系统中的用户名，密码分别如下：
<br />
<br />
用户 系统 用户名 密码
<br />
001 Portal系统 A 1234
<br />
001 邮件系统 B 2345
<br />
001 DOMINO系统 C AAAA
<br />
001 报销系统 D CCCC
<br />
001 工资系统 E BBBB
<br />
<br />
首先，建立员工在PORTAL系统中的用户名和其他系统中的用户名之间的对应关系
<br />
首先，要建立员工在PORTAL系统中的用户名和其他系统中的用户名之间的对应关系并保存。可保存在表中或LDAP中或文件系统中。当然要考
虑这些系统之间的数据同步问题。比较好的方式是找到用户在这些系统中的都存在的唯一信息（如员工号，MAIL地址，姓名等）。通过唯一信息实时到各个系统
中去取认证所需要的信息。就不需要考虑数据同步问题。比较实用。可以建立类似下面的表：密码可采用加密保存。如果是采用BEA的Weblogic
Portal,可采用UUP来保存这些信息。
<br />
<br />
(
<br />
<br />
user	 varchar2(20),&nbsp;&nbsp; 	/*用户名*/
<br />
app_name varchar2(20),&nbsp; 	/*应用系统*/
<br />
architect varchar2(4),&nbsp; 		/*应用系统的架构BS或CS*/
<br />
app_company varchar2(50),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*用户所属分公司*/
<br />
app_department varchar2(50),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*用户所在的部门*/
<br />
app_user varchar2(15),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*在该系统中的用户名*/
<br />
app_passwd varchar2(15), 	/*在该系统中的密码*/
<br />
app_cookie varchar2(30),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*COOKIE名称*/
<br />
form_user varchar2(20),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*认证页面中FORM的用户名字段*/
<br />
form_passwd varchar2(20),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*认证页面中FORM的密码字段*/
<br />
app_special&nbsp; varchar2(20)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*其他*/
<br />
);
<br />
通过IFRAME或超连接方式集成目标系统，并进行SSO
<br />
通过IFRAME或超连接方式集成目标系统,并在URL中带上用户名和密码。如集成DOMINO可采用如下方式：
<br />
<br />
&lt;IFRAME src=http://host1/names.nsf?Login&amp;Username=admin&amp;Password=pass&amp;RedirectTo=/names.nsf
<br />
width="100%" frameborder="0" align="center" height="100%"
hspace="0" marginheight="0" marginwidth="0" scrolling="yes"
style="background-color:#f7f7ff;"&gt;
<br />
&lt;/IFRAME&gt;
<br />
<br />
或：
<br />
Href src=&#8220;http:// host1/names.nsf?Login&amp;Username=admin&amp;Password=pass&amp;RedirectTo=/names.nsf&#8221;
<br />
以上采用的是在HTTP中直接传递明码，为提高安全性，可采用HTTPS来传递用户名和密码。另外采用这种方式被集成的系统必须支持FORM方式认证。J2EE应用，DOMINO等都支持FORM认证。
<br />
<br />
这两种方式如果SSO成功，就自动进入目标系统的界面，如果实现会显示目标系统的登录界面。其效果图如下：
<br />
<br />
<br />
<br />
这种方式，必须维护对应关系表，如上面的sso_info。更好的方式是提供界面，让最终用户自己维护这种对应关系，可模仿Compoze
portlets for
lotus的做法，在用户第一次进入要与之做SSO的系统时，如DOMINO系统，显示一个界面，让用户自己输入他在该系统中的用户名/密码等信息。并保
存到表中或LDAP等其他数据源中。以后用户要进入这些系统时，就直接从表中或其他数据源中取用户的用户名/密码等信息，帮助用户做认证。建议采用这种方
式。如下图所示。如果用户改变了自己在DOMINO系统中的用户名，密码。从门户系统进入DOMINO系统时，认证会失败，就重新显示类似下面的界面。让
用户重新输入他在DOMINO系统中新的用户名，密码并保存。
<br />
<br />
<br />
<br />
以上这种实现方式，一般需要浏览器支持COOKIE，所以要注意浏览器的配置，在开发阶段，为方便调试，可设置IE，让它显示COOKIE的名称。如下所示：
<br />
<br />
<br />
<br />
采用这种方式，对要集成的系统不需要做任何的改动。如果PORTAL系统中的用户在被集成的系统中的权限都一样，可采用建立一个通用用户的做
法。也就是所有在PORTAL系统中的用户都采用这个通用用户进入目标系统。这种方式等于是采用页面集成方式做集成。比较方便使用。另外，有时候需要采用
调用API，或配置Adapter等应用集成方式来集成其他系统，一般也是通过定义一个连接专用的用户。在API中或在配置Adapter的时候写死。如
采用JAVA API方式集成DOMINO：
<br />
<br />
lotus.domino.Session dominoSession = NotesFactory.createSession(dominoServer, &#8220;admin&#8221;, &#8220;password&#8221;);
<br />
<br />
CS结构实现方式
<br />
经常有人问CS结构的应用如何实现SSO，本人的建议是对这种系统不要自己去实现SSO。很麻烦，其实输个用户名，密码没什么大不了的。如果
要实现，一是采用商业软件。另外也可以采用以下方式：在PORTAL的PORTLET上建立超连接。并通过APPLET方式启动CS结构的应用系统的登录
界面。然后通过如下的方式把用户名/密码传递过去。
<br />
<br />
-不能做任何改动的客户端 - WIN消息（给登录窗口发送用户名，密码等登录所需要的信息）,模拟键盘（java有模拟键盘输入的API）
<br />
<br />
-可以做改动的客户端 - 参数传递，并让登录的EXE文件读取参数进行认证。
<br />
<br />
因为要让APPLET执行本地的EXE文件，所以必须对IE中的JRE的安全进行设置。
<br />
<br />
<br />
<br />
其他：
<br />
在采用以上方式实现了SSO后，要注意LOGOUT，可采用与LOGIN相同的方式。也可以通过被集成系统的超时设置来实现。
<br />
<br />
单点登录SSO技术资料收集
<br />
统一用户认证和单点登录解决方案:&nbsp; 计算机世界网上的文章,比较全面的介绍统一用户认证和单点登录解决方案
<br />
惠普灵动单点登录(SSO)解决方案:&nbsp; 包括C/S结构的系统单点登录解决方案
<br />
网站用户单点登录系统解决方案:&nbsp; 通过令牌方式实现网站用户单点登录
<br />
WebLogic平台的Web SSO（SAML）解决方案:&nbsp; 在WebLogic 8.1SP4中，提供了用于和Microsoft
Windows客户端进行SSO的Single Pass Negotiate Identity Assertion
Provider。本文对其做了详细的介绍。 <br />
http://blog.beijingnet.com/index.php?blogId=4:&nbsp; 收录了一些SSO方面的文章
<br />
应用整合中SSO的技术实现:&nbsp; 作者介绍了南京地税进行应用整合SSO的技术实现方案
<img src ="http://www.blogjava.net/xcp/aggbug/318114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-04-13 09:42 <a href="http://www.blogjava.net/xcp/archive/2010/04/13/318114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中cookie的crud</title><link>http://www.blogjava.net/xcp/archive/2010/04/13/318106.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 13 Apr 2010 01:05:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/04/13/318106.html</guid><description><![CDATA[1.设置Cookie
<p>　　Cookie cookie = new Cookie("key", "value"); </p>
<p>　　cookie.setMaxAge(60); </p>
<p>　　设置60秒生存期，如果设置为负值的话，则为浏览器进程Cookie(内存中保存)，关闭浏览器就失效。 </p>
<p>　　cookie.setPath("/test/test2"); </p>
<p>　　设置Cookie路径，不设置的话为当前路径(对于Servlet来说为request.getContextPath() + web.xml里配置的该Servlet的url-pattern路径部分) </p>
<p>　　response.addCookie(cookie); </p>
<p>2.读取Cookie </p>
<p>　　该方法可以读取当前路径以及&#8220;直接父路径&#8221;的所有Cookie对象，如果没有任何Cookie的话，则返回null </p>
<p>　　Cookie[] cookies = request.getCookies(); </p>
<p>3.删除Cookie </p>
<p>　　Cookie cookie = new Cookie("key", null); </p>
<p>　　cookie.setMaxAge(0); </p>
<p>　　设置为0为立即删除该Cookie </p>
<p>　　cookie.setPath("/test/test2"); </p>
<p>　　删除指定路径上的Cookie，不设置该路径，默认为删除当前路径Cookie </p>
<p>　　response.addCookie(cookie); </p>
<p>4.修改Cookie</p>
<p>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;Cookie[] cookies=request.getCookies(); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(cookies.length&gt;1){ <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;cookies.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(cookies[i].getName().equals("key")) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String oldValue = cookies[i].getValue();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;newValue=&nbsp;&nbsp;"newValue";</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cookies[i].setValue(newValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; response.addCookie(cookies[i]);&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<img src ="http://www.blogjava.net/xcp/aggbug/318106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-04-13 09:05 <a href="http://www.blogjava.net/xcp/archive/2010/04/13/318106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA单例模式的几种实现方法</title><link>http://www.blogjava.net/xcp/archive/2010/01/12/singleton1.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 12 Jan 2010 08:45:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/01/12/singleton1.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/309172.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/01/12/singleton1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/309172.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/309172.html</trackback:ping><description><![CDATA[<p>1.饿汉式单例类</p>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;pattern.singleton;<br />
</span><span style="color: #008000">//</span><span style="color: #008000">饿汉式单例类.在类初始化时，已经自行实例化&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Singleton1&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">私有的默认构造子</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Singleton1()&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">已经自行实例化&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Singleton1&nbsp;single&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Singleton1();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">静态工厂方法&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Singleton1&nbsp;getInstance()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;single;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
</div>
</div>
<br />
<br />
2.懒汉式单例类<br />
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;pattern.singleton;<br />
</span><span style="color: #008000">//</span><span style="color: #008000">懒汉式单例类.在第一次调用的时候实例化&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Singleton2&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">私有的默认构造子</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Singleton2()&nbsp;{}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">注意，这里没有final&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Singleton2&nbsp;single;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">只实例化一次</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;single&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Singleton2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">静态工厂方法&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">synchronized</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Singleton2&nbsp;getInstance()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(single&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;single&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Singleton2();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;single;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</div>
</span></div>
</div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在上面给出懒汉式单例类实现里对静态工厂方法使用了同步化，以处理多线程环境。有些设计师在这里建议使用所谓的"双重检查成例".必须指出的是，"双重检查成例"不可以在Java 语言中使用。不十分熟悉的读者，可以看看后面给出的小节。 同样，由于构造子是私有的，因此，此类不能被继承。饿汉式单例类在自己被加载时就将自己实例化。即便加载器是静态的，在饿汉式单例类被加载时仍会将自己实例化。单从资源利用效率角度来讲，这个比懒汉式单例类稍差些。从速度和反应时间角度来讲，则比懒汉式单例类稍好些。然而，懒汉式单例类在实例化时，必须处
<p>理好在多个线程同时首次引用此类时的访问限制问题，特别是当单例类作为资源控制器，在实例化时必然涉及资源初始化，而资源初始化很有可能耗费时间。这意味着出现多线程同时首次引用此类的机率变得较大。 </p>
<p>　　饿汉式单例类可以在Java 语言内实现， 但不易在C++ 内实现，因为静态初始化在C++ 里没有固定的顺序，因而静态的m_instance 变量的初始化与类的加载顺序没有保证，可能会出问题。这就是为什么GoF 在提出单例类的概念时，举的例子是懒汉式的。他们的书影响之大，以致Java 语言中单例类的例子也大多是懒汉式的。实际上，本书认为饿汉式单例类更符合Java 语言本身的特点。</p>
<br />
<br />
3.登记式单例类.<br />
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;pattern.singleton;<br />
<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.HashMap;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Map;<br />
<br />
</span><span style="color: #008000">//</span><span style="color: #008000">登记式单例类.<br />
</span><span style="color: #008000">//</span><span style="color: #008000">类似Spring里面的方法，将类名注册，下次从里面直接获取。</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Singleton3&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,Singleton3</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,Singleton3</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Singleton3&nbsp;single&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Singleton3();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(single.getClass().getName(),&nbsp;single);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">保护的默认构造子</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Singleton3(){}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">静态工厂方法,返还此类惟一的实例</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Singleton3&nbsp;getInstance(String&nbsp;name)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(name&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Singleton3.</span><span style="color: #0000ff">class</span><span style="color: #000000">.getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">name&nbsp;==&nbsp;null</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">---&gt;name=</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(map.get(name)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(name,&nbsp;(Singleton3)&nbsp;Class.forName(name).newInstance());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(InstantiationException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(IllegalAccessException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(ClassNotFoundException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;map.get(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">一个示意性的商业方法</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;about()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hello,&nbsp;I&nbsp;am&nbsp;RegSingleton.</span><span style="color: #000000">"</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Singleton3&nbsp;single3&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Singleton3.getInstance(</span><span style="color: #0000ff">null</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(single3.about());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
</div>
</div>
<img src ="http://www.blogjava.net/xcp/aggbug/309172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-01-12 16:45 <a href="http://www.blogjava.net/xcp/archive/2010/01/12/singleton1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>问大家一个多态的问题？？</title><link>http://www.blogjava.net/xcp/archive/2010/01/05/duotai.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Tue, 05 Jan 2010 12:32:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2010/01/05/duotai.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/308342.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2010/01/05/duotai.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/308342.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/308342.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;最近做项目的时候遇到一个问题：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;例：public static AAA parse(String dest,String ... formatRegulars) throws NullPointerException,Exception {}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;要求：1、我要实现formatRegulars参数是固定的从一个配置文件，枚举，或者任何地方来固定数据源， 也就是formatRegulars来源固定。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、当我们在数据源(配置文件，枚举等)里面又新增一个数据时，不用修改parse方法里面的代码？<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;这肯定要用到多态!<br />
&nbsp;&nbsp;&nbsp;&nbsp;求高手指点：public static AAA parse(String dest,?) throws NullPointerException,Exception {}&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;小弟在线等，谢谢！
<img src ="http://www.blogjava.net/xcp/aggbug/308342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2010-01-05 20:32 <a href="http://www.blogjava.net/xcp/archive/2010/01/05/duotai.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用JAVA操作EXCEL文件</title><link>http://www.blogjava.net/xcp/archive/2009/12/24/jxl.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Thu, 24 Dec 2009 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2009/12/24/jxl.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/307167.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2009/12/24/jxl.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/307167.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/307167.html</trackback:ping><description><![CDATA[<blockquote>使用Windows操作系统的朋友对Excel（电子表格）一定不会陌生，但是要使用Java语言来操纵Excel文件并不是一件容易的事。在Web应用日益盛行的今天，通过Web来操作Excel文件的需求越来越强烈，目前较为流行的操作是在JSP或Servlet 中创建一个CSV （comma separated values）文件，并将这个文件以MIME，text/csv类型返回给浏览器，接着浏览器调用Excel并且显示CSV文件。这样只是说可以访问到Excel文件，但是还不能真正的操纵Excel文件，本文将给大家一个惊喜，向大家介绍一个开放源码项目，Java Excel API，使用它大家就可以方便地操纵Excel文件了。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<p><a name="1"><span class="atitle">JAVA EXCEL API简介</span></a></p>
<p>
<p>Java Excel是一开放源码项目，通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的，所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。</p>
<p>现在发布的稳定版本是V2.0，提供以下功能：</p>
<ul>
    <li>从Excel 95、97、2000等格式的文件中读取数据；
    <li>读取Excel公式（可以读取Excel 97以后的公式）；
    <li>生成Excel数据表（格式为Excel 97）；
    <li>支持字体、数字、日期的格式化；
    <li>支持单元格的阴影操作，以及颜色操作；
    <li>修改已经存在的数据表； </li>
</ul>
<p>现在还不支持以下功能，但不久就会提供了：</p>
<ol>
    <li>不能够读取图表信息；
    <li>可以读，但是不能生成公式，任何类型公式最后的计算值都可以读出； </li>
</ol>
<br />
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="34" sizcache="2">
    <tbody sizset="34" sizcache="1">
        <tr>
            <td><img alt="" src="//www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" height="1" /><br />
            <img border="0" alt="" src="//www.ibm.com/i/c.gif" width="8" height="6" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizset="35" sizcache="2">
    <tbody sizset="36" sizcache="2">
        <tr align="right" sizset="36" sizcache="2">
            <td sizset="36" sizcache="2"><img alt="" src="//www.ibm.com/i/c.gif" width="100%" height="4" /><br />
            <table border="0" cellspacing="0" cellpadding="0" sizset="36" sizcache="2">
                <tbody sizset="36" sizcache="1">
                    <tr>
                        <td valign="middle"><img border="0" alt="" src="//www.ibm.com/i/v14/icons/u_bold.gif" width="16" height="16" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="#main" cmimpressionsent="1"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="2"><span class="atitle">应用示例</span></a></p>
<p>
<p><a name="N1006E"><span class="smalltitle">1 从Excel文件读取数据表</span></a></p>
<p>
<p>Java Excel API既可以从本地文件系统的一个文件(.xls)，也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术语：工作薄)，下面的代码片段举例说明了应该如何操作：(完整代码见ExcelReading.java)</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="37" sizcache="2">
    <tbody sizset="37" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">import java.io.*;
            import jxl.*;
            &#8230; &#8230; &#8230; &#8230;
            try
            {
            //构建Workbook对象, 只读Workbook对象
            //直接从本地文件创建Workbook
            //从输入流创建Workbook
            InputStream is = new FileInputStream(sourcefile);
            jxl.Workbook rwb = Workbook.getWorkbook(is);
            }
            catch (Exception e)
            {
            e.printStackTrace();
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>一旦创建了Workbook，我们就可以通过它来访问Excel Sheet(术语：工作表)。参考下面的代码片段：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="38" sizcache="2">
    <tbody sizset="38" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">//获取第一张Sheet表
            Sheet rs = rwb.getSheet(0);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>我们既可能通过Sheet的名称来访问它，也可以通过下标来访问它。如果通过下标来访问的话，要注意的一点是下标从0开始，就像数组一样。</p>
<p>一旦得到了Sheet，我们就可以通过它来访问Excel Cell(术语：单元格)。参考下面的代码片段：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="39" sizcache="2">
    <tbody sizset="39" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">//获取第一行，第一列的值
            Cell c00 = rs.getCell(0, 0);
            String strc00 = c00.getContents();
            //获取第一行，第二列的值
            Cell c10 = rs.getCell(1, 0);
            String strc10 = c10.getContents();
            //获取第二行，第二列的值
            Cell c11 = rs.getCell(1, 1);
            String strc11 = c11.getContents();
            System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
            System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
            System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>如果仅仅是取得Cell的值，我们可以方便地通过getContents()方法，它可以将任何类型的Cell值都作为一个字符串返回。示例代码中Cell(0, 0)是文本型，Cell(1, 0)是数字型，Cell(1,1)是日期型，通过getContents()，三种类型的返回值都是字符型。</p>
<p>如果有需要知道Cell内容的确切类型，API也提供了一系列的方法。参考下面的代码片段：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="40" sizcache="2">
    <tbody sizset="40" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">String strc00 = null;
            double strc10 = 0.00;
            Date strc11 = null;
            Cell c00 = rs.getCell(0, 0);
            Cell c10 = rs.getCell(1, 0);
            Cell c11 = rs.getCell(1, 1);
            if(c00.getType() == CellType.LABEL)
            {
            LabelCell labelc00 = (LabelCell)c00;
            strc00 = labelc00.getString();
            }
            if(c10.getType() == CellType.NUMBER)
            {
            NmberCell numc10 = (NumberCell)c10;
            strc10 = numc10.getValue();
            }
            if(c11.getType() == CellType.DATE)
            {
            DateCell datec11 = (DateCell)c11;
            strc11 = datec11.getDate();
            }
            System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType());
            System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType());
            System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType());
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>在得到Cell对象后，通过getType()方法可以获得该单元格的类型，然后与API提供的基本类型相匹配，强制转换成相应的类型，最后调用相应的取值方法getXXX()，就可以得到确定类型的值。API提供了以下基本类型，与Excel的数据格式相对应，如下图所示：</p>
<br />
<img alt="" src="image001.jpg" width="365" height="218" /> <br />
<p>每种类型的具体意义，请参见Java Excel API Document。</p>
<p>当你完成对Excel电子表格数据的处理后，一定要使用close()方法来关闭先前创建的对象，以释放读取数据表的过程中所占用的内存空间，在读取大量数据时显得尤为重要。参考如下代码片段：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="41" sizcache="2">
    <tbody sizset="41" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">//操作完成时，关闭对象，释放占用的内存空间
            rwb.close();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>Java Excel API提供了许多访问Excel数据表的方法，在这里我只简要地介绍几个常用的方法，其它的方法请参考附录中的Java Excel API Document。</p>
<p><strong>Workbook类提供的方法</strong> </p>
<p>1. int getNumberOfSheets() <br />
获得工作薄（Workbook）中工作表（Sheet）的个数，示例： </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="42" sizcache="2">
    <tbody sizset="42" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            int sheets = rwb.getNumberOfSheets();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>2. Sheet[] getSheets() <br />
返回工作薄（Workbook）中工作表（Sheet）对象数组，示例： </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="43" sizcache="2">
    <tbody sizset="43" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            Sheet[] sheets = rwb.getSheets();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>3. String getVersion() <br />
返回正在使用的API的版本号，好像是没什么太大的作用。 </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="44" sizcache="2">
    <tbody sizset="44" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            String apiVersion = rwb.getVersion();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><strong>Sheet接口提供的方法</strong> </p>
<p>1) String getName() <br />
获取Sheet的名称，示例： </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="45" sizcache="2">
    <tbody sizset="45" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            String sheetName = rs.getName();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>2) int getColumns() <br />
获取Sheet表中所包含的总列数，示例： </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="46" sizcache="2">
    <tbody sizset="46" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            int rsColumns = rs.getColumns();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>3) Cell[] getColumn(int column) <br />
获取某一列的所有单元格，返回的是单元格对象数组，示例： </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="47" sizcache="2">
    <tbody sizset="47" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            Cell[] cell = rs.getColumn(0);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>4) int getRows() <br />
获取Sheet表中所包含的总行数，示例： </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="48" sizcache="2">
    <tbody sizset="48" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            int rsRows = rs.getRows();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>5) Cell[] getRow(int row) <br />
获取某一行的所有单元格，返回的是单元格对象数组，示例子： </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="49" sizcache="2">
    <tbody sizset="49" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            Cell[] cell = rs.getRow(0);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>6) Cell getCell(int column, int row) <br />
获取指定单元格的对象引用，需要注意的是它的两个参数，第一个是列数，第二个是行数，这与通常的行、列组合有些不同。 </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="50" sizcache="2">
    <tbody sizset="50" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File(sourcefile));
            jxl.Sheet rs = rwb.getSheet(0);
            Cell cell = rs.getCell(0, 0);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="N10113"><span class="smalltitle">2 生成新的Excel工作薄</span></a></p>
<p>
<p>下面的代码主要是向大家介绍如何生成简单的Excel工作表，在这里单元格的内容是不带任何修饰的(如：字体，颜色等等)，所有的内容都作为字符串写入。(完整代码见ExcelWriting.java)</p>
<p>与读取Excel工作表相似，首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象，这里要注意的是，只能通过API提供的工厂方法来创建Workbook，而不能使用WritableWorkbook的构造函数，因为类WritableWorkbook的构造函数为protected类型。示例代码片段如下：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="51" sizcache="2">
    <tbody sizset="51" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">import java.io.*;
            import jxl.*;
            import jxl.write.*;
            &#8230; &#8230; &#8230; &#8230;
            try
            {
            //构建Workbook对象, 只读Workbook对象
            //Method 1：创建可写入的Excel工作薄
            jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(targetfile));
            //Method 2：将WritableWorkbook直接写入到输出流
            /*
            OutputStream os = new FileOutputStream(targetfile);
            jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(os);
            */
            }
            catch (Exception e)
            {
            e.printStackTrace();
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>API提供了两种方式来处理可写入的输出流，一种是直接生成本地文件，如果文件名不带全路径的话，缺省的文件会定位在当前目录，如果文件名带有全路径的话，则生成的Excel文件则会定位在相应的目录；另外一种是将Excel对象直接写入到输出流，例如：用户通过浏览器来访问Web服务器，如果HTTP头设置正确的话，浏览器自动调用客户端的Excel应用程序，来显示动态生成的Excel电子表格。</p>
<p>接下来就是要创建工作表，创建工作表的方法与创建工作薄的方法几乎一样，同样是通过工厂模式方法获得相应的对象，该方法需要两个参数，一个是工作表的名称，另一个是工作表在工作薄中的位置，参考下面的代码片段：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="52" sizcache="2">
    <tbody sizset="52" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">//创建Excel工作表
            jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>"这锅也支好了，材料也准备齐全了，可以开始下锅了！"，现在要做的只是实例化API所提供的Excel基本数据类型，并将它们添加到工作表中就可以了，参考下面的代码片段：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="53" sizcache="2">
    <tbody sizset="53" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">//1.添加Label对象
            jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell");
            ws.addCell(labelC);
            //添加带有字型Formatting的对象
            jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
            <!-- code sample is too wide -->jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);
            jxl.write.Label labelCF = new jxl.write.Label(1, 0, "This is a Label Cell", wcfF);
            ws.addCell(labelCF);
            //添加带有字体颜色Formatting的对象
            jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,
            <!-- code sample is too wide -->UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
            jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
            jxl.write.Label labelCFC = new jxl.write.Label(1, 0, "This is a Label Cell", wcfFC);
            ws.addCell(labelCF);
            //2.添加Number对象
            jxl.write.Number labelN = new jxl.write.Number(0, 1, 3.1415926);
            ws.addCell(labelN);
            //添加带有formatting的Number对象
            jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
            jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);
            jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
            ws.addCell(labelNF);
            //3.添加Boolean对象
            jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
            ws.addCell(labelB);
            //4.添加DateTime对象
            jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
            ws.addCell(labelDT);
            //添加带有formatting的DateFormat对象
            jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
            jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);
            jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF);
            ws.addCell(labelDTF);
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>这里有两点大家要引起大家的注意。第一点，在构造单元格时，单元格在工作表中的位置就已经确定了。一旦创建后，单元格的位置是不能够变更的，尽管单元格的内容是可以改变的。第二点，单元格的定位是按照下面这样的规律(column, row)，而且下标都是从0开始，例如，A1被存储在(0, 0)，B1被存储在(1, 0)。</p>
<p>最后，不要忘记关闭打开的Excel工作薄对象，以释放占用的内存，参见下面的代码片段：</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="54" sizcache="2">
    <tbody sizset="54" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">//写入Exel工作表
            wwb.write();
            //关闭Excel工作薄对象
            wwb.close();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>这可能与读取Excel文件的操作有少少不同，在关闭Excel对象之前，你必须要先调用write()方法，因为先前的操作都是存储在缓存中的，所以要通过该方法将操作的内容保存在文件中。如果你先关闭了Excel对象，那么只能得到一张空的工作薄了。</p>
<p><a name="N10143"><span class="smalltitle">3 拷贝、更新Excel工作薄</span></a></p>
<p>接下来简要介绍一下如何更新一个已经存在的工作薄，主要是下面二步操作，第一步是构造只读的Excel工作薄，第二步是利用已经创建的Excel工作薄创建新的可写入的Excel工作薄，参考下面的代码片段：(完整代码见ExcelModifying.java)</p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" sizset="55" sizcache="2">
    <tbody sizset="55" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">//创建只读的Excel工作薄的对象
            jxl.Workbook rw = jxl.Workbook.getWorkbook(new File(sourcefile));
            //创建可写入的Excel工作薄对象
            jxl.write.WritableWorkbook  wwb = Workbook.createWorkbook(new File(targetfile), rw);
            //读取第一张工作表
            jxl.write.WritableSheet ws = wwb.getSheet(0);
            //获得第一个单元格对象
            jxl.write.WritableCell wc = ws.getWritableCell(0, 0);
            //判断单元格的类型, 做出相应的转化
            if(wc.getType() == CellType.LABEL)
            {
            Label l = (Label)wc;
            l.setString("The value has been modified.");
            }
            //写入Excel对象
            wwb.write();
            //关闭可写入的Excel对象
            wwb.close();
            //关闭只读的Excel对象
            rw.close();
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>之所以使用这种方式构建Excel对象，完全是因为效率的原因，因为上面的示例才是API的主要应用。为了提高性能，在读取工作表时，与数据相关的一些输出信息，所有的格式信息，如：字体、颜色等等，是不被处理的，因为我们的目的是获得行数据的值，既使没有了修饰，也不会对行数据的值产生什么影响。唯一的不利之处就是，在内存中会同时保存两个同样的工作表，这样当工作表体积比较大时，会占用相当大的内存，但现在好像内存的大小并不是什么关键因素了。</p>
<p>一旦获得了可写入的工作表对象，我们就可以对单元格对象进行更新的操作了，在这里我们不必调用API提供的add()方法，因为单元格已经于工作表当中，所以我们只需要调用相应的setXXX()方法，就可以完成更新的操作了。</p>
<p>尽单元格原有的格式化修饰是不能去掉的，我们还是可以将新的单元格修饰加上去，以使单元格的内容以不同的形式表现。</p>
<p>新生成的工作表对象是可写入的，我们除了更新原有的单元格外，还可以添加新的单元格到工作表中，这与示例2的操作是完全一样的。</p>
<p>最后，不要忘记调用write()方法，将更新的内容写入到文件中，然后关闭工作薄对象，这里有两个工作薄对象要关闭，一个是只读的，另外一个是可写入的。<br />
<br />
http://www.ibm.com/developerworks/cn/java/l-javaExcel/index.html</p>
<img src ="http://www.blogjava.net/xcp/aggbug/307167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2009-12-24 16:05 <a href="http://www.blogjava.net/xcp/archive/2009/12/24/jxl.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置java连接池 tomcat方式、Spring方式配置的比较(修正版)</title><link>http://www.blogjava.net/xcp/archive/2009/11/04/datasource2.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Wed, 04 Nov 2009 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2009/11/04/datasource2.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/301057.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2009/11/04/datasource2.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/301057.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/301057.html</trackback:ping><description><![CDATA[<p><strong>一、首先配置连接池</strong><br />
1、tomcat下配置连接池<br />
&nbsp; *&gt;在tomcat下的context.xml配置连接池代码&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><span style="color: #0000ff">&lt;</span><span style="color: #800000">Resource<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jdbc/sqlserver"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//连接池名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff">="javax.sql.DataSource"</span><span style="color: #ff0000">&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password</span><span style="color: #0000ff">="syl6413"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;driverClassName</span><span style="color: #0000ff">="com.microsoft.sqlserver.jdbc.SQLServerDriver"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxIdle</span><span style="color: #0000ff">="5"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxWait</span><span style="color: #0000ff">="5000"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username</span><span style="color: #0000ff">="sa"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url</span><span style="color: #0000ff">="jdbc:sqlserver://192.168.0.9:1433;&nbsp;DatabaseName=disasterSystem"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxActive</span><span style="color: #0000ff">="10"</span><span style="color: #0000ff">/&gt;</span></div>
</div>
</div>
&nbsp;&nbsp;&nbsp;&nbsp;*&gt;tomcat连接池中配置web.xml代码
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;DataSource&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">resource-ref</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">SQLServer2005&nbsp;Datasource&nbsp;disasterSystem</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">description</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">res-ref-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">jdbc/sqlserver</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-ref-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">res-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">javax.sql.DataSource</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-type</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">res-auth</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Container</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">res-auth</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">resource-ref</span><span style="color: #0000ff">&gt;</span></div>
</div>
</div>
&nbsp;&nbsp;&nbsp;&nbsp;*&gt;在Spring配置tomcat连接池的JNDI代码<br />
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.jndi.JndiObjectFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="jndiName"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="java:comp/env/jdbc/sqlserver"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</div>
</span></div>
</div>
&nbsp;&nbsp;&nbsp;&nbsp;自此tomcat连接池已配置完毕，若不用Spring管理连接池，也可以不配Spring，这样即可以在程序中使用tomcat连接池了.若使用Spring来统一管理连接池，也就是统一SessionFactory，配置方式如下:&nbsp;&nbsp;&nbsp;&nbsp;
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #ff0000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="dataSource"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="hibernateProperties"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.dialect"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.hibernate.dialect.SQLServerDialect<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.connection.autocommit"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;显示sql语句&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.show_sql"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;解决提交乱码问题&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="connection.useUnicode"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="connection.characterEncoding"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">utf-8</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;格式化sql语句&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.format_sql"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.order_updates"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;事务自动管理&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="hibernate.connection.release_mode"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;after_transaction<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="mappingResources"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span></div>
</div>
</div>
&nbsp;2、tomcat下配置连接池<br />
&nbsp;&nbsp;&nbsp;&nbsp;Spring不通过用tomcat中配置的JNDI来连接，但是它也是通过用commons.dbcp.jar连接池来管理的，也可以通过其他的开源连接池工具如：C3P0等。配置又分为两种，具体代码如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;*&gt;一种是直接配置applicationContext.xml&nbsp;&nbsp;&nbsp;&nbsp;
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.commons.dbcp.BasicDataSource"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="driverClassName"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="oracle.jdbc.driver.OracleDriver"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="url"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="jdbc:oracle:thin:@localhost:1521:SJY"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="username"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="**"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="password"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="**"</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span></div>
</div>
</div>
&nbsp;&nbsp;&nbsp;&nbsp;*&gt;另一种是通过perportise配置文件：datasource.properties再通过applicationContext.xml得到<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datasource.properties代码：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><span style="color: #000000">datasource.driverClassName</span><span style="color: #000000">=</span><span style="color: #000000">com.microsoft.sqlserver.jdbc.SQLServerDriver<br />
datasource.url</span><span style="color: #000000">=</span><span style="color: #000000">jdbc:sqlserver:</span><span style="color: #008000">//</span><span style="color: #008000">192.168.0.9:1433;DatabaseName=disasterSystem</span><span style="color: #008000"><br />
</span><span style="color: #000000">datasource.username</span><span style="color: #000000">=</span><span style="color: #000000">sa<br />
datasource.password</span><span style="color: #000000">=</span><span style="color: #000000">syl6413<br />
datasource.maxActive</span><span style="color: #000000">=</span><span style="color: #000000">10</span><span style="color: #000000"><br />
datasource.maxIdle</span><span style="color: #000000">=</span><span style="color: #000000">5</span><span style="color: #000000"><br />
datasource.maxWait</span><span style="color: #000000">=</span><span style="color: #000000">5000</span><span style="color: #000000"><br />
datasource.defaultAutoCommit</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span></div>
</div>
</div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;applicationContext.xml代码：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="placeholderConfig"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="location"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">classpath:/datasource.properties</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.apache.commons.dbcp.BasicDataSource"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="driverClassName"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${datasource.driverClassName}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="url"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${datasource.url}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="username"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${datasource.username}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="password"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${datasource.password}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="maxActive"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${datasource.maxActive}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="maxIdle"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${datasource.maxIdle}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="maxWait"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${datasource.maxWait}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultAutoCommit"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">${datasource.defaultAutoCommit}</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span></div>
</div>
</div>
<strong><br />
二、测试配置连接池<br />
</strong>1、测试tomcat连接池<br />
&nbsp;&nbsp;&nbsp;&nbsp;*&gt;不用Spring管理的tomcat连接池测试代码(只能在jsp里面测试)：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><span style="color: #000000">Context&nbsp;initContext&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;InitialContext();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;envContext&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">(Context)initContext.lookup(</span><span style="color: #000000">"</span><span style="color: #000000">java:comp/env</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;DataSource&nbsp;ds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(DataSource)&nbsp;envContext.lookup(</span><span style="color: #000000">"</span><span style="color: #000000">jdbc/sqlserver</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ds.getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(con&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">已经得到连接</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">没有得到连接</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
</div>
</div>
&nbsp;&nbsp;&nbsp;&nbsp;*&gt;用Spring管理tomcat连接池的测试代码：&nbsp;&nbsp;&nbsp;&nbsp;
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><span style="color: #000000">&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">ApplicationContext&nbsp;ctx&nbsp;=&nbsp;new&nbsp;FileSystemXmlApplicationContext("src/applicationContext.xml");</span><span style="color: #008000">//</span><span style="color: #008000">两种得到bean工厂的代码，任选其一</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;ctx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassPathXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">applicationContext.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;DataSource&nbsp;ds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(DataSource)&nbsp;ctx.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">dataSource</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ds.getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(con&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">连接成功</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">连接不成功</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
</div>
</div>
2.测试Spring连接池<br />
&nbsp;&nbsp;&nbsp;&nbsp;其实测试Spring连接池的代码和上面Spring管理tomcat连接池测试代码一样：&nbsp;&nbsp;&nbsp;&nbsp;
<div align="center">
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px">
<div align="left"><span style="color: #008000">//</span><span style="color: #008000">ApplicationContext&nbsp;ctx&nbsp;=&nbsp;new&nbsp;FileSystemXmlApplicationContext("src/applicationContext.xml");</span><span style="color: #008000">//</span><span style="color: #008000">两种得到bean工厂的代码，任选其一</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;ctx&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassPathXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">applicationContext.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;DataSource&nbsp;ds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(DataSource)&nbsp;ctx.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">dataSource</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ds.getConnection();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(con&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">连接成功</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">连接不成功</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
</div>
</div>
<br />
<strong>三、两种连接池比较<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;tomcat连接池因为配置tomcat下面的,所有最好用jsp或者maven(模拟窗口测试方法)来测试,但是跟我们的测试带了很多的不变啊,若能在普通java application或者junit方法测试就不容易,也不知道杂写,若高手知道请指教<br />
&nbsp;&nbsp;&nbsp;&nbsp;而Spring连接池与HTTP协议无关，可直接通过java application或junit直接使用，大大地方便了测试和使用.<br />
&nbsp;&nbsp;&nbsp;&nbsp;在效率方面，我倒没认真测试有什么不同，但是我觉得，都是用的第三方连接池管理，应该差别不大，有不同见解的朋友请指出来，共同学习！！ 
<img src ="http://www.blogjava.net/xcp/aggbug/301057.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2009-11-04 14:36 <a href="http://www.blogjava.net/xcp/archive/2009/11/04/datasource2.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 解缩文件 zipFile支持中文</title><link>http://www.blogjava.net/xcp/archive/2009/10/30/CompressFromZip.html</link><dc:creator>xcp</dc:creator><author>xcp</author><pubDate>Fri, 30 Oct 2009 14:28:00 GMT</pubDate><guid>http://www.blogjava.net/xcp/archive/2009/10/30/CompressFromZip.html</guid><wfw:comment>http://www.blogjava.net/xcp/comments/300423.html</wfw:comment><comments>http://www.blogjava.net/xcp/archive/2009/10/30/CompressFromZip.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xcp/comments/commentRss/300423.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xcp/services/trackbacks/300423.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:   前面写了一篇,java 压缩文件 ZipOutputStream  支持中文,同样java提供的java.util.zip.*.......对中文不支持面就是一个简单的例子,注 需要导入ant.jar支持包.&nbsp;&nbsp;<a href='http://www.blogjava.net/xcp/archive/2009/10/30/CompressFromZip.html'>阅读全文</a><img src ="http://www.blogjava.net/xcp/aggbug/300423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xcp/" target="_blank">xcp</a> 2009-10-30 22:28 <a href="http://www.blogjava.net/xcp/archive/2009/10/30/CompressFromZip.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>