posted by 방랑군 2012. 1. 4. 04:32
출처 :

http://weblogs.asp.net/navaidakhtar/archive/2008/07/08/converting-data-table-dataset-into-json-string.aspx

 

Converting Data Table / Dataset Into JSON String

JSON (Java Script Object Notation), is a light weight, easily understandable to read and write string. It is also easily parse-able by machine.

JSON is introduced on two structues

A collection (key/value pair)

And ordered list of values.

I have not covered this topic in detail. Detailed analysis is stated on http://www.json.org/.

I am presenting a helper function (in C#) fordevelopers for fast parsing on datatable / dataset into JSON String,and access it on client-side.

public static string GetJSONString(DataTable Dt)

{

string[] StrDc = new string[Dt.Columns.Count];

string HeadStr = string.Empty;

for (int i = 0; i < Dt.Columns.Count; i++)

{

StrDc[i] = Dt.Columns[i].Caption;

HeadStr += "\"" + StrDc[i] + "\" : \"" + StrDc[i] + i.ToString() + "¾" + "\",";

}

HeadStr = HeadStr.Substring(0, HeadStr.Length - 1);

StringBuilder Sb = new StringBuilder();

Sb.Append("{\"" + Dt.TableName + "\" : [");

for (int i = 0; i < Dt.Rows.Count; i++)

{

string TempStr = HeadStr;

Sb.Append("{");

for (int j = 0; j < Dt.Columns.Count; j++)

{

TempStr = TempStr.Replace(Dt.Columns[j] + j.ToString() + "¾", Dt.Rows[i][j].ToString());

}

Sb.Append(TempStr + "},");

}

Sb = new StringBuilder(Sb.ToString().Substring(0, Sb.ToString().Length - 1));

Sb.Append("]};");

return Sb.ToString();

}

Here, Dt is the datatable, and it returns JSON formatted string.

For detailed porcedure on how to access this string on client side, please refer to this link Exposing Webservices to Client-Side because I don't like to do task repetition.

Please donot forget to convert to JSON string to JSON Object using

var JObject = eval('(' + JSONString + ')');

in Javascript JObject have all characteristics of JSON object, through which you can Use JObject by iterrating or what so ever.

e.g., you can use your JObject as

for(var i = 0; i < JObject .Employees.length; i++)

{

var val1 = JObject.Employees[i].EmployeeID;

var val2 = JObject.Employees[i].NationalIDNumber;

var val3 = JObject.Employees[i].Title;

var val4 = JObject.Employees[i].BirthDate;

var val5 = JObject .Employees[i].HireDate ;

}

Please note that I am querieng data from AdventurWorksDB SQL Sample Database (Table: Employee).

I hope this article will be helpful for you.

Any Questions / Queries ??

Regards,

Naveed Akhtar




'PP > JSON' 카테고리의 다른 글

JSON 의 eval() 함수 사용의 문제  (0) 2012.01.09
JSON Text를 JSON Object로 변환하기  (0) 2012.01.09
Json / JQuery (Ajax)/ Asp.net 3가지를 연동하여 데이터 가져오기  (0) 2012.01.07
JSON 개요 및 예제  (0) 2012.01.04
JSON.NET  (0) 2012.01.04
posted by 방랑군 2012. 1. 4. 04:30
http://json.codeplex.com/

 
DataSet <-> Json 파일

최근 이슈가 되고 있는 Json(Javascript Object Notation)은 텍스트 타입의 데이터 처리 방식에 있어서 XML을 대체할 만한 또 다른 형태이다.

장점이라면 XML DOM 호출에 비해 처리 속도가 뛰어나며, Cross-site Domian에서도 사용이 가능하다.

 

현재 관리하고 있는 사이트를 좀 더 가볍게 하기 위해 기존 XML이나 DataSet의 형태를 Json으로 작업하기 위해 관련 자료를 찾아보던 중

Codeplex에서 소개하고 있는 Json.NET framework을 사용해 보았다...

 

        public string Serialize(object value)
        {
            Type type = value.GetType();

            JsonSerializer json = new JsonSerializer();

            json.NullValueHandling = NullValueHandling.Ignore;

            json.ObjectCreationHandling = ObjectCreationHandling.Replace;
            json.MissingMemberHandling = MissingMemberHandling.Ignore;
            json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

 

            if (type == typeof(DataRow))
                json.Converters.Add(new DataRowConverter());
            else if (type == typeof(DataTable))
                json.Converters.Add(new DataTableConverter());
            else if (type == typeof(DataSet))
                json.Converters.Add(new DataSetConverter());

 

            StringWriter sw = new StringWriter();
            JsonTextWriter writer = new JsonTextWriter(sw);
            if (this.FormatJsonOutput)
                writer.Formatting = Formatting.Indented;
            else
                writer.Formatting = Formatting.None;

 

            writer.QuoteChar = '"';
            json.Serialize(writer, value);

 

            string output = sw.ToString();
            writer.Close();
            sw.Close();

 

            return output;
        }

        public object Deserialize(string jsonText, Type valueType)
        {
            JsonSerializer json = new JsonSerializer();

 

            json.NullValueHandling = NullValueHandling.Ignore;
            json.ObjectCreationHandling = ObjectCreationHandling.Replace;
            json.MissingMemberHandling = MissingMemberHandling.Ignore;
            json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

 

            StringReader sr = new StringReader(jsonText);
            JsonTextReader reader = new JsonTextReader(sr);
            object result = json.Deserialize(reader, valueType);
            reader.Close();

 

            return result;
        }

 

 

위 두개의 Method는 테이터 타입의 정보를 Json 형태로 변환이 가능하다.

예로 DataSet의 데이터를 Json으로 변환해 보자..

 public void SetJson()

{

    string JsonFileNM = "Test_JsonFile.jsf";

    string JsonString = string.Empty;

    DataSet ds =  null;

 

    ds = Test.GetData(...);

    JsonString = Serialize(ds);

     ....

     //*******************//

     // JsonFileNM로 파일 저장  //

     //*******************//

 ...

}

 

public DataSet GetJson(Sstring jsonText)

{

    DataSet ds = (DataSet)Deserialize(jsonText, typeof(DataSet)));

    return ds;

}

 

