Geoserver源码解读六 插件

系列文章目录

Geoserver源码解读一 环境搭建

Geoserver源码解读二 主入口

Geoserver源码解读三 GeoServerBasePage

Geoserver源码解读四 REST服务

Geoserver源码解读五 Catalog

Geoserver源码解读六 插件(怎么在开发模式下使用)

目录

系列文章目录

前言

一、源码位置

二、开发模式下怎么使用

三、文件资源管理插件(Resource Browser Tool)

1.概览 

2.支持多文件上传

2.1 改动一

2.2 改动二

2.3 改动三

2.4 改动四

3.国际化i18n配置

3.1 第一步 新建GeoServerApplication_zh.properties资源包

3.2 第二步 翻译并转成 ISO-8859 编码


前言

看这篇文章的人相信肯定已经知道geoserver的插件大致有哪些,实用的有哪些,我就不再多说了。简单附上一个插件的下载地址(传送门)。

因为geoserver官方社区给出的插件有很多,此处就不一一说明,这篇文章主要记录下插件的源码位置在哪和怎么在开发模式下使用插件以及以文件资源管理插件为例分析下改造的一个过程。

一、源码位置

从源码中能看到有一个【extension】文件夹(这点儿我还是比较意外的,插件的源码竟然也在源码里面,本来我还以为是另外一个需要单独下载的工程)

默认情况下它是没有蓝色小方块的,只有当你用到它时idea才会加一个蓝色小方块的标识。

二、开发模式下怎么使用

geoserver官方社区的插件在使用的时候,一般都是下载下来插件,然后放到geoserver安装目录的lib文件夹下,然后重启geoserver就行,但是在开发模式下怎么安装插件呢。

常规的思路是在主模块gs-web-app里面引用extension的下面的插件子模块应该可以了,但是我又在 pom.xml文件里发现了一些关于插件的profiles设置

于是乎,打开了maven的设置面板,勾选上想要使用的插件,再点击下刷新按钮就可以了 

三、文件资源管理插件(Resource Browser Tool)

1.概览 

       在maven的配置界面勾选上后,重启geoserver就能在浏览器界面中看到它了

没有做过i18n处理的小伙伴看到的估计名字是【Resource Browser】,这个后面再讲,这个文件资源管理器有个缺点,就是每次上传文件的时候只能上传一个,如果要想上传一个shp文件到服务器就废老劲了,咱们稍微改造下它,让它支持多文件上传

2.支持多文件上传

看过上面第一段的描述后可以看出来它的源码位置在这个地方

src/extension/web-resource

2.1 改动一

看过我前面文章的朋友们应该也知道,geoserver是基于Wicket做的,这个文件资源管理器也是一样的,先找到它的html页面

src/main/resources/org/geoserver/web/resources/PanelUpload.html

这个地方做第一个小改动

<input wicket:id="file" size="40" type="file" multiple>

在input标签上加一个multiple

2.2 改动二

在它的java类上添加查询上传的文件列表方法

org/geoserver/web/resources/PanelUpload.java

    /**
     * 获取上传的文件列表
     * @return List<FileUpload>
     */
    public List<FileUpload> getFileUploadList() {
        return ((FileUploadField) get("file")).getFileUploads();
    }

2.3 改动三

在资源浏览器类中加获取上传的文件资源列表方法

org/geoserver/web/resources/PageResourceBrowser.java

    /**
     * 获取文件上传组件的文件列表
     * @param uploadPanel 文件上传组件
     * @return List<Resource>
     */
    private List<Resource> getUploadPanelResourceList(PanelUpload uploadPanel) {
        String dir = uploadPanel.getDirectory();
        List<Resource> uploadPanelResourceList = new ArrayList<>();
        uploadPanel.getFileUploadList().forEach(singleFileUpload->{
            uploadPanelResourceList.add(store().get(Paths.path(dir, singleFileUpload.getClientFileName())));
        });
        return uploadPanelResourceList;
    }

2.4 改动四

在PageResourceBrowser类的上传按钮的提交事件回调中加处理方法

    @Override
    protected boolean onSubmit(AjaxRequestTarget target, Component contents) {
        uploadPanel.getFeedbackMessages().clear();
        if (uploadPanel.getFileUpload() == null) {
            uploadPanel.error(
                    new ParamResourceModel("fileRequired", getPage())
                            .getString());
        } else {
            List<Resource> uploadPanelResourceList = getUploadPanelResourceList(uploadPanel);
            AtomicInteger successNumber = new AtomicInteger();
            uploadPanelResourceList.forEach(singleResource->{
                if (Resources.exists(singleResource)) {
                    uploadPanel.error(
                            new ParamResourceModel("resourceExists", getPage())
                                    .getString()
                                    .replace("%", "/" + singleResource.path()));
                } else {
                    try (OutputStream os = singleResource.out()) {
                        IOUtils.copy(
                                uploadPanel.getFileUpload().getInputStream(), os);
                        treeView.setSelectedNode(
                                new ResourceNode(singleResource, expandedStates), target);
                        successNumber.getAndIncrement();
//                                            return true;
                    } catch (IOException | IllegalStateException e) {
                        uploadPanel.error(e.getMessage());
                    }
                }
            });
            if(successNumber.get() == uploadPanelResourceList.size()){
                return true;
            }
        }
        target.add(uploadPanel.getFeedbackPanel());
        return false;
    }

