Explorando a biblioteca de tags de formulário do SpringMVC

Explorando a biblioteca de tags de formulário do SpringMVC

1. Visão geral

Nofirst article desta série, introduzimos o uso da biblioteca de tags de formulário e como vincular dados a um controlador.

Neste artigo, cobriremos as várias tags que Spring MVC fornece para nos ajudarcreate and validate forms.

2. A taginput

Vamos começar com a taginput. Esta tag renderiza uma tag HTMLinput usando o valor vinculado etype='text' por padrão:

A partir do Spring 3.1, você pode usar outros tipos específicos de HTML5, como email, data e outros. [.hps]#For example,if we wanted tocreate an emailfield,we can use type='email': #

[.hps]#Similarly,to createa date field, [#result_box]#we can use type='date', which will render a date picker in many browsers compatible with HTML5: ##

3. A tagpassword

Esta tag renderiza uma tag HTMLinput comtype='password' usando o valor vinculado. Esta entrada HTML mascara o valor digitado no campo:

4. A tagtextarea

Esta tag renderiza um HTMLtextarea:

Podemos especificar o número derowsecolumns da mesma forma que faríamos com um HTMLtextarea.

5. A tagcheckbox echeckboxes

A tagcheckbox renderiza uma tag HTMLinput comtype='checkbox'. A biblioteca de tags de formulário do Spring MVC oferece diferentes abordagens para a tagcheckbox que deve atender a todas as nossas necessidades decheckbox:

O exemplo acima gera um únicocheckbox clássico, com um valorboolean. Se definirmos o valor limite paratrue, esta caixa de seleção será marcada por padrão.

O exemplo a seguir gera várias caixas de seleção. Nesse caso, os valorescheckbox são codificados dentro da página JSP:

Bird watching: 
Astronomy: 
Snowboarding: 

Aqui, o valor limite é do tipoarray oujava.util.Collection:

String[] hobbies;

A finalidade da tagcheckboxes é usada para renderizar várias caixas de seleção, onde os valores da caixa de seleção são gerados no tempo de execução:

Para gerar os valores passamos umArray, umList ou umMap contendo as opções disponíveis na propriedadeitems. Podemos inicializar nossos valores dentro do controlador:

List favouriteLanguageItem = new ArrayList();
favouriteLanguageItem.add("Java");
favouriteLanguageItem.add("C++");
favouriteLanguageItem.add("Perl");

Normalmente, a propriedade bound é uma coleção, para que possa conter vários valores selecionados pelo usuário:

List favouriteLanguage;

6. A tagradiobutton eradiobuttons

Esta tag renderiza uma tag HTMLinput comtype='radio':

Male: 
Female: 

Um padrão de uso típico envolve várias instâncias de tags com valores diferentes vinculados à mesma propriedade:

private String sex;

Assim como a tagcheckboxes, a tagradiobuttons renderiza várias tags HTMLinput comtype='radio':

Nesse caso, podemos passar as opções disponíveis comoArray,List ouMap contendo as opções disponíveis na propriedadeitems:

List jobItem = new ArrayList();
jobItem.add("Full time");
jobItem.add("Part time");

7. A tagselect

Esta tag renderiza um elemento HTMLselect:

Para gerar os valores passamos umArray, umList ou umMap contendo as opções disponíveis na propriedadeitems. [.hps]#Once again #, podemos inicializar nossos valores dentro do controlador:

Map countryItems = new LinkedHashMap();
countryItems.put("US", "United States");
countryItems.put("IT", "Italy");
countryItems.put("UK", "United Kingdom");
countryItems.put("FR", "France");

A tag de seleção também suporta o uso de tagsoptioneoptions aninhadas.

Enquanto a tagoption renderiza um único HTMLoption, a tagoptions renderiza uma lista de tags HTMLoption.

A tagoptions recebe umArray, umList ou umMap contendo as opções disponíveis na propriedadeitems, assim como a tagselect :


    
    

[.hps]#Whenwe have theneedto selectseveral items at once, podemoscreate amultiple listabox. # Para renderizar este tipo de lista, basta adicionar o atributomultiple=”true” na tagselect.

Aqui, a propriedade vinculada é umarray ou umjava.util.Collection:

List fruit;

8. A taghidden