Json.NET framework의 특징은 다음과 같다.

-Flexible JSON serializer to convert .NET objects to JSON and back again
-LINQ to JSON for reading and writing JSON
-Writes indented, easy to read JSON
-Convert JSON to and from XML
-Supports Silverlight and Windows Phone

 

CodePlex에서 관련 소스를 download가 가능하다.

http://json.codeplex.com/

http://www.west-wind.com/Weblog/posts/471835.aspx

posted by 방랑군 2012. 1. 4. 04:24
출처 :  http://fallove.blog.me/70101916122

최근 이슈가 되고 있는 Json(Javascript Object Notation)은 텍스트 타입의 데이터 처리 방식에 있어서 XML을 대체할 만한 또 다른 형태이다.

장점이라면 XML DOM 호출에 비해 처리 속도가 뛰어나며, Cross-site Domian에서도 사용이 가능하다.

 

현재 관리하고 있는 사이트를 좀 더 가볍게 하기 위해 기존 XML이나 DataSet의 형태를 Json으로 작업하기 위해 관련 자료를 찾아보던 중

Codeplex에서 소개하고 있는 Json.NET framework을 사용해 보았다...

 

        public string Serialize(object value)
        {
            Type type = value.GetType();

            JsonSerializer json = new JsonSerializer();

            json.NullValueHandling = NullValueHandling.Ignore;

            json.ObjectCreationHandling = ObjectCreationHandling.Replace;
            json.MissingMemberHandling = MissingMemberHandling.Ignore;
            json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

 

            if (type == typeof(DataRow))
                json.Converters.Add(new DataRowConverter());
            else if (type == typeof(DataTable))
                json.Converters.Add(new DataTableConverter());
            else if (type == typeof(DataSet))
                json.Converters.Add(new DataSetConverter());

 

            StringWriter sw = new StringWriter();
            JsonTextWriter writer = new JsonTextWriter(sw);
            if (this.FormatJsonOutput)
                writer.Formatting = Formatting.Indented;
            else
                writer.Formatting = Formatting.None;

 

            writer.QuoteChar = '"';
            json.Serialize(writer, value);

 

            string output = sw.ToString();
            writer.Close();
            sw.Close();

 

            return output;
        }

        public object Deserialize(string jsonText, Type valueType)
        {
            JsonSerializer json = new JsonSerializer();

 

            json.NullValueHandling = NullValueHandling.Ignore;
            json.ObjectCreationHandling = ObjectCreationHandling.Replace;
            json.MissingMemberHandling = MissingMemberHandling.Ignore;
            json.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

 

            StringReader sr = new StringReader(jsonText);
            JsonTextReader reader = new JsonTextReader(sr);
            object result = json.Deserialize(reader, valueType);
            reader.Close();

 

            return result;
        }

 

 

위 두개의 Method는 테이터 타입의 정보를 Json 형태로 변환이 가능하다.

예로 DataSet의 데이터를 Json으로 변환해 보자..

 public void SetJson()

{

    string JsonFileNM = "Test_JsonFile.jsf";

    string JsonString = string.Empty;

    DataSet ds =  null;

 

    ds = Test.GetData(...);

    JsonString = Serialize(ds);

     ....

     //*******************//

     // JsonFileNM로 파일 저장  //

     //*******************//

 ...

}

 

public DataSet GetJson(Sstring jsonText)

{

    DataSet ds = (DataSet)Deserialize(jsonText, typeof(DataSet)));

    return ds;

}

 

Json.NET framework의 특징은 다음과 같다.

-Flexible JSON serializer to convert .NET objects to JSON and back again
-LINQ to JSON for reading and writing JSON
-Writes indented, easy to read JSON
-Convert JSON to and from XML
-Supports Silverlight and Windows Phone

 

CodePlex에서 관련 소스를 download가 가능하다.

http://json.codeplex.com/

http://www.west-wind.com/Weblog/posts/471835.aspx

 
posted by 방랑군 2012. 1. 4. 04:02
jQuery로 Textbox에 값을 가져오고 채우기 위해서는 .val() 함수를 이용한다.


1. 채우기
jQuery("#textbox id").val("abcd");

2. 가져오기
jQuery("#textbox id").val(); 

출처 : http://blog.naver.com/tjjoker?Redirect=Log&logNo=100121652807

ASP.NET 컨트롤 ID제어하기 

============================================================

참고 : * jQuery JavaScript Library v1.4.4
 * http://jquery.com/

