목표는 만들기, 검색 및 업데이트 기능이있는 jsf 페이지를 제시하는 것입니다. 이 작업 각각에 대해 서로 다른 CDI 빈과 다른 복합 구성 요소를 작성한 다음 페이지에 모두 넣기로 결정했습니다.CDI 빈을 결합하는 방법에 대한 의문점 : SessionScoped 및 RequestScoped
단지 완성하고 난 정말 혼란 버그를 발견하고, 내가 그것을 해결하는 방법을 모른다 지금까지 너무 좋아,하지만 난 :
이(가) 작업을 CREATE 수행하는 CDI 빈 도구는 @RequestScoped 콩입니다 입력 필드 그들에게 요청 후 자아를 청소 때문에. 나는 전혀 (그냥 그 경고 내가 오프를 제거하지 못할)에 아무 문제가 없다
(이미지 울부 짖는 소리를 참조), 그것을 잘 작동합니다.
내가 만든 다음 가젯은 데이터를 편집 할 수있는 데이터 테이블입니다. . 그것이 내가이 @SessionScopped CDI 빈을 사용하는 데 필요한하려면
다음
문제 온다 (아래 이미지 참조) : 페이지가 @SessionScoped 콩이 렌더링 세션에서 데이터를 캐시하지만, @RequestScoped 빈을 사용하여 새 데이터가 삽입되면 데이터는 데이터베이스로 이동하지만 데이터 테이블은 세션에 없으므로 입력 된 새 값을 표시하지 않습니다.
그럼 어떻게해야합니까? 여기 난 당신에게 두 콩이 표시됩니다 :
빈 CREATE를
@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;
}
}
업데이트 콩
@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;
}
}
는 데이터 테이블 일부 아약스를 보낼 수 있도록 어쩌면 가능 Create 대화 상자가 닫히는 것을 감지하면 새로 입력 한 데이터의 나머지 부분을 가져 옵니까? 그렇다면 어떻게해야합니까?
이
내 데이터 테이블에 대한 마크 업입니다 :<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
당신은 환영합니다 :) –