2012-09-10 2 views
1

나는 매우 간단한 JSF 2.0 애플리케이션을 가지고있다. (아래 참조). 문제는 ui:repeat이있을 때 실행 순서 (디버거에서 중단 점을 사용하여 검사 함)가 이상합니다.JSF 2.0에서 <ui:repeat>은 메소드 실행 순서를 깨뜨림

양식을 제출 한 후 SecondBean.initSomething()FirstBean.setFirstFormField() 전에 호출됩니다. somethingString으로 변경하고 ui:repeatindex.jsf에서 삭제하고 단지 h:outputText을 사용하면 모든 것이 예상대로 작동합니다. 은 SecondBean.initSomething() 전에 호출됩니다.

내가 뭘 잘못하고있어?

JDeveloper Studio Edition 11.1.2.2.0 및 그 스택 (WebLogic 10.3.5.0, Java 6 및 JSF 2.0)을 사용하고 있습니다.

index.jsf :

<?xml version='1.0' encoding='UTF-8'?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<f:view xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
     <h:head></h:head> 
     <h:body> 
      <h:form> 
       <h:panelGrid columns="1"> 
        <h:inputText value="#{firstBean.firstFormField}" /> 
        <h:commandButton action="#{firstBean.processForm}" value="Submit" /> 
       </h:panelGrid> 
      </h:form> 
      <ui:repeat value="#{secondBean.something}" var="variable" > 
       <h:outputText value="#{variable}" /> 
      </ui:repeat> 
     </h:body> 
    </html> 
</f:view> 

FirstBean.java :

package test.backing; 

import javax.faces.bean.*; 
import javax.faces.context.FacesContext; 

@ManagedBean 
@RequestScoped 
public class FirstBean { 
    private String firstFormField; 
    public FirstBean() { 
     super(); 
    } 

    public String processForm() { 
     FacesContext facesContext; 

     facesContext = FacesContext.getCurrentInstance(); 

     return facesContext.getViewRoot().getViewId();    
    } 

    public void setFirstFormField(String firstFormField) { 
     this.firstFormField = firstFormField; 
    } 

    public String getFirstFormField() { 
     return this.firstFormField; 
    } 
} 

SecondBean.java :

package test.backing; 

import java.util.*; 

import javax.annotation.PostConstruct; 

import javax.faces.bean.*; 

@ManagedBean 
@RequestScoped 
public class SecondBean { 
    private List<String> something; 

    public SecondBean() { 

    } 

    @PostConstruct 
    public void initSomething() { 
     this.something = Arrays.asList("abc", "cde"); 
    } 

    public void setSomething(List<String> something) { 
     this.something = something; 
    } 

    public List<String> getSomething() { 
     return this.something; 
    } 
} 

얼굴-config.xml에 다음

코드입니다 :

<?xml version="1.0" encoding="UTF-8"?> 
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"> 

</faces-config> 

의 web.xml : 내가 잘못

<?xml version = '1.0' encoding = 'UTF-8'?> 
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
     version="2.5"> 
    <context-param> 
    <param-name>javax.faces.FACELETS_VIEW_MAPPINGS</param-name> 
    <param-value>*.jsf;*.xhtml</param-value> 
    </context-param> 
    <servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>/faces/*</url-pattern> 
    </servlet-mapping> 
</web-app> 
+0

내 생각 엔 UI '것이 될 것이다 : repeat', Facelets의의 일부가되는 (그리고 난 "실제"JSF 컴포넌트가 아닌 것으로 추측)는 h : inputText 또는 h : outputText보다 처리 초기 단계에서 평가됩니다. (뷰를 복원하고 요청 값을 적용하거나 모델 값을 업데이트하십시오.) JSF를 사용한 이후로 꽤 오래되었습니다. – millimoose

답변

1

을하고있어 무엇?

없음. 그것은 지정된대로 작동하고 있습니다. 보기를 복원하는 동안 호출됩니다.

불행히도 질문에 자세히 설명되어 있지 않은 특정 문제가 발생하는 경우, 콩을 만드는 특정 실행 순서에 의존/의존하는 것과 다른 방향으로 솔루션을 찾아야합니다. 또는 뷰에 상대적인 getter 호출. 적어도, 그것은 당신이 어떤 이유로 표적으로하고있는 것처럼 보입니다. 구체적인 문제에 관련없는


, 그 processForm() 액션 메소드에 당신은 또한 그냥 현재보기로 이동합니다 null을 반환 할 수 있습니다. 현재의 서투른 방식보다 훨씬 간단합니다.

0

JSF주기가 작동하는 방식입니다. 순서는 정확합니다 ...

JSF 프레임 워크의 규칙에 동의하는 방식을 변경해야합니다. JSF주기의 단계를 배우십시오. 이것이 도움이 될 수 있습니다.

+1

OP의 특정 문제는 현재 마지막 질문에서 묻는 것처럼 자신의 문제와 관련이 없습니다 **. "공격적"이라고 생각하기 때문에 기술적으로 유효한 답변을 하향 투표하는 것은 전혀 의미가 없습니다. 아마도 핵심 HTTP에서의 기본 작동 방식과 JSF가이를 너무 많이 추상화하는 방식을 이해하지 못한다는 사실을 받아 들여야 할 것입니다. – BalusC

0

당신은 시간을 사용할 수 있습니다 : 데이터 테이블은 값이시의 위상을 복원 채우지 않습니다, 그것은 웁니다하여 updateModel이 pahse 후

관련 문제