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类的上传按钮的提交事件回调中加处理方法

    @Overrideprotected 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.mzph.cn/news/870546.shtml

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

相关文章

看番工具 -- oneAnime v1.2.5绿色版

软件简介 OneAnime是一款专为动漫爱好者设计的应用程序&#xff0c;它提供了一个庞大的动漫资源库&#xff0c;用户可以在这里找到各种类型的动漫&#xff0c;包括热门的、经典的、新番的等等。OneAnime的界面设计简洁明了&#xff0c;操作方便&#xff0c;用户可以轻松地搜索…

C++系列-Vector(一)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” Vector的介绍及使用 Vector的介绍 当vector构建的参数类型为char类型时&#xff0c;它是和string是极其类似的&#xff0c;但是二者之间也有不同&#xff0c;比如&#xff0c…

[C++] 模拟实现list(二)

标题&#xff1a;[C] 模拟实现list&#xff08;二&#xff09; 水墨不写bug 目录 &#xff08;一&#xff09;回顾 &#xff08;二&#xff09;迭代器类的封装设计 &#xff08;1&#xff09;成员函数简要分析 &#xff08;2&#xff09;const迭代器类的设计 &#xff08;…

二四、3d人脸构建

一、下载github项目3dmm_cnn-master https://github.com/anhttran/3dmm_cnn.git 一个使用深度神经网络从单个图像进行 3D 人脸建模的项目,端到端代码,可直接根据图像强度进行 3D 形状和纹理估计;使用回归的 3D 面部模型,从检测到的面部特征点估计头部姿势和表情。…

19185 01背包问题

解决这个问题的关键是使用动态规划的方法。我们可以创建一个二维数组dp[i][j]&#xff0c;其中i表示考虑前i件物品&#xff0c;j表示背包的容量。dp[i][j]的值表示在考虑前i件物品&#xff0c;且背包容量为j时能获得的最大价值。 ### 算法步骤 1. 初始化一个二维数组dp&#x…

机器学习(五) -- 监督学习(7) --SVM2

系列文章目录及链接 上篇&#xff1a;机器学习&#xff08;五&#xff09; -- 监督学习&#xff08;7&#xff09; --SVM1 下篇&#xff1a; 前言 tips&#xff1a;标题前有“***”的内容为补充内容&#xff0c;是给好奇心重的宝宝看的&#xff0c;可自行跳过。文章内容被“文…

ABAQUS大连正版代理商:亿达四方——开启东北工业智能仿真新篇章

在东北老工业基地的振兴道路上&#xff0c;大连以其独特的地理位置和深厚的产业基础&#xff0c;成为推动区域经济发展的领头羊。作为国际知名的仿真软件ABAQUS在大连地区的官方授权代理商&#xff0c;亿达四方正以科技创新为驱动&#xff0c;引领当地制造业迈向数字化、智能化…

SD卡讲解

SD 卡 (Secure Digital Memory Card) 在我们生活中已经非常普遍了&#xff0c;控制器对 SD 卡进行读写通信 操作一般有两种通信接口可选&#xff0c;一种是 SPI 接口&#xff0c;另外一种就是 SDIO 接口。SDIO 全称是安全数 字输入/输出接口&#xff0c;多媒体卡 (MMC)、SD 卡、…

stm32使用pwm和编码器模式(包含重映射)

Dri_TIM.c #include "Dri_TIM.h"/*** description: TIM4初始化&#xff0c;pwm模式* return {*}*/ void Dri_TIM4_Init() {/* 1. 开启时钟*//* 1.1 定时器4的时钟 */RCC->APB1ENR | RCC_APB1ENR_TIM4EN;/* 1.2 GPIO的时钟 PB */RCC->APB2ENR | RCC_APB2ENR_I…

【Python实战因果推断】30_双重差分1

目录 Panel Data 在讨论了干预效果异质性之后&#xff0c;是时候转换一下思路&#xff0c;回到平均干预效果上来了。在接下来的几章中&#xff0c;您将学习如何利用面板数据进行因果推断。 面板数据是一种跨时间重复观测的数据结构。在多个时间段观察同一单位&#xff0c;可以…

