`
happylo
  • 浏览: 47198 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

基于Seam框架实现省、市、区县的联动选择

阅读更多

[原创于:http://happydev.iteye.com]

 

要实现省、市、区县的联动选择有两种方案:

一种是将省市区县的所有数据给到客户端由浏览器用js来控制选择和显示,但数据量太大,会导致页面太大,所以这种方案不可取;

二是用Ajax来实现联动选择,本文给出的就是在Seam框架下的基于ajax省、市、区县的联动选择实现。

 

一、准备好省、市、区县的所有数据,并提供相关访问组件

 

省、市、区县的所有数据见附件。

省、市、区县的访问组件类:

 

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

@Name("locationUtil")
@Scope(ScopeType.APPLICATION)
@AutoCreate
public class LocationUtil {
	private ArrayList<String> provinces = new ArrayList<String>();
	private Map<String, ArrayList<String>> map_cities = new HashMap<String, ArrayList<String>>();
	private Map<String, ArrayList<String>> map_districts = new HashMap<String, ArrayList<String>>();
	private Map<String, String> map_pid = new HashMap<String, String>();
	private Map<String, String> map_cid = new HashMap<String, String>();
	
	/**
	 * 取得所有省份数据
	 * @return
	 */
	public ArrayList<String> getProvinces(){
		return provinces;
	}
	/**
	 * 根据省取得所有市数据
	 * @param province
	 * @return
	 */
	public ArrayList<String> getCities(String province){
		return map_cities.get(province);
	}
	/**
	 * 根据市取得所有区县数据
	 * @param city
	 * @return
	 */
	public ArrayList<String> getDistricts(String city){
		return map_districts.get(city);
	}
	public Collection<String> getAllCities(){
		return map_cid.values();
	}
	
	@Create
	public void init(){
		SAXReader reader = new SAXReader(); 
		try {
			Document docDistricts = reader.read(this.getClass().getResourceAsStream("Districts.xml"));
			Document docCities = reader.read(this.getClass().getResourceAsStream("Cities.xml"));
			Document docProvinces = reader.read(this.getClass().getResourceAsStream("Provinces.xml"));
			for (Iterator<Element> i = docProvinces.getRootElement().elementIterator("Province"); i.hasNext();) {
				Element e = i.next(); 
				provinces.add(e.getText());
				map_pid.put(e.attributeValue("ID"), e.getText());
			}
			for (Iterator<Element> i = docCities.getRootElement().elementIterator("City"); i.hasNext();) {
				Element e = i.next(); 
				map_cid.put(e.attributeValue("ID"), e.getText());
				String pName = map_pid.get(e.attributeValue("PID"));
				ArrayList<String> list = map_cities.get(pName);
				if (list == null){
					list = new ArrayList<String>();
					map_cities.put(pName, list);
				}
				list.add(e.getText());
			}
			for (Iterator<Element> i = docDistricts.getRootElement().elementIterator("District"); i.hasNext();) {
				Element e = i.next(); 
				String cName = map_cid.get(e.attributeValue("CID"));
				ArrayList<String> list = map_districts.get(cName);
				if (list == null){
					list = new ArrayList<String>();
					map_districts.put(cName, list);
				}
				list.add(e.getText());
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
	
	
}

 

 

二、业务层代码

 

@Name("entProfileHome")
public class EntProfileHome extends EntityHome<EntProfile> {

	
	/**
	 * 定义一个临时的数据实体,以免在省、市、区县联动选择时对实际数据造成干扰
	 */
	private EntProfile temp;
	
	/**
	 * 省份被选择修改后的ajax事件动作,清空已关联的市和县区数据
	 */
	public void changeProvince(){
		temp.setCity(null);
		temp.setDistrict(null);
	}
	/**
	 * 市被选择修改后的ajax事件动作,清空已关联的县区数据
	 */
	public void changeCity(){
		temp.setDistrict(null);
	}
	
	public void startEdit(){
		temp = new EntProfile();
......
		temp.setProvince(getInstance().getProvince());
		temp.setCity(getInstance().getCity());
		temp.setDistrict(getInstance().getDistrict());
......
		
	}
	
	public void updateEdit(){
......
		getInstance().setProvince(temp.getProvince());
		getInstance().setCity(temp.getCity());
		getInstance().setDistrict(temp.getDistrict());
......
		
		update();
		temp = null;
	}
	
	@Override
	@Begin
	public void create() {
		super.create();
	}

	public EntProfile getTemp() {
		return temp;
	}
	public void setTemp(EntProfile temp) {
		this.temp = temp;
	}
	

}

 

 

 

三、选择页面

 

			<s:decorate template="/layout/edit.xhtml">
				<ui:define name="label">选择地点</ui:define>
				<h:selectOneMenu required="false" value="#{entProfileHome.temp.province}">
					<s:selectItems noSelectionLabel="-请选择省份-" value="#{locationUtil.provinces}" var="item" label="#{item}" />
					<a4j:support event="onchange" actionListener="#{entProfileHome.changeProvince}" reRender="citySel,districtSel"/>
				</h:selectOneMenu>
				<h:selectOneMenu id="citySel" required="false" value="#{entProfileHome.temp.city}">
					<s:selectItems noSelectionLabel="-请选择城市-" value="#{locationUtil.getCities(entProfileHome.temp.province)}" var="item" label="#{item}" />
					<a4j:support event="onchange" actionListener="#{entProfileHome.changeCity}" reRender="register,districtSel"/>
				</h:selectOneMenu>
				<h:selectOneMenu id="districtSel" required="false" value="#{entProfileHome.temp.district}">
					<s:selectItems noSelectionLabel="-请选择区-" value="#{locationUtil.getDistricts(entProfileHome.temp.city)}" var="item" label="#{item}" />
				</h:selectOneMenu>
			</s:decorate>

 

 

 

 

 

分享到:
评论
1 楼 cqzs19871202 2009-12-29  
http://1.zhulu.com/share.seam?inviter=ff8080812472cb7a01247703f51336d2

相关推荐

    Seam框架文档简述

    Seam,全称为JBoss Seam,是一款基于Java EE 5的技术栈构建的应用框架。它通过整合JSF(JavaServer Faces)与EJB 3.0(Enterprise JavaBeans 3.0)组件,并充分利用JDK 5.0中的注解技术,为开发人员提供了构建复杂...

    Seam_Java框架.doc

    Seam的这种全栈式框架特性使得它可以隐藏这些底层实现,减轻了开发者的负担。 另外,Seam对第三方框架的集成深度令人印象深刻。除了基础的邮件服务、工作流支持,Seam还能够轻松整合其他工具和库,如EJB、JMS、WS等...

    seam框架相关知识总结

    Seam框架是一个全面的Java企业级开发框架,它在2005年由JBoss公司推出,主要用于简化Java EE应用的复杂性,特别是整合了JSF(JavaServer Faces)、EJB、CDI(Contexts and Dependency Injection)等技术。Seam框架的...

    基于Seam2.1的最新力作《Seam Framework: Experience the Evolution of Java EE, 2nd Edition》全书

    它是基于Seam 2.1版本编写的,旨在帮助读者深入了解Seam框架的工作原理及其在Java EE环境中的应用。本书不仅涵盖了Seam框架的核心概念和技术细节,还提供了大量实际案例和最佳实践,使读者能够快速上手并构建高质量...

    基于Seam Carving实现图像的重定位-计算机图像与图形技术大作业

    Seam Carving实现图像的重定位——计算机图像与图形技术大作业 其中,实验部分包含以下的实验及结果: 图像剪裁:将原图像剪裁为指定尺寸,并保持主体内容完整且比例正常。 2.图像重定向(Retarget):将原图像...

    seam 框架整合hibernate+jsf

    例如,Seam可以自动管理Hibernate的Session,提供事务控制,以及实现基于注解的实体管理和查询。 JavaServer Faces (JSF) 是一种用于构建Web用户界面的MVC(模型-视图-控制器)框架。JSF组件库强大,可帮助开发者...

    Seam 2.1 安全模块框架

    3. **权限验证**:Seam 包含一个广泛适用的权限验证框架,支持基于角色的访问控制(RBAC)、持久化权限设置以及规则驱动的权限决策。这使得开发者可以根据业务逻辑创建自定义的安全策略。 4. **权限管理**:Seam ...

    基于seam的datatable全选解决方案

    本文将深入探讨一个基于Seam的DataTable全选解决方案,以帮助开发者更高效地处理用户选择数据的需求。 首先,DataTable全选功能通常涉及到用户界面交互和后端数据处理两部分。在用户界面上,全选按钮可以作为一个复...

    课程设计基于C++实现Seam Carving图像缩放算法源码+实验报告.zip

    课程设计基于C++实现Seam Carving图像缩放算法源码+实验报告.zip课程设计基于C++实现Seam Carving图像缩放算法源码+实验报告.zip课程设计基于C++实现Seam Carving图像缩放算法源码+实验报告.zip课程设计基于C++实现...

    基于Seam Carving和深度学习的车标识别系统研究与实现.pdf

    Seam Carving是一种图像处理技术,能够在不损害图像重要特征的前提下,实现图像的智能缩放。其核心在于通过能量梯度函数来选择插入或删除的裁切线,从而获取图像重要特征能量的最小通道,保证图像重要特征在缩放过程...

    MATLAB_Seam_Carving_seamcarving_

    Seam Carving是一种基于能量的图像缩放技术,由Ariel Shamir和Shai Avidan在2007年提出。它的核心思想是找出图像中的一条或多条“能量最低”的路径(seam),沿着这些路径删除或添加像素,从而实现图像的等比例或非...

    JBoss Seam

    JBoss Seam是一个开源的应用框架,它基于Java EE标准,但通过引入一系列创新特性,极大地简化了企业级应用的开发过程。Seam框架主要针对Web应用的构建,它将各种Java EE技术如JSF(JavaServer Faces)、EJB...

    seam in action

    ### Seam 框架知识点详解 #### 一、Seam框架概述 - **定义与特点**:Seam是一个建立在Java EE平台上的快速应用开发框架,它极大地简化了企业级应用的开发流程。通过整合一系列Java EE技术如JSF、EJB 3.0等,Seam...

    seam_reference英文文档,讲解Seam更详细

    - **“拉取”式MVC的使用**:这部分介绍了如何利用Seam框架实现基于“拉取”式的模型视图控制器(MVC)模式。 - **可书签搜索结果页**:通过博客示例,解释了如何创建可被收藏的搜索结果页面。 - **在RESTful应用中...

    seam in action 中文 english

    《Seam in Action》是一本专门探讨Seam框架的书籍,该书分为中文和英文两个版本,对于初学者和有经验的开发者来说都是一个宝贵的资源。Seam是一个强大的Java EE框架,它集成了多种技术,如JavaServer Faces (JSF)、...

    使用JBoss Studio開發Seam框架專案(圖式教學)

    **使用JBoss Studio开发Seam框架项目图式教学** Seam框架是一款强大的Java EE集成框架,它简化了在企业级应用程序中的开发流程,特别是在使用EJB、JSF、CDI和JPA等技术时。而JBoss Studio是Red Hat公司推出的一款...

    Jboss seam3 实战

    JBoss Seam是一个开源的Java EE框架,它通过依赖注入和会话模型,简化了基于Java EE的企业级应用开发。Seam框架为开发者提供了一个集成化的环境,其中整合了多种技术规范,比如EJB3、JSF、JPA、SessionBean、MDB和...

    Matlab实现SeamCarving算法 放大缩小图片(包含GUI)

    4. **GUI界面**:在Matlab中实现的SeamCarving算法可能包含一个图形用户界面(GUI),用户可以通过选择放大或缩小操作,并输入调整的像素数,直观地看到处理前后的效果。GUI设计通常包括按钮、滑动条和图像显示区。 ...

Global site tag (gtag.js) - Google Analytics