Struts 1 - Como montar jsp que exibe lista de itens com radiobuttons para cada item?

Pessoal,

Sou iniciante em Struts e estou fazendo um trabalho. Gostaria de montar uma jsp contendo uma tabela de livros, tendo associado a cada linha linha da tabela (um livro) um rádio que receberá o codigo do livro e ao dar submit nesta página chamará a jsp com os dados do livro marcado para alteração.

Segui mais ou menos o exemplo da apostila JakartaStrutsLive.pdf, (http://www.cin.ufpe.br/~rdma/documentos/JakartaStrutsLive.pdf).
Traduzi os objetos e classes do exemplo do livro para meu escopo. Não mexi em mais nada.

No entanto tá dando um erro na jsp que deveria mostrar a lista. Tô desesperada. Se alguém tiver algum exemplo parecido prá fazer essa lista com radios para alteração e uma lista com checkboxes para fazer exclusões mútuas agradeço.

Vou passar os códigos e a página de erro a seguir prá ver se alguém pode me ajudar:

//////////////////////////////////////////////////
classe Livro:
public class Livro extends Publicacao {

private int isbn;
private String autor;
private String assunto;
private int numEdicao;
private int qtdPaginas;

public Livro(){}

public Livro(int codigo, String titulo, int ano, String tipoMidia, String editora, int isbn, String autor, String assunto, int numEdicao, int qtdPaginas){
super(codigo,titulo,ano,tipoMidia,editora);
this.isbn = isbn;
this.autor = autor;
this.assunto = assunto;
this.numEdicao = numEdicao;
this.qtdPaginas = qtdPaginas;
}
…//getters & setters
}

//////////////////////////////////////////////////
Classe ItemLivro:
public class ItemLivro implements Serializable{
private Livro livro = new Livro();
private boolean marcado = false;

public Livro getLivro() {
return livro;
}

public void setLivro(Livro livro) {
this.livro = livro;
}

public boolean isMarcado() {
return marcado;
}

public void setMarcado(boolean marcado) {
this.marcado = marcado;
}
}

//////////////////////////////////////////////////
Meu ActionForm:
public class ListaLivrosActionForm extends org.apache.struts.action.ActionForm {

private ItemLivro[] livros = new ItemLivro[0];

public ItemLivro getLivro(int index) {
return getLivros()[index];
}

public void setLivro(int index, ItemLivro livro) {
this.getLivros()[index] = livro;
}

public void setListaLivros(List lista) {

List listaLivros = new ArrayList(lista.size());
Iterator iterator = lista.iterator();
while (iterator.hasNext())
{
ItemLivro itemLivro = new ItemLivro();
Livro livro = (Livro) iterator.next();
itemLivro.setLivro(livro);
listaLivros.add(itemLivro);
}
livros=((ItemLivro[]) listaLivros.toArray(new ItemLivro[listaLivros.size()]));
}

public ItemLivro[] getLivros() {
return livros;
}

public void setLivros(ItemLivro[] livros) {
this.livros = livros;
}
}

//////////////////////////////////////////////////
Minha Action:
public class ListarLivrosAlteracaoAction extends org.apache.struts.action.Action {

private final static String SUCCESS = “listaAlteracaoLivros”;

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

MidiaDAO operacao = new MidiaDAO();
ListaLivrosActionForm listaLivrosForm = (ListaLivrosActionForm) form;
List livros = operacao.listarLivros();
listaLivrosForm.setListaLivros(livros);
request.setAttribute(“livros”, listaLivrosForm);
return (mapping.findForward(SUCCESS));
}
}

//////////////////////////////////////////////////
Meu struts-config.xml:

<form-beans>
<form-bean name=“ListaLivrosActionForm” type=“controles.ActionForms.ListaLivrosActionForm”/>
</form-beans>

<global-forwards>

<forward name=“exibeListaLivrosAlteracao” path="/ListarLivrosAlteracao.do"/>

</global-forwards>
<action-mappings>

<action path="/ListarLivrosAlteracao"
name=“ListaLivrosActionForm"
type=“controles.Actions.ListarLivrosAlteracaoAction"
scope=“request” validate=“false”>
<forward name=“listaAlteracaoLivros” path=”/listaLivrosAlteracao.jsp”/>
</action>

</action-mappings>

