Я изучаю Java EE 6 и JSF 2.0 на JBoss6 и создал очень простое одностраничное приложение "Todo", которое работает, но с очень странной ошибкой. Протестировано в Safari 5.0.5 и Firefox 5.
Есть два действия, которые вы можете сделать (добавить задачу и проверить / снять галочку с задач). Это все работает, но не в первый раз, когда действие выполняется после выполнения другого действия.
И пример использования может выглядеть так:
- попробуйте добавить задачу = успех
- попробуйте добавить задачу = успех
- попытаться проверить todo = fail
- попытаться проверить задачу = успех
- попробуйте добавить todo = fail
- попробуйте добавить задачу = успех
- попытаться проверить todo = fail
Приложение имеет следующие основные файлы (плюс другие фрагменты):
- entity / Todo.java <- JPA entity </li>
- Manager / TodoManager.java <- EJB для обработки сущностей Todo, @ Stateless </li>
- controllers / TodoController.java <- управляемый компонент для страницы, @SessionScoped </li>
- todos.xhtml <- страница JSF </li>
Без лица-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>
Форма для проверки / снятия статуса todo "done" выглядит следующим образом:
<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), чтобы проверить, когда их вызывают. Когда действия "не работают", на самом деле, кажется, их вообще не вызывают. : - (