spring을 사용하여 프로젝트를 진행하는 와중에, 메이븐을 사용한다고 하고있었는데..

메이븐이 뭔지 잘 알지도 못하면서 사용하고 있었다는걸 알았다..!

메이븐에 대해 찾아보면서 빌드, 컴파일 등에 대해서도 추상적인 느낌만 알고있었다는걸 또 깨닫고

이것들에 대해 정리해보는 글을 작성해본다.

사실 이렇게 작성해도 설명하라면 못할거같다ㅠ열심히 공부해서 개발길만 걷자..,,


메이븐에 대해 알아보기 전에!

컴파일과 빌드가 무엇인지, 그 차이점이 무엇인지 먼저 정리해보자.

 

컴파일(Compile)

컴파일이란 개발자가 작성한 코드를 바이너리 코드로 변환하는것을 말한다. (흔히 알고있는 목적파일이 생성됨)

즉, 우리말로 작성된 코드를 컴퓨터가 이해할 수 있는 기계어로 바꾸는 것이다.

이러한 작업을 해주는것이 컴파일러(Compiler)이다.

자바의 경우, 자바 가상머신(JVM)에서 실행 가능한 바이트코드 형태의 클래스 파일이 생성된다.

 

빌드(Build)

소스코드 파일을 실행가능한 소프트웨어 산출물로 만드는 과정을 말한다.

빌드의 단계중에 컴파일이 포함되어 있는데, 컴파일은 빌드의 부분집합이라고 할 수 있다.

 

빌드 툴(Build Tool)

빌드 과정을 도와주는 도구이다.

전처리(Preprocessing), 컴파일(Compile), 패키징(Packaging), 테스팅(Testing), 배포(Destribution) 의 기능을 한다.

Ant, Maven, Gradle 등이 있다.


이제 빌드 툴의 한 종류인 메이븐에 대해 정리해보자.

 

메이븐이란?

자바 프로젝트의 빌드를 자동화해주는 빌드 툴이다.

즉, 자바 코드를 컴파일해서 패키징 후 디플로이를 자동화해주는 것이다.

 

pom.xml

자바 프로젝트에 빌드 툴을 maven으로 설정하였다면, pom.xml 파일이 생성되었을 것이다.

pom.xml은 POM(Project Object Model)을 설정하는 것으로, 프로젝트 내 빌드 옵션을 설정하는 부분이다.

꼭 pom.xml이라는 이름으로 해야할 필요는 없지만 암묵적인 원칙이기 때문에 pom.xml 이름을 사용하는 것이 좋다.

다른 파일로도 지정할 수 있다. (mvn -f [지정할파일.xml] test)

 

pom.xml 분석

업데이트 예정----

 

 

 

 

 

출처

https://freezboi.tistory.com/39

 

컴파일과 빌드 차이점

평소 이클립스와 같은 IDE를 사용하기 때문에 컴파일과 빌드의 개념에 대해 잘 알지 못했다. 단지 소스코드를 작성하고 이클립스에서 run을 실행하면 알아서 모든 과정이 자동으로 실행되기 때문이다. 그래서 컴파..

freezboi.tistory.com

https://jeong-pro.tistory.com/168

 

메이븐(Maven)은 알고 스프링(Spring)을 쓰는가? (pom.xml 분석하며 가볍게 정리하는 빌드 툴, Maven)

메이븐(Maven)은 알고 스프링(Spring)을 쓰는가? 제목과 같은 질문에 필자는 제대로 답변할 수 없었다. 단순하게는 maven repository에서 dependency 추가해서 필요한 라이브러리 쓰는 정도? 무엇을 위해 쓰는지,..

jeong-pro.tistory.com

'spring framework' 카테고리의 다른 글

[EL/JSTL]JSTL이란?  (0) 2018.06.20
[EL/JSTL]EL이란?  (0) 2018.06.19
[spring]spring framework 개념  (0) 2018.06.18

출처 - https://www.youtube.com/watch?v=WhX55LDST7g


- index.aspx

1
2
3
4
5
6
7
8
// 순수 HTML 사용해서 버튼 만들기
<input type="button" value="버튼1" id="btn1"/>
 
// runat 속성을 추가해서 서버 컨트롤 버튼 만들기
<input type="button" value="버튼2" id="btn2" runat="server"/>
 
// asp.net 표준 컨트롤을 사용해서 버튼 만들기
<asp:Button Text="버튼3" ID="btn3" runat="server"/>
cs



- index.aspx.cs (코드 비하인드)

1
2
3
4
5
protected void Page_Load(object sender, EventArgs e)
{
    btn2.Value    = "버튼2";
    btn3.Text    = "버튼3-표준 컨트롤";
}
cs