//////////////////////////////////////////////////
Minha JSP que exibe a lista: ([color=red][/color]A MINHA JSP FICOU UM POUCO DIFERENTE DA DO EXEMPLO)
<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
http://www.w3.org/TR/html4/loose.dtd”>
<%@ page contentType=“text/html” pageEncoding=“UTF-8”%>
<%@ taglib uri="/WEB-INF/struts-bean" prefix=“bean” %>
<%@ taglib uri="/WEB-INF/struts-html" prefix=“html” %>
<%@ taglib uri="/WEB-INF/struts-logic" prefix=“logic” %>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
<html>
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8”>
<title><bean:message key=“titulo.lista.alteracao.livro”/></title>
</head>
<body>
<center><h1><bean:message key=“cabecalho.lista.alteracao.livro”/></h1><center>
<html:form action="/tratarOpcao.do">
<table border=“1”>
<tr>
<td>Código </td>
<td>ISBN </td>
<td>Título </td>
<td>Autor </td>
<td>Assunto </td>
<td>Editora </td>
<td>Nº Edição </td>
<td>Ano </td>
<td>Total de Páginas</td>
<td>Tipo de Mídia </td>
</tr>
<logic:iterate id=“itemLivro” indexId=“index” name=“ListaLivrosActionForm” property=“livros”>
<tr>
<td><html:radio property=“itemLivro” value=“marcado”/>
<bean:write name=“itemLivro” property=“codigo” /></td>
<td><bean:write name=“itemLivro” property=“isbn” /></td>
<td><bean:write name=“itemLivro” property=“titulo” /></td>
<td><bean:write name=“itemLivro” property=“autor” /></td>
<td><bean:write name=“itemLivro” property=“assunto” /></td>
<td><bean:write name=“itemLivro” property=“editora” /></td>
<td><bean:write name=“itemLivro” property=“numEdicao” /></td>
<td><bean:write name=“itemLivro” property=“ano” /></td>
<td><bean:write name=“itemLivro” property=“qtdPaginas”/></td>
<td><bean:write name=“itemLivro” property=“tipoMidia” /></td>
</tr>
</logic:iterate>
</table>
<html:submit property=“botao” value=“Alterar Livro”>
<bean:message key=“botao.lista.alteracao.livro.sumit”/>
</html:submit>
</html:form>
</body>
</html>

//////////////////////////////////////////////////
Agora o malfadado erro:

HTTP Status 500 -


type Exception report

message

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: javax.servlet.jsp.JspException: No getter method available for property itemLivro for bean under name org.apache.struts.taglib.html.BEAN
root cause

javax.servlet.jsp.JspException: No getter method available for property itemLivro for bean under name org.apache.struts.taglib.html.BEAN
note The full stack traces of the exception and its root causes are available in the Sun Java System Application Server 9.1_01 logs.


Sun Java System Application Server 9.1_01

Desde já agradeço muito a quem puder me ajudar. Realmente tô muito desesperada :roll:

Abçs,
Mônica.

Ola…

primeiro de tudo de uma lida nisso aqui http://www.guj.com.br/posts/list/50115.java

No seu ActionForm, em vez de criar private ItemLivro[] livros = new ItemLivro[0]; , vc tem que criar

private String []livros;

public String[] getLivros() 
	{
		return livros;
	}
	public void setLivros(String[] livros) 
	{
		this.livros = livros;
	}

e no JSP:

//checkbox
<logic:iterate id="livro" name="livros" scope="request">
	<html:multibox property="livro">
		<bean:write property="isbn" name="livro"/>
	</html:multibox>
	<bean:write property="titulo" name="livro" />
</logic:iterate>

//radio
<logic:iterate id="livro" name="radioLivros" scope="request">
           <input type="radio" id="teste" name="radioLivros" value="<bean:write property="isbn" name="livro" />"/>	
            <bean:write property="titulo" name="livro" />
</logic:iterate>

pois qdo vc marcar as opções,e der o submit ele vai retornar o “isbn” num array de String… não do do tipo do objeto “ItemLivro”…

é mais ou menos isso…

Oi Felipe !!!

Já tô respondendo de acordo do o manualzinho que vc me mandou :lol: rsrsrs.

Consegui resolver o problema da lista de itens com radiobuttons. Enfim a lista apareceu. Mas só tem um probleminha rsrsrs. Eu queria todos os rádios em branco e o último tá marcado. [color=red]Tem como resolver isso ?![/color] Se puder ajudar agradeço muito ok ??? Mas prá ajudar outros colegas plemo menos a sair do zero, repasso as minhas classes que até então ficaram da seguinte forma:

Classe ItemLivro:

public class ItemLivro{

