当前位置:网站首页>Template Engine Velocity Foundation
Template Engine Velocity Foundation
2022-07-01 16:38:00 【C'est toujours la même chose.】
Table des matières
3.3.1 Référence de la variable
3.4.2 Introduction de ressources
1、velocityIntroduction
VelocityEst basé surJavaMoteur de modèle pour,Peut être obtenu par une syntaxe spécifique àjavaDonnées de l'objet , Remplir le modèle,Pour réaliser l'interface etjavaSéparation des codes !

C'est... Velocity Quels scénarios d'application?
- WebApplication : Comme vue pour l'application, Afficher les données.
- Génération de code source : VelocityDisponible pour la génération basée sur des modèlesJavaCode source.
- E - mail automatique : Inscription au site Web , Modèle de courriel pour l'authentification, etc.
- Page Web statique : Basé survelocityModèle , Générer une page Web statique.
Structure des composantes:
Module | Description |
app | Certaines interfaces sont principalement encapsulées , Exposition des utilisateurs .Il existe deux catégories principales:,Respectivement.Velocity(Cas unique)EtVelocityEngine. |
Context | Les variables nécessaires au rendu du modèle sont principalement encapsulées |
Runtime | ToutVelocityLe module central de,Runtime Le module analyse le modèle chargé dans l'arborescence des phrases ,VelocityAppelezmergeTemplate La méthode rend l'arbre entier , Et produit le résultat final du rendu . |
RuntimeInstance | RuntimeInstance Classe entière Velocity Le rendu fournit un mode Singleton , Obtenez cette instance pour compléter le processus de rendu . |
Vous pouvez voir le site officiel pour plus de détails , Le portail est là. :The Apache Velocity Project
2、 Démarrage rapide
Voici une brève démonstration de la façon d'utiliser VelocityDéfinitionhtml Modèle, Les données dynamiques sont ensuite remplies dans le modèle , Pour former un html Page.
Commençons par créer un projet, Je vais en créer un. springBoot Projet terminé, Tout le monde peut faire ce qu'il veut. .

Créer un projet,Nous introduisonsvelocityDépendance.
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.2</version>
</dependency>On est là.resources Créer un fichier modèle sous le répertoire.

Contenu du fichier modèle
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
hello , ${name} !
</body>
</html>Une fois le Modèle créé ,On y est.Test Dans la classe,Compilationjava Code.

@Test
void contextLoads() throws IOException {
// 1、ParamètresvelocityChargeur de ressources
Properties prop = new Properties();
prop.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
// 2、InitialisationvelocityMoteur
Velocity.init(prop);
// 3、CréationVelocityConteneur
VelocityContext context = new VelocityContext();
context.put("name", " C'est toujours la même chose. ");
// 4、ChargementVelocityModèle
Template tpl = Velocity.getTemplate("vms/demo01.vm", "UTF-8");
// 5、 Fusionner les données dans le modèle
FileWriter fw = new FileWriter("E:\\code\\Demo\\velocityDemo\\src\\main\\resources\\html\\demo01.html");
tpl.merge(context, fw);
// 6、Libérer des ressources
fw.close();
}
Résultats obtenus:

Velocity Résoudre le problème de la transmission des données entre le démon et la page Web , Le Code de fond et la vue sont indépendants les uns des autres , La modification d'une partie n'affecte pas l'autre partie , Entre eux, les variables d'environnement (Context)Pour y arriver., La partie qui fait la page Web et la partie qui fait l'arrière - plan conviennent mutuellement de nommer les variables transmises. , Comme dans l'exemple de programme ci - dessus, nameVariables, Ils sont sur la page Web $name .
Tant que les deux parties sont d'accord sur le nom de la variable , Pour que les deux parties puissent travailler indépendamment . Peu importe comment la page change , Tant que le nom de la variable reste le même , Le démon n'a pas besoin d'être modifié. , La page d'accueil peut également être modifiée par n'importe quel producteur de page .C'est ça.VelocityComment ça marche?.
3、Syntaxe de base
Velocity Template Language (VTL) , - Oui.Velocity Un langage de modèle fourni dans , Conçu pour fournir le moyen le plus simple et le plus propre de fusionner du contenu dynamique dans une page Web .
En termes simplesVTL Vous pouvez afficher des nombres dynamiques dans un programme sur une page Web .
VTL Les déclarations de 4Grandes catégories:Notes , Contenu non analytique , Références et directives .
3.1 VTLNotes
Syntaxe:
- Commentaire de ligne: ## Contenu du commentaire de ligne
- Notes de bloc:#* Contenu de la note de bloc 1 Contenu de la note de bloc 2 *#
- Commentaires sur le document:#** Contenu de la note de document 1 Contenu de la note de document 2 *#
Démonstration de code:

3.2 Contenu non analytique
Qu'est - ce que le contenu non analytique ?
Le contenu non analysé n'est pas velocity Contenu analysé, Tout ce qui est écrit est imprimé tel quel. .
À quoi ça sert? ? Parce que nous écrivons directement dans un fichier modèle , Ça se montrera comme ça. .
Regardez en bas. .
Syntaxe:#[[ Contenu non analytique1 Contenu non analytique2 ]]#
Démonstration de code :

On remet ça.java Le code fonctionne .


3.3 Références
Une instruction de référence est une opération sur un attribut dans un objet contextuel moteur . Les aspects grammaticals sont divisés en grammaire générale ($Propriétés) Et la grammaire normale (${Propriétés}).
3.3.1 Référence de la variable
Syntaxe | Description |
$Nom de la variable | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"$Nom de la variable" |
${Nom de la variable} | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"${Nom de la variable}" |
$!Nom de la variable | S'il n'y a pas de variable correspondante dans le contexte ,La chaîne vide est sortie"" |
$!{Nom de la variable} | S'il n'y a pas de variable correspondante dans le contexte ,La chaîne vide est sortie"" |
Démonstration de code:

On tournejava Code pour voir l'exécution :

3.3.2 Référence de propriété
Syntaxe | Description |
$Nom de la variable.Propriétés | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"$Nom de la variable.Propriétés" |
${Nom de la variable.Propriétés} | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"${Nom de la variable.Propriétés}" |
$!Nom de la variable.Propriétés | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"" |
$!{Nom de la variable.Propriétés} | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"" |
Démonstration de code:

Nous créons une classe d'entité.

Modifions le Code de la classe d'essai. .

On va lancer le Code, Voir l'effet d'exécution .

3.3.3 Référence à la méthode
La référence de méthode fait référence à l'opération d'appel de méthode ,PréoccupationsValeur de retourEtParamètres , La valeur de retour de la méthode est sortie dans le résultat final
Syntaxe | Description |
$Nom de la variable.Méthodes([Ginseng1[, Ginseng2]*]?) | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"$Nom de la variable.Méthodes([Ginseng1[, Ginseng2]*]?" |
${Nom de la variable.Méthodes([Ginseng1[, Ginseng2]*]?)} | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"${Nom de la variable.Méthodes([Ginseng1[, Ginseng2]*]?)}" |
$!Nom de la variable.Méthodes([Ginseng1[, Ginseng2]*]?) | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"" |
$!{Nom de la variable.Méthodes([Ginseng1[, Ginseng2]*]?)} | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"" |
Démonstration de code:
On va le modifier.javaCode.

Et modifier Fichier modèle.

Et ensuite nous regardons l'effet d'exécution .

3.4 Directives
La référence de méthode fait référence à l'opération d'appel de méthode ,PréoccupationsValeur de retourEtParamètres , La valeur de retour de la méthode est sortie dans le résultat final
Syntaxe | Description |
$Nom de la variable.Méthodes([Ginseng1[, Ginseng2]*]?) | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"$Nom de la variable.Méthodes([Ginseng1[, Ginseng2]*]?" |
${Nom de la variable.Méthodes([Ginseng1[, Ginseng2]*]?)} | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"${Nom de la variable.Méthodes([Ginseng1[, Ginseng2]*]?)}" |
$!Nom de la variable.Méthodes([Ginseng1[, Ginseng2]*]?) | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"" |
$!{Nom de la variable.Méthodes([Ginseng1[, Ginseng2]*]?)} | S'il n'y a pas de variable correspondante dans le contexte ,Alors la chaîne de sortie"" |
Démonstration de code:
On va le modifier.javaCode.

Et modifier Fichier modèle.

Et ensuite nous regardons l'effet d'exécution .

3.4 Directives
Les instructions sont principalement utilisées pour définir les modules de réutilisation 、Introduction de ressources externes、Contrôle des processus.Directives # Comme caractère de départ .
3.4.1 Contrôle des processus
Directives | Syntaxe | Description |
#set | #set($Variables = Valeur) | Déclaration des variables de définition sur une page |
#if/#elseif/#else | La démonstration suivante | Faire un jugement logique |
#foreach | La démonstration suivante | Traverser un tableau ou une collection de boucles |
1、#set

Voir l'effet d'exécution :

2、#if/#elseif/#else

Regardons l'effet d'exécution .

3、#foreach

Voyons ce qui se passe. .

