我有非常简单的JSF 2.0应用程序(见下文)。问题是当存在ui:repeat
时,执行顺序(我在调试器中使用断点检查它)很奇怪。<ui:repeat> JSF 2.0中断方法执行顺序
在我提交表格之后,SecondBean.initSomething()
被称为FirstBean.setFirstFormField()
之前。如果我将something
的类型更改为String
,并从index.jsf
中删除ui:repeat
并仅使用h:outputText
,则所有内容均按预期工作,FirstBean.setFirstFormField()
在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;
}
}
faces-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