나는 매우 간단한 JSF 2.0 애플리케이션을 가지고있다. (아래 참조). 문제는 ui:repeat
이있을 때 실행 순서 (디버거에서 중단 점을 사용하여 검사 함)가 이상합니다.JSF 2.0에서 <ui:repeat>은 메소드 실행 순서를 깨뜨림
양식을 제출 한 후 SecondBean.initSomething()
이 FirstBean.setFirstFormField()
전에 호출됩니다. something
을 String
으로 변경하고 ui:repeat
을 index.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>
내 생각 엔 UI '것이 될 것이다 : repeat', Facelets의의 일부가되는 (그리고 난 "실제"JSF 컴포넌트가 아닌 것으로 추측)는 h : inputText 또는 h : outputText보다 처리 초기 단계에서 평가됩니다. (뷰를 복원하고 요청 값을 적용하거나 모델 값을 업데이트하십시오.) JSF를 사용한 이후로 꽤 오래되었습니다. – millimoose