`
withyou
  • 浏览: 454944 次
社区版块
存档分类
最新评论

在JSF中使用依赖级联选择框

阅读更多

在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三级级联

    在JSF(JavaServer Faces)框架中,三级联动通常指的是在一个表单中,有三个下拉列表,它们之间存在依赖关系。例如,在这里提到的场景中,是省、市、县三级联动,当用户在第一级(省份)选择一个选项时,第二级(城市...

    jsf【静态】页面的三级级联示例

    在`faces-config.xml`文件中定义导航规则,或者在bean中使用`ExternalContext`进行导航。 8. **响应式设计**:确保你的页面在不同设备和屏幕尺寸上都能正常显示,可能需要应用CSS样式和媒体查询。 9. **测试与调试...

    jsf的初步使用(包括jsf框架的引入、用户登录、自定义表单验证、valueChangeEvent值变更事件处理做的级联下拉框,内有jsf的jar包)

    在Java EE项目中引入JSF框架,首先需要在`pom.xml`或`build.gradle`文件中添加对应的依赖。对于Maven项目,你可以添加以下依赖: ```xml &lt;groupId&gt;javax.faces &lt;artifactId&gt;javax.faces-api &lt;version&gt;2.3 ...

    JSF 动态 数据的三级级联示例操作

    本文将详细讲解如何通过JSF来实现一个动态的三级级联下拉框,这在多层级关联的数据展示中非常有用,比如地区、城市、街道的选择。我们将使用Java后端和数据库来获取并传递这些数据。 首先,我们需要了解JSF的基本...

    用selectOneMenu标签开发级联选择

    使用`&lt;h:selectOneMenu&gt;`标签开发级联选择涉及前端和后端的交互,理解JSF的核心概念,以及EL和Ajax在更新视图中的作用至关重要。通过适当的工具和技术,你可以创建出高效、响应式的级联选择功能,提升用户体验。

    seam级联菜单例子

    在这个“seam级联菜单例子”中,我们将深入探讨如何在Seam应用中实现级联选择菜单,这种菜单在用户界面中常见于如国家/地区、省份/城市等层级结构的选择。 级联菜单通常涉及到Ajax技术,它允许部分页面更新而不是...

    seam2.0 全国 省份、城市级联

    级联选择通常用于网页表单中,允许用户首先选择一个省份,然后根据所选省份动态加载对应的城市列表。这种功能在需要用户指定详细地理位置的应用中非常常见,如物流系统、电商网站或者地图服务等。 实现这样的功能,...

    seam级连菜单20080610.rar

    2. **CDI(Contexts and Dependency Injection)**: CDI是Java EE中的依赖注入标准,Seam完全支持CDI,允许开发者方便地管理对象之间的依赖关系,从而简化了级联菜单的业务逻辑处理。 3. **EJB3(Enterprise ...

    qfaces 使用方法 WORD版

    在实际开发中,级联选择常见于如国家-省-市-区-街道这样的多级选择场景。传统实现方式往往需要复杂的 JavaScript 代码和良好的兼容性处理,而 QFaces 的 Linkage 组件则以非侵入式的方式,使得开发者可以轻松实现...

    HIbernate 3.2.5GA

    在Hibernate 3.2.5GA中,不仅提升了性能,还增强了对Spring、Struts等框架的集成,使得企业级应用的开发变得更加便捷。 二、核心概念 1. **实体(Entity)**:在Hibernate中,实体是与数据库表对应的Java类。通过...

    Java开源 AJAX框架

    2. **AJAX Tags**:这是一组JSP标签,用于简化JSP页面中的AJAX使用。通过这些标签,开发者可以方便地实现如级联下拉框、输入字符匹配等功能,且建立在JavaScript框架之上。 3. **Struts AjaxTags**:此框架扩展了...

    struts2hibernate3.2spring2.5帮助文档

    文档中可能会详细介绍实体类的创建、配置映射文件、使用Session进行数据操作、HQL查询语法、级联操作和缓存策略。 3. **Spring2.5**: Spring框架是Java企业级应用的核心,它提供了依赖注入(DI)和面向切面编程...

    J2EE软件工程师全部培训课程总结

    - **选择行**:在Oracle数据库中,可以通过`SELECT`语句来选择特定的行。例如,使用`WHERE`子句来限定选择条件。 - **限制选择行**:使用`LIMIT`或`FETCH FIRST`子句来限制返回的行数。 - **单行函数**:这些函数...

    J2EE课程总结

    - 在JSF中有四种类型的事件:值变化事件、动作事件、阶段事件和系统事件。 #### AJAX (Asynchronous JavaScript And Xml) - AJAX是一种使用JavaScript异步与服务器交换数据的技术,可以在不重新加载整个页面的情况...

    J2EE开源框架

    - **客户端脚本**:AJAXTags、StrutsAjaxTags 和 AjaxAnywhere 分别提供了一组方便的 AJAX 相关功能,如下拉级联选择、自动完成等,支持局部页面更新。 - **搜索引擎**:Lucene 是一个高性能的全文检索库,支持...

Global site tag (gtag.js) - Google Analytics