내용 : $("[id$='subject']").eq(1)  사용법 인지

 
 $(#"아이디풀네임") 을 적어서 접근을 하지만,

 id$='아이디일부명' 으로 접근이 가능하다.  단 이름이 AA 면  1_AA 등은 가능하지만 AA_ 식으로는 안된다는것이다.

즉, *AA는 되지만 AA* 는 같은 이름으로 인지를 못한다.

일단 같은이름으로 인지가 되면, jQuery은 .eq(인덱스) 를 통해 해당 컨트롤에 접근이 가능하다.

 

 

 

[참고] 컨트롤 존재여부 판단

$("[id$='chk_ItemId']").length 식으로 length 를 하면 없는 객체도 0으로 반환을하므로

존재 여부 판단 가능하다.

======================================================================================

<%@ Page Language="C#" %>

<script src="/jQuery/jquery.js" type="text/javascript"></script>
 

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>제목 없음</title>
<script type="text/javascript">
    
    // TEST일 :  2011 - 02 - 09
    // 참고 URL http://cafe.naver.com/jquerymytour.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=64
     function test()
     {     
        //id$='형식으로 적으면' 해당 리스트가 속해있는 이름들을 찾는다. 
        
        //1.서버 텍스트 박스 값 가져오기 
        alert("1. 서버 텍스트 박스 값 >>" +$("[id$='_subject']").val());
        
        //2. 서버 텍스트 박스 값 변경
        $("[id$='_subject']").val("변경"); // 2개다 변경됨 (txt_subject1 변화없음) 
        // _subject2 면 제외댐, 앞은 아무거나 상관없음. 뒤에가 동일한 이름인 모든것을 검색함 ,동일한이름은 배열로저장되어접근가능
        
        //////////////////////////////////////////////////////////////////              
        
        alert("2. 서버 텍스트 박스 값 >>" +$("[id$='_1_TextBox']").val());// _1_TextBox 의값 
        alert("3. 서버 텍스트 박스 값- 배열 1번째값  >>" +$("[id$='_TextBox']").eq(0).val())
        alert("4. 서버 텍스트 박스 값- 배열 2번째값 >>" +$("[id$='_TextBox']").eq(1).val())
        
        //////////////////////////////////////////////////////////////////              
        alert("5. 서버 텍스트 박스 값- 배열 2번째값  >>" +$("[id$='subject']").eq(1).val()) //변경나옴
        alert("6. 서버 텍스트 박스 값- 배열 3번째값>>" +$("[id$='subject']").eq(2).val()) //undefined 나옴 (txt_subject1은 배열로 인식이안됨)
        alert("7. 서버 텍스트 박스 값- 배열 0번째값  >>" +$("[id$='subject']").val() + "=" + $("[id$='subject']").eq(0).val())
        
        var a = $("[id$='subject']");
        alert("배열갯수" + a.length);
        
        // $("#<%=txt_subject.ClientID%>").val();로 작업해도 무방
     }
        </script>
        
</head>
<body>
    <form id="form1" runat="server">

    <asp:Button ID="Button1" OnClientClick="test()"  runat = "server"/>
    s<br />
    <asp:TextBox ID="txt_subject" runat="server"  class="intstyle1" style="width:310px;" ></asp:TextBox>
    <asp:TextBox ID="tx2t_subject" runat="server"  class="intstyle1" style="width:310px;" ></asp:TextBox>
    <asp:TextBox ID="txt_subject1" runat="server"  class="intstyle1" style="width:310px;" Text = "아무변화없음" ></asp:TextBox>
    <br />
    <asp:TextBox ID="_1_TextBox"  runat="server"  class="intstyle1" style="width:310px;" Text = "1" ></asp:TextBox>
    <asp:TextBox ID="_2_TextBox" runat="server"  class="intstyle1" style="width:310px;" Text = "2"></asp:TextBox>
    
    </form>
</body>
</html>

 

'PP > Jquery' 카테고리의 다른 글

[Jquery,CoffeeScript] 모질라 파이어폭스 Ajax. 한글 키 이벤트 처리.  (0) 2012.01.08
jQuery UI 테스트 2  (0) 2012.01.08
jQuery 이벤트 테스트 2  (0) 2012.01.08
jQuery 이벤트 테스트 1  (0) 2012.01.08
jQuery UI 테스트 2  (1) 2012.01.08
posted by 방랑군 2012. 1. 4. 03:12
출처 : http://yyman.tistory.com/232

오늘 새벽에 올린 '[ASP.NET] 웹 서비스 구현 하기(Ajax) - Javascript로 호출 - Hello World'에 이어서 JQuery(JSON)을 이용하여 데이터를 가져오는 방법에 대해 소개하겠습니다.

[보충 자료]

그 전에 앞서 이전에 소개해드린 강좌에서 빠진 내용을 하나 소개하겠습니다.
매개 변수입니다.

function chHelloWorld2() {
WebApplication1.WebService1.HelloWorld2($get("txtName").value, OnSuccess);
}

이 부분에서 $get("txtName").value, OnSuccess가 있습니다.

Web Service에서 실제로 구현된 코드는 아래와 같습니다.

[WebMethod]
public string HelloWorld2(string s1)
{
return "Hello World" + s1;
}

자바 스크립트 부분을 보충하자면 아래와 같이 정의할 수 있겠습니다.
네임스페이스.클래스.함수(매개 변수1, 매개 변수2, …, 매개 변수n, OnSuccess, OnFailure)
(Parameters: ControlId,Method name,Parameter1,Parameter2...n,CallbackMethod)



두 개의 입력을 받아서 출력하려면 웹 서비스를 다음과 같이 수정할 수 있습니다.

[WebMethod]
public string HelloWorld2(string s1, string2)
{
return "Hello World" + s1;
}

물론 클라이언트 부분에서도 수정해줘야 합니다.
Input(HTML 사용자 컨트롤)이 txtName1, txtName2라고 가정합니다.

function chHelloWorld2() {
WebApplication1.WebService1.HelloWorld2($get("txtName1").value, $get("txtName2").value, OnSuccess);
}



본론) JSON을 이용한 데이터 받기



