Geoserver源码解读六 插件

news2024/11/16 20:31:26

系列文章目录

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就能看到插件的中文的界面了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ubuntu计划任务反弹

目录 实验环境 实验步骤 目标主机构造任务计划 构造语句 语句解释 kali开启监听 监听成功 问题 原因 实验环境 攻击者 操作系统&#xff1a;kali IP&#xff1a;192.168.244.141 目标主机 操作系统&#xff1a;ubuntu IP&#xff1a;192.168.244.151 实验步骤 目…

CSS 中的 ::before 和 ::after 伪元素

目录 一、CSS 伪元素 二、::before ::after 介绍 1、::before 2、::after 3、content 常用属性值 三、::before ::after 应用场景 1、设置统一字符 2、通过背景添加图片 3、添加装饰线 4、右侧展开箭头 5、对话框小三角 6、插入icon图标 一、CSS 伪元素 CSS伪元…

数据库使用SSL加密连接

简介 数据库开通SSL加密连接是确保数据传输过程中安全性的关键措施&#xff0c;它通过加密数据、验证服务器身份、保护敏感信息、维护数据完整性和可靠性&#xff0c;同时满足行业标准和法规要求&#xff0c;进而提升用户体验和信任度&#xff0c;为企业的数据安全和业务连续性…

做工和音质都堪称典范!悠律Ringbuds pro耳机动感低音享受

想要长时间佩戴舒适&#xff0c;又要听歌看电影音质好&#xff0c;还想户外运动时不影响听到环境声音&#xff0c;开放式毋容置疑是最好的选择&#xff0c;像我每天坐地铁上下班的时候都会习惯戴耳机&#xff0c;但以前戴入耳式耳机的时候经常会错过站点&#xff0c;耽误了不少…

TREK高压功率放大器维修trek高压电源609E-6

美国Trek维修产品包括&#xff1a;高压放大器、电源、静电电压表、高压功能发生器、放大器、静电测量仪、荷电板、信号放大器、高压电源、功率放大器、高压功能发生器、高压放大器、接触电压表、非接触式电压表、板载控制器、ESD和传感器、ESD电压表、带电板、电离器、表面电阻…

HashMap----源码解读

源码分析&#xff1a; public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable 在类的开头声明了几个常量&#xff0c;以下是较为重要的&#xff1a; /*** 定义初始容量大小为16*/ static final int DEFAULT_I…

【射频器件供应】 Marki Microwave

射频、微波和毫米波组件 裸片、表面贴装、连接器和波导 直流至Sub-THz Marki Microwave通过创建强大的性能突破性射频和微波组件产品组合&#xff0c;解决了业界最棘手的技术问题。Marki Microwave 成立于 1991 年&#xff0c;以开发业内最好的混频器为目标&#xff0c;如今已…

kaggle提交csv文件

使用colab完成实验后 将要提交的csv文件拖到kaggle网站自己加入的competition就行 如果kaggle网站无法注册&#xff0c;往往是人机验证问题&#xff1a; kaggle网站验证

6-5,web3浏览器链接区块链(react+区块链实战)

6-5&#xff0c;web3浏览器链接区块链&#xff08;react区块链实战&#xff09; 6-5 web3浏览器链接区块链&#xff08;调用读写合约与metamask联动&#xff09; 6-5 web3浏览器链接区块链&#xff08;调用读写合约与metamask联动&#xff09; 这里就是浏览器端和智能合约的交…

语言模型演进:从NLP到LLM的跨越之旅

在人工智能的浩瀚宇宙中&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是一个充满挑战和机遇的领域。随着技术的发展&#xff0c;我们见证了从传统规则到统计机器学习&#xff0c;再到深度学习和预训练模型的演进。如今&#xff0c;我们站在了大型语言模型&#xff…

【最经典的79个】软件测试面试题(内含答案)提前备战“金九银十”

001.软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试用例 用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤 预期结果 0002.问&…

ctfshow-web入门-文件上传(web166、web167)(web168-web170)免杀绕过

目录 1、web166 2、web167 3、web168 4、web169 5、web170 1、web166 查看源码&#xff0c;前端只让传 zip 上传 zip 成功后可以进行下载 随便搞一个压缩包&#xff0c;使用记事本编辑&#xff0c;在其内容里插入一句话木马&#xff1a; 上传该压缩包&#xff0c;上传成功…

LLM独角兽们就要活不下去了!C.AI被资本抛弃,核心员工跑路;Perplexity陷入传统媒体口水战;微软发明的新型收购方式靠谱么?| ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;ShowMeAI官网 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 1. 亚马逊「招聘式收购」Adept AI&#xff0c;始作俑者微软正在被联邦「反垄断」调查 Adept AI 官网 → https://www.adept.ai Adept AI 成立于2022年4月&#xf…

分享一个 .NET 通过监听器拦截 EF 消息写日志的详细例子

前言 EF 开发效率确实很高也很便捷&#xff0c;但当它发生错误时&#xff0c;也挺让人头疼的&#xff0c;为什么&#xff1f;因为 EF 就像是一个黑盒子&#xff0c;一切全被封装起来&#xff0c;出错的时候很难定位原因&#xff0c;如果能够知道并打印 EF 生成的 SQL 语句&…

历年HW已公开漏洞合集!(目前漏洞库更新至84个,Goby持续更新...)

截至2024年7月11日&#xff0c;Goby红队版已扩充以下历年HW已公开漏洞库&#xff0c;本次更新84个&#xff1a; &#xff08;后续将持续更新…) 华天动力OA 华天动力 OA getHtmlContent 文件读取漏洞华天动力OA办公系统 /OAapp/bfapp/buffalo/TemplateService 文件读取漏洞华…

中国各省养老机构数据明细(更新至2024年)

中国养老机构是指为老年人提供集中居住、生活照顾、健康管理、文化娱乐等综合性服务的设施。这些机构包括养老院、福利院、老年公寓等多种形态&#xff0c;既有公立也有民办&#xff0c;遍布城市与农村。 一、数据介绍 数据名称&#xff1a;中国养老机构数据明细 数据范围&am…

【C++】使用C++实现基于Socket的通信

在本文中&#xff0c;我们将详细讨论如何使用C实现基于Socket的通信&#xff0c;并设计一个TLV&#xff08;Type-Length-Value&#xff09;协议用于数据交互。TLV协议因其灵活性和可扩展性&#xff0c;在多种通信协议中被广泛使用&#xff0c;特别是在需要动态定义数据结构的场…

软件架构之嵌入式系统设计

软件架构之嵌入式系统设计 第 12 章&#xff1a;嵌入式系统设计12.1 嵌入式系统概论12.2 嵌入式系统的组成12.2.1 硬件架构12.2.2 软件架构 12.3 嵌入式开发平台与调试环境12.3.1 嵌入式系统软件开发平台12.3.2 嵌入式开发调试 第 12 章&#xff1a;嵌入式系统设计 随着计算机…

# Redis 入门到精通(一)数据类型(3)

Redis 入门到精通&#xff08;一&#xff09;数据类型&#xff08;3&#xff09; 一、redis 数据类型–set 类型介绍与基本操作 1、set 类型 新的存储需求: 存储大量的数据&#xff0c;在查询方面提供更高的效率。需要的存储结构: 能够保存大量的数据&#xff0c;高效的内部…

MybatisPlus 核心功能

MybatisPlus 核心功能 文章目录 MybatisPlus 核心功能1. 条件构造器1.1 QueryWrapper1.2 LambdaQueryWrapper&#xff08;推荐&#xff09;1.3 UpdateWrapper1.4 LambdaUpdateWrapper 2. 自定义SQL3. Service接口 1. 条件构造器 当涉及到查询或修改语句时&#xff0c;MybatisP…