이런 식으로 접근하여 버튼의 내용을 바꿀 수 있다.






'asp.net(C#)' 카테고리의 다른 글

[asp.net]기본 페이지 설정( default page)  (0) 2018.08.13
[asp.net]Page_Load 함수  (0) 2018.08.03
[asp.net]페이지 include  (0) 2018.08.03
[asp.net]마스터 페이지(MS공식 설명서참고)  (0) 2018.08.03
[C#]기본 문법  (0) 2018.07.30

Web.config에 아래 코드를 참고하여 추가하면 된다.


1
2
3
4
5
6
7
8
<defaultDocument>
    <files>
        <clear/>
        <add value="index.aspx"/>
        <add value="index.html"/>
        <add value="index.jsp"/>
    </files>
</defaultDocument>
cs


'asp.net(C#)' 카테고리의 다른 글

[웹 폼] asp.net 표준 컨트롤(예제-버튼)  (0) 2018.09.03
[asp.net]Page_Load 함수  (0) 2018.08.03
[asp.net]페이지 include  (0) 2018.08.03
[asp.net]마스터 페이지(MS공식 설명서참고)  (0) 2018.08.03
[C#]기본 문법  (0) 2018.07.30

IP주소를 얻기 위해 알아야할 이론적인 부분을 먼저 정리해 보았다.


Proxy(프락시) 서버

 프락시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터나 응용프로그램을 가리킨다. 서버와 클라이언트 사이에서 중계기로서 대리로 통신을 수행하는 기능을 'Proxy(프락시)', 그 중계기능을 하는 것을 프락시 서버라고 한다.


 프락시 서버는 요청된 내용들을 캐시를 이용하여 저장해둔다. 캐시 안에 있는 정보를 요구하는 요청에 대해, 원격 서버에 접속하여 데이터를 가져올 필요가 없게 되어서 전송 시간을 절약할 수 있다. 즉, 불필요하게 외부와의 연결을 하지 않아도 된다는 장점이 있다. 또한 외부와의 트래픽을 줄이게 됨으로써 네트워크 병목 현상을 방지하는 효과도 얻을 수 있게 된다.


출처 - 위키백과 https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9D%EC%8B%9C_%EC%84%9C%EB%B2%84




Proxy(프락시) 환경에서 client IP를 얻기 위한 X-Forwarded-For(XFF) http header

 XFF는 http 헤더 중 하나로, http server에 요청한 client의 IP를 식별하기 위한 사실상의 표준이다.


 웹 서버나 WAS 앞에 L4같은 로드밸런서, 프록시 서버, 캐싱서버 등이 있을 경우, 웹 서버/WAS에 http나 전용 프로토콜로 요청을 보낸 후에 받은 결과를 가곡하여 클라이언트에 재전송하게 된다. 이로 인해, 처리한 웹 서버나 WAS에서 request.getRemoteAddr() 등으로 클라이언트 IP를 얻을 경우 L4나 Proxy의 IP를 얻게 되는데 이는 원하는 결과가 아니다.


 X-Forwarded-For는 이 문제를 해결하기 위해 사용하는 http header이다. 콤마를 구분자로 client와 proxy IP가 들어가므로 첫 번째 IP를 가져오면 클라이언트를 식별할 수 있다.

1
X-Forwarded-For: client, proxy1, proxy2
cs


 Web Server, WAS, L4, proxy 종류에 상관없이 client IP를 잘 가져오기를 바란다면 다음과 같은 순서로 IP를 얻어내야 한다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
String ip = request.getHeader("X-Forwarded-For");
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("Proxy-Client-IP"); 
 } 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("WL-Proxy-Client-IP"); 
 } 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("HTTP_CLIENT_IP"); 
 } 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getHeader("HTTP_X_FORWARDED_FOR"); 
 } 
 if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
     ip = request.getRemoteAddr(); 
 }
cs


출처 - https://www.lesstif.com/pages/viewpage.action?pageId=20775886

일종의 이벤트 함수로, @Page지시자의 AutoEventWireup속성이 true로 지정되어 있으면 Page_Load함수를 호출하겠다는 의미이다.

1
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="Test.Test" %>
cs



** 더 자세한 사항을 알고계신 분은 댓글 남겨주세요ㅠ

방법1. 절대경로 사용

1
<!--#include virtual="절대경로"-->
cs



방법2. 상대경로 사용

1
<!--#include file="상대경로"-->
cs



virtual 키워드와 file 키워드로 구별한다.

마스터 페이지

