Controllers e JSP do VRaptor

Olá,

Gostaria de esclarecer uma dúvida: toda página JSP que eu criar deverá ter obrigatoriamente um Controller associado para funcionar? Por exemplo, digamos que eu criei uma página teste.jsp, esta página é estática, não recebe dados dinâmicos, para chamar esta página eu preciso de um controller, por exemplo TesteController.java:

[code]package br.com.caelum.vraptor.blank;

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

@Resource
public class TesteController {

public TesteController(){
}

@Path("/teste")
public void teste(){
	//Nenhuma tarefa, apenas chamar teste.jsp
}

}[/code]
As páginas JSP criadas sempre devem estar dentro de pastas, com o mesmo nome: WEB-INF/jsp/<nome do jsp> ? Aguardo as resposta.

Abraço. :smiley:

vc pode ter páginas sem um controller, porém a mesma não poderá ficar dentro de WEB-INF…

creio que mesmo não precisando é melhor seguir a convenção, usar um controller e sua jsp na respectiva página.

abrasss

Certo,

E um Controller pode ter mais de um método, chamando páginas JSP diferentes? Por exemplo:

[code]package br.com.caelum.vraptor.blank;

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

@Resource
public class TesteController {

public TesteController(){
}

@Path("/teste")
public void teste(){
	//Nenhuma tarefa, apenas chamar teste.jsp
}

@Path("/exemplo")
public void exemplo(){
    //Nenhuma tarefa, apenas chamar exemplo.jsp
}

}[/code]
Ou ainda, passando parâmetros pela URL, especificando a chamada:

[code]package br.com.caelum.vraptor.blank;

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

@Resource
public class TesteController {

public TesteController(){
}

@Path("/teste?pag=teste")
public void teste(){
	//Nenhuma tarefa, apenas chamar teste.jsp
}

@Path("/teste?pag=exemplo")
public void exemplo(){
    //Nenhuma tarefa, apenas chamar exemplo.jsp
}

}[/code]
Está correto? Ou existem outras formas de fazer?

thiago,

a convenção é /WEB-INF/jsp//.jsp

no caso do TesteController.exemplo() ficaria /WEB-INF/jsp/teste/exemplo.jsp

se vc não colocar o @Path ele tb segue a convenção. Ficaria /teste/teste e /teste/exemplo

@Path com ? não funciona, e não é o melhor jeito de fazer. Se a idéia é usar a mesma jsp vc pode fazer:

@Resource  
public class TesteController {  
      
    public TesteController(Result result){  
        this.result = result;
    }  
      
    @Path("/teste")  
    public void teste(){  
        //Nenhuma tarefa, apenas chamar teste.jsp  
    }  
  
    @Path("/exemplo")  
    public void exemplo(){  
        result.forwardTo(this).teste(); // também usa a teste.jsp
    }  
}  

Entendi. No exemplo abaixo, caso seja feito uma chamada para [RootContext]/teste/exemplo ele repassa o result do método exemplo() para o método teste(), que exibe a resposta em teste.jsp. Certo?

[code]@Resource
public class TesteController {

public TesteController(Result result){  
    this.result = result;
}  
  
@Path("/teste")  
public void teste(){  
    //Nenhuma tarefa, apenas chamar teste.jsp  
}  

@Path("/exemplo")  
public void exemplo(){  
    result.forwardTo(this).teste(); // também usa a teste.jsp
}  

}[/code]
Quando você diz refere-se ao caminho definido em @Path() ou no arquivo web.xml? Pergunto porque o método teste() leva o @Path("/teste"), e a classe TesteController poderia estar definida em web.xml como:
[quote]servlet-name: TesteController
url-pattern: /TesteController[/quote]

Neste caso qual o nome do Controller? O @Path() ou o url-pattern do web.xml?

Sei que as dúvidas são básicas, mas quero esclarecer os conceitos estruturais do VRaptor pra usá-lo de forma correta.

Abraço. :wink:

se é BananaController, o é banana.

dá uma olhada na apostila da caelum, daí vc fica mais familiarizado com as convenções:
http://www.caelum.com.br/curso/fj-28-vraptor-hibernate-ajax/

Já tinha lido mas não tinha me atentado a este detalhe. O VRaptor define o nome do Controller automaticamente, eliminando o sufixo “Controller”. E qual é a função do url-pattern do web.xml no controller BananaController? Vai influenciar alguma coisa?

o url-pattern é para o vraptor interceptar todas as requisições

Galera, aproveitando este tópico (para não ter que criar outro, visto que seja uma pergunta de fácil resposta), como faço para receber um campo date ? Minha Bean já esta com o tipo Date no atributo, mas o problema esta na minha jsp, estou passando assim:

<label for="dataNascimento">Data Nascimento:</label> <input id="dataNascimento" type="date" name="pessoa.dataNascimento"/>
mas não está dando certo, esta me retornando um ConstraintViolationException: could not insert: [br.com.vistaimoveis.model.Pessoa]
o método da minha controller é simples

public void salvar(Pessoa pessoa) { dao.salvar(pessoa); result.redirectTo(this).lista(); }
Agradeço a ajuda desde já, obrigado !

se deu constraintViolation é algo no banco de dados… vc viu qual foi a violation que aconteceu? tá mais pra frente na stacktrace.