위의 예제처럼 Alert을 이용하여 출력하는 예제입니다.

1. 솔루션 구성



WebService1.asmx과 index.aspx은 Visual Studio에서 생성할 수 있지만, 나머지 이상한 파일들은 별도로 내려받아야 합니다.


Jquery 홈페이지(http://www.jquery.com)에서 내려받으실 수 있습니다. 귀찮으신 분들은 첨부된 파일을 내려받으시면 됩니다.

2. WebService1.asmx 설정 하기

[WebService1.asmx.cs]


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace WebApplication1
{
/// <summary>
/// WebService1의 요약 설명입니다.
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// ASP.NET AJAX를 사용하여 스크립트에서 이 웹 서비스를 호출하려면 다음 줄의 주석 처리를 제거합니다.
[System.Web.Script.Services.ScriptService]
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld3(string s1, string s2)
{
return s1 + " " + s2;
}
}
}


[WebService1.asmx]

<%@ WebService Language="C#" CodeBehind="WebService1.asmx.cs" Class="WebApplication1.WebService1" %>

3. Index.aspx 파일 설정 하기

[index.aspx]


<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="WebApplication1.index" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="js/jquery-1.4.4.min.js" type="text/javascript">
</script>
<script src="js/jquery-ui-1.8.8.custom.min.js" type="text/javascript">
</script>

<script language="javascript" type="text/javascript">
function HelloQuery() {
$.ajax({
type: "POST",
url: "
http://localhost:50000/WebService1.asmx/HelloWorld3",
data: '{"s1":"' + $get("txtName1").value + '", "s2":"' + $get("txtName2").value + '"}',
processData: false,
contentType: "Application/json; charset=utf-8",
dataType: "json",
success: function (data) {
alert(data.d);
}
});
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<input name="txtName1" id="txtName1" type="text" />
<input name="txtName2" id="txtName2" type="text" />
<a href="#" onclick="HelloQuery()">TEST</a>
</div>
<asp:ScriptManager runat="server">
<Services>
<asp:ServiceReference Path="~/WebService1.asmx" />
</Services>
</asp:ScriptManager>
</form>
</body>
</html>

http://localhost:50000/WebService1.asmx/HelloWorld3

선언된 파일의 주소를 모르시면 본인이 만드신 ASMX파일을 접속하셔서 확인하셔도 됩니다.

* 구문 확대해서 살펴보기

data: '{"s1":"' + $get("txtName1").value + '", "s2":"' + $get("txtName2").value + '"}',


data : ' { " 매개변수1 " : " ' + $get("클라이언트 input name 값").value + ' " ,
" 매개변수2 " : " ' + $get("클라이언트 input name 값").value + ' " ,


" 매개변수n " : " ' + $get("클라이언트 input name 값").value + ' " } '


ex) 매개 변수가 하나일 때

data:'{"s1":"' + $get("클라이언트 input name 값").value + '"}'



사용자 환경에 맞게 적절히 연구하시어 잘 사용하시기 바라는 마음으로 글을 정리해봅니다.
글을 정리하면서 느낀 것은 Visual Studio.NET에 맞게 설계된 것과 공개 소스에 맞게 설계된 것의 차이는 엄청난 자본의 투입으로 말미암아 편리한 것이지만, 한 소프트웨어 환경에서 구현해야만 하는 불편한 점이 있습니다.
이식성은 Jquery 아저씨가 확실히 좋습니다.
아무쪼록 Jquery를 활용하는 것과 웹 서비스의 Hello World 강좌를 이것으로 정리합니다.



참고 자료) http://alexandershapovalov.com/how-to-call-wcf-services-from-javascript-jquery-and-aspnet-ajax-39/ 
posted by 방랑군 2012. 1. 4. 02:57
출처 :  http://blog.naver.com/websiteman?Redirect=Log&logNo=40132506449

문제점 :

페이스북처럼 ajax를 이용한 실시간 파일 업로드를 구현하고 싶다.

jQuery Plugin을 이용해서 파일업로드 및 멀티 파일 업로드를 구현해 보자.

 

 

해결방법 :

1. 첨부파일을 다운받아 설치한다.

  - demo2.php (기본데모)

  - demo.php (기본데모 + 멀티파일 업로드)

 

2. 설치하고 접속해 보자.

<demo2.php>

 

<demo.php>

 

3. 파일 업로드를 하게 되면 파일은 uploads 디렉토리에 쌓이는데 설정에 의해 위치를 바꿀 수 있다.

 

4. 소스는 아주 간단하다. 나머지는 Plugin에서 처리한다.

  - 옵션을 추가하거나 변경하여 필요한데로 custmizing해서 사용하면 되겠다.

<script type="text/javascript">
$(document).ready(function() {
  $('#file_upload').uploadify({
    'uploader'  : 'uploadify.swf',
    'script'    : 'uploadify.php',
    'cancelImg' : 'cancel.png',
    'folder'    : 'uploads',
    'auto'      : true
  });
});
</script>

 

논의 :

1. Uploadify라는 Plugin을 활용한다.

  - 홈페이지 : http://www.uploadify.com/

  - jQuery, php, 플래시(swf)를 이용하여 멀티파일 선택 기능 등을 제공하고 있다.

2. 추가적인 설정 사항에 관해서는 documentation 페이지를 참조하자.

  - http://www.uploadify.com/documentation/

  - Options, Methods, Events 등 다양한 설정을 통해 원하는 데로 파일 업로드를 만들수 있다.

 

'PP > Upload' 카테고리의 다른 글

