zoukankan      html  css  js  c++  java
  • OSGi 系列(十二)之 Http Service

    OSGi 系列(十二)之 Http Service

    1. 原始的 HttpService

    (1) 新建 web-osgi 工程,目录结构如下:

    图12.1.1 目录结构

    (2) HomeServlet

    package com.github.binarylei.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class HomeServlet extends HttpServlet {
    
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().write("<h1>osgi http service</h1>");
        }
    }
    

    (3) Activator

    package com.github.binarylei.servlet;
    
    import org.osgi.framework.BundleActivator;
    import org.osgi.framework.BundleContext;
    import org.osgi.framework.ServiceReference;
    import org.osgi.framework.ServiceRegistration;
    import org.osgi.service.http.HttpContext;
    import org.osgi.service.http.HttpService;
    
    import javax.servlet.Servlet;
    import java.util.Dictionary;
    import java.util.Hashtable;
    
    public class Activator implements BundleActivator {
    
        private HttpService http = null;
        private ServiceRegistration<Servlet> serviceRegistration;
        
        public void start(BundleContext context) throws Exception {
    
            ServiceReference<HttpService> ref = context.getServiceReference(HttpService.class);
            if(ref == null) {
                System.out.println("http service is null");
            } else {
                http = context.getService(ref);
                
                HttpContext httpContext = http.createDefaultHttpContext();
                
                //注册servlet
                http.registerServlet("/home", new HomeServlet(), null, httpContext);
                
                //注册静态资源
                http.registerResources("/static", "web", httpContext);
            }
            
            //通过发布服务的方式,注册servlet。不能注册静态资源
            Dictionary<String, String> properties = new Hashtable<>();
            properties.put("alias", "/home2");
            serviceRegistration = context.registerService(Servlet.class, new HomeServlet(), properties);
        }
    
        public void stop(BundleContext context) throws Exception {
            if(http != null) {
                http.unregister("/home");
                http.unregister("/static");
            }
            serviceRegistration.unregister();
        }
    }
    

    (4) karaf 测试:

    先测试 http.registerServlet() 注册方式

    feature:install http
    

    注意: 要先启动 http 服务,再启动 web-osgi

    图12.1.2 测试结果

    再测试 context.registerService(Servlet.class, new HomeServlet(), properties) 注册方式

    feature:install http http-whiteboard
    

    图12.1.3 测试结果

    2. OSGi 中运行 war 包

    (1) 新建 webapp-osgi 工程,目录结构如下:

    图12.2.1 目录结构

    (2) LoginServlet

    @WebServlet("/web/app")
    public class LoginServlet extends HttpServlet {
    
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().write("this is osgi web app");
        }
    }
    

    (3) web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      version="3.0"
      metadata-complete="false">
    
    </web-app>
    

    (4) 配制 war 打包方式

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
            <archive>
                <!-- 表示 MANIFEST.MF 的内容由 maven-bundle-plugin 插件生成 -->
                <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
            </archive>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.apache.felix</groupId>
        <artifactId>maven-bundle-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
            <execution>
                <id>bundle-manifest</id>
                <phase>process-classes</phase>
                <goals>
                    <goal>manifest</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <supportedProjectTypes>
                <supportedProjectType>war</supportedProjectType>
            </supportedProjectTypes>
            <instructions>
                <Web-ContextPath>/osgiweb</Web-ContextPath>
                <Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath>
            </instructions>
        </configuration>
    </plugin>
    

    (5) 测试:

    karaf 默认是不支持 war 包安装方式

    feature:install war
    

    图13.2.2 测试结果

  • 相关阅读:
    NYOJ-301递推求值
    二叉树
    从c到c++
    NYOJ-93汉诺塔(三)
    历届试题 最大子阵
    最大子序列和最大子矩阵
    【贪心】电视节目安排
    【贪心】线段覆盖
    【贪心】取数游戏
    【贪心】智力大冲浪
  • 原文地址:https://www.cnblogs.com/binarylei/p/8587592.html
Copyright © 2011-2022 走看看