Vantagens e Desvantagens do
        Spring MVC
          @bregaida
Muitos Frameworks MVC
• JSF
• Struts
• Spring             • WebWork
• Mentawai           • Play Framework
• VRaptor            • Click Framework
• Demoiselle         • JBanana
• JBoss Seam         • Etc
• Neo Framework
• Brutos Framework
Qual escolher?
Escolha aquele que atende seu
negócio e te deixa confortável.
Spring Framework
• Criado por Rod Johnson
• Framework não intrusivo
• Baseado em padrões IoC e Injeção de
  Dependência
• O Container se encarrega de instanciar as
  classes Java e definir suas dependências
• Possui uma arquitetura baseada em POJOs
  e Interfaces
Vantagens
• Simples e de fácil aprendizado
• Liberdade para trabalhar na View
• Integração simples com outros frameworks
• Navegação feita por anotações
• BindResult e ModelAndView faz todo trabalho
  nas telas para validação e estado da página
• Suporte a várias Views Freemaker, JSP, Velocity
• Integração com Hibernate Validator
Anotações mais utilizadas
•   @Repository - Repositório dos dados

•   @Service - Camada de Serviços

•   @Qualifier - Qual Bean deverá ser injetado

•   @Autowired - Injeção dos Beans

•   @Controller - Camada View

•   @RequestMapping - Mapeamento do caminho

•   @RequestParam - Recebimento dos Parametros

•   @ResponseBody -Suporte a REST

•   @Valid - Responsável pela validação do parametro ou
    formulário
@Repository
@Repository
public class ProdutoDao implements ProdutoDaoI {

//Aqui código da Classe

}
@Service

@Service
public class ProdutoService implements ProdutoServiceI{

//Aqui o código da classe

}
@Controller


@Controller
public class ProdutoController {

//Aqui o código da classe
}
@Autowired
@Service
public class ProdutoService implements ProdutoServiceI{

	 @Autowired
	 private ProdutoDao	 produtoDao;

}


@Controller
@RequestMapping("/produto/**")
public class ProdutoController {

	 @Autowired
	 private ProdutoService	produtoService;

}
@Qualifier
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
 
public class Customer {
 
" @Autowired
" @Qualifier("personA")
" private Person person;
" //...
}


                Fonte: http://www.mkyong.com/spring/spring-autowiring-qualifier-example/
@RequestMapping
@Controller
@RequestMapping("/produto/**")
public class ProdutoController {

  @RequestMapping("/produto/formulario")
	 public ModelAndView formulario() {
	 	 return new ModelAndView("formulario").addObject("produtoForm", new
ProdutoForm());
	 }
	
	 @RequestMapping("/produto/adiciona")
	 public ModelAndView adiciona(@Valid ProdutoForm produtoForm,
BindingResult result) {
	 	 if (result.hasErrors()) {
	 	 	 return new
ModelAndView("formulario").addAllObjects(result.getModel());
	 	 }
	 	 populaBean(produtoForm);
	 	 produtoService.salva(produto);
	 	 return new ModelAndView("lista").addObject("produtos",
produtoService.pegaTodos());
	 }
}
@RequestParam

@RequestMapping(value = "/produto/remove", method = RequestMethod.GET)
	 public ModelAndView remove(@Valid @RequestParam(value = "produto.id") long id)
{
	 	 produto = new Produto();
	 	 produto.setId(id);
	 	 produtoService.remove(produto);
	 	 return new ModelAndView("lista").addObject("produtos", produtoService.pegaTodos());
}
@ResponseBody
      •       Basta incluir os jars Jackson no projeto e será retornado um
              JSON:

          •     jackson-core-asl-1.4.3.jar

          •     jackson-mapper-asl-1.4.3.jar


public @ResponseBody HashMap<String,Object> view(@RequestParam("start") int start,
@RequestParam("limit") int limit) {
        List<Produto> produtos = produtoService.pegaTodos();
        HashMap<String, Object> modelMap = new HashMap<String,Object>();
        modelMap.put("produtos", produtos);
        return modelMap;
	 }
@ResponseBody
                      Com Nice URL

@RequestMapping(value = "/{idParceiro}/{idModalidade}", method = RequestMethod.GET)
    @ResponseBody
    public Modalidade obtemModalidade(@PathVariable("idParceiro") Long idParceiro,
@PathVariable("idModalidade") Long idModalidade, HttpSession sessao){
        return modalidadeService.obtemModalidadePorParceiro(idParceiro, idModalidade);
    }
ModelAndView
@RequestMapping("/produto/formulario")
	 public ModelAndView formulario() {
	 	 return new ModelAndView("formulario").addObject("produtoForm", new ProdutoForm());
	 }
	
	 @RequestMapping("/produto/adiciona")
	 public ModelAndView adiciona(@Valid ProdutoForm produtoForm, BindingResult result) {
	 	 if (result.hasErrors()) {
	 	 	 return new ModelAndView("formulario").addAllObjects(result.getModel());
	 	 }
	 	 populaBean(produtoForm);
	 	 produtoService.salva(produto);
	 	 return new ModelAndView("lista").addObject("produtos", produtoService.pegaTodos());
	 }
