首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Primefaces如何从selectOneMenu获取POJO

Primefaces如何从selectOneMenu获取POJO
EN

Stack Overflow用户
提问于 2014-01-25 18:36:51
回答 2查看 1.3K关注 0票数 0

我的问题是如何从“selectOneMenu”组件中的选择中获取值。我使用POJO,而不是字符串类型。我尝试在inputText中显示所选对象的name属性。我使用commandButton刷新inputText中的值,如下面的代码所示。但问题是inputText中什么也没有出现。我不确定有没有必要使用转换器,但我尝试了,它也没有工作。

这是我的.jsp文件:

代码语言:javascript
运行
复制
<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:

代码语言:javascript
运行
复制
@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:

代码语言:javascript
运行
复制
@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。但当我做出选择时,我不会这样做,所以对象是在选择之后设置的。

EN

回答 2

Stack Overflow用户

发布于 2014-01-25 18:51:00

为您的托管Bean命名,如下所示

代码语言:javascript
运行
复制
1.    @ManagedBean(name ="appointentBean")
2.    It should be in Session Scoped or View Scoped not in Both

你的代码在我这一端运行得很好。我做了一些改变

代码语言:javascript
运行
复制
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。

  1. 首先,我为您的专业化认证类创建了一个POJOConverter类

@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());}

  • 对托管Bean类进行了以下更改。克服NUll指针异常

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;}}

  • 为了显示值,我对您的xhtml做了一些微小的更改。

代码语言:javascript
运行
复制
<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>
票数 3
EN

Stack Overflow用户

发布于 2020-08-28 21:03:23

我发现自己的情况与使用自定义转换器正确填充user2374573、SelectOneMenu的情况相同,但所选的项为空。建议的解决方案是自定义转换器的变体,但它不能解决问题(至少对我来说是这样)。值选择没有像Primefaces文档中解释的那样到达,这是因为SelectOneMenu使用字符串而不是Pojos进行操作。在学习之后,我最终选择了一个中间解决方案。我不使用pojo类型的变量来存储值,而是只使用一个字符串来存储元素的id,如下所示。此解决方案对于SelectOneMenu和在Primefaces选择列表中使用的DualList中加载目标非常有用。这不是一个理想的解决方案,但它解决了问题。

Java视图

代码语言:javascript
运行
复制
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代码

代码语言:javascript
运行
复制
<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>

一个类转换器

代码语言:javascript
运行
复制
@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值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21349441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档