مصدر المقال: ملاحظات البرمجة
http://blog.csdn.net/nhconch الرجاء دعمي
كل مطور قام بتصميم تطبيق ASP-Web واسع النطاق ربما يتمتع بالخبرة التالية: كود ASP وHTML للصفحة مرتبكان ويصعب التمييز بينهما، ومنطق العمل كذلك. مرتبط بوضع العرض، مما يجعل من الصعب فهم الكود وتعديله؛ ويجب كتابة البرمجة بعد الفن، الأمر الذي أصبح عنق الزجاجة للمشروع، عند دمج كود البرنامج والصفحات الثابتة بتنسيق HTML، يستغرق الأمر الكثير من الوقت للحصول عليه التأثير المطلوب، ويضاعف من الفن. في الواقع، ليس من السهل فصل معالجة البيانات وعرض البيانات عند تطوير تطبيقات الويب باستخدام لغات البرمجة النصية، ومع ذلك، في حالة التعاون متعدد الأشخاص، إذا لم يكن من الممكن فصل البيانات وعرضها، فسيؤثر ذلك بشكل كبير على كفاءة التطوير والتنفيذ. التقسيم المهني للعمل.
لغات البرمجة النصية الأخرى، مثل JSP وPHP، لها حلولها الخاصة. ASP.NET، منتج الجيل الأحدث من ASP، ينفذ أيضًا الأكواد والصفحات. يبدو أن الانتقال المباشر إلى ASP يعد خيارًا جيدًا. ولكن هناك دائمًا أسباب من نوع أو آخر تمنعنا من التخلي عن ASP أو التوجه مباشرة إلى معسكر .NET في الوقت الحالي. من وجهة نظر الشركة، يعد تبديل اللغات استثمارًا ضخمًا، بما في ذلك توظيف مبرمجي .NET ذوي الخبرة، وتدريب المبرمجين الحاليين، وتحويل أدوات التطوير، وتحويل أسلوب التطوير، وتغيير نمط الواجهة، ونمط الواجهة، وهندسة البرمجيات، والمستندات، وعمليات التطوير وما إلى ذلك؛ وهذا يعني أيضًا أنه يجب إعادة كتابة الكود الأصلي في بيئة اللغة الجديدة لتحقيق أفضل تأثير واستقرار، وسيؤثر بشكل مباشر على تقدم المشروع خلال هذه الفترة، ومن المرجح أن يحدث ذلك يؤدي إلى إجازة المبرمجين الأفراد. يبدو أنه قبل أن تقرر تبديل اللغات، من الأفضل إيجاد حل على الأساس الأصلي.
تنفذ PHP الأكواد والصفحات من خلال القوالب. هناك FastTemplate، PHPLIB، Smarty، وما إلى ذلك للاختيار من بينها، من بينها PHPLIB له التأثير الأكبر والأكثر استخدامًا. وفي هذه الحالة نقوم بنقلها مباشرة إلى ASP، وهو ما له فوائد كبيرة للشركات التي تستخدم كلا من PHP و ASP: 1. عندما يقوم الفنان بمعالجة الصفحة، سواء تم استخدام PHP أو ASP، فإن طريقة المعالجة هي نفسها، ولا يوجد تدريب. مطلوب 2. عندما يكتب المبرمجون التعليمات البرمجية، تكون الأفكار بين اللغتين متقاربة أو متسقة. وعندما يتم تنفيذ نفس الوظائف في اللغتين، فإنهم يحتاجون فقط إلى نسخها وإجراء تعديلات طفيفة، مما يضمن كفاءة العمل والمشروع تقدم.
1. يطبق تصميم فئة القالب تغليف التعليمات البرمجية في فئة القالب، وهو ليس فقط متوافقًا مع PHPLIB، ولكن أيضًا لتسهيل إدارة التعليمات البرمجية وتوسيعها.
الهدف من فئة القالب هو قراءة كود HTML المعروض من ملف القالب، واستبدال أجزاء كود العرض التي تتطلب بيانات ديناميكية بالبيانات المحسوبة بواسطة برنامج ASP، ثم إخراجها بترتيب معين. من بينها، يمكن ضبط الجزء البديل بحرية. لذلك يجب عليه إكمال المهام التالية:
· اقرأ كود HTML للعرض من ملف القالب.
· ادمج ملف القالب مع البيانات الفعلية التي تم إنشاؤها لتوليد نتائج الإخراج.
· يسمح بمعالجة قوالب متعددة في وقت واحد.
· السماح بتداخل القالب.
· يسمح بمعالجة جزء فردي من القالب.
طريقة التنفيذ:
استخدم FSO لقراءة ملفات القالب
استخدم الاستبدال العادي لدمج ملفات القالب والبيانات
يتم تنفيذ معالجة قوالب متعددة باستخدام تخزين المصفوفة.
الفكرة الرئيسية وراء تنفيذ تداخل القالب هي التعامل مع القوالب والمخرجات (أي نتائج تحليل وسيطة) على قدم المساواة، ويمكن استبدال كليهما، وهذا كل شيء.
يتم التحكم في معالجة الأجزاء الفردية عن طريق إعداد التعليقات التوضيحية في ملف القالب، ثم دمج التعليقات التوضيحية في الاستبدال العادي لتحقيق الاستبدال الجزئي.
2. قبل إعطاء التعليمات البرمجية المحددة لتنفيذ فئة القالب، دعونا أولاً ندرج الوظائف الرئيسية التي يجب أن يكون الأصدقاء الذين استخدموا PHPLIB على دراية بها:
1) يقوم Public Sub set_root (قيمة ByVal) بتعيين الدليل الافتراضي للقالب 2) يقوم Public Sub set_file (مقبض ByVal، اسم ملف ByVal) بقراءة الملف 3) يقوم Public Sub set_var (اسم ByVal، قيمة ByVal، إلحاق ByVal) بتعيين استبدال بيانات التعيين المتغير 4) Public Sub unset_var(ByVal Name) إلغاء تعيين البيانات 5) Public Sub set_block(ByVal Parent، ByVal BlockTag، ByVal Name) تعيين كتلة البيانات 6) Public Sub set_unknowns(ByVal غير معروف) قم بتعيين طريقة معالجة العلامات للتعيين غير المحدد 7) يقوم تحليل Public Sub (ByVal Name، ByVal BlockTag، ByVal Append) بتنفيذ مجموعة من ملف القالب والبيانات 8) يقوم Public Sub p (ByVal Name) بإخراج
كود تنفيذ نتيجة المعالجة:
<%
'======================================================================== ===============================================================================
'يتم استخدام أساليب التسمية مثل set_var وset_block في هذا الكائن للتوافق مع phplib
'======================================================================== ===============================================================================
'www.downcodes.com
فئة kktTemplate
m_FileName الخاص، m_Root، m_Unknowns، m_LastError، m_HaltOnErr
m_ValueList الخاصة، m_BlockList
خاص m_RegExp
"منشئ".
فئة فرعية خاصة_تهيئة
تعيين m_ValueList = CreateObject("Scripting.Dictionary")
تعيين m_BlockList = CreateObject("Scripting.Dictionary")
set m_RegExp = New RegExp
m_RegExp.IgnoreCase = صحيح
m_RegExp.Global = صحيح
m_FileName = ""
m_Root = ""
m_Unknowns = "إزالة"
m_LastError = ""
m_HaltOnErr = صحيح
نهاية الفرعية
"المدمر."
فئة فرعية خاصة_إنهاء
تعيين m_RegExp = لا شيء
اضبط m_BlockMatches = لا شيء
اضبط m_ValueMatches = لا شيء
نهاية الفرعية
الملكية العامة GetClassName()
اسم الفئة = "kktTemplate"
نهاية الملكية
الملكية العامة احصل على النسخة()
الإصدار = "1.0"
نهاية الملكية
حول فرعي عام ()
Response.Write("فئة قالب صفحة kktTemplate ASP<br>" & vbCrLf &_
"البرمجة: Peng Guohui2004-07-05<br>" & vbCrLf &_
"الموقع الشخصي: <a href='http://kacarton.yeah.net'>http://kacarton.yeah.net</a><br>" & vbCrLf &_
"البريد الإلكتروني: <a href='mailto:[email protected]'>[email protected]</a><br>")
نهاية الفرعية
"تحقق من وجود الدليل."
مجلد الوظيفة العامة موجود (مسار ByVal)
خافت FSO
تعيين fso = CreateObject("Scripting.FileSystemObject")
FolderExist = fso.FolderExists(Server.MapPath(path))
تعيين fso = لا شيء
وظيفة النهاية
'اقرأ محتوى الملف
وظيفة خاصة LoadFile()
اسم الملف الخافت، fso، hndFile
اسم الملف = m_Root
إذا كان Right(Filename, 1)<>"/" و Right(Filename, 1)<>"" ثم Filename = Filename & "/"
اسم الملف = Server.MapPath(اسم الملف وm_FileName)
تعيين fso = CreateObject("Scripting.FileSystemObject")
إذا لم يكن fso.FileExists(Filename) ثم ShowError("ملف القالب" & m_FileName & "غير موجود!")
تعيين hndFile = fso.OpenTextFile(اسم الملف)
LoadFile = hndFile.ReadAll
تعيين hndFile = لا شيء
تعيين fso = لا شيء
إذا كان LoadFile = "" إذن ShowError("لا يمكن قراءة ملف القالب" & m_FileName & "أو أن الملف فارغ!")
وظيفة النهاية
'التعامل مع رسائل الخطأ
خطأ في العرض الفرعي الخاص (رسالة ByVal)
m_LastError = msg
Response.اكتب "<font color=red style='font-size;14px'><b>خطأ في القالب:" & msg & "</b></font><br>"
إذا m_HaltOnErr ثم Response.End
نهاية الفرعية
'قم بتعيين الدليل الافتراضي لملفات القالب
'على سبيل المثال: kktTemplate.set_root("/tmplate")
' kktTemplate.Root = "/tmplate"
'الجذر = kktTemplate.get_root()
'root = kktTemplate.Root
'استخدام أسلوب تسمية مثل set_root يهدف إلى التوافق مع phplib، وهو ما لن يتم تكراره أدناه.
مجموعة فرعية عامة (قيمة ByVal)
إذا لم يكن FolderExist(Value) ثم ShowError(Value & "ليس دليلًا صالحًا أو الدليل غير موجود!")
m_Root = القيمة
نهاية الفرعية
الوظيفة العامة get_root()
get_root = m_Root
وظيفة النهاية
دع الملكية العامة تتجذر (قيمة ByVal)
set_root(القيمة)
نهاية الملكية
الملكية العامة GetRoot()
الجذر = m_Root
نهاية الملكية
"تعيين ملف القالب."
'على سبيل المثال: kktTemplate.set_file("hndTpl"، "index.htm")
'لا تدعم هذه الفئة ملفات قوالب متعددة، المقبض محجوز للتوافق مع phplib
public Sub set_file (مقبض ByVal، اسم ملف ByVal)
m_FileName = filename
m_BlockList.Add Handle، LoadFile()
نهاية الفرعية
الوظيفة العامة get_file()
get_file = m_FileName
وظيفة النهاية
' ملف السماح بالملكية العامة (المقبض، اسم الملف)
'مقبض set_file، اسم الملف
""نهاية الملكية"."
'الملكية العامة احصل على الملف ()
'ملف = m_FileName
""نهاية الملكية"."
'قم بتعيين طريقة المعالجة للعلامات غير المحددة، بما في ذلك الاحتفاظ بها وإزالتها والتعليق عليها.
مجموعة فرعية عامة_غير معروفة (مجهولون ByVal)
m_Unknowns = غير معروف
نهاية الفرعية
الوظيفة العامة get_unknowns()
get_unknowns = m_Unknowns
وظيفة النهاية
الملكية العامة دع المجهول (ByVal غير معروف)
m_Unknowns = غير معروف
نهاية الملكية
الملكية العامة تحصل على أشياء مجهولة()
غير معروف = m_Unknowns
نهاية الملكية
مجموعة فرعية عامة (ByVal Parent، ByVal BlockTag، اسم ByVal)
مباريات خافتة
m_RegExp.Pattern = "<!--s+BEGIN " & BlockTag & "s+-->([sS.]*)<!--s+END " & BlockTag & "s+-- >"
إذا لم يكن m_BlockList.Exists(Parent) ثم ShowError("علامة حظر غير محددة" & Parent)
تعيين التطابقات = m_RegExp.Execute(m_BlockList.Item(Parent))
لكل مباراة في المباريات
m_BlockList.Add BlockTag، Match.SubMatches(0)
m_BlockList.Item(Parent) = Replace(m_BlockList.Item(Parent), Match.Value, "{" & Name & "}")
التالي
تعيين التطابقات = لا شيء
نهاية الفرعية
مجموعة فرعية عامة (اسم ByVal، قيمة ByVal، إلحاق ByVal)
ديم فال
إذا كانت IsNull(Value) ثم Val = "" Else Val = Value
إذا m_ValueList.Exists(Name) ثم
في حالة الإلحاق ثم m_ValueList.Item(Name) = m_ValueList.Item(Name) & Val _
آخر m_ValueList.Item(Name) = Val
آخر
m_ValueList.أضف الاسم والقيمة
نهاية إذا
نهاية الفرعية
Unset_var الفرعي العام (اسم ByVal)
إذا كان m_ValueList.Exists(Name) ثم m_ValueList.Remove(Name)
نهاية الفرعية
InstanceValue للوظيفة الخاصة (ByVal BlockTag)
مفاتيح خافتة، أنا
InstanceValue = m_BlockList.Item(BlockTag)
المفاتيح = m_ValueList.Keys
من أجل i=0 إلى m_ValueList.Count-1
InstanceValue = Replace(InstanceValue, "{" & المفاتيح(i) & "}"، m_ValueList.Item(keys(i)))
التالي
وظيفة النهاية
التحليل الفرعي العام (اسم ByVal، ByVal BlockTag، إلحاق ByVal)
إذا لم يكن m_BlockList.Exists(BlockTag) ثم ShowError("علامة حظر غير محددة" & الأصل)
إذا m_ValueList.Exists(Name) ثم
في حالة الإلحاق ثم m_ValueList.Item(Name) = m_ValueList.Item(Name) & InstanceValue(BlockTag) _
آخر m_ValueList.Item(Name) = InstanceValue(BlockTag)
آخر
m_ValueList.Add الاسم، InstanceValue(BlockTag)
نهاية إذا
نهاية الفرعية
إنهاء الوظيفة الخاصة (محتوى ByVal)
حدد الحالة m_Unknowns
حالة "الاحتفاظ" بإنهاء = المحتوى
حالة "إزالة"
m_RegExp.Pattern = "{[^ trn}]+}"
إنهاء = m_RegExp.Replace(المحتوى، "")
حالة "تعليق"
m_RegExp.Pattern = "{([^ trn}]+)}"
Finish = m_RegExp.Replace(content, "<!-- قالب متغير $1 غير محدد -->")
حالة أخرى النهاية = المحتوى
إنهاء التحديد
وظيفة النهاية
العامة الفرعية ص (اسم ByVal)
إذا لم يكن m_ValueList.Exists(Name) ثم ShowError("غير موجود" والاسم)
Response.Write(finish(m_ValueList.Item(Name)))
نهاية الفرعية
نهاية الفصل
%>
3. أمثلة الاستخدام فيما يلي ثلاثة أمثلة للشرح.
1) ملف قالب استبدال القيمة البسيطة هو myTemple.tpl، المحتوى:
<html><title>استبدال بسيط لقالب ASP</title><body>
تهنئة! لقد فزت بسيارة فيراري {some_color}!
</body>
ما يلي هو رمز ASP (kktTemplate.inc.asp هو فئة القالب المذكورة أعلاه):
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
خافت my_color، kkt
my_color = "الأحمر"
set kkt = new kktTemplate 'إنشاء كائن قالب
kkt.set_file "hndKktTemp"، "myTemple.tpl" 'قم بتعيين وقراءة ملف القالب myTemple.tpl
kkt.set_var "some_color"، my_color، false 'تعيين قيمة متغير القالب some_color = my_color
kkt.parse "out"، "hndKktTemp"، false 'متغير القالب = الملف المعالج
kkt.p "out" 'إخراج محتوى الخروج
set kkt = لا شيء 'قم بتدمير كائن القالب
%>
الإخراج بعد التنفيذ هو:
<html><title>استبدال بسيط لقالب ASP</title><body>
تهنئة! لقد فزت بسيارة فيراري حمراء!
</الجسم>
2) ملف نموذج العرض التوضيحي لكتلة الحلقة myTemple2.tpl:
<html><title>عرض قالب ASP</title><body>
<table cellpacing="2" border="1"><tr><td>ما هو الحيوان الذي تفضله فيما يلي</td></tr>
<!-- ابدأ قائمة الحيوانات -->
<tr><td><input type="radio" name="chk">{حيوان</td></tr>
<!-- نهاية قائمة الحيوانات -->
</الجدول>
</body>
رمز ASP:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
حيوان خافت، كي كي تي، أي
حيوان = مصفوفة ("خنزير صغير"، "جرو"، "شياو تشيانغ")
set kkt = new kktTemplate
kkt.set_file "hndKktTemp"، "myTemple2.tpl"
kkt.set_block "hndKktTemp"، "AnimalList"، "قائمة"
لأني=0 إلى UBound(حيوان)
kkt.set_var "حيوان"، حيوان (ط)، خطأ
kkt.parse "list"، "AnimalList"، صحيح
التالي
kkt.parse "خارج"، "hndKktTemp"، خطأ
kkt.p "خارج"
تعيين kkt = لا شيء
%>
نتيجة التنفيذ:
<html><title>عرض قالب ASP</title><body>
<table cellpacing="2" border="1"><tr><td>ما هو الحيوان الذي تفضله فيما يلي</td></tr>
<tr><td><input type="radio" name="chk">الخنزير الصغير</td></tr>
<tr><td><input type="radio" name="chk">جرو</td></tr>
<tr><td><input type="radio" name="chk">شياو تشيانغ</td></tr>
</الجدول>
</الجسم>
3) ملف قالب العرض التوضيحي للكتلة المتداخلة myTemple3.tpl:
<html><title>قالب ASP - عرض توضيحي للكتل المتداخلة</title>
<الجسم><عرض الجدول = "400" الحدود = "1" لون الحدود = "#000000">
<tr><td><div align="center">اختبار {myname}</div></td></tr>
<tr><td>حديقتي الحيوانية والنباتية: </td> </tr>
<!-- ابدأ قائمة الحيوانات -->
<tr><td>{حيوان</td></tr>
<!-- ابدأ قائمة النباتات -->
<tr><td> {النبات</td></tr>
<!-- نهاية قائمة النباتات -->
<!-- نهاية قائمة الحيوانات -->
</الجدول>
</الجسم>
</html>
كود ASP:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
خافت my_color، kkt، myname، الحيوان، النبات
set kkt = new kktTemplate
myname = "اختبار كتلة kktTemplate..."
حيوان = مصفوفة ("حيوان"، "نبات")
plant = array(array("Little Pig"،"Xiaobai"،"Xiaoqiang")، array("Rose"، "Sunflower"))
kkt.set_file "hndKktTemp"، "myTemple3.tpl"
kkt.set_var "myname"، myname، false
kkt.set_block "hndKktTemp"، "animalList"، "أ"
kkt.set_block "animalList"، "plantList"، "p"
لـ i=0 إلى UBound(animal)
kkt.set_var "حيوان"، حيوان (ط)، خطأ
kkt.unset_var "ص"
'kkt.set_var "p"، ""، خطأ
لـ j=0 إلى UBound(plant(i))
kkt.set_var "مصنع"، مصنع (ط) (ي)، خطأ
kkt.parse "p"، "plantList"، صحيح
التالي
kkt.parse "a"، "animalList"، صحيح
التالي
kkt.parse "خارج"، "hndKktTemp"، خطأ
kkt.p "خارج"
%>
نتيجة التنفيذ:
<html><title>قالب ASP - عرض توضيحي للكتل المتداخلة</title>
<الجسم><عرض الجدول = "400" الحدود = "1" لون الحدود = "#000000">
<tr><td><div align="center">اختبار كتلة kktTemplate...اختبار</div></td></tr>
<tr><td>حديقتي الحيوانية والنباتية: </td> </tr>
<tr><td>الحيوانات</td></tr>
<tr><td> الخنزير الصغير</td></tr>
<tr><td> شياوباي</td></tr>
<tr><td> شياو تشيانغ</td></tr>
<tr><td>النباتات</td></tr>
<tr><td> الورد</td></tr>
<tr><td> دوار الشمس</td></tr>
</الجدول>
</الجسم>
</html>
يمكن تنزيل جميع الأكواد المذكورة في هذه المقالة هنا: