`
cqzs19871202
  • 浏览: 30987 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

seam级联出现值无效

阅读更多
1,如果用到级联的back bean是长对话范围:在相应的配置文件里加入
<begin-conversation join="true" flush-mode="MANUAL"/>
2,如果不是长对话:将back bean的范围标记为 page,在页面上加入一个转换器(identityEntityConverter)见:util包下的IdentityEntityConverter.java
页面如下:
<h:selectOneMenu value="#{testSelectItems.bmqy}" converter="#{identityEntityConverter}">
                <s:selectItems var="bmqy" value="#{baseBmqyList.allBaseBmqyList()}" label="#{bmqy.qymc}" noSelectionLabel="#{messages.pleaseselect}">
                </s:selectItems>
                <a:support action="#{testSelectItems.cascade}" reRender="bmxx,ygxx" event="onchange"/>
         </h:selectOneMenu>
          <h:selectOneMenu id="bmxx" value="#{testSelectItems.bmxx}" style=" width : 119px; height : 23px;" converter="#{identityEntityConverter}">
                <s:selectItems var="bmxx" value="#{testSelectItems.bmxxList}" label="#{bmxx.bmmc}" noSelectionLabel="#{messages.pleaseselect}">
                </s:selectItems>
                <a:support action="#{testSelectItems.cascade2}" reRender="ygxx" event="onchange"/>
         </h:selectOneMenu>
         <h:selectOneMenu id="ygxx" value="#{testSelectItems.ygxx}" style=" width : 119px; height : 23px;" converter="#{identityEntityConverter}">
                <s:selectItems var="ygxx" value="#{testSelectItems.ygxxList}" label="#{ygxx.ygxm}" noSelectionLabel="#{messages.pleaseselect}">
                </s:selectItems>
         </h:selectOneMenu>




package com.golden.info.util;
import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import javax.faces.component.UIComponent;
import javax.faces.component.UISelectItems;
import javax.faces.context.FacesContext;
import javax.faces.convert.ConverterException;
import javax.faces.model.SelectItem;
import javax.persistence.Id;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Install;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Transactional;
import org.jboss.seam.annotations.faces.Converter;
import org.jboss.seam.annotations.intercept.BypassInterceptors;
import org.jboss.seam.log.LogProvider;
import org.jboss.seam.log.Logging;
import org.jboss.seam.ui.AbstractEntityLoader;
import org.jboss.seam.util.AnnotatedBeanProperty;

@Name("identityEntityConverter")
@Scope(ScopeType.CONVERSATION)
@Install(precedence = Install.APPLICATION)
@Converter
@BypassInterceptors
public class IdentityEntityConverter implements javax.faces.convert.Converter, Serializable {
	private static final long serialVersionUID = 5291805316838074880L;
	
	private static final LogProvider log = Logging.getLogProvider(IdentityEntityConverter.class);
	
    private AbstractEntityLoader<?> entityLoader;

    public AbstractEntityLoader<?> getEntityLoader() {
        if (entityLoader == null)
        	entityLoader = AbstractEntityLoader.instance();

        return entityLoader;
    }
    public void setEntityLoader(AbstractEntityLoader<?> entityLoader) {
        this.entityLoader = entityLoader;
    }

    @Transactional
    public String getAsString(FacesContext facesContext, UIComponent component, Object value) throws ConverterException {
        if (value == null)
            return null;
        if (value instanceof String)
            return (String) value;
        return getEntityLoader().put(value);
    }

    @Transactional
    public Object getAsObject(FacesContext facesContext, UIComponent component, String value) throws ConverterException {
        if (value == null)
            return null;
        Object loaded = getEntityLoader().get(value);
        if (loaded == null) {
        	log.error("The Entity loader returned a null object");
        	throw new ConverterException("The Entity loader returned a null object.");
        }
        
        Class<?> clazz = loaded.getClass();
        AnnotatedBeanProperty<Id> idProperty;

        /* 
         * Look backwards in the entity inheritance hierarchy for a property annotated with @Id. 
         * Note: The class of a managed entity is a java assist descendant of the entity class.
        */
        do {
        	idProperty = new AnnotatedBeanProperty<Id>(clazz, Id.class);
        	clazz = clazz.getSuperclass();
        } while (!idProperty.isSet() && clazz != null);

        /* If the @Id property cannot be found then there is nothing to do but raise an error */
    	if (!idProperty.isSet()) {
    		log.error("Cannot find a property annotated with @Id on entity");
    		throw new ConverterException("Cannot find a property annotated with @Id on entity");
    	}
    	
        Object loadedId = idProperty.getValue(loaded);
        if (loadedId == null) {
        	log.error("The loaded entity must have a not-null value for its identifier (@Id)");
        	throw new ConverterException("The loaded entity must have a not-null value for its identifier (@Id)");
        }
        Set<Object> originalList = getOriginalSelectItems(component);
        for (Object original : originalList) {
            Object originalId = idProperty.getValue(original);
            if (originalId != null && loadedId.equals(originalId))
                return original;
        }

        /* If the item was not found in the list fall back to the default provided by the EntityLoader */
        return loaded;
    }

    /**
     * Get a list of objects from the component's select items
     * 
     * @param component
     * @return
     */
    protected Set<Object> getOriginalSelectItems(UIComponent component) {
        Set<Object> items = new HashSet<Object>();
        
        for (UIComponent child : component.getChildren()) {
            if (child instanceof UISelectItems) {
                UISelectItems selectItems = (UISelectItems) child;
                for (Object selectItemsValue : (Collection<Object>) selectItems.getValue()) {
                    SelectItem selectItem = (SelectItem) selectItemsValue;
                    if (selectItem.getValue() == null) 
                    	continue;
                    
                    items.add(selectItem.getValue());
                }
                break;
            }
        }
        return items;
    }
}

或者可以重写需要级联的类的equals方法
分享到:
评论

相关推荐

    seam级联菜单例子

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

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

    在"seam2.0 全国 省份、城市级联"这个项目中,我们主要关注的是如何利用Seam 2.0实现一个全国省份和城市之间的二级联动效果。 级联选择通常用于网页表单中,允许用户首先选择一个省份,然后根据所选省份动态加载...

    seam级连菜单20080610.rar

    【标题】"seam级连菜单20080610.rar" 指的是一款基于Seam框架的级联菜单实现方案,发布于2008年6月10日。Seam是一个Java EE全栈框架,它将JSF(JavaServer Faces)、EJB3、CDI(Contexts and Dependency Injection)...

    seam_carving 代码实现 seam

    **Seam Carving 技术详解** Seam Carving,又称图像拉链,是一种基于能量最小化的图像调整方法,主要用于图像大小的动态调整,而不仅仅是简单的等比例缩放。它能够在保持图像主要结构不变的情况下,根据需要增加或...

    jboss seam 学习资料,seam in action和官方手册

    **JBoss Seam 学习资源概述** JBoss Seam 是一个开源的应用程序框架,它整合了JavaServer Faces (JSF)、Enterprise JavaBeans (EJB)、Java Persistence API (JPA) 和其他Java EE技术,旨在简化开发过程,提高开发...

    Seam Carving的C++实现代码

    在添加像素时,可以采用插值方法,如最近邻插值或双线性插值,来生成新的像素值。 6. **更新图像**:完成接缝操作后,更新图像矩阵,并使用OpenCV的`imwrite`函数保存调整后的图像。 在提供的压缩包中,`代码.rar`...

    Seam security

    Seam Security是针对Java Web应用程序的安全框架,它是JBoss Seam项目的一部分,提供了全面的安全解决方案,包括身份验证、授权和身份管理等功能。Seam Security以易于配置和使用为特点,允许开发者快速设置应用程序...

    为Seam做好准备

    "为Seam做好准备"这个标题暗示我们即将探讨的是关于Seam框架的入门与准备工作。Seam是一个Java EE集成框架,它将JavaServer Faces(JSF)、Java Persistence API(JPA)、Enterprise JavaBeans(EJB)3.0以及其他...

    JBOSS SEAM组件中文手册

    **JBoss Seam组件中文手册** **一、Seam框架概述** Seam是一个开源的企业级Java框架,由JBoss公司开发,旨在简化Java EE应用程序的开发。它将多种技术如JavaServer Faces (JSF),Java Persistence API (JPA),EJB 3...

    Seam框架文档简述

    ### Seam框架核心知识点详解 #### 一、Seam框架简介 Seam,全称为JBoss Seam,是一款基于Java EE 5的技术栈构建的应用框架。它通过整合JSF(JavaServer Faces)与EJB 3.0(Enterprise JavaBeans 3.0)组件,并充分...

    seam的注解和标签

    - `&lt;s:property&gt;`: 在JSF视图中,这个标签用于显示由Seam管理的组件的属性值。 - `&lt;s:form&gt;`: 是Seam提供的增强版的JSF表单标签,它可以自动处理Seam组件的绑定和验证。 - `&lt;s:in&gt;` 和 `&lt;s:out&gt;`: 分别用于注入...

    seam参考手册中文版

    - **通过属性设置**: 在组件类中直接定义属性值。 - **通过components.xml文件**: 更灵活地配置组件行为,无需修改源代码。 - **细粒度配置文件**: 为特定组件或组件组提供专门的配置选项。 #### 总结 通过以上知识...

    MATLAB_Seam_Carving_seamcarving_

    MATLAB_Seam_Carving_seamcarving_ 是一个与图像处理相关的项目,主要涉及到一种称为“seam carving”的技术,这是一种动态图像调整大小的方法,它可以在不改变图像整体视觉效果的情况下,增加或减少图像的宽度和...

    seam in action 中文 english

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

    seam_in_action

    根据提供的信息,我们可以推断出这是一本关于 Seam 框架的专业书籍,书名为《Seam in Action》,作者为 Dan Allen 和 Manning 出版社出版。本书主要讲解了 Seam 框架在 Java EE 3 环境中的应用与开发实践。接下来将...

    seam需要的jar包

    Seam框架是一个全面的Java企业级应用开发框架,它整合了JSF(JavaServer Faces)、EJB、CDI(Contexts and Dependency Injection)以及许多其他Java EE技术,为开发者提供了强大的组件模型和丰富的功能,旨在简化...

    seam_seamcarving_

    Seam Carving,又称为能量最小路径法或图像拉伸,是一种在不改变图像视觉质量的前提下,动态调整图像大小的技术。该方法由Ariel Shamir和Shai Avidan于2007年提出,主要用于图像缩放,尤其在保留图像重要特征的同时...

    Jboss Seam中文版

    ### JBoss Seam中文版知识点详解 #### JBoss Seam简介 JBoss Seam是一个强大的企业级应用开发框架,基于Java EE标准,特别强调简化Web应用的开发流程。它通过整合多种技术如JSF、EJB 3.0等,提供了一种更为高效、...

    SEAM 中文开发指南

    ### SEAM 中文开发指南知识点概述 #### 一、SEAM 框架简介 - **SEAM**:SEAM 是一个基于 Java EE 的企业级应用框架,它简化了复杂的应用程序开发过程,并且提供了丰富的功能来支持业务逻辑的实现。 - **版本信息**...

Global site tag (gtag.js) - Google Analytics