4

誰が問題が何であるか教えてもらえますか? いくつかの .cfm ファイルを実行しようとしましたが、cfcomponent 以外の cffunction の効果がトリガーされませんか? 何か不足していますか?誰か私に説明できますか?

<cfcomponent>
  <cfset THIS.Name = "formdemo">
  <cfset THIS.SessionManagement = true>
  <cfset This.Sessiontimeout="#createtimespan(0,0,20,0)#">
  <cfset This.applicationtimeout="#createtimespan(5,0,0,0)#">
  --Entered cfcomponent--
  <cffunction name="onApplicationStart" returnType="boolean" output="false">
    --Entered Application Start--
    <cfset application.portfolioUploadRoot = "ram:///portfoliouploads">
    <cfif not directoryExists(application.portfolioUploadRoot)>
      <cfdirectory action="create" directory="#application.portfolioUploadRoot#">
    </cfif>
    <cfreturn true>
  </cffunction>
  <cffunction name="onSessionStart" returnType="void" output="false">
    --Entered Session Start--
    <cfset session.myuploadroot = application.portfolioUploadRoot & "/" & replace(createUUID(), "-", "_", "all")>
    <cfif not directoryExists(session.myuploadroot)>
      <cfdirectory action="create" directory="#session.myuploadroot#">
    </cfif>
  </cffunction>
  <cffunction name="onApplicationEnd" returnType="void" output="false">
    --Entered Application End--
    <cfargument name="applicationScope" required="true">
    <cfif directoryExists(arguments.applicationScope.portfolioUploadRoot)>
      <cfdirectory action="delete" recurse="true" directory="#arguments.applicationScope.portfolioUploadRoot#">
    </cfif>
  </cffunction>
  <cffunction name="onSessionEnd" returnType="void" output="false">
    --Entered Session End--
    <cfargument name="sessionScope" type="struct" required="true">
    <cfargument name="appScope" type="struct" required="false">
    <cfif directoryExists(arguments.sessionScope.myuploadroot)>
      <cfdirectory action="delete" recurse="true" directory="#arguments.sessionScope.myuploadroot#">
    </cfif>
  </cffunction>
</cfcomponent>

結果は、cfmpage.cfm の先頭に「--Entered cfcomponent--」のみを示します。

cfmpage.cfm:

<cfparam name="form.textname" default="">
<cfparam name="form.textemail" default="">
<cfparam name="form.docattach" default="">
<cfif structKeyExists(form, "Submit")>
<cfset form.textname = trim(htmlEditFormat(form.textname))>
<cfset form.textemail = trim(htmlEditFormat(form.textemail))>
<cflocation url="formcomplete.cfm" addToken="false">
</cfif>
<!DOCTYPE html>
<html>
  <head>
    ...
  </head>
  <body>
    <form method="post" enctype="multipart/form-data">
      <cfoutput>
        <input id="textname" name="textname" type="text" class="input-large" required="" value="#form.textname#">
        <input id="textemail" name="textemail" type="text" class="input-large" required="" value="#form.textemail#">
      </cfoutput>
    </form>
  </body>
</html>
4

1 に答える 1

3

それは当然のことです。

onApplicationStart -- Runs when ColdFusion receives the first request for a page in the application.
    For this, to easily see this, you can try changing the name of the application, then
    visit a page within.

onSessionStart -- Only run upon the first visit within the session. If you wait til after the
    timeout and then come back, you'll see this. Changing the application name will should also
    retrigger this.

onSessionEnd -- Run when the session ends. It will trigger after the timeout, it's used so that
    you can clean up activity. For instance, if you're using something like Application.NumberOnline.
    OnSessionEnd can substract one (where onSessionStart) can add one.

onApplicationEnd -- Runs when the application timeout occurs or the server is shutting down.

ページにアクセスしている間はそのイベントを見ることができないため、後者の 2 つのどちらも画面にテキストを表示することはありません。ただし、それらを手動で呼び出して効果をトリガーすることはできます。ただし、これらのアクションをログに記録することはできます。たとえば、次のように cflog を使用できます。

<cffunction name="onApplicationEnd">
    <cfargument name="ApplicationScope" required=true/>
    <cflog file="#This.Name#" type="Information" 
        text="Application #Arguments.ApplicationScope.applicationname# Ended" >
</cffunction>

言い換えると:

<cfscript>
   ap      =   createObject("component","Application");
   ap.onSessionEnd(session,application);
</cfscript>

イベントを発生させているため、テキストを表示します。

最後に、各ページで何かを実行したい場合は、onRequestStart と onRequestEnd または onRequest が最適なオプションです。OnRequest はページをラップするメソッドであるため、同じリクエストでヘッダーとフッターのアクションを実行できますが、ファイルを明示的に含める必要がありますが、 onRequestStart / onRequestEnd はリクエストの開始時と終了時に実行されます。

呼び出されるアクション メソッドの順序は次のとおりです。

  1. onApplicationStart (最初のアプリケーション アクティビティで実行)
  2. onSessionStart (最初のセッション アクティビティで実行)
  3. onRequestStart
  4. 要求に応じて
  5. onRequestEnd

最後に、関数は呼び出されない限り起動しません。これは、自分で作成する関数にも当てはまります。

<cfscript>
  function foo() {
    writeoutput("bar");
  }
</cfscript>

のようなことを実際に試すまで、何もしません<cfoutput>#foo()#</cfoutput>

「デフォルト関数」の場合、これらは、CF が存在する場合に特定の時点で呼び出す特別な関数/メソッドにすぎません。

于 2014-12-18T07:00:14.363 に答える