Я изучаю Java EE 6 и JSF 2.0 на JBoss6 и создал очень простое одностраничное приложение Todo, которое работает, но с очень странной ошибкой. Протестировано в Safari 5.0.5 и Firefox 5.
Есть два действия, которые вы можете сделать (добавить задачу и поставить/снять отметку с задач). Все это работает, но не в первый раз, когда действие выполняется после того, как было выполнено другое действие.
И пример использования может выглядеть так:
- попробуйте добавить todo = успех
- попробуйте добавить todo = успех
- попробуй проверить todo = не получится
- попытаться проверить задачу = успех
- попробуйте добавить todo = не получится
- попробуйте добавить todo = успех
- попробуй проверить todo = не получится
Приложение имеет следующие основные файлы (плюс другие фрагменты):
- entity/Todo.java ‹- сущность JPA
- manager/TodoManager.java ‹ — EJB для обработки сущностей Todo, @Stateless
- controllers/TodoController.java ‹- управляемый компонент для страницы, @SessionScoped
- todos.xhtml ‹ — страница JSF
Нет лиц-config.xml
Форма для добавления задачи выглядит так:
<h:panelGroup id="projects">
<h:message for="newtitle" />
<h:form id="newtodo">
<h:panelGrid columns="5">
<h:outputText value="New Todo: "/>
<h:inputText id="newtitle" value="#{todoController.todo.title}" />
<h:outputText value="Due: "/>
<h:inputText id="newDueDate" value="#{todoController.todo.dueDate}">
<f:convertDateTime pattern="dd/mm/yyyy"/>
</h:inputText>
<h:commandButton action="#{todoController.addTodo}" value="add">
<f:ajax execute="@form" render=":projects"/>
</h:commandButton>
форма для проверки/снятия отметки со статусом «готово» выглядит следующим образом:
<h:form>
<h:dataTable id="todolist" var="t" value="#{todoController.todolist}">
<h:column>
<h:selectBooleanCheckbox id="rowCheckbox" value="#{t.done}" >
<f:ajax event="click" listener="#{todoController.updateDone(t)}" render=":projects"/>
</h:selectBooleanCheckbox>
</h:column>
TodoController выглядит следующим образом:
@ManagedBean(name="todoController")
@SessionScoped
public class TodoController
{
@EJB
private TodoManager todoManager;
private Todo todo = new Todo();
private ArrayList<Todo> todolist = new ArrayList<Todo>();
public String addTodo()
{
todo.setDone(false);
todo.setUser(this.getLoggedInUser());
todoManager.addTodo(todo);
todo = null;
return "todos.xhtml";
}
public String updateDone(Todo t)
{
t.setDone(!t.getDone());
todoManager.updateTodo(t);
return "todos.xhtml";
}
Я добавил сообщения регистрации в addTodo() и updateDone(Todo t), чтобы проверять, когда они вызываются. Когда действия «не работают», кажется, что они вообще не вызываются. :-(