方法不是从xhtml调用的

时间:2012-09-19 17:10:14

标签: jsf jpa jsf-2 jpa-2.0

每当我点击h:commandButton时,都不会调用与该操作关联的方法。action="#{statusBean.update}"不起作用,更新未被调用。

1)这是我的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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui">


<h:head></h:head>

<h:body>


    <h:form >   
    <p:dataList value="#{statusBean.statusList}" var="p">
    <h:outputText value="#{p.statusId}-#{p.statusmsg}"/><br/>
    <p:inputText value="#{statusBean.comment.comment}"/>
    <h:commandButton value="comment" action="#{statusBean.update}"></h:commandButton>
    </p:dataList>
    </h:form>





</h:body>
</html>

2)这是我的statusBean

package com.bean;

import java.util.List;

import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.servlet.http.HttpSession;

import com.entity.Album;
import com.entity.Comment;
import com.entity.Status;
import com.entity.User;

public class StatusBean {
    Comment comment;
    Status status;
    private EntityManager em;

    public Comment getComment() {
        return comment;
    }

    public void setComment(Comment comment) {
        this.comment = comment;
    }

    public Status getStatus() {
        return status;
    }

    public void setStatus(Status status) {
        this.status = status;
    }

    public StatusBean(){
        comment = new Comment();
        status=new Status();
        EntityManagerFactory emf=Persistence.createEntityManagerFactory("FreeBird");
         em =emf.createEntityManager();
    }

    public String save(){
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
        User user = (User) session.getAttribute("userdet");
        status.setEmail(user.getEmail());
        System.out.println("status save called");
        em.getTransaction().begin();
        em.persist(status);
        em.getTransaction().commit();
        return "success";
    }
    public List<Status> getStatusList(){
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(true);
        User user=(User) session.getAttribute("userdet");
        Query query = em.createQuery("SELECT s FROM Status s WHERE s.email='"+user.getEmail()+"'", Status.class);
              List<Status> results =query.getResultList();
              return results;

    }
    public String update(){
        System.out.println("Update Called...");
        //comment.setStatusId(Integer.parseInt(statusId));
        em.getTransaction().begin();
        em.persist(comment);
        em.getTransaction().commit();

        return "success";

    }
}

3 个答案:

答案 0 :(得分:0)

您需要为您的班级和范围注释添加@ManagedBean注释,例如

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class StatusBean {
    ...
}

答案 1 :(得分:0)

我遇到了同样的问题然后我使用了a4j:jsFunction并解决了问题

<a4j:jsFunction name="goToupdate" action="#{statusBean.update()}" </a4j:jsFunction>

现在你的h:commandButton看起来像这样

<h:commandButton value="comment" onclick="goToupdate()"></h:commandButton>

答案 2 :(得分:0)

使用<p:commandButton>代替<h:commandButton>

例如。<p:commandButton value="comment" action="#{statusBean.update}" process="@this" ></p:commandButton>

并将您的bean放入视图范围