마스터 페이지는 확장명이 .Master인 asp.net 파일로 정적 텍스트, html 요소 및 서버 컨트롤이 포함될 수 있는 레이아웃을 미리 정의해둔 파일이다. 마스터 페이지는 .aspx 페이지의 @Page지시문을 @Master지시문으로 대체하는 것으로 일반 .aspx페이지와 식별된다.

- 마스터 파일명이 Test.Master일 때

1
<%@ Master Language="C#" CodeBehind="Test.Master.cs" %>
cs



컨텐츠 자리 표시자

마스터 페이지에는 모든 페이지에 표시되는 정적 텍스트와 컨트롤 외에도 하나 이상의 ContentPlaceHolder 컨트롤이 포함되어 있다. 이러한 자리 표시자 컨트롤은 그 자리에 표시할 컨텐츠의 영역을 정의한다. 표시할 컨텐츠는 컨텐츠 페이지(일반 .aspx 페이지)에서 정의된다. 컨텐츠 페이지와의 매핑을 위해 ID를 설정해야 한다.

1
2
<asp:ContentPlaceHolder ID="Main" runat="server"></asp:ContentPlaceHolder>
<asp:ContentPlaceHolder ID="Footer" runat="server"></asp:ContentPlaceHolder>
cs



컨텐츠 페이지

마스터 페이지의 자리 표시자 컨트롤에 매핑되는 컨텐츠를 정의하려면 특정 마스터 페이지에 바인딩된 asp.net 페이지(.aspx파일과 혹은 필요에 따라 code behind 파일)인 개별 컨텐츠 페이지를 만든다. 마스터 페이지를 @Page지시문을 통해 바인딩을 설정하면 된다.

1
<%@ Page Language="C#" MasterPageFile="~/Test.Master" AutoEventWireup="true" CodeBehind="Main.aspx.cs" %>
cs


컨텐츠 페이지에 컨텐츠를 만들이 위해서는 Content컨트롤을 추가하여 마스터 페이지에 있는 ContentPlaceHolder컨트롤에 매핑해야 한다. Content컨트롤을 만든 후에는 텍스트와 컨트롤을 추가하면 된다. 컨텐츠 페이지에서는 서버 코드의 스크립트 블록을 제외하고 Content컨트롤의 외부에 있는 것은 모두 오류로 처리된다.

1
2
3
4
5
6
<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
    Main content.
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="Footer" Runat="Server" >
    Footer content.
</asp:content>
cs



마스터 페이지의 런타임 동작

1. 사용자가 컨텐츠 페이지의 URL을 입력하여 페이지를 요청한다.

2. 불러온 페이지에서 @Page지시문을 읽는다. 지시문이 마스터 페이지를 참조하면 마스터 페이지도 읽는다. 페이지를 처음 요청한 경우 두 페이지가 모두 컴파일된다.

3. 컨텐츠가 업데이트된 마스터 페이지가, 컨텐츠 페이지의 컨트롤 트리에 병합된다.

4. 개별 Content컨트롤의 컨텐츠가 마스터 페이지에 있는 ContentPlaceHolder컨트롤에 병합된다.

5. 병합된 페이지가 브라우저에 렌더링된다.






'asp.net(C#)' 카테고리의 다른 글

[웹 폼] asp.net 표준 컨트롤(예제-버튼)  (0) 2018.09.03
[asp.net]기본 페이지 설정( default page)  (0) 2018.08.13
[asp.net]Page_Load 함수  (0) 2018.08.03
[asp.net]페이지 include  (0) 2018.08.03
[C#]기본 문법  (0) 2018.07.30

visual studio 단축키

- 주석처리 : Ctrl + k + c

- 주석해제 : Ctrl + k + u

- 코드정렬 : Ctrl + k + d

- 수직블록 : Shift + Alt + 화살표(아래 또는 위)




콘솔에 출력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// java의 import
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
// namespace : java의 패키지
// 이것이 기본 콘솔의 메인 함수
namespace test1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("안녕! C#!");
            Console.Write("Hello");
            Console.WriteLine(" World");
        }
    }
}
cs


- Console.WriteLine() : 줄바꿈 있는 출력

- Console.Write() : 줄바꿈 없는 출력