@Valid
    No Atributo

     public ModelAndView remove(@Valid @RequestParam(value = "produto.id") long id) {

     //Código do método

     }


    No Formulário

	    @RequestMapping("/produto/adiciona")
	    public ModelAndView adiciona(@Valid ProdutoForm produtoForm, BindingResult result) {
	    	 if (result.hasErrors()) {
	    	 	 return new ModelAndView("formulario").addAllObjects(result.getModel());
	    	 }
	    	 populaBean(produtoForm);
	    	 produtoService.salva(produto);
	    	 return new ModelAndView("lista").addObject("produtos", produtoService.pegaTodos());
	    }
BindResult

	   @RequestMapping("/produto/adiciona")
	   public ModelAndView adiciona(@Valid ProdutoForm produtoForm, BindingResult result) {
	   	 if (result.hasErrors()) {
	   	 	 return new ModelAndView("formulario").addAllObjects(result.getModel());
	   	 }
	   	 populaBean(produtoForm);
	   	 produtoService.salva(produto);
	   	 return new ModelAndView("lista").addObject("produtos", produtoService.pegaTodos());
	   }
Hibernate Validator

import org.hibernate.validator.constraints.NotEmpty;

public class ProdutoForm {

	   private Long id;
	   @NotEmpty(message = "Valor não pode ser vazio")
	   private String nome;
	   @NotEmpty(message = "Valor não pode ser vazio")
	   private String descricao;

}
Desvantagens
Ainda tem XMLs
Application-Config.xml
spring-servlet.xml
web.xml
Desvantagens

• Tratar erros como 400, 404, 500 não são
  simples de tratar
• Poucos componentes de tela feitos
• Ainda possui configurações em XML ou
  configurações em classes.
Quer saber mais?
•   http://www.caelum.com.br/curso/fj-27-spring-framework/

•   http://www.javawora.blogspot.com

•   http://www.edsongoncalves.com.br/category/spring-mvc-3-0/

•   http://chavesrodolfo.blogspot.com.br/2011/02/anotacoes-do-spring.html

•   http://valdemarjr.net/2011/02/18/exemplo-spring-mvc-integrado-com-struts-
    tiles.html

•   http://static.springsource.org/spring/docs/2.0.x/reference/mvc.html

•   http://maestric.com/doc/java/spring

•   http://netbeans.org/kb/docs/web/quickstart-webapps-spring_pt_BR.html

•   http://www.mkyong.com/spring-mvc/spring-mvc-hello-world-example/

•   http://www.mkyong.com/spring/spring-autowiring-qualifier-example/
Obrigado!


       eduardo.bregaida@gmail.com
        http://javawora.blogspot.com
http://www.slideshare.net/eduardo.bregaida
                  @bregaida