uploadify  (0) 2012.01.06
posted by 방랑군 2012. 1. 4. 02:45

출처 : http://blog.naver.com/saltynut/

Generic

 

드디어 C#과 VB.NET에 Generic이 적용되었습니다!  '드디어'라고 하니 마치 대단한 것처럼 생각이 되지만, 사실 C++ 프로그래머들이 템플릿 기능이 없다는 것으로 하도 난리법석(?)을 떤 탓에..

우선 Generic이 대체 어디에 쓰는 물건인지부터 알아봐야겠죠?

가장 간단하게, 유식하게 말하자면.. 'Type independent한 코드를 작성하게 해준다'라는 것입니다.

무슨 말인가 하면.. 통상 개발을 하다보면.. 특히 라이브러리 같은 것을 작성하다보면..

여러 타입을 지정할 수 있도록 필드, 파라미터, 리턴 타입 등을 object로 쓰는 경우가 많습니다.

예를 들면 다음과 같습니다.

 

using System.Collections;

 
// Employees 개체를 담을 Stack
Stack employees = new Stack();
// Push 메서드의 매개변수는 object 형이므로, 암시적 형 변환이 일어남
employees.Push( new Employee() );
// Pop 메서드의 리턴 타입은 object 형이므로, 명시적 형 변환을 해야 함
Employee employee = (Employee) employees.Pop();
 
뭐, 위 경우야 일단 별다른 문제가 있는 것은 아닙니다. 하지만 다음 코드는 좀 심각하지요.
 
// Integer를 담을 Stack
Stack sizes = new Stack();
// Box
sizes.Push( 42 );
// Unbox
int size1 = (int) sizes.Pop();
// Integer만 들어가야 하지만.. 어쨌든 컴파일 시는 OK
sizes.Push( 77 );
sizes.Push( new Employee() );
// 역시 컴파일은 되지만, Pop 시키는 것이 Employee 형일 경우..
// InvalidCastException이 발생한다.
int size2 = (int) sizes.Pop();
 
으음.. 이건 문제가 좀 있지요?
이런 경우에 발생가능한 문제점, 단점들에 대해서 정리해보자면..
* 컴파일 시에 타입 체킹이 불가능하므로, 임의의 타입을 집어넣어도 확인할 길이 없습니다.
* value type을 사용할 때, 박싱, 언박싱이 일어납니다.
* ref type일 때도, 런타임 타입 체킹이 계속 일어나며, 형 변환이 필요하므로 오버헤드가 생깁니다.
 
Generic은 이런 문제점을 해결하기 위해 나온 녀석입니다. 백문이 불여일견이라고, 위의 코드를 Generic을 적용해 보도록 하겠습니다.
 
using System.Collections.Generic;
 
Stack< Employee > employees = new Stack< Employee >();
 
// Push 메서드 매개변수가 Employee 형이므로, 형 변환이 필요없음
employees.Push( new Employee() );
// Pop 메서드가 Employee 형을 리턴하므로, 형 변환이 필요없음
Employee employee = employees.Pop();
 
흐음.. 뭔가 좀 좋아진 것 같지요?
아까 좀 심각하다고 했던 코드는 어떻게 되는지 봅시다.
 
Stack< int > sizes = new Stack< int >();
// No boxing
sizes.Push( 42 );
// No unboxing
int size1 = sizes.Pop();
sizes.Push( 77 );
// 아래 코드는 컴파일 시 에러가 발생한다. 
sizes.Push( new Employee() );
// 이제 안심하고 써도 됨 (리턴 타입이 항상 int일테니..)
int size2 = sizes.Pop();
 
