[原创于: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>
分享到:
相关推荐
Seam,全称为JBoss Seam,是一款基于Java EE 5的技术栈构建的应用框架。它通过整合JSF(JavaServer Faces)与EJB 3.0(Enterprise JavaBeans 3.0)组件,并充分利用JDK 5.0中的注解技术,为开发人员提供了构建复杂...
Seam的这种全栈式框架特性使得它可以隐藏这些底层实现,减轻了开发者的负担。 另外,Seam对第三方框架的集成深度令人印象深刻。除了基础的邮件服务、工作流支持,Seam还能够轻松整合其他工具和库,如EJB、JMS、WS等...
Seam框架是一个全面的Java企业级开发框架,它在2005年由JBoss公司推出,主要用于简化Java EE应用的复杂性,特别是整合了JSF(JavaServer Faces)、EJB、CDI(Contexts and Dependency Injection)等技术。Seam框架的...
它是基于Seam 2.1版本编写的,旨在帮助读者深入了解Seam框架的工作原理及其在Java EE环境中的应用。本书不仅涵盖了Seam框架的核心概念和技术细节,还提供了大量实际案例和最佳实践,使读者能够快速上手并构建高质量...
Seam Carving实现图像的重定位——计算机图像与图形技术大作业 其中,实验部分包含以下的实验及结果: 图像剪裁:将原图像剪裁为指定尺寸,并保持主体内容完整且比例正常。 2.图像重定向(Retarget):将原图像...
例如,Seam可以自动管理Hibernate的Session,提供事务控制,以及实现基于注解的实体管理和查询。 JavaServer Faces (JSF) 是一种用于构建Web用户界面的MVC(模型-视图-控制器)框架。JSF组件库强大,可帮助开发者...
3. **权限验证**:Seam 包含一个广泛适用的权限验证框架,支持基于角色的访问控制(RBAC)、持久化权限设置以及规则驱动的权限决策。这使得开发者可以根据业务逻辑创建自定义的安全策略。 4. **权限管理**:Seam ...
本文将深入探讨一个基于Seam的DataTable全选解决方案,以帮助开发者更高效地处理用户选择数据的需求。 首先,DataTable全选功能通常涉及到用户界面交互和后端数据处理两部分。在用户界面上,全选按钮可以作为一个复...
课程设计基于C++实现Seam Carving图像缩放算法源码+实验报告.zip课程设计基于C++实现Seam Carving图像缩放算法源码+实验报告.zip课程设计基于C++实现Seam Carving图像缩放算法源码+实验报告.zip课程设计基于C++实现...
Seam Carving是一种图像处理技术,能够在不损害图像重要特征的前提下,实现图像的智能缩放。其核心在于通过能量梯度函数来选择插入或删除的裁切线,从而获取图像重要特征能量的最小通道,保证图像重要特征在缩放过程...
Seam Carving是一种基于能量的图像缩放技术,由Ariel Shamir和Shai Avidan在2007年提出。它的核心思想是找出图像中的一条或多条“能量最低”的路径(seam),沿着这些路径删除或添加像素,从而实现图像的等比例或非...
JBoss Seam是一个开源的应用框架,它基于Java EE标准,但通过引入一系列创新特性,极大地简化了企业级应用的开发过程。Seam框架主要针对Web应用的构建,它将各种Java EE技术如JSF(JavaServer Faces)、EJB...
### Seam 框架知识点详解 #### 一、Seam框架概述 - **定义与特点**:Seam是一个建立在Java EE平台上的快速应用开发框架,它极大地简化了企业级应用的开发流程。通过整合一系列Java EE技术如JSF、EJB 3.0等,Seam...
- **“拉取”式MVC的使用**:这部分介绍了如何利用Seam框架实现基于“拉取”式的模型视图控制器(MVC)模式。 - **可书签搜索结果页**:通过博客示例,解释了如何创建可被收藏的搜索结果页面。 - **在RESTful应用中...
《Seam in Action》是一本专门探讨Seam框架的书籍,该书分为中文和英文两个版本,对于初学者和有经验的开发者来说都是一个宝贵的资源。Seam是一个强大的Java EE框架,它集成了多种技术,如JavaServer Faces (JSF)、...
**使用JBoss Studio开发Seam框架项目图式教学** Seam框架是一款强大的Java EE集成框架,它简化了在企业级应用程序中的开发流程,特别是在使用EJB、JSF、CDI和JPA等技术时。而JBoss Studio是Red Hat公司推出的一款...
### 基于Seam2.1的最新力作《Seam Framework: Experience the Evolution of Java EE, 2nd Edition》摘要分析 #### 核心概念:Seam框架概述 Seam框架是一款革命性的Web应用开发框架,它将标准的Java EE技术与一系列...
JBoss Seam是一个开源的Java EE框架,它通过依赖注入和会话模型,简化了基于Java EE的企业级应用开发。Seam框架为开发者提供了一个集成化的环境,其中整合了多种技术规范,比如EJB3、JSF、JPA、SessionBean、MDB和...