VRaptor 3 - Iniciando

25 respostas
P

Sou novo em VRaptor. criei um Dinamici web Project no Eclipse baseado no Tomcat. Importei o projeto em branco. atualizei o build path com os nvos jar do projeto

e criei essa

package br.com.caelum.goodbuy;

import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;

@Resource
@Path("mundo")
public class Mundo {

	public String boasVindas() {
		System.out.println("Olá, tudo bom?");
		return "Olá Mundo";
	}
}

Iniciei o servidor, abri o Web Browser do proprio eclipse com a url: http://localhost:8080/goodbuy/mundo/boasVindas
e dá um erro 404, porem não imprime no console a string “Olá, tudo bom?”.

o que estou errando. alguem tem um passo a passo? fiz baseado na apostila da caelum fj-28.

não deve ser coisa mt dificil pra vocês.

me digam o que estou errando.

vlw

25 Respostas

G

Você tem um JSP em /WEB-INF/jsp/mundo/boasVindas.jsp?

P

tenho sim

Guevara

Tenta assim:

package br.com.caelum.goodbuy;

import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;

@Resource
public class IndexController {

private final Result result;

	public IndexController(Result result) {
		this.result = result;
         }

        @Path("/mundo")
	public void boasVindas() {
        result.include("mensagem", "Olá Mundo" );
   }
}

Lá na sua JSP vc coloca:

<p>${mensagem}</p>
P

Nada cara.

saca ai minha estrutura.

manda ai um passo-a-passo basico. tipow: o inicio é assim: cria um projeto (Configura assim na criação, etc), importar o projeto em branco, cria a classe assim(Com exemplo), etc.

Guevara

Clica ali em br.com.caelum.vraptor.blank, vê se têm um IndexController, é ali que vc coloca o código que postei, e é o IndexController que vai chamar sua JSP index que está na pasta index. É assim que funciona, o Controller recebe a requisição, e este chama a JSP que está na pasta que possui o mesmo nome do Controller.

P

como seria a chamada no web browser?

Guevara

Se vc colocar a @Path("/mundo") vc chama http://localhost:8080/nomedaaplicação/mundo

P

nada ainda.

a url ta assim: http://localhost:8080/goodbuy/mundo

Lucas_Cavalcanti

deixe sua classe assim, sem o @Path:

@Resource
public class Mundo {

	public String boasVindas() {
		System.out.println("Olá, tudo bom?");
		return "Olá Mundo";
	}
}

e tente acessar por http://localhost:8080/goodbuy/mundo/boasVindas

se aindar der 404, tenta ver se o contexto da sua aplicação é goodbuy mesmo… ou se na mensagem do 404 aparece uma jsp

Guevara

Renomeou a JSP para boasVindas.jsp? O IndexController está chamando boasVindas e na pasta index vc têm uma JSP index.jsp.

P

Vamos fazer assim:

faz um exemplo simples baseado no que eu estou pedindo. dai eu testo aqui.

Grato

Lucas_Cavalcanti

Um exemplo simples é o VRaptor Blank Project… Se você extrair o zip dele, e ir no eclipse em File >> Import >> Existing projects into workspace e escolher a pasta que vc extraiu, é só clicar com o botão direito no projeto >> Run As >> Run on Server… Vc deveria ver um It works!! VRaptor na tela…

Mas, se você está seguindo a apostila do FJ-28, faça o seguinte:

-Baixe o zip do vraptor (vraptor-3.1.1.zip) (http://tinyurl.com/vr3dw)
-Crie um novo Dynamic Web Project
-copie todos os jars da pasta lib/mandatory e lib/optional do zip do vraptor para a pasta WebContent/WEB-INF/lib
-extraia os arquivos do goodbuy-auxiliar.zip, que vem junto com a apostila, dentro da pasta WebContent
-copie o web.xml do seu projeto atual pra esse projeto novo
-siga a apostila a partir do capítulo do Hibernate ou do capítulo do VRaptor mesmo

P

Resolvendo a questão:

01 - Segui a risca a ultima dica do lucas. e consegui rodar o projeto base do VRaptor
02 - A partir dai, consegui oompreendi como é que funciona a coisa toda, pois sai juntando as dicas anteriores de todos aqui.

e com isso compreendi o seguinte:

01 - A primeira coisa a se fazer(Pelo menos a mais pratica) é começar um novo projeto com base no projeto em branco disponibilizado no proprio VRaptor.
02 - Mude o Context Name da sua aplicação e do web.xml
03 - Para cada classe que você criar, tera que ter uma pasta com o nome dessa classe em: WebContent/Web-Inf/jsp/{nome_da_classe_em_minusculo}
04 - Para cada metodo dessa classe, tera que ter um arquivo jsp associado a esse metodo, caso contrario lhe retornará o erro 404, informando que não encontrou a pagina jsp referente ao metodo
05 - cada metodo é bom anotar o path (@Path("/{coloque_o_nome_aqui}")) dele e na classe a anotação @Resource. Lembrando sempre que o path tem que ter o “/”.
06 - É aconselhavel reiniciar o Servidor, pois ele irá recarregar todas as configurações atualizadas, evitando assim, possiveis erros.

acho que é isso. mais importante do que postar as perguntas e possiveis soluções que os amigos aqui fazem, é primordial, postar sua solução, por que muitas vezes ela pode ser, Também, a solução para outros.

Mais tenho uma pequena duvida que ta pertubando meu sono: [color=darkred]Se pra cada metodo eu tenho uma jsp associado. Como faço pra ter uma pagina mista: Listagem dos menus cadastrados na tabela de Menu, listar os usuarios ativos, os produtos cadastrados, etc???[/color]

[color=red]Muito Obrigado mesmo a todos, foram de extrema importancia para meu aprendizado. A gradeço de coração o esforço de todos aqui de terem me respondido tão rapido e tão tarde da noite. Não vou sitar nomes mais não desmerecer ninguem. Todos(muito ou pouco) contribuiram para meu aprendizado.[/color]

Guevara

Nesse caso vc pode ter uma pagina jsp que vai receber td isso, quem vai mandar é o Controller desta forma:

private final Result result;
	private ClienteDAO clienteDao;
	private MenuDAO menuDAO;

	public IndexController(Result result, ImovelDAO imovelDao, ClienteDAO clienteDAO) {
		this.result = result;
		this.imovelDao = imovelDao;
                this.clienteDAO = clienteDAO;
	}
@Path("/lista")
	public void lista() {
		result.include("cliente", clienteDAO.lista());
	        result.include("menu", menuDAO.lista());
        }

Acima estou mandando duas listas para uma JSP chamada lista, ai nessa JSP vc precisa receber os parâmetros desta forma:
Exemplo:

<table>
    <tr>
    <td width="100">C&oacute;digo</td>
    <th width="200">Nome</th>         
    </tr>  
    
    
<c:forEach var="cliente" items="${clienteList}">
    <tr>      
        <td>${cliente.codClientel }</td>
        <td>${cliente.nome }</td>             
    </tr>
</c:forEach>
    </table>

E faz uma outra tabela pro Menu por exemplo, seguindo esse exemplo acima.
Eu uso aqui o framework Displaytag para fazer tabelas.
http://displaytag.homeip.net/displaytag-examples-1.2/

Lucas_Cavalcanti

só corrigindo, o nome da pasta tem que ser WEB-INF, tudo em maiúsculo…

pra que várias lógicas usem a mesma jsp você pode fazer:

public class MeuController {
  public MeuController(Result result) {
     this.result = result;
  }
  public void lista() { 
  }
  public void listaAtivos() {
      result.of(this).lista(); // usa o jsp do método lista()
  }
}
P

Como seria uma relação Mestre-Detalhe?

Lucas_Cavalcanti

Mestre-Detalhe?

P

Para cada Pedido eu tenho uma relação de items. isso seria metre deatlhe.

digamos que eu queira listar todos os pedidos, mais com os itens intercalados. sacou?

Exemplo Pratico:

Exemplo Mestre Detalhe (Cliente - Dependentes);

01 - João de Doria (Cliente)
01.1 - João de Doria Junior (Dependente)

01 - Roberto Justos (Cliente)
01.1 - Roberto Justos Jr. (Dependente)
02.2 - Leila Pinheiros (Dependente)

…etc.

Lucas_Cavalcanti

se vc está usando o hibernate, com um relacionamento @OneToMany, é só listar os pedidos, e no jsp fazer:

<c:forEach items="${pedidoList}" var="pedido">
     ...
    <c:forEach items="${pedido.items}" var="item">
        ...
    </c:forEach>
</c:forEach>
P

Lucas Cavalcanti:
se vc está usando o hibernate, com um relacionamento @OneToMany, é só listar os pedidos, e no jsp fazer:

<c:forEach items="${pedidoList}" var="pedido"> ... <c:forEach items="${pedido.items}" var="item"> ... </c:forEach> </c:forEach>

Po, desculpas, não compreendi. explica com mais detalhes

Lucas_Cavalcanti

suponha que vc tenha uma classe assim:

public class Pedido {
   //...
   private List<Item> itens;
   //getters e setters
}

daí vc pode usar o código que eu mandei na jsp para listar pedidos, mostrando os itens aninhados…

se vc nunca usou o <c:forEach, dá uma olhada na apostila do FJ-21 da caelum: http://www.caelum.com.br/curso/fj-21-java-web/

P

Ainda to apanhando. Acho que é o hibernate.

Como seria o mapeamento por exemplo: Pedido / Item

Pedido
codigo,
data,
total

Item
codigo_pedido,
item,
valor

algo simples pra não complicar mt

Lucas_Cavalcanti

com o hibernate vc não vai ter que se preocupar em como vai ficar o seu banco de dados (pelo menos não no começo)… é só criar classes Java, e fazer o relacionamento entre os objetos mesmo, colocar algumas anotações nas classes e o Hibernate vai se virar pra criar e popular as tabelas depois…

P

Tu pode me dar um exemplo?

Obrigado e me desculpa por estar abusando da sua boa vontade.

Lucas_Cavalcanti

um exemplo talvez seja um pouco grande… mas vc pode encontrar um na apostila do FJ-21 que eu te passei o link

Criado 25 de abril de 2010
Ultima resposta 26 de abr. de 2010
Respostas 25
Participantes 4