这里使用JSF2.0技术实现中国行政区划管理,通过范例可以看到JadePool实现了与JSF框架和Primefaces的完美组合。本范例完整演示了以下操作:1、导入中国大陆行政区划记录,并将记录保存到数据库中;2、实现多功能的分页查询;3、在DataTable行中修改行政区划记录。数据来源于国家统计局于2012年11月份公布的中国大陆行政区划。这些数据被打包在jadepool-1.0-GBK.jar文件中,可以通过cn.jadepool.util.China的division()方法导出。

一、修改模板文件
        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"/><style type="text/css">.ui-selectoneradio td{border: 0px;padding: 4px;background-color: transparent;}/*去掉p:selectOneRadio中表格宽度*/.my-north,.my-north div{margin: 0px;padding: 0px;border: 0px;color:white;background:url(none) transparent;background-color: #004360;}/*修改头部布局的样式*/.my-menu{width:160px;}.my-grid tbody td{border: 0px;}/*去掉td宽度*/</style></h:head><h:body><p:layout fullPage="true"><p:layoutUnit position="north" size="70" styleClass="my-north"><h:panelGrid columns="2" style="height: 30px;"><h:column><h1 style="padding: 8px;">China软件项目管理</h1></h:column><h:column><div style="padding: 4px;">JSF2.0卓越的JavaWEB框架</div></h:column></h:panelGrid></p:layoutUnit><p:layoutUnit position="south" size="40" closable="true" collapsible="true"><h:form id="bottomForm" style="padding: 4px;text-align:center;"><p:spacer width="10"/><h:outputText value="开发设计:胡开明"/><p:spacer width="10"/><h:outputText value="日期:2013年3月28日"/><p:spacer width="10"/><p:growl id="bottomGrowl" showDetail="true" /></h:form></p:layoutUnit><p:layoutUnit position="west" size="180" header="China软件项目主菜单" collapsible="true"><p:menu styleClass="my-menu"><p:submenu label="基本数据管理"><p:menuitem value="中国行政区划" outcome="cn_address" /><p:menuitem value="民族" url="#" /><p:menuitem value="产品分类" url="#" /><p:menuitem value="国民经济行业分类" url="#" /></p:submenu><p:submenu label="通讯录管理"><p:menuitem value="商务通讯录" url="#" /></p:submenu><p:submenu label="资讯管理"><p:menuitem value="RSS订阅" url="#" /><p:menuitem value="返回首页" outcome="index"  icon="ui-icon-home"/></p:submenu></p:menu></p:layoutUnit><p:layoutUnit position="center"><ui:insert name="content">各项业务实现部分</ui:insert></p:layoutUnit></p:layout></h:body>
</html>

附件2:AddressBean.java

