ylbtech-FreeMarker:模板开发指南
1、
入门
模板 + 数据模型 = 输出
数据模型一览
模板一览
数值,类型
模板
其它
自定义指令
在模板中定义变量
命名空间
空白处理
替换(方括号)语法
2、
1、模板 + 数据模型 = 输出
http://freemarker.foofun.cn/dgui_quickstart_basics.html
1.2、
假设在一个在线商店的应用系统中需要一个HTML页面,和下面这个页面类似:
< html >
< head >
< title > Welcome!title >
head >
< body >
< h1 > Welcome John Doe!h1 >
< p > Our latest product:
< a href ="products/greenmouse.html" > green mousea > !
body >
html >
这里的用户名(上面的"Big Joe"),应该是登录这个网页的访问者的名字, 并且最新产品的数据应该来自于数据库,这样它才能随时更新。那么不能直接在HTML页面中输入它们, 不能使用静态的HTML代码。此时,可以使用要求输出的 模板 。 模板和静态HTML是相同的,只是它会包含一些 FreeMarker 将它们变成动态内容的指令:
< html >
< head >
< title > Welcome!title >
head >
< body >
< h1 > Welcome ${user}!h1 >
< p > Our latest product:
< a href ="${latestProduct.url}" > ${latestProduct.name}a > !
body >
html >
模板文件存放在Web服务器上,就像通常存放静态HTML页面那样。当有人来访问这个页面, FreeMarker将会介入执行,然后动态转换模板,用最新的数据内容替换模板中 ${... }
的部分, 之后将结果发送到访问者的Web浏览器中。访问者的Web浏览器就会接收到例如第一个HTML示例那样的内容 (也就是没有FreeMarker指令的HTML代码),访问者也不会察觉到服务器端使用的FreeMarker。 (当然,存储在Web服务器端的模板文件是不会被修改的;替换也仅仅出现在Web服务器的响应中。)
请注意,模板并没有包含程序逻辑来查找当前的访问者是谁,或者去查询数据库获取最新的产品。 显示的数据是在 FreeMarker 之外准备的,通常是一些 "真正的" 编程语言(比如Java) 所编写的代码。模板作者无需知道这些值是如何计算出的。事实上,这些值的计算方式可以完全被修改, 而模板可以保持不变,而且页面的样式也可以完全被修改而无需改动模板。 当模板作者(设计师)和程序员不是同一人时,显示逻辑和业务逻辑相分离的做法是非常有用的, 即便模板作者和程序员是一个人,这么来做也会帮助管理应用程序的复杂性。 保证模板专注于显示问题(视觉设计,布局和格式化)是高效使用模板引擎的关键。
为模板准备的数据整体被称作为 数据模型 。 模板作者要关心的是,数据模型是树形结构(就像硬盘上的文件夹和文件),在视觉效果上, 数据模型可以是:
(root)
|
+- user = "Big Joe"
|
+- latestProduct
|
+- url = "products/greenmouse.html"
|
+- name = "green mouse"
Note:
上面只是一个形象化显示;数据模型不是文本格式,它来自于Java对象。 对于Java程序员来说,root就像一个有 getUser()
和 getLatestProduct()
方法的Java对象, 也可以有 "user"
和 "latestProducts"
键值的Java Map
对象。相似地,latestProduct
就像是有 getUrl()
和getName()
方法的Java对象。
早期版本中,可以从数据模型中选取这些值,使用 user
和 latestProduct.name
表达式即可。如果我们继续类推, 数据模型就像一个文件系统,那么 "(root)" 和 latestProduct
就对应着目录(文件夹),而 user
, url
和 name
就是这些目录中的文件。
总的来说,模板和数据模型是FreeMarker来生成输出(比如第一个展示的HTML)所必须的:
模板 + 数据模型 = 输出
2、数据模型一览
http://freemarker.foofun.cn/dgui_quickstart_datamodel.html
2.2、
正如已经看到的,数据模型的基本结构是树状的。 这棵树可以很复杂,并且可以有很大的深度,比如:
(root)
|
+- animals
| |
| +- mouse
| | |
| | +- size = "small"
| | |
| | +- price = 50
| |
| +- elephant
| | |
| | +- size = "large"
| | |
| | +- price = 5000
| |
| +- python
| |
| +- size = "medium"
| |
| +- price = 4999
|
+- message = "It is a test"
|
+- misc
|
+- foo = "Something"
上图中的变量扮演目录的角色(比如 root, animals
, mouse
, elephant
, python
, misc
) 被称为 hashes (哈希表或哈希,译者注)。哈希表存储其他变量(被称为 子变量 ), 它们可以通过名称来查找(比如 "animals", "mouse" 或 "price")。
存储单值的变量 (size
, price
, message
和 foo
) 称为 scalars (标量,译者注)。
如果要在模板中使用子变量, 那应该从根root开始指定它的路径,每级之间用点来分隔开。要访问 mouse
的 price
,要从root开始,首先进入到 animals
,之后访问 mouse
,最后访问 price
。就可以这样来写 animals.mouse.price
。
另外一种很重要的变量是 sequences (序列,译者注)。 它们像哈希表那样存储子变量,但是子变量没有名字,它们只是列表中的项。 比如,在下面这个数据模型中, animals
和 misc.fruits
就是序列:
(root)
|
+- animals
| |
| +- (1st)
| | |
| | +- name = "mouse"
| | |
| | +- size = "small"
| | |
| | +- price = 50
| |
| +- (2nd)
| | |
| | +- name = "elephant"
| | |
| | +- size = "large"
| | |
| | +- price = 5000
| |
| +- (3rd)
| |
| +- name = "python"
| |
| +- size = "medium"
| |
| +- price = 4999
|
+- misc
|
+- fruits
|
+- (1st) = "orange"
|
+- (2nd) = "banana"
要访问序列的子变量,可以使用方括号形式的数字索引下标。 索引下标从0开始(从0开始也是程序员的传统),那么第一项的索引就是0, 第二项的索引就是1等等。要得到第一个动物的名称的话,可以这么来写代码 animals[0].name
。要得到 misc.fruits
中的第二项(字符串"banana"
)可以这么来写 misc.fruits[1]
。(实践中,通常按顺序遍历序列,而不用关心索引, 这点会在 后续介绍。)
标量类型可以分为如下的类别:
字符串:就是文本,也就是任意的字符序列,比如上面提到的 ''m'', ''o'', ''u'', ''s'', ''e''。比如 name
和 size
也是字符串。
数字:这是数值类型,就像上面的 price
。 在FreeMarker中,字符串 "50"
和数字 50
是两种完全不同的东西。前者是两个字符的序列 (这恰好是人们可以读的一个数字),而后者则是可以在数学运算中直接被使用的数值。
日期/时间: 可以是日期-时间格式(存储某一天的日期和时间), 或者是日期(只有日期,没有时间),或者是时间(只有时间,没有日期)。
布尔值:对应着对/错(是/否,开/关等值)类似的值。 比如动物可以有一个 protected
(受保护的,译者注) 的子变量, 该变量存储这个动物是否被保护起来的值。
总结:
数据模型可以被看成是树形结构。
标量用于存储单一的值。这种类型的值可以是字符串,数字,日期/时间或者是布尔值。
哈希表是一种存储变量及其相关且有唯一标识名称的容器。
序列是存储有序变量的容器。存储的变量可以通过数字索引来检索,索引通常从0开始。
Note:
还有一些其它更为高级的类型,在这里我们并没有涉及到,比如方法和指令。
3、模型一览
http://freemarker.foofun.cn/dgui_quickstart_template.html
3.2、
最简单的模板通常是普通的HTML文件(或者是其他任何文本文件; FreeMarker本身不属于HTML)。当客户端访问某个页面时, FreeMarker要发送HTML代码至客户端浏览器中去显示。如果想要页面动起来 (这里指动态网页技术,译者注),那么就要在HTML中放置能被FreeMarker所解析的特殊代码片段:
${... }
: FreeMarker将会输出真实的值来替换大括号内的表达式,这样的表达式被称为 interpolation (插值,译者注)。
FTL 标签 (FreeMarker模板的语言标签): FTL标签和HTML标签有一些相似之处,但是它们是FreeMarker的指令,是不会在输出中打印的。 这些标签的名字以 #
开头。(用户自定义的FTL标签则需要使用 @
来代替 #
,但这属于更高级的话题了。)
注释: 注释和HTML的注释也很相似, 但是它们使用 <#--
and -->
来标识。 不像HTML注释那样,FTL注释不会出现在输出中(不出现在访问者的页面中), 因为 FreeMarker会跳过它们。
其他任何不是FTL标签,插值或注释的内容将被视为静态文本, 这些东西不会被FreeMarker所解析;会被按照原样输出出来。
FTL标签也被称为 指令 。 这些指令在HTML的标签 (比如:
) 和HTML元素 (比如: table
元素) 中的关系是相同的。(如果现在还没有感觉到它们的不同, 那么把“FTL标签”和“指令”看做是同义词即可。)
Note:
可以在 http://freemarker-online.kenshoo.com/ 上很方便的尝试编写模板
这里我们仅仅来看一些非常常用的指令,当然 (指令还有很多)。
使用 if
指令可以有条件地跳过模板的一些片段。 比如,假设在 最初的示例 中, 想向你的老板Big Joe特别地问好,可其他人不同:
Welcome!
Welcome ${user}<#if user == "Big Joe"> , our beloved leader#if> !
Our latest product:
${latestProduct.name} !
此时,告诉 FreeMarker,当和 "Big Joe"
相同时 ", our beloved leader" (我们最尊敬的领导,译者注) 才是if条件中那唯一的 user
变量的值。 通常来讲,如果 condition
是false(布尔值),那么介于 <#if condition >
和 #if>
标签中的内容会被略过。
我们来详细说说 condition
的使用: ==
是用来判断它两侧的值是否相等的操作符, 比较的结果是布尔值,也就是true或者false。在 ==
的左侧,是 被引用的变量, 我们很熟悉这样的语法结构;最终它会被变量的值所替代。通常来说, 在指令或插值中没有被引号标注的内容都被视为变量的引用。右侧则是指定的字符串, 在模板中的字符串 只能 放在引号内。
当价格为0时,就会打印出 "Pythons are free today!":
<#if animals.python.price == 0 >
Pythons are free today!
#if>
和之前示例中,字符串被直接指定相似, 但这里则是数字(0
)被直接指定了。 请注意,这里的数字 没有 放在引号内。 如果将("0"
)放在引号中, 那么FreeMarker就会将其误判为字符串了(也就是字符串0,译者注)。
当价格不为0时,则会打印出"Pythons are not free today!":
<#if animals.python.price != 0>
Pythons are not free today!
#if>
你也许就会猜测了, !=
就是"不等于"。
同时,也可以这样编来写代码(使用 数据模型来描述哈希表):
<#if animals.python.price < animals.elephant.price >
Pythons are cheaper than elephants today.
#if>
使用 <#else>
标签可以指定当条件为false时程序所要执行的内容。比如:
<#if animals.python.price < animals.elephant.price>
Pythons are cheaper than elephants today.
<#else>
Pythons are not cheaper than elephants today.
#if>
这个示例中,如果蟒蛇的价格比大象的价格低的话, 程序将会打印出 "Pythons are cheaper than elephants today."。 否则会打印 "Pythons are not cheaper than elephants today."。 后面也可以使用 elseif
来完善它:
<#if animals.python.price < animals.elephant.price>
Pythons are cheaper than elephants today.
<#elseif animals.elephant.price < animals.python.price>
Elephants are cheaper than pythons today.
<#else>
Elephants and pythons cost the same today.
#if>
如果变量本身就是布尔值(true/false),则可以直接让其作为 if
的 condition
(判断条件,译者注):
<#if animals.python.protected>
Pythons are protected animals!
#if>
当需要列表显示内容时,list指令是必须的。比如: 如果合并该模板到 前面描述序列的数据模型 中:
We have these animals:
<#list animals as animal>
${animal .name} ${animal .price} Euros
#list>
那么输出结果将会是这样的:
We have these animals:
mouse 50 Euros
elephant 5000 Euros
python 4999 Euros
list
指令的一般格式为: <#list sequence as loopVariable >repeatThis #list>
。 repeatThis
部分将会在给定的 sequence
遍历时在每一项中重复, 从第一项开始,一个接着一个。在所有的重复中, loopVariable
将持有当前遍历项的值。 这个变量仅存在于 <#list ... >
和 #list>
标签内。
sequence
可以是任意表达式, 比如我们可以列表显示示例数据模型中的水果,就像这样:
<#list misc.fruits as fruit>
${fruit}
#list>
你应该很熟悉表达式 misc.fruits
了; 它 引用了数据模型中的变量。
上面示例中的一个问题是如果我们有0个水果,它仍然会输出一个空的
,而不是什么都没有。 要避免这样的情况,可以这么来使用 list
:
<#list misc.fruits>
<#items as fruit>
${fruit}
#items>
#list>
此时, list
指令将列表视为一个整体, 在 items
指令中的部分才会为每个水果重复。 如果我们有0个水果,那么在 list
中的所有东西都被略过了, 因此就不会有 ul
标签了。
另一个列表相关的常见任务是:使用一些分隔符来列出水果,比如逗号:
Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, #list>
被 sep
覆盖的部分(我们也可以这么来写: ... <#sep>, #sep>#list>
) 只有当还有下一项时才会被执行。 因此最后一个水果后面不会有逗号。
再次回到这个话题,如果我们有0个水果,会怎么样?只是打印 "Fruits:" 也没有什么不方便。 list
指令,也像 if
指令那样,可以有 else
部分,如果列表中有0个元素时就会被执行:
Fruits: <#list misc.fruits as fruit>${fruit}<#sep>, <#else>None #list>
Note:
事实上,这个过于简单的示例可以这么来写, 但是它使用了本主题中没有介绍的语言特性:
Fruits: ${fruits?join(", ", "None")}
所有的这些指令(list
, items
, sep
, else
)可以联合起来使用:
<#list misc.fruits>
Fruits:
<#items as fruit>
${fruit}<#sep> and#sep>
#items>
<#else>
We have no fruits.
#list>
Note:
在 指令参考 中, 可以获取到更多关于这些指令的内容。
使用 include
指令, 我们可以在模板中插入其他文件的内容。
假设要在一些页面中显示版权声明的信息。那么可以创建一个文件来单独包含这些版权声明, 之后在需要它的地方插入即可。比方说,我们可以将版权信息单独存放在页面文件 copyright_footer.html
中:
Copyright (c) 2000 Acmee Inc ,
All Rights Reserved.
当需要用到这个文件时,可以使用 include
指令来插入:
Test page
Test page
Blah blah...
<#include "/copyright_footer.html">
此时,输出的内容为:
Test page
Test page
Blah blah...
Copyright (c) 2000 Acmee Inc ,
All Rights Reserved.
当修改了 copyright_footer.html
文件, 那么访问者在所有页面都会看到版权声明的新内容。
Note:
重用代码片段的一个更有力的方式是使用宏,但是只是更为高级的话题了, 将会在 后续讨论。
在页面上也可以多次使用指令,而且指令间也可以很容易地相互嵌套。 比如,在 list
指令中嵌套 if
指令:
<#list animals as animal>
<#if animal.protected>class="protected"#if> >
${animal.name} for ${animal.price} Euros
#list>
请注意,FreeMarker并不解析FTL标签以外的文本、插值和注释, 上面示例在HTML属性中使用FTL标签也不会有问题。
内建函数很像子变量(如果了解Java术语的话,也可以说像方法), 它们并不是数据模型中的东西,是 FreeMarker 在数值上添加的。 为了清晰子变量是哪部分,使用 ?
(问号)代替 .
(点)来访问它们。常用内建函数的示例:
user?html
给出 user
的HTML转义版本, 比如 &
会由 &
来代替。
user?upper_case
给出 user
值的大写版本 (比如 "JOHN DOE" 来替代 "John Doe")
animal.name?cap_first
给出 animal.name
的首字母大写版本(比如 "Mouse" 来替代 "mouse")
user?length
给出 user
值中 字符 的数量(对于 "John Doe" 来说就是8)
animals?size
给出 animals
序列中 项目 的个数(我们示例数据模型中是3个)
如果在 <#list animals as animal>
和对应的 #list>
标签中:
animal?index
给出了在 animals
中基于0开始的 animal
的索引值
animal?counter
也像 index
, 但是给出的是基于1的索引值
animal?item_parity
基于当前计数的奇偶性,给出字符串 "odd" 或 "even"。在给不同行着色时非常有用,比如在 中。
一些内建函数需要参数来指定行为,比如:
animal.protected?string("Y", "N")
基于 animal.protected
的布尔值来返回字符串 "Y" 或 "N"。
animal?item_cycle('lightRow','darkRow')
是之前介绍的 item_parity
更为常用的变体形式。
fruits?join(", ")
通过连接所有项,将列表转换为字符串, 在每个项之间插入参数分隔符(比如 "orange,banana")
user?starts_with("J")
根据 user
的首字母是否是 "J" 返回布尔值true或false。
内建函数应用可以链式操作,比如user?upper_case?html
会先转换用户名到大写形式,之后再进行HTML转义。(这就像可以链式使用 .
(点)一样)
可以阅读 全部内建函数参考。
数据模型中经常会有可选的变量(也就是说有时并不存在)。 除了一些典型的人为原因导致失误外,FreeMarker 绝不能容忍引用不存在的变量, 除非明确地告诉它当变量不存在时如何处理。这里来介绍两种典型的处理方法。
这部分对程序员而言: 一个不存在的变量和一个是 null
值的变量, 对于FreeMarker来说是一样的,所以这里所指的"丢失"包含这两种情况。
不论在哪里引用变量,都可以指定一个默认值来避免变量丢失这种情况, 通过在变量名后面跟着一个 !
(叹号,译者注)和默认值。 就像下面的这个例子,当 user
不存在于数据模型时, 模板将会将 user
的值表示为字符串 "visitor"
。(当 user
存在时, 模板就会表现出 ${user}
的值):
Welcome ${user!"visitor" }!
也可以在变量名后面通过放置 ??
来询问一个变量是否存在。将它和 if
指令合并, 那么如果 user
变量不存在的话将会忽略整个问候的代码段:
<#if user?? >Welcome ${user}! #if>
关于多级访问的变量,比如 animals.python.price
, 书写代码:animals.python.price!0
当且仅当 animals.python
永远存在, 而仅仅最后一个子变量 price
可能不存在时是正确的 (这种情况下我们假设价格是 0
)。 如果 animals
或 python
不存在, 那么模板处理过程将会以"未定义的变量"错误而停止。为了防止这种情况的发生, 可以如下这样来编写代码 (animals.python.price)!0
。 这种情况就是说 animals
或 python
不存在时, 表达式的结果是 0
。对于 ??
也是同样用来的处理这种逻辑的; 将 animals.python.price??
对比(animals.python.price)??
来看。
4、
1、
http://freemarker.foofun.cn/dgui.html
2、
作者:ylbtech 出处:http://ylbtech.cnblogs.com/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
转载于:https://www.cnblogs.com/storebook/p/9550751.html
你可能感兴趣的:(FreeMarker:模板开发指南)
PythonWeb——Django框架
Error_exception_worn
Python基础 数据库 Python django
框架介绍1.什么是框架?框架就是程序的骨架,主体结构,也是个半成品。2.框架的优缺点可重用、成熟,稳健、易扩展、易维护3.Python中常见的框架大包大揽Django被官方称之为完美主义者的Web框架。力求精简web.py和Tornado新生代微框架Flask和Bottle4.Web框架中的一些概念MVC(模型-视图-控制器)和MVT(模型-视图-模板)Django框架介绍Django是一个高级的
报表DSL优化,享元模式优化过程,优化效果怎么样?
蒂法就是我
享元模式 python 前端
报表DSL优化与享元模式应用详解一、报表DSL优化1.问题背景报表系统通常使用领域特定语言(DSL)定义模板结构、数据绑定规则及样式配置。随着复杂度提升,DSL可能面临以下问题:冗余配置:重复定义样式、布局或数据源。解析效率低:嵌套层级过深或语法冗余导致解析耗时增加。维护困难:DSL文件臃肿,难以快速定位问题。2.优化策略结构扁平化:减少嵌套层级,通过引用机制复用公共配置块。#优化前(嵌套冗余)t
蓝桥杯备考:单向链表模板题
无敌大饺子 1
链表 数据结构
#includeusingnamespacestd;constintN=1e6+10;intne[N],e[N],id;intmp[N];intmain(){id++;e[id]=1;ne[id]=0;mp[e[id]]=id;intq;cin>>q;while(q--){intop,x;cin>>op>>x;intpos=mp[x];if(op==1){inty;cin>>y;id++;e[id
实现课程安排模板鸿蒙示例代码
本文原创发布在华为开发者社区。介绍本示例基于Tabs容器组件、Scroll组件、Grid组件实现了上课模块的排版、下半部分使用List组件实现了第一天、第二天的任务列表、班级群界面中使用List组件实现消息的通知。实现课程安排模板源码链接效果预览使用说明如果在运行该示例代码时,出现运行不了的情况,可尝试选择DevEcoStudio菜单栏Build里面的CleanProject选项,来清理工程。实现
Uniapp组件 Textarea 字数统计和限制
weixin_42220130
uniapp 微信小程序 uni-app textarea 输入框 统计 限制
UniappTextarea字数统计和限制在Uniapp中,可以通过监听textarea的input事件来实现字数统计功能。以下是一个简单的示例,展示如何在textarea的右下角显示输入的字符数。示例代码首先,在模板中定义一个textarea元素,并绑定input事件处理函数:{{fontNum}}/200然后,在JavaScript部分定义updateFontNum方法来更新字符数:expor
《 C++ 点滴漫谈: 三十 》高手写 C++,参数这样传才高效!你真的用对了吗?
Lenyiin
编程显微镜 c++ 函数参数 值传递 引用传递 指针传递 可变参数 完美转发
摘要C++函数参数的传递方式直接影响代码的性能与可读性。在本篇博客中,我们全面探讨了C++的各种参数传递方式,包括值传递、引用传递、指针传递等,并深入解析了**constexpr、consteval、std::forward、完美转发、auto模板推导等现代C++特性。此外,我们总结了不同场景下的最佳实践**,帮助开发者在实际编程中做出最优选择,提升代码质量与执行效率。无论是初学者还是有经验的C+
【二分算法】-- 三种二分模板总结
雨雨雨雨点子
算法 算法 java 开发语言 leetcode
文章目录1.特点2.学习中的侧重点2.1算法原理2.2模板2.2.1朴素二分模板(easy-->有局限)2.2.2查找左边界的二分模板2.2.3查找右边界的二分模板1.特点二分算法是最恶心,细节最多,最容易写出死循环的算法====但是,一旦掌握了之后,二分算法就是最简单的算法。其实并不是一定要二分,三分,四分也都可以,但是根据概率学中的求期望数学中可知,二分是效率最高的。如果是三分的话,我们就像是
【微信小程序】基本语法
小马哥编程
微信小程序 小程序
一、导入小程序选择代码目录项目配置文件appid当前小程序的AppIDprojectname当前小程序的项目名称变更AppID(视情况而定,如果没有开发权限时需要变更成个人的AppID)二、模板语法在页面中渲染数据时所用到的一系列语法叫做模板语法,对应到Vue中就是指令的概念。2.1数据绑定插值{{}}小程序中使用{{}}实现数据与模板的绑定,与Vue中不同的是无论是属性的绑定还是内容的绑定都必须
SpringBoot中的导入导出(SpringBoot导出word文档、Hutool导入excel、easypoi之easy导入数据库、导出excel文件、POI设置单元格式)
种豆走天下
spring boot java spring
SpringBoot中的导入导出java导出word文档1先准备好一个导出Word文档的模板。例如:2.打开doc文件后,文件中的另存为,然后选择保存类型为2003版本的(*.xml)3、刚生成的xml文件里面比较乱,要整理一下,方法如下:使用Eclipse/idea,新建一个jsp,把xml里面的东西覆盖更新刚才的jsp,ctrl+Shift+F/ctrl+alt+L把文件整理一下,在拷贝出来,
递推和递归(C语言)
是小万吖
算法 算法 数据结构 c语言
文章目录前言一、递推原理1.递推概念2.递推关系3.递推特点4.递推详例5.解决递推问题的步骤二、递归原理1.递归的概念2.构成递归的条件3.递归的模板4.递归详例三、递推和递归都可实现的算法1.问题描述2.问题分析3.递归实现4.递推实现四、递推和递归的优缺点1.递推的优缺点2.递归的优缺点五、递推和递归的相互转化1.递推转化为递归2.递归转化为递推前言主要探究递推和递归之间的关系提示:以下是本
使用Yarn创建Grafana模板的完整指南
云服务器linux运维yarn
在本篇文章中,我将带你逐步完成如何使用Yarn生成Grafana模板的过程。Grafana是一款开源的数据可视化工具,我们可以使用它来创建各种仪表板,以便更好地监控和展示数据。请跟随我一起来完成这一过程。整体流程概览在开始之前,我们先来看看整个操作的流程。以下是步骤的概述,以表格形式展示:步骤描述1安装Node.js和Yarn2创建新的Yarn项目3安装Grafana的API客户端库4编写Graf
ES6语法详解
八月五
前端 前端 es6
ES的全称是ECMAScript,它是由ECMA国际标准化组织,制定的一项脚本语言的标准化规范。ES6实际上是一个泛指,泛指ES2015及后续的版本。目录1.let关键字和const关键字let关键字const关键字2.解构赋值数组解构赋值对象解构赋值解构赋值用于传参3.字符串新增特性模板字符串字符串实例新增方法4.数值新增特性新增二进制和八进制表示方法Number构造函数本身新增方法和属性安全整
vue脚手架
码上跑步
vue.js 前端 javascript
Vue脚手架脚手架是官方提供的标准化开发工具。下载配置//全局安装vue的脚手架npminstall@vue/cli-g//在项目目录下开启一个脚手架vuecreate‘项目名’//进入项目目录,直接运行npmrunserve1.vue.js与vue.runtime.xxx.js的区别:(1).vue.js是完整版的Vue,包含:核心功能+模板解析器。(2).vue.runtime.xxx.js是
Dify 工作流组件完全开发指南
程序员查理
AI web前端 javascript javascript 前端 react.js
1.如何添加新的工作流节点组件1.1添加新节点的步骤要在Dify工作流中添加一个新的节点类型,需要完成以下步骤:1.1.1更新节点类型枚举首先,在app/components/workflow/types.ts文件中的BlockEnum中添加新节点类型:exportenumBlockEnum{//现有节点类型//...//添加新节点类型NewNodeType='new-node-type',}1.
【春招笔试真题】饿了么2025.03.07-开发岗真题
春秋招笔试突围
最新互联网春秋招试题合集 java 算法 网络
饿了么2025.03.07-开发岗题目1️⃣:统计01串中0和1的个数,通过计算可能的交换方式确定不同字符串数量2️⃣:使用模板匹配技术识别验证码图片中的"#"符号分布模式3️⃣:构建字典树(Trie)优化异或查询,实现高效的数字黑板游戏整体难度这套题目整体难度适中,由简到难逐步递进:第一题是基础的计数问题,需要理解交换操作的特性第二题是模式识别问题,需要实现模板匹配第三题是高级数据结构应用,需要
PyTorch实现CNN:CIFAR-10图像分类实战教程
吴师兄大模型
PyTorch pytorch cnn CIFAR-10图像分类 人工智能 python 卷积神经网络 开发语言
Langchain系列文章目录01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南02-玩转LangChainMemory模块:四种记忆类型详解及应用场景全覆盖03-全面掌握LangChain:从核心链条构建到动态任务分配的实战指南04-玩转LangChain:从文档加载到高效问答系统构建的全程实战05-玩转LangChain:深度评估问答系统的三种高效方法(示例生成、手
动态规划双剑合璧:C++与Python征服洛谷三大经典DP问题
三流搬砖艺术家
动态规划 c++ python
动态规划核心思想状态定义→转移方程→边界处理→时空优化本文精选洛谷动态规划题单中三大经典问题,通过C++与Python双语言对比实现,彻底掌握DP精髓!题目一:P1048采药(01背包模板)题目描述在限定时间T内采集草药,每株草药有采集时间time[i]和价值value[i],求最大总价值。解题思路状态定义:dp[j]表示时间j能获得的最大价值转移方程:dp[j]=max(dp[j],dp[j-t
深入解析Java记录类:简洁高效的数据建模利器
小志开发
java 开发语言
一、记录类核心概念1.1设计背景与定位记录类(Record)是Java16正式引入的标准特性,旨在简化不可变数据载体的创建。其设计目标包括:减少模板代码(Boilerplate)增强数据透明度支持模式匹配(未来特性)替代简单DTO和值对象1.2与普通类对比特性普通类记录类默认修饰符无限制隐式final继承支持继承不可继承其他类可变性可自由设计隐式不可变方法生成手动实现自动生成规范方法构造器显式定义
Apache POI详解
波波有料
apache maven java 开发语言
目录前言ApachePOI是一个强大的Java库,广泛用于处理MicrosoftOffice文档,包括Word、Excel和PowerPoint等。本文将详细介绍如何使用ApachePOI库操作Word模板(包括替换占位符、操作表格)、将Word文档转换为PDF,以及如何处理PowerPoint文档。我们将通过代码示例逐步演示这些操作。1.ApachePOI简介依赖配置2.操作Word模板中的占位
vue中为组建添加样式的方式
晨枫阳
javascript 前端
在Vue中,可以通过多种方式为view添加样式,并且支持动态绑定样式。以下是几种常见的方式:1.内联样式直接在模板中使用style属性来添加样式。这是一个内联样式的示例2.使用:style动态绑定样式可以通过:style动态绑定样式对象或数组。2.1绑定样式对象这是一个动态绑定样式对象的示例exportdefault{data(){return{styleObject:{color:'red',f
Spring Cloud Alibaba微服务架构实战教程—17分布式缓存下Redis设计
江湖一点雨
最新SpringCloud Alibaba实战开发 redis缓存设计 springcloud 微服务实战 spring cloud alibaba java开发实战
前言大多数的文章,开头就是告诉你使用redis做缓存,怎么怎么样,而本系列,不打算采用这样无趣的写法,这和直接搬运有什么区别?笔者力求读者能得到更大程度的系统学习,会从为什么使用缓存来给大家进行学习。问问大家,当系统的执行速度慢怎么办?对于更新速度不是很快的站点,可以采用静态化来避免过多的数据查询。通常前端使用Freemaker或Velocity、thymeleaf等模板引擎来实现页面的静态化。对
【实战ES】实战 Elasticsearch:快速上手与深度实践-6.2.2GDPR数据脱敏处理
言析数智
实战 elasticsearch 大数据 搜索引擎
点击关注不迷路点击关注不迷路点击关注不迷路文章大纲6.2.2GDPR数据脱敏处理深度实践指南1.GDPR核心要求映射1.1关键条款与技术要求1.2`数据类型与脱敏策略`2.全链路脱敏配置2.1`动态脱敏管道`2.2静态脱敏模板3.`脱敏算法性能对比`3.1算法性能矩阵3.2存储成本分析4.企业级合规方案4.1金融行业案例4.2医疗行业方案5.合规性验证方案5.1自动化检查脚本5.2审计检查清单6.
LangChain大模型应用开发指南-大模型Memory不止于对话
喝不喝奶茶丫
langchain 人工智能 大模型 大模型应用 AI大模型 Memory 大语言模型
上节课,我我为您介绍了LangChain中最基本的链式结构,以及基于这个链式结构演化出来的ReAct对话链模型。今天我将由简入繁,为大家拆解LangChain内置的多种记忆机制。本教程将详细介绍这些记忆组件的工作原理、特性以及使用方法。【一一AGI大模型学习所有资源获取处一一】①人工智能/大模型学习路线②AI产品经理资源合集③200本大模型PDF书籍④超详细海量大模型实战项目⑤LLM大模型系统学习
C++中map和set的详解
jiajia651304
c++ 算法 开发语言
C++中map和set的介绍与使用一、map的介绍与使用二、set的介绍与使用三、总结在C++编程中,map和set是标准模板库(STL)中两种非常重要的关联容器。它们基于平衡二叉搜索树(通常是红黑树)的数据结构来实现,提供了高效的数据存储和检索功能。本文将详细介绍map和set的特点、用法以及一些常见的操作示例。一、map的介绍与使用1.map的基本概念map是一个键值对容器,其中每个键都是唯一
实现一键不同环境迁移ES模板
两眼墨黑
elasticsearch 大数据 搜索引擎
实现概述:1、查询环境A模板信息2、获取模板信息值转换3、同步保存至环境Bpackagecom.jayce.boot.route.common.util;importcom.fasterxml.jackson.databind.JsonNode;importcom.google.common.collect.Lists;importcom.jayce.boot.route.common.util.
【带你 langchain 双排系列教程】8.LangChain开发Agent智能体:从入门到实战
夜里慢慢行456
双排人工智能 python langchain
一、什么是LangChain?LangChain是一个专为构建大模型应用设计的开发框架,其模块化设计和丰富的工具链让智能体开发更高效。相比传统开发,LangChain提供以下核心优势:内置Agent模板:快速实现工具调用、多轮对话、记忆管理。无缝对接主流大模型:支持OpenAI、ChatGLM、DeepSeek等。灵活可扩展:通过Chains组合实现复杂业务逻辑。二、快速开始:环境搭建与基础配置1
从零起步:LangChain ChatPromptTemplate基础使用
软件不硬
langchain
在上篇文章中,我们已经学习PromptTemplate。现在,我们继续学习ChatPromptTemplate。ChatPromptTemplate是LangChain框架中用于构建对话提示的强大工具。它专为多轮对话场景设计,能将不同角色的消息整合为连贯提示,助力开发者精准引导语言模型生成符合预期的回复。通过定义角色、消息内容及灵活的模板变量,ChatPromptTemplate让创建复杂对话提示
2.langchain中的prompt模板 (FewShotPromptTemplate)
ZHOU_CAMP
langchain实践 langchain prompt
本教程将介绍如何使用LangChain库中的PromptTemplate和FewShotPromptTemplate来构建和运行提示(prompt),并通过示例数据展示其应用。安装依赖首先,确保你已经安装了langchain和相关依赖:pipinstalllangchainlangchain_corelangchain_chromalangchain_community1.创建PromptTemp
django html超链接传参数,Django 模板.html中 href参数传入
真把你打了
django html超链接传参数
在Django模板中可能会出现访问多个URL指向同一函数,为减少代码可以利用正则表达式实现url(r'^remove_userinfo(?P\d+)/',views.removeuserinfo,name='reinfo'),(?P\d+)表示此部分的名称为nid,对应removeuserinfo(request,nid)中的nid参数defremoveuserinfo(request,nid):
PHP的模板引擎一共包含哪些部分?使用场景是什么?底层原理是什么?
快点好好学习吧
PHP php java 开发语言
一、PHP模板引擎的组成部分1.核心定义模板引擎:模板引擎是一种工具,用于将动态数据嵌入到静态HTML模板中,生成最终的HTML输出。主要组件:模板文件:包含HTML和占位符(如{{variable}})的文件。解析器:将模板文件中的占位符替换为实际数据。渲染器:将解析后的模板内容输出为最终的HTML。缓存机制:缓存编译后的模板以提高性能。二、使用场景1.常见使用场景Web开发:动态生成网页内容(
ASM系列六 利用TreeApi 添加和移除类成员
lijingyao8206
jvm 动态代理 ASM 字节码技术 TreeAPI
同生成的做法一样,添加和移除类成员只要去修改fields和methods中的元素即可。这里我们拿一个简单的类做例子,下面这个Task类,我们来移除isNeedRemove方法,并且添加一个int 类型的addedField属性。
package asm.core;
/**
* Created by yunshen.ljy on 2015/6/
Springmvc-权限设计
bee1314
spring Web jsp
万丈高楼平地起。
权限管理对于管理系统而言已经是标配中的标配了吧,对于我等俗人更是不能免俗。同时就目前的项目状况而言,我们还不需要那么高大上的开源的解决方案,如Spring Security,Shiro。小伙伴一致决定我们还是从基本的功能迭代起来吧。
目标:
1.实现权限的管理(CRUD)
2.实现部门管理 (CRUD)
3.实现人员的管理 (CRUD)
4.实现部门和权限
算法竞赛入门经典(第二版)第2章习题
CrazyMizzz
c 算法
2.4.1 输出技巧
#include <stdio.h>
int
main()
{
int i, n;
scanf("%d", &n);
for (i = 1; i <= n; i++)
printf("%d\n", i);
return 0;
}
习题2-2 水仙花数(daffodil
struts2中jsp自动跳转到Action
麦田的设计者
jsp webxml struts2 自动跳转
1、在struts2的开发中,经常需要用户点击网页后就直接跳转到一个Action,执行Action里面的方法,利用mvc分层思想执行相应操作在界面上得到动态数据。毕竟用户不可能在地址栏里输入一个Action(不是专业人士)
2、<jsp:forward page="xxx.action" /> ,这个标签可以实现跳转,page的路径是相对地址,不同与jsp和j
php 操作webservice实例
IT独行者
PHP webservice
首先大家要简单了解了何谓webservice,接下来就做两个非常简单的例子,webservice还是逃不开server端与client端。我测试的环境为:apache2.2.11 php5.2.10做这个测试之前,要确认你的php配置文件中已经将soap扩展打开,即extension=php_soap.dll;
OK 现在我们来体验webservice
//server端 serve
Windows下使用Vagrant安装linux系统
_wy_
windows vagrant
准备工作:
下载安装 VirtualBox :https://www.virtualbox.org/
下载安装 Vagrant :http://www.vagrantup.com/
下载需要使用的 box :
官方提供的范例:http://files.vagrantup.com/precise32.box
还可以在 http://www.vagrantbox.es/
更改linux的文件拥有者及用户组(chown和chgrp)
无量
c linux chgrp chown
本文(转)
http://blog.163.com/yanenshun@126/blog/static/128388169201203011157308/
http://ydlmlh.iteye.com/blog/1435157
一、基本使用:
使用chown命令可以修改文件或目录所属的用户:
命令
linux下抓包工具
矮蛋蛋
linux
原文地址:
http://blog.chinaunix.net/uid-23670869-id-2610683.html
tcpdump -nn -vv -X udp port 8888
上面命令是抓取udp包、端口为8888
netstat -tln 命令是用来查看linux的端口使用情况
13 . 列出所有的网络连接
lsof -i
14. 列出所有tcp 网络连接信息
l
我觉得mybatis是垃圾!:“每一个用mybatis的男纸,你伤不起”
alafqq
mybatis
最近看了
每一个用mybatis的男纸,你伤不起
原文地址 :http://www.iteye.com/topic/1073938
发表一下个人看法。欢迎大神拍砖;
个人一直使用的是Ibatis框架,公司对其进行过小小的改良;
最近换了公司,要使用新的框架。听说mybatis不错;就对其进行了部分的研究;
发现多了一个mapper层;个人感觉就是个dao;
解决java数据交换之谜
百合不是茶
数据交换
交换两个数字的方法有以下三种 ,其中第一种最常用
/*
输出最小的一个数
*/
public class jiaohuan1 {
public static void main(String[] args) {
int a =4;
int b = 3;
if(a<b){
// 第一种交换方式
int tmep =
渐变显示
bijian1013
JavaScript
<style type="text/css">
#wxf {
FILTER: progid:DXImageTransform.Microsoft.Gradient(GradientType=0, StartColorStr=#ffffff, EndColorStr=#97FF98);
height: 25px;
}
</style>
探索JUnit4扩展:断言语法assertThat
bijian1013
java 单元测试 assertThat
一.概述
JUnit 设计的目的就是有效地抓住编程人员写代码的意图,然后快速检查他们的代码是否与他们的意图相匹配。 JUnit 发展至今,版本不停的翻新,但是所有版本都一致致力于解决一个问题,那就是如何发现编程人员的代码意图,并且如何使得编程人员更加容易地表达他们的代码意图。JUnit 4.4 也是为了如何能够
【Gson三】Gson解析{"data":{"IM":["MSN","QQ","Gtalk"]}}
bit1129
gson
如何把如下简单的JSON字符串反序列化为Java的POJO对象?
{"data":{"IM":["MSN","QQ","Gtalk"]}}
下面的POJO类Model无法完成正确的解析:
import com.google.gson.Gson;
【Kafka九】Kafka High Level API vs. Low Level API
bit1129
kafka
1. Kafka提供了两种Consumer API
High Level Consumer API
Low Level Consumer API(Kafka诡异的称之为Simple Consumer API,实际上非常复杂)
在选用哪种Consumer API时,首先要弄清楚这两种API的工作原理,能做什么不能做什么,能做的话怎么做的以及用的时候,有哪些可能的问题
在nginx中集成lua脚本:添加自定义Http头,封IP等
ronin47
nginx lua
Lua是一个可以嵌入到Nginx配置文件中的动态脚本语言,从而可以在Nginx请求处理的任何阶段执行各种Lua代码。刚开始我们只是用Lua 把请求路由到后端服务器,但是它对我们架构的作用超出了我们的预期。下面就讲讲我们所做的工作。 强制搜索引擎只索引mixlr.com
Google把子域名当作完全独立的网站,我们不希望爬虫抓取子域名的页面,降低我们的Page rank。
location /{
java-归并排序
bylijinnan
java
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] a={20,1,3,8,5,9,4,25};
mergeSort(a,0,a.length-1);
System.out.println(Arrays.to
Netty源码学习-CompositeChannelBuffer
bylijinnan
java netty
CompositeChannelBuffer体现了Netty的“Transparent Zero Copy”
查看API(
http://docs.jboss.org/netty/3.2/api/org/jboss/netty/buffer/package-summary.html#package_description)
可以看到,所谓“Transparent Zero Copy”是通
Android中给Activity添加返回键
hotsunshine
Activity
// this need android:minSdkVersion="11"
getActionBar().setDisplayHomeAsUpEnabled(true);
@Override
public boolean onOptionsItemSelected(MenuItem item) {
静态页面传参
ctrain
静态
$(document).ready(function () {
var request = {
QueryString :
function (val) {
var uri = window.location.search;
var re = new RegExp("" + val + "=([^&?]*)", &
Windows中查找某个目录下的所有文件中包含某个字符串的命令
daizj
windows 查找某个目录下的所有文件 包含某个字符串
findstr可以完成这个工作。
[html]
view plain
copy
>findstr /s /i "string" *.*
上面的命令表示,当前目录以及当前目录的所有子目录下的所有文件中查找"string&qu
改善程序代码质量的一些技巧
dcj3sjt126com
编程 PHP 重构
有很多理由都能说明为什么我们应该写出清晰、可读性好的程序。最重要的一点,程序你只写一次,但以后会无数次的阅读。当你第二天回头来看你的代码 时,你就要开始阅读它了。当你把代码拿给其他人看时,他必须阅读你的代码。因此,在编写时多花一点时间,你会在阅读它时节省大量的时间。让我们看一些基本的编程技巧: 尽量保持方法简短 尽管很多人都遵
SharedPreferences对数据的存储
dcj3sjt126com
SharedPreferences简介: &nbs
linux复习笔记之bash shell (2) bash基础
eksliang
bash bash shell
转载请出自出处:
http://eksliang.iteye.com/blog/2104329
1.影响显示结果的语系变量(locale)
1.1locale这个命令就是查看当前系统支持多少种语系,命令使用如下:
[root@localhost shell]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
Android零碎知识总结
gqdy365
android
1、CopyOnWriteArrayList add(E) 和remove(int index)都是对新的数组进行修改和新增。所以在多线程操作时不会出现java.util.ConcurrentModificationException错误。
所以最后得出结论:CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。发生修改时候做copy,新老版本分离,保证读的高
HoverTree.Model.ArticleSelect类的作用
hvt
Web .net C# hovertree asp.net
ArticleSelect类在命名空间HoverTree.Model中可以认为是文章查询条件类,用于存放查询文章时的条件,例如HvtId就是文章的id。HvtIsShow就是文章的显示属性,当为-1是,该条件不产生作用,当为0时,查询不公开显示的文章,当为1时查询公开显示的文章。HvtIsHome则为是否在首页显示。HoverTree系统源码完全开放,开发环境为Visual Studio 2013
PHP 判断是否使用代理 PHP Proxy Detector
天梯梦
proxy
1. php 类
I found this class looking for something else actually but I remembered I needed some while ago something similar and I never found one. I'm sure it will help a lot of developers who try to
apache的math库中的回归——regression(翻译)
lvdccyb
Math apache
这个Math库,虽然不向weka那样专业的ML库,但是用户友好,易用。
多元线性回归,协方差和相关性(皮尔逊和斯皮尔曼),分布测试(假设检验,t,卡方,G),统计。
数学库中还包含,Cholesky,LU,SVD,QR,特征根分解,真不错。
基本覆盖了:线代,统计,矩阵,
最优化理论
曲线拟合
常微分方程
遗传算法(GA),
还有3维的运算。。。
基础数据结构和算法十三:Undirected Graphs (2)
sunwinner
Algorithm
Design pattern for graph processing.
Since we consider a large number of graph-processing algorithms, our initial design goal is to decouple our implementations from the graph representation
云计算平台最重要的五项技术
sumapp
云计算 云平台 智城云
云计算平台最重要的五项技术
1、云服务器
云服务器提供简单高效,处理能力可弹性伸缩的计算服务,支持国内领先的云计算技术和大规模分布存储技术,使您的系统更稳定、数据更安全、传输更快速、部署更灵活。
特性
机型丰富
通过高性能服务器虚拟化为云服务器,提供丰富配置类型虚拟机,极大简化数据存储、数据库搭建、web服务器搭建等工作;
仅需要几分钟,根据CP
《京东技术解密》有奖试读获奖名单公布
ITeye管理员
活动
ITeye携手博文视点举办的12月技术图书有奖试读活动已圆满结束,非常感谢广大用户对本次活动的关注与参与。
12月试读活动回顾:
http://webmaster.iteye.com/blog/2164754
本次技术图书试读活动获奖名单及相应作品如下:
一等奖(两名)
Microhardest:http://microhardest.ite