`
54wangyong
  • 浏览: 13705 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

osgi 最佳实践

阅读更多

      对于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这个网站来进行

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics