Я работаю над приложением, в котором пользователи будут оценивать произведение искусства и заполняют форму обзора по мере продвижения.Они могут тратить значительное количество времени на форму, поэтому я хочу сохранять ее автоматически для пользователя, скажем, каждые 5 минут.Я надеялся, что смогу использовать javascript и установить таймер на 5 минут, а затем заставить его выполнить всю форму через ajax, и я смогу сохранить данные в базе данных на случай, если пользователь отключится и т. Д. К сожалению, я не могу найтилюбой способ сделать это.Обновление модели с данными не является проблемой, но я не могу понять, как заставить ее вызывать метод (аналогично тому, как обычно поступает действие, когда оно было отправлено). Я не хочу или не нуждаюсь в этомперерисовать что угодно, просто позвольте мне вызвать метод для сохранения данных.Как я могу это сделать?
Проблемы с реализацией решения
Я пытался реализовать решение скрытой командной ссылки, но у меня очень странное поведение.Я не уверен, что является причиной этого.Во-первых, некоторые сведения о реализации.Форма # 1 создает компонент (не определен) и помещает его во флэш-память, а затем перенаправляет на форму № 2.Форма № 2 - это большая форма, о которой я писал, где я хочу реализовать автосохранение.Форма № 2 имеет компонент ViewScoped.В PostConstruct для этого компонента он получает значение из flash и заполняет поле свойства.Все идет нормально.Это прекрасно работает без JavaScript.Я могу нажать командную кнопку, чтобы отправить форму, и все хорошо.Однако, когда я представляю javascript, когда он выполняется, я получаю исключение нулевого указателя из переменной, которая должна была быть заполнена из флэш-памяти PostConstruct.Как этот javascript мешает этому?После того, как я заполнил свойство bean-объекта видимости объектом, не должно иметь значения, удален ли он из области видимости flash, верно?К вашему сведению, если я удаляю ТОЛЬКО код javascript и оставляю все остальное, он возвращается к нормальной работе, когда я нажимаю кнопку подтверждения.
Форма # 1
<h:form>
... bunch of form objects ...
<h:commandButton "Start New" action="#{someRequestScopedBean.someMethod"/>
</h:form>
код для someRequestScopedBean.Method:
public String someMethod() {
// bunch of logic here
FacesContext.getCurrentInstance()
.getExternalContext()
.getFlash()
.put("myFlashObj", myFlashObj);
return "form2?faces-redirect=true";
}
просмотр области действия, используемой в форме 2:
@ManagedBean
@ViewScoped
public class someViewScopedBean {
//bunch of properties here
@PostConstruct
public void initialize() {
this.myObject = (MyObject) FacesContext.getCurrentInstance()
.getExternalContext()
.getFlash()
.get("myFlashObject");
public void saveDraft() {
// save to database
}
}
Форма 2 страницы:
<h:outputScript library="javax.faces" name="jsf.js"/>
<h:form id="myForm">
... whole bunch of fields here ...
... real button for user to submit ...
<h:commandButton value="Submit myForm"
action="#{someViewScopedBean.save}" />
... hidden button for auto-save by javascript ...
<h:commandLink id="hiddenSaveDraft" style="display: none;"
action="#{someViewScopedBean.saveDraft}" >
<f:ajax execute="@form" />
</h:commandLink>
<script>
function saveDraft() {
document.getElementById('qForm:hiddenSaveDraft').onclick();
window.setTimeout('saveDraft()',15000);
}
saveDraft();
</script>
</h:form>