2012-02-11 32 views
1

我的目标是呈现一个具有创建,检索和更新功能的jsf页面。 我决定为每个操作创建不同的CDI bean和不同的复合组件,然后将它们放在页面中。关于如何结合CDI beans的疑问:SessionScoped和RequestScoped

到目前为止好,但我刚刚和我发现了一个非常混乱的错误,我不知道如何解决它:

的CDI bean的工具,做创建操作是@RequestScoped豆,所以输入字段清理它们的请求后的自我。(见图片波纹管)

enter image description here

我没有问题,它(只是,警告我不能摆脱掉)所有,它工作正常。

我创建的下一个小工具是一个也可以编辑数据的数据表。要做到这一点,我需要使用@SessionScopped CDI豆(见下图)

enter image description here

这里谈到的问题: 当页面呈现的@SessionScoped豆在会话缓存中的数据,但当插入新数据时,使用@RequestScoped bean,数据将进入数据库,但数据表不会显示新输入的值,因为它们不在会话中。

那么我该怎么做? 在这里,我会告诉你两个bean:

创建BEAN

@Named("subjectControllerCreate") 
@RequestScoped 
public class SubjectControllerCreate implements Serializable { 

    private Subject currentSubject; 
    @EJB 
    private SubjectFacade ejbFacade; 

    //INITIALIZATION 
    public SubjectControllerCreate() { 
     currentSubject = new Subject(); 
    } 


    //CREATE 


     public String create() { 
      try {   
        currentSubject.setCreationDate(new Date()); 
        getSubjectFacade().create(currentSubject);//Adds the current subject to the database! 
        JsfUtil.addSuccessMessage(ResourceBundle.getBundle("/Bundle").getString("SubjectCreated")); 
        return "";//Can perform a redirect here if we want 
       //} 
       //return null; 
      } catch (Exception e) { 
       JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("/Bundle").getString("PersistenceErrorOccured")); 
       return null; 
      } 
     } 

的UPDATE BEAN

@Named("subjectControllerUpdate") 
@SessionScoped 
public class SubjectControllerUpdate implements Serializable { 

    //Using DataModel<Subject> instead of List<Subject> is necessary in order to be able to get the current row. 
    private DataModel<Subject> subjects;  
    @EJB 
    private SubjectFacade ejbFacade; 

    //INITIALIZATION 
    @PostConstruct 
    public void init() { 
     subjects = new ListDataModel<Subject>(getSubjectFacade().findAll()); 
    } 

    //RETRIEVE 
    public DataModel<Subject> retrieve() { 
     return subjects; 
    } 

    //UPDATE 
    public void update() { 
     getSubjectFacade().edit(subjects.getRowData()); 
    } 

    //HELP METHODS 
    //RETURN THE FACADE FOR DATA MANIPULATION(Best practice) 
    private SubjectFacade getSubjectFacade() { 
     return ejbFacade; 
    } 

    //GETTERS AND SETTERS 
    public DataModel<Subject> getSubjects() { 
     return subjects; 
    } 

    public void setSubjects(DataModel<Subject> subjects) { 
     this.subjects = subjects; 
    }   
} 

是它也许能够使数据表发送一些AJAX请求何时检测到创建对话框关闭,以获取新输入的数据的其余部分? 如果是的我怎么能这样做?

这是我的数据表标记:

<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:p="http://primefaces.org/ui" 
     xmlns:f="http://java.sun.com/jsf/core"> 

    <h:form> 
     <p:dataTable id="allSubjects" var="subject" value="#{subjectControllerUpdate.subjects}" paginator="true" rows="7" > 
      <p:ajax event="rowEdit" listener="#{subjectControllerUpdate.update()}"/> 
      <p:column headerText="Name" sortBy="#{subject.name}" style="width:200px" > 
       <p:cellEditor> 
        <f:facet name="output"> 
         <h:outputText value="#{subject.name}"/> 
        </f:facet> 
        <f:facet name="input"> 
         <p:inputText value="#{subject.name}" style="width:100%"/> 
        </f:facet> 
       </p:cellEditor> 
      </p:column> 

      <p:column sortBy="#{subject.description}" headerText="Description">    
       <p:cellEditor> 
        <f:facet name="output"> 
         <h:outputText value="#{subject.description}"/> 
        </f:facet> 
        <f:facet name="input"> 
         <p:inputText value="#{subject.description}" style="width:100%"/> 
        </f:facet> 
       </p:cellEditor>  
      </p:column> 

      <p:column sortBy="#{subject.credits}" headerText="Credits" style="width:50px"> 
       <p:cellEditor> 
        <f:facet name="output"> 
         <h:outputText value="#{subject.credits}"/> 
        </f:facet> 
        <f:facet name="input"> 
         <p:inputText value="#{subject.credits}" style="width:100%"/> 
        </f:facet> 
       </p:cellEditor> 
      </p:column> 

      <p:column headerText="Options" style="width:50px">     
       <p:rowEditor /> 
      </p:column>   
     </p:dataTable> 
    </h:form>  

</html> 

生病感谢您的帮助

回答

2

你就不能注入@SessionScoped豆到@RequestScoped豆和创造被点击时,调用方法刷新@SessionScoped bean?

+0

是的,这听起来像最简单和最好的选择。它现在有效,谢谢! – sfrj 2012-02-11 10:24:21

+0

欢迎您:) – 2012-02-11 11:11:29