Geoserver Web界面开发
2012 暑假
山西农业大学
左脑
找了很长时间,都没有合适的资料,还是看官方的开发文档吧。今天针对WEB 用户界面这部分做了一下全文翻译:
Geoserver Web用户界面开发
概述:
Geoserver 用Wicket框架来实现用户界面部分。Wicket不同于大多数其他JAVA web 框架,它是基于JSP模版实现的。使用Wicket框架,使程序员就像使用Swing编程一样。
Wicket插件:
由于Wicket是基于组件式的,所以可以从classpath载入,这就意味着Web应用程序可以进行模块化开发,而不是单一模式。
Geoserver的这一理念,提供了一个可以自由组合的用户界面,可以通过spring插件机制和常规的插入方式定制Web界面。
每个插入的组件都是通过组件描述符描述的。
组件的描述符是org.geoserver.web.ComponentInfo 类的实例。
public abstract class ComponentInfo<C extends Component> implements Serializable {
/**
* the id of the component
*/
String id;
/**
* the title of the component
*/
String title;
/**
* The description of the component
*/
String description;
/**
* the class of the component
*/
Class<C> componentClass;
}
一个组件的描述包含了标题、描述,以及实现该组件的一些信息。
组件的每一个子类都是一个特定的扩展点。例如 class org.geoserver.web.MenuPageInfo 类的实例,就是主页面的扩展点,也就是说从应用程序的主菜单链接到的页面。
实现一个Wicket UI 扩展:
本节当中,介绍实现Geoserver的Wicket用户界面扩展。这个扩展很简单,将做一个菜单项,连接到一个简单的网页,并显示“Hello World”。
需要准备的:
首先要将Geoserver的源码构建到eclipse中。不会的看前面的内容。
创建一个新模块:
1、建立一个名为hello_web 的模块。
2、在心添加的模块根目录下添加一个pom.xml 文件,内容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd ">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.geoserver</groupId>
<artifactId>web</artifactId>
<version>2.2-SNAPSHOT</version>
</parent>
<groupId>org.geoserver</groupId>
<artifactId>hello_web</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>hello_web</name>
<dependencies>
<dependency>
<groupId>org.geoserver.web</groupId>
<artifactId>web-core</artifactId>
<version>2.2-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
3、在新添加的模块根目下建立如下目录结构:src/main/java
创建页面类:
1、org.geoserver.web.GeoServerBasePage 类,在Geoserver中是所有页面类的基类。在org.geoserver包下,创建一个新类,名为 HelloPage,继承至org.geoserver.web.GeoServerBasePage类。
package org.geoserver.helloweb;
import org.geoserver.web.GeoServerBasePage;
public class HelloPage extends GeoServerBasePage {
}
2、首先要实现父类的构造方法, 在Wicket页面或组件建立在它的构造本身,这个类中简单而且基础的添加了一个标签,它的值为“Hello World”。
import org.apache.wicket.markup.html.basic.Label;
...
public HelloPage() {
add( new Label( "hellolabel", "Hello World!") );
}
上面的代码中,创建了而一个label实例,第一个参数是该label的ID值,在Wicket中每一个组件必须有一个ID值,在下一节中,这个ID值将绑定到HTML表现层中,第二个参数是label上显示的字符。
建立一个演示页面:
1、上面的页面类完成后,需要创建一个HTML页面,用来演示结果。需要建立一个和页面类同名同位置的HTML文件,如以上的页面类为HelloPage.java,那么需要在同一目录下创建一个HelloPage.html文件,内容如下:
<html>
<body>
<wicket:extend>
<div wicket:id="hellolabel"></div>
</wicket:extend>
</body>
</html>
关于HTML文件需要注意以下几点:
1、首先要使用<wicket:extend> 标签,这样写的目的是,让Wicket知道,HelloPage是另一个页面的扩展(对于本例是GeoServerBasePage页的扩展),HelloPage继承了GeoServerBasePage页
2、其次要注意在<div>标签中的wicket:id,这个值就是上节中创建的label组件绑定所对应的值,wicket:id必须与页面类的组件ID匹配。
创建国际化文件:
在程序的页面显示中,任何程序都应该国际化,在Geoserver中通过创建一个GeoServerApplication.properties文件,来实现国际化。
1、在模块的根目录下,创建如下目录结构src/main/resources。
2、创建 GeoServerApplication.properties文件在src/main/resources下。内容如下:
HelloPage.page.title=Hello
HelloPage.page.description=A page to say hello
HelloPage.title=Hello Page Title
HelloPage.description=This is the description of the page
以上前两个用来描述页面的标题和描述部分(定义部分不显示),后两个才显示。
建立关系(依赖)(上下文):
这是最后一个步骤,建立一个applicationContext.xml 在该模块下的src/main/java下,用来将我们建立的模块集成到Geoserver中。
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="helloPage" class="org.geoserver.web.MenuPageInfo">
<property name="id" value="helloPage"/>
<property name="titleKey" value="HelloPage.page.title"/>
<property name="descriptionKey" value="HelloPage.page.description"/>
<property name="componentClass" value="org.geoserver.helloweb.HelloPage"/>
</bean>
</beans>
上面代码说明,这是一个MenuPageInfo的实例,并连接到主页面上。titleKey是页面的描述,并且接受国际化文件中的定义,类似的还有其他值。
测试我们的扩展:
这时hello_web模块的机构应该下面这样的:
hello_web/
pom.xml
src/main/resources
GeoServerApplication.properties
src/main/java
applicationContext.xml
org/geoserver/helloweb/
HelloPage.java
HelloPage.html
1、编译hello_web模块
在该模块目下执行: mvn install
2、将生成的hello_web-1.0-SNAPSHOT.jar 文件从hello_web/target复制到WEB-inf/lib中。