Pergunta

Pergunta sobre Spring MVC @ModelAttribute métodos, definindo atributos de modelo em um controlador @RequestMapping método versos definindo atributos individualmente com @ModelAttribute métodos, qual é considerado melhor e mais utilizado?

Do ponto de vista do design, qual abordagem é considerada melhor a partir do seguinte:

Abordagem 1

@ModelAttribute("message")
public String addMessage(@PathVariable("userName") String userName, ModelMap model) {

  LOGGER.info("addMessage - " + userName);
  return "Spring 3 MVC Hello World - "  + userName;
}

@RequestMapping(value="/welcome/{userName}", method = RequestMethod.GET)
public String printWelcome(@PathVariable("userName") String userName, ModelMap model) {

  LOGGER.info("printWelcome - " + userName);
  return "hello";
}   

Abordagem 2

@RequestMapping(value="/welcome/{userName}", method = RequestMethod.GET)
public String printWelcome(@PathVariable("userName") String userName, ModelMap model) {

  LOGGER.info("printWelcome - " + userName);

  model.addAttribute("message", "Spring 3 MVC Hello World - "  + userName);

  return "hello";
}   
Foi útil?

Solução

Um não é melhor que o outro.Ambos servem a outro propósito.

  • Método: Se você precisar que o modelo de um controlador específico seja sempre preenchido com determinados atributos, o nível do método @ModelAttribute Faz mais sentido.
  • Parâmetro: Use-o em um parâmetro quando quiser vincular dados da solicitação e adicioná-los implicitamente ao modelo.

Para responder à sua pergunta sobre a melhor abordagem

Eu diria que a abordagem 2 é melhor, pois os dados são específicos desse manipulador.

Outras dicas

O @ModelAttribute annotation serve a dois propósitos dependendo de como é usado:

No nível do método

Usar @ModelAttribute no nível do método para fornecer dados de referência para o modelo.Os métodos anotados @ModelAttribute são executados antes do escolhido @RequestMapping método manipulador anotado.Eles efetivamente preenchem previamente o modelo implícito com atributos específicos, geralmente carregados de um banco de dados.Tal atributo já pode ser acessado através @ModelAttribute parâmetros anotados do método manipulador no método manipulador escolhido, potencialmente com ligação e validação aplicadas a ele.

Em outras palavras;um método anotado com @ModelAttribute preencherá a “chave” especificada no modelo.Isso acontece ANTES do @RequestMappingNo nível do parâmetro do método

No nível do parâmetro do método

Quando você coloca @ModelAttribute em um parâmetro de método, @ModelAttribute mapeia um atributo de modelo para o parâmetro de método anotado específico.É assim que o controlador obtém uma referência ao objeto que contém os dados inseridos no formulário.

Exemplos

Nível do método

@Controller
public class MyController {
    @ModelAttribute("productsList")
    public Collection<Product> populateProducts() {
        return this.productsService.getProducts();
    }
   }

Então, no exemplo acima, “productsList”no modelo é preenchido antes do @RequestMapping é desempenhado.

Nível de parâmetro do método

@Controller
public class MyController {
    @RequestMapping(method = RequestMethod.POST)
    public String processSubmit(@ModelAttribute("product") Product myProduct, BindingResult result, SessionStatus status) {

        new ProductValidator().validate(myProduct, result);
        if (result.hasErrors()) {
            return "productForm";
        }
        else {
            this.productsService.saveProduct(myProduct);
            status.setComplete();
            return "productSaved";
        }
    }
}

Olhar aqui para obter informações detalhadas com exemplos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top