Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OSGiServiceTracker中的漂亮URL_Java_Servlets_Osgi - Fatal编程技术网

Java OSGiServiceTracker中的漂亮URL

Java OSGiServiceTracker中的漂亮URL,java,servlets,osgi,Java,Servlets,Osgi,我需要使用漂亮的URL向ServiceTracker注册servlet,即laapi/item/5 为了找到一种方法,我找到了一种看起来应该完全符合我的要求的方法,但它对我不起作用。当我使用类似api/item/*的URL注册一个servlet时,要访问它,我必须准确地使用该URL,包括*。它不会将*视为通配符 有没有办法在OSGi中获得漂亮的URL,或者使用api/item?id=5样式的URL是唯一的方法?如果可能的话,怎么做 这是我的代码: package hmi; import hmi

我需要使用漂亮的URL向ServiceTracker注册servlet,即la
api/item/5

为了找到一种方法,我找到了一种看起来应该完全符合我的要求的方法,但它对我不起作用。当我使用类似
api/item/*
的URL注册一个servlet时,要访问它,我必须准确地使用该URL,包括
*
。它不会将
*
视为通配符

有没有办法在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);
    }
}

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

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