ASP에서 동적 포함 스크립트를 구현하기 위한 Server.Execute와 Execute의 차이점은 필요한 친구가 참조할 수 있습니다. 나는 최근에 ASP에서 MVC 아키텍처를 구현하려고 계획했습니다. 누군가 나에게 물어보았을 것입니다. ASP가 제거되었는데 왜 아직도 연구하고 있습니까? Microsoft가 ASP 3.0을 포기하고 ASP.NET으로 전환한 이후 ASP는 거의 동시에 시작된 PHP 및 JSP에 비해 훨씬 뒤쳐졌습니다. ASP는 폐지된다고 합니다. 그러나 ASP가 중국 시장에서 여전히 널리 퍼져 있다는 점은 주목할 가치가 있습니다. 특히 일부 중소기업의 경우에는 더욱 그렇습니다. 문제가 있으며 배포하기 쉽습니다. 일부 오래된 Windows 시스템에서는 .NET을 설치할 필요가 없습니다. 프레임워크는 기본적으로 직접 실행할 수 있기 때문에 아직 프레임워크 준비가 필요합니다. 그러나 제 프레임워크는 ASP가 PHP와 유사한 MVC 아키텍처를 구현할 수 있는지 확인하기 위한 실험적인 프레임워크입니다.
좋아요, 너무 많이 말했으니 바로 본론으로 들어가겠습니다. 이 문제가 발생하는 이유는 ASP 파일을 동적으로 포함해야 하기 때문입니다. 우리 모두 알고 있듯이 ASP에는 SSI(서버 측 포함)라는 포함 방법이 하나만 있으며 기본적으로 다음 두 가지 유형으로 나뉩니다.
다음과 같이 코드 코드를 복사합니다.
<!-- #include 파일=sample.asp -->
<!-- #include virtual=sample.asp -->
기본적으로 이 두 가지 중 첫 번째 것이 더 일반적으로 사용됩니다. #include virtual에는 일반적으로 가상 디렉터리에서 사용되는 가상 경로가 포함되어 있습니다. 그러나 둘 다 정적입니다. 동적으로 포함하려면 다음과 같이 작성할 수 없습니다.
다음과 같이 코드 코드를 복사합니다.
<!-- #include 파일=<%=MyVar%> -->
<!-- #include virtual=<%=MyVar%> -->
위의 작성은 잘못된 것입니다. ASP가 스크립트 엔진을 시작하기 전에 #include 지시문이 실행되어 ASP<% %> 태그 사이에 스크립트가 실행된다는 의미입니다. 즉, #include는 ASP의 작업이 아닙니다. IIS 번역 작업과 같은 서버 프로그램은 ASP 코드에 주의를 기울이지 않습니다.
PHP의 include, include_once, require 및 require_once와 유사한 동적 포함 스크립트 메소드를 구현하는 방법은 무엇입니까? ASP 서버 개체의 메서드인 Server.Execute를 살펴보겠습니다. 모든 ASP 기능을 검색하면 이 함수가 동적 포함과 가장 유사하다는 것을 알 수 있습니다.
Sample.inc.asp
다음과 같이 코드 코드를 복사합니다.
<%
응답.Hello World!를 작성하세요.
%>
테스트.asp
다음과 같이 코드 코드를 복사합니다.
<%
Server.Execute Sample.inc.asp
응답.쓰기 저는 test.asp입니다!
%>
실제 출력은 Hello World!I am test.asp!이어야 하며 이는 Server.Execute가 동적 포함과 잘 작동할 수 있음을 나타냅니다. 그러나 클래스나 함수를 포함하려면 어떻게 해야 합니까? 다음으로 다음 실험을 수행합니다.
샘플.클래스.asp
다음과 같이 코드 코드를 복사합니다.
<%
수업 샘플
수업 종료
%>
테스트.asp
다음과 같이 코드 코드를 복사합니다.
<%
Server.Execute Sample.class.asp
Response.Write TypeName(Eval(새 샘플))
%>
직접 실행하면 오류 Microsoft VBScript 런타임 오류 '800a01fa' 클래스가 정의되지 않았습니다: '샘플', 결과가 매우 실망스럽습니다. 왜 이런 일이 발생합니까? MSDN을 확인하고 다음 설명을 찾았습니다. #include를 사용하여 호출 페이지에 파일이 포함된 경우 실행된 .asp는 해당 파일을 사용하지 않습니다. 예를 들어 호출 페이지에 포함된 파일에 서브루틴이 있을 수 있습니다. 그러나 실행된 .asp는 서브루틴 이름을 인식하지 못합니다. 제가 겪었던 문제와는 다소 다른 것 같습니다. Server.Execute 코드가 격리되어 있습니까? 그런 다음 다음 실험을 수행합니다.
Sample.inc.asp
다음과 같이 코드 코드를 복사합니다.
<%
희미한 MyVar
MyVar = 나는 샘플입니다!
%>
테스트.asp
다음과 같이 코드 코드를 복사합니다.
<%
희미한 MyVar
MyVar = 나는 테스트다!
Server.Execute Sample.inc.asp
응답.MyVar 쓰기
%>
결과는 I am test!입니다. 이는 매우 실망스럽습니다! Server.Execute는 변수, 함수, 클래스 및 기타 코드를 격리하는 것으로 보입니다. 이는 호출 측과 호출 측이 코드 수준에서 서로 간섭하지 않는다는 것을 의미합니다. Server.Execute는 . ASP 템플릿.
다음은 VBScript 스크립트 기능인 Execute입니다. Execute에 전달되는 것은 유효한 VBScript 스크립트 코드여야 하며, Execute는 상황에 맞는 것 같습니다. 이는 우리가 필요로 하는 동적 포함에 매우 가까운 것 같습니다.
테스트.asp
다음과 같이 코드 코드를 복사합니다.
<%
클래스 샘플 실행 : 클래스 종료
Response.Write TypeName(Eval(새 샘플))
%>
위 코드는 필요한 유형 이름 Sample을 성공적으로 출력합니다. Execute가 실제로 상황에 따라 달라질 수 있다는 것이 입증되었지만 문제는 Execute를 사용하여 asp 파일을 포함하는 것이 Server.Execute만큼 편리하지 않다는 것입니다. 우선, Execute는 VBScript 스크립트와 함께 제공됩니다. , 따라서 파일 내용을 한 번 읽어야 합니다. 둘째, ASP를 식별하는 데 사용되는 일부 태그(예: <% %>)에는 <%=MyVar %>와 유사한 호출 방법이 있으므로 <를 필터링해야 합니다. % %>, 그리고 <%=MyVar %>를 Response.Write로 변환합니다. MyVar. 필요한 것은 클래스 파일을 포함하는 것이므로 <%=MyVar %>는 나타나지 않습니다. <% %>만 바꾸면 됩니다. 파일 내용을 읽고 단순히 <% %>를 제외하려면 다음 기능을 참조할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
함수 file_get_contents(파일명)
희미한 fso, f
fso = Server.CreateObject(Scripting.FilesystemObject) 설정
f = fso.OpenTextFile(Server.MapPath(파일 이름), 1) 설정
file_get_contents = f.ReadAll
f.닫기
f = 없음으로 설정
fso = 없음 설정
기능 종료
함수 class_get_contents(파일명)
희미한 내용
내용 = file_get_contents(파일명)
내용 = 바꾸기(내용, < & %, )
내용 = 바꾸기(내용, % & >, )
class_get_contents = 내용
기능 종료
위 함수를 사용하면 다음 코드를 직접 테스트할 수 있습니다.
샘플.클래스.asp
다음과 같이 코드 코드를 복사합니다.
<%
수업 샘플
수업 종료
%>
테스트.asp
다음과 같이 코드 코드를 복사합니다.
<%
class_get_contents(Sample.class.asp) 실행
Response.Write TypeName(Eval(새 샘플))
%>
결과 출력은 우리가 예상한 샘플 유형 이름입니다. 나쁜 의도를 가진 사람들이 종종 이를 사용하여 포니를 만드는 경우가 많기 때문에 Execute는 여전히 매우 강력한 것 같습니다. 다음 문장.
다음과 같이 코드를 복사합니다: <%Execute Request(c)%>
예를 들어, 이 스크립트는 file.asp에 있고 file.asp?c=Trojan text를 전달합니다. 하하, 여러분은 이미 다음 사항을 알고 있습니다. Execute에 대해 주목해야 할 또 다른 사항은 컨텍스트와 관련되어 있으므로 범위 문제에 주의하세요. Execute가 하위 프로세스나 함수 함수 내부에 있으면 외부에서 액세스할 수 없습니다.