    private String botao;
    private int    codigo;
    private int    isbn;
    private String titulo;
    private String autor;
    private String assunto; 
    private String editora;
    private int    numEdicao;
    private int    ano;
    private int    qtdPaginas;
    private String tipoMidia;
    
    //... depois os getters & setters
}

O ActionForm:

[code]
public class ListaLivrosActionForm extends org.apache.struts.action.ActionForm {

private ItemLivro[] livros;

public ItemLivro[] getLivros() {
    return livros;
}

public void setLivros(ItemLivro[] livros) {
    this.livros = livros;
}

public void setListaLivros(List lista) {
	
    List listaLivros = new ArrayList(lista.size());
    Iterator iterator = lista.iterator();
    while (iterator.hasNext())
    {
        ItemLivro itemLivro = new ItemLivro();
        Livro livro = (Livro) iterator.next();
        
        itemLivro.setBotao("");
        itemLivro.setCodigo(livro.getCodigo());
        itemLivro.setIsbn(livro.getIsbn());
        itemLivro.setTitulo(livro.getTitulo());
        itemLivro.setAutor(livro.getAutor());
        itemLivro.setAssunto(livro.getAssunto());
        itemLivro.setEditora(livro.getEditora());
        itemLivro.setNumEdicao(livro.getNumEdicao());
        itemLivro.setAno(livro.getAno());
        itemLivro.setQtdPaginas(livro.getQtdPaginas());
        itemLivro.setTipoMidia(livro.getTipoMidia());
        
        listaLivros.add(itemLivro);
    }
livros=((ItemLivro[]) listaLivros.toArray(new ItemLivro[listaLivros.size()]));
}

}[/code]

a Action:

public class ListarLivrosAlteracaoAction extends org.apache.struts.action.Action {
    
    private final static String SUCCESS = "listaAlteracaoLivros";
    
    public ActionForward execute(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        LinkedList livros = new LinkedList();
        MidiaDAO operacao = new MidiaDAO();
        livros = operacao.listarLivros();
        ListaLivrosActionForm livroForm = (ListaLivrosActionForm) form;
        livroForm.setListaLivros(livros);
        BeanUtils.copyProperties(livroForm,livros);
        request.setAttribute("livros", livros);
        return mapping.findForward(SUCCESS);
    }
}

A JSP:

&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;%@ page contentType="text/html" pageEncoding="UTF-8"%&gt;
&lt;%@ taglib uri="/WEB-INF/struts-bean" prefix="bean" %&gt;   
&lt;%@ taglib uri="/WEB-INF/struts-html" prefix="html" %&gt;   
&lt;%@ taglib uri="/WEB-INF/struts-logic" prefix="logic" %&gt;
&lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %&gt;   

&lt;html&gt;
    &lt;head&gt;
        &lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;
        &lt;title&gt;&lt;bean:message key="titulo.lista.livro"/&gt;&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;center&gt;&lt;h1&gt;&lt;bean:message key="cabecalho.lista.livro"/&gt;&lt;/h1&gt;&lt;center&gt;
        &lt;html:form action="/tratarOpcao.do"&gt;   
            &lt;logic:present name="livros"/&gt;
                &lt;table border="1"&gt;   
                    &lt;tr&gt;   
                        &lt;td&gt;Código          &lt;/td&gt;   
                        &lt;td&gt;ISBN            &lt;/td&gt;   
                        &lt;td&gt;Título          &lt;/td&gt;   
                        &lt;td&gt;Autor           &lt;/td&gt;   
                        &lt;td&gt;Assunto         &lt;/td&gt;   
                        &lt;td&gt;Editora         &lt;/td&gt;   
                        &lt;td&gt;Nº Edição       &lt;/td&gt;   
                        &lt;td&gt;Ano             &lt;/td&gt;   
                        &lt;td&gt;Total de Páginas&lt;/td&gt;   
                        &lt;td&gt;Tipo de Mídia   &lt;/td&gt;   
                    &lt;/tr&gt;
                    &lt;logic:iterate id="itemLivro" indexId="index" name="ListaLivrosActionForm" property="livros"&gt;
                    &lt;tr&gt;    
                        &lt;td&gt;&lt;html:radio name="itemLivro" property="botao" value="codigo"/&gt;&quot;/&gt;                       
                            &lt;bean:write name="itemLivro" property="codigo"    /&gt;&lt;/td&gt;
                        &lt;td&gt;&lt;bean:write name="itemLivro" property="isbn"      /&gt;&lt;/td&gt;
                        &lt;td&gt;&lt;bean:write name="itemLivro" property="titulo"    /&gt;&lt;/td&gt;
                        &lt;td&gt;&lt;bean:write name="itemLivro" property="autor"     /&gt;&lt;/td&gt;
                        &lt;td&gt;&lt;bean:write name="itemLivro" property="assunto"   /&gt;&lt;/td&gt;
                        &lt;td&gt;&lt;bean:write name="itemLivro" property="editora"   /&gt;&lt;/td&gt;
                        &lt;td&gt;&lt;bean:write name="itemLivro" property="numEdicao" /&gt;&lt;/td&gt;
                        &lt;td&gt;&lt;bean:write name="itemLivro" property="ano"       /&gt;&lt;/td&gt;
                        &lt;td&gt;&lt;bean:write name="itemLivro" property="qtdPaginas"/&gt;&lt;/td&gt;
                        &lt;td&gt;&lt;bean:write name="itemLivro" property="tipoMidia" /&gt;&lt;/td&gt;
                    &lt;/tr&gt;
                    &lt;/logic:iterate&gt;    
                &lt;/table&gt;        
                &lt;html:submit property="botao" value="Novo Livro"&gt;
                    &lt;bean:message key="botao.lista.livro.sumit"/&gt;
                &lt;/html:submit&gt;   
        &lt;/html:form&gt;   
    &lt;/body&gt;