자.. 보다시피 < > 안에 특정 타입을 지정해서 코드 템플릿을 만들 수 있게 해줍니다.
그렇게 해서, 특정한 타입만이 사용되도록 보장해주는 것이죠.
이 기능은 C++에서는 템플릿이라고 불리며, Eiffel, Ada와 같은 다른 언어들에서는 Generic이라 불립니다. (대세를 따라서 C#, VB.NET은 후자를 택한 것 같네요.)
Generic은 클래스, 구조체, 인터페이스, 메서드, 대리자(delegate) 등 다양하게 만들 수 있습니다.
 
Generic 사용 시의 장점은..
* 컴파일 타입 체킹을 좀 더 빡세게(?) 수행할 수 있습니다.
* 불필요한 런타임 타입 체킹, 박싱, 언박싱을 줄일 수 있습니다.
* 명시적으로 형 변환을 하지 않아도 됩니다.
* 좀 더 깔끔하고, 빠르고, 안전한 코드를 작성할 수 있습니다.
 
장점을 좀 더 팍팍 와 닿게 하기 위해서.. 다음 그림을 통해 비교해 보죠.
 
왼쪽의 Generic을 사용하지 않은 경우와 오른쪽의 사용하는 경우를 볼 때 어느게 더 복잡해 보이는지요? Generic을 사용하는 것이 훨씬 더 깔끔하다는 것을 알 수 있습니다.
 
자, 그러면 이렇게 Generic을 지원하는 클래스는 어떻게 작성할까요? 예를 들어, 위의 스타일처럼 지원하도록 MyStack이라는 클래스를 작성해보도록 하겠습니다.
 
// Generic MyStack 클래스
public class MyStack< T >
{
   private T[] frames;
   private int pointer = 0;
   public MyStack( int size )
   {
      frames = new T[ size ];
   }
   public void Push( T frame )
   {
      frames[ pointer++ ] =
         frame;
   }
 
   public T Pop()
   {
      return
         frames[ --pointer ];
   }
}
 
대충 감이 잡히시겠지만, 클래스 명 뒤에 < >를 붙이고.. 그 안에 T라고 썼습니다.
이 T는 임의의 템플릿 타입 파라미터(Template Type Parameter)이므로, 이름은 무엇으로 변경해도 상관없습니다. 클래스 내의 메서드 구현 시 T를 사용하고 있는 것에 주의하시기 바랍니다.
 
아래는 위 클래스를 사용하는 예제입니다.
 
// 사용 예제
MyStack< int > s = new MyStack< int >( 7 );
 
// 0~6까지를 Stack에 집어넣음
for ( int f = 0; f < 7; ++f )
   s.Push( f );
 
// '6 5 4 3 2 1 0 ' 을 출력
for ( int f = 0; f < 7; ++f )
   Console.Write( s.Pop() + " " );
아참.. VB.NET에서는 어떻게 하냐구요? 다음과 같이 (Of T) 형태의 구문을 사용합니다.
 
' Generic MyStack 클래스
Public Class MyStack(Of T)
   Private frames As T()
   Private pointer As Integer = 0
 
   Public Sub New( ByVal size As Integer)
      frames = New T(size) {}
   End Sub
 
   Public Sub Push( ByVal frame As T)
      frames(pointer) = frame
      pointer += 1
   End Sub
 
   Public Function Pop() As T
      pointer -= 1
      Return frames(pointer)
   End Function
End Class
 
' 사용 예제
Dim s As New MyStack(Of Integer)(7)
 
' 0~6까지를 Stack에 집어넣음
For f As Integer = 0 To 6
   s.Push(f)
Next f
 
' '6 5 4 3 2 1 0 ' 을 출력
For f As Integer = 0 To 6
   Console.Write( s.Pop().ToString())
Next f
자.. 그러면 위의 템플릿 타입 파라미터.. T를 아무 타입이나 못하게 제약을 걸 수는 없을까요?
물론 가능합니다. Generic에서는 where  키워드를 사용하여 다음 3가지 유형의 제약 조건을 걸 수 있습니다.
* Class 제약 : 타입이 특정 베이스 클래스로부터 상속된 것이어야 함
* Interface 제약 : 타입이 특정 인터페이스를 구현한 것이어야 함
* 생성자 제약 : 타입이 public 기본 생성자를 가져야 함
 
이러한 제약 조건을 걸도록 작성한 Generic 클래스는 다음과 같습니다.
 
class MyList< K, V >
   where K : IComparable, IFormattable
   where V : ValueBase, new()
{
   // ...
}
 
K는 IComparable, IFormattable 인터페이스를 구현한 것이어야 하며..
V는 ValueBase로부터 상속받고, public 기본 생성자가 있는 것이야 합니다.
그럼 MyList를 사용하는 예제를 보죠.
 
// ValueBase 클래스
class ValueBase {}
 
// Widget 클래스 : ValueBase를 상속
class Widget : ValueBase {}
 
// Thing 클래스 : ValueBase를 상속하며, public 기본 생성자가 없음
class Thing : ValueBase
{
   public Thing( int i ) {}
}
 
// OK
MyList<int, Widget> list1 = new MyList<int, Widget>();
 
// Error : string은 ValueBase로부터 상속되지 않음 
MyList<int, string> list2 = new MyList<int, string>();
 
// Error : Thing은 ValueBase로부터 상속되지만, public 기본 생성자가 없음
MyList<int, Thing> list3 = new MyList<int, Thing>();
 
// Error : Point는 IComparable, IFormattable 인터페이스를 구현하지 않음
MyList<Point, Widget> list4 = new MyList<Point,Widget>();
 
위에서 볼 수 있듯이, 제약조건을 사용하면..
* 타입이 필요한 기능을 가졌는지를 보장하고,
* 보다 강력한 컴파일 타임 타입 체킹을 할 수 있으며,
* 명시적 형변환을 줄일 수 있고,
* generic의 사용을 제한하는 효과를 가집니다.
 
지금까지 Generic에 대해서 살펴보았습니다.
어떤가요? 유용할 것 같나요?
뭐, 정답은.. 만드는 사람은 귀찮고, 쓰는 사람은 편하고.. ^^
그럼 나머지 언어 상의 변경사항은 다음에 또 알아보겠습니다.
posted by 방랑군 2012. 1. 4. 02:43
출처: http://blog.naver.com/PostView.nhn?blogId=kimgas2000&logNo=90132135285


jQuery.ajax (options)

HTTP 통신에서 페이지를로드합니다. 이 함수는 jQuery의 AJAX 통신의 기본 부분에서 실제로 $. get및 $. post 같은 함수를 사용하는 것이 쉽게 구현할 수 있습니다. 그러나 이러한 추상화된 함수는 구현의 용이성과 교환에 오류시 콜백과 같은 복잡한 기능을 잃고 있습니다. 그런 처리를 구현하려면, 역시 핵심이다이 함수를 사용해야합니다. $. ajax 함수는 반환값으로 XMLHttpRequest 객체를 반환합니다. 대부분의 경우이 개체를 직접 조작하는 것은 없다고 생각되지만, 예를 들어 던져 버린 요청을 중단하는 경우 등, 필요하면 이용하십시오. 이 함수는 인수를 하나만 취하지만, 실제로는 해시에서 키 - 값 조합은 많은 옵션을받습니다. 다음에 그 목록을 싣고 있으므로 참고하시기 바랍니다.


async / boolean
비동기 통신 플래그. 기본값은 true (비동기 통신)에서 요청이 던져에서 응답할 때까지 사용자 에이전트는 비동기 처리를 계속합니다. false로 설정 (동기 통신)하면 통신에 응답이있을 때까지 브라우저는 잠겨 조작을 받아들이지 않을 것을주의하십시오.
beforeSend / function
AJAX에 의해 요청이 전송되기 전에 불리는 Ajax Event 입니다. 반환값을 false로 설정하면 AJAX 전송을 취소할 수 있습니다.
function (XMLHttpRequest) { 
this / / AJAX 전송 설정 옵션을 나타내는 개체
}
cache / boolean
jQuery 1.2. 초기값은 일반적으로 true이지만 dataType이 script의 경우에는 false입니다. 통신 결과를 캐시하지 않으에는 false로 설정하십시오.
complete / function
AJAX 통신 완료될 때 호출되는 함수입니다. success이나 error가 호출된 후에 호출되는 Ajax Event 입니다.
function (XMLHttpRequest, textStatus) { 
this / / AJAX 전송 설정 옵션을 나타내는 개체
}
contentType / string
서버에 데이터를 보낼 때 사용 content - type 헤더의 값입니다. 기본값은 "application / x - www - form - urlencoded"대부분의 경우이 설정으로 문제 없을 것입니다.
data / object, string
서버로 전송하는 값. 개체가 지정된 경우 쿼리 문자열로 변환되고 GET 요청으로 추가됩니다. 이 변환 처리에 대해서는, 후술하는 processData를 참조하십시오. 객체는 키와 값의 조합해야하지만, 만약 값이 배열이라면, jQuery는 같은 키를 가지는 여러 값으로 serialize합니다. 예를 들어 {foo : "bar1", "bar2"]}와 같이 지정된 경우, & foo = bar1 & foo = bar2처럼 조립할 수 있습니다.
dataFilter / function
기본 수준에서 XMLHttpRequest의 반환 데이터를 필터링합니다. 서버 로부터의 반환값을 청소하는 경우 등에 유용합니다. 함수는 첫번째 인수에 원시 데이터를 제 2 인수 dataType 값을받습니다. 필터링된 값을 반환 값으로 반환하십시오.
function (data, type) { 
/ / 필터링
/ / 마지막으로 청소 후에 데이터를 반환
return data;
}
dataType / string
서버에서 반환되는 데이터 형식을 지정합니다. 생략했을 경우는, jQuery이 MIME 타입 등을 보면서 자동으로 결정합니다. 지정 가능한 값은 다음과 같은 것입니다.
  • "xml": XML 문서
  • "html": HTML을 텍스트 데이터로. 여기에 script 태그가 포함된 경우 처리가 실행됩니다.
  • "script": JavaScript 코드를 텍스트 데이터로. cache 옵션 특히 지정이 없으면 캐시가 자동으로 비활성화됩니다. 원격 도메인에 대한 요청의 경우 POST는 GET으로 변환됩니다.
  • "json": JSON 형식 데이터로 평가하고 JavaScript의 개체로 변환합니다.
  • "jsonp": JSONP로 요청을 부르고 callback 매개 변수에 지정된 함수 회수 값을 JSON 데이터로 처리합니다. (jQuery 1.2 추가)
  • "text": 일반 텍스트.
