Introduction au thymeleaf
En termes simples, Thymeleaf est un moteur de modèle similaire à la vitesse et au freemarker, qui peut complètement remplacer JSP. Par rapport à d'autres moteurs de modèle, il a les trois caractéristiques extrêmement attrayantes suivantes:
1.Thymeleaf peut être exécuté dans un environnement avec ou sans réseau, c'est-à-dire qu'il permet aux artistes de visualiser les effets statiques des pages du navigateur et permet également aux programmeurs de visualiser les effets de page dynamique avec des données sur le serveur. En effet, il prend en charge les prototypes HTML, puis ajoute des attributs supplémentaires à la balise HTML pour réaliser la méthode d'affichage des modèles + données. Lorsque le navigateur interprète HTML, les attributs de balise non définis seront ignorés, de sorte que le modèle de thymeleaf peut être exécuté statiquement; Lorsque les données sont renvoyées à la page, la balise Thymeleaf remplacera dynamiquement le contenu statique, ce qui fait afficher la page dynamiquement.
2. Thymeleaf est hors de la boîte. Il fournit deux dialectes: la norme standard et le ressort. Vous pouvez appliquer directement des modèles pour réaliser des effets d'expression JSTL et OGNL, en évitant la difficulté de mettre des modèles, des JSTL et des étiquettes changeantes chaque jour. Dans le même temps, les développeurs peuvent également se développer et créer des dialectes personnalisés.
3.ThyMeleaf fournit un dialecte standard Spring et un module optionnel qui est parfaitement intégré à SpringMVC, qui peut rapidement implémenter la liaison de formulaire, l'éditeur d'attribut, l'internationalisation et d'autres fonctions.
Méthode de téléchargement de formulaire:
// html: <formulaire encType = "multipart / form-data" method = "post" action = "/ sell / imageupload"> <v> <button type = "Button" data-dismiss = "modal" aria-hidden = "true"> </ bouton> <h4 id = "mymodallabel"> cochent les informations </h4> </v> <v> <v> id = "edit_name" value = "$ {goods.name}" name = "name" /> </ div> <v> <vabe> code: </ label> <entrée id = "edit_sn" name = "sn" value = "$ {goods.sn}" /> </ div> "pondération" Value = "$ {goods.weight}" /> </ div> <div> <bablow> marketprice: </ label> <entrée id = "edit_marketprice" name = "MarketPrice" value = "$ {goons.marketprice}" /> </ div> <div> <div> <label> shopprice " Value = "$ {GOODS.Shopprice}" /> </ div> <div> <bablow> Unité: </ Label> <Input id = "Edit_Unit" name = "Unit" Value = "$ {GOODS.Unit}" /> </ div> <div> <label> Number: </ Label> <entrée id = "edit_number" name = "Number" Value = "$ {Goods.Number} <! - <formulaire encType = "multipart / form-data" metheth = "post" action = "/ sell / imageupload"> <entrée ype = "Hidden" id = "edit_goods_sn" name = "sn" value = "$ {goods.sn}" /> -> Image <intrut type = "file" id = "edit_image" nom = "fichier" /> <port type = "soumettre" value = "upload" /> <! - </ form> -> </ div> </ div> <div> <Button Type = "Button" Data-Dismiss = "Modal"> Close </ Button> <Input Type = "Soumide" id = "edit_save" Value = "Soumider"> Soumettre les modifications </ Entrée> </v> </ Form> / / Contrôler @requestmapping (valeur = "/ Save", méthode = piste de mode SaveGoodSpage (@RequestParam (valeur = "id", obligatoire = false) String id, @ requestParam (value = "name", required = false) Nom de chaîne, @ requestParam (value = "sn", obligatoire = false) String sn, @RequestParam (value = false) String Weight, @requestparam (value = value = "weight", require "MarketPrice", obligatoire = false) String MarketPrice, @ requestParam (value = "shopprice", requise = false) String shopprice, @RequestParam (value = "unit", required = false) String Unit, @RequestParam (value = "Détail", requis = false) Détail de chaîne, @ requestParam (value = "file") Fichier multipartfile) {if (! File.isEmPty () {Try {Try {Try {File {Fichier) ot BufferedOutputStream Out = new BufferedOutputStream (new FileOutputStream (nouveau fichier ("SRC / Main / Resources / Static / Images / Product /" + Sn + ".jpg"))); // Enregistrer l'image dans le répertoire Out.Write (file.getbytes ()); out.flush (); out.close (); String filename = "/// images /// produit ///" + sn + ".jpg"; /*User.settupian(FileName); //userRepository.save(User) ;//add User * /} Catch (filenotFoundException e) {e.printStackTrace (); return "Télécharger l'erreur", + e.getMessage (); } catch (ioException e) {e.printStackTrace (); return "télécharger l'erreur" + e.getMessage (); }} //...Other opérations}Supplément: Y a-t-il une différence entre les expressions variables et les expressions d'astérisque?
Il n'y a pas de différence entre les deux sans considérer le contexte; L'évaluation de la syntaxe Asterisk est exprimée sur l'objet sélectionné, pas le contexte entier Quel est l'objet sélectionné? C'est la valeur de la balise parent, comme suit:
<div th: object = "$ {session.user}"> <p> name: <span tH: text = "* {firstName}"> Sebastian </span>. </p> <p> nom de famille: <span TH: Text = "* {LastName}"> Pepper </pan>. </p> <p> Nationalité: <Span} "> Pepper </ Span>. </p> <p> Nationality: <Span} th: text = "* {nationalité}"> Saturne </span>. </p> </div>Ceci est exactement équivalent à:
<div th: object = "$ {session.user}"> <p> name: <span th: text = "$ {session.user.firstname}"> sebastian </span>. </p> <p> Nom: <span th: text = "$ {session.user.LastName}"> pepper </pan>. th: text = "$ {session.user.nationality}"> saturn </span>. </p> </div>Bien sûr, le signe du dollar et la syntaxe d'astérisque peuvent être mitigés:
<div th: object = "$ {session.user}"> <p> name: <span tH: text = "* {firstName}"> Sebastian </span>. </p> <p> nom de famille: <spann th: text = "$ {session.user.lastname}"> pepper </span>. </p> <p> Nationality: <pannet th: text = "* {nationalité}"> Saturne </span>. </p> </div>Résumer
Ce qui précède est les étapes de fonctionnement pour télécharger l'image de thymelea à la botte de ressort. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!