我的问题是如何从“selectOneMenu”组件中的选择中获取值。我使用POJO,而不是字符串类型。我尝试在inputText中显示所选对象的name属性。我使用commandButton刷新inputText中的值,如下面的代码所示。但问题是inputText中什么也没有出现。我不确定有没有必要使用转换器,但我尝试了,它也没有工作。
这是我的.jsp文件:
<p:selectOneMenu value="#{appointentBean.selectedSpecialization}">
<f:selectItems value="#{appointentBean.specializationResult}" var="i" itemValue="#{i}" itemLabel="#{i.name}"/>
</p:selectOneMenu>
<p:commandButton value="Szukaj" >
<p:ajax update="textid" />
</p:commandButton>
<p:inputText id="textid" value="#{appointentBean.selectedSpecialization.name}" />appointmentBean:
@ManagedBean
@ViewScoped
@SessionScoped
public class appointentBean
{
private ArrayList<Specialization> specializationResult;
private Specialization selectedSpecialization;
public ArrayList<Specialization> getSpecializationResult()
{
//Here retrievie objects list from database and it works
return specializationResult;
}
public void setSpecializationResult(ArrayList<Specialization> result) {
this.specializationResult = result;
}
public Specialization getSelectedSpecialization() {
return selectedSpecialization;
}
public void setSelectedSpecialization(Specialization selectedSpecialization) {
this.selectedSpecialization = selectedSpecialization;
}
}Specialization.java:
@Entity
@Table(name="Specializations")
public class Specialization
{
@Id
@GeneratedValue
private int specialization_id;
@Column(name="name")
private String name;
public int getSpecialization_id() {
return specialization_id;
}
public void setSpecialization_id(int specialization_id) {
this.specialization_id = specialization_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}更重要的是。如果我没有在列表上进行选择,则会出现NullPointerExcetion。但当我做出选择时,我不会这样做,所以对象是在选择之后设置的。
发布于 2014-01-25 18:51:00
为您的托管Bean命名,如下所示
1. @ManagedBean(name ="appointentBean")
2. It should be in Session Scoped or View Scoped not in Both你的代码在我这一端运行得很好。我做了一些改变
ArrayList<Specialization> getSpecializationResult() like this:
public ArrayList<Specialization> getSpecializationResult()
{
//Here retrievie objects list from database and it works
specializationResult = new ArrayList<Specialization>();
Specialization specialize= new Specialization();
specialize.setName("Vinayak");
specialize.setSpecialization_id(1);
specializationResult.add(specialize);
return specializationResult;
}它起作用了。因此,进行必要的更改并让我们知道。
编辑2个
每当我们处理POJO时,我们都必须处理Converter。为什么自定义转换器是您现在想要问的问题。参考Custom Converter
这些是创建自定义转换器的步骤1.通过实现javax.faces.convert.Converter接口创建一个转换器类。2.覆盖getAsObject()和getAsString()方法。3.使用javax.annotation中存在的@FacesConverter注释分配一个唯一的转换器ID。
@FacesConverter(forClass=Specialization.class) primefaces1;导入java.util.ArrayList;导入java.util.List;导入javax.faces.application.FacesMessage;导入javax.faces.component.UIComponent;导入javax.faces.context.FacesContext;导入javax.faces.convert.Converter;导入javax.faces.convert.ConverterException;导入javax.faces.convert.FacesConverter;PojoConverter公共类实现转换器{公共静态列表specilizationObject;static { specilizationObject =新的ArrayList();specilizationObject.add(new Specialization("Vinayak",10));specilizationObject.add(new Specialization("Pingale",9));}公共对象getAsObject(FacesContext facesContext,UIComponent component,String submittedValue) { if (submittedValue.trim().equals("")) { return null;} else { try { for (Specialization p: specilizationObject) { if (p.getName().equals(submittedValue)) { return p;} catch(NumberFormatException异常){抛出新的ConverterException(新的FacesMessage(FacesMessage.SEVERITY_ERROR,“转换错误”,“不是有效的专业化”));}}返回null;} public String getAsString(FacesContext facesContext,UIComponent component,Object value) { if (value == null || value.equals("")) { return "";} else { return String.valueOf(Specialization) value).getName());}
package primefaces1;import java.util.ArrayList;import javax.annotation.PostConstruct;import javax.faces.bean.ManagedBean;import javax.faces.bean.SessionScoped;@ManagedBean(name = " appointentBean ") @SessionScoped公共类appointentBean{私有ArrayList specializationResult;私有专业化selectedSpecialization;@PostConstruct public void init() { selectedSpecialization = new Specialization();selectedSpecialization.setName(new String());PostConstruct public void init(){selectedSpecialization=new Specialization ();selectedSpecialization.setName(new String());PostConstruct public void init(){selectedSpecialization=new Specialization();selectedSpecialization.setName(new String());会话} public appointentBean() { specializationResult= ( ArrayList ) PojoConverter.specilizationObject;} public ArrayList getSpecializationResult() { //此处从数据库中检索对象列表//并返回specializationResult;} public void (ArrayList result) { this.specializationResult = result;} public void getSelectedSpecialization() { if (this.selectedSpecialization != null) System.out.println("getSelectedSpecialization----“+this.selectedSpecialization.getName();return this.selectedSpecialization;} public void setSelectedSpecialization(Specialization selectedSpecialization) { this.selectedSpecialization = selectedSpecialization;}}
<h:body>
<h:form id="me">
<p:selectOneMenu value="#{appointentBean.selectedSpecialization}" >
<f:selectItem itemLabel="Select One" itemValue=""></f:selectItem>
<f:selectItems value="#{appointentBean.specializationResult}"
var="result" itemValue="#{result}" itemLabel="#{result.name}" />
</p:selectOneMenu>
<p:commandButton value="Szukaj" update="me:textid">
</p:commandButton>
<h:outputText value="NAME: "></h:outputText>
<h:outputText id="textid" value="#{appointentBean.selectedSpecialization.name}" rendered="#{not empty appointentBean.selectedSpecialization}"/>
</h:form>
</h:body>发布于 2020-08-28 21:03:23
我发现自己的情况与使用自定义转换器正确填充user2374573、SelectOneMenu的情况相同,但所选的项为空。建议的解决方案是自定义转换器的变体,但它不能解决问题(至少对我来说是这样)。值选择没有像Primefaces文档中解释的那样到达,这是因为SelectOneMenu使用字符串而不是Pojos进行操作。在学习之后,我最终选择了一个中间解决方案。我不使用pojo类型的变量来存储值,而是只使用一个字符串来存储元素的id,如下所示。此解决方案对于SelectOneMenu和在Primefaces选择列表中使用的DualList中加载目标非常有用。这不是一个理想的解决方案,但它解决了问题。
Java视图
public class PickListView implements Serializable {
private static final long serialVersionUID = 1L;
private List<CviConcesione> listaConcesion;
private CviConcesione concesionSeleccionada;
private String concesionSeleccionadaS;
@Autowired
private ConcesionesBO concesionesBO;
@PostConstruct
public void init() {
}
public List<CviConcesione> getListaConcesion() {
if (null != listaConcesion && !listaConcesion.isEmpty()) {
return listaConcesion;
} else {
listaConcesion = new ArrayList<CviConcesione>();
listaConcesion = concesionesBO.consultaTodasConcesiones();
return listaConcesion;
}
}
public void setListaConcesion(List<CviConcesione> listaConcesion) {
this.listaConcesion = listaConcesion;
}
public ConcesionesBO getConcesionesBO() {
return concesionesBO;
}
public void setConcesionesBO(ConcesionesBO concesionesBO) {
this.concesionesBO = concesionesBO;
}
public CviConcesione getConcesionSeleccionada() {
return concesionSeleccionada;
}
public void setConcesionSeleccionada(CviConcesione concesionSeleccionada) {
this.concesionSeleccionada = concesionSeleccionada;
}
public String getConcesionSeleccionadaS() {
return concesionSeleccionadaS;
}
public void setConcesionSeleccionadaS(String concesionSeleccionadaS) {
this.concesionSeleccionadaS = concesionSeleccionadaS;
}
}用于选择一个菜单的Html代码
<p:selectOneMenu
id="concesionR"
value="#{pickListView.concesionSeleccionadaS}"
style="width:125px"
dynamic="true"
converter="#{concesionConverter}">
<f:selectItem itemLabel="Seleccione" itemValue="" />
<f:selectItems value="#{pickListView.listaConcesion}"
var="concesion"
itemLabel="#{concesion.conCodigo} - #{concesion.conDescripcion}"
itemValue="#{concesion.conCodigo}"
ajax = "true"
/>
<p:ajax update="lineaR" process="@form" />
</p:selectOneMenu>一个类转换器
@FacesConverter("concesionConverter")
public class ConcesionesConverter implements Converter {
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
if(value != null && value.trim().length() > 0) {
try {
PickListView service = (PickListView) fc.getExternalContext().getApplicationMap().get("pickListView");
return service.getListaConcesion().get(Integer.parseInt(value));
} catch(NumberFormatException e) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid theme."));
}
}
else {
return null;
}
}
public String getAsString(FacesContext fc, UIComponent uic, Object object) {
if(object != null) {
return String.valueOf(((CviConcesione) object).getConId());
}
else {
return null;
}
}
}此解决方案不会带来pojo,但会让您知道它已被选中,并显示pojo值。
https://stackoverflow.com/questions/21349441
复制相似问题