一直在查看我的前任代码并经常查看“请求”范围的用法。 该范围的适当用法是什么?

===============>>#1 票数:20 已采纳

代码的任何部分都有几个范围:会话,客户端,Cookie,应用程序和请求。 有些不建议以某种方式使用(即在自定义标签或CFC中使用请求或应用程序范围;这是耦合 ,违反封装原则,并且被认为是一种不好的做法),有些具有特殊用途:Cookie保留在客户端上机器作为物理cookie,会话作用域变量是特定于用户的,并在网站上与用户的会话一起到期。

如果一个变量极不可能改变(所有意图和目的都是常量)并且可以简单地在应用程序启动时初始化并且永远不会再次写入,通常应该将它放入应用程序范围,因为这会在每个用户和每个会话之间持续存在。 正确实现后,它会被写入一次并读取N次。

Application.cfm中Application变量的正确实现可能如下所示:

<cfif not structKeyExists(application, "dsn")>
    <cflock scope="application" type="exclusive" timeout="30">
        <cfif not structKeyExists(application, "dsn")>
            <cfset application.dsn = "MyDSN" />
            <cfset foo = "bar" />
            <cfset x = 5 />
        </cfif>
    </cflock>
</cfif>

请注意,在锁定之前和之后检查应用程序范围中是否存在变量,这样,如果两个用户在应用程序启动时创建竞争条件,则只有其中一个最终会设置应用程序变量。

这种方法的好处是它不会在每个请求上不断刷新这些存储的变量,浪费用户的时间和服务器的处理周期。 权衡是它有点冗长和复杂。

通过添加Application.cfc大大简化了这一过程。 现在,您可以指定在应用程序启动时创建哪些变量,而不必担心锁定和检查存在以及所有有趣的东西:

<cfcomponent>
    <cfset this.name = "myApplicationName" />

    <cffunction name="onApplicationStart" returnType="boolean" output="false">
        <cfset application.dsn = "MyDSN" />
        <cfset foo = "bar" />
        <cfset x = 5 />
        <cfreturn true />
    </cffunction>
</cfcomponent>

有关Application.cfc的更多信息,包括所有可用的特殊功能以及有关使用它的内容和使用方法的每一个细节, 我建议在Raymond Camden的博客上发布这篇文章

总而言之,请求范围在您的代码中随处可用,但这并不一定使得在任何地方使用它都“正确”。 您的前任可能正在使用它来破坏封装,这可能很难重构。 您可能最好离开它,但了解哪个范围是最好的工具,肯定会使您的未来代码更好。

===============>>#2 票数:15

这是一个非常主观的问题,有些人甚至认为在现代ColdFusion应用程序中使用请求范围永远不合适。

有了这个免责声明,让我们定义请求范围是什么以及它在哪里有用。

请求范围是单个ColdFusion页面请求中的绝对全局范围。 它不是共享范围,如应用程序,服务器,客户端和会话范围,因此不需要锁定以使其成为线程安全(除非您使用CF8的CFTHREAD标记从单个请求生成工作线程)。 作为一个全局范围,它是一种非常方便的方法,可以将变量保存在请求堆栈中的任何级别,而无需将它们从父级传递给调用者。 这是通过旧CF应用程序中的嵌套或递归自定义标记来持久保存变量的一种非常常见的方法。

请注意,虽然许多应用程序使用此作用域来存储应用程序级变量(例如,配置设置),但请求作用域和应用程序作用域之间的差异(有时是微妙的)是同一个请求作用域变量的值可以个别页面请求之间有所不同

我猜你的前任使用这个作用域来方便地设置变量,这些变量需要在封装或嵌套代码单元之间的跳转中存活,而不必明确地传递它们。

===============>>#3 票数:0

好的,我只是想对你的代码发表评论。 如果我看起来很疯狂,请原谅我。 但是你已经在开始时验证了structKeyExists。 既然你知道它会是真的,那么再运行一次检查是没有意义的。 所以我的版本就是这个...但那就是我。


