SuperMap iServer 扩展开发领域服务简单示例教程 - 可修改接口参数名称

170 篇文章 52 订阅

  SuperMap iServer 插件扩展开发目前提供了 2 种方式:
    1. 基于 Restlet 机制扩展 *(该方式基于 FreeMarker 编写 .ftl 模板可修改扩展插件在 iServer 页面中显示的参数名称,详情可参考 SuperMap iServer 帮助文档
    2. 基于 Servlet 机制扩展 (若只是创建扩展插件服务,可参考 SuperMap iServer 帮助文档;若想要简单的修改基于 Servlet 机制扩展的领域组件参数名,可参考以下教程)


一、准备工作

  1. 开发环境

    1. SuperMap iServer 10i 及其以上版本
    2. Intellij IDEA
    3. JDK 1.8 及其以上版本

  2. iServer 体系架构

    SuperMap iServer 服务框架是一个三层结构的体系,他们分别是 GIS 服务提供者GIS 服务组件层服务接口层
    1. GIS 服务提供者
      GIS 服务提供者层中的模块主要利用 GIS 计算内核或者第三方 GIS 服务封装并统一对 GIS 功能的不同实现。
    2. GIS 服务组件
      GIS 服务组件 (GIS Service Component) 通过对 GIS 服务提供者 (GIS Service Provider) 提供的服务能力进行组合,封装成粒度较粗的服务组件。
    3. GIS 服务接口
      SuperMap iServer 通过 GIS 服务接口 (GIS Service Interface) 发布多种类型的服务,包括 Web 服务 (Web Service) 和原生服务 (Native Service,如 RMI、WCF TCP 等,暂不支持)
iServer 体系架构
  此篇教程主要是在 GIS 服务组件GIS 服务接口 层进行扩展开发,以实现 SuperMap iServer 自定义参数名的领域组件服务。


二、新建领域服务扩展项目

  1. 在 IDEA 中新建空白项目(如:iServerDomainComponentExt);

iServerDomainComponentExt项目结构

  2. 配置项目依赖环境;

    2.1. 配置 Servlet 环境依赖(SuperMap iServer 安装目录\lib,如:D:\SuperMap\supermap-iserver-10.2.0-win64-zip\lib);
配置 **Servlet** 环境依赖
    2.2. 配置 SuperMap iObjects Java 组件环境依赖(SuperMap iServer 安装目录\webapps\iserver\WEB-INF\lib,如:D:\SuperMap\supermap-iserver-10.2.0-win64-zip\webapps\iserver\WEB-INF\lib);
配置 **SuperMap iObjects Java** 组件环境依赖

  3. 配置项目构建 Jar 包,将 iServerDomainComponentExt 项目编译输出内容打包到生成的 Jar 包中。

配置项目构建 Jar 包


三、领域服务组件开发 - GIS 服务组件扩展

  1. 在 iServerDomainComponentExt 项目的 src 目录新建包名(如:com.supermap.iserver.exts);
com.supermap.iserver.exts包名

  2. 在 com.supermap.iserver.exts 包中新建 TestImpl 类文件,编码实现测试方法。
**TestImpl** 类文件

package com.supermap.iserver.exts;

public class TestImpl {
    public static String getTestInfo(String name, int index, String content) {
        return name + "_" + index + "_" + content;
    }
}

四、领域服务接口开发 - GIS 服务接口扩展

  在 com.supermap.iserver.exts 包中新建 TestServlet 类文件,继承自 HttpServlet 并实现 InterfaceContextAware 接口。
**TestServlet** 类文件

务必在 TestServlet 类中实现 setInterfaceContextdoGetdoPost 方法!!!

  1. setInterfaceContext 方法:用于获取 TestImpl 实例对象;
  2. doGet 方法:用于修改该领域服务在 iServer 打开页面的显示样式(即修改显示参数名称);
  3. doPost 方法:用于在 iServer 中调用该领域服务后的返回结果展示页面的显示样式。
package com.supermap.iserver.exts;

import com.supermap.services.InterfaceContext;
import com.supermap.services.InterfaceContextAware;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.util.List;

public class TestServlet extends HttpServlet implements InterfaceContextAware {
    private String id;
    private TestImpl test = null;

    public TestServlet() {
        this.id = String.valueOf(System.currentTimeMillis());
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        PrintWriter out;
        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        out = response.getWriter();
        String title = "这是一个测试代码";
        out.println("<html>");
        out.println("<head>");
        out.println("<TITLE>" + title + "</TITLE>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p align=\"center\">" + "测试接口" + "</p>");
        out.println("<hr>");
        out.println("<form method=\"POST\" action=>");
        out.println("<p align=\"center\">");
        out.println("<label>测试名称:");
        out.println("<input type=\"text\" name=\"testname\" id=\"testname\" size=\"20\">");
        out.println("</label>");
        out.println("</p>");
        out.println("<p align=\"center\">");
        out.println("<label>测试索引:");
        out.println("<input type=\"text\" name=\"testindex\" id=\"testindex\" size=\"20\">");
        out.println("</label>");
        out.println("</p>");
        out.println("<p align=\"center\">");
        out.println("<label>测试内容:");
        out.println("<input type=\"text\" name=\"testcontent\" id=\"testcontent\" size=\"20\">");
        out.println("</label>");
        out.println("</p>");
        out.println("<p align=\"center\">");
        out.println("<label>");
        out.println("<input type=\"submit\" name=\"submit\" value=\"提交\">");
        out.println("</label>");
        out.println("<label>");
        out.println("<input type=\"reset\" name=\"reset\" value=\"重置\">");
        out.println("</label>");
        out.println("</p>");
        out.println("</form>");
        out.println("</body>");
        out.println("</html>");
        out.close();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        String parameter = request.getParameter("testname");
        String testname = URLDecoder.decode(parameter, "UTF-8");
        parameter = request.getParameter("testindex");
        int testindex = Integer.parseInt(URLDecoder.decode(parameter, "UTF-8"));
        parameter = request.getParameter("testcontent");
        String testcontent = URLDecoder.decode(parameter, "UTF-8");
        String testInfo = this.test.getTestInfo(testname, testindex, testcontent);

        // 对服务器 IP 和端口处理
        PrintWriter out;
        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");
        out = response.getWriter();
        String title = "测试结果";
        out.println("<html>");
        out.println("<head>");
        out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">");
        out.println("<TITLE>" + title + "</TITLE>");
        out.println("</head>");
        out.println("<body>");
        out.println("<p align=\"center\">" + testInfo + "</p>");
        out.println("</body>");
        out.println("</html>");
    }

    @Override
    public void setInterfaceContext(InterfaceContext context) {
        this.getServletContext().setAttribute(this.id + "InterfaceContext", context);
        List<Object> components = context.getComponents(Object.class);
        if (components != null) {
            for (Object component : components) {
                if (component instanceof TestImpl) {
                    this.test = (TestImpl) component;
                    break;
                }
            }
        }
    }
}

五、领域服务部署

  1. 配置 Jar 包

    通过 IDEA 将当前项目构建成 Jar 包(如:iServerDomainComponentExt.jar),将构建好的 iServerDomainComponentExt.jar 包拷贝到 SuperMap iServer 安装目录\webapps\iserver\WEB-INF\lib 下。
IDEA 构建 iServerDomainComponentExt.jar 包
放置 Jar 包

  2. 服务接口配置

    在 SuperMap iServer 安装目录\webapps\iserver\WEB-INF 目录下的 iserver-services-interfaces.xml 文件中配置领域服务接口。
      1.1. 在 <interfaces> 节点中添加 <interface> 节点;
      1.2. 自定义 <interface> 节点的 name 属性(如:iServerDomainComponentExtInterface);
      1.3. 找到前面编码的 TestServlet 类的包名,在 <interface> 节点的 class 属性中配置(如:com.supermap.iserver.exts.TestServlet)。

<interface name="iServerDomainComponentExtInterface" class="com.supermap.iserver.exts.TestServlet">
	<config />
</interface>

  3. 服务组件配置

    在 SuperMap iServer 安装目录\webapps\iserver\WEB-INF 目录下的 iserver-services.xml 文件中配置领域服务组件。
      2.1. 在 <components> 节点中添加 <component> 节点;
      2.2. 在 <component> 节点的 name 属性设置领域服务构建的 Jar 包名(如:iServerDomainComponentExt);
      2.3. 找到前面编码的 TestImpl 类的包名,在 <component> 节点的 class 属性中配置(如:com.supermap.iserver.exts.TestImpl);
      2.4. 找到上一步在 iserver-services-interfaces.xml 文件中配置领域服务接口名,在 <component> 节点的 interfaceNames 属性中配置(如:iServerDomainComponentExtInterface)。

<component name="iServerDomainComponentExt" class="com.supermap.iserver.exts.TestImpl" providers="" interfaceNames="iServerDomainComponentExtInterface">
	<config/>
</component>

六、运行结果

  完成以上步骤的配置后,启动 SuperMap iServer,在浏览器打开 SuperMap iServer 页面,找到 “服务》服务管理》其他服务”。
本次发布的领域服务
  点击本次发布的领域服务后进入 服务基本信息页面
服务基本信息页面
  点击 服务地址,进入 服务示例页面 并输入测试内容。
服务示例页面

  点击提交,即可得到该领域服务的返回结果。
该领域服务的返回结果


七、配套资源

  若觉得上述教程仍然不够清晰,可下载该教程的配套编码实现工程【基于 SuperMap iServer 领域服务扩展插件 - 简单示例代码】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值