vendredi 27 juillet 2018

Types de paramètres pour un contrôleur

Types de paramètres pour un contrôleur


Les exemples utilisent spring boot 2.

Nous allons voir comment effectuer une sauvegarde de donnée à l'aide de Spring.

Nous allons aborder l'approche avec un modeleAttribute et un RequestBody

Avec un requestBody

Tous les paramètres passent en JSon ou xml. Il est préférable d'employé un request body lors d'un envoi en ajax, même s'il est possible de le faire avec un modelAttribute.

Côté Client

$("#colorsForm").submit(function (e) {
    e.preventDefault();
    var colorsId= $('#colorsForm input[name="id"]').val();
    var form = transForm.serialize('#colorsForm');
    form = JSON.stringify(form);

    $.ajax({
        type: "post",
        url: "/template/edit/colors/" + colorsId,
        data: form,
        contentType: "application/json",
        dataType : "json",
        success: function (data) {
            $('#colorsForm input[name="id"]').val(data.id);
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            alert("Erreur");
        }
    });


Côté serveur

    @PostMapping("template/edit/colors/{id}")
    @ResponseBody
    public ColorsDto edit(Model model, @RequestBody ColorsDto dto, @PathVariable("id") Integer id)  {
        return colorsService.save(dto);
    }



Avec un modeleAttribute

Tous les paramètres sont envoyé via l'url, cette façon de faire est à opter lorsqu'on désire lier un formulaire à un object du côté serveur.

Côté Client
   
$("#colorsForm").submit(function (e) {
     e.preventDefault();
    
     var colorsId = $('#colorsForm input[name="id"]').val();
    
     $.ajax({
         type: "post",
         url: "/template/edit/colors/" + colorsId,
         data: $("#colorsForm").serialize(),
         success: function (data) {
             $('#colorsForm input[name="id"]').val(data.id);
         },
         error: function (XMLHttpRequest, textStatus, errorThrown) {
             alert("Erreur");
         }
     });

 });

});



Côté serveur

    @PostMapping("template/edit/colors/{id}")
    @ResponseBody
    public ColorsDto edit(Model model, @ModelAttribute ColorsDto dto, @PathVariable("id") Integer id) {
        returncolorsService.save(dto);
    }

   
    Les deux façons de faire permettent d'arriver au même résultat.

vendredi 15 juin 2018

Datatable et la pagination de Spring Data

Datatable est un composant JQuery qui fournit divers fonctionalités: pagination, trie, filtre concernant un tableau (grid).  C'est un des plus évolué dans son domaine.

Voici l'initialisation du datatable en Javascript. La partie en gras concernant le passage des paramètres côté client au côté serveur.

var samplingsTable = $('#samplingsTable').DataTable({
    'bLengthChange': false, //hide 'show entries dropdown
    'processing': true,
    'serverSide': true,
    'pagingType': 'simple_numbers',
    'dom': 'Bfrtip',
    'ajax': {
        'type': 'get',
        'url': url,
        'data': function(d) {
            var current = $('#samplingsTable').DataTable();
            d.page = (current != undefined) ? current.page.info().page : 0;
            d.size = (current != undefined) ? current.page.info().length : 5;
            d.sort = d.columns[d.order[0].column].data + ',' + d.order[0].dir;
            d.search = d.search.value;
        }
    },
    'columns': [
      {'data': 'compositeId'}, 
      {'data': 'buildDate'}, 
      {'data': 'productTypesName'}, 
      {'data': 'productsName'}, 
      {'data': 'machineName'}
     ]
});

Niveau serveur, il faut faire le pont du côté serveur à client. Le paramètre draw est un champ utilisé par Datatable.

@GetMapping("samplings")
@ResponseBody
public Map<String, Object> getSamplings(Pageable pageable,
            @RequestParam("draw") Integer draw,

            @RequestParam(value = "search", defaultValue = "") String search) {

             Map<String, Object> data = new HashMap<>();

             Page<SamplingsDto> newPage  = samplingsService.get(pageable);

             data.put("data", newPage.getContent());
             data.put("draw", draw);
             data.put("recordsTotal", newPage.getTotalElements());
             data.put("recordsFiltered", newPage.getTotalElements());

             return data;
}

Il y a d'autre façon de procéder. tel que tout faire sur le serveur ou le client. La façon présenté ici est hybride.

Triage de clé composite avec Spring Data

Une clé primaire est très souvent lié à un champs. Il est possible d'en composer une à l'aide de plusieurs champs. Dans notre exemple, nous utliserons spring boot 2, jpa avec l'implémentation hibernate et postgres sql. Il est possible que ça fonctionne avec d'autre base de données et d'autre implémentation de JPA. La clé primaire sera composé de deux champs. Soit un Id issue d'une séquence et de l'année en cours.

@Entity
@IdClass(SamplingsPK.class)
public class Samplings {

    @Id
    private Integer year;

    @Id
    @GeneratedValue
    private Integer id;
}

public class SamplingsPK implements Serializable {

    private int year;
    private Integer id;

    public SamplingsPK(int year, Integer id) {
        this.id = id;
        this.year=year;
    }

    private SamplingsPK(){
        
    } 

    @PrePersist
    public void prePersist() {
        year = LocalDate.now().getYear();
    }

}

Puisque nous utilisons une clé composé, au niveau du repository, il faut spécifié le type.

@Repository
public interface SamplingsRepository extends JpaRepository<Samplings, SamplingsPK> {
}

Lorsque vous utilisez le paging dans Spring Data, il faut mentionner les champs de la clé composé.

Pageable pageable = PageRequest.of(1, 1, Sort.Direction.ASC, "year","id");

samplingsRepository.findAll(pageable);

Nous avons vue comment utiliser une clé composé  lors de l'utilisation de la pagination avec Spring data.