selectOneMenu选中的值 [英] selectOneMenu selected value

查看:109
本文介绍了selectOneMenu选中的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好吧,我需要对selectOneMenu标签做一些澄清,使用EL表达式获取/设置值

Well, I need some clarification on selectOneMenu tag, using EL expression to get/set values

        <h:selectOneMenu id="variantsMenu"
            value="#{missionHandler.selectedVariant}"
            converter="#{missionHandler.variantConverter}">
            <f:selectItem itemLabel="-- Select a Variant --" />
            <f:selectItems value="#{missionHandler.variants}" var="variant"
                itemValue="#{variant}" itemLabel="#{variant.commercialName}" />
        </h:selectOneMenu>

我有这个代码,它显示一个包含( - 选择变量 - 的列表, Variant 1,Variant 2,... Variant n)
当我点击Variant时,我希望中的 selectedVariant 属性missionHandler managedBean将自动更新。但这种情况并非如此。甚至没有调用 variantConverter 转换器将Stringvariant.commercialName转换为真正的 Variant 对象。
变体对象实现 hashCode() equals()

I have this code, it displays a list containing ("-- Select a Variant--", Variant 1, Variant 2, ... Variant n) When I click on a Variant, I would expect the selectedVariant property in the missionHandler managedBean to be updated automatically. But this is not the case. The variantConverter converter is not even called to convert the String "variant.commercialName" to a real Variant object. The variant object implements hashCode() and equals()


  • 我缺少什么EL表达/标签的概念?

  • 我的更新问题的解决方案是什么?

  • What concept of EL expression / tag am I missing ?
  • What would be the solution to my update problem ?

编辑:
managedBean(简化)

EDIT : managedBean (simplified)

@ManagedBean
@ViewScoped
public class MissionHandler implements Serializable {

private static final long serialVersionUID = 2462652101518266609L;

private List<FlightFeasibilityException> exceptions;

@EJB
private VariantDao variantDao;

private Variant selectedVariant;

private List<Variant> variants;

private VariantConverter variantConverter;

public MissionHandler() {
    /** Create an empty list of exceptions */
    exceptions = new ArrayList<FlightFeasibilityException>();
}

@PostConstruct
public void init() {
    System.out.println("init done");
}

public List<FlightFeasibilityException> getExceptions() {
    return exceptions;
}

public void setExceptions(List<FlightFeasibilityException> exceptions) {
    this.exceptions = exceptions;
}

public Variant getSelectedVariant() {
    return selectedVariant;
}

public void setSelectedVariant(Variant selectedVariant) {
    this.selectedVariant = selectedVariant;
}

public List<Variant> getVariants() {
    return variants;
}

public void setVariants(List<Variant> variants) {
    this.variants = variants;
}

public VariantConverter getVariantConverter() {
    return variantConverter;
}

public void setVariantConverter(VariantConverter variantConverter) {
    this.variantConverter = variantConverter;
}

}

转换器

@FacesConverter(forClass=Variant.class)
public class VariantConverter implements Converter, Serializable {

    private static final long serialVersionUID = 7053414108213420057L;

    private VariantDao variantDao=new VariantDaoImpl();

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
            String value) {
        System.out.println("convert to Object " + value);
        Variant variant = variantDao.find(value);
        System.out.println("got variant " + variant.getCommercialName());
        return variant;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
            Object value) {
        System.out.println("convert to String " + value);
        return ((Variant) value).getCommercialName();
      }

    }

和xhtml文件

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
    <title>Mission Page</title>
    <link href="./css/styles.css" rel="stylesheet" type="text/css" />
</h:head>
<h:body>
    <rich:panel>
        <f:facet name="header">
            Mission Information
        </f:facet>
        <a4j:outputPanel layout="block">
            <h:form>
                <h:outputText style="font-weight: bold;" value="Mission Id: " />
                <h:inputText id="missionId" label="missionId"
                    value="#{missionHandler.mission.id}" disabled="true"
                    style=" width : 50px;">
                </h:inputText>
                <h:outputText style="font-weight: bold;" value="Mission Status: " />
                <h:inputText id="missionStatus" label="missionStatus"
                    value="#{missionHandler.mission.status}" disabled="true">
                </h:inputText>
            </h:form>
            <br />
            <h:form>
                <h:selectOneMenu value="#{missionHandler.selectedAircraftType}"
                    converter="#{missionHandler.acTypeConverter}">
                    <f:selectItem itemLabel="-- Select an A/C Type --" />
                    <f:selectItems value="#{missionHandler.aircraftTypes}" var="type"
                        itemValue="#{type}" itemLabel="#{type.typeOACI}" />
                    <f:ajax listener="#{missionHandler.changeSelectedAircraftType}"
                        render="@form" />
                </h:selectOneMenu>
                <h:selectOneMenu id="variantsMenu"
                    value="#{missionHandler.selectedVariant}"
                    converter="#{missionHandler.variantConverter}"
                    rendered="#{not empty missionHandler.selectedAircraftType}">
                    <f:selectItem itemLabel="-- Select a Variant --" />
                    <f:selectItems value="#{missionHandler.variants}" var="variant"
                        itemValue="#{variant}" itemLabel="#{variant.commercialName}" />
                </h:selectOneMenu>
            </h:form>
        </a4j:outputPanel>
    </rich:panel>
….. A LOT OF OTHER THINGS …..
</h:body>
</html>


推荐答案

关于代码的几点说明:


  1. 在托管bean的构造函数中做东西==糟糕的设计,使用 @PostConstructor 相反。

在转换器中手动实例化DAO ==糟糕的设计。理想情况下,您的DAO应该是可以注入转换器的托管对象(最好是EJB)。作为一个托管对象意味着它(理论上)可能是一个单例并由容器正确管理。至少这样,你不会感到难过。

Manually instantiating the DAO in your converter==bad design. Ideally, your DAO should be a managed object(preferably an EJB) that you can inject into the converter. Being a managed object means it would (in theory) probably be a singleton and managed properly by the container. At least this way, you won't feel bad about it.

尝试手动管理转换器。将转换器声明为独立组件,让容器完成它的工作,这样就可以避免不必要的调试。

Trying to manually manage the converter. Declare the converter as a standalone component and let the container do it's work so you can avoid unnecessary debugging.

variantsMenu 没有附加ajax处理程序,因此在提交整个表单之前,您不会在辅助bean中更新值

variantsMenu does not have an ajax handler attached to it so you won't get the value updated in the backing bean until the entire form is submitted

<h:selectOneMenu id="variantsMenu"
            value="#{missionHandler.selectedVariant}"
            converter="#{variantConverter}"
            rendered="#{not empty missionHandler.selectedAircraftType}">
            <f:ajax listener="#{missionHandler.changeVariant}"       render="@form" />
            <f:selectItem itemLabel="-- Select a Variant --" />
            <f:selectItems value="#{missionHandler.variants}" var="variant"
                itemValue="#{variant}" itemLabel="#{variant.commercialName}" />
        </h:selectOneMenu>


这篇关于selectOneMenu选中的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