Checkbox no Vraptor

6 respostas
101574

Galera,

Como eu faço, tenho uma lista de produtos.
Onde tenho nome do produto, valor e quantidade.

Quero colocar um checkbox, e no final da página um botão adicionar.
O cliente vai marcar o produto, e entrar com a quantidade.

E no final da página, apertar o botão adicionar.

Minha jsp está assim.

<table>
<thead>
<tr>
<th> </th>
<th>Departamento</th>
<th>Nome</th>
<th>Fabricante</th>
<th>NCM_SH</th>
<th>Preço</th>
<th>Qt</th>
<th>Ativo</th>
</tr>
</thead>
<tbody>
<form action="<c:url value="/produtoEmpresa"/>" method="POST">
<!-- Adicionando o produto a Empresa -->
<input type="hidden" name="produtoEmpresa.cod_produto"
value="${produto.id}"/>
<input type="hidden" name="produtoEmpresa.cod_empresa"
value="1"/>
<c:forEach items="${produtoList}" var="produto">
<tr>
<td><input type="checkbox"name="escolhido"value=""> </td>
<td>${produto.departamento.nome}</td>
<td>${produto.nome}</td>
<td>${produto.fabricante}</td>
<td>${produto.ncm}</td>
<td><input type="text" size="5" name="produtoEmpresa.preco" value="${produtoEmpresa.preco}"></td>
<td><input type="text" size="5" name="produtoEmpresa.quantidade_estoque" value="${produtoEmpresa.quantidade_estoque}"></td>
<td>
<label for="ativo">Ativo:</label>
<input type="radio" name="produtoEmpresa.ativo" value="1"> Sim <input type="radio" name="produtoEmpresa.ativo" value="0"> Não 
</td>
</tr>
</c:forEach>
<button type="submit">Adicionar</button>
</form>
</tbody>
</table>

Testei com apenas um produto está funcionando.
Flw.

valeu.

6 Respostas

renanreismartins

se vc espera receber mais de um objeto no seu controller
vc deve passar o parametro assim:

produtoEmpresa[0].atributo = valor

abrasss

101574

Entendi!

Mas como eu faço.rsrs.

Porque assim, estou iniciando em java, e no vraptor.

Então, eu tenho um controller no Vraptor. Que adiciona os produtos.

@Post("/produtoEmpresa")
		public void adiciona(final ProdutoEmpresa produtoEmpresa) {
		  dao.salva(produtoEmpresa);
		//Redireciona para a listagem, após a inserção.
		result.redirectTo(this).lista();

Como eu faço isso na minha jsp, e aqui no meu controller?
Valeu!!!

101574

Seguinte,

Eu implementei assim.

<form action="<c:url value="/produtoEmpresa"/>" method="POST">
<c:forEach items="${produtoList}" var="produto" varStatus="s">
<tr>
<td><input type="checkbox"name="escolhidos[${s.index}]"> </td>

///Outros campos

<!-- Adicionando o produto a Empresa -->
<input type="hidden" name="produtoEmpresa.produto2.id"
value="${produto.id}"/>
<input type="hidden" name="produtoEmpresa.empresa2.id"
value="1"/>
</c:forEach>
<button type="submit">Adicionar</button>
</form>

Olha o erro que o Hibernate deu.

br.com.caelum.vraptor.http.InvalidParameterException: Exception when trying to instantiate Target(name=produtoEmpresa, type=class br.com.softsol.compresempre.modelo.ProdutoEmpresa)
java.lang.IllegalStateException: Expecting only one parameter named after Target(name=preco, type=class java.lang.String), found instead [Parameter(preco -> 99), Parameter(preco -> 88), Parameter(preco -> 77), Parameter(preco -> 66), Parameter(preco -> 55)]

Pelo que eu entendi. O código está passando o preço inúmeras vezes na mesma instância. E eu preciso que isso seja feito um por um.
Como eu faço isso?

Obrigado.
Valeu.

renanreismartins

o erro não é do hibernate, é pq vc ta passando o atributo de forma errada pro vraptor.

vamos supor que vc quer passar vários objetos ProdutoEmpresa.

entao vc deve fazer o controller receber uma coleção ou uma lista, tipo:

@Post("/produtoEmpresa")  
public void adiciona(List<ProdutoEmpresa> produtoEmpresa) {  ...

e no jsp:

<input type="hidden" name="produtoEmpresa[0].atributo"  
value="valor"/> 

<input type="hidden" name="produtoEmpresa[0].atributo2"  
value="valor"/>

posta sua classe produtoEmpresa caso nao consiga.

abrasss

101574

Olha o que eu fiz.

&lt;form action="&lt;c:url value="/produtoEmpresa"/&gt;" method="POST"&gt;
&lt;c:forEach items="${produtoList}" var="produto" varStatus="s"&gt;
&lt;tr&gt;
&lt;td&gt;&lt;input type="checkbox"name="escolhidos"&gt; &lt;/td&gt;
&lt;td&gt;${produto.departamento.nome}&lt;/td&gt;
&lt;td&gt;${produto.nome}&lt;/td&gt;
&lt;td&gt;${produto.fabricante}&lt;/td&gt;
&lt;td&gt;${produto.ncm}&lt;/td&gt;
&lt;td&gt;&lt;input type="text" size="5" name="produtoEmpresa[${s.index }].preco" value="${produtoEmpresa.preco}"&gt;&lt;/td&gt;
&lt;td&gt;&lt;input type="text" size="5" name="produtoEmpresa[${s.index }].quantidade_estoque" value="${produtoEmpresa.quantidade_estoque}"&gt;&lt;/td&gt;
&lt;td&gt;
&lt;label for="ativo"&gt;Ativo:&lt;/label&gt;
&lt;input type="radio" name="produtoEmpresa[${s.index }].ativo" value="1"&gt; Sim &lt;input type="radio" name="produtoEmpresa[${s.index }].ativo" value="0"&gt; Não 
&lt;/td&gt;
&lt;/tr&gt;
&lt;!-- Adicionando o produto a Empresa --&gt;
&lt;input type="hidden" name="produtoEmpresa[${s.index }].produto2.id"
value="${produto.id}"/&gt;
&lt;input type="hidden" name="produtoEmpresa[${s.index }].empresa2.id"
value="1"/&gt;
&lt;/c:forEach&gt;
&lt;button type="submit"&gt;Adicionar&lt;/button&gt;
&lt;/form&gt;

No controller.

//Adicionar
		@Post("/produtoEmpresa")
		public void adiciona(final List&lt;ProdutoEmpresa&gt; produtoEmpresa) {
			dao.salva(produtoEmpresa);
			//Redireciona para a listagem, após a inserção.
			result.redirectTo(this).lista();
}

No meu dao

public void salva(List&lt;ProdutoEmpresa&gt; produtoEmpresa) {
			Transaction tx = session.beginTransaction();
			session.save(produtoEmpresa);
			tx.commit();
		}

E deu o erro.

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: org.hibernate.MappingException: Unknown entity: java.util.ArrayList
renanreismartins

isso, perfeito os parâmetros estão sendo passados corretamente ao vraptor, porém o hibernate não pode salvar uma List diretamente. Vc deve salvar cada objeto separado. Algo como:

public void salva(List<ProdutoEmpresa> produtoEmpresa) {  
Transaction tx = session.beginTransaction();
  for(ProdutoEmpresa prod : produtoEmpresa) {
   session.save(produtoEmpresa);  
  }
tx.commit();  
}
Criado 16 de outubro de 2012
Ultima resposta 16 de out. de 2012
Respostas 6
Participantes 2