[RESOLVIDO]Ajuda com Spring MVC

Galera, pelo amor de Deus me ajuda!

Estou tentando fazer um formulário com jsp e spring mvc mas não estou conseguindo por nada.

Segue os códigos:

web.xml

[code]
spring-mvc
org.springframework.web.servlet.DispatcherServlet

contextConfigLocation
/WEB-INF/spring-context.xml

1

spring-mvc /pages/usuarios/ [/code]

spring-contex.xml

[code]<?xml version="1.0" encoding="UTF-8"?>

<context:component-scan base-package="br.com.teste.controller" />
<mvc:annotation-driven />

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/pages/usuarios" />
	<property name="suffix" value=".jsp"/>
</bean>

[/code]

cadastro.jsp

[code]<%@ page language=“java” contentType=“text/html; charset=ISO-8859-1” pageEncoding=“ISO-8859-1”%>

Insert title here
<form action="cadastro">
	Nome: <input type="text"/>
	Senha: <input type="password"/>

	<br/>
	<input type="submit" value="Cadastrar"/>
</form>
[/code]

Só que aparece o seguinte erro

HTTP Status 404 - /TesteSpringMVC/pages/usuarios/cadastro

Será que estou mapeando errado alguma coisa?

Me ajuda ai galera.

Olha, não estou na frente do PC agora…
Mas você criou um controller e mapeou ele com anotations ou fez o mapeamento através do XML para esta página ?

Pelo cod. 404 a página a qual a logica está redirecionando não existe, verifique os nomes ai, é comum esquecer uma letra maiuscula…
Faço muito isso! :smiley:

O controller esta assim:

[code]package br.com.teste.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/pages/usuarios")
public class UsuarioController {

@RequestMapping(value="/cadastro")
public void teste() {
	System.out.println("Teste ok");
}

}[/code]

Ninguém gente???

[quote=flaviochess]Olha, não estou na frente do PC agora…
Mas você criou um controller e mapeou ele com anotations ou fez o mapeamento através do XML para esta página ?[/quote]

Segue acima o controlle…

Bom dia, no seu senário fiz um teste e tenho algumas observações.

Faltou o *