/** AddressBean.java* 胡开明* 2013-01-25* */
package china;import cn.jadepool.sql.Jade;
import cn.jadepool.sql.Record;
import cn.jadepool.util.China;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import org.primefaces.event.RowEditEvent;/*** 通用的地名管理** @author hkm*/
@ManagedBean
@SessionScoped
public class AddressBean implements java.io.Serializable {private Map dimingMap = new LinkedHashMap();//地名记录private Map dimingSelected = new LinkedHashMap();//被选择的地名记录private List<Map> dimingList = new ArrayList();//地名列表private ListMapDataModel dimingModel = null;//地名数据模型private List<Map> dimingShengList = new ArrayList();//省地名列表private List<Map> dimingShiList = new ArrayList();//市地名列表private List<Map> dimingXianList = new ArrayList();//县地名列表private China cn = new China();private String codeSheng = "";private String codeShi = "";private String codeXian = "";/*** Creates a new instance of AddressBean*/public AddressBean() {init();}public String getCodeSheng() {return codeSheng;}public void setCodeSheng(String codeSheng) {this.codeSheng = codeSheng;}public String getCodeXian() {return codeXian;}public void setCodeXian(String codeXian) {this.codeXian = codeXian;}/*** 执行省级编码更改事件*/public void codeShengChange() {if (!"".equals(codeSheng)) {dimingShiList = cn.divisionCityInProvince(codeSheng);Jade j = new Jade();dimingList = j.query("select * from cn_address where addresscode like '" + codeSheng.substring(0, 2) + "__00'");dimingModel = new ListMapDataModel(dimingList, "addresscode");j.commit();}}/*** 执行市级编码更改事件*/public void codeShiChange() {if (!"".equals(codeShi)) {dimingXianList = cn.divisionCountyInCity(codeShi);Jade j = new Jade();dimingList = j.query("select * from cn_address where addresscode like '" + codeShi.substring(0, 4) + "__'");dimingModel = new ListMapDataModel(dimingList, "addresscode");j.commit();}}public void codeXianChange() {if (!"".equals(codeXian)) {}}public String getCodeShi() {return codeShi;}public void setCodeShi(String codeShi) {this.codeShi = codeShi;}public List<Map> getDimingShengList() {return dimingShengList;}public void setDimingShengList(List<Map> dimingShengList) {this.dimingShengList = dimingShengList;}public List<Map> getDimingShiList() {return dimingShiList;}public void setDimingShiList(List<Map> dimingShiList) {this.dimingShiList = dimingShiList;}public List<Map> getDimingXianList() {return dimingXianList;}public void setDimingXianList(List<Map> dimingXianList) {this.dimingXianList = dimingXianList;}public Map getDimingMap() {return dimingMap;}public void setDimingMap(Map dimingMap) {this.dimingMap = dimingMap;}public Map getDimingSelected() {return dimingSelected;}public void setDimingSelected(Map dimingSelected) {this.dimingSelected = dimingSelected;}public List<Map> getDimingList() {return dimingList;}public void setDimingList(List<Map> dimingList) {this.dimingList = dimingList;}public ListMapDataModel getDimingModel() {return dimingModel;}public void setDimingModel(ListMapDataModel dimingModel) {this.dimingModel = dimingModel;}/*** 导入中国大陆的行政区划** @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;}/*** 查询所有的地名记录** @return null 导航到指定的页面,null值代表返回当前的页面*/public String queryDiming() {Jade j = new Jade();dimingList = j.query("select * from cn_address");dimingModel = new ListMapDataModel(dimingList, "addresscode");j.commit();return null;}/*** 查询省的记录** @return null 导航到指定的页面,null值代表返回当前的页面*/public String queryDimingSheng() {Jade j = new Jade();dimingList = j.query("select * from cn_address where addresscode like '__0000'");dimingModel = new ListMapDataModel(dimingList, "addresscode");j.commit();return null;}/*** 查询县的记录** @return null 导航到指定的页面,null值代表返回当前的页面*/public String queryDimingXian() {String sql = "select * from cn_address where addresscode like '__0000'";if (!"".equals(this.codeShi)) {sql = "select * from cn_address where addresscode like '" + codeShi.substring(0, 4) + "__'";} else if (!"".equals(this.codeSheng)) {sql = "select * from cn_address where addresscode like '" + codeSheng.substring(0, 2) + "__00'";}Jade j = new Jade();dimingList = j.query(sql);dimingModel = new ListMapDataModel(dimingList, "addresscode");j.commit();return null;}/*** 初始化省的记录*/private void init() {queryDimingSheng();dimingShengList = cn.divisionProvince();}/*** 执行编辑操作** @param event 数据模型行编辑事件*/public void onEdit(RowEditEvent event) {Map m = (Map) event.getObject();Record r = new Record();Map dm = r.one(this.dimingList, "addresscode", m.get("addresscode"));Jade j = new Jade();j.save("cn_address", dm);Boolean isusing = (Boolean) dm.get("isusing");String c = (String) dm.get("addresscode");if (isusing) {if (c.endsWith("0000")) {j.update("update cn_address set isusing='1' where addresscode like '" + c.substring(0, 2) + "____'");} else if (c.endsWith("00")) {j.update("update cn_address set isusing='1' where addresscode like '" + c.substring(0, 2) + "0000'");j.update("update cn_address set isusing='1' where addresscode like '" + c.substring(0, 4) + "__'");} else {j.update("update cn_address set isusing='1' where addresscode like '" + c.substring(0, 2) + "0000'");//更新省j.update("update cn_address set isusing='1' where addresscode like '" + c.substring(0, 4) + "00'");//更新市j.update("update cn_address set isusing='1' where addresscode like '" + c + "'");//更新县}} else {if (c.endsWith("0000")) {j.update("update cn_address set isusing='0' where addresscode like '" + c.substring(0, 2) + "____'");} else if (c.endsWith("00")) {j.update("update cn_address set isusing='0' where addresscode like '" + c.substring(0, 2) + "0000'");j.update("update cn_address set isusing='0' where addresscode like '" + c.substring(0, 4) + "__'");} else {j.update("update cn_address set isusing='0' where addresscode like '" + c.substring(0, 2) + "0000'");j.update("update cn_address set isusing='0' where addresscode like '" + c.substring(0, 4) + "00'");j.update("update cn_address set isusing='0' where addresscode like '" + c + "'");}}j.commit();FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("成功", "修改记录成功!"));}/*** 取消编辑操作** @param event 数据模型行编辑事件*/public void onCancel(RowEditEvent event) {FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("已经取消修改操作!"));}
}

附件3:cn_address.xhtml

