﻿<?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-Phrancol's blog</title><link>http://www.blogjava.net/Phrancol/</link><description>To be surprised,to wonder,is to begin to understand.</description><language>zh-cn</language><lastBuildDate>Wed, 29 Apr 2026 19:26:02 GMT</lastBuildDate><pubDate>Wed, 29 Apr 2026 19:26:02 GMT</pubDate><ttl>60</ttl><item><title>IPad塔防游戏上线——塔防之魔法传奇</title><link>http://www.blogjava.net/Phrancol/articles/365136.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Tue, 29 Nov 2011 11:05:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/365136.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/365136.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/365136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/365136.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/365136.html</trackback:ping><description><![CDATA[<br />2011年7月份接触IOS，连看3本ios教程<br />2011年9月开始开发这个塔防游戏，Cocos2D+用TexturePacker整合的无数图片(Packed by TexturePacker)<br />2011年11月完成开发，提交app，经过半个月申请账号，提交审核等过程，首个ios游戏上线<br /><br />2012年1月1日， 它将成为一个开源项目<br />This is going to be an open source project from Jan 01, 2011. <br /><br />感谢TexturePacker的作者提供的免费License<br />关于TexturePacker，它是一个非常好用，质量很好的的图片整合工具<br />它将多个图片整合成一张大图，减少图片加载次数，减少内存使用，就我目前的了解，它能用于ios, android, web应用的开发，它支持很多输出格式<br />http://www.texturepacker.com/<br /><br />iTunes查看： <br /><div><a href="http://itunes.apple.com/us/app/towerrush/id481271657?l=zh&amp;ls=1&amp;mt=8">http://itunes.apple.com/us/app/towerrush/id481271657?l=zh&amp;ls=1&amp;mt=8</a></div><br /><br />进入游戏界面<br /><br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/mzl.hlraeamb.png" width="1024" height="768" /><br /><br /><br />加载游戏界面<br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/mzl.rxgxvmlv.png" width="1024" height="768" /><br /><br /><br />游戏界面<br /><br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/mzl.vurrikez.png" width="1024" height="768" /><img src ="http://www.blogjava.net/Phrancol/aggbug/365136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2011-11-29 19:05 <a href="http://www.blogjava.net/Phrancol/articles/365136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精武馆开发日志</title><link>http://www.blogjava.net/Phrancol/articles/301898.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Tue, 10 Nov 2009 14:24:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/301898.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/301898.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/301898.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/301898.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/301898.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 20100819完成以精武馆平台为中心的跨域登录模块。精武馆围棋谱页面重新设计20100810一个重要的计划正在实施！精武馆第一个生产版本，与2010-08-08上线20100808围棋打谱加入声音修复围棋几个bug20100807围棋模块新增功能：1. 进入点目模式后，启动Timer，2分钟后自动完成点目，每30秒提醒一次2. 完成...&nbsp;&nbsp;<a href='http://www.blogjava.net/Phrancol/articles/301898.html'>阅读全文</a><img src ="http://www.blogjava.net/Phrancol/aggbug/301898.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2009-11-10 22:24 <a href="http://www.blogjava.net/Phrancol/articles/301898.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精武馆——在线棋牌游戏平台</title><link>http://www.blogjava.net/Phrancol/articles/301787.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Tue, 10 Nov 2009 02:58:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/301787.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/301787.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/301787.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/301787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/301787.html</trackback:ping><description><![CDATA[<br />
<br />
精武馆——在线棋牌游戏平台，不用下载客户端，打开网页就能玩棋牌类休闲游戏。<br />
<br />
为什么叫精武馆：在我的老家，大家饭后打牌玩麻将的地方就叫精武馆。<br />
<br />
它的架构与基于客户端的游戏平台差不多，以游戏模块或房间为单位的分布式集群........（省略）。<br />
技术上使用了常见的jquery, spring,hibernate, tapestry等，客户端之间通信使用的是cometd (<a href="http://www.cometd.org">http://www.cometd.org</a>)。<br />
Server使用的nginx+jetty7，cookie保持登录状态，memcached同步用户数据。<br />
<br />
<br />
<br />
当前版本：开发预览版<br />
<br />
<a href="http://dev.jingwuguan.com">http://dev.jingwuguan.com</a>&nbsp;&nbsp; <br />
<br />
已通过测试兼容的浏览器：IE8, IE7, IE6, Firefox, Chrome, Maxthon, Opera<br />
<br />
<br />
围棋游戏大厅：<br />
<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/精武馆准备开张了/hall.png" width="1276" height="626" /><br />
<br />
围棋：<br />
<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/精武馆准备开张了/weiqi.png" width="994" height="617" /> 
<img src ="http://www.blogjava.net/Phrancol/aggbug/301787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2009-11-10 10:58 <a href="http://www.blogjava.net/Phrancol/articles/301787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在线游戏平台设计思路</title><link>http://www.blogjava.net/Phrancol/articles/288804.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sat, 01 Aug 2009 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/288804.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/288804.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/288804.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/288804.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/288804.html</trackback:ping><description><![CDATA[<p>在线游戏平台，通过浏览器直接玩大型3D游戏，无需安装任何客户端。<br />
它的原理是，将游戏的运行计算放到服务器端，获得游戏的媒体流，通过流媒体以电影的形式在客户端播放，客户端将用户的控制指令发送到服务器端，由服务器计算执行。<br />
<br />
它最终将成为一个开放式多媒体互动平台，包括SNS，电子竞技互动，视频互动等。<br />
<br />
google全球有超过20W台server，参照google的server配置，如果我们以10台server为单位，组建无盘工作站集群，我们一台server的成本最多是他们的一半<br />
<br />
目前全球可搜索到的有2家公司在做这个在线游戏平台，他们已经差不多做好了，处在内部测试阶段，并有视频，根据他们的测试结果，只需要1.5m的带宽，就可以很流畅的玩普通画质游戏，高清画质也只需要4-5m的带宽，而未来5年，国内将普及光纤入户。<br />
<br />
在线应用平台包含3个部分：</p>
<ol>
    <li>客户端浏览器
    <li>web服务器
    <li>应用平台服务器 </li>
</ol>
<p><strong>客户端浏览器<br />
</strong><br />
基于浏览器的应用客户端，也是媒体流接收端，用于向服务器发送应用请求，获得媒体流请求ID，向媒体服务器发送请求，获得相应的媒体流。<br />
<br />
<strong>WEB服务器</strong><br />
<br />
将客户端对应用的请求转发至应用平台服务器，获得媒体流ID，发送给客户端，并用session控制其声明周期<br />
<br />
<strong>应用平台服务器</strong><br />
<br />
应用平台服务器是一个服务器群，包含三个部分：控制器群组，应用服务器群组，媒体流服务器群组，以一个游戏服务平台为例子：<br />
<br />
<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/OnlineApplicationPlatform/AppServerCloud.gif" /><br />
<br />
<br />
<strong>控制器服务器群组</strong><br />
<br />
接收游戏实例的请求，对游戏实例和流媒体的生命周期进行管理。<br />
<br />
<strong>游戏服务器群组</strong><br />
<br />
提供游戏实例<br />
<br />
<strong>媒体流服务器群组<br />
</strong><br />
响应客户端的媒体流请求</p>
<p><br />
以魔兽世界为例，流程图如下：<br />
</p>
<p><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/phrancol/OnlineApplicationPlatform/OnlineApplicationPlatformProcess.gif" width="768" height="371" /></p>
<ol>
    <li>浏览器向网站服务器发送要玩魔兽世界的请求，网站服务器生成session，并做一些必要的记录；
    <li>网站服务器向游戏控制器发送魔兽世界的请求
    <li>游戏控制器从媒体流服务器群组中找到最合适的服务资源，生成一个唯一媒体流请求ID，并将这个ID与魔兽世界绑定
    <li>游戏控制器将ID返回给网站服务器
    <li>客户端从网站服务器得到媒体流请求ID
    <li>客户端跳转到视频播放页面，将媒体流请求ID发送至媒体流服务器
    <li>媒体流服务器接收到请求ID后，将该ID发送给游戏控制器
    <li>游戏控制器根据请求ID，在游戏服务器群组中找到最合适的计算资源，并创建魔兽世界实例
    <li>游戏服务器将游戏实例产生的媒体流直接从显卡获得并发送给媒体流服务器
    <li>客户端获得媒体流服务器发来的媒体数据<br />
    </li>
</ol>
<p><strong>&nbsp;第一阶段测试计划<br />
</strong><br />
游戏服务器端测试方案：<br />
<br />
1，运行一个很小的游戏，将它的视频和音频写成文件，保证它可以播放<br />
2，将视频和音频以流的形式发送给媒体server，通过网页以电影的形式播放<br />
3，在浏览器端加入控制功能，最后实现通过网页玩那个小游戏</p>
<br />
媒体服务器端测试方案：<br />
<br />
1，搭建媒体服务器，创建媒体播放页面<br />
2，将一个媒体文件放入指定目录，并可以播放它<br />
3，写一段测试代码，将媒体文件以流的形式读取，并写入到媒体服务器中，使它能够被播放 <br />
<br />
本阶段为技术测试阶段，为整个项目打开一个入口点<br />
        <img src ="http://www.blogjava.net/Phrancol/aggbug/288804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2009-08-01 16:59 <a href="http://www.blogjava.net/Phrancol/articles/288804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat一个关于JspLoader的小问题</title><link>http://www.blogjava.net/Phrancol/articles/285561.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sun, 05 Jul 2009 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/285561.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/285561.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/285561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/285561.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/285561.html</trackback:ping><description><![CDATA[<br />
现象：<br />
<br />
启动Tomcat<br />
删除 CATALINA_HOME/work/ 目录下的Catalina目录<br />
访问任何一个jsp文件，将发生错误<br />
<br />
<pre>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #000000">org.apache.jasper.JasperException:&nbsp;org.apache.jasper.JasperException:&nbsp;Unable&nbsp;to&nbsp;load&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;JSP<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:</span><span style="color: #000000">156</span><span style="color: #000000">)<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:</span><span style="color: #000000">329</span><span style="color: #000000">)<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:</span><span style="color: #000000">342</span><span style="color: #000000">)<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;org.apache.jasper.servlet.JspServlet.service(JspServlet.java:</span><span style="color: #000000">267</span><span style="color: #000000">)<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;javax.servlet.http.HttpServlet.service(HttpServlet.java:</span><span style="color: #000000">717</span><span style="color: #000000">)<br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
</pre>
<p>&nbsp;</p>
<p>原因：<br />
<br />
Tomcat对jsp的处理是由一个JspServlet来完成的，当tomcat启动时，会为每一个context创建jsp工作目录(work dir)，存放地为 CATALINA_HOME/work/Catalina/HOST_NAME/CONTEXT_NAME，context编译jsp所需要的参数也随之初始化，加载jsp class的base path也已经潜在初始化，是一个File对象，它将在随后URLClassLoader加载jsp class时作为一个resource url，下面是部分代码：<br />
<br />
org.apache.jasper.JspCompilationContext.java<br />
<br />
初始化 JspLoader<br />
</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 id="Codehighlighter1_34_320_Open_Image" onclick="this.style.display='none'; Codehighlighter1_34_320_Open_Text.style.display='none'; Codehighlighter1_34_320_Closed_Image.style.display='inline'; Codehighlighter1_34_320_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_34_320_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_34_320_Closed_Text.style.display='none'; Codehighlighter1_34_320_Open_Image.style.display='inline'; Codehighlighter1_34_320_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ClassLoader&nbsp;getJspLoader()&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_34_320_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_34_320_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_68_288_Open_Image" onclick="this.style.display='none'; Codehighlighter1_68_288_Open_Text.style.display='none'; Codehighlighter1_68_288_Closed_Image.style.display='inline'; Codehighlighter1_68_288_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_68_288_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_68_288_Closed_Text.style.display='none'; Codehighlighter1_68_288_Open_Image.style.display='inline'; Codehighlighter1_68_288_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(&nbsp;jspLoader&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;</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_68_288_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_68_288_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jspLoader&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JasperLoader<br />
<img id="Codehighlighter1_134_142_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_142_Open_Text.style.display='none'; Codehighlighter1_134_142_Closed_Image.style.display='inline'; Codehighlighter1_134_142_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_134_142_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_134_142_Closed_Text.style.display='none'; Codehighlighter1_134_142_Open_Image.style.display='inline'; Codehighlighter1_134_142_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;URL[]&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_134_142_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_134_142_Open_Text"><span style="color: #000000">{baseUrl}</span></span><span style="color: #000000">,<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getClassLoader(),<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rctxt.getPermissionCollection(),<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rctxt.getCodeSource());<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;jspLoader;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p><br />
其中baseUrl是这样得到的<br />
</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 id="Codehighlighter1_33_1010_Open_Image" onclick="this.style.display='none'; Codehighlighter1_33_1010_Open_Text.style.display='none'; Codehighlighter1_33_1010_Closed_Image.style.display='inline'; Codehighlighter1_33_1010_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_33_1010_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_33_1010_Closed_Text.style.display='none'; Codehighlighter1_33_1010_Open_Image.style.display='inline'; Codehighlighter1_33_1010_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif"  alt="" /><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;createOutputDir()&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_33_1010_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_33_1010_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;&nbsp;&nbsp;String&nbsp;path&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img id="Codehighlighter1_88_291_Open_Image" onclick="this.style.display='none'; Codehighlighter1_88_291_Open_Text.style.display='none'; Codehighlighter1_88_291_Closed_Image.style.display='inline'; Codehighlighter1_88_291_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_88_291_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_88_291_Closed_Text.style.display='none'; Codehighlighter1_88_291_Open_Image.style.display='inline'; Codehighlighter1_88_291_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(isTagFile())&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_88_291_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_88_291_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tagName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tagInfo.getTagClassName();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tagName.replace(</span><span style="color: #000000">'</span><span style="color: #000000">.</span><span style="color: #000000">'</span><span style="color: #000000">,&nbsp;File.separatorChar);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;path.substring(</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;path.lastIndexOf(File.separatorChar));<br />
<img id="Codehighlighter1_298_384_Open_Image" onclick="this.style.display='none'; Codehighlighter1_298_384_Open_Text.style.display='none'; Codehighlighter1_298_384_Closed_Image.style.display='inline'; Codehighlighter1_298_384_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_298_384_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_298_384_Closed_Text.style.display='none'; Codehighlighter1_298_384_Open_Image.style.display='inline'; Codehighlighter1_298_384_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">else</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_298_384_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_298_384_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getServletPackageName().replace(</span><span style="color: #000000">'</span><span style="color: #000000">.</span><span style="color: #000000">'</span><span style="color: #000000">,File.separatorChar);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Append&nbsp;servlet&nbsp;or&nbsp;tag&nbsp;handler&nbsp;path&nbsp;to&nbsp;scratch&nbsp;dir</span><span style="color: #008000"><br />
<img id="Codehighlighter1_468_856_Open_Image" onclick="this.style.display='none'; Codehighlighter1_468_856_Open_Text.style.display='none'; Codehighlighter1_468_856_Closed_Image.style.display='inline'; Codehighlighter1_468_856_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_468_856_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_468_856_Closed_Text.style.display='none'; Codehighlighter1_468_856_Open_Image.style.display='inline'; Codehighlighter1_468_856_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</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_468_856_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_468_856_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;base&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;options.getScratchDir();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baseUrl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;base.toURI().toURL();<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputDir&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;base.getAbsolutePath()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;File.separator&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;path&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File.separator;<br />
<img id="Codehighlighter1_723_842_Open_Image" onclick="this.style.display='none'; Codehighlighter1_723_842_Open_Text.style.display='none'; Codehighlighter1_723_842_Closed_Image.style.display='inline'; Codehighlighter1_723_842_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_723_842_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_723_842_Closed_Text.style.display='none'; Codehighlighter1_723_842_Open_Image.style.display='inline'; Codehighlighter1_723_842_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&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;(</span><span style="color: #000000">!</span><span style="color: #000000">makeOutputDir())&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_723_842_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_723_842_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IllegalStateException(Localizer.getMessage(</span><span style="color: #000000">"</span><span style="color: #000000">jsp.error.outputfolder</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img id="Codehighlighter1_890_1004_Open_Image" onclick="this.style.display='none'; Codehighlighter1_890_1004_Open_Text.style.display='none'; Codehighlighter1_890_1004_Closed_Image.style.display='inline'; Codehighlighter1_890_1004_Closed_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif"  alt="" /><img style="display: none" id="Codehighlighter1_890_1004_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_890_1004_Closed_Text.style.display='none'; Codehighlighter1_890_1004_Open_Image.style.display='inline'; Codehighlighter1_890_1004_Open_Text.style.display='inline';" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(MalformedURLException&nbsp;e)&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_890_1004_Closed_Text"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_890_1004_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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IllegalStateException(Localizer.getMessage(</span><span style="color: #000000">"</span><span style="color: #000000">jsp.error.outputfolder</span><span style="color: #000000">"</span><span style="color: #000000">),&nbsp;e);<br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
options.getScratchDir() 是在tomcat启动时初始化的，于是，启动tomcat后，删除work目录，访问jsp时，尽管work目录被重新创建并且jsp被成功编译，但是由于ClassLoader中原目录对象与当前目录对象不同，而无法加载到jsp的class<br />
<br />
<img src ="http://www.blogjava.net/Phrancol/aggbug/285561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2009-07-05 17:22 <a href="http://www.blogjava.net/Phrancol/articles/285561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>被动模式——Extwind发展之路</title><link>http://www.blogjava.net/Phrancol/articles/285180.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Thu, 02 Jul 2009 07:24:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/285180.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/285180.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/285180.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/285180.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/285180.html</trackback:ping><description><![CDATA[从Spring ioc中引申出的一句话是比较经典的：别来找我，在那等着，我会去找你。<br />
被动模式，与这个概念很相近：别把东西给我，告诉我在哪能取到它。<br />
<br />
被动模式可以理解为三种模式： 开发模式， 部署模式，云模式。<br />
<br />
<strong>一.&nbsp;&nbsp;开发模式<br />
</strong><br />
实际上在我们的代码开发中，就一直在使用这种开发模式，例如<br />
<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img id="Codehighlighter1_21_27_Open_Image" onclick="this.style.display='none'; Codehighlighter1_21_27_Open_Text.style.display='none'; Codehighlighter1_21_27_Closed_Image.style.display='inline'; Codehighlighter1_21_27_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_21_27_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_21_27_Closed_Text.style.display='none'; Codehighlighter1_21_27_Open_Image.style.display='inline'; Codehighlighter1_21_27_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;InterfaceA&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_21_27_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_21_27_Open_Text"><span style="color: #000000">{&nbsp;<img alt="" src="http://www.blogjava.net/Images/dot.gif" />&nbsp;}</span></span></div>
<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_13_53_Open_Image" onclick="this.style.display='none'; Codehighlighter1_13_53_Open_Text.style.display='none'; Codehighlighter1_13_53_Closed_Image.style.display='inline'; Codehighlighter1_13_53_Closed_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" /><img style="display: none" id="Codehighlighter1_13_53_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_13_53_Closed_Text.style.display='none'; Codehighlighter1_13_53_Open_Image.style.display='inline'; Codehighlighter1_13_53_Open_Text.style.display='inline';" alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ClassB&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_13_53_Closed_Text"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_13_53_Open_Text"><span style="color: #000000">{&nbsp;InterfaceA&nbsp;ref&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;createInterfaceA();&nbsp;&nbsp;}</span></span></div>
<br />
使用create方法，而不是直接new。也就是说告诉了ClassB，在create方法中获得InterfaceA.<br />
<br />
这是一个很简单的例子，受它直接影响的，是系统的扩展性。在一个可扩展（伸缩）的系统中，例如在Eclipse产品程序，或是基于可插拔模块的应用程序开发中，则是随处可见的被动应用模式，这样的系统，对于现有组成部分在开发过程中很容易解决，但是对于未知组成部分（扩展性），只能通过被动模式解决，例如Extwind，在基于osgi的web应用程序中，Dynamic IoC和Extension-Point所做的事。<br />
<br />
<strong>二.&nbsp;&nbsp;部署模式</strong><br />
<br />
目前web应用程序的部署，可以总结为这样一句话：需要部署的时候就来找我，别忘了把东西带上！<br />
这与现在的服务理念完全相悖，快递公司都有上门取货这项服务。<br />
如果以开发模式来看，这就属于&nbsp; Deploy deploy = new FixedDeploy() ，而不是getDeploy()。<br />
<br />
这是一种陈旧的部署模式，毫无扩展性和伸缩性，它让很多原本简单的事情变得很复杂，虽然这是一种部署模式，但是它将影响到后来的架构模式。<br />
<br />
Extwind的部署模式：需要部署的时候，给我个电话，告诉我东西在哪，我去取。<br />
这个&#8220;电话&#8221;就是一个部署描述符（Deploy Description），它描述了部署方式，应用程序或模块的存放地（Repository）等细节，Extwind通过这个描述符从指定的Repository中获取应用程序并部署。<br />
如果以面向对象来看它，可以将这个描述符理解为一个interface，它将影响到部署模式的扩展性和伸缩性。<br />
<br />
Extwind中的repository与maven中的repository很像，对于它的定义，主要有2个方面：<br />
1. 组件库，这可以通过maven来帮助完成<br />
2. 部署库，由应用程序生成的受支持的部署库，部署时，只需要将描述符指向该库或库中的某些组件。<br />
<br />
<br />
<strong>三. 云模式</strong><br />
<br />
用一个例子来理解云模式：<br />
新增一台386，可以为云增加1%的计算能力；<br />
新增一个集群环境，可以为云增加20%的计算能力；<br />
这里的计算能力就是一种资源，可以理解为服务能力。之前提到过，对于未知资源，只能通过被动模式来获取，Extwind将会通过云模式来提供可伸缩的服务环境。<br />
<br />
<br />
Extwind要做的事情只有一件：让原本简单的事情，不要太复杂。<br />
<img src ="http://www.blogjava.net/Phrancol/aggbug/285180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2009-07-02 15:24 <a href="http://www.blogjava.net/Phrancol/articles/285180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tapestry-OSGi中面向服务的设计思路</title><link>http://www.blogjava.net/Phrancol/articles/277710.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sun, 24 May 2009 11:03:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/277710.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/277710.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/277710.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/277710.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/277710.html</trackback:ping><description><![CDATA[<p>Tapestry-OSGi中引入了两个动态服务的概念，先来看看这2个概念具体是什么。<br />
<br />
<strong>1.&nbsp; ExtensionPoint与Extension</strong><br />
这个概念来自于Eclipse的插件技术，它在Web应用中如何体现？举一个简单的例子：<br />
在为Tomcat-OSGi开发的osgi console中，使用的是Tapestry-OSGi，页面中会有一个Menu的组件，它就是一个ExtensionPoint</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">ExtensionPoint(point</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">org.extwind.osgi.console.MainMenu</span><span style="color: #000000">"</span><span style="color: #000000">)</span></div>
<p><br />
其他组件只需要注册一个Extension，即可在这个Menu中显示出来，这一切将是在运行时实现的！<br />
<br />
<br />
<strong>2. Service</strong><br />
这个概念有点像OSGi中的Service Registry，Tapestry组件可以提供Service也可以获得Service，它在web应用汇总如何体现？举个例子<br />
Tapestry-OSGi的示例控制台中，关于权限控制，有3个模型组：用户组，权限组，资源组<br />
现在资源组假设只有一个页面：bundles控制页面，当client请求访问bundles控制页面时，这个页面将查找如果有LoginService存在并且没有登录，将跳转到LoginService提供的页面，当client提交登录表单后，LoginService又会查询是否有RoleService存在 ......<br />
这些Service会有一个Manager页面去控制（disable/enable）<br />
这个例子中如果再加入ExtensionPoint与Extension的概念，它将变得非常有意思。<br />
<br />
Tapestry-OSGi的OSGi Console将在完成Service Managment后开始发布。<br />
<br />
</p>
<img src ="http://www.blogjava.net/Phrancol/aggbug/277710.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2009-05-24 19:03 <a href="http://www.blogjava.net/Phrancol/articles/277710.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tapestry-OSGi Quickstart</title><link>http://www.blogjava.net/Phrancol/articles/269711.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Fri, 08 May 2009 17:44:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/269711.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/269711.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/269711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/269711.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/269711.html</trackback:ping><description><![CDATA[<br />
Tapestry-OSGi已经差不多可以用了，还剩2个问题<br />
1. 暂时不支持组件bundle的AppModule<br />
2.还有一些service需要重载，很多cache<br />
<br />
Tapestry-OSGi Quickstart的地址：<br />
<a href="http://groups.google.com/group/tapestry-osgi/web/building-osgi-application-by-using-tapestry-osgi">http://groups.google.com/group/tapestry-osgi/web/building-osgi-application-by-using-tapestry-osgi</a><br />
<br />
<img src ="http://www.blogjava.net/Phrancol/aggbug/269711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2009-05-09 01:44 <a href="http://www.blogjava.net/Phrancol/articles/269711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Tomcat-OSGi中部署OSGi Application</title><link>http://www.blogjava.net/Phrancol/articles/267508.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sun, 26 Apr 2009 15:39:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/267508.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/267508.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/267508.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/267508.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/267508.html</trackback:ping><description><![CDATA[<p><strong style="font-size: 14pt">关于本文</strong><br />
本文介绍如何将一个OSGi Application部署到Tomcat-OSGi中，你会发现这是一件非常简单的事情。<br />
<em>在本文的最后部分有相关资源的下载链接和文档链接</em><br />
<br />
<strong>一、准备工作<br />
</strong>准备工作分为两个部分：准备一个OSGi Application&nbsp; 和&nbsp; 准备Tomcat-OSGi运行环境<br />
<br />
1. 准备一个OSGi Application<br />
Tomcat-OSGi已经准备了一个应用程序：jpetstore-osgi-demo，它是将spring sample - jpetstore加以修改而成的OSGi应用程序。<br />
jpetstore-osgi-demo的最新版本是基于spring-framework-2.5.6和spring-osgi-1.2.0的，<a href="http://extwind.googlecode.com/svn/trunk/demo/jpetstore-osgi-demo/Projects.rar" target="_blank">点击这里下载Projects<a href="http://www.svnhost.cn/User/ViewFile.aspx?id=3610&amp;File=%2fdemo%2fjpetstore-osgi-demo%2fBundles.rar" target="_blank"><br />
</a></a><br />
2. 准备Tomcat-OSGi运行环境<br />
&nbsp;&nbsp;&nbsp;&nbsp; 1.&gt;&nbsp; 下载Tomcat的最新版本&nbsp; apache-tomcat-6.0.18<br />
&nbsp;&nbsp;&nbsp;&nbsp; 2.&gt;&nbsp; Tomcat-OSGi：<a href="http://extwind.googlecode.com/svn/trunk/dist/Tomcat-OSGi/Tomcat-OSGi-all-in-one.rar">Tomcat-OSGi-all-in-one.rar</a> <br />
<br />
解压缩Tomcat-OSGi-all-in-one.rar<br />
将2个jar包拷贝至Tomcat-home/lib 目录下<br />
将2个xml文件拷贝至tomcat-home/conf目录下<br />
将war包拷贝至Tomcat-home/webapps 目录下<br />
<br />
server.xml只是在host节点添加2个属性，如下：</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">Host&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="localhost"</span><span style="color: #ff0000">&nbsp;&nbsp;appBase</span><span style="color: #0000ff">="webapps"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unpackWARs</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000">&nbsp;autoDeploy</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlValidation</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000">&nbsp;xmlNamespaceAware</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000">&nbsp;className</span><span style="color: #0000ff">="org.extwind.tomcat.catalina.core.ExtenseStandardHost"</span><span style="color: #ff0000">&nbsp;hostConfigClass</span><span style="color: #0000ff">="org.extwind.tomcat.catalina.startup.ExtenseHostConfig"</span><span style="color: #0000ff">&gt;</span></div>
<p><br />
tomcat-users.xml&nbsp;定义了控制台权限，如下</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version='1.0'&nbsp;encoding='utf-8'</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tomcat-users</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">role&nbsp;</span><span style="color: #ff0000">rolename</span><span style="color: #0000ff">="manager"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">role&nbsp;</span><span style="color: #ff0000">rolename</span><span style="color: #0000ff">="tomcat"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">role&nbsp;</span><span style="color: #ff0000">rolename</span><span style="color: #0000ff">="admin"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">role&nbsp;</span><span style="color: #ff0000">rolename</span><span style="color: #0000ff">="role1"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">user&nbsp;</span><span style="color: #ff0000">username</span><span style="color: #0000ff">="tomcat"</span><span style="color: #ff0000">&nbsp;password</span><span style="color: #0000ff">="tomcat"</span><span style="color: #ff0000">&nbsp;roles</span><span style="color: #0000ff">="tomcat,manager"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">user&nbsp;</span><span style="color: #ff0000">username</span><span style="color: #0000ff">="both"</span><span style="color: #ff0000">&nbsp;password</span><span style="color: #0000ff">="tomcat"</span><span style="color: #ff0000">&nbsp;roles</span><span style="color: #0000ff">="tomcat,role1"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">user&nbsp;</span><span style="color: #ff0000">username</span><span style="color: #0000ff">="role1"</span><span style="color: #ff0000">&nbsp;password</span><span style="color: #0000ff">="tomcat"</span><span style="color: #ff0000">&nbsp;roles</span><span style="color: #0000ff">="role1"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tomcat-users</span><span style="color: #0000ff">&gt;</span></div>
<p><br />
<strong>二、将OSGi 应用程序导出为bundle<br />
<br />
</strong>将下载的projects.rar解压缩，并在eclipse中作为plug-in导入它们，org.extwind.osgi.demo.jpetstoreosgi.launcher需要作为一个普通project导入，这些projects包含了源代码，方便你进行调试。<br />
Tomcat-OSGi已经准备好了这些bundle，<a href="http://extwind.googlecode.com/svn/trunk/demo/jpetstore-osgi-demo/Bundles.rar" target="_blank">点击这里下载bundles</a><br />
通过eclipse的导出功能，将他们导出为bundle jar包，需要注意的是，org.apache.jasper, jetty，javax.servlet.*和org.eclipse.osgi是不需要导出的。（在org.extwind.osgi.demo.jpetstoreosgi.launcher中有一个导出脚本Exporter.xml，可以运行它进行导出）<br />
<br />
<strong>三、在Tomcat-OSGi中部署bundle<br />
</strong>在tomcat-home/webapps中新建一个目录JPetStoreOSGi，在JPetStoreOSGi目录中新建一个空文件osgi.ini，并将导出的bundles拷贝到该目录下。<br />
执行spring-framework-2.5.6/samples/jpetstore/db/hsqldb/server.bat 启动数据库<br />
<br />
现在，准备工作已经完成了，在浏览器中输入 <a href="http://localhost:8080/console">http://localhost:8080/console</a>&nbsp; 进入OSGi控制台，你会发现所有bundle都已经安装好了，将所有的bundle都启动了，（建议先启动org.springframework.osgi.web.extender<small>）。<br />
</small><br />
现在是时候来看看JPetStoreOSGi部署到Tomcat-OSGi中后的效果了，在浏览器中访问下面这个地址<br />
<a href="http://localhost:8080/JPetStoreOSGi/shop/index.do">http://localhost:8080/JPetStoreOSGi/shop/index.do</a> <br />
<br />
目前osgi.ini中支持properties属性 osgi.console，启动osgi控制台。<br />
<br />
在Tomcat-OSGi alpha2版本中，支持Equinox-JspServlet的注册，并兼容其URI pattern，也就是说，在eclipse的开发环境中开发出来的应用程序可以直接部署到Tomcat-OSGi中，而无需任何代码级别的修改。<br />
<em>有一点点区别就是，在Tomcat-OSGi中已经export了javax.servlet(2.4)，javax.servlet.jsp(2.1)和org.apache.jasper，因此在Tomcat-OSGi中这些bundle是不需要加入的。<br />
<span style="color: #ff0000">勿在app中使用org.apache.jasper，会导致其他应用程序的jsp出现错误。</span></em><br />
<br />
<strong>相关资源<br />
</strong><br />
Extwind的Google Group： <a href="http://groups.google.com/group/extwind" target="_blank">http://groups.google.com/group/extwind</a><br />
Extwind的Google Project： &nbsp;<a href="http://code.google.com/p/extwind">http://code.google.com/p/extwind</a>&nbsp;&nbsp; <br />
<br />
Tomcat-OSGi-alpha-2 all-in-one 下载地址<br />
<a href="http://extwind.googlecode.com/svn/trunk/dist/Tomcat-OSGi/Tomcat-OSGi-all-in-one.rar">http://extwind.googlecode.com/svn/trunk/dist/Tomcat-OSGi/Tomcat-OSGi-all-in-one.rar</a> <br />
<br />
Extwind SVN： <a href="http://extwind.googlecode.com/svn/trunk/">http://extwind.googlecode.com/svn/trunk/</a> <br />
<br />
jpetstore-osgi-demo的bundles下载地址<br />
<a href="http://extwind.googlecode.com/svn/trunk/demo/jpetstore-osgi-demo/Bundles.rar">http://extwind.googlecode.com/svn/trunk/demo/jpetstore-osgi-demo/Bundles.rar</a> <br />
jpetstore-osgi-demo的projects下载地址<br />
<a href="http://extwind.googlecode.com/svn/trunk/demo/jpetstore-osgi-demo/Projects.rar">http://extwind.googlecode.com/svn/trunk/demo/jpetstore-osgi-demo/Projects.rar</a> <br />
<br />
构建jpetstore-osgi-demo的演示过程：<br />
<a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/Phrancol/articles/143084.html">Developing Equinox/Spring-osgi/Spring Framework Web Application Part 1 - 显示首页</a> <br />
<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl22_TitleUrl" href="http://www.blogjava.net/Phrancol/articles/143170.html">Developing Equinox/Spring-osgi/Spring Framework Web Application Part 2 - 使用Spring-OSGI</a>&nbsp;&nbsp;<br />
<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl20_TitleUrl" href="http://www.blogjava.net/Phrancol/articles/143453.html">Developing Equinox/Spring-osgi/Spring Framework Web Application Part 3 - 找到我的Bean</a>&nbsp;&nbsp;<br />
<br />
构建新版jpetstore-osgi-demo的相关问题：<br />
<a class="entrylistItemTitle" id="CategoryEntryList1_EntryStoryList_Entries_ctl00_TitleUrl" href="http://www.blogjava.net/Phrancol/articles/266353.html">Tomcat-OSGi Demo: JPetStoreOSGi(Spring-osgi 1.2.0) </a><br />
<br />
<br />
</p>
<img src ="http://www.blogjava.net/Phrancol/aggbug/267508.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2009-04-26 23:39 <a href="http://www.blogjava.net/Phrancol/articles/267508.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat-OSGi Demo: JPetStoreOSGi(Spring-osgi  1.2.0) </title><link>http://www.blogjava.net/Phrancol/articles/266353.html</link><dc:creator>Phrancol Yang</dc:creator><author>Phrancol Yang</author><pubDate>Sat, 18 Apr 2009 19:31:00 GMT</pubDate><guid>http://www.blogjava.net/Phrancol/articles/266353.html</guid><wfw:comment>http://www.blogjava.net/Phrancol/comments/266353.html</wfw:comment><comments>http://www.blogjava.net/Phrancol/articles/266353.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/Phrancol/comments/commentRss/266353.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Phrancol/services/trackbacks/266353.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 关于本文本文是之前写的Developing Equinox/Spring-osgi/Spring Framework Web Application系列的升级版，Tomcat-OSGi的基础Demo之一，主要演示传统web application到OSGi application的转换，由于是升级版，所以本文的侧重点不再是基础配置的演示。一、准备工作1，JDK 1.62，E...&nbsp;&nbsp;<a href='http://www.blogjava.net/Phrancol/articles/266353.html'>阅读全文</a><img src ="http://www.blogjava.net/Phrancol/aggbug/266353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Phrancol/" target="_blank">Phrancol Yang</a> 2009-04-19 03:31 <a href="http://www.blogjava.net/Phrancol/articles/266353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>