Reqeust 객체
사용자가 웹 브라우저를 통해 웹 서버에 페이지를 요구할 때, 웹 브라우저는 웹 페이지를 실행하는데 필요한 모든 정보를 제공한다. 서버는 이들 정보를 Request 객체를 통해 얻는다.
아래의 표는 Request 객체의 주요 속성들을 정리한 것이다.
속성 | 설명 |
PhysicalApplicationPath | 사용자가 요구한 페이지의 물리적 경로 |
ApplicationPath | 물리적 디렉터리에 대응하는 가상 디렉터리 |
Path | 사용자가 요구한 페이지까지 포함하는 가상 경로 |
Url | 사용자가 요구한 전체 URL |
UserHostAddress | 사용자의 IP 주소 |
Browser | 사용자가 사용 중인 웹 브라우저에 대한 정보를 담고 있는 객체 |
Cookies | 컬렉션 객체로 사용자가 보낸 쿠키 정보를 저장 |
QueryString | GET 방식으로 전송된 페이지 매개변수를 저장 |
Response 객체
서버가 웹 브라우저에서 받은 사용자의 요청 정보가 Request 객체라면, 서버가 웹 브루어조에 보내는 처리 결과 일체를 Response 객체라고 한다. Response 객체의 주요 속성을 아래의 표와 같다.
속성 | 설명 |
ContentType | 사용자에게 보낼 HTML 페이지의 내용 형식을 지정하는 것으로, 표준 MIME 형식으로 표현 |
Cookies | 컬렉션 객체로 사용자에게 보낼 쿠키 정보 |
Buffer | 페이지 버퍼링 사용 여부 |
아래는 Response 클래스에 정의된 주요 메서드를 정의한 것이다.
메서드 | 설명 |
Write() | 사용자에게 보낼 HTML 페이지에 문자열 삽입 |
WriteFile() | 사용자에게 보낼 HTML 페이지에 파일 내용 삽입 |
Redirect() | 다르 페이지로 이동 |
페이지 버퍼링
Page 객체가 실행되면서 HTML 페이지가 만들어진다. 서버 컨트롤에 의해 또는 Response 객체의 메서드를 통해 만들어진 HTML 페이지는 버퍼에 저장된다. 버퍼에 저장된 HTML 페이지는 웹 폼의 실행이 끝나면 사용자에게 전송된다.
메서드 | 설명 |
Clear() | 현재 버퍼에 있는 내용 삭제 |
Flush() | 현재 버퍼에 있는 내용을 사용자에게 전송 |
End() | 현재 버퍼에 있는 내용을 사용자에게 전송하고 페이지 실행 종료 |
Response 객체 사용하기
실습을 통해 웹 페이지 이외의 파일을 이용하는 방법, Response 객체를 사용하는 방법, 도구 상자의 HTML 탭에서 HTML 서버 컨트롤을 드래그하여 웹 폼에 추가하는 방법 등을 익혀보자.
① 새 웹 폼 만들기
코드 숨김 파일 페이지 모델로 새 웹 페이지(웹 폼) 'CoffeeRecipe.aspx'를 만든다.
② 페이지 디자인
[나누기] 보기를 선택한 후, 다음 과정에 따라 페이지를 디자인한다.
- [디자인] 보기에 있는 div 태그 사각형 영역 안에 '커피 종류 선택 : '이라고 입력한다.
- 도구 상자의 HTML 탭에서 'Select' HTML 서버 컨트롤을 드래그하여 '커피 종류 선택 : ' 텍스트 옆에 놓는다.
- 한 칸을 띄운 후 도구 상자의 HTML 탭에서 'Input(Submit)' HTML 서버 컨트롤을 드래그하여 Select 컨트롤 옆에 놓는다.
- HTML 서버 컨트롤의 속성은 다음과 같다. 별색으로 표시한 속성을 Visual Studio의 속성 창을 통해 입력할 수 없으므로 직접 소스에 입력해야 한다.
<form id="CoffeeForm" runat="server">
<div>
커피 종류 선택 :
<select id="CoffeeType" runat="server">
<option></option>
</select>
<input id="ShowRecipe" type="submit" value="조리법 보기" OnServerClick="Show_ServerClick" runat="server" />
</div>
</form>
컨트롤 종류 | 속성 | 설정 |
Form | ID | CoffeeForm |
Select | ID | CoffeeType |
runat | server | |
Input(Submit) | ID | ShowRecipe |
Value | 조리법 보기 | |
OnServerClick | Show_ServerClick | |
runat | server |
③ 커피 조리 과정을 각각의 파일로 저장하기
이번 실습은 커피 조리 과정 각각을 하나의 텍스트 파일에 저장하고, 이를 사용하여 커피 조리법을 출력할 것이다. 커ㅓ피 조리법을 출력하는 코드 작성에 앞서 조리과정을 담고 있는 텍스트 파일을 다음과 같이 추가해보자.
- [솔루션 탐색기]에서 마우스 우클릭을 하면 나타나는 팝업 메뉴에서 추가 -> [ASP.NET 폴더 추가] -> [App_Data] 메뉴를 선택하여 App_Data 폴더를 추가한다.
- [App_Data] 폴더에 마우스 우클릭을 하면 나타나는 팝업 메뉴에서 [새 항목 추가 메뉴]를 선택한다. 일반을 선택하고 <텍스트 파일>을 선택하고 파일 이름을 입력한 후 [추가] 버튼을 클릭한다.
파일 이름 | 내용 |
0.txt | <li>종이컵에 커피를 2스푼 넣는다.</li> |
1.txt | <li>설탕을 2스푼 넣는다.</li> |
2.txt | <li>프림을 2스푼 넣는다.</li> |
3.txt | <li>물 100ml 정도 넣고 잘 저어준다.</li> |
④ 코드 숨김 파일 작성하기
① Page_Load 이벤트 처리기 작성하기
Page_Load 이벤트 처리기에서는 사용자가 선택할 수 있는 커피의 종류를 Select HTML 서버 컨트롤 항목에 추가한다. 다시 게시되는 PostBack 상황에서 항목을 다시 추가하지 않도록 PostBack 여부를 확인한다.
// CoffeeRecipe.aspx.cs 파일
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack) {
CoffeeType.Items.Clear();
CoffeeType.Items.Add(new ListItem("밀크 커피(설탕+프림)", "0"));
CoffeeType.Items.Add(new ListItem("프림 커피(프림)", "1"));
CoffeeType.Items.Add(new ListItem("설탕 커피(설탕)", "2"));
CoffeeType.Items.Add(new ListItem("블랙 커피", "3"));
}
}
② Show_ServerClick 이벤트 처리기 작성하기
[조리법 보기] 버튼이 클릭되어 처리되는 과정을 순서도로 표현하면 아래의 그림과 같다.
사용자가 요청한 페이지의 물리적 경로를 Request 객체에서 얻은 후 텍스트 파일이 있는 "App_Data" 폴더를 경로에 추가한다. 경로의 마지막에 "\"을 간단히 붙이기 위해 @ 문자를 사용하여 텍스트 파일의 물리 경로를 설정한다.
string filePath = Request.PhysicalApplicationPath + @"App_Data\";
Response 객체의 Write 메서드를 이용하여 순서가 있는 목록을 표현하는 <ol> 태그를 HTML 문서에 출력한다.
Response.Write("<ol">);
ListItem 객체를 이용하여 리스트 컨트롤에서 현재 선택된 항목을 얻어 사용자가 선택한 커피의 종류를 정수형으로 설정한다.
ListItem item = CoffeeType.Items[CoffeeType.SelectedIndex];
int coffeeType = int.Parse(item.Value);
텍스트 파일의 물리 경로에 파일 이름을 추가하고 HTML 문서로 파일 내용을 출력한다.
fileName = filePath + i + ".txt";
Response.WriteFile(fileName);
과정 3을 제외하고 과정 i와 정수로 표현된 커피의 종류와 &연산 결과가 1 또는 2면 버퍼의 내용을 지운다. 과정 0과 &연산하여 결과가 1또는 2가 나올 수 없으므로 과정 0은 언제나 출력된다. 설탕을 넣는 과정 1은 커피 종류 1(프림커피)과 &연산하여 결과가 1이 나오므로 버퍼의 내용(설탕을 넣는 과정)이 지워진다. 커피 종류 3(블랙 커피)의 경우는 과정 1에서나 과정 2에서 모두 &연산 결과가 1 또는 2가 되어 버퍼의 내용이 지워진다.
과정 | 연산된 타입의 결과 == 1 | 연산된 타입의 결과 == 2 | 결과 |
0(0000) | 0(0000) | 0(0000) | 출력 |
1(0001) | 1(0001) | 0(0000) | 미출력 |
2(0010) | 0(0000) | 1(0001) | 미출력 |
3(0011) | 1(0001) | 2(0010) | 미출력 |
설탕을 넣는 과정은 i=1, 프림 커피는 coffeeType=1이기 때문에 0001 & 0001의 연산 결과는 1이 나와 버퍼를 지운다.
프림을 넣는 과정은 i=2, 프림 커피는 coffeeType=1이기 때문에 0010 & 0001의 연산 결과는 0이 나와 버퍼를 지우지 않고 출력을 하게 되는 것이다.
if(i != 3 && ((i & coffeeType) == 1 || (i & coffeeType) == 2))
Response.Clear();
Response 객체의 Flush 메서드를 이용하여 매 순환마다 버퍼의 내용을 사용자에게 전송한다. 이렇게 하지 않으면 원하는 결과를 얻을 수 없다.
Response.Flush();
완성된 Show_ServerClick 이벤트 처리기는 다음과 같다.
/* CoffeeRecipe.aspx.cs 파일 */
protected void Show_ServerClick(object sender, EventArgs e) {
// 파일을 불러올 물리 경로 얻기
string filePath = Request.PhysicalApplicationPath + @"App_Data\";
string fileName = "";
Response.Write("<ol>");
// 선택한 항목으로 커피 종류 할당
ListItem item = CoffeeType.Items[CoffeeType.SelectedIndex];
int coffeeType = int.Parse(item.Value);
for (int i = 0; i < 4; i++) {
fileName = filePath + i + ".txt";
Response.WriteFile(fileName);
if (i != 3 && ((i & coffeeType) == 1 || (i & coffeeType) == 2))
Response.Clear();
Response.Flush();
}
Response.Write("</ol>");
}
'ASP.NET 4.0' 카테고리의 다른 글
[ASP.NET] Server 객체 (0) | 2021.12.29 |
---|---|
[ASP.NET] Redirection (0) | 2021.12.29 |
[ASP.NET] Page 클래스 속성 (0) | 2021.12.28 |
[ASP.NET] 웹 폼의 동작 원리(GET·POST 방식) (0) | 2021.12.28 |
[ASP.NET] 객체 지향 프로그래밍 (2) (0) | 2021.12.28 |
댓글