1

私は非常に単純な JSF 2.0 アプリケーションを持っています (以下を参照)。問題は、ui:repeatが存在する場合、実行順序 (デバッガーでブレークポイントを使用して確認します) がおかしいことです。

フォームを送信した後、 のSecondBean.initSomething()前に呼び出されFirstBean.setFirstFormField()ます。のタイプをsomethingtoに変更し、 fromStringを削除ui:repeatindex.jsfて使用するとh:outputText、すべてが期待どおりに機能し、FirstBean.setFirstFormField()before が呼び出され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>
4

3 に答える 3

1

私が間違っていることは何ですか?

何もない。指定どおりに動作しています。ビューの復元中に呼び出されるだけです。

これが特定の問題を引き起こしている場合、残念ながら質問で詳しく説明されていない場合は、Bean 構築またはゲッター呼び出しの特定の実行順序に依存/依存するのではなく、別の方向に解決策を探す必要があります。ビューに。少なくとも、それはあなたが何らかの理由でターゲットにしているようです。


具体的な問題とは関係ありませんが、そのprocessForm()アクション メソッドでnullは、現在のビューに戻るために戻ることもできます。これは、現在の不器用なアプローチよりもはるかに簡単です。

于 2012-09-10T20:14:40.547 に答える
0

これが JSF サイクルのしくみです。順番は正しい...

JSF フレームワークのルールに同意する方法を変更する必要があります。JSF サイクルのフェーズを学んでください。これが役に立ちますように。

于 2012-11-19T12:09:34.097 に答える
0

h:dataTable を使用できます。これは、復元フェーズ中に値を入力せず、updateModel パスの後に値を入力します

于 2015-01-15T12:20:23.613 に答える