Spring MVC - QConSP

  • 1.
    Vantagens e Desvantagensdo Spring MVC @bregaida
  • 2.
  • 3.
    • JSF • Struts •Spring • WebWork • Mentawai • Play Framework • VRaptor • Click Framework • Demoiselle • JBanana • JBoss Seam • Etc • Neo Framework • Brutos Framework
  • 4.
  • 5.
    Escolha aquele queatende seu negócio e te deixa confortável.
  • 6.
    Spring Framework • Criadopor Rod Johnson • Framework não intrusivo • Baseado em padrões IoC e Injeção de Dependência • O Container se encarrega de instanciar as classes Java e definir suas dependências • Possui uma arquitetura baseada em POJOs e Interfaces
  • 7.
    Vantagens • Simples ede fácil aprendizado • Liberdade para trabalhar na View • Integração simples com outros frameworks • Navegação feita por anotações • BindResult e ModelAndView faz todo trabalho nas telas para validação e estado da página • Suporte a várias Views Freemaker, JSP, Velocity • Integração com Hibernate Validator
  • 8.
    Anotações mais utilizadas • @Repository - Repositório dos dados • @Service - Camada de Serviços • @Qualifier - Qual Bean deverá ser injetado • @Autowired - Injeção dos Beans • @Controller - Camada View • @RequestMapping - Mapeamento do caminho • @RequestParam - Recebimento dos Parametros • @ResponseBody -Suporte a REST • @Valid - Responsável pela validação do parametro ou formulário
  • 9.
    @Repository @Repository public class ProdutoDaoimplements ProdutoDaoI { //Aqui código da Classe }
  • 10.
    @Service @Service public class ProdutoServiceimplements ProdutoServiceI{ //Aqui o código da classe }
  • 11.
  • 12.
    @Autowired @Service public class ProdutoServiceimplements ProdutoServiceI{ @Autowired private ProdutoDao produtoDao; } @Controller @RequestMapping("/produto/**") public class ProdutoController { @Autowired private ProdutoService produtoService; }
  • 13.
    @Qualifier import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier;   publicclass Customer {   " @Autowired " @Qualifier("personA") " private Person person; " //... } Fonte: http://www.mkyong.com/spring/spring-autowiring-qualifier-example/
  • 14.
    @RequestMapping @Controller @RequestMapping("/produto/**") public class ProdutoController{ @RequestMapping("/produto/formulario") public ModelAndView formulario() { return new ModelAndView("formulario").addObject("produtoForm", new ProdutoForm()); } @RequestMapping("/produto/adiciona") public ModelAndView adiciona(@Valid ProdutoForm produtoForm, BindingResult result) { if (result.hasErrors()) { return new ModelAndView("formulario").addAllObjects(result.getModel()); } populaBean(produtoForm); produtoService.salva(produto); return new ModelAndView("lista").addObject("produtos", produtoService.pegaTodos()); } }
  • 15.
    @RequestParam @RequestMapping(value = "/produto/remove",method = RequestMethod.GET) public ModelAndView remove(@Valid @RequestParam(value = "produto.id") long id) { produto = new Produto(); produto.setId(id); produtoService.remove(produto); return new ModelAndView("lista").addObject("produtos", produtoService.pegaTodos()); }
  • 16.
    @ResponseBody • Basta incluir os jars Jackson no projeto e será retornado um JSON: • jackson-core-asl-1.4.3.jar • jackson-mapper-asl-1.4.3.jar public @ResponseBody HashMap<String,Object> view(@RequestParam("start") int start, @RequestParam("limit") int limit) { List<Produto> produtos = produtoService.pegaTodos(); HashMap<String, Object> modelMap = new HashMap<String,Object>(); modelMap.put("produtos", produtos); return modelMap; }
  • 17.
    @ResponseBody Com Nice URL @RequestMapping(value = "/{idParceiro}/{idModalidade}", method = RequestMethod.GET)     @ResponseBody     public Modalidade obtemModalidade(@PathVariable("idParceiro") Long idParceiro, @PathVariable("idModalidade") Long idModalidade, HttpSession sessao){         return modalidadeService.obtemModalidadePorParceiro(idParceiro, idModalidade);     }
  • 18.
    ModelAndView @RequestMapping("/produto/formulario") public ModelAndViewformulario() { return new ModelAndView("formulario").addObject("produtoForm", new ProdutoForm()); } @RequestMapping("/produto/adiciona") public ModelAndView adiciona(@Valid ProdutoForm produtoForm, BindingResult result) { if (result.hasErrors()) { return new ModelAndView("formulario").addAllObjects(result.getModel()); } populaBean(produtoForm); produtoService.salva(produto); return new ModelAndView("lista").addObject("produtos", produtoService.pegaTodos()); }
  • 19.
    @Valid No Atributo public ModelAndView remove(@Valid @RequestParam(value = "produto.id") long id) { //Código do método } No Formulário @RequestMapping("/produto/adiciona") public ModelAndView adiciona(@Valid ProdutoForm produtoForm, BindingResult result) { if (result.hasErrors()) { return new ModelAndView("formulario").addAllObjects(result.getModel()); } populaBean(produtoForm); produtoService.salva(produto); return new ModelAndView("lista").addObject("produtos", produtoService.pegaTodos()); }
  • 20.
    BindResult @RequestMapping("/produto/adiciona") public ModelAndView adiciona(@Valid ProdutoForm produtoForm, BindingResult result) { if (result.hasErrors()) { return new ModelAndView("formulario").addAllObjects(result.getModel()); } populaBean(produtoForm); produtoService.salva(produto); return new ModelAndView("lista").addObject("produtos", produtoService.pegaTodos()); }
  • 21.
    Hibernate Validator import org.hibernate.validator.constraints.NotEmpty; publicclass ProdutoForm { private Long id; @NotEmpty(message = "Valor não pode ser vazio") private String nome; @NotEmpty(message = "Valor não pode ser vazio") private String descricao; }
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
    Desvantagens • Tratar erroscomo 400, 404, 500 não são simples de tratar • Poucos componentes de tela feitos • Ainda possui configurações em XML ou configurações em classes.
  • 28.
    Quer saber mais? • http://www.caelum.com.br/curso/fj-27-spring-framework/ • http://www.javawora.blogspot.com • http://www.edsongoncalves.com.br/category/spring-mvc-3-0/ • http://chavesrodolfo.blogspot.com.br/2011/02/anotacoes-do-spring.html • http://valdemarjr.net/2011/02/18/exemplo-spring-mvc-integrado-com-struts- tiles.html • http://static.springsource.org/spring/docs/2.0.x/reference/mvc.html • http://maestric.com/doc/java/spring • http://netbeans.org/kb/docs/web/quickstart-webapps-spring_pt_BR.html • http://www.mkyong.com/spring-mvc/spring-mvc-hello-world-example/ • http://www.mkyong.com/spring/spring-autowiring-qualifier-example/
  • 29.
    Obrigado! eduardo.bregaida@gmail.com http://javawora.blogspot.com http://www.slideshare.net/eduardo.bregaida @bregaida