E ai Lucas, desculpa a demora na resposta, mas é que este projeto é meu tcc, e no meu trabalho não uso o notebook, fico na máquina da empresa! Mas vamos lá…
Bom, descobri o motivo do erro, minha data esta vindo como nula, ou seja, sendo setada como nula. Mesmo eu alterando o tipo do input, tanto date quanto text ele não recebo o valor que insiro. Coloquei uma validação do hibernate neste meu atributo, para ele não poder ser nulo, porque quando ele estava sem esta validação o meu objeto pessoa era salvo só que me ocorria duas ocasiões distintas após salvar. A primeira era que, quando eu deixava o campo dataNascimento vazio, o objeto era salvo e a logica de retorno para uma listagem era executada normalmente. Já quando eu inseria um valor no campo dataNascimento ele salvava o valor mas não me redirecionava para a listagem, onde era gerado essa excessão no meu browser :

Mas enfim, creio que estou errando na maneira como receber este valor no meu form,

<label for="dataNascimento">Data Nascimento:</label> <input id="dataNascimento" type="date" name="pessoa.dataNascimento"/>

O estranho é que quando eu clico no botão para salvar, na minha url é mostrado todos os campos com seus devidos valores, inclusive o campo dataNascimento.

Vou criar um tópico sobre este assunto no forum referente a persistência, mas peço que me ajude se possível srsrsr.

Obrigado !

Ahh, outra coisa ! Como eu faço para receber os parametros no vRaptor ? Tipo, assim como era feito com o request.getParameter(); Obrigado

esse noSuchMethodError é pq vc deve estar com versões incompatíveis do hibernate… tipo mais de uma delas no classpath…

qto a como receber os parametros no controller, é só usar o mesmo nome do parametro da requisição. Dá uma olhada aqui:

http://vraptor.caelum.com.br/pt/docs/guia-de-dez-minutos/

ou na apostila:

É verdade, tinha adicionado 2 jars do hibernate.validator , exclui um e aparentemente deu certo . Só a data que ainda não consigo salvar!

É essa questão do parâmetro eu sei como fazer, mas eu digo receber “visualmente” este parametro do formulário para poder estar fazendo algum tipo de conversão nele, talvez seja este o problema ! Assim como é feito quando trabalhamos com servlets .

Você já trabalhou com datas em projetos com Hibernate e vRaptor ? Se já, como voce fez para salvar ?
Se quiser depois posto minhas classes aqui para você me ajudar !

Obrigado !

em geral a data no formato 12/04/2013 deve funcionar… Só precisa deixar o Locale do servidor como pt-BR

Olha como eu fiz agora:

<label for="nascimento">Data Nascimento:</label> <input id="nascimento" type="text" name="pessoa.dataNascimento" value="<fmt:formatDate value="${pessoa.dataNascimento}" pattern="dd/MM/yyyy"/>"/>

Na hora de informar o valor passo neste mesmo formato 12/10/1991 tb
Mas não salva, me gera esta exception

Meu xml está correto ?

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <context-param> <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name> <param-value>pt_BR</param-value> </context-param> <filter> <filter-name>vraptor</filter-name> <filter-class>br.com.caelum.vraptor.VRaptor</filter-class> </filter> <filter-mapping> <filter-name>vraptor</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> </filter-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>

evite ficar postando a mesma coisa em vários tópicos, fica dificil acompanhar a solução…

como eu falei no outro tópico, isso é conflito de versão de jars (a maioria dos NoSuchMethodError são por causa disso)

[quote=Rafael_Ferraro]E ai Lucas, desculpa a demora na resposta, mas é que este projeto é meu tcc, e no meu trabalho não uso o notebook, fico na máquina da empresa! Mas vamos lá…
Bom, descobri o motivo do erro, minha data esta vindo como nula, ou seja, sendo setada como nula. Mesmo eu alterando o tipo do input, tanto date quanto text ele não recebo o valor que insiro. Coloquei uma validação do hibernate neste meu atributo, para ele não poder ser nulo, porque quando ele estava sem esta validação o meu objeto pessoa era salvo só que me ocorria duas ocasiões distintas após salvar. A primeira era que, quando eu deixava o campo dataNascimento vazio, o objeto era salvo e a logica de retorno para uma listagem era executada normalmente. Já quando eu inseria um valor no campo dataNascimento ele salvava o valor mas não me redirecionava para a listagem, onde era gerado essa excessão no meu browser :

Mas enfim, creio que estou errando na maneira como receber este valor no meu form,

<label for="dataNascimento">Data Nascimento:</label> <input id="dataNascimento" type="date" name="pessoa.dataNascimento"/>

O estranho é que quando eu clico no botão para salvar, na minha url é mostrado todos os campos com seus devidos valores, inclusive o campo dataNascimento.

Vou criar um tópico sobre este assunto no forum referente a persistência, mas peço que me ajude se possível srsrsr.

Obrigado ![/quote]

Eu tenho uma duvida, como eu chamo um método dentro de uma pagina JSP? Por exemplo, eu tenho o método “teste”, como ficaria a implementação? Desculpe a pergunta é por que comecei a usar o framework a pouco tempo.

Obrigado.

@Resource    
public class TesteController {    
        
    public TesteController(Result result){    
        this.result = result;  
    }    
        
    @Path("/teste")    
    public void teste(){    
        //Nenhuma tarefa, apenas chamar teste.jsp    
    }    
    
    @Path("/exemplo")    
    public void exemplo(){    
        result.forwardTo(this).teste(); // também usa a teste.jsp  
    }    
}    

vc em geral não executa métodos a partir da jsp…

vc quer colocar um link para o método?