Передать параметр из ManagedBean на страницу jsf

Я работаю с JSF 2.2 и Tomcat 8, и я только начинаю играть с ними.

У меня есть командная кнопка на странице JSF.

<h:commandButton id="newObject" value="New Object" action="#{someObject.someAction}">
<f:param name="object_id" value="#{someObject.object_id}" />
</h:commandButton>

ManagedBean похож на это:

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
@ManagedBean
public class SomeObject implements Serializable{
    private static final long serialVersionUID = 1L;
    private int object_id;
    public int getObject_id() {
        return object_id;
    }
    public void setObject_id(int object_id) {
        this.object_id = object_id;
    }
    public String someAction() {
        setObject_id(sqlInsert());
        if(getObject_id() != 0) {
            System.out.println(getObject_id());
            return "new_page";
        }
    }
}

Метод sqlInsert работает нормально. Я использую его для вставки новой строки в таблицу SQL и получения автоматически сгенерированного ключа, который является целым числом. Если вставка не произошла, она вернет 0.

Я могу перейти к new_page, но param object_id равен 0. Я добавил println, чтобы показать object_id, и это фактический ключ.

Что я делаю неправильно?

1 ответ

Решение

Так как вы используете только @ManagedBean аннотации на вашем управляемом компоненте и без указания явной области действия вашего компонента, ваш компонент будет действовать так, как если бы он был @RequestScoped боб.[см. ссылку]

Поэтому каждый раз, когда вы нажимаете New Object Кнопка, Бин повторно инициализируется, и вы потеряете состояние (значения переменных).

Подумайте и решите, какую область вы хотите использовать [см. Ссылку]. Для ваших требований @ViewScoped может сделать работу за вас.

Другие вопросы по тегам