到这儿这个功能就完成了,可以看到下面的多选文件的效果

3.国际化i18n配置

        关于i18n,geoserver官方也给出了一些描述

Translating GeoServer — GeoServer 2.25.x Developer Manual

我们就按照它官网的说明来(不配置也没关系,只不过默认显示的文字是英文)

3.1 第一步 新建GeoServerApplication_zh.properties资源包

从上图能看出来,这个插件默认只有德、法、韩等一些小国家的兼容,没有中文的,所以有必要让它兼容下中文,文件的内容可以拷贝GeoServerApplication.properties

3.2 第二步 翻译并转成 ISO-8859 编码

以插件的title为例在GeoServerApplication.properties中看到下面的描述

PageResourceBrowser.page.title=Resource Browser

翻译成中文是

PageResourceBrowser.page.title=文件资源管理器

但是GeoServerApplication.properties默认是不认中文的,只能用ISO-8859编码,所有要再做一个转换,网上在线转换的网址有很多,比如这个(传送门)

转换成ISO-8859编码后是

PageResourceBrowser.page.title=\u6587\u4ef6\u8d44\u6e90\u6d4f\u89c8\u5668

把其他的配置全改完之后重启geoserver就能看到插件的中文的界面了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/789846.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NodeJS小饰品销售管理系统-计算机毕业设计源码21597

摘 要 在当今的数字化时代&#xff0c;电子商务已经成为了商业领域中不可或缺的一部分。随着消费者对于购物体验的要求越来越高&#xff0c;一个高效、便捷、用户友好的小饰品销售管理系统显得尤为重要。 本系统旨在利用 JavaScript 技术&#xff0c;设计并实现一个功能强大的小…

idea控制台乱码问题解决教程

注&#xff1a;按顺序来操作&#xff0c;完成后要重启软件 方案一&#xff1a;修改Tomcat的编码设置 在Tomcat的VM options中添加了-Dfile.encodingUTF-8 方案二&#xff1a;修改IDEA的编码设置 File->Settings->Editor->File Encodings 将Global Encoding、Proj…

智汇园区:为园区企业注入前沿技术与人才活力

在日新月异的时代浪潮中&#xff0c;树莓集团深知人才是企业发展的核心驱动力&#xff0c;更是推动产业升级与创新的关键要素。因此&#xff0c;我们致力于构建全方位的人才引进与培养体系&#xff0c;为园区企业输送源源不断的前沿技术与人才支持。 【人才引进&#xff1a;汇聚…

最适合mysql5.6安装的linux版本-实战

