2011-09-01 1 views
1

JSF 2.0 (mojarra) 응용 프로그램.JSF2 양식을 제출해도 동일한 페이지에 모음이 다시로드되지 않습니다.

<h:dataTable id="manualTitlesForm" value="#{titlesBean.manualTitles}" var="title" border="1" cellspacing="0"> 
    <h:column> 
     <f:facet name="header">#{msg['heaading']}</f:facet> 
     #{title.heading} 
    </h:column> 
      ... 
    <h:column> 
     <f:facet name="header">#{msg['actions']}</f:facet> 
     <h:form> 
      <h:commandButton action="#{titlesBean.editManualTitle(title)}" value="#{msg['g.edit']}" /> 
      <h:commandButton action="#{titlesBean.deleteManualTitle(title.id)}" value="#{msg['g.delete']}" /> 
     </h:form> 
    </h:column> 
</h:dataTable> 

빈 코드의 코드는 매우 간단하다 : 나는

<h:form> 
    #{msg['add custom title']}:<br /> 
    <table> 
     <tr> 
      <td>#{msg['heaading']}:</td> 
      <td><h:inputText value="#{titlesBean.title.heading}"></h:inputText></td> 
     </tr> 
     <tr> 
          ... 
     </tr> 
    </table> 
    <h:commandButton action="#{titlesBean.addTitle}" value="#{msg['g.save']}" /> 
</h:form> 

그리고 이미 추가 된 모든 항목의 목록을 같은 페이지에 항목을 추가하는 아주 사소한 양식을 가지고 :

@Controller 
@Scope(Scopes.REQUEST) 
public class TitlesBean { 

    private List<JTitle> manualTitles; 


    @PostConstruct 
    private void init() { 
     this.manualTitles = titlesManager.getManualTitles(); 
    } 

    public String addTitle() { 
     title.setCreated(new Date()); 
     title.setManual(true); 
     try { 
      titlesManager.addTitle(title); 
      title = new JTitle();// this is added, delete from the variable. only if no exception though !!! 
      UserMessagesBean.addMessage("saved"); 
     } catch (Exception e) { 
      UserMessagesBean.setValidationException(e.getMessage());//different exception added 
     } 
     return null; 
    } 

    public List<JTitle> getManualTitles() { 
     return manualTitles; 
    } 
    } 

이제 문제는 getManualTitles() 대신 하나, 예를 들어 DB에 12 개 통화를 야기 내가 가진 타이틀의 수만큼이라는 점이다. 왜 이런 일이 내 이해를 넘어서는 것일까 요? 빈의 매뉴얼 제목을 캐싱하여이 문제를 해결할 수 있습니다. 이것은 나의 주요 문제가 아니다.

문제는 addTitle()은 AFTER getManualTitles()입니다. 실제로 getManualTitles()이 예를 들어 10 번 호출되고 addTitle()이 호출 된 다음 두 번 더 getManualTitles() 메서드가 호출됩니다. 이것은 내 페이지가 13 대신 12 개의 이전 레코드 만 표시하도록하는 일종의 병렬 실행이라고 생각하게 만듭니다. 페이지를 다시로드해야만 13이 표시됩니다.

업데이트 : 이제 목록을 캐시합니다. 문제가 해결되지 않았습니다.

왜? 이 문제를 어떻게 해결할 수 있습니까?

+1

가능한 중복 [시간에서 데이터 테이블에서 업데이트 백업 콩 :있는 명령 및 JPA (http://stackoverflow.com/questions/7221758/update-backing-bean-in-datatable from hcommandbutton-and-jpa) – BalusC

+0

이것은 데이터베이스에 대한 여러 호출의 질문에 대한 대답이지만 어떻게하면 내 주요 문제를 해결할 수 있습니까? – mist

+1

이것은 답변의 코드 예제에서도 다룹니다. – BalusC

답변

-1

이것은 빠른 해결책이지만 실제 해결책은 아닙니다. addTitle()의 결과 리디렉션 : 추가

을 다음 addTitle()에 :

... 
    FacesContext.getCurrentInstance().getExternalContext() 
     .redirect("manualTitles.jsf"); 
    return null; 
} 
+0

당신의 문제는 당신이 getter 방법으로 비즈니스 일을하고 있다는 것입니다! 중복 링크도 참조하십시오. – BalusC

+0

좋아, 그 부분을 무시하고, 해결했다고 생각해, 내 다른 문제를 해결할 것인가? – mist