一、实现目标

首先会有一个存放中国行政区域数据的一个txt文件,用java读取并解析出来,并在页面上通过下拉框的形式展示出来。实现效果如下图,当选择完省份后,在选择该省份下的城市,然后在选择该城市下的县区这样逐级显示:

二、代码实现:

1. 先创建一个javaBean,用来存放基本数据;

 public class Area {
private String code ;//行政编码
private String name;//名称
private int level;//行政级别 0:省/直辖市 1:地级市 2:县级市
private String parentCode;//上一级的行政区划代码 public Area() {
super();
} public Area(String code, String name, int level, String parentCode) {
super();
this.code = code;
this.name = name;
this.level = level;
this.parentCode = parentCode;
} public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getLevel() {
return level;
} public void setLevel(int level) {
this.level = level;
} public String getParentCode() {
return parentCode;
} public void setParentCode(String parentCode) {
this.parentCode = parentCode;
} public String toString(){
return "行政编码:"+this.getCode()+"\t名称:"+this.getName()+"\t行政级别:"+
this.getLevel()+"\t上一级的行政区划代码:" +this.getParentCode();
}
}

2. 然后创建一个读取txt资源文件的工具类;

 import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.***.Area; public class ReadAreaUtil { public List<Area> provinceList = new ArrayList<Area>();
public List<Area> townList = new ArrayList<Area>();
public List<Area> countyList = new ArrayList<Area>(); public Map<String,List<Area>> getAreaData(String path){
ReadAllArea(path);
Map<String,List<Area>> result = new HashMap<String,List<Area>>();
result.put("provinceList", provinceList);
result.put("townList", townList);
result.put("countyList", countyList.subList(1, countyList.size())); //去掉表头 return result ;
} public void ReadAllArea(String path){
String line = null;
BufferedReader reader = null;
File file = new File(path); String cityCode="";
String countyCode="";
try {
FileReader in = new FileReader(file);
reader = new BufferedReader(in);
//读取文件的每一行
while((line = reader.readLine())!=null){
String[] data = cutString(line); //处理读取的文件记录
if(isProvince(data[0])){
cityCode = data[0];
Area area = new Area(data[0], data[1], 0, "0");
provinceList.add(area);
}else if(isTown(data[0])){
countyCode =data[0];
Area area = new Area(data[0], data[1], 1, cityCode);
townList.add(area);
}else{
Area area = new Area(data[0], data[1], 2, countyCode);
countyList.add(area);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} //字符分割
public String[] cutString(String line){
String code="";
String name="";
code = line.substring(0, 6);
String lastStr = line.substring(7, line.length());
name = lastStr.substring(0, lastStr.indexOf("\t"));
String[] result = new String []{code,name};
return result;
} //判断是否省或者直辖市
public boolean isProvince(String code){
String last = code.substring(2);
if("0000".equalsIgnoreCase(last)){
return true;
}
return false;
}
//判断是否地级市
public boolean isTown(String code){
String last = code.substring(4);
if("00".equalsIgnoreCase(last)){
return true;
}
return false;
} }

3. 改项目使用了struts2,在action的方法中调用即可:

         //读txt数据...
String path = ServletActionContext.getServletContext().getRealPath("/2015Area.txt");
Map<String,List<Area>> area = new ReadAreaUtil().getAreaData(path);
List<Area> provinceList = area.get("provinceList");
ServletActionContext.getRequest().setAttribute("prlist", provinceList);

4. JSP页面上的html,第一个select是直接遍历的,但是后面两个就要根据前面select选中的来动态显示了,这里需要用到jQuery的Ajax;

 <div id="areaDiv" >
<a >省份:
<select id="sel_province" name="" >
<option value="-1" >-请选择-</option>
<c:forEach var="pro" items="${prlist }">
<option value="${pro.code }" >${pro.name }</option>
</c:forEach>
</select>
</a>&nbsp;&nbsp;
<a class="wsy_f14">城市/区:
<select id="sel_town" name="" >
<option value="-1" >-----</option>
</select>
</a>&nbsp;&nbsp;
<a class="wsy_f14">县级:
<select id="sel_county" name="" >
<option value="-1" >-----</option>
</select>
</a>
</div>

jQuery 代码,select标签变化时触发函数并发送post请求数据;

 $(document).ready(function(){
$('#sel_province').change(function(){
var code = $(this).children('option:selected').val();//selected的值
$.post("${basePath}ajax/filterArea.action",
{
parentCode:code,
areaType:1//0省,1市,2县
},
function(data){
$("#sel_town").html(data);
});
}); $('#sel_town').change(function(){
var code = $(this).children('option:selected').val();//selected的值
$.post("${basePath}ajax/filterArea.action",
{
parentCode:code,
areaType:2//0省,1市,2县
},
function(data){
$("#sel_county").html(data);
});
});
});

5. struts如何处理Ajax请求,专门写一个action用于处理ajax请求;

strut.xml:

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="ajax" namespace="/ajax" extends="json-default">
<action name="filterArea" method="filterArea" class="com.llw.action.AjaxFilter"></action>
</package>
</struts>

action:

 public class AjaxFilter extends ActionSupport {

     //行政区域过滤
private String parentCode ;
private int areaType ;
public String getParentCode() {
return parentCode;
}
public void setParentCode(String parentCode) {
this.parentCode = parentCode;
}
public int getAreaType() {
return areaType;
}
public void setAreaType(int areaType) {
this.areaType = areaType;
} public void filterArea(){
String htmlStr = "<option value=\"-1\">-请选择-</option>" ; String path = ServletActionContext.getServletContext().getRealPath("/2015Area.txt");
Map<String,List<Area>> area = new ReadAreaUtil().getAreaData(path);
List<Area> areaList = null ;
if(areaType==1){ //0省,1市,2县
areaList = area.get("townList");
}else if(areaType==2){
areaList = area.get("countyList");
}
if(areaList!=null && areaList.size()>0 && parentCode!=null){
for(Area a : areaList){
if(parentCode.equals(a.getParentCode())){
htmlStr += "<option value=\""+a.getCode()+"\">"+a.getName()+"</option>" ;
}
}
} // System.out.println("xxxxx"+htmlStr);
HttpServletResponse response = ServletActionContext.getResponse();
PrintWriter writer = null;
try {
writer = response.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
writer.print(htmlStr);
writer.flush();
writer.close();
} }

三、总结:以上基本完成了需要的效果,用java读取txt资源文件,并封装到List里面,上面代码中把不同级别的数据放到不同的list里了,也可以放到同一个list里面,这个根据自己需要可以去修改;然后是通过Ajax方式动态逐级显示select展示的内容;并演示了strut中如何处理ajax请求。上面展示了其中一种strut处理ajax请求的方式,还有另外一中方式,跟普通action的原理类似,就是通过action里定义的成员变量,JS里的回调函数访问这些成员变量;

这里贴一下第二种方式的使用例子:

strut.xml:
<action name="testAjax" class="com.crm.action.Ajaxcustomer" method="sayHello">
<result type="json" name="success"></result>
</action> action:
public class AjaxFilter extends ActionSupport {
private int type;
private String phone;
private Map<String,Object> map ;
//…get/set方法这里省略 public String sayHello(){
map = new HashMap<String, Object>();
map.put("aaa", "abc"); return SUCCESS;
}
} JS:
function test(){
$.post("ajax/testAjax.action",//请求目标
{
type:1,
phone:$("#phone").val() },
function(data) {//回调函数
alert(data.map.aaa);
$("#lia1").html(data.map.paramNum);//设置页面标签值
});
}

四、说明:以上java读取txt资源文件的方法来自网络整理修改,后面的内容是项目中实际应用,现记以温之;

java解析中国行政区域并在页面显示实现动态逐级筛选的更多相关文章

  1. python解析git log后生成页面显示git更新日志信息

    使用git log可以查到git上项目的更新日志. 如下两个git项目,我想把git的日志信息解析成一个便于在浏览器上查看的页面. https://github.com/gityf/lua https ...

  2. Java解析Excel之应用Reflection等技术实现动态读取

    目录树 背景 技术选型 问题分析 技术要点及难点分析 源码分析 测试用例 背景 Tip:因为产品提的需求我都开发完了,进行了项目提测:前天老大走过来说:你用spring-boot开发一个解析Excel ...

  3. 解析中国天气网页面获取七日天气 (Java, Python)

    说明 解析中国天气网的页面,获取七日天气. 使用 htmlparser .这是它的 API 文档. 代码 SevenDayWeather.java import java.io.BufferedRea ...

  4. XML与web开发-01- 在页面显示和 XML DOM 解析

    前言: 关于 xml 特点和基础知识,可以菜鸟教程进行学习:http://www.runoob.com/xml/xml-tutorial.html 本系列笔记,主要介绍 xml 在 web 开发时需要 ...

  5. MiseringThread.java 解析页面线程

    MiseringThread.java 解析页面线程 http://injavawetrust.iteye.com package com.iteye.injavawetrust.miner; imp ...

  6. MinerUrl.java 解析页面后存储URL类

    MinerUrl.java 解析页面后存储URL类 package com.iteye.injavawetrust.miner; /** * 解析页面后存储URL类 * @author InJavaW ...

  7. `<jsp:getProperty>`动作和`<jsp:setProperty>`动作的使用在一个静态页面填写图书的基本信息,页面信息提交给其他页面,并且在其页面显示。要去将表单元素的值赋值给Java

    <jsp:getProperty>动作和<jsp:setProperty>动作的使用 1.<jsp:getProperty>动作 语法格式: <jsp:get ...

  8. 纯JS实现中国行政区域上下联动选择地址

    一.实现目的: 如标题所述,通过JS来实现地址的选取,上一篇博客介绍的方式是通过java读取txt资源文件来实现地址的选择,通过ajax方式访问服务器实现省市区联动.此篇中将介绍如何使用JS实现相同功 ...

  9. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

随机推荐

  1. excel2003出现“向程序发送命令时出现错误”解决方法

    电脑已经预装了office2010,因为想要学习 <Excel 图标之道>,安装了Excel2003,刚刚安装好,打开出现“向程序发送命令时出现错误”,虽然点击确定就可以用了,可总是觉得不 ...

  2. android 评分条 RatingBar 使用及自定义

    一.先上效果图片: 第一个是自定义: 第二个是原生的: 二.atingBar 介绍: RatingBar是基于SeekBar和ProgressBar的扩展,用星型来显示等级评定.使用RatingBar ...

  3. 关于ckeditor ajax提交到后台 问题

    ckeditor 提交时 如果有带有html时是提交不了的 解决办法就是 你在提交的时候 将ckeditor获取的只编码(encodeURI) 然后在传到后台提交的时候 在解码 就ok了 ckname ...

  4. HTTP 错误500.19 -Internal Server Error 错误代码 0x80070021

    转自:http://blog.csdn.net/goux_s/article/details/5676689 错误摘要 HTTP 错误500.19 -Internal Server Error 无法访 ...

  5. NK3C框架(MyBatis、Durid)连接SQL Server

    NK3C框架连接SQL Server修改配置如下: 1.添加POM引用 <sqlserver.driver.version>4.0</sqlserver.driver.version ...

  6. CXF发布webService服务以及客户端调用

    这篇随笔内容是CXF发布webService服务以及客户端调用的方法 CXF是什么? 开发工作之前需要下载CXF和安装 下载地址:http://cxf.apache.org 安装过程: <1&g ...

  7. JS定时程序,设定一个一直刷新,又时间间隔的js,读取当前的时间并显示

    <!doctype html><html><head><meta charset="utf-8"><title>无标题文 ...

  8. R语言获取国内的股票数据

    quantmod 包默认是访问 yahoo finance 的数据,其中包括上证和深证的股票数据,还有港股数据. 上证代码是 ss,深证代码是 sz,港股代码是 hk 例如苏宁云商 setSymbol ...

  9. 多媒体(1):MCI接口编程

    目录 多媒体(1):MCI接口编程 多媒体(2):WAVE文件格式分析 多媒体(3):基于WindowsAPI的视频捕捉卡操作 多媒体(4):JPEG图像压缩编码 多媒体(1):MCI接口编程

  10. 最新的hosts

    # Copyright (c) 2014-2016, racaljk.# https://github.com/racaljk/hosts# Last updated: 2016-07-03 # Th ...