<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[瑞克科技]]></title>
<link>http://www.rekoe.net/</link>
<description><![CDATA[创造机会的人是勇者；等待机会的人是愚者]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[koukou890@qq.com(瑞克)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>瑞克科技</title>
	<url>http://www.rekoe.net/images/logos.gif</url>
	<link>http://www.rekoe.net/</link>
	<description>瑞克科技</description>
</image>

			<item>
			<link>http://www.rekoe.net/article.asp?id=95</link>
			<title><![CDATA[mysql Alt&#101;r]]></title>
			<author>koukou890@qq.com(rekoe)</author>
			<category><![CDATA[JAVA]]></category>
			<pubDate>Fri,19 Dec 2008 21:51:28 +0800</pubDate>
			<guid>http://www.rekoe.net/default.asp?id=95</guid>
		<description><![CDATA[ alt&#101;r table user_data change age age varchar(40);<br/><br/>Alt&#101;r TABLE user_data ADD COLUMN address Double(15,5);<br/>从表中删除一个字段： <br/>　　Alt&#101;r TABLE user_data Dro&#112; COLUMN address RESTRICT;]]></description>
		</item>
		
			<item>
			<link>http://www.rekoe.net/article.asp?id=94</link>
			<title><![CDATA[mysql 插入数据获得自动生成的Key]]></title>
			<author>koukou890@qq.com(rekoe)</author>
			<category><![CDATA[JAVA]]></category>
			<pubDate>Sun,07 Dec 2008 14:03:51 +0800</pubDate>
			<guid>http://www.rekoe.net/default.asp?id=94</guid>
		<description><![CDATA[<div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.rekoe.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">package net.rekoe.util;<br/><br/>import java.sql.Connection;<br/>import java.sql.PreparedStatement;<br/>import java.sql.SQLException;<br/><br/>import o&#114;g.springframework.jdbc.core.JdbcTemplate;<br/>import o&#114;g.springframework.jdbc.core.PreparedStatementCreator;<br/>import o&#114;g.springframework.jdbc.support.GeneratedKeyHolder;<br/>import o&#114;g.springframework.jdbc.support.KeyHolder;<br/><br/>public class SysUtil {<br/>&#160;&#160;&#160;&#160;private static PreparedStatementCreator getPreparedStatementCreator(Object[] pramers,String sql){<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;final Object[] pramer = pramers;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;final String sql2 = sql;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return new PreparedStatementCreator(){<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;public PreparedStatement cr&#101;atePreparedStatement(Connection conn) throws SQLException {&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreparedStatement ps = conn.prepareStatement(sql2);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i = 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(Object obj:pramer){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;if(obj instanceof String){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ps.setString(i, obj.toString());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;}else if(obj instanceof Integer){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ps.setInt(i, new Integer(obj.toString()));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;}else if(obj instanceof Double){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ps.setDouble(i, new Double(obj.toString()));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;}else if(obj instanceof Long){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ps.setLong(i, new Long(obj.toString()));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#160;&#160;&#160;&#160;i++;<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;return ps; <br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;};<br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;public static int getKey(JdbcTemplate jdbcTemplate,String sql,Object[] pramers){<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;int key = -1;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;KeyHolder keyHolder = new GeneratedKeyHolder();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;jdbcTemplate.up&#100;ate(SysUtil.getPreparedStatementCreator(pramers, sql), keyHolder);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;key = keyHolder.getKey().intValue();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return key;<br/>&#160;&#160;&#160;&#160;}<br/>}</div></div><br/><br/><strong><u>使用的时候调用方法</u></strong><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.rekoe.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">@Override<br/>&#160;&#160;&#160;&#160;public int ins&#101;rt(User user) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String sql = &#34;ins&#101;rt into user_data(username,password,age,desc) values(?,?,?,?)&#34;;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Object[] pramers = new Object[]{user.getUserName(),user.getPassWord(),user.getAge(),user.getDesc()};<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return SysUtil.getKey(jdbcTemplate, sql, pramers);<br/>&#160;&#160;&#160;&#160;}</div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.rekoe.net/article.asp?id=93</link>
			<title><![CDATA[tomcat配置多站点]]></title>
			<author>koukou890@qq.com(rekoe)</author>
			<category><![CDATA[JAVA]]></category>
			<pubDate>Wed,03 Dec 2008 22:13:41 +0800</pubDate>
			<guid>http://www.rekoe.net/default.asp?id=93</guid>
		<description><![CDATA[1、部署的位置和开发时没有区别，可以放在webapps目录下<br/>2、修改TOMCAT_HOME/conf/server.xml,在&lt;Engine&gt;&lt;/Engine&gt;中间添加如下内容<br/><strong>Xml代码</strong><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.rekoe.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">&lt;Host name=&#34;www.decor-villa.com&#34; appBase=&#34;webapps&#34; unpackWARs=&#34;true&#34; autoDeploy=&#34;true&#34; xmlValidation=&#34;false&#34; xmlNamespaceAware=&#34;false&#34; &gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&lt;Context path=&#34;&#34; docBase=&#34;decorvilla&#34; reloadable=&#34;true&#34; /&gt;&nbsp;&nbsp;<br/>&lt;/Host&gt; </div></div> <br/>]]></description>
		</item>
		
			<item>
			<link>http://www.rekoe.net/article.asp?id=92</link>
			<title><![CDATA[计算某天凌晨零点的时间（秒）]]></title>
			<author>koukou890@qq.com(rekoe)</author>
			<category><![CDATA[JAVA]]></category>
			<pubDate>Sun,16 Nov 2008 10:06:33 +0800</pubDate>
			<guid>http://www.rekoe.net/default.asp?id=92</guid>
		<description><![CDATA[<strong>当前时间到某天凌晨零点的时间差 用在某时间点定时统计</strong><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.rekoe.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">import java.text.ParseException;<br/>import java.text.SimpleDateFormat;<br/>import java.util.Date;<br/><br/>public class DateUtil {<br/>&#160;&#160;&#160;&#160;private static final long MILLIS_IN_DAY = 1000 * 60 * 60 * 24;<br/>&#160;&#160;&#160;&#160;private static Date getNextNDate(Date date, int n) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return new Date(date.getTime() + DateUtil.MILLIS_IN_DAY * n);<br/>&#160;&#160;&#160;&#160;}<br/><br/>&#160;&#160;&#160;&#160;public static void main(String[] args) throws ParseException {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(getExeTime());<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(System.currentTimeMillis());<br/>&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;<br/>&#160;&#160;&#160;&#160;@SuppressWarnings(&#34;finally&#34;)<br/>&#160;&#160;&#160;&#160;public static long getExeTime(){<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SimpleDateFormat df = new SimpleDateFormat(&#34;yyyy-MM-dd&#34;);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Date date = new Date();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;long currentTime = date.getTime();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String time = df.format(getNextNDate(date, 1));<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;date = df.parse(time);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} catch (ParseException e) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e.printStackTrace();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}finally{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;long exeTime = date.getTime();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exeTime = exeTime - currentTime;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return exeTime;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;}<br/>/**<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp; * 时间前推或后推分钟,其中JJ表示分钟.<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp; */<br/>&#160;&#160;&#160;&#160;@SuppressWarnings(&#34;finally&#34;)<br/>&#160;&#160;&#160;&#160;public static long getPreTime(int tim) {<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp; SimpleDateFormat df = new SimpleDateFormat(&#34;yyyy-MM-dd&#34;);<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp; Date date = new Date();<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp; long currentTime = date.getTime();<br/>&#160;&#160;&#160;&#160;&nbsp;&nbsp; String time = df.format(getNextNDate(date, 1));<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;date = df.parse(time);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} catch (ParseException e) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e.printStackTrace();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}finally{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;long exeTime = date.getTime();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exeTime = exeTime - currentTime;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;exeTime = exeTime + tim * 60 * 1000;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;return exeTime;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;}<br/>public void exeEvent(TimerTask task){<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Timer t = new Timer();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Date date = new Date();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SimpleDateFormat df = new SimpleDateFormat(&#34;yyyy-MM-dd&#34;);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String time = df.format(getNextNDate(date, 1));<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;date = df.parse(time);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} catch (ParseException e) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e.printStackTrace();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}finally{<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;t.schedule(task, date,1000 * 60 * 60 * 24);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;}<br/>}</div></div>]]></description>
		</item>
		
			<item>
			<link>http://www.rekoe.net/article.asp?id=91</link>
			<title><![CDATA[目前最有效的几种方法-让你的盗版Windows XP变为正版]]></title>
			<author>koukou890@qq.com(rekoe)</author>
			<category><![CDATA[操作系统]]></category>
			<pubDate>Tue,21 Oct 2008 22:11:40 +0800</pubDate>
			<guid>http://www.rekoe.net/default.asp?id=91</guid>
		<description><![CDATA[如何破解盗版验证正版,去除烦人的微软星号锁定,一直困扰众多盗版用户!当然微软为了打击盗版也算是煞费苦心,正版验证程序不断更新升级,导致很多WINDOWS XP SP2-3系统都无法通过验证,青松特收集整理制作最新破解补丁,及时解决更多D版用户系统正常升级!<br/><br/>Windows XP 的反盗版举措 —— WGA <br/><br/>WGA是微软在2005年7月发布的。这，就是XP用户大都知晓的鼎鼎有名的“Windows 正版优势”。<br/><br/>它要求那些到微软下载中心下载“正版资源”的用户，首先要下载安装WGA初始插件，进而通过随后的WGA验证。从那时起，微软就开始了一个新的“铁律”——用户要么按照要求安装WGA ，要么就别使用微软正版资源。当然，微软也网开一面：在没有安装WGA的情况下，仍可通过XP自动更新功能，获得微软官方的系统安全补丁。 <br/><br/>WGA 验证程序是一段运行在Windows 系统中的代码，它能够独立地判断出自己所运行的这个Windows 系统是否是盗版软件，或者其是否超出了相应的授权许可。在今年的早些时候，微软公司又发布了WGA 的第二个组件，其名字叫“ WGA 提示软件（WGA Notifications）”。它的作用是当 WGA 验证程序发现自己所处的 Windows 系统当中存在某些问题时，及时地弹出信息来提醒用户。它同时也会尝试帮助用户找出相应的解决方案，包括提示用户付钱购买，以重新获得 Windows 的使用授权。<br/><br/>正所谓上有政策下有对策,下面就介绍几种方法让你的Windows XP变为正版,轻松通过验证. <br/><br/>微软三个不同等级几个“正版验证”地址——先去试试您的验证结果如何吧？<br/><br/>地址一 <a href="http://www.microsoft.com/genuine/default.aspx?displaylang=zh-cn" target="_blank" rel="external">http://www.microsoft.com/genuine/default.aspx?displaylang=zh-cn</a> (等级-较为严格)<br/><br/>地址二 <a href="http://www.microsoft.com/genuine/AboutNotifications.aspx?displaylang=zh-cn" target="_blank" rel="external">http://www.microsoft.com/genuine/AboutNotifications.aspx?displaylang=zh-cn</a> (极其严格)<br/><br/>地址三 <a href="http://www.microsoft.com/genuine/selfhelp/Support.aspx?displaylang=zh-cn" target="_blank" rel="external">http://www.microsoft.com/genuine/selfhelp/Support.aspx?displaylang=zh-cn</a> (较为宽松)<br/><br/>地址四 <a href="http://www.microsoft.com/genuine/downloads/FAQ.aspx?displaylang=zh-cn" target="_blank" rel="external">http://www.microsoft.com/genuine/downloads/FAQ.aspx?displaylang=zh-cn</a> <br/><br/>地址五 <a href="http://www.microsoft.com/genuine/default.aspx?displaylang=zh-tw" target="_blank" rel="external">http://www.microsoft.com/genuine/default.aspx?displaylang=zh-tw</a> <br/><br/>正版增值补丁测试地址 <a href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn" target="_blank" rel="external">http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn</a>&amp;FamilyID=735F2506-F4A6-493F-A4B2-280F3CB81FA4<br/><br/>Windows 正版增值计划优惠产品 <a href="http://www.microsoft.com/genuine/offers/Default.aspx?displaylang=zh-cn" target="_blank" rel="external">http://www.microsoft.com/genuine/offers/Default.aspx?displaylang=zh-cn</a>&amp;cCode=CHN&amp;Error=0&amp;sGuid=99d7b1ee-29d0-4f54-8210-34de080e5d6b<br/><br/>Microsoft 正版增值计划-诊断网站 <a href="http://www.microsoft.com/genuine/diag/default.aspx?displaylang=zh-cn" target="_blank" rel="external">http://www.microsoft.com/genuine/diag/default.aspx?displaylang=zh-cn</a> (在诊断过程中,系统会提供逐步指导,如果您的配置设置不正确，系统将向您提供解决该问题的建议,如果问题仍然存在,系统将向您提供哪里可以获取其他帮助的信息)<br/><br/>Microsoft Up&#100;ate 网址 <a href="http://up" target="_blank" rel="external">http://up</a>&#100;ate.microsoft.com/microsoftup&#100;ate/v6/default.aspx?ln=zh-cn(通过微软正版验证的用户可放心升级你的系统)<br/><br/>微软全面免费的安全扫描,查杀病毒和间谍软件,清理和优化! <a href="http://onecare.live.com/site/zh-cn/default.htm?s_cid=ideas_wlsc" target="_blank" rel="external">http://onecare.live.com/site/zh-cn/default.htm?s_cid=ideas_wlsc</a><br/><br/>电脑探究者①群:52013541 ②群:57440776 ③群:48827659 互相学习-共同探讨,欢迎加入!青松博客期待你的再次光临—请记住我的地址 <a href="http://fqs310.blog.hexun.com" target="_blank" rel="external">http://fqs310.blog.hexun.com</a> 电脑探究者论坛 <a href="http://www.myxp2.cn" target="_blank" rel="external">http://www.myxp2.cn</a><br/><br/>如果已经出现微软星号锁定或未能通过以上验证的朋友，可通过以下几种方法破解盗版轻松享受正版服务！<br/><br/>第①方法:微软正版认证离线包<br/><br/>说明:本程序可以自动给 Windows xp vol 更改系列号,让不能通过正版认证的电脑立刻就可是通过正版认证!(适用于XP SP2-3系统)<br/><br/>微软正版认证离线包 下载镜像 本地下载(可打开自动更新)<br/><br/>第②方法:XP_VLK序列号更换器<br/><br/>说明:本程序运行后自动替换系统系列号,快速解决盗版问题!如XP_VLK序列号更换器默认的序列号一次不能通过正版验证,请多试几次直至验证成功为止,或换如下序列号尝试.(适用于XP SP2-3系统)<br/><br/>DP7CM-PD6MC-6BKXT-M8JJ6-RPXGJ<br/><br/>QC986-27D34-6M3TY-JJXP9-TBGMD<br/><br/>MRX3F-47B9T-2487J-KWKMF-RPWBY <br/><br/>HH7VV-6P3G9-82TWK-QKJJ3-MXR96(已封锁) <br/><br/>HCQ9D-TVCWX-X9QRG-J4B2Y-GR2TT(已封锁)<br/><br/>XP_VLK序列号更换器 下载镜像 本地下载(可打开自动更新)<br/><br/>第③方法:青松WINDOWS XP SP2正版验证补丁系列(不定期更新)<br/><br/>说明:微软验证程序不断更新升级,导致很多WINDOWS XP SP2系统都无法通过验证,青松特收集整理制作最新破解补丁,及时解决更多D版用户系统正常升级!使用以下补丁后如能正常通过正版验证,屏幕右下方仍有微软星号,消除星号方法:打开任务栏(开始-运行-taskmgr),找到wgatray.exe进程,结束即可!(推荐360安全卫士更新)<br/><br/>青松最强XP正版验证补丁1 下载镜像 本地下载<br/><br/>青松最强XP正版验证补丁2(完美修正) 下载镜像(上个补丁好多朋友反应打补丁后能顺利通过验证,但微软星号还在,这次特修正这个问题!如还有问题可在博客留言说明,或加群:52013541探讨)<br/><br/>青松最强XP正版验证补丁3 下载镜像(微软已于2008.3.18再次升级Windows系统正版增值校验Microsoft Genuine Advantage ActiveX 控件；此补丁升级至v1.7.69.1 可以解决D版用户系统正常升级)<br/><br/>青松WINDOWS XP SP2正版验证补丁 下载镜像（2008.4.7日更新：适用于各版本win SP2及OEM版系统.微软验证程序不断更新升级，导致很多WINDOWS XP SP2系统都无法通过验证，为此特制作升级补丁，及时解决更多D版用户系统正常升级）<br/><br/>第④方法:RemoveWGA去除盗版锁定补丁<br/><br/>说明:这款工具软件不会对微软WGA验证程序组建造成任何修改,仅仅去除微软的“自动通知”功能.“绝对不会对你下载安装Windows正版增值服务内容造成任何问题.部分安全软件误报毒，大可不必理会” <br/><br/>RemoveWGA去除盗版锁定补丁 下载镜像 本地下载(推荐360安全卫士更新)<br/><br/>第⑤方法:备用万能正版验证补丁<br/><br/>说明:(推荐使用以上几种方法,此补丁只备用,运行后即可将所有XP版本修改成 XP PRO OEM免激活专业版,适用于任何品牌机和组装兼容机使用,适用于WindowsXP sp1/sp2/sp3,也可用于系统的激活)<br/><br/>备用万能正版验证补丁 下载镜像 本地下载(推荐360安全卫士更新)<br/><br/>青松提示:以上推荐可打开自动更新指系统自带更新程序.打开步骤:我的电脑(右击属性)-自动更新-选择自动即可!Windows 自动更新是Windows 的一项功能,当适用于您的计算机的重要更新发布时,它会及时提醒您下载和安装.使用自动更新可以在第一时间更新您的操作系统,修复系统漏洞,保护您的计算机安全.<br/><br/>推荐用360安全卫士更新指360安全卫士修复系统漏洞功能, 此功能只会提示更新针对系统安全漏洞的补丁,适合盗版用户的更新!安全可靠,最重要的是绝对不会出现微软烦人的星号哦,务必关闭系统自动更新!<br/><br/>手动解除星号锁定方法一：<br/><br/>(1)：关闭内存中的wgatray.exe进程。（打开进程列表方法：开始-运行-taskmgr）<br/><br/>(2)：到C:\WINDOWS\system32目录下把wgatray.exe改名为wgatray1.exe；把wgalogon.dll改名为wgalogon1.dll，重起电脑就不会有那个提示了!(注：可以用搜索功能查找相就文件)<br/><br/>手动解除星号锁定方法二：<br/><br/>打开注册表(开始----运行----输入regedit) <br/><br/>然后依次打开HKEY_LOCAL_MACHINE\SOFTWARE\microsoft\Windows NT\CurrentVersion\Winlogon\Notify\WgaLogon，删除它（WgaLogon），再重新启动(一定要重起，要不然删不了C盘的文件)，wgatray.exe就不会自动启动了，再把C:\windows\system 32中的wgaTray.exe删除，再搜索一下，在另外的文件夹下还有，统统删除，（搜索的方法是 开始---搜索--所有文件及文件夹---全部文件或部分文件名，写上&#34;wgaTray.exe&#34;后点搜索，搜索到后，点鼠标右键删除之），然后再次重起. 然后再次进到注册表HKEY_LOCAL_MACHINE\SOFTWARE\microsoft\Windows NT\CurrentVersion\Winlogon\Notify\WgaLogon，删除它（和第一次的操作相同），至此问题解决!<br/><br/>还是删不了的请继续看：<br/><br/>（首先重启你的计算机，进入安全模式，登陆管理员帐号－保证你拥有进入Windows\system32以及<br/><br/>Windows\system32\dllcache路径的权限。在这两个路径下均有一个名为WGATray.EXE的文件。你必须将<br/><br/>两个路径下的WGATray.EXE均删除－－这将阻止Windows在启动时弹出“盗版XP”气球。 <br/><br/>在删除Windows\system32下的WGATray.EXE可能需要一点技巧： <br/><br/>步奏一：WGATray.EXE图标--&gt;右键--&gt;删除--&gt;出现删除确认框后先不要按‘确定’按钮 <br/><br/>步奏二：Ctrl+Alt+Del--&gt;打开进程管理器--&gt;找到WGATray.EXE--&gt;删除--&gt;出现删除确认框后先不要按‘<br/><br/>确定’按钮 <br/><br/>步奏三：先按打开进程管理器的删除确认键，然后用最快速度按步奏一的删除确认键。 <br/><br/>步奏四：如果Windows\system32下的WGATray.EXE不会出现，代表操作成功。继续删除<br/><br/>Windows\system32\dllcache下的WGATray.EXE。）<br/><br/>附:教大家自制&#34;XP_VLK序列号更换器&#34;,打开(开始-所有程序-附件-记事本)把如下代码（红色部分）复制到记事本,之后另存为文件名为&#34;XP_VLK序列号更换器.vbs&#34;保存类型选择&#34;所有文件&#34;即可.（后缀一定要为.vbs）<br/><br/>ON ERROR RESUME NEXT<br/><br/>Dim VOL_PROD_KEY<br/><br/>if Wscript.arguments.count<br/><br/>VOL_PROD_KEY = Replace(VOL_PROD_KEY,&#34;-&#34;,&#34;&#34;) &#39;remove hyphens if any<br/><br/>for each Obj in GetObject(&#34;winmgmts:{impersonationLevel=impersonate}&#34;).InstancesOf (&#34;win32_WindowsProductActivation&#34;)<br/><br/>result = Obj.SetProductKey (VOL_PROD_KEY)<br/><br/>if err = 0 then<br/><br/>Wscript.echo &#34;OK,青松祝贺你序列号更换成功!去微软验证吧。&#34;<br/><br/>end if<br/><br/>if err 0 then<br/><br/>Wscript.echo &#34;修改失败！请检查输入的 CD-KEY 是否与当前 Windows 版本相匹配。&#34;<br/><br/>Err.Clear<br/><br/>end if<br/><br/>Next <br/><br/>教大家自制&#34;验证XP是否正版&#34;批处理,打开(开始-所有程序-附件-记事本)把如下代码（红色部分）复制到记事本,之后另存为文件名为&#34;验证XP是否为正版.hta&#34;,保存类型选择&#34;所有文件&#34;即可.（后缀一定要为.hta）点我直接下载.<br/><br/><br/><br/>验证XP是否为正版<br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/>var nextPage = &#39;validate&#39;;<br/><br/>var appWidth = 650;<br/><br/>var appHeight = 500; <br/><br/>var appLeft = window.screen.availWidth/8;<br/><br/>var appTop = window.screen.availHeight/8;<br/><br/>window.resizeTo(appWidth,appHeight);<br/><br/>window.moveTo(appLeft,appTop); <br/><br/>function AssignURL()<br/><br/>{ <br/><br/>if (nextPage == &#34;order&#34;)<br/><br/>{<br/><br/>if (2 == &#34;1&#34;)<br/><br/>{<br/><br/>iframeHTA.location = &#34;<a href="https://catalog.microsoft.com/genuine/purchase/ComponentCheck.aspx?displaylang=zh-cn" target="_blank" rel="external">https://catalog.microsoft.com/genuine/purchase/ComponentCheck.aspx?displaylang=zh-cn</a>&amp;sGuid=ad63b6b9-a496-4438-97ef-f27bed97ee8a&amp;nav=hta&#34;;<br/><br/>}<br/><br/>else <br/><br/>{<br/><br/>iframeHTA.location = &#34;<a href="https://catalog.microsoft.com/genuine/purchase/ComponentCheck.aspx?displaylang=zh-cn" target="_blank" rel="external">https://catalog.microsoft.com/genuine/purchase/ComponentCheck.aspx?displaylang=zh-cn</a>&amp;sGuid=ad63b6b9-a496-4438-97ef-f27bed97ee8a&amp;nav=hta&#34;;<br/><br/>}<br/><br/>}<br/><br/>else if (nextPage == &#34;purchaseInfo&#34;)<br/><br/>{<br/><br/>iframeHTA.location = &#34;<a href="https://catalog.microsoft.com/genuine/purchase/ComponentCheck.aspx?displaylang=zh-cn" target="_blank" rel="external">https://catalog.microsoft.com/genuine/purchase/ComponentCheck.aspx?displaylang=zh-cn</a>&amp;sGuid=ad63b6b9-a496-4438-97ef-f27bed97ee8a&amp;nav=hta&#34;;<br/><br/>}<br/><br/>else if (nextPage == &#34;validate&#34;)<br/><br/>{<br/><br/>iframeHTA.location = &#34;<a href="http://www.microsoft.com/genuine/downloads/validate.aspx?displaylang=zh-cn" target="_blank" rel="external">http://www.microsoft.com/genuine/downloads/validate.aspx?displaylang=zh-cn</a>&amp;sGuid=ad63b6b9-a496-4438-97ef-f27bed97ee8a&amp;nav=hta&#34;;<br/><br/>}<br/><br/>else<br/><br/>{<br/><br/>iframeHTA.location = &#34;<a href="http://www.microsoft.com/genuine/downloads/OEMValidate.aspx?displaylang=zh-cn" target="_blank" rel="external">http://www.microsoft.com/genuine/downloads/OEMValidate.aspx?displaylang=zh-cn</a>&amp;sGuid=ad63b6b9-a496-4438-97ef-f27bed97ee8a&amp;nav=hta&#34;;<br/><br/>}<br/><br/>} <br/>]]></description>
		</item>
		
			<item>
			<link>http://www.rekoe.net/article.asp?id=90</link>
			<title><![CDATA[解决mysql连接超8小时问题]]></title>
			<author>koukou890@qq.com(rekoe)</author>
			<category><![CDATA[JAVA]]></category>
			<pubDate>Sat,18 Oct 2008 18:38:59 +0800</pubDate>
			<guid>http://www.rekoe.net/default.asp?id=90</guid>
		<description><![CDATA[mysqld-nt--default-table-type=innodb--interactive_timeout=288000]]></description>
		</item>
		
			<item>
			<link>http://www.rekoe.net/article.asp?id=89</link>
			<title><![CDATA[俞敏洪老师的经典语录]]></title>
			<author>koukou890@qq.com(rekoe)</author>
			<category><![CDATA[名人故事]]></category>
			<pubDate>Fri,19 Sep 2008 22:43:37 +0800</pubDate>
			<guid>http://www.rekoe.net/default.asp?id=89</guid>
		<description><![CDATA[１．女人如果因为觉得一个男生帅就跟嫁给他，这是好色；男生因为女生漂亮而娶她，是审美。 <br/><br/><br/>２.为什么你不要自傲和自卑？ <br/><br/><br/>你可以说自己是最好的，但不能说自己是全校最好的、全北京最好的、全国最好的、全世界最好的，所以你不必自傲；同样，你可以说自己是班级最差的，但你能证明自己是全校最差的吗？能证明自己是全国最差的吗？所以不必自卑。 <br/><br/><br/>３.年纪大了，人们看重不再是外表，不是你帅不帅，而是看你的内心的魅力：你的气魄、气概。 <br/><br/><br/>４.这个世界上有很多天才，天才是用来欣赏的，不是用来攀比的。 <br/><br/><br/>５.你说我是猪，不对，其实我连猪都不如。 <br/><br/><br/>很多人失去了快乐，是因为他太敏感了。别人一句话、一个评论就使自己生气一个月。这时非常无聊的。严重了就成了马家爵，因为别人不请自己吃饭就郁闷地要杀人。 <br/><br/><br/>６.要每天多努力一些，比别人多努力一个小时。 <br/><br/><br/>７.使这个世界灿烂的不是阳光，而是女生的微笑。 <br/><br/><br/>8.要引人敬意，就要研究一个非常专业的领域，在那个领域中，你是最顶尖的，至少是中国钱10名，这样无论任何时候你都有话说，有事情可作。我俞敏洪原来想成为中国研究英语(Q吧)的前100名，但后来发现根本不可能。所以我就背单词，用1年的时间背诵了一本英文词典，成为中国单词专家，现在我出版的红宝书系列：从初中到GRE词汇有十几本，年销量100万册，稿费比我正式工作都高的多。 <br/><br/><br/>9.大学生应该做的事情是： <br/><br/><br/>（1）专业方面，成为中国前100名； <br/><br/><br/>（2）人文方面，读500本书。 <br/><br/><br/>（3）英语。 <br/><br/><br/>10.如果你要引人注目，就要使得自己成为一棵树，傲立于大地之间；而不是做一颗草，你见过谁踩了一棵草，还抱歉地对草说：对不起？ <br/><br/><br/>11．学英语好比学鸟叫，你在树林里学鸟叫，当有四只鸟落在你肩上时，说明你过了英语四级，当有六只鸟落在你肩上时，说明你过了英语六级，当有许多鸟落在你肩上，说明你成了鸟人。 <br/><br/><br/>12．女人的温柔和男人的成就是成正比的。 <br/><br/><br/>13、俞敏洪在《赢在中国》点评语录 <br/><br/><br/>蜗牛的壳是自己加上的。 <br/><br/><br/>既靠天，也靠地，还靠自己。 <br/><br/><br/>心平气和地接受失败。 <br/><br/><br/>做人要大方、大气，不放弃！ <br/><br/><br/>世界上没有绝对的公平，公平只在一个点上。 <br/><br/><br/>心中平，世界才会平。 <br/><br/><br/>学会给别人机会。 <br/><br/><br/>名次和荣誉，就像天上的云，不能躺进去，躺进去就跌下来了。名次和荣誉其实是道美丽的风景，只能欣赏。 <br/><br/><br/>只要出于同情心和面子做的事，几乎都会失败。 <br/><br/><br/>每条河流都有一个梦想：奔向大海。长江、黄河都奔向了大海，方式不一样。长江劈山开路，黄河迂回曲折，轨迹不一样。但都有一种水的精神。水在奔流的过程中，如果沉淀于泥沙，就永远见不到阳光了。 <br/><br/><br/>14、俞敏洪：人要像树一样活着 <br/><br/><br/>于《赢在中国》第三赛季36进12现场演讲 <br/><br/><br/>人的生活方式有两种， <br/><br/><br/>第一种方式是像草一样活着， <br/><br/><br/>你尽管活着，每年还在成长， <br/><br/><br/>但是你毕竟是一棵草， <br/><br/><br/>你吸收雨露阳光， <br/><br/><br/>但是长不大。 <br/><br/><br/>人们可以踩过你， <br/><br/><br/>但是人们不会因为你的痛苦，而他产生痛苦； <br/><br/><br/>人们不会因为你被踩了，而来怜悯你， <br/><br/><br/>因为人们本身就没有看到你。 <br/><br/><br/>所以我们每一个人， <br/><br/><br/>都应该像树一样的成长， <br/><br/><br/>即使我们现在什么都不是， <br/><br/><br/>但是只要你有树的种子， <br/><br/><br/>即使你被踩到泥土中间， <br/><br/><br/>你依然能够吸收泥土的养分， <br/><br/><br/>自己成长起来。 <br/><br/><br/>当你长成参天大树以后， <br/><br/><br/>遥远的地方，人们就能看到你； <br/><br/><br/>走近你，你能给人一片绿色。 <br/><br/><br/>活着是美丽的风景， <br/><br/><br/>死了依然是栋梁之才， <br/><br/><br/>活着死了都有用。 <br/><br/><br/>这就是我们每一个同学做人的标准和成长的标准。<br/>]]></description>
		</item>
		
			<item>
			<link>http://www.rekoe.net/article.asp?id=88</link>
			<title><![CDATA[应用OSCache提升J2EE系统运行性能]]></title>
			<author>koukou890@qq.com(rekoe)</author>
			<category><![CDATA[JAVA]]></category>
			<pubDate>Fri,19 Sep 2008 18:19:45 +0800</pubDate>
			<guid>http://www.rekoe.net/default.asp?id=88</guid>
		<description><![CDATA[作者：肖菁<br/><br/>作者简介<br/><br/><br/>肖菁，软件工程师，IBM developerWorks/Bea dev2dev/sun 技术开发者撰稿人，主要研究J2EE、web services以及他们在websphere、weblogic平台上的实现，拥有IBM的 Developing With Websphere Studio证书。您可以通过guilaida@163.com和作者取得联系，或者查看作者的主页获取更多信息。<br/><br/>文章摘要<br/><br/><br/>Cache是一种用于提高系统响应速度、改善系统运行性能的技术。尤其是在Web应用中，通过缓存页面的输出结果，可以很显著的改善系统运行性能。本文中作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码项目----OSCache。通过应用OSCache，我们不但可以实现通常的Cache功能，还能够改善系统的稳定性。<br/><br/>1 面临的问题<br/><br/><br/>1.1 需要处理的特殊动态内容<br/><br/><br/>在信息系统建设过程中我们通常会遇到这样的问题：<br/><br/>1. 基础数据的变更问题<br/><br/>信息系统中需要处理的基础数据的内容短时间内是不会发生变化的，但是在一个相对长一些的时间里，它却可能是动态增加或者减少的。<br/><br/>举个例子：电子商务中关于送货区域的定义，可能短时间内不会发生变化，但是随着电子商务企业业务的扩大，系统中需要处理的送货区域就可能增加。所以我们的系统中不得不在每次向客户展示送货区域信息的时候都和数据库（假设送货区域信息保存在数据库中，这也是通常采用的处理方法）进行交互。<br/><br/>2. 统计报表（不仅限于统计报表）的问题<br/><br/>一般来说，统计报表是一个周期性的工作，可能是半个月、一个月或者更长的时间才会需要更新一次，然而统计报表通常是图形显示或者是生成pdf、word、excel等格式的文件，这些图形内容、文件的生成通常需要消耗很多的系统资源，给系统运行造成很大的负担。<br/><br/>1.2 问题的共同点<br/><br/><br/>通过比较分析，不难发现这两类问题有一些共同点：<br/><br/>1、被处理的内容短时间不变，所以短时间内可以作为静态内容进行处理<br/><br/>2、在一个不太长的时间内，被处理的内容可能或者必定产生变化，所以必须将他们作为动态内容进行处理<br/><br/>3、在合理的时间区段内可以忽略被处理内容变化后带来的影响<br/><br/>4、对这些内容的处理动作比较消耗系统性能，影响系统响应时间<br/><br/>1.3 解决方法<br/><br/><br/>缓存技术可以帮助我们很好的解决这个问题：<br/><br/>1、缓存信息<br/><br/>当上述的基础数据或者统计报表第一次被访问时，被处理的内容被当作动态信息，基础数库从数据库中获得，统计报表也会被生成符合要求的图形、文件，然后这些信息都会被放入缓存信息中。<br/><br/>2、响应信息由缓存提供<br/><br/>当上述的基础数据或者统计报表继续被访问时，系统将会首先检查缓存信息中是否有对应的内容和我们设定的缓存规则，如果符合缓存信息存在而且符合缓存规则，给出的响应将来自于缓存信息，如果没有或者缓存信息已经不符合设定的要求，系统将重复上一步的动作。<br/><br/>很显然，上面的步骤2中，多数情况下，当用户请求到达时，被处理的内容将来自于缓存，所以大大的减少了与数据库的交互，或者不再需要为每个请求都生成一次报表图形或者文件，这部分工作的减少对于降低系统性能消耗、提高系统稳定性和并发处理能力是非常有益的。<br/><br/>2 OSCache简介<br/><br/><br/>OSCache是OpenSymphony组织提供的一个J2EE架构中Web应用层的缓存技术实现组件，它的出现解决了我们面临的问题。 OSCache目前最新的稳定版本是2.0，本文中的例子都是基于这个版本的，如果大家运行例子的过程中发生问题，请首先确认是否采用了正确的软件版本。<br/><br/>2.1 主要特征<br/><br/><br/>1. 兼容多种支持JSP的web服务器<br/><br/>已经通过兼容测试的web服务器包括OrionServer (1.4.0或者以上版本) 、Macromedia JRun (3.0或者以上版本) 、BEA Weblogic (7.x或者以上版本) 、IBM Websphere (5.0版本)、Silverstream (3.7.4版本)、Caucho Resin (1.2.3或者以上版本)、Tomcat (4.0或者以上版本) ，其他支持servlet2.3、jsp1.2的web服务器应该都是完全兼容OSCache的。<br/><br/>2. 可选的缓存区<br/><br/>你可以使用内存、硬盘空间、同时使用内存和硬盘或者提供自己的其他资源（需要自己提供适配器）作为缓存区。<br/><br/>使用内存作为缓存区将可以提供更好的性能 <br/>使用硬盘作为缓存区可以在服务器重起后迅速恢复缓存内容 <br/>同时使用内存和硬盘作为缓存区则可以减少对内存的占用 <br/>3. 灵活的缓存系统<br/><br/>OSCache支持对部分页面内容或者对页面级的响应内容进行缓存，编程者可以根据不同的需求、不同的环境选择不同的缓存级别。<br/><br/>4. 容错<br/><br/>在一般的web应用中，如果某个页面需要和数据库打交道，而当客户请求到达时，web应用和数据库之间无法进行交互，那么将返回给用户&#34;系统出错&#34;或者类似的提示信息，如果使用了OSCache的话，你可以使用缓存提供给用户，给自己赢得维护系统或者采取其他补救的时间。<br/><br/>其它特性还包括对集群的支持、缓存主动刷新等特性，大家可以参考OpenSymphony网站上的其他资源获取更多的信息。<br/><br/>3 OSCache组件的安装<br/><br/><br/>OSCache是一个基于web应用的组件，他的安装工作主要是对web应用进行配置，大概的步骤如下：<br/><br/>1. 下载、解压缩OSCache<br/><br/>请到OSCache的主页<a href="http://www.opensymphony.com/oscache/download.html" target="_blank" rel="external">http://www.opensymphony.com/oscache/download.html</a>下载Oscache的最新版本，作者下载的是OSCache的最新稳定版本2.0。<br/><br/>将下载后的。Zip文件解压缩到c:\oscache（后面的章节中将使用%OSCache_Home%来表示这个目录）目录下<br/><br/>2. 新建立一个web应用<br/><br/>3. 将主要组件%OSCache_Home%\oscache.jar放入WEB-INF\lib目录<br/><br/>4. commons-logging.jar、commons-collections.jar的处理<br/><br/>OSCache组件用Jakarta Commons Logging来处理日志信息，所以需要commons-logging.jar的支持，请将%OSCache_Home%\lib\core\commons-logging.jar放入classpath（通常意味着将这个文件放入WEB-INF\lib目录） <br/>如果使用JDK1.3,请将%OSCache_Home%\lib\core\commons-collections.jar放入classpath，如果使用JDK1.4或者以上版本，则不需要了 <br/>5. 将oscache.properties、oscache.tld放入WEB-INF\class目录<br/><br/>%OSCache_Home%\oscache.properties包含了对OSCache运行特征值的设置信息 <br/>%OSCache_Home%\oscache.tld包含了OSCache提供的标签库的定义内容 <br/>6. 修改web.xml文件<br/><br/>在web.xml文件中增加下面的内容，增加对OSCache提供的taglib的支持：<br/><br/>&lt;taglib&gt;<br/>&lt;taglib-uri&gt;oscache&lt;/taglib-uri&gt;<br/>&lt;taglib-location&gt;/WEB-INF/classes/ oscache.tld&lt;/taglib-location&gt;<br/>&lt;/taglib&gt; <br/> <br/><br/><br/>4 开始使用OSCache中的缓存组件<br/><br/><br/>OSCache中按照缓存范围的不同分为两种不同的方式：一种是缓存JSP页面中部分或者全部内容，一种是基于整个页面文件的缓存。<br/><br/>4.1 JSP部分内容缓存<br/><br/><br/>4.1.1 Cache-OSCache提供的缓存标签<br/><br/><br/>这是OSCache提供的标签库中最重要的一个标签，包括在标签中的内容将应用缓存机制进行处理，处理的方式将取决于编程者对cache标签属性的设置。<br/><br/>第一次请求到达时，标签中的内容被处理并且缓存起来，当下一个请求到达时，缓存系统会检查这部分内容的缓存是否已经失效，主要是以下几项：<br/><br/>1. 缓存时间超过了cache标签设置的time或者duration属性规定的超时时间 <br/>2. cron属性规定的时间比缓存信息的开始时间更晚 <br/>3. 标签中缓存的内容在缓存后又被重新刷新过 <br/>4. 其他缓存超期设定 <br/>如果符合上面四项中的任何一项，被缓存的内容视为已经失效，这时被缓存的内容将被重新处理并且返回处理过后的信息，如果被缓存的内容没有失效，那么返回给用户的将是缓存中的信息。<br/><br/>cache标签的属性说明:<br/><br/>key - 标识缓存内容的关键词。在指定的作用范围内必须是唯一的。默认的key是被访问页面的URI和后面的请求字符串。<br/><br/>你可以在同一个页面中使用很多cache标签而不指定他的key属性，这种情况下系统使用该页面的URI和后面的请求字符串，另外再自动给这些key增加一个索引值来区分这些缓存内容。但是不推荐采用这样的方式。<br/><br/>scope - 缓存发生作用的范围，可以是application或者session<br/><br/>time - 缓存内容的时间段，单位是秒，默认是3600秒，也就是一个小时，如果设定一个负值，那么这部分被缓存的内容将永远不过期。 <br/><br/>duration - 指定缓存内容失效的时间，是相对time的另一个选择，可以使用简单日期格式或者符合USO-8601的日期格式。如：duration=&#39;PT5M&#39; duration=&#39;5s&#39;等<br/><br/>refresh - false 或者true。<br/><br/>如果refresh属性设置为true，不管其他的属性是否符合条件，这部分被缓存的内容都将被更新，这给编程者一种选择，决定什么时候必须刷新。 <br/><br/>mode - 如果编程者不希望被缓存的内容增加到给用户的响应中，可以设置mode属性为&#34;silent&#34;<br/><br/>其它可用的属性还包括：cron 、groups、language、refreshpolicyclass、refreshpolicyparam。<br/><br/>上面的这些属性可以单独使用，也可以根据需要组合使用，下面的例子将讲解这些常用属性的使用方式。<br/><br/>4.1.2 Cache标签实例分析:<br/><br/><br/>1. 最简单的cache标签用法<br/><br/>使用默认的关键字来标识cache内容，超时时间是默认的3600秒<br/><br/>&lt;cache:cache&gt;<br/>&lt;%<br/>//自己的JSP代码内容<br/>%&gt;<br/>&lt;/cache:cache&gt; <br/> <br/><br/><br/>2. 用自己指定的字符串标识缓存内容，并且设定作用范围为session。<br/><br/>&lt;cache:cache key=&#34;foobar&#34; scope=&#34;session&#34;&gt;<br/>&lt;%<br/>//自己的JSP代码内容<br/>%&gt;<br/>&lt;/cache:cache&gt; <br/> <br/><br/><br/>3.动态设定key值，使用自己指定的time属性设定缓存内容的超时时间，使用动态refresh值决定是否强制内容刷新。<br/><br/>因为OSCache使用key值来标识缓存内容，使用相同的key值将会被认为使用相同的的缓存内容，所以使用动态的key值可以自由的根据不同的角色、不同的要求决定使用不同的缓存内容。<br/><br/>&lt;cache:cache key=&#34;&lt;%= product.getId() %&gt;&#34; time=&#34;1800&#34; refresh=&#34;&lt;%= needRefresh %&gt;&#34;&gt;<br/>&lt;%<br/>//自己的JSP代码内容<br/>%&gt;<br/>&lt;/cache:cache&gt; <br/> <br/><br/><br/>4. 设置time属性为负数使缓存内容永不过期<br/><br/>&lt;cache:cache time=&#34;-1&#34;&gt;<br/>&lt;%<br/>//自己的JSP代码内容<br/>%&gt;<br/> <br/><br/><br/>5. 使用duration属性设置超期时间<br/><br/>&lt;cache:cache&nbsp;&nbsp;duration=&#39;PT5M&#39;&gt;<br/>&lt;%<br/>//自己的JSP代码内容<br/>%&gt;<br/> <br/><br/><br/>6. 使用mode属性使被缓存的内容不加入给客户的响应中<br/><br/>&lt;cache:cache&nbsp;&nbsp;mode=&#39;silent&#39;&gt;<br/>&lt;%<br/>//自己的JSP代码内容<br/>%&gt;<br/> <br/><br/><br/>4.2 用CashFilter实现页面级缓存<br/><br/><br/>在OSCache组件中提供了一个CacheFilter用于实现页面级的缓存，主要用于对web应用中的某些动态页面进行缓存，尤其是那些需要生成pdf格式文件/报表、图片文件等的页面，不仅减少了数据库的交互、减少数据库服务器的压力，而且对于减少web服务器的性能消耗有很显著的效果。<br/><br/>这种功能的实现是通过在web.xml中进行配置来决定缓存哪一个或者一组页面，而且还可以设置缓存的相关属性，这种基于配置文件的实现方式对于J2EE来说应该是一种标准的实现方式了。<br/><br/>[注] 只有客户访问时返回http头信息中代码为200（也就是访问已经成功）的页面信息才能够被缓存<br/><br/>1. 缓存单个文件<br/><br/>修改web.xml，增加如下内容，确定对/testContent.jsp页面进行缓存。<br/><br/>&lt;filter&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br/>&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br/>&lt;/filter&gt;<br/>&lt;filter-mapping&gt;<br/>&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br/>&lt;!-对/testContent.jsp页面内容进行缓存--&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/testContent.jsp&lt;/url-pattern&gt;<br/>&lt;/filter-mapping&gt;<br/> <br/><br/><br/>2. 缓存URL pattern<br/><br/>修改web.xml，增加如下内容，确定对*.jsp页面进行缓存。<br/><br/>&lt;filter&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br/>&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br/>&lt;/filter&gt;<br/>&lt;filter-mapping&gt;<br/>&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br/>&lt;!-对所有jsp页面内容进行缓存--&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br/>&lt;/filter-mapping&gt;<br/> <br/><br/><br/>3. 自己设定缓存属性<br/><br/>在页面级缓存的情况下，可以通过设置CacheFilter的初始属性来决定缓存的一些特性：time属性设置缓存的时间段，默认为3600秒，可以根据自己的需要只有的设置，而scope属性设置，默认为application，可选项包括application、session<br/><br/>&lt;filter&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br/>&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br/>&#160;&#160;&#160;&#160;&lt;init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;time&lt;/param-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;600&lt;/param-value&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;scope&lt;/param-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;session&lt;/param-value&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br/>&lt;/filter&gt;<br/>&lt;filter-mapping&gt;<br/>&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br/>&lt;!-对所有jsp页面内容进行缓存--&gt;<br/>&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br/>&lt;/filter-mapping&gt;<br/> <br/><br/><br/>5 性能测试结果<br/><br/><br/>5.1 测试环境<br/><br/><br/>系统平台：windows 2000 高级服务器/ P3 800 /512M内存<br/><br/>web服务器：websphere 5.0<br/><br/>数据库服务器：mysql 4.0.18-nt<br/><br/>性能测试用工具：apache Jmeter<br/><br/>5.2 测试计划<br/><br/><br/>这次性能测试对比方为使用缓存和不使用缓存两种，他们的访问代码都是一样的：通过数据源从本地mysql数据库中获取person表的所有记录，然后显示在页面上。<br/><br/>测试中将模仿10个用户，每个用户发起5次请求，然后统计所有访问花费的时间。<br/><br/>5.3 测试结果<br/><br/><br/>使用缓存后的测试结果 不使用缓存时的测试结果 <br/><br/>所有请求花费的总时间(毫秒) 20569 22870 <br/><br/>性能测试的详细结果请大家查看下载内容中的《不使用cache时的系统性能测试结果.txt》和《使用cache后系统性能测试结果.txt》<br/><br/>6 总结<br/><br/><br/>在J2EE系统中，我们经常需要处理一些特殊的动态内容，这些内容在一个时间段内的变更非常有限，但是又不得不将他们确定为动态内容进行输出，而且非常消耗数据库系统资源或者web服务器的资源，这时我们就可以采用Cache----一种用于提高系统响应速度、改善系统运行性能的技术----来优化我们的系统。尤其是在Web应用中，这种处理可以很显著的改善系统运行性能。<br/><br/>本文中作者给大家介绍一个实现J2EE框架中Web应用层缓存功能的开放源代码项目----OSCache。它提供了在J2EE系统中实现缓存需要的丰富的功能。通过应用OSCache，我们不但可以实现通常的Cache功能、自由的设定cache的相关特性比如缓存时间段/缓存内容等，提升系统性能，而且还能有效的改善系统的稳定性。除此之外，OSCache组件还提供了更多的特性比如集群、容错、灵活的缓存区选择等。<br/><br/>作者根据自己的使用经验给大家提供了一些简单的例子，他们部分演示了如何使用OSCache组件提供的丰富特性，OSCache提供的特性远不止这些，需要大家在今后的时间里深入的研究，同时也希望大家通过E-mail和作者贡献研究成果。<br/><br/>参考资料<br/><br/><br/>OpenSymphony网站中关于OSCache的部分 <a href="http://www.opensymphony.com/oscache/" target="_blank" rel="external">http://www.opensymphony.com/oscache/</a> <br/><br/>OSCache下载地址 <a href="http://www.opensymphony.com/oscache/download.html" target="_blank" rel="external">http://www.opensymphony.com/oscache/download.html</a> <br/><br/>性能测试结果.rar<br/><br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.rekoe.net/article.asp?id=87</link>
			<title><![CDATA[OSCache使用指南]]></title>
			<author>koukou890@qq.com(rekoe)</author>
			<category><![CDATA[JAVA]]></category>
			<pubDate>Fri,19 Sep 2008 18:11:37 +0800</pubDate>
			<guid>http://www.rekoe.net/default.asp?id=87</guid>
		<description><![CDATA[OSCache是当前运用最广的缓存方案，JBoss,Hibernate,Spring等都对其有支持，<br/>下面简单介绍一下OSCache的配置和使用过程。<br/><br/>1.安装过程<br/>从<a href="http://www.opensymphony.com/oscache/download.html" target="_blank" rel="external">http://www.opensymphony.com/oscache/download.html</a>下载合适的OSCache版本，<br/>我下载的是oscache-2.0.2-full版本。<br/>解压缩下载的文件到指定目录<br/><br/>从解压缩目录取得oscache.jar 文件放到 /WEB-INF/lib 或相应类库目录 目录中，<br/>jar文件名可能含有版本号和该版本的发布日期信息等，如oscache-2.0.2-22Jan04.jar<br/><br/>如果你的jdk版本为1.3.x,建议在lib中加入Apache Common Lib 的commons-collections.jar包。<br/>如jdk是1.4以上则不必<br/><br/>从src或etc目录取得oscache.properties 文件，放入src根目录或发布环境的/WEB-INF/classes 目录<br/>如你需要建立磁盘缓存，须修改oscache.properties 中的cache.path信息 (去掉前面的#注释)。<br/>win类路径类似为c:\\app\\cache<br/>unix类路径类似为/opt/myapp/cache<br/><br/>拷贝OSCache标签库文件oscache.tld到/WEB-INF/classes目录。<br/><br/>现在你的应用目录类似如下：<br/>$WEB_APPLICATION\WEB-INF\lib\oscache.jar<br/>$WEB_APPLICATION\WEB-INF\classes\oscache.properties<br/>$WEB_APPLICATION\WEB-INF\classes\oscache.tld<br/><br/><br/>将下列代码加入web.xml文件中<br/>&lt;taglib&gt;<br/>&lt;taglib-uri&gt;oscache&lt;/taglib-uri&gt;<br/>&lt;taglib-location&gt;/WEB-INF/classes/oscache.tld&lt;/taglib-location&gt;<br/>&lt;/taglib&gt; <br/><br/>为了便于调试日志输出，须加入commons-logging.jar和log4j-1.2.8.jar到当前类库路径中<br/><br/>在src目录加入下面两个日志输出配置文件：<br/>log4j.properties 文件内容为：<br/>log4j.rootLogger=DEBUG,stdout,file<br/><br/>log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br/>log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br/>log4j.appender.stdout.layout.ConversionPattern=[start]%d{yyyy/MM/dd/ HH:mm:ss}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n<br/><br/><br/><br/>log4j.appender.file=org.apache.log4j.RollingFileAppender<br/>log4j.appender.file.File=oscache.log<br/>log4j.appender.file.MaxFileSize=100KB<br/>log4j.appender.file.MaxBackupIndex=5<br/>log4j.appender.file.layout=org.apache.log4j.PatternLayout<br/>log4j.appender.file.layout.ConversionPattern=[start]%d{yyyy/MM/dd/ HH:mm:ss}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n<br/><br/><br/>log4j.logger.org.apache.commons=ERROR<br/>log4j.logger.com.opensymphony.oscache.base=INFO<br/><br/><br/>commons-logging.properties 文件内容为<br/><br/>o&#114;g.apache.commons.logging.Log=org.apache.commons.logging.impl.Log4JCategoryLog<br/><br/>2.oscache.properties 文件配置向导 <br/><br/>cache.memory<br/>值为true 或 false ，默认为在内存中作缓存，<br/>如设置为false，那cache只能缓存到数据库或硬盘中，那cache还有什么意义：）<br/><br/>cache.capacity<br/>缓存元素个数<br/><br/>cache.persistence.class<br/>持久化缓存类，如此类打开，则必须设置cache.path信息<br/><br/>cache.cluster 相关<br/>为集群设置信息。<br/>如<br/>cache.cluster.multicast.ip为广播IP地址<br/>cache.cluster.properties为集群属性<br/><br/><br/>3.OSCache的基本用法<br/><br/>cache1.jsp 内容如下<br/><br/>&lt;%@ page import=&#34;java.util.*&#34; %&gt;<br/>&lt;%@ taglib uri=&#34;oscache&#34; prefix=&#34;cache&#34; %&gt;<br/><br/>&lt;html&gt;<br/>&lt;body&gt;<br/><br/>没有缓存的日期: &lt;%= new Date() %&gt;&lt;p&gt;<br/>&lt;!--自动刷新--&gt;<br/>&lt;cache:cache time=&#34;30&#34;&gt;<br/>每30秒刷新缓存一次的日期: &lt;%= new Date() %&gt; <br/>&lt;/cache:cache&gt;<br/>&lt;!--手动刷新--&gt;<br/>&lt;cache:cache key=&#34;testcache&#34;&gt;<br/>手动刷新缓存的日期: &lt;%= new Date() %&gt; &lt;p&gt;<br/>&lt;/cache:cache&gt;<br/>&lt;a href=&#34;cache2.jsp&#34;&gt;手动刷新&lt;/a&gt;<br/><br/>&lt;/body&gt;<br/>&lt;/html&gt;<br/><br/>cache2.jsp 执行手动刷新页面如下<br/>&lt;%@ taglib uri=&#34;oscache&#34; prefix=&#34;cache&#34; %&gt;<br/><br/>&lt;html&gt;<br/>&lt;body&gt;<br/><br/>缓存已刷新...&lt;p&gt;<br/><br/>&lt;cache:flush key=&#34;testcache&#34; scope=&#34;application&#34;/&gt;<br/><br/>&lt;a href=&#34;cache1.jsp&#34;&gt;返回&lt;/a&gt;<br/><br/>&lt;/body&gt;<br/>&lt;/html&gt;<br/><br/><br/>你也可以通过下面语句定义Cache的有效范围,如不定义scope,scope默认为Applcation<br/>&lt;cache:cache time=&#34;30&#34; scope=&#34;session&#34;&gt;<br/>...<br/>&lt;/cache:cache&gt;<br/><br/>4. 缓存过滤器 CacheFilter <br/><br/>你可以在web.xml中定义缓存过滤器，定义特定资源的缓存。<br/>&lt;filter&gt;<br/>&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br/>&lt;filter-class&gt;com.opensymphony.oscache.web.filter.CacheFilter&lt;/filter-class&gt;<br/>&lt;init-param&gt;<br/>&lt;param-name&gt;time&lt;/param-name&gt;<br/>&lt;param-value&gt;60&lt;/param-value&gt;<br/>&lt;/init-param&gt;<br/>&lt;init-param&gt;<br/>&lt;param-name&gt;scope&lt;/param-name&gt;<br/>&lt;param-value&gt;session&lt;/param-value&gt;<br/>&lt;/init-param&gt;<br/>&lt;/filter&gt;<br/>&lt;filter-mapping&gt;<br/>&lt;filter-name&gt;CacheFilter&lt;/filter-name&gt;<br/>&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br/>&lt;/filter-mapping&gt;<br/>上面定义将缓存所有.jsp页面，缓存刷新时间为60秒，缓存作用域为Session<br/><br/>注意，CacheFilter只捕获Http头为200的页面请求，即只对无错误请求作缓存，<br/>而不对其他请求（如500,404,400）作缓存处理 ]]></description>
		</item>
		
			<item>
			<link>http://www.rekoe.net/article.asp?id=86</link>
			<title><![CDATA[JavaSE6脚本引擎（java中javascript脚本）]]></title>
			<author>koukou890@qq.com(rekoe)</author>
			<category><![CDATA[JAVA]]></category>
			<pubDate>Wed,17 Sep 2008 21:08:49 +0800</pubDate>
			<guid>http://www.rekoe.net/default.asp?id=86</guid>
		<description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;在默认情况下，Java SE 6只支持JavaScript，但这并不以为着Java SE 6只能支持JavaScript。在Java SE 6中提供了一些接口来定义一个脚本规范，也就是JSR223。通过实现这些接口，Java SE 6可以支持任意的脚本语言（如PHP或Ruby）。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在使用Java SE 6运行脚本之前，必须要知道你的Java SE 6支持什么脚本语言。在javax.script包中有很多的类，但这些类中最主要的是ScriptEngineManager。可以通过这个类得到当前Java SE 6所支持的所有脚本。如下面例子将列出所有可以使用的脚本引擎工厂。<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.rekoe.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">package ivy;<br/><br/>import javax.script.*;<br/>import java.util.*;<br/>import static java.lang.System.*;<br/><br/>public class ListScriptEngines {<br/>&#160;&#160;&#160;&#160;public static void main(String[] args) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ScriptEngineManager manager = new ScriptEngineManager();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 得到所有的脚本引擎工厂<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;List&lt;ScriptEngineFactory&gt; factories = manager.getEngineFactories();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 这是Java SE 5 和Java SE 6的新For语句语法<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;for (ScriptEngineFactory factory : factories) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 打印脚本信息<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;out.printf(&#34;Name: %s%n&#34; + &#34;Version: %s%n&#34; + &#34;Language name: %s%n&#34;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;+ &#34;Language version: %s%n&#34; + &#34;Extensions: %s%n&#34;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;+ &#34;Mime types: %s%n&#34; + &#34;Names: %s%n&#34;, factory<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;.getEngineName(), factory.getEngineVersion(), factory<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;.getLanguageName(), factory.getLanguageVersion(), factory<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;.getExtensions(), factory.getMimeTypes(), factory<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;.getNames());<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 得到当前的脚本引擎<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ScriptEngine engine = factory.getScriptEngine();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;}<br/>}</div></div><br/>上面的例子必须要在Java SE 6中编译。其中import static java.lang.System.*是新的语法，将System中的所有静态成员进行引用，以后就可以直接使用out、in或err了。<br/><br/>　　通过运行java ListScriptEngines，将显示如下信息<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.rekoe.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">Name: Mozilla Rhino<br/>Version: 1.6 release 2<br/>Language name: ECMAScript<br/>Language version: 1.6<br/>Extensions: [js]<br/>Mime types: [application/javascript, application/ecmascript, text/javascript, text/ecmascript]<br/>Names: [js, rhino, JavaScript, javascript, ECMAScript, ecmascript]</div></div><br/>在最下面一行是脚本的别名，也就是使用它们中的任意一个都可以。得到一个具体的脚本引擎有3种方法。<br/><br/>　　·根据扩展名得到脚本引擎<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.rekoe.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">ScriptEngine engine = manager.getEngineByExtension(&#34;js&#34;);</div></div><br/>getEngineByExtension的参数就是Extensions:[js]中[…]里的部分。<br/><br/>　　·根据Mime类型得到脚本引擎<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.rekoe.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">ScriptEngine engine = manager.getEngineByMimeType(&#34;text/javascript&#34;); </div></div><br/>getEngineByMimeType的参数可以是Mime types: [application/javascript, application/ecmascript, text/javascript, text/ecmascript]中的任何一个，可以将text/javascript改成text/ecmascript。<br/><br/>　　·根据名称得到脚本引擎<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.rekoe.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">ScriptEngine engine = manager.getEngineByName(&#34;javascript&#34;);</div></div><br/>getEngineByName后的参数可以是Names: [js, rhino, JavaScript, javascript, ECMAScript, ecmascript]中的任何一个，如可以将javascript改成ecmascript。<br/><br/>上面已经讨论了执行脚本的第一步，就是得到一个可用的脚本引擎。在完成这项工作之 后就可以利用这个脚本引擎执行相应的脚本了。我们可以使用ScriptEngine的eval方法来执行脚本。eval方法被重载的多次，但最常用的是public Object eval(String script)。<br/>下面的例子演示了如何使用eval方法来执行javascript脚本。<br/><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.rekoe.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">package ivy;<br/><br/>import javax.script.*;<br/>import static java.lang.System.*;<br/><br/>public class FirstJavaScript {<br/>&#160;&#160;&#160;&#160;public static void main(String args[]) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ScriptEngineManager manager = new ScriptEngineManager();<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 得到javascript脚本引擎<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ScriptEngine engine = manager.getEngineByName(&#34;javascript&#34;);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;try {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 开始运行脚本，并返回当前的小时<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Double hour = (Double) engine.eval(&#34;var date = new Date();&#34;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;+ &#34;date.getHours();&#34;);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String msg;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;// 将小时转换为问候信息<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (hour &lt; 10) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;msg = &#34;上午好&#34;;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} else if (hour &lt; 16) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;msg = &#34;下午好&#34;;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} else if (hour &lt; 20) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;msg = &#34;晚上好&#34;;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} else {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;msg = &#34;晚安&#34;;<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;out.printf(&#34;小时 %s: %s%n&#34;, hour, msg);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;} catch (ScriptException e) {<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;err.println(e);<br/>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br/>&#160;&#160;&#160;&#160;}<br/>}</div></div><br/>上面的例子通过得到当前的小时，并将其转化为问候语。上面的程序的输出信息为：<br/><br/>　　小时9.0：上午好<br/><br/>　　这个例子最值得注意的是执行的2句脚本，最后一句是date.getHours()。并未将这个值赋给一个javascript变量。这时，eval方法就将这样的值返回。这有些类似C语言的(…)运算符。如(c=a+b, c + d),这个表达式的返回值是a+b+d。<br/><br/>和脚本语言进行交互<br/><br/>　　上面例子只是运行了一个非常简单的脚本。这个脚本是孤立的，并未通过Java向这脚本传递任何的值。虽然从这个脚本返回了一个值，但这种返回方式是隐式的。<br/><br/>　　脚本引擎除了这些简单的功能，还为我们提供了更强大的功能。甚至可以通过Java向脚本语言中传递参数，还可以将脚本语言中的变量的值取出来。这些功能要依靠ScriptEngine中的两个方法put和get。<br/><br/>　　put 有两个参数，一个是脚本变量名，另一个是变量的值，这个值是Object类型，因此，可以传递任何值。<br/>　　get 有一个参数，就是脚本变量的名。<br/><br/>　　下面的代码通过javascript脚本将一个字符串翻转（这个字符串是通过java传给javascript的），然后通过java得到这个被翻转后的字符后，然后输出。<br/><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.rekoe.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">import javax.script.*;<br/>import java.io.*;<br/>import static java.lang.System.*;<br/>public class ReverseString<br/>{<br/>　public static void main(String args[]) <br/>　{<br/>　　ScriptEngineManager manager = new ScriptEngineManager();<br/>　　// 建立javascript脚本引擎<br/>　　ScriptEngine engine = manager.getEngineByName(&#34;javascript&#34;);<br/>　　try <br/>　　{<br/>　　　// 将变量name和变量值abcdefg传给javascript脚本<br/>　　　engine.put(&#34;name&#34;, &#34;abcdefg&#34;);<br/>　　　// 开始执行脚本<br/>　　　engine.eval(&#34;var output = &#39;&#39;;&#34; +<br/>　　　　&#34;for (i = 0; i &lt;= name.length; i++) {&#34; +<br/>　　　　&#34; output = name.charAt(i) + output&#34; +<br/>　　　　&#34;}&#34;);<br/>　　　// 得到output变量的值<br/>　　　String name = (String)engine.get(&#34;output&#34;);<br/>　　　out.printf(&#34;被翻转后的字符串：%s&#34;, name);<br/>　　} <br/>　　catch (ScriptException e) <br/>　　{<br/>　　　err.println(e);<br/>　　}<br/>　}<br/>}</div></div><br/>以上代码的输出结果为：被翻转后的字符串：gfedcba<br/>让脚本运行得更快<br/><br/>　　众所周知，解释运行方式是最慢的运行方式。上述的几个例子无一例外地都是以解释方式运行的。由于Java EE 6的脚本引擎可以支持任何实现脚本引擎接口的语言。有很多这样的语言提供了编译功能，也就是说，在运行脚本之前要先将这些脚本进行编译（这里的编译一般将不是生成可执行文件，而只是在内存中编译成更容易运行的方式），然后再执行。如果某段脚本要运行之交多次的话，使用这种方式是非常快的。我们可以使用ScriptEngine的compile方法进行编译。并不是所有脚本引擎都支持编译，只有实现了Compilable接口的脚本引擎才可以使用compile进行编译，否则将抛出一个错误。下面的例子将演示如何使用compile方法编译并运行javascript脚本。<br/><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.rekoe.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">import javax.script.*;<br/>import java.io.*;<br/>import static java.lang.System.*;<br/>public class CompileScript<br/>{<br/>　public static void main(String args[]) <br/>　{<br/>　　ScriptEngineManager manager = new ScriptEngineManager();<br/>　　ScriptEngine engine = manager.getEngineByName(&#34;javascript&#34;);<br/>　　engine.put(&#34;counter&#34;, 0); // 向javascript传递一个参数<br/>　　// 判断这个脚本引擎是否支持编译功能<br/>　　if (engine instanceof Compilable) <br/>　　{<br/>　　　Compilable compEngine = (Compilable)engine;<br/>　　　try <br/>　　　{<br/>　　　　// 进行编译<br/>　　　　CompiledScript script = compEngine.compile(&#34;function count() { &#34; +<br/>　　　　　&#34; counter = counter +1; &#34; +<br/>　　　　　&#34; return counter; &#34; +<br/>　　　　&#34;}; count();&#34;);<br/>　　　　out.printf(&#34;Counter: %s%n&#34;, script.eval());<br/>　　　　out.printf(&#34;Counter: %s%n&#34;, script.eval());<br/>　　　　out.printf(&#34;Counter: %s%n&#34;, script.eval());<br/>　　　} <br/>　　　catch (ScriptException e) <br/>　　　{<br/>　　　　err.println(e);<br/>　　　}<br/>　　} <br/>　　else <br/>　　{<br/>　　　err.println(&#34;这个脚本引擎不支持编译!&#34;);<br/>　　}<br/>　}<br/>}</div></div><br/>上面的代码运行后的显示信息如下：<br/><br/>　　Counter: 1.0<br/>　　Counter: 2.0<br/>　　Counter: 3.0<br/><br/>　　在这个例子中，先通过compile方法将脚本编译，然后通过eval方法多次进行调用。在这段代码中只有一个函数，因此，eval就返回了这个函数的值。<br/><br/>动态调用脚本语言的方法<br/><br/>　　上面的例子只有一个函数，可以通过eval进行调用并将它的值返回。但如果脚本中有多个函数或想通过用户的输入来决定调用哪个函数，这就需要使用invoke方法进行动态调用。和编译一样，脚本引擎必须实现Invocable接口才可以动态调用脚本语言中的方法。下面的例子将演示如何通过动态调用的方式来运行上面的翻转字符串的javascript脚本。<br/><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.rekoe.net/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent">import javax.script.*;<br/>import java.io.*;<br/>import static java.lang.System.*;<br/>public class InvocableTest<br/>{<br/>　public static void main(String args[]) <br/>　{<br/>　　ScriptEngineManager manager = new ScriptEngineManager();<br/>　　ScriptEngine engine = manager.getEngineByName(&#34;javascript&#34;);<br/>　　if (engine instanceof Invocable) <br/>　　{<br/>　　　try <br/>　　　{<br/>　　　　engine.eval(&#34;function reverse(name) {&#34; +<br/>　　　　　&#34; var output = &#39;&#39;;&#34; +<br/>　　　　　&#34; for (i = 0; i &lt;= name.length; i++) {&#34; +<br/>　　　　　　&#34; output = name.charAt(i) + output&#34; +<br/>　　　　　　　&#34; } return output;}&#34;);<br/>　　　　Invocable invokeEngine = (Invocable)engine;<br/>　　　　Object o = invokeEngine.invoke(&#34;reverse&#34;, name);<br/>　　　　out.printf(&#34;翻转后的字符串：%s&#34;, name);<br/>　　　}<br/>　　　catch (NoSuchMethodException e) <br/>　　　{<br/>　　　　err.println(e);<br/>　　　} <br/>　　　catch (ScriptException e) <br/>　　　{<br/>　　　　err.println(e);<br/>　　　}<br/>　　}<br/>　　else<br/>　　{<br/>　　　err.println(&#34;这个脚本引擎不支持动态调用&#34;);<br/>　　}<br/>}</div></div><br/>动态实现接口<br/><br/>　　脚本引擎还有一个更吸引的功能，那就是动态实现接口。如我们要想让脚本异步地执行，即通过多线程来执行，那InvokeEngine类必须实现Runnable接口才可以通过Thread启动多线程。因此，可以通过getInterface方法来使InvokeEngine动态地实现Runnable接口。这样一般可分为3步进行。<br/><br/>　　1. 使用javascript编写一个run函数<br/><br/>engine.eval(&#34;function run() {print(&#39;异步执行&#39;);}&#34;); <br/><br/>　　2. 通过getInterface方法实现Runnable接口<br/><br/>Runnable runner = invokeEngine.getInterface(Runnable.class); <br/><br/>　　3. 使用Thread类启动多线程<br/><br/>Thread t = new Thread(runner);<br/>t.start(); <br/><br/>　　下面是实现这个功能的详细代码。<br/><br/>import javax.script.*;<br/>import static java.lang.System.*;<br/><br/>public class InterfaceTest <br/>{<br/>　public static void main(String args[]) <br/>　{<br/>　　ScriptEngineManager manager = new ScriptEngineManager();<br/>　　ScriptEngine engine = manager.getEngineByName(&#34;javascript&#34;);<br/>　　try <br/>　　{<br/>　　　engine.eval(&#34;function run() {print(&#39;异步调用&#39;);}&#34;);<br/>　　　Invocable invokeEngine = (Invocable)engine;<br/>　　　Runnable runner = invokeEngine.getInterface(Runnable.class);<br/>　　　Thread t = new Thread(runner);<br/>　　　t.start();<br/>　　　t.join();<br/>　　}<br/>　　catch (InterruptedException e) <br/>　　{<br/>　　　err.println(e);<br/>　　}<br/>　　catch (ScriptException e) <br/>　　{<br/>　　　System.err.println(e);<br/>　　}<br/>　}<br/>} <br/><br/>　　其实上面的代码是通过javascript实现了Runnable接口的run方法。]]></description>
		</item>
		
</channel>
</rss>
