对于osgi的具体详细讲解可以参看后面的附近,我这里主要是提供大家下载学习,对于想深入了解的人,这里不合适您。附件中主要讲解的是对于一个初学者的认知和简单使用,非常的实用教程。在这里我就不用过多的讲解。
大家可以在附件中下载,如果大家与pdf里面使用的eclipse版本不一致的,可以在启动osgi framework时根据提示要依赖的包进行相应的添加,在学习中使用Equinox框架的包,只要eclipse是在3.1版本之后的都会有的,不用下载的。
附近中主要讲解了Equinox、spring-DM、felix三种osgi框架的应用.
ps:对于书中提供的源码下载,我一打开链接就报404错误。
其实对于没有源码的学习,主要是在学习osgi web开发时会有些迷惘,我就把web这一块的源码分享一下.
1.首先写个简单的servlet类,为了方便我们将这个servlet也写成bundle,这样这个servlet类也能够获取你加载进来的其它组件(但是这个类中确没有,如果大家参看了附件中的pdf,可以将其中的几个本地字典和远程字典查询的组件加载进来,结合这个web项目来使用,我这里就不再结合了),代码如下:
package com.wy.query.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; import com.wy.demo.dictquey.query.QueryService; import com.wy.query.tracker.HttpServiceTracker; public class QueryServlet extends HttpServlet implements BundleActivator{ private ServiceReference serviceReference = null; private static BundleContext context; ServiceTracker httpServiceTracker; /** * */ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String resultString = null; resp.setCharacterEncoding("UTF-8"); resp.setContentType("text/html"); String name= req.getParameter("name"); PrintWriter out = resp.getWriter(); out.write(name + "test success"); out.flush(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } @Override public void start(BundleContext arg0) throws Exception { System.err.println("http activator"); this.context = arg0; httpServiceTracker = new HttpServiceTracker(arg0, this, null); httpServiceTracker.open(); } @Override public void stop(BundleContext arg0) throws Exception { System.out.println("Goodbye http activator"); httpServiceTracker.close(); httpServiceTracker = null; this.context = null; } }
这个类与普通的bundle的区别就在于,它启动时做的事情是:
httpServiceTracker = new HttpServiceTracker(arg0, this, null); httpServiceTracker.open();
就是将服务启动起来,能够让客户端进行访问。而具体的这个HttpServiceTracker怎么实现的?我们可以参看下面的代码:
package com.wy.query.tracker; import javax.servlet.Servlet; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceReference; import org.osgi.service.http.HttpService; import org.osgi.util.tracker.ServiceTracker; import org.osgi.util.tracker.ServiceTrackerCustomizer; public class HttpServiceTracker extends ServiceTracker { private Servlet servlet; public HttpServiceTracker(BundleContext context, Servlet servlet, ServiceTrackerCustomizer customizer) { super(context, HttpService.class.getName(), customizer); this.servlet= servlet; } public Object addingService(ServiceReference reference) { HttpService httpService = (HttpService) context.getService(reference); try { System.err.println("注册页面/page/dictquery.html"); httpService.registerResources("/page", "/page/dictquery.html", null); System.err.println("注册servlet QueryServlet"); httpService.registerServlet("/rest",servlet, null, null); } catch (Exception e) { e.printStackTrace(); } return httpService; } public void removedService(ServiceReference reference, Object service) { HttpService httpService = (HttpService) service; httpService.unregister("/page"); httpService.unregister("/rest"); super.removedService(reference, service); } }
这个类主要就是继承了osgi工具类中的 ServiceTracker这个类,将页面中的资源和一些servlet类添加进来,这样你就可以通过启动服。
你就可以http://localhost/page来访问html资源/page/dictquery.html,这个资源就是你在项目中的src路径下建个page文件夹,然后再创建一个dictquery.html页面.
通过http://locahost/rest?name="test"来访问servlet,这个会执行
httpService.registerServlet("/rest",servlet,null, null);
我通过这种方法注册的servlet类,只要你的是在Ip:端口号后面以/rest为结尾的请求,都会执行你注册的这个servlet,而我注册的这个servlet就是我在QueryServlet中对HttpServiceTracker这个类创建时传入的,也就是QueryServlet这个对象,所以我们只要通过http://locahost/rest?name="test"这种方式请求就会执行QueryServlet中的doGet方法
对于osgi想有更多的学习,可以通过http://osgi.com.cn这个网站来进行