<cfif not structKeyExists(application, "dsn")>
    <cflock scope="application" type="exclusive" timeout="30">
            <cfset application.dsn = "MyDSN" />
            <cfset foo = "bar" />
            <cfset x = 5 />
    </cflock>
</cfif>

好的。

===============>>#4 票数:0

我一直在编写我公司的框架,用于为我们的网站提供支持。

我使用请求变量来设置可供其他CFC使用的某些数据我必须这样做,这样数据就可以在整个应用程序中使用,而无需不断传递数据。 我老实说相信使用请求和应用程序,只要它是一个静态函数组件,那么你应该没有问题。 我不确定我的想法是否错了,但是一旦我发布了框架,我们就会看到。

  ask by translate from so

未解决问题?本站智能推荐:

1回复

使用应用程序范围的UDF扩展ColdFusion

我一直在探索构建我的ColdFusion应用程序的不同方法,并且我正在寻找关于提供应用程序范围UDF的最佳方法的一些意见。 对于我的每个应用程序,我通常使用一些并不真正属于任何特定对象的额外函数。 主要是数据操作。 我希望这些功能在我的应用程序中可用,既可用于CFM模板,也可用于应用程
6回复

我什么时候应该在ColdFusion中使用#?

这是教授新人ColdFusion的最大障碍之一。 何时使用#最多是模棱两可的。 由于使用它们通常不会产生问题,似乎大多数人都倾向于使用它们太多。 那么,基本规则是什么?
1回复

关于REST和ColdFusion [重复]

这个问题已经在这里有了答案: CF10中REST的优势与通过Ajax调用远程方法的优势? 1个答案 我在向自己描述用于客户端/服务器交互的方法时遇到了麻烦。 进行AJAX调用时,我使用?name=value&name=value查询字符串方法。 然
10回复

ColdFusion安全[关闭]

从恶意用户那里获取coldfusion网页的最佳做法是什么? (包括但不限于sql注入攻击) cfqueryparam足够吗?
1回复

在ColdFusion查询中联接表

我正在执行两个查询,以根据同一数据库中两个表的数据构建一个表。 我现在的代码在下面,但是我知道我正在以这种方式创建不必要的负载。 我一直在尝试加入表格以得到相同的结果,但是没有运气。 有输入吗?
4回复

Linux / Apache上的ColdFusion是否稳定?

我正在开发一个在ColdFusion中仍然有很多脚本的网站。 我需要将它移动到新服务器。 我更喜欢Apache / Linux而不是IIS / Windows。 我已经看到了一些关于在Apache / Linux上运行ColdFusion的信息。 这是一个稳定的设置吗?
1回复

上载替换映像路径REGEX时的Coldfusion

我试图写正则表达式来搜索和替换图像路径,并保持相同的文件名到我的远程服务器路径的现有路径。 用户正在上传我想要的HTML文件,同时在保存到数据库之前上传替换路径。 我写了一些正则表达式,但在网上找到的正则表达式中,它似乎不能正常工作。 请在下面找到代码片段...
1回复

如何在Railo中将Java结果集转换为ColdFusion查询?

以下内容在CFMX 7和CF8中可以正常工作,我也假定CF9: 这使用JDBC驱动程序创建一条语句,对它执行查询,将其放入Java结果集中,然后实例化coldfusion.sql.QueryTable,传递Java resulset对象,然后调用queryTable.FirstTable
3回复

ColdFusion - cfscript中的集合循环

我有一些基于标签的语法在Railo中有效。 以上允许我访问索引'i'和项目本身'j'。 我想在cfscript中做同样的事情,所以我用过: 但是,“我”给了我项目 ......如何访问索引值? 作为解决方法,我不得不手动计算索引,如下所示: 但这感觉很脏。
1回复

带有ColdFusion的jSoup select()中的意外结果

出于某种原因,从jSoup对象的select()调用总是得到奇怪的结果。 这是我的代码(我试图获取简单的标题和元标记值,并将其插入到名为“ request”的对象中): 因为我在CFC中具有此功能,所以我使用的是Java Loader,它工作正常。 document.fileco