OSGi ServiceTracker中的漂亮URL

时间:2014-11-13 10:30:50

标签: java servlets osgi

我需要使用漂亮的URL {la api/item/5来注册servlet和ServiceTracker。

寻找一种方法,我发现SO answer看起来应该完全按照我要做的去做,但它对我不起作用。当我使用api/item/*这样的网址注册servlet时,为了访问它,我必须使用该网址,*。它不会将*视为通配符。

有没有办法在OSGi中获取漂亮的URL,或者使用api/item?id=5样式的URL是唯一的方法?如果有可能,怎么样?

这是我的代码:

package hmi;

import hmi.api.get.*;

import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.http.HttpService;
import org.osgi.util.tracker.ServiceTracker;

public class HMIServiceTracker extends ServiceTracker {

    public HMIServiceTracker (BundleContext context) {
        super (context, HttpService.class.getName(), null);
    }

    public Object addingService (ServiceReference reference) {
        HttpService httpService = (HttpService) super.addingService (reference);
        if (httpService == null) {
            return null;
        }

        try {
            httpService.registerServlet ("/hmi/api/get/appliance_list", new ApplianceList(), null, null);
            httpService.registerServlet ("/hmi/api/get/appliance/*", new Appliance(), null, null);
            httpService.registerResources ("/hmi", "/web", null);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return httpService;
    }

    public void removedService (ServiceReference reference, Object service) {
        HttpService httpService = (HttpService) service;

        httpService.unregister ("/hmi/api/get/appliance_list");
        httpService.unregister ("/hmi/api/get/appliance/*");
        httpService.unregister ("/hmi");

        super.removedService (reference, service);
    }
}

1 个答案:

答案 0 :(得分:2)

根据HTTP服务规范,所有路径都通过前缀匹配进行匹配。因此,您应该从网址中删除/*。如果使用api/item注册servlet,则该url下面的所有内容也将触发您的servlet。

在servlet中,使用HttpServletRequest#getPathInfo()获取 api/item之后的所有