osgi框架下开发的web应用,可以启动,但是无法访问

发布于 2022-09-05 08:54:13 字数 4964 浏览 17 评论 0

osgi初学者,刚刚接触,还不算入门,才跑成功hello world;最近在参照博客http://www.cnblogs.com/eastso...
做一个web的简单例子,但是无法出现效果。我新建的项目名称是osgi_servlet,运行后,截图如下:图片描述
看到8 ACTIVE osgi_servlet_1.0.0.qualifier,表示工程是已经成功启动了的,但是使用http://localhost/demo/hello访问,是没有任何内容的,提示“This site can’t be reached”,原因实在找不到。
特别说明:
在运行时候,bundles--target platform这里,我没按照作者那样去添加

org.eclipse.equinox.http.servlet
org.eclipse.equinox.http.jetty
org.mortbay.jetty.server
org.mortbay.jetty.util

这四个我没有添加,因为添加时候,发现org.mortbay.jetty.server,org.mortbay.jetty.util是没有的,如果添加了org.eclipse.equinox.http.servlet,与org.eclipse.equinox.http.jetty,运行会报错org.osgi.framework.BundleException: Could not resolve module: org.eclipse.equinox.http.jetty [10]
Unresolved requirement: Import-Package: org.eclipse.jetty.http; version="[9.0.0,10.0.0)"。而且我在新建工程时候,选择的是standard osgi framwork。不知道是不是需要选择equinox这个。但是选择equinox,在下面的osgi_web项目中,依然同样的问题。

代码如下:
Activator.java

public class Activator implements BundleActivator, ServiceListener {
    private BundleContext context;
    private ServiceReference<HttpService> ref;

    /*
     * (non-Javadoc)
     * @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
     */
    public void start(BundleContext context) throws Exception {
        System.out.println("Hello World!!");
        this.context=context;
        context.addServiceListener(this, "(objectClass="+HttpService.class.getName()+")");
    }
    
    /*
     * (non-Javadoc)
     * @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
     */
    public void stop(BundleContext context) throws Exception {
        System.out.println("Goodbye World!!");
        context.removeServiceListener(this);
    }

    @Override
    public void serviceChanged(ServiceEvent event) {
        switch(event.getType()){
        case ServiceEvent.REGISTERED:registerServlet();break;
        case ServiceEvent.UNREGISTERING:unregisterServlet();break;
        }
        
    }
    
    private void registerServlet(){
        if(ref==null){
            ref=context.getServiceReference(HttpService.class);
            if(ref!=null){
                try{
                    HttpService service=context.getService(ref);
                    service.registerServlet("/demo/hello", new HelloServlet(context),null,null);
                    System.out.println("/demo/hello已经被注册");
                }catch(Exception ex){
                    ex.printStackTrace();
                }
            }
        }
    }
    
    private void unregisterServlet(){
        if(ref!=null){
            try{
                HttpService httpservice=context.getService(ref);
                httpservice.unregister("/demo/hello");
                System.out.println("/demo/hello已经被卸载");
                ref=null;
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
    }

}

helloServlet.java

public class HelloServlet extends HttpServlet{
    private BundleContext context;
    
    public HelloServlet(BundleContext context){
        this.context=context;
    }
    
    public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException{
        HttpSession session=request.getSession();
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html");
        PrintWriter out=response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>hello world</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("hello wolrd!");
        out.println("</body>");        
    }
    

}

尝试好几遍,实在没有找到问题的原因所在。然后试着换了一种方式,参照网页https://www.ibm.com/developer...
,按照“将 HTTP Server 置于 Equinox 框架中开发 Web 应用”一步一步操作,但是结果一样,这几个地址无法访问

http://localhost/images/1.jpg
http://localhost/jsp/index.jsp
http://localhost/servlet/myfirstservlet?userName=Levin

工程也是成功启动了的,截图如下:
成功名是osgi_web
图片描述

最终发现是Caused by: java.lang.NullPointerException: A null service reference is not allowed.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

余生一个溪 2022-09-12 08:54:13

勾选的Bundle不够导致的,已经解决了。我在这里添加了一些bundle,然后就可以了。还有,不要使用默认的80端口,否则访问不了,参数中添加 -Dorg.osgi.service.http.port=9080
图片描述
图片描述
备注:另外,那个Activator.java里面那样的代码,我半天都不知道原来是Caused by: java.lang.NullPointerException: A null service reference is not allowed. 造成的问题,改成这样,就快速发现了问题:

System.out.println("Hello World!!");
        this.context=context;
        //context.addServiceListener(this, "(objectClass="+HttpService.class.getName()+")");
        System.out.println("Hello World end!!");
        
        ServiceReference serviceReference = context.getServiceReference(HttpService.class.getName());
        HttpService service = (HttpService) context.getService(serviceReference);
        
        //ref=context.getServiceReference(HttpService.class);
        //HttpService service=context.getService(ref);
        service.registerServlet("/demo/hello", new HelloServlet(context),null,null);
        System.out.println("/demo/hello已经被注册");
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文