<?xml version='1.0' encoding='GBK' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"template="./IndexTemplate.xhtml"xmlns:p="http://primefaces.org/ui"xmlns:f="http://java.sun.com/jsf/core"xmlns:c="http://java.sun.com/jsp/jstl/core"xmlns:h="http://java.sun.com/jsf/html"><ui:define name="content"><h:form id="form"><p:tabView id="tv" widgetVar="tv" dynamic="true"><p:tab title="中国大陆行政区划管理"><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:ajax event="rowEdit" listener="#{addressBean.onEdit}" update=":form:tv:addressDataTable :bottomForm:bottomGrowl" />  <p:ajax event="rowEditCancel" listener="#{addressBean.onCancel}" update=":form:tv:addressDataTable :bottomForm:bottomGrowl" />  <p:column headerText="序号" style="width:5%;text-align: center;"> #{i+1} </p:column><p:column headerText="编号" style="width:8%;text-align: center;" sortBy="#{m.addresscode}" >#{m.addresscode} </p:column>  <p:column headerText="标准名称" style="width:15%;" sortBy="#{m.addressname}" >#{m.addressname} </p:column>  <p:column headerText="中文标签" style="width:8%;" sortBy="#{m.labelcn}"><p:cellEditor><f:facet name="output"><h:outputText value="#{m.labelcn}" style="width:90%;"/></f:facet><f:facet name="input"><p:inputText value="#{m.labelcn}" size="16"/></f:facet></p:cellEditor></p:column>   <p:column headerText="英文标签" style="width:8%;" sortBy="#{m.labelen}"><p:cellEditor><f:facet name="output"><h:outputText value="#{m.labelen}" style="width:90%;"/></f:facet><f:facet name="input"><p:inputText value="#{m.labelen}" size="16"/></f:facet></p:cellEditor></p:column>   <p:column headerText="经度" style="width:8%;" sortBy="#{m.longitude}"><p:cellEditor><f:facet name="output"><h:outputText value="#{m.longitude}" style="width:90%;"/></f:facet><f:facet name="input"><p:inputText value="#{m.longitude}" size="8"/></f:facet></p:cellEditor></p:column>   <p:column headerText="纬度" style="width:8%;" sortBy="#{m.latitude}"><p:cellEditor><f:facet name="output"><h:outputText value="#{m.latitude}" style="width:90%;"/></f:facet><f:facet name="input"><p:inputText value="#{m.latitude}" size="8"/></f:facet></p:cellEditor></p:column>   <p:column headerText="是否使用" style="width:5%;"><p:cellEditor><f:facet name="output"><p:selectBooleanCheckbox value="#{m.isusing}" disabled="true"/> </f:facet><f:facet name="input"><p:selectBooleanCheckbox value="#{m.isusing}"/> </f:facet></p:cellEditor></p:column><p:column style="width:5%;text-align: center;"><p:rowEditor/></p:column><f:facet name="footer"><h:panelGrid style="width: 500px;text-align: left;" columns="6"  styleClass="my-grid"><p:commandButton style="float: left;" value="全部" action="#{addressBean.queryDiming}" icon="ui-icon-search" update="@form"/>  <p:commandButton style="float: left;" value="省级" action="#{addressBean.queryDimingSheng}" icon="ui-icon-search" update="@form"/>  <p:selectOneMenu style="float: left;width:140px;"  value="#{addressBean.codeSheng}">  <p:ajax update="@form" process="@this" listener="#{addressBean.codeShengChange}"/>  <f:selectItem itemValue="" itemLabel="--请选择省级--"/>  <c:forEach var="m" items="#{addressBean.dimingShengList}"><f:selectItem itemValue="#{m.addresscode}" itemLabel="#{m.addressname}"/>  </c:forEach> </p:selectOneMenu><p:selectOneMenu style="float: left;width:140px;"  value="#{addressBean.codeShi}">  <p:ajax update="@form" process="@this" listener="#{addressBean.codeShiChange}"/>  <f:selectItem itemValue="" itemLabel="--请选择市级--"/>  <c:forEach var="m" items="#{addressBean.dimingShiList}"><f:selectItem itemValue="#{m.addresscode}" itemLabel="#{m.addressname}"/>  </c:forEach> </p:selectOneMenu><p:commandButton style="float: left;" value="查询" action="#{addressBean.queryDimingXian}" icon="ui-icon-disk" update="@form"/>  </h:panelGrid></f:facet></p:dataTable>  <div style="padding:2px;"><p:spacer height="2"/></div></p:tab><p:tab title="初始化行政区划记录"><div  style="padding: 40px;text-align: center;"><p:commandButton style="float: left;" value="初始化地名" action="#{addressBean.reUpdateDiming}" icon="ui-icon-disk" update="@form :bottomForm:bottomGrowl"/>  </div></p:tab></p:tabView></h:form></ui:define></ui:composition>