Esta tag renderiza uma tag HTMLinput comtype='hidden' usando o valor vinculado:

9. A tagErrors

As mensagens de erro do campo são geradas pelos validadores associados ao controlador. Podemos usar a tag de erros para renderizar as mensagens de erro do campo:

Isso exibirá erros para o campo especificado na propriedadepath. As mensagens de erro são renderizadas em uma tagspan por padrão, com.errors anexado ao valorpath comoid e, opcionalmente, uma classe CSS decssClasspropriedade s, que pode ser usada para definir o estilo da saída:

Name is required!

Para encerrar as mensagens de erro com um elemento diferente em vez da tagspan padrão, podemos especificar o elemento preferido dentro do atributoelement:

Isso renderiza as mensagens de erro em um elementodiv:

Name is required!

In addition to having [.hps]the capacidade de mostrar erros[.hps] para a specific input element, podemos exibir a lista completa de erros (independentemente do campo) para uma determinada página. Isso é obtido pelo uso do curinga*:

9.1. O validador

Para exibir erros para um determinado campo, precisamos definir um validador:

public class PersonValidator implements Validator {

    @Override
    public boolean supports(Class clazz) {
        return Person.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required.name");
    }
}

Nesse caso, se o camponame estiver vazio, o validador retornará a mensagem de erro identificada porrequired.name do pacote de recursos.

O pacote de recursos é definido no arquivo de configuração SpringXML da seguinte forma:


     

Ou em um estilo de configuração Java puro:

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasenames("messages");
    return messageSource;
}

A mensagem de erro é definida dentro do arquivomessages.properties:

required.name = Name is required!

Para aplicar esta validação, precisamos incluir uma referência ao validador em nosso controlador e chamar o métodovalidate no método do controlador que é chamado quando o usuário envia o formulário:

@RequestMapping(value = "/addPerson", method = RequestMethod.POST)
public String submit(
  @ModelAttribute("person") Person person,
  BindingResult result,
  ModelMap modelMap) {

    validator.validate(person, result);

    if (result.hasErrors()) {
        return "personForm";
    }

    modelMap.addAttribute("person", person);
    return "personView";
}

9.2. JSR 303 Bean Validation

A partir do Spring 3, podemos usarJSR 303 (por meio da anotação@Valid) para validação do bean. Para fazer isso, precisamos de umJSR303 validator framework no caminho de classe. UsaremosHibernate Validator (a implementação de referência). A seguir está a dependência que precisamos incluir no POM:


    org.hibernate
    hibernate-validator
    5.1.1.Final

Para fazer o Spring MVC suportar a validação JSR 303 por meio da anotação@Valid, precisamos habilitar o seguinte em nosso arquivo de configuração do Spring:

Ou use a anotação@EnableWebMvc correspondente em uma configuração Java:

@EnableWebMvc
@Configuration
public class ClientWebConfigJava implements WebMvcConfigurer {
    // All web configuration will go here
}

Em seguida, precisamos anotar o método do controlador[.hps]#thatwe want tovalidate # com a anotação@Valid:

@RequestMapping(value = "/addPerson", method = RequestMethod.POST)
public String submit(
  @Valid @ModelAttribute("person") Person person,
  BindingResult result,
  ModelMap modelMap) {

    if(result.hasErrors()) {
        return "personForm";
    }

    modelMap.addAttribute("person", person);
    return "personView";
}

Agora podemos anotar a propriedade da entidade para validá-la com a anotação do validador Hibernate:

@NotEmpty
private String password;

Por padrão, esta anotação exibirá“may not be empty” se deixarmos o campo de entrada de senha vazio.

Podemos substituir a mensagem de erro padrão criando uma propriedade no pacote de recursos definido no exemplo do validador. A chave da mensagem segue a regraAnnotationName.entity.fieldname:

NotEmpty.person.password = Password is required!

10. Conclusão

Neste tutorial, exploramos as várias tags que o Spring fornece para trabalhar com formulários.

Também vimos a tag para exibir erros de validação e a configuração necessária para exibir mensagens de erro personalizadas.

Todos os exemplos acima podem ser encontrados em aGitHub project. Este é um projeto baseado em Eclipse, portanto, deve ser fácil importar e executar como está.

Quando o projeto é executado localmente, o exemplo do formulário pode ser acessado em: