2011-10-03 4 views
0

두 개의 backbeans, 하나는 ui : repeat의 데이터를 검색하고 하나는 작업을 수행합니다.JSF 2 : 아약스 액션 중에 두 번째 빈에 첫 번째 빈이 호출되는 이유는 무엇입니까?

내 페이지가 렌더링 될 때 두 번째 백bean을 사용하여 작업을 수행하면 리듬 스 페이스 4와 함께 ajax 작업을 사용하더라도 첫 번째가 호출됩니다 (초기화 됨). 반복 구성 요소. 첫 번째 빈이 repeat 요소와 함께 호출된다는 것은 짜증나게합니다. 여기

내 코드 :

<!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:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:a4j="http://richfaces.org/a4j" 
xmlns:rich="http://richfaces.org/rich"> 
<h:head> 
</h:head> 

<h:body> 
    <h:form> 
     <ui:repeat var="currentValue" value="#{test_form_backBean_1.testSimpleModels}"> 
      #{currentValue.name} 
      <br /> 
     </ui:repeat> 

     <a4j:commandButton value="Tester" actionListener="#{test_form_backBean_2.test}" execute="@this" render="@this"> 

     </a4j:commandButton> 
    </h:form> 

</h:body> 
</html> 

나의 첫번째 콩 :

@Named("test_form_backBean_1") 
@RequestScoped 
public class Test_form_backBean_1 { 

    private static final Logger logger = Logger.getLogger(Test_form_backBean_1.class); 

    private List<Test_Simple_Model> testSimpleModels; 

    @PostConstruct 
    public void init() { 

     if (logger.isTraceEnabled()) 
      logger.trace("Initialisation de Test_form_backBean_1."); 

      testSimpleModels = new ArrayList<Test_Simple_Model>(); 
      testSimpleModels.add(new Test_Simple_Model(1L, "name_1")); 
      testSimpleModels.add(new Test_Simple_Model(2L, "name_2")); 
      testSimpleModels.add(new Test_Simple_Model(3L, "name_3")); 
      testSimpleModels.add(new Test_Simple_Model(4L, "name_4")); 
    } 

    public List<Test_Simple_Model> getTestSimpleModels() { 
     logger.trace("getTestSimpleModels() : appel."); 
     return testSimpleModels; 
    } 

    public void setTestSimpleModels(List<Test_Simple_Model> testSimpleModels) { 
     logger.trace("setTestSimpleModels() : appel."); 
     this.testSimpleModels = testSimpleModels; 
    } 

} 

두 번째 : 당신의 도움에 미리

@Named("test_form_backBean_2") 
@RequestScoped 
public class Test_form_backBean_2 { 

    private static final Logger logger = Logger.getLogger(Test_form_backBean_2.class); 

    @PostConstruct 
    public void init() { 

     logger.trace("Initialisation de Test_form_backBean_2."); 

    } 

    public void test() { 
     logger.trace("test() : appel de la fonction de test."); 
    } 
} 

감사합니다.

답변

0

문제는 요청 빈도가 요청 범위이므로 요청 - 응답주기가 완료되는 즉시 범위를 벗어나면 비 얼굴 요청 (전체 페이지) 또는 AJAX 사후 요청 백 요청.

대신 뷰 범위가 지정된 bean을 사용해야합니다. CDI를 사용하고 있으므로 사용을 중지하고 @ViewScoped 주석이있는 JSF 2 관리 Bean으로 전환하거나 @ViewScoped을 분명히 지원하는 Seam Faces 3에서 CDI를 계속 사용할 수 있습니다. (나는 그것이 어떤 마법인지는 모르지만 분명히 효과가있다.)

Test_form_backBean_1 대신에 TestFormBackBean1과 같이 일반적으로 허용되는 Java 용 명명 규칙을 사용해보십시오.

+0

먼저 답장을 보내 주셔서 감사합니다. 예, viewscoped는이 동작을 변경하지만 repeat 요소를 사용하면 첫 번째 bean이 호출되는 이유를 알 수 없습니다. 이 요소가 없으므로 (# {test_form_backBean_1.testSimpleModels.get (0) .name}) 예제를 사용하면 범위가 요청 인 경우에도 첫 번째 bean이 호출되지 않습니다. – Glasfeu

+0

흥미 롭습니다. 'render = "@ none"'을 사용하면 어떨까요? 또한 사용중인 RichFaces 버전은 무엇입니까? –

+0

RF-4.0.0. 최종. 나는 execute = "@ this"를 사용하고 render = "@ this"를 사용합니다. render = "@ none"으로 변경하면 같은 것입니다. – Glasfeu

관련 문제