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