文章目录 一, 适合安装mysql5.6的linu版本1. CentOS 72. Ubuntu 14.04 LTS (Trusty Tahr)3. Debian 8 (Jessie)4. Red Hat Enterprise Linux (RHEL) 7 二, 具体以Ubuntu 14.04 LTS (Trusty Tahr)为例安装虚拟机安装Ubuntu 14.04 LTS (Trusty Tahr) 自己弄安装ssh(便于远程访问,…

【STM32学习】cubemx配置,串口的使用,串口发送接收函数使用,以及串口重定义、使用printf发送

1、串口的基本配置 选择USART1&#xff0c;选择异步通信&#xff0c;设置波特率 选择后&#xff0c;会在右边点亮串口 串口引脚是用来与其他设备通信的&#xff0c;如在程序中打印发送信息&#xff0c;电脑上打开串口助手&#xff0c;就会收到信息。 串口的发送接收&#xff0…

短剧cps分销系统搭建开发,搭建专属于自己的分销系统

前言&#xff1a; 短剧项目是目前非常火的一个互联网项项目。短剧CPS&#xff08;Cost Per Sale&#xff0c;即按照销售额付费&#xff09;分销系统涉及多个步骤&#xff0c;主要可以归纳为以下几个关键环节&#xff1a; 1. 获取源码&#xff1a; 你可以通过购买商业源码、使…

python怎么求因数

要想做到python语言求因数方法&#xff0c;首先要明白其中的原理&#xff1a; 1、对由123456789这九个数字组成的9位数进行分解质因数。 2、1234576982x3x3x7x13x23x29x113&#xff0c;所以他的值因数是113。 3、总共有362880种可能&#xff0c;从中找出值因数中最小的数字和…

react基础语法,模板语法,ui渲染,jsx,useState状态管理

创建一个react应用 这里使用create-react-app的脚手架构建项目&#xff08;结构简洁&#xff0c;基于webpack-cli&#xff09;&#xff0c; npx create-react-app [项目名称] 使用其他脚手架构建项目可以参考&#xff1a;react框架&#xff0c;使用vite和nextjs构建react项目…

品牌策划必读:9本改变游戏规则的营销经典

作为深耕品牌十余年的策划人&#xff0c;这些年自学啃下的书不计其数。 这里特意挑选了几本知名度不高但是却非常有用的“遗珠”优质品牌策划书籍分享出来。 如果你是一位初步了解品牌的人&#xff0c;这些书籍既包含了品牌理论基础&#xff0c;也有实用的实践指导。 这些书…

振弦采集仪在大型工程安全监测中的作用与意义

振弦采集仪在大型工程安全监测中的作用与意义 河北稳控科技振弦采集仪是一种用于测量振动频率的仪器&#xff0c;常用于大型工程的安全监测中。它通过采集振弦的振动信号&#xff0c;可以对工程结构的振动特性进行实时监测和分析。振弦采集仪在大型工程安全监测中具有重要的作…

深入理解Python密码学:使用PyCrypto库进行加密和解密

深入理解Python密码学&#xff1a;使用PyCrypto库进行加密和解密 引言 在现代计算领域&#xff0c;信息安全逐渐成为焦点话题。密码学&#xff0c;作为信息保护的关键技术之一&#xff0c;允许我们加密&#xff08;保密&#xff09;和解密&#xff08;解密&#xff09;数据。P…

先进电机拓扑及控制算法介绍(1)——串联绕组电机拓扑极其控制

1.前言 在这个专栏&#xff0c;我会介绍一些比较先进的电机拓扑及控制算法&#xff0c;并且会做仿真来验证这些电机拓扑及控制算法的先进性。什么叫做“比较先进的电机拓扑及控制算法”呢&#xff1f; 在我看来&#xff0c;这些电机拓扑及控制算法被提出不久&#xff0c;知道…

AI提示词:AI辅导「数学作业」

辅导孩子作业对许多家长来说可能是一件头疼的事&#xff0c;但这部分工作可以在一定程度上交给AI来完成。 打开ChatGPT4,输入以下内容&#xff1a; # Role 数学辅导专家## Profile - author: 姜小尘 - version: 02 - LLM: Kimi - language: 中文 - description: 专门为小学生…

将格内多行文字展开成多格

表格的A列是分类&#xff0c;B列由多行文字组成&#xff0c;即分隔符是换行符。 AB1Account NumberInteraction21Jan 1,2023 - Hello.32Jan 2, 2023 - Good morning. Jan 3, 2023 - Good night. Jan 4, 20 Jan 5, 2023 - Good night. Jan 6, 2023 - Good afternoon.43Jan 1,20…

【JavaEE】进程

目录 一.冯诺依曼体系结构 二.CPU的核心概念 核心数 频率&#xff08;Clock Speed 或时钟频率&#xff09; 如何选择合适的CPU 三.指令的执行 1.什么是指令 1.取指令 2.解析指令 3.执行指令 4.访问内存&#xff08;Memory&#xff09;: 5.写回结果&#xff08;Write…

Linux--网络设置

目录 一、测试网络连接 1、查看网络接口信息 1.1 ifconfig 命令---查看网络接口信息 1.1.1 ifconfig 网卡 #单独查看某个网卡 1.1.2 ifconfig -a #显示所有活动及非活动的连接 二、修改网络配置文件 三、设置网络接口参数 3.1 启用、禁用网络接口配置 3.2 hostn…

U-net和U²-Net网络详解

目录 U-Net: Convolutional Networks for Biomedical Image Segmentation摘要U-net网络结构pixel-wise loss weight U-Net: Going Deeper with Nested U-Structure for Salient Object Detection摘要网络结构详解整体结构RSU-n结构RSU-4F结构saliency map fusion module -- 显著…

常见摄像头模块性能对比

摄像头模块在现代电子设备与嵌入式开发中扮演着重要角色&#xff0c;从智能手机到安全监控系统&#xff0c;再到机器人视觉系统&#xff0c;它们无处不在。以下是一些常见的摄像头模块及其特点的对比&#xff1a; OV2640 分辨率&#xff1a;最高可达200万像素&#xff08;1600x…

递归 迷宫问题-java

1&#xff09;findWay方法是为了找出走出迷宫的路径&#xff0c;找到返回true&#xff0c;否则返回false 2&#xff09;&#xff08;i&#xff0c;j&#xff09;是老鼠的位置&#xff0c;初始化的位置为&#xff08;1&#xff0c;1&#xff09; 3&#xff09;因为是递归找路&am…

centos磁盘空间满了-问题解决

报错问题解释&#xff1a; CentOS系统在运行过程中可能会出现磁盘空间不足的错误。这通常发生在以下几种情况&#xff1a; 系统日志文件或临时文件过大导致磁盘空间不足。 安装了大量软件或文件而没有清理无用文件。 有可能是某个进程占用了大量磁盘空间。 问题解决方法&a…