JSF UIInput в нижнем колонтитуле DataTable - PullRequest
0 голосов
/ 11 июня 2009

Я добавляю (UIInput) к столбцам нижнего колонтитула (UIColumn) таблицы данных (UIData), создаваемой динамически. UIData привязывается к датируемому тегу в jsp. В таблице данных у меня просто есть верхние и нижние колонтитулы с заголовком, имеющим метки, а нижний колонтитул имеет соответствующее значение в редактируемом текстовом поле. Когда я изменяю значение и отправляю форму с помощью commandButton и пытаюсь получить доступ к значению UIInput с помощью .getValue () в методе действия, я просто получаю старые значения, а не значения, обновленные на странице. Я попытался связать его с атрибутом в компоненте поддержки и проверил значения, устанавливаемые в установщике. Я заметил, что старые значения устанавливаются, и значения, которые я обновил на странице, не отражаются в методе действия или в установщике действия. Я пытался использовать .getValue, .getLocalValue, .getSubmittedValue. Ничто из этого не дает мне новых ценностей. Какие-нибудь предложения, что я мог бы сделать?


Мне удалось обойти, потянув значения из requestParameterMap. Если есть проблема, пожалуйста, дайте мне знать. Макдауэлл - спасибо за ваш вклад.

Ответы [ 3 ]

1 голос
/ 12 июня 2009

Я попытался запустить ваш демонстрационный код код в MyFaces 1.2.3 для Tomcat и Mojarra 2.0.0 Beta на Glassfish, но не смог воспроизвести проблему - save () Метод напечатал значения, которые я ввел в поля.

(Чтобы использовать MyFaces, мне пришлось изменить new UIData () на new HtmlDataTable () , вероятно, из-за того, как они реализуют средство визуализации таблиц, но это небольшое изменение .)

Я отмечу пару вещей о бобе:

  • средство получения таблицы будет продолжать добавлять столбцы при каждом вызове - как при обновлении страницы с сохранением состояния на стороне сервера
  • хранить ссылку на UIComponent в сессионном компоненте обычно не очень хорошая идея; вам лучше использовать область запроса для привязок компонентов
    • сессионные компоненты должны реализовывать Serializable (хотя я понимаю, что это делают не все), и UIComponents не могут быть сериализованы
    • ваш компонент может оказаться в нескольких представлениях, если пользователь дважды откроет страницу - проблемы с параллелизмом
    • в соответствии с spec : когда JSF создает представление, оно будет использовать компонент, связанный через геттер; но когда он восстанавливает представление (при отправке), он устанавливает компонент через установщик, поэтому сохранение ссылки (в лучшем случае) избыточно

Возможно, вы захотите изменить геттер на что-то вроде этого:

private UIData headerDataTable;

public UIData getHeaderDataTable() {
    if (headerDataTable == null) {
        headerDataTable = new UIData();
        getHeaderTable(headerDataTable);
    }
    return headerDataTable;
}

Я не уверен, что эти изменения решат вашу проблему, однако - если у вас все еще возникают проблемы, попробуйте еще раз с более подробной информацией - вашей реализацией JSF, версией и значением javax. Параметр faces.STATE_SAVING_METHOD в web.xml (если есть).

0 голосов
/ 16 июня 2009

Проблема еще не полностью решена.

Я использую RSA 7 с IBM JSF - поддержка Base Faces 7.0 и компонентами Enhanced Faces 7.0 в WAS 6.0. По умолчанию javax.faces.STATE_SAVING_METHOD был 'server'.

Я попытался изменить STATE_SAVING_METHOD на «клиент». Он напечатал измененное значение в выводе, но в label4 вместо label0, который я модифицировал. При следующей передаче значение перемещается из label4 в label8. Казалось противоречивым.

0 голосов
/ 11 июня 2009

Фактический код выполняет несколько других операций, но приведенный ниже код должен помочь в репликации проблемы. В приведенном ниже коде я ожидаю, что TestString выведет измененные значения со страницы. Но он просто возвращает старые значения. Ниже jsp:

<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<html>
<head>
</head>
<f:view>
    <body>
        <h:form styleClass="form" id="form1">
            <h:commandButton value="Save" action="#{TestPageBackingBean.save}"  styleClass="commandExButton"/>
            <h:outputText styleClass="label" value="Header Table"/>
            <h:dataTable binding="#{TestPageBackingBean.headerDataTable}"></h:dataTable>
        </h:form>
    </body>
</f:view>
</html>

Ниже приведена конфигурация граней:

<managed-bean>
    <managed-bean-name>TestPageBackingBean</managed-bean-name>
    <managed-bean-class>test.jsf.TestPageBackingBean</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
</managed-bean> 

Ниже приведен код боба поддержки:

package test.jsf;

import java.io.IOException;

import javax.faces.component.UIColumn;
import javax.faces.component.UIData;
import javax.faces.component.UIInput;
import javax.faces.component.UIOutput;
import javax.faces.context.FacesContext;

public class TestPageBackingBean {

  private UIData headerDataTable = new UIData();

  public TestPageBackingBean() {

  }

  public UIData getHeaderDataTable()
    {    
            return getHeaderTable(headerDataTable);
    }       

  public UIData getHeaderTable(UIData dataTable)
    {    
        for (int i=0;i<10;++i)
        {
            dataTable.getChildren().add(getColumn(i));
        }
        return dataTable;
    }

    private UIColumn getColumn(int i)
  {
    UIOutput outputLabelText = new UIOutput();
        UIInput inputFieldText = new UIInput(); 
        UIColumn column = new UIColumn();

        outputLabelText.setValue("Label" + i);
        inputFieldText.setValue("test input" + i);

        column.setHeader(outputLabelText);
        column.setFooter(inputFieldText);
        return column;
    }

    public String save() throws IOException {
            String TestString = "";
            FacesContext ctx = FacesContext.getCurrentInstance();
            if (!ctx.getResponseComplete()) {
                for (int i=0; i<headerDataTable.getChildren().size();++i)
                {
                    TestString = TestString + (String)((UIInput)((UIColumn) headerDataTable.getChildren().get(i)).getFooter()).getValue();
                }
             System.out.println(TestString);
            }
           return "save";
        }

    public void setHeaderDataTable(UIData headerDataTable) {
        this.headerDataTable = headerDataTable;
    }   
}
...