﻿<?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 />
<b