Estou tentando criar uma aplicação CRUD em JSF.
Antes de mais nada, vou relacionar as fontes que consultei até agora, que não esclareceram minha dúvida:
JavaServer Faces in Action
Mastering JavaServer Faces
StepByStepGuideForBuildingSimpleJSFApp
Core Java Server Faces
Introduction to Java Server Faces (JSF) (Sun ppt)
Bem, eu tenho uma base de dados de uma livraria. Basicamente estou tentando trabalhar com duas tabelas por enquanto, a de livros e a de gêneros. Não estou usando Hibernate ou JPA, tenho classes TO e classes DAO que usam JDBC mesmo.
A primeira tela da aplicação é a listagem dos livros.
Eu redirecionei a página inicial no web.xml:
<welcome-file-list>
<welcome-file>
faces/ListarLivros.jsp
</welcome-file>
</welcome-file-list>
O arquivo ListarLivros.jsp contém o código para listagem. Essa parte está funcionando.
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h3>Livraria</h3>
<f:view>
<h:form>
<h:commandButton value="Novo" action="#{LivroMB.incluir}"/>
</h:form>
<h:form>
<h:dataTable value="#{ListaMB.livros}" var="livro" border="1"
first="#{ListaMB.primeira}" rows="5">
<h:column>
<f:facet name="header"><f:verbatim>Livro ID</f:verbatim></f:facet>
<h:commandButton value="#{livro.livro_id}"/>
</h:column>
<h:column>
<f:facet name="header"><f:verbatim>Titulo</f:verbatim></f:facet>
<h:outputText value="#{livro.titulo}"/>
</h:column>
<h:column>
<f:facet name="header"><f:verbatim>Autor</f:verbatim></f:facet>
<h:outputText value="#{livro.autor}"/>
</h:column>
<h:column>
<f:facet name="header"><f:verbatim>Editora</f:verbatim></f:facet>
<h:outputText value="#{livro.editora}"/>
</h:column>
<h:column>
<f:facet name="header"><f:verbatim>Gênero</f:verbatim></f:facet>
<h:outputText value="#{livro.genero.descricao}"/>
</h:column>
<h:column>
<f:facet name="header"><f:verbatim>Estoque</f:verbatim></f:facet>
<h:outputText value="#{livro.estoque}"/>
</h:column>
<h:column>
<f:facet name="header"><f:verbatim>Preço</f:verbatim></f:facet>
<h:outputText value="#{livro.preco}"/>
</h:column>
</h:dataTable>
<center>
<h:commandButton value="|<" action="#{ListaMB.primeiro}"/>
<h:commandButton value="<" action="#{ListaMB.anterior}"/>
<h:commandButton value=">" action="#{ListaMB.proxima}"/>
<h:commandButton value=">|" action="#{ListaMB.ultimo}"/>
</center>
</h:form>
</f:view>
</body>
</html>
A parte da paginação está OK, funcionando. O botão Incluir exibe um formulário em branco para inclusão.
Eu criei um botão na coluna de id porque quero que o usuário clique nele para editar o registro. Mas como eu passo o id do registro para o ManagedBean?
Tentei vincular o valor pela propriedade binding do commandButton com um atributo da classe LivroMB. Mas não funcionou. Quando clico no botão, o valor do atributo permanece nulo.
Os MBs usados são estes:
LivroMB
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package managedbean;
import dao.GeneroDAO;
import dao.LivroDAO;
import java.util.ArrayList;
import java.util.List;
import javax.faces.component.html.HtmlCommandButton;
import models.LivroTO;
import javax.faces.component.html.HtmlInputText;
import javax.faces.model.SelectItem;
import models.GeneroTO;
/**
*
* @author Unam Power
*/
public class LivroMB {
private GeneroDAO generoDao;
private LivroDAO livroDao;
private LivroTO livro;
private LivroTO estadoLivro;
private HtmlCommandButton botaoId;
public HtmlCommandButton getBotaoId() {
return botaoId;
}
public void setBotaoId(HtmlCommandButton botaoId) {
this.botaoId = botaoId;
}
/** Creates a new instance of LivroManagedBean */
public LivroMB() {
livro = new LivroTO();
livroDao = new LivroDAO();
generoDao = new GeneroDAO();
}
public String incluir()
{
this.setLivro(new LivroTO());
return "editar";
}
public String editar(int livro_id)
{
this.setLivro(livroDao.find(livro_id));
return "editar";
}
public String buscarLivro()
{
LivroDAO dao = new LivroDAO();
livro = dao.find(livro.getLivro_id());
livro = (livro == null ? new LivroTO() : livro);
return null;
}
public String gravarLivro()
{
livroDao.save(livro);
return null;
}
public String cancelar()
{
livro = estadoLivro;
return "listar";
}
public LivroTO getLivro() {
estadoLivro = livro;
return livro;
}
public void setLivro(LivroTO livro) {
this.livro = livro;
}
public List<SelectItem> getGeneros()
{
List<SelectItem> generos = new ArrayList<SelectItem>();
List<GeneroTO> objGeneros = generoDao.listAll();
for (GeneroTO generoTO : objGeneros) {
generos.add(new SelectItem(String.valueOf(generoTO.getGenero_id()),generoTO.getDescricao()));
}
return generos;
}
}
ListaMB
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package managedbean;
import dao.LivroDAO;
import java.util.ArrayList;
import javax.faces.component.html.HtmlCommandButton;
/**
*
* @author Unam Power
*/
public class ListaMB {
private LivroDAO livroDAO;
private ArrayList livros;
private int primeira;
private HtmlCommandButton botaoId;
private String texto;
public ListaMB(HtmlCommandButton botaoId) {
this.botaoId = botaoId;
}
public HtmlCommandButton getBotaoId() {
return botaoId;
}
public void setBotaoId(HtmlCommandButton botaoId) {
this.botaoId = botaoId;
}
public String actionId()
{
String idBotao = botaoId.getValue().toString();
texto = "Livro selecionado: "+idBotao;
return null;
}
public int getPrimeira() {
return primeira;
}
public void setPrimeira(int primeira) {
this.primeira = primeira;
}
public String proxima()
{
primeira += 5;
if (primeira >= livros.size()-5)
{
primeira = livros.size() - 5;
}
return null;
}
public String anterior()
{
primeira -= 5;
if (primeira <0)
{
primeira = 0;
}
return null;
}
public String primeiro()
{
primeira = 0;
return null;
}
public String ultimo()
{
primeira = livros.size()-5;
return null;
}
/** Creates a new instance of TabelaBean */
public ListaMB() {
livroDAO = new LivroDAO();
livros = livroDAO.listAll();
primeira = 0;
}
public ArrayList getLivros() {
return livros;
}
public void setLivros(ArrayList livros) {
this.livros = livros;
}
}