Propriétés intégrées:
$foreach.index | Obtenir l'index de la traversée , De0C'est parti. |
$foreach.count | Obtenir le nombre de traversées , De1C'est parti. |
3.4.2 Introduction de ressources
Directives | Description |
#include | Introduction de ressources externes , Les ressources introduites ne sont pas résolues par le moteur |
#parse | Introduction de ressources externes , Les ressources introduites seront analysées par le moteur |
#define | Définir le module de réutilisation (Sans paramètres) |
evaluate | Calcul dynamique , Le calcul dynamique nous permet d'utiliser des variables dans une chaîne |
1、#include
Nous créons un nouveau fichier modèle .

、
Et nous sommes demo01.vm Introduction de.

Regardons l'exécution.

Nous pouvons voir ${now } Non résolu , C'est ce que tout le monde doit savoir. .
2、#parse

Regardons l'effet de l'exécution .

Nous pouvons voir l'analyse .
3、#define

Effets:

4、#evaluate

Effets:

3.4.3 Macroinstruction
Action : Définir le module de réutilisation (Avec paramètres)
Définir la syntaxe:
#macro(Nom de la macro [$arg]?)
.....
#endSyntaxe d'appel:
#Nom de la macro([$arg]?)Présentation:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
#set($userList = [
{"name":" C'est toujours la même chose. ","sex":"Hommes","age":"22"}
])
<h1>Macro personnalisée</h1> #macro(table $list)
<table border="1px">
<tr>
<td>No.</td>
<td>Nom d'utilisateur</td>
<td>Mot de passe</td>
<td>Boîte aux lettres</td>
<td>Âge</td>
<td>Fonctionnement</td>
</tr>
#foreach($item in $list)
<tr>
<td>${foreach.count}</td>
<td>${item.name}</td>
<td>${item.sex}</td>
<td>${item.age}</td>
</tr>
#end
</table>
#end
<h1>Macro d'appel</h1>
#table($userList)
</body>
</html>Effets:

边栏推荐
- Analysis of PostgreSQL storage structure
- Sweden announced its decision to exclude Huawei 5g equipment, but Huawei has successfully found a new way out
- 【Hot100】17. 电话号码的字母组合
- How to use MySQL language for row and column devices?
- 怎么用MySQL语言进行行列装置?
- vim用户自动命令示例
- The picgo shortcut is amazing. This person thinks exactly the same as me
- UML tourism management system "suggestions collection"
- Défaillance lors du démarrage de la machine virtuelle VMware: le poste de travail VMware n'est pas compatible avec hyper - V...
- What are the differences between PHP and DW
猜你喜欢

VMware 虚拟机启动时出现故障:VMware Workstation 与 Hyper-v 不兼容...

The supply of chips has turned to excess, and the daily output of Chinese chips has increased to 1billion, which will make it more difficult for foreign chips

Huawei issued hcsp-solution-5g security talent certification to help build 5g security talent ecosystem
![[nodemon] app crashed - waiting for file changes before starting... resolvent](/img/ee/9830afd86e092851a2a906cb994949.png)
[nodemon] app crashed - waiting for file changes before starting... resolvent

Apple's self-developed baseband chip failed again, which shows Huawei Hisilicon's technological leadership

Comment utiliser le langage MySQL pour les appareils de ligne et de ligne?

Authentication processing in interface testing framework

模板引擎Velocity 基礎

IM即时通讯开发万人群聊消息投递方案

VMware virtual machine failed during startup: VMware Workstation is incompatible with hyper-v
随机推荐
Pico, do you want to save or bring consumer VR?
SQLServer查询: a.id与b.id相同时,a.id对应的a.p在b.id对应的b.p里找不到的话,就显示出这个a.id和a.p
VMware 虛擬機啟動時出現故障:VMware Workstation 與 Hyper-v 不兼容...
【Hot100】19. Delete the penultimate node of the linked list
Tutorial on the principle and application of database system (003) -- MySQL installation and configuration: manually configure MySQL (Windows Environment)
UML旅游管理系统「建议收藏」
Is it reliable to open an account on flush with mobile phones? Is there any potential safety hazard
数据库系统原理与应用教程(005)—— yum 离线安装 MySQL5.7(Linux 环境)
Bugku's file contains
Authentication processing in interface testing framework
实现数字永生还有多久?元宇宙全息真人分身#8i
China's intelligent transportation construction from the perspective of "one hour life circle" in Dawan District
Use Tencent cloud to build a map bed service
Principle of motion capture system
Rhcsa Road
程序员职业生涯真的很短吗?
How to optimize repeated if err in go language= Nil template code?
Idea start command line is too long problem handling
Origin2018安装与使用(整理中)
Go 语言怎么优化重复的 if err != nil 样板代码?