Источник статьи: Заметки по программированию.
http://blog.csdn.net/nhconch Пожалуйста, поддержите меня.
Каждый разработчик, создавший крупномасштабное веб-приложение ASP, вероятно, имеет следующий опыт: код 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(ByValknowns) Установить метод обработки тега для неопределенного сопоставления 7) Public Sub parse(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")
установите m_RegExp = Новое регулярное выражение
m_RegExp.IgnoreCase = Истина
m_RegExp.Global = Истина
m_FileName = ""
m_Root = ""
m_Unknowns = "удалить"
m_LastError = ""
m_HaltOnErr = правда
Конец субтитра
'Деструктор
Частный подкласс_Terminate
Установите m_RegExp = Ничего
Установите m_BlockMatches = Ничего
Установите m_ValueMatches = ничего
Конец субтитра
Открытое свойство GetClassName()
ИмяКласса = "kktTemplate"
Конечная собственность
Открытая собственность Получить версию()
Версия = "1.0"
Конечная собственность
Публичная подписка О ()
Response.Write("Класс шаблона страницы ASP kktTemplate<br>" & vbCrLf &_
«Программирование: Пэн Гохуэй05 июля 2004 г. <br>» & vbCrLf &_
«Личный веб-сайт: <a href='http://kacarton.yeah.net'>http://kacarton.yeah.net</a><br>» & vbCrLf &_
«Электронная почта: <a href='mailto:[email protected]'>[email protected]</a><br>»)
Конец субтитра
'Проверяем, существует ли каталог
Открытая функция FolderExist (путь по значению)
Тусклый фсо
Установите fso = CreateObject("Scripting.FileSystemObject")
FolderExist = fso.FolderExists(Server.MapPath(путь))
Установить fso = Ничего
Конечная функция
'Читать содержимое файла
Частная функция LoadFile()
Уменьшить имя файла, fso, hndFile
Имя файла = m_Root
Если Right(Filename, 1)<>"/" And Right(Filename, 1)<>"" Тогда Filename = Filename & "/"
Имя файла = Server.MapPath(имя файла и m_имя_файла)
Установите fso = CreateObject("Scripting.FileSystemObject")
Если нет, fso.FileExists(Filename) then ShowError("Файл шаблона" & m_FileName & "Не существует!")
установите hndFile = fso.OpenTextFile(имя файла)
LoadFile = hndFile.ReadAll
Установить hndFile = Ничего
Установить fso = Ничего
If LoadFile = "" Тогда ShowError("Невозможно прочитать файл шаблона" & m_FileName & "Или файл пуст!")
Конечная функция
'Обработка сообщений об ошибках
Частная подписка ShowError (сообщение ByVal)
m_LastError = сообщение
Response.Write «<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()
' корень = kktTemplate.Root
'Использование такого метода именования, как set_root, предназначено для совместимости с phplib, что не будет повторяться ниже.
Публичный подмножество set_root (значение ByVal)
Если не FolderExist(значение), то ShowError(значение & «Недопустимый каталог или каталог не существует!»)
m_Root = Значение
Конец субтитра
Открытая функция get_root()
get_root = m_Root
Конечная функция
Открытое свойство Let Root (значение ByVal)
set_root (значение)
Конечная собственность
Открытая собственность GetRoot()
Корень = m_Root
Конечная собственность
'Установить файл шаблона
'Пример: kktTemplate.set_file("hndTpl", "index.htm")
'Этот класс не поддерживает несколько файлов шаблонов, дескриптор зарезервирован для совместимости с phplib.
Public Sub set_file (дескриптор ByVal, имя файла ByVal)
m_FileName = имя файла
m_BlockList.Добавить дескриптор, LoadFile()
Конец субтитра
Открытая функция get_file()
get_file = m_имя_файла
Конечная функция
' Открытое свойство Let File(дескриптор, имя файла)
'дескриптор set_file, имя файла
'Конечная собственность
'Общественная собственность, получение файла()
'Файл = m_имя_файла
'Конечная собственность
'Установите метод обработки для неуказанных тегов, включая сохранение, удаление и комментирование.
Public Sub set_unknowns (неизвестные значения ByVal)
m_Unknowns = неизвестные
Конец субтитра
Открытая функция get_unknowns()
get_unknowns = m_Unknowns
Конечная функция
Открытая собственность Let Unknowns (ByVal неизвестен)
m_Unknowns = неизвестно
Конечная собственность
Публичная собственность Получить неизвестные()
Неизвестные = m_Unknowns
Конечная собственность
Public Sub set_block (родительский элемент ByVal, ByVal BlockTag, имя ByVal)
Тусклые спички
m_RegExp.Pattern = "<!--s+BEGIN " & BlockTag & "s+-->([sS.]*)<!--s+END " & BlockTag & "s+-- >"
Если не m_BlockList.Exists(Parent) Тогда ShowError("Неуказанный тег блока" & Parent)
set Matches = m_RegExp.Execute(m_BlockList.Item(Parent))
За каждый матч в матчах
m_BlockList.Добавить BlockTag, Match.SubMatches(0)
m_BlockList.Item(Родительский) = Заменить(m_BlockList.Item(Родительский), Match.Value, "{" & Имя & "}")
Следующий
установить Совпадения = ничего
Конец субтитра
Public Sub set_var (имя по значению, значение по значению, добавление по значению)
Дим Вал
Если IsNull(Значение) Тогда Val = "" Иначе Val = Значение
Если m_ValueList.Exists(Имя) Тогда
Если добавить, то m_ValueList.Item(Name) = m_ValueList.Item(Name) & Val _
Иначе m_ValueList.Item(Name) = Значение
Еще
m_ValueList.Добавить имя, значение
Конец, если
Конец субтитра
Публичная подпрограмма unset_var (имя по значению)
Если 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 = Заменить(InstanceValue, "{" &keys(i) & "}", m_ValueList.Item(keys(i)))
Следующий
Конечная функция
Публичный поданализ (имя ByVal, ByVal BlockTag, ByVal Append)
Если не m_BlockList.Exists(BlockTag), то ShowError("Неуказанный тег блока" и родительский элемент)
Если m_ValueList.Exists(Имя) Тогда
Если добавить, то m_ValueList.Item(Name) = m_ValueList.Item(Name) & InstanceValue(BlockTag) _
Иначе m_ValueList.Item(Name) = InstanceValue(BlockTag)
Еще
m_ValueList.Добавить имя, InstanceValue(BlockTag)
Конец, если
Конец субтитра
Завершение частной функции (содержимое ByVal)
Выберите случай m_Unknowns
Конец "keep" = содержание
Дело «удалить»
m_RegExp.Pattern = "{[^ trn}]+}"
Finish = m_RegExp.Replace(content, "")
Кейс «комментарий»
m_RegExp.Pattern = "{([^ trn}]+)}"
Finish = m_RegExp.Replace(content, "<!-- Переменная шаблона $1 не определена -->")
Case Else Finish = содержание
Конец выбора
Конечная функция
Публичная подписка p (имя по значению)
Если не 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"-->
<%
тусклый мой_цвет, ккт
мой_цвет = "красный"
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 'Переменная шаблона out = обработанный файл
kkt.p "out" 'Вывести содержимое out
set kkt = Nothing 'Уничтожить объект шаблона
%>
Вывод после выполнения:
<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 = новый kktTemplate
kkt.set_file "hndKktTemp", "myTemple2.tpl"
kkt.set_block "hndKktTemp", "AnimalList", "список"
для i=0 до UBound(животное)
kkt.set_var "животное", животное(i), ложь
kkt.parse "список", "AnimalList", true
следующий
kkt.parse "выход", "hndKktTemp", false
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>
<body><table width="400" border="1" bordercolor="#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"-->
<%
тусклый мой_цвет, ккт, мое имя, животное, растение
set kkt = новый kktTemplate
myname = "блочный тест kktTemplate..."
животное = массив("животное", "растение")
растение = массив(массив("Поросенок","Сяобай","Сяоцян"), массив("Роза","Подсолнух"))
kkt.set_file "hndKktTemp", "myTemple3.tpl"
kkt.set_var "мое имя", мое имя, ложь
kkt.set_block "hndKktTemp", "animalList", "a"
kkt.set_block "animalList", "plantList", "p"
для i=0 до UBound(животное)
kkt.set_var "животное", животное(i), ложь
kkt.unset_var "п"
'kkt.set_var "p", "", false
для j=0 до UBound(plant(i))
kkt.set_var "растение", растение(i)(j), ложь
kkt.parse "p", "plantList", правда
следующий
kkt.parse "a", "animalList", правда
следующий
kkt.parse "выход", "hndKktTemp", false
kkt.p "выход"
%>
Результат выполнения:
<html><title>Шаблон ASP — демонстрация вложенных блоков</title>
<body><table width="400" border="1" bordercolor="#000000">
<tr><td><div align="center">kktTemplate блочный тест...test</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>
Весь код, упомянутый в этой статье, можно скачать здесь: