RESOLVIDO - Duplicação de Formulários VRaptor3

9 respostas
Chaia

Ola

Minha dúvida e a seguinte já utilizo o VRaptor2 e agora comecei a estudar a versão 3, no entanto notei que no VRaptor2 eu utilizava somente um form, tanto para editar como adicionar e agora conforme a apostila no VRaptor3 existem 2 form, um para adicionar e outro para edição, minha pergunta é a seguinte a nova forma de negocio funciona realmente desta forma (2 forms destintos), ou tem como utilizar apenas um form para as duas operações???

Att
Chaiene

9 Respostas

zoren

Eu já tentei usar o mesmo form para ambas as ações, mas o VRaptor não reconheceu, ele acusou que existia dois direcionamentos para a mesma ação.

Tentei apenas uma vez, mas pelo visto ele não aceita.

G

Isso não é uma limitação do Vraptor, mas sim do HTML. Você não pode ter um form dentro de outro. Você até pode ter dois forms na mesma tela, porém nunca dois forms aninhados.

zoren

Eu digo qto a usar a mesma página para editar e inserir, visto que os campos são os mesmos

edit:

se vc tentar usar

public Usuario form(String idUsuario) {...}

public void form() {...}

ele dá erro e não faz nenhum dos mapeamentos que existe na classe

G

Pode sim, creio que muita gente usa assim.

P

Eu uso a mesma página, tanto para adicionar quanto para editar

Qual o problema que está tendo?

Lucas_Cavalcanti

vc pode usar o mesmo form sim, e existem vários jeitos de fazer isso…

vc pode ter dois métodos com o mesmo nome na mesma classe, desde que eles estejam mapeados para urls ou métodos http diferentes… no caso do form vc pode colocar um @Path em pelo menos um deles pra mudar a url…

vc pode ter duas lógicas lógicas com nomes diferentes pro form, e dentro de uma das lógicas chamar a outra via:

public void form() {..}
public void formEdicao(Long id) {
   //busca alguma coisa e adiciona no result
   result.of(this).form(); // usa a view do metodo form
}

eu prefiro a segunda opção

Chaia

Ola Resolvido fiz da seguinte forma:

@Path("/users/{user.login}")
	@Get
    public User adicionar(User user) {
		return dao.carrega(user.getLogin());
	}
	
	@Get @Path("/user/novo")
	public void adicionar(){
	}

E no form:

<c:choose>
    <c:when test="${empty user.login}"><form action="<c:url value="/users" />" name="registerForm"	method="post"></c:when>
	<c:otherwise><form action="<c:url value="/users/update/${user.login}" />" name="registerForm" method="post"></c:otherwise>
</c:choose>

Lucas se puder coloca da outra forma que falaste só para o post ficar completo, pois não entendi muito bem como adicionar algo no result conforme tua observação //busca alguma coisa e adiciona no result

Tentei da seguinte forma mas não deu:

como seria a correta?

public void form() {..}
public void formEdicao(User user) {
   User usr = dao.carrega(user.getLogin());          //busca alguma coisa e adiciona no result
   result.of(this).form(); // aqui não sei como atribuir meu objeto usr no result.
}

Valeu

Lucas_Cavalcanti

vc pode melhorar algumas coisas…

faça no controller:

@Path("/users/")
@Post
public void adiciona(User user) { ... }

@Path("/users/{user.login}")
@Post
public void atualiza(User user) { ... }

daí na jsp vc pode fazer simplesmente, sem o c:choose

<form action="<c:url value="/users/${user.login}" />" name="registerForm"	method="post">

assim se o user.login estiver vazio ele cai no método adiciona, senão ele cai no método atualiza…

Chaia:

Tentei da seguinte forma mas não deu:

como seria a correta?

public void form() {..}
public void formEdicao(User user) {
   User usr = dao.carrega(user.getLogin());          //busca alguma coisa e adiciona no result
   result.of(this).form(); // aqui não sei como atribuir meu objeto usr no result.
}

Valeu

a forma correta seria:

public void form() {..}
public void formEdicao(User user) {
   User usr = dao.carrega(user.getLogin()); 
   result.include("user", usr);
   result.of(this).form();
}
Chaia

Valeu Lucas
Obrigado

Criado 6 de maio de 2010
Ultima resposta 9 de mai. de 2010
Respostas 9
Participantes 5