值不保存到会话bean

时间:2015-02-16 17:41:57

标签: jsf

我创建了一个会话bean但似乎我的<h:selectOneMenu>没有将值存储在bean中。有人能告诉我我做错了吗?

在xhtml中导航到另一个显示结果的xhtml。除了导航规则之外,我在faces-config.xml中没有任何值,因为我认为托管bean /会话bean注释可以替换它

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:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
       <!-- Using a custom header -->
       <ui:include src="/resources/ADTHeader.xhtml" />
    <h:body>
        <h1>Test</h1>
        <h:form>
        <h:selectOneMenu id="mypick"
            value="#{gridMaster_backing.pickedGrid}" 
            converter="#{categoryConverter}"
            title="ADTF" >
            <f:selectItems value="#{gridMaster_backing.gridList}" var="prog" itemValue="#{prog.gridid}" itemLabel="#{prog.gridid} - #{prog.program} - #{prog.project} - #{prog.ci}" />
        </h:selectOneMenu>
        <br /><br />
        <h:button  value="View Grid" outcome="result" /> 
        </h:form>
    </h:body>
</html>

会话bean:

package edu.adtf.web;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.ejb.EJB;

import com.ray.adtf.ejb.*;
import com.ray.adtf.jpa.Gridmaster;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

@ManagedBean
@SessionScoped
public class gridMaster_backing {

    @EJB
    private GridMasterBean ejb;
    private Collection<Gridmaster> mgrid;

    private List gridList = new ArrayList();

    // pickedGrid holds value picked from the gridid drop down list
    private Long pickedGrid; 

    public Long getPickedGrid() {
        //System.out.println("getPicked Grid");
        return pickedGrid;
        //return (long) 100;
    }

    public void setPickedGrid(Long pickedGrid) {
        this.pickedGrid = pickedGrid;
    }

    // returns data to show grid form
    public Collection<Gridmaster> getGridmaster(Long vgridid){
        mgrid = ejb.getAllGrids(vgridid);
        return mgrid;
    }

    public void setGridList(List gridList) {
        this.gridList = gridList;
    }

    // list for grid list drop down
    public List getGridList() {
        List gridList2 = ejb.getDisplayGridList();
        return gridList2; 
        }
    }

转换器:

package edu.adtf.web;
import javax.faces.bean.ManagedBean;
import edu.adtf.jpa.Gridmaster;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@ManagedBean(name = "categoryConverterBean") 
@FacesConverter(value = "categoryConverter")
public class CategoryConverter implements Converter{
    @PersistenceContext
    private transient EntityManager em;

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        //System.out.println(em.find(Gridmaster.class, new Long(value)));
        return em.find(Gridmaster.class, new Long(value));
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {

        Gridmaster gridmaster;
        gridmaster = (Gridmaster) value;
        //System.out.println(String.valueOf(gridmaster.getGridid()));
        return String.valueOf(gridmaster.getGridid());

    }
}

1 个答案:

答案 0 :(得分:2)

问题在于您正在使用的转换器。您从中获取/设置数据的托管bean字段属于Long类型,<h:selectOneMenu>的默认值属于String类型,因此您只需要使用Long转换器。这种情况下有一个内置转换器:javax.faces.Long。确保您定义itemValue的{​​{1}}也是<h:selectItems>类型。

代码应如下所示:

Long
相关问题