一、修改模板文件
1、将模板文件IndexTemplate.xhtml中的<p:menuitem value="行政区划" url="#" />修改为:<p:menuitem value="中国行政区划" outcome="cn_address" />,outcome指向本系统内的一个JSF页面文件,不需要文件的后缀名。
2、增加一个导航到首页的菜单项<p:menuitem value="返回首页" outcome="index" icon="ui-icon-home"/>,icon用来在菜单项前增加一个图标。
3、在底部布局中,增加一个消息提示组件<p:growl/>,需要在<h:form/>中添加。代码如下:
<p:layoutUnit position="south" size="40" closable="true" collapsible="true">
<h:form id="bottomForm" style="padding: 4px;text-align:center;">
...
<p:growl id="bottomGrowl" showDetail="true" />
</h:form>
</p:layoutUnit>
修改后的模板文件见附件1。
二、创建AddressBean受管Bean
AddressBean受管Bean源代码见附件2。
AddressBean用来提供行政区划的数据,实现应用程序逻辑和业务逻辑。除了set、get方法外,其它的属性、方法均作了详细的注释。由于使用JadePool作为持久化工具,实现数据更新、查询的操作都非常方便。
三、创建中国行政区划管理页面
创建模板客户端网页文件cn_address.xhtml,源代码见附件3。
创建后,将文件的字符集编码修改GBK。
在cn_address.xhtml页面中实现了以下操作:
1、导入中国行政区划记录,并将记录保存到数据库中;
2、实现多功能的分页查询;
3、在DataTable行中修改行政区划记录。
导入的页面代码:
<p:commandButton style="float: left;" value="初始化地名" action="#{addressBean.reUpdateDiming}" icon="ui-icon-disk" update="@form :bottomForm:bottomGrowl"/>
导入实现的java代码:
/**
* 导入中国大陆的行政区划
*
* @return null 导航到指定的页面,null值代表返回当前的页面
*/
public String reUpdateDiming() {
Jade j = new Jade();
List<Map> v = cn.division();
for (Map m : v) {
j.save("cn_address", m);//这是为了保护已经修改的成果
}
dimingList = j.query("select * from cn_address");
dimingModel = new ListMapDataModel(dimingList, "addresscode");
j.commit();
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("导入地名", "导入地名记录" + dimingList.size() + "条!"));
return null;
}
分页查询的页面代码:
<p:dataTable id="addressDataTable"
value="#{addressBean.dimingModel}"
var="m"
rowIndexVar="i"
paginator="true"
paginatorPosition="bottom"
rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="10,15,20,25,30,35,40,45,50,55,60"
selection="#{addressBean.dimingSelected}"
selectionMode="single"
editable="true"
>
......
在分页中调用的查询数据,如:
<p:column headerText="标准名称" style="width:15%;" sortBy="#{m.addressname}" >
#{m.addressname}
</p:column>
需要指出的是ListMapDataModel dimingModel数据模型是直接将JadePool查询结果转换而来的,而且可以直接在JSF的UI组件中调用,如:<p:inputText value="#{m.longitude}" />。将其修改后又能直接保存到数据库中,因此,极大地方便了JadePool用户。代码如:onEdit方法中保存修改的代码
Record r = new Record();
Map dm = r.one(this.dimingList, "addresscode", m.get("addresscode"));
Jade j = new Jade();
j.save("cn_address", dm);
//......
修改记录时的页面效果见图
附件1:IndexTemplate.xhtml
<?xml version='1.0' encoding='GBK' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
<title>China软件项目</title>
<h:outputStylesheet library="css" name="primefaces.css"/>
<st