Pessoal tudo blz ?
Estou com um problema que faz um bom tempo, depois de pesquisa e várias tentativas diferentes não conseguir resolver. Talvez exista algum caminho melhor ou mais prático. Mas ai vai.
Tenho uma página com um formulário e o seguinte código:
jQuery(document).ready( function() {
$('#userRegisterForm').submit(function(){
$(this).ajaxForm();
$(this).ajaxSubmit({
success: function(){
alert('Sucesso');
},
error: function(){
alert('Erro');
}
});
return false;
});
É uma página de cadastro de usuário qualquer. A ideia é que deve existir uma validação se o login do usuário já está sendo utilizado.
Para isso criei um método no controlador com o seguinte código.
public void saveUser(Users pUser)
{
if (!mUserService.existsUser(pUser))
{
mUserService.saveUser(pUser);
mResult.nothing();
}
else
{
mResult.notFound();
}
}
De acordo com minhas pesquisas isso apenas deveria funcionar. NotFound para erro e nothing para sucesso.
Mas quando ocorre o caso de erro - NotFound - ele me redireciona para uma página com erro 404 idicando que não há nenhum resource.
Essa é a maneira correta de utilizar Ajax com o VRaptor pra esse tipo de validação ? Existe alguma maneira mais prática ? Como fazer que esse modo que implementei funcione? Já tentei de várias maneiras diferentes, procurei erros bobos e nada.
Agradeço desde já a paciência !
Estou dando alguns primeiros passos com VRaptor num projeto de faculdade.
Qualquer indicação de leitura - não sendo a documentação oficial - é bem vinda !
Abraços e boa noite
Primeiro, dá uma lida nesse tópico para que você consiga postar melhor aqui no GUJ, assim a gente consegue entender melhor o que você está precisando:
http://www.guj.com.br/java/50115-voce-e-novo-no-guj-vai-criar-um-topico-e-colar-seu-codigo-fonte-leia-aqui-antes-por-favor
Eu achei estranho ele te redirecionar para o 404, já que você fez o return false;…
Tenta acrescentar o event.preventDefault(); no submit do form:
$('#userRegisterForm').submit(function(event){
// Seu ajax aqui
event.preventDefault();
return false;
});
Acho que isso deve resolver…
e verifica se a url está correta, com o context path na frente de tudo
Opa ! Ok … nos proximos posts vou utilizar a formatação correta. Perdão pelo desleixo.
Bom cara, fiz isso que me disse e ainda sou redirecionado pra página de erro 404. O erro é "The requested resource () is not available."
A URL que ele me envia é a específica pra esse método saveUser() que no caso é “/user/new”.
Não deveria ser a url da página de cadastro - no caso “/user/register”? Nem deveria recarrega-la não é ?
Obrigado !
Abraços
a action do form tem que ser uma url com /user/register se essa é a lógica que salva o usuário… e essa lógica precisa ter uma chamada a:
result.redirectTo( <<<alguma coisa >>> );
ou precisa existir o jsp correspondente (/WEB-INF/jsp/user/register.jsp)
de preferencia a primeira opção.
Ainda não entendi.
Existe um página que chama register.jsp. O meu controlador esta assim.
package ccc.webopine.controllers;
import ccc.webopine.business.UserService;
import br.com.caelum.vraptor.*;
import br.com.caelum.vraptor.core.Localization;
import br.com.caelum.vraptor.validator.ValidationMessage;
import br.com.caelum.vraptor.validator.Validations;
import br.com.caelum.vraptor.view.Results.*;
import ccc.webopine.business.interfaces.IUser;
import ccc.webopine.model.Users;
import java.util.ArrayList;
import java.util.List;
@Resource
public class UserController
{
private final IUser mUserService;
private final Result mResult;
public UserController(IUser pUserService, Result pResult)
{
this.mUserService = pUserService;
this.mResult = pResult;
}
public void register()
{
};
public void saveUser(Users pUser)
{
if (!mUserService.existsUser(pUser))
{
mUserService.saveUser(pUser);
mResult.nothing();
}
else
{
mResult.notFound();
}
}
}
O action do form está redirecionando para esse método saveUser() que tem a URL “/user/new”.
Isso ta errado ? Qual a forma mais correta pra isso ?
Estou usando o CustomRoutes tbm que esta assim.
package ccc.webopine.infra;
import br.com.caelum.vraptor.http.route.Router;
import br.com.caelum.vraptor.http.route.RoutesConfiguration;
import br.com.caelum.vraptor.http.route.Rules;
import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.caelum.vraptor.ioc.Component;
import ccc.webopine.controllers.HostController;
import ccc.webopine.controllers.LoginController;
import ccc.webopine.controllers.UserController;
import ccc.webopine.model.Users;
@Component
@ApplicationScoped
public class CustomRoutes implements RoutesConfiguration {
@Override
public void config(Router pRouter) {
new Rules(pRouter) {
@Override
public void routes() {
routeFor("/user/new").is(UserController.class).saveUser(null);
}
};
}
}
Qual é a maneira correta de fazer isso ?
Obrigado !
eu geralmente prefiro usar:
@Post("/user/new")
public void saveUser(Users pUser) {...}
@Get("/user/register")
public void register(Users pUser) {...}
do que criar o CustomRoutes
se ainda tá dando 404, tenta ver se o action do form está certo:
<form action="<c:url value="/user/new"/>">
...
Ok,
Vou começar dessa maneira. Achei mais legível também. Mas porém ainda não entendi. Qual lógica que pode estar inserida dentro do método register() ? E pq ele ta com parâmetro ?
O action seria isso mesmo né ? /user/new ?
@Post
@Path("/user/new")
public void saveUser(Users pUser)
{
if (!mUserService.existsUser(pUser))
{
mUserService.saveUser(pUser);
mResult.nothing();
}
else
{
mResult.notFound();
}
}
Seria só isso ?
Desculpe pela ignorância. Acho que não entendi então. Tinha lido a documentação sobre essa parte.
Abraços !
A função saveUser() é chamada. Os métodos de negócio são executados com sucesso.
Só quando é retornado notFound() é direcionado pra pagina de erro 404 com a url “/user/new”.
Alguma ideia ?
se tá passando no .notFound() ele vai pra página do 404 mesmo… é isso que esse método faz.
o parametro pUser será populado com dados do formulário…
<input name="pUser.nome" value="..."/>
<input name="pUser.email" value="..."/>
dá uma olhada na doc completa:
http://caelum.github.com/vraptor/docs/guia-de-um-minuto/
Mas eu queria retornar um erro pra página e na função do ajaxSubmit ele pegar o erro e imprimir um alert na tela. Não ir pra outra página.
blz, vc pode colocar o notFound() ou qqer outro status… o problema é que seu javascript não tá funcionando…
vc tem que bloquear o submit default do form… vc colocou o código que o rafael falou?
Sim … já coloquei. Mas ainda não está funcionando. Pode ser o javascript msm. To procurando algum que funciona mas tudo a msm coisa.
vc tá com o Firefox com firebug?
tent ver se não tem algum erro no javascript (ele te mostra os erros)…
mova o event.preventDefault(); pra primeira linha também:
.....submit(function(e) {
e.preventDefault();
//chamada ajax aqui
return false;
});
Nada cara. Sem erros e ainda assim envia pra pagina 404. Se eu colocar esse código antes o submit não é executado.
cola aqui de novo o javascript que vc tá usando
[code]$(document).ready(function() {
$(’#userRegisterForm’).submit(function(e){
$(this).ajaxForm();
$(this).ajaxSubmit({
success: function(){
alert('Sucesso');
},
error: function(){
alert('Erro');
}
});
e.preventDefault();
return false;
});
}); [/code]
mude pra isso:
$(document).ready(function() {
$('#userRegisterForm').submit(function(e){
e.preventDefault();
$(this).ajaxSubmit({
success: function(){
alert('Sucesso');
},
error: function(){
alert('Erro');
}
});
return false;
});
});
Agora o método nem ta sendo chamado. O formulário me parece não ta sendo submetido.