这个的自定义标签示例实现......
如果这是您第一次使用自定义标签,最简单的方法是将其放在与调用它的页面相同的文件夹中。有几个选项可以将它放在不同的目录中,但让我们从简单的开始。
电子邮件会员.cfm
<cfquery name="GetUIDs">
select userid from users
</cfquery>
<cfoutput query="GetUIDs">
<cf_maileach uid="#userID#">
</cfoutput>
注意到我是如何调用我的标签 cf_maileach 的吗?
在同一个目录下,放置maileach.cfm,看看名字是怎么匹配的?
maileach.cfm
<cfif StructKeyExists(attributes,"uid") and val(attributes.uid) gt 0>
<cfquery name="getinfo">
select fname,lname,email
from users
where userID = <cfqueryparam cfsqltype="cf_sql_integer" value="#attributes.uid#">
</cfquery>
<cfmail to="#getinfo.email#" subject="Hi #getinfo.fname#">...</cfmail>
</cfif>
笔记
- 根据您的 cf 版本以及是否使用 application.cfc,有多种方法可以将自定义标记放置在外部目录中。还有
<cfmodule>
- 这只是一个示例,这个基本的东西是多余的,我只是想模仿提问者概述的内容。在这个示例中,我调用了一个可以获取所有数据的查询,只是为了使用它来逐行查询。
- 如果您不熟悉
<cfqueryparam>
,请查找、使用、爱上它。
编辑:虽然 CFHTTP 方法可以达到此目的,但它会遇到一些问题
- 会话不会自动传递(即使请求服务器和目标服务器相同)。
- 该页面的访问方式类似于浏览器请求。Application/OnRequestEnd 被处理(并且由于会话信息也被传递,这可能会导致尝试访问安全区域中的文件时出现问题。
- 由于上述原因,该页面需要位于具有自己的应用程序文件的文件夹中,以否定目录层次结构中其上方的任何应用程序文件。
- 为了对抗 1、2 和 3,您需要在安全层中编写代码,类似于您的应用程序自身的安全性,以便在找到 url 时文件不会受到攻击。
- 通过 cfhttp 对文件的每次调用都需要调用一些额外的安全检查。
- 它明显变慢。在一个使用零内容 application.cfc 的非常简单的测试中,自定义标记方法的执行时间实际上是 <= 1/100。随着实际功能添加到方法中,结果的差异会发生变化。
这是一些示例代码,您可以自己进行测试。
“安全”文件夹的内容:
应用程序.cfc
[ blank file, to negate my testing site's actual application.cfc ]
测试运行.cfm
<cfoutput><cfset starttick = GetTickCount()>
<cfloop from="1" to="20" index="i">
<cfhttp url="http://mysamesite.com/safe/http.cfm?u=#i#" method="get" result="test">
#test.filecontent#<br>
</cfloop>
CFHTTP Execution Time: #(GetTickCount() - starttick)#<br><br>
<cfset starttick = GetTickCount()>
<cfloop from="1" to="20" index="i">
<cf_testtag u="#i#"><br>
</cfloop>
CustomTag Execution Time: #(GetTickCount() - starttick)#<br><br>
</cfoutput>
测试标签.cfm
<cfoutput>The ID entered was #attributes.u#</cfoutput>
http.cfm
<cfoutput>The ID entered was #url.u#</cfoutput>
结果(以毫秒为单位) 每个测试在 HTTP 上通过 20 次,在自定义标签上通过 20 次。
CFHTTP Tag
661ms 6ms
1624 5
616 5
460 4
522 6
816 4