Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Spring MVC
Mdulo do Spring Framework que permite o
desenvolvimento de aplicaes web baseadas em
aes (action based) bem como o desenvolvimento
de servios REST.
Integra-se API de Servlets.
Suporta:
Diversas tecnologias de viso tais como JSP/JSTL, Velocity,
FreeMarker, Thymeleaf, Tiles, XSLT e Groovy Markup
Templates.
Processamento assncrono.
Internacionalizao.
2: HTTP request
3: Web controller
1: HTTP request
Dispatcher
Servlet
4: HTTP request
Web controller
5: model and view name
6: view name
9: HTTP Response
View
8: model
7: view
View
resolver
3
Controlador web
Objeto responsvel por responder um conjunto
de requisies HTTP.
As requisies atendveis podem ser especificadas
atravs de padres de URL, por cabealhos HTTP
e por mtodos HTTP.
Anotaes e classes
@Controller: define um controlador web.
@RequestMapping: definies das requisies HTTP
a serem atendidas.
@RequestParam: define um parmetro query string.
@PathVariable: referencia parmetros em URLs
estilo REST.
org.springframework.ui.Model: para armazenar
objetos acessados pela view.
org.springframework.web.servlet.ModelAndView:
para armazenar o nome da view e objetos acessados
pela view.
5
Atualizando as configuraes
Adicionar JSTL como dependncia no pom.xml:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
Atualizando as configuraes
Disponibilizando o contexto do Spring para o
contexto da aplicao web:
...
public class SpringMVCServlet extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{AppConfig.class};
}
...
}
7
org.springframework.beans.factory.annotation.Autowired;
org.springframework.stereotype.Controller;
org.springframework.ui.Model;
org.springframework.web.bind.annotation.RequestMapping;
import cursoSpring.revenda_veiculos.dominio.FabricanteRepository;
@Controller
@RequestMapping("/fabricantes")
public class CRUDFabricante {
@Autowired
private FabricanteRepository repositorio;
8
10
13
...
@RequestMapping("/excluir")
public String excluir(@RequestParam("id") Integer idFabricante,
Model model){
try{
repositorio.excluir(idFabricante);
model.addAttribute("mensagem",
"Fabricante excludo com sucesso.");
}catch(Exception ex){
ex.printStackTrace();
model.addAttribute("mensagem",
Como queremos voltar listagem
"Ocorreu um erro durante
a operao.");
de fabricantes
aps a excluso,
}
aproveitamos o mtodo inicio
return "forward:/fabricantes";
realizando um forward para a URL
}
/fabricantes.
15
16
Forward e Redirect
comum que aps processar uma requisio o
controlador web direcione o fluxo da aplicao
para uma pgina diferente da utilizada na
submisso.
Temos duas formas disponveis: forward e
redirect.
Diferena bsica:
No forward o processamento realizado no servidor.
No redirect a mudana de pgina feita pelo browser.
17
Forward
As mudanas de URL so todas processadas no
servidor antes da resposta ser enviada ao cliente.
Por haver apenas uma requisio, o mesmo contexto
de requisio utilizado pelas pginas e mtodos
envolvidos no processamento.
O mesmo model fica disponvel a todos os mtodos Java.
Forward
19
Redirect
um mecanismo especificado pelo HTTP.
Dois passos. Ao receber uma requisio, a aplicao
pede ao browser para acessar uma segunda URL.
Por isso a URL na barra de endereos muda.
O pedido um recurso do HTTP: cdigo 301 ou 302 e
cabealho Location.
Redirect
21
Flash scope
Utilizado para manter dados que devem estar
disponveis aps um redirect.
Para utilizar o flash scope basta declarar um
parmetro do tipo RedirectAttributes.
22
23
25
26
27
28
29
31
32
33
javax.validation.Valid;
org.springframework.validation.BindingResult;
org.springframework.web.bind.annotation.ModelAttribute;
org.springframework.web.bind.annotation.RequestMethod;
@RequestMapping(value="/salvar", method=RequestMethod.POST)
public String salvar(
@Valid @ModelAttribute("fabricante") Fabricante fabricante,
BindingResult br,
@RequestParam("titulo") String titulo,
Model model,
RedirectAttributes rAttrs){
if(br.hasErrors()){
model.addAttribute("titulo", titulo);
return "fabricantes/edicao";
}
35
@RequestMapping(value="/salvar", method=RequestMethod.POST)
public String salvar(
@Valid @ModelAttribute("fabricante") Fabricante fabricante,
BindingResult br,
@RequestParam("titulo") String titulo,
Model model,
RedirectAttributes rAttrs){
Armazena o resultado
if(br.hasErrors()){
da validao.
model.addAttribute("titulo", titulo);
return "fabricantes/edicao";
}
36
38
39
CRUD Veculo
Classe Foto:
package cursoSpring.revenda_veiculos.dominio;
import javax.persistence.Embeddable;
@Embeddable
public class Foto {
@Basic(fetch=FetchType.LAZY)
private byte[] bytes;
private String mimeType;
public Foto() {}
public Foto(byte[] bytes, String mimeType) {
this.bytes = bytes;
this.mimeType = mimeType;
}
//getters e setters...
}
41
CRUD Veculo
Classe Veiculo (1):
package cursoSpring.revenda_veiculos.dominio;
import
import
import
import
import
import
import
import
import
import
javax.persistence.Basic;
javax.persistence.Embedded;
javax.persistence.Entity;
javax.persistence.FetchType;
javax.persistence.JoinColumn;
javax.persistence.ManyToOne;
javax.persistence.Table;
javax.validation.constraints.Min;
javax.validation.constraints.NotNull;
javax.validation.constraints.Pattern;
@Entity
@Table(name="VEICULOS")
public class Veiculo extends Entidade {
42
CRUD Veculo
Classe Veiculo (2):
@Min(1900)
@NotNull
private Integer anoFabricacao;
@Pattern(regexp="[A-Z]{3}\\d{4}")
@NotNull
private String placa;
private String chassi;
@Embedded
private Foto foto;
@Min(50)
private Integer cilindradas;
43
CRUD Veculo
Classe Veiculo (3):
@NotNull
@ManyToOne
@JoinColumn(name="ID_MODELO")
private Modelo modelo;
public Veiculo() {}
public Veiculo(Integer id, String placa){
super(id);
this.placa = placa;
}
44
CRUD Veculo
Classe Veiculo (4):
public String getMimeTypeFoto() {
if(foto != null)
return foto.getMimeType();
return null;
}
//getters e setters ...
}
45
CRUD Veculo
create-schema.sql:
...
create table VEICULOS (ID int auto_increment, ANOFABRICACAO int
not null, PLACA varchar(10) not null, CHASSI varchar(50),
CILINDRADAS int, BYTES blob, MIMETYPE varchar(50),
ID_MODELO int not null, primary key(ID),
foreign key(ID_MODELO) references MODELOS);
drop-schema.sql:
drop table VEICULOS;
...
46
CRUD Veculo
Interface VeiculoRepositorio:
package cursoSpring.revenda_veiculos.dominio;
import java.util.List;
public interface VeiculoRepositorio {
public Integer inserir(Veiculo v);
public void excluir(Integer id);
public List<Veiculo> todos();
public Veiculo getPorId(Integer id);
public Foto getFoto(Integer idVeiculo);
}
47
CRUD Veculo
Classe VeiculoDAO (1):
package cursoSpring.revenda_veiculos.dao;
import
import
import
import
import
import
import
import
import
import
java.util.List;
org.hibernate.Query;
org.hibernate.Session;
org.hibernate.SessionFactory;
org.springframework.beans.factory.annotation.Autowired;
org.springframework.stereotype.Repository;
org.springframework.transaction.annotation.Transactional;
cursoSpring.revenda_veiculos.dominio.Foto;
cursoSpring.revenda_veiculos.dominio.Veiculo;
cursoSpring.revenda_veiculos.dominio.VeiculoRepositorio;
@Repository
@Transactional
public class VeiculoDAO implements VeiculoRepositorio {
48
CRUD Veculo
Classe VeiculoDAO (2):
@Autowired
private SessionFactory sessionFactory;
@Override
public Integer inserir(Veiculo v) {
sessionFactory.getCurrentSession().save(v);
return v.getId();
}
@Override
public void excluir(Integer id) {
String hql = "delete Veiculo where id = :idVeiculo";
Session session = sessionFactory.getCurrentSession();
Query q = session.createQuery(hql).
setParameter("idVeiculo", id);
q.executeUpdate();
}
49
CRUD Veculo
Classe VeiculoDAO (3):
@Override
public List<Veiculo> todos() {
Session session = sessionFactory.getCurrentSession();
return session.createQuery("from Veiculo").list();
}
@Override
public Veiculo getPorId(Integer id) {
Session session = sessionFactory.getCurrentSession();
return (Veiculo)session.get(Veiculo.class, id);
}
50
CRUD Veculo
Classe VeiculoDAO (4):
@Override
public Foto getFoto(Integer idVeiculo) {
String hql = "select v.foto from Veiculo v where v.id = :id ";
Session session = sessionFactory.getCurrentSession();
Query q = session.createQuery(hql).
setParameter("id", idVeiculo);
return (Foto)q.uniqueResult();
}
}
51
CRUD Veculo
Pgina veiculos/inicio.jsp (1):
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<title>Veculos</title>
</head>
<body>
<h2>Veculos</h2>
<c:url var="actionUrl" value="/veiculos" />
<c:if test="${not empty mensagem}">
<p style="border: 1px solid black;">${mensagem}</p>
</c:if>
<a href="${actionUrl}/novo">Novo veculo</a>
52
CRUD Veculo
Pgina veiculos/inicio.jsp (2):
<table>
<tr>
<th>Placa</th>
<th>Fabricante</th>
<th>Modelo</th>
<th>Ano</th>
<th>Cilindradas</th>
<th colspan="2">Opes</th>
</tr>
<c:forEach var="veiculo" items="${veiculos}">
<tr>
<td>${veiculo.placa}</td>
<td>${veiculo.modelo.fabricante.descricao}</td>
<td>${veiculo.modelo.descricao}</td>
<td>${veiculo.anoFabricacao}</td>
<td>${veiculo.cilindradas}</td>
53
CRUD Veculo
Pgina veiculos/inicio.jsp (3):
<td>
<a href="${actionUrl}/excluir/${veiculo.id}">
EXCLUIR
</a>
</td>
</tr>
</c:forEach>
</table>
</body>
</html>
54
CRUD Veculo
Pgina veiculos/edicao.jsp (1):
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form"
prefix="form" %>
<!DOCTYPE html>
<html>
<head>
<title>Novo veculo</title>
</head>
<body>
<h2>Novo veculo</h2>
<c:url var="actionUrl" value="/veiculos/salvar" />
<form:form action="${actionUrl}" method="post"
modelAttribute="veiculo" >
55
CRUD Veculo
Pgina veiculos/edicao.jsp (2):
<label for="placa">PLACA</label>
<form:input path="placa"/>*
<form:errors path="placa" cssStyle="color: red"/><br>
<label for="anoFabricacao">ANO</label>
<form:input path="anoFabricacao"/>*
<form:errors path="anoFabricacao" cssStyle="color: red"/><br>
<label for="cilindradas">CILINDRADAS</label>
<form:input path="cilindradas"/>
<form:errors path="cilindradas" cssStyle="color: red"/><br>
<label for="chassi">CHASSI</label>
<form:input path="chassi"/>
<form:errors path="chassi" cssStyle="color: red"/><br>
56
CRUD Veculo
Pgina veiculos/edicao.jsp (3):
<label for="selectModelo">MODELO</label>
<form:select path="modelo.id" id="selectModelo" >
<form:options items="${modelos}"
itemValue="id"
itemLabel="descricao" />
</form:select>
<form:errors path="modelo" cssStyle="color: red"/><br>
<button type="submit">Salvar</button>
</form:form>
</body>
</html>
57
CRUD Veculo
Classe CRUDVeiculo (1):
package cursoSpring.revenda_veiculos.web;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import
org.springframework.web.servlet.mvc.support.RedirectAttributes;
import cursoSpring.revenda_veiculos.dominio.Modelo;
import cursoSpring.revenda_veiculos.dominio.ModeloRepository;
58
CRUD Veculo
Classe CRUDVeiculo (2):
import cursoSpring.revenda_veiculos.dominio.Veiculo;
import cursoSpring.revenda_veiculos.dominio.VeiculoRepositorio;
@Controller
@RequestMapping("/veiculos")
public class CRUDVeiculo {
@Autowired
private VeiculoRepositorio veiculoRepositorio;
@Autowired
private ModeloRepository modeloRepositorio;
@ModelAttribute("modelos")
public List<Modelo> listaDeModelos(){
return modeloRepositorio.todos();
}
59
CRUD Veculo
Classe CRUDVeiculo (2):
import cursoSpring.revenda_veiculos.dominio.Veiculo;
import cursoSpring.revenda_veiculos.dominio.VeiculoRepositorio;
@Controller
@RequestMapping("/veiculos")
public class CRUDVeiculo {
@ModelAttribute insere o
@Autowired
retorno do mtodo no
private VeiculoRepositorio veiculoRepositorio;
contexto model. Assim, a lista
@Autowired
de modelos ficar disponvel
private ModeloRepository modeloRepositorio;
para as pginas acessadas
@ModelAttribute("modelos")
public List<Modelo> listaDeModelos(){
return modeloRepositorio.todos();
}
60
CRUD Veculo
Classe CRUDVeiculo (3):
@RequestMapping
public ModelAndView inicio(){
ModelAndView modelAndView = new ModelAndView("veiculos/inicio");
modelAndView.addObject("veiculos", veiculoRepositorio.todos());
return modelAndView;
}
@RequestMapping("/novo")
public ModelAndView novo(){
ModelAndView modelAndView = new ModelAndView("veiculos/edicao");
modelAndView.addObject("veiculo", new Veiculo());
return modelAndView;
}
61
CRUD Veculo
Classe CRUDVeiculo (4):
@RequestMapping(value="/salvar", method=RequestMethod.POST)
public String salvar(@Valid @ModelAttribute("veiculo") Veiculo
veiculo, BindingResult br, Model model, RedirectAttributes rAttrs){
if(br.hasErrors()){
return "veiculos/edicao";
}
try{
veiculoRepositorio.inserir(veiculo);
rAttrs.addFlashAttribute("mensagem",
"Veculo salvo com sucesso.");
}catch(Exception ex){
ex.printStackTrace();
rAttrs.addFlashAttribute("mensagem",
"Ocorreu um erro durante a operao.");
}
return "redirect:/veiculos";
}
62
CRUD Veculo
Classe CRUDVeiculo (5):
@RequestMapping("/excluir/{id}")
public String excluir(@PathVariable Integer id,
RedirectAttributes redAttr){
try{
veiculoRepositorio.excluir(id);
redAttr.addFlashAttribute("mensagem",
"Veculo excludo com sucesso.");
}catch(Exception ex){
ex.printStackTrace();
redAttr.addFlashAttribute("mensagem",
"Ocorreu um erro durante a operao.");
}
return "redirect:/veiculos";
}
}
63
CRUD Veculo
Classe ModeloDAO:
...
import org.springframework.transaction.annotation.Transactional;
@Repository
@Transactional
public class ModeloDAO implements ModeloRepository {
...
}
64
65
...
@Bean
public CommonsMultipartResolver multipartResolver(){
CommonsMultipartResolver resolver =
new CommonsMultipartResolver();
resolver.setMaxUploadSize(1024 * 1024 * 5);
resolver.setMaxInMemorySize(1024 * 1024 * 5);
return resolver;
}
}
66
67
70
71
72
73
75
76
78
79
80
81
82
84
85
86
89
90
Referncias
Johnson, Rod et al. Spring Framework Reference
Documentation, 4.2.1 release. Disponvel em
<http://docs.spring.io/spring/docs/current/spring-frameworkreference/html/>
Mrcio dvila. Informaes teis sobre cabealhos HTTP e
tipos MIME. Disponvel em
<http://www.mhavila.com.br/topicos/web/http_mime.html>
Paraschiv, Eugen. Serve static resources with Spring. Disponvel
em <http://www.baeldung.com/spring-mvc-static-resources>.
Souza, Alberto. Spring MVC: domine o principal framework web
Java. So Paulo: Casa do Cdigo, 2015.
Stack Overflow. JSTL tag wiki. Disponvel em
<http://stackoverflow.com/tags/jstl/info>
91
92