私の目標は、Create、Retrieve、Update機能を持つjsfページを提示することです。 私は、この操作ごとに異なるCDI Beanとさまざまなコンポジットコンポーネントを作成し、それらをすべてページにまとめて配置することに決めました。CDI Beanの結合方法に関する疑問:SessionScopedとRequestScoped
これまでのところは良い、しかし、私はちょうど完成し、私は本当に混乱バグを発見し、私はそれを修正する方法がわからない:CREATE操作は@RequestScoped BeanでないCDIビーンツールを
、入力フィールドがそれらを要求した後の自分をきれいになる。(画像怒鳴るを参照してください)
私はそれと全く問題(私はオフに取り除くカントちょうどその警告を)持っていない、それが正常に動作します。
作成した次のガジェットは、データを編集できるデータテーブルです。 。私は@SessionScopped CDI Beanを使用するために必要な(下の画像を参照してください)
それを行うには、ここで問題が来る: ページがレンダリングされると@SessionScoped Beanがセッションにデータをキャッシュしますが、 @RequestScoped Beanを使用して新しいデータが挿入されると、データはデータベースに送られますが、セッションに含まれていないため、データテーブルには新しい入力値が表示されません。
どうすればよいですか? ここで私はあなたに2つのBeanが表示されます: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を送る作るために、それは多分可能です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;
}
}
をCREATE
をCreateダイアログが閉じたことを検出すると、新しく入力されたデータの残りの部分を取得しますか? はいの場合はどうすればいいですか?
これは私のDataTableのためのマークアップです:
<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>
病気
はい、最も簡単で最適なオプションのようです。ありがとう! – sfrj
あなたは歓迎です:) –