JadePool应用范例:实现中国行政区划管理相关推荐

  1. JadePool应用范例:创建China软件项目

    为了帮助用户更好地认识JadePool,这里将推出系列基础性实用型JadePool应用范例.首先推出的是China软件项目. China软件项目主要包括以下五个部分: 1.中国行政区划 2.中国名族 ...

  2. CnOpenData中国行政区划shp数据

    一.数据简介   中国行政区划数据是重要的基础地理信息数据,目前不同来源的全国行政区划数据非常多,但能够开放获取的高质量行政区域数据少之又少.基于此,锐多宝的地理空间制作一套2013-2023年可开放 ...

  3. UIR软件--高校ERP的升级版、中国高校管理的首选软件

    UIR软件--高校ERP的升级版.中国高校管理的首选软件     软件名称:University Information Rising(高校信息升级,简称:UIR)      国家版权局计算机软件著作 ...

  4. 中国光纤管理解决方案市场发展分析及十四五规划咨询建议报告2022年版

    中国光纤管理解决方案市场发展分析及十四五规划咨询建议报告2022年版 +  [报告目录]:   正文目录    2 图表目录    7 1 光纤管理解决方案市场概述    10 1.1 产品定义及统计 ...

  5. 中国体重管理饮料市场趋势报告、技术动态创新及市场预测

    体重管理饮料市场的企业竞争态势 该报告涉及的主要国际市场参与者有The Coca Cola.PepsiCo.Unilever.The Procter & Gamble.Alticor (Amw ...

  6. 2021-2025年中国打印管理软件行业市场供需与战略研究报告

    打印管理软件市场的企业竞争态势 该报告涉及的主要国际市场参与者有PrinterLogic.Pharos Systems.Nuance.PrintManager.Epson.Canon.Xerox.HP ...

  7. 2022-2028全球与中国业务流程管理(BPM)服务市场现状及未来发展趋势

    [报告篇幅]:111 [报告图表数]:144 [报告出版时间]:2022年2月 报告摘要 本文研究全球及中国市场业务流程管理(BPM)服务现状及未来发展趋势,侧重分析全球及中国市场的主要企业,同时对比 ...

  8. 中国XXXXXXXXXXXXX管理软件销售实施三部曲

    中国XXXXXXXXXXXXX牛B 管理软件销售实施服务一条龙 分三部分走: 第一步:卖软件 & 客户的艳阳天 卖软件前,销售的嘴巴像屁股绽放般,见过狗没??没见过的话,只能在签约前才能见到的 ...

  9. 2019年中国PPP管理库全项目数据

    数据集名称:中国PPP管理库全项目数据(共9千余条) 时间范围:2019年 数据来源:国家统计局 相关说明:截至2019年11月7日,包含字段:项目名称.省.市.县/区.一级行业.二级行业.项目总投资 ...

最新文章

  1. 敏捷开发:如何通过回顾保持学习状态
  2. 基于 Kafka + Flink + Redis 的电商大屏实时计算案
  3. rgb值转换成16进制
  4. HTML5中Web Worker技术的使用实例
  5. sys.modules[__name__]的一个实例
  6. Java的异常跟踪栈
  7. Spring中 BeanFactory 与 FactoryBean 的区别
  8. java隔一个逗号读入文件_将逗号分隔的文本文件读入HashMap,其中文件在多行Java中具有相同的键...
  9. postgresql 数据库连接数查询
  10. 数学建模安装matlab,数学建模神器——Matlab下载安装教程
  11. Windows移动热点服务
  12. win 10计算机服务,win10 怎么打开服务_win10打开系统服务的3种方法
  13. 电脑上既好看又好用的便签软件推荐
  14. 1155 服务器芯片组,2014年主流主板芯片组分析
  15. CTF 内涵的软件 stage1
  16. java斗地主发牌教学,命令行版的斗地主你玩过没?
  17. webstorm2019 汉化后无法设置 webstorm最新汉化包
  18. Windows Server 2003 R2 简体中文企业版(32位)
  19. python天气数据分析论文_关于Python爬取天气数据的实例详解内容
  20. 腾讯微博android sdk,腾讯微博java(android)sdk新增微博api详细介绍

热门文章

  1. 邮件服务器(eas)找不到服务器,Outlook2013无法配置qq邮箱exchange ActiveSync类型的解决方法...
  2. 编程练习:编写一个函数,用于计算某长方形面积的函数
  3. Hive 高级篇(调优)
  4. HDU - 1173 采矿
  5. 搭建基于DataX的可视化界面
  6. MVCC和快照读丶当前读
  7. 移动硬盘怎么连接服务器,无线路由器加USB硬盘组建属于自己的FTP服务器的方法 隐者黑鹰...
  8. 汽油后面跟的90#、93#、95#、97#是什么意思
  9. android app防止锁屏_Android 禁止屏幕休眠和锁屏的方法
  10. python小游戏经典猫和老鼠