﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-首页技术区</title><link>http://www.blogjava.net/</link><description>专注于Java技术</description><language>zh-cn</language><lastBuildDate>Tue, 09 Feb 2010 13:28:05 GMT</lastBuildDate><pubDate>Tue, 09 Feb 2010 13:28:05 GMT</pubDate><ttl>60</ttl><item><title>nginx+tomcat架构下获取真实IP的办法 </title><link>http://www.blogjava.net/boyanxiu/archive/2010/02/09/312411.html</link><dc:creator>boyanxiu</dc:creator><author>boyanxiu</author><pubDate>Tue, 09 Feb 2010 05:54:00 GMT</pubDate><guid>http://www.blogjava.net/boyanxiu/archive/2010/02/09/312411.html</guid><wfw:comment>http://www.blogjava.net/boyanxiu/comments/312411.html</wfw:comment><comments>http://www.blogjava.net/boyanxiu/archive/2010/02/09/312411.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boyanxiu/comments/commentRss/312411.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boyanxiu/services/trackbacks/312411.html</trackback:ping><description><![CDATA[<p>第一步：在nginx.conf中配置反向代理时把真实IP带上，例如：</p>
<p>server { <br />
&nbsp;&nbsp;&nbsp; listen 80; <br />
&nbsp;&nbsp;&nbsp; server_name&nbsp; boyan.com; <br />
&nbsp;&nbsp;&nbsp; location ~ ^/(WEB-INF)/ { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; deny all; <br />
&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp;&nbsp;&nbsp; location / { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_pass http://localhost:8888;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: red"><strong>proxy_set_header&nbsp; X-Real-IP&nbsp; $remote_addr;</strong></span><br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }</p>
<p>第二步：应用程序中用<span style="color: red"><strong>&nbsp;String ip = request.getHeader("X-Real-IP");</strong></span>替代String ip = request.getRemoteAddr();即可<br />
&nbsp; <br />
</p>
<img src ="http://www.blogjava.net/boyanxiu/aggbug/312411.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boyanxiu/" target="_blank">boyanxiu</a> 2010-02-09 13:54 <a href="http://www.blogjava.net/boyanxiu/archive/2010/02/09/312411.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>《构建高性能Web站点》——China pub 09年度畅销榜TOP50</title><link>http://www.blogjava.net/lutinghui/archive/2010/02/09/312407.html</link><dc:creator>麦田里的稻草</dc:creator><author>麦田里的稻草</author><pubDate>Tue, 09 Feb 2010 05:13:00 GMT</pubDate><guid>http://www.blogjava.net/lutinghui/archive/2010/02/09/312407.html</guid><wfw:comment>http://www.blogjava.net/lutinghui/comments/312407.html</wfw:comment><comments>http://www.blogjava.net/lutinghui/archive/2010/02/09/312407.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lutinghui/comments/commentRss/312407.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lutinghui/services/trackbacks/312407.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天发现了一本好书《构建高性能Web站点》，与大家分享一下。书中介绍了构建高性能Web站点的多项技术，如动态网页缓存、动态网页静态化、应用层数据缓存、分布式缓存等，穿插了大量的实际测试数据和很多流行开源软件的使用方法与案例。对于网络系统架构师、运维和开发人员，可以说是一本很有参考价值的书。&nbsp;&nbsp;<a href='http://www.blogjava.net/lutinghui/archive/2010/02/09/312407.html'>阅读全文</a><img src ="http://www.blogjava.net/lutinghui/aggbug/312407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lutinghui/" target="_blank">麦田里的稻草</a> 2010-02-09 13:13 <a href="http://www.blogjava.net/lutinghui/archive/2010/02/09/312407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Swing DayDayUp之六: QQ风格JTextField</title><link>http://www.blogjava.net/Swing/archive/2010/02/09/312402.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Tue, 09 Feb 2010 04:06:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/archive/2010/02/09/312402.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/312402.html</wfw:comment><comments>http://www.blogjava.net/Swing/archive/2010/02/09/312402.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/312402.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/312402.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: QQ风格JTextField&nbsp;&nbsp;<a href='http://www.blogjava.net/Swing/archive/2010/02/09/312402.html'>阅读全文</a><img src ="http://www.blogjava.net/Swing/aggbug/312402.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">zht</a> 2010-02-09 12:06 <a href="http://www.blogjava.net/Swing/archive/2010/02/09/312402.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OpenHandX-Chart 1.0</title><link>http://www.blogjava.net/pengminghua/archive/2010/02/09/312374.html</link><dc:creator>彭明华</dc:creator><author>彭明华</author><pubDate>Mon, 08 Feb 2010 17:29:00 GMT</pubDate><guid>http://www.blogjava.net/pengminghua/archive/2010/02/09/312374.html</guid><wfw:comment>http://www.blogjava.net/pengminghua/comments/312374.html</wfw:comment><comments>http://www.blogjava.net/pengminghua/archive/2010/02/09/312374.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/pengminghua/comments/commentRss/312374.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/pengminghua/services/trackbacks/312374.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: OpenHandx-chart核心采用了jfreechart，并集成了jfreechart的主要功能。虽然jfreechart的功能很强大，但使用起来也非常复杂。OpenHandx-chart目的有3个，第一是简化jfreechart使用、第二是增加图表工具的数据加工处理功能、第三是为OpenHandx平台提供图表处理能力。&nbsp;&nbsp;<a href='http://www.blogjava.net/pengminghua/archive/2010/02/09/312374.html'>阅读全文</a><img src ="http://www.blogjava.net/pengminghua/aggbug/312374.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/pengminghua/" target="_blank">彭明华</a> 2010-02-09 01:29 <a href="http://www.blogjava.net/pengminghua/archive/2010/02/09/312374.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用内嵌IFrame，处理系统跨域身份认证的方案与实现</title><link>http://www.blogjava.net/raozhh/archive/2010/02/08/312348.html</link><dc:creator>lbom</dc:creator><author>lbom</author><pubDate>Mon, 08 Feb 2010 09:55:00 GMT</pubDate><guid>http://www.blogjava.net/raozhh/archive/2010/02/08/312348.html</guid><wfw:comment>http://www.blogjava.net/raozhh/comments/312348.html</wfw:comment><comments>http://www.blogjava.net/raozhh/archive/2010/02/08/312348.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/raozhh/comments/commentRss/312348.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/raozhh/services/trackbacks/312348.html</trackback:ping><description><![CDATA[<p>需求： <p>系统A与系统B分别部署在不同域的两台服务器中，但它们的身份都统一在身份认证服务器中；身份认证信息以Session方式存贮于各自系统中，并辅以cookie进行使用。 <p>当用户在A系统登录后，访问B系统时，由于是跨域访问，导致身份信息不能正确的传递到B系统中，从而致使用户需在B系统中重新登录。 <p><a href="http://www.blogjava.net/images/blogjava_net/raozhh/WindowsLiveWriter/iframe_F910/clip_image001%5B6%5D.gif"><img title="clip_image001[6]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="155" alt="clip_image001[6]" src="http://www.blogjava.net/images/blogjava_net/raozhh/WindowsLiveWriter/iframe_F910/clip_image001%5B6%5D_thumb.gif" width="240" border="0"></a> <p>解决方案： <p>处理这类跨域访问时，我们最先使用从B系统向C通过HttpRequest(类AJAX请求)的方式获取身份信息，此方式好处是同步处理，方便用使用；但其限制诸多，如需设置信任站点、用户访问确认等，甚至，在对应用服务器作了一次安全升级后，根本无法访问了。因此，需另行开辟途径，于是，在同事建议下，我们使用IFrame内嵌跨域验证网页，来解决此问题。 <p>1、原理设计：用户在访问B系统时，先使用一内置的iframe，并将iframe的src指向身份认证服务器系统代理验证接口；如果用户已经在A系统中进行过登录，即A域了中已存在着身份认证信息后，身份认证服务器中也将具有其身份信息将其附带着身份认证信息后重定向访问B系统代理接口；B系统代理验证接口在接收到由A系统传递而来的身份认证信息后，通过身份认证服务器验证后，在B系统所在域重建身份认证信息。 <p>2、实现逻辑贴码： <p>1）B系统代理验证接口： <p>（1）IFrame逻辑贴码： <p><a href="http://www.blogjava.net/images/blogjava_net/raozhh/WindowsLiveWriter/iframe_F910/clip_image002%5B6%5D.gif"><img title="clip_image002[6]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="67" alt="clip_image002[6]" src="http://www.blogjava.net/images/blogjava_net/raozhh/WindowsLiveWriter/iframe_F910/clip_image002%5B6%5D_thumb.gif" width="240" border="0"></a> <p>（2）JS检测是否通过认证逻辑贴码： <p><a href="http://www.blogjava.net/images/blogjava_net/raozhh/WindowsLiveWriter/iframe_F910/clip_image003%5B6%5D.gif"><img title="clip_image003[6]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="229" alt="clip_image003[6]" src="http://www.blogjava.net/images/blogjava_net/raozhh/WindowsLiveWriter/iframe_F910/clip_image003%5B6%5D_thumb.gif" width="240" border="0"></a> <p>2）身份认证服务器端接口（JSP）： <p><a href="http://www.blogjava.net/images/blogjava_net/raozhh/WindowsLiveWriter/iframe_F910/clip_image004%5B6%5D.gif"><img title="clip_image004[6]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="132" alt="clip_image004[6]" src="http://www.blogjava.net/images/blogjava_net/raozhh/WindowsLiveWriter/iframe_F910/clip_image004%5B6%5D_thumb.gif" width="240" border="0"></a> <p>3、注意事项： <p>1）由于身份认证中心使用cookie作为身份标识，因此，需要用户在浏览器中允许使用cookie的设置； <p>2）由于在iframe中进行跨域重定向，因此需在IE安全中的跨域浏览子框架项设为启用： <p><a href="http://www.blogjava.net/images/blogjava_net/raozhh/WindowsLiveWriter/iframe_F910/clip_image005%5B6%5D.gif"><img title="clip_image005[6]" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="140" alt="clip_image005[6]" src="http://www.blogjava.net/images/blogjava_net/raozhh/WindowsLiveWriter/iframe_F910/clip_image005%5B6%5D_thumb.gif" width="240" border="0"></a> <p>4、源码文件： <p>…… <img src ="http://www.blogjava.net/raozhh/aggbug/312348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/raozhh/" target="_blank">lbom</a> 2010-02-08 17:55 <a href="http://www.blogjava.net/raozhh/archive/2010/02/08/312348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails控件必填验证和提示</title><link>http://www.blogjava.net/TiGERTiAN/archive/2010/02/08/312343.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Mon, 08 Feb 2010 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2010/02/08/312343.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/312343.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2010/02/08/312343.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/312343.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/312343.html</trackback:ping><description><![CDATA[1、领域模型中需要加入必填的字段名称，如下：<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 id="Codehighlighter1_11_123_Open_Image" onclick="this.style.display='none'; Codehighlighter1_11_123_Open_Text.style.display='none'; Codehighlighter1_11_123_Closed_Image.style.display='inline'; Codehighlighter1_11_123_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_11_123_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_11_123_Closed_Text.style.display='none'; Codehighlighter1_11_123_Open_Image.style.display='inline'; Codehighlighter1_11_123_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;News&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_11_123_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_11_123_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;id;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;title;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;content;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" /><br />
<img id="Codehighlighter1_90_121_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_121_Open_Text.style.display='none'; Codehighlighter1_90_121_Closed_Image.style.display='inline'; Codehighlighter1_90_121_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_90_121_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_90_121_Closed_Text.style.display='none'; Codehighlighter1_90_121_Open_Image.style.display='inline'; Codehighlighter1_90_121_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;constraints&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_90_121_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_90_121_Open_Text"><span style="color: #000000">{<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title(blank:</span><span style="color: #0000ff">false</span><span style="color: #000000">)<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<p>title(blank:false)，表示该字段不可为空<br />
2、在message属性中，定义该字段为空时候的提示，格式是<span style="color: red">领域包名.领域模型类名称.属性名称.限制属性名称=提示信息<br />
</span>例：cn.tigertian.grails.domain.News.title.blank=请填写标题<br />
3、在页面上加入如下代码：</p>
<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 align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">&lt;</span><span style="color: #000000">g:message&nbsp;code</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">default.create.label</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;args</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">[entityName]</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;&lt;/</span><span style="color: #000000">h1</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">g:</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;test</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">${flash.message}</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img id="Codehighlighter1_144_158_Open_Image" onclick="this.style.display='none'; Codehighlighter1_144_158_Open_Text.style.display='none'; Codehighlighter1_144_158_Closed_Image.style.display='inline'; Codehighlighter1_144_158_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_144_158_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_144_158_Closed_Text.style.display='none'; Codehighlighter1_144_158_Open_Image.style.display='inline'; Codehighlighter1_144_158_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">div&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">message</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000">$</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_144_158_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_144_158_Open_Text"><span style="color: #000000">{flash.message}</span></span><span style="color: #000000">&lt;/</span><span style="color: #000000">div</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">g:</span><span style="color: #0000ff">if</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">g:hasErrors&nbsp;bean</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">${instance}</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">div&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">errors</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">g:renderErrors&nbsp;bean</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">${instance}</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;as</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">list</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">div</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">g:hasErrors</span><span style="color: #000000">&gt;</span></div>
则在有错误信息的时候就会提示了
 <img src ="http://www.blogjava.net/TiGERTiAN/aggbug/312343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2010-02-08 17:04 <a href="http://www.blogjava.net/TiGERTiAN/archive/2010/02/08/312343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>flex国际化</title><link>http://www.blogjava.net/badqiu/archive/2010/02/08/312336.html</link><dc:creator>badqiu</dc:creator><author>badqiu</author><pubDate>Mon, 08 Feb 2010 08:09:00 GMT</pubDate><guid>http://www.blogjava.net/badqiu/archive/2010/02/08/312336.html</guid><wfw:comment>http://www.blogjava.net/badqiu/comments/312336.html</wfw:comment><comments>http://www.blogjava.net/badqiu/archive/2010/02/08/312336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badqiu/comments/commentRss/312336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badqiu/services/trackbacks/312336.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: flex3只支持两种语言，en_US,ja_JP<br>而flex4中则支持多国语言，所以可以将flex4中的%FLEX_HOME%\frameworks\locale\zh_CN拷贝至flex3中。&nbsp;&nbsp;<a href='http://www.blogjava.net/badqiu/archive/2010/02/08/312336.html'>阅读全文</a><img src ="http://www.blogjava.net/badqiu/aggbug/312336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badqiu/" target="_blank">badqiu</a> 2010-02-08 16:09 <a href="http://www.blogjava.net/badqiu/archive/2010/02/08/312336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grails使用JNDI方法</title><link>http://www.blogjava.net/TiGERTiAN/archive/2010/02/08/312333.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Mon, 08 Feb 2010 07:28:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2010/02/08/312333.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/312333.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2010/02/08/312333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/312333.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/312333.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天搞了一下Grails的JNDI配置，步骤如下&nbsp;&nbsp;<a href='http://www.blogjava.net/TiGERTiAN/archive/2010/02/08/312333.html'>阅读全文</a><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/312333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2010-02-08 15:28 <a href="http://www.blogjava.net/TiGERTiAN/archive/2010/02/08/312333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>胡乱列了几个mysql命令</title><link>http://www.blogjava.net/ynstudio/archive/2010/02/08/312328.html</link><dc:creator>一农</dc:creator><author>一农</author><pubDate>Mon, 08 Feb 2010 07:09:00 GMT</pubDate><guid>http://www.blogjava.net/ynstudio/archive/2010/02/08/312328.html</guid><wfw:comment>http://www.blogjava.net/ynstudio/comments/312328.html</wfw:comment><comments>http://www.blogjava.net/ynstudio/archive/2010/02/08/312328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ynstudio/comments/commentRss/312328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ynstudio/services/trackbacks/312328.html</trackback:ping><description><![CDATA[<pre>
我使用mysql时用的几个命令，杂乱的列了一下，可能对有的朋友有用处，虽然在网上都能找到

----首先在命令行下进入到mysql的bin目录，运行mysql -u root -p，然后输入密码
----如果密码为空可以省略-p，另外这里还可以直接跟上数据库的名称，这样就不需要进入后再use 数据库名了。
----如果忘记密码可以在google里搜索 mysql 命令 清空密码，资料一堆。
---- http://dev.mysql.com/doc/refman/5.1/zh/index.html
\mysql\bin>mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 64
Server version: 5.0.51a Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
----创建数据库
mysql> create database simplejee default character set gbk;
Query OK, 1 row affected (0.06 sec)
----切换到数据库
mysql> use simplejee;
Database changed
----将某个sql文件里的sql执行
mysql> set names utf8;//这里的编码要和你的sql文件的编码相一致。
//要使得对有外键关系的表重新载入转储文件变得更容易，mysqldump自动在转储输出中包括一个语句设置FOREIGN_KEY_CHECKS为0。
//这避免在转储被重新装载之时，与不得不被以特别顺序重新装载的表相关的问题。也可以手动设置这个变量：
mysql> SET FOREIGN_KEY_CHECKS = 0;
mysql> source c:/simplejee.sql;
Query OK, 0 rows affected (0.00 sec)
mysql> SET FOREIGN_KEY_CHECKS = 1;
----删除数据库
mysql> drop database simplejee;
Query OK, 133 rows affected (3.95 sec)

mysql> create database simplejee;
Query OK, 1 row affected (0.03 sec)

mysql> use simplejee;
Database changed
mysql> source c:/simplejee0601_0738.sql;
----从app_user表里查数据
mysql>select * from app_user;


--导出数据 如果密码为空-p可以省略。注意导出是直接在命令行下。
--如果中文乱码，可以根据情况加上诸如 --default-character-set=gbk的东东
mysqldump -u root -p simplejee>f:\t.sql
</pre><img src ="http://www.blogjava.net/ynstudio/aggbug/312328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ynstudio/" target="_blank">一农</a> 2010-02-08 15:09 <a href="http://www.blogjava.net/ynstudio/archive/2010/02/08/312328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何减少学习j2ee的成本并提高质量</title><link>http://www.blogjava.net/ynstudio/archive/2010/02/08/312312.html</link><dc:creator>一农</dc:creator><author>一农</author><pubDate>Mon, 08 Feb 2010 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/ynstudio/archive/2010/02/08/312312.html</guid><wfw:comment>http://www.blogjava.net/ynstudio/comments/312312.html</wfw:comment><comments>http://www.blogjava.net/ynstudio/archive/2010/02/08/312312.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/ynstudio/comments/commentRss/312312.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ynstudio/services/trackbacks/312312.html</trackback:ping><description><![CDATA[<div class="blog_content">
    <p>#给j2ee初学者的建议.<br><br>
如何减少学习j2ee的成本并提高质量<br><br>
学习的成本，大致应该可以归结为时间，辛苦，钞票，还有一个成本就是因为学习周期太长带来的机会的丢失。 所以注意，我们这里讨论如何降低成本，但不要舍本逐末，为了降低成本而耽误了学习。 另外我只是从我从事的内容的角度去谈的。</p>
<ol>
<li> 如果身边有朋友入行时间较长，向朋友咨询，遇到问题先自己解决，根据问题的不同，定个时间底线，过了底线就询问朋友。首先自己解决，是因为这个能力的锻炼是无比必须的。但如果没人帮你，有很多无谓的小错误会浪费你大把大把的生命，所以我把这一条放在第一位。</li>
<li> 网上有很多免费的视频，结合大家的推荐以及自己的感受，选择一些视频。但切记不要整天收集资料，感觉差不多就可以了。</li>
<li> 视频的优点是直观，容易理解，缺点是翻看不方便，时间长，所以入门时看视频，后续还是看书更好些。视频还有个缺点是容易犯困，不过书籍也是如此。</li>

<li> 只看不练，等于白看。看视频，看书，那些例子一定要实际的做一遍。这个是必须的。springside，appfuse，我们的 <a href="http://code.google.com/p/simplejee/">simplejee</a>
 也可以拿来练手。多敲代码才会培养出感觉，别人帮助你时，才能心有灵犀。</li>
<li> 如果有实战机会，一定抓住，别在乎得失。</li>
<li> 99%的人在没有氛围，没有伙伴的情况下是坚持不下来的，至少很难保持状态的坚持下来，所以最好拉个家伙一起下水。特别是没有有经验的人帮你的话。</li>
<li> 始终提醒自己，重在坚持，想办法提高效率。</li>
<li> google，baidu，搜索引擎的使用放在最后是因为太重要。ＱＱ群也算，我加了一堆群，可以开拓视野，拓展人脉，可是能及时解决问题的情况太少，因为很多问题都和环境相关，即便有人有意愿帮你解决问题，也非常不方便，非常消耗时间。这时不要埋怨没人帮你，因为没人有这个义务，而且也很不方便，大的说不是好的使用社会生产力的方式 :-)。</li>

</ol>
<p><br>
P.S. 本文有植入式营销的内容。</p>
    
  </div><img src ="http://www.blogjava.net/ynstudio/aggbug/312312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ynstudio/" target="_blank">一农</a> 2010-02-08 12:43 <a href="http://www.blogjava.net/ynstudio/archive/2010/02/08/312312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何让你遇见我 </title><link>http://www.blogjava.net/sxyx2008/archive/2010/02/08/312288.html</link><dc:creator>雪山飞鹄</dc:creator><author>雪山飞鹄</author><pubDate>Mon, 08 Feb 2010 01:59:00 GMT</pubDate><guid>http://www.blogjava.net/sxyx2008/archive/2010/02/08/312288.html</guid><wfw:comment>http://www.blogjava.net/sxyx2008/comments/312288.html</wfw:comment><comments>http://www.blogjava.net/sxyx2008/archive/2010/02/08/312288.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/sxyx2008/comments/commentRss/312288.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/sxyx2008/services/trackbacks/312288.html</trackback:ping><description><![CDATA[<div align="center">如何让你遇见我 <br />
在我最美丽的时刻 为这 <br />
我已在佛前 求了五百年 <br />
求他让我们结一段尘缘 <br />
佛于是把我化作一棵树 <br />
长
在你必经的路旁 <br />
阳光下慎重地开满了花 <br />
朵朵都是我前世的盼望 <br />
当你走近 请你细听 <br />
那颤抖的叶是我等待的热情 <br />
而
当你终于无视地走过 <br />
在你身后落了一地的 <br />
朋友啊 那不是花瓣 <br />
是我凋零的心
</div>
<img src ="http://www.blogjava.net/sxyx2008/aggbug/312288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/sxyx2008/" target="_blank">雪山飞鹄</a> 2010-02-08 09:59 <a href="http://www.blogjava.net/sxyx2008/archive/2010/02/08/312288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>门球三方单打赛编排</title><link>http://www.blogjava.net/yanfa120/archive/2010/02/07/312274.html</link><dc:creator>小-熊</dc:creator><author>小-熊</author><pubDate>Sun, 07 Feb 2010 13:40:00 GMT</pubDate><guid>http://www.blogjava.net/yanfa120/archive/2010/02/07/312274.html</guid><wfw:comment>http://www.blogjava.net/yanfa120/comments/312274.html</wfw:comment><comments>http://www.blogjava.net/yanfa120/archive/2010/02/07/312274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yanfa120/comments/commentRss/312274.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yanfa120/services/trackbacks/312274.html</trackback:ping><description><![CDATA[<p>9人比赛,3个人一场,打一个循环,共4轮12场球.要求在每场比赛中相遇过的对手不能重复.如:9人比赛的安排,第一轮,1.4.7,&nbsp; 2.5.8,&nbsp; 3.6.9,第二轮2.4.9&nbsp; 3.5.7,&nbsp; 1.6.8,&nbsp; 第三轮,1.5.9,&nbsp; 2.6.7,&nbsp; 3.4.8,&nbsp; 第四轮,1.2.3,&nbsp; 4.5.6,&nbsp; 7.8.9,&nbsp; <br />
现在,15人比赛,进行一个循环,共7轮35场球,我编到31场就怎么也编不下去了,怎么编都会重复一个人<br />
这题该怎么写算法。随便用什么语言实<br />
可分两步实现:（<span style="color: red">提示</span>）<br />
1. 实现35个不重复队<br />
2. 从35个队中实现7轮,每轮不重复队员</p>
<img src ="http://www.blogjava.net/yanfa120/aggbug/312274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yanfa120/" target="_blank">小-熊</a> 2010-02-07 21:40 <a href="http://www.blogjava.net/yanfa120/archive/2010/02/07/312274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tapestry 最新版5.1.0.5教程（十）：页面间传递多个参数</title><link>http://www.blogjava.net/usherlight/archive/2010/02/06/312181.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Sat, 06 Feb 2010 04:36:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2010/02/06/312181.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/312181.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2010/02/06/312181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/312181.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/312181.html</trackback:ping><description><![CDATA[<p>在tapestry5中，在页面之间传递基本有3种方法<br />
1、存放在Session中<br />
2、使用@Persist进行持久化<br />
3、使用页面context来传递参数。<br />
其中1和2都需要将数据存放在Session中，相对来说系统的开销比较大。尤其是多用户高并发情况下，对于性能可能会有一定的影响。<br />
使用页面Context来传递则需要在开发时写一些代码，增加了一些开发量，显得没有前两种方法方便。<br />
第3种方法的实现是需要在页面中添加onActivate和onPassivate方法来完成页面参数的传递。<br />
我们先来看一下其背后的故事。<br />
举个例子，比如说我们有两个页面，第一个是查询条件输入页面input，另一个是查询结果输出页面output。input页面中有两个查询条件，起始时间dateFrom和终止时间dateTo<br />
在Input.java中，我们可以很直观地这样写：<br />
@InjectPage<br />
private Output output;</p>
<p>@Property<br />
private String dateFrom;</p>
<p>@Property<br />
private String dateTo;</p>
<p>Object onFormSubmit() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.setDateFrom(dateFrom);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.setDateTo(dateTo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return output;<br />
}<br />
首先使用注解注入output页面，然后在表单的提交事件中，返回output，这样就在程序中定义了返回页面，而不是使用配置文件的方式。<br />
但是这样的实现却不能正确运行，原因是因为Tapestry5的使用了页面池技术，页面在每次渲染前都是从页面池中随机获取一个页面，而从页面池中取得的页面，所有的属性都是被清空了的。<br />
也就是说在上例中，虽然我们注入了output页面，但是此页面马上就被放入了页面池，而且其中的属性值马上就被清空了。这就是引入onActivate和onPassivate这丙个方法的原因。tapestry5在清空属性前会首先查看是否包含onPassivate方法，如果有，就把其返回值保存起来，然后从页面池中取得页面后，再把刚才保存的值作为参数传递给onActivate方法。<br />
这就是方法3的基本原理，但是无论是在官方的文档或是示例或者网上其他的应用中，可以发现大部分都是使用单个参数的，比如说id。这也很容易理解，因为onPassivate的方法的返回值只能有一个。<br />
在Tapestry5的官方文档中，只有一句非常简要的话介绍了如果传递多个文档的方法： The activation context may consist of a series of values, in which case the return value of the method should be an array or a List. （参见：http://tapestry.apache.org/tapestry5.1/guide/pagenav.html）。<br />
但是这并不是说只要在onPassivate中把参数的值加入到List中，返回一个List，而在onActivate中接受一个List参数，然后就可以得到其中的参数了，因为Tapestry5把参数传给onActivate的方法其实是通过将参数作为HttpRequest中的参数的。如果试图使用上述方法就是得到一个&#8220;无法将List转换成String的错误&#8221;<br />
所以方法应该是这样的，在Output中：</p>
<p>private List&lt;String&gt; paramList;<br />
public void setParamList(List&lt;String&gt; paramList) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.paramList = paramList;<br />
}<br />
public List&lt;String&gt; getParamList() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return paramList;<br />
}<br />
List&lt;String&gt; onPassivate() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return paramList;<br />
}<br />
void onActivate(String dateFrom, String dateTo) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.dateFrom = dateFrom;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.dateTo = dateTo;<br />
}<br />
private String dateFrom;<br />
private String dateTo;</p>
<p>在Input页面中，需要把onFormSubmit改一下：<br />
Object onFormSubmit() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List&lt;String&gt; list = new ArrayList&lt;String&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output.setParamList(list);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return output;<br />
}</p>
<p>其中，需要注意的是output中的onActivate方法，基参数的顺序必须和List中放入的参数顺序一致。</p>
<p><br />
&nbsp;</p><img src ="http://www.blogjava.net/usherlight/aggbug/312181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2010-02-06 12:36 <a href="http://www.blogjava.net/usherlight/archive/2010/02/06/312181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[翻译]eclipse插件开发(1-1):action</title><link>http://www.blogjava.net/lzhidj/archive/2010/02/06/312177.html</link><dc:creator>李赞红</dc:creator><author>李赞红</author><pubDate>Sat, 06 Feb 2010 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/lzhidj/archive/2010/02/06/312177.html</guid><wfw:comment>http://www.blogjava.net/lzhidj/comments/312177.html</wfw:comment><comments>http://www.blogjava.net/lzhidj/archive/2010/02/06/312177.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzhidj/comments/commentRss/312177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzhidj/services/trackbacks/312177.html</trackback:ping><description><![CDATA[<span style="font-size: 13px; line-height: 19px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif">
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">eclipse</span>平台允许我们通过插件扩展出另一个插件，与平台紧密集成为用户提供更好的体验，本文将向您阐述如何向视图和编辑器中添加动作<span lang="EN-US">(上下文菜单<span lang="EN-US">)</span>，并且允许为您自己定义的视图和编辑器添加其他新的动作。文中的每一个示例将详细的向您展示每一种不同应用的特征。</span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><img style="width: 762px; height: 682px" height="682" alt="" src="http://www.blogjava.net/images/blogjava_net/lzhidj/sss.PNG" width="762" border="0" /><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt">上面的图片显示了插件中能添加动作的众多区域：<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px 10px 39pt; text-indent: -18pt"><span lang="EN-US">1、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;</span></span>在视图和编辑器中添加上下文菜单<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px 10px 39pt; text-indent: -18pt"><span lang="EN-US">2、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;</span></span>在视图上添加工具栏和下拉菜单<span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px 10px 39pt; text-indent: -18pt"><span lang="EN-US">3、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;</span></span>在工作台窗口的主工具栏和菜单上添加动作<span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px 10px 21pt">本文将对上面的种种进行演示，并通过实例形式向您详细讲解。<span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt">我们假设您有插件开发的基础，如果想获得在<span lang="EN-US">eclipse平台上开发插件的更多信息，请阅读<span lang="EN-US">Jim Amsden</span>的入门文章&#8220;<span lang="EN-US">Your First Plug-in</span>&#8221;，该示例的运行结果，请点击&#8220;<span lang="EN-US">running the examples</span>&#8221;。</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><strong><span style="font-size: 11.5pt">在上下文菜单中添加动作</span></strong><strong><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt">可以在视图和编辑器的上下文菜单中添加动作并紧密集成，比如，<span lang="EN-US">VCM插件在存在的视图如<span lang="EN-US">Navigator</span>或<span lang="EN-US">Packages</span>中添加了许多新的动作，对资源进行版本管理<span lang="EN-US">.</span>为了在上下文菜单中添加新的动作<span lang="EN-US">,eclipse</span>提供了插件点<span lang="EN-US">org.eclipse.ui.popupMenus,</span>包括两种类型的动作<span lang="EN-US">,</span>即能添加到视图或编辑器的上下文菜单中<span lang="EN-US">,</span>也能为指定的对象类型添加上下文菜单。下面的三个示例将为您详细说明。</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt">示例一：为默认的文本编辑器添加新的动作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;让我们看看如何向默认的文本编辑器添加一个动作：<br />
&nbsp;&nbsp;&nbsp;&nbsp;①<span lang="EN-US">&lt;viewerContribution<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id="org.eclipse.ui.articles.action.contribution.popup.editor"<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;②<span lang="EN-US">&nbsp;&nbsp;&nbsp;targetID="#TextEditorContext"&gt;<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;③<span lang="EN-US">&nbsp;&nbsp;&nbsp;&lt;action<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id="org.eclipse.ui.articles.action.contribution.editor.action1"<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label="Editor Action 1"<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;icon="icons/red_dot.gif"<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;④<span lang="EN-US">&nbsp;&nbsp;menubarPath="additions"<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;⑤<span lang="EN-US">&nbsp;&nbsp;class="first.plugin.action.ContextMenuAction"&gt;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/action&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/viewerContribution&gt;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&lt;/extension&gt;<o:p></o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US"><o:p>&nbsp;</o:p></span>上面的<span lang="EN-US">xml向指定编辑器添加了一个上下文菜单，该扩展叫<span lang="EN-US">viewerContribution</span>（①），可以用于视图和编辑器。</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">targetID</span>属性（②）指定上下文菜单所依附的目标视图和编辑器标识符，官方文档提供了可用的标识符列表，如果您设置的标识符不存在，则上下文菜单不被注册。一个视图或编辑器可以有不只一个上下文菜单。<span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">action</span>（③）标记用于定义一个动作，<span lang="EN-US">id是该动作的标识符，<span lang="EN-US">label</span>和<span lang="EN-US">icon</span>表示菜单项的显示文本和图标，<span lang="EN-US">icon</span>为可选项。<span lang="EN-US">menubarPath</span>（④）属性指定动作菜单项的位置，从上下文菜单的根开始，<span lang="EN-US">action</span>将被添加到这里。在本示例中，&#8220;<span lang="EN-US">additions</span>&#8221;其实是<span lang="EN-US">org.eclipse.ui.IWorkbenchActionConstants</span>类的一个常量值（<span lang="EN-US">MB_ADDITIONS</span>）。添加的动作独立成组，在上述情况下，如果<span lang="EN-US">menubarPath</span>属性没有指定，工作台将首先添加到&#8220;<span lang="EN-US">additions</span>&#8221;组中，如果<span lang="EN-US">additions</span>不存在，动作将被添加到上下文菜单的末尾。</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">class</span>（⑤）属性是一个菜单项被用户选中后将要执行的动作的类，如果是编辑器的上下文菜单，该类必须实现<span lang="EN-US">org.eclipse.ui.IEditorActionDelegate接口，如果是视图的上下文菜单，则实现<span lang="EN-US">org.eclipse.ui.IViewActionDelegate</span>接口。有一个非常重要的情况就是只有当用户选择了菜单项后该类才被工作台加载，这就意味着很多初始化的逻辑必须在<span lang="EN-US">XML</span>文件中描述。一旦该类被工作台加载，该类将可以控制动作的启用与禁用。如果动作被选中，将执行<span lang="EN-US">run()</span>方法完成需要的功能。</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt">下面是一个典型的实现类：<span lang="EN-US"><o:p>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</o:p></span><span lang="EN-US">package first.plugin.action;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;import org.eclipse.jface.action.IAction;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;import org.eclipse.jface.dialogs.MessageDialog;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;import org.eclipse.jface.viewers.ISelection;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;import org.eclipse.ui.IEditorActionDelegate;<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;import org.eclipse.ui.IEditorPart;</span><span lang="EN-US"><o:p>&nbsp;<br />
</o:p></span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;public class ContextMenuAction implements IEditorActionDelegate {</span><span lang="EN-US"><o:p>&nbsp;<br />
</o:p></span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void setActiveEditor(IAction action, IEditorPart targetEditor) {<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void run(IAction action) {<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDialog.openInformation(null, "", "</span>我是上下文菜单<span lang="EN-US">");<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void selectionChanged(IAction action, ISelection selection) {<br />
</span><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<o:p></o:p></span></p>
<p class="MsoPlainText" style="margin: 10px 0px; text-indent: 21pt"><span lang="EN-US">}</span></p>
</span>
<img src ="http://www.blogjava.net/lzhidj/aggbug/312177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzhidj/" target="_blank">李赞红</a> 2010-02-06 10:37 <a href="http://www.blogjava.net/lzhidj/archive/2010/02/06/312177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaGUI应用程序部署</title><link>http://www.blogjava.net/Swing/archive/2010/02/05/312114.html</link><dc:creator>zht</dc:creator><author>zht</author><pubDate>Fri, 05 Feb 2010 07:16:00 GMT</pubDate><guid>http://www.blogjava.net/Swing/archive/2010/02/05/312114.html</guid><wfw:comment>http://www.blogjava.net/Swing/comments/312114.html</wfw:comment><comments>http://www.blogjava.net/Swing/archive/2010/02/05/312114.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/Swing/comments/commentRss/312114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Swing/services/trackbacks/312114.html</trackback:ping><description><![CDATA[<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp; </span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">JavaGUI应用程序部署<br />
</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt"><br />
JavaGUI程序发布分类</span></span></span><br />
<span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;1)&nbsp; Applet：可以嵌入到浏览器中，通过网页的方式展示给用户</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;2)&nbsp; application ：有两种发布方式</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp;&#252; 打包成jar包通过bat的方式运行，或者通过第三方软件打成exe(后续会再详细介绍)</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp;&#252; 通过Java Web Start的方式发布到服务器端，通过JNLP运行</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;相对来说第二种方式可能更好一些，免除了更新的麻烦。</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;用applet或者jws的方式发布，大部分都需要数字签名。<br />
</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt"><br />
<br />
为什么要签名</span></span></span><br />
<span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;其实签名不是必须的，如果你的程序只是单纯的绘图，显示，只要不访问网络资源也不访问本地文件，是不用签名的，<br />
&nbsp;但是如果要访问本地或网上资源就必须签名，<br />
&nbsp;比如读取本地文件或者访问数据库，这是由java的沙箱机制决定的，即jvm内部有一组安全检查规则，要通过检查之后才能访问特定资源。</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;如果要突破这个规则，可以有两个方法:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;1) 修改jre权限文件如下</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp;java.policy为grant {<br />
&nbsp;&nbsp;&nbsp;permission java.security.AllPermission;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;};</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp;一般权限文件的目录如下C:"Program Files"Java"jre6"lib"security</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp;但是修改每个客户端的权限文件，无论从时间还是操作上都是很麻烦的。</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;2)&nbsp; 签名，意思就是告诉用户，这个程序是谁发布的，是不是能信任，如果客户确定，ok，这个applet或者jws就可以访问外部资源了。<br />
<br />
</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt"><br />
如何签名</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;1)首先确保你已经完全安装了Java2的环境，有keytool工具，它位于JDK的bin目录下。这一般不会有问题。</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;2)到Dos状态下，进入你需发布应用程序的jar包所在的目录，运行下面这句话<br />
&nbsp;&nbsp; keytool -genkey -keystore myKeystore -alias jwstest -validity 1000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它将会提示你输入用户名、密码等，按照提示随便输入即可，不输入直接回车即可，<br />
&nbsp;&nbsp; 但一定要记住密码。运行结束它将会在当前路径下创建名为myKeystore的文件。</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;3)如果你想查看一下刚才生成的myKeystore文件的内容，可以使用下面这句话：<br />
&nbsp;&nbsp;keytool -list -keystore myKeystore<br />
&nbsp;&nbsp;显示出来应该类似如下：<br />
&nbsp;&nbsp;Keystore type: jks<br />
&nbsp;&nbsp;Keystore provider: SUN<br />
&nbsp;&nbsp;Your keystore contains 1 entry:<br />
&nbsp;&nbsp;jwstest, Tue Nov 23 19:29:32 PST 2001, keyEntry,<br />
&nbsp;&nbsp;Certificate fingerprint (Test):<br />
&nbsp;&nbsp;C3:A9:CD:F3:D3:AC:4D:3F:3C:5B:AF:9E:CF:0D:46:5C</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;4)对你需发布应用程序的jar包进行签名，运行下面这句话：<br />
&nbsp;&nbsp;jarsigner -keystore myKeystore yourtest.jar jwstest<br />
&nbsp;&nbsp;其中yourtest.jar是你的jar包名，你需要修改它，别的就不必修改了。<br />
&nbsp;&nbsp;运行时会提示你输入密码，就是你刚才在生成myKeystore文件时设定的密码。<br />
</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt"><br />
<br />
如果有很多jar包怎么办</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;在开发的过程中很可能会引用到第三方的jar包，而第三方的jar包又可能引用到其它的，所以可能有很多的jar包，需要和applet一起发布，有两个方法<br />
&nbsp;&nbsp;1) 分别打包签名，使用于包比较少，比如只有3、4个的情况<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2) 只 把applet的jar包签名，让用户确认访问授权，applet已经被用户授权，那么就可以在applet里改变安全管理器（SecurityManager）<br />
&nbsp;&nbsp;&nbsp;只需要继承SecurityManager类，创建自己的安全管理器类，然后覆盖checkPermission方法，允许访问任何资源。<br />
&nbsp;&nbsp;&nbsp;在applet的init方法中调用System.setSecurityManager把安全管理器设置为我们自定义的即可。</span></span></span></p>
<p><br />
<span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;class CustomManager extends SecurityManager {<br />
&nbsp;&nbsp;public void checkPermission(Permission perm, Object context) {<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;public void checkPermission(Permission perm) {<br />
&nbsp;&nbsp;}<br />
&nbsp;}<br />
&nbsp; </span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">其它一些相关资料如下</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;JDK中keytool常用命令</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;-genkey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在用户主目录中创建一个默认文件".keystore",还会产生一个mykey的别名，mykey中包含用户的公钥、私钥和证书 <br />
&nbsp;-alias&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 产生别名<br />
&nbsp;-keystore&nbsp;&nbsp;&nbsp; 指定密钥库的名称(产生的各类信息将不在.keystore文件中<br />
&nbsp;-keyalg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定密钥的算法&nbsp;&nbsp;&nbsp; <br />
&nbsp;-validity&nbsp;&nbsp;&nbsp; 指定创建的证书有效期多少天<br />
&nbsp;-keysize&nbsp;&nbsp;&nbsp;&nbsp; 指定密钥长度<br />
&nbsp;-storepass&nbsp;&nbsp; 指定密钥库的密码<br />
&nbsp;-keypass&nbsp;&nbsp;&nbsp;&nbsp; 指定别名条目的密码<br />
&nbsp;-dname&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定证书拥有者信息 例如：&nbsp; "CN=sagely,OU=atr,O=szu,L=sz,ST=gd,C=cn"<br />
&nbsp;-list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示密钥库中的证书信息&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keytool -list -v -keystore sage -storepass ....<br />
&nbsp;-v&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示密钥库中的证书详细信息<br />
&nbsp;-export&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将别名指定的证书导出到文件&nbsp; keytool -export -alias caroot -file caroot.crt<br />
&nbsp;-file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 参数指定导出到文件的文件名<br />
&nbsp;-delete&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 删除密钥库中某条目&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keytool -delete -alias sage -keystore sage<br />
&nbsp;-keypasswd&nbsp;&nbsp; 修改密钥库中指定条目口令&nbsp;&nbsp;&nbsp; keytool -keypasswd -alias sage -keypass .... -new .... -storepass ... -keystore sage<br />
&nbsp;-import&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将已签名数字证书导入密钥库&nbsp; keytool -import -alias sage -keystore sagely -file sagely.crt <br />
&nbsp;&nbsp;&nbsp;&nbsp; 导入已签名数字证书用keytool -list -v 以后可以明显发现多了认证链长度，并且把整个CA链全部打印出来。</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Keytool 是安全钥匙与证书的管理工具.它管理一个存储了私有钥匙和验证相应公共钥匙的与它们相关联的X.509 证书链的keystore(相当一个数据库).</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Keytool 是一个有效的安全钥匙和证书的管理工具. 它能够使用户使用数字签名来管理他们自己的私有/公共钥匙对,管理用来作自我鉴定的相关的证书,管理数据完整性和鉴定服务.它还能使用户在通信时缓存它们的公共钥匙.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;一个证书是某一实体(个人,公司等)的数字签名,指出其他实体的公共钥匙(或其他信息)的详细的值.当数据被签名后,这个签名信息被用来检验数据的完整性和真实性.完整性指数据没有被修改和篡改,真实性指数据从任何产生和签名的一方真正的传输到达.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Keytool 把钥匙和证书储存到一个keystore.默任的实现keystore的是一个文件.它用一个密码保护钥匙.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;而另外的一个工具jarsigner用keystore中的信息产生或检验Java aRchive(jar文件)中的数字签名.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Keystore有两个不同的入口:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;1.钥匙入口:保存了非常敏感的加密的钥匙信息,并且是用一个保护的格式存储以防止未被授权的访问.以这种形式存储的钥匙是秘密钥匙,或是一个对应证书链中公有钥匙的私有钥匙.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;2.信任证书入口:包含一个属于其他部分的单一公共钥匙证书.它之所以被称为"信任证书",是因为keystore信任的证书中的公共钥匙真正属于证书所有者的身份识别.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Keystore的别名:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;所有的keystore入口(钥匙和信任证书入口)是通过唯一的别名访问.别名是 不区分大小写的.如别名Hugo和hugo指向同一个keystore入口.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;可以在加一个入口到keystore的时候使用-genkey参数来产生一个钥匙对(公共钥匙和私有钥匙)时指定别名.也可以用-import参数加一个证书或证书链到信任证书.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;如:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;keytool -genkey -alias duke -keypass dukekeypasswd</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;其中duke为别名,dukekeypasswd为duke别名的密码.这行命令的作用是产生一个新的公共/私有钥匙对.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;假如你想修改密码,可以用:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;keytool -keypasswd -alias duke -keypass dukekeypasswd -new newpass</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;将旧密码dukekeypasswd改为newpass.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Keystore的产生:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;1.当使用-genkey 或-import或-identitydb命令添加数据到一个keystore,而当这个keystore不存在时,产生一个keystore.默认名是.keystore,存放到user-home目录.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;2.当用-keystore指定时,将产生指定的keystore.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Keystore的实现:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Keytool 类位于java.security包下,提供一个非常好的接口去取得和修改一个keystore中的信息. 目前有两个命令行:keytool和jarsinger,一个GUI工具Policy 可以实现keystore.由于keystore是公开的,用户可以用它写一些额外的安全应用程序.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Keystore还有一个sun公司提供的內在实现.它把keystore作为一个文件来实现.利用了一个keystore类型(格式)"JKS".它用单独的密码保护每一个私有钥匙.也用可能不同的密码保护整个keystore的完整性.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;支持的算法和钥匙大小:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;keytool允许用户指定钥匙对和注册密码服务供应者所提供的签名算法.缺省的钥匙对产生算法是"DSA".假如私有钥匙是"DSA"类型,缺省签名算法是"SHA1withDSA",假如私有钥匙是"RSA"类型,缺省算法是"MD5withRSA".</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;当产生一个DSA钥匙对,钥匙必须在512-1024位之间.对任何算法的缺省钥匙大小是1024位.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;证书:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;一个证书是一个实体的数字签名,指出其他实体的公共钥匙有明确的值.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;1.公共钥匙 :是同一个详细的实体的数字关联,并有意让所有想同这个实体发生信任关系的其他实体知道.公共钥匙用来检验签名;</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;2.数字签名:假如数据已被签名,并用身份存储在一个实体中,一个签名能够证明这个实体知道这个数据.这个数据用实体私有钥匙签名并递交;</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;3.身份:知道实体的方法.在一些系统中身份是公共钥匙,其他系统中可以是从一个X.509名字的邮件地址的Unix UID来的任何东西;</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;4.签名:一个签名用用实体私有钥匙来计算某些加密数据;</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;5.私有钥匙:是一些数字,每一个私有钥匙只能被特定的拥有该私有钥匙的实体知道.私有和公共钥匙存在所有用公共钥匙加密的系统的钥匙对中.一个公共钥匙加密(如DSA),一个私有钥匙与一个正确的公共钥匙通信.私有钥匙用来计算签名.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;6.实体:一个实体可以是一个人,一个组织,一个程序,一台计算机,一个商业,一个银行,或其他你想信任的东西.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Keytool应用实例:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;1.产生一个keystore:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;keytool -genkey -alias User(keystore的别名) -keyalg RSA -validity 7 -keystore keystore(指定keystore).</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;运行这个命令,系统提示:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Enter keystore password:yourpassword(输入密码)</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;What is your first and last name?</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;[Unknown]: your name(输入你的名字)</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;What is the name of your organizational unit?</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;[Unknown]:your organizational(输入你所在组织单位的名字)</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;What is the name of your organization?</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;[Unknown]:your organization name (输入你所在组织的名字)</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;What is the name of your City or Locality?</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;[Unknown]:your city name(输入所在城市的名字)</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;What is the name of your State or Province?</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;[Unknown]:your provice name(输入所在省份名字)</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;What is the two-letter country code for this unit?</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;[Unknown]:cn(输入国家名字)</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Is CN=your name, OU=your organizaion, O="your organization name",</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;L=your city name, ST=your province name, C=cn correct?</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;[no]: yes</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;2.检查一个keystore:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;keytool -list -v -keystore keystore</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Enter keystore password:your password(输入密码)</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;将显示keystore內容如:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Keystore type: jks</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Keystore provider: SUN</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Your keystore contains 1 entry</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Alias name: yourname</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Creation date: Dec 20, 2001</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Entry type: keyEntry</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Certificate chain length: 1</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Certificate[1]:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Owner: CN=yourname, OU=your organization, O="your organization name",</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;L=your city name, ST=your province name, C=CN</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Issuer: CN=Duke, OU=Java Software, O="Sun Microsystems, Inc.", L=Palo Alto, ST=CA, C=US</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Serial number: 3c22adc1</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Valid from: Thu Dec 20 19:34:25 PST 2001 until: Thu Dec 27 19:34:25 PST 2001</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Certificate fingerprints:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;MD5: F1:5B:9B:A1:F7:16:CF:25:CF:F4:FF:35:3F:4C:9C:F0</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;SHA1: B2:00:50:DD:B6:CC:35:66:21:45:0F:96:AA:AF:6A:3D:E4:03:7C:74</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;3.输出keystore到一个文件:testkey:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;keytool -export -alias duke -keystore keystore -rfc -file testkey</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;系统输出:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Enter keystore password:your password(输入密码)</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Certificate stored in file &lt; td&gt;</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;4.输入证书到一个新的truststore:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;keytool -import -alias dukecert -file testkey -keystore truststore</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;Enter keystore password:your new password.(输入truststore新密码)</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;5.检查truststore:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;keytool -list -v -keystore truststore</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;系统将显示truststore的信息.</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;现在可以用适当的keystore运行你的应用程序.如:</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;java -Djavax.net.ssl.keyStore=keystore -Djavax.net.ssl.keyStorePassword=password Server</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;和: java -Djavax.net.ssl.trustStore=truststore</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;-Djavax.net.ssl.trustStorePassword=trustword Client</span></span></span></p>
<p><br />
<span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;by </span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;张涛<br />
&nbsp;&nbsp;&nbsp; zht_dream@hotmail.com</span></span></span></p>
<p><span style="color: #008000"><span style="font-family: 宋体"><span style="font-size: 10pt">&nbsp;</span></span></span></p>
<img src ="http://www.blogjava.net/Swing/aggbug/312114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Swing/" target="_blank">zht</a> 2010-02-05 15:16 <a href="http://www.blogjava.net/Swing/archive/2010/02/05/312114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>服务极差的china-pub</title><link>http://www.blogjava.net/killme2008/archive/2010/02/05/312052.html</link><dc:creator>dennis</dc:creator><author>dennis</author><pubDate>Fri, 05 Feb 2010 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/killme2008/archive/2010/02/05/312052.html</guid><wfw:comment>http://www.blogjava.net/killme2008/comments/312052.html</wfw:comment><comments>http://www.blogjava.net/killme2008/archive/2010/02/05/312052.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.blogjava.net/killme2008/comments/commentRss/312052.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/killme2008/services/trackbacks/312052.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 经常在china-pub上买书，我的账号早已经到五星，再加上china-pub上很多新书首发，因此尽管当当网有时候更便宜，还是经常在china-pub买。不过这次我要出离愤怒了，同样是上个月29号下的单，当当在周一就送到了，而china-pub到今天5号竟然还没有送到，看订单信息是货已出库，并且发货时间在1月31号，从北京到杭州走了5天竟然还没到，选的什么快递公司。<br />
&nbsp;&nbsp;&nbsp; 不到也还罢了，更可恶的是售后服务，我在china-pub的客服论坛发帖，他们自己承诺工作时间内60分钟回复，回复个P啊，从昨天到今天没见一个人点击我的帖子，更何谈回复。OK，论坛不行，那么我发邮件吧，从china-pub的<a href="http://www.china-pub.com/temporary/faq/2007FAQ/liaojie.asp?yoururlname=lianxi_1.htm">客服服务</a>页的客服email进去，填写表单，OK，提交失败？为什么，没有验证码，可是你TMD根本没显示验证码啊,这是什么狗屁程序，见下图<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/killme2008/cs.png" width="568" height="416" /><br />
<br />
&nbsp;你看到验证码在哪里吗？刷新N遍愣是没出来，多牛B的客服email啊。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 线上不行，那么我打电话可以吧，这电话是普通长途也还罢了，我自己掏钱没事，可总得有人接吧，事实是我早上打了3个电话，两个查询订单，等了N久没人接，靠，那我投诉吧，转投诉，一样没人接，我只能说china-pub你们真牛气，你们的客服是摆设不成？你们这么牛气，我也不敢买了，惹不起我还躲不起啊。<br />
<br />
<br />
<br />
<br /><img src ="http://www.blogjava.net/killme2008/aggbug/312052.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/killme2008/" target="_blank">dennis</a> 2010-02-05 09:53 <a href="http://www.blogjava.net/killme2008/archive/2010/02/05/312052.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tapestry最新版5.1.0.5教程（九）：权限控制框架的实现-进阶篇</title><link>http://www.blogjava.net/usherlight/archive/2010/02/04/312016.html</link><dc:creator>云自无心水自闲</dc:creator><author>云自无心水自闲</author><pubDate>Thu, 04 Feb 2010 11:17:00 GMT</pubDate><guid>http://www.blogjava.net/usherlight/archive/2010/02/04/312016.html</guid><wfw:comment>http://www.blogjava.net/usherlight/comments/312016.html</wfw:comment><comments>http://www.blogjava.net/usherlight/archive/2010/02/04/312016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/usherlight/comments/commentRss/312016.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/usherlight/services/trackbacks/312016.html</trackback:ping><description><![CDATA[<p>在上一篇中我们研究了如何实现SpringSecurity中Jsp Tag的&lt;security:authorize ifAllGranted="ROLE_SUPERVISOR"&gt;的功能。这一次我们一起研究一下如何实现在Tapestry5.1中添加一个Filter来对所有的操作进行权限的过滤控制。<br />
在SpringSecurity中，我们一般是在application-context.xml中，添加一个SpringSecurity的Filter，然后在另外一个xml中详细配置如何根据Url的规则进行权限的控制。而Tapestry的哲学是尽量减少Xml中的配置（其IOC容器也基本上是借鉴Guice而不Spring的），所以我们也是在代码中实现权限规则的控制。<br />
总体上来看，可以用两种方式来实现url规则，一种是Request级别的Filter，一种是页面组件级别的Filter，如果是Request级别的话，可以从Request对象中获取Url路径，这样就与SpringSecurity基本一样了。本文主要介绍页面组件级别的Filter，从中我们也可以体会到Tapestry5.1中的IOC容器的强大和便利。</p>
<p>这就是Filter的代码，这个Filter必须实现ComponentRequestFilter接口。值得注意的是其构造函数所需要用到的4个参数，这4个参数都是Tapestry5本身自有的服务，所以我们什么也不用做，Tapestry5自动会将服务的实例注入进来，这就是Tapestry-IOC的威力。<br />
ComponentRequestFilter接口一共有4个方法需要实现，具体代码如下：</p>
<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: #008080">&nbsp;1</span>&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;RequiresLoginFilter&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;ComponentRequestFilter&nbsp;{<br />
</span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;PageRenderLinkSource&nbsp;renderLinkSource;<br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;ComponentSource&nbsp;componentSource;<br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;Response&nbsp;response;<br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;ApplicationStateManager&nbsp;appStateManager;<br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;RequiresLoginFilter(PageRenderLinkSource&nbsp;renderLinkSource,<br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComponentSource&nbsp;componentSource,&nbsp;Response&nbsp;response,<br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationStateManager&nbsp;appStateManager<br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;{<br />
</span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.renderLinkSource&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;renderLinkSource;<br />
</span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.componentSource&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;componentSource;<br />
</span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.response&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;response;<br />
</span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.appStateManager&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;appStateManager;<br />
</span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;handleComponentEvent(<br />
</span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComponentEventRequestParameters&nbsp;parameters,<br />
</span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComponentRequestHandler&nbsp;handler)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException&nbsp;{<br />
</span><span style="color: #008080">24</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">25</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dispatchedToLoginPage(parameters.getActivePageName()))&nbsp;{<br />
</span><span style="color: #008080">26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />
</span><span style="color: #008080">27</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">28</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler.handleComponentEvent(parameters);<br />
</span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">31</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">32</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">33</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;handlePageRender(PageRenderRequestParameters&nbsp;parameters,<br />
</span><span style="color: #008080">34</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComponentRequestHandler&nbsp;handler)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;IOException&nbsp;{<br />
</span><span style="color: #008080">35</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dispatchedToLoginPage(parameters.getLogicalPageName()))&nbsp;{<br />
</span><span style="color: #008080">36</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />
</span><span style="color: #008080">37</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">38</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler.handlePageRender(parameters);<br />
</span><span style="color: #008080">39</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">40</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">41</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">42</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;dispatchedToLoginPage(String&nbsp;pageName)&nbsp;{<br />
</span><span style="color: #008080">43</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Component&nbsp;page&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;componentSource.getPage(pageName);<br />
</span><span style="color: #008080">44</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">45</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(page.getClass().isAnnotationPresent(RequiresLogin.</span><span style="color: #0000ff">class</span><span style="color: #000000">))&nbsp;{<br />
</span><span style="color: #008080">46</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">&nbsp;appStateManager.exists(Authentication.</span><span style="color: #0000ff">class</span><span style="color: #000000">))&nbsp;{<br />
</span><span style="color: #008080">47</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redirect();<br />
</span><span style="color: #008080">48</span>&nbsp;<span style="color: #000000">&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 />
</span><span style="color: #008080">49</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">50</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Authentication&nbsp;auth&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;appStateManager.get(Authentication.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
</span><span style="color: #008080">51</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;auth&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;)&nbsp;{<br />
</span><span style="color: #008080">52</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redirect();<br />
</span><span style="color: #008080">53</span>&nbsp;<span style="color: #000000">&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 />
</span><span style="color: #008080">54</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">55</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">56</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">&nbsp;auth.isLoggedIn())&nbsp;{<br />
</span><span style="color: #008080">57</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redirect();<br />
</span><span style="color: #008080">58</span>&nbsp;<span style="color: #000000">&nbsp;&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 />
</span><span style="color: #008080">59</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">60</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">61</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequiresLogin&nbsp;requireLogin&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;page.getClass().getAnnotation(<br />
</span><span style="color: #008080">62</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RequiresLogin.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
</span><span style="color: #008080">63</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ifNotGranted&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;requireLogin.ifNotGranted();<br />
</span><span style="color: #008080">64</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ifAllGranted&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;requireLogin.ifAllGranted();<br />
</span><span style="color: #008080">65</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ifAnyGranted&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;requireLogin.ifAnyGranted();<br />
</span><span style="color: #008080">66</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;permitted&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;auth.checkPermission(ifNotGranted,&nbsp;ifAllGranted,&nbsp;ifAnyGranted);<br />
</span><span style="color: #008080">67</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;</span><span style="color: #000000">!</span><span style="color: #000000">&nbsp;permitted&nbsp;)&nbsp;{<br />
</span><span style="color: #008080">68</span>&nbsp;<span style="color: #000000">&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 />
</span><span style="color: #008080">69</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">70</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">71</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">72</span>&nbsp;<span style="color: #000000">&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 />
</span><span style="color: #008080">73</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">74</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">75</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;redirect()&nbsp;{<br />
</span><span style="color: #008080">76</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Link&nbsp;link&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;renderLinkSource.createPageRenderLink(</span><span style="color: #000000">"</span><span style="color: #000000">Logout</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">77</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">78</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
</span><span style="color: #008080">79</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.sendRedirect(link);<br />
</span><span style="color: #008080">80</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080">81</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">82</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">83</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">84</span>&nbsp;<span style="color: #000000">}</span></div>
<br />
<p>在ComponentRequestFilter中，我们无法使用@SessionState注解来直接注入Session中的变量，但是我们可以通过ApplicationStateManager来取得。</p>
<p>现在我们需要把刚定义的Filter注册到系统中，很简单，只要在AppModule中添加以下函数就行了：</p>
<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: #008080">1</span>&nbsp;<span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;contributeComponentRequestHandler(<br />
</span><span style="color: #008080">2</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OrderedConfiguration</span><span style="color: #000000">&lt;</span><span style="color: #000000">ComponentRequestFilter</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;configuration)&nbsp;{<br />
</span><span style="color: #008080">3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;configuration.addInstance(</span><span style="color: #000000">"</span><span style="color: #000000">RequiresLogin</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;RequiresLoginFilter.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
</span><span style="color: #008080">4</span>&nbsp;<span style="color: #000000">}<br />
</span><span style="color: #008080">5</span>&nbsp;</div>
从本例子中我们可以看到Tapesty Ioc容器使用的便利性，也认识到了Ioc容器在Tapestry体系中的重要性<img src ="http://www.blogjava.net/usherlight/aggbug/312016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/usherlight/" target="_blank">云自无心水自闲</a> 2010-02-04 19:17 <a href="http://www.blogjava.net/usherlight/archive/2010/02/04/312016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>新工具: 能够将google code的wiki下载为离线html</title><link>http://www.blogjava.net/badqiu/archive/2010/02/04/311968.html</link><dc:creator>badqiu</dc:creator><author>badqiu</author><pubDate>Thu, 04 Feb 2010 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/badqiu/archive/2010/02/04/311968.html</guid><wfw:comment>http://www.blogjava.net/badqiu/comments/311968.html</wfw:comment><comments>http://www.blogjava.net/badqiu/archive/2010/02/04/311968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/badqiu/comments/commentRss/311968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/badqiu/services/trackbacks/311968.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在google code上编写wiki文档你最担心的是什么：<br><br>1. 版本不好控制，在线同时只能浏览一个版本号的wiki页面<br><br>2. 不能提供离线版本<br><br> <br><br>现在使用这个工具，可以将google wiki直接下载为本地的html ，并且与wiki相关的资源，如 css ,js ,图片都可以一同下载 并且与在线浏览的效果一样 .<br>还提供与ant的集成,直接与构建脚本相结合.<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/badqiu/archive/2010/02/04/311968.html'>阅读全文</a><img src ="http://www.blogjava.net/badqiu/aggbug/311968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/badqiu/" target="_blank">badqiu</a> 2010-02-04 15:18 <a href="http://www.blogjava.net/badqiu/archive/2010/02/04/311968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 升级到9.10 后出现的问题</title><link>http://www.blogjava.net/zzywq/archive/2010/02/04/311922.html</link><dc:creator>袁伟强</dc:creator><author>袁伟强</author><pubDate>Thu, 04 Feb 2010 04:28:00 GMT</pubDate><guid>http://www.blogjava.net/zzywq/archive/2010/02/04/311922.html</guid><wfw:comment>http://www.blogjava.net/zzywq/comments/311922.html</wfw:comment><comments>http://www.blogjava.net/zzywq/archive/2010/02/04/311922.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/zzywq/comments/commentRss/311922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zzywq/services/trackbacks/311922.html</trackback:ping><description><![CDATA[这几天没事干 把Ubuntu 升级至9.10 后，发现在启动列表里面Vista 跟XP 的系统都没有了
<div>于是 按照以前的经验去修改/etc/boot/menu.lst文件 发现根本就没有这个文件了</div>
<div>后来才发现9.10 启动机制都改了 ，只需输入命令：sudo update-grub 系统则会自动检测到所有的安装的系统</div>
<div>解决了这个问题后 ，又发现一个问题，QQ 根本没法用，一登录，才聊2句就自动退出了，要是发送图片的话那是直接退出</div>
<div>在QQ启动命令上加入此变量：<br />
<span style="border-collapse: collapse; color: #333333; font-family: Arial; line-height: 27px; font-size: large; ">export GDK_NATIVE_WINDOWS=true</span></div>
<div><font color="#333333" face="Arial"><span style="border-collapse: collapse; line-height: 27px; font-size: large;">还有Eclipse无法新建项目 ，起原因也是这个</span></font></div>
<div><font color="#333333" face="Arial"><span style="border-collapse: collapse; line-height: 27px; font-size: large;">新建一个启动项 加入命令：sh -c "export GDK_NATIVE_WINDOWS=true;/usr/share/eclipe/eclipse"</span></font></div>
<div><font color="#333333" face="Arial"><span style="border-collapse: collapse; line-height: 27px; font-size: large;">还有一个办法：</span></font></div>
<div><font color="#333333" face="Arial"><span style="border-collapse: collapse; line-height: 27px; font-size: large;">加入到系统全局变量中</span></font></div>
<div><font color="#333333" face="Arial"><span style="border-collapse: collapse; line-height: 27px; font-size: large;">sudo gedit /etc/profile 加入export GDK_NATIVE_WINDOWS=true</span></font></div>
<div><font color="#333333" face="Arial"><span style="border-collapse: collapse; line-height: 27px; font-size: large;"><br />
</span></font></div>
 <img src ="http://www.blogjava.net/zzywq/aggbug/311922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zzywq/" target="_blank">袁伟强</a> 2010-02-04 12:28 <a href="http://www.blogjava.net/zzywq/archive/2010/02/04/311922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>因连接关闭引起的Blob操作异常</title><link>http://www.blogjava.net/zhyiwww/archive/2010/02/04/311893.html</link><dc:creator>zhyiwww</dc:creator><author>zhyiwww</author><pubDate>Thu, 04 Feb 2010 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/zhyiwww/archive/2010/02/04/311893.html</guid><wfw:comment>http://www.blogjava.net/zhyiwww/comments/311893.html</wfw:comment><comments>http://www.blogjava.net/zhyiwww/archive/2010/02/04/311893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhyiwww/comments/commentRss/311893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhyiwww/services/trackbacks/311893.html</trackback:ping><description><![CDATA[<br />
<br />
我在处理结果集的时候，做了一个处理，把记录都处理成了Map的对象，而把结果集处理成了一个List对象。<br />
如下：<br />
public List&lt;Map&lt;String, Object&gt;&gt; toList() throws SQLException {<br />
<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; List&lt;Map&lt;String,Object&gt;&gt; recordsList = new ArrayList&lt;Map&lt;String, Object&gt;&gt;();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ResultSetMetaData meta = rst.getMetaData();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; int colCnt = meta.getColumnCount();<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while(rst.next()){<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; Map&lt;String,Object&gt; record = new HashMap&lt;String, Object&gt;();<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; for(int i=0;i&lt;colCnt;i++){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String colName = meta.getColumnName(i+1);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Object colValue = rst.getObject(colName);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; log.debug(colValue);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(colValue instanceof Blob){<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; log.debug("blob type");<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; record.put(colName, colValue);<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <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; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; recordsList.add(record);<br />
&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; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return recordsList;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
<br />
之后，就关闭了resultset ,statement ,connection。然而在我从map对象里面取得blob对象时，总是报SQLException异常。经过调试，发现在blob.getBinaryStream()时发生异常。<br />
<br />
无奈之下做了一个试验。<br />
<br />
PreparedStatement stmt = null;<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ResultSet rst = null;<br />
//<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; stmt = this.con<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; .prepareStatement("SELECT * FROM CCX_INFO_ARTICAL WHERE ARTICAL_ID=?");<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; stmt.setLong(1, articalId);<br />
//<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rst = stmt.executeQuery();<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(rst.next()){<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Blob b = rst.getBlob("ARTICAL_CONTENT");<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; log.debug(b);<br />
////&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; InputStream in = b.getBinaryStream();<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; <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; <br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; log.debug(in);<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
//<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (SQLException e) {<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw e;<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } finally {<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rst.close();<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (stmt != null) {<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; stmt.close();<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (this.con != null &amp;&amp; this.con.getAutoCommit()) {<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.con.close();<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
//&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
//<br />
<br />
此段代码可以顺利的无异常的执行。由此我推测认为，主要是因为 resultset ,connection关闭引起的。这说明，在执行了查询操作之后，<br />
我们虽然可以得到一个blob对象，但是实际的内容并没有读如内存，也就是说，并没有读如到blob对象中，而此blob对象也就相当于一个对数据库中blob字段操作的一个引用，所以，此时，如果想从blob字段中读取数据，还是需要数据库连接的。<br />
<br />
而上面的封装操作之后，数据库连接已经中断，所以，再读取数据时，就发生了异常。<br />
<br />
<br />
下面是Blob接口的说明，也许能给我们更好的解释.<br />
<br />
<br />
<dl><dt>
<pre>public interface <strong>Blob</strong></pre>
</dt></dl>
<p>
SQL <code>BLOB</code> 值在 Java<sup><font size="-2">TM</font></sup> 编程语言中的表示形式（映射关系）。SQL <code>BLOB</code> 是内置类型，它将 Binary Large Object 存储为数据库表的某一行中的一个列值。默认情况下，驱动程序使用 SQL <code>locator(BLOB)</code> 实现 <code>Blob</code>，这意味着 <code>Blob</code> 对象包含一个指向 SQL <code>BLOB</code> 数据而不是数据本身的逻辑指针。<code>Blob</code> 对象在它被创建的事务处理期间有效。
</p>
<p>接口 <a href="http://man.ddvip.com/program/java_api_zh/java/sql/ResultSet.html" title="java.sql 中的接口"><code>ResultSet</code></a>、<a href="http://man.ddvip.com/program/java_api_zh/java/sql/CallableStatement.html" title="java.sql 中的接口"><code>CallableStatement</code></a> 和 <a href="http://man.ddvip.com/program/java_api_zh/java/sql/PreparedStatement.html" title="java.sql 中的接口"><code>PreparedStatement</code></a> 中的方法（如 <code>getBlob</code> 和 <code>setBlob</code>）允许编程人员访问 SQL <code>BLOB</code> 值。<code>Blob</code> 接口提供某些方法来获得 SQL <code>BLOB</code> (Binary Large Object) 值的长度、在客户端实现 <code>BLOB</code> 值以及确定 <code>BLOB</code> 值中某一字节样本的位置。此外，此接口还拥有更新 <code>BLOB</code> 值的方法。
</p>
<br />
<br />
<br />
<img src ="http://www.blogjava.net/zhyiwww/aggbug/311893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhyiwww/" target="_blank">zhyiwww</a> 2010-02-04 10:30 <a href="http://www.blogjava.net/zhyiwww/archive/2010/02/04/311893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在JavaMail的基础上构建自己的Email Channel(2):封装Javamail的原因</title><link>http://www.blogjava.net/ldd600/archive/2010/02/04/311869.html</link><dc:creator>叱咤红人</dc:creator><author>叱咤红人</author><pubDate>Wed, 03 Feb 2010 23:25:00 GMT</pubDate><guid>http://www.blogjava.net/ldd600/archive/2010/02/04/311869.html</guid><wfw:comment>http://www.blogjava.net/ldd600/comments/311869.html</wfw:comment><comments>http://www.blogjava.net/ldd600/archive/2010/02/04/311869.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ldd600/comments/commentRss/311869.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ldd600/services/trackbacks/311869.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: javamail已经设计的很好了，精巧强悍，为什么还需要封装它呢？&nbsp;&nbsp;<a href='http://www.blogjava.net/ldd600/archive/2010/02/04/311869.html'>阅读全文</a><img src ="http://www.blogjava.net/ldd600/aggbug/311869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ldd600/" target="_blank">叱咤红人</a> 2010-02-04 07:25 <a href="http://www.blogjava.net/ldd600/archive/2010/02/04/311869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2010-02-03传智播客&amp;mdash;&amp;mdash;教育办公系统 (五)</title><link>http://www.blogjava.net/changcheng/archive/2010/02/03/311856.html</link><dc:creator>長城</dc:creator><author>長城</author><pubDate>Wed, 03 Feb 2010 15:52:00 GMT</pubDate><guid>http://www.blogjava.net/changcheng/archive/2010/02/03/311856.html</guid><wfw:comment>http://www.blogjava.net/changcheng/comments/311856.html</wfw:comment><comments>http://www.blogjava.net/changcheng/archive/2010/02/03/311856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/changcheng/comments/commentRss/311856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/changcheng/services/trackbacks/311856.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有没有发现一个问题，我们之前做的所有练习，都没的权限管理这个模块。我们的WEB应用中的同一个帐户可以在多台机器上同时登陆，每一个用户可以操作所有功能模块。这样在以后的应用开发中是结对不可行的！&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/changcheng/archive/2010/02/03/311856.html'>阅读全文</a><img src ="http://www.blogjava.net/changcheng/aggbug/311856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/changcheng/" target="_blank">長城</a> 2010-02-03 23:52 <a href="http://www.blogjava.net/changcheng/archive/2010/02/03/311856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2010年读书计划</title><link>http://www.blogjava.net/robbie/archive/2010/02/03/311854.html</link><dc:creator>The Matrix</dc:creator><author>The Matrix</author><pubDate>Wed, 03 Feb 2010 15:27:00 GMT</pubDate><guid>http://www.blogjava.net/robbie/archive/2010/02/03/311854.html</guid><wfw:comment>http://www.blogjava.net/robbie/comments/311854.html</wfw:comment><comments>http://www.blogjava.net/robbie/archive/2010/02/03/311854.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/robbie/comments/commentRss/311854.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/robbie/services/trackbacks/311854.html</trackback:ping><description><![CDATA[<p>2010年已经过去一个月了，赶在农历春节前列一下今年的读书清单，不能总把精力放在工作中了，也需要补充点新知识了，否则没有新东西能贡献出来了。</p>
<p>1、《OSGI原理与最佳实践》，结合这本书并研究SpringDM，做一些实例。</p>
<p>2、《SQL语言艺术》</p>
<p>3、《Oracle9i&amp;10g编程艺术》</p>
<p>4、《架构之美》</p>
<p>5、《UML和模式应用》</p>
<p>6、《UML彩色建模》</p>
<p>7、《领域驱动设计与模式实战》</p>
<p>8、《敏捷软件开发 原则、模式与实践》</p>
<p>9、《软件开发的边界》</p>
<p>10、《软件随想录》</p>
<p>11、《走出软件作坊》</p>
<p>就这么多了，9、10、11去年都看过一遍了，但好多地方粗粗过了一下，还要仔细阅读。</p>
<p>另外也对自己提个要求，看书要做读书笔记。</p>
<p>2010年-我的读书年！</p>
<img src ="http://www.blogjava.net/robbie/aggbug/311854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/robbie/" target="_blank">The Matrix</a> 2010-02-03 23:27 <a href="http://www.blogjava.net/robbie/archive/2010/02/03/311854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android的Intent和IntentFilter应用说明一例</title><link>http://www.blogjava.net/TiGERTiAN/archive/2010/02/03/311827.html</link><dc:creator>TiGERTiAN</dc:creator><author>TiGERTiAN</author><pubDate>Wed, 03 Feb 2010 10:01:00 GMT</pubDate><guid>http://www.blogjava.net/TiGERTiAN/archive/2010/02/03/311827.html</guid><wfw:comment>http://www.blogjava.net/TiGERTiAN/comments/311827.html</wfw:comment><comments>http://www.blogjava.net/TiGERTiAN/archive/2010/02/03/311827.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/TiGERTiAN/comments/commentRss/311827.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/TiGERTiAN/services/trackbacks/311827.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 很多人对文档中的Intent和IntentFilter不理解是什么意思，我这里举例解释下。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/TiGERTiAN/archive/2010/02/03/311827.html'>阅读全文</a><img src ="http://www.blogjava.net/TiGERTiAN/aggbug/311827.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/TiGERTiAN/" target="_blank">TiGERTiAN</a> 2010-02-03 18:01 <a href="http://www.blogjava.net/TiGERTiAN/archive/2010/02/03/311827.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java模块化，OSGi，以及Azure云计算</title><link>http://www.blogjava.net/zhaobin/archive/2010/02/03/311787.html</link><dc:creator>赵斌</dc:creator><author>赵斌</author><pubDate>Wed, 03 Feb 2010 04:12:00 GMT</pubDate><guid>http://www.blogjava.net/zhaobin/archive/2010/02/03/311787.html</guid><wfw:comment>http://www.blogjava.net/zhaobin/comments/311787.html</wfw:comment><comments>http://www.blogjava.net/zhaobin/archive/2010/02/03/311787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaobin/comments/commentRss/311787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaobin/services/trackbacks/311787.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 关于Java 7模块系统<br>模块化Java简介，模块化Java：静态模块化，模块化Java：动态模块化，Bundle.update：模块化的一年<br>Azure于今日正式商用收费<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/zhaobin/archive/2010/02/03/311787.html'>阅读全文</a><img src ="http://www.blogjava.net/zhaobin/aggbug/311787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaobin/" target="_blank">赵斌</a> 2010-02-03 12:12 <a href="http://www.blogjava.net/zhaobin/archive/2010/02/03/311787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>