&lt;/html&gt;

Falow.

Pelo menos usou alguma coisa que te mandei né… hoho… pq o código não usou nada …:slight_smile:

Então… do jeito que eu tinha mostrado… no jsp só iria ficar marcado algum radio… se no seu form, aquele String []livros
tivesse algum valor (os ids dos livros)… entende??

mas é isso ai…

Oi Felipe,

Sua sugestão de código me ajudou muito sim :thumbup:. Só que como tinha que exibir a lista em forma de tabela, aí a visualização não ficava legal mostrando o rádio com todos os dados do livro ao lado. Mas a sua dica me ajudou e muito a chegar à solução que eu queria.

Quanto ao rádio, resolvi o problema: mudei o tipo do botão no ActionForm para int e na JSP coloquei a propriedade value=“codigo”.

De qq forma vlw mesmo pela ajuda. A página ficou show :lol:.

Abração.

Oi de novo :lol: rsrsrs.

Esqueci de postar as classes com as correções para que o radio ficasse desmarcado em todos os itens da Lista.
Só as duas classes abaixo sofreram alteração.

A Classe ItemLivro:

public class ItemLivro{   
  
    private int    botao; // estava antes com tipo String
    private int    codigo;   
    private int    isbn;   
    private String titulo;   
    private String autor;   
    private String assunto;   
    private String editora;   
    private int    numEdicao;   
    private int    ano;   
    private int    qtdPaginas;   
    private String tipoMidia;   
       
    //... depois os getters & setters   
}  

O ActionForm:

public class ListaLivrosActionForm extends org.apache.struts.action.ActionForm {   
  
private ItemLivro[] livros;   
  
    public ItemLivro[] getLivros() {   
        return livros;   
    }   
  
    public void setLivros(ItemLivro[] livros) {   
        this.livros = livros;   
    }   
  
    public void setListaLivros(List lista) {   
           
        List listaLivros = new ArrayList(lista.size());   
        Iterator iterator = lista.iterator();   
        while (iterator.hasNext())   
        {   
            ItemLivro itemLivro = new ItemLivro();   
            Livro livro = (Livro) iterator.next();   
               
            itemLivro.setBotao(livro.getCodigo()); // estava antes como itemLivro.setBotao("")
            itemLivro.setCodigo(livro.getCodigo());   
            itemLivro.setIsbn(livro.getIsbn());   
            itemLivro.setTitulo(livro.getTitulo());   
            itemLivro.setAutor(livro.getAutor());   
            itemLivro.setAssunto(livro.getAssunto());   
            itemLivro.setEditora(livro.getEditora());   
            itemLivro.setNumEdicao(livro.getNumEdicao());   
            itemLivro.setAno(livro.getAno());   
            itemLivro.setQtdPaginas(livro.getQtdPaginas());   
            itemLivro.setTipoMidia(livro.getTipoMidia());   
               
            listaLivros.add(itemLivro);   
        }   
    livros=((ItemLivro[]) listaLivros.toArray(new ItemLivro[listaLivros.size()]));   
    }   
}  

É isso. Vlw mais uma vez.

Abração.

aquilo foi só um exemplo… mas que bom que funcionou…

abraco

Dê uma olhada no “foreach” é bem interessante e rápido.

Att,
Vinicius