Java <;用户界面:重复>;在JSF2.0中,打破了方法的执行顺序
我有一个非常简单的JSF2.0应用程序(见下文)。问题是,当出现Java <;用户界面:重复>;在JSF2.0中,打破了方法的执行顺序,java,jsf,jsf-2,Java,Jsf,Jsf 2,我有一个非常简单的JSF2.0应用程序(见下文)。问题是,当出现ui:repeat时,执行顺序(我在调试器中使用断点检查)是奇怪的 在我提交表单之后,SecondBean.initSomething()在FirstBean.setFirstFormField()之前被调用。如果我将something的类型更改为String,并从index.jsf中删除ui:repeat,然后只使用h:outputText,那么一切都会按预期工作,FirstBean.setFirstFormField()在Sec
ui:repeat
时,执行顺序(我在调试器中使用断点检查)是奇怪的
在我提交表单之后,SecondBean.initSomething()
在FirstBean.setFirstFormField()之前被调用。如果我将something
的类型更改为String
,并从index.jsf
中删除ui:repeat
,然后只使用h:outputText
,那么一切都会按预期工作,FirstBean.setFirstFormField()
在SecondBean.initSomething()之前被调用
我做错了什么
我正在使用JDeveloperStudio Edition 11.1.2.2.0及其堆栈(WebLogic10.3.5.0、Java6和JSF2.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>
SecondBean.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;
}
}
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;
}
}
package test.backing;
导入java.util.*;
导入javax.annotation.PostConstruct;
导入javax.faces.bean.*;
@ManagedBean
@请求范围
公共类SecondBean{
私人物品清单;
公共bean(){
}
@施工后
公共物品{
this.something=Arrays.asList(“abc”、“cde”);
}
公共无效设置某物(列出某物){
这个,某物,某物;
}
公共列表getSomething(){
归还这个东西;
}
}
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>
javax.faces.FACELETS\u视图\u映射
*.jsf;*。xhtml
Facesservlet
javax.faces.webapp.FacesServlet
1.
Facesservlet
/面孔/*
我做错了什么
没什么。它按规定工作。它只是在恢复视图时调用的
如果这给您带来了一个特定的问题,不幸的是问题中根本没有详细描述,那么需要从不同的方向寻找解决方案,而不是依赖于bean构造或getter调用相对于视图的特定执行顺序。至少,出于某种原因,这是你的目标
与具体问题无关,在processForm()
操作方法中,您也可以返回null
以导航回当前视图。这比目前笨拙的方法简单得多
我做错了什么
没什么。它按规定工作。它只是在恢复视图时调用的
如果这给您带来了一个特定的问题,不幸的是问题中根本没有详细描述,那么需要从不同的方向寻找解决方案,而不是依赖于bean构造或getter调用相对于视图的特定执行顺序。至少,出于某种原因,这是你的目标
与具体问题无关,在processForm()
操作方法中,您也可以返回null
以导航回当前视图。这比当前笨拙的方法简单得多。这就是JSF循环的工作原理。顺序是正确的
您需要根据JSF框架的规则改变您的工作方式。
了解JSF周期的各个阶段,这可能会对您有所帮助。这就是JSF周期的工作方式。顺序是正确的
您需要根据JSF框架的规则改变您的工作方式。
了解JSF周期的各个阶段,这可能会对您有所帮助。您可以使用h:dataTable。它在恢复阶段不填充值,在更新模型之后填充值。pahse您可以使用h:dataTable。它在恢复阶段不填充值,在updateModel pahse之后,它填充了我的猜测是,ui:repeat
,作为Facelets的一部分(我猜不是一个“真正的”JSF组件),在处理的早期阶段进行评估,而不是h:inputText
或h:outputText
。(还原视图与应用请求值或更新模型值)我已经有一段时间没有接触JSF了。我的猜测是,ui:repeat
,作为Facelets的一部分(我猜不是“真正的”JSF组件),在处理的早期阶段比h:inputText
或h:outputText
进行评估。(还原视图与应用请求值或更新模型值)但是我已经有一段时间没有接触JSF了。请注意,OP的特定问题与您在当前的最后一个问题中提出的问题无关。仅仅因为你觉得“冒犯性”就否决技术上有效的答案也毫无意义。也许您应该接受这样一个事实,即您根本不了解基本HTTP在其核心中是如何工作的,以及JSF是如何将其(太多)抽象出来的?请注意,OP的特定问题与您当前在上一个问题中所问的您自己的问题无关。仅仅因为你觉得“冒犯性”就否决技术上有效的答案也毫无意义。也许您应该接受这样一个事实,即您根本不了解基本HTTP在其核心中是如何工作的,以及JSF是如何将其(太多)抽象出来的?