在JSF中使用依赖级联选择框
作者: Chris http://jroller.com/page/cschalk?entry=building_dependent_select_menus_in
翻译: icess http://blog.matrix.org.cn/page/icess
在web程序中,有时候需要管理的选择按钮,(译者注:如注册qq号码时候选择省份和地区,地区是根据省份的不同来动态变化的) 在jsf中实现这种选择按钮可以有多种方式(译者注:现在使用ajax4jsf可以实现更友好的组件),这里提供一个比较简单的实现.
Defining the HashMaps as managed beans
Faces提供了在配置文件中直接声明Lists和Maps 为managed bean的功能 .一旦在 faces-config.xml中定义, Faces apps就可以通过EL表达式来使用她了, 我们定义下面的Maps
CountriesMap - A Map of countries: France, United States, India.
该Map将驱动一些Maps: UsCitiesMap, FrCitiesMap and InCitiesMap.
当用户选择一个国家名,依赖的list将会根据国家名自动加载.
The HashMaps
CountriesMap
<managed-bean> <managed-bean-name>CountriesMap</managed-bean-name> <managed-bean-class>java.util.HashMap</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <map-entries> <map-entry> <key>France</key> <value>fr</value> </map-entry> <map-entry> <key>United States</key> <value>us</value> </map-entry> <map-entry> <key>India</key> <value>in</value> </map-entry> </map-entries> </managed-bean>
|
And the dependent city Maps..
UsCitiesMaps
<managed-bean> <managed-bean-name>UsCitiesMap</managed-bean-name> <managed-bean-class>java.util.HashMap</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <map-entries> <map-entry> <key>New York</key> <value>ny</value> </map-entry> <map-entry> <key>San Francisco</key> <value>sf</value> </map-entry> <map-entry> <key>Los Angeles</key> <value>la</value> </map-entry> </map-entries> </managed-bean>
|
FrCitiesMaps
<managed-bean> <managed-bean-name>FrCitiesMap</managed-bean-name> <managed-bean-class>java.util.HashMap</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <map-entries> <map-entry> <key>Paris</key> <value>ps</value> </map-entry> <map-entry> <key>Lyon</key> <value>ly</value> </map-entry> <map-entry> <key>Orlean</key> <value>ol</value> </map-entry> </map-entries> </managed-bean>
|
InCitiesMap
<managed-bean> <managed-bean-name>InCitiesMap</managed-bean-name> <managed-bean-class>java.util.HashMap</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <map-entries> <map-entry> <key>New Delhi</key> <value>nd</value> </map-entry> <map-entry> <key>Bangalore</key> <value>bl</value> </map-entry> <map-entry> <key>Calcutta</key> <value>cc</value> </map-entry> </map-entries> </managed-bean>
|
在选择国家以前为了显示一些提示,我们提供一个 EmptyCities Map
EmptyCitiesMap
<managed-bean> <managed-bean-name>EmptyCitiesMap</managed-bean-name> <managed-bean-class>java.util.HashMap</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <map-entries> <map-entry> <key>empty</key> <value>em</value> </map-entry> </map-entries> </managed-bean>
|
注意,这些Maps也可以从其他地方动态的建立和驱动,如数据库
下面的包含两个select menus的jsp代码.
<%@ page contentType="text/html;charset=windows-1252"%> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%> <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%> <f:view> <html> <head> <title>deplist</title> </head> <body> <h:form> <p> Country:<h:selectOneMenu onchange="submit()" binding="#{Deplist_backing.inputCountry}" > <f:selectItems value="#{CountriesMap}"/> </h:selectOneMenu> </p> <p> City:<h:selectOneMenu
binding="#{Deplist_backing.inputCity}"> <f:selectItems value="#{Deplist_backing.cities}"/> </h:selectOneMenu> </p>
</h:form>
</body> </html> </f:view> |
页面包含两个selectOneMenu 组件,和他们的子组件 selectItems 被绑定到faces配置文件中配置的#{CountriesMap} 中, 和一个依靠选择的国家名来改变的城市list #{Deplist_backing.cities} Deplist_backing 对象是一个 managed bean 代码如下:
package backing;
import java.util.Map;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding;
public class DepList {
HtmlSelectOneMenu inputCountry, inputCity;
// Method which returns the cities Map
// based on the value of inputCountry
public Map getCities() {
String cityMap = "";
if (inputCountry.getValue() != null) {
String countryKey = inputCountry.getValue().toString();
if (countryKey.equals("fr"))
cityMap = "FrCitiesMap";
else if (countryKey.equals("us"))
cityMap = "UsCitiesMap";
else if (countryKey.equals("in"))
cityMap = "InCitiesMap";
else
cityMap = "EmptyCitiesMap";
}
else {
cityMap = "EmptyCitiesMap";
}
cityMap = "#{" + cityMap + "}";
//retrieve correct cityMap and return
FacesContext context = FacesContext.getCurrentInstance( );
ValueBinding binding;
binding = context.getApplication().createValueBinding(cityMap);
return (Map) binding.getValue(context);
}
public void setInputCountry(HtmlSelectOneMenu inputCountry) {
this.inputCountry = inputCountry;
}
public HtmlSelectOneMenu getInputCountry() {
return inputCountry;
}
public void setInputCity(HtmlSelectOneMenu inputCity) {
this.inputCity = inputCity;
}
public HtmlSelectOneMenu getInputCity() {
return inputCity;
}
} |
注意getCities方法是如何检测是否inputCountry中有输入值,如果有意味着要根据选择的国家来加载城市Map. 这是通过访问managed bean中的city Map来完成的..
And finally the registration of the class Deplist as managed bean Deplist_backing.
<managed-bean>
<managed-bean-name>Deplist_backing</managed-bean-name>
<managed-bean-class>backing.DepList</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean> |
And that's it.. when you run the JSP page, you will be able to select the country first and then select the city name.
分享到:
相关推荐
在JSF(JavaServer Faces)框架中,三级联动通常指的是在一个表单中,有三个下拉列表,它们之间存在依赖关系。例如,在这里提到的场景中,是省、市、县三级联动,当用户在第一级(省份)选择一个选项时,第二级(城市...
在`faces-config.xml`文件中定义导航规则,或者在bean中使用`ExternalContext`进行导航。 8. **响应式设计**:确保你的页面在不同设备和屏幕尺寸上都能正常显示,可能需要应用CSS样式和媒体查询。 9. **测试与调试...
在Java EE项目中引入JSF框架,首先需要在`pom.xml`或`build.gradle`文件中添加对应的依赖。对于Maven项目,你可以添加以下依赖: ```xml <groupId>javax.faces <artifactId>javax.faces-api <version>2.3 ...
本文将详细讲解如何通过JSF来实现一个动态的三级级联下拉框,这在多层级关联的数据展示中非常有用,比如地区、城市、街道的选择。我们将使用Java后端和数据库来获取并传递这些数据。 首先,我们需要了解JSF的基本...
使用`<h:selectOneMenu>`标签开发级联选择涉及前端和后端的交互,理解JSF的核心概念,以及EL和Ajax在更新视图中的作用至关重要。通过适当的工具和技术,你可以创建出高效、响应式的级联选择功能,提升用户体验。
在这个“seam级联菜单例子”中,我们将深入探讨如何在Seam应用中实现级联选择菜单,这种菜单在用户界面中常见于如国家/地区、省份/城市等层级结构的选择。 级联菜单通常涉及到Ajax技术,它允许部分页面更新而不是...
级联选择通常用于网页表单中,允许用户首先选择一个省份,然后根据所选省份动态加载对应的城市列表。这种功能在需要用户指定详细地理位置的应用中非常常见,如物流系统、电商网站或者地图服务等。 实现这样的功能,...
2. **CDI(Contexts and Dependency Injection)**: CDI是Java EE中的依赖注入标准,Seam完全支持CDI,允许开发者方便地管理对象之间的依赖关系,从而简化了级联菜单的业务逻辑处理。 3. **EJB3(Enterprise ...
在实际开发中,级联选择常见于如国家-省-市-区-街道这样的多级选择场景。传统实现方式往往需要复杂的 JavaScript 代码和良好的兼容性处理,而 QFaces 的 Linkage 组件则以非侵入式的方式,使得开发者可以轻松实现...
在Hibernate 3.2.5GA中,不仅提升了性能,还增强了对Spring、Struts等框架的集成,使得企业级应用的开发变得更加便捷。 二、核心概念 1. **实体(Entity)**:在Hibernate中,实体是与数据库表对应的Java类。通过...
2. **AJAX Tags**:这是一组JSP标签,用于简化JSP页面中的AJAX使用。通过这些标签,开发者可以方便地实现如级联下拉框、输入字符匹配等功能,且建立在JavaScript框架之上。 3. **Struts AjaxTags**:此框架扩展了...
文档中可能会详细介绍实体类的创建、配置映射文件、使用Session进行数据操作、HQL查询语法、级联操作和缓存策略。 3. **Spring2.5**: Spring框架是Java企业级应用的核心,它提供了依赖注入(DI)和面向切面编程...
- **选择行**:在Oracle数据库中,可以通过`SELECT`语句来选择特定的行。例如,使用`WHERE`子句来限定选择条件。 - **限制选择行**:使用`LIMIT`或`FETCH FIRST`子句来限制返回的行数。 - **单行函数**:这些函数...
- 在JSF中有四种类型的事件:值变化事件、动作事件、阶段事件和系统事件。 #### AJAX (Asynchronous JavaScript And Xml) - AJAX是一种使用JavaScript异步与服务器交换数据的技术,可以在不重新加载整个页面的情况...
- **客户端脚本**:AJAXTags、StrutsAjaxTags 和 AjaxAnywhere 分别提供了一组方便的 AJAX 相关功能,如下拉级联选择、自动完成等,支持局部页面更新。 - **搜索引擎**:Lucene 是一个高性能的全文检索库,支持...