2014년 11월 13일 목요일

[강좌#6]Web Form - 이벤트, 뷰스테이트[닷넷C#교육/ADO.NET강좌/ASP.NET교육잘하는곳/C#,ASP.NET교육추천/닷넷실무교육/.NET,C#/ADO.NET교육/닷넷학원/ASP.NET실무교육]

Web Form(2) 
  
 Web Form에서의 이벤트모델을 먼저 살펴 보면 클라이언트에서 어떤 버튼을 누르면 그 버튼의 Click이벤트가 발생하여 서버로 전송 됩니다. 서버에서는 Post 정보 구문 분석과정을 거친 후 적절한 이벤트 처리 메소드를 호출 합니다. 

 HTML 고유의 이벤트 

 HTML 고유 내장 이벤트로 클라이언트 이벤트로 브라우저에 의해 처리되는 이벤트 입니다. 종류는 onMouseUp, onMouseDown, onClick, onDblClick, onFocus, onSelect등등 이건 다 아시죠^^;;; 

<% @Page Language = "C#" %> 
<HTML>  
  <HEAD><title>HTML 고유의 이벤트</title></HEAD> 
  <body> 
    <form runat="server"> 
      <button id=Button1  
            onmouseover="this.style.backgroundColor='blue'"  
            onmouseout="this.style.backgroundColor='yellow'" 
            onclick = "alert('Hello World!')" > 버튼 </button> 
    </form> 
  </body> 
</HTML> 

[결과] 
  


Server Control Event 
 서버로 전송되어 처리 되는 이벤트로 웹서버 컨트롤에서는 특정 이벤트에 의해 폼이 다시 서버로 게시하는 것을 POSTBACK 이라 합니다. ViewState 는 자신의 .aspx 페이지와 개별 사용자를 위한 상태정보를 보관하고 있습니다. ViewState 컨테이너는 대량의 Data를 갖을 수는 있지만, 모든 request와 response의 다운로드량의 크기에 추가되므로 ViewState 의 크기를 관리하기 위해 세심한 고려가 있어야 합니다. 

 ViewState는 ASP.NET에 있는 새로운 컨테이너중의 하나로, 대부분의 사용자들이 알지 못하는 사이에 이미 사용하고 있는 것입니다. 모든 내장된 웹컨트롤들이 페이지 postback사이에 그들의 값을 유지하기 위하여 ViewState를 사용하기 때문인데 이것은 모두 내부에서 행해지므로, 대부분의 경우 이것에 대해 걱정할 필요가 없습니다. 그렇지만, 애플리케이션의 실행효율에 불이익을 가져오므로 이것을 잘 알아야 합니다. 

 컨트롤의 변경 이벤트가 발생하자 마자 자동으로 서버에 sunmit하기 위해서는 컨트롤.AutpPostBack을 true로 설정 하면 됩니다. 서버 컨트롤 이벤트에는 OnInit, OnLoad, Onunlead, OnClick, OnPrerender, Selectindexchange, Checkchanged, Textchange등등 여러가지들이 있습니다. 

 이벤트처리기는 이벤트 대리자(deligate)를 이용 합니다. 초기화 이벤트에 아래처럼 어떤 컨트롤에 대해 이벤트를 겁니다. 

private void InitializeComponent() { 
      this.TextBox1.TextChanged += new  
            System.EventHandler(this.TextBox1_TextChanged); //텍스트박스에서 값이 바뀔때의 이벤트를 델리게이트를 이용하여 정의 합니다. 
        this.RadioButtonList1.SelectedIndexChanged += new    
            System.EventHandler(this.RadioButtonList1_SelectedIndexChanged); 
        this.Load += new System.EventHandler(this.Page_Load); //폼로드 될때의 이벤트를 정의합니다. 즉 폼이 로드 될 때 Page_Load가 실행 됩니다. 이부분이 델리게이트를 이용하는 건데 궁굼하신 분들은 C# 강좌의 Delegate 부분을 확인 하기 바랍니다. 


@Page 지시자의 AutoEventWireup 속성이 true(기본값)로 되어 있는 경우엔 닷넷 프레임 웍에서 페이지 이벤트(Page_Init, Page_Load)를 자동으로 호출 합니다. 

Click 이벤트 
클라이언트측 OnClick이벤트 사용 형식은 아래와 같습니다. 

(1)Submit, HtmlInputButton 
Client Event발생 후 폼이 전송되고 서버 측 이벤트로  ServerClick이벤트(clientfunction())가 발생되어  Server event 를 처리합니다 

<INPUT Type="Submit" Runat="Server" Value="누르세요" onclick="clientfunction()" > 

(2)Button : Server Event 
컨트롤이 자동으로 페이지 전송, 서버측 click이벤트 처리 합니다. 
클라이언트 측 이벤트 처리 방법 : 런타임에 이벤트 특성을 컨트롤에 추가하여 처리 

Button1.Attributes.Add("onclick", "clientfunction();") 
Button1.Attributes["onclick“] = "clientfunction();”; 

[예제] 아래파일은 c:\inetpub\wwwroot에 a.aspx로 저장 합니다. 
<% @Page Language = "C#"%> 
<script runat="server"> 
  void btnOK_Click(object o, System.EventArgs args) 
  {      Label1.Text = "server event 발생!"; 
  } 
  void Page_Load() 
  { 
        Label1.Text = ""; 
  } 
</script> 
<html> 
<script Language="JavaScript"> 
  function btnClick(){ 
        alert('client event 발생!')  } 
</script> 
<body>  
    <form runat="server"> 
      <input type="button" id="Button1" value="눌러봐" onclick = "btnClick();" runat="server" > 
      <asp:Button id = "btnOK" runat="server" onclick="btnOK_Click" Text="확인"/> 
      <asp:Label id = "Label1" runat="server"/> 
    </form> 
</body> 
</html> 

[결과] 
  



Web Forms Page 상태관리 (서버 기반) 

 응용프로그램의 상태를 나타내는 HttpApplicationState에는 웹응용 프로그램에서 접근 할 수 있는 전역적인 저장의 형태이며 서버 라운드 트랩간이나 페이지 사이에 보관되어야 하는 상태를 저장 합니다. 보안에는 다소 취약 합니다. 

 세션의 상태를 나타내는 HttpSessionstate는 서버 라운드 트립 간 또는 페이지간에 유지해야 하는 세션 관련 정보를 저장하기 위한 것입니다. 개별 세션에 따라 달라지는 짧게 사용하는 데이터 값을 저장 하는 경우에 이용 되며 보안이 중요하지 않은 경우엔 이용 합니다. 


Web Form Page 상태 관리(클라이언트 기반) 

 페이지 저장 정보에 서버의 리소스를 사용 하지 않으며 보안기능이 최소화 되었으며 수핼 속도가 빠르지만 저장 하는 정보의 량이 제한적인 방법들 입니다. 


ViewState : 원래 위치에 다시 보여질 정보를 위해 소량의 정보를 저장 하는 경우에 사용 합니다. 기존의 웹개발에서는 어래의 히든 필드, 쿼리문자열 등을 이용해서 계속 가지고 다녀야 하는 정보를 보관 했습니다. 

Hidden Field : 의미는 ViewState와 다소 비슷합니다. 그러나 개발자가 일일이 코딩을 해주어야 합니다. 

Cookie : 클라이언트의 하드디스크에 소량의 정보를 저장하기 위해 사용하며 보안이 용이 하지 않습니다. 

QueryString : 한페이지에서 다른 페이지로 소량의 정보를 전달 시 이용 됩니다. 보안이 중요하지 않은 경우에 주로 이용 됩니다. 일일이 프로그래머의 코딩이 필요 합니다. 


웹폼에서 전송 간에 상태를 유지 하기 위해서는 주로 ViewState를 통해 현재 웹폼의 상태를 저장 하여 폼을 전송 하거나 이벤트가 발생 하는 시점에 ViewState가 서버로 전송 됩니다. 서버에서는 이벤트를 처리 한 후 다시 클라이언트로 정보를 보낼 때 ViewState를 다시 전송 하며 Page 객체의 IsPostBack 속성을 통하여 확인이 가능 합니다. Web Control의 AutoPostBack 속성이 true이면 이벤트 발생시 즉시 PostBack 됩니다. 

ViewState 

ViewState를 사용하면 페이지를 원래 위치에 다시 게시할 때 라운드 트립 간 고유의 페이지 관련 값을 저장할 수 있습니다. 예를 들어, 응용 프로그램이 사용자별 정보(페이지에서 사용되지만 컨트롤의 일부일 필요는 없는 정보)를 유지하는 경우 이를 뷰 상태에 저장할 수 있습니다. 

ViewState는 ASP.NET페이지에 의해 관리되는 Hidden컨트롤이라고 볼 수 있으며 페이지 간 숨겨진 필드로 유지 됩니다. (웹폼에서 소스 보기를 하면 보입니다.) 

<input type="hidden" name="__VIEWSTATE" value="dDwxNjQ5Mjk3MTMzO3Q8O2w8aTwxPjs+O2w8dDw7bDxpPDU+Oz47bDx0PHA8cDxsPFRleHQ7PjtsPHNlcnZlciBldmVudCDrsJzsg50hOz4+Oz47Oz47Pj47Pj47PkosW+Gta63e2UJwaDeR1eB1EyBD" /> 



전형적인 Web Form인 경우 직접적으로 ViewState를 다룰 필요는 거의 없으며 커스텀 컨트롤을 만들려면 ViewState의 작동 방식을 이해 하는 것이 좋습니다. 

장/단점은 다음과 같습니다. 

        장점 
        서버 리소스 불필요(페이지 코드 내의 구조에 포함) 
        구현의 용이하며 페이지 및 컨트롤 상태 자동 보존(Cient에 보관) 
        단점 
        보안에 취약(웹페이지의 소스 보기로 보임, 데이터 훼손 가능성, 숨겨진 필드에 포함된 정보를 볼 수 있으므로 보안 문제가 발생 가능) 
        렌더링될 때  직렬화(serialize)과정을 거치기 때문에 SerializableAttribute가 적용되는 데이터 타입으로 제한 
        ViewState는 페이지에 자체적으로 저장되므로 큰 값을 저장하면 사용자가 페이지를 표시하고 게시할 때 속도가 느려질 수 있습니다 
        

ViewState의 정보는 내부적으로 System.Web.UI.StateBag 개체를 사용하여 이름/값을 갖는 형태로 저장 됩니다. ViewState의 기능은 StateBag 클래스로서 제공 되는 것이며 ASP.NET에서는  이를 읽어 해석 할 수 있는 것입니다.  만일 어떤 데이터가 PostBack 간에유지 되어야 한다면 ASP에서는 쿠키, 세션 등을 이용했지만 .NET에서는 StateBag을 주로 사용 합니다. 

아래의 예를 봅니다. 

ViewState 속성에서 새 요소를 만들어 저장 합니다. 
ViewState["name"] = "jclee"; 

해당 이름을 지정하여 요소의 값에 접근 합니다. 
string sName; 
sName =(string)ViewState["name"]; 


[예제] 
<%@ Page Language="C#" %> 
<script runat="server"> 
  void Page_Load(){ 
      //맨 처음 페이지가 로드 되는 경우 
      if (!IsPostBack){ 
            ViewState["StartTime"] = DateTime.Now ;    
            lblMsg.Text = "처음 방문 시간: " + ViewState["StartTime"]; 
      } 
  } 
  void btnConfirm_Click(object sender, EventArgs e) { 
      lblMsg.Text = "마지막 방문 시간: " + DateTime.Now +  "<br>처음 방문 시간: " + ViewState["StartTime"]; 
  }      
</script> 
<html><body>  
  <form runat="server"> 
      <asp:Button id="btnConfirm" runat="server" Text="Confirm" onClick="btnConfirm_Click" /><br> 
      <asp:Label id="lblMsg" runat=server /> 
  </form> 
</body></html> 

[결과] 
  


 [개발실무100%환급외]빅데이터/하둡/몽고DB/SQL/자바/스프링/안… 오라클자바…12-272465
 [채용확정무료교육]오라클자바개발잘하는신입뽑기2개월과정,교육…오라클자바…12-111812
53 [평일100%환급7건]Spring,자바&JSP,안드로이드,웹퍼블리싱,C#닷… 오라클자바…03-151618
52 [주말]C#,ASP.NET마스터 오라클자바…01-311711
51 [기업100%환급,평일주간]SQL기초에서스키마오브젝트,PLSQL,힌트… 오라클자바…01-312405
50 [평일주간야간,주말]C기본&자료구조,알고리즘 오라클자바…01-311354
49 [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정-… 오라클자바…01-191654
48 [평일야간,주말]안드로이드개발자과정(Android기초실무) 오라클자바…01-111511
47 [평일야간,주말주간야간]JAVA,Network&JSP&Spring,MyBatis,Hiber… 오라클자바…01-032040
46 [개발실무100%환급외]빅데이터/하둡/몽고DB/SQL/자바/스프링/안… 오라클자바…12-272465
45 [평일주간]NoSQL,MongoDB,빅데이터기초과정 오라클자바…12-191771
44 [평일주간야간, 주말]웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX… 오라클자바…12-141746
43 [채용확정무료교육]오라클자바개발잘하는신입뽑기2개월과정,교육… 오라클자바…12-111812
42 [평일주간]빅데이터하둡기초과정(BigData Hadoop) 오라클자바…12-091414
41 [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 오라클자바…12-011643
40 [기업100%환급]오라클&자바웹스프링신입과정3주(SQL,JAVA,JSP,Se… 오라클자바…12-011821
39 [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) 오라클자바…12-011292

댓글 없음:

댓글 쓰기