dataType을 지정할 때는 몇 가지 가리키는 할 점이 있습니다. 아래의주의 1,2를 참조하십시오.
error / function
통신에 실패했을 때 호출되는 Ajax Event 입니다. 인수는 3 개로 차례 XMLHttpRequest 개체 오류 내용, 추가적인 예외 개체를받습니다. 제 2 인수에는 "timeout", "error", "notmodified" "parsererror"등이 돌아갑니다.
function (XMLHttpRequest, textStatus, errorThrown) { 
/ / 보통은 여기서 textStatus 및 errorThrown 값을보고 처리를 분리하거나
/ / 단순히 통신에 실패했을 때의 처리를 기술합니다.
this / / this는 다른 콜백 함수 마찬가지로 AJAX 통신할 때 옵션을 나타냅니다.
}
global / boolean
Ajax Events의 Global Events을 실행할지 여부를 지정합니다. 일반적으로 true이지만, 특별한 통신 false 수도 있습니다. 자세한 내용은 Ajax Events 를 참조하십시오.
ifModified / boolean
서버의 응답에 Last - Modified 헤더를보고, 전회 통신에서 변경이있는 경우에만 성공 상태를 반환합니다.
jsonp / string
jsonp 요청을 할 때 callback이 아닌 매개 변수이면 지정합니다. 예를 들어 {jsonp : 'onJsonPLoad'}로 지정하면 실제 요청은 onJsonPLoad = 함수 이름이 부여됩니다.
password / string
인증이 필요한 HTTP 통신시 암호를 지정합니다.
processData / boolean
data 지정한 개체를 쿼리 문자열로 변환할지 여부를 설정합니다. 기본값은 true로, 자동으로 "application / x - www - form - urlencoded"형식으로 변환합니다. DOMDocument 자체 등의 다른 형식으로 데이터를 보내기 위하여 자동 변환하고 싶지 않은 경우는 false를 지정합니다.
scriptCharset / string
스크립트를 로드할 때의 캐릭터 세트를 지정합니다. dataType이 "jsonp"혹은 "script"에서 실행되는 페이지와 호출하는 서버측의 캐릭터 세트가 다른 경우에만 지정해야합니다.
success / function
AJAX 통신이 성공하면 호출되는 Ajax Event 입니다. 돌아온 데이터와 dataType 지정한 값 2 개의 인수를받습니다.
function (data, dataType) { 
/ / data의 값을 사용하여 통신 성공시 처리를 기술합니다.
this / / this는 AJAX 전송시 설정한 옵션
}
timeout / number
제한 시간 (밀리초)을 설정합니다. $. ajaxSetup 에서 지정한 값을 통신에 따라 개별적으로 덮어쓸 수 있습니다.
type / string
"POST"또는 "GET"을 지정하여 HTTP 통신의 종류를 설정합니다. 기본값은 "GET"입니다.RESTful에 "PUT"또는 "DELETE"를 지정할 수 있지만 모든 브라우저가 지원하는 것은 아니기 때문에주의가 필요합니다.
url / string
요청을 보낼 대상 URL입니다. 기본값은 호출 페이지에 보냅니다.
username / string
인증이 필요한 HTTP 통신시 사용자 이름을 지정합니다.
xhr / function
XMLHttpRequest 객체가 생성되었을 때 호출되는 콜백 함수입니다. 이 함수는 예를 들면 IE에서 XMLHttpRequest 아니라 ActiveXObject가 만들어진 때라고합니다. 만약 특정 사이트의 XMLHttpRequest 개체의 확장과 인스턴스 관리 팩토리를 가지고있는 경우에는이 함수 생성물을 덮어쓸 수 있습니다. jQuery1.2.6 이전에서는 사용할 수 없습니다.

