selectOneMenu选中的值 [英] selectOneMenu selected value
问题描述
好吧,我需要对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时,我希望中的
managedBean将自动更新。但这种情况并非如此。甚至没有调用 selectedVariant
属性missionHandler 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>
推荐答案
关于代码的几点说明:
-
在托管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屋!