기사 출처: 프로그래밍 노트
http://blog.csdn.net/nhconch 저를 지원해 주세요.
대규모 ASP-웹 응용 프로그램을 설계한 모든 개발자는 아마도 다음과 같은 경험을 가지고 있을 것입니다: ASP 코드와 페이지 HTML이 혼동되고 구별하기 어렵고 비즈니스 논리가 복잡합니다. 디스플레이 모드와 묶여 있어 코드를 이해하고 수정하기가 어렵습니다. 프로그래밍은 프로그램 코드와 HTML 정적 페이지를 통합할 때 프로젝트 병목 현상이 발생하여 작성해야 합니다. 원하는 효과를 얻으면 예술이 됩니다. 실제로 스크립팅 언어를 사용하여 웹 애플리케이션을 개발할 때 데이터 처리와 데이터 표시를 분리하는 것은 쉽지 않습니다. 그러나 다중 사용자 협력의 경우 데이터와 표시를 분리할 수 없으면 개발 효율성과 생산성에 큰 영향을 미치게 됩니다. 전문적인 분업.
JSP, PHP 등 다른 스크립팅 언어에도 자체 솔루션이 있습니다. ASP의 후속 제품인 ASP.NET도 코드와 페이지를 구현하므로 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 Value)는 템플릿 기본 디렉터리를 설정합니다. 2) Public Sub set_file(ByVal 핸들,ByVal 파일 이름)은 파일을 읽습니다. 3) Public Sub set_var(ByVal Name, ByVal Value, ByVal Append)은 매핑 데이터 교체를 설정합니다. 변수 4) Public Sub unset_var(ByVal Name) 데이터 매핑 취소 5) Public Sub set_block(ByVal Parent, ByVal BlockTag, ByVal Name) 데이터 블록 설정 6) Public Sub set_unknowns(ByValUnknowns) 불특정 매핑에 대한 태그 처리 방법 설정 7) Public Sub pars(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 = 새 RegExp 설정
m_RegExp.IgnoreCase = 참
m_RegExp.Global = 참
m_파일명 = ""
m_루트 = ""
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(경로))
fso = 없음 설정
기능 종료
'파일 내용 읽기
개인 함수 LoadFile()
희미한 파일 이름, fso, hndFile
파일 이름 = m_Root
If Right(파일 이름, 1)<>"/" And Right(파일 이름, 1)<>"" Then Filename = 파일 이름 & "/"
파일 이름 = Server.MapPath(파일 이름 & m_FileName)
fso = CreateObject("Scripting.FileSystemObject") 설정
If Not fso.FileExists(Filename) Then ShowError("템플릿 파일" & m_FileName & "존재하지 않습니다!")
set hndFile = fso.OpenTextFile(파일 이름)
LoadFile = hndFile.ReadAll
hndFile = 없음 설정
fso = 없음 설정
If LoadFile = "" Then ShowError("템플릿 파일을 읽을 수 없습니다." & m_FileName & "또는 파일이 비어 있습니다!")
기능 종료
'오류 메시지 처리
비공개 서브 쇼오류(ByVal msg)
m_LastError=msg
응답.쓰기 "<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 값)
If Not FolderExist(Value) Then ShowError(Value & "올바른 디렉토리가 아니거나 디렉토리가 존재하지 않습니다!")
m_Root = 값
서브 끝
공용 함수 get_root()
get_root = m_루트
기능 종료
공용 속성 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_파일 이름
'끝 속성
'지정, 삭제, 댓글 등 불특정 태그에 대한 처리 방법을 설정합니다.
공개 하위 세트_unknowns(ByVal 알 수 없음)
m_Unknowns = 알 수 없음
서브 끝
공개 함수 get_unknowns()
get_unknowns = m_알 수 없음
기능 종료
공공 재산 Let Unknowns(ByVal 알 수 없음)
m_Unknowns = 알 수 없음
끝 속성
공용 속성 Get Unknowns()
알 수 없음 = m_알 수 없음
끝 속성
Public Sub set_block(ByVal Parent, ByVal BlockTag, ByVal 이름)
희미한 일치
m_RegExp.Pattern = "<!--s+BEGIN " & BlockTag & "s+-->([sS.]*)<!--s+END " & BlockTag & "s+-- >"
m_BlockList.Exists(Parent)가 아닌 경우 ShowError("지정되지 않은 블록 태그" & 상위)
일치 설정 = m_RegExp.Execute(m_BlockList.Item(Parent))
경기의 각 경기에 대해
m_BlockList.BlockTag 추가, Match.SubMatches(0)
m_BlockList.Item(Parent) = 바꾸기(m_BlockList.Item(Parent), Match.Value, "{" & 이름 & "}")
다음
일치 항목 설정 = 없음
서브 끝
Public Sub set_var(ByVal 이름, ByVal 값, ByVal 추가)
딤발
IsNull(Value)이면 Val = "" 그렇지 않으면 Val = Value
m_ValueList.Exists(Name)이면
추가하면 m_ValueList.Item(Name) = m_ValueList.Item(Name) & Val _
그렇지 않으면 m_ValueList.Item(Name) = Val
또 다른
m_ValueList.이름, 값 추가
종료 조건
서브 끝
Public Sub 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 = 바꾸기(InstanceValue, "{" & 키(i) & "}", m_ValueList.Item(키(i)))
다음
기능 종료
공개 하위 구문 분석(ByVal 이름, ByVal BlockTag, ByVal Append)
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.이름 추가, InstanceValue(BlockTag)
종료 조건
서브 끝
Private Function 종료(ByVal 콘텐츠)
케이스 선택 m_Unknowns
케이스 "유지" 완료 = 내용
케이스 "제거"
m_RegExp.Pattern = "{[^ trn}]+}"
완료 = m_RegExp.Replace(content, "")
사례 "댓글"
m_RegExp.Pattern = "{([^ trn}]+)}"
finish = m_RegExp.Replace(content, "<!-- 템플릿 변수 $1 정의되지 않음 -->")
Case Else 마무리 = 내용
선택 종료
기능 종료
Public Sub p(ByVal 이름)
If Not m_ValueList.Exists(Name) Then ShowError("존재하지 않음" & Name)
Response.Write(finish(m_ValueList.Item(이름)))
서브 끝
수업 종료
%>
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 '템플릿 변수 out = 처리된 파일
kkt.p "out" 'out의 내용을 출력합니다.
set kkt = Nothing '템플릿 개체를 삭제합니다.
%>
실행 후 출력은 다음과 같습니다.
<html><title>ASP 템플릿 단순 교체</title><body>
축하해요! 빨간색 페라리를 획득하세요!
</body>
2) 루프 블록 데모 예제 템플릿 파일 myTemple2.tpl:
<html><title>ASP 템플릿-블록 데모</title><body>
<table cellpacing="2" border="1"><tr><td>다음 동물 중 어떤 동물을 좋아하시나요</td></tr>
<!-- AnimalList 시작 -->
<tr><td><input type="radio" name="chk">{동물}</td></tr>
<!-- 동물 목록 끝 -->
</table>
</body>
ASP 코드:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
희미한 동물, kkt, 나
Animal = Array("꼬마돼지","강아지","샤오창")
kkt 설정 = 새 kktTemplate
kkt.set_file "hndKktTemp", "myTemple2.tpl"
kkt.set_block "hndKktTemp", "AnimalList", "list"
i=0에서 UBound(동물)까지
kkt.set_var "동물", 동물(i), 거짓
kkt.parse "목록", "동물 목록", true
다음
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>
</table>
</body>
3) 중첩된 블록 데모 템플릿 파일 myTemple3.tpl:
<html><title>ASP 템플릿 - 중첩 블록 데모</title>
<body><테이블 너비="400" border="1" bordercolor="#000000">
<tr><td><div align="center">{myname} 테스트</div></td></tr>
<tr><td>나의 동물원 및 식물원: </td> </tr>
<!-- 동물 목록 시작 -->
<tr><td>{동물}</td></tr>
<!-- plantList 시작 -->
<tr><td> {식물}</td></tr>
<!-- plantList 끝 -->
<!-- 동물 목록 끝 -->
</table>
</body>
</html>
ASP 코드:
<!--#INCLUDE VIRTUAL="kktTemplate.inc.asp"-->
<%
희미한 my_color, kkt, myname, 동물, 식물
kkt 설정 = 새 kktTemplate
myname = "kktTemplate 블록 테스트..."
동물 = array("동물", "식물")
plant = array(array("작은 돼지","Xiaobai","Xiaoqiang"), array("장미","해바라기"))
kkt.set_file "hndKktTemp", "myTemple3.tpl"
kkt.set_var "내 이름", 내 이름, 거짓
kkt.set_block "hndKktTemp", "animalList", "a"
kkt.set_block "animalList", "plantList", "p"
for i=0 to UBound(animal)
kkt.set_var "동물", 동물(i), 거짓
kkt.unset_var "p"
'kkt.set_var "p", "", 거짓
j=0에서 UBound(plant(i))까지
kkt.set_var "식물", 식물(i)(j), false
kkt.parse "p", "plantList", true
다음
kkt.parse "a", "animalList", true
다음
kkt.parse "아웃", "hndKktTemp", 거짓
kkt.p "아웃"
%>
실행 결과:
<html><title>ASP 템플릿 - 중첩 블록 데모</title>
<body><테이블 너비="400" border="1" bordercolor="#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>
</table>
</body>
</html>
이 문서에 언급된 모든 코드는 여기에서 다운로드할 수 있습니다.