PyTorch中的CPU和GPU代码实现详解

PyTorch中的CPU和GPU PyTorch中的CPU和GPU代码实现详解1. 安装PyTorch2. 编写支持CPU和GPU的PyTorch代码2.1 模型定义2.2 数据加载2.3 将模型和数据移动到GPU2.4 训练循环 3. 关键步骤详解**3.1 定义设备****3.2 模型和数据移动到GPU****3.3 优化器和损失函数** 4. 完整代码示例…

构建实时银行应用程序:英国金融机构 Nationwide 为何选择 MongoDB Atlas

Nationwide Building Society 超过135年的互助合作 Nationwide Building Society&#xff08;以下简称“Nationwide”&#xff09; 是一家英国金融服务提供商&#xff0c;拥有超过 1500 万名会员&#xff0c;是全球最大的建房互助会。 Nationwide 的故事可以追溯到 1884 年&am…

web后端开发--请求响应

目录 前言 请求 简单参数 原始方法 Spring方式 Post请求乱码处理 实体参数 简单实体参数 复杂实体参数 ​编辑 数组集合参数 数组参数 ​编辑 集合参数 日期参数 ​编辑 Json参数 ​编辑 传递json数据 json数组 json对象&#xff08;POJO&#xff09; jso…

Dify中的知识库API列表

1.知识库API列表 通过文本/文件创建/更新/删除文档/查询文档嵌入状态&#xff0c;知识库创建/知识库查询/文档列表查询&#xff0c;分段增/删/改/查。 接口名字功能描述请求示例POST/datasets/{dataset_id}/document/create_by_text通过文本创建文档此接口基于已存在知识库&a…

tableau人口金字塔,漏斗图,箱线图绘制 - 13

人口金字塔&#xff0c;漏斗图&#xff0c;箱线图 1. 金字塔1.1 定义1.2 金字塔创建1.2.1 数据导入1.2.2 数据异常排查1.2.3 创建度量字段1.2.4 转换属性1.2.5 创建数据桶1.2.6 选择相关属性1.2.7 年龄排序1.2.8 创建计算字段1.2.9 选择相关字段1.2.10 设置轴排序1.2.11 设置颜…

Windows系统服务器远程教程

在远程连接Windows系统服务器之前&#xff0c;需要确保以下几点&#xff1a; 被远程的Windows服务器必须开启远程桌面功能。这一功能在Windows系统中默认是关闭的&#xff0c;需要手动启用。 必须为两台计算机中的一台计算机&#xff08;即客户端&#xff09;创建远程桌面连接。…

11、中台-DDD-几种微服务架构模型对比分析

引言 在上一章中&#xff0c;我们深入探讨了DDD分层架构的基本概念和实现方法。这一章将重点介绍几种常用的微服务架构模型&#xff0c;包括洋葱架构、六边形架构&#xff0c;并对这两种架构模型与DDD分层架构进行对比分析。通过了解不同架构模型的优缺点&#xff0c;帮助我们…

C++复合数据类型:指针类型、引用类型、指针和引用之间的关系

复合数据类型 (1)指针 A.What&#xff08;什么是指针&#xff09; 用于存放对象地址的复合数据类型 B.Which&#xff08;有哪些指针&#xff09; 空指针&#xff1a; int *p nullptr; int *p 0;//&#xff08;不指向任何对象&#xff09;void *&#xff1a; void *&…

fastermaker-boot代码生成器

fastermaker-boot 是基于Spring Boot3 、Vue3 的一个代码简洁、结构清晰、开发高效、模块可扩展的单体项目的基础开发框架&#xff0c;包含代码生成器模块&#xff0c;适合初级开发者特别是大学生学习研究使用&#xff0c;也是中小型系统快速开发的利器。 开发技术: JDK 17、Sp…

liunx清理服务器内存和日志

1、查看服务器磁盘占用情况 # 查看磁盘占用大小 df -h 2、删除data文件夹下面的日志 3、查看每个服务下面的日志输出文件&#xff0c;过大就先停掉服务再删除out文件再重启服务 4、先进入想删除输入日志的服务文件夹下&#xff0c;查看服务进程&#xff0c;杀掉进程&#xff…