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:模板开发指南)
【Coze搞钱实战】3. 避坑指南:对话流设计中的6个致命错误(真实案例)
AI_DL_CODE
Coze平台 对话流设计 客服Bot避坑 用户流失 封号风险 智能客服配置 故障修复指南
摘要:对话流设计是智能客服Bot能否落地的核心环节,直接影响用户体验与业务安全。本文基于50+企业Bot部署故障分析,聚焦导致用户流失、投诉甚至封号的6大致命错误:无限循环追问、人工移交超时、敏感词过滤缺失、知识库冲突、未处理否定意图、跨平台适配失败。通过真实案例拆解每个错误的表现形式、技术根因及工业级解决方案,提供可直接复用的Coze配置代码、工作流模板和检测工具。文中包含对话流健康度检测工具使
C#中的设计模式:构建更加优雅的代码
Envyᥫᩣᩚ
c# 开发语言
C#在面向对象编程(OOP)方面的强大支持,我们可以探讨“C#中的设计模式”。这不仅有助于理解如何更好地组织代码,还能提高代码的可维护性和可扩展性。引言设计模式是软件工程中经过实践验证的解决方案模板,它们提供了一种标准化的方法来解决常见的开发问题。对于使用C#进行开发的程序员来说,理解和应用这些模式可以帮助创建结构良好、易于维护和扩展的应用程序。本文将介绍几种常用的设计模式,并展示如何用C#实现它
领略商业之美
苏黛_love
从明天起,我要做一个会育儿、懂商业的妈妈。学习商业大课之《认知商业》《觉性智慧》的收获:1、商业是帮助我们赚钱的必备技能,从此不再排斥商业,对财富说是。2、老王说,普通人的商业思维就是:你能用已经验证的商业规则来帮助自己赚钱。我的理解:有模板,永就好了。3、有的人喜欢钱,不喜欢赚钱··········哈哈哈——现在,我认为这是对没有挣钱的能力和怕辛苦的掩饰罢了。4、商业大课上要转变的一个思维:挣钱
Python STL概念学习与代码实践
体制教科书
本文还有配套的精品资源,点击获取简介:通过”py_stl_learning”项目,学习者可以使用Python实现和理解C++STL的概念,包括数据结构、算法、容器适配器、模板和泛型容器等。Python中的列表、集合、字典等数据结构与STL中的vector、set、map等类似,而Python的itertools和functools模块提供了STL风格的算法功能。Python通过其面向对象的特性以及
构建基于Android Studio开发天气预报应用
策划加强小乔
Android studio android
AndroidStudio开发天气预报应用需要完成API调用、UI设计、数据解析等步骤。以下是基于OpenWeatherMapAPI的实现方法,包含关键代码片段和详细说明。环境准备与项目创建确保已安装AndroidStudio最新版本,创建新项目选择EmptyActivity模板。在build.gradle模块文件中添加必要依赖:dependencies{implementation'com.sq
零基础学习性能测试第六章:性能难点-Jmeter实现海量用户压测
目录一、海量压测核心挑战与解决思路二、分布式压测集群搭建(百倍性能提升)1.架构设计2.实战步骤三、百万级用户参数化方案1.Redis预生成测试数据2.JMeter分段读取(避免内存溢出)3.CSV分片策略四、高并发优化配置模板1.`jmeter.properties`关键修改2.线程组配置技巧五、结果收集与监控方案1.轻量级结果存储2.实时监控看板六、海量压测实战案例:双11级流量模拟测试目标:
halcon知识:常见三种模板匹配方法总结
无水先生
Halcon高级应用 Halcon中级实践 计算机视觉 图像处理
目录一、形状匹配模板(Shape_Based)1.1形状匹配常见的有四种情况1.2四种匹配的特点1.3一般形状匹配模板shape_model1.4线性变形匹配模板planar_deformable_model1.5局部变形模板1.6比例缩放末班匹配二、灰度匹配模板(Gray-Value-Based)2.1创建模板方法如下2.2匹配搜索操作2.3模板调整操作三、组合模板匹配(Component-Ba
datax数据抽取csv到mysql
datax数据抽取执行pythondatax.py-rstreamreader-wstreamwriter命令得到job的json模板
Mxin5
不为五斗米折腰 设计模式 java
目录什么是设计模式?设计模式有哪些分类?常用设计模式工厂模式(简单工厂模式)工厂方法模式抽象工厂模式模板模式(支付宝微信)代理模式【终于搞懂了】Spring中使用的是那种代理模式?适配器模式观察者模式策略模式单例模式饿汉式(饥渴型)单例模式懒汉式(懒狗)单例模式什么是设计模式?官方解释:设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。人话:设计模式就是软件开发人员针对
9、深入理解模板方法模式(Template Method Pattern)
pear55
Java设计模式深度解析与实战 模板方法模式 Template Method Pattern 行为设计模式
深入理解模板方法模式(TemplateMethodPattern)1模板方法模式概述模板方法模式(TemplateMethodPattern)是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。这种模式在面向对象编程中非常常见,特别是在需要扩展框架功能或定制某些特定行为时。1.1模板方法的工作原理模
模版方法模式(Template Method Pattern
快乐的划水a
设计模式 设计模式 c++
模板方法模式是一种行为设计模式,它定义一个操作中的算法骨架,将一些步骤延迟到子类中实现。核心思想是"封装不变部分,扩展可变部分",即父类确定流程框架,子类根据需求重写特定步骤,而不改变整体流程结构。介绍核心角色抽象类(AbstractClass):定义算法骨架(模板方法),包含多个抽象方法(子类需实现)和可选的钩子方法(HookMethod,子类可选择性重写)。具体子类(ConcreteClass
响应式电子邮件设计指南:MJML实践教程
本文还有配套的精品资源,点击获取简介:响应式设计在电子邮件领域至关重要,确保邮件内容在各种设备上均能良好显示。MJML(MailjetMarkupLanguage)是一个专门用于创建响应式电子邮件模板的开源标记语言。本示例详细介绍了如何使用MJML来设计自适应的邮件模板,涵盖安装工具、使用预定义组件、编译HTML代码等关键步骤。通过实际操作MJML的预定义组件如mj-head、mj-body、mj
AE音乐可视化模板:制作快速音乐视频
本文还有配套的精品资源,点击获取简介:AE音乐可视化模板旨在将音乐数据转化为视觉效果,包含预设动画和布局设计,使用户能够轻松制作节奏同步的音乐视频。关键编辑区包括音乐编辑、歌名、歌手、背景图片和专辑图片编辑区,以及用于总成预览的区域。这类模板通常适用于新手用户,通过简洁的编辑流程,用户可以利用丰富的视觉元素和动画效果快速创作。包含的项目文件、预设动画、图像和音频素材,以及使用指南,帮助用户顺利完成
设计模式(二十三)行为型:模板方法模式详解
蝸牛酱
系统架构设计师 设计模式 设计模式 模板方法模式 软考高级 系统架构
设计模式(二十三)行为型:模板方法模式详解模板方法模式(TemplateMethodPattern)是GoF23种设计模式中的行为型模式之一,其核心价值在于定义一个操作中的算法骨架,而将一些步骤延迟到子类中实现,使得子类可以在不改变算法结构的前提下重新定义算法的某些特定步骤。它通过“父类控制流程,子类实现细节”的方式,实现了代码复用与行为扩展的完美平衡。模板方法模式是构建框架、标准化流程、实现钩子
Java Web开发核心技术解析与实践指南
2301_81709812
java 前端 开发语言
目录一、JavaWeb开发基础1.1核心概念解析1.2开发环境搭建二、Servlet与JSP核心技术2.1Servlet编程深度解析生命周期管理(关键代码示例):核心对象关系:2.2JSP进阶开发技巧动态页面模板示例:三、Spring框架整合开发3.1SpringMVC核心原理3.2现代开发方案对比四、项目实战:图书管理系统4.1系统架构设计4.2性能优化策略五、学习路线建议一、JavaWeb开发
Python Flask Web教程023:蓝图
若北辰
flask python 前端
之前我们写的url和视图函数都是处在同一个文件,如果项目比较大的话,这显然不是一个合理的结构,而蓝图可以优雅的帮我们实现这种需求。以下看一个使用蓝图的文件的例子:本节基于PythonFlaskWeb教程016:模板继承目录结构apps.about.pyfromflaskimportBlueprint,render_templatebp=Blueprint('about',__name__
!LangChain代理决策架构与源码深度剖析(75)
LangChain代理决策架构与源码深度剖析一、LangChain代理决策架构概述1.1代理决策架构的核心组件LangChain代理的决策架构是其智能交互的核心,主要由大语言模型(LLM)、工具集(Tools)、提示模板(PromptTemplate)、规划器(Planner)、执行器(Executor)和反馈机制六大组件构成。这些组件通过协同工作,实现从用户输入解析到最终结果输出的完整决策流程。
LIMO:仅需817样本激活大模型数学推理能力,挑战“数据规模至上”传统范式
大千AI助手
人工智能 # OTHER # Prompt 人工智能 机器学习 神经网络 算法 大模型 LIMO LessIsMore
“以认知模板唤醒沉睡知识,让推理能力在精不在多”LIMO是由上海交通大学、SII(ShanghaiArtificialIntelligenceLaboratory)、GAIRLab联合提出的突破性研究(2025年2月发表),其核心颠覆了传统AI领域“复杂推理需海量训练数据”的认知,证明仅用817个高质量样本即可激发大语言模型(LLMs)的数学推理能力,在AIME、MATH等竞赛级任务中超越使用10
C++模板进阶和模板链接错误的解决
不想磕代码
c++
小编在学习模板进阶之后,觉得模板的内容很有用,所以今天带给大家的内容是模板进阶的所有内容,内容包括模板的使用,模板的特化,模板的全特化,模板的偏特化,模板链接时候会出现的链接错误及解决方法,还有模板的优缺点。好啦,该学习啦!~~~一、模板的特化1、函数模板的特化在开始之前大家先看一段代码://这两段代码作用相似只有类型不同那这样写就会很麻烦很浪费时间intAdd(intx,inty){return
Python面向对象编程入门:从类与对象到方法与属性
吴师兄大模型
python 人工智能 面向对象编程 开发语言 类 对象 PYTHON
Langchain系列文章目录01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南02-玩转LangChainMemory模块:四种记忆类型详解及应用场景全覆盖03-全面掌握LangChain:从核心链条构建到动态任务分配的实战指南04-玩转LangChain:从文档加载到高效问答系统构建的全程实战05-玩转LangChain:深度评估问答系统的三种高效方法(示例生成、手
策略模式(Strategy Pattern)+ 模板方法模式(Template Method Pattern)的组合使用
usingMicrosoft.Extensions.DependencyInjection;namespaceConsoleApp9{internalclassProgram{staticasyncTaskMain(string[]args){Console.WriteLine("Hello,World!");//创建并配置依赖注入容器var_serviceProvider=newServiceC
中文思维导图 Xmind 2025(Mac)
2501_92809465
xmind macos mac
原文地址:Xmind2025中文思维导图Xmind一款出色的思维导图和头脑风暴,拥有美观的智能配色方案,便于你轻松理清思路捕捉创意。丰富的导图模板及多种创意整合工具,可助力导图迸发更多活力。还拥有强大演说模式,及提供Markdown、SVG、PNG、PDF、Office等多种导出格式,方便使用思维导图做宣讲与材料分享。
2019-01-15
小云_6552
反省模板事件:午睡才十分钟就被吵醒情绪:烦躁,生气念头认为:我婆婆弄得,实际上是公公弄得应对模式:装死,冻结期待和欲望:被尊重,被关爱,安全感核心信念:无存在感体征:左胸痛、火冒三丈
提示工程监控不到位:5个未做日志记录导致的排查困难
提示工程监控不到位:5个未做日志记录导致的排查困难关键词:提示工程,日志记录,LLM应用调试,AI监控,排查困难,提示模板,上下文追踪摘要:在大语言模型(LLM)应用爆发的时代,提示工程已成为连接人类需求与AI能力的核心桥梁。但多数开发者聚焦于"如何写好提示",却忽视了"如何记录提示"——日志记录作为提示工程的"黑匣子",直接决定了AI应用故障排查的效率与准确性。本文通过5个真实场景案例,深入浅出
2019-06-18 晨间日记
优雅的老太太36
一、今天是什么日子2019.06.18周二起床:6:20天气:雨心情:平静纪念日:二、任务清单(一)周目标·完成进度有序推进(二)前日完成情况完成(三)今日任务:任务(三)改进反思三、总结(前日)(一)本月积累1、工作之间要有休息时间。(二)模板1、项目论证:1需改模板、2撰写指南、3撰写通知、4发通知、5收材料、6统计申报预算、7核定预算、8确定会议时间、9请专家、10定会议室、11发会议通知、
揭秘前端 CSS3 字体特效的实现方法
#揭秘前端CSS3字体特效的实现方法>关键词:CSS3、字体特效、text-shadow、@font-face、font-feature-settings、动画效果、Web字体>摘要:本文通过生活化的比喻和实战案例,深入解析CSS3实现字体特效的核心技术。从基础文字阴影到高级字体动画,揭秘7种酷炫效果实现原理,并提供可直接复用的代码模板。##背景介绍###目的和范围本文系统讲解CSS3实现字体特效
如何为微信小程序添加人脸识别和身份验证功能
棂梓知识
微信小程序 小程序
为微信小程序添加人脸识别和身份验证功能,需要使用微信开放平台提供的人脸识别接口和身份验证接口。下面将详细介绍如何使用这两个接口,并提供相关代码案例。一、人脸识别功能人脸识别是通过比对用户上传的人脸图片与预存的人脸模板进行比对,判断是否为同一个人。为了实现人脸识别功能,我们需要先创建一个人脸模板,并上传用户的人脸图片进行比对。注册微信开放平台首先,我们需要注册一个微信开放平台的账号,并创建一个小程序
C++编译期优化:性能提升终极指南
止观止
C++ c++ 开发语言 编译期 运行时
引言在现代C++开发中,性能优化是一个永恒的话题。而将运行时成本转移至编译期(Compile-time)的技术,正成为高性能C++开发者的必备技能。本文将深入探讨如何利用模板元编程(TemplateMetaprogramming)和constexpr特性,将传统运行时计算转移到编译期完成,从而显著提升程序运行效率。通过本文,您将学习到:模板元编程的基本原理与高级技巧constexpr在编译期计算中
IntelliJ IDEA 高效开发指南:从基础操作到高级技巧
zqmgx13291
intellij-idea java ide
一、IDEA概述与环境配置1.1IDEA的核心优势智能代码辅助:基于上下文的代码补全(Ctrl+Space)、方法参数提示、错误实时检测全栈开发支持:内置Java/Python/JavaScript等20+语言支持,框架集成(SpringBoot/Vue/React)工具链集成:版本控制(Git/SVN)、数据库(MySQL/PostgreSQL)、容器(Docker/K8s)一站式开发性能优化:
企业IT管理——IT系统灾难恢复计划及实施步骤参考模板
智慧化智能化数字化方案
数据库 网络 运维 IT系统灾难恢复计划 IT管理制度 企业IT管理 灾难恢复计划
第1章灾难恢复计划概述1.1灾难恢复计划的重要性1.2灾难恢复计划的制定目标1.3灾难恢复计划的适用范围第2章灾难类型与风险评估2.1常见灾难类型2.1.1自然灾害
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