jsf将数据传递给其他页面不起作用

时间:2013-05-26 03:55:01

标签: java jsf primefaces

我想使用requestcope使用相同的支持bean将数据从datatable传递到另一个页面,这是否可以不使用datamodel?我正在使用Servlet 3.0

这是我的数据表页面

    <p:dataTable var="entity" value="#{collegeController.allCollege}">
        <p:column headerText="Code">
            #{entity.collegeCode}
        </p:column>
        <p:column headerText="Description">
            #{entity.collegeDesc}
        </p:column>
        <p:column headerText="">
            <p:commandLink value="Edit" action="#{collegeController.prepareEdit(entity)}"/>
        </p:column>
    </p:dataTable>

这是我的支持豆

@ManagedBean
@RequestScoped
public class CollegeController implements Serializable {

    private String redirect = ".jsf?faces-redirect=true";
    private CollegeCatalog entity;

    public CollegeController() {
    }

    public String prepareEdit(CollegeCatalog selectedEntity) {
        Session s = NewHibernateUtil.getSessionFactory().getCurrentSession();
        s.beginTransaction();

        entity = (CollegeCatalog) s.load(CollegeCatalog.class, selectedEntity.getCollegeKey());

        return "update" + redirect;
    }

    public List getAllCollege() {
        Session s = NewHibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tx = s.beginTransaction();

        String query = ""
                + "FROM CollegeCatalog entity "
                + "WHERE entity.deleted = FALSE";

        Query q = s.createQuery(query);

        List l = q.list();

        tx.commit();

        return l;
    }

    /**
     * @return the entity
     */
    public CollegeCatalog getEntity() {
        if (entity == null) {
            entity = new CollegeCatalog();
        }
        return entity;
    }

    /**
     * @param entity the entity to set
     */
    public void setEntity(CollegeCatalog entity) {
        this.entity = entity;
    }
}

这是我的更新页面(这是我要显示所选数据的地方)

<h:form>
    <p:outputLabel value="Code:" for="txtCode"/>
    <p:inputText id="txtCode" value="#{collegeController.entity.collegeCode}"/>
    <br/>
    <p:outputLabel value="Description:" for="txtDesc"/>
    <p:inputText id="txtDesc" value="#{collegeController.entity.collegeDesc}"/>
    <br/><br/>
    <p:commandButton value="Update" action="#{collegeController.update()}"/>
    <p:commandButton value="Back" action="index.jsf?faces-redirect=true"/>
</h:form>

它始终返回null

2 个答案:

答案 0 :(得分:3)

您发送到collegeController.action方法的参数将丢失,因为您有一个@RequestScoped托管bean,并且将在每个请求中创建整个托管bean。此外,根据您的实际设计,将在每个collegeController.allCollege方法调用上重新创建列表。

解决您的问题:

  1. 将托管bean范围更改为更广泛的范围。在这种情况下,@ViewScoped就可以了。有关托管bean范围的更多信息:Communication in JSF 2 - Managed Bean Scopes

  2. 将所有业务逻辑移到getter之外。由于您正在使用JSF 2并希望在创建bean时加载列表,因此可以使用@PostConstruct方法并在其中加载列表。在JSF中使用托管bean时,请记住不要在getter / setter中放置任何业务逻辑。更多信息:Why JSF calls getters multiple times

  3. 将这些建议应用到您的代码中,托管bean将类似于:

    @ManagedBean
    @ViewScoped
    public class CollegeController implements Serializable {
    
        private String redirect = ".jsf?faces-redirect=true";
        private CollegeCatalog entity;
        private List<CollegeCatalog> collegeCatalogList;
    
        public CollegeController() {
        }
    
        @PostConstruct
        public void init() {
            Session s = NewHibernateUtil.getSessionFactory().getCurrentSession();
            Transaction tx = s.beginTransaction();
            String query = ""
                    + "FROM CollegeCatalog entity "
                    + "WHERE entity.deleted = FALSE";
            Query q = s.createQuery(query);
            collegeCatalogList = (List<CollegeCatalog>)q.list();
            tx.commit();
    
            entity = new CollegeCatalog();
        }
    
        public String prepareEdit(CollegeCatalog selectedEntity) {
            Session s = NewHibernateUtil.getSessionFactory().getCurrentSession();
            s.beginTransaction();
    
            entity = (CollegeCatalog)
                s.load(CollegeCatalog.class, selectedEntity.getCollegeKey());
    
            return "update" + redirect;
        }
    
        public List<CollegeCatalog> getAllCollege() {
            return collegeCatalogList;
        }
    
        /**
         * @return the entity
         */
        public CollegeCatalog getEntity() {
            return entity;
        }
    
        /**
         * @param entity the entity to set
         */
        public void setEntity(CollegeCatalog entity) {
            this.entity = entity;
        }
    }
    

    但请注意,此方法只是帮助您将entity中的<p:commandLink action="#{collegeController.prepareEdit(entity)}"/>参数发送到托管bean。如果不是重定向页面而是转发它,那会更好。

    如果您仍然希望使用重定向执行此操作,则此方法无法帮助您将数据发送到其他页面。如果您使用<h:button>(或更好,<h:link>)将重定向到您的其他页面并且您可以在那里处理参数,那将会更好。这里有更好的解释:Communication in JSF 2 - Processing GET Request Parameters

答案 1 :(得分:0)

尝试使用f:setPropertyActionListener@ViewScoped

像这样的东西

<p:column headerText="">
    <p:commandLink value="Edit" action="#{collegeController.action" >
        <f:setPropertyActionListener value="#{collegeController.entity}"  target="#{collegeController.targetEntity}">
    </p:commandLink>
</p:column>