변수와 선언

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
namespace test1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 숫자 변수
            short shortNum = 0;
            int intNum = 0;
            double doubleNum = 0;
            float floatNum = 0;
 
            // 문자 변수
            // java에서는 String이지만 C#은 string!
            string stringText = "";
            char charText = 'a';
 
            // 참, 거짓
            bool boolVal = true;
 
 
            // 닷넷 프레임워크 변수 -> 굳이 이렇게 사용하지 않고 C#언어로 하면 됨
            Int16 dotNetShort = 0;
            Int32 dotNetInt = 0;
            Int64 dotNetDouble = 0;
            String dotNetString = "";
 
            // 다이나믹 타입 -> javascript에서의 변수선언과 비슷(C# 컴파일러가 값에 따라 자료형 알아서 설정)
            // javascript와 다른점 : C#의 var타입은 초기화된 값에 따라 결정된 자료형을 임의로 덮어씌울 수 없다.(javascript는 가능)
            var dynamicType = 0;
            var dynamicType2 = 'c';
            var dynamictype3 = false;
 
 
            // 간단하게 코딩해보기
            int a = 12;
            int b = 20;
            Console.WriteLine(a + b);
        }
    }
}
 
cs




if문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
namespace test1
{
    class Program
    {
        static void Main(string[] args)
        {
            var num = 1;
            Console.Write("0 ~ 9 사이의 값을 입력 : ");
 
            // java의 Scanner(사용자가 직접 입력하는 것)
            // 입력값이 string 타입으로 리턴됨
            var input = Console.ReadLine();
 
            // 텍스트로 바꿔주는 합수 (ToString())
            if (num.ToString() == input)
                Console.WriteLine("같은값을 입력했습니다.");
            else
                Console.WriteLine("다른 값을 입력했습니다.");
        }
    }
}
 
cs

     

** else if 문도 같은 방법으로 하면 됨




while문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
namespace test1
{
    class Program
    {
        static void Main(string[] args)
        {
            var num1 = 1;
            var num2 = 1;
 
            while(num1 < 10)
            {
                Console.Write("num1 : " + num1++);
                Console.WriteLine(" / num2 : " + ++num2);
            }
        }
    }
}
cs

** ++num과 num++의 차이점 비교 확인하기




for문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace test1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 방법1. for문 안에 변수 i 초기화
            for(var i = 1; i <=10; i++)
            {
                Console.Write(i);
            }
 
            Console.WriteLine();
 
            // 방법2. for문 밖에 변수 초기화
            // for문의 맨 앞 부분을 비워둘 수 있다.
            var num = 1;
            for(;num <= 10; num++)
            {
                Console.Write(num);
            }
 
            Console.WriteLine();
        }
    }
}
 
}
cs




foreach문

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
namespace test1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 배열 선언
            List<int> numberList = new List<int>();
 
            // 배열 초기화
            numberList.Add(1);
            numberList.Add(2);
            numberList.Add(3);
            numberList.Add(4);
            numberList.Add(5);
 
            // foreach문
            foreach(var num in numberList)
            {
                Console.WriteLine(num);
            }
        }
    }
}
cs

** foreach문은 값의 조회만 가능하고, 값을 변경할 수는 없다.




Generic List

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
namespace test1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Generic List를 여러 가지 방식으로 생성
 
            List<int> list= new List<int>();
            // var list= new List<int>(); -> 이 방식도 가능
            list.Add(1);
            list.Add(2);
            list.Add(3);
            list.Add(4);
            list.Add(5);
            list.Add(6);
            list.Add(7);
            // 출력
            foreach(var i in list)
            {
                Console.WriteLine(i);
            }
 
            List<string> strList = new List<string>();
            // var strList= new List<string>(); -> 이 방식도 가능
            strList.Add("text1");
            strList.Add("text2");
            strList.Add("text3");
            strList.Add("text4");
            strList.Add("text5");
            strList.Add("text6");
            strList.Add("text7");
            // 출력
            foreach (var i in strList)
            {
                Console.WriteLine(i);
            }
 
 
            var list2 = new List<string>()
            {
                "str1",
                "str2",
                "str3",
                "str4",
                "str5",
                "str6",
                "str7"
            };
            // 출력(리스트 크기 구하는 함수 확인!)
            for(int i = 0; i<list2.Count; i++)
            {
                Console.WriteLine(list2[i]);
            }
        }
    }
}
cs




사용자 정의 함수

  솔루션 탐색기에서 프로젝트 오른쪽클릭 하여 새 클래스파일을 생성한다.(여기서 User.cs)

- User.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace test1
{
    class User
    {
        // setter, getter 생성
 
        // 번호, 이름, 나이, 연락처
        // 단축키 : prop입력 후 tab 두 번!
        public int No { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
        public string Phone { get; set; }
 
    }
}
 
cs


- Program.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
namespace test1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 번호   이름  나이  연락처
            // 01    임똘똘  30   010-1234-1234
            // 01    권똘똘  31   010-4321-4321
            var user1 = new User();
            user1.No = 1;
            user1.Name = "임똘똘";
 
            var user2 = new User();
            user2.No = 2;
            user2.Name = "권똘똘";
 
 
            // User라는 클래스 생성 후 그곳에 getter, setter 생성
            var list = new List<User>();
            list.Add(user1);
            list.Add(user2);
 
            foreach(var user in list)
            {
                Console.WriteLine("번호 : " + user.No + " / " + "이름 : " + user.Name);
            }
        }
    }
}
cs


- 이런 형식도 가능

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
namespace test1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 번호   이름  나이  연락처
            // 01    임똘똘  30   010-1234-1234
            // 01    권똘똘  31   010-4321-4321
            var user1 = new User()
            {
                No = 1,
                Name = "임똘똘",
                Age = 30,
                Phone = "010-1234-1234"
            };
 
            var user2 = new User()
            {
                No = 2,
                Name = "권똘똘",
                Age = 31,
                Phone = "010-4321-4321"
            };
 
            
            var list = new List<User>()
            {
                user1, user2
            };
 
            foreach(var user in list)
            {
                Console.WriteLine("번호 : " + user.No + " / " + "이름 : " + user.Name);
            }
        }
    }
}
cs






** 본 포스팅은 유튜브 '개발토끼'님의 동영상 강의를 참고하여 작성한 것입니다.


화면전환 없이 데이터를 전송하기 위해 ajax를 사용하는 경우가 많다.


1. JSON 형태로 데이터 전송

1
2
3
4
5
6
7
8
9
$.ajax({
    url: '데이터를 보낼 곳 url',
    type: 'form 태그의 method 속성(post 또는 get)',
    data: {"변수1""변수1의 값",
        "변수2""변수2의 값"},
    success: function (data) {
            alert("데이터 전송이 성공적으로 끝났을 때 실행");
        }
});
cs


읽을 때에는 request.getParameter로 읽으면 된다.

1
2
String str1 = request.getParameter("변수1");
String str2 = request.getParameter("변수2");
cs




2. 폼 데이터를 한꺼번에 전송

1
2
3
4
5
6
7
8
9
var queryString = $('#폼id').serialize();
$.ajax({
    url: '데이터를 보낼 곳 url',
    type: 'form 태그의 method 속성(post 또는 get)',
    data: {"폼 데이터 변수 이름": queryString},
    success: function (data) {
            alert("데이터 전송이 성공적으로 끝났을 때 실행");
        }
});
cs


읽을 때에는 폼의 각 데이터 name값으로 꺼내 읽으면 된다.

예를들어,

- form

1
2
3
4
5
6
7
<form id="form1">
    <input type="text" name="user_name">
    <input type="text" name="user_phone">
    <input type="radio" value="Y" name="agree">
    <input type="radio" value="N" name="agree">
    <button type="button" onclick="sendFormUsingAjax()">보내기</button>
</form>
cs

이런 형태의 폼 데이터를 보낸다고 하자.

보내기 버튼을 클릭하면 sendFormUsingAjax()라는 javascript 함수를 실행하게 되고, 그 안에 ajax로 데이터를 보내는 코드를 작성해두었다고 하면, 그 코드가 실행될 것이다.


보내진 곳에서 데이터를 읽는 코드는

1
2
3
String user_name      = request.getParameter("user_name");
String user_phone = request.getParameter("user_phone ");
String agree    = request.getParameter("agree");
cs

form 안의 각 요소들의 name속성의 값으로 읽으면 된다.



3. 체크박스 데이터 등 배열 형태로 데이터 전송

배열 형태의 데이터를 전송할 때에는 배열데이터를 직렬화하는 코드를 작성해야 한다. ( jQuery.ajaxSettings.traditional = true )

1
2
3
4
5
6
7
8
9
10
var array = {1,2,3,4,5};
jQuery.ajaxSettings.traditional = true;
$.ajax({
    url: '데이터를 보낼 곳 url',
    type: 'form 태그의 method 속성(post 또는 get)',
    data: {"배열변수": array},
    success: function (data) {
            alert("데이터 전송이 성공적으로 끝났을 때 실행");
        }
});
cs

이런 형식으로 보내고, 데이터를 읽을 때에는 배열형태의 변수를 만들고 같은 방식으로 읽으면 된다.

http://conol.tistory.com/23


http://www.homejjang.com/05/meta.php

'' 카테고리의 다른 글

[java]client IP(접속자 IP) 가져오기  (0) 2018.08.07
[ajax]데이터 전송  (0) 2018.07.16
[html]input text에서 엔터누를 때 새로고침  (0) 2018.07.11
[commons-fileupload]파일 업로드  (0) 2018.07.02
[html]a태그 onclick 사용하기  (0) 2018.06.29

+ Recent posts