※주의 1 
dataType 옵션을 사용하는 경우 서버에서 응답이 올바른 MIME 타입을 반환하는지 확인하십시오. 
만약 MIME 타입과 지정된 dataType에 불일치가있는 경우, 예기치 않은 문제가 발생할 수 있습니다. 
자세한 내용은 
Specifying the Data Type for AJAX Requests (영어) 를 참조하십시오. ※주의 2dataType에 "script"을 지정하여 다른 도메인에 전송하는 경우 POST를 지정해서 요청은 GET 자동으로 변환됩니다. jQuery 1.2에서는 다른 도메인에서도 JSONP를 사용하여 JSON 데이터를 검색할 수있는 옵션이 붙었습니다. JSONP를 제공하는 서버가 "url? callback = function"와 같은 형태로 요청을받는 경우에는, jQuery가 자동으로 function을 사용하여 JSON 데이터를받습니다. 또한 매개 변수가 callback이 아닌 경우 jsonp 옵션 매개 변수 이름을 지정하여 마찬가지로 처리할 수 있습니다.

샘플
샘플 1
JavaScript 파일을 읽고 실행합니다.
$. ajax ({type : "GET", url : "test.js"dataType : "script"});
서버에 데이터를 저장하고 처리가 완료된 것을 사용자에게 알려줍니다.
$. ajax ({type : "POST", url : "some.php"data : "name = John & location = Boston", success : function (msg) {alert ( "Data Saved :"+ msg);}}) ;
HTML 페이지의 최신 버전을 가져옵니다.
$. ajax ({url : "test.html", cache : false, success : function (html) {$ ( "# results"). append (html);}});
동기 통신에서 데이터를 읽습니다. 
통신 중에 브라우저가 잠겨 있기 때문에 어떤 방식으로 통신중인 사용자 작업을 방해 궁리를해야 할 것입니다.
var html = $. ajax ({url : "some.php"async : false}). responseText;
XML 형식의 문서를 데이터로 보냅니다. 
processData 옵션을 false로 설정하여 데이터를 문자열로 자동 변환되는 것을 피할 수 있습니다.
var xmlDocument = create xml document]; $. ajax ({url : "page.php"processData : false, data : xmlDocument, success : handleResponse});

우리가 작성한 예제 :

$(function() {
$("#btn1").click(function() {
var name= $("#name").val();
var age = $("#age").val();
var url = "test5_ok.jsp";
var params = "name=" + name + "&age=" + age + "&nickName=수요일";
$.ajax({
type : "POST", // "POST"또는 "GET"을 지정하여 HTTP 통신의 종류를 설정. default는 "GET"
url:url,
data:params, // 서버로 전송하는 값
dataType:'xml', // 기본 text -> 서버에서 반환되는 데이터 형식을 지정. html, xml, text, script, json, jsonp 가 있음
success:function(args) { // AJAX 통신이 성공하면 호출되는 Ajax Event 
$(args).find("status").each(function() {
var status = $(this).text();
alert(status);
});

var str = "";
$(args).find("records").each(function() { // 태그명이 records 인 것들 중에 해당하는 것들을 불러옴
var records = $(this);
var id = records.attr("id"); // 속성명이 id
var name = records.find("name").text(); // 태그명이 name 인 것의 text를 가져옴
var age = records.find("age").text(); // 태그명이 name 인 것의 text를 가져옴
var nickName = records.find("nickName").text(); // 위와 동일

str += "id="+ id +", name=" + name + ", age=" + age + ", nickName=" + nickName + "<br/>"; 
});
$("#result").html(str); // id명이 result 인 것에 위에서 반복문으로 받은 것들을 html형식으로 찍는다.
},
beforeSend:showRequest, // AJAX에 의해 요청이 전송되기 전에 불리는 Ajax Event 
error:function(e) { // 통신에 실패했을 때 호출되는 Ajax Event 
alert(e.responseText);
}
});
});

$("#btn2").click(function() {
$("#result").empty();
});
});

function showRequest(args) { // 리턴 값이 true 일경우만 전송, false이면 전송 취소
if(!$("#name").val()) {
alert("이름을 입력하세요 !!!");
return false;
}
if(!$("#age").val()) {
alert("나이를 입력하세요 !!!");
return false;
}
return true;
}

[출처] Jquery ajax 정리|작성자 kimgas2000