E.2 Grau de severidade
3.15 Classe Controller Noticia
A Figura 3.5 apresenta a UI, gerada pelos códigos 3.14 e 3.15.
Figura 3.5: UIs CRUD notícia com anotações do modelo de apresentação
Os atributos titulo, materia e imagem são do tipo String, mas estão anotados com tipos diferentes de anotações. O atributo titulo foi anotado com o tipo @Html, que permite a modificação de propriedades compartilhadas por todos widgets. Foi atribuído ao elemento displayNameo valor "Título", corrigindo assim, a acentuação do rótulo do
Widget. Também foi aplicado, ao Widget, um texto de ajuda “digite o título”, com o uso do elementoplaceHolder.
O atributo materia foi anotado com o tipo de anotação @Html.TextArea. Quando um atributo é anotado [email protected] UI é apresentado com um editor WYSIWYG (what you see is what you get), o que permite ao usuário aplicar estilos ao texto. Essa configuração pode ser removida, de forma que apenas um elemento TextAreaseja exibido, para isso o elementoeditor, do tipo de anotaçã[email protected], deve estar configurado comfalse.
O atributo imagem foi anotado com o tipo de anotação @Html.Input. Por padrão, todo atributo do tipo String é um elemento Inputdo tipotext. Quando o elemento é ano- tado com @Html.Input é possível alterar o tipo do elemento Input, por meio do ele- mento inputType. No exemplo, foi atribuído ao elemento inputType o enumerador
InputType.FILE, desta forma, o campo será apresentado como um campo de upload, além disso, a UI ao ser gerada estará apta para realizar upload de arquivos. Os arqui-
vos serão armazenados em um diretório do servidor e seu caminho será armazenado no atributo.
O atributodataPublicacaoé do tipoDateque pode ser utilizado, em Java, para armaze- nar data e hora. Sempre que este tipo é utilizado, o padrão JPA exige que seja informado a forma de mapeamento para o banco de dados. É possível mapear o atributo como uma data, uma hora ou como uma data e hora. O mapeamento é realizado com o tipo de anotação @Temporal. O framework ObCrud utiliza essa informação para gerar um widget apropriado para atributo.
3.2.3
Validação de dados
O ObCrud utiliza a Bean Validation API (BERNARD; PETERSON, 2009) para realizar a validação de campos do formulário (widgets). O Código 3.16 apresenta a utilização dos tipos de anotação para validação de dados. A Figura 3.6 apresenta a UI gerada, por meio da classe
Medico, após uma tentativa de cadastro com valores inválidos.
1 @Entity
2 public class Medico {
3
4 @Id
5 @GeneratedValue
6 private Integer idMedico;
7
8 @NotNull
9 private String nome;
10
11 @NotNull
12 @Size(min = 3, message="O número do CRM deve possuir no mínimo 3 dígitos") 13 private String crm; 14 15 @ValidCPF 16 private String cpf; 17 18 //getter e setter 19 20 }
Código 3.16: Classe para validação de dados
Figura 3.6: Exemplo de UIs com validação de dados
A linha 8 utiliza o tipo de anotação@NotNullpara informar que o atributonomenão pode ser nulo, ou seja, seu preenchimento é obrigatório. O atributocrm, linha 13, utiliza os tipos de anotação @NotNull, linha 11, e @Size, linha 12, desta forma o valor do atributo não pode ser nulo e seu comprimento não pode ser inferior a 3 caracteres, conforme definido no elemento min. O elemento message do tipo de anotação @Sizefoi configurado para alterar a mensagem exibida no caso de falha da validação. Por fim, o atributocpfutiliza a anotação@ValidCPF, apresentada no Código 2.28. As anotações@NotNulle@Sizesão tipos incorporados a Bean Validation API, enquanto que a anotação@ValidCPFé um tipo criado pelo usuário.
O ObCrud realiza a validação de dados em dois momentos. No primeiro momento, a validação é realizada no lado cliente (client-side), utilizando os novos recursos do HTML 5. No segundo momento, a validação é realizada no lado do servidor (server-side), neste momento a Bean Validation API é acionada. A Figura 3.6 (a) apresenta a UI para adicionar médico, após a tentativa de salvar o registro sem os campos estarem preenchidos. Neste caso, foi realizada a validação no client-side. Na Figura 3.6 (b) o campo nome havia sido preenchido, ocpfnão estava preenchido e ocrmpossuía apenas um caractere. No segundo foi realizada a validação no server-side.
O HTML 5 não possibilita realizar todos os tipos de validação, por isso a Bean Validator API é essencial. Além disso, o ObCrud, foi projetado para implementar serviços web (RESTful), neste caso, a validação pode ocorrer somente no server-side. A validação no client-side busca reduzir, quando possível, a carga de trabalho do servidor e agilizar o preenchimento dos dados, visto que a validação no client-side é mais rápida do que no server-side.
3.2.4
Geração de UIs com associações entre classes de domínio
Nos exemplos anteriores, as UIs foram geradas a partir de uma única classe do modelo de domínio. No desenvolvimento de sistemas reais é comum a existência de diversas classes inter-associadas. Uma associação de classes, em Java, consiste na definição de um atributo em uma classe, cujo tipo é outra classe. A Figura 3.7 apresenta um diagrama de classes, onde a classeCirurgiaestá associada as classesMedicoePaciente.
A associação apresentada na Figura 3.7 entre a classePacienteeCirurgiaé uma associa- ção de multiplicidade um para muitos, assim em código Java, a classePacientepossuirá uma lista de atributos do tipo Cirurgia, enquanto que a classe Cirurgiapossuirá um atributo do tipoPaciente. O Código 3.17 apresenta a implementação, em Java, da classe
Pacientemostrada na Figura 3.7.
1 @Entity
2 public class Paciente {
3 @Id
4 @GeneratedValue
5 private int idPaciente;
6 private String nome;
7 private String cpf;
8
9 @OneToMany(mappedBy = "paciente", cascade = CascadeType.ALL)
10 private List<Cirurgia> cirurgias = new ArrayList<>();
11 //getter e setter
12 }