最近一个项目中用了OSGi,此时OSGi还没有引起足够多人的重视,无论在国内还是国外,所以在开发过程中遇到的问题只能自己慢慢去找。但是,特别想感谢BlueDavy,是他的OpenDoc带我进入了OSGi的世界。
  先说下我的项目中遇到的困难吧,首先我选择了使用HTTP作为应用的View层。OSGi对HTTP的支持还很小,就连最近版本的org.eclipse.equinox.http_1.0.1在HTTP服务的支持上都还有很多还没有实现的,就像Servlet2.4中的编码、过滤器、监听器......还有好多方法。只能自己实现,其实我们可以考虑使用Bridge的,但出项目性质考虑,还是使用了OSGi直接支持的HTTP服务。至于org.eclipse.equinox.http中的一些方法的实现我有空再写吧。
  好了,搞定了HTTP服务,现在就想用回我们熟悉的Spring、Hibernate。这在别人的文章里都有写了,特别是在JavaEye的OSGi专栏里已经有人实验过了。呵呵,就差DWR。听说BlueDavy也在用OSGi+DWR,但也没有看到有进一步的资料。
  DWR与OSGi的整合其实挺简单的,这要归功于DWR的作者设计时的思路。在网上,一直没有人提到DWR可以有多个配置文件的,更可以在web.xml里面进行参数的设置,之前我也不知道,这两天算是把它的源代码看了一遍。要整合DWR,还得先知道它初始化的原理:
  DWR在第一次启动时运行DwrServlet中的init()方法,首先初始化一个Continer。Continer可以在web.xml中设定,这样如果必要的话可以加入自己的Continer,如果没有,则使用默认的DefaultContainer。ContainerUtil为Continer提供了很多的方法,就像Map对象一样。add....(...)、get(...)方法
   完成Continer初始化后,就开始加载配置文件。这里会加载几个配置文件
        首先会加载dwr.jar包里面的dwr.xml文件,这个文件里面定义了基本类型的转换,比如String、Date、Collection....还有一些Creator。比如new、null、Spring...这样的设计有一个好处,就是在以后的扩展中可以很轻松地将一个新的Creator加进去。
        接着,加载程序configureFromInitParams会去查找ServletConfig里,即是web.xml中DwrServlet中有没有以"config"开关的Name,有话就提取出它的Value,并且以"\n"符把它分割,分别加载。这段代码如下:

[原创]DWR与OSGi的整合        Enumeration en = servletConfig.getInitParameterNames();
[原创]DWR与OSGi的整合        
boolean foundConfig = false;
[原创]DWR与OSGi的整合        
while (en.hasMoreElements())
        }


  也就是说我们可以在web.xml中进行以下配置,以加载多个dwr.xml文件:

[原创]DWR与OSGi的整合    <servlet>
[原创]DWR与OSGi的整合        
<servlet-name>dwr-invoker</servlet-name>
[原创]DWR与OSGi的整合        
<servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
[原创]DWR与OSGi的整合        
<init-param>
[原创]DWR与OSGi的整合            
<param-name>config[原创]DWR与OSGi的整合</param-name>
[原创]DWR与OSGi的整合            
<param-value>
[原创]DWR与OSGi的整合                dwrConfig1.xml
[原创]DWR与OSGi的整合                dwrConfig2.xml
[原创]DWR与OSGi的整合                [原创]DWR与OSGi的整合.
[原创]DWR与OSGi的整合            
</param-value>
[原创]DWR与OSGi的整合        
</init-param>
[原创]DWR与OSGi的整合        
<init-param>
[原创]DWR与OSGi的整合            
<param-name>debug</param-name>
[原创]DWR与OSGi的整合            
<param-value>true</param-value>
[原创]DWR与OSGi的整合        
</init-param>
[原创]DWR与OSGi的整合    
</servlet>
[原创]DWR与OSGi的整合
[原创]DWR与OSGi的整合    
<servlet-mapping>
[原创]DWR与OSGi的整合        
<servlet-name>dwr-invoker</servlet-name>
[原创]DWR与OSGi的整合        
<url-pattern>/dwr/*</url-pattern>
[原创]DWR与OSGi的整合    
</servlet-mapping>

  其实这一段代码就是我们所需要的,在OSGi里面,可以在每个Bundle里面放置自己的dwr.xml文件,以配置自己的HTTP中的DWR方法。
        好了,让我们开始OSGi的DWR之旅吧。
  新建一个Plug-in项目。初始化,可以把它称为DwrServer。继续初始化......
  在Eclipse时里面开始的话,让它生成Activator.java文件,它是Bundle级的Listener。代码如下:
        

[原创]DWR与OSGi的整合package com.ycoe.dwr;
[原创]DWR与OSGi的整合
[原创]DWR与OSGi的整合
import java.io.BufferedReader;
[原创]DWR与OSGi的整合
import java.io.IOException;
[原创]DWR与OSGi的整合
import java.io.InputStreamReader;
[原创]DWR与OSGi的整合
import java.net.URL;
[原创]DWR与OSGi的整合
import java.net.URLConnection;
[原创]DWR与OSGi的整合
import java.util.Hashtable;
[原创]DWR与OSGi的整合
[原创]DWR与OSGi的整合
import javax.servlet.Servlet;
[原创]DWR与OSGi的整合
import javax.servlet.ServletConfig;
[原创]DWR与OSGi的整合
import javax.servlet.ServletContext;
[原创]DWR与OSGi的整合
import javax.servlet.ServletException;
[原创]DWR与OSGi的整合
import javax.servlet.http.HttpServlet;
[原创]DWR与OSGi的整合
import javax.servlet.http.HttpServletRequest;
[原创]DWR与OSGi的整合
import javax.servlet.http.HttpServletResponse;
[原创]DWR与OSGi的整合
import javax.xml.parsers.ParserConfigurationException;
[原创]DWR与OSGi的整合
[原创]DWR与OSGi的整合
import org.directwebremoting.Container;
[原创]DWR与OSGi的整合
import org.directwebremoting.WebContextFactory;
[原创]DWR与OSGi的整合
import org.directwebremoting.WebContextFactory.WebContextBuilder;
[原创]DWR与OSGi的整合
import org.directwebremoting.extend.ServerLoadMonitor;
[原创]DWR与OSGi的整合
import org.directwebremoting.impl.ContainerUtil;
[原创]DWR与OSGi的整合
import org.directwebremoting.impl.DefaultContainer;
[原创]DWR与OSGi的整合
import org.directwebremoting.impl.StartupUtil;
[原创]DWR与OSGi的整合
import org.directwebremoting.servlet.UrlProcessor;
[原创]DWR与OSGi的整合
import org.directwebremoting.util.Logger;
[原创]DWR与OSGi的整合
import org.directwebremoting.util.ServletLoggingOutput;
[原创]DWR与OSGi的整合
import org.osgi.framework.BundleActivator;
[原创]DWR与OSGi的整合
import org.osgi.framework.BundleContext;
[原创]DWR与OSGi的整合
import org.osgi.framework.ServiceEvent;
[原创]DWR与OSGi的整合
import org.osgi.framework.ServiceListener;
[原创]DWR与OSGi的整合
import org.osgi.framework.ServiceReference;
[原创]DWR与OSGi的整合
import org.osgi.service.http.HttpService;
[原创]DWR与OSGi的整合
import org.osgi.util.tracker.ServiceTracker;
[原创]DWR与OSGi的整合
import org.xml.sax.SAXException;
[原创]DWR与OSGi的整合
[原创]DWR与OSGi的整合
public class Activator extends HttpServlet implements BundleActivator,

  如果看过dwr源代码的人也许会发现,这个类和DwrServlet非常地像,的确,我是拷那里的。为什么不用它原来的呢?后面会写原因。。。
  好了,接下来,是实现加载每个Bundle里的dwr配置的文件类DwrLoader.java了

[原创]DWR与OSGi的整合package com.ycoe.dwr;
[原创]DWR与OSGi的整合
[原创]DWR与OSGi的整合
import java.io.IOException;
[原创]DWR与OSGi的整合
import java.util.Dictionary;
[原创]DWR与OSGi的整合
[原创]DWR与OSGi的整合
import javax.xml.parsers.ParserConfigurationException;
[原创]DWR与OSGi的整合
[原创]DWR与OSGi的整合
import org.directwebremoting.impl.DefaultContainer;
[原创]DWR与OSGi的整合
import org.directwebremoting.impl.DwrXmlConfigurator;
[原创]DWR与OSGi的整合
import org.osgi.framework.Bundle;
[原创]DWR与OSGi的整合
import org.osgi.framework.BundleContext;
[原创]DWR与OSGi的整合
import org.xml.sax.SAXException;
[原创]DWR与OSGi的整合
import com.ycoe.core.SystemContext;
[原创]DWR与OSGi的整合

  完成!
        然而会发现出错了。接下来的内容我在回复中写好了。See you...
  

相关文章:

猜你喜欢
相关资源
相似解决方案