&lt;url-pattern&gt;/pages/usuarios/*&lt;/url-pattern&gt;

Faltou a “/” no final

p:prefix="/pages/usuarios/"

E de acordo com o seu mapeamento você tem que acessar o url:
http://localhost:8080/TesteSpringMVC/pages/usuarios/pages/usuarios/cadastro.jsp

Seria interessante utilizar no url-pattern extensão ao invés de pasta, por exemplo o “*.do”

Ve se consegue me ajudar no seguinte cenário que é bem parecido.

Tenho uma tela de cadastro de usuários cujo jsp está assim:

[code]<form id=“formCadastro” action=“cadastroUsuario” method=“post”>

			&lt;table&gt;
				&lt;tr&gt;
					&lt;td style="text-align: right;"&gt;&lt;strong&gt;&lt;label for="nome"&gt;Nome Usuário:&lt;/label&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;input id="nome" name="nome" type="text" size="50"/&gt;&lt;/td&gt;	
				&lt;/tr&gt;
				&lt;tr&gt;
					&lt;td style="text-align: right;"&gt;&lt;strong&gt;&lt;label for="email"&gt;E-mail:&lt;/label&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;input id="email" name="email" type="text" size="50"/&gt;&lt;/td&gt;
				&lt;/tr&gt;
				&lt;tr&gt;
					&lt;td style="text-align: right;"&gt;&lt;strong&gt;&lt;label for="login"&gt;Login:&lt;/label&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;input id="login" name="login" type="text" size="30"/&gt;&lt;/td&gt;
				&lt;/tr&gt;
				&lt;tr&gt;
					&lt;td style="text-align: right;"&gt;&lt;strong&gt;&lt;label for="senha"&gt;Senha:&lt;/label&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;input id="senha" name="senha" type="password" size="30"/&gt;&lt;/td&gt;
				&lt;/tr&gt;
				&lt;tr&gt;
					&lt;td style="text-align: right;"&gt;&lt;strong&gt;&lt;label for="confirmacaoSenhaUsuario"&gt;Confirmar senha:&lt;/label&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;input id="confirmacaoSenhaUsuario" type="password" size="30"/&gt;&lt;/td&gt;
				&lt;/tr&gt;
			&lt;/table&gt;
			
			<br/><br/>
			&lt;center&gt;
				&lt;input type="submit" value="Cadastrar"/&gt;
			&lt;/center&gt;

</form>
[/code]

O web.xml está assim:

&lt;!-- Configuração Spring --&gt; &lt;servlet&gt; &lt;servlet-name&gt;spring-mvc&lt;/servlet-name&gt; &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; &lt;init-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;/WEB-INF/spring-context.xml&lt;/param-value&gt; &lt;/init-param&gt; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;spring-mvc&lt;/servlet-name&gt; &lt;url-pattern&gt;/pages/intranet/&lt;/url-pattern&gt; &lt;/servlet-mapping&gt;

O spring-context.xml está assim:

[code] <context:component-scan base-package=“br.com.teste” />
<mvc:annotation-driven />

&lt;bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&gt;
	&lt;property name="prefix" value="/pages/intranet/" /&gt;
	&lt;property name="suffix" value=".jsp"/&gt;
&lt;/bean&gt;[/code]

E o controller está assim:

[code]@Controller
public class UsuarioController {

@RequestMapping(value = "cadastroUsuario")
public String cadastrar(Usuario usuario) {
	
	System.out.println(usuario);
	return "cadastroSistema";
}

}
[/code]

Mas quando preencho os dados e submeto, aparece o erro:

HTTP Status 404 - /transmissor-web/pages/intranet/cadastroUsuario

Não consigo achar o erro do mapeamento

[quote=AmauriSpPoa]Bom dia, no seu senário fiz um teste e tenho algumas observações.

Faltou o *

&lt;url-pattern&gt;/pages/usuarios/*&lt;/url-pattern&gt;

Faltou a “/” no final

p:prefix="/pages/usuarios/"

E de acordo com o seu mapeamento você tem que acessar o url:
http://localhost:8080/TesteSpringMVC/pages/usuarios/pages/usuarios/cadastro.jsp

Seria interessante utilizar no url-pattern extensão ao invés de pasta, por exemplo o “*.do”[/quote]

A unica coisa que realmente está errada é a falta do “*” no final da url-pattern

Agora essa é a primeira vez que vejo alguém utilizando pasta no url-pattern da DispatcherServlet, o normal é extensão como o exemplo “*.do”

Em relação ao seu novo erro, você tem o arquivo “cadastroSistema. jsp”, na pasta “/pages/intranet/”?

Se não tem, deve cria-lo.

[quote=AmauriSpPoa][quote]
Não consigo achar o erro do mapeamento
[/quote]

A unica coisa que realmente está errada é a falta do “*” no final da url-pattern

Agora essa é a primeira vez que vejo alguém utilizando pasta no url-pattern da DispatcherServlet, o normal é extensão como o exemplo “*.do”

Em relação ao seu novo erro, você tem o arquivo “cadastroSistema. jsp”, na pasta “/pages/intranet/”?

Se não tem, deve cria-lo.[/quote]

Mas como eu mapearia esse .do no Controller e como chamaria no action do form?

Web.xml

 &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt;
        &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;
  &lt;/servlet-mapping&gt;

UsuarioController

package br.com.teste.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UsuarioController {

    @RequestMapping("cadastro")
    public String teste() {
        System.out.println("Teste ok");
        return "cadastro";
    }

    @RequestMapping("cadastroUsuario")
    public String cadastrar(Usuario usuario) {

        System.out.println(usuario);
        return "cadastroSistema";
    }
}

E no Form altere a action dessa forma

&lt;form id="formCadastro" action="cadastroUsuario.do" method="post"&gt;  

http://localhost:8080/TesteSpringMVC/cadastro.do

E tem que ter os dois jsp’s “cadastro.jsp e cadastroUsuario.jsp” uma vez que no método cadastrar, você esta chamando a segunda pagina, o que é desnecessário se mudar o return para " return “cadastro”;"

[quote=AmauriSpPoa]Web.xml

 &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt;
        &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;
  &lt;/servlet-mapping&gt;

UsuarioController

package br.com.teste.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class UsuarioController {

    @RequestMapping("cadastro")
    public String teste() {
        System.out.println("Teste ok");
        return "cadastro";
    }

    @RequestMapping("cadastroUsuario")
    public String cadastrar(Usuario usuario) {

        System.out.println(usuario);
        return "cadastroSistema";
    }
}

E no Form altere a action dessa forma

&lt;form id="formCadastro" action="cadastroUsuario.do" method="post"&gt;  

http://localhost:8080/TesteSpringMVC/cadastro.do

E tem que ter os dois jsp’s “cadastro.jsp e cadastroUsuario.jsp” uma vez que no método cadastrar, você esta chamando a segunda pagina, o que é desnecessário se mudar o return para " return “cadastro”;"[/quote]

A tela de cadastro é a cadastroUsuario.jsp que fica dentro de /pages/intranet. É nela que fica o form de cadastro.

Fiz a configuração que você indicou.

Coloquei só *.do no web.xml.

E o form ficou assim:

[code] <form method=“post” action=“cadastroUsuario.do”>

			&lt;table&gt;
				&lt;tr&gt;
					&lt;td style="text-align: right;"&gt;&lt;strong&gt;&lt;label for="nome"&gt;Nome Usuário:&lt;/label&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;input id="nome" name="nome" type="text" size="50"/&gt;&lt;/td&gt;	
				&lt;/tr&gt;
				&lt;tr&gt;
					&lt;td style="text-align: right;"&gt;&lt;strong&gt;&lt;label for="email"&gt;E-mail:&lt;/label&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;input id="email" name="email" type="text" size="50"/&gt;&lt;/td&gt;
				&lt;/tr&gt;
				&lt;tr&gt;
					&lt;td style="text-align: right;"&gt;&lt;strong&gt;&lt;label for="login"&gt;Login:&lt;/label&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;input id="login" name="login" type="text" size="30"/&gt;&lt;/td&gt;
				&lt;/tr&gt;
				&lt;tr&gt;
					&lt;td style="text-align: right;"&gt;&lt;strong&gt;&lt;label for="senha"&gt;Senha:&lt;/label&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;input id="senha" name="senha" type="password" size="30"/&gt;&lt;/td&gt;
				&lt;/tr&gt;
				&lt;tr&gt;
					&lt;td style="text-align: right;"&gt;&lt;strong&gt;&lt;label for="confirmacaoSenhaUsuario"&gt;Confirmar senha:&lt;/label&gt;&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;input id="confirmacaoSenhaUsuario" type="password" size="30"/&gt;&lt;/td&gt;
				&lt;/tr&gt;
			&lt;/table&gt;
			
			<br/><br/>
			&lt;center&gt;
				&lt;input type="submit" value="Cadastrar"/&gt;
			&lt;/center&gt;
		&lt;/form&gt;[/code]

Mas quando clico em Cadastrar ainda aparece o erro 404 e no console mostra o seguinte:

[2012-10-01 11:55:28,771] [http-bio-8080-exec-10] WARN  org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/transmissor-web/pages/intranet/cadastroUsuario.do] in DispatcherServlet with name 'spring-mvc'

Sendo que tem esse jsp nessa estrutura.

Poste o seu controller novamente.

Quando eu logo na aplicação, aparece o menu com a opção cadastro de usuários:

href="cadastroUsuario.jsp" title="Controle de usuários"

Nessa tela tem o form que eu postei acima.

O controller está assim:

[code]@Controller
public class UsuarioController {

@RequestMapping("cadastroUsuario")
public String cadastrar(Usuario usuario) {
	
	System.out.println(usuario);
	return "cadastroSistema";
}

}[/code]

E o web.xml está assim:

&lt;servlet&gt; &lt;servlet-name&gt;spring-mvc&lt;/servlet-name&gt; &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; &lt;init-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-value&gt;/WEB-INF/spring-context.xml&lt;/param-value&gt; &lt;/init-param&gt; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;spring-mvc&lt;/servlet-name&gt; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt; &lt;/servlet-mapping&gt;

Cara, tenta usar um Tiles da vida ou algo pra te ajudar melhor na camada de visualização:

Assim, de cara, já aponto alguns problemas:

1 - Não é obrigatório, mas no RequestMapping, além do value, é bom utilizar um método de requisição (RequestMethod.GET ou RequestMethod.POST)
2 - Todas as suas chamadas com o RequestMapping tem que ser colocadas a barra (/) antes, tipo ficaria /cadastrousuarios
3 - É de bom tom colocar um @RequestMapping também no seu Controller. Ex.@Controller @RequestMapping(value = "/usuario") public class UsuarioController {
4 - Faltou colocar um MapAttribute para o seu form, na sua página.
5 - Não é necessário colocar o lance do .do para acessar suas urls. Isso é coisa de Struts.

Rapidamente

Controller:@Controller @RequestMapping(value = "/usuario") public class UsuarioController { // quando bater na URL /usuário por meio de GET, vai cair aqui e manda um usuário novo para a página @RequestMapping(method = RequestMethod.GET) public String list(ModelMap map) { map.addAttribute("User", new User()); return sua pagina; }

sua página:[code]<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
<%@ taglib uri=“http://www.springframework.org/tags/form” prefix=“form”%>
<%@ taglib uri=“http://www.springframework.org/tags” prefix=“spring”%>

<spring:url var=“urlAction” value="/usuario/add" />

... [/code]

Voltando ao Controller:

[code]@RequestMapping(value = “/add”, method = RequestMethod.POST)
public String addUser(@ModelAttribute(“User”) User user, BindingResult result, ModelMap map, Model model) {
System.out.println(“Nome:” + user.getName());
System.out.println(“Idade:” + user.getAge());

          return paginaConfirmação;
    }

[/code]

[quote=jaboot]Cara, tenta usar um Tiles da vida ou algo pra te ajudar melhor na camada de visualização:

Assim, de cara, já aponto alguns problemas:

1 - Não é obrigatório, mas no RequestMapping, além do value, é bom utilizar um método de requisição (RequestMethod.GET ou RequestMethod.POST)
2 - Todas as suas chamadas com o RequestMapping tem que ser colocadas a barra (/) antes, tipo ficaria /cadastrousuarios
3 - É de bom tom colocar um @RequestMapping também no seu Controller. Ex.@Controller @RequestMapping(value = "/usuario") public class UsuarioController {
4 - Faltou colocar um MapAttribute para o seu form, na sua página.
5 - Não é necessário colocar o lance do .do para acessar suas urls. Isso é coisa de Struts.

Rapidamente

Controller:@Controller @RequestMapping(value = "/usuario") public class UsuarioController { // quando bater na URL /usuário por meio de GET, vai cair aqui e manda um usuário novo para a página @RequestMapping(method = RequestMethod.GET) public String list(ModelMap map) { map.addAttribute("User", new User()); return sua pagina; }

sua página:[code]<%@ page language=“java” contentType=“text/html; charset=UTF-8” pageEncoding=“UTF-8”%>

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
<%@ taglib uri=“http://www.springframework.org/tags/form” prefix=“form”%>
<%@ taglib uri=“http://www.springframework.org/tags” prefix=“spring”%>

<spring:url var=“urlAction” value="/usuario/add" />

... [/code]

Voltando ao Controller:

[code]@RequestMapping(value = “/add”, method = RequestMethod.POST)
public String addUser(@ModelAttribute(“User”) User user, BindingResult result, ModelMap map, Model model) {
System.out.println(“Nome:” + user.getName());
System.out.println(“Idade:” + user.getAge());

          return paginaConfirmação;
    }

[/code][/quote]

Galera, graças a Deus e a vcs consegui.

Eu estava estranhando que quando eu chamava o servlet pelo link

http://localhost:8080/transmissor-web/cadastroUsuario.do

Chegava tranquilo no método, mas quando eu chamada de dentro da jsp que ficava em /pages/intranet, a url mudava para

http://localhost:8080/transmissor-web/pages/intranet/cadastroUsuario.do

e assim gerava o erro 404.

Com a dica de vcs eu coloquei um @RequestMapping na classe tb que ficou assim:

[code]@Controller
@RequestMapping(value="/pages/intranet")
public class UsuarioController {

@RequestMapping(value="/teste", method = RequestMethod.POST)
public String cadastrar(Usuario usuario) {
	
	System.out.println(usuario);
	return "cadastroSistema";
}

}[/code]

Ai ele reconheceu legal.

Obrigado mesmo galera.

Então coloca resolvido

E como faço isso?

http://www.guj.com.br/java/250662-foi-mal-gente-mas-como-coloco-um-topico-como-resolvidonao-to-achando-onde-clicaresolvido