사용자가 페이지 <FORM> 내용을 채울 때나 브라우저 주소 표시줄에 URL 뒤에 값을 입력할 때 제공되는 모든 값은 ASP 스크립트에서 Form 및 QueryString 컬렉션을 통해 사용됩니다. 이는 ASP 코드의 값에 액세스하는 간단한 방법입니다.
1. ASP 컬렉션에 액세스하는 일반적인 기술
대부분의 ASP 컬렉션은 VB에서 볼 수 있는 일반 컬렉션과 유사합니다. 사실상 값의 배열이지만 텍스트 문자열 키(크기에 민감하지 않음)와 정수 인덱스를 사용하여 액세스됩니다. 따라서 클라이언트 웹 페이지에 다음과 같은 <FORM>이 포함되어 있는 경우:
<FORM ACTION="show_request.asp" METHOD="POST">
이름:<입력 유형=”TEXT” 이름=”이름”>
성:<입력 유형=”TEXT” NAME=”성”>
<입력 유형=”제출” 값=”보내기”>
</FORM>
ASP의 Form 컬렉션에 액세스하여 해당 컨트롤의 값에 액세스할 수 있습니다.
strFirstName = Request.Form("FirstName")
=
Request.Form("LastName")은
양식에서 컨트롤의 정수 인덱스를 사용할 수도 있습니다. 인덱스 범위는 HTML에 정의된 첫 번째 컨트롤에서 시작하여 정의 순서에 따라 정렬됩니다.
요청 양식( 1)
strLastName = Request.Form(2)
그러나 정수 인덱싱을 사용하는 후자의 기술은 권장되지 않습니다. 왜냐하면 일단 HTML의 컨트롤이 변경되거나 새 컨트롤이 삽입되면 ASP 코드가 잘못된 값을 얻게 되기 때문입니다. 게다가 코드를 읽는 사람들에게는 매우 혼란스럽습니다.
1) 컬렉션의 모든 값에 접근하려면
키나 인덱스를 제공하지 않고 컬렉션을 참조하여 전체 Form의 일련의 값을 단일 문자 변수로 변환할 수 있습니다.
StrAllFormContent = Request.Form
텍스트 상자에 Priscilla 및 Descartes 값이 포함된 경우 Request.Form 문은 다음 문자를 반환합니다.
FirstName=Priscilla&LastName=Descartes
제공된 값은 이름/값 쌍의 형태로 나타납니다. (즉, 컨트롤 이름 = 컨트롤 값), 각 이름/값 쌍은 "&" 기호로 서로 구분됩니다. 이 기술은 양식의 내용을 표준 형식의 값을 기대하는 별도의 실행 가능한 응용 프로그램이나 DLL에 전달하려는 경우 유용합니다. 그러나 일반적으로 말하면 컬렉션의 콘텐츠는 양식의 컨트롤 이름을 텍스트 키로 사용하여 액세스됩니다.
2) ASP 컬렉션 탐색
ASP 컬렉션의 모든 멤버를 탐색하는 방법은 기본적으로 일반 VB 컬렉션과 동일합니다. 각 컬렉션은 컬렉션의 항목 수를 반환하는 Count 속성을 제공합니다. 정수 인덱스를 사용하는 Count 속성을 사용하여 탐색할 수 있습니다.
intLoop=1의 경우 Request.Form.Count로
Response.Write Request.Form(intLoop) & “<BR>”
다음
및
Descartes 값이 포함된 두 개의 텍스트 상자가 포함된 경우 다음 결과를 얻게 됩니다.
Descartes
그러나 더 나은 접근 방식은 For Each...Next 구조를 사용하는 것입니다.
Request.Form의 각 objItem에 대해
Response.Write objItem & “=" & Request.Form(objItem) & “<BR>”
다음
이것의 이점은 컨트롤의 이름과 값 모두에 액세스할 수 있다는 것입니다. 위 코드의 결과는 다음과 같습니다.
FirstName = Priscilla
LastName = Descartes
일부 브라우저에서 ASP로 반환되는 <FORM> 값은 페이지에 표시되는 순서와 동일하지 않을 수 있습니다.
3) 컬렉션 멤버의 다중 값 특성
어떤 경우에는 ASP 컬렉션의 각 멤버가 둘 이상의 값을 가질 수 있습니다. 이는 HTML 정의에 동일한 Name 특성을 가진 여러 컨트롤이 있는 경우에 발생합니다. 예:
<FORM ACTION=”Show_request.asp” METHOD=”POST”>
<입력 유형=”텍스트” 이름=”기타취미”>
<입력 유형=”텍스트” 이름=”기타취미”>
<입력 유형=”텍스트” 이름=”기타취미”>
<입력 유형=”제출” 값=”보내기”>
</FORM>
Form 컬렉션에 "OtherHobby"에 대한 항목이 생성됩니다. 그러나 세 개의 텍스트 상자의 값이 포함됩니다. 사용자가 제출할 때 하나 이상의 필드를 비워두면 반환되는 값은 빈 문자열입니다. 사용자가 각각 첫 번째 및 세 번째 텍스트 상자에 Gardening 및 Mountaineering을 입력하고 두 번째 텍스트 상자가 비어 있는 경우 ASP 코드에서 Request.Form("OtherHobby")에 액세스하면
Gardening
, ,Mountaineering
문자열이 반환됩니다.이 경우 단일 값에 액세스하려면 더 복잡한 코드를 사용할 수 있습니다.
For Each objItem In Request.Form
If Request.Form(objItem).Count >1 Then '이 항목에 둘 이상의 값이 있습니다. Response.Write objItem & “:<BR>”
intLoop의 경우 = 1 To Request.Form(objItem).Count
Response.Write “Subkey” & intLoop & “value = “& Request.Form(objItem) (intLoop) & “<BR>”
다음
또 다른
Response.Write objItem & “ = ” & Request.Form(objItem) & “<BR>”
종료 조건
Next
세 개의 OtherHobby 컨트롤이 포함된 이전 양식 인스턴스의 경우 다음이 반환됩니다.
OtherHobby:
하위 키 1 값 = 원예
하위 키 2 값 =
하위 키 3 값 = Mountaineering
그러나 여러 텍스트 상자에 동일한 이름을 지정하는 경우는 거의 없으므로 이 기술은 거의 사용되지 않습니다.
a) HTML의 라디오 또는 페이지 버튼 컨트롤
HTML에서 여러 컨트롤에 동일한 Name 속성을 부여해야 하는 상황은 라디오(또는 옵션) 버튼입니다. 예:
<FORM ACTION="show_request.asp" METHOD=" POST ">
나는 다음 지역에 살고 있습니다:
<입력 유형=”라디오” 이름=”국가” VALUE=”AM”>미국<BR>
<입력 유형=”라디오” 이름=”국가” VALUE=”EU”>유럽<BR>
<입력 유형=”라디오” 이름=”국가” VALUE=”AS”>아시아<BR>
<입력 유형=”제출” 값=”보내기”>
</FORM>
사용자는 여러 항목 중 하나만 선택할 수 있기 때문에(이것이 동일한 이름이 부여된 이유입니다) 반환 값은 하나만 얻을 수 있으며 브라우저는 선택한 컨트롤의 값만 보낼 수 있습니다. 따라서 이 양식의 사용자가 "Europez"를 선택한 경우 이 항목을 가져오고 해당 값은 양식 세트를 순회하여 가져옵니다.
국가 = EU
각 컨트롤에 대해 다른 VALUE 속성이 제공되므로 값을 반영합니다. 각 항목에 해당하는 국가 또는 지역의 이름입니다. VALUE 속성이 생략되면 브라우저는 "on" 값을 반환하므로 다음을 얻게 됩니다.
Country = on
이것은 자주 사용되지 않으므로 일반적으로 VALUE 속성은 동일한 이름을 가진 라디오 컨트롤에 사용됩니다.
b) HTML 체크박스 컨트롤
양식의 HTML 소스 코드에 체크박스 컨트롤이 포함된 경우 일반적으로 고유한 이름이 지정됩니다. 예:
<FORM ACTION="show_request.asp" METHOD="POST">
나는 즐긴다:
<INPUT TYPE=”CHECKBOX” NAME=”읽는 중” CHECKED> 읽는 중
<입력 유형=”CHECKBOX” NAME=”식사 중”>식사 중
<입력 유형=”CHECKBOX” 이름=”잠자기”> 잠자는 중
<입력 유형=”제출” 값=”보내기”>
</FORM>
이 경우 Form을 제출할 때 첫 번째와 세 번째 체크박스만 선택(표시)하면 Form 컬렉션을 순회할 때 다음과 같은 값을 얻게 됩니다.
Reading = on
Sleeping = on
그러나 각 확인란에 값을 제공하면 "on" 문자열 대신 이 값이 서버로 전송됩니다. 예를 들어 양식은 다음과 같습니다.
<FORM ACTION="show_request.asp" METHOD="POST">
나는 즐긴다:
<입력 유형=”CHECKBOX” VALUE=”Hobby025” NAME=”취미” 체크됨>_
수영
<입력 유형=”CHECKBOX” VALUE=”Hobby003” NAME=”취미” 체크됨>_
독서
<입력 유형=”CHECKBOX” VALUE=”Hobby068” NAME=”취미”>먹기
<입력 유형=”CHECKBOX” VALUE=”Hobby010” NAME=”취미”>수면
<입력 유형=”제출” 값=”보내기”>
</FORM>
세 번째 확인란을 제외한 모든 확인란을 제출하면 Request.Form 컬렉션에서 다음 결과가 생성됩니다.
Hobby = Hobby025, Hobby003, Hobby010
앞에서 언급한 대로 더 복잡한 컬렉션 순회 코드를 작성하는 경우(각 하위 키에 별도로 표시됨) , 다음과 같은 결과를 얻습니다.
취미:
하위 키 1 값 = Hobby025
하위 키 2 값 = Hobby003
하위 키 3 값 = Hobby010
두 가지 경우에 선택되지 않은 컨트롤은 어떤 값도 전혀 반환하지 않는다는 점에 유의해야 합니다. 첫 번째 경우의 결과에는 기만적인 쉼표가 없고, 두 번째 경우에도 null 값이 없습니다. 이는 위에서 설명한 텍스트 상자를 이용한 등가 테스트 결과와는 다릅니다. 텍스트 상자를 사용할 때 각 텍스트 상자는 값(빈 문자열 포함)을 반환합니다. 이는 브라우저로 인해 발생합니다. 따라서 ASP 코드에서 컬렉션에 액세스할 때 이 문제에 주의해야 합니다.
위 상황의 까다로운 부작용은 체크박스를 사용할 때 체크박스 값의 인덱스가 원본 HTML의 컨트롤 위치와 관계가 없다는 것입니다. 위 예에서 네 번째 체크박스의 하위 키 번호는 3입니다. 양식을 제출할 때 두 번째 컨트롤이 선택되지 않기 때문입니다.
c) HTML 목록 컨트롤
HTML의 <SELECT> 태그는 흥미로운 하이브리드 방식으로 값이 표시되는 표준 드롭다운 목록 상자를 생성하는 데 사용됩니다. 다음 양식은 사용자가 선택할 수 있는 5개의 값으로 생성됩니다. 여기에는 MULTIPLE 속성이 포함되어 있으므로 선택하는 동안 Shift 또는 Ctrl 키를 눌러 두 개 이상의 항목을 선택할 수 있습니다.
<양식 작업=”show_request.asp” 방법=”POST”>
<이름 선택=”취미” SIZE=”5” 다중>
<OPTION VALUE=”Hobby001”>프로그래밍</OPTION>
<OPTION VALUE=”Hobby025”>수영</OPTION>
<OPTION VALUE=”Hobby003”>독서</OPTION>
<OPTION VALUE=”Hobby068”>먹기</OPTION>
<OPTION VALUE=”Hobby010”>수면</OPTION>
</SELECT><P>
<입력 유형=”제출” 값=”보내기”>
</FORM>
는 쉼표로 구분된 선택된 값(단일 <OPTION> 태그에 지정된 VALUE 속성)을 포함하는 Form 컬렉션의 단일 항목을 반환합니다.
Hobby = Hobby025, Hobby003, Hobby010
인 경우 약간 더 복잡한 집합 탐색 코드(각 하위 키를 개별적으로 표시)를 사용하면 다음
과 같은 결과를 얻을 수 있습니다.
하위 키 1 값 = Hobby025
하위 키 2 값 = Hobby003
하위 키 3 값 = Hobby010
이는 동일한 이름의 체크박스에 대해 위와 동일한 상황입니다. 실제로 SELECT 목록은 해당 항목을 선택(체크하지 않음)하기 위한 확인란 목록으로 생각할 수 있습니다.
그러나 목록 상자에도 지정된 값이 있습니다. <OPTION> 태그에 VALUE 속성을 설정하면 Request.Form 세트에
Hobby = Swimming, 읽기, 수면
및 마찬가지로 더 복잡한 컬렉션 반복 코드는 다음과 같은 결과를 반환합니다.
취미:
하위 키 1 값 = 수영
하위 키 2 값 = 읽기
하위 키 3 값 = Sleeping
물론 단일 항목을 선택하고 <OPTION>에 VALUE 속성이 제공되면 결과에는
Hobby = Hobby025만 포함됩니다.
VALUE 속성이 제공되지 않으면 결과는
Hobby =
입니다.수영
이렇게 하면 지방(즉, VALUE 없음)이 옵션 텍스트를 표시하고 그에 따라 변경할 수도 있습니다. 후자의 경우는 (설명 문자열을) 표시하고 완전히 다른 콘텐츠를 전달하려는 경우(예: 설명 문자열을 나타내기 위해 짧은 코드를 사용하는 경우)와 같은 특정 상황에서 매우 유용합니다.
d) HTML 제출 및 이미지 컨트롤
확인란과 라디오 버튼은 선택하거나 선택하면 "켜짐"을 반환하는 부울 컨트롤의 예입니다. 텍스트 상자 및 대부분의 다른 HTML 컨트롤과 달리 브라우저에는 선택되지 않거나 선택된 컨트롤이 포함되지 않습니다. 선택되지 않았습니다.
HTML 버튼이라는 일반적으로 사용되는 또 다른 부울 컨트롤이 있습니다. <INPUT TYPE="SUBMIT">, <INPUT TYPE="RESET">, <INPUT TYPE="IMAGE">, <INPUT TYPE="BUTTON"> 및 <BUTTON>...</BUTTON> 유형 등이 있습니다.
BUTTON 유형 컨트롤은 양식에 직접적인 영향을 주지 않기 때문에 어떤 값도 반환하지 않습니다. 양식을 호출하는 데 사용되는 Submit 메소드를 사용하더라도 브라우저는 모든 요청에 BUTTON 유형 컨트롤의 값을 포함하지 않습니다. 마찬가지로 <INPUT TYPE="RESET"> 버튼의 값은 서버로 전송되지 않습니다.
그러나 SUBMIT 및 IMAGE 유형의 입력 버튼 컨트롤은 실제로 양식을 서버에 제출하고 해당 VALUE 속성에는 양식의 다른 컨트롤 값이 포함됩니다(HTML 정의에 NAME 속성이 포함되어 있는 경우). 예를 들어, 이 양식은 사용자가 프로세스를 단계별로 진행하거나 취소할 수 있는 마법사 유형 웹 애플리케이션의 일부일 수 있습니다.
<FORM ACTION="show_request.asp" METHOD="POST">
<입력 유형=”제출” 이름=”btn제출” 값=”다음”>
<입력 유형=”제출” 이름=”btn제출” 값=”이전”>
<입력 유형=”제출” 이름=”btn제출” 값=”취소”>
</FORM>
양식에는 여러 개의 SUBMIT 버튼을 포함할 수 있습니다. 이 경우 위에 표시된 대로 각 버튼에는 고유한 VALUE 속성이 지정되어야 합니다. 양식이 제출되면 Request.Form 컬렉션의 값을 순회하면 양식을 제출하기 위해 누른 버튼에 따라 값이 생성됩니다. 사용자가 "이전" 버튼을 누르면 다음이 표시됩니다.
btnSubmit = Previous
따라서 Request.Form 컬렉션을 쿼리하여 다음 표시 페이지를 결정할 수 있습니다. 예:
Select Case Request.Form("btnSubmit")
사례 "다음"
응답.리디렉션 "page_3.asp"
사례 "이전"
응답.리디렉션 "page_1.asp"
케이스 "취소"
응답.리디렉션 "main_menu.asp"
선택 종료
동시에 필요에 따라 각 버튼에 다른 NAME 속성을 사용할 수도 있습니다. 그리고 Form 컬렉션에 값이 포함된 컨트롤 이름을 선택합니다. 아래 이미지에 표시된 것처럼 컨트롤에 완전한 마크업이 없지만 그 대신 긴 텍스트 레이블이 뒤에 오는 상황에서 매우 유용합니다.
이 화면의 인터페이스는 다음 코드에 의해 생성됩니다:
<FORM ACTION="show_request.asp" METHOD="POST">
<B>지금 무엇을 하고 싶으신가요?</B><P>
<INPUT TYPE=”SUBMIT” NAME=”btnNext” VALUE= ”>다음 페이지로 가기<P>
<INPUT TYPE=”SUBMIT” NAME=”btnPrevious” Value=” ”> 이전 페이지로 돌아가기<P>
<INPUT TYPE=”SUBMIT” NAME=”btnCancel” VALUE=” ”>취소하고 메인 메뉴 페이지로 돌아가기<P>
</FORM>
ASP 페이지에서 데이터를 받은 후 버튼 이름으로 제공되는 값을 확인하여 어떤 버튼을 눌렀는지 확인할 수 있습니다.
If Len(Request.Form(“btnNext”)) Then Response.Redirect “page_3.asp”
If Len(Request.Form("btnPrevious")) Then Response.Redirect "page_1.asp"
If Len(Request.Form("btnCancel")) Then Response.Redirect "main_menu.asp"
이 작업은 키에 대한 ASP 컬렉션을 쿼리하고 키가 없으면 빈 문자열을 반환하는 것입니다. 즉, 두 번째 버튼(이전 페이지)을 누르면 Request.Form("btnNext")의 값은 빈 문자열이고, 길이가 0이 되어 에러가 발생하지 않습니다. 두 번째 단추를 누르면 Form 컬렉션 Request.Form("btnPrevious")에 있는 이 항목의 값은 " "이 되고 길이는 0보다 커집니다.
e) 요청 컬렉션 사용 효율성 향상
값을 다운로드하기 위해 ASP 컬렉션에 액세스하는 작업에는 관련 컬렉션에 대한 일련의 검색이 포함되어 로컬 변수에 액세스하는 것보다 훨씬 느리기 때문에 시간이 많이 걸리고 계산 집약적인 프로세스입니다. 따라서 페이지에서 컬렉션의 값을 여러 번 사용하려는 경우 해당 값을 지역 변수로 저장하는 것을 고려해야 합니다. 예:
strTitle = Request.Form("Title")
strFirstName = Request.Form("FirstName")
strLastName = Request.Form("성")
If Len(stTitle) 그러면 strTitle = strTitle & “ “
strFirstName = " "인 경우
StrFullName = strTitle & " " & strLastName
ElseIf Len(strFirstName) = 1 그러면
StrFullName = strTitle & strFirstName & “· “ & strLastName
또 다른
StrFullName = strTitle & strFirstName & " " & strLastName
End If
f) 모든 요청 컬렉션 검색
어떤 경우에는 값의 키 이름이 요청 컬렉션에 표시되지만 정확히 어떤 컬렉션인지는 알 수 없습니다. 예를 들어 여러 페이지(또는 페이지의 다른 섹션)가 동일한 ASP 스크립트에 값을 보내는 경우 해당 값은 Form 또는 QueryString 컬렉션에 나타날 수 있습니다.
값이 다른 컬렉션에 나타날 수 있는 이유를 보려면 다음 상황을 고려하십시오. <A> 하이퍼링크 요소를 사용하여 페이지가 요청됩니다. 이 경우 요청에 값을 추가하는 유일한 방법은 해당 값을 URL에 추가하는 것입니다. 그러나 동일한 값이 이미 다른 페이지의 <FORM>이나 동일한 페이지의 다른 부분에 나타날 수 있습니다.
...
<양식 작업=”process_page.asp” 방법=”POST”>
<입력 유형=”제출” 이름=”페이지” 값=”다음”>
<입력 유형=”제출” 이름=”페이지” 값=”이전”>
<입력 유형=”제출” 이름=”페이지” 값=”도움말”>
</양식>
...
...
도움이 필요하시면 <A HREF=”process_page.asp?page=Help”>도움말 페이지</A>로 이동하세요.
...
이 경우 양식에서 도움말 버튼을 누르면 Request.Form 컬렉션의 이름/값 쌍 "page=Help"가 전송됩니다. 그러나 <A> 하이퍼링크를 누르면 이름/값 "Page=Help"가 전송될 수도 있지만 이번에는 QueryString 컬렉션에 있습니다. 이 값에 액세스하려면 ASP 요청 개체의 특수 기능을 사용하십시오.
strPage = Request("page")
이는 첫 번째 일치하는 값의 이름을 찾을 때까지 전체 컬렉션(QueryString, Form, Cookies, ClientCertificate, ServerVariables)을 순서대로 검색합니다. 이렇게 하면 해당 컬렉션에 직접 액세스하는 것보다 효율성이 떨어지며 해당 값이 다른 컬렉션에 나타나지 않는다는 절대적 보장이 없으면 안전하지 않습니다.
예를 들어, 모든 쿼리에 나타나는 Request.ServerVariables 컬렉션에서 "SERVER_NAME"을 찾아 클라이언트의 요청을 이행하는 웹 서버의 이름을 수집할 수 있습니다. 그러나 다른 컬렉션에도 "server_name"이라는 값이 포함되어 있는 경우(키 이름은 대소문자를 구분하지 않음) Request("server_name")를 사용할 때 잘못된 결과를 얻게 됩니다. Reqeust.ServerVariables("server_name") 구문을 사용하면 오류를 추적하는 데 어려움을 겪습니다.
요약하자면, "모든 컬렉션 검색" 기술은 매우 주의해서 사용하고 다른 기술이 필요한 결과를 제공하지 않는 경우에만 사용하십시오.
g) 다른 컬렉션에 액세스
이 기사의 이 섹션에서는 아마도 가장 많이 사용되는 Form 컬렉션에 중점을 두었습니다. 그러나 이러한 모든 기술은 다른 개체에도 동일하게 적용할 수 있습니다. Request 개체(예: Form, QueryString, Cookies, ServerVariables 및 ClientCertificate) 컬렉션에서 제공하는 항목과 Response 개체에서 제공하는 쿠키(및 다른 개체에서 제공하는 컬렉션)를 포함합니다.
QueryString 컬렉션에 값을 입력하는 방법과 장점 및 단점을 간략하게 살펴보겠습니다. 그러나 두 쿠키 세트 모두 아래에 설명된 것처럼 쿠키를 더욱 편리하게 사용할 수 있는 추가 기능을 갖추고 있습니다.