предаване на стойности от контролера към jsf изглед

Току-що започнах да уча jsf и срещнах основен проблем. Показах списък с обекти в dataTable и създадох формуляр за всеки ред за извикване на функция с десен параметър:

<h:dataTable value="#{test.getMyItems()}" var="o"
            styleClass="order-table"
            headerClass="order-table-header"
            rowClasses="order-table-odd-row,order-table-even-row">

<h:column>
    <f:facet name="header">Content</f:facet>
    #{o.content}
</h:column>
<h:column>
<h:form>
    <h:commandLink action="#{test.edit}" value="edit">
    <f:param name="id" value="#{o.id}" />
    </h:commandLink>
</h:form>
</h:column>
</h:dataTable>

И сега исках да пренасоча потребителя към редактиране на страница с формуляр, който има входове, зададени на правилните стойности. Така че в редактирането на функция задавам стойности на променливите:

public String edit() {
    this.name = "test1";
    this.description = "test2";

    return "/edit.xhtml?faces-redirect=true";
}

И в изглед за редактиране исках да ги покажа:

<h:form>
            <h:outputLabel value="name:" />
            <h:inputText value="#{test.name}" />

            <h:outputLabel value="description" />
            <h:inputText value="#{test.description}" />

            <h:commandButton value="Add" action="#{edit.update()}"/>
 </h:form>

но входовете са празни. Защо?

И тестов клас:

@ManagedBean (name = "test")
@ViewScoped
public class Test {
    private String name;
    private String description;

public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}

public String getDescription() {
    return this.description;
}

public void setDescription(String description) {
    this.description = description;
}

public String edit() {
    this.name = "test1";
    this.description = "test2";

    return "/edit.xhtml?faces-redirect=true";
}

 public List<Item> getMyItems() {
    List<Item> items = new ArrayList<Item>();
    Item i = new Item("1", "g", "f");
    items.add(i);

    return items;
} 

public void update() {
}

person tom.michalek    schedule 18.05.2015    source източник
comment
Ще помогне, ако покажете своя тестов клас. Вашите полета за име и описание имат ли правилно именувани гетери и сетери?   -  person hooda    schedule 18.05.2015
comment
@hooda Добавих изпълнение на тестов клас.   -  person tom.michalek    schedule 18.05.2015


Отговори (1)


Те са празни, защото изпращате пренасочване към нов изглед. Bean с обхват на изглед живее толкова дълго, колкото съществува текущият изглед. Пренасочването към нов изглед унищожава това.

В тази конкретна конструкция ви трябва <h:link>, а не <h:commandLink>.

Сменете

<h:form>
    <h:commandLink action="#{test.edit}" value="edit">
    <f:param name="id" value="#{o.id}" />
    </h:commandLink>
</h:form>

by

<h:link value="edit" outcome="edit">
    <f:param name="id" value="#{o.id}" />
</h:link>

с в edit.xhtml

<f:metadata>
    <f:viewParam name="id" value="#{edit.id}" />
    <f:viewAction action="#{edit.init}" />
</f:metadata>

Вижте също:

person BalusC    schedule 18.05.2015
comment
Благодаря за отговора, но промяната на моя comamndLink на връзка означава, че няма извикване на функцията за редактиране в тестовия клас, нали? Зададох правилни стойности на моите променливи във функцията за редактиране, така че не мога просто да пропусна тази стъпка. - person tom.michalek; 18.05.2015
comment
Вие просто задавате тези стойности въз основа на #{o.id} по време на изграждането на bean-а, свързан с edit.xhtml. Щракнете върху първата връзка Вижте също за подробен пример. Имайте предвид, че никога не публикувам Вижте също връзки за чиста декорация. Всички те наистина отиват в дълбочина на фона на текущия отговор. Следвайте ги, преди да задавате контра въпроси. - person BalusC; 18.05.2015