您的位置:首页 > 其它

OSGi原理与最佳实践——字典服务declarative Service实现

2015-09-15 10:11 399 查看

一、重构DictQueryProject 删除Activator类

二、删除LocalDictQuery里面的Activator类,新建文件夹OSGI-INF,在此文件夹里面创建一个component.xml文件。

 

 修改component.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<component name="DictQueryService">
<implementation
class="com.grocal.localdictquery.local.impl.LocalDictQueryServiceImpl" />
<service>
<provide interface="com.grocal.dictquery.query.QueryService" />
</service>
</component>
 implementation标记:指定接口的实现类 service标记:接口的定义类 同理修改DictWeb里面的DictServlet,删除BoundContext相关的应用,修改后的DictServlet如下:
package com.grocal.dictweb.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.HttpService;
import org.osgi.service.http.NamespaceException;

import com.grocal.dictquery.query.QueryService;

public class DictServlet extends HttpServlet {

/**
*
*/
private static final long serialVersionUID = 1L;

private QueryService queryService;
private HttpService httpService;

public void setHttpService(HttpService httpService) {
this.httpService = httpService;
try {
httpService.registerServlet("/dict/queryServlet", this, null, null);
httpService.registerResources("/dict/page", "page", null);
System.out.println("注册service /dict/page/dictquery.html");
} catch (ServletException e) {
e.printStackTrace();
} catch (NamespaceException e) {
e.printStackTrace();
}
}

public void unsetHttpService(HttpService httpService) {
if (httpService != this.httpService) {
return;
}
this.httpService.unregister("/dict/queryServlet");
this.httpService.unregister("/dict/page");
System.out.println("取消service注册");
this.httpService = null;
}

public void setQueryService(QueryService queryService) {
this.queryService = queryService;
}

public void unsetQueryService(QueryService queryService) {
if (queryService != this.queryService) {
return;
}
this.queryService = null;
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
doGet(req, resp);
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
String queryWord = req.getParameter("query_word");
resp.setContentType("text/html;charset=utf-8");
ServletOutputStream output = resp.getOutputStream();
if (queryService == null) {
output.println("No available dictquery service");
output.close();
return;
}

try {
output.println("Result is " + queryService.query(queryWord));
output.close();
return;
} catch (Exception e) {
output.println("Error occurs");
output.println(e.toString());
output.close();
return;
}
}

}
 component的内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<component name="DictQueryServlet">
<implementation class="com.grocal.dictweb.servlet.DictServlet" />
<reference name="QueryService" interface="com.grocal.dictquery.query.QueryService" bind="setQueryService"
unbind="unsetQueryService" policy="dynamic" cardinality="0..1"/>
<reference name="HttpService" interface="org.osgi.service.http.HttpService" bind="setHttpService"
unbind="unsetHttpService" policy="dynamic"/>
</component>
 运行工程,在这里值得注意的一点是需要加入另外两个bundle,以及设置bundle的start level 为2   阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: