[RESOLVIDO]Ajuda com Spring MVC

18 respostas
J

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

<servlet>
  	<servlet-name>spring-mvc</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  	<init-param>
  		<param-name>contextConfigLocation</param-name>
  		<param-value>/WEB-INF/spring-context.xml</param-value>
  	</init-param>
  	<load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>spring-mvc</servlet-name>
  	<url-pattern>/pages/usuarios/</url-pattern>
  </servlet-mapping>

spring-contex.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
		http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd">

	<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>

</beans>

cadastro.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>

	<form action="cadastro">
		Nome: <input type="text"/>
		Senha: <input type="password"/>
	
		<br/>
		<input type="submit" value="Cadastrar"/>
	</form>

</body>
</html>

Só que aparece o seguinte erro

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

Será que estou mapeando errado alguma coisa?

Me ajuda ai galera.

18 Respostas

F

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 ?

P

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:

J

O controller esta assim:

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");
	}
	
}
J

Ninguém gente???

J

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 ?

Segue acima o controlle…

A

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”

J

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

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

&lt;form id="formCadastro" action="cadastroUsuario" method="post"&gt;
			
				&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;

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:

&lt;context:component-scan base-package="br.com.teste" /&gt;
	&lt;mvc:annotation-driven /&gt;
	
	&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;

E o controller está assim:

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

}

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

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:
[url]http://localhost:8080/TesteSpringMVC/pages/usuarios/pages/usuarios/cadastro.jsp[/url]

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

A

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.

J

AmauriSpPoa:

Não consigo achar o erro do mapeamento

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.

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

A

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”;"

J
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;

[url]http://localhost:8080/TesteSpringMVC/cadastro.do[/url]

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";"

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:

&lt;form method="post" action="cadastroUsuario.do"&gt;
			
				&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;

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.

A

Poste o seu controller novamente.

J
AmauriSpPoa:
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:

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

}

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;
J

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

http://www.guj.com.br/java/282550-problema-com-arquivos-statics-usando-spring-e-tiles#1491541

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:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<%@ 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" />

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>...</title>
</head>

<body>
<form:form id="formAddUser" method="POST" action="${urlAction}" modelAttribute="User">
             <form:input id="txtNome" path="name" />
             <form:input id="txtIdade" path="age" />
</form:form>

</body>
</html>
Voltando ao Controller:
@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;
        }
J
jaboot:
Cara, tenta usar um Tiles da vida ou algo pra te ajudar melhor na camada de visualização:

http://www.guj.com.br/java/282550-problema-com-arquivos-statics-usando-spring-e-tiles#1491541

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:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<%@ 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" />

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>...</title>
</head>

<body>
<form:form id="formAddUser" method="POST" action="${urlAction}" modelAttribute="User">
             <form:input id="txtNome" path="name" />
             <form:input id="txtIdade" path="age" />
</form:form>

</body>
</html>
Voltando ao Controller:
@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;
        }

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:
@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";
	}
}

Ai ele reconheceu legal.

Obrigado mesmo galera.

A

Então coloca resolvido

J

E como faço isso?

A

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

Criado 28 de setembro de 2012
Ultima resposta 1 de out. de